From 1a4d8b94a1342126e807c894839c8e2da43b40a8 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 5 Mar 2018 12:29:50 -0600 Subject: [PATCH 01/45] [MIRROR] Halves server file access cooldowns (#5812) * Halves server file access cooldowns (#36139) * Lets me actually browse logs properly * admins get to spam harder * Halves server file access cooldowns --- code/__HELPERS/files.dm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/code/__HELPERS/files.dm b/code/__HELPERS/files.dm index f515668dfb..7f0b5a3c07 100644 --- a/code/__HELPERS/files.dm +++ b/code/__HELPERS/files.dm @@ -35,6 +35,7 @@ return path #define FTPDELAY 200 //200 tick delay to discourage spam +#define ADMIN_FTPDELAY_MODIFIER 0.5 //Admins get to spam files faster since we ~trust~ them! /* This proc is a failsafe to prevent spamming of file requests. It is just a timer that only permits a download every [FTPDELAY] ticks. This can be changed by modifying FTPDELAY's value above. @@ -45,9 +46,13 @@ if(time_to_wait > 0) to_chat(src, "Error: file_spam_check(): Spam. Please wait [DisplayTimeText(time_to_wait)].") return 1 - GLOB.fileaccess_timer = world.time + FTPDELAY + var/delay = FTPDELAY + if(holder) + delay *= ADMIN_FTPDELAY_MODIFIER + GLOB.fileaccess_timer = world.time + delay return 0 #undef FTPDELAY +#undef ADMIN_FTPDELAY_MODIFIER /proc/pathwalk(path) var/list/jobs = list(path) From fef85c1eb316813cac1a4fcab3179ac7188adab3 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 5 Mar 2018 12:30:29 -0600 Subject: [PATCH 02/45] [MIRROR] Fix nightshift skipping certain maint APCs (#5811) * Merge pull request #36082 from AutomaticFrenzy/patch/nightshift-fix Fix nightshift skipping certain maint APCs * Fix nightshift skipping certain maint APCs --- code/controllers/subsystem/nightshift.dm | 61 ++++++++++-------------- 1 file changed, 25 insertions(+), 36 deletions(-) diff --git a/code/controllers/subsystem/nightshift.dm b/code/controllers/subsystem/nightshift.dm index 93003c4634..bb21968463 100644 --- a/code/controllers/subsystem/nightshift.dm +++ b/code/controllers/subsystem/nightshift.dm @@ -8,7 +8,6 @@ SUBSYSTEM_DEF(nightshift) var/nightshift_end_time = 270000 //7:30 AM, station time var/nightshift_first_check = 30 SECONDS - var/obey_security_level = TRUE var/high_security_mode = FALSE /datum/controller/subsystem/nightshift/Initialize() @@ -21,48 +20,38 @@ SUBSYSTEM_DEF(nightshift) return check_nightshift() +/datum/controller/subsystem/nightshift/proc/announce(message) + priority_announce(message, sound='sound/misc/notice2.ogg', sender_override="Automated Lighting System Announcement") + /datum/controller/subsystem/nightshift/proc/check_nightshift(force_set = FALSE) - var/time = station_time() - var/nightshift = time < nightshift_end_time || time > nightshift_start_time - var/red_or_delta = GLOB.security_level == SEC_LEVEL_RED || GLOB.security_level == SEC_LEVEL_DELTA + var/emergency = GLOB.security_level >= SEC_LEVEL_RED + var/nightshift = FALSE + if (!emergency) + var/time = station_time() + nightshift = time < nightshift_end_time || time > nightshift_start_time + var/announcing = TRUE - if(nightshift && red_or_delta) - nightshift = FALSE - if(high_security_mode && !red_or_delta) + if(high_security_mode && !emergency) high_security_mode = FALSE - priority_announce("Restoring night lighting configuration to normal operation.", sound='sound/misc/notice2.ogg', sender_override="Automated Lighting System Announcement") + announce("Restoring night lighting configuration to normal operation.") announcing = FALSE - else if(!high_security_mode && red_or_delta) + else if(!high_security_mode && emergency) high_security_mode = TRUE - priority_announce("Night lighting disabled: Station is in a state of emergency.", sound='sound/misc/notice2.ogg', sender_override="Automated Lighting System Announcement") + announce("Night lighting disabled: Station is in a state of emergency.") announcing = FALSE if((nightshift_active != nightshift) || force_set) - nightshift? activate_nightshift(announcing) : deactivate_nightshift(announcing) + update_nightshift(nightshift, announcing) -/datum/controller/subsystem/nightshift/proc/activate_nightshift(announce = TRUE) - if(!nightshift_active) - if(announce) - priority_announce("Good evening, crew. To reduce power consumption and stimulate the circadian rhythms of some species, all of the lights aboard the station have been dimmed for the night.", sound='sound/misc/notice2.ogg', sender_override="Automated Lighting System Announcement") - nightshift_active = TRUE - var/list/area/affected = return_nightshift_area_types() - for(var/i in affected) - var/area/A = locate(i) in GLOB.sortedAreas - for(var/obj/machinery/power/apc/APC in A) - APC.set_nightshift(TRUE) +/datum/controller/subsystem/nightshift/proc/update_nightshift(active, announce = TRUE) + nightshift_active = active + if(announce) + if (active) + announce("Good evening, crew. To reduce power consumption and stimulate the circadian rhythms of some species, all of the lights aboard the station have been dimmed for the night.") + else + announce("Good morning, crew. As it is now day time, all of the lights aboard the station have been restored to their former brightness.") + for(var/A in GLOB.apcs_list) + var/obj/machinery/power/apc/APC = A + if (APC.area && (APC.area.type in GLOB.the_station_areas)) + APC.set_nightshift(active) CHECK_TICK - -/datum/controller/subsystem/nightshift/proc/deactivate_nightshift(announce = TRUE) - if(nightshift_active) - if(announce) - priority_announce("Good morning, crew. As it is now day time, all of the lights aboard the station have been restored to their former brightness.", sound='sound/misc/notice2.ogg', sender_override="Automated Lighting System Announcement") - nightshift_active = FALSE - var/list/area/affected = return_nightshift_area_types() - for(var/i in affected) - var/area/A = locate(i) in GLOB.sortedAreas - for(var/obj/machinery/power/apc/APC in A) - APC.set_nightshift(FALSE) - CHECK_TICK - -/datum/controller/subsystem/nightshift/proc/return_nightshift_area_types() - return GLOB.the_station_areas.Copy() From 1a3f6a7e9b7a5c5fc5c9ddc21232103d2576b36f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 5 Mar 2018 12:30:32 -0600 Subject: [PATCH 03/45] Automatic changelog generation for PR #5811 [ci skip] --- html/changelogs/AutoChangeLog-pr-5811.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5811.yml diff --git a/html/changelogs/AutoChangeLog-pr-5811.yml b/html/changelogs/AutoChangeLog-pr-5811.yml new file mode 100644 index 0000000000..851f9a4804 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5811.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - bugfix: "Night shift no longer ignores rooms whose APCs are in port or starboard central maintenance." From 841a4199af66473aea1cff03040fd66597efc34b Mon Sep 17 00:00:00 2001 From: Cameron! Date: Mon, 5 Mar 2018 13:33:23 -0500 Subject: [PATCH 04/45] Removes MediHound's Noncon Vore (#5738) * Removes MediHound's Noncon Vore MediHound once again respects vore preferences, as intended. To make up for this, they now receive a unique cyborg hypospray with fewer reagents, increased energy costs, and no ability to upgrade. * Moves Preference Check to New Sleeper-Specific Variable, Buffs Hypo Rather than using target.devourable, MediHounds now check for a new target.sleeperable preference, which defaults to TRUE. Also, removed the custom HoundHypo. MediHounds will now get the full borg hypospray. * Removes unnecessary 5th port code * Breaks the patch for Bhijn's viewing pleasure DNM etc * Still not fixed * Fixes it again. MediHound sleeper preference is now a game preference toggle, rather than a vore panel toggle. MediHounds will not be able to ingest SSD or catatonic players. --- code/__DEFINES/preferences.dm | 3 ++- code/citadel/dogborgstuff.dm | 3 +++ code/modules/client/preferences.dm | 4 ++++ code/modules/client/preferences_toggles.dm | 15 +++++++++++++++ .../mob/living/silicon/robot/robot_modules.dm | 1 + 5 files changed, 25 insertions(+), 1 deletion(-) diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index d7a5356f0f..db496f1cba 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -14,8 +14,9 @@ #define SOUND_ANNOUNCEMENTS 2048 #define DISABLE_DEATHRATTLE 4096 #define DISABLE_ARRIVALRATTLE 8192 +#define MEDIHOUND_SLEEPER 16384 -#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|MEMBER_PUBLIC|INTENT_STYLE|MIDROUND_ANTAG|SOUND_INSTRUMENTS|SOUND_SHIP_AMBIENCE|SOUND_PRAYERS|SOUND_ANNOUNCEMENTS) +#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|MEMBER_PUBLIC|INTENT_STYLE|MIDROUND_ANTAG|SOUND_INSTRUMENTS|SOUND_SHIP_AMBIENCE|SOUND_PRAYERS|SOUND_ANNOUNCEMENTS|MEDIHOUND_SLEEPER) //Chat toggles #define CHAT_OOC 1 diff --git a/code/citadel/dogborgstuff.dm b/code/citadel/dogborgstuff.dm index daafd135f6..55eb6fe356 100644 --- a/code/citadel/dogborgstuff.dm +++ b/code/citadel/dogborgstuff.dm @@ -361,6 +361,9 @@ return if(!iscarbon(target)) return + if(!(target.client && target.client.prefs && target.client.prefs.toggles && (target.client.prefs.toggles & MEDIHOUND_SLEEPER))) + to_chat(user, "This person is incompatible with our equipment.") + return if(target.buckled) to_chat(user, "The user is buckled and can not be put into your [src.name].") return diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index f2ef23f1ce..06af2abb9d 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -316,6 +316,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Window Flashing: [(windowflashing) ? "Yes" : "No"]
" dat += "Play admin midis: [(toggles & SOUND_MIDI) ? "Yes" : "No"]
" dat += "Play lobby music: [(toggles & SOUND_LOBBY) ? "Yes" : "No"]
" + dat += "Allow MediHound sleeper: [(toggles & MEDIHOUND_SLEEPER) ? "Yes" : "No"]
" dat += "Ghost ears: [(chat_toggles & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"]
" dat += "Ghost sight: [(chat_toggles & CHAT_GHOSTSIGHT) ? "All Emotes" : "Nearest Creatures"]
" dat += "Ghost whispers: [(chat_toggles & CHAT_GHOSTWHISPER) ? "All Speech" : "Nearest Creatures"]
" @@ -1783,6 +1784,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("pull_requests") chat_toggles ^= CHAT_PULLR + if("hound_sleeper") + toggles ^= MEDIHOUND_SLEEPER + if("allow_midround_antag") toggles ^= MIDROUND_ANTAG diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index 255423a4fc..52139fd7bc 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -250,6 +250,20 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings, listen_ooc)() /datum/verbs/menu/Settings/listen_ooc/Get_checked(client/C) return C.prefs.chat_toggles & CHAT_OOC +TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, togglehoundsleeper)() + set name = "Allow/Deny Hound Sleeper" + set category = "Preferences" + set desc = "Allow MediHound Sleepers" + usr.client.prefs.toggles ^= MEDIHOUND_SLEEPER + usr.client.prefs.save_preferences() + if(usr.client.prefs.toggles & MEDIHOUND_SLEEPER) + to_chat(usr, "You will now allow MediHounds to place you in their sleeper.") + else + to_chat(usr, "You will no longer allow MediHounds to place you in their sleeper.") + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle MediHound Sleeper", "[usr.client.prefs.toggles & MEDIHOUND_SLEEPER ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/datum/verbs/menu/Settings/Sound/togglehoundsleeper/Get_checked(client/C) + return C.prefs.toggles & MEDIHOUND_SLEEPER + GLOBAL_LIST_INIT(ghost_forms, list("ghost","ghostking","ghostian2","skeleghost","ghost_red","ghost_black", \ "ghost_blue","ghost_yellow","ghost_green","ghost_pink", \ @@ -415,3 +429,4 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS prefs.save_preferences() to_chat(src, "You will [(prefs.chat_toggles & CHAT_PRAYER) ? "now" : "no longer"] see prayerchat.") SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Prayer Visibility", "[prefs.chat_toggles & CHAT_PRAYER ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm b/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm index af30ff3349..dd7d492575 100644 --- a/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -67,6 +67,7 @@ /obj/item/soap/tongue, /obj/item/device/healthanalyzer, /obj/item/device/dogborg/sleeper/medihound, + /obj/item/reagent_containers/borghypo, /obj/item/twohanded/shockpaddles/cyborg/hound, /obj/item/stack/medical/gauze/cyborg, /obj/item/device/sensor_device) From 536537a0a41f693d4d7f64e19b75c5291035be17 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 5 Mar 2018 12:33:26 -0600 Subject: [PATCH 05/45] Automatic changelog generation for PR #5738 [ci skip] --- html/changelogs/AutoChangeLog-pr-5738.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5738.yml diff --git a/html/changelogs/AutoChangeLog-pr-5738.yml b/html/changelogs/AutoChangeLog-pr-5738.yml new file mode 100644 index 0000000000..d166c1fe6d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5738.yml @@ -0,0 +1,5 @@ +author: "CameronWoof" +delete-after: True +changes: + - tweak: "The MediHound's now has a unique preference, which defaults to on." + - rscadd: "MediHound now has a cyborg hypospray, to help tend to patients with their sleeper preference off." From 6134f79a267a106ccd3c5e95ebbb3e7e1bb143ed Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 5 Mar 2018 12:34:01 -0600 Subject: [PATCH 06/45] [MIRROR] Converts several species traits into generic traits (#5710) * Converts several species traits into generic traits * Update traits.dm * Update mousetrap.dm * Update corporate.dm * Update jellypeople.dm * snowflake fix --- code/__DEFINES/DNA.dm | 46 +-- code/__DEFINES/traits.dm | 17 +- code/datums/components/caltrop.dm | 2 +- code/datums/diseases/_MobProcs.dm | 8 +- code/datums/mutations/cold_resistance.dm | 12 + .../weather/weather_types/radiation_storm.dm | 19 +- code/game/machinery/cloning.dm | 2 +- code/game/machinery/computer/dna_console.dm | 4 +- code/game/objects/items.dm | 2 +- .../objects/items/devices/laserpointer.dm | 5 +- code/game/objects/items/dna_injector.dm | 2 +- .../game/objects/items/stacks/sheets/glass.dm | 7 +- .../antagonists/highlander/highlander.dm | 14 +- code/modules/assembly/mousetrap.dm | 284 +++++++++--------- code/modules/events/disease_outbreak.dm | 2 +- code/modules/hydroponics/grown/nettle.dm | 7 +- code/modules/mob/living/blood.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 2 +- .../mob/living/carbon/carbon_movement.dm | 2 +- .../modules/mob/living/carbon/damage_procs.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 4 +- .../mob/living/carbon/human/human_defense.dm | 2 +- .../mob/living/carbon/human/human_helpers.dm | 2 +- code/modules/mob/living/carbon/human/life.dm | 18 +- code/modules/mob/living/carbon/human/say.dm | 8 +- .../mob/living/carbon/human/species.dm | 40 +-- .../carbon/human/species_types/abductors.dm | 3 +- .../carbon/human/species_types/android.dm | 3 +- .../carbon/human/species_types/corporate.dm | 39 +-- .../carbon/human/species_types/dullahan.dm | 3 +- .../carbon/human/species_types/furrypeople.dm | 3 +- .../carbon/human/species_types/golems.dm | 14 +- .../carbon/human/species_types/jellypeople.dm | 4 +- .../human/species_types/lizardpeople.dm | 3 +- .../carbon/human/species_types/plasmamen.dm | 3 +- .../human/species_types/shadowpeople.dm | 6 +- .../carbon/human/species_types/skeletons.dm | 3 +- .../carbon/human/species_types/synths.dm | 9 +- .../carbon/human/species_types/vampire.dm | 3 +- .../carbon/human/species_types/zombies.dm | 3 +- code/modules/mob/living/carbon/life.dm | 4 +- .../mob/living/simple_animal/constructs.dm | 7 +- .../chemistry/reagents/toxin_reagents.dm | 12 +- code/modules/station_goals/dna_vault.dm | 11 +- code/modules/surgery/bodyparts/bodyparts.dm | 2 +- .../surgery/bodyparts/dismemberment.dm | 22 +- code/modules/surgery/organs/lungs.dm | 8 +- code/modules/surgery/organs/organ_internal.dm | 2 +- 48 files changed, 348 insertions(+), 334 deletions(-) diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 87552e5841..de3b90eb1c 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -94,36 +94,22 @@ #define FACEHAIR 3 #define EYECOLOR 4 #define LIPS 5 -#define RESISTHOT 6 -#define RESISTCOLD 7 -#define RESISTPRESSURE 8 -#define RADIMMUNE 9 -#define NOBREATH 10 -#define NOGUNS 11 -#define NOBLOOD 12 -#define NOFIRE 13 -#define VIRUSIMMUNE 14 -#define PIERCEIMMUNE 15 -#define NOTRANSSTING 16 -#define MUTCOLORS_PARTSONLY 17 //Used if we want the mutant colour to be only used by mutant bodyparts. Don't combine this with MUTCOLORS, or it will be useless. -#define NODISMEMBER 18 -#define NOHUNGER 19 -#define NOCRITDAMAGE 20 -#define NOZOMBIE 21 -#define EASYDISMEMBER 22 -#define EASYLIMBATTACHMENT 23 -#define TOXINLOVER 24 -#define DIGITIGRADE 25 //Uses weird leg sprites. Optional for Lizards, required for ashwalkers. Don't give it to other races unless you make sprites for this (see human_parts_greyscale.dmi) -#define NO_UNDERWEAR 26 -#define NOLIVER 27 -#define NOSTOMACH 28 -#define NO_DNA_COPY 29 -#define DRINKSBLOOD 30 -#define SPECIES_ORGANIC 31 -#define SPECIES_INORGANIC 32 -#define SPECIES_UNDEAD 33 -#define SPECIES_ROBOTIC 34 -#define NOEYES 35 +#define NOBLOOD 6 +#define NOTRANSSTING 7 +#define MUTCOLORS_PARTSONLY 8 //Used if we want the mutant colour to be only used by mutant bodyparts. Don't combine this with MUTCOLORS, or it will be useless. +#define NOCRITDAMAGE 9 +#define NOZOMBIE 10 +#define DIGITIGRADE 11 //Uses weird leg sprites. Optional for Lizards, required for ashwalkers. Don't give it to other races unless you make sprites for this (see human_parts_greyscale.dmi) +#define NO_UNDERWEAR 12 +#define NOLIVER 13 +#define NOSTOMACH 14 +#define NO_DNA_COPY 15 +#define DRINKSBLOOD 16 +#define SPECIES_ORGANIC 17 +#define SPECIES_INORGANIC 18 +#define SPECIES_UNDEAD 19 +#define SPECIES_ROBOTIC 20 +#define NOEYES 21 #define ORGAN_SLOT_BRAIN "brain" #define ORGAN_SLOT_APPENDIX "appendix" diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 1334790ff1..6bc504d48a 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -21,6 +21,21 @@ #define TRAIT_SLEEPIMMUNE "sleep_immunity" #define TRAIT_PUSHIMMUNE "push_immunity" #define TRAIT_SHOCKIMMUNE "shock_immunity" +#define TRAIT_RESISTHEAT "resist_heat" +#define TRAIT_RESISTCOLD "resist_cold" +#define TRAIT_RESISTHIGHPRESSURE "resist_high_pressure" +#define TRAIT_RESISTLOWPRESSURE "resist_low_pressure" +#define TRAIT_RADIMMUNE "rad_immunity" +#define TRAIT_VIRUSIMMUNE "virus_immunity" +#define TRAIT_PIERCEIMMUNE "pierce_immunity" +#define TRAIT_NODISMEMBER "dismember_immunity" +#define TRAIT_NOFIRE "nonflammable" +#define TRAIT_NOGUNS "no_guns" +#define TRAIT_NOHUNGER "no_hunger" +#define TRAIT_EASYDISMEMBER "easy_dismember" +#define TRAIT_LIMBATTACHMENT "limb_attach" +#define TRAIT_TOXINLOVER "toxinlover" +#define TRAIT_NOBREATH "no_breath" #define TRAIT_ANTIMAGIC "anti_magic" #define TRAIT_HOLY "holy" @@ -56,4 +71,4 @@ #define TRAIT_HULK "hulk" #define STASIS_MUTE "stasis" #define GENETICS_SPELL "genetics_spell" -#define EYES_COVERED "eyes_covered" +#define EYES_COVERED "eyes_covered" \ No newline at end of file diff --git a/code/datums/components/caltrop.dm b/code/datums/components/caltrop.dm index 8fc7a070af..9193651ee2 100644 --- a/code/datums/components/caltrop.dm +++ b/code/datums/components/caltrop.dm @@ -24,7 +24,7 @@ if(ishuman(AM)) var/mob/living/carbon/human/H = AM - if(PIERCEIMMUNE in H.dna.species.species_traits) + if(H.has_trait(TRAIT_PIERCEIMMUNE)) return if((flags & CALTROP_IGNORE_WALKERS) && H.m_intent == MOVE_INTENT_WALK) diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm index ffc20cc9cb..9f4fa1fe63 100644 --- a/code/datums/diseases/_MobProcs.dm +++ b/code/datums/diseases/_MobProcs.dm @@ -133,14 +133,10 @@ /mob/living/carbon/AirborneContractDisease(datum/disease/D) if(internal) return - ..() - -/mob/living/carbon/human/AirborneContractDisease(datum/disease/D) - if(dna && (NOBREATH in dna.species.species_traits)) + if(has_trait(TRAIT_NOBREATH)) return ..() - //Proc to use when you 100% want to infect someone, as long as they aren't immune /mob/proc/ForceContractDisease(datum/disease/D) if(!CanContractDisease(D)) @@ -151,7 +147,7 @@ /mob/living/carbon/human/CanContractDisease(datum/disease/D) if(dna) - if((VIRUSIMMUNE in dna.species.species_traits) && !D.bypasses_immunity) + if(has_trait(TRAIT_VIRUSIMMUNE) && !D.bypasses_immunity) return FALSE var/can_infect = FALSE diff --git a/code/datums/mutations/cold_resistance.dm b/code/datums/mutations/cold_resistance.dm index 6281514e71..b221ac95ca 100644 --- a/code/datums/mutations/cold_resistance.dm +++ b/code/datums/mutations/cold_resistance.dm @@ -14,6 +14,18 @@ /datum/mutation/human/cold_resistance/get_visual_indicator(mob/living/carbon/human/owner) return visual_indicators[1] +/datum/mutation/human/cold_resistance/on_acquiring(mob/living/carbon/human/owner) + if(..()) + return + owner.add_trait(TRAIT_RESISTCOLD, "cold_resistance") + owner.add_trait(TRAIT_RESISTLOWPRESSURE, "cold_resistance") + +/datum/mutation/human/cold_resistance/on_losing(mob/living/carbon/human/owner) + if(..()) + return + owner.remove_trait(TRAIT_RESISTCOLD, "cold_resistance") + owner.remove_trait(TRAIT_RESISTLOWPRESSURE, "cold_resistance") + /datum/mutation/human/cold_resistance/on_life(mob/living/carbon/human/owner) if(owner.getFireLoss()) if(prob(1)) diff --git a/code/datums/weather/weather_types/radiation_storm.dm b/code/datums/weather/weather_types/radiation_storm.dm index 9c9bde19fc..0906a7e053 100644 --- a/code/datums/weather/weather_types/radiation_storm.dm +++ b/code/datums/weather/weather_types/radiation_storm.dm @@ -33,16 +33,15 @@ if(prob(40)) if(ishuman(L)) var/mob/living/carbon/human/H = L - if(H.dna && H.dna.species) - if(!(RADIMMUNE in H.dna.species.species_traits)) - if(prob(max(0,100-resist))) - H.randmuti() - if(prob(50)) - if(prob(90)) - H.randmutb() - else - H.randmutg() - H.domutcheck() + if(H.dna && !H.has_trait(TRAIT_RADIMMUNE)) + if(prob(max(0,100-resist))) + H.randmuti() + if(prob(50)) + if(prob(90)) + H.randmutb() + else + H.randmutg() + H.domutcheck() L.rad_act(20) /datum/weather/rad_storm/end() diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 5d87f65537..b46706ce9f 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -440,7 +440,7 @@ // brain function, they also have no limbs or internal organs. - if(!NODISMEMBER in H.dna.species.species_traits) + if(!H.has_trait(TRAIT_NODISMEMBER)) var/static/list/zones = list("r_arm", "l_arm", "r_leg", "l_leg") for(var/zone in zones) var/obj/item/bodypart/BP = H.get_bodypart(zone) diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index de0089d5c6..3b6113e67b 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -81,7 +81,7 @@ if(connected && connected.is_operational()) if(connected.occupant) //set occupant_status message viable_occupant = connected.occupant - if(viable_occupant.has_dna() && (!(RADIMMUNE in viable_occupant.dna.species.species_traits)) && (!(viable_occupant.has_trait(TRAIT_NOCLONE)) || (connected.scan_level == 3))) //occupant is viable for dna modification + if(viable_occupant.has_dna() && !viable_occupant.has_trait(TRAIT_RADIMMUNE) && !viable_occupant.has_trait(TRAIT_NOCLONE) || (connected.scan_level == 3)) //occupant is viable for dna modification occupant_status += "[viable_occupant.name] => " switch(viable_occupant.stat) if(CONSCIOUS) @@ -528,7 +528,7 @@ var/mob/living/carbon/viable_occupant = null if(connected) viable_occupant = connected.occupant - if(!istype(viable_occupant) || !viable_occupant.dna || (RADIMMUNE in viable_occupant.dna.species.species_traits) || (viable_occupant.has_trait(TRAIT_NOCLONE))) + if(!istype(viable_occupant) || !viable_occupant.dna || viable_occupant.has_trait(TRAIT_RADIMMUNE) || viable_occupant.has_trait(TRAIT_NOCLONE)) viable_occupant = null return viable_occupant diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 4267f69657..b21d95e7ab 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -250,7 +250,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) can_handle_hot = TRUE else if(C.gloves && (C.gloves.max_heat_protection_temperature > 360)) can_handle_hot = TRUE - else if(RESISTHOT in C.dna.species.species_traits) + else if(C.has_trait(TRAIT_RESISTHEAT)) can_handle_hot = TRUE if(can_handle_hot) diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index eb1ccd15f4..2e65a6c108 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -67,9 +67,12 @@ if (!user.IsAdvancedToolUser()) to_chat(user, "You don't have the dexterity to do this!") return + if(user.has_trait(TRAIT_NOGUNS)) + to_chat(user, "Your fingers can't press the button!") + return if(ishuman(user)) var/mob/living/carbon/human/H = user - if(H.dna.check_mutation(HULK) || (NOGUNS in H.dna.species.species_traits)) + if(H.dna.check_mutation(HULK)) to_chat(user, "Your fingers can't press the button!") return diff --git a/code/game/objects/items/dna_injector.dm b/code/game/objects/items/dna_injector.dm index c908b619c4..0e8c82d963 100644 --- a/code/game/objects/items/dna_injector.dm +++ b/code/game/objects/items/dna_injector.dm @@ -31,7 +31,7 @@ /obj/item/dnainjector/proc/inject(mob/living/carbon/M, mob/user) prepare() - if(M.has_dna() && !(RADIMMUNE in M.dna.species.species_traits) && !(M.has_trait(TRAIT_NOCLONE))) + if(M.has_dna() && !M.has_trait(TRAIT_RADIMMUNE) && !M.has_trait(TRAIT_NOCLONE)) M.radiation += rand(20/(damage_coeff ** 2),50/(damage_coeff ** 2)) var/log_msg = "[key_name(user)] injected [key_name(M)] with the [name]" for(var/datum/mutation/human/HM in remove_mutations) diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index ae73824899..fba0c1b1a2 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -274,13 +274,14 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( var/hit_hand = ((user.active_hand_index % 2 == 0) ? "r_" : "l_") + "arm" if(ishuman(user)) var/mob/living/carbon/human/H = user - if(!H.gloves && !(PIERCEIMMUNE in H.dna.species.species_traits)) // golems, etc + if(!H.gloves && !H.has_trait(TRAIT_PIERCEIMMUNE)) // golems, etc to_chat(H, "[src] cuts into your hand!") H.apply_damage(force*0.5, BRUTE, hit_hand) else if(ismonkey(user)) var/mob/living/carbon/monkey/M = user - to_chat(M, "[src] cuts into your hand!") - M.apply_damage(force*0.5, BRUTE, hit_hand) + if(!M.has_trait(TRAIT_PIERCEIMMUNE)) + to_chat(M, "[src] cuts into your hand!") + M.apply_damage(force*0.5, BRUTE, hit_hand) /obj/item/shard/attackby(obj/item/I, mob/user, params) diff --git a/code/modules/antagonists/highlander/highlander.dm b/code/modules/antagonists/highlander/highlander.dm index 185bedba8f..aeca9c18bd 100644 --- a/code/modules/antagonists/highlander/highlander.dm +++ b/code/modules/antagonists/highlander/highlander.dm @@ -5,16 +5,12 @@ show_name_in_check_antagonists = TRUE /datum/antagonist/highlander/apply_innate_effects(mob/living/mob_override) - var/mob/living/carbon/human/H = owner.current || mob_override - if(!istype(H)) - return - H.dna.species.species_traits |= NOGUNS //nice try jackass + var/mob/living/L = owner.current || mob_override + L.add_trait(TRAIT_NOGUNS, "highlander") /datum/antagonist/highlander/remove_innate_effects(mob/living/mob_override) - var/mob/living/carbon/human/H = owner.current || mob_override - if(!istype(H)) - return - H.dna.species.species_traits &= ~NOGUNS + var/mob/living/L = owner.current || mob_override + L.remove_trait(TRAIT_NOGUNS, "highlander") /datum/antagonist/highlander/on_removal() owner.objectives -= objectives @@ -76,7 +72,7 @@ sword.admin_spawned = TRUE //To prevent announcing sword.pickup(H) //For the stun shielding H.put_in_hands(sword) - + var/obj/item/bloodcrawl/antiwelder = new(H) antiwelder.name = "compulsion of honor" diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index fb37c878a3..5e06851e58 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -1,142 +1,142 @@ -/obj/item/device/assembly/mousetrap - name = "mousetrap" - desc = "A handy little spring-loaded trap for catching pesty rodents." - icon_state = "mousetrap" - materials = list(MAT_METAL=100) - attachable = 1 - var/armed = 0 - - -/obj/item/device/assembly/mousetrap/examine(mob/user) - ..() - if(armed) - to_chat(user, "The mousetrap is armed!") - else - to_chat(user, "The mousetrap is not armed.") - -/obj/item/device/assembly/mousetrap/activate() - if(..()) - armed = !armed - if(!armed) - if(ishuman(usr)) - var/mob/living/carbon/human/user = usr - if((user.has_trait(TRAIT_DUMB) || user.has_trait(TRAIT_CLUMSY)) && prob(50)) - to_chat(user, "Your hand slips, setting off the trigger!") - pulse(0) - update_icon() - if(usr) - playsound(usr.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3) - -/obj/item/device/assembly/mousetrap/describe() - return "The pressure switch is [armed?"primed":"safe"]." - -/obj/item/device/assembly/mousetrap/update_icon() - if(armed) - icon_state = "mousetraparmed" - else - icon_state = "mousetrap" - if(holder) - holder.update_icon() - -/obj/item/device/assembly/mousetrap/proc/triggered(mob/target, type = "feet") - if(!armed) - return - var/obj/item/bodypart/affecting = null - if(ishuman(target)) - var/mob/living/carbon/human/H = target - if(PIERCEIMMUNE in H.dna.species.species_traits) - playsound(src.loc, 'sound/effects/snap.ogg', 50, 1) - armed = 0 - update_icon() - pulse(0) - return 0 - switch(type) - if("feet") - if(!H.shoes) - affecting = H.get_bodypart(pick("l_leg", "r_leg")) - H.Knockdown(60) - if("l_hand", "r_hand") - if(!H.gloves) - affecting = H.get_bodypart(type) - H.Stun(60) - if(affecting) - if(affecting.receive_damage(1, 0)) - H.update_damage_overlays() - else if(ismouse(target)) - var/mob/living/simple_animal/mouse/M = target - visible_message("SPLAT!") - M.splat() - playsound(src.loc, 'sound/effects/snap.ogg', 50, 1) - armed = 0 - update_icon() - pulse(0) - - -/obj/item/device/assembly/mousetrap/attack_self(mob/living/carbon/human/user) - if(!armed) - to_chat(user, "You arm [src].") - else - if((user.has_trait(TRAIT_DUMB) || user.has_trait(TRAIT_CLUMSY)) && prob(50)) - var/which_hand = "l_hand" - if(!(user.active_hand_index % 2)) - which_hand = "r_hand" - triggered(user, which_hand) - user.visible_message("[user] accidentally sets off [src], breaking their fingers.", \ - "You accidentally trigger [src]!") - return - to_chat(user, "You disarm [src].") - armed = !armed - update_icon() - playsound(user.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3) - - -/obj/item/device/assembly/mousetrap/attack_hand(mob/living/carbon/human/user) - if(armed) - if((user.has_trait(TRAIT_DUMB) || user.has_trait(TRAIT_CLUMSY)) && prob(50)) - var/which_hand = "l_hand" - if(!(user.active_hand_index % 2)) - which_hand = "r_hand" - triggered(user, which_hand) - user.visible_message("[user] accidentally sets off [src], breaking their fingers.", \ - "You accidentally trigger [src]!") - return - ..() - - -/obj/item/device/assembly/mousetrap/Crossed(atom/movable/AM as mob|obj) - if(armed) - if(ismob(AM)) - var/mob/MM = AM - if(!(MM.movement_type & FLYING)) - if(ishuman(AM)) - var/mob/living/carbon/H = AM - if(H.m_intent == MOVE_INTENT_RUN) - triggered(H) - H.visible_message("[H] accidentally steps on [src].", \ - "You accidentally step on [src]") - else if(ismouse(MM)) - triggered(MM) - else if(AM.density) // For mousetrap grenades, set off by anything heavy - triggered(AM) - ..() - - -/obj/item/device/assembly/mousetrap/on_found(mob/finder) - if(armed) - finder.visible_message("[finder] accidentally sets off [src], breaking their fingers.", \ - "You accidentally trigger [src]!") - triggered(finder, (finder.active_hand_index % 2 == 0) ? "r_hand" : "l_hand") - return 1 //end the search! - return 0 - - -/obj/item/device/assembly/mousetrap/hitby(A as mob|obj) - if(!armed) - return ..() - visible_message("[src] is triggered by [A].") - triggered(null) - - -/obj/item/device/assembly/mousetrap/armed - icon_state = "mousetraparmed" - armed = 1 +/obj/item/device/assembly/mousetrap + name = "mousetrap" + desc = "A handy little spring-loaded trap for catching pesty rodents." + icon_state = "mousetrap" + materials = list(MAT_METAL=100) + attachable = 1 + var/armed = 0 + + +/obj/item/device/assembly/mousetrap/examine(mob/user) + ..() + if(armed) + to_chat(user, "The mousetrap is armed!") + else + to_chat(user, "The mousetrap is not armed.") + +/obj/item/device/assembly/mousetrap/activate() + if(..()) + armed = !armed + if(!armed) + if(ishuman(usr)) + var/mob/living/carbon/human/user = usr + if((user.has_trait(TRAIT_DUMB) || user.has_trait(TRAIT_CLUMSY)) && prob(50)) + to_chat(user, "Your hand slips, setting off the trigger!") + pulse(0) + update_icon() + if(usr) + playsound(usr.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3) + +/obj/item/device/assembly/mousetrap/describe() + return "The pressure switch is [armed?"primed":"safe"]." + +/obj/item/device/assembly/mousetrap/update_icon() + if(armed) + icon_state = "mousetraparmed" + else + icon_state = "mousetrap" + if(holder) + holder.update_icon() + +/obj/item/device/assembly/mousetrap/proc/triggered(mob/target, type = "feet") + if(!armed) + return + var/obj/item/bodypart/affecting = null + if(ishuman(target)) + var/mob/living/carbon/human/H = target + if(H.has_trait(TRAIT_PIERCEIMMUNE)) + playsound(src.loc, 'sound/effects/snap.ogg', 50, 1) + armed = 0 + update_icon() + pulse(0) + return 0 + switch(type) + if("feet") + if(!H.shoes) + affecting = H.get_bodypart(pick("l_leg", "r_leg")) + H.Knockdown(60) + if("l_hand", "r_hand") + if(!H.gloves) + affecting = H.get_bodypart(type) + H.Stun(60) + if(affecting) + if(affecting.receive_damage(1, 0)) + H.update_damage_overlays() + else if(ismouse(target)) + var/mob/living/simple_animal/mouse/M = target + visible_message("SPLAT!") + M.splat() + playsound(src.loc, 'sound/effects/snap.ogg', 50, 1) + armed = 0 + update_icon() + pulse(0) + + +/obj/item/device/assembly/mousetrap/attack_self(mob/living/carbon/human/user) + if(!armed) + to_chat(user, "You arm [src].") + else + if((user.has_trait(TRAIT_DUMB) || user.has_trait(TRAIT_CLUMSY)) && prob(50)) + var/which_hand = "l_hand" + if(!(user.active_hand_index % 2)) + which_hand = "r_hand" + triggered(user, which_hand) + user.visible_message("[user] accidentally sets off [src], breaking their fingers.", \ + "You accidentally trigger [src]!") + return + to_chat(user, "You disarm [src].") + armed = !armed + update_icon() + playsound(user.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3) + + +/obj/item/device/assembly/mousetrap/attack_hand(mob/living/carbon/human/user) + if(armed) + if((user.has_trait(TRAIT_DUMB) || user.has_trait(TRAIT_CLUMSY)) && prob(50)) + var/which_hand = "l_hand" + if(!(user.active_hand_index % 2)) + which_hand = "r_hand" + triggered(user, which_hand) + user.visible_message("[user] accidentally sets off [src], breaking their fingers.", \ + "You accidentally trigger [src]!") + return + ..() + + +/obj/item/device/assembly/mousetrap/Crossed(atom/movable/AM as mob|obj) + if(armed) + if(ismob(AM)) + var/mob/MM = AM + if(!(MM.movement_type & FLYING)) + if(ishuman(AM)) + var/mob/living/carbon/H = AM + if(H.m_intent == MOVE_INTENT_RUN) + triggered(H) + H.visible_message("[H] accidentally steps on [src].", \ + "You accidentally step on [src]") + else if(ismouse(MM)) + triggered(MM) + else if(AM.density) // For mousetrap grenades, set off by anything heavy + triggered(AM) + ..() + + +/obj/item/device/assembly/mousetrap/on_found(mob/finder) + if(armed) + finder.visible_message("[finder] accidentally sets off [src], breaking their fingers.", \ + "You accidentally trigger [src]!") + triggered(finder, (finder.active_hand_index % 2 == 0) ? "r_hand" : "l_hand") + return 1 //end the search! + return 0 + + +/obj/item/device/assembly/mousetrap/hitby(A as mob|obj) + if(!armed) + return ..() + visible_message("[src] is triggered by [A].") + triggered(null) + + +/obj/item/device/assembly/mousetrap/armed + icon_state = "mousetraparmed" + armed = 1 diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index c8b8db0681..932a578d67 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -39,7 +39,7 @@ continue if(H.stat == DEAD) continue - if(VIRUSIMMUNE in H.dna.species.species_traits) //Don't pick someone who's virus immune, only for it to not do anything. + if(H.has_trait(TRAIT_VIRUSIMMUNE)) //Don't pick someone who's virus immune, only for it to not do anything. continue var/foundAlready = FALSE // don't infect someone that already has a disease for(var/thing in H.viruses) diff --git a/code/modules/hydroponics/grown/nettle.dm b/code/modules/hydroponics/grown/nettle.dm index 9ec936c1f2..bb1a0d2f23 100644 --- a/code/modules/hydroponics/grown/nettle.dm +++ b/code/modules/hydroponics/grown/nettle.dm @@ -56,11 +56,8 @@ var/mob/living/carbon/C = user if(C.gloves) return FALSE - if(ishuman(C)) - var/mob/living/carbon/human/H = C - if(H.dna && H.dna.species) - if(PIERCEIMMUNE in H.dna.species.species_traits) - return FALSE + if(C.has_trait(TRAIT_PIERCEIMMUNE)) + return FALSE var/hit_zone = (C.held_index_to_dir(C.active_hand_index) == "l" ? "l_":"r_") + "arm" var/obj/item/bodypart/affecting = C.get_bodypart(hit_zone) if(affecting) diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index dd8c84c969..a30fd1492e 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -31,7 +31,7 @@ if(bodytemperature >= TCRYO && !(has_trait(TRAIT_NOCLONE))) //cryosleep or husked people do not pump the blood. //Blood regeneration if there is some space - if(blood_volume < BLOOD_VOLUME_NORMAL && !(NOHUNGER in dna.species.species_traits)) + if(blood_volume < BLOOD_VOLUME_NORMAL && !has_trait(TRAIT_NOHUNGER)) var/nutrition_ratio = 0 switch(nutrition) if(0 to NUTRITION_LEVEL_STARVING) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 8444779a79..b530ab0cc0 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -440,7 +440,7 @@ return ..() /mob/living/carbon/proc/vomit(lost_nutrition = 10, blood = FALSE, stun = TRUE, distance = 1, message = TRUE, toxic = FALSE) - if(dna && dna.species && NOHUNGER in dna.species.species_traits) + if(has_trait(TRAIT_NOHUNGER)) return 1 if(nutrition < 100 && !blood) diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm index 27c64625a8..662a42eea4 100644 --- a/code/modules/mob/living/carbon/carbon_movement.dm +++ b/code/modules/mob/living/carbon/carbon_movement.dm @@ -50,7 +50,7 @@ /mob/living/carbon/Move(NewLoc, direct) . = ..() if(. && mob_has_gravity()) //floating is easy - if(dna && dna.species && (NOHUNGER in dna.species.species_traits)) + if(has_trait(TRAIT_NOHUNGER)) nutrition = NUTRITION_LEVEL_FED - 1 //just less than feeling vigorous else if(nutrition && stat != DEAD) nutrition -= HUNGER_FACTOR/10 diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index a626266f01..b437b6a4f2 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -80,7 +80,7 @@ /mob/living/carbon/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE) - if(!forced && has_dna() && TOXINLOVER in dna.species.species_traits) //damage becomes healing and healing becomes damage + if(!forced && has_trait(TRAIT_TOXINLOVER)) //damage becomes healing and healing becomes damage amount = -amount if(amount > 0) blood_volume -= 5*amount diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 64ffc91ae7..6b5d533f11 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -482,7 +482,7 @@ . = 1 // Default to returning true. if(user && !target_zone) target_zone = user.zone_selected - if(dna && (PIERCEIMMUNE in dna.species.species_traits)) + if(has_trait(TRAIT_PIERCEIMMUNE)) . = 0 // If targeting the head, see if the head item is thin enough. // If targeting anything else, see if the wear suit is thin enough. @@ -643,7 +643,7 @@ to_chat(src, "You fail to perform CPR on [C]!") return 0 - var/they_breathe = (!(NOBREATH in C.dna.species.species_traits)) + var/they_breathe = !C.has_trait(TRAIT_NOBREATH) var/they_lung = C.getorganslot(ORGAN_SLOT_LUNGS) if(C.health > HEALTH_THRESHOLD_CRIT) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index b524e7efc4..c7d2541b08 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -136,7 +136,7 @@ else if(I) if(I.throw_speed >= EMBED_THROWSPEED_THRESHOLD) if(can_embed(I)) - if(prob(I.embedding.embed_chance) && !(dna && (PIERCEIMMUNE in dna.species.species_traits))) + if(prob(I.embedding.embed_chance) && !has_trait(TRAIT_PIERCEIMMUNE)) throw_alert("embeddedobject", /obj/screen/alert/embeddedobject) var/obj/item/bodypart/L = pick(bodyparts) L.embedded_objects |= I diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index c5e4581253..f3f0fe0215 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -138,7 +138,7 @@ if(src.dna.check_mutation(HULK)) to_chat(src, "Your meaty finger is much too large for the trigger guard!") return FALSE - if(NOGUNS in src.dna.species.species_traits) + if(has_trait(TRAIT_NOGUNS)) to_chat(src, "Your fingers don't fit in the trigger guard!") return FALSE if(mind) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 55e0325632..d47d68bf8b 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -228,11 +228,7 @@ return thermal_protection_flags /mob/living/carbon/human/proc/get_cold_protection(temperature) - - if(dna.check_mutation(COLDRES)) - return TRUE //Fully protected from the cold. - - if(RESISTCOLD in dna.species.species_traits) + if(has_trait(TRAIT_RESISTCOLD)) return TRUE //CITADEL EDIT Mandatory for vore code. @@ -285,16 +281,14 @@ /mob/living/carbon/human/has_smoke_protection() if(wear_mask) if(wear_mask.flags_1 & BLOCK_GAS_SMOKE_EFFECT_1) - . = 1 + return TRUE if(glasses) if(glasses.flags_1 & BLOCK_GAS_SMOKE_EFFECT_1) - . = 1 + return TRUE if(head) if(head.flags_1 & BLOCK_GAS_SMOKE_EFFECT_1) - . = 1 - if(NOBREATH in dna.species.species_traits) - . = 1 - return . + return TRUE + return ..() /mob/living/carbon/human/proc/handle_embedded_objects() @@ -321,7 +315,7 @@ if(!can_heartattack()) return - var/we_breath = (!(NOBREATH in dna.species.species_traits)) + var/we_breath = !has_trait(TRAIT_NOBREATH, SPECIES_TRAIT) if(!undergoing_cardiac_arrest()) diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index c601f1445c..56ba4dff81 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -48,14 +48,12 @@ return real_name /mob/living/carbon/human/IsVocal() - CHECK_DNA_AND_SPECIES(src) - // how do species that don't breathe talk? magic, that's what. - if(!(NOBREATH in dna.species.species_traits) && !getorganslot(ORGAN_SLOT_LUNGS)) - return 0 + if(!has_trait(TRAIT_NOBREATH, SPECIES_TRAIT) && !getorganslot(ORGAN_SLOT_LUNGS)) + return FALSE if(mind) return !mind.miming - return 1 + return TRUE /mob/living/carbon/human/proc/SetSpecialVoice(new_voice) if(new_voice) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 3978811236..0c5f68d9ba 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -53,8 +53,10 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/damage_overlay_type = "human" //what kind of damage overlays (if any) appear on our species when wounded? var/fixed_mut_color = "" //to use MUTCOLOR with a fixed color that's independent of dna.feature["mcolor"] - // species flags. these can be found in flags.dm + // species-only traits. Can be found in DNA.dm var/list/species_traits = list() + // generic traits tied to having the species + var/list/inherent_traits = list() var/attack_verb = "punch" // punch-specific attack verb var/sound/attack_sound = 'sound/weapons/punch1.ogg' @@ -151,8 +153,8 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/should_have_brain = TRUE var/should_have_heart = !(NOBLOOD in species_traits) - var/should_have_lungs = !(NOBREATH in species_traits) - var/should_have_appendix = !(NOHUNGER in species_traits) + var/should_have_lungs = !(TRAIT_NOBREATH in inherent_traits) + var/should_have_appendix = !(TRAIT_NOHUNGER in inherent_traits) var/should_have_eyes = TRUE var/should_have_ears = TRUE var/should_have_tongue = TRUE @@ -287,7 +289,10 @@ GLOBAL_LIST_EMPTY(roundstart_races) else //Entries in the list should only ever be items or null, so if it's not an item, we can assume it's an empty hand C.put_in_hands(new mutanthands()) - if(VIRUSIMMUNE in species_traits) + for(var/X in inherent_traits) + C.add_trait(X, SPECIES_TRAIT) + + if(TRAIT_VIRUSIMMUNE in inherent_traits) for(var/datum/disease/A in C.viruses) A.cure(FALSE) @@ -304,6 +309,8 @@ GLOBAL_LIST_EMPTY(roundstart_races) C.dna.blood_type = random_blood_type() if(DIGITIGRADE in species_traits) C.Digitigrade_Leg_Swap(TRUE) + for(var/X in inherent_traits) + C.remove_trait(X, SPECIES_TRAIT) /datum/species/proc/handle_hair(mob/living/carbon/human/H, forced_colour) H.remove_overlay(HAIR_LAYER) @@ -855,7 +862,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) //END EDIT /datum/species/proc/spec_life(mob/living/carbon/human/H) - if(NOBREATH in species_traits) + if(H.has_trait(TRAIT_NOBREATH)) H.setOxyLoss(0) H.losebreath = 0 @@ -1111,8 +1118,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) H.update_inv_wear_suit() // nutrition decrease and satiety - if (H.nutrition > 0 && H.stat != DEAD && \ - H.dna && H.dna.species && (!(NOHUNGER in H.dna.species.species_traits))) + if (H.nutrition > 0 && H.stat != DEAD && !H.has_trait(TRAIT_NOHUNGER)) // THEY HUNGER var/hunger_rate = HUNGER_FACTOR if(H.satiety > 0) @@ -1136,7 +1142,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(H.nutrition > NUTRITION_LEVEL_FAT) H.metabolism_efficiency = 1 else if(H.nutrition > NUTRITION_LEVEL_FED && H.satiety > 80) - if(H.metabolism_efficiency != 1.25 && (H.dna && H.dna.species && !(NOHUNGER in H.dna.species.species_traits))) + if(H.metabolism_efficiency != 1.25 && !H.has_trait(TRAIT_NOHUNGER)) to_chat(H, "You feel vigorous.") H.metabolism_efficiency = 1.25 else if(H.nutrition < NUTRITION_LEVEL_STARVING + 50) @@ -1165,7 +1171,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) . = FALSE var/radiation = H.radiation - if(RADIMMUNE in species_traits) + if(H.has_trait(TRAIT_RADIMMUNE)) radiation = 0 return TRUE @@ -1285,7 +1291,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) add_logs(user, target, "shaked") return 1 else - var/we_breathe = (!(NOBREATH in user.dna.species.species_traits)) + var/we_breathe = !user.has_trait(TRAIT_NOBREATH) var/we_lung = user.getorganslot(ORGAN_SLOT_LUNGS) if(we_breathe && we_lung) @@ -1483,7 +1489,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) //dismemberment var/probability = I.get_dismemberment_chance(affecting) - if(prob(probability) || ((EASYDISMEMBER in species_traits) && prob(2*probability))) + if(prob(probability) || (H.has_trait(TRAIT_EASYDISMEMBER) && prob(2*probability))) if(affecting.dismember(I.damtype)) I.add_mob_blood(H) playsound(get_turf(H), I.get_dismember_sound(), 80, 1) @@ -1612,7 +1618,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) ///////////// /datum/species/proc/breathe(mob/living/carbon/human/H) - if(NOBREATH in species_traits) + if(H.has_trait(TRAIT_NOBREATH)) return TRUE /datum/species/proc/handle_environment(datum/gas_mixture/environment, mob/living/carbon/human/H) @@ -1644,7 +1650,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) H.adjust_bodytemperature(natural*(1/(thermal_protection+1)) + min(thermal_protection * (loc_temp - H.bodytemperature) / BODYTEMP_HEAT_DIVISOR, BODYTEMP_HEATING_MAX)) // +/- 50 degrees from 310K is the 'safe' zone, where no damage is dealt. - if(H.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT && !(RESISTHOT in species_traits)) + if(H.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT && !H.has_trait(TRAIT_RESISTHEAT)) //Body temperature is too hot. var/burn_damage switch(H.bodytemperature) @@ -1683,7 +1689,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/adjusted_pressure = H.calculate_affecting_pressure(pressure) //Returns how much pressure actually affects the mob. switch(adjusted_pressure) if(HAZARD_HIGH_PRESSURE to INFINITY) - if(!(RESISTPRESSURE in species_traits)) + if(!H.has_trait(TRAIT_RESISTHIGHPRESSURE)) H.adjustBruteLoss(min(((adjusted_pressure / HAZARD_HIGH_PRESSURE) -1 ) * PRESSURE_DAMAGE_COEFFICIENT, MAX_HIGH_PRESSURE_DAMAGE) * H.physiology.pressure_mod) H.throw_alert("pressure", /obj/screen/alert/highpressure, 2) else @@ -1695,7 +1701,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE) H.throw_alert("pressure", /obj/screen/alert/lowpressure, 1) else - if(H.dna.check_mutation(COLDRES) || (RESISTPRESSURE in species_traits)) + if(H.has_trait(TRAIT_RESISTLOWPRESSURE)) H.clear_alert("pressure") else H.adjustBruteLoss(LOW_PRESSURE_DAMAGE * H.physiology.pressure_mod) @@ -1706,7 +1712,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) ////////// /datum/species/proc/handle_fire(mob/living/carbon/human/H, no_protection = FALSE) - if(NOFIRE in species_traits) + if(H.has_trait(TRAIT_NOFIRE)) return if(H.on_fire) //the fire tries to damage the exposed clothes and items @@ -1773,7 +1779,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) H.adjust_bodytemperature(BODYTEMP_HEATING_MAX + (H.fire_stacks * 12)) /datum/species/proc/CanIgniteMob(mob/living/carbon/human/H) - if(NOFIRE in species_traits) + if(H.has_trait(TRAIT_NOFIRE)) return FALSE return TRUE diff --git a/code/modules/mob/living/carbon/human/species_types/abductors.dm b/code/modules/mob/living/carbon/human/species_types/abductors.dm index 447245cad0..54549b15b9 100644 --- a/code/modules/mob/living/carbon/human/species_types/abductors.dm +++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm @@ -3,7 +3,8 @@ id = "abductor" say_mod = "gibbers" sexes = FALSE - species_traits = list(SPECIES_ORGANIC,NOBLOOD,NOBREATH,VIRUSIMMUNE,NOGUNS,NOHUNGER,NOEYES) + species_traits = list(SPECIES_ORGANIC,NOBLOOD,NOEYES) + inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_NOGUNS,TRAIT_NOHUNGER,TRAIT_NOBREATH) mutanttongue = /obj/item/organ/tongue/abductor var/scientist = FALSE // vars to not pollute spieces list with castes diff --git a/code/modules/mob/living/carbon/human/species_types/android.dm b/code/modules/mob/living/carbon/human/species_types/android.dm index 4badfa8405..0178a99dad 100644 --- a/code/modules/mob/living/carbon/human/species_types/android.dm +++ b/code/modules/mob/living/carbon/human/species_types/android.dm @@ -2,7 +2,8 @@ name = "Android" id = "android" say_mod = "states" - species_traits = list(SPECIES_ROBOTIC,NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOFIRE,NOBLOOD,PIERCEIMMUNE,NOHUNGER,EASYLIMBATTACHMENT) + species_traits = list(SPECIES_ROBOTIC,NOBLOOD) + inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_LIMBATTACHMENT) meat = null damage_overlay_type = "synth" mutanttongue = /obj/item/organ/tongue/robot diff --git a/code/modules/mob/living/carbon/human/species_types/corporate.dm b/code/modules/mob/living/carbon/human/species_types/corporate.dm index bc1fcc9b1e..7c4143ec6a 100644 --- a/code/modules/mob/living/carbon/human/species_types/corporate.dm +++ b/code/modules/mob/living/carbon/human/species_types/corporate.dm @@ -1,19 +1,20 @@ -/datum/species/corporate - name = "Corporate Agent" - id = "agent" - hair_alpha = 0 - say_mod = "declares" - speedmod = -2//Fast - brutemod = 0.7//Tough against firearms - burnmod = 0.65//Tough against lasers - coldmod = 0 - heatmod = 0.5//it's a little tough to burn them to death not as hard though. - punchdamagelow = 20 - punchdamagehigh = 30//they are inhumanly strong - punchstunthreshold = 25 - attack_verb = "smash" - attack_sound = 'sound/weapons/resonator_blast.ogg' - blacklisted = 1 - use_skintones = 0 - species_traits = list(SPECIES_ORGANIC,RADIMMUNE,VIRUSIMMUNE,NOBLOOD,PIERCEIMMUNE,EYECOLOR,NODISMEMBER,NOHUNGER) - sexes = 0 \ No newline at end of file +/datum/species/corporate + name = "Corporate Agent" + id = "agent" + hair_alpha = 0 + say_mod = "declares" + speedmod = -2//Fast + brutemod = 0.7//Tough against firearms + burnmod = 0.65//Tough against lasers + coldmod = 0 + heatmod = 0.5//it's a little tough to burn them to death not as hard though. + punchdamagelow = 20 + punchdamagehigh = 30//they are inhumanly strong + punchstunthreshold = 25 + attack_verb = "smash" + attack_sound = 'sound/weapons/resonator_blast.ogg' + blacklisted = 1 + use_skintones = 0 + species_traits = list(SPECIES_ORGANIC,NOBLOOD,EYECOLOR) + inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER) + sexes = 0 diff --git a/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/code/modules/mob/living/carbon/human/species_types/dullahan.dm index 78cf1a3b7a..3a0e5a8415 100644 --- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm +++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm @@ -2,7 +2,8 @@ name = "dullahan" id = "dullahan" default_color = "FFFFFF" - species_traits = list(SPECIES_ORGANIC,EYECOLOR,HAIR,FACEHAIR,LIPS,NOBREATH,NOHUNGER) + species_traits = list(SPECIES_ORGANIC,EYECOLOR,HAIR,FACEHAIR,LIPS) + inherent_traits = list(TRAIT_NOHUNGER,TRAIT_NOBREATH) mutant_bodyparts = list("tail_human", "ears", "wings") default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "wings" = "None") use_skintones = TRUE diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm index 1630b7a194..fba69e4e8b 100644 --- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm @@ -247,7 +247,8 @@ name = "Slimeperson" id = "slimeperson" default_color = "00FFFF" - species_traits = list(SPECIES_ORGANIC,MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD,TOXINLOVER) + species_traits = list(SPECIES_ORGANIC,MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD) + inherent_traits = list(TRAIT_TOXINLOVER) mutant_bodyparts = list("mam_tail", "mam_ears", "taur") default_features = list("mcolor" = "FFF", "mam_tail" = "None", "mam_ears" = "None") say_mod = "says" diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index 3619e04584..d274261a2b 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -2,7 +2,8 @@ // Animated beings of stone. They have increased defenses, and do not need to breathe. They're also slow as fuuuck. name = "Golem" id = "iron golem" - species_traits = list(SPECIES_INORGANIC,NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOFIRE,NOGUNS,NOBLOOD,RADIMMUNE,PIERCEIMMUNE,NODISMEMBER,MUTCOLORS,NO_UNDERWEAR) + species_traits = list(SPECIES_INORGANIC,NOBLOOD,MUTCOLORS,NO_UNDERWEAR) + inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER) mutant_organs = list(/obj/item/organ/adamantine_resonator) speedmod = 2 armor = 55 @@ -84,7 +85,7 @@ fixed_mut_color = "a3d" meat = /obj/item/stack/ore/plasma //Can burn and takes damage from heat - species_traits = list(SPECIES_INORGANIC,NOBREATH,RESISTCOLD,RESISTPRESSURE,NOGUNS,NOBLOOD,RADIMMUNE,PIERCEIMMUNE,NODISMEMBER,MUTCOLORS,NO_UNDERWEAR) + inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER) info_text = "As a Plasma Golem, you burn easily. Be careful, if you get hot enough while burning, you'll blow up!" heatmod = 0 //fine until they blow up prefix = "Plasma" @@ -258,7 +259,7 @@ fixed_mut_color = "49311c" meat = /obj/item/stack/sheet/mineral/wood //Can burn and take damage from heat - species_traits = list(SPECIES_ORGANIC,NOBREATH,RESISTCOLD,RESISTPRESSURE,NOGUNS,NOBLOOD,RADIMMUNE,PIERCEIMMUNE,NODISMEMBER,MUTCOLORS,NO_UNDERWEAR) + inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER) armor = 30 burnmod = 1.25 heatmod = 1.5 @@ -565,7 +566,7 @@ limbs_id = "cultgolem" sexes = FALSE info_text = "As a Runic Golem, you possess eldritch powers granted by the Elder God Nar'Sie." - species_traits = list(SPECIES_INORGANIC,NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOFIRE,NOGUNS,NOBLOOD,RADIMMUNE,PIERCEIMMUNE,NODISMEMBER,NO_UNDERWEAR,NOEYES) //no mutcolors + species_traits = list(SPECIES_INORGANIC,NOBLOOD,NO_UNDERWEAR,NOEYES) //no mutcolors prefix = "Runic" var/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/golem/phase_shift @@ -619,7 +620,7 @@ limbs_id = "clockgolem" info_text = "As a clockwork golem, you are faster than \ other types of golem (being a machine), and are immune to electric shocks." - species_traits = list(SPECIES_INORGANIC,NO_UNDERWEAR, NOTRANSSTING, NOBREATH, NOZOMBIE, RADIMMUNE, NOBLOOD, RESISTCOLD, RESISTPRESSURE, PIERCEIMMUNE, NOEYES) + species_traits = list(SPECIES_ROBOTIC,NOBLOOD,NO_UNDERWEAR,NOEYES) armor = 20 //Reinforced, but much less so to allow for fast movement attack_verb = "smash" attack_sound = 'sound/magic/clockwork/anima_fragment_attack.ogg' @@ -671,7 +672,8 @@ limbs_id = "clothgolem" sexes = FALSE info_text = "As a Cloth Golem, you are able to reform yourself after death, provided your remains aren't burned or destroyed. You are, of course, very flammable." - species_traits = list(SPECIES_UNDEAD,NOBREATH,RESISTCOLD,RESISTPRESSURE,NOGUNS,NOBLOOD,RADIMMUNE,PIERCEIMMUNE,NODISMEMBER,NO_UNDERWEAR) //no mutcolors, and can burn + species_traits = list(SPECIES_UNDEAD,NOBLOOD,NO_UNDERWEAR) //no mutcolors, and can burn + inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOGUNS) armor = 15 //feels no pain, but not too resistant burnmod = 2 // don't get burned speedmod = 1 // not as heavy as stone diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index f32588d6b3..2297fffa97 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -4,7 +4,8 @@ id = "jelly" default_color = "00FF90" say_mod = "chirps" - species_traits = list(SPECIES_ORGANIC,MUTCOLORS,EYECOLOR,NOBLOOD,VIRUSIMMUNE,HAIR,FACEHAIR,TOXINLOVER) //CIT CHANGE - adds HAIR and FACEHAIR to species traits + species_traits = list(SPECIES_ORGANIC,MUTCOLORS,EYECOLOR,,HAIR,FACEHAIR,NOBLOOD) + inherent_traits = list(TRAIT_TOXINLOVER) mutant_bodyparts = list("mam_tail", "mam_ears", "taur") //CIT CHANGE default_features = list("mcolor" = "FFF", "mam_tail" = "None", "mam_ears" = "None") //CIT CHANGE meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/slime @@ -118,6 +119,7 @@ name = "Slimeperson" id = "slime" default_color = "00FFFF" + species_traits = list(SPECIES_ORGANIC,MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD) say_mod = "says" hair_color = "mutcolor" hair_alpha = 150 diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index 0d006196aa..15c8f70dc8 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -54,4 +54,5 @@ name = "Ash Walker" id = "ashlizard" limbs_id = "lizard" - species_traits = list(MUTCOLORS,EYECOLOR,LIPS,NOBREATH,NOGUNS,DIGITIGRADE) + species_traits = list(MUTCOLORS,EYECOLOR,LIPS,DIGITIGRADE) + inherent_traits = list(TRAIT_NOGUNS,TRAIT_NOBREATH) diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm index a5c6720db5..5209fe8310 100644 --- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm +++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm @@ -4,7 +4,8 @@ say_mod = "rattles" sexes = 0 meat = /obj/item/stack/sheet/mineral/plasma - species_traits = list(SPECIES_INORGANIC,NOBLOOD,RESISTCOLD,RADIMMUNE,NOTRANSSTING,NOHUNGER) + species_traits = list(SPECIES_INORGANIC,NOBLOOD,NOTRANSSTING) + inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_NOHUNGER) mutantlungs = /obj/item/organ/lungs/plasmaman mutanttongue = /obj/item/organ/tongue/bone/plasmaman mutantliver = /obj/item/organ/liver/plasmaman diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index 9357855191..17e7649cb6 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -9,7 +9,8 @@ blacklisted = 1 ignored_by = list(/mob/living/simple_animal/hostile/faithless) meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/shadow - species_traits = list(SPECIES_ORGANIC,NOBREATH,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,NOEYES) + species_traits = list(SPECIES_ORGANIC,NOBLOOD,NOEYES) + inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_NOBREATH) dangerous_existence = 1 mutanteyes = /obj/item/organ/eyes/night_vision @@ -37,7 +38,8 @@ burnmod = 1.5 blacklisted = TRUE no_equip = list(slot_wear_mask, slot_wear_suit, slot_gloves, slot_shoes, slot_w_uniform, slot_s_store) - species_traits = list(NOBREATH,RESISTCOLD,RESISTPRESSURE,NOGUNS,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NODISMEMBER,NO_UNDERWEAR,NOHUNGER,NO_DNA_COPY,NOTRANSSTING,NOEYES) + species_traits = list(NOBLOOD,NO_UNDERWEAR,NO_DNA_COPY,NOTRANSSTING,NOEYES) + inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER) mutanteyes = /obj/item/organ/eyes/night_vision/nightmare mutant_organs = list(/obj/item/organ/heart/nightmare) mutant_brain = /obj/item/organ/brain/nightmare diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm index d47f3d71d5..c6a7e7a127 100644 --- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm +++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm @@ -6,7 +6,8 @@ blacklisted = 1 sexes = 0 meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton - species_traits = list(SPECIES_UNDEAD,NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOBLOOD,RADIMMUNE,PIERCEIMMUNE,NOHUNGER,EASYDISMEMBER,EASYLIMBATTACHMENT) + species_traits = list(SPECIES_UNDEAD,NOBLOOD) + inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT) mutanttongue = /obj/item/organ/tongue/bone damage_overlay_type = ""//let's not show bloody wounds or burns over bones. disliked_food = NONE diff --git a/code/modules/mob/living/carbon/human/species_types/synths.dm b/code/modules/mob/living/carbon/human/species_types/synths.dm index 856a472a73..786872544e 100644 --- a/code/modules/mob/living/carbon/human/species_types/synths.dm +++ b/code/modules/mob/living/carbon/human/species_types/synths.dm @@ -3,13 +3,15 @@ id = "synth" say_mod = "beep boops" //inherited from a user's real species sexes = 0 - species_traits = list(SPECIES_ROBOTIC,NOTRANSSTING,NOBREATH,VIRUSIMMUNE,NODISMEMBER,NOHUNGER) //all of these + whatever we inherit from the real species + species_traits = list(SPECIES_ROBOTIC,NOTRANSSTING) //all of these + whatever we inherit from the real species + inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER,TRAIT_NOBREATH) dangerous_existence = 1 blacklisted = 1 meat = null damage_overlay_type = "synth" limbs_id = "synth" - var/list/initial_species_traits = list(SPECIES_ROBOTIC,NOTRANSSTING,NOBREATH,VIRUSIMMUNE,NODISMEMBER,NOHUNGER,NO_DNA_COPY) //for getting these values back for assume_disguise() + var/list/initial_species_traits = list(SPECIES_ROBOTIC,NOTRANSSTING) //for getting these values back for assume_disguise() + var/list/initial_inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER,TRAIT_NOBREATH) var/disguise_fail_health = 75 //When their health gets to this level their synthflesh partially falls off var/datum/species/fake_species = null //a species to do most of our work for us, unless we're damaged @@ -41,7 +43,9 @@ say_mod = S.say_mod sexes = S.sexes species_traits = initial_species_traits.Copy() + inherent_traits = initial_inherent_traits.Copy() species_traits |= S.species_traits + inherent_traits |= S.inherent_traits species_traits -= list(SPECIES_ORGANIC, SPECIES_INORGANIC, SPECIES_UNDEAD) attack_verb = S.attack_verb attack_sound = S.attack_sound @@ -61,6 +65,7 @@ name = initial(name) say_mod = initial(say_mod) species_traits = initial_species_traits.Copy() + inherent_traits = initial_inherent_traits.Copy() attack_verb = initial(attack_verb) attack_sound = initial(attack_sound) miss_sound = initial(miss_sound) diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm index 5186811331..2267be85f2 100644 --- a/code/modules/mob/living/carbon/human/species_types/vampire.dm +++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm @@ -2,7 +2,8 @@ name = "vampire" id = "vampire" default_color = "FFFFFF" - species_traits = list(SPECIES_UNDEAD,EYECOLOR,HAIR,FACEHAIR,LIPS,NOHUNGER,NOBREATH,DRINKSBLOOD) + species_traits = list(SPECIES_UNDEAD,EYECOLOR,HAIR,FACEHAIR,LIPS,DRINKSBLOOD) + inherent_traits = list(TRAIT_NOHUNGER,TRAIT_NOBREATH) mutant_bodyparts = list("tail_human", "ears", "wings") default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "wings" = "None") exotic_bloodtype = "U" diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm index 14502aa931..7fcc470661 100644 --- a/code/modules/mob/living/carbon/human/species_types/zombies.dm +++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm @@ -8,7 +8,8 @@ sexes = 0 blacklisted = 1 meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/zombie - species_traits = list(SPECIES_UNDEAD,NOBREATH,RESISTCOLD,RESISTPRESSURE,NOBLOOD,RADIMMUNE,NOZOMBIE,EASYDISMEMBER,EASYLIMBATTACHMENT,NOTRANSSTING) + species_traits = list(SPECIES_UNDEAD,NOBLOOD,NOZOMBIE,NOTRANSSTING) + inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_NOBREATH) mutanttongue = /obj/item/organ/tongue/zombie var/static/list/spooks = list('sound/hallucinations/growl1.ogg','sound/hallucinations/growl2.ogg','sound/hallucinations/growl3.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/wail.ogg') disliked_food = NONE diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 8cbbc2b90f..5e5c77ee33 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -102,7 +102,9 @@ air_update_turf() /mob/living/carbon/proc/has_smoke_protection() - return 0 + if(has_trait(TRAIT_NOBREATH)) + return TRUE + return FALSE //Third link in a breath chain, calls handle_breath_temperature() diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 1c12b48919..71aea41e51 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -340,12 +340,9 @@ /mob/living/simple_animal/hostile/construct/harvester/AttackingTarget() if(iscarbon(target)) - if(ishuman(target)) - var/mob/living/carbon/human/H = target - if(H.dna && H.dna.species) - if(NODISMEMBER in H.dna.species.species_traits) - return ..() //ATTACK! var/mob/living/carbon/C = target + if(C.has_trait(TRAIT_NODISMEMBER)) + return ..() //ATTACK! var/list/parts = list() var/undismembermerable_limbs = 0 for(var/X in C.bodyparts) diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 531c3b4257..2eed6c33d5 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -100,16 +100,14 @@ /datum/reagent/toxin/lexorin/on_mob_life(mob/living/M) . = TRUE - var/mob/living/carbon/C - if(iscarbon(M)) - C = M - CHECK_DNA_AND_SPECIES(C) - if(NOBREATH in C.dna.species.species_traits) - . = FALSE + + if(M.has_trait(TRAIT_NOBREATH)) + . = FALSE if(.) M.adjustOxyLoss(5, 0) - if(C) + if(iscarbon(M)) + var/mob/living/carbon/C = M C.losebreath += 2 if(prob(20)) M.emote("gasp") diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm index ae78123a26..a43e435977 100644 --- a/code/modules/station_goals/dna_vault.dm +++ b/code/modules/station_goals/dna_vault.dm @@ -256,24 +256,25 @@ var/obj/item/organ/lungs/L = H.internal_organs_slot[ORGAN_SLOT_LUNGS] L.tox_breath_dam_min = 0 L.tox_breath_dam_max = 0 - S.species_traits |= VIRUSIMMUNE + H.add_trait(TRAIT_VIRUSIMMUNE, "dna_vault") if(VAULT_NOBREATH) to_chat(H, "Your lungs feel great.") - S.species_traits |= NOBREATH + H.add_trait(TRAIT_NOBREATH, "dna_vault") if(VAULT_FIREPROOF) to_chat(H, "You feel fireproof.") S.burnmod = 0.5 - S.heatmod = 0 + H.add_trait(TRAIT_RESISTHEAT, "dna_vault") + H.add_trait(TRAIT_NOFIRE, "dna_vault") if(VAULT_STUNTIME) to_chat(H, "Nothing can keep you down for long.") S.stunmod = 0.5 if(VAULT_ARMOUR) to_chat(H, "You feel tough.") S.armor = 30 - + H.add_trait(TRAIT_PIERCEIMMUNE, "dna_vault") if(VAULT_SPEED) to_chat(H, "Your legs feel faster.") - S.speedmod = -1 + H.add_trait(TRAIT_GOTTAGOFAST, "dna_vault") if(VAULT_QUICK) to_chat(H, "Your arms move as fast as lightning.") H.next_move_modifier = 0.5 diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index c178d7f72f..133c22510e 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -62,7 +62,7 @@ /obj/item/bodypart/attack(mob/living/carbon/C, mob/user) if(ishuman(C)) var/mob/living/carbon/human/H = C - if(EASYLIMBATTACHMENT in H.dna.species.species_traits) + if(C.has_trait(TRAIT_LIMBATTACHMENT)) if(!H.get_bodypart(body_zone) && !animal_origin) if(H == user) H.visible_message("[H] jams [src] into [H.p_their()] empty socket!",\ diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index 10f2d182fe..7af437ae86 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -6,16 +6,14 @@ //Dismember a limb /obj/item/bodypart/proc/dismember(dam_type = BRUTE) if(!owner) - return 0 + return FALSE var/mob/living/carbon/C = owner if(!dismemberable) - return 0 + return FALSE if(C.status_flags & GODMODE) - return 0 - if(ishuman(C)) - var/mob/living/carbon/human/H = C - if(NODISMEMBER in H.dna.species.species_traits) // species don't allow dismemberment - return 0 + return FALSE + if(C.has_trait(TRAIT_NODISMEMBER)) + return FALSE var/obj/item/bodypart/affecting = C.get_bodypart("chest") affecting.receive_damage(CLAMP(brute_dam/2, 15, 50), CLAMP(burn_dam/2, 0, 50)) //Damage the chest based on limb's existing damage @@ -46,14 +44,12 @@ /obj/item/bodypart/chest/dismember() if(!owner) - return 0 + return FALSE var/mob/living/carbon/C = owner if(!dismemberable) - return 0 - if(ishuman(C)) - var/mob/living/carbon/human/H = C - if(NODISMEMBER in H.dna.species.species_traits) // species don't allow dismemberment - return 0 + return FALSE + if(C.has_trait(TRAIT_NODISMEMBER)) + return FALSE var/organ_spilled = 0 var/turf/T = get_turf(C) diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index f492d99b8e..1aff20b81a 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -313,11 +313,7 @@ /obj/item/organ/lungs/proc/handle_breath_temperature(datum/gas_mixture/breath, mob/living/carbon/human/H) // called by human/life, handles temperatures var/breath_temperature = breath.temperature - var/species_traits = list() - if(H && H.dna && H.dna.species && H.dna.species.species_traits) - species_traits = H.dna.species.species_traits - - if(!(GLOB.mutations_list[COLDRES] in H.dna.mutations) && !(RESISTCOLD in species_traits)) // COLD DAMAGE + if(!H.has_trait(TRAIT_RESISTCOLD)) // COLD DAMAGE var/cold_modifier = H.dna.species.coldmod if(breath_temperature < cold_level_3_threshold) H.apply_damage_type(cold_level_3_damage*cold_modifier, cold_damage_type) @@ -329,7 +325,7 @@ if(prob(20)) to_chat(H, "You feel [cold_message] in your [name]!") - if(!(RESISTHOT in species_traits)) // HEAT DAMAGE + if(!H.has_trait(TRAIT_RESISTHEAT)) // HEAT DAMAGE var/heat_modifier = H.dna.species.heatmod if(breath_temperature > heat_level_1_threshold && breath_temperature < heat_level_2_threshold) H.apply_damage_type(heat_level_1_damage*heat_modifier, heat_damage_type) diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index fcaf89c61c..fe613af015 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -110,7 +110,7 @@ var/breathes = TRUE var/blooded = TRUE if(dna && dna.species) - if(NOBREATH in dna.species.species_traits) + if(has_trait(TRAIT_NOBREATH, SPECIES_TRAIT)) breathes = FALSE if(NOBLOOD in dna.species.species_traits) blooded = FALSE From 53743936352c07e5b7ed6ac820e183f505daec92 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 5 Mar 2018 12:34:28 -0600 Subject: [PATCH 07/45] [MIRROR] Removes the devils var (#5819) * Merge pull request #36175 from tgstation/Cyberboss-patch-1 Removes the devils var * Removes the devils var --- code/modules/spells/spell_types/conjure.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/spells/spell_types/conjure.dm b/code/modules/spells/spell_types/conjure.dm index 306c3fcef6..18bfb54935 100644 --- a/code/modules/spells/spell_types/conjure.dm +++ b/code/modules/spells/spell_types/conjure.dm @@ -36,8 +36,8 @@ var/atom/summoned_object = new summoned_object_type(spawn_place) for(var/varName in newVars) - if(varName in summoned_object.vars) - summoned_object.vars[varName] = newVars[varName] + if(varName in newVars) + summoned_object.vv_edit_var(varName, newVars[varName]) summoned_object.admin_spawned = TRUE if(summon_lifespan) QDEL_IN(summoned_object, summon_lifespan) From de97c9653ae9b647c61c6cdcd5bb8aac193f57e5 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 5 Mar 2018 12:37:40 -0600 Subject: [PATCH 08/45] [MIRROR] SOMETHING'S WRONG, I HOLD MY HEAD, BILLY HERRINGTON IS FUCKING DEAD (#5792) * SOMETHING'S WRONG, I HOLD MY HEAD, BILLY HERRINGTON IS FUCKING DEAD * Update fitness.dm * fixes compile issue --- .../crates_lockers/closets/fitness.dm | 131 +++++++++--------- 1 file changed, 65 insertions(+), 66 deletions(-) diff --git a/code/game/objects/structures/crates_lockers/closets/fitness.dm b/code/game/objects/structures/crates_lockers/closets/fitness.dm index 1c5250dcf2..e4dd78a8d6 100644 --- a/code/game/objects/structures/crates_lockers/closets/fitness.dm +++ b/code/game/objects/structures/crates_lockers/closets/fitness.dm @@ -1,66 +1,65 @@ -/obj/structure/closet/athletic_mixed - name = "athletic wardrobe" - desc = "It's a storage unit for athletic wear." - icon_door = "mixed" - -/obj/structure/closet/athletic_mixed/PopulateContents() - ..() - new /obj/item/clothing/under/shorts/purple(src) - new /obj/item/clothing/under/shorts/grey(src) - new /obj/item/clothing/under/shorts/black(src) - new /obj/item/clothing/under/shorts/red(src) - new /obj/item/clothing/under/shorts/blue(src) - new /obj/item/clothing/under/shorts/green(src) - if(prob(3)) - new /obj/item/clothing/under/jabroni(src) - - -/obj/structure/closet/boxinggloves - name = "boxing gloves" - desc = "It's a storage unit for gloves for use in the boxing ring." - -/obj/structure/closet/boxinggloves/PopulateContents() - ..() - new /obj/item/clothing/gloves/boxing/blue(src) - new /obj/item/clothing/gloves/boxing/green(src) - new /obj/item/clothing/gloves/boxing/yellow(src) - new /obj/item/clothing/gloves/boxing(src) - - -/obj/structure/closet/masks - name = "mask closet" - desc = "IT'S A STORAGE UNIT FOR FIGHTER MASKS OLE!" - -/obj/structure/closet/masks/PopulateContents() - ..() - new /obj/item/clothing/mask/luchador(src) - new /obj/item/clothing/mask/luchador/rudos(src) - new /obj/item/clothing/mask/luchador/tecnicos(src) - - -/obj/structure/closet/lasertag/red - name = "red laser tag equipment" - desc = "It's a storage unit for laser tag equipment." - icon_door = "red" - -/obj/structure/closet/lasertag/red/PopulateContents() - ..() - for(var/i in 1 to 3) - new /obj/item/gun/energy/laser/redtag(src) - for(var/i in 1 to 3) - new /obj/item/clothing/suit/redtag(src) - new /obj/item/clothing/head/helmet/redtaghelm(src) - - -/obj/structure/closet/lasertag/blue - name = "blue laser tag equipment" - desc = "It's a storage unit for laser tag equipment." - icon_door = "blue" - -/obj/structure/closet/lasertag/blue/PopulateContents() - ..() - for(var/i in 1 to 3) - new /obj/item/gun/energy/laser/bluetag(src) - for(var/i in 1 to 3) - new /obj/item/clothing/suit/bluetag(src) - new /obj/item/clothing/head/helmet/bluetaghelm(src) +/obj/structure/closet/athletic_mixed + name = "athletic wardrobe" + desc = "It's a storage unit for athletic wear." + icon_door = "mixed" + +/obj/structure/closet/athletic_mixed/PopulateContents() + ..() + new /obj/item/clothing/under/shorts/purple(src) + new /obj/item/clothing/under/shorts/grey(src) + new /obj/item/clothing/under/shorts/black(src) + new /obj/item/clothing/under/shorts/red(src) + new /obj/item/clothing/under/shorts/blue(src) + new /obj/item/clothing/under/shorts/green(src) + new /obj/item/clothing/under/jabroni(src) + + +/obj/structure/closet/boxinggloves + name = "boxing gloves" + desc = "It's a storage unit for gloves for use in the boxing ring." + +/obj/structure/closet/boxinggloves/PopulateContents() + ..() + new /obj/item/clothing/gloves/boxing/blue(src) + new /obj/item/clothing/gloves/boxing/green(src) + new /obj/item/clothing/gloves/boxing/yellow(src) + new /obj/item/clothing/gloves/boxing(src) + + +/obj/structure/closet/masks + name = "mask closet" + desc = "IT'S A STORAGE UNIT FOR FIGHTER MASKS OLE!" + +/obj/structure/closet/masks/PopulateContents() + ..() + new /obj/item/clothing/mask/luchador(src) + new /obj/item/clothing/mask/luchador/rudos(src) + new /obj/item/clothing/mask/luchador/tecnicos(src) + + +/obj/structure/closet/lasertag/red + name = "red laser tag equipment" + desc = "It's a storage unit for laser tag equipment." + icon_door = "red" + +/obj/structure/closet/lasertag/red/PopulateContents() + ..() + for(var/i in 1 to 3) + new /obj/item/gun/energy/laser/redtag(src) + for(var/i in 1 to 3) + new /obj/item/clothing/suit/redtag(src) + new /obj/item/clothing/head/helmet/redtaghelm(src) + + +/obj/structure/closet/lasertag/blue + name = "blue laser tag equipment" + desc = "It's a storage unit for laser tag equipment." + icon_door = "blue" + +/obj/structure/closet/lasertag/blue/PopulateContents() + ..() + for(var/i in 1 to 3) + new /obj/item/gun/energy/laser/bluetag(src) + for(var/i in 1 to 3) + new /obj/item/clothing/suit/bluetag(src) + new /obj/item/clothing/head/helmet/bluetaghelm(src) \ No newline at end of file From 6deeaab1f9ff348ea6041bc68f40aebcead7fd7b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 5 Mar 2018 12:37:43 -0600 Subject: [PATCH 09/45] Automatic changelog generation for PR #5792 [ci skip] --- html/changelogs/AutoChangeLog-pr-5792.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5792.yml diff --git a/html/changelogs/AutoChangeLog-pr-5792.yml b/html/changelogs/AutoChangeLog-pr-5792.yml new file mode 100644 index 0000000000..50e242c965 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5792.yml @@ -0,0 +1,4 @@ +author: "Iamgoofball" +delete-after: True +changes: + - bugfix: "RIP Billy, you'll be the boss of heaven's gym now 😢" From fe37e351bc38f62ad2c19dcfce9cb4ede3b234e9 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 5 Mar 2018 13:00:50 -0600 Subject: [PATCH 10/45] [MIRROR] Updates RuntimeStation to make testing faster (#5807) * Merge pull request #36120 from XDTM/RuntimeFuntime Updates RuntimeStation to make testing faster * Updates RuntimeStation to make testing faster --- _maps/map_files/debug/runtimestation.dmm | 564 +++++++++++++++-------- 1 file changed, 372 insertions(+), 192 deletions(-) diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm index 284898d6d9..3c5da1dcf9 100644 --- a/_maps/map_files/debug/runtimestation.dmm +++ b/_maps/map_files/debug/runtimestation.dmm @@ -8,7 +8,7 @@ /area/space/nearstation) "ac" = ( /turf/open/space, -/area/space) +/area/space/nearstation) "ad" = ( /turf/closed/wall/r_wall, /area/maintenance/department/bridge) @@ -85,6 +85,9 @@ icon_state = "2-8" }, /obj/machinery/camera/autoname, +/obj/machinery/light{ + dir = 1 + }, /turf/open/floor/plating, /area/engine/engineering) "ar" = ( @@ -176,13 +179,13 @@ /turf/open/space, /area/space/nearstation) "aC" = ( -/obj/machinery/door/airlock, /obj/structure/cable{ icon_state = "4-8" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, +/obj/machinery/door/airlock/external/glass, /turf/open/floor/plating, /area/engine/engineering) "aD" = ( @@ -294,7 +297,8 @@ /obj/item/device/flashlight{ pixel_y = 5 }, -/obj/item/airlock_painter, +/obj/item/storage/toolbox/syndicate, +/obj/item/stock_parts/cell/infinite, /turf/open/floor/plating, /area/engine/engineering) "aT" = ( @@ -387,6 +391,7 @@ "bd" = ( /obj/structure/table, /obj/item/weldingtool/experimental, +/obj/item/inducer, /turf/open/floor/plating, /area/engine/engineering) "be" = ( @@ -396,7 +401,7 @@ /turf/open/floor/plating, /area/engine/engineering) "bf" = ( -/obj/structure/closet/secure_closet/engineering_chief, +/obj/machinery/suit_storage_unit/captain, /turf/open/floor/plating, /area/engine/engineering) "bg" = ( @@ -466,14 +471,14 @@ /area/engine/engineering) "bp" = ( /obj/machinery/light, -/obj/item/storage/box/lights/mixed, -/obj/item/device/lightreplacer, +/obj/structure/tank_dispenser, /turf/open/floor/plating, /area/engine/engineering) "bq" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 }, +/obj/machinery/light, /turf/open/floor/plasteel, /area/engine/gravity_generator) "br" = ( @@ -514,7 +519,7 @@ /area/engine/engineering) "by" = ( /turf/closed/wall/r_wall, -/area/hallway/secondary/entry) +/area/medical/medbay) "bz" = ( /obj/machinery/light{ dir = 8 @@ -523,7 +528,7 @@ /area/maintenance/department/bridge) "bA" = ( /turf/closed/wall/r_wall, -/area/hallway/primary/central) +/area/science) "bB" = ( /obj/machinery/power/apc{ dir = 8; @@ -538,28 +543,32 @@ locked = 0; pixel_y = 23 }, -/obj/structure/closet/jcloset, +/obj/machinery/autolathe/hacked, /turf/open/floor/plasteel, -/area/hallway/primary/central) +/area/science) "bC" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/primary/central) +/area/science) "bD" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, +/obj/machinery/robotic_fabricator, +/obj/machinery/light{ + dir = 1 + }, /turf/open/floor/plasteel, -/area/hallway/primary/central) +/area/science) "bE" = ( /turf/open/floor/plasteel, /area/hallway/primary/central) "bF" = ( -/obj/structure/closet/secure_closet/CMO, +/obj/machinery/computer/rdconsole/core, /turf/open/floor/plasteel, -/area/hallway/primary/central) +/area/science) "bG" = ( /obj/machinery/airalarm{ frequency = 1439; @@ -578,12 +587,6 @@ dir = 8 }, /area/bridge) -"bH" = ( -/obj/structure/table, -/obj/item/ammo_box/c10mm, -/obj/item/gun/ballistic, -/turf/open/floor/plasteel, -/area/bridge) "bI" = ( /obj/structure/table, /turf/open/floor/plasteel, @@ -624,26 +627,36 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bP" = ( -/obj/machinery/vending/cigarette, +/obj/item/storage/box/beakers, +/obj/item/storage/box/syringes, +/obj/structure/table, +/obj/item/reagent_containers/glass/beaker/bluespace, +/obj/item/reagent_containers/glass/beaker/bluespace, +/obj/item/reagent_containers/syringe, +/obj/machinery/airalarm{ + frequency = 1439; + locked = 0; + pixel_y = 23 + }, /turf/open/floor/plasteel/dark, -/area/hallway/primary/central) +/area/medical/chemistry) "bQ" = ( -/obj/machinery/vending/coffee, +/obj/machinery/chem_master, /turf/open/floor/plasteel/dark, -/area/hallway/primary/central) +/area/medical/chemistry) "bR" = ( -/obj/machinery/vending/cola, /obj/machinery/camera/autoname, +/obj/machinery/chem_heater, /turf/open/floor/plasteel/dark, -/area/hallway/primary/central) +/area/medical/chemistry) "bS" = ( -/obj/machinery/vending/snack, +/obj/machinery/chem_dispenser, /turf/open/floor/plasteel/dark, -/area/hallway/primary/central) +/area/medical/chemistry) "bT" = ( -/obj/machinery/computer/arcade, +/obj/machinery/chem_dispenser/scp_294, /turf/open/floor/plasteel/dark, -/area/hallway/primary/central) +/area/medical/chemistry) "bU" = ( /obj/machinery/airalarm{ frequency = 1439; @@ -657,33 +670,33 @@ /obj/structure/cable{ icon_state = "0-2" }, -/obj/structure/closet/firecloset/full, +/mob/living/carbon/human, /turf/open/floor/plasteel/arrival{ dir = 9 }, -/area/hallway/secondary/entry) +/area/medical/medbay) "bV" = ( /obj/machinery/light{ dir = 1 }, -/obj/structure/closet/emcloset, +/mob/living/carbon/human, /turf/open/floor/plasteel/arrival{ dir = 1 }, -/area/hallway/secondary/entry) +/area/medical/medbay) "bW" = ( -/obj/structure/closet/secure_closet/hos, /obj/machinery/camera/autoname, +/mob/living/carbon/human, /turf/open/floor/plasteel/arrival{ dir = 1 }, -/area/hallway/secondary/entry) +/area/medical/medbay) "bX" = ( -/obj/structure/closet/emcloset, +/obj/machinery/sleeper, /turf/open/floor/plasteel/arrival{ dir = 1 }, -/area/hallway/secondary/entry) +/area/medical/medbay) "bY" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -700,25 +713,25 @@ icon_state = "2-4" }, /turf/open/floor/plasteel, -/area/hallway/primary/central) +/area/science) "cb" = ( /obj/structure/cable{ icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, -/area/hallway/primary/central) +/area/science) "cc" = ( /obj/structure/cable{ icon_state = "4-8" }, /turf/open/floor/plasteel, -/area/hallway/primary/central) +/area/science) "cd" = ( -/obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ icon_state = "4-8" }, +/obj/machinery/door/airlock, /turf/open/floor/plating, /area/bridge) "ce" = ( @@ -747,13 +760,13 @@ }, /area/bridge) "ch" = ( -/obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ icon_state = "4-8" }, /obj/structure/cable{ icon_state = "2-4" }, +/obj/machinery/door/airlock, /turf/open/floor/plating, /area/bridge) "ci" = ( @@ -761,8 +774,11 @@ /obj/structure/cable{ icon_state = "4-8" }, +/obj/structure/cable{ + icon_state = "1-8" + }, /turf/open/floor/plasteel, -/area/hallway/primary/central) +/area/medical/chemistry) "cj" = ( /obj/structure/cable{ icon_state = "4-8" @@ -771,13 +787,14 @@ icon_state = "1-8" }, /turf/open/floor/plasteel, -/area/hallway/primary/central) +/area/medical/chemistry) "ck" = ( /obj/structure/cable{ icon_state = "4-8" }, -/turf/closed/wall/r_wall, -/area/hallway/secondary/entry) +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/medical/medbay) "cl" = ( /obj/structure/cable{ icon_state = "1-8" @@ -785,23 +802,25 @@ /turf/open/floor/plasteel/arrival{ dir = 8 }, -/area/hallway/secondary/entry) +/area/medical/medbay) "cm" = ( /turf/open/floor/plasteel, -/area/hallway/secondary/entry) +/area/medical/medbay) "cn" = ( /obj/machinery/door/airlock, /turf/open/floor/plating, -/area/hallway/secondary/entry) +/area/medical/medbay) "co" = ( /obj/machinery/light{ dir = 4 }, +/obj/structure/closet/syndicate/resources/everything, /turf/open/floor/plasteel, -/area/hallway/primary/central) +/area/science) "cp" = ( /obj/machinery/light, /obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/structure/closet/secure_closet/engineering_chief, /turf/open/floor/plasteel/blue/side{ dir = 10 }, @@ -811,6 +830,7 @@ /area/bridge) "cr" = ( /obj/machinery/light, +/obj/structure/closet/secure_closet/hos, /turf/open/floor/plasteel/blue/side{ dir = 6 }, @@ -827,12 +847,12 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/primary/central) +/area/medical/chemistry) "cu" = ( /turf/open/floor/plasteel/arrival{ dir = 8 }, -/area/hallway/secondary/entry) +/area/medical/medbay) "cv" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall/r_wall, @@ -844,16 +864,16 @@ "cx" = ( /obj/machinery/door/airlock/public/glass, /turf/open/floor/plasteel, -/area/hallway/secondary/entry) +/area/medical/medbay) "cy" = ( /obj/effect/turf_decal/loading_area{ dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/secondary/entry) +/area/medical/medbay) "cz" = ( /turf/open/floor/plating, -/area/hallway/secondary/entry) +/area/medical/medbay) "cA" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -893,23 +913,19 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/blue/corner{ - dir = 1 - }, -/area/hallway/primary/central) +/turf/closed/wall/r_wall, +/area/medical/chemistry) "cF" = ( /obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plasteel, -/area/hallway/primary/central) +/area/medical/chemistry) "cG" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /turf/closed/wall/r_wall, -/area/hallway/secondary/entry) +/area/medical/medbay) "cH" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 @@ -917,43 +933,26 @@ /turf/open/floor/plasteel/arrival{ dir = 8 }, -/area/hallway/secondary/entry) -"cI" = ( -/obj/structure/table, -/obj/item/storage/fancy/donut_box, -/turf/open/floor/plasteel/arrival{ - dir = 8 - }, -/area/hallway/secondary/entry) +/area/medical/medbay) "cJ" = ( -/obj/structure/table, -/obj/item/storage/fancy/donut_box, +/obj/item/gun/magic/staff/healing, +/obj/item/gun/magic/wand/resurrection, /turf/open/floor/plasteel/arrival{ dir = 10 }, -/area/hallway/secondary/entry) +/area/medical/medbay) "cK" = ( -/obj/structure/table, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/rods/fifty, -/obj/machinery/light, +/obj/machinery/dna_scannernew, /turf/open/floor/plasteel/arrival, -/area/hallway/secondary/entry) +/area/medical/medbay) "cL" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, +/obj/machinery/computer/cloning, /turf/open/floor/plasteel/arrival, -/area/hallway/secondary/entry) +/area/medical/medbay) "cM" = ( -/obj/structure/table, -/obj/item/storage/firstaid/regular, -/obj/item/storage/firstaid/regular, -/obj/item/device/healthanalyzer, +/obj/machinery/clonepod, /turf/open/floor/plasteel/arrival, -/area/hallway/secondary/entry) +/area/medical/medbay) "cN" = ( /turf/closed/wall/r_wall, /area/construction) @@ -1267,29 +1266,14 @@ "dO" = ( /obj/structure/table, /obj/machinery/light, -/obj/item/twohanded/fireaxe, -/obj/item/extinguisher, -/turf/open/floor/plasteel, -/area/storage/primary) -"dP" = ( -/obj/structure/table, -/obj/item/device/lightreplacer, +/obj/item/storage/firstaid, /turf/open/floor/plasteel, /area/storage/primary) "dQ" = ( /obj/structure/table, -/obj/item/storage/box/lights/mixed, -/obj/item/storage/box/lights/tubes, /obj/machinery/light, /turf/open/floor/plasteel, /area/storage/primary) -"dR" = ( -/obj/structure/table, -/obj/item/device/flashlight{ - pixel_y = 5 - }, -/turf/open/floor/plasteel, -/area/storage/primary) "dS" = ( /obj/machinery/atmospherics/components/unary/tank/air, /obj/machinery/camera/autoname, @@ -1342,32 +1326,228 @@ /obj/machinery/camera/autoname{ dir = 1 }, +/obj/item/gun/magic/wand/resurrection, /turf/open/floor/plasteel, /area/storage/primary) -"pI" = ( +"ei" = ( +/obj/machinery/light, +/obj/machinery/computer/operating, +/turf/open/floor/plasteel, +/area/maintenance/department/bridge) +"fT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/science) +"gd" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science) +"gY" = ( +/turf/open/floor/plasteel, +/area/science) +"hD" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/power/apc{ + dir = 1; + pixel_y = 25 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel, +/area/medical/chemistry) +"jb" = ( /obj/machinery/door/airlock, +/turf/open/floor/plasteel, +/area/science) +"jU" = ( +/obj/structure/table, +/obj/item/melee/transforming/energy/axe, +/turf/open/floor/plasteel, +/area/storage/primary) +"kk" = ( +/obj/structure/table/optable, +/turf/open/floor/plasteel, +/area/maintenance/department/bridge) +"kn" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"kQ" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + dir = 1; + pixel_y = 25 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"lK" = ( +/obj/effect/landmark/observer_start, +/turf/open/floor/plating, +/area/storage/primary) +"ny" = ( +/obj/structure/table, +/obj/item/storage/toolbox/syndicate, +/turf/open/floor/plasteel, +/area/storage/primary) +"oV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plasteel, +/area/medical/chemistry) +"pA" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/science) +"pI" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, +/obj/machinery/door/airlock/external/glass, /turf/open/floor/plating, -/area/hallway/secondary/entry) -"Qt" = ( +/area/medical/medbay) +"pQ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/medical/chemistry) +"vv" = ( /obj/machinery/door/airlock, +/turf/open/floor/plating, +/area/storage/primary) +"vP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/public/glass, +/turf/open/floor/plasteel, +/area/medical/chemistry) +"wb" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/blue/side{ + dir = 1 + }, +/area/hallway/primary/central) +"wS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/airalarm{ + frequency = 1439; + locked = 0; + pixel_y = 23 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"wT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/medical/chemistry) +"BB" = ( +/obj/item/storage/backpack/duffelbag/syndie/surgery, +/obj/structure/table, +/obj/item/disk/surgery/debug, +/turf/open/floor/plasteel, +/area/medical/medbay) +"BD" = ( +/obj/structure/closet/secure_closet/CMO, +/turf/open/floor/plasteel/blue/side, +/area/bridge) +"BG" = ( +/obj/structure/table, +/obj/item/ammo_box/c10mm, +/obj/item/gun/ballistic/automatic/pistol, +/turf/open/floor/plasteel, +/area/bridge) +"Ce" = ( +/turf/open/floor/plasteel, +/area/medical/chemistry) +"Ct" = ( +/obj/item/disk/tech_disk/debug, +/turf/open/floor/plasteel, +/area/science) +"CV" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/medical/chemistry) +"If" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/science) +"In" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/science) +"Iy" = ( +/obj/structure/closet/secure_closet/RD, +/turf/open/floor/plasteel/blue/side, +/area/bridge) +"JE" = ( +/obj/machinery/door/airlock, +/turf/open/floor/plating, +/area/hallway/primary/central) +"NZ" = ( +/obj/machinery/rnd/protolathe, +/turf/open/floor/plasteel, +/area/science) +"Qt" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, +/obj/machinery/door/airlock/external/glass, /turf/open/floor/plating, -/area/hallway/secondary/entry) +/area/medical/medbay) +"Ut" = ( +/obj/structure/closet/secure_closet/medical3, +/turf/open/floor/plasteel, +/area/medical/medbay) +"Vg" = ( +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "WT" = ( -/obj/machinery/door/airlock, /obj/structure/cable{ icon_state = "4-8" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, +/obj/machinery/door/airlock/external/glass, /turf/open/floor/plating, /area/engine/engineering) +"Xg" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry) (1,1,1) = {" aa @@ -2038,12 +2218,12 @@ ah ah ah bA -bZ -bZ -bZ -bZ -bZ +gd +gd bA +bZ +bZ +JE cN cN cN @@ -2093,9 +2273,9 @@ bj bs bB ca -bO -bO -bO +If +In +kn bO bO cO @@ -2147,9 +2327,9 @@ bk bt bC cb -bN -bN -bC +fT +pA +kQ bN bN cP @@ -2201,8 +2381,8 @@ bl ah bD cc -bE -bE +gY +jb cA bE bE @@ -2253,10 +2433,10 @@ aO bc bm ah -bE +NZ cc -bE -bE +Ct +gd cA bE bE @@ -2310,8 +2490,8 @@ ah bF cc co -bE -cA +bA +wS bE bE cN @@ -2353,7 +2533,7 @@ aa ab ac ad -ad +bY ah ah ah @@ -2437,7 +2617,7 @@ dn dZ cN af -ad +bY ac ab aa @@ -2469,7 +2649,7 @@ aQ ai ab bv -bH +bI cf cq bv @@ -2491,7 +2671,7 @@ dn dL cN af -ad +bY ac ab aa @@ -2523,9 +2703,9 @@ aR ai ab bv -bI +BG cf -cq +BD bu dU bE @@ -2545,7 +2725,7 @@ dn dL cN af -ad +bY ac ab aa @@ -2599,7 +2779,7 @@ dn dL cN af -ad +bY ac ab aa @@ -2633,7 +2813,7 @@ ac bv bK cf -cq +Iy bu cD bE @@ -2653,7 +2833,7 @@ dn dL cN af -ad +bY ac ab aa @@ -2707,7 +2887,7 @@ do dM cN af -ad +bY ac ab aa @@ -2743,7 +2923,7 @@ bM cg cr bu -cD +wb bE bE cS @@ -2761,7 +2941,7 @@ cS cS cS af -ad +bY ac ab aa @@ -2785,7 +2965,7 @@ aa ab ac ad -ad +bY aj aj WT @@ -2815,7 +2995,7 @@ dp dl cS af -ad +bY ac ab aa @@ -2847,10 +3027,10 @@ aS bd bo bw -bN +hD ci ct -bN +wT cF bN bN @@ -2869,7 +3049,7 @@ dl dl cS af -ad +bY ac ab aa @@ -2901,11 +3081,11 @@ aT be be bx -bO +CV cj -bE -bE -cA +Ce +Ce +oV bE bE cS @@ -2923,7 +3103,7 @@ dc dc cS af -ad +bY ac ab aa @@ -2956,10 +3136,10 @@ bf bp aj bP -cc -bE -bE -cA +pQ +Ce +Ce +oV bE bE cS @@ -2974,10 +3154,10 @@ dB dl dE dJ -dN +ny cS af -ad +bY ac ab aa @@ -3010,12 +3190,12 @@ ak ak ak bQ -cc -bE -bE -cA -bE +pQ +Ce +Ce +vP bE +Vg cS de dr @@ -3031,7 +3211,7 @@ dJ dO cS af -ad +bY ac ab aa @@ -3064,10 +3244,10 @@ bg bq ak bR -cc -bE -bE -cA +pQ +Ce +Ce +oV bE bE cV @@ -3082,10 +3262,10 @@ dB dl dE dJ -dN +jU cS af -ad +bY ac ab aa @@ -3118,17 +3298,17 @@ bh br ak bS -cc -bE -bE -cA +pQ +Ce +Ce +oV bE bE cV dg dt dB -dl +lK dE dH dI @@ -3172,10 +3352,10 @@ aI aI ak bT -cc -co -bE -cA +pQ +Xg +Ce +oV bE bE cV @@ -3190,7 +3370,7 @@ dB dl dE dJ -dP +dN cS af ad @@ -3230,7 +3410,7 @@ ck by cx cG -by +cx by by di @@ -3284,7 +3464,7 @@ cl cu cu cH -cI +cu cJ by dj @@ -3298,7 +3478,7 @@ dB dl dE dJ -dR +dN cS af ad @@ -3445,7 +3625,7 @@ bX cm cm cy -cm +Ut cm cM by @@ -3500,8 +3680,8 @@ cn by Qt by -cn -by +cm +BB by cS cS @@ -3509,7 +3689,7 @@ cS cS cS cS -cS +vv cS cS cS @@ -3554,9 +3734,9 @@ af by cz by -af -af -af +kk +ei +ad af af af From 2a161f47277386ec6789d427218591775050e2ff Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 5 Mar 2018 13:01:18 -0600 Subject: [PATCH 11/45] [MIRROR] Fix brains in MMIs being unable to pilot mechs (#5808) * Merge pull request #36128 from AutomaticFrenzy/patch/brainmech Fix brains in MMIs being unable to pilot mechs * Fix brains in MMIs being unable to pilot mechs --- code/game/mecha/mecha.dm | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 3e29a6f07e..b9dcbbfd03 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -370,15 +370,21 @@ occupant.throw_alert("mech damage", /obj/screen/alert/low_mech_integrity, 3) else occupant.clear_alert("mech damage") - var/actual_loc = occupant.loc - if(istype(actual_loc, /obj/item/device/mmi)) - var/obj/item/device/mmi/M = actual_loc - actual_loc = M.mecha - if(actual_loc != src) //something went wrong - occupant.clear_alert("charge") - occupant.clear_alert("mech damage") - RemoveActions(occupant, human_occupant=1) - occupant = null + var/atom/checking = occupant.loc + // recursive check to handle all cases regarding very nested occupants, + // such as brainmob inside brainitem inside MMI inside mecha + while (!isnull(checking)) + if (isturf(checking)) + // hit a turf before hitting the mecha, seems like they have + // been moved out + occupant.clear_alert("charge") + occupant.clear_alert("mech damage") + RemoveActions(occupant, human_occupant=1) + occupant = null + break + else if (checking == src) + break // all good + checking = checking.loc if(lights) var/lights_energy_drain = 2 From 506337a0cf9b604bee282dc835280b668114628b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 5 Mar 2018 13:01:21 -0600 Subject: [PATCH 12/45] Automatic changelog generation for PR #5808 [ci skip] --- html/changelogs/AutoChangeLog-pr-5808.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5808.yml diff --git a/html/changelogs/AutoChangeLog-pr-5808.yml b/html/changelogs/AutoChangeLog-pr-5808.yml new file mode 100644 index 0000000000..e15924b9ee --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5808.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - bugfix: "Inserting brains into MMIs and then into mechs now works again." From c8107c52ccf2fe6ae04aa61c59c925fabf958fe9 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 5 Mar 2018 13:01:49 -0600 Subject: [PATCH 13/45] [MIRROR] Adjusts fire priorities of flightpacks, research, networks, and fields. (#5809) * Adjusts fire priorities of flightpacks, research, networks, and fields. (#36129) * Fire priorities * research lower not higher * Don't need to keep timing if it's automatically compensating for missed ticks. * Spelling * spelling * Adjusts fire priorities of flightpacks, research, networks, and fields. --- code/__DEFINES/subsystems.dm | 8 ++++---- code/controllers/subsystem/processing/fields.dm | 2 +- code/controllers/subsystem/research.dm | 1 - 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index f22d36676d..770d3053c6 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -84,24 +84,24 @@ #define FIRE_PRIORITY_IDLE_NPC 10 #define FIRE_PRIORITY_SERVER_MAINT 10 +#define FIRE_PRIORITY_RESEARCH 10 #define FIRE_PRIORITY_GARBAGE 15 -#define FIRE_PRIORITY_RESEARCH 15 #define FIRE_PRIORITY_AIR 20 #define FIRE_PRIORITY_NPC 20 #define FIRE_PRIORITY_PROCESS 25 #define FIRE_PRIORITY_THROWING 25 -#define FIRE_PRIORITY_FLIGHTPACKS 30 #define FIRE_PRIORITY_SPACEDRIFT 30 +#define FIRE_PRIORITY_FIELDS 30 #define FIRE_PRIOTITY_SMOOTHING 35 #define FIRE_PRIORITY_ORBIT 35 +#define FIRE_PRIORITY_NETWORKS 40 #define FIRE_PRIORITY_OBJ 40 -#define FIRE_PRIORUTY_FIELDS 40 #define FIRE_PRIORITY_ACID 40 #define FIRE_PRIOTITY_BURNING 40 #define FIRE_PRIORITY_INBOUNDS 40 #define FIRE_PRIORITY_DEFAULT 50 #define FIRE_PRIORITY_PARALLAX 65 -#define FIRE_PRIORITY_NETWORKS 80 +#define FIRE_PRIORITY_FLIGHTPACKS 80 #define FIRE_PRIORITY_MOBS 100 #define FIRE_PRIORITY_TGUI 110 #define FIRE_PRIORITY_TICKER 200 diff --git a/code/controllers/subsystem/processing/fields.dm b/code/controllers/subsystem/processing/fields.dm index b6996377b5..a4c58b883a 100644 --- a/code/controllers/subsystem/processing/fields.dm +++ b/code/controllers/subsystem/processing/fields.dm @@ -1,6 +1,6 @@ PROCESSING_SUBSYSTEM_DEF(fields) name = "Fields" wait = 2 - priority = FIRE_PRIORUTY_FIELDS + priority = FIRE_PRIORITY_FIELDS flags = SS_KEEP_TIMING | SS_NO_INIT runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME diff --git a/code/controllers/subsystem/research.dm b/code/controllers/subsystem/research.dm index 43e014061c..3f6f42f833 100644 --- a/code/controllers/subsystem/research.dm +++ b/code/controllers/subsystem/research.dm @@ -1,7 +1,6 @@ SUBSYSTEM_DEF(research) name = "Research" - flags = SS_KEEP_TIMING priority = FIRE_PRIORITY_RESEARCH wait = 10 init_order = INIT_ORDER_RESEARCH From 892b3b43078f0bca9a6c0a55c5056eeae1f182a0 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 5 Mar 2018 13:02:08 -0600 Subject: [PATCH 14/45] [MIRROR] Allows the auxbase camera console to place airlocks on fans (#5813) * Allows the auxbase camera console to place airlocks on fans (#35975) * - Allows the aux base rcd to commit the same atrocities as the regular rcd - Rids us of another value that does nothing * first and only webeditor commit * Allows the auxbase camera console to place airlocks on fans --- code/modules/mining/aux_base_camera.dm | 17 ++++++----------- code/modules/mining/equipment/survival_pod.dm | 1 - 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/code/modules/mining/aux_base_camera.dm b/code/modules/mining/aux_base_camera.dm index 3aa963ef5e..02c54ffbd3 100644 --- a/code/modules/mining/aux_base_camera.dm +++ b/code/modules/mining/aux_base_camera.dm @@ -173,18 +173,13 @@ if(!check_spot()) return - - var/atom/movable/rcd_target var/turf/target_turf = get_turf(remote_eye) + var/atom/rcd_target = target_turf - //Find airlocks - rcd_target = locate(/obj/machinery/door/airlock) in target_turf - - if(!rcd_target) - rcd_target = locate (/obj/structure) in target_turf - - if(!rcd_target || !rcd_target.anchored) - rcd_target = target_turf + //Find airlocks and other shite + for(var/obj/S in target_turf) + if(LAZYLEN(S.rcd_vals(owner,B.RCD))) + rcd_target = S //If we don't break out of this loop we'll get the last placed thing owner.changeNext_move(CLICK_CD_RANGE) B.RCD.afterattack(rcd_target, owner, TRUE) //Activate the RCD and force it to work remotely! @@ -276,4 +271,4 @@ datum/action/innate/aux_base/install_turret/Activate() B.turret_stock-- to_chat(owner, "Turret installation complete!") - playsound(turret_turf, 'sound/items/drill_use.ogg', 65, 1) \ No newline at end of file + playsound(turret_turf, 'sound/items/drill_use.ogg', 65, 1) diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index 66faa7cb2c..632c9e1cba 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -203,7 +203,6 @@ desc = "A large machine releasing a constant gust of air." anchored = TRUE density = TRUE - var/arbitraryatmosblockingvar = TRUE var/buildstacktype = /obj/item/stack/sheet/metal var/buildstackamount = 5 CanAtmosPass = ATMOS_PASS_NO From c6aab4b38b25ec6bde69e3c81105aea7fd479eaa Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 5 Mar 2018 13:02:10 -0600 Subject: [PATCH 15/45] Automatic changelog generation for PR #5813 [ci skip] --- html/changelogs/AutoChangeLog-pr-5813.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5813.yml diff --git a/html/changelogs/AutoChangeLog-pr-5813.yml b/html/changelogs/AutoChangeLog-pr-5813.yml new file mode 100644 index 0000000000..ae28f209b3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5813.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - bugfix: "Fixes the auxbase camera console not placing airlocks on fans but doing so vice-versa" From 30a4705c01ecd12072071cde4a2c1fedeb67421a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 5 Mar 2018 13:23:28 -0600 Subject: [PATCH 16/45] [MIRROR] Clean up all sorts of crap, mostly defines (#5788) * Clean up all sorts of crap, mostly defines * fixes compile errors --- code/__DEFINES/DNA.dm | 15 --- code/__DEFINES/admin.dm | 6 - code/__DEFINES/atmospherics.dm | 14 +-- code/__DEFINES/cleaning.dm | 2 +- code/__DEFINES/clockcult.dm | 2 - code/__DEFINES/colors.dm | 24 ++-- code/__DEFINES/combat.dm | 4 - code/__DEFINES/components.dm | 1 - code/__DEFINES/construction.dm | 11 -- code/__DEFINES/flags.dm | 2 - code/__DEFINES/inventory.dm | 16 --- code/__DEFINES/is_helpers.dm | 17 +-- code/__DEFINES/layers.dm | 1 - code/__DEFINES/lighting.dm | 23 +--- code/__DEFINES/machines.dm | 3 - code/__DEFINES/medal.dm | 1 - code/__DEFINES/misc.dm | 76 +----------- code/__DEFINES/mobs.dm | 25 +--- code/__DEFINES/radio.dm | 111 +++++++++--------- code/__DEFINES/shuttles.dm | 4 +- code/__DEFINES/sight.dm | 60 +++++----- code/__DEFINES/stat.dm | 1 - code/__DEFINES/status_effects.dm | 2 - code/__HELPERS/unsorted.dm | 2 +- code/_globalvars/lists/poll_ignore.dm | 2 - code/_onclick/hud/_defines.dm | 2 +- code/_onclick/telekinesis.dm | 5 + code/game/machinery/hologram.dm | 1 - code/game/turfs/open.dm | 3 - code/modules/admin/admin_ranks.dm | 6 - code/modules/antagonists/cult/cult_comms.dm | 1 - code/modules/error_handler/error_handler.dm | 3 + code/modules/fields/turf_objects.dm | 2 +- code/modules/mob/living/carbon/human/life.dm | 27 +++++ .../mob/living/carbon/monkey/combat.dm | 3 + code/modules/mob/living/silicon/ai/life.dm | 2 +- code/modules/mob/living/silicon/ai/say.dm | 1 + code/modules/ninja/__ninjaDefines.dm | 1 - .../power/singularity/field_generator.dm | 5 + code/modules/power/turbine.dm | 11 +- code/modules/projectiles/gun.dm | 2 +- code/modules/projectiles/guns/ballistic.dm | 10 +- .../projectiles/guns/ballistic/revolver.dm | 4 +- 43 files changed, 168 insertions(+), 346 deletions(-) diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index de3b90eb1c..44fcce6253 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -44,20 +44,6 @@ //Mutations that cant be taken from genetics and are not in SE #define NON_SCANNABLE -1 - // Extra powers: -#define LASER 9 // harm intent - click anywhere to shoot lasers from eyes -#define HEAL 10 // healing people with hands -#define SHADOW 11 // shadow teleportation (create in/out portals anywhere) (25%) -#define SCREAM 12 // supersonic screaming (25%) -#define EXPLOSIVE 13 // exploding on-demand (15%) -#define REGENERATION 14 // superhuman regeneration (30%) -#define REPROCESSOR 15 // eat anything (50%) -#define SHAPESHIFTING 16 // take on the appearance of anything (40%) -#define PHASING 17 // ability to phase through walls (40%) -#define SHIELD 18 // shielding from all projectile attacks (30%) -#define SHOCKWAVE 19 // attack a nearby tile and cause a massive shockwave, knocking most people on their asses (25%) -#define ELECTRICITY 20 // ability to shoot electric attacks (15%) - //DNA - Because fuck you and your magic numbers being all over the codebase. #define DNA_BLOCK_SIZE 3 @@ -81,7 +67,6 @@ #define TR_KEEPIMPLANTS 16 #define TR_KEEPSE 32 // changelings shouldn't edit the DNA's SE when turning into a monkey #define TR_DEFAULTMSG 64 -#define TR_KEEPSRC 128 #define TR_KEEPORGANS 256 diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index 62d4b94528..e8b744ce5b 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -37,12 +37,6 @@ #define R_DEFAULT R_AUTOLOGIN -#if DM_VERSION > 512 -#error Remove the flag below , its been long enough -#endif -//legacy , remove post 512, it was replaced by R_POLL -#define R_REJUVINATE 2 - #define R_MAXPERMISSION 4096 //This holds the maximum value for a permission. It is used in iteration, so keep it updated. #define ADMIN_QUE(user) "(?)" diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index 73f2661ed5..bc95a9ddff 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -28,7 +28,6 @@ #define CELL_VOLUME 2500 //liters in a cell #define BREATH_VOLUME 0.5 //liters in a normal breath #define BREATH_PERCENTAGE (BREATH_VOLUME/CELL_VOLUME) //Amount of air to take a from a tile -#define HUMAN_NEEDED_OXYGEN (MOLES_CELLSTANDARD*BREATH_PERCENTAGE*0.16) //Amount of air needed before pass out/suffocation commences //EXCITED GROUPS #define EXCITED_GROUP_BREAKDOWN_CYCLES 4 //number of FULL air controller ticks before an excited group breaks down (averages gas contents across turfs) @@ -46,10 +45,7 @@ //HEAT TRANSFER COEFFICIENTS //Must be between 0 and 1. Values closer to 1 equalize temperature faster //Should not exceed 0.4 else strange heat flow occur -#define FLOOR_HEAT_TRANSFER_COEFFICIENT 0.4 #define WALL_HEAT_TRANSFER_COEFFICIENT 0.0 -#define DOOR_HEAT_TRANSFER_COEFFICIENT 0.0 -#define SPACE_HEAT_TRANSFER_COEFFICIENT 0.2 //a hack to partly simulate radiative heat #define OPEN_HEAT_TRANSFER_COEFFICIENT 0.4 #define WINDOW_HEAT_TRANSFER_COEFFICIENT 0.1 //a hack for now #define HEAT_CAPACITY_VACUUM 7000 //a hack to help make vacuums "cold", sacrificing realism for gameplay @@ -59,8 +55,6 @@ #define FIRE_MINIMUM_TEMPERATURE_TO_EXIST 100+T0C #define FIRE_SPREAD_RADIOSITY_SCALE 0.85 #define FIRE_GROWTH_RATE 40000 //For small fires -#define CARBON_LIFEFORM_FIRE_RESISTANCE 200+T0C //Resistance to fire damage -#define CARBON_LIFEFORM_FIRE_DAMAGE 4 //Fire damage #define PLASMA_MINIMUM_BURN_TEMPERATURE 100+T0C //GASES @@ -74,11 +68,6 @@ #define REACTING 1 #define STOP_REACTIONS 2 -//HUMANS -//Hurty numbers -#define FIRE_DAMAGE_MODIFIER 0.0215 //Higher values result in more external fire damage to the skin -#define AIR_DAMAGE_MODIFIER 1.025 //More means less damage from hot air scalding lungs, less = more damage //CITADEL EDIT 1.025 - // Pressure limits. #define HAZARD_HIGH_PRESSURE 550 //This determins at what pressure the ultra-high pressure red icon is displayed. (This one is set as a constant) #define WARNING_HIGH_PRESSURE 325 //This determins when the orange pressure icon is displayed (it is 0.7 * HAZARD_HIGH_PRESSURE) @@ -123,7 +112,7 @@ #define SHOES_MAX_TEMP_PROTECT 1500 //For gloves #define PRESSURE_DAMAGE_COEFFICIENT 4 //The amount of pressure damage someone takes is equal to (pressure / HAZARD_HIGH_PRESSURE)*PRESSURE_DAMAGE_COEFFICIENT, with the maximum of MAX_PRESSURE_DAMAGE -#define MAX_HIGH_PRESSURE_DAMAGE 16 // CITADEL CHANGES Max to 16, low to 8. +#define MAX_HIGH_PRESSURE_DAMAGE 16 // CITADEL CHANGES Max to 16, low to 8. #define LOW_PRESSURE_DAMAGE 8 //The amount of damage someone takes when in a low pressure area (The pressure threshold is so low that it doesn't make sense to do any calculations, so it just applies this flat value). #define COLD_SLOWDOWN_FACTOR 20 //Humans are slowed by the difference between bodytemp and BODYTEMP_COLD_DAMAGE_LIMIT divided by this @@ -196,4 +185,3 @@ GLOBAL_LIST_INIT(pipe_paint_colors, list( "Violet" = rgb(64,0,128), "Yellow" = rgb(255,198,0) )) - diff --git a/code/__DEFINES/cleaning.dm b/code/__DEFINES/cleaning.dm index eed0ee5f54..c4db590e90 100644 --- a/code/__DEFINES/cleaning.dm +++ b/code/__DEFINES/cleaning.dm @@ -1,5 +1,5 @@ //Cleaning tool strength -#define CLEAN_VERY_WEAK 1 // What are you scrubbing the ground with a toothpick? +// 1 is also a valid cleaning strength but completely unused so left undefined #define CLEAN_WEAK 2 #define CLEAN_MEDIUM 3 // Acceptable tools #define CLEAN_STRONG 4 // Industrial strength diff --git a/code/__DEFINES/clockcult.dm b/code/__DEFINES/clockcult.dm index 9f23ba2d38..070b92acc7 100644 --- a/code/__DEFINES/clockcult.dm +++ b/code/__DEFINES/clockcult.dm @@ -64,8 +64,6 @@ GLOBAL_LIST_EMPTY(all_scripture) //a list containing scripture instances; not us #define GATEWAY_RATVAR_ARRIVAL 600 //when progress is at or above this, game over ratvar's here everybody go home -#define ARK_SUMMON_COST 5 //how many of each component an Ark costs to summon - //Objective text define #define CLOCKCULT_OBJECTIVE "Construct the Ark of the Clockwork Justicar and free Ratvar." diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm index 10d4182b28..824f5b3e61 100644 --- a/code/__DEFINES/colors.dm +++ b/code/__DEFINES/colors.dm @@ -3,26 +3,26 @@ #define COLOR_INPUT_DISABLED "#F0F0F0" #define COLOR_INPUT_ENABLED "#D3B5B5" -#define COLOR_WHITE "#EEEEEE" -#define COLOR_SILVER "#C0C0C0" -#define COLOR_GRAY "#808080" +//#define COLOR_WHITE "#EEEEEE" +//#define COLOR_SILVER "#C0C0C0" +//#define COLOR_GRAY "#808080" #define COLOR_FLOORTILE_GRAY "#8D8B8B" #define COLOR_ALMOST_BLACK "#333333" -#define COLOR_BLACK "#000000" +//#define COLOR_BLACK "#000000" #define COLOR_RED "#FF0000" -#define COLOR_RED_LIGHT "#FF3333" -#define COLOR_MAROON "#800000" +//#define COLOR_RED_LIGHT "#FF3333" +//#define COLOR_MAROON "#800000" #define COLOR_YELLOW "#FFFF00" -#define COLOR_OLIVE "#808000" -#define COLOR_LIME "#32CD32" +//#define COLOR_OLIVE "#808000" +//#define COLOR_LIME "#32CD32" #define COLOR_GREEN "#008000" #define COLOR_CYAN "#00FFFF" -#define COLOR_TEAL "#008080" +//#define COLOR_TEAL "#008080" #define COLOR_BLUE "#0000FF" -#define COLOR_BLUE_LIGHT "#33CCFF" -#define COLOR_NAVY "#000080" +//#define COLOR_BLUE_LIGHT "#33CCFF" +//#define COLOR_NAVY "#000080" #define COLOR_PINK "#FFC0CB" -#define COLOR_MAGENTA "#FF00FF" +//#define COLOR_MAGENTA "#FF00FF" #define COLOR_PURPLE "#800080" #define COLOR_ORANGE "#FF9900" #define COLOR_BEIGE "#CEB689" diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 8e791cfffd..b67c084e10 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -110,11 +110,7 @@ #define EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER 8 //Coefficient of multiplication for the damage the item does when removed without a surgery (this*item.w_class) #define EMBEDDED_UNSAFE_REMOVAL_TIME 30 //A Time in ticks, total removal time = (this*item.w_class) -//Gun Stuff -#define SAWN_INTACT 0 -#define SAWN_OFF 1 //Gun weapon weight -#define WEAPON_DUAL_WIELD 0 #define WEAPON_LIGHT 1 #define WEAPON_MEDIUM 2 #define WEAPON_HEAVY 3 diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 40701947b9..5b4ff7e378 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -31,7 +31,6 @@ //Positions for overrides list #define EXAMINE_POSITION_ARTICLE 1 #define EXAMINE_POSITION_BEFORE 2 - #define EXAMINE_POSITION_NAME 3 //End positions #define COMPONENT_EXNAME_CHANGED 1 #define COMSIG_ATOM_ENTERED "atom_entered" //from base of atom/Entered(): (/atom/movable, /atom) diff --git a/code/__DEFINES/construction.dm b/code/__DEFINES/construction.dm index 8d77c39740..e03db1964d 100644 --- a/code/__DEFINES/construction.dm +++ b/code/__DEFINES/construction.dm @@ -37,12 +37,6 @@ #define FAILED_UNFASTEN 1 #define SUCCESSFUL_UNFASTEN 2 -//disposal unit mode defines, which do double time as the construction defines -#define PRESSURE_OFF 0 -#define PRESSURE_ON 1 -#define PRESSURE_MAXED 2 -#define SCREWS_OUT -1 - //ai core defines #define EMPTY_CORE 0 #define CIRCUIT_CORE 1 @@ -51,11 +45,6 @@ #define GLASS_CORE 4 #define AI_READY_CORE 5 -//field generator construction defines -#define FG_UNSECURED 0 -#define FG_SECURED 1 -#define FG_WELDED 2 - //emitter construction defines #define EM_UNSECURED 0 #define EM_SECURED 1 diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index d2c88a0c1b..814120c229 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -26,7 +26,6 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define ON_BORDER_1 512 // item has priority to check when entering or leaving #define NOSLIP_1 1024 //prevents from slipping on wet floors, in space etc -#define _UNUSED_1 2048 // BLOCK_GAS_SMOKE_EFFECT_1 only used in masks at the moment. #define BLOCK_GAS_SMOKE_EFFECT_1 4096 // blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY! @@ -84,7 +83,6 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 //Movement Types -#define IMMOBILE 0 #define GROUND 1 #define FLYING 2 diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index d2de6f9100..dc3647e1f1 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -118,22 +118,6 @@ #define NECK 2048 #define FULL_BODY 4095 -// bitflags for the percentual amount of protection a piece of clothing which covers the body part offers. -// Used with human/proc/get_heat_protection() and human/proc/get_cold_protection() -// The values here should add up to 1. -// Hands and feet have 2.5%, arms and legs 7.5%, each of the torso parts has 15% and the head has 30% -#define THERMAL_PROTECTION_HEAD 0.3 -#define THERMAL_PROTECTION_CHEST 0.15 -#define THERMAL_PROTECTION_GROIN 0.15 -#define THERMAL_PROTECTION_LEG_LEFT 0.075 -#define THERMAL_PROTECTION_LEG_RIGHT 0.075 -#define THERMAL_PROTECTION_FOOT_LEFT 0.025 -#define THERMAL_PROTECTION_FOOT_RIGHT 0.025 -#define THERMAL_PROTECTION_ARM_LEFT 0.075 -#define THERMAL_PROTECTION_ARM_RIGHT 0.075 -#define THERMAL_PROTECTION_HAND_LEFT 0.025 -#define THERMAL_PROTECTION_HAND_RIGHT 0.025 - //flags for female outfits: How much the game can safely "take off" the uniform without it looking weird #define NO_FEMALE_UNIFORM 0 #define FEMALE_UNIFORM_FULL 1 diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 9a43607709..b1a065822d 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -1,7 +1,5 @@ // simple is_type and similar inline helpers -#define isdatum(D) (istype(D, /datum)) - #define islist(L) (istype(L, /list)) #if DM_VERSION >= 512 @@ -64,7 +62,6 @@ #define isjellyperson(A) (is_species(A, /datum/species/jelly)) #define isslimeperson(A) (is_species(A, /datum/species/jelly/slime)) #define isluminescent(A) (is_species(A, /datum/species/jelly/luminescent)) -#define isshadowperson(A) (is_species(A, /datum/species/shadow)) #define iszombie(A) (is_species(A, /datum/species/zombie)) #define ishumanbasic(A) (is_species(A, /datum/species/human)) @@ -106,8 +103,6 @@ #define isbot(A) (istype(A, /mob/living/simple_animal/bot)) -#define iscrab(A) (istype(A, /mob/living/simple_animal/crab)) - #define isshade(A) (istype(A, /mob/living/simple_animal/shade)) #define ismouse(A) (istype(A, /mob/living/simple_animal/mouse)) @@ -118,16 +113,10 @@ #define iscat(A) (istype(A, /mob/living/simple_animal/pet/cat)) -#define isdog(A) (istype(A, /mob/living/simple_animal/pet/dog)) - #define iscorgi(A) (istype(A, /mob/living/simple_animal/pet/dog/corgi)) #define ishostile(A) (istype(A, /mob/living/simple_animal/hostile)) -#define isbear(A) (istype(A, /mob/living/simple_animal/hostile/bear)) - -#define iscarp(A) (istype(A, /mob/living/simple_animal/hostile/carp)) - #define isswarmer(A) (istype(A, /mob/living/simple_animal/hostile/swarmer)) #define isguardian(A) (istype(A, /mob/living/simple_animal/hostile/guardian)) @@ -183,14 +172,10 @@ GLOBAL_LIST_INIT(pointed_types, typecacheof(list( #define isigniter(O) (istype(O, /obj/item/device/assembly/igniter)) -#define isinfared(O) (istype(O, /obj/item/device/assembly/infra)) - #define isprox(O) (istype(O, /obj/item/device/assembly/prox_sensor)) #define issignaler(O) (istype(O, /obj/item/device/assembly/signaler)) -#define istimer(O) (istype(O, /obj/item/device/assembly/timer)) - GLOBAL_LIST_INIT(glass_sheet_types, typecacheof(list( /obj/item/stack/sheet/glass, /obj/item/stack/sheet/rglass, @@ -201,4 +186,4 @@ GLOBAL_LIST_INIT(glass_sheet_types, typecacheof(list( #define is_glass_sheet(O) (is_type_in_typecache(O, GLOB.glass_sheet_types)) -#define isblobmonster(O) (istype(O, /mob/living/simple_animal/hostile/blob)) \ No newline at end of file +#define isblobmonster(O) (istype(O, /mob/living/simple_animal/hostile/blob)) diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 9bf44a7fbd..614383931c 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -9,7 +9,6 @@ #define GAME_PLANE -1 #define BLACKNESS_PLANE 0 //To keep from conflicts with SEE_BLACKNESS internals #define SPACE_LAYER 1.8 -#define ABOVE_SPACE_LAYER 1.9 //#define TURF_LAYER 2 //For easy recordkeeping; this is a byond define #define MID_TURF_LAYER 2.02 #define HIGH_TURF_LAYER 2.03 diff --git a/code/__DEFINES/lighting.dm b/code/__DEFINES/lighting.dm index 96197f578e..f68657c3e9 100644 --- a/code/__DEFINES/lighting.dm +++ b/code/__DEFINES/lighting.dm @@ -23,27 +23,6 @@ 0, 0, 0, 1 \ ) \ -// Helpers so we can (more easily) control the colour matrices. -#define CL_MATRIX_RR 1 -#define CL_MATRIX_RG 2 -#define CL_MATRIX_RB 3 -#define CL_MATRIX_RA 4 -#define CL_MATRIX_GR 5 -#define CL_MATRIX_GG 6 -#define CL_MATRIX_GB 7 -#define CL_MATRIX_GA 8 -#define CL_MATRIX_BR 9 -#define CL_MATRIX_BG 10 -#define CL_MATRIX_BB 11 -#define CL_MATRIX_BA 12 -#define CL_MATRIX_AR 13 -#define CL_MATRIX_AG 14 -#define CL_MATRIX_AB 15 -#define CL_MATRIX_AA 16 -#define CL_MATRIX_CR 17 -#define CL_MATRIX_CG 18 -#define CL_MATRIX_CB 19 -#define CL_MATRIX_CA 20 //Some defines to generalise colours used in lighting. //Important note on colors. Colors can end up significantly different from the basic html picture, especially when saturated @@ -90,4 +69,4 @@ #define LIGHTING_NO_UPDATE 0 #define LIGHTING_VIS_UPDATE 1 #define LIGHTING_CHECK_UPDATE 2 -#define LIGHTING_FORCE_UPDATE 3 \ No newline at end of file +#define LIGHTING_FORCE_UPDATE 3 diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm index 4665bd3b1e..ad9fcdb2dd 100644 --- a/code/__DEFINES/machines.dm +++ b/code/__DEFINES/machines.dm @@ -85,6 +85,3 @@ #define SUPERMATTER_DANGER 4 // Integrity < 50% #define SUPERMATTER_EMERGENCY 5 // Integrity < 25% #define SUPERMATTER_DELAMINATING 6 // Pretty obvious. - -//R&D Snowflakes -#define RD_CONSOLE_LOCKED_SCREEN 0.2 diff --git a/code/__DEFINES/medal.dm b/code/__DEFINES/medal.dm index 5781e14f57..b5ff8eac20 100644 --- a/code/__DEFINES/medal.dm +++ b/code/__DEFINES/medal.dm @@ -10,7 +10,6 @@ #define BOSS_MEDAL_DRAKE "Drake" #define BOSS_MEDAL_HIEROPHANT "Hierophant" #define BOSS_MEDAL_LEGION "Legion" -#define BOSS_MEDAL_SWARMER "Swarmer Beacon" #define BOSS_MEDAL_TENDRIL "Tendril" // Score names diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index bee1e19a5b..cd0a7ce97c 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -20,8 +20,8 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s #define THIS_PROC_TYPE_STR "[THIS_PROC_TYPE]" //Because you can only obtain a string of THIS_PROC_TYPE using "[]", and it's nice to just +/+= strings #define THIS_PROC_TYPE_STR_WITH_ARGS "[THIS_PROC_TYPE]([args.Join(",")])" #define THIS_PROC_TYPE_WEIRD ...... //This one is WEIRD, in some cases (When used in certain defines? (eg: ASSERT)) THIS_PROC_TYPE will fail to work, but THIS_PROC_TYPE_WEIRD will work instead -#define THIS_PROC_TYPE_WEIRD_STR "[THIS_PROC_TYPE_WEIRD]" //Included for completeness -#define THIS_PROC_TYPE_WEIRD_STR_WITH_ARGS "[THIS_PROC_TYPE_WEIRD]([args.Join(",")])" //Ditto +//define THIS_PROC_TYPE_WEIRD_STR "[THIS_PROC_TYPE_WEIRD]" //Included for completeness +//define THIS_PROC_TYPE_WEIRD_STR_WITH_ARGS "[THIS_PROC_TYPE_WEIRD]([args.Join(",")])" //Ditto #define MIDNIGHT_ROLLOVER 864000 //number of deciseconds in a day @@ -46,7 +46,6 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s #define HALLOWEEN "Halloween" #define CHRISTMAS "Christmas" #define FESTIVE_SEASON "Festive Season" -#define FRIDAY_13TH "Friday the 13th" //Human Overlays Indexes///////// //LOTS OF CIT CHANGES HERE. BE CAREFUL WHEN UPSTREAM ADDS MORE LAYERS @@ -86,58 +85,11 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s //Human Overlay Index Shortcuts for alternate_worn_layer, layers //Because I *KNOW* somebody will think layer+1 means "above" //IT DOESN'T OK, IT MEANS "UNDER" -#define UNDER_BODY_BEHIND_LAYER BODY_BEHIND_LAYER+1 -#define UNDER_BODY_LAYER BODY_LAYER+1 -#define UNDER_BODY_ADJ_LAYER BODY_ADJ_LAYER+1 -#define UNDER_MUTATIONS_LAYER MUTATIONS_LAYER+1 -#define UNDER_BODYPARTS_LAYER BODYPARTS_LAYER+1 -#define UNDER_DAMAGE_LAYER DAMAGE_LAYER+1 -#define UNDER_UNIFORM_LAYER UNIFORM_LAYER+1 -#define UNDER_ID_LAYER ID_LAYER+1 -#define UNDER_HANDS_PART_LAYER HANDS_PART_LAYER+1 -#define UNDER_GLOVES_LAYER GLOVES_LAYER+1 -#define UNDER_SHOES_LAYER SHOES_LAYER+1 -#define UNDER_EARS_LAYER EARS_LAYER+1 #define UNDER_SUIT_LAYER SUIT_LAYER+1 -#define UNDER_GLASSES_LAYER GLASSES_LAYER+1 -#define UNDER_BELT_LAYER BELT_LAYER+1 -#define UNDER_SUIT_STORE_LAYER SUIT_STORE_LAYER+1 -#define UNDER_BACK_LAYER BACK_LAYER+1 -#define UNDER_HAIR_LAYER HAIR_LAYER+1 -#define UNDER_FACEMASK_LAYER FACEMASK_LAYER+1 -#define UNDER_HEAD_LAYER HEAD_LAYER+1 -#define UNDER_HANDCUFF_LAYER HANDCUFF_LAYER+1 -#define UNDER_LEGCUFF_LAYER LEGCUFF_LAYER+1 -#define UNDER_HANDS_LAYER HANDS_LAYER+1 -#define UNDER_BODY_FRONT_LAYER BODY_FRONT_LAYER+1 -#define UNDER_FIRE_LAYER FIRE_LAYER+1 //AND -1 MEANS "ABOVE", OK?, OK!?! -#define ABOVE_BODY_BEHIND_LAYER BODY_BEHIND_LAYER-1 -#define ABOVE_BODY_LAYER BODY_LAYER-1 -#define ABOVE_BODY_ADJ_LAYER BODY_ADJ_LAYER-1 -#define ABOVE_MUTATIONS_LAYER MUTATIONS_LAYER-1 -#define ABOVE_BODYPARTS_LAYER BODYPARTS_LAYER-1 -#define ABOVE_DAMAGE_LAYER DAMAGE_LAYER-1 -#define ABOVE_UNIFORM_LAYER UNIFORM_LAYER-1 -#define ABOVE_ID_LAYER ID_LAYER-1 -#define ABOVE_HANDS_PART_LAYER HANDS_PART_LAYER-1 -#define ABOVE_GLOVES_LAYER GLOVES_LAYER-1 #define ABOVE_SHOES_LAYER SHOES_LAYER-1 -#define ABOVE_EARS_LAYER EARS_LAYER-1 -#define ABOVE_SUIT_LAYER SUIT_LAYER-1 -#define ABOVE_GLASSES_LAYER GLASSES_LAYER-1 -#define ABOVE_BELT_LAYER BELT_LAYER-1 -#define ABOVE_SUIT_STORE_LAYER SUIT_STORE_LAYER-1 -#define ABOVE_BACK_LAYER BACK_LAYER-1 -#define ABOVE_HAIR_LAYER HAIR_LAYER-1 -#define ABOVE_FACEMASK_LAYER FACEMASK_LAYER-1 -#define ABOVE_HEAD_LAYER HEAD_LAYER-1 -#define ABOVE_HANDCUFF_LAYER HANDCUFF_LAYER-1 -#define ABOVE_LEGCUFF_LAYER LEGCUFF_LAYER-1 -#define ABOVE_HANDS_LAYER HANDS_LAYER-1 #define ABOVE_BODY_FRONT_LAYER BODY_FRONT_LAYER-1 -#define ABOVE_FIRE_LAYER FIRE_LAYER-1 //Security levels @@ -195,7 +147,6 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s #define AI_MECH_HACK 3 //Malfunctioning AI hijacking mecha //check_target_facings() return defines -#define FACING_FAILED 0 #define FACING_SAME_DIR 1 #define FACING_EACHOTHER 2 #define FACING_INIT_FACING_TARGET_TARGET_FACING_PERPENDICULAR 3 //Do I win the most informative but also most stupid define award? @@ -213,7 +164,6 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache) #define BLOOD_GAIN_PER_STEP 100 #define BLOOD_LOSS_PER_STEP 5 #define BLOOD_LOSS_IN_SPREAD 20 -#define BLOOD_FADEOUT_TIME 2 //Bloody shoe blood states #define BLOOD_STATE_HUMAN "blood" @@ -241,7 +191,6 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache) #define TURF_WET_LUBE 2 #define TURF_WET_ICE 3 #define TURF_WET_PERMAFROST 4 -#define TURF_WET_SLIDE 5 //Maximum amount of time, (in approx. seconds.) a tile can be wet for. #define MAXIMUM_WET_TIME 300 @@ -309,10 +258,8 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE ///////////////////////////////////// // atom.appearence_flags shortcuts // ///////////////////////////////////// -//this was added midway thru 510, so it might not exist in some versions, but we can't check by minor verison -#ifndef TILE_BOUND -#error this version of 510 is too old, You must use byond 510.1332 or later. (TILE_BOUND is not defined) -#endif + +/* // Disabling certain features #define APPEARANCE_IGNORE_TRANSFORM RESET_TRANSFORM @@ -330,12 +277,7 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE #define APPEARANCE_CONSIDER_ALPHA ~RESET_ALPHA #define APPEARANCE_LONG_GLIDE LONG_GLIDE -#ifndef PIXEL_SCALE -#define PIXEL_SCALE 0 -#if DM_VERSION >= 512 -#error HEY, PIXEL_SCALE probably exists now, remove this gross ass shim. -#endif -#endif +*/ // Consider these images/atoms as part of the UI/HUD #define APPEARANCE_UI_IGNORE_ALPHA RESET_COLOR|RESET_TRANSFORM|NO_CLIENT_COLOR|RESET_ALPHA|PIXEL_SCALE @@ -417,14 +359,6 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE #define CLOCK_PROSELYTIZATION 23 #define SHUTTLE_HIJACK 24 -#define TURF_DECAL_PAINT "paint" -#define TURF_DECAL_DAMAGE "damage" -#define TURF_DECAL_DIRT "dirt" - -//Error handler defines -#define ERROR_USEFUL_LEN 2 - -#define NO_FIELD 0 #define FIELD_TURF 1 #define FIELD_EDGE 2 diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 867d2a264c..7af6fecce2 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -118,7 +118,7 @@ //Sentience types, to prevent things like sentience potions from giving bosses sentience #define SENTIENCE_ORGANIC 1 #define SENTIENCE_ARTIFICIAL 2 -#define SENTIENCE_OTHER 3 +// #define SENTIENCE_OTHER 3 unused #define SENTIENCE_MINEBOT 4 #define SENTIENCE_BOSS 5 @@ -137,29 +137,6 @@ #define ENVIRONMENT_SMASH_WALLS 2 //walls #define ENVIRONMENT_SMASH_RWALLS 4 //rwalls - -//SNPCs -//AI defines -#define INTERACTING 2 -#define TRAVEL 4 -#define FIGHTING 8 -//Trait defines -#define TRAIT_ROBUST 2 -#define TRAIT_UNROBUST 4 -#define TRAIT_SMART 8 -#define TRAIT_DUMB 16 -#define TRAIT_MEAN 32 -#define TRAIT_FRIENDLY 64 -#define TRAIT_THIEVING 128 -//Range/chance defines -#define MAX_RANGE_FIND 32 -#define MIN_RANGE_FIND 16 -#define FUZZY_CHANCE_HIGH 85 -#define FUZZY_CHANCE_LOW 50 -#define CHANCE_TALK 1 - -#define TK_MAXRANGE 15 - #define NO_SLIP_WHEN_WALKING 1 #define SLIDE 2 #define GALOSHES_DONT_HELP 4 diff --git a/code/__DEFINES/radio.dm b/code/__DEFINES/radio.dm index e38fe9954b..97935d58b7 100644 --- a/code/__DEFINES/radio.dm +++ b/code/__DEFINES/radio.dm @@ -1,56 +1,55 @@ -// Radios use a large variety of predefined frequencies. - -#define MIN_FREE_FREQ 1201 // ------------------------------------------------- -// Frequencies are always odd numbers and range from 1201 to 1599. - -#define FREQ_SYNDICATE 1213 // Nuke op comms frequency, dark brown -#define FREQ_CTF_RED 1215 // CTF red team comms frequency, red -#define FREQ_CTF_BLUE 1217 // CTF blue team comms frequency, blue -#define FREQ_CENTCOM 1337 // CentCom comms frequency, gray -#define FREQ_SUPPLY 1347 // Supply comms frequency, light brown -#define FREQ_SERVICE 1349 // Service comms frequency, green -#define FREQ_SCIENCE 1351 // Science comms frequency, plum -#define FREQ_COMMAND 1353 // Command comms frequency, gold -#define FREQ_MEDICAL 1355 // Medical comms frequency, soft blue -#define FREQ_ENGINEERING 1357 // Engineering comms frequency, orange -#define FREQ_SECURITY 1359 // Security comms frequency, red - -#define FREQ_STATUS_DISPLAYS 1435 -#define FREQ_ATMOS_ALARMS 1437 // air alarms <-> alert computers -#define FREQ_ATMOS_CONTROL 1439 // air alarms <-> vents and scrubbers - -#define MIN_FREQ 1441 // ------------------------------------------------------ -// Only the 1441 to 1489 range is freely available for general conversation. -// This represents 1/8th of the available spectrum. - -#define FREQ_ATMOS_STORAGE 1441 -#define FREQ_NAV_BEACON 1445 -#define FREQ_AI_PRIVATE 1447 // AI private comms frequency, magenta -#define FREQ_PRESSURE_PLATE 1447 -#define FREQ_AIRLOCK_CONTROL 1449 -#define FREQ_ELECTROPACK 1449 -#define FREQ_MAGNETS 1449 -#define FREQ_LOCATOR_IMPLANT 1451 -#define FREQ_SIGNALER 1457 // the default for new signalers -#define FREQ_COMMON 1459 // Common comms frequency, dark green - -#define MAX_FREQ 1489 // ------------------------------------------------------ - -#define MAX_FREE_FREQ 1599 // ------------------------------------------------- - -// Transmission types. -#define TRANSMISSION_WIRE 0 // some sort of wired connection, not used -#define TRANSMISSION_RADIO 1 // electromagnetic radiation (default) -#define TRANSMISSION_SUBSPACE 2 // subspace transmission (headsets only) -#define TRANSMISSION_SUPERSPACE 3 // reaches independent (CentCom) radios only - -// Filter types, used as an optimization to avoid unnecessary proc calls. -#define RADIO_TO_AIRALARM "to_airalarm" -#define RADIO_FROM_AIRALARM "from_airalarm" -#define RADIO_SIGNALER "signaler" -#define RADIO_ATMOSIA "atmosia" -#define RADIO_NAVBEACONS "navbeacons" -#define RADIO_AIRLOCK "airlock" -#define RADIO_MAGNETS "magnets" - -#define DEFAULT_SIGNALER_CODE 30 +// Radios use a large variety of predefined frequencies. + +#define MIN_FREE_FREQ 1201 // ------------------------------------------------- +// Frequencies are always odd numbers and range from 1201 to 1599. + +#define FREQ_SYNDICATE 1213 // Nuke op comms frequency, dark brown +#define FREQ_CTF_RED 1215 // CTF red team comms frequency, red +#define FREQ_CTF_BLUE 1217 // CTF blue team comms frequency, blue +#define FREQ_CENTCOM 1337 // CentCom comms frequency, gray +#define FREQ_SUPPLY 1347 // Supply comms frequency, light brown +#define FREQ_SERVICE 1349 // Service comms frequency, green +#define FREQ_SCIENCE 1351 // Science comms frequency, plum +#define FREQ_COMMAND 1353 // Command comms frequency, gold +#define FREQ_MEDICAL 1355 // Medical comms frequency, soft blue +#define FREQ_ENGINEERING 1357 // Engineering comms frequency, orange +#define FREQ_SECURITY 1359 // Security comms frequency, red + +#define FREQ_STATUS_DISPLAYS 1435 +#define FREQ_ATMOS_ALARMS 1437 // air alarms <-> alert computers +#define FREQ_ATMOS_CONTROL 1439 // air alarms <-> vents and scrubbers + +#define MIN_FREQ 1441 // ------------------------------------------------------ +// Only the 1441 to 1489 range is freely available for general conversation. +// This represents 1/8th of the available spectrum. + +#define FREQ_ATMOS_STORAGE 1441 +#define FREQ_NAV_BEACON 1445 +#define FREQ_AI_PRIVATE 1447 // AI private comms frequency, magenta +#define FREQ_PRESSURE_PLATE 1447 +#define FREQ_AIRLOCK_CONTROL 1449 +#define FREQ_ELECTROPACK 1449 +#define FREQ_MAGNETS 1449 +#define FREQ_LOCATOR_IMPLANT 1451 +#define FREQ_SIGNALER 1457 // the default for new signalers +#define FREQ_COMMON 1459 // Common comms frequency, dark green + +#define MAX_FREQ 1489 // ------------------------------------------------------ + +#define MAX_FREE_FREQ 1599 // ------------------------------------------------- + +// Transmission types. +#define TRANSMISSION_WIRE 0 // some sort of wired connection, not used +#define TRANSMISSION_RADIO 1 // electromagnetic radiation (default) +#define TRANSMISSION_SUBSPACE 2 // subspace transmission (headsets only) +#define TRANSMISSION_SUPERSPACE 3 // reaches independent (CentCom) radios only + +// Filter types, used as an optimization to avoid unnecessary proc calls. +#define RADIO_TO_AIRALARM "to_airalarm" +#define RADIO_FROM_AIRALARM "from_airalarm" +#define RADIO_SIGNALER "signaler" +#define RADIO_ATMOSIA "atmosia" +#define RADIO_AIRLOCK "airlock" +#define RADIO_MAGNETS "magnets" + +#define DEFAULT_SIGNALER_CODE 30 diff --git a/code/__DEFINES/shuttles.dm b/code/__DEFINES/shuttles.dm index e3f1731a13..306f316aa5 100644 --- a/code/__DEFINES/shuttles.dm +++ b/code/__DEFINES/shuttles.dm @@ -31,11 +31,9 @@ // Ripples, effects that signal a shuttle's arrival #define SHUTTLE_RIPPLE_TIME 100 -#define SHUTTLE_RIPPLE_FADEIN 50 #define TRANSIT_REQUEST 1 #define TRANSIT_READY 2 -#define TRANSIT_FULL 3 #define SHUTTLE_TRANSIT_BORDER 8 @@ -79,4 +77,4 @@ #define SHUTTLE_DEFAULT_TURF_TYPE /turf/open/space #define SHUTTLE_DEFAULT_BASETURF_TYPE /turf/open/space #define SHUTTLE_DEFAULT_SHUTTLE_AREA_TYPE /area/shuttle -#define SHUTTLE_DEFAULT_UNDERLYING_AREA /area/space \ No newline at end of file +#define SHUTTLE_DEFAULT_UNDERLYING_AREA /area/space diff --git a/code/__DEFINES/sight.dm b/code/__DEFINES/sight.dm index d756cbaf1b..cfce95a65f 100644 --- a/code/__DEFINES/sight.dm +++ b/code/__DEFINES/sight.dm @@ -1,30 +1,30 @@ -#define SEE_INVISIBLE_MINIMUM 5 - -#define INVISIBILITY_LIGHTING 20 - -#define SEE_INVISIBLE_LIVING 25 - -#define SEE_INVISIBLE_LEVEL_ONE 35 //currently unused -#define INVISIBILITY_LEVEL_ONE 35 //currently unused - -#define SEE_INVISIBLE_LEVEL_TWO 45 //currently unused -#define INVISIBILITY_LEVEL_TWO 45 //currently unused - -#define INVISIBILITY_OBSERVER 60 -#define SEE_INVISIBLE_OBSERVER 60 - -#define INVISIBILITY_MAXIMUM 100 //the maximum allowed for "real" objects - -#define INVISIBILITY_ABSTRACT 101 //only used for abstract objects (e.g. spacevine_controller), things that are not really there. - -#define BORGMESON 1 -#define BORGTHERM 2 -#define BORGXRAY 4 -#define BORGMATERIAL 8 - -//for clothing visor toggles, these determine which vars to toggle -#define VISOR_FLASHPROTECT 1 -#define VISOR_TINT 2 -#define VISOR_VISIONFLAGS 4 //all following flags only matter for glasses -#define VISOR_DARKNESSVIEW 8 -#define VISOR_INVISVIEW 16 +#define SEE_INVISIBLE_MINIMUM 5 + +#define INVISIBILITY_LIGHTING 20 + +#define SEE_INVISIBLE_LIVING 25 + +//#define SEE_INVISIBLE_LEVEL_ONE 35 //currently unused +//#define INVISIBILITY_LEVEL_ONE 35 //currently unused + +//#define SEE_INVISIBLE_LEVEL_TWO 45 //currently unused +//#define INVISIBILITY_LEVEL_TWO 45 //currently unused + +#define INVISIBILITY_OBSERVER 60 +#define SEE_INVISIBLE_OBSERVER 60 + +#define INVISIBILITY_MAXIMUM 100 //the maximum allowed for "real" objects + +#define INVISIBILITY_ABSTRACT 101 //only used for abstract objects (e.g. spacevine_controller), things that are not really there. + +#define BORGMESON 1 +#define BORGTHERM 2 +#define BORGXRAY 4 +#define BORGMATERIAL 8 + +//for clothing visor toggles, these determine which vars to toggle +#define VISOR_FLASHPROTECT 1 +#define VISOR_TINT 2 +#define VISOR_VISIONFLAGS 4 //all following flags only matter for glasses +#define VISOR_DARKNESSVIEW 8 +#define VISOR_INVISVIEW 16 diff --git a/code/__DEFINES/stat.dm b/code/__DEFINES/stat.dm index 96c72bcab2..d9d98219aa 100644 --- a/code/__DEFINES/stat.dm +++ b/code/__DEFINES/stat.dm @@ -15,6 +15,5 @@ #define EMPED 8 // temporary broken by EMP pulse //ai power requirement defines -#define POWER_REQ_NONE 0 #define POWER_REQ_ALL 1 #define POWER_REQ_CLOCKCULT 2 diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index ea29e956b6..dc321bf63d 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -7,8 +7,6 @@ #define STATUS_EFFECT_REPLACE 2 //if it allows only one, but new instances replace -#define BASIC_STATUS_EFFECT /datum/status_effect //Has no effect. - /////////// // BUFFS // /////////// diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 3484389a65..a31ec4f037 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -920,7 +920,7 @@ GLOBAL_LIST_INIT(WALLITEMS_INVERSE, typecacheof(list( That said, this proc should not be used if the change facing proc of the click code is overriden at the same time*/ if(!ismob(target) || target.lying) //Make sure we are not doing this for things that can't have a logical direction to the players given that the target would be on their side - return FACING_FAILED + return FALSE if(initator.dir == target.dir) //mobs are facing the same direction return FACING_SAME_DIR if(is_A_facing_B(initator,target) && is_A_facing_B(target,initator)) //mobs are facing each other diff --git a/code/_globalvars/lists/poll_ignore.dm b/code/_globalvars/lists/poll_ignore.dm index f88c4aab85..a2cba4e08f 100644 --- a/code/_globalvars/lists/poll_ignore.dm +++ b/code/_globalvars/lists/poll_ignore.dm @@ -1,10 +1,8 @@ //Each lists stores ckeys for "Never for this round" option category -#define POLL_IGNORE_PAI "pai" #define POLL_IGNORE_SENTIENCE_POTION "sentience_potion" #define POLL_IGNORE_POSSESSED_BLADE "possessed_blade" #define POLL_IGNORE_ALIEN_LARVA "alien_larva" -#define POLL_IGNORE_CLOCKWORK_MARAUDER "clockwork_marauder" #define POLL_IGNORE_SYNDICATE "syndicate" #define POLL_IGNORE_HOLOPARASITE "holoparasite" diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 6d941589d3..4ce615dd01 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -66,7 +66,7 @@ #define ui_monkey_neck "CENTER-3:15,SOUTH:5" //monkey #define ui_monkey_back "CENTER-2:16,SOUTH:5" //monkey -#define ui_alien_storage_l "CENTER-2:14,SOUTH:5"//alien +//#define ui_alien_storage_l "CENTER-2:14,SOUTH:5"//alien #define ui_alien_storage_r "CENTER+1:18,SOUTH:5"//alien #define ui_alien_language_menu "EAST-3:26,SOUTH:5" //alien diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index 87354d6f0b..ce07b7ebb2 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -10,6 +10,8 @@ By default, emulate the user's unarmed attack */ +#define TK_MAXRANGE 15 + /atom/proc/attack_tk(mob/user) if(user.stat || !tkMaxRangeCheck(user, src)) return @@ -188,3 +190,6 @@ /obj/item/tk_grab/suicide_act(mob/user) user.visible_message("[user] is using [user.p_their()] telekinesis to choke [user.p_them()]self! It looks like [user.p_theyre()] trying to commit suicide!") return (OXYLOSS) + + +#undef TK_MAXRANGE diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 264f773b89..bce12597ab 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -26,7 +26,6 @@ Possible to do for anyone motivated enough: #define HOLOPAD_PASSIVE_POWER_USAGE 1 #define HOLOGRAM_POWER_USAGE 2 -#define HOLOPAD_MODE RANGE_BASED /obj/machinery/holopad name = "holopad" diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index da1f941ccc..bcd597424d 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -269,9 +269,6 @@ if(TURF_WET_PERMAFROST) intensity = 120 lube_flags = SLIDE_ICE | GALOSHES_DONT_HELP - if(TURF_WET_SLIDE) - intensity = 80 - lube_flags = SLIDE | GALOSHES_DONT_HELP else qdel(GetComponent(/datum/component/slippery)) return diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index 2414c55528..c915816ed0 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -42,9 +42,6 @@ GLOBAL_PROTECT(admin_ranks) /datum/admin_rank/vv_edit_var(var_name, var_value) return FALSE -#if DM_VERSION > 512 -#error remove the rejuv keyword from this proc -#endif /proc/admin_keyword_to_flag(word, previous_rights=0) var/flag = 0 switch(ckey(word)) @@ -80,9 +77,6 @@ GLOBAL_PROTECT(admin_ranks) flag = R_AUTOLOGIN if("@","prev") flag = previous_rights - if("rejuv","rejuvinate") - stack_trace("Legacy keyword rejuvinate used defaulting to R_ADMIN") - flag = R_ADMIN return flag /proc/admin_keyword_to_path(word) //use this with verb keywords eg +/client/proc/blah diff --git a/code/modules/antagonists/cult/cult_comms.dm b/code/modules/antagonists/cult/cult_comms.dm index 961f071b02..308cd38c80 100644 --- a/code/modules/antagonists/cult/cult_comms.dm +++ b/code/modules/antagonists/cult/cult_comms.dm @@ -1,5 +1,4 @@ // Contains cult communion, guide, and cult master abilities -#define MARK_COOLDOWN /datum/action/innate/cult icon_icon = 'icons/mob/actions/actions_cult.dmi' diff --git a/code/modules/error_handler/error_handler.dm b/code/modules/error_handler/error_handler.dm index 91b004e0e0..304ddce7eb 100644 --- a/code/modules/error_handler/error_handler.dm +++ b/code/modules/error_handler/error_handler.dm @@ -2,6 +2,9 @@ GLOBAL_VAR_INIT(total_runtimes, GLOB.total_runtimes || 0) GLOBAL_VAR_INIT(total_runtimes_skipped, 0) #ifdef DEBUG + +#define ERROR_USEFUL_LEN 2 + /world/Error(exception/E, datum/e_src) GLOB.total_runtimes++ diff --git a/code/modules/fields/turf_objects.dm b/code/modules/fields/turf_objects.dm index edb1a6ce6b..7d7454f46a 100644 --- a/code/modules/fields/turf_objects.dm +++ b/code/modules/fields/turf_objects.dm @@ -74,4 +74,4 @@ return FIELD_EDGE if(O.parent == F) return FIELD_TURF - return NO_FIELD + return FALSE diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index d47d68bf8b..5e4db79e89 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -20,6 +20,22 @@ #define COLD_GAS_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when the current breath's temperature passes the 200K point #define COLD_GAS_DAMAGE_LEVEL_3 3 //Amount of damage applied when the current breath's temperature passes the 120K point +// bitflags for the percentual amount of protection a piece of clothing which covers the body part offers. +// Used with human/proc/get_heat_protection() and human/proc/get_cold_protection() +// The values here should add up to 1. +// Hands and feet have 2.5%, arms and legs 7.5%, each of the torso parts has 15% and the head has 30% +#define THERMAL_PROTECTION_HEAD 0.3 +#define THERMAL_PROTECTION_CHEST 0.15 +#define THERMAL_PROTECTION_GROIN 0.15 +#define THERMAL_PROTECTION_LEG_LEFT 0.075 +#define THERMAL_PROTECTION_LEG_RIGHT 0.075 +#define THERMAL_PROTECTION_FOOT_LEFT 0.025 +#define THERMAL_PROTECTION_FOOT_RIGHT 0.025 +#define THERMAL_PROTECTION_ARM_LEFT 0.075 +#define THERMAL_PROTECTION_ARM_RIGHT 0.075 +#define THERMAL_PROTECTION_HAND_LEFT 0.025 +#define THERMAL_PROTECTION_HAND_RIGHT 0.025 + /mob/living/carbon/human/Life() set invisibility = 0 if (notransform) @@ -424,3 +440,14 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put adjustToxLoss(4) //Let's be honest you shouldn't be alive by now #undef HUMAN_MAX_OXYLOSS +#undef THERMAL_PROTECTION_HEAD +#undef THERMAL_PROTECTION_CHEST +#undef THERMAL_PROTECTION_GROIN +#undef THERMAL_PROTECTION_LEG_LEFT +#undef THERMAL_PROTECTION_LEG_RIGHT +#undef THERMAL_PROTECTION_FOOT_LEFT +#undef THERMAL_PROTECTION_FOOT_RIGHT +#undef THERMAL_PROTECTION_ARM_LEFT +#undef THERMAL_PROTECTION_ARM_RIGHT +#undef THERMAL_PROTECTION_HAND_LEFT +#undef THERMAL_PROTECTION_HAND_RIGHT \ No newline at end of file diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm index 32b368db4f..79c9613906 100644 --- a/code/modules/mob/living/carbon/monkey/combat.dm +++ b/code/modules/mob/living/carbon/monkey/combat.dm @@ -1,3 +1,4 @@ +#define MAX_RANGE_FIND 32 /mob/living/carbon/monkey var/aggressive=0 // set to 1 using VV for an angry monkey @@ -475,3 +476,5 @@ if(A) dropItemToGround(A, TRUE) update_icons() + +#undef MAX_RANGE_FIND diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index 97034d389c..ae95a317a3 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -50,7 +50,7 @@ var/turf/T = get_turf(src) var/area/A = get_area(src) switch(requires_power) - if(POWER_REQ_NONE) + if(NONE) return FALSE if(POWER_REQ_ALL) return !T || !A || ((!A.power_equip || isspaceturf(T)) && !is_type_in_list(loc, list(/obj/item, /obj/mecha))) diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm index b55fa2a663..75f0fb5e81 100644 --- a/code/modules/mob/living/silicon/ai/say.dm +++ b/code/modules/mob/living/silicon/ai/say.dm @@ -154,6 +154,7 @@ return 1 return 0 +#undef VOX_DELAY #endif /mob/living/silicon/ai/could_speak_in_language(datum/language/dt) diff --git a/code/modules/ninja/__ninjaDefines.dm b/code/modules/ninja/__ninjaDefines.dm index 352087f4e8..1a3e9dce63 100644 --- a/code/modules/ninja/__ninjaDefines.dm +++ b/code/modules/ninja/__ninjaDefines.dm @@ -18,7 +18,6 @@ Contents: #define INVALID_DRAIN "INVALID" //This one is if the drain proc needs to cancel, eg missing variables, etc, it's important. -#define DRAIN_RD_HACKED "RDHACK" #define DRAIN_RD_HACK_FAILED "RDHACKFAIL" #define DRAIN_MOB_SHOCK "MOBSHOCK" #define DRAIN_MOB_SHOCK_FAILED "MOBSHOCKFAIL" \ No newline at end of file diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 45149d1346..d160209e0c 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -18,6 +18,11 @@ field_generator power level display #define FG_CHARGING 1 #define FG_ONLINE 2 +//field generator construction defines +#define FG_UNSECURED 0 +#define FG_SECURED 1 +#define FG_WELDED 2 + /obj/machinery/field/generator name = "field generator" desc = "A large thermal battery that projects a high amount of energy when powered." diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index 5c463b4ee9..d01a331364 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -81,14 +81,8 @@ #define COMPFRICTION 5e5 -#define COMPSTARTERLOAD 2800 -// Crucial to make things work!!!! -// OLD FIX - explanation given down below. -// /obj/machinery/power/compressor/CanPass(atom/movable/mover, turf/target) -// return !density - /obj/machinery/power/compressor/locate_machinery() if(turbine) return @@ -169,7 +163,6 @@ // These are crucial to working of a turbine - the stats modify the power output. TurbGenQ modifies how much raw energy can you get from // rpms, TurbGenG modifies the shape of the curve - the lower the value the less straight the curve is. -#define TURBPRES 9000000 #define TURBGENQ 100000 #define TURBGENG 0.5 @@ -370,3 +363,7 @@ if("reconnect") locate_machinery() . = TRUE + +#undef COMPFRICTION +#undef TURBGENQ +#undef TURBGENG \ No newline at end of file diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index a1de4db477..0a2503fd5d 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -27,7 +27,7 @@ var/obj/item/ammo_casing/chambered = null trigger_guard = TRIGGER_GUARD_NORMAL //trigger guard on the weapon, hulks can't fire them with their big meaty fingers var/sawn_desc = null //description change if weapon is sawn-off - var/sawn_state = SAWN_INTACT + var/sawn_off = FALSE var/burst_size = 1 //how large a burst is var/fire_delay = 0 //rate of fire for burst firing and semi auto var/firing_burst = 0 //Prevent the weapon from firing again while already firing diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index c16c5f0fc0..f7cb05486f 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -21,9 +21,9 @@ /obj/item/gun/ballistic/update_icon() ..() if(current_skin) - icon_state = "[unique_reskin[current_skin]][suppressed ? "-suppressed" : ""][sawn_state ? "-sawn" : ""]" + icon_state = "[unique_reskin[current_skin]][suppressed ? "-suppressed" : ""][sawn_off ? "-sawn" : ""]" else - icon_state = "[initial(icon_state)][suppressed ? "-suppressed" : ""][sawn_state ? "-sawn" : ""]" + icon_state = "[initial(icon_state)][suppressed ? "-suppressed" : ""][sawn_off ? "-sawn" : ""]" /obj/item/gun/ballistic/process_chamber(empty_chamber = 1) @@ -185,7 +185,7 @@ /obj/item/gun/ballistic/proc/sawoff(mob/user) - if(sawn_state == SAWN_OFF) + if(sawn_off) to_chat(user, "\The [src] is already shortened!") return user.changeNext_move(CLICK_CD_MELEE) @@ -197,7 +197,7 @@ return if(do_after(user, 30, target = src)) - if(sawn_state == SAWN_OFF) + if(sawn_off) return user.visible_message("[user] shortens \the [src]!", "You shorten \the [src].") name = "sawn-off [src.name]" @@ -206,7 +206,7 @@ item_state = "gun" slot_flags &= ~SLOT_BACK //you can't sling it on your back slot_flags |= SLOT_BELT //but you can wear it on your belt (poorly concealed under a trenchcoat, ideally) - sawn_state = SAWN_OFF + sawn_off = TRUE update_icon() return 1 diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index 14e529ba23..489f88ffad 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -311,7 +311,7 @@ /obj/item/gun/ballistic/revolver/doublebarrel/improvised/attackby(obj/item/A, mob/user, params) ..() - if(istype(A, /obj/item/stack/cable_coil) && !sawn_state) + if(istype(A, /obj/item/stack/cable_coil) && !sawn_off) var/obj/item/stack/cable_coil/C = A if(C.use(10)) slot_flags = SLOT_BACK @@ -339,7 +339,7 @@ icon_state = "ishotgun" item_state = "gun" w_class = WEIGHT_CLASS_NORMAL - sawn_state = SAWN_OFF + sawn_off = TRUE slot_flags = SLOT_BELT From df11e970f7aec3d1d485655bc4b48e61354cf85a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 5 Mar 2018 13:23:30 -0600 Subject: [PATCH 17/45] Automatic changelog generation for PR #5788 [ci skip] --- html/changelogs/AutoChangeLog-pr-5788.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5788.yml diff --git a/html/changelogs/AutoChangeLog-pr-5788.yml b/html/changelogs/AutoChangeLog-pr-5788.yml new file mode 100644 index 0000000000..2f5d1bdd2d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5788.yml @@ -0,0 +1,4 @@ +author: "Naksu" +delete-after: True +changes: + - code_imp: "First pass on cleaning up junk defines and unused code" From 214e008e3dd06531fd08cbfafb827c7a1323005f Mon Sep 17 00:00:00 2001 From: Poojawa Date: Mon, 5 Mar 2018 13:25:01 -0600 Subject: [PATCH 18/45] cleans out AutoChangeLogs, good christ --- html/changelogs/AutoChangeLog-pr-5323.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5374.yml | 6 ------ html/changelogs/AutoChangeLog-pr-5377.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5378.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5379.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5384.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5385.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5386.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5387.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5388.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5389.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5390.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5391.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5397.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5398.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5399.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5400.yml | 6 ------ html/changelogs/AutoChangeLog-pr-5404.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5405.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5408.yml | 7 ------- html/changelogs/AutoChangeLog-pr-5409.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5410.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5412.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5414.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5415.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5416.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5419.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5420.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5421.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5422.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5423.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5427.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5428.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5432.yml | 7 ------- html/changelogs/AutoChangeLog-pr-5433.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5434.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5438.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5440.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5442.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5445.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5447.yml | 16 ---------------- html/changelogs/AutoChangeLog-pr-5451.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5453.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5456.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5464.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5465.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5467.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5469.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5470.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5473.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5477.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5478.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5484.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5485.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5490.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5493.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5495.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5496.yml | 6 ------ html/changelogs/AutoChangeLog-pr-5505.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5506.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5508.yml | 7 ------- html/changelogs/AutoChangeLog-pr-5509.yml | 6 ------ html/changelogs/AutoChangeLog-pr-5512.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5515.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5517.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5518.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5522.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5525.yml | 7 ------- html/changelogs/AutoChangeLog-pr-5527.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5532.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5534.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5535.yml | 6 ------ html/changelogs/AutoChangeLog-pr-5538.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5539.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5540.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5542.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5546.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5547.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5548.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5549.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5550.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5554.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5555.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5558.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5563.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5566.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5567.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5568.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5571.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5576.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5577.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5580.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5582.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5586.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5590.yml | 8 -------- html/changelogs/AutoChangeLog-pr-5592.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5595.yml | 8 -------- html/changelogs/AutoChangeLog-pr-5596.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5597.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5604.yml | 10 ---------- html/changelogs/AutoChangeLog-pr-5606.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5607.yml | 7 ------- html/changelogs/AutoChangeLog-pr-5608.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5609.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5610.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5611.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5612.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5613.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5615.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5616.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5617.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5618.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5619.yml | 8 -------- html/changelogs/AutoChangeLog-pr-5623.yml | 6 ------ html/changelogs/AutoChangeLog-pr-5630.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5633.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5634.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5635.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5636.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5638.yml | 6 ------ html/changelogs/AutoChangeLog-pr-5640.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5641.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5642.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5645.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5647.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5648.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5649.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5650.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5651.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5653.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5657.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5658.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5659.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5660.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5661.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5662.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5663.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5666.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5668.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5669.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5670.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5672.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5673.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5674.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5680.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5681.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5684.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5687.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5689.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5696.yml | 7 ------- html/changelogs/AutoChangeLog-pr-5697.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5698.yml | 6 ------ html/changelogs/AutoChangeLog-pr-5701.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5702.yml | 9 --------- html/changelogs/AutoChangeLog-pr-5703.yml | 7 ------- html/changelogs/AutoChangeLog-pr-5704.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5705.yml | 7 ------- html/changelogs/AutoChangeLog-pr-5707.yml | 6 ------ html/changelogs/AutoChangeLog-pr-5711.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5713.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5714.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5717.yml | 6 ------ html/changelogs/AutoChangeLog-pr-5719.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5720.yml | 6 ------ html/changelogs/AutoChangeLog-pr-5723.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5725.yml | 10 ---------- html/changelogs/AutoChangeLog-pr-5726.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5727.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5729.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5730.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5733.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5734.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5738.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5740.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5741.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5742.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5746.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5748.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5749.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5750.yml | 7 ------- html/changelogs/AutoChangeLog-pr-5751.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5753.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5758.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5760.yml | 8 -------- html/changelogs/AutoChangeLog-pr-5764.yml | 10 ---------- html/changelogs/AutoChangeLog-pr-5765.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5767.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5771.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5772.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5775.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5777.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5781.yml | 6 ------ html/changelogs/AutoChangeLog-pr-5783.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5785.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5786.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5792.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5794.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5797.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5798.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5799.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5801.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5802.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5808.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5811.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5813.yml | 4 ---- 205 files changed, 954 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-5323.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5374.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5377.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5378.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5379.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5384.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5385.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5386.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5387.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5388.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5389.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5390.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5391.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5397.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5398.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5399.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5400.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5404.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5405.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5408.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5409.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5410.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5412.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5414.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5415.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5416.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5419.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5420.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5421.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5422.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5423.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5427.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5428.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5432.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5433.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5434.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5438.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5440.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5442.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5445.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5447.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5451.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5453.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5456.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5464.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5465.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5467.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5469.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5470.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5473.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5477.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5478.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5484.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5485.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5490.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5493.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5495.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5496.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5505.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5506.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5508.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5509.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5512.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5515.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5517.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5518.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5522.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5525.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5527.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5532.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5534.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5535.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5538.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5539.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5540.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5542.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5546.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5547.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5548.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5549.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5550.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5554.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5555.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5558.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5563.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5566.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5567.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5568.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5571.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5576.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5577.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5580.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5582.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5586.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5590.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5592.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5595.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5596.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5597.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5604.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5606.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5607.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5608.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5609.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5610.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5611.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5612.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5613.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5615.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5616.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5617.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5618.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5619.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5623.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5630.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5633.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5634.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5635.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5636.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5638.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5640.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5641.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5642.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5645.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5647.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5648.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5649.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5650.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5651.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5653.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5657.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5658.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5659.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5660.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5661.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5662.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5663.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5666.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5668.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5669.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5670.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5672.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5673.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5674.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5680.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5681.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5684.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5687.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5689.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5696.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5697.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5698.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5701.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5702.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5703.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5704.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5705.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5707.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5711.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5713.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5714.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5717.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5719.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5720.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5723.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5725.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5726.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5727.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5729.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5730.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5733.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5734.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5738.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5740.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5741.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5742.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5746.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5748.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5749.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5750.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5751.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5753.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5758.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5760.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5764.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5765.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5767.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5771.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5772.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5775.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5777.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5781.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5783.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5785.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5786.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5792.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5794.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5797.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5798.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5799.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5801.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5802.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5808.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5811.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5813.yml diff --git a/html/changelogs/AutoChangeLog-pr-5323.yml b/html/changelogs/AutoChangeLog-pr-5323.yml deleted file mode 100644 index 82ae6c925b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5323.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Raeschen" -delete-after: True -changes: - - tweak: "Changed/removed some miscreant objectives" diff --git a/html/changelogs/AutoChangeLog-pr-5374.yml b/html/changelogs/AutoChangeLog-pr-5374.yml deleted file mode 100644 index 82a54f6df9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5374.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Dax Dupont" -delete-after: True -changes: - - bugfix: "Telecom equipment now can only be printed by engineers and scientists as intended." - - bugfix: "WT-550 AP can only be printed by sec now." - - tweak: "Removed engineering requirement for arcade machines to bring it in line with others." diff --git a/html/changelogs/AutoChangeLog-pr-5377.yml b/html/changelogs/AutoChangeLog-pr-5377.yml deleted file mode 100644 index 349cd33be9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5377.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - bugfix: "Cyborg engineering module geiger counters now work properly again" diff --git a/html/changelogs/AutoChangeLog-pr-5378.yml b/html/changelogs/AutoChangeLog-pr-5378.yml deleted file mode 100644 index 39ee297c68..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5378.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Improvedname, Toriate" -delete-after: True -changes: - - rscadd: "Adds carrot satchel" diff --git a/html/changelogs/AutoChangeLog-pr-5379.yml b/html/changelogs/AutoChangeLog-pr-5379.yml deleted file mode 100644 index 2c634bd925..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5379.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - rscadd: "As it would happen, the chef does not actually have Italian genes, but rather was being influenced by a strange moustache-a." diff --git a/html/changelogs/AutoChangeLog-pr-5384.yml b/html/changelogs/AutoChangeLog-pr-5384.yml deleted file mode 100644 index 76a838dbe5..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5384.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "deathride58" -delete-after: True -changes: - - tweak: "Input boxes for emotes are now larger. Check it out with the *subtle and *custom commands. This also applies to the M hotkey." diff --git a/html/changelogs/AutoChangeLog-pr-5385.yml b/html/changelogs/AutoChangeLog-pr-5385.yml deleted file mode 100644 index 3cb16e227b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5385.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Denton" -delete-after: True -changes: - - code_imp: "Removes grind_results from empty soda cans since they can't be ground." diff --git a/html/changelogs/AutoChangeLog-pr-5386.yml b/html/changelogs/AutoChangeLog-pr-5386.yml deleted file mode 100644 index bd2fed8838..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5386.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Denton" -delete-after: True -changes: - - spellcheck: "For consistency's sake, aluminium is now universally spelled with two 'i'." diff --git a/html/changelogs/AutoChangeLog-pr-5387.yml b/html/changelogs/AutoChangeLog-pr-5387.yml deleted file mode 100644 index d7abf266c6..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5387.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Dax Dupont" -delete-after: True -changes: - - rscadd: "Defibs can now be researched and printed." diff --git a/html/changelogs/AutoChangeLog-pr-5388.yml b/html/changelogs/AutoChangeLog-pr-5388.yml deleted file mode 100644 index 31f18743c6..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5388.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Denton" -delete-after: True -changes: - - code_imp: "Changed can_synth values from 0/1 to FALSE/TRUE" diff --git a/html/changelogs/AutoChangeLog-pr-5389.yml b/html/changelogs/AutoChangeLog-pr-5389.yml deleted file mode 100644 index 884319e080..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5389.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "Goliath hide plates now properly apply to explorer suits and APLUs again." diff --git a/html/changelogs/AutoChangeLog-pr-5390.yml b/html/changelogs/AutoChangeLog-pr-5390.yml deleted file mode 100644 index 8cb9140c3e..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5390.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - balance: "Printed power cells must now be charged before use" diff --git a/html/changelogs/AutoChangeLog-pr-5391.yml b/html/changelogs/AutoChangeLog-pr-5391.yml deleted file mode 100644 index 497af33fd9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5391.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Dax Dupont" -delete-after: True -changes: - - balance: "Hatches are now small instead of tiny." diff --git a/html/changelogs/AutoChangeLog-pr-5397.yml b/html/changelogs/AutoChangeLog-pr-5397.yml deleted file mode 100644 index 42ac36f460..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5397.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Robustin" -delete-after: True -changes: - - bugfix: "Fixed the limb grower having a max volume of 0." diff --git a/html/changelogs/AutoChangeLog-pr-5398.yml b/html/changelogs/AutoChangeLog-pr-5398.yml deleted file mode 100644 index 23246095b9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5398.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - bugfix: "The preference to lock action buttons in place is now correctly saved across rounds." diff --git a/html/changelogs/AutoChangeLog-pr-5399.yml b/html/changelogs/AutoChangeLog-pr-5399.yml deleted file mode 100644 index f31125b6e0..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5399.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ordo" -delete-after: True -changes: - - tweak: "Replaced nitrogen with ethanol in morphine recipe. The recipe now has a lower yield." diff --git a/html/changelogs/AutoChangeLog-pr-5400.yml b/html/changelogs/AutoChangeLog-pr-5400.yml deleted file mode 100644 index 007a5dbb1f..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5400.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "UI Changes" -delete-after: True -changes: - - tweak: "The Scan with Debugger/Device button now reads Copy Ref and no longer sends you to the circuit's page when clicked" - - tweak: "The assembly's menu is now slightly wider" - - tweak: "The advanced in \"integrated advanced medical analyser\" is now abbreviated to adv." diff --git a/html/changelogs/AutoChangeLog-pr-5404.yml b/html/changelogs/AutoChangeLog-pr-5404.yml deleted file mode 100644 index 738d191bf6..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5404.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - balance: "Changed the chemical recipe for Lexorin from plasma, hydrogen, and nitrogen to plasma, hydrogen, and oxygen." - - bugfix: "These were necessary due to recipe conflicts" diff --git a/html/changelogs/AutoChangeLog-pr-5405.yml b/html/changelogs/AutoChangeLog-pr-5405.yml deleted file mode 100644 index 4684cf09d4..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5405.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Dax Dupont" -delete-after: True -changes: - - bugfix: "Cloner UI now properly updates cloning pod status when autocloning starts cloning someone." diff --git a/html/changelogs/AutoChangeLog-pr-5408.yml b/html/changelogs/AutoChangeLog-pr-5408.yml deleted file mode 100644 index ea9647b343..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5408.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Toriate" -delete-after: True -changes: - - rscadd: "Added magnetic weapons to techwebs nodes" - - tweak: "Magrifle magazine now has 24-round capacity, magpistol has 14-round capacity" - - balance: "rebalanced magrifle projectiles to deal more damage overall on a full burst, but less individually" - - bugfix: "fixed broken sprites for magrifles" diff --git a/html/changelogs/AutoChangeLog-pr-5409.yml b/html/changelogs/AutoChangeLog-pr-5409.yml deleted file mode 100644 index 9cadfc27f2..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5409.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ShizCalev" -delete-after: True -changes: - - bugfix: "Corrected a number of missing checks when using alt-click actions. Please report any strange behavior to a coder." diff --git a/html/changelogs/AutoChangeLog-pr-5410.yml b/html/changelogs/AutoChangeLog-pr-5410.yml deleted file mode 100644 index f2ee8ca86e..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5410.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Dax Dupont" -delete-after: True -changes: - - balance: "Grabbers/throwers no longer can contain/throw things equal to the assembly size." diff --git a/html/changelogs/AutoChangeLog-pr-5412.yml b/html/changelogs/AutoChangeLog-pr-5412.yml deleted file mode 100644 index 4575638349..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5412.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Mokiros" -delete-after: True -changes: - - rscadd: "All-In-One Grinder can now be built with researchable curcuit and micro-manipulator." diff --git a/html/changelogs/AutoChangeLog-pr-5414.yml b/html/changelogs/AutoChangeLog-pr-5414.yml deleted file mode 100644 index 8c582750a5..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5414.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - rscadd: "You can now smelt titanium glass and plastitanium glass" - - rscadd: "Use titanium glass and plastitanium glass to build shuttle windows and plastitanium windows" diff --git a/html/changelogs/AutoChangeLog-pr-5415.yml b/html/changelogs/AutoChangeLog-pr-5415.yml deleted file mode 100644 index 655fb49afe..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5415.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kor" -delete-after: True -changes: - - rscadd: "Mining sentience upgrades now grant minebots an ID and radio." diff --git a/html/changelogs/AutoChangeLog-pr-5416.yml b/html/changelogs/AutoChangeLog-pr-5416.yml deleted file mode 100644 index 984d50ea2d..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5416.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "More Robust Than You, Basilman, and MMMiracles" -delete-after: True -changes: - - rscadd: "Deep in space, a valuable artifact awaits" diff --git a/html/changelogs/AutoChangeLog-pr-5419.yml b/html/changelogs/AutoChangeLog-pr-5419.yml deleted file mode 100644 index a5d05ffa00..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5419.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - rscdel: "Steam engines have been removed from maintenance, engineering, atmos and teleportation areas." diff --git a/html/changelogs/AutoChangeLog-pr-5420.yml b/html/changelogs/AutoChangeLog-pr-5420.yml deleted file mode 100644 index 821c60f3b4..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5420.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Dax Dupont" -delete-after: True -changes: - - bugfix: "Fixes duplicate air alarm on meta." diff --git a/html/changelogs/AutoChangeLog-pr-5421.yml b/html/changelogs/AutoChangeLog-pr-5421.yml deleted file mode 100644 index 1e4b3c7f9e..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5421.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "Prevents megafauna (and other large things like spiders and mulebots) from going into machines" diff --git a/html/changelogs/AutoChangeLog-pr-5422.yml b/html/changelogs/AutoChangeLog-pr-5422.yml deleted file mode 100644 index a004909230..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5422.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ShizCalev" -delete-after: True -changes: - - spellcheck: "Corrected typo in NTNet Scanner circuits' name, make sure to update your blueprints." diff --git a/html/changelogs/AutoChangeLog-pr-5423.yml b/html/changelogs/AutoChangeLog-pr-5423.yml deleted file mode 100644 index a52ec62ade..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5423.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - admin: "The notify irc/discord bot chat command no longer requires admin privileges." diff --git a/html/changelogs/AutoChangeLog-pr-5427.yml b/html/changelogs/AutoChangeLog-pr-5427.yml deleted file mode 100644 index c94a419a29..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5427.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - rscadd: "The chef is now trained for working under siege" diff --git a/html/changelogs/AutoChangeLog-pr-5428.yml b/html/changelogs/AutoChangeLog-pr-5428.yml deleted file mode 100644 index 25cfb0aa6d..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5428.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "More Robust Than You" -delete-after: True -changes: - - rscadd: "You can now squish urinal cakes" diff --git a/html/changelogs/AutoChangeLog-pr-5432.yml b/html/changelogs/AutoChangeLog-pr-5432.yml deleted file mode 100644 index 7d159a3c40..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5432.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "RealDonaldTrump" -delete-after: True -changes: - - rscadd: "Added a QM Command Headset and Encryption key" - - tweak: "Removed the HoP's Cargo access and supply comms access." - - tweak: "The QM is immune to revolutionaries now and must be murdered, as a head of staff." - - rscdel: "Removed QM access from Shaft Miners and Cargo Techs during skeleton shifts." diff --git a/html/changelogs/AutoChangeLog-pr-5433.yml b/html/changelogs/AutoChangeLog-pr-5433.yml deleted file mode 100644 index 1fe9d351c7..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5433.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "More Robust Than You" -delete-after: True -changes: - - bugfix: "Your hand no longer magically squishes urinal cakes when trying to pick them up" diff --git a/html/changelogs/AutoChangeLog-pr-5434.yml b/html/changelogs/AutoChangeLog-pr-5434.yml deleted file mode 100644 index 7ee8978492..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5434.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Denton" -delete-after: True -changes: - - bugfix: "Fixes lye/plastic/charcoal conflicts when mixing." - - bugfix: "Lye is now made by combining ash with water and carbon. Plastic sheets by heating ash, sulphuric acid and oil." diff --git a/html/changelogs/AutoChangeLog-pr-5438.yml b/html/changelogs/AutoChangeLog-pr-5438.yml deleted file mode 100644 index 0a4d3390e8..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5438.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Dax Dupont" -delete-after: True -changes: - - bugfix: "AI no longers block ark after mass_recall" - - bugfix: "Placed the dispersal logic AFTER the mass_recall on ark activation instead of infront(did nothing before basically)." diff --git a/html/changelogs/AutoChangeLog-pr-5440.yml b/html/changelogs/AutoChangeLog-pr-5440.yml deleted file mode 100644 index 0707b4f149..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5440.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Cebutris" -delete-after: True -changes: - - rscadd: "Added in prayer beads, code and sprites shamelessly stolen from Paradise. Chaplains can pray for people, to heal their wounds without the risk of braindamage, and cleanse their mind of unholy thoughts" diff --git a/html/changelogs/AutoChangeLog-pr-5442.yml b/html/changelogs/AutoChangeLog-pr-5442.yml deleted file mode 100644 index 1b4b8dd334..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5442.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Dax Dupont" -delete-after: True -changes: - - rscadd: "Cell chargers can now be built and upgraded with capacitors!" - - bugfix: "Fixed empty subtype batteries not updating icons" diff --git a/html/changelogs/AutoChangeLog-pr-5445.yml b/html/changelogs/AutoChangeLog-pr-5445.yml deleted file mode 100644 index 40def083f5..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5445.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "More Robust Than You" -delete-after: True -changes: - - bugfix: "SCP-294 no longer looks fucked up" diff --git a/html/changelogs/AutoChangeLog-pr-5447.yml b/html/changelogs/AutoChangeLog-pr-5447.yml deleted file mode 100644 index 4cd5e4a0e0..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5447.yml +++ /dev/null @@ -1,16 +0,0 @@ -author: "Robustin" -delete-after: True -changes: - - balance: "The rift created by teleporting in from space will now include a description indicating the direction of the \"origin\" teleport rune - giving the examiner a fair idea of where the \"space base\" is located." - - balance: "You can no longer manifest spirits or summon cultists while in space or Lavaland. You may still ascend as a spirit (formerly spirit sight, astral jaunt, etc.) in either of these locations." - - balance: "Juggernauts have lost 20% reflect rate on energy projectiles (now around 50% for standard lasers)." - - balance: "Wraiths and Juggernauts have -5 melee damage (20 and 25 now, respectively)." - - balance: "Construct shells now cost 50 metal through the \"twisted construction\" spell. Twisted construction is now a \"single use\" spell." - - balance: "The Concealment spell will now work on cult airlocks (including converted airlocks). The \"concealed\" airlock will appear as a generic airlock but will deny access to any non-cultist." - - balance: "The draw blood effect on blood splatters will now draw more blood from stains with low blood levels." - - tweak: "Unanchored (via ritual dagger) cult structures are no longer \"dense\", meaning you can move them through teleport runes more efficiently." - - tweak: "The button to nominate yourself for cult master now has a confirmation prompt seeking assurance that the user is prepared to be the cult's master." - - tweak: "The reveal aspect of the concealment spell is slightly smaller, albeit still slightly larger (6 range) than the concealment aspect (5 range)." - - imageadd: "Juggernauts \"gauntlet echo\" now has a more cult-themed appearance." - - bugfix: "Using a shuttle curse to push the shuttle timer above its default can no longer be \"reset\" with a recall. This also adds a block_recall(time_in_deciseconds) helper-proc to the shuttle subsystem." - - bugfix: "Using runed metal on a regular girder is no longer an option, preventing runtimes and deletions associated with the (unintended) combination." diff --git a/html/changelogs/AutoChangeLog-pr-5451.yml b/html/changelogs/AutoChangeLog-pr-5451.yml deleted file mode 100644 index 05ec2a27e2..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5451.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "deathride58" -delete-after: True -changes: - - code_imp: "Synced with upstream. Again. For the hundredth time probably. Check the github for more details." diff --git a/html/changelogs/AutoChangeLog-pr-5453.yml b/html/changelogs/AutoChangeLog-pr-5453.yml deleted file mode 100644 index 6e9eaebe6a..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5453.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - tweak: "After consulting with their in-house physicists, Nanotrasen has updated their worst-case disaster training simulation \"Space Station 13\". The combustion of hydrogen isotopes now produces water vapor instead of carbon dioxide." diff --git a/html/changelogs/AutoChangeLog-pr-5456.yml b/html/changelogs/AutoChangeLog-pr-5456.yml deleted file mode 100644 index 0bbfaf59f9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5456.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Dax Dupont" -delete-after: True -changes: - - rscadd: "Added hooray emoji!" diff --git a/html/changelogs/AutoChangeLog-pr-5464.yml b/html/changelogs/AutoChangeLog-pr-5464.yml deleted file mode 100644 index 2ec5074007..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5464.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - rscadd: "Heart-shaped boxes of chocolates are now included in Valentine's Day event gifts" diff --git a/html/changelogs/AutoChangeLog-pr-5465.yml b/html/changelogs/AutoChangeLog-pr-5465.yml deleted file mode 100644 index ac80a64f1d..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5465.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Iamgoofball" -delete-after: True -changes: - - bugfix: "The Cook now ONLY works under siege." diff --git a/html/changelogs/AutoChangeLog-pr-5467.yml b/html/changelogs/AutoChangeLog-pr-5467.yml deleted file mode 100644 index ba61559a87..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5467.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Frozenguy5" -delete-after: True -changes: - - bugfix: "You can craft rat kebabs now." diff --git a/html/changelogs/AutoChangeLog-pr-5469.yml b/html/changelogs/AutoChangeLog-pr-5469.yml deleted file mode 100644 index 7ae6cf54a9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5469.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - rscadd: "Transference potions now just rename the mob that you are transferring into with your name, rather than your name plus the old name of the mob." diff --git a/html/changelogs/AutoChangeLog-pr-5470.yml b/html/changelogs/AutoChangeLog-pr-5470.yml deleted file mode 100644 index f1a9fb3df8..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5470.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - tweak: "The clogged vents event has been removed for pressing ceremonial reasons" diff --git a/html/changelogs/AutoChangeLog-pr-5473.yml b/html/changelogs/AutoChangeLog-pr-5473.yml deleted file mode 100644 index e702a232cc..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5473.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - bugfix: "Chasms no longer eat shuttle docking ports, rendering them unusable and unresponsive" diff --git a/html/changelogs/AutoChangeLog-pr-5477.yml b/html/changelogs/AutoChangeLog-pr-5477.yml deleted file mode 100644 index ecafe93d22..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5477.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Dax Dupont" -delete-after: True -changes: - - bugfix: "Integrated circuits no longer start upgraded." - - balance: "The IC printers that are available on round start in the IC labs are no longer upgraded by default. You will need to research these as was intended" diff --git a/html/changelogs/AutoChangeLog-pr-5478.yml b/html/changelogs/AutoChangeLog-pr-5478.yml deleted file mode 100644 index 453d0ebde9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5478.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Cebutris" -delete-after: True -changes: - - rscadd: "Everyone who gets new mineral announcements should now have access to actually get those materials" diff --git a/html/changelogs/AutoChangeLog-pr-5484.yml b/html/changelogs/AutoChangeLog-pr-5484.yml deleted file mode 100644 index a8b6d91826..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5484.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Poojawa" -delete-after: True -changes: - - balance: "emags now have a 10 use endurance. Emag carefully, operatives." diff --git a/html/changelogs/AutoChangeLog-pr-5485.yml b/html/changelogs/AutoChangeLog-pr-5485.yml deleted file mode 100644 index 76b35f1eaf..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5485.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Poojawa" -delete-after: True -changes: - - rscadd: "Cryopods are now available for safe round exiting, no longer will you need to ahelp with 'oh fuck wrong job'. Being kicked back to lobby for a restart is still admin. You will be warned to ahelp if you're an antag role however." diff --git a/html/changelogs/AutoChangeLog-pr-5490.yml b/html/changelogs/AutoChangeLog-pr-5490.yml deleted file mode 100644 index 3f9f6aaa4f..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5490.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Cebutris" -delete-after: True -changes: - - rscadd: "Security vendors now have a stunsword modification kit available for purchase with a coin. There might be another somewhere in there, but that would require tampering with it, and you're a good little redshirt, aren't you?" diff --git a/html/changelogs/AutoChangeLog-pr-5493.yml b/html/changelogs/AutoChangeLog-pr-5493.yml deleted file mode 100644 index 712b4b9f28..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5493.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - balance: "You no longer need an aggressive grab to table someone." diff --git a/html/changelogs/AutoChangeLog-pr-5495.yml b/html/changelogs/AutoChangeLog-pr-5495.yml deleted file mode 100644 index 80d21e35bc..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5495.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kor" -delete-after: True -changes: - - rscadd: "Bluespace slime extracts now have a new chemical reaction with water, which create slime radio potions. When applied to a simple animal, that mob gains an internal radio." diff --git a/html/changelogs/AutoChangeLog-pr-5496.yml b/html/changelogs/AutoChangeLog-pr-5496.yml deleted file mode 100644 index c1e3e1c7d9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5496.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - refactor: "Map initialization now supports stations with multiple z-levels." - - bugfix: "The map reader no longer sometimes expands the world size inappropriately." - - tweak: "Pride's Mirror's destination has become less predictable." diff --git a/html/changelogs/AutoChangeLog-pr-5505.yml b/html/changelogs/AutoChangeLog-pr-5505.yml deleted file mode 100644 index 0b89b2e2e0..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5505.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "MMMiracles" -delete-after: True -changes: - - rscadd: "You can now produce a cryostatis variant of the shotgun dart after researching Medical Weaponry. Holds 10u and doesn't have reagents react inside it." diff --git a/html/changelogs/AutoChangeLog-pr-5506.yml b/html/changelogs/AutoChangeLog-pr-5506.yml deleted file mode 100644 index 40765e014b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5506.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - rscdel: "Minimap gone from crew monitoring" diff --git a/html/changelogs/AutoChangeLog-pr-5508.yml b/html/changelogs/AutoChangeLog-pr-5508.yml deleted file mode 100644 index 282af66cbb..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5508.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - tweak: "Removing and printing integrated circuits will now attempt to place them into a free hand." - - tweak: "You can now hit an integrated circuit printer with an unsecured electronic assembly to recycle all of the parts in the assembly en masse." - - tweak: "You can now recycle empty electronic assemblies in an integrated circuit printer!" - - soundadd: "Integrated circuit printers now have sounds for printing circuits and assemblies." diff --git a/html/changelogs/AutoChangeLog-pr-5509.yml b/html/changelogs/AutoChangeLog-pr-5509.yml deleted file mode 100644 index 938597014c..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5509.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - rscadd: "Centcom now reports that thanks to extensive bioengineering, apples -and oranges now taste of apples and oranges, rather than nothing as they -did before." diff --git a/html/changelogs/AutoChangeLog-pr-5512.yml b/html/changelogs/AutoChangeLog-pr-5512.yml deleted file mode 100644 index bbabd36f85..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5512.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "More Robust Than You" -delete-after: True -changes: - - bugfix: "Fixes SCP-294 losing its top sometimes" diff --git a/html/changelogs/AutoChangeLog-pr-5515.yml b/html/changelogs/AutoChangeLog-pr-5515.yml deleted file mode 100644 index eea214c057..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5515.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Poojawa" -delete-after: True -changes: - - balance: "returned Flightsuit armor to being less useful, also ensured they're not getting the best possible huds as well. Batteries to be done eventually." diff --git a/html/changelogs/AutoChangeLog-pr-5517.yml b/html/changelogs/AutoChangeLog-pr-5517.yml deleted file mode 100644 index b02e311eb5..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5517.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Denton" -delete-after: True -changes: - - tweak: "Emagging meteor shield satellites now shows you a message." - - spellcheck: "Fixed a typo when emagging RnD servers." diff --git a/html/changelogs/AutoChangeLog-pr-5518.yml b/html/changelogs/AutoChangeLog-pr-5518.yml deleted file mode 100644 index 0dff286598..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5518.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - code_imp: "replaced some item-specific movement hooks with components" diff --git a/html/changelogs/AutoChangeLog-pr-5522.yml b/html/changelogs/AutoChangeLog-pr-5522.yml deleted file mode 100644 index ff182e1d62..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5522.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - code_imp: "made powercell rigging no longer set rigged to the plasma reagent datum what the hell and makes it use TRUE/FALSE defines" diff --git a/html/changelogs/AutoChangeLog-pr-5525.yml b/html/changelogs/AutoChangeLog-pr-5525.yml deleted file mode 100644 index 8fffeb931d..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5525.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "RealDonaldTrump" -delete-after: True -changes: - - rscadd: "Slimepeople (And all types, including Jelly, Xenobio Slimeperson, Stargazer and Luminescent) now have the ability to utilise the 'Alter Form' ability, allowing them to change most things about their body's form." - - rscadd: "Re-added the slime split and bodyswap ability to Xenobiological Slimepeople, only obtainable through xenobio." - - rscadd: "Slimepeople can now select tails, taur bodies and ears at roundstart. YOU WILL NEED TO SET YOUR COLOURS; otherwise you'll be rainbow coloured and not exactly slime-like. And nobody wants that." - - config: "Changed the ID for the roundstart slimepeople (Without the body swap and slime split abilities) to slimeperson. This will need set in the config on Jay's end." diff --git a/html/changelogs/AutoChangeLog-pr-5527.yml b/html/changelogs/AutoChangeLog-pr-5527.yml deleted file mode 100644 index d1d01ed199..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5527.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - bugfix: "The RPG loot event will no longer break circuit analyzers." diff --git a/html/changelogs/AutoChangeLog-pr-5532.yml b/html/changelogs/AutoChangeLog-pr-5532.yml deleted file mode 100644 index ef599784de..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5532.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "MetroidLover" -delete-after: True -changes: - - rscadd: "Added the ability to gain smoke bomb charges by attacking the initiated ninja suit with a beaker containing smoke powder" diff --git a/html/changelogs/AutoChangeLog-pr-5534.yml b/html/changelogs/AutoChangeLog-pr-5534.yml deleted file mode 100644 index 5099a198f2..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5534.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Zna12" -delete-after: True -changes: - - rscadd: "Autoylathe" - - tweak: "Tweaked the description of replica katana to show that it's not as much of a toy as i thought it was." diff --git a/html/changelogs/AutoChangeLog-pr-5535.yml b/html/changelogs/AutoChangeLog-pr-5535.yml deleted file mode 100644 index c74dec1e9d..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5535.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - rscadd: "added a subreaction for rainbow slime cores, injecting 5u of plasma now makes them explode into random slimecores." - - rscadd: "added a slimejelly reaction to rainbow slime cores that does the above but all the cores that spawn get 5u each of plasma, water and blood injected. (aka chaos)" - - code_imp: "improved clusterbuster code with Initialize, addtimer, vars for sounds and payload spawners, etc" diff --git a/html/changelogs/AutoChangeLog-pr-5538.yml b/html/changelogs/AutoChangeLog-pr-5538.yml deleted file mode 100644 index b77960fd42..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5538.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Fel and LeonDuvall" -delete-after: True -changes: - - rscadd: "You can now drink sake! Can be found in the bar, or made with rice -and sugar." diff --git a/html/changelogs/AutoChangeLog-pr-5539.yml b/html/changelogs/AutoChangeLog-pr-5539.yml deleted file mode 100644 index f0d826d2dc..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5539.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TankNut" -delete-after: True -changes: - - tweak: "Corpses spawned in ruins have their suit sensors disabled" diff --git a/html/changelogs/AutoChangeLog-pr-5540.yml b/html/changelogs/AutoChangeLog-pr-5540.yml deleted file mode 100644 index 858331ade5..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5540.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Modafinil" -delete-after: True -changes: - - rscadd: "Adds new medicine chem that suppresses sleep and very lightly reduces stunrates, has a very low metabolic rate which is randomized and a low overdose treshold. Overdosing is a lethal oxyloss unless treated. (With epipen urgently and with charcoal/calomel before it puts you to sleep)" diff --git a/html/changelogs/AutoChangeLog-pr-5542.yml b/html/changelogs/AutoChangeLog-pr-5542.yml deleted file mode 100644 index 941c3c2a57..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5542.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - bugfix: "Species with RESISTHOT (golems, skeletons) can extinguish burning -items as if they were wearing fireproof gloves." diff --git a/html/changelogs/AutoChangeLog-pr-5546.yml b/html/changelogs/AutoChangeLog-pr-5546.yml deleted file mode 100644 index 0c26141b42..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5546.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "jakeramsay007" -delete-after: True -changes: - - bugfix: "Jellypeople/Slimepeople now are able to speak their Slime language, as intended when it was added." diff --git a/html/changelogs/AutoChangeLog-pr-5547.yml b/html/changelogs/AutoChangeLog-pr-5547.yml deleted file mode 100644 index b9174386ca..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5547.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Dax Dupont" -delete-after: True -changes: - - bugfix: "After an incident where a very eager roboticist kept expanding a borg's size leading to a structural collapse of the entire station proper safety limitations have been implemented." diff --git a/html/changelogs/AutoChangeLog-pr-5548.yml b/html/changelogs/AutoChangeLog-pr-5548.yml deleted file mode 100644 index f3695c5649..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5548.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "fixes lava and fire burning HE-pipes" diff --git a/html/changelogs/AutoChangeLog-pr-5549.yml b/html/changelogs/AutoChangeLog-pr-5549.yml deleted file mode 100644 index fddb207ee1..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5549.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "removes the maintenance panel examination message on poddoors (blast doors)" diff --git a/html/changelogs/AutoChangeLog-pr-5550.yml b/html/changelogs/AutoChangeLog-pr-5550.yml deleted file mode 100644 index 9e3ae64528..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5550.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Dax Dupont" -delete-after: True -changes: - - rscadd: "Nanotrasen has invested in better reflective materials for it's reflectors. You can now make complex laser shows again." diff --git a/html/changelogs/AutoChangeLog-pr-5554.yml b/html/changelogs/AutoChangeLog-pr-5554.yml deleted file mode 100644 index 7db22a96bd..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5554.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - admin: "Admins can use the Select Equipment verb on observers. Doing so will -humanise them and then apply the equipment." diff --git a/html/changelogs/AutoChangeLog-pr-5555.yml b/html/changelogs/AutoChangeLog-pr-5555.yml deleted file mode 100644 index 37e6f9f6f2..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5555.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Dax Dupont" -delete-after: True -changes: - - bugfix: "You can rotate freezers and cryo again." diff --git a/html/changelogs/AutoChangeLog-pr-5558.yml b/html/changelogs/AutoChangeLog-pr-5558.yml deleted file mode 100644 index c08bcd67d9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5558.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "deathride58" -delete-after: True -changes: - - balance: "RnD's base research point generation rate has been decreased to 1,200 points per minute." diff --git a/html/changelogs/AutoChangeLog-pr-5563.yml b/html/changelogs/AutoChangeLog-pr-5563.yml deleted file mode 100644 index 3a2e25a193..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5563.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - rscadd: "Exosuit fabricators can now build RPED and crew pinpointer upgrades for engineering and medical borgs respectively." diff --git a/html/changelogs/AutoChangeLog-pr-5566.yml b/html/changelogs/AutoChangeLog-pr-5566.yml deleted file mode 100644 index 008d93439f..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5566.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ordo" -delete-after: True -changes: - - rscadd: "Adds a few new liquors to the bar, and a few new cocktails to boot!" diff --git a/html/changelogs/AutoChangeLog-pr-5567.yml b/html/changelogs/AutoChangeLog-pr-5567.yml deleted file mode 100644 index cb5c5258b1..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5567.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - tweak: "Crew pinpointers now fit on medical belts!" diff --git a/html/changelogs/AutoChangeLog-pr-5568.yml b/html/changelogs/AutoChangeLog-pr-5568.yml deleted file mode 100644 index 465ed69402..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5568.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "More Robust Than You" -delete-after: True -changes: - - bugfix: "Actually fixes SCP 294 overlay problems" diff --git a/html/changelogs/AutoChangeLog-pr-5571.yml b/html/changelogs/AutoChangeLog-pr-5571.yml deleted file mode 100644 index dd25c0c971..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5571.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "Bicycles are rideable again" diff --git a/html/changelogs/AutoChangeLog-pr-5576.yml b/html/changelogs/AutoChangeLog-pr-5576.yml deleted file mode 100644 index ea6e7f4cba..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5576.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "deathride58" -delete-after: True -changes: - - tweak: "Most of the light sources in the game have had their light values to be a little more realistic." diff --git a/html/changelogs/AutoChangeLog-pr-5577.yml b/html/changelogs/AutoChangeLog-pr-5577.yml deleted file mode 100644 index 7024c307cc..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5577.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Poojawa" -delete-after: True -changes: - - tweak: "Atmosia is considerably more lethal now. Don't go into space unprotected!" - - balance: "being on fire is actually something to worry about." diff --git a/html/changelogs/AutoChangeLog-pr-5580.yml b/html/changelogs/AutoChangeLog-pr-5580.yml deleted file mode 100644 index 415bbfccbc..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5580.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - bugfix: "New blob tiles are no longer invincible after their blob's death." - - bugfix: "Blob nodes no longer produce blob tiles even after the blob's death." diff --git a/html/changelogs/AutoChangeLog-pr-5582.yml b/html/changelogs/AutoChangeLog-pr-5582.yml deleted file mode 100644 index 581e515c04..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5582.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Improvedname" -delete-after: True -changes: - - bugfix: "Fried eggs don't require boiled eggs anymore and just normal eggs" diff --git a/html/changelogs/AutoChangeLog-pr-5586.yml b/html/changelogs/AutoChangeLog-pr-5586.yml deleted file mode 100644 index 2d254beaa0..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5586.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "Fixed paper bins not catching fire properly" diff --git a/html/changelogs/AutoChangeLog-pr-5590.yml b/html/changelogs/AutoChangeLog-pr-5590.yml deleted file mode 100644 index a0359447af..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5590.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "XDTM" -delete-after: True -changes: - - rscadd: "Added three new techweb nodes: Advanced Surgery, Experimental Surgery, and Alien Surgery(requires abductor tech)" - - rscadd: "Added several new surgical procedures, which require these techweb nodes. To enable an advanced surgery, print its relative disk from a protolathe, and load it on an Operating Computer. Advanced surgery can only be performed at operating tables." - - tweak: "You can now intentionally fail surgical procedures by initiating them with disarm intent instead of help intent." - - rscadd: "Brain traumas now have a custom resilience system. Some trauma sources can cause traumas which require more extensive treatment, such as the new Lobotomy surgery." - - rscadd: "Traitors can now purchase a Brainwashing Surgery Disk for 5 TC." diff --git a/html/changelogs/AutoChangeLog-pr-5592.yml b/html/changelogs/AutoChangeLog-pr-5592.yml deleted file mode 100644 index b131a5f963..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5592.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - rscadd: "Mime's Bane, a toxin that prevents people from emoting while it's in their system, can now be created by mixing 1 part Mute Toxin, 1 part Nothing and 1 part Radium." diff --git a/html/changelogs/AutoChangeLog-pr-5595.yml b/html/changelogs/AutoChangeLog-pr-5595.yml deleted file mode 100644 index f3edc90a12..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5595.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - rscadd: "Circuits integrity, charge, and overall circuit composition is displayed on diagnostic huds. If the assembly has dangerous circuits then the status icon will display exclamation points, if the assembly can communicate with something far away a wifi icon will appear next to the status icon, and if the circuit can not operate the status icon will display an 'X'." - - rscadd: "AR interface circuit which can modify the status icon if it is not displaying the exclamation points or the 'X'." - - tweak: "Locomotive circuits can no longer be added to assemblies that can't use them." - - spellcheck: "Fixed a typo in the grenade primer description." - - code_imp: "Added flags to circuits that help group subsets of circuits and regulate them." diff --git a/html/changelogs/AutoChangeLog-pr-5596.yml b/html/changelogs/AutoChangeLog-pr-5596.yml deleted file mode 100644 index 3f7c3c9388..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5596.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "fixed walls under doors breaking to space" - - tweak: "changed doors to no longer spawn on top of walls" diff --git a/html/changelogs/AutoChangeLog-pr-5597.yml b/html/changelogs/AutoChangeLog-pr-5597.yml deleted file mode 100644 index c830d7955a..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5597.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "fixed ghost spawners showing up in the spawner menu when you can't use them" diff --git a/html/changelogs/AutoChangeLog-pr-5604.yml b/html/changelogs/AutoChangeLog-pr-5604.yml deleted file mode 100644 index b26d3fbea9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5604.yml +++ /dev/null @@ -1,10 +0,0 @@ -author: "Joan" -delete-after: True -changes: - - tweak: "The crusher kit now includes an advanced mining scanner." - - tweak: "The resonator kit now includes webbing and a small extinguisher." - - tweak: "The minebot kit now includes a minebot passthrough kinetic accelerator module, which will cause kinetic accelerator shots to pass through minebots. The welding goggles have been replaced with a welding helmet, allowing you to wear mesons and still be able to repair the minebot without eye damage. -feature: You can now install kinetic accelerator modkits on minebots. Some exceptions may apply. Crowbar to remove modkits." - - balance: "Minebots now shoot 33% faster by default(3 seconds to 2). The minebot cooldown upgrade still produces a fire rate of 1 second." - - balance: "Minebots are now slightly less likely to sit in melee like idiots, and are now healed for 15 instead of 10 when welded." - - balance: "Sentient minebots are penalized; they cannot have armor and melee upgrades installed, and making them sentient will override those upgrades if they were installed. In addition, they move very slightly slower and have their kinetic accelerator's cooldown increased by 1 second." diff --git a/html/changelogs/AutoChangeLog-pr-5606.yml b/html/changelogs/AutoChangeLog-pr-5606.yml deleted file mode 100644 index fd2238ab98..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5606.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - rscadd: "The round-end report now shows information about the first person to die in that round." diff --git a/html/changelogs/AutoChangeLog-pr-5607.yml b/html/changelogs/AutoChangeLog-pr-5607.yml deleted file mode 100644 index 09a3db4529..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5607.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - rscadd: "Admins may now spawn a debug circuit printer that can always print circuits, and has infinite metal." - - bugfix: "Buttons, number pads, and text pads in integrated circuits now correctly show their labels." - - bugfix: "Integrated hypo-injectors can now correctly draw blood." - - tweak: "The circuit analyzer output has been slightly tweaked and includes usage instructions." diff --git a/html/changelogs/AutoChangeLog-pr-5608.yml b/html/changelogs/AutoChangeLog-pr-5608.yml deleted file mode 100644 index 430d10aee3..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5608.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Jittai" -delete-after: True -changes: - - tweak: "Ctrl+Clicking progresses through grab cycle on living mobs (not just humans)" diff --git a/html/changelogs/AutoChangeLog-pr-5609.yml b/html/changelogs/AutoChangeLog-pr-5609.yml deleted file mode 100644 index 9cf7d4dece..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5609.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - rscadd: "Nanotrasen psychologists have identified new phobias emerging amongst the workforce. Nanotrasen's surgeon general advises all personnel to just buck up and deal with it." diff --git a/html/changelogs/AutoChangeLog-pr-5610.yml b/html/changelogs/AutoChangeLog-pr-5610.yml deleted file mode 100644 index 2f9459d9c4..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5610.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Dax Dupont" -delete-after: True -changes: - - rscadd: "Adds special tutorial holopads for the hazard course." diff --git a/html/changelogs/AutoChangeLog-pr-5611.yml b/html/changelogs/AutoChangeLog-pr-5611.yml deleted file mode 100644 index f5a6ffa91c..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5611.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "NTnet circuit fix" -delete-after: True -changes: - - bugfix: "Now NTnet circuits can recieve sender adress properly.Also, now messages could be sended to multiple recepiens." diff --git a/html/changelogs/AutoChangeLog-pr-5612.yml b/html/changelogs/AutoChangeLog-pr-5612.yml deleted file mode 100644 index 2140adcada..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5612.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kevinz000 and Naksu" -delete-after: True -changes: - - bugfix: "Ore stacks will now initialize with proper visuals and no longer show a NO SPRITE text when you gather more than 20 ores to a stack." diff --git a/html/changelogs/AutoChangeLog-pr-5613.yml b/html/changelogs/AutoChangeLog-pr-5613.yml deleted file mode 100644 index 0d6bf7c6c8..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5613.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "fixed multiserver mining formula" diff --git a/html/changelogs/AutoChangeLog-pr-5615.yml b/html/changelogs/AutoChangeLog-pr-5615.yml deleted file mode 100644 index 5b78aec45f..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5615.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - tweak: "Plastic surgery now lets you choose from a list of ten random names, so you can pick the one that you prefer." - - tweak: "Abductors performing plastic surgery can now give their target spooky subject names, with one normal name available for standard plastique." diff --git a/html/changelogs/AutoChangeLog-pr-5616.yml b/html/changelogs/AutoChangeLog-pr-5616.yml deleted file mode 100644 index 8b9cf3dd00..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5616.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "deathride58" -delete-after: True -changes: - - balance: "Xenos no longer have stun or stamina immunity" diff --git a/html/changelogs/AutoChangeLog-pr-5617.yml b/html/changelogs/AutoChangeLog-pr-5617.yml deleted file mode 100644 index f96e0ef3d6..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5617.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "deathride58" -delete-after: True -changes: - - balance: "Sleeping Carp and Psychotic Brawl will now both use Knockdown() instead of Stun() for their stuns, making things a lot more consistent with the recent stun nerfs." diff --git a/html/changelogs/AutoChangeLog-pr-5618.yml b/html/changelogs/AutoChangeLog-pr-5618.yml deleted file mode 100644 index 7e25ba3dd7..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5618.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "RealDonaldTrump" -delete-after: True -changes: - - tweak: "Altered the HoP to require Service experience instead of Supply" diff --git a/html/changelogs/AutoChangeLog-pr-5619.yml b/html/changelogs/AutoChangeLog-pr-5619.yml deleted file mode 100644 index 08dcfe13ae..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5619.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - rscadd: "Added the dish drive. This machine, the future in plate disposal, can be researched from techwebs (Biological Processing) and built with a standard machine frame using two matter bins, a micro manipulator, and a glass sheet." - - rscadd: "A circuit board for the dish drive can be found in the chef's and bartender's wardrobes." - - rscadd: "You can hit a dish drive with any dish (like a plate or drinking glass), and the dish drive will convert it from matter to energy, allowing it to store an infinite amount of dishes. You can also interact with it to get things back from it." - - rscadd: "Dish drives also have an automatic \"suction\" function that sucks in all loose dishes within four tiles. This can be toggled by activating its circuit board in-hand." - - rscadd: "Dish drives automatically beam their stored dishes into any disposal unit that it can see within seven tiles every minute. You can toggle this by alt-clicking its circuit board." diff --git a/html/changelogs/AutoChangeLog-pr-5623.yml b/html/changelogs/AutoChangeLog-pr-5623.yml deleted file mode 100644 index 89b45d32e5..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5623.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Poojawa" -delete-after: True -changes: - - bugfix: "Fixed preferences from overridding vore bellies on different characters with the last saved. Maybe. Worked on local." - - soundadd: "added a button for prey to restart their sound loop, if it cut out and they want it back on." - - soundadd: "Vore sounds respect walls, people can stop bitching about dorm room vore RP." diff --git a/html/changelogs/AutoChangeLog-pr-5630.yml b/html/changelogs/AutoChangeLog-pr-5630.yml deleted file mode 100644 index d7f24d0ad5..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5630.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - bugfix: "Flightsuits should be controllable again" diff --git a/html/changelogs/AutoChangeLog-pr-5633.yml b/html/changelogs/AutoChangeLog-pr-5633.yml deleted file mode 100644 index 8130f1cd15..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5633.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Cebutris" -delete-after: True -changes: - - bugfix: "Slimes of all sorts should no longer have livers" diff --git a/html/changelogs/AutoChangeLog-pr-5634.yml b/html/changelogs/AutoChangeLog-pr-5634.yml deleted file mode 100644 index c020140483..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5634.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Denton" -delete-after: True -changes: - - code_imp: "Renamed the IDs of various reagents to be more descriptive." - - spellcheck: "Fixed the descriptions of changeling adrenaling reagents." diff --git a/html/changelogs/AutoChangeLog-pr-5635.yml b/html/changelogs/AutoChangeLog-pr-5635.yml deleted file mode 100644 index d9b05dafa2..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5635.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Denton" -delete-after: True -changes: - - tweak: "Changed Santa event earliest start from 33 minutes & 20 seconds to 30 minutes. Changed shuttle loan earliest start from 6 minutes & 40 seconds to 7 minutes." diff --git a/html/changelogs/AutoChangeLog-pr-5636.yml b/html/changelogs/AutoChangeLog-pr-5636.yml deleted file mode 100644 index 36034f0db6..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5636.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Denton" -delete-after: True -changes: - - spellcheck: "Tweaked the message you see when emagging meteor shield satellites." diff --git a/html/changelogs/AutoChangeLog-pr-5638.yml b/html/changelogs/AutoChangeLog-pr-5638.yml deleted file mode 100644 index 359dde9603..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5638.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Kevinz000 & Deathride58" -delete-after: True -changes: - - rscadd: "A separate round time has been added to status panel. This will start at 00:00:00." - - rscadd: "Night shift lighting [if enabled in the same configuration] will activate between station time 7:30 PM and 7:30 AM. This will dim all lights affected, but they will still have the same range." - - rscadd: "APCs now have an option to set night lighting mode on or off, regardless of time." diff --git a/html/changelogs/AutoChangeLog-pr-5640.yml b/html/changelogs/AutoChangeLog-pr-5640.yml deleted file mode 100644 index 1e73571181..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5640.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - code_imp: "removed unused poisoned apple variant" diff --git a/html/changelogs/AutoChangeLog-pr-5641.yml b/html/changelogs/AutoChangeLog-pr-5641.yml deleted file mode 100644 index 9e6eba0abe..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5641.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Jittai / ChuckTheSheep" -delete-after: True -changes: - - imageadd: "NT has stopped buying re-boxed storebrand Donkpockets and now stocks stations with real, genuine, tasty Donkpockets!" diff --git a/html/changelogs/AutoChangeLog-pr-5642.yml b/html/changelogs/AutoChangeLog-pr-5642.yml deleted file mode 100644 index 1bf3247e67..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5642.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - tweak: "Nanotrasen has begun a campaign to inform their employees that you can alt-click to disable morgue tray beeping." diff --git a/html/changelogs/AutoChangeLog-pr-5645.yml b/html/changelogs/AutoChangeLog-pr-5645.yml deleted file mode 100644 index 9478df06eb..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5645.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Robustin" -delete-after: True -changes: - - bugfix: "The clock cult's marauder limit now works properly, temporarily lower the marauder limit when one has recently been summoned." diff --git a/html/changelogs/AutoChangeLog-pr-5647.yml b/html/changelogs/AutoChangeLog-pr-5647.yml deleted file mode 100644 index 53ae908ef9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5647.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Super3222, TheMythicGhost, DaedalusGame" -delete-after: True -changes: - - rscadd: "Adds a barometer function to the standard atmos analyzer." - - imageadd: "Adds a new sprite for the atmos analyzer to resemble a barometer." diff --git a/html/changelogs/AutoChangeLog-pr-5648.yml b/html/changelogs/AutoChangeLog-pr-5648.yml deleted file mode 100644 index 2c763dd2b3..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5648.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Repukan" -delete-after: True -changes: - - bugfix: "fixed windoors dropping more cable than what was used to build them." diff --git a/html/changelogs/AutoChangeLog-pr-5649.yml b/html/changelogs/AutoChangeLog-pr-5649.yml deleted file mode 100644 index b973890684..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5649.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "RealDonaldTrump" -delete-after: True -changes: - - balance: "Rebalanced cold damage on slimepeople" - - bugfix: "Transform potions no longer give more than one alter form ability" diff --git a/html/changelogs/AutoChangeLog-pr-5650.yml b/html/changelogs/AutoChangeLog-pr-5650.yml deleted file mode 100644 index 0eefedb0ab..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5650.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "MetroidLover" -delete-after: True -changes: - - balance: "rebalanced Ninja event to allow it to happen earlier." diff --git a/html/changelogs/AutoChangeLog-pr-5651.yml b/html/changelogs/AutoChangeLog-pr-5651.yml deleted file mode 100644 index eeb3b0a2cb..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5651.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "MetroidLover" -delete-after: True -changes: - - bugfix: "fixed Ninja welcome text to no longer tell you to right click your suit." diff --git a/html/changelogs/AutoChangeLog-pr-5653.yml b/html/changelogs/AutoChangeLog-pr-5653.yml deleted file mode 100644 index 11325e5f67..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5653.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "kevinz000, Denton" -delete-after: True -changes: - - rscadd: "Nanotrasen's RnD division has integrated all stationary tachyon doppler arrays into the techweb system. Record increasingly large explosions with them and you will generate research points!" - - spellcheck: "Fixed a few typos in the RnD doppler array name/description." diff --git a/html/changelogs/AutoChangeLog-pr-5657.yml b/html/changelogs/AutoChangeLog-pr-5657.yml deleted file mode 100644 index 45f0856d0e..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5657.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Cebutris" -delete-after: True -changes: - - tweak: "Toxin loving species now properly take toxin damage from liver failiure" diff --git a/html/changelogs/AutoChangeLog-pr-5658.yml b/html/changelogs/AutoChangeLog-pr-5658.yml deleted file mode 100644 index 179b332095..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5658.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - code_imp: "removes input/output plates and changes autogibbers to use input dir" diff --git a/html/changelogs/AutoChangeLog-pr-5659.yml b/html/changelogs/AutoChangeLog-pr-5659.yml deleted file mode 100644 index b6ba2cee2b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5659.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Denton" -delete-after: True -changes: - - tweak: "The outer airlocks of various lavaland ruins and ships now cycle lock." diff --git a/html/changelogs/AutoChangeLog-pr-5660.yml b/html/changelogs/AutoChangeLog-pr-5660.yml deleted file mode 100644 index 23fd1ab34d..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5660.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Denton" -delete-after: True -changes: - - tweak: "The outer airlocks of most space ruin airlocks are now cycle linked." diff --git a/html/changelogs/AutoChangeLog-pr-5661.yml b/html/changelogs/AutoChangeLog-pr-5661.yml deleted file mode 100644 index a1f53d6f16..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5661.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - admin: "Admins can now start the game as extended revs, a version of revs that doesn't end when head(rev)s are dead. Admins can also use the speedy mode, which nukes the station after 20 minutes." diff --git a/html/changelogs/AutoChangeLog-pr-5662.yml b/html/changelogs/AutoChangeLog-pr-5662.yml deleted file mode 100644 index c7851b94cb..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5662.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Denton" -delete-after: True -changes: - - bugfix: "Players can no longer kill themselves by whispering inside clone pods." diff --git a/html/changelogs/AutoChangeLog-pr-5663.yml b/html/changelogs/AutoChangeLog-pr-5663.yml deleted file mode 100644 index 6bda49061b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5663.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Repukan" -delete-after: True -changes: - - rscadd: "Whiskey to the flask" - - rscdel: "Hearty Punch from the flask" diff --git a/html/changelogs/AutoChangeLog-pr-5666.yml b/html/changelogs/AutoChangeLog-pr-5666.yml deleted file mode 100644 index 0000b86190..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5666.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Denton" -delete-after: True -changes: - - tweak: "The 'neurotoxin2' toxin has been renamed to Fentanyl." diff --git a/html/changelogs/AutoChangeLog-pr-5668.yml b/html/changelogs/AutoChangeLog-pr-5668.yml deleted file mode 100644 index e8f9ae32b9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5668.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Poojawa" -delete-after: True -changes: - - bugfix: "Dogborgs should no longer have offset issues after attacking." - - bugfix: "Dogborg laser/disabler fluff now works again." diff --git a/html/changelogs/AutoChangeLog-pr-5669.yml b/html/changelogs/AutoChangeLog-pr-5669.yml deleted file mode 100644 index 48cf9a6be9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5669.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ShizCalev" -delete-after: True -changes: - - tweak: "Silicons no longer have to be adjacent to morguetrays to disable the alarms on then." diff --git a/html/changelogs/AutoChangeLog-pr-5670.yml b/html/changelogs/AutoChangeLog-pr-5670.yml deleted file mode 100644 index bc9ed17cfa..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5670.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Poojawa" -delete-after: True -changes: - - bugfix: "Shock collars re-added to autolathes" diff --git a/html/changelogs/AutoChangeLog-pr-5672.yml b/html/changelogs/AutoChangeLog-pr-5672.yml deleted file mode 100644 index 4c9c5f0a06..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5672.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Astral" -delete-after: True -changes: - - rscadd: "Traitor CMOs and Chemists, for 12 TC, can now get a reagent dartgun, which is capable of synthesizing it's own syringes, but does so slowly, and can be easily identified as syndicate by anyone who isn't blind!" diff --git a/html/changelogs/AutoChangeLog-pr-5673.yml b/html/changelogs/AutoChangeLog-pr-5673.yml deleted file mode 100644 index 15622f81a9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5673.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "enables the RPED to construct/replace other parts commonly used in machines (igniters, beakers, bs crystals)" - - bugfix: "fixes part ratings of cells so slime cells are correctly more desirable than bluespace cells and other such nonsense" diff --git a/html/changelogs/AutoChangeLog-pr-5674.yml b/html/changelogs/AutoChangeLog-pr-5674.yml deleted file mode 100644 index f6359e0328..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5674.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "shivering symptom now works properly instead of only cooling you if you're already cold" - - bugfix: "fixed bodytemp going negative in a few cases" diff --git a/html/changelogs/AutoChangeLog-pr-5680.yml b/html/changelogs/AutoChangeLog-pr-5680.yml deleted file mode 100644 index 025217a854..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5680.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - tweak: "Reskinning objects now shows their possible appearances in the chat box." diff --git a/html/changelogs/AutoChangeLog-pr-5681.yml b/html/changelogs/AutoChangeLog-pr-5681.yml deleted file mode 100644 index 0334a6ccb1..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5681.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - rscadd: "Added Bastion Bourbon, which you can mix with tea, creme de menthe, triple citrus, and berry juice. When it's in your system, it will very slowly heal you as long as you're not in critical. When it's first added to your system, you heal an amount of each damage type equal to the volume taken in, with a max of 10. This is turned to a max of 20 for anyone in critical." - - rscadd: "Added Squirt Cider, which you can mix with water, tomato juice, and nutriment. It's nutritious and healthy!" diff --git a/html/changelogs/AutoChangeLog-pr-5684.yml b/html/changelogs/AutoChangeLog-pr-5684.yml deleted file mode 100644 index f460ddfb01..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5684.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - tweak: "The last scientists have reported that thermonuclear blasts triggered by so called 'power gamers' have shorted the doppler array. We've readjusted the ALU and are confident that this will not happen again." diff --git a/html/changelogs/AutoChangeLog-pr-5687.yml b/html/changelogs/AutoChangeLog-pr-5687.yml deleted file mode 100644 index c5603175fb..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5687.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "deathride58" -delete-after: True -changes: - - rscadd: "Lights will now actually glow in the dark!" diff --git a/html/changelogs/AutoChangeLog-pr-5689.yml b/html/changelogs/AutoChangeLog-pr-5689.yml deleted file mode 100644 index f6eae22630..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5689.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - tweak: "Tweaked the inventory management of the black fedora to be more like the detective's" diff --git a/html/changelogs/AutoChangeLog-pr-5696.yml b/html/changelogs/AutoChangeLog-pr-5696.yml deleted file mode 100644 index a30d82f571..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5696.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Toriate" -delete-after: True -changes: - - rscadd: "Added pump action particle blasters. Shotgun eguns!" - - rscadd: "Added the Particle Defender, unique pump action particle blaster variant that replaces the warden's taser" - - soundadd: "added new sounds for pump action particle blaster, mostly recorded by yours truly" - - imageadd: "added new sprites for pump action particle blasters" diff --git a/html/changelogs/AutoChangeLog-pr-5697.yml b/html/changelogs/AutoChangeLog-pr-5697.yml deleted file mode 100644 index 24a1d5abe2..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5697.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Toriate" -delete-after: True -changes: - - rscadd: "Added a syndicate exclusive .357. Replaces the original one in the uplink. All other .357s are untouched." - - imageadd: "added new sprites for crowbars, wrenches, syndicate .357, and eguns" diff --git a/html/changelogs/AutoChangeLog-pr-5698.yml b/html/changelogs/AutoChangeLog-pr-5698.yml deleted file mode 100644 index 8bdc304c7f..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5698.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "XDTM" -delete-after: True -changes: - - balance: "You can no longer gain the same trauma more than once." - - balance: "You can no longer gain more than a certain amount of brain traumas per resilience tier. (Example: You cannot gain 4 mild traumas, but you can gain 3 mild and 1 severe)" - - tweak: "Abductors' trauma gland now gives traumas of random resilience, instead of lobotomy every time." diff --git a/html/changelogs/AutoChangeLog-pr-5701.yml b/html/changelogs/AutoChangeLog-pr-5701.yml deleted file mode 100644 index b113bf0ee0..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5701.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "XDTM" -delete-after: True -changes: - - tweak: "Operating computers now display the chemicals required to complete a surgery step, if there are any." - - tweak: "Completing a surgery without the required chems will always result in failure, instead of a success with no effect." diff --git a/html/changelogs/AutoChangeLog-pr-5702.yml b/html/changelogs/AutoChangeLog-pr-5702.yml deleted file mode 100644 index 9ebcd306d6..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5702.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: "XDTM" -delete-after: True -changes: - - balance: "Wizard spells and items can now be resisted/ignored with anti-magic items/clothing such as null rods!" - - balance: "Revenant spells can now be resisted with \"holy\" items like null rods and bibles." - - balance: "Wizard hardsuits are now magic immune, but not holy." - - balance: "Immortality Talismans now grant both spell and holy immunity." - - tweak: "Inquisitor Hardsuits already granted spell and holy immunity, but now they do it properly instead of having a null rod embedded inside." - - tweak: "Holy Melons now grant holy immunity." diff --git a/html/changelogs/AutoChangeLog-pr-5703.yml b/html/changelogs/AutoChangeLog-pr-5703.yml deleted file mode 100644 index 1090c34dd0..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5703.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - balance: "Instead of starting unable to clone circuits at all, circuit printers can now print circuits over time from roundstart. The formula for this is equal to (metal cost / 150) seconds, with a maximum of 3 minutes. You can see printing progress by using the printer's interface, and you can print normal components during this time." - - balance: "If circuit printing is disabled in the config, cloning remains unavailable." - - balance: "The upgrade disk to allow circuit printers to clone circuits has been replaced with an upgrade disk to make circuit cloning instant." - - balance: "Both circuit printer upgrade disks now cost 5000 metal and glass, down from 10000." diff --git a/html/changelogs/AutoChangeLog-pr-5704.yml b/html/changelogs/AutoChangeLog-pr-5704.yml deleted file mode 100644 index 30963a5296..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5704.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "Tritium no longer produces so much radiation that it crashes the server" diff --git a/html/changelogs/AutoChangeLog-pr-5705.yml b/html/changelogs/AutoChangeLog-pr-5705.yml deleted file mode 100644 index 9a898ad295..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5705.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - code_imp: "Butchering has been refactored." - - balance: "Some items now take longer to butcher, and have a chance to harvest fewer items, like spears. Others, however, are faster, like circular saws." - - balance: "Certain creatures will always drop certain items on butchering, regardless of butchering effectiveness or chances." - - balance: "Items that are very effective at butchering may yield bonus loot from butchered creatures!" diff --git a/html/changelogs/AutoChangeLog-pr-5707.yml b/html/changelogs/AutoChangeLog-pr-5707.yml deleted file mode 100644 index b30b0458bf..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5707.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - balance: "livers don't unfail automatically every second life cycle you have to get a new one or get some corazone stat" - - balance: "increased liver damage from alcohol significantly because apparently your liver regenerates faster than you can chug unless you drink 100 liters of bacchus blessing" - - bugfix: "fixed cyber livers thinking they should fail at half durability" diff --git a/html/changelogs/AutoChangeLog-pr-5711.yml b/html/changelogs/AutoChangeLog-pr-5711.yml deleted file mode 100644 index 637e4770ca..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5711.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - rscadd: "Plain hamburgers may now spawn as steamed hams with a very low chance." diff --git a/html/changelogs/AutoChangeLog-pr-5713.yml b/html/changelogs/AutoChangeLog-pr-5713.yml deleted file mode 100644 index 372798d263..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5713.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Robustin" -delete-after: True -changes: - - bugfix: "Twisted Construction will now consume ALL available plasteel in a stack." - - bugfix: "Runes will no longer count the original invoker more than once." diff --git a/html/changelogs/AutoChangeLog-pr-5714.yml b/html/changelogs/AutoChangeLog-pr-5714.yml deleted file mode 100644 index 3aea8b539a..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5714.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "MMMiracles" -delete-after: True -changes: - - rscadd: "Added tinfoil hats, headgear that can help protect against government conspiracies and extra-terrestrials. Found in hacked autolathes." diff --git a/html/changelogs/AutoChangeLog-pr-5717.yml b/html/changelogs/AutoChangeLog-pr-5717.yml deleted file mode 100644 index 83cda7c017..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5717.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Robustin" -delete-after: True -changes: - - bugfix: "The heart attack event will now actually make the victim acquire the heart disease" - - bugfix: "Clicking the chatbox link will let you orbit the victim" - - tweak: "The event is now significantly more sensitive to junk food. Recent consumption of multiple junk food items will triple your chances of having a heart attack (exercise will still block it)." diff --git a/html/changelogs/AutoChangeLog-pr-5719.yml b/html/changelogs/AutoChangeLog-pr-5719.yml deleted file mode 100644 index ac7d4e09a5..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5719.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Iamgoofball" -delete-after: True -changes: - - rscadd: "Look sir, free crabs!" diff --git a/html/changelogs/AutoChangeLog-pr-5720.yml b/html/changelogs/AutoChangeLog-pr-5720.yml deleted file mode 100644 index 5a97f1e8d4..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5720.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "selea" -delete-after: True -changes: - - bugfix: "fixed floorbot" - - bugfix: "fixed cleanbot" - - refactor: "improved pathiding in case of given minimal distance;improved sanitation" diff --git a/html/changelogs/AutoChangeLog-pr-5723.yml b/html/changelogs/AutoChangeLog-pr-5723.yml deleted file mode 100644 index f1a0c512c1..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5723.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Astral" -delete-after: True -changes: - - rscadd: "blood cultists can now use a nar nar plushie as an extra invoker for runes!" diff --git a/html/changelogs/AutoChangeLog-pr-5725.yml b/html/changelogs/AutoChangeLog-pr-5725.yml deleted file mode 100644 index 7913b00216..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5725.yml +++ /dev/null @@ -1,10 +0,0 @@ -author: "Poojawa" -delete-after: True -changes: - - bugfix: "fixed borg defibs, fix is upstream as well" - - bugfix: "fixed missing borg animations, should've been readded ages ago" - - rscadd: "Hound Barometers are now functional." - - rscadd: "Fetch modules readded!" - - rscadd: "Borgi's added!" - - tweak: "K9 cuffs take 6 seconds, for balance reasons." - - tweak: "self repair nerfed, healing others takes a short time but amounts are unaffected. Promoting teamwork over engiborg invincibility" diff --git a/html/changelogs/AutoChangeLog-pr-5726.yml b/html/changelogs/AutoChangeLog-pr-5726.yml deleted file mode 100644 index 5119596f74..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5726.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Poojawa" -delete-after: True -changes: - - rscadd: "Tesla Corona Analyzers! Study the seemingly magic Edison's Bane for supplemental research points!" diff --git a/html/changelogs/AutoChangeLog-pr-5727.yml b/html/changelogs/AutoChangeLog-pr-5727.yml deleted file mode 100644 index dc916865b0..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5727.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "RealDonaldTrump" -delete-after: True -changes: - - tweak: "Removed the probability check from prayer beads for their low amount of healing, as well as lowering the time needed to heal from 15 seconds to 10 seconds. Slimepeople won't get harmed by prayer beads either." diff --git a/html/changelogs/AutoChangeLog-pr-5729.yml b/html/changelogs/AutoChangeLog-pr-5729.yml deleted file mode 100644 index 8f579124be..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5729.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - rscdel: "SNPCs have been removed." diff --git a/html/changelogs/AutoChangeLog-pr-5730.yml b/html/changelogs/AutoChangeLog-pr-5730.yml deleted file mode 100644 index 5483366e13..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5730.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "XDTM" -delete-after: True -changes: - - tweak: "Bath Salts now induce psychotic rage, but cause much more brain damage." diff --git a/html/changelogs/AutoChangeLog-pr-5733.yml b/html/changelogs/AutoChangeLog-pr-5733.yml deleted file mode 100644 index 26cb19420a..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5733.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Dax Dupont" -delete-after: True -changes: - - rscadd: "Medals now show the commendation text in the description." diff --git a/html/changelogs/AutoChangeLog-pr-5734.yml b/html/changelogs/AutoChangeLog-pr-5734.yml deleted file mode 100644 index 7107a79eea..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5734.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Poojawa" -delete-after: True -changes: - - bugfix: "Cyborg defib units are now actually functional" diff --git a/html/changelogs/AutoChangeLog-pr-5738.yml b/html/changelogs/AutoChangeLog-pr-5738.yml deleted file mode 100644 index d166c1fe6d..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5738.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "CameronWoof" -delete-after: True -changes: - - tweak: "The MediHound's now has a unique preference, which defaults to on." - - rscadd: "MediHound now has a cyborg hypospray, to help tend to patients with their sleeper preference off." diff --git a/html/changelogs/AutoChangeLog-pr-5740.yml b/html/changelogs/AutoChangeLog-pr-5740.yml deleted file mode 100644 index 8cb8f0ea4f..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5740.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ZeroNetAlpha" -delete-after: True -changes: - - tweak: "Tacticool Turtlenecks are now compliant with Nanotrasen regulations and are equipped with sensors." diff --git a/html/changelogs/AutoChangeLog-pr-5741.yml b/html/changelogs/AutoChangeLog-pr-5741.yml deleted file mode 100644 index 7b9dd3cd08..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5741.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Toriate" -delete-after: True -changes: - - imageadd: "added new egun and laser sprites, including inhands!" - - code_imp: "Added OVERRIDE .dmis which are copypasted upstream .dmis with changes for selective sprite changes" diff --git a/html/changelogs/AutoChangeLog-pr-5742.yml b/html/changelogs/AutoChangeLog-pr-5742.yml deleted file mode 100644 index 3d659591c8..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5742.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "The assault pod can be launched again." diff --git a/html/changelogs/AutoChangeLog-pr-5746.yml b/html/changelogs/AutoChangeLog-pr-5746.yml deleted file mode 100644 index 386a725788..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5746.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "MoreRobustThanYou" -delete-after: True -changes: - - bugfix: "SCP-294 should no longer have overlay problems" diff --git a/html/changelogs/AutoChangeLog-pr-5748.yml b/html/changelogs/AutoChangeLog-pr-5748.yml deleted file mode 100644 index 3bd53bfbe9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5748.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "AlexTheSysop" -delete-after: True -changes: - - bugfix: "C4 logging now shows correct location" diff --git a/html/changelogs/AutoChangeLog-pr-5749.yml b/html/changelogs/AutoChangeLog-pr-5749.yml deleted file mode 100644 index 67737ca0e1..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5749.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Astral" -delete-after: True -changes: - - imageadd: "Space is now prettier" diff --git a/html/changelogs/AutoChangeLog-pr-5750.yml b/html/changelogs/AutoChangeLog-pr-5750.yml deleted file mode 100644 index 8b4105acd4..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5750.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Denton" -delete-after: True -changes: - - tweak: "Cargo packs have been grouped and sorted alphabetically. Station goal crates are now in the Engineering section." - - tweak: "The cargo security section has been split into security/armory." - - tweak: "Grouped all gas canisters and fuel/water tanks together in one section with raw materials." - - spellcheck: "Fixed a few cargo pack descriptions." diff --git a/html/changelogs/AutoChangeLog-pr-5751.yml b/html/changelogs/AutoChangeLog-pr-5751.yml deleted file mode 100644 index 6bf454552d..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5751.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - tweak: "Machines can now be constructed anchored or unanchored, if the resultant machine could be unanchored." diff --git a/html/changelogs/AutoChangeLog-pr-5753.yml b/html/changelogs/AutoChangeLog-pr-5753.yml deleted file mode 100644 index cdebd032c8..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5753.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - rscadd: "Traits! You can now select up to three positive, negative, and neutral traits in the character setup. You can choose up to six traits based on combinations varying by the amount of points you earn with negative traits and spend with positive ones." diff --git a/html/changelogs/AutoChangeLog-pr-5758.yml b/html/changelogs/AutoChangeLog-pr-5758.yml deleted file mode 100644 index 003d77ac42..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5758.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - rscadd: "You can now splash metal sheets with copper to make bronze sheets, which you can make \"clockwork\" things out of." diff --git a/html/changelogs/AutoChangeLog-pr-5760.yml b/html/changelogs/AutoChangeLog-pr-5760.yml deleted file mode 100644 index 17dc336104..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5760.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "Selea" -delete-after: True -changes: - - balance: "reduce CD of all non manipulative non list output circuits to 0.1" - - balance: "add to locomotion circuit output ref with object, which assembly was bumped to." - - balance: "upgrade disks have multiuse. -balance:iducer efficiency= efficiency/number of inducers on 1 tile." - - balance: "unnerf fuel cell.about 3-5 times.Make blood more powerful." diff --git a/html/changelogs/AutoChangeLog-pr-5764.yml b/html/changelogs/AutoChangeLog-pr-5764.yml deleted file mode 100644 index 8a5e2f3867..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5764.yml +++ /dev/null @@ -1,10 +0,0 @@ -author: "Denton" -delete-after: True -changes: - - bugfix: "Burglar alarms in the Pubbystation library and RD office can now be disabled properly." - - bugfix: "Fixed Pubbystation's RD office shutters." - - rscadd: "Added missing engineering and kitchen lockdown shutters on Pubbystation." - - rscadd: "Pubbystation: Added privacy shutters to the CMO and RD offices. Added space shutters to the HoS office. Replaced the RD office's directional windows with fulltile ones." - - rscadd: "Added a second blast door to the Pubbystation gulag shuttle lockdown." - - tweak: "Due to pressure from the space OSHA, Pubbystation has installed missing fire alarms and firelocks." - - tweak: "Split the Pubbystation library into two areas with their own APCs." diff --git a/html/changelogs/AutoChangeLog-pr-5765.yml b/html/changelogs/AutoChangeLog-pr-5765.yml deleted file mode 100644 index 92eac9b628..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5765.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Cebutris" -delete-after: True -changes: - - bugfix: "Washing a glove with a white crayon will make it look like a white glove, instead of a latex glove. Instead, mime crayons make gloves look latex" diff --git a/html/changelogs/AutoChangeLog-pr-5767.yml b/html/changelogs/AutoChangeLog-pr-5767.yml deleted file mode 100644 index 65310118e4..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5767.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Robustin" -delete-after: True -changes: - - balance: "Meth now deals 1-4 brain damage while active, up from 0.25" diff --git a/html/changelogs/AutoChangeLog-pr-5771.yml b/html/changelogs/AutoChangeLog-pr-5771.yml deleted file mode 100644 index 3bb62bdd20..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5771.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ZeroNetAlpha" -delete-after: True -changes: - - tweak: "Blobs now start at 60 minutes and only if 50 players are online." diff --git a/html/changelogs/AutoChangeLog-pr-5772.yml b/html/changelogs/AutoChangeLog-pr-5772.yml deleted file mode 100644 index 0b9897e054..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5772.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Toriate" -delete-after: True -changes: - - rscadd: "Added 2 new toy guns in the autoylathe, the experimental hitscan pumpaction plastic blaster, and a fancy toy revolver" diff --git a/html/changelogs/AutoChangeLog-pr-5775.yml b/html/changelogs/AutoChangeLog-pr-5775.yml deleted file mode 100644 index a6baa68805..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5775.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "ShizCalev" -delete-after: True -changes: - - rscadd: "You can now hotswap tanks in a canister or gas pump by clicking it with a new tank!" - - rscadd: "You can now also close a canister's valve and remove the tank inside it by alt-clicking it." diff --git a/html/changelogs/AutoChangeLog-pr-5777.yml b/html/changelogs/AutoChangeLog-pr-5777.yml deleted file mode 100644 index 20e217994b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5777.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Toriate" -delete-after: True -changes: - - balance: "rebalanced magweapons and flechette launchers to have more sensible recoil and accuracy values" - - balance: "various citadel exclusive guns have had their recoil and accuracy values tweaked to be less ridiculous" diff --git a/html/changelogs/AutoChangeLog-pr-5781.yml b/html/changelogs/AutoChangeLog-pr-5781.yml deleted file mode 100644 index d0e990e276..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5781.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Jalleo" -delete-after: True -changes: - - admin: "Added a cancel button to nuke timer (and others). You no longer have to make it 0 just a click to cancel." - - admin: "You can now easily set how many \"INSERT JOB ROLE HERE\" you want in the manage job selection in the admin panel. If you put zero in it will set it to the current amount of filled positions." - - bugfix: "moved a small amount of wording around in a admin browser to make it cleaner looking. Along with a few updated checks for certain things." diff --git a/html/changelogs/AutoChangeLog-pr-5783.yml b/html/changelogs/AutoChangeLog-pr-5783.yml deleted file mode 100644 index 12f0455142..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5783.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - balance: "changed the formula of liver damage so weak alcohol does barely anything while strong alcohol is still threatening" diff --git a/html/changelogs/AutoChangeLog-pr-5785.yml b/html/changelogs/AutoChangeLog-pr-5785.yml deleted file mode 100644 index 30cf26aeb3..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5785.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - admin: "Admins can now toggle antag, med, sci, engineering huds and maximum ghost brightness with just one button." diff --git a/html/changelogs/AutoChangeLog-pr-5786.yml b/html/changelogs/AutoChangeLog-pr-5786.yml deleted file mode 100644 index b53587e3e1..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5786.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - admin: "Admins can now easily spawn cargo crates" diff --git a/html/changelogs/AutoChangeLog-pr-5792.yml b/html/changelogs/AutoChangeLog-pr-5792.yml deleted file mode 100644 index 50e242c965..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5792.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Iamgoofball" -delete-after: True -changes: - - bugfix: "RIP Billy, you'll be the boss of heaven's gym now 😢" diff --git a/html/changelogs/AutoChangeLog-pr-5794.yml b/html/changelogs/AutoChangeLog-pr-5794.yml deleted file mode 100644 index 368a86d33d..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5794.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "RandomMarine" -delete-after: True -changes: - - rscdel: "The ore redemption machine no longer has 'release all' buttons. Remember to take just what you need and leave some for the other departments." diff --git a/html/changelogs/AutoChangeLog-pr-5797.yml b/html/changelogs/AutoChangeLog-pr-5797.yml deleted file mode 100644 index 98f52dd62f..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5797.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - rscadd: "Advanced roasting sticks, a product of applied bluespace research can now be built from service protolathes. They can be used to cook sausages on campfires, supermatter engines, tesla balls, singularities and a couple of other things." diff --git a/html/changelogs/AutoChangeLog-pr-5798.yml b/html/changelogs/AutoChangeLog-pr-5798.yml deleted file mode 100644 index 095cb00550..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5798.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - admin: "Admins can now grant spells via implants, using the spell implant. Some VV is required." diff --git a/html/changelogs/AutoChangeLog-pr-5799.yml b/html/changelogs/AutoChangeLog-pr-5799.yml deleted file mode 100644 index fe57a60a02..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5799.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Dax Dupont" -delete-after: True -changes: - - balance: "Others can now take off your tinfoil hat as seemingly originally intended." - - balance: "Due to the nature of tinfoil hats, the delay of putting a tinfoil hat on unwilling participants has been increased." diff --git a/html/changelogs/AutoChangeLog-pr-5801.yml b/html/changelogs/AutoChangeLog-pr-5801.yml deleted file mode 100644 index 9ff5b68c7a..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5801.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Potato Masher" -delete-after: True -changes: - - bugfix: "The Wizard Federation has finally modified their production method for pre-packaged magic tarot cards for better compatibility with time-stopping spells. Guardians Spirits are no longer frozen by their user's time-stops." diff --git a/html/changelogs/AutoChangeLog-pr-5802.yml b/html/changelogs/AutoChangeLog-pr-5802.yml deleted file mode 100644 index 22db069ecb..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5802.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - tweak: "Deltastation: Removed a windoor to make the northern chemistry fridge more accessible." diff --git a/html/changelogs/AutoChangeLog-pr-5808.yml b/html/changelogs/AutoChangeLog-pr-5808.yml deleted file mode 100644 index e15924b9ee..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5808.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "Inserting brains into MMIs and then into mechs now works again." diff --git a/html/changelogs/AutoChangeLog-pr-5811.yml b/html/changelogs/AutoChangeLog-pr-5811.yml deleted file mode 100644 index 851f9a4804..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5811.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "Night shift no longer ignores rooms whose APCs are in port or starboard central maintenance." diff --git a/html/changelogs/AutoChangeLog-pr-5813.yml b/html/changelogs/AutoChangeLog-pr-5813.yml deleted file mode 100644 index ae28f209b3..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5813.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "Fixes the auxbase camera console not placing airlocks on fans but doing so vice-versa" From c72201e605f0cc5f6757b92dc8a99c1dd3d9d27d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 5 Mar 2018 14:13:08 -0600 Subject: [PATCH 19/45] [MIRROR] Splits projectiles into different files for readability (#5800) * Splits projectiles into different files for readability * Update tgstation.dme * I love how the dme cleans itself up --- .../_ammunition.dm} | 0 .../{firing.dm => ammunition/_firing.dm} | 0 .../projectiles/ammunition/ammo_casings.dm | 314 ----- .../projectiles/ammunition/ballistic/lmg.dm | 23 + .../ammunition/ballistic/pistol.dm | 50 + .../ammunition/ballistic/revolver.dm | 23 + .../projectiles/ammunition/ballistic/rifle.dm | 28 + .../ammunition/ballistic/shotgun.dm | 139 ++ .../projectiles/ammunition/ballistic/smg.dm | 28 + .../ammunition/ballistic/sniper.dm | 19 + .../ammunition/caseless/_caseless.dm | 15 + .../{caseless.dm => caseless/foam.dm} | 178 +-- .../projectiles/ammunition/caseless/misc.dm | 22 + .../projectiles/ammunition/caseless/rocket.dm | 11 + code/modules/projectiles/ammunition/energy.dm | 258 ---- .../projectiles/ammunition/energy/_energy.dm | 10 + .../ammunition/energy/chameleon.dm | 15 + .../projectiles/ammunition/energy/ebow.dm | 12 + .../projectiles/ammunition/energy/gravity.dm | 36 + .../projectiles/ammunition/energy/laser.dm | 66 + .../projectiles/ammunition/energy/lmg.dm | 6 + .../projectiles/ammunition/energy/plasma.dm | 11 + .../{plasma.dm => energy/plasma_cit.dm} | 0 .../projectiles/ammunition/energy/portal.dm | 14 + .../projectiles/ammunition/energy/special.dm | 61 + .../projectiles/ammunition/energy/stun.dm | 24 + .../projectiles/ammunition/special/magic.dm | 42 + .../{special.dm => special/syringe.dm} | 172 +-- .../_box_magazine.dm} | 240 ++-- .../boxes_magazines/external/grenade.dm | 8 + .../boxes_magazines/external/lmg.dm | 22 + .../boxes_magazines/external/pistol.dm | 56 + .../boxes_magazines/external/rechargable.dm | 14 + .../boxes_magazines/external/rifle.dm | 21 + .../boxes_magazines/external/shotgun.dm | 36 + .../boxes_magazines/external/smg.dm | 76 ++ .../boxes_magazines/external/sniper.dm | 26 + .../boxes_magazines/external/toy.dm | 55 + .../boxes_magazines/external_mag.dm | 340 ----- .../boxes_magazines/internal/_cylinder.dm | 47 + .../boxes_magazines/internal/_internal.dm | 7 + .../boxes_magazines/internal/grenade.dm | 17 + .../boxes_magazines/internal/misc.dm | 11 + .../boxes_magazines/internal/revolver.dm | 22 + .../boxes_magazines/internal/rifle.dm | 15 + .../boxes_magazines/internal/shotgun.dm | 48 + .../boxes_magazines/internal/toy.dm | 7 + .../boxes_magazines/internal_mag.dm | 191 --- .../projectiles/guns/{ => energy}/mounted.dm | 52 +- .../guns/energy/{plasma.dm => plasma_cit.dm} | 0 .../projectiles/guns/{ => misc}/beam_rifle.dm | 1180 ++++++++--------- .../projectiles/guns/{ => misc}/chem_gun.dm | 92 +- .../guns/{ => misc}/grenade_launcher.dm | 104 +- .../projectiles/guns/{ => misc}/medbeam.dm | 266 ++-- .../guns/{ => misc}/syringe_gun.dm | 208 +-- .../modules/projectiles/projectile/bullets.dm | 419 ------ .../projectile/bullets/_incendiary.dm | 17 + .../projectile/bullets/dart_syringe.dm | 39 + .../projectile/bullets/dnainjector.dm | 24 + .../projectiles/projectile/bullets/grenade.dm | 12 + .../projectiles/projectile/bullets/lmg.dm | 44 + .../projectiles/projectile/bullets/pistol.dm | 36 + .../projectile/bullets/revolver.dm | 25 + .../projectiles/projectile/bullets/rifle.dm | 16 + .../projectiles/projectile/bullets/shotgun.dm | 95 ++ .../projectiles/projectile/bullets/smg.dm | 26 + .../projectiles/projectile/bullets/sniper.dm | 39 + .../projectiles/projectile/bullets/special.dm | 26 + code/modules/projectiles/projectile/energy.dm | 203 --- .../projectiles/projectile/energy/_energy.dm | 8 + .../projectile/energy/chameleon.dm | 3 + .../projectiles/projectile/energy/ebow.dm | 15 + .../projectiles/projectile/energy/misc.dm | 15 + .../projectile/energy/net_snare.dm | 98 ++ .../projectiles/projectile/energy/stun.dm | 28 + .../projectiles/projectile/energy/tesla.dm | 31 + .../projectile/reusable/_reusable.dm | 20 + .../{reusable.dm => reusable/foam_dart.dm} | 110 +- .../projectile/reusable/magspear.dm | 6 + .../modules/projectiles/projectile/special.dm | 617 --------- .../projectiles/projectile/special/curse.dm | 55 + .../projectiles/projectile/special/floral.dm | 25 + .../projectiles/projectile/special/gravity.dm | 90 ++ .../projectile/special/hallucination.dm | 230 ++++ .../projectiles/projectile/special/ion.dm | 20 + .../projectiles/projectile/special/meteor.dm | 19 + .../projectile/special/mindflayer.dm | 9 + .../projectile/special/neurotoxin.dm | 12 + .../projectiles/projectile/special/plasma.dm | 49 + .../projectiles/projectile/special/rocket.dm | 45 + .../projectile/special/temperature.dm | 19 + .../projectile/special/wormhole.dm | 25 + tgstation.dme | 105 +- 93 files changed, 3683 insertions(+), 3730 deletions(-) rename code/modules/projectiles/{ammunition.dm => ammunition/_ammunition.dm} (100%) rename code/modules/projectiles/{firing.dm => ammunition/_firing.dm} (100%) delete mode 100644 code/modules/projectiles/ammunition/ammo_casings.dm create mode 100644 code/modules/projectiles/ammunition/ballistic/lmg.dm create mode 100644 code/modules/projectiles/ammunition/ballistic/pistol.dm create mode 100644 code/modules/projectiles/ammunition/ballistic/revolver.dm create mode 100644 code/modules/projectiles/ammunition/ballistic/rifle.dm create mode 100644 code/modules/projectiles/ammunition/ballistic/shotgun.dm create mode 100644 code/modules/projectiles/ammunition/ballistic/smg.dm create mode 100644 code/modules/projectiles/ammunition/ballistic/sniper.dm create mode 100644 code/modules/projectiles/ammunition/caseless/_caseless.dm rename code/modules/projectiles/ammunition/{caseless.dm => caseless/foam.dm} (56%) create mode 100644 code/modules/projectiles/ammunition/caseless/misc.dm create mode 100644 code/modules/projectiles/ammunition/caseless/rocket.dm delete mode 100644 code/modules/projectiles/ammunition/energy.dm create mode 100644 code/modules/projectiles/ammunition/energy/_energy.dm create mode 100644 code/modules/projectiles/ammunition/energy/chameleon.dm create mode 100644 code/modules/projectiles/ammunition/energy/ebow.dm create mode 100644 code/modules/projectiles/ammunition/energy/gravity.dm create mode 100644 code/modules/projectiles/ammunition/energy/laser.dm create mode 100644 code/modules/projectiles/ammunition/energy/lmg.dm create mode 100644 code/modules/projectiles/ammunition/energy/plasma.dm rename code/modules/projectiles/ammunition/{plasma.dm => energy/plasma_cit.dm} (100%) create mode 100644 code/modules/projectiles/ammunition/energy/portal.dm create mode 100644 code/modules/projectiles/ammunition/energy/special.dm create mode 100644 code/modules/projectiles/ammunition/energy/stun.dm create mode 100644 code/modules/projectiles/ammunition/special/magic.dm rename code/modules/projectiles/ammunition/{special.dm => special/syringe.dm} (53%) rename code/modules/projectiles/{box_magazine.dm => boxes_magazines/_box_magazine.dm} (96%) create mode 100644 code/modules/projectiles/boxes_magazines/external/grenade.dm create mode 100644 code/modules/projectiles/boxes_magazines/external/lmg.dm create mode 100644 code/modules/projectiles/boxes_magazines/external/pistol.dm create mode 100644 code/modules/projectiles/boxes_magazines/external/rechargable.dm create mode 100644 code/modules/projectiles/boxes_magazines/external/rifle.dm create mode 100644 code/modules/projectiles/boxes_magazines/external/shotgun.dm create mode 100644 code/modules/projectiles/boxes_magazines/external/smg.dm create mode 100644 code/modules/projectiles/boxes_magazines/external/sniper.dm create mode 100644 code/modules/projectiles/boxes_magazines/external/toy.dm delete mode 100644 code/modules/projectiles/boxes_magazines/external_mag.dm create mode 100644 code/modules/projectiles/boxes_magazines/internal/_cylinder.dm create mode 100644 code/modules/projectiles/boxes_magazines/internal/_internal.dm create mode 100644 code/modules/projectiles/boxes_magazines/internal/grenade.dm create mode 100644 code/modules/projectiles/boxes_magazines/internal/misc.dm create mode 100644 code/modules/projectiles/boxes_magazines/internal/revolver.dm create mode 100644 code/modules/projectiles/boxes_magazines/internal/rifle.dm create mode 100644 code/modules/projectiles/boxes_magazines/internal/shotgun.dm create mode 100644 code/modules/projectiles/boxes_magazines/internal/toy.dm delete mode 100644 code/modules/projectiles/boxes_magazines/internal_mag.dm rename code/modules/projectiles/guns/{ => energy}/mounted.dm (96%) rename code/modules/projectiles/guns/energy/{plasma.dm => plasma_cit.dm} (100%) rename code/modules/projectiles/guns/{ => misc}/beam_rifle.dm (97%) rename code/modules/projectiles/guns/{ => misc}/chem_gun.dm (95%) rename code/modules/projectiles/guns/{ => misc}/grenade_launcher.dm (97%) rename code/modules/projectiles/guns/{ => misc}/medbeam.dm (96%) rename code/modules/projectiles/guns/{ => misc}/syringe_gun.dm (96%) create mode 100644 code/modules/projectiles/projectile/bullets/_incendiary.dm create mode 100644 code/modules/projectiles/projectile/bullets/dart_syringe.dm create mode 100644 code/modules/projectiles/projectile/bullets/dnainjector.dm create mode 100644 code/modules/projectiles/projectile/bullets/grenade.dm create mode 100644 code/modules/projectiles/projectile/bullets/lmg.dm create mode 100644 code/modules/projectiles/projectile/bullets/pistol.dm create mode 100644 code/modules/projectiles/projectile/bullets/revolver.dm create mode 100644 code/modules/projectiles/projectile/bullets/rifle.dm create mode 100644 code/modules/projectiles/projectile/bullets/shotgun.dm create mode 100644 code/modules/projectiles/projectile/bullets/smg.dm create mode 100644 code/modules/projectiles/projectile/bullets/sniper.dm create mode 100644 code/modules/projectiles/projectile/bullets/special.dm delete mode 100644 code/modules/projectiles/projectile/energy.dm create mode 100644 code/modules/projectiles/projectile/energy/_energy.dm create mode 100644 code/modules/projectiles/projectile/energy/chameleon.dm create mode 100644 code/modules/projectiles/projectile/energy/ebow.dm create mode 100644 code/modules/projectiles/projectile/energy/misc.dm create mode 100644 code/modules/projectiles/projectile/energy/net_snare.dm create mode 100644 code/modules/projectiles/projectile/energy/stun.dm create mode 100644 code/modules/projectiles/projectile/energy/tesla.dm create mode 100644 code/modules/projectiles/projectile/reusable/_reusable.dm rename code/modules/projectiles/projectile/{reusable.dm => reusable/foam_dart.dm} (59%) create mode 100644 code/modules/projectiles/projectile/reusable/magspear.dm delete mode 100644 code/modules/projectiles/projectile/special.dm create mode 100644 code/modules/projectiles/projectile/special/curse.dm create mode 100644 code/modules/projectiles/projectile/special/floral.dm create mode 100644 code/modules/projectiles/projectile/special/gravity.dm create mode 100644 code/modules/projectiles/projectile/special/hallucination.dm create mode 100644 code/modules/projectiles/projectile/special/ion.dm create mode 100644 code/modules/projectiles/projectile/special/meteor.dm create mode 100644 code/modules/projectiles/projectile/special/mindflayer.dm create mode 100644 code/modules/projectiles/projectile/special/neurotoxin.dm create mode 100644 code/modules/projectiles/projectile/special/plasma.dm create mode 100644 code/modules/projectiles/projectile/special/rocket.dm create mode 100644 code/modules/projectiles/projectile/special/temperature.dm create mode 100644 code/modules/projectiles/projectile/special/wormhole.dm diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition/_ammunition.dm similarity index 100% rename from code/modules/projectiles/ammunition.dm rename to code/modules/projectiles/ammunition/_ammunition.dm diff --git a/code/modules/projectiles/firing.dm b/code/modules/projectiles/ammunition/_firing.dm similarity index 100% rename from code/modules/projectiles/firing.dm rename to code/modules/projectiles/ammunition/_firing.dm diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm deleted file mode 100644 index df0fd7278e..0000000000 --- a/code/modules/projectiles/ammunition/ammo_casings.dm +++ /dev/null @@ -1,314 +0,0 @@ -// .357 (Syndie Revolver) - -/obj/item/ammo_casing/a357 - name = ".357 bullet casing" - desc = "A .357 bullet casing." - caliber = "357" - projectile_type = /obj/item/projectile/bullet/a357 - -// 7.62 (Nagant Rifle) - -/obj/item/ammo_casing/a762 - name = "7.62 bullet casing" - desc = "A 7.62 bullet casing." - icon_state = "762-casing" - caliber = "a762" - projectile_type = /obj/item/projectile/bullet/a762 - -/obj/item/ammo_casing/a762/enchanted - projectile_type = /obj/item/projectile/bullet/a762_enchanted - -// 7.62x38mmR (Nagant Revolver) - -/obj/item/ammo_casing/n762 - name = "7.62x38mmR bullet casing" - desc = "A 7.62x38mmR bullet casing." - caliber = "n762" - projectile_type = /obj/item/projectile/bullet/n762 - -// .50AE (Desert Eagle) - -/obj/item/ammo_casing/a50AE - name = ".50AE bullet casing" - desc = "A .50AE bullet casing." - caliber = ".50" - projectile_type = /obj/item/projectile/bullet/a50AE - -// .38 (Detective's Gun) - -/obj/item/ammo_casing/c38 - name = ".38 bullet casing" - desc = "A .38 bullet casing." - caliber = "38" - projectile_type = /obj/item/projectile/bullet/c38 - -// 10mm (Stechkin) - -/obj/item/ammo_casing/c10mm - name = ".10mm bullet casing" - desc = "A 10mm bullet casing." - caliber = "10mm" - projectile_type = /obj/item/projectile/bullet/c10mm - -/obj/item/ammo_casing/c10mm/ap - name = ".10mm armor-piercing bullet casing" - desc = "A 10mm armor-piercing bullet casing." - projectile_type = /obj/item/projectile/bullet/c10mm_ap - -/obj/item/ammo_casing/c10mm/hp - name = ".10mm hollow-point bullet casing" - desc = "A 10mm hollow-point bullet casing." - projectile_type = /obj/item/projectile/bullet/c10mm_hp - -/obj/item/ammo_casing/c10mm/fire - name = ".10mm incendiary bullet casing" - desc = "A 10mm incendiary bullet casing." - projectile_type = /obj/item/projectile/bullet/incendiary/c10mm - -// 9mm (Stechkin APS) - -/obj/item/ammo_casing/c9mm - name = "9mm bullet casing" - desc = "A 9mm bullet casing." - caliber = "9mm" - projectile_type = /obj/item/projectile/bullet/c9mm - -/obj/item/ammo_casing/c9mm/ap - name = "9mm armor-piercing bullet casing" - desc = "A 9mm armor-piercing bullet casing." - projectile_type =/obj/item/projectile/bullet/c9mm_ap - -/obj/item/ammo_casing/c9mm/inc - name = "9mm incendiary bullet casing" - desc = "A 9mm incendiary bullet casing." - projectile_type = /obj/item/projectile/bullet/incendiary/c9mm - -// 4.6x30mm (Autorifles) - -/obj/item/ammo_casing/c46x30mm - name = "4.6x30mm bullet casing" - desc = "A 4.6x30mm bullet casing." - caliber = "4.6x30mm" - projectile_type = /obj/item/projectile/bullet/c46x30mm - -/obj/item/ammo_casing/c46x30mm/ap - name = "4.6x30mm armor-piercing bullet casing" - desc = "A 4.6x30mm armor-piercing bullet casing." - projectile_type = /obj/item/projectile/bullet/c46x30mm_ap - -/obj/item/ammo_casing/c46x30mm/inc - name = "4.6x30mm incendiary bullet casing" - desc = "A 4.6x30mm incendiary bullet casing." - projectile_type = /obj/item/projectile/bullet/incendiary/c46x30mm - -// .45 (M1911 + C20r) - -/obj/item/ammo_casing/c45 - name = ".45 bullet casing" - desc = "A .45 bullet casing." - caliber = ".45" - projectile_type = /obj/item/projectile/bullet/c45 - -/obj/item/ammo_casing/c45/nostamina - projectile_type = /obj/item/projectile/bullet/c45_nostamina - -// 5.56mm (M-90gl Carbine) - -/obj/item/ammo_casing/a556 - name = "5.56mm bullet casing" - desc = "A 5.56mm bullet casing." - caliber = "a556" - projectile_type = /obj/item/projectile/bullet/a556 - -// 40mm (Grenade Launcher) - -/obj/item/ammo_casing/a40mm - name = "40mm HE shell" - desc = "A cased high explosive grenade that can only be activated once fired out of a grenade launcher." - caliber = "40mm" - icon_state = "40mmHE" - projectile_type = /obj/item/projectile/bullet/a40mm - -// .50 (Sniper) - -/obj/item/ammo_casing/p50 - name = ".50 bullet casing" - desc = "A .50 bullet casing." - caliber = ".50" - projectile_type = /obj/item/projectile/bullet/p50 - icon_state = ".50" - -/obj/item/ammo_casing/p50/soporific - name = ".50 soporific bullet casing" - desc = "A .50 bullet casing, specialised in sending the target to sleep, instead of hell." - projectile_type = /obj/item/projectile/bullet/p50/soporific - icon_state = "sleeper" - -/obj/item/ammo_casing/p50/penetrator - name = ".50 penetrator round bullet casing" - desc = "A .50 caliber penetrator round casing." - projectile_type = /obj/item/projectile/bullet/p50/penetrator - -// 1.95x129mm (SAW) - -/obj/item/ammo_casing/mm195x129 - name = "1.95x129mm bullet casing" - desc = "A 1.95x129mm bullet casing." - icon_state = "762-casing" - caliber = "mm195129" - projectile_type = /obj/item/projectile/bullet/mm195x129 - -/obj/item/ammo_casing/mm195x129/ap - name = "1.95x129mm armor-piercing bullet casing" - desc = "A 1.95x129mm bullet casing designed with a hardened-tipped core to help penetrate armored targets." - projectile_type = /obj/item/projectile/bullet/mm195x129_ap - -/obj/item/ammo_casing/mm195x129/hollow - name = "1.95x129mm hollow-point bullet casing" - desc = "A 1.95x129mm bullet casing designed to cause more damage to unarmored targets." - projectile_type = /obj/item/projectile/bullet/mm195x129_hp - -/obj/item/ammo_casing/mm195x129/incen - name = "1.95x129mm incendiary bullet casing" - desc = "A 1.95x129mm bullet casing designed with a chemical-filled capsule on the tip that when bursted, reacts with the atmosphere to produce a fireball, engulfing the target in flames." - projectile_type = /obj/item/projectile/bullet/incendiary/mm195x129 - -// Shotgun - -/obj/item/ammo_casing/shotgun - name = "shotgun slug" - desc = "A 12 gauge lead slug." - icon_state = "blshell" - caliber = "shotgun" - projectile_type = /obj/item/projectile/bullet/shotgun_slug - materials = list(MAT_METAL=4000) - -/obj/item/ammo_casing/shotgun/beanbag - name = "beanbag slug" - desc = "A weak beanbag slug for riot control." - icon_state = "bshell" - projectile_type = /obj/item/projectile/bullet/shotgun_beanbag - materials = list(MAT_METAL=250) - -/obj/item/ammo_casing/shotgun/incendiary - name = "incendiary slug" - desc = "An incendiary-coated shotgun slug." - icon_state = "ishell" - projectile_type = /obj/item/projectile/bullet/incendiary/shotgun - -/obj/item/ammo_casing/shotgun/dragonsbreath - name = "dragonsbreath shell" - desc = "A shotgun shell which fires a spread of incendiary pellets." - icon_state = "ishell2" - projectile_type = /obj/item/projectile/bullet/incendiary/shotgun/dragonsbreath - pellets = 4 - variance = 35 - -/obj/item/ammo_casing/shotgun/stunslug - name = "taser slug" - desc = "A stunning taser slug." - icon_state = "stunshell" - projectile_type = /obj/item/projectile/bullet/shotgun_stunslug - materials = list(MAT_METAL=250) - -/obj/item/ammo_casing/shotgun/meteorslug - name = "meteorslug shell" - desc = "A shotgun shell rigged with CMC technology, which launches a massive slug when fired." - icon_state = "mshell" - projectile_type = /obj/item/projectile/bullet/shotgun_meteorslug - -/obj/item/ammo_casing/shotgun/pulseslug - name = "pulse slug" - desc = "A delicate device which can be loaded into a shotgun. The primer acts as a button which triggers the gain medium and fires a powerful \ - energy blast. While the heat and power drain limit it to one use, it can still allow an operator to engage targets that ballistic ammunition \ - would have difficulty with." - icon_state = "pshell" - projectile_type = /obj/item/projectile/beam/pulse/shotgun - -/obj/item/ammo_casing/shotgun/frag12 - name = "FRAG-12 slug" - desc = "A high explosive breaching round for a 12 gauge shotgun." - icon_state = "heshell" - projectile_type = /obj/item/projectile/bullet/shotgun_frag12 - -/obj/item/ammo_casing/shotgun/buckshot - name = "buckshot shell" - desc = "A 12 gauge buckshot shell." - icon_state = "gshell" - projectile_type = /obj/item/projectile/bullet/pellet/shotgun_buckshot - pellets = 6 - variance = 25 - -/obj/item/ammo_casing/shotgun/rubbershot - name = "rubber shot" - desc = "A shotgun casing filled with densely-packed rubber balls, used to incapacitate crowds from a distance." - icon_state = "bshell" - projectile_type = /obj/item/projectile/bullet/pellet/shotgun_rubbershot - pellets = 6 - variance = 25 - materials = list(MAT_METAL=4000) - -/obj/item/ammo_casing/shotgun/improvised - name = "improvised shell" - desc = "An extremely weak shotgun shell with multiple small pellets made out of metal shards." - icon_state = "improvshell" - projectile_type = /obj/item/projectile/bullet/pellet/shotgun_improvised - materials = list(MAT_METAL=250) - pellets = 10 - variance = 25 - -/obj/item/ammo_casing/shotgun/ion - name = "ion shell" - desc = "An advanced shotgun shell which uses a subspace ansible crystal to produce an effect similar to a standard ion rifle. \ - The unique properties of the crystal split the pulse into a spread of individually weaker bolts." - icon_state = "ionshell" - projectile_type = /obj/item/projectile/ion/weak - pellets = 4 - variance = 35 - -/obj/item/ammo_casing/shotgun/laserslug - name = "laser slug" - desc = "An advanced shotgun shell that uses a micro laser to replicate the effects of a laser weapon in a ballistic package." - icon_state = "lshell" - projectile_type = /obj/item/projectile/beam/laser - -/obj/item/ammo_casing/shotgun/techshell - name = "unloaded technological shell" - desc = "A high-tech shotgun shell which can be loaded with materials to produce unique effects." - icon_state = "cshell" - projectile_type = null - -/obj/item/ammo_casing/shotgun/dart - name = "shotgun dart" - desc = "A dart for use in shotguns. Can be injected with up to 30 units of any chemical." - icon_state = "cshell" - projectile_type = /obj/item/projectile/bullet/dart - var/reagent_amount = 30 - var/reagent_react = TRUE - -/obj/item/ammo_casing/shotgun/dart/noreact - name = "cryostasis shotgun dart" - desc = "A dart for use in shotguns, using similar technolgoy as cryostatis beakers to keep internal reagents from reacting. Can be injected with up to 10 units of any chemical." - icon_state = "cnrshell" - reagent_amount = 10 - reagent_react = FALSE - -/obj/item/ammo_casing/shotgun/dart/Initialize() - . = ..() - container_type |= OPENCONTAINER - create_reagents(reagent_amount) - reagents.set_reacting(reagent_react) - -/obj/item/ammo_casing/shotgun/dart/attackby() - return - -/obj/item/ammo_casing/shotgun/dart/bioterror - desc = "A shotgun dart filled with deadly toxins." - -/obj/item/ammo_casing/shotgun/dart/bioterror/Initialize() - . = ..() - reagents.add_reagent("neurotoxin", 6) - reagents.add_reagent("spore", 6) - reagents.add_reagent("mutetoxin", 6) //;HELP OPS IN MAINT - reagents.add_reagent("coniine", 6) - reagents.add_reagent("sodium_thiopental", 6) diff --git a/code/modules/projectiles/ammunition/ballistic/lmg.dm b/code/modules/projectiles/ammunition/ballistic/lmg.dm new file mode 100644 index 0000000000..1ce2e0065e --- /dev/null +++ b/code/modules/projectiles/ammunition/ballistic/lmg.dm @@ -0,0 +1,23 @@ +// 1.95x129mm (SAW) + +/obj/item/ammo_casing/mm195x129 + name = "1.95x129mm bullet casing" + desc = "A 1.95x129mm bullet casing." + icon_state = "762-casing" + caliber = "mm195129" + projectile_type = /obj/item/projectile/bullet/mm195x129 + +/obj/item/ammo_casing/mm195x129/ap + name = "1.95x129mm armor-piercing bullet casing" + desc = "A 1.95x129mm bullet casing designed with a hardened-tipped core to help penetrate armored targets." + projectile_type = /obj/item/projectile/bullet/mm195x129_ap + +/obj/item/ammo_casing/mm195x129/hollow + name = "1.95x129mm hollow-point bullet casing" + desc = "A 1.95x129mm bullet casing designed to cause more damage to unarmored targets." + projectile_type = /obj/item/projectile/bullet/mm195x129_hp + +/obj/item/ammo_casing/mm195x129/incen + name = "1.95x129mm incendiary bullet casing" + desc = "A 1.95x129mm bullet casing designed with a chemical-filled capsule on the tip that when bursted, reacts with the atmosphere to produce a fireball, engulfing the target in flames." + projectile_type = /obj/item/projectile/bullet/incendiary/mm195x129 diff --git a/code/modules/projectiles/ammunition/ballistic/pistol.dm b/code/modules/projectiles/ammunition/ballistic/pistol.dm new file mode 100644 index 0000000000..02134e95e1 --- /dev/null +++ b/code/modules/projectiles/ammunition/ballistic/pistol.dm @@ -0,0 +1,50 @@ +// 10mm (Stechkin) + +/obj/item/ammo_casing/c10mm + name = ".10mm bullet casing" + desc = "A 10mm bullet casing." + caliber = "10mm" + projectile_type = /obj/item/projectile/bullet/c10mm + +/obj/item/ammo_casing/c10mm/ap + name = ".10mm armor-piercing bullet casing" + desc = "A 10mm armor-piercing bullet casing." + projectile_type = /obj/item/projectile/bullet/c10mm_ap + +/obj/item/ammo_casing/c10mm/hp + name = ".10mm hollow-point bullet casing" + desc = "A 10mm hollow-point bullet casing." + projectile_type = /obj/item/projectile/bullet/c10mm_hp + +/obj/item/ammo_casing/c10mm/fire + name = ".10mm incendiary bullet casing" + desc = "A 10mm incendiary bullet casing." + projectile_type = /obj/item/projectile/bullet/incendiary/c10mm + +// 9mm (Stechkin APS) + +/obj/item/ammo_casing/c9mm + name = "9mm bullet casing" + desc = "A 9mm bullet casing." + caliber = "9mm" + projectile_type = /obj/item/projectile/bullet/c9mm + +/obj/item/ammo_casing/c9mm/ap + name = "9mm armor-piercing bullet casing" + desc = "A 9mm armor-piercing bullet casing." + projectile_type =/obj/item/projectile/bullet/c9mm_ap + +/obj/item/ammo_casing/c9mm/inc + name = "9mm incendiary bullet casing" + desc = "A 9mm incendiary bullet casing." + projectile_type = /obj/item/projectile/bullet/incendiary/c9mm + + +// .50AE (Desert Eagle) + +/obj/item/ammo_casing/a50AE + name = ".50AE bullet casing" + desc = "A .50AE bullet casing." + caliber = ".50" + projectile_type = /obj/item/projectile/bullet/a50AE + diff --git a/code/modules/projectiles/ammunition/ballistic/revolver.dm b/code/modules/projectiles/ammunition/ballistic/revolver.dm new file mode 100644 index 0000000000..52a72e0ff7 --- /dev/null +++ b/code/modules/projectiles/ammunition/ballistic/revolver.dm @@ -0,0 +1,23 @@ +// .357 (Syndie Revolver) + +/obj/item/ammo_casing/a357 + name = ".357 bullet casing" + desc = "A .357 bullet casing." + caliber = "357" + projectile_type = /obj/item/projectile/bullet/a357 + +// 7.62x38mmR (Nagant Revolver) + +/obj/item/ammo_casing/n762 + name = "7.62x38mmR bullet casing" + desc = "A 7.62x38mmR bullet casing." + caliber = "n762" + projectile_type = /obj/item/projectile/bullet/n762 + +// .38 (Detective's Gun) + +/obj/item/ammo_casing/c38 + name = ".38 bullet casing" + desc = "A .38 bullet casing." + caliber = "38" + projectile_type = /obj/item/projectile/bullet/c38 diff --git a/code/modules/projectiles/ammunition/ballistic/rifle.dm b/code/modules/projectiles/ammunition/ballistic/rifle.dm new file mode 100644 index 0000000000..a35cfcba1c --- /dev/null +++ b/code/modules/projectiles/ammunition/ballistic/rifle.dm @@ -0,0 +1,28 @@ +// 7.62 (Nagant Rifle) + +/obj/item/ammo_casing/a762 + name = "7.62 bullet casing" + desc = "A 7.62 bullet casing." + icon_state = "762-casing" + caliber = "a762" + projectile_type = /obj/item/projectile/bullet/a762 + +/obj/item/ammo_casing/a762/enchanted + projectile_type = /obj/item/projectile/bullet/a762_enchanted + +// 5.56mm (M-90gl Carbine) + +/obj/item/ammo_casing/a556 + name = "5.56mm bullet casing" + desc = "A 5.56mm bullet casing." + caliber = "a556" + projectile_type = /obj/item/projectile/bullet/a556 + +// 40mm (Grenade Launcher) + +/obj/item/ammo_casing/a40mm + name = "40mm HE shell" + desc = "A cased high explosive grenade that can only be activated once fired out of a grenade launcher." + caliber = "40mm" + icon_state = "40mmHE" + projectile_type = /obj/item/projectile/bullet/a40mm diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm new file mode 100644 index 0000000000..b700d092d7 --- /dev/null +++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm @@ -0,0 +1,139 @@ +// Shotgun + +/obj/item/ammo_casing/shotgun + name = "shotgun slug" + desc = "A 12 gauge lead slug." + icon_state = "blshell" + caliber = "shotgun" + projectile_type = /obj/item/projectile/bullet/shotgun_slug + materials = list(MAT_METAL=4000) + +/obj/item/ammo_casing/shotgun/beanbag + name = "beanbag slug" + desc = "A weak beanbag slug for riot control." + icon_state = "bshell" + projectile_type = /obj/item/projectile/bullet/shotgun_beanbag + materials = list(MAT_METAL=250) + +/obj/item/ammo_casing/shotgun/incendiary + name = "incendiary slug" + desc = "An incendiary-coated shotgun slug." + icon_state = "ishell" + projectile_type = /obj/item/projectile/bullet/incendiary/shotgun + +/obj/item/ammo_casing/shotgun/dragonsbreath + name = "dragonsbreath shell" + desc = "A shotgun shell which fires a spread of incendiary pellets." + icon_state = "ishell2" + projectile_type = /obj/item/projectile/bullet/incendiary/shotgun/dragonsbreath + pellets = 4 + variance = 35 + +/obj/item/ammo_casing/shotgun/stunslug + name = "taser slug" + desc = "A stunning taser slug." + icon_state = "stunshell" + projectile_type = /obj/item/projectile/bullet/shotgun_stunslug + materials = list(MAT_METAL=250) + +/obj/item/ammo_casing/shotgun/meteorslug + name = "meteorslug shell" + desc = "A shotgun shell rigged with CMC technology, which launches a massive slug when fired." + icon_state = "mshell" + projectile_type = /obj/item/projectile/bullet/shotgun_meteorslug + +/obj/item/ammo_casing/shotgun/pulseslug + name = "pulse slug" + desc = "A delicate device which can be loaded into a shotgun. The primer acts as a button which triggers the gain medium and fires a powerful \ + energy blast. While the heat and power drain limit it to one use, it can still allow an operator to engage targets that ballistic ammunition \ + would have difficulty with." + icon_state = "pshell" + projectile_type = /obj/item/projectile/beam/pulse/shotgun + +/obj/item/ammo_casing/shotgun/frag12 + name = "FRAG-12 slug" + desc = "A high explosive breaching round for a 12 gauge shotgun." + icon_state = "heshell" + projectile_type = /obj/item/projectile/bullet/shotgun_frag12 + +/obj/item/ammo_casing/shotgun/buckshot + name = "buckshot shell" + desc = "A 12 gauge buckshot shell." + icon_state = "gshell" + projectile_type = /obj/item/projectile/bullet/pellet/shotgun_buckshot + pellets = 6 + variance = 25 + +/obj/item/ammo_casing/shotgun/rubbershot + name = "rubber shot" + desc = "A shotgun casing filled with densely-packed rubber balls, used to incapacitate crowds from a distance." + icon_state = "bshell" + projectile_type = /obj/item/projectile/bullet/pellet/shotgun_rubbershot + pellets = 6 + variance = 25 + materials = list(MAT_METAL=4000) + +/obj/item/ammo_casing/shotgun/improvised + name = "improvised shell" + desc = "An extremely weak shotgun shell with multiple small pellets made out of metal shards." + icon_state = "improvshell" + projectile_type = /obj/item/projectile/bullet/pellet/shotgun_improvised + materials = list(MAT_METAL=250) + pellets = 10 + variance = 25 + +/obj/item/ammo_casing/shotgun/ion + name = "ion shell" + desc = "An advanced shotgun shell which uses a subspace ansible crystal to produce an effect similar to a standard ion rifle. \ + The unique properties of the crystal split the pulse into a spread of individually weaker bolts." + icon_state = "ionshell" + projectile_type = /obj/item/projectile/ion/weak + pellets = 4 + variance = 35 + +/obj/item/ammo_casing/shotgun/laserslug + name = "laser slug" + desc = "An advanced shotgun shell that uses a micro laser to replicate the effects of a laser weapon in a ballistic package." + icon_state = "lshell" + projectile_type = /obj/item/projectile/beam/laser + +/obj/item/ammo_casing/shotgun/techshell + name = "unloaded technological shell" + desc = "A high-tech shotgun shell which can be loaded with materials to produce unique effects." + icon_state = "cshell" + projectile_type = null + +/obj/item/ammo_casing/shotgun/dart + name = "shotgun dart" + desc = "A dart for use in shotguns. Can be injected with up to 30 units of any chemical." + icon_state = "cshell" + projectile_type = /obj/item/projectile/bullet/dart + var/reagent_amount = 30 + var/reagent_react = TRUE + +/obj/item/ammo_casing/shotgun/dart/noreact + name = "cryostasis shotgun dart" + desc = "A dart for use in shotguns, using similar technolgoy as cryostatis beakers to keep internal reagents from reacting. Can be injected with up to 10 units of any chemical." + icon_state = "cnrshell" + reagent_amount = 10 + reagent_react = FALSE + +/obj/item/ammo_casing/shotgun/dart/Initialize() + . = ..() + container_type |= OPENCONTAINER + create_reagents(reagent_amount) + reagents.set_reacting(reagent_react) + +/obj/item/ammo_casing/shotgun/dart/attackby() + return + +/obj/item/ammo_casing/shotgun/dart/bioterror + desc = "A shotgun dart filled with deadly toxins." + +/obj/item/ammo_casing/shotgun/dart/bioterror/Initialize() + . = ..() + reagents.add_reagent("neurotoxin", 6) + reagents.add_reagent("spore", 6) + reagents.add_reagent("mutetoxin", 6) //;HELP OPS IN MAINT + reagents.add_reagent("coniine", 6) + reagents.add_reagent("sodium_thiopental", 6) diff --git a/code/modules/projectiles/ammunition/ballistic/smg.dm b/code/modules/projectiles/ammunition/ballistic/smg.dm new file mode 100644 index 0000000000..3be419c933 --- /dev/null +++ b/code/modules/projectiles/ammunition/ballistic/smg.dm @@ -0,0 +1,28 @@ +// 4.6x30mm (Autorifles) + +/obj/item/ammo_casing/c46x30mm + name = "4.6x30mm bullet casing" + desc = "A 4.6x30mm bullet casing." + caliber = "4.6x30mm" + projectile_type = /obj/item/projectile/bullet/c46x30mm + +/obj/item/ammo_casing/c46x30mm/ap + name = "4.6x30mm armor-piercing bullet casing" + desc = "A 4.6x30mm armor-piercing bullet casing." + projectile_type = /obj/item/projectile/bullet/c46x30mm_ap + +/obj/item/ammo_casing/c46x30mm/inc + name = "4.6x30mm incendiary bullet casing" + desc = "A 4.6x30mm incendiary bullet casing." + projectile_type = /obj/item/projectile/bullet/incendiary/c46x30mm + +// .45 (M1911 + C20r) + +/obj/item/ammo_casing/c45 + name = ".45 bullet casing" + desc = "A .45 bullet casing." + caliber = ".45" + projectile_type = /obj/item/projectile/bullet/c45 + +/obj/item/ammo_casing/c45/nostamina + projectile_type = /obj/item/projectile/bullet/c45_nostamina diff --git a/code/modules/projectiles/ammunition/ballistic/sniper.dm b/code/modules/projectiles/ammunition/ballistic/sniper.dm new file mode 100644 index 0000000000..5906fcfaba --- /dev/null +++ b/code/modules/projectiles/ammunition/ballistic/sniper.dm @@ -0,0 +1,19 @@ +// .50 (Sniper) + +/obj/item/ammo_casing/p50 + name = ".50 bullet casing" + desc = "A .50 bullet casing." + caliber = ".50" + projectile_type = /obj/item/projectile/bullet/p50 + icon_state = ".50" + +/obj/item/ammo_casing/p50/soporific + name = ".50 soporific bullet casing" + desc = "A .50 bullet casing, specialised in sending the target to sleep, instead of hell." + projectile_type = /obj/item/projectile/bullet/p50/soporific + icon_state = "sleeper" + +/obj/item/ammo_casing/p50/penetrator + name = ".50 penetrator round bullet casing" + desc = "A .50 caliber penetrator round casing." + projectile_type = /obj/item/projectile/bullet/p50/penetrator diff --git a/code/modules/projectiles/ammunition/caseless/_caseless.dm b/code/modules/projectiles/ammunition/caseless/_caseless.dm new file mode 100644 index 0000000000..154d269cd9 --- /dev/null +++ b/code/modules/projectiles/ammunition/caseless/_caseless.dm @@ -0,0 +1,15 @@ +/obj/item/ammo_casing/caseless + desc = "A caseless bullet casing." + firing_effect_type = null + heavy_metal = FALSE + +/obj/item/ammo_casing/caseless/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread) + if (..()) //successfully firing + moveToNullspace() + return 1 + else + return 0 + +/obj/item/ammo_casing/caseless/update_icon() + ..() + icon_state = "[initial(icon_state)]" diff --git a/code/modules/projectiles/ammunition/caseless.dm b/code/modules/projectiles/ammunition/caseless/foam.dm similarity index 56% rename from code/modules/projectiles/ammunition/caseless.dm rename to code/modules/projectiles/ammunition/caseless/foam.dm index b3439c86b2..fdf685e001 100644 --- a/code/modules/projectiles/ammunition/caseless.dm +++ b/code/modules/projectiles/ammunition/caseless/foam.dm @@ -1,117 +1,61 @@ - -// Caseless Ammunition - -/obj/item/ammo_casing/caseless - desc = "A caseless bullet casing." - firing_effect_type = null - heavy_metal = FALSE - -/obj/item/ammo_casing/caseless/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread) - if (..()) //successfully firing - moveToNullspace() - return 1 - else - return 0 - -/obj/item/ammo_casing/caseless/update_icon() - ..() - icon_state = "[initial(icon_state)]" - -/obj/item/ammo_casing/caseless/a75 - desc = "A .75 bullet casing." - caliber = "75" - icon_state = "s-casing-live" - projectile_type = /obj/item/projectile/bullet/gyro - -/obj/item/ammo_casing/caseless/a84mm - desc = "An 84mm anti-armour rocket." - caliber = "84mm" - icon_state = "s-casing-live" - projectile_type = /obj/item/projectile/bullet/a84mm - -/obj/item/ammo_casing/caseless/magspear - name = "magnetic spear" - desc = "A reusable spear that is typically loaded into kinetic spearguns." - projectile_type = /obj/item/projectile/bullet/reusable/magspear - caliber = "speargun" - icon_state = "magspear" - throwforce = 15 //still deadly when thrown - throw_speed = 3 - - -/obj/item/ammo_casing/caseless/laser - name = "laser casing" - desc = "You shouldn't be seeing this." - caliber = "laser" - icon_state = "s-casing-live" - projectile_type = /obj/item/projectile/beam - fire_sound = 'sound/weapons/laser.ogg' - firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy - -/obj/item/ammo_casing/caseless/laser/gatling - projectile_type = /obj/item/projectile/beam/weak - variance = 0.8 - click_cooldown_override = 1 - - -/obj/item/ammo_casing/caseless/foam_dart - name = "foam dart" - desc = "It's nerf or nothing! Ages 8 and up." - projectile_type = /obj/item/projectile/bullet/reusable/foam_dart - caliber = "foam_force" - icon = 'icons/obj/guns/toy.dmi' - icon_state = "foamdart" - var/modified = 0 - -/obj/item/ammo_casing/caseless/foam_dart/update_icon() - ..() - if (modified) - icon_state = "foamdart_empty" - desc = "It's nerf or nothing! ... Although, this one doesn't look too safe." - if(BB) - BB.icon_state = "foamdart_empty" - else - icon_state = initial(icon_state) - desc = "It's nerf or nothing! Ages 8 and up." - if(BB) - BB.icon_state = initial(BB.icon_state) - - -/obj/item/ammo_casing/caseless/foam_dart/attackby(obj/item/A, mob/user, params) - var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB - if (istype(A, /obj/item/screwdriver) && !modified) - modified = 1 - FD.modified = 1 - FD.damage_type = BRUTE - to_chat(user, "You pop the safety cap off [src].") - update_icon() - else if (istype(A, /obj/item/pen)) - if(modified) - if(!FD.pen) - if(!user.transferItemToLoc(A, FD)) - return - FD.pen = A - FD.damage = 5 - FD.nodamage = 0 - to_chat(user, "You insert [A] into [src].") - else - to_chat(user, "There's already something in [src].") - else - to_chat(user, "The safety cap prevents you from inserting [A] into [src].") - else - return ..() - -/obj/item/ammo_casing/caseless/foam_dart/attack_self(mob/living/user) - var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB - if(FD.pen) - FD.damage = initial(FD.damage) - FD.nodamage = initial(FD.nodamage) - user.put_in_hands(FD.pen) - to_chat(user, "You remove [FD.pen] from [src].") - FD.pen = null - -/obj/item/ammo_casing/caseless/foam_dart/riot - name = "riot foam dart" - desc = "Whose smart idea was it to use toys as crowd control? Ages 18 and up." - projectile_type = /obj/item/projectile/bullet/reusable/foam_dart/riot - icon_state = "foamdart_riot" +/obj/item/ammo_casing/caseless/foam_dart + name = "foam dart" + desc = "It's nerf or nothing! Ages 8 and up." + projectile_type = /obj/item/projectile/bullet/reusable/foam_dart + caliber = "foam_force" + icon = 'icons/obj/guns/toy.dmi' + icon_state = "foamdart" + var/modified = 0 + +/obj/item/ammo_casing/caseless/foam_dart/update_icon() + ..() + if (modified) + icon_state = "foamdart_empty" + desc = "It's nerf or nothing! ... Although, this one doesn't look too safe." + if(BB) + BB.icon_state = "foamdart_empty" + else + icon_state = initial(icon_state) + desc = "It's nerf or nothing! Ages 8 and up." + if(BB) + BB.icon_state = initial(BB.icon_state) + + +/obj/item/ammo_casing/caseless/foam_dart/attackby(obj/item/A, mob/user, params) + var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB + if (istype(A, /obj/item/screwdriver) && !modified) + modified = 1 + FD.modified = 1 + FD.damage_type = BRUTE + to_chat(user, "You pop the safety cap off [src].") + update_icon() + else if (istype(A, /obj/item/pen)) + if(modified) + if(!FD.pen) + if(!user.transferItemToLoc(A, FD)) + return + FD.pen = A + FD.damage = 5 + FD.nodamage = 0 + to_chat(user, "You insert [A] into [src].") + else + to_chat(user, "There's already something in [src].") + else + to_chat(user, "The safety cap prevents you from inserting [A] into [src].") + else + return ..() + +/obj/item/ammo_casing/caseless/foam_dart/attack_self(mob/living/user) + var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB + if(FD.pen) + FD.damage = initial(FD.damage) + FD.nodamage = initial(FD.nodamage) + user.put_in_hands(FD.pen) + to_chat(user, "You remove [FD.pen] from [src].") + FD.pen = null + +/obj/item/ammo_casing/caseless/foam_dart/riot + name = "riot foam dart" + desc = "Whose smart idea was it to use toys as crowd control? Ages 18 and up." + projectile_type = /obj/item/projectile/bullet/reusable/foam_dart/riot + icon_state = "foamdart_riot" diff --git a/code/modules/projectiles/ammunition/caseless/misc.dm b/code/modules/projectiles/ammunition/caseless/misc.dm new file mode 100644 index 0000000000..fcb491f071 --- /dev/null +++ b/code/modules/projectiles/ammunition/caseless/misc.dm @@ -0,0 +1,22 @@ +/obj/item/ammo_casing/caseless/magspear + name = "magnetic spear" + desc = "A reusable spear that is typically loaded into kinetic spearguns." + projectile_type = /obj/item/projectile/bullet/reusable/magspear + caliber = "speargun" + icon_state = "magspear" + throwforce = 15 //still deadly when thrown + throw_speed = 3 + +/obj/item/ammo_casing/caseless/laser + name = "laser casing" + desc = "You shouldn't be seeing this." + caliber = "laser" + icon_state = "s-casing-live" + projectile_type = /obj/item/projectile/beam + fire_sound = 'sound/weapons/laser.ogg' + firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy + +/obj/item/ammo_casing/caseless/laser/gatling + projectile_type = /obj/item/projectile/beam/weak + variance = 0.8 + click_cooldown_override = 1 diff --git a/code/modules/projectiles/ammunition/caseless/rocket.dm b/code/modules/projectiles/ammunition/caseless/rocket.dm new file mode 100644 index 0000000000..0b74f6ff8c --- /dev/null +++ b/code/modules/projectiles/ammunition/caseless/rocket.dm @@ -0,0 +1,11 @@ +/obj/item/ammo_casing/caseless/a84mm + desc = "An 84mm anti-armour rocket." + caliber = "84mm" + icon_state = "s-casing-live" + projectile_type = /obj/item/projectile/bullet/a84mm + +/obj/item/ammo_casing/caseless/a75 + desc = "A .75 bullet casing." + caliber = "75" + icon_state = "s-casing-live" + projectile_type = /obj/item/projectile/bullet/gyro diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm deleted file mode 100644 index 96d0fd2e29..0000000000 --- a/code/modules/projectiles/ammunition/energy.dm +++ /dev/null @@ -1,258 +0,0 @@ -/obj/item/ammo_casing/energy - name = "energy weapon lens" - desc = "The part of the gun that makes the laser go pew." - caliber = "energy" - projectile_type = /obj/item/projectile/energy - var/e_cost = 100 //The amount of energy a cell needs to expend to create this shot. - var/select_name = "energy" - fire_sound = 'sound/weapons/laser.ogg' - firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy - heavy_metal = FALSE - -/obj/item/ammo_casing/energy/chameleon - projectile_type = /obj/item/projectile/energy/chameleon - e_cost = 0 - var/hitscan_mode = FALSE - var/list/projectile_vars = list() - -/obj/item/ammo_casing/energy/chameleon/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") - . = ..() - if(!BB) - newshot() - for(var/V in projectile_vars) - if(BB.vars.Find(V)) - BB.vars[V] = projectile_vars[V] - if(hitscan_mode) - BB.hitscan = TRUE - -/obj/item/ammo_casing/energy/laser - projectile_type = /obj/item/projectile/beam/laser - select_name = "kill" - -/obj/item/ammo_casing/energy/lasergun - projectile_type = /obj/item/projectile/beam/laser - e_cost = 83 - select_name = "kill" - -/obj/item/ammo_casing/energy/lasergun/old - projectile_type = /obj/item/projectile/beam/laser - e_cost = 200 - select_name = "kill" - -/obj/item/ammo_casing/energy/laser/hos - e_cost = 100 - -/obj/item/ammo_casing/energy/laser/practice - projectile_type = /obj/item/projectile/beam/practice - select_name = "practice" - -/obj/item/ammo_casing/energy/laser/scatter - projectile_type = /obj/item/projectile/beam/scatter - pellets = 5 - variance = 25 - select_name = "scatter" - -/obj/item/ammo_casing/energy/laser/scatter/disabler - projectile_type = /obj/item/projectile/beam/disabler - pellets = 3 - variance = 15 - -/obj/item/ammo_casing/energy/laser/heavy - projectile_type = /obj/item/projectile/beam/laser/heavylaser - select_name = "anti-vehicle" - fire_sound = 'sound/weapons/lasercannonfire.ogg' - -/obj/item/ammo_casing/energy/laser/pulse - projectile_type = /obj/item/projectile/beam/pulse - e_cost = 200 - select_name = "DESTROY" - fire_sound = 'sound/weapons/pulse.ogg' - -/obj/item/ammo_casing/energy/laser/bluetag - projectile_type = /obj/item/projectile/beam/lasertag/bluetag - select_name = "bluetag" - -/obj/item/ammo_casing/energy/laser/bluetag/hitscan - projectile_type = /obj/item/projectile/beam/lasertag/bluetag/hitscan - -/obj/item/ammo_casing/energy/laser/redtag - projectile_type = /obj/item/projectile/beam/lasertag/redtag - select_name = "redtag" - -/obj/item/ammo_casing/energy/laser/redtag/hitscan - projectile_type = /obj/item/projectile/beam/lasertag/redtag/hitscan - -/obj/item/ammo_casing/energy/xray - projectile_type = /obj/item/projectile/beam/xray - e_cost = 50 - fire_sound = 'sound/weapons/laser3.ogg' - -/obj/item/ammo_casing/energy/electrode - projectile_type = /obj/item/projectile/energy/electrode - select_name = "stun" - fire_sound = 'sound/weapons/taser.ogg' - e_cost = 200 - -/obj/item/ammo_casing/energy/electrode/spec - e_cost = 100 - -/obj/item/ammo_casing/energy/electrode/gun - fire_sound = 'sound/weapons/gunshot.ogg' - e_cost = 100 - -/obj/item/ammo_casing/energy/electrode/hos - e_cost = 200 - -/obj/item/ammo_casing/energy/electrode/old - e_cost = 1000 - -/obj/item/ammo_casing/energy/ion - projectile_type = /obj/item/projectile/ion - select_name = "ion" - fire_sound = 'sound/weapons/ionrifle.ogg' - -/obj/item/ammo_casing/energy/declone - projectile_type = /obj/item/projectile/energy/declone - select_name = "declone" - fire_sound = 'sound/weapons/pulse3.ogg' - -/obj/item/ammo_casing/energy/mindflayer - projectile_type = /obj/item/projectile/beam/mindflayer - select_name = "MINDFUCK" - fire_sound = 'sound/weapons/laser.ogg' - -/obj/item/ammo_casing/energy/flora - fire_sound = 'sound/effects/stealthoff.ogg' - -/obj/item/ammo_casing/energy/flora/yield - projectile_type = /obj/item/projectile/energy/florayield - select_name = "yield" - -/obj/item/ammo_casing/energy/flora/mut - projectile_type = /obj/item/projectile/energy/floramut - select_name = "mutation" - -/obj/item/ammo_casing/energy/temp - projectile_type = /obj/item/projectile/temp - select_name = "freeze" - e_cost = 250 - fire_sound = 'sound/weapons/pulse3.ogg' - -/obj/item/ammo_casing/energy/temp/hot - projectile_type = /obj/item/projectile/temp/hot - select_name = "bake" - -/obj/item/ammo_casing/energy/meteor - projectile_type = /obj/item/projectile/meteor - select_name = "goddamn meteor" - -/obj/item/ammo_casing/energy/disabler - projectile_type = /obj/item/projectile/beam/disabler - select_name = "disable" - e_cost = 50 - fire_sound = 'sound/weapons/taser2.ogg' - -/obj/item/ammo_casing/energy/plasma - projectile_type = /obj/item/projectile/plasma - select_name = "plasma burst" - fire_sound = 'sound/weapons/plasma_cutter.ogg' - delay = 15 - e_cost = 25 - -/obj/item/ammo_casing/energy/plasma/adv - projectile_type = /obj/item/projectile/plasma/adv - delay = 10 - e_cost = 10 - -/obj/item/ammo_casing/energy/wormhole - projectile_type = /obj/item/projectile/beam/wormhole - e_cost = 0 - fire_sound = 'sound/weapons/pulse3.ogg' - var/obj/item/gun/energy/wormhole_projector/gun = null - select_name = "blue" - -/obj/item/ammo_casing/energy/wormhole/orange - projectile_type = /obj/item/projectile/beam/wormhole/orange - select_name = "orange" - -/obj/item/ammo_casing/energy/bolt - projectile_type = /obj/item/projectile/energy/bolt - select_name = "bolt" - e_cost = 500 - fire_sound = 'sound/weapons/genhit.ogg' - -/obj/item/ammo_casing/energy/bolt/halloween - projectile_type = /obj/item/projectile/energy/bolt/halloween - -/obj/item/ammo_casing/energy/bolt/large - projectile_type = /obj/item/projectile/energy/bolt/large - select_name = "heavy bolt" - -/obj/item/ammo_casing/energy/net - projectile_type = /obj/item/projectile/energy/net - select_name = "netting" - pellets = 6 - variance = 40 - -/obj/item/ammo_casing/energy/trap - projectile_type = /obj/item/projectile/energy/trap - select_name = "snare" - -/obj/item/ammo_casing/energy/instakill - projectile_type = /obj/item/projectile/beam/instakill - e_cost = 0 - select_name = "DESTROY" - -/obj/item/ammo_casing/energy/instakill/blue - projectile_type = /obj/item/projectile/beam/instakill/blue - -/obj/item/ammo_casing/energy/instakill/red - projectile_type = /obj/item/projectile/beam/instakill/red - -/obj/item/ammo_casing/energy/tesla_revolver - fire_sound = 'sound/magic/lightningbolt.ogg' - e_cost = 200 - select_name = "stun" - projectile_type = /obj/item/projectile/energy/tesla/revolver - -/obj/item/ammo_casing/energy/gravityrepulse - projectile_type = /obj/item/projectile/gravityrepulse - e_cost = 0 - fire_sound = 'sound/weapons/wave.ogg' - select_name = "repulse" - delay = 50 - var/obj/item/gun/energy/gravity_gun/gun = null - -/obj/item/ammo_casing/energy/gravityrepulse/New(var/obj/item/gun/energy/gravity_gun/G) - gun = G - -/obj/item/ammo_casing/energy/gravityattract - projectile_type = /obj/item/projectile/gravityattract - e_cost = 0 - fire_sound = 'sound/weapons/wave.ogg' - select_name = "attract" - delay = 50 - var/obj/item/gun/energy/gravity_gun/gun = null - - -/obj/item/ammo_casing/energy/gravityattract/New(var/obj/item/gun/energy/gravity_gun/G) - gun = G - -/obj/item/ammo_casing/energy/gravitychaos - projectile_type = /obj/item/projectile/gravitychaos - e_cost = 0 - fire_sound = 'sound/weapons/wave.ogg' - select_name = "chaos" - delay = 50 - var/obj/item/gun/energy/gravity_gun/gun = null - -/obj/item/ammo_casing/energy/gravitychaos/New(var/obj/item/gun/energy/gravity_gun/G) - gun = G - -/obj/item/ammo_casing/energy/plasma - projectile_type = /obj/item/projectile/plasma - select_name = "plasma burst" - fire_sound = 'sound/weapons/pulse.ogg' - -/obj/item/ammo_casing/energy/plasma/adv - projectile_type = /obj/item/projectile/plasma/adv diff --git a/code/modules/projectiles/ammunition/energy/_energy.dm b/code/modules/projectiles/ammunition/energy/_energy.dm new file mode 100644 index 0000000000..3a4e457c3d --- /dev/null +++ b/code/modules/projectiles/ammunition/energy/_energy.dm @@ -0,0 +1,10 @@ +/obj/item/ammo_casing/energy + name = "energy weapon lens" + desc = "The part of the gun that makes the laser go pew." + caliber = "energy" + projectile_type = /obj/item/projectile/energy + var/e_cost = 100 //The amount of energy a cell needs to expend to create this shot. + var/select_name = "energy" + fire_sound = 'sound/weapons/laser.ogg' + firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy + heavy_metal = FALSE diff --git a/code/modules/projectiles/ammunition/energy/chameleon.dm b/code/modules/projectiles/ammunition/energy/chameleon.dm new file mode 100644 index 0000000000..4688518d46 --- /dev/null +++ b/code/modules/projectiles/ammunition/energy/chameleon.dm @@ -0,0 +1,15 @@ +/obj/item/ammo_casing/energy/chameleon + projectile_type = /obj/item/projectile/energy/chameleon + e_cost = 0 + var/hitscan_mode = FALSE + var/list/projectile_vars = list() + +/obj/item/ammo_casing/energy/chameleon/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") + . = ..() + if(!BB) + newshot() + for(var/V in projectile_vars) + if(BB.vars.Find(V)) + BB.vars[V] = projectile_vars[V] + if(hitscan_mode) + BB.hitscan = TRUE diff --git a/code/modules/projectiles/ammunition/energy/ebow.dm b/code/modules/projectiles/ammunition/energy/ebow.dm new file mode 100644 index 0000000000..8d9c72d1ba --- /dev/null +++ b/code/modules/projectiles/ammunition/energy/ebow.dm @@ -0,0 +1,12 @@ +/obj/item/ammo_casing/energy/bolt + projectile_type = /obj/item/projectile/energy/bolt + select_name = "bolt" + e_cost = 500 + fire_sound = 'sound/weapons/genhit.ogg' + +/obj/item/ammo_casing/energy/bolt/halloween + projectile_type = /obj/item/projectile/energy/bolt/halloween + +/obj/item/ammo_casing/energy/bolt/large + projectile_type = /obj/item/projectile/energy/bolt/large + select_name = "heavy bolt" diff --git a/code/modules/projectiles/ammunition/energy/gravity.dm b/code/modules/projectiles/ammunition/energy/gravity.dm new file mode 100644 index 0000000000..f549a5b5e4 --- /dev/null +++ b/code/modules/projectiles/ammunition/energy/gravity.dm @@ -0,0 +1,36 @@ +/obj/item/ammo_casing/energy/gravityrepulse + projectile_type = /obj/item/projectile/gravityrepulse + e_cost = 0 + fire_sound = 'sound/weapons/wave.ogg' + select_name = "repulse" + delay = 50 + var/obj/item/gun/energy/gravity_gun/gun + +/obj/item/ammo_casing/energy/gravityrepulse/Initialize(mapload, obj/item/gun/energy/gravity_gun/G) + . = ..() + gun = G + +/obj/item/ammo_casing/energy/gravityattract + projectile_type = /obj/item/projectile/gravityattract + e_cost = 0 + fire_sound = 'sound/weapons/wave.ogg' + select_name = "attract" + delay = 50 + var/obj/item/gun/energy/gravity_gun/gun + + +/obj/item/ammo_casing/energy/gravityattract/Initialize(mapload, obj/item/gun/energy/gravity_gun/G) + . = ..() + gun = G + +/obj/item/ammo_casing/energy/gravitychaos + projectile_type = /obj/item/projectile/gravitychaos + e_cost = 0 + fire_sound = 'sound/weapons/wave.ogg' + select_name = "chaos" + delay = 50 + var/obj/item/gun/energy/gravity_gun/gun + +/obj/item/ammo_casing/energy/gravitychaos/Initialize(mapload, obj/item/gun/energy/gravity_gun/G) + . = ..() + gun = G diff --git a/code/modules/projectiles/ammunition/energy/laser.dm b/code/modules/projectiles/ammunition/energy/laser.dm new file mode 100644 index 0000000000..c87ea2ffbd --- /dev/null +++ b/code/modules/projectiles/ammunition/energy/laser.dm @@ -0,0 +1,66 @@ +/obj/item/ammo_casing/energy/laser + projectile_type = /obj/item/projectile/beam/laser + select_name = "kill" + +/obj/item/ammo_casing/energy/lasergun + projectile_type = /obj/item/projectile/beam/laser + e_cost = 83 + select_name = "kill" + +/obj/item/ammo_casing/energy/lasergun/old + projectile_type = /obj/item/projectile/beam/laser + e_cost = 200 + select_name = "kill" + +/obj/item/ammo_casing/energy/laser/hos + e_cost = 100 + +/obj/item/ammo_casing/energy/laser/practice + projectile_type = /obj/item/projectile/beam/practice + select_name = "practice" + +/obj/item/ammo_casing/energy/laser/scatter + projectile_type = /obj/item/projectile/beam/scatter + pellets = 5 + variance = 25 + select_name = "scatter" + +/obj/item/ammo_casing/energy/laser/scatter/disabler + projectile_type = /obj/item/projectile/beam/disabler + pellets = 3 + variance = 15 + +/obj/item/ammo_casing/energy/laser/heavy + projectile_type = /obj/item/projectile/beam/laser/heavylaser + select_name = "anti-vehicle" + fire_sound = 'sound/weapons/lasercannonfire.ogg' + +/obj/item/ammo_casing/energy/laser/pulse + projectile_type = /obj/item/projectile/beam/pulse + e_cost = 200 + select_name = "DESTROY" + fire_sound = 'sound/weapons/pulse.ogg' + +/obj/item/ammo_casing/energy/laser/bluetag + projectile_type = /obj/item/projectile/beam/lasertag/bluetag + select_name = "bluetag" + +/obj/item/ammo_casing/energy/laser/bluetag/hitscan + projectile_type = /obj/item/projectile/beam/lasertag/bluetag/hitscan + +/obj/item/ammo_casing/energy/laser/redtag + projectile_type = /obj/item/projectile/beam/lasertag/redtag + select_name = "redtag" + +/obj/item/ammo_casing/energy/laser/redtag/hitscan + projectile_type = /obj/item/projectile/beam/lasertag/redtag/hitscan + +/obj/item/ammo_casing/energy/xray + projectile_type = /obj/item/projectile/beam/xray + e_cost = 50 + fire_sound = 'sound/weapons/laser3.ogg' + +/obj/item/ammo_casing/energy/mindflayer + projectile_type = /obj/item/projectile/beam/mindflayer + select_name = "MINDFUCK" + fire_sound = 'sound/weapons/laser.ogg' diff --git a/code/modules/projectiles/ammunition/energy/lmg.dm b/code/modules/projectiles/ammunition/energy/lmg.dm new file mode 100644 index 0000000000..5ebe83f792 --- /dev/null +++ b/code/modules/projectiles/ammunition/energy/lmg.dm @@ -0,0 +1,6 @@ +/obj/item/ammo_casing/energy/c3dbullet + projectile_type = /obj/item/projectile/bullet/c3d + select_name = "spraydown" + fire_sound = 'sound/weapons/gunshot_smg.ogg' + e_cost = 20 + firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect diff --git a/code/modules/projectiles/ammunition/energy/plasma.dm b/code/modules/projectiles/ammunition/energy/plasma.dm new file mode 100644 index 0000000000..d02abf9c88 --- /dev/null +++ b/code/modules/projectiles/ammunition/energy/plasma.dm @@ -0,0 +1,11 @@ +/obj/item/ammo_casing/energy/plasma + projectile_type = /obj/item/projectile/plasma + select_name = "plasma burst" + fire_sound = 'sound/weapons/plasma_cutter.ogg' + delay = 15 + e_cost = 25 + +/obj/item/ammo_casing/energy/plasma/adv + projectile_type = /obj/item/projectile/plasma/adv + delay = 10 + e_cost = 10 diff --git a/code/modules/projectiles/ammunition/plasma.dm b/code/modules/projectiles/ammunition/energy/plasma_cit.dm similarity index 100% rename from code/modules/projectiles/ammunition/plasma.dm rename to code/modules/projectiles/ammunition/energy/plasma_cit.dm diff --git a/code/modules/projectiles/ammunition/energy/portal.dm b/code/modules/projectiles/ammunition/energy/portal.dm new file mode 100644 index 0000000000..3a6300a2f5 --- /dev/null +++ b/code/modules/projectiles/ammunition/energy/portal.dm @@ -0,0 +1,14 @@ +/obj/item/ammo_casing/energy/wormhole + projectile_type = /obj/item/projectile/beam/wormhole + e_cost = 0 + fire_sound = 'sound/weapons/pulse3.ogg' + var/obj/item/gun/energy/wormhole_projector/gun = null + select_name = "blue" + +/obj/item/ammo_casing/energy/wormhole/orange + projectile_type = /obj/item/projectile/beam/wormhole/orange + select_name = "orange" + +/obj/item/ammo_casing/energy/wormhole/Initialize(mapload, obj/item/gun/energy/wormhole_projector/wh) + . = ..() + gun = wh diff --git a/code/modules/projectiles/ammunition/energy/special.dm b/code/modules/projectiles/ammunition/energy/special.dm new file mode 100644 index 0000000000..0438baf490 --- /dev/null +++ b/code/modules/projectiles/ammunition/energy/special.dm @@ -0,0 +1,61 @@ +/obj/item/ammo_casing/energy/ion + projectile_type = /obj/item/projectile/ion + select_name = "ion" + fire_sound = 'sound/weapons/ionrifle.ogg' + +/obj/item/ammo_casing/energy/declone + projectile_type = /obj/item/projectile/energy/declone + select_name = "declone" + fire_sound = 'sound/weapons/pulse3.ogg' + +/obj/item/ammo_casing/energy/flora + fire_sound = 'sound/effects/stealthoff.ogg' + +/obj/item/ammo_casing/energy/flora/yield + projectile_type = /obj/item/projectile/energy/florayield + select_name = "yield" + +/obj/item/ammo_casing/energy/flora/mut + projectile_type = /obj/item/projectile/energy/floramut + select_name = "mutation" + +/obj/item/ammo_casing/energy/temp + projectile_type = /obj/item/projectile/temp + select_name = "freeze" + e_cost = 250 + fire_sound = 'sound/weapons/pulse3.ogg' + +/obj/item/ammo_casing/energy/temp/hot + projectile_type = /obj/item/projectile/temp/hot + select_name = "bake" + +/obj/item/ammo_casing/energy/meteor + projectile_type = /obj/item/projectile/meteor + select_name = "goddamn meteor" + +/obj/item/ammo_casing/energy/net + projectile_type = /obj/item/projectile/energy/net + select_name = "netting" + pellets = 6 + variance = 40 + +/obj/item/ammo_casing/energy/trap + projectile_type = /obj/item/projectile/energy/trap + select_name = "snare" + +/obj/item/ammo_casing/energy/instakill + projectile_type = /obj/item/projectile/beam/instakill + e_cost = 0 + select_name = "DESTROY" + +/obj/item/ammo_casing/energy/instakill/blue + projectile_type = /obj/item/projectile/beam/instakill/blue + +/obj/item/ammo_casing/energy/instakill/red + projectile_type = /obj/item/projectile/beam/instakill/red + +/obj/item/ammo_casing/energy/tesla_revolver + fire_sound = 'sound/magic/lightningbolt.ogg' + e_cost = 200 + select_name = "stun" + projectile_type = /obj/item/projectile/energy/tesla/revolver diff --git a/code/modules/projectiles/ammunition/energy/stun.dm b/code/modules/projectiles/ammunition/energy/stun.dm new file mode 100644 index 0000000000..5a88a97b08 --- /dev/null +++ b/code/modules/projectiles/ammunition/energy/stun.dm @@ -0,0 +1,24 @@ +/obj/item/ammo_casing/energy/electrode + projectile_type = /obj/item/projectile/energy/electrode + select_name = "stun" + fire_sound = 'sound/weapons/taser.ogg' + e_cost = 200 + +/obj/item/ammo_casing/energy/electrode/spec + e_cost = 100 + +/obj/item/ammo_casing/energy/electrode/gun + fire_sound = 'sound/weapons/gunshot.ogg' + e_cost = 100 + +/obj/item/ammo_casing/energy/electrode/hos + e_cost = 200 + +/obj/item/ammo_casing/energy/electrode/old + e_cost = 1000 + +/obj/item/ammo_casing/energy/disabler + projectile_type = /obj/item/projectile/beam/disabler + select_name = "disable" + e_cost = 50 + fire_sound = 'sound/weapons/taser2.ogg' diff --git a/code/modules/projectiles/ammunition/special/magic.dm b/code/modules/projectiles/ammunition/special/magic.dm new file mode 100644 index 0000000000..6ebf5739a9 --- /dev/null +++ b/code/modules/projectiles/ammunition/special/magic.dm @@ -0,0 +1,42 @@ +/obj/item/ammo_casing/magic + name = "magic casing" + desc = "I didn't even know magic needed ammo..." + projectile_type = /obj/item/projectile/magic + firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/magic + heavy_metal = FALSE + +/obj/item/ammo_casing/magic/change + projectile_type = /obj/item/projectile/magic/change + +/obj/item/ammo_casing/magic/animate + projectile_type = /obj/item/projectile/magic/animate + +/obj/item/ammo_casing/magic/heal + projectile_type = /obj/item/projectile/magic/resurrection + +/obj/item/ammo_casing/magic/death + projectile_type = /obj/item/projectile/magic/death + +/obj/item/ammo_casing/magic/teleport + projectile_type = /obj/item/projectile/magic/teleport + +/obj/item/ammo_casing/magic/door + projectile_type = /obj/item/projectile/magic/door + +/obj/item/ammo_casing/magic/fireball + projectile_type = /obj/item/projectile/magic/aoe/fireball + +/obj/item/ammo_casing/magic/chaos + projectile_type = /obj/item/projectile/magic + +/obj/item/ammo_casing/magic/spellblade + projectile_type = /obj/item/projectile/magic/spellblade + +/obj/item/ammo_casing/magic/arcane_barrage + projectile_type = /obj/item/projectile/magic/arcane_barrage + +/obj/item/ammo_casing/magic/chaos/newshot() + ..() + +/obj/item/ammo_casing/magic/honk + projectile_type = /obj/item/projectile/bullet/honker diff --git a/code/modules/projectiles/ammunition/special.dm b/code/modules/projectiles/ammunition/special/syringe.dm similarity index 53% rename from code/modules/projectiles/ammunition/special.dm rename to code/modules/projectiles/ammunition/special/syringe.dm index b378d7fa6c..4a2a354ca6 100644 --- a/code/modules/projectiles/ammunition/special.dm +++ b/code/modules/projectiles/ammunition/special/syringe.dm @@ -1,111 +1,61 @@ -/obj/item/ammo_casing/magic - name = "magic casing" - desc = "I didn't even know magic needed ammo..." - projectile_type = /obj/item/projectile/magic - firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/magic - heavy_metal = FALSE - -/obj/item/ammo_casing/magic/change - projectile_type = /obj/item/projectile/magic/change - -/obj/item/ammo_casing/magic/animate - projectile_type = /obj/item/projectile/magic/animate - -/obj/item/ammo_casing/magic/heal - projectile_type = /obj/item/projectile/magic/resurrection - -/obj/item/ammo_casing/magic/death - projectile_type = /obj/item/projectile/magic/death - -/obj/item/ammo_casing/magic/teleport - projectile_type = /obj/item/projectile/magic/teleport - -/obj/item/ammo_casing/magic/door - projectile_type = /obj/item/projectile/magic/door - -/obj/item/ammo_casing/magic/fireball - projectile_type = /obj/item/projectile/magic/aoe/fireball - -/obj/item/ammo_casing/magic/chaos - projectile_type = /obj/item/projectile/magic - -/obj/item/ammo_casing/magic/spellblade - projectile_type = /obj/item/projectile/magic/spellblade - -/obj/item/ammo_casing/magic/arcane_barrage - projectile_type = /obj/item/projectile/magic/arcane_barrage - -/obj/item/ammo_casing/magic/chaos/newshot() - ..() - -/obj/item/ammo_casing/magic/honk - projectile_type = /obj/item/projectile/bullet/honker - -/obj/item/ammo_casing/syringegun - name = "syringe gun spring" - desc = "A high-power spring that throws syringes." - projectile_type = /obj/item/projectile/bullet/dart/syringe - firing_effect_type = null - -/obj/item/ammo_casing/syringegun/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") - if(!BB) - return - if(istype(loc, /obj/item/gun/syringe)) - var/obj/item/gun/syringe/SG = loc - if(!SG.syringes.len) - return - - var/obj/item/reagent_containers/syringe/S = SG.syringes[1] - - S.reagents.trans_to(BB, S.reagents.total_volume) - BB.name = S.name - var/obj/item/projectile/bullet/dart/D = BB - D.piercing = S.proj_piercing - SG.syringes.Remove(S) - qdel(S) - ..() - -/obj/item/ammo_casing/chemgun - name = "dart synthesiser" - desc = "A high-power spring, linked to an energy-based dart synthesiser." - projectile_type = /obj/item/projectile/bullet/dart - firing_effect_type = null - -/obj/item/ammo_casing/chemgun/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") - if(!BB) - return - if(istype(loc, /obj/item/gun/chem)) - var/obj/item/gun/chem/CG = loc - if(CG.syringes_left <= 0) - return - CG.reagents.trans_to(BB, 15) - BB.name = "chemical dart" - CG.syringes_left-- - ..() - -/obj/item/ammo_casing/dnainjector - name = "rigged syringe gun spring" - desc = "A high-power spring that throws DNA injectors." - projectile_type = /obj/item/projectile/bullet/dnainjector - firing_effect_type = null - -/obj/item/ammo_casing/dnainjector/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") - if(!BB) - return - if(istype(loc, /obj/item/gun/syringe/dna)) - var/obj/item/gun/syringe/dna/SG = loc - if(!SG.syringes.len) - return - - var/obj/item/dnainjector/S = popleft(SG.syringes) - var/obj/item/projectile/bullet/dnainjector/D = BB - S.forceMove(D) - D.injector = S - ..() - -/obj/item/ammo_casing/energy/c3dbullet - projectile_type = /obj/item/projectile/bullet/c3d - select_name = "spraydown" - fire_sound = 'sound/weapons/gunshot_smg.ogg' - e_cost = 20 - firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect +/obj/item/ammo_casing/syringegun + name = "syringe gun spring" + desc = "A high-power spring that throws syringes." + projectile_type = /obj/item/projectile/bullet/dart/syringe + firing_effect_type = null + +/obj/item/ammo_casing/syringegun/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") + if(!BB) + return + if(istype(loc, /obj/item/gun/syringe)) + var/obj/item/gun/syringe/SG = loc + if(!SG.syringes.len) + return + + var/obj/item/reagent_containers/syringe/S = SG.syringes[1] + + S.reagents.trans_to(BB, S.reagents.total_volume) + BB.name = S.name + var/obj/item/projectile/bullet/dart/D = BB + D.piercing = S.proj_piercing + SG.syringes.Remove(S) + qdel(S) + ..() + +/obj/item/ammo_casing/chemgun + name = "dart synthesiser" + desc = "A high-power spring, linked to an energy-based dart synthesiser." + projectile_type = /obj/item/projectile/bullet/dart + firing_effect_type = null + +/obj/item/ammo_casing/chemgun/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") + if(!BB) + return + if(istype(loc, /obj/item/gun/chem)) + var/obj/item/gun/chem/CG = loc + if(CG.syringes_left <= 0) + return + CG.reagents.trans_to(BB, 15) + BB.name = "chemical dart" + CG.syringes_left-- + ..() + +/obj/item/ammo_casing/dnainjector + name = "rigged syringe gun spring" + desc = "A high-power spring that throws DNA injectors." + projectile_type = /obj/item/projectile/bullet/dnainjector + firing_effect_type = null + +/obj/item/ammo_casing/dnainjector/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") + if(!BB) + return + if(istype(loc, /obj/item/gun/syringe/dna)) + var/obj/item/gun/syringe/dna/SG = loc + if(!SG.syringes.len) + return + + var/obj/item/dnainjector/S = popleft(SG.syringes) + var/obj/item/projectile/bullet/dnainjector/D = BB + S.forceMove(D) + D.injector = S + ..() diff --git a/code/modules/projectiles/box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm similarity index 96% rename from code/modules/projectiles/box_magazine.dm rename to code/modules/projectiles/boxes_magazines/_box_magazine.dm index 57860e7910..1c5a2b1199 100644 --- a/code/modules/projectiles/box_magazine.dm +++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm @@ -1,121 +1,121 @@ -//Boxes of ammo -/obj/item/ammo_box - name = "ammo box (null_reference_exception)" - desc = "A box of ammo." - icon_state = "357" - icon = 'icons/obj/ammo.dmi' - flags_1 = CONDUCT_1 - slot_flags = SLOT_BELT - item_state = "syringe_kit" - lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' - materials = list(MAT_METAL=30000) - throwforce = 2 - w_class = WEIGHT_CLASS_TINY - throw_speed = 3 - throw_range = 7 - var/list/stored_ammo = list() - var/ammo_type = /obj/item/ammo_casing - var/max_ammo = 7 - var/multiple_sprites = 0 - var/caliber - var/multiload = 1 - var/start_empty = 0 - -/obj/item/ammo_box/Initialize() - . = ..() - if(!start_empty) - for(var/i = 1, i <= max_ammo, i++) - stored_ammo += new ammo_type(src) - update_icon() - -/obj/item/ammo_box/proc/get_round(keep = 0) - if (!stored_ammo.len) - return null - else - var/b = stored_ammo[stored_ammo.len] - stored_ammo -= b - if (keep) - stored_ammo.Insert(1,b) - return b - -/obj/item/ammo_box/proc/give_round(obj/item/ammo_casing/R, replace_spent = 0) - // Boxes don't have a caliber type, magazines do. Not sure if it's intended or not, but if we fail to find a caliber, then we fall back to ammo_type. - if(!R || (caliber && R.caliber != caliber) || (!caliber && R.type != ammo_type)) - return 0 - - if (stored_ammo.len < max_ammo) - stored_ammo += R - R.forceMove(src) - return 1 - - //for accessibles magazines (e.g internal ones) when full, start replacing spent ammo - else if(replace_spent) - for(var/obj/item/ammo_casing/AC in stored_ammo) - if(!AC.BB)//found a spent ammo - stored_ammo -= AC - AC.forceMove(get_turf(src.loc)) - - stored_ammo += R - R.forceMove(src) - return 1 - - return 0 - -/obj/item/ammo_box/proc/can_load(mob/user) - return 1 - -/obj/item/ammo_box/attackby(obj/item/A, mob/user, params, silent = FALSE, replace_spent = 0) - var/num_loaded = 0 - if(!can_load(user)) - return - if(istype(A, /obj/item/ammo_box)) - var/obj/item/ammo_box/AM = A - for(var/obj/item/ammo_casing/AC in AM.stored_ammo) - var/did_load = give_round(AC, replace_spent) - if(did_load) - AM.stored_ammo -= AC - num_loaded++ - if(!did_load || !multiload) - break - if(istype(A, /obj/item/ammo_casing)) - var/obj/item/ammo_casing/AC = A - if(give_round(AC, replace_spent)) - user.transferItemToLoc(AC, src, TRUE) - num_loaded++ - - if(num_loaded) - if(!silent) - to_chat(user, "You load [num_loaded] shell\s into \the [src]!") - playsound(src, 'sound/weapons/bulletinsert.ogg', 60, 1) - A.update_icon() - update_icon() - - return num_loaded - -/obj/item/ammo_box/attack_self(mob/user) - var/obj/item/ammo_casing/A = get_round() - if(A) - if(!user.put_in_hands(A)) - A.bounce_away(FALSE, NONE) - playsound(src, 'sound/weapons/bulletinsert.ogg', 60, 1) - to_chat(user, "You remove a round from \the [src]!") - update_icon() - -/obj/item/ammo_box/update_icon() - switch(multiple_sprites) - if(1) - icon_state = "[initial(icon_state)]-[stored_ammo.len]" - if(2) - icon_state = "[initial(icon_state)]-[stored_ammo.len ? "[max_ammo]" : "0"]" - desc = "[initial(desc)] There are [stored_ammo.len] shell\s left!" - -//Behavior for magazines -/obj/item/ammo_box/magazine/proc/ammo_count() - return stored_ammo.len - -/obj/item/ammo_box/magazine/proc/empty_magazine() - var/turf_mag = get_turf(src) - for(var/obj/item/ammo in stored_ammo) - ammo.forceMove(turf_mag) +//Boxes of ammo +/obj/item/ammo_box + name = "ammo box (null_reference_exception)" + desc = "A box of ammo." + icon_state = "357" + icon = 'icons/obj/ammo.dmi' + flags_1 = CONDUCT_1 + slot_flags = SLOT_BELT + item_state = "syringe_kit" + lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' + materials = list(MAT_METAL=30000) + throwforce = 2 + w_class = WEIGHT_CLASS_TINY + throw_speed = 3 + throw_range = 7 + var/list/stored_ammo = list() + var/ammo_type = /obj/item/ammo_casing + var/max_ammo = 7 + var/multiple_sprites = 0 + var/caliber + var/multiload = 1 + var/start_empty = 0 + +/obj/item/ammo_box/Initialize() + . = ..() + if(!start_empty) + for(var/i = 1, i <= max_ammo, i++) + stored_ammo += new ammo_type(src) + update_icon() + +/obj/item/ammo_box/proc/get_round(keep = 0) + if (!stored_ammo.len) + return null + else + var/b = stored_ammo[stored_ammo.len] + stored_ammo -= b + if (keep) + stored_ammo.Insert(1,b) + return b + +/obj/item/ammo_box/proc/give_round(obj/item/ammo_casing/R, replace_spent = 0) + // Boxes don't have a caliber type, magazines do. Not sure if it's intended or not, but if we fail to find a caliber, then we fall back to ammo_type. + if(!R || (caliber && R.caliber != caliber) || (!caliber && R.type != ammo_type)) + return 0 + + if (stored_ammo.len < max_ammo) + stored_ammo += R + R.forceMove(src) + return 1 + + //for accessibles magazines (e.g internal ones) when full, start replacing spent ammo + else if(replace_spent) + for(var/obj/item/ammo_casing/AC in stored_ammo) + if(!AC.BB)//found a spent ammo + stored_ammo -= AC + AC.forceMove(get_turf(src.loc)) + + stored_ammo += R + R.forceMove(src) + return 1 + + return 0 + +/obj/item/ammo_box/proc/can_load(mob/user) + return 1 + +/obj/item/ammo_box/attackby(obj/item/A, mob/user, params, silent = FALSE, replace_spent = 0) + var/num_loaded = 0 + if(!can_load(user)) + return + if(istype(A, /obj/item/ammo_box)) + var/obj/item/ammo_box/AM = A + for(var/obj/item/ammo_casing/AC in AM.stored_ammo) + var/did_load = give_round(AC, replace_spent) + if(did_load) + AM.stored_ammo -= AC + num_loaded++ + if(!did_load || !multiload) + break + if(istype(A, /obj/item/ammo_casing)) + var/obj/item/ammo_casing/AC = A + if(give_round(AC, replace_spent)) + user.transferItemToLoc(AC, src, TRUE) + num_loaded++ + + if(num_loaded) + if(!silent) + to_chat(user, "You load [num_loaded] shell\s into \the [src]!") + playsound(src, 'sound/weapons/bulletinsert.ogg', 60, 1) + A.update_icon() + update_icon() + + return num_loaded + +/obj/item/ammo_box/attack_self(mob/user) + var/obj/item/ammo_casing/A = get_round() + if(A) + if(!user.put_in_hands(A)) + A.bounce_away(FALSE, NONE) + playsound(src, 'sound/weapons/bulletinsert.ogg', 60, 1) + to_chat(user, "You remove a round from \the [src]!") + update_icon() + +/obj/item/ammo_box/update_icon() + switch(multiple_sprites) + if(1) + icon_state = "[initial(icon_state)]-[stored_ammo.len]" + if(2) + icon_state = "[initial(icon_state)]-[stored_ammo.len ? "[max_ammo]" : "0"]" + desc = "[initial(desc)] There are [stored_ammo.len] shell\s left!" + +//Behavior for magazines +/obj/item/ammo_box/magazine/proc/ammo_count() + return stored_ammo.len + +/obj/item/ammo_box/magazine/proc/empty_magazine() + var/turf_mag = get_turf(src) + for(var/obj/item/ammo in stored_ammo) + ammo.forceMove(turf_mag) stored_ammo -= ammo \ No newline at end of file diff --git a/code/modules/projectiles/boxes_magazines/external/grenade.dm b/code/modules/projectiles/boxes_magazines/external/grenade.dm new file mode 100644 index 0000000000..2b3c31f81c --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/external/grenade.dm @@ -0,0 +1,8 @@ +/obj/item/ammo_box/magazine/m75 + name = "specialized magazine (.75)" + icon_state = "75" + ammo_type = /obj/item/ammo_casing/caseless/a75 + caliber = "75" + multiple_sprites = 2 + max_ammo = 8 + diff --git a/code/modules/projectiles/boxes_magazines/external/lmg.dm b/code/modules/projectiles/boxes_magazines/external/lmg.dm new file mode 100644 index 0000000000..cb42989022 --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/external/lmg.dm @@ -0,0 +1,22 @@ +/obj/item/ammo_box/magazine/mm195x129 + name = "box magazine (1.95x129mm)" + icon_state = "a762-50" + ammo_type = /obj/item/ammo_casing/mm195x129 + caliber = "mm195129" + max_ammo = 50 + +/obj/item/ammo_box/magazine/mm195x129/hollow + name = "box magazine (Hollow-Point 1.95x129mm)" + ammo_type = /obj/item/ammo_casing/mm195x129/hollow + +/obj/item/ammo_box/magazine/mm195x129/ap + name = "box magazine (Armor Penetrating 1.95x129mm)" + ammo_type = /obj/item/ammo_casing/mm195x129/ap + +/obj/item/ammo_box/magazine/mm195x129/incen + name = "box magazine (Incendiary 1.95x129mm)" + ammo_type = /obj/item/ammo_casing/mm195x129/incen + +/obj/item/ammo_box/magazine/mm195x129/update_icon() + ..() + icon_state = "a762-[round(ammo_count(),10)]" diff --git a/code/modules/projectiles/boxes_magazines/external/pistol.dm b/code/modules/projectiles/boxes_magazines/external/pistol.dm new file mode 100644 index 0000000000..d70b20c65c --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/external/pistol.dm @@ -0,0 +1,56 @@ +/obj/item/ammo_box/magazine/m10mm + name = "pistol magazine (10mm)" + desc = "A gun magazine." + icon_state = "9x19p" + ammo_type = /obj/item/ammo_casing/c10mm + caliber = "10mm" + max_ammo = 8 + multiple_sprites = 2 + +/obj/item/ammo_box/magazine/m10mm/fire + name = "pistol magazine (10mm incendiary)" + icon_state = "9x19pI" + desc = "A gun magazine. Loaded with rounds which ignite the target." + ammo_type = /obj/item/ammo_casing/c10mm/fire + +/obj/item/ammo_box/magazine/m10mm/hp + name = "pistol magazine (10mm HP)" + icon_state = "9x19pH" + desc= "A gun magazine. Loaded with hollow-point rounds, extremely effective against unarmored targets, but nearly useless against protective clothing." + ammo_type = /obj/item/ammo_casing/c10mm/hp + +/obj/item/ammo_box/magazine/m10mm/ap + name = "pistol magazine (10mm AP)" + icon_state = "9x19pA" + desc= "A gun magazine. Loaded with rounds which penetrate armour, but are less effective against normal targets." + ammo_type = /obj/item/ammo_casing/c10mm/ap + +/obj/item/ammo_box/magazine/m45 + name = "handgun magazine (.45)" + icon_state = "45-8" + ammo_type = /obj/item/ammo_casing/c45 + caliber = ".45" + max_ammo = 8 + +/obj/item/ammo_box/magazine/m45/update_icon() + ..() + icon_state = "45-[ammo_count() ? "8" : "0"]" + +/obj/item/ammo_box/magazine/pistolm9mm + name = "pistol magazine (9mm)" + icon_state = "9x19p-8" + ammo_type = /obj/item/ammo_casing/c9mm + caliber = "9mm" + max_ammo = 15 + +/obj/item/ammo_box/magazine/pistolm9mm/update_icon() + ..() + icon_state = "9x19p-[ammo_count() ? "8" : "0"]" + +/obj/item/ammo_box/magazine/m50 + name = "handgun magazine (.50ae)" + icon_state = "50ae" + ammo_type = /obj/item/ammo_casing/a50AE + caliber = ".50" + max_ammo = 7 + multiple_sprites = 1 diff --git a/code/modules/projectiles/boxes_magazines/external/rechargable.dm b/code/modules/projectiles/boxes_magazines/external/rechargable.dm new file mode 100644 index 0000000000..c4fb00aa22 --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/external/rechargable.dm @@ -0,0 +1,14 @@ +/obj/item/ammo_box/magazine/recharge + name = "power pack" + desc = "A rechargeable, detachable battery that serves as a magazine for laser rifles." + icon_state = "oldrifle-20" + ammo_type = /obj/item/ammo_casing/caseless/laser + caliber = "laser" + max_ammo = 20 + +/obj/item/ammo_box/magazine/recharge/update_icon() + desc = "[initial(desc)] It has [stored_ammo.len] shot\s left." + icon_state = "oldrifle-[round(ammo_count(),4)]" + +/obj/item/ammo_box/magazine/recharge/attack_self() //No popping out the "bullets" + return diff --git a/code/modules/projectiles/boxes_magazines/external/rifle.dm b/code/modules/projectiles/boxes_magazines/external/rifle.dm new file mode 100644 index 0000000000..96e7d377ea --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/external/rifle.dm @@ -0,0 +1,21 @@ +/obj/item/ammo_box/magazine/m10mm/rifle + name = "rifle magazine (10mm)" + desc = "A well-worn magazine fitted for the surplus rifle." + icon_state = "75-8" + ammo_type = /obj/item/ammo_casing/c10mm + caliber = "10mm" + max_ammo = 10 + +/obj/item/ammo_box/magazine/m10mm/rifle/update_icon() + if(ammo_count()) + icon_state = "75-8" + else + icon_state = "75-0" + +/obj/item/ammo_box/magazine/m556 + name = "toploader magazine (5.56mm)" + icon_state = "5.56m" + ammo_type = /obj/item/ammo_casing/a556 + caliber = "a556" + max_ammo = 30 + multiple_sprites = 2 diff --git a/code/modules/projectiles/boxes_magazines/external/shotgun.dm b/code/modules/projectiles/boxes_magazines/external/shotgun.dm new file mode 100644 index 0000000000..dc8d0175ba --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/external/shotgun.dm @@ -0,0 +1,36 @@ +/obj/item/ammo_box/magazine/m12g + name = "shotgun magazine (12g taser slugs)" + desc = "A drum magazine." + icon_state = "m12gs" + ammo_type = /obj/item/ammo_casing/shotgun/stunslug + caliber = "shotgun" + max_ammo = 8 + +/obj/item/ammo_box/magazine/m12g/update_icon() + ..() + icon_state = "[initial(icon_state)]-[CEILING(ammo_count(0)/8, 1)*8]" + +/obj/item/ammo_box/magazine/m12g/buckshot + name = "shotgun magazine (12g buckshot slugs)" + icon_state = "m12gb" + ammo_type = /obj/item/ammo_casing/shotgun/buckshot + +/obj/item/ammo_box/magazine/m12g/slug + name = "shotgun magazine (12g slugs)" + icon_state = "m12gb" + ammo_type = /obj/item/ammo_casing/shotgun + +/obj/item/ammo_box/magazine/m12g/dragon + name = "shotgun magazine (12g dragon's breath)" + icon_state = "m12gf" + ammo_type = /obj/item/ammo_casing/shotgun/dragonsbreath + +/obj/item/ammo_box/magazine/m12g/bioterror + name = "shotgun magazine (12g bioterror)" + icon_state = "m12gt" + ammo_type = /obj/item/ammo_casing/shotgun/dart/bioterror + +/obj/item/ammo_box/magazine/m12g/meteor + name = "shotgun magazine (12g meteor slugs)" + icon_state = "m12gbc" + ammo_type = /obj/item/ammo_casing/shotgun/meteorslug diff --git a/code/modules/projectiles/boxes_magazines/external/smg.dm b/code/modules/projectiles/boxes_magazines/external/smg.dm new file mode 100644 index 0000000000..c6dc004879 --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/external/smg.dm @@ -0,0 +1,76 @@ +/obj/item/ammo_box/magazine/wt550m9 + name = "wt550 magazine (4.6x30mm)" + icon_state = "46x30mmt-20" + ammo_type = /obj/item/ammo_casing/c46x30mm + caliber = "4.6x30mm" + max_ammo = 20 + +/obj/item/ammo_box/magazine/wt550m9/update_icon() + ..() + icon_state = "46x30mmt-[round(ammo_count(),4)]" + +/obj/item/ammo_box/magazine/wt550m9/wtap + name = "wt550 magazine (Armour Piercing 4.6x30mm)" + icon_state = "46x30mmtA-20" + ammo_type = /obj/item/ammo_casing/c46x30mm/ap + +/obj/item/ammo_box/magazine/wt550m9/wtap/update_icon() + ..() + icon_state = "46x30mmtA-[round(ammo_count(),4)]" + +/obj/item/ammo_box/magazine/wt550m9/wtic + name = "wt550 magazine (Incindiary 4.6x30mm)" + icon_state = "46x30mmtI-20" + ammo_type = /obj/item/ammo_casing/c46x30mm/inc + +/obj/item/ammo_box/magazine/wt550m9/wtic/update_icon() + ..() + icon_state = "46x30mmtI-[round(ammo_count(),4)]" + +/obj/item/ammo_box/magazine/uzim9mm + name = "uzi magazine (9mm)" + icon_state = "uzi9mm-32" + ammo_type = /obj/item/ammo_casing/c9mm + caliber = "9mm" + max_ammo = 32 + +/obj/item/ammo_box/magazine/uzim9mm/update_icon() + ..() + icon_state = "uzi9mm-[round(ammo_count(),4)]" + +/obj/item/ammo_box/magazine/smgm9mm + name = "SMG magazine (9mm)" + icon_state = "smg9mm-42" + ammo_type = /obj/item/ammo_casing/c9mm + caliber = "9mm" + max_ammo = 21 + +/obj/item/ammo_box/magazine/smgm9mm/update_icon() + ..() + icon_state = "smg9mm-[ammo_count() ? "42" : "0"]" + +/obj/item/ammo_box/magazine/smgm9mm/ap + name = "SMG magazine (Armour Piercing 9mm)" + ammo_type = /obj/item/ammo_casing/c9mm/ap + +/obj/item/ammo_box/magazine/smgm9mm/fire + name = "SMG Magazine (Incindiary 9mm)" + ammo_type = /obj/item/ammo_casing/c9mm/inc + +/obj/item/ammo_box/magazine/smgm45 + name = "SMG magazine (.45)" + icon_state = "c20r45-24" + ammo_type = /obj/item/ammo_casing/c45/nostamina + caliber = ".45" + max_ammo = 24 + +/obj/item/ammo_box/magazine/smgm45/update_icon() + ..() + icon_state = "c20r45-[round(ammo_count(),2)]" + +/obj/item/ammo_box/magazine/tommygunm45 + name = "drum magazine (.45)" + icon_state = "drum45" + ammo_type = /obj/item/ammo_casing/c45 + caliber = ".45" + max_ammo = 50 diff --git a/code/modules/projectiles/boxes_magazines/external/sniper.dm b/code/modules/projectiles/boxes_magazines/external/sniper.dm new file mode 100644 index 0000000000..67c6257bac --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/external/sniper.dm @@ -0,0 +1,26 @@ +/obj/item/ammo_box/magazine/sniper_rounds + name = "sniper rounds (.50)" + icon_state = ".50mag" + ammo_type = /obj/item/ammo_casing/p50 + max_ammo = 6 + caliber = ".50" + +/obj/item/ammo_box/magazine/sniper_rounds/update_icon() + if(ammo_count()) + icon_state = "[initial(icon_state)]-ammo" + else + icon_state = "[initial(icon_state)]" + +/obj/item/ammo_box/magazine/sniper_rounds/soporific + name = "sniper rounds (Zzzzz)" + desc = "Soporific sniper rounds, designed for happy days and dead quiet nights..." + icon_state = "soporific" + ammo_type = /obj/item/ammo_casing/p50/soporific + max_ammo = 3 + caliber = ".50" + +/obj/item/ammo_box/magazine/sniper_rounds/penetrator + name = "sniper rounds (penetrator)" + desc = "An extremely powerful round capable of passing straight through cover and anyone unfortunate enough to be behind it." + ammo_type = /obj/item/ammo_casing/p50/penetrator + max_ammo = 5 diff --git a/code/modules/projectiles/boxes_magazines/external/toy.dm b/code/modules/projectiles/boxes_magazines/external/toy.dm new file mode 100644 index 0000000000..cb66391c02 --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/external/toy.dm @@ -0,0 +1,55 @@ +/obj/item/ammo_box/magazine/toy + name = "foam force META magazine" + ammo_type = /obj/item/ammo_casing/caseless/foam_dart + caliber = "foam_force" + +/obj/item/ammo_box/magazine/toy/smg + name = "foam force SMG magazine" + icon_state = "smg9mm-42" + ammo_type = /obj/item/ammo_casing/caseless/foam_dart + max_ammo = 20 + +/obj/item/ammo_box/magazine/toy/smg/update_icon() + ..() + if(ammo_count()) + icon_state = "smg9mm-42" + else + icon_state = "smg9mm-0" + +/obj/item/ammo_box/magazine/toy/smg/riot + ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot + +/obj/item/ammo_box/magazine/toy/pistol + name = "foam force pistol magazine" + icon_state = "9x19p" + max_ammo = 8 + multiple_sprites = 2 + +/obj/item/ammo_box/magazine/toy/pistol/riot + ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot + +/obj/item/ammo_box/magazine/toy/smgm45 + name = "donksoft SMG magazine" + caliber = "foam_force" + ammo_type = /obj/item/ammo_casing/caseless/foam_dart + max_ammo = 20 + +/obj/item/ammo_box/magazine/toy/smgm45/update_icon() + ..() + icon_state = "c20r45-[round(ammo_count(),2)]" + +/obj/item/ammo_box/magazine/toy/smgm45/riot + ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot + +/obj/item/ammo_box/magazine/toy/m762 + name = "donksoft box magazine" + caliber = "foam_force" + ammo_type = /obj/item/ammo_casing/caseless/foam_dart + max_ammo = 50 + +/obj/item/ammo_box/magazine/toy/m762/update_icon() + ..() + icon_state = "a762-[round(ammo_count(),10)]" + +/obj/item/ammo_box/magazine/toy/m762/riot + ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot diff --git a/code/modules/projectiles/boxes_magazines/external_mag.dm b/code/modules/projectiles/boxes_magazines/external_mag.dm deleted file mode 100644 index b7b3a3e286..0000000000 --- a/code/modules/projectiles/boxes_magazines/external_mag.dm +++ /dev/null @@ -1,340 +0,0 @@ - -///////////EXTERNAL MAGAZINES//////////////// - -/obj/item/ammo_box/magazine/m10mm - name = "pistol magazine (10mm)" - desc = "A gun magazine." - icon_state = "9x19p" - ammo_type = /obj/item/ammo_casing/c10mm - caliber = "10mm" - max_ammo = 8 - multiple_sprites = 2 - -/obj/item/ammo_box/magazine/m10mm/rifle - name = "rifle magazine (10mm)" - desc = "A well-worn magazine fitted for the surplus rifle." - icon_state = "75-8" - ammo_type = /obj/item/ammo_casing/c10mm - caliber = "10mm" - max_ammo = 10 - -/obj/item/ammo_box/magazine/m10mm/rifle/update_icon() - if(ammo_count()) - icon_state = "75-8" - else - icon_state = "75-0" - - -/obj/item/ammo_box/magazine/m10mm/fire - name = "pistol magazine (10mm incendiary)" - icon_state = "9x19pI" - desc = "A gun magazine. Loaded with rounds which ignite the target." - ammo_type = /obj/item/ammo_casing/c10mm/fire - -/obj/item/ammo_box/magazine/m10mm/hp - name = "pistol magazine (10mm HP)" - icon_state = "9x19pH" - desc= "A gun magazine. Loaded with hollow-point rounds, extremely effective against unarmored targets, but nearly useless against protective clothing." - ammo_type = /obj/item/ammo_casing/c10mm/hp - -/obj/item/ammo_box/magazine/m10mm/ap - name = "pistol magazine (10mm AP)" - icon_state = "9x19pA" - desc= "A gun magazine. Loaded with rounds which penetrate armour, but are less effective against normal targets." - ammo_type = /obj/item/ammo_casing/c10mm/ap - -/obj/item/ammo_box/magazine/m45 - name = "handgun magazine (.45)" - icon_state = "45-8" - ammo_type = /obj/item/ammo_casing/c45 - caliber = ".45" - max_ammo = 8 - -/obj/item/ammo_box/magazine/m45/update_icon() - ..() - icon_state = "45-[ammo_count() ? "8" : "0"]" - -/obj/item/ammo_box/magazine/wt550m9 - name = "wt550 magazine (4.6x30mm)" - icon_state = "46x30mmt-20" - ammo_type = /obj/item/ammo_casing/c46x30mm - caliber = "4.6x30mm" - max_ammo = 20 - -/obj/item/ammo_box/magazine/wt550m9/update_icon() - ..() - icon_state = "46x30mmt-[round(ammo_count(),4)]" - -/obj/item/ammo_box/magazine/wt550m9/wtap - name = "wt550 magazine (Armour Piercing 4.6x30mm)" - icon_state = "46x30mmtA-20" - ammo_type = /obj/item/ammo_casing/c46x30mm/ap - -/obj/item/ammo_box/magazine/wt550m9/wtap/update_icon() - ..() - icon_state = "46x30mmtA-[round(ammo_count(),4)]" - -/obj/item/ammo_box/magazine/wt550m9/wtic - name = "wt550 magazine (Incindiary 4.6x30mm)" - icon_state = "46x30mmtI-20" - ammo_type = /obj/item/ammo_casing/c46x30mm/inc - -/obj/item/ammo_box/magazine/wt550m9/wtic/update_icon() - ..() - icon_state = "46x30mmtI-[round(ammo_count(),4)]" - -/obj/item/ammo_box/magazine/uzim9mm - name = "uzi magazine (9mm)" - icon_state = "uzi9mm-32" - ammo_type = /obj/item/ammo_casing/c9mm - caliber = "9mm" - max_ammo = 32 - -/obj/item/ammo_box/magazine/uzim9mm/update_icon() - ..() - icon_state = "uzi9mm-[round(ammo_count(),4)]" - -/obj/item/ammo_box/magazine/smgm9mm - name = "SMG magazine (9mm)" - icon_state = "smg9mm-42" - ammo_type = /obj/item/ammo_casing/c9mm - caliber = "9mm" - max_ammo = 21 - -/obj/item/ammo_box/magazine/smgm9mm/update_icon() - ..() - icon_state = "smg9mm-[ammo_count() ? "42" : "0"]" - -/obj/item/ammo_box/magazine/smgm9mm/ap - name = "SMG magazine (Armour Piercing 9mm)" - ammo_type = /obj/item/ammo_casing/c9mm/ap - -/obj/item/ammo_box/magazine/smgm9mm/fire - name = "SMG Magazine (Incindiary 9mm)" - ammo_type = /obj/item/ammo_casing/c9mm/inc - -/obj/item/ammo_box/magazine/pistolm9mm - name = "pistol magazine (9mm)" - icon_state = "9x19p-8" - ammo_type = /obj/item/ammo_casing/c9mm - caliber = "9mm" - max_ammo = 15 - -/obj/item/ammo_box/magazine/pistolm9mm/update_icon() - ..() - icon_state = "9x19p-[ammo_count() ? "8" : "0"]" - -/obj/item/ammo_box/magazine/smgm45 - name = "SMG magazine (.45)" - icon_state = "c20r45-24" - ammo_type = /obj/item/ammo_casing/c45/nostamina - caliber = ".45" - max_ammo = 24 - -/obj/item/ammo_box/magazine/smgm45/update_icon() - ..() - icon_state = "c20r45-[round(ammo_count(),2)]" - -/obj/item/ammo_box/magazine/tommygunm45 - name = "drum magazine (.45)" - icon_state = "drum45" - ammo_type = /obj/item/ammo_casing/c45 - caliber = ".45" - max_ammo = 50 - -/obj/item/ammo_box/magazine/m50 - name = "handgun magazine (.50ae)" - icon_state = "50ae" - ammo_type = /obj/item/ammo_casing/a50AE - caliber = ".50" - max_ammo = 7 - multiple_sprites = 1 - -/obj/item/ammo_box/magazine/m75 - name = "specialized magazine (.75)" - icon_state = "75" - ammo_type = /obj/item/ammo_casing/caseless/a75 - caliber = "75" - multiple_sprites = 2 - max_ammo = 8 - -/obj/item/ammo_box/magazine/m556 - name = "toploader magazine (5.56mm)" - icon_state = "5.56m" - ammo_type = /obj/item/ammo_casing/a556 - caliber = "a556" - max_ammo = 30 - multiple_sprites = 2 - -/obj/item/ammo_box/magazine/m12g - name = "shotgun magazine (12g taser slugs)" - desc = "A drum magazine." - icon_state = "m12gs" - ammo_type = /obj/item/ammo_casing/shotgun/stunslug - caliber = "shotgun" - max_ammo = 8 - -/obj/item/ammo_box/magazine/m12g/update_icon() - ..() - icon_state = "[initial(icon_state)]-[CEILING(ammo_count(0)/8, 1)*8]" - -/obj/item/ammo_box/magazine/m12g/buckshot - name = "shotgun magazine (12g buckshot slugs)" - icon_state = "m12gb" - ammo_type = /obj/item/ammo_casing/shotgun/buckshot - -/obj/item/ammo_box/magazine/m12g/slug - name = "shotgun magazine (12g slugs)" - icon_state = "m12gb" - ammo_type = /obj/item/ammo_casing/shotgun - -/obj/item/ammo_box/magazine/m12g/dragon - name = "shotgun magazine (12g dragon's breath)" - icon_state = "m12gf" - ammo_type = /obj/item/ammo_casing/shotgun/dragonsbreath - -/obj/item/ammo_box/magazine/m12g/bioterror - name = "shotgun magazine (12g bioterror)" - icon_state = "m12gt" - ammo_type = /obj/item/ammo_casing/shotgun/dart/bioterror - -/obj/item/ammo_box/magazine/m12g/meteor - name = "shotgun magazine (12g meteor slugs)" - icon_state = "m12gbc" - ammo_type = /obj/item/ammo_casing/shotgun/meteorslug - - -//// SNIPER MAGAZINES - -/obj/item/ammo_box/magazine/sniper_rounds - name = "sniper rounds (.50)" - icon_state = ".50mag" - ammo_type = /obj/item/ammo_casing/p50 - max_ammo = 6 - caliber = ".50" - -/obj/item/ammo_box/magazine/sniper_rounds/update_icon() - if(ammo_count()) - icon_state = "[initial(icon_state)]-ammo" - else - icon_state = "[initial(icon_state)]" - -/obj/item/ammo_box/magazine/sniper_rounds/soporific - name = "sniper rounds (Zzzzz)" - desc = "Soporific sniper rounds, designed for happy days and dead quiet nights..." - icon_state = "soporific" - ammo_type = /obj/item/ammo_casing/p50/soporific - max_ammo = 3 - caliber = ".50" - -/obj/item/ammo_box/magazine/sniper_rounds/penetrator - name = "sniper rounds (penetrator)" - desc = "An extremely powerful round capable of passing straight through cover and anyone unfortunate enough to be behind it." - ammo_type = /obj/item/ammo_casing/p50/penetrator - max_ammo = 5 - -//// SAW MAGAZINES - -/obj/item/ammo_box/magazine/mm195x129 - name = "box magazine (1.95x129mm)" - icon_state = "a762-50" - ammo_type = /obj/item/ammo_casing/mm195x129 - caliber = "mm195129" - max_ammo = 50 - -/obj/item/ammo_box/magazine/mm195x129/hollow - name = "box magazine (Hollow-Point 1.95x129mm)" - ammo_type = /obj/item/ammo_casing/mm195x129/hollow - -/obj/item/ammo_box/magazine/mm195x129/ap - name = "box magazine (Armor Penetrating 1.95x129mm)" - ammo_type = /obj/item/ammo_casing/mm195x129/ap - -/obj/item/ammo_box/magazine/mm195x129/incen - name = "box magazine (Incendiary 1.95x129mm)" - ammo_type = /obj/item/ammo_casing/mm195x129/incen - -/obj/item/ammo_box/magazine/mm195x129/update_icon() - ..() - icon_state = "a762-[round(ammo_count(),10)]" - - - - -////TOY GUN MAGAZINES - -/obj/item/ammo_box/magazine/toy - name = "foam force META magazine" - ammo_type = /obj/item/ammo_casing/caseless/foam_dart - caliber = "foam_force" - -/obj/item/ammo_box/magazine/toy/smg - name = "foam force SMG magazine" - icon_state = "smg9mm-42" - ammo_type = /obj/item/ammo_casing/caseless/foam_dart - max_ammo = 20 - -/obj/item/ammo_box/magazine/toy/smg/update_icon() - ..() - if(ammo_count()) - icon_state = "smg9mm-42" - else - icon_state = "smg9mm-0" - -/obj/item/ammo_box/magazine/toy/smg/riot - ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot - -/obj/item/ammo_box/magazine/toy/pistol - name = "foam force pistol magazine" - icon_state = "9x19p" - max_ammo = 8 - multiple_sprites = 2 - -/obj/item/ammo_box/magazine/toy/pistol/riot - ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot - -/obj/item/ammo_box/magazine/toy/smgm45 - name = "donksoft SMG magazine" - caliber = "foam_force" - ammo_type = /obj/item/ammo_casing/caseless/foam_dart - max_ammo = 20 - -/obj/item/ammo_box/magazine/toy/smgm45/update_icon() - ..() - icon_state = "c20r45-[round(ammo_count(),2)]" - -/obj/item/ammo_box/magazine/toy/smgm45/riot - ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot - -/obj/item/ammo_box/magazine/toy/m762 - name = "donksoft box magazine" - caliber = "foam_force" - ammo_type = /obj/item/ammo_casing/caseless/foam_dart - max_ammo = 50 - -/obj/item/ammo_box/magazine/toy/m762/update_icon() - ..() - icon_state = "a762-[round(ammo_count(),10)]" - -/obj/item/ammo_box/magazine/toy/m762/riot - ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot - - - - -//// RECHARGEABLE MAGAZINES - -/obj/item/ammo_box/magazine/recharge - name = "power pack" - desc = "A rechargeable, detachable battery that serves as a magazine for laser rifles." - icon_state = "oldrifle-20" - ammo_type = /obj/item/ammo_casing/caseless/laser - caliber = "laser" - max_ammo = 20 - -/obj/item/ammo_box/magazine/recharge/update_icon() - desc = "[initial(desc)] It has [stored_ammo.len] shot\s left." - icon_state = "oldrifle-[round(ammo_count(),4)]" - -/obj/item/ammo_box/magazine/recharge/attack_self() //No popping out the "bullets" - return diff --git a/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm b/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm new file mode 100644 index 0000000000..bbfc79471c --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm @@ -0,0 +1,47 @@ +/obj/item/ammo_box/magazine/internal/cylinder + name = "revolver cylinder" + ammo_type = /obj/item/ammo_casing/a357 + caliber = "357" + max_ammo = 7 + +/obj/item/ammo_box/magazine/internal/cylinder/ammo_count(countempties = 1) + var/boolets = 0 + for(var/obj/item/ammo_casing/bullet in stored_ammo) + if(bullet && (bullet.BB || countempties)) + boolets++ + + return boolets + +/obj/item/ammo_box/magazine/internal/cylinder/get_round(keep = 0) + rotate() + + var/b = stored_ammo[1] + if(!keep) + stored_ammo[1] = null + + return b + +/obj/item/ammo_box/magazine/internal/cylinder/proc/rotate() + var/b = stored_ammo[1] + stored_ammo.Cut(1,2) + stored_ammo.Insert(0, b) + +/obj/item/ammo_box/magazine/internal/cylinder/proc/spin() + for(var/i in 1 to rand(0, max_ammo*2)) + rotate() + +/obj/item/ammo_box/magazine/internal/cylinder/give_round(obj/item/ammo_casing/R, replace_spent = 0) + if(!R || (caliber && R.caliber != caliber) || (!caliber && R.type != ammo_type)) + return FALSE + + for(var/i in 1 to stored_ammo.len) + var/obj/item/ammo_casing/bullet = stored_ammo[i] + if(!bullet || !bullet.BB) // found a spent ammo + stored_ammo[i] = R + R.forceMove(src) + + if(bullet) + bullet.forceMove(drop_location()) + return TRUE + + return FALSE diff --git a/code/modules/projectiles/boxes_magazines/internal/_internal.dm b/code/modules/projectiles/boxes_magazines/internal/_internal.dm new file mode 100644 index 0000000000..e21cb5ce61 --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/internal/_internal.dm @@ -0,0 +1,7 @@ +/obj/item/ammo_box/magazine/internal + desc = "Oh god, this shouldn't be here" + flags_1 = CONDUCT_1|ABSTRACT_1 + +//internals magazines are accessible, so replace spent ammo if full when trying to put a live one in +/obj/item/ammo_box/magazine/internal/give_round(obj/item/ammo_casing/R) + return ..(R,1) diff --git a/code/modules/projectiles/boxes_magazines/internal/grenade.dm b/code/modules/projectiles/boxes_magazines/internal/grenade.dm new file mode 100644 index 0000000000..12325a0299 --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/internal/grenade.dm @@ -0,0 +1,17 @@ +/obj/item/ammo_box/magazine/internal/cylinder/grenademulti + name = "grenade launcher internal magazine" + ammo_type = /obj/item/ammo_casing/a40mm + caliber = "40mm" + max_ammo = 6 + +/obj/item/ammo_box/magazine/internal/grenadelauncher + name = "grenade launcher internal magazine" + ammo_type = /obj/item/ammo_casing/a40mm + caliber = "40mm" + max_ammo = 1 + +/obj/item/ammo_box/magazine/internal/rocketlauncher + name = "grenade launcher internal magazine" + ammo_type = /obj/item/ammo_casing/caseless/a84mm + caliber = "84mm" + max_ammo = 1 diff --git a/code/modules/projectiles/boxes_magazines/internal/misc.dm b/code/modules/projectiles/boxes_magazines/internal/misc.dm new file mode 100644 index 0000000000..aab0643cbc --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/internal/misc.dm @@ -0,0 +1,11 @@ +/obj/item/ammo_box/magazine/internal/speargun + name = "speargun internal magazine" + ammo_type = /obj/item/ammo_casing/caseless/magspear + caliber = "speargun" + max_ammo = 1 + +/obj/item/ammo_box/magazine/internal/minigun + name = "gatling gun fusion core" + ammo_type = /obj/item/ammo_casing/caseless/laser/gatling + caliber = "gatling" + max_ammo = 5000 diff --git a/code/modules/projectiles/boxes_magazines/internal/revolver.dm b/code/modules/projectiles/boxes_magazines/internal/revolver.dm new file mode 100644 index 0000000000..976f80f437 --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/internal/revolver.dm @@ -0,0 +1,22 @@ +/obj/item/ammo_box/magazine/internal/cylinder/rev38 + name = "detective revolver cylinder" + ammo_type = /obj/item/ammo_casing/c38 + caliber = "38" + max_ammo = 6 + +/obj/item/ammo_box/magazine/internal/cylinder/rev762 + name = "nagant revolver cylinder" + ammo_type = /obj/item/ammo_casing/n762 + caliber = "n762" + max_ammo = 7 + +/obj/item/ammo_box/magazine/internal/cylinder/rus357 + name = "russian revolver cylinder" + ammo_type = /obj/item/ammo_casing/a357 + caliber = "357" + max_ammo = 6 + multiload = 0 + +/obj/item/ammo_box/magazine/internal/rus357/Initialize() + stored_ammo += new ammo_type(src) + . = ..() diff --git a/code/modules/projectiles/boxes_magazines/internal/rifle.dm b/code/modules/projectiles/boxes_magazines/internal/rifle.dm new file mode 100644 index 0000000000..ef83e96b1c --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/internal/rifle.dm @@ -0,0 +1,15 @@ +/obj/item/ammo_box/magazine/internal/boltaction + name = "bolt action rifle internal magazine" + desc = "Oh god, this shouldn't be here" + ammo_type = /obj/item/ammo_casing/a762 + caliber = "a762" + max_ammo = 5 + multiload = 1 + +/obj/item/ammo_box/magazine/internal/boltaction/enchanted + max_ammo = 1 + ammo_type = /obj/item/ammo_casing/a762/enchanted + +/obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage + ammo_type = /obj/item/ammo_casing/magic/arcane_barrage + diff --git a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm new file mode 100644 index 0000000000..3bd277da31 --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm @@ -0,0 +1,48 @@ +/obj/item/ammo_box/magazine/internal/shot + name = "shotgun internal magazine" + ammo_type = /obj/item/ammo_casing/shotgun/beanbag + caliber = "shotgun" + max_ammo = 4 + multiload = 0 + +/obj/item/ammo_box/magazine/internal/shot/ammo_count(countempties = 1) + if (!countempties) + var/boolets = 0 + for(var/obj/item/ammo_casing/bullet in stored_ammo) + if(bullet.BB) + boolets++ + return boolets + else + return ..() + +/obj/item/ammo_box/magazine/internal/shot/tube + name = "dual feed shotgun internal tube" + ammo_type = /obj/item/ammo_casing/shotgun/rubbershot + max_ammo = 4 + +/obj/item/ammo_box/magazine/internal/shot/lethal + ammo_type = /obj/item/ammo_casing/shotgun/buckshot + +/obj/item/ammo_box/magazine/internal/shot/com + name = "combat shotgun internal magazine" + ammo_type = /obj/item/ammo_casing/shotgun/buckshot + max_ammo = 6 + +/obj/item/ammo_box/magazine/internal/shot/com/compact + name = "compact combat shotgun internal magazine" + ammo_type = /obj/item/ammo_casing/shotgun/buckshot + max_ammo = 4 + +/obj/item/ammo_box/magazine/internal/shot/dual + name = "double-barrel shotgun internal magazine" + max_ammo = 2 + +/obj/item/ammo_box/magazine/internal/shot/improvised + name = "improvised shotgun internal magazine" + ammo_type = /obj/item/ammo_casing/shotgun/improvised + max_ammo = 1 + +/obj/item/ammo_box/magazine/internal/shot/riot + name = "riot shotgun internal magazine" + ammo_type = /obj/item/ammo_casing/shotgun/rubbershot + max_ammo = 6 diff --git a/code/modules/projectiles/boxes_magazines/internal/toy.dm b/code/modules/projectiles/boxes_magazines/internal/toy.dm new file mode 100644 index 0000000000..f2bb0dbf08 --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/internal/toy.dm @@ -0,0 +1,7 @@ +/obj/item/ammo_box/magazine/internal/shot/toy + ammo_type = /obj/item/ammo_casing/caseless/foam_dart + caliber = "foam_force" + max_ammo = 4 + +/obj/item/ammo_box/magazine/internal/shot/toy/crossbow + max_ammo = 5 diff --git a/code/modules/projectiles/boxes_magazines/internal_mag.dm b/code/modules/projectiles/boxes_magazines/internal_mag.dm deleted file mode 100644 index b26d30c389..0000000000 --- a/code/modules/projectiles/boxes_magazines/internal_mag.dm +++ /dev/null @@ -1,191 +0,0 @@ -////////////////INTERNAL MAGAZINES////////////////////// - -/obj/item/ammo_box/magazine/internal - desc = "Oh god, this shouldn't be here" - flags_1 = CONDUCT_1|ABSTRACT_1 - -//internals magazines are accessible, so replace spent ammo if full when trying to put a live one in -/obj/item/ammo_box/magazine/internal/give_round(obj/item/ammo_casing/R) - return ..(R,1) - - - -// Revolver internal mags -/obj/item/ammo_box/magazine/internal/cylinder - name = "revolver cylinder" - ammo_type = /obj/item/ammo_casing/a357 - caliber = "357" - max_ammo = 7 - -/obj/item/ammo_box/magazine/internal/cylinder/ammo_count(countempties = 1) - var/boolets = 0 - for(var/obj/item/ammo_casing/bullet in stored_ammo) - if(bullet && (bullet.BB || countempties)) - boolets++ - - return boolets - -/obj/item/ammo_box/magazine/internal/cylinder/get_round(keep = 0) - rotate() - - var/b = stored_ammo[1] - if(!keep) - stored_ammo[1] = null - - return b - -/obj/item/ammo_box/magazine/internal/cylinder/proc/rotate() - var/b = stored_ammo[1] - stored_ammo.Cut(1,2) - stored_ammo.Insert(0, b) - -/obj/item/ammo_box/magazine/internal/cylinder/proc/spin() - for(var/i in 1 to rand(0, max_ammo*2)) - rotate() - - -/obj/item/ammo_box/magazine/internal/cylinder/give_round(obj/item/ammo_casing/R, replace_spent = 0) - if(!R || (caliber && R.caliber != caliber) || (!caliber && R.type != ammo_type)) - return 0 - - for(var/i in 1 to stored_ammo.len) - var/obj/item/ammo_casing/bullet = stored_ammo[i] - if(!bullet || !bullet.BB) // found a spent ammo - stored_ammo[i] = R - R.forceMove(src) - - if(bullet) - bullet.forceMove(drop_location()) - return 1 - - return 0 - -/obj/item/ammo_box/magazine/internal/cylinder/rev38 - name = "detective revolver cylinder" - ammo_type = /obj/item/ammo_casing/c38 - caliber = "38" - max_ammo = 6 - -/obj/item/ammo_box/magazine/internal/cylinder/grenademulti - name = "grenade launcher internal magazine" - ammo_type = /obj/item/ammo_casing/a40mm - caliber = "40mm" - max_ammo = 6 - -/obj/item/ammo_box/magazine/internal/cylinder/rev762 - name = "nagant revolver cylinder" - ammo_type = /obj/item/ammo_casing/n762 - caliber = "n762" - max_ammo = 7 - -// Shotgun internal mags -/obj/item/ammo_box/magazine/internal/shot - name = "shotgun internal magazine" - ammo_type = /obj/item/ammo_casing/shotgun/beanbag - caliber = "shotgun" - max_ammo = 4 - multiload = 0 - -/obj/item/ammo_box/magazine/internal/shot/ammo_count(countempties = 1) - if (!countempties) - var/boolets = 0 - for(var/obj/item/ammo_casing/bullet in stored_ammo) - if(bullet.BB) - boolets++ - return boolets - else - return ..() - - -/obj/item/ammo_box/magazine/internal/shot/tube - name = "dual feed shotgun internal tube" - ammo_type = /obj/item/ammo_casing/shotgun/rubbershot - max_ammo = 4 - -/obj/item/ammo_box/magazine/internal/shot/lethal - ammo_type = /obj/item/ammo_casing/shotgun/buckshot - -/obj/item/ammo_box/magazine/internal/shot/com - name = "combat shotgun internal magazine" - ammo_type = /obj/item/ammo_casing/shotgun/buckshot - max_ammo = 6 - -/obj/item/ammo_box/magazine/internal/shot/com/compact - name = "compact combat shotgun internal magazine" - ammo_type = /obj/item/ammo_casing/shotgun/buckshot - max_ammo = 4 - -/obj/item/ammo_box/magazine/internal/shot/dual - name = "double-barrel shotgun internal magazine" - max_ammo = 2 - -/obj/item/ammo_box/magazine/internal/shot/improvised - name = "improvised shotgun internal magazine" - ammo_type = /obj/item/ammo_casing/shotgun/improvised - max_ammo = 1 - -/obj/item/ammo_box/magazine/internal/shot/riot - name = "riot shotgun internal magazine" - ammo_type = /obj/item/ammo_casing/shotgun/rubbershot - max_ammo = 6 - - - - -/obj/item/ammo_box/magazine/internal/grenadelauncher - name = "grenade launcher internal magazine" - ammo_type = /obj/item/ammo_casing/a40mm - caliber = "40mm" - max_ammo = 1 - -/obj/item/ammo_box/magazine/internal/rocketlauncher - name = "grenade launcher internal magazine" - ammo_type = /obj/item/ammo_casing/caseless/a84mm - caliber = "84mm" - max_ammo = 1 - -/obj/item/ammo_box/magazine/internal/speargun - name = "speargun internal magazine" - ammo_type = /obj/item/ammo_casing/caseless/magspear - caliber = "speargun" - max_ammo = 1 - -/obj/item/ammo_box/magazine/internal/cylinder/rus357 - name = "russian revolver cylinder" - ammo_type = /obj/item/ammo_casing/a357 - caliber = "357" - max_ammo = 6 - multiload = 0 - -/obj/item/ammo_box/magazine/internal/rus357/Initialize() - stored_ammo += new ammo_type(src) - . = ..() - -/obj/item/ammo_box/magazine/internal/boltaction - name = "bolt action rifle internal magazine" - desc = "Oh god, this shouldn't be here" - ammo_type = /obj/item/ammo_casing/a762 - caliber = "a762" - max_ammo = 5 - multiload = 1 - -/obj/item/ammo_box/magazine/internal/boltaction/enchanted - max_ammo = 1 - ammo_type = /obj/item/ammo_casing/a762/enchanted - -/obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage - ammo_type = /obj/item/ammo_casing/magic/arcane_barrage - -/obj/item/ammo_box/magazine/internal/shot/toy - ammo_type = /obj/item/ammo_casing/caseless/foam_dart - caliber = "foam_force" - max_ammo = 4 - -/obj/item/ammo_box/magazine/internal/shot/toy/crossbow - max_ammo = 5 - -/obj/item/ammo_box/magazine/internal/minigun - name = "gatling gun fusion core" - ammo_type = /obj/item/ammo_casing/caseless/laser/gatling - caliber = "gatling" - max_ammo = 5000 diff --git a/code/modules/projectiles/guns/mounted.dm b/code/modules/projectiles/guns/energy/mounted.dm similarity index 96% rename from code/modules/projectiles/guns/mounted.dm rename to code/modules/projectiles/guns/energy/mounted.dm index 5893c2a107..79226689de 100644 --- a/code/modules/projectiles/guns/mounted.dm +++ b/code/modules/projectiles/guns/energy/mounted.dm @@ -1,26 +1,26 @@ -/obj/item/gun/energy/e_gun/advtaser/mounted - name = "mounted taser" - desc = "An arm mounted dual-mode weapon that fires electrodes and disabler shots." - icon = 'icons/obj/items_cyborg.dmi' - icon_state = "taser" - item_state = "armcannonstun4" - force = 5 - selfcharge = 1 - can_flashlight = 0 - trigger_guard = TRIGGER_GUARD_ALLOW_ALL // Has no trigger at all, uses neural signals instead - -/obj/item/gun/energy/e_gun/advtaser/mounted/dropped()//if somebody manages to drop this somehow... - ..() - -/obj/item/gun/energy/laser/mounted - name = "mounted laser" - desc = "An arm mounted cannon that fires lethal lasers." - icon = 'icons/obj/items_cyborg.dmi' - icon_state = "laser" - item_state = "armcannonlase" - force = 5 - selfcharge = 1 - trigger_guard = TRIGGER_GUARD_ALLOW_ALL - -/obj/item/gun/energy/laser/mounted/dropped() - ..() +/obj/item/gun/energy/e_gun/advtaser/mounted + name = "mounted taser" + desc = "An arm mounted dual-mode weapon that fires electrodes and disabler shots." + icon = 'icons/obj/items_cyborg.dmi' + icon_state = "taser" + item_state = "armcannonstun4" + force = 5 + selfcharge = 1 + can_flashlight = 0 + trigger_guard = TRIGGER_GUARD_ALLOW_ALL // Has no trigger at all, uses neural signals instead + +/obj/item/gun/energy/e_gun/advtaser/mounted/dropped()//if somebody manages to drop this somehow... + ..() + +/obj/item/gun/energy/laser/mounted + name = "mounted laser" + desc = "An arm mounted cannon that fires lethal lasers." + icon = 'icons/obj/items_cyborg.dmi' + icon_state = "laser" + item_state = "armcannonlase" + force = 5 + selfcharge = 1 + trigger_guard = TRIGGER_GUARD_ALLOW_ALL + +/obj/item/gun/energy/laser/mounted/dropped() + ..() diff --git a/code/modules/projectiles/guns/energy/plasma.dm b/code/modules/projectiles/guns/energy/plasma_cit.dm similarity index 100% rename from code/modules/projectiles/guns/energy/plasma.dm rename to code/modules/projectiles/guns/energy/plasma_cit.dm diff --git a/code/modules/projectiles/guns/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm similarity index 97% rename from code/modules/projectiles/guns/beam_rifle.dm rename to code/modules/projectiles/guns/misc/beam_rifle.dm index a2365dfc13..59465eb989 100644 --- a/code/modules/projectiles/guns/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -1,590 +1,590 @@ - -#define ZOOM_LOCK_AUTOZOOM_FREEMOVE 0 -#define ZOOM_LOCK_AUTOZOOM_ANGLELOCK 1 -#define ZOOM_LOCK_CENTER_VIEW 2 -#define ZOOM_LOCK_OFF 3 - -#define AUTOZOOM_PIXEL_STEP_FACTOR 48 - -#define AIMING_BEAM_ANGLE_CHANGE_THRESHOLD 0.1 - -/obj/item/gun/energy/beam_rifle - name = "particle acceleration rifle" - desc = "An energy-based anti material marksman rifle that uses highly charged particle beams moving at extreme velocities to decimate whatever is unfortunate enough to be targetted by one. \ - Hold down left click while scoped to aim, when weapon is fully aimed (Tracer goes from red to green as it charges), release to fire. Moving while aiming or \ - changing where you're pointing at while aiming will delay the aiming process depending on how much you changed." - icon = 'icons/obj/guns/energy.dmi' - icon_state = "esniper" - item_state = "esniper" - fire_sound = 'sound/weapons/beam_sniper.ogg' - slot_flags = SLOT_BACK - force = 15 - materials = list() - recoil = 4 - ammo_x_offset = 3 - ammo_y_offset = 3 - modifystate = FALSE - weapon_weight = WEAPON_HEAVY - w_class = WEIGHT_CLASS_BULKY - ammo_type = list(/obj/item/ammo_casing/energy/beam_rifle/hitscan) - cell_type = /obj/item/stock_parts/cell/beam_rifle - canMouseDown = TRUE - pin = null - var/aiming = FALSE - var/aiming_time = 12 - var/aiming_time_fire_threshold = 5 - var/aiming_time_left = 12 - var/aiming_time_increase_user_movement = 3 - var/scoped_slow = 1 - var/aiming_time_increase_angle_multiplier = 0.3 - var/last_process = 0 - - var/lastangle = 0 - var/aiming_lastangle = 0 - var/mob/current_user = null - var/list/obj/effect/projectile/tracer/current_tracers - - var/structure_piercing = 2 //Amount * 2. For some reason structures aren't respecting this unless you have it doubled. Probably with the objects in question's Bump() code instead of this but I'll deal with this later. - var/structure_bleed_coeff = 0.7 - var/wall_pierce_amount = 0 - var/wall_devastate = 0 - var/aoe_structure_range = 1 - var/aoe_structure_damage = 50 - var/aoe_fire_range = 2 - var/aoe_fire_chance = 40 - var/aoe_mob_range = 1 - var/aoe_mob_damage = 30 - var/impact_structure_damage = 60 - var/projectile_damage = 30 - var/projectile_stun = 0 - var/projectile_setting_pierce = TRUE - var/delay = 65 - var/lastfire = 0 - - //ZOOMING - var/zoom_current_view_increase = 0 - var/zoom_target_view_increase = 10 - var/zooming = FALSE - var/zoom_lock = ZOOM_LOCK_OFF - var/zooming_angle - var/current_zoom_x = 0 - var/current_zoom_y = 0 - var/zoom_animating = 0 - - var/static/image/charged_overlay = image(icon = 'icons/obj/guns/energy.dmi', icon_state = "esniper_charged") - var/static/image/drained_overlay = image(icon = 'icons/obj/guns/energy.dmi', icon_state = "esniper_empty") - - var/datum/action/item_action/zoom_lock_action/zoom_lock_action - var/datum/component/mobhook - -/obj/item/gun/energy/beam_rifle/debug - delay = 0 - cell_type = /obj/item/stock_parts/cell/infinite - aiming_time = 0 - recoil = 0 - pin = /obj/item/device/firing_pin - -/obj/item/gun/energy/beam_rifle/equipped(mob/user) - set_user(user) - . = ..() - -/obj/item/gun/energy/beam_rifle/pickup(mob/user) - set_user(user) - . = ..() - -/obj/item/gun/energy/beam_rifle/dropped(mob/user) - set_user() - . = ..() - -/obj/item/gun/energy/beam_rifle/ui_action_click(owner, action) - if(istype(action, /datum/action/item_action/zoom_lock_action)) - zoom_lock++ - if(zoom_lock > 3) - zoom_lock = 0 - switch(zoom_lock) - if(ZOOM_LOCK_AUTOZOOM_FREEMOVE) - to_chat(owner, "You switch [src]'s zooming processor to free directional.") - if(ZOOM_LOCK_AUTOZOOM_ANGLELOCK) - to_chat(owner, "You switch [src]'s zooming processor to locked directional.") - if(ZOOM_LOCK_CENTER_VIEW) - to_chat(owner, "You switch [src]'s zooming processor to center mode.") - if(ZOOM_LOCK_OFF) - to_chat(owner, "You disable [src]'s zooming system.") - reset_zooming() - -/obj/item/gun/energy/beam_rifle/proc/smooth_zooming(delay_override = null) - if(!check_user() || !zooming || zoom_lock == ZOOM_LOCK_OFF || zoom_lock == ZOOM_LOCK_CENTER_VIEW) - return - if(zoom_animating && delay_override != 0) - return smooth_zooming(zoom_animating + delay_override) //Automatically compensate for ongoing zooming actions. - var/total_time = SSfastprocess.wait - if(delay_override) - total_time = delay_override - zoom_animating = total_time - animate(current_user.client, pixel_x = current_zoom_x, pixel_y = current_zoom_y , total_time, SINE_EASING, ANIMATION_PARALLEL) - zoom_animating = 0 - -/obj/item/gun/energy/beam_rifle/proc/set_autozoom_pixel_offsets_immediate(current_angle) - if(zoom_lock == ZOOM_LOCK_CENTER_VIEW || zoom_lock == ZOOM_LOCK_OFF) - return - current_zoom_x = sin(current_angle) + sin(current_angle) * AUTOZOOM_PIXEL_STEP_FACTOR * zoom_current_view_increase - current_zoom_y = cos(current_angle) + cos(current_angle) * AUTOZOOM_PIXEL_STEP_FACTOR * zoom_current_view_increase - -/obj/item/gun/energy/beam_rifle/proc/handle_zooming() - if(!zooming || !check_user()) - return - current_user.client.change_view(world.view + zoom_target_view_increase) - zoom_current_view_increase = zoom_target_view_increase - set_autozoom_pixel_offsets_immediate(zooming_angle) - smooth_zooming() - -/obj/item/gun/energy/beam_rifle/proc/start_zooming() - if(zoom_lock == ZOOM_LOCK_OFF) - return - zooming = TRUE - -/obj/item/gun/energy/beam_rifle/proc/stop_zooming(mob/user) - if(zooming) - zooming = FALSE - reset_zooming(user) - -/obj/item/gun/energy/beam_rifle/proc/reset_zooming(mob/user) - if(!user) - user = current_user - if(!user || !user.client) - return FALSE - zoom_animating = 0 - animate(user.client, pixel_x = 0, pixel_y = 0, 0, FALSE, LINEAR_EASING, ANIMATION_END_NOW) - zoom_current_view_increase = 0 - user.client.change_view(CONFIG_GET(string/default_view)) - zooming_angle = 0 - current_zoom_x = 0 - current_zoom_y = 0 - -/obj/item/gun/energy/beam_rifle/update_icon() - cut_overlays() - var/obj/item/ammo_casing/energy/primary_ammo = ammo_type[1] - if(cell.charge > primary_ammo.e_cost) - add_overlay(charged_overlay) - else - add_overlay(drained_overlay) - -/obj/item/gun/energy/beam_rifle/attack_self(mob/user) - projectile_setting_pierce = !projectile_setting_pierce - to_chat(user, "You set \the [src] to [projectile_setting_pierce? "pierce":"impact"] mode.") - aiming_beam() - -/obj/item/gun/energy/beam_rifle/proc/update_slowdown() - if(aiming) - slowdown = scoped_slow - else - slowdown = initial(slowdown) - -/obj/item/gun/energy/beam_rifle/Initialize() - . = ..() - current_tracers = list() - START_PROCESSING(SSprojectiles, src) - zoom_lock_action = new(src) - -/obj/item/gun/energy/beam_rifle/Destroy() - STOP_PROCESSING(SSfastprocess, src) - set_user(null) - QDEL_LIST(current_tracers) - QDEL_NULL(mobhook) - return ..() - -/obj/item/gun/energy/beam_rifle/emp_act(severity) - chambered = null - recharge_newshot() - -/obj/item/gun/energy/beam_rifle/proc/aiming_beam(force_update = FALSE) - var/diff = abs(aiming_lastangle - lastangle) - check_user() - if(diff < AIMING_BEAM_ANGLE_CHANGE_THRESHOLD && !force_update) - return - aiming_lastangle = lastangle - var/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/P = new - P.gun = src - P.wall_pierce_amount = wall_pierce_amount - P.structure_pierce_amount = structure_piercing - P.do_pierce = projectile_setting_pierce - if(aiming_time) - var/percent = ((100/aiming_time)*aiming_time_left) - P.color = rgb(255 * percent,255 * ((100 - percent) / 100),0) - else - P.color = rgb(0, 255, 0) - var/turf/curloc = get_turf(src) - var/turf/targloc = get_turf(current_user.client.mouseObject) - if(!istype(targloc)) - if(!istype(curloc)) - return - targloc = get_turf_in_angle(lastangle, curloc, 10) - P.preparePixelProjectile(targloc, current_user, current_user.client.mouseParams, 0) - P.fire(lastangle) - -/obj/item/gun/energy/beam_rifle/process() - if(!aiming) - last_process = world.time - return - check_user() - handle_zooming() - aiming_time_left = max(0, aiming_time_left - (world.time - last_process)) - aiming_beam(TRUE) - last_process = world.time - -/obj/item/gun/energy/beam_rifle/proc/check_user(automatic_cleanup = TRUE) - if(!istype(current_user) || !isturf(current_user.loc) || !(src in current_user.held_items) || current_user.incapacitated()) //Doesn't work if you're not holding it! - if(automatic_cleanup) - stop_aiming() - set_user(null) - return FALSE - return TRUE - -/obj/item/gun/energy/beam_rifle/proc/process_aim() - if(istype(current_user) && current_user.client && current_user.client.mouseParams) - var/angle = mouse_angle_from_client(current_user.client) - switch(angle) - if(316 to 360) - current_user.setDir(NORTH) - if(0 to 45) - current_user.setDir(NORTH) - if(46 to 135) - current_user.setDir(EAST) - if(136 to 225) - current_user.setDir(SOUTH) - if(226 to 315) - current_user.setDir(WEST) - var/difference = abs(lastangle - angle) - if(difference > 350) //Too lazy to properly math, detects 360 --> 0 changes. - difference = (lastangle > 350? ((360 - lastangle) + angle) : ((360 - angle) + lastangle)) - delay_penalty(difference * aiming_time_increase_angle_multiplier) - lastangle = angle - -/obj/item/gun/energy/beam_rifle/proc/on_mob_move() - check_user() - if(aiming) - delay_penalty(aiming_time_increase_user_movement) - process_aim() - aiming_beam(TRUE) - -/obj/item/gun/energy/beam_rifle/proc/start_aiming() - aiming_time_left = aiming_time - aiming = TRUE - process_aim() - aiming_beam(TRUE) - zooming_angle = lastangle - start_zooming() - -/obj/item/gun/energy/beam_rifle/proc/stop_aiming(mob/user) - set waitfor = FALSE - aiming_time_left = aiming_time - aiming = FALSE - QDEL_LIST(current_tracers) - stop_zooming(user) - -/obj/item/gun/energy/beam_rifle/proc/set_user(mob/user) - if(user == current_user) - return - stop_aiming(current_user) - QDEL_NULL(mobhook) - if(istype(current_user)) - LAZYREMOVE(current_user.mousemove_intercept_objects, src) - current_user = null - if(istype(user)) - current_user = user - LAZYADD(current_user.mousemove_intercept_objects, src) - mobhook = user.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED), CALLBACK(src, .proc/on_mob_move)) - -/obj/item/gun/energy/beam_rifle/onMouseDrag(src_object, over_object, src_location, over_location, params, mob) - if(aiming) - process_aim() - aiming_beam() - if(zoom_lock == ZOOM_LOCK_AUTOZOOM_FREEMOVE) - zooming_angle = lastangle - set_autozoom_pixel_offsets_immediate(zooming_angle) - smooth_zooming(2) - return ..() - -/obj/item/gun/energy/beam_rifle/onMouseDown(object, location, params, mob/mob) - if(istype(mob)) - set_user(mob) - if(istype(object, /obj/screen) && !istype(object, /obj/screen/click_catcher)) - return - if((object in mob.contents) || (object == mob)) - return - start_aiming() - return ..() - -/obj/item/gun/energy/beam_rifle/onMouseUp(object, location, params, mob/M) - if(istype(object, /obj/screen) && !istype(object, /obj/screen/click_catcher)) - return - process_aim() - if(aiming_time_left <= aiming_time_fire_threshold && check_user()) - sync_ammo() - afterattack(M.client.mouseObject, M, FALSE, M.client.mouseParams, passthrough = TRUE) - stop_aiming() - QDEL_LIST(current_tracers) - return ..() - -/obj/item/gun/energy/beam_rifle/afterattack(atom/target, mob/living/user, flag, params, passthrough = FALSE) - if(flag) //It's adjacent, is the user, or is on the user's person - if(target in user.contents) //can't shoot stuff inside us. - return - if(!ismob(target) || user.a_intent == INTENT_HARM) //melee attack - return - if(target == user && user.zone_selected != "mouth") //so we can't shoot ourselves (unless mouth selected) - return - if(!passthrough && (aiming_time > aiming_time_fire_threshold)) - return - if(lastfire > world.time + delay) - return - lastfire = world.time - . = ..() - stop_aiming() - -/obj/item/gun/energy/beam_rifle/proc/sync_ammo() - for(var/obj/item/ammo_casing/energy/beam_rifle/AC in contents) - AC.sync_stats() - -/obj/item/gun/energy/beam_rifle/proc/delay_penalty(amount) - aiming_time_left = CLAMP(aiming_time_left + amount, 0, aiming_time) - -/obj/item/ammo_casing/energy/beam_rifle - name = "particle acceleration lens" - desc = "Don't look into barrel!" - var/wall_pierce_amount = 0 - var/wall_devastate = 0 - var/aoe_structure_range = 1 - var/aoe_structure_damage = 30 - var/aoe_fire_range = 2 - var/aoe_fire_chance = 66 - var/aoe_mob_range = 1 - var/aoe_mob_damage = 20 - var/impact_structure_damage = 50 - var/projectile_damage = 40 - var/projectile_stun = 0 - var/structure_piercing = 2 - var/structure_bleed_coeff = 0.7 - var/do_pierce = TRUE - var/obj/item/gun/energy/beam_rifle/host - -/obj/item/ammo_casing/energy/beam_rifle/proc/sync_stats() - var/obj/item/gun/energy/beam_rifle/BR = loc - if(!istype(BR)) - stack_trace("Beam rifle syncing error") - host = BR - do_pierce = BR.projectile_setting_pierce - wall_pierce_amount = BR.wall_pierce_amount - wall_devastate = BR.wall_devastate - aoe_structure_range = BR.aoe_structure_range - aoe_structure_damage = BR.aoe_structure_damage - aoe_fire_range = BR.aoe_fire_range - aoe_fire_chance = BR.aoe_fire_chance - aoe_mob_range = BR.aoe_mob_range - aoe_mob_damage = BR.aoe_mob_damage - impact_structure_damage = BR.impact_structure_damage - projectile_damage = BR.projectile_damage - projectile_stun = BR.projectile_stun - delay = BR.delay - structure_piercing = BR.structure_piercing - structure_bleed_coeff = BR.structure_bleed_coeff - -/obj/item/ammo_casing/energy/beam_rifle/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") - . = ..() - var/obj/item/projectile/beam/beam_rifle/hitscan/HS_BB = BB - if(!istype(HS_BB)) - return - HS_BB.impact_direct_damage = projectile_damage - HS_BB.stun = projectile_stun - HS_BB.impact_structure_damage = impact_structure_damage - HS_BB.aoe_mob_damage = aoe_mob_damage - HS_BB.aoe_mob_range = CLAMP(aoe_mob_range, 0, 15) //Badmin safety lock - HS_BB.aoe_fire_chance = aoe_fire_chance - HS_BB.aoe_fire_range = aoe_fire_range - HS_BB.aoe_structure_damage = aoe_structure_damage - HS_BB.aoe_structure_range = CLAMP(aoe_structure_range, 0, 15) //Badmin safety lock - HS_BB.wall_devastate = wall_devastate - HS_BB.wall_pierce_amount = wall_pierce_amount - HS_BB.structure_pierce_amount = structure_piercing - HS_BB.structure_bleed_coeff = structure_bleed_coeff - HS_BB.do_pierce = do_pierce - HS_BB.gun = host - -/obj/item/ammo_casing/energy/beam_rifle/throw_proj(atom/target, turf/targloc, mob/living/user, params, spread) - var/turf/curloc = get_turf(user) - if(!istype(curloc) || !BB) - return FALSE - var/obj/item/gun/energy/beam_rifle/gun = loc - if(!targloc && gun) - targloc = get_turf_in_angle(gun.lastangle, curloc, 10) - else if(!targloc) - return FALSE - var/firing_dir - if(BB.firer) - firing_dir = BB.firer.dir - if(!BB.suppressed && firing_effect_type) - new firing_effect_type(get_turf(src), firing_dir) - BB.preparePixelProjectile(target, user, params, spread) - BB.fire(gun? gun.lastangle : null, null) - BB = null - return TRUE - -/obj/item/ammo_casing/energy/beam_rifle/hitscan - projectile_type = /obj/item/projectile/beam/beam_rifle/hitscan - select_name = "beam" - e_cost = 5000 - fire_sound = 'sound/weapons/beam_sniper.ogg' - -/obj/item/projectile/beam/beam_rifle - name = "particle beam" - icon = "" - hitsound = 'sound/effects/explosion3.ogg' - damage = 0 //Handled manually. - damage_type = BURN - flag = "energy" - range = 150 - jitter = 10 - var/obj/item/gun/energy/beam_rifle/gun - var/structure_pierce_amount = 0 //All set to 0 so the gun can manually set them during firing. - var/structure_bleed_coeff = 0 - var/structure_pierce = 0 - var/do_pierce = TRUE - var/wall_pierce_amount = 0 - var/wall_pierce = 0 - var/wall_devastate = 0 - var/aoe_structure_range = 0 - var/aoe_structure_damage = 0 - var/aoe_fire_range = 0 - var/aoe_fire_chance = 0 - var/aoe_mob_range = 0 - var/aoe_mob_damage = 0 - var/impact_structure_damage = 0 - var/impact_direct_damage = 0 - var/turf/cached - var/list/pierced = list() - -/obj/item/projectile/beam/beam_rifle/proc/AOE(turf/epicenter) - set waitfor = FALSE - if(!epicenter) - return - new /obj/effect/temp_visual/explosion/fast(epicenter) - for(var/mob/living/L in range(aoe_mob_range, epicenter)) //handle aoe mob damage - L.adjustFireLoss(aoe_mob_damage) - to_chat(L, "\The [src] sears you!") - for(var/turf/T in range(aoe_fire_range, epicenter)) //handle aoe fire - if(prob(aoe_fire_chance)) - new /obj/effect/hotspot(T) - for(var/obj/O in range(aoe_structure_range, epicenter)) - if(!isitem(O)) - if(O.level == 1) //Please don't break underfloor items! - continue - O.take_damage(aoe_structure_damage * get_damage_coeff(O), BURN, "laser", FALSE) - -/obj/item/projectile/beam/beam_rifle/proc/check_pierce(atom/target) - if(!do_pierce) - return FALSE - if(pierced[target]) //we already pierced them go away - return TRUE - if(isclosedturf(target)) - if(wall_pierce++ < wall_pierce_amount) - if(prob(wall_devastate)) - if(iswallturf(target)) - var/turf/closed/wall/W = target - W.dismantle_wall(TRUE, TRUE) - else - target.ex_act(EXPLODE_HEAVY) - return TRUE - if(ismovableatom(target)) - var/atom/movable/AM = target - if(AM.density && !AM.CanPass(src, get_turf(target)) && !ismob(AM)) - if(structure_pierce < structure_pierce_amount) - if(isobj(AM)) - var/obj/O = AM - O.take_damage((impact_structure_damage + aoe_structure_damage) * structure_bleed_coeff * get_damage_coeff(AM), BURN, "energy", FALSE) - pierced[AM] = TRUE - structure_pierce++ - return TRUE - return FALSE - -/obj/item/projectile/beam/beam_rifle/proc/get_damage_coeff(atom/target) - if(istype(target, /obj/machinery/door)) - return 0.4 - if(istype(target, /obj/structure/window)) - return 0.5 - return 1 - -/obj/item/projectile/beam/beam_rifle/proc/handle_impact(atom/target) - if(isobj(target)) - var/obj/O = target - O.take_damage(impact_structure_damage * get_damage_coeff(target), BURN, "laser", FALSE) - if(isliving(target)) - var/mob/living/L = target - L.adjustFireLoss(impact_direct_damage) - L.emote("scream") - -/obj/item/projectile/beam/beam_rifle/proc/handle_hit(atom/target) - set waitfor = FALSE - if(!cached && !QDELETED(target)) - cached = get_turf(target) - if(nodamage) - return FALSE - playsound(cached, 'sound/effects/explosion3.ogg', 100, 1) - AOE(cached) - if(!QDELETED(target)) - handle_impact(target) - -/obj/item/projectile/beam/beam_rifle/Collide(atom/target) - if(check_pierce(target)) - permutated += target - trajectory_ignore_forcemove = TRUE - forceMove(target) - trajectory_ignore_forcemove = FALSE - return FALSE - if(!QDELETED(target)) - cached = get_turf(target) - . = ..() - -/obj/item/projectile/beam/beam_rifle/on_hit(atom/target, blocked = FALSE) - if(!QDELETED(target)) - cached = get_turf(target) - handle_hit(target) - . = ..() - -/obj/item/projectile/beam/beam_rifle/hitscan - icon_state = "" - hitscan = TRUE - tracer_type = /obj/effect/projectile/tracer/tracer/beam_rifle - var/constant_tracer = FALSE - -/obj/item/projectile/beam/beam_rifle/hitscan/generate_hitscan_tracers(cleanup = TRUE, duration = 5, impacting = TRUE, highlander) - set waitfor = FALSE - if(isnull(highlander)) - highlander = constant_tracer - if(highlander && istype(gun)) - QDEL_LIST(gun.current_tracers) - for(var/datum/point/p in beam_segments) - gun.current_tracers += generate_tracer_between_points(p, beam_segments[p], tracer_type, color, 0) - else - for(var/datum/point/p in beam_segments) - generate_tracer_between_points(p, beam_segments[p], tracer_type, color, duration) - if(cleanup) - QDEL_LIST(beam_segments) - beam_segments = null - QDEL_NULL(beam_index) - -/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam - tracer_type = /obj/effect/projectile/tracer/tracer/aiming - name = "aiming beam" - hitsound = null - hitsound_wall = null - nodamage = TRUE - damage = 0 - constant_tracer = TRUE - -/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/prehit(atom/target) - qdel(src) - return FALSE - -/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/on_hit() - qdel(src) - return FALSE + +#define ZOOM_LOCK_AUTOZOOM_FREEMOVE 0 +#define ZOOM_LOCK_AUTOZOOM_ANGLELOCK 1 +#define ZOOM_LOCK_CENTER_VIEW 2 +#define ZOOM_LOCK_OFF 3 + +#define AUTOZOOM_PIXEL_STEP_FACTOR 48 + +#define AIMING_BEAM_ANGLE_CHANGE_THRESHOLD 0.1 + +/obj/item/gun/energy/beam_rifle + name = "particle acceleration rifle" + desc = "An energy-based anti material marksman rifle that uses highly charged particle beams moving at extreme velocities to decimate whatever is unfortunate enough to be targetted by one. \ + Hold down left click while scoped to aim, when weapon is fully aimed (Tracer goes from red to green as it charges), release to fire. Moving while aiming or \ + changing where you're pointing at while aiming will delay the aiming process depending on how much you changed." + icon = 'icons/obj/guns/energy.dmi' + icon_state = "esniper" + item_state = "esniper" + fire_sound = 'sound/weapons/beam_sniper.ogg' + slot_flags = SLOT_BACK + force = 15 + materials = list() + recoil = 4 + ammo_x_offset = 3 + ammo_y_offset = 3 + modifystate = FALSE + weapon_weight = WEAPON_HEAVY + w_class = WEIGHT_CLASS_BULKY + ammo_type = list(/obj/item/ammo_casing/energy/beam_rifle/hitscan) + cell_type = /obj/item/stock_parts/cell/beam_rifle + canMouseDown = TRUE + pin = null + var/aiming = FALSE + var/aiming_time = 12 + var/aiming_time_fire_threshold = 5 + var/aiming_time_left = 12 + var/aiming_time_increase_user_movement = 3 + var/scoped_slow = 1 + var/aiming_time_increase_angle_multiplier = 0.3 + var/last_process = 0 + + var/lastangle = 0 + var/aiming_lastangle = 0 + var/mob/current_user = null + var/list/obj/effect/projectile/tracer/current_tracers + + var/structure_piercing = 2 //Amount * 2. For some reason structures aren't respecting this unless you have it doubled. Probably with the objects in question's Bump() code instead of this but I'll deal with this later. + var/structure_bleed_coeff = 0.7 + var/wall_pierce_amount = 0 + var/wall_devastate = 0 + var/aoe_structure_range = 1 + var/aoe_structure_damage = 50 + var/aoe_fire_range = 2 + var/aoe_fire_chance = 40 + var/aoe_mob_range = 1 + var/aoe_mob_damage = 30 + var/impact_structure_damage = 60 + var/projectile_damage = 30 + var/projectile_stun = 0 + var/projectile_setting_pierce = TRUE + var/delay = 65 + var/lastfire = 0 + + //ZOOMING + var/zoom_current_view_increase = 0 + var/zoom_target_view_increase = 10 + var/zooming = FALSE + var/zoom_lock = ZOOM_LOCK_OFF + var/zooming_angle + var/current_zoom_x = 0 + var/current_zoom_y = 0 + var/zoom_animating = 0 + + var/static/image/charged_overlay = image(icon = 'icons/obj/guns/energy.dmi', icon_state = "esniper_charged") + var/static/image/drained_overlay = image(icon = 'icons/obj/guns/energy.dmi', icon_state = "esniper_empty") + + var/datum/action/item_action/zoom_lock_action/zoom_lock_action + var/datum/component/mobhook + +/obj/item/gun/energy/beam_rifle/debug + delay = 0 + cell_type = /obj/item/stock_parts/cell/infinite + aiming_time = 0 + recoil = 0 + pin = /obj/item/device/firing_pin + +/obj/item/gun/energy/beam_rifle/equipped(mob/user) + set_user(user) + . = ..() + +/obj/item/gun/energy/beam_rifle/pickup(mob/user) + set_user(user) + . = ..() + +/obj/item/gun/energy/beam_rifle/dropped(mob/user) + set_user() + . = ..() + +/obj/item/gun/energy/beam_rifle/ui_action_click(owner, action) + if(istype(action, /datum/action/item_action/zoom_lock_action)) + zoom_lock++ + if(zoom_lock > 3) + zoom_lock = 0 + switch(zoom_lock) + if(ZOOM_LOCK_AUTOZOOM_FREEMOVE) + to_chat(owner, "You switch [src]'s zooming processor to free directional.") + if(ZOOM_LOCK_AUTOZOOM_ANGLELOCK) + to_chat(owner, "You switch [src]'s zooming processor to locked directional.") + if(ZOOM_LOCK_CENTER_VIEW) + to_chat(owner, "You switch [src]'s zooming processor to center mode.") + if(ZOOM_LOCK_OFF) + to_chat(owner, "You disable [src]'s zooming system.") + reset_zooming() + +/obj/item/gun/energy/beam_rifle/proc/smooth_zooming(delay_override = null) + if(!check_user() || !zooming || zoom_lock == ZOOM_LOCK_OFF || zoom_lock == ZOOM_LOCK_CENTER_VIEW) + return + if(zoom_animating && delay_override != 0) + return smooth_zooming(zoom_animating + delay_override) //Automatically compensate for ongoing zooming actions. + var/total_time = SSfastprocess.wait + if(delay_override) + total_time = delay_override + zoom_animating = total_time + animate(current_user.client, pixel_x = current_zoom_x, pixel_y = current_zoom_y , total_time, SINE_EASING, ANIMATION_PARALLEL) + zoom_animating = 0 + +/obj/item/gun/energy/beam_rifle/proc/set_autozoom_pixel_offsets_immediate(current_angle) + if(zoom_lock == ZOOM_LOCK_CENTER_VIEW || zoom_lock == ZOOM_LOCK_OFF) + return + current_zoom_x = sin(current_angle) + sin(current_angle) * AUTOZOOM_PIXEL_STEP_FACTOR * zoom_current_view_increase + current_zoom_y = cos(current_angle) + cos(current_angle) * AUTOZOOM_PIXEL_STEP_FACTOR * zoom_current_view_increase + +/obj/item/gun/energy/beam_rifle/proc/handle_zooming() + if(!zooming || !check_user()) + return + current_user.client.change_view(world.view + zoom_target_view_increase) + zoom_current_view_increase = zoom_target_view_increase + set_autozoom_pixel_offsets_immediate(zooming_angle) + smooth_zooming() + +/obj/item/gun/energy/beam_rifle/proc/start_zooming() + if(zoom_lock == ZOOM_LOCK_OFF) + return + zooming = TRUE + +/obj/item/gun/energy/beam_rifle/proc/stop_zooming(mob/user) + if(zooming) + zooming = FALSE + reset_zooming(user) + +/obj/item/gun/energy/beam_rifle/proc/reset_zooming(mob/user) + if(!user) + user = current_user + if(!user || !user.client) + return FALSE + zoom_animating = 0 + animate(user.client, pixel_x = 0, pixel_y = 0, 0, FALSE, LINEAR_EASING, ANIMATION_END_NOW) + zoom_current_view_increase = 0 + user.client.change_view(CONFIG_GET(string/default_view)) + zooming_angle = 0 + current_zoom_x = 0 + current_zoom_y = 0 + +/obj/item/gun/energy/beam_rifle/update_icon() + cut_overlays() + var/obj/item/ammo_casing/energy/primary_ammo = ammo_type[1] + if(cell.charge > primary_ammo.e_cost) + add_overlay(charged_overlay) + else + add_overlay(drained_overlay) + +/obj/item/gun/energy/beam_rifle/attack_self(mob/user) + projectile_setting_pierce = !projectile_setting_pierce + to_chat(user, "You set \the [src] to [projectile_setting_pierce? "pierce":"impact"] mode.") + aiming_beam() + +/obj/item/gun/energy/beam_rifle/proc/update_slowdown() + if(aiming) + slowdown = scoped_slow + else + slowdown = initial(slowdown) + +/obj/item/gun/energy/beam_rifle/Initialize() + . = ..() + current_tracers = list() + START_PROCESSING(SSprojectiles, src) + zoom_lock_action = new(src) + +/obj/item/gun/energy/beam_rifle/Destroy() + STOP_PROCESSING(SSfastprocess, src) + set_user(null) + QDEL_LIST(current_tracers) + QDEL_NULL(mobhook) + return ..() + +/obj/item/gun/energy/beam_rifle/emp_act(severity) + chambered = null + recharge_newshot() + +/obj/item/gun/energy/beam_rifle/proc/aiming_beam(force_update = FALSE) + var/diff = abs(aiming_lastangle - lastangle) + check_user() + if(diff < AIMING_BEAM_ANGLE_CHANGE_THRESHOLD && !force_update) + return + aiming_lastangle = lastangle + var/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/P = new + P.gun = src + P.wall_pierce_amount = wall_pierce_amount + P.structure_pierce_amount = structure_piercing + P.do_pierce = projectile_setting_pierce + if(aiming_time) + var/percent = ((100/aiming_time)*aiming_time_left) + P.color = rgb(255 * percent,255 * ((100 - percent) / 100),0) + else + P.color = rgb(0, 255, 0) + var/turf/curloc = get_turf(src) + var/turf/targloc = get_turf(current_user.client.mouseObject) + if(!istype(targloc)) + if(!istype(curloc)) + return + targloc = get_turf_in_angle(lastangle, curloc, 10) + P.preparePixelProjectile(targloc, current_user, current_user.client.mouseParams, 0) + P.fire(lastangle) + +/obj/item/gun/energy/beam_rifle/process() + if(!aiming) + last_process = world.time + return + check_user() + handle_zooming() + aiming_time_left = max(0, aiming_time_left - (world.time - last_process)) + aiming_beam(TRUE) + last_process = world.time + +/obj/item/gun/energy/beam_rifle/proc/check_user(automatic_cleanup = TRUE) + if(!istype(current_user) || !isturf(current_user.loc) || !(src in current_user.held_items) || current_user.incapacitated()) //Doesn't work if you're not holding it! + if(automatic_cleanup) + stop_aiming() + set_user(null) + return FALSE + return TRUE + +/obj/item/gun/energy/beam_rifle/proc/process_aim() + if(istype(current_user) && current_user.client && current_user.client.mouseParams) + var/angle = mouse_angle_from_client(current_user.client) + switch(angle) + if(316 to 360) + current_user.setDir(NORTH) + if(0 to 45) + current_user.setDir(NORTH) + if(46 to 135) + current_user.setDir(EAST) + if(136 to 225) + current_user.setDir(SOUTH) + if(226 to 315) + current_user.setDir(WEST) + var/difference = abs(lastangle - angle) + if(difference > 350) //Too lazy to properly math, detects 360 --> 0 changes. + difference = (lastangle > 350? ((360 - lastangle) + angle) : ((360 - angle) + lastangle)) + delay_penalty(difference * aiming_time_increase_angle_multiplier) + lastangle = angle + +/obj/item/gun/energy/beam_rifle/proc/on_mob_move() + check_user() + if(aiming) + delay_penalty(aiming_time_increase_user_movement) + process_aim() + aiming_beam(TRUE) + +/obj/item/gun/energy/beam_rifle/proc/start_aiming() + aiming_time_left = aiming_time + aiming = TRUE + process_aim() + aiming_beam(TRUE) + zooming_angle = lastangle + start_zooming() + +/obj/item/gun/energy/beam_rifle/proc/stop_aiming(mob/user) + set waitfor = FALSE + aiming_time_left = aiming_time + aiming = FALSE + QDEL_LIST(current_tracers) + stop_zooming(user) + +/obj/item/gun/energy/beam_rifle/proc/set_user(mob/user) + if(user == current_user) + return + stop_aiming(current_user) + QDEL_NULL(mobhook) + if(istype(current_user)) + LAZYREMOVE(current_user.mousemove_intercept_objects, src) + current_user = null + if(istype(user)) + current_user = user + LAZYADD(current_user.mousemove_intercept_objects, src) + mobhook = user.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED), CALLBACK(src, .proc/on_mob_move)) + +/obj/item/gun/energy/beam_rifle/onMouseDrag(src_object, over_object, src_location, over_location, params, mob) + if(aiming) + process_aim() + aiming_beam() + if(zoom_lock == ZOOM_LOCK_AUTOZOOM_FREEMOVE) + zooming_angle = lastangle + set_autozoom_pixel_offsets_immediate(zooming_angle) + smooth_zooming(2) + return ..() + +/obj/item/gun/energy/beam_rifle/onMouseDown(object, location, params, mob/mob) + if(istype(mob)) + set_user(mob) + if(istype(object, /obj/screen) && !istype(object, /obj/screen/click_catcher)) + return + if((object in mob.contents) || (object == mob)) + return + start_aiming() + return ..() + +/obj/item/gun/energy/beam_rifle/onMouseUp(object, location, params, mob/M) + if(istype(object, /obj/screen) && !istype(object, /obj/screen/click_catcher)) + return + process_aim() + if(aiming_time_left <= aiming_time_fire_threshold && check_user()) + sync_ammo() + afterattack(M.client.mouseObject, M, FALSE, M.client.mouseParams, passthrough = TRUE) + stop_aiming() + QDEL_LIST(current_tracers) + return ..() + +/obj/item/gun/energy/beam_rifle/afterattack(atom/target, mob/living/user, flag, params, passthrough = FALSE) + if(flag) //It's adjacent, is the user, or is on the user's person + if(target in user.contents) //can't shoot stuff inside us. + return + if(!ismob(target) || user.a_intent == INTENT_HARM) //melee attack + return + if(target == user && user.zone_selected != "mouth") //so we can't shoot ourselves (unless mouth selected) + return + if(!passthrough && (aiming_time > aiming_time_fire_threshold)) + return + if(lastfire > world.time + delay) + return + lastfire = world.time + . = ..() + stop_aiming() + +/obj/item/gun/energy/beam_rifle/proc/sync_ammo() + for(var/obj/item/ammo_casing/energy/beam_rifle/AC in contents) + AC.sync_stats() + +/obj/item/gun/energy/beam_rifle/proc/delay_penalty(amount) + aiming_time_left = CLAMP(aiming_time_left + amount, 0, aiming_time) + +/obj/item/ammo_casing/energy/beam_rifle + name = "particle acceleration lens" + desc = "Don't look into barrel!" + var/wall_pierce_amount = 0 + var/wall_devastate = 0 + var/aoe_structure_range = 1 + var/aoe_structure_damage = 30 + var/aoe_fire_range = 2 + var/aoe_fire_chance = 66 + var/aoe_mob_range = 1 + var/aoe_mob_damage = 20 + var/impact_structure_damage = 50 + var/projectile_damage = 40 + var/projectile_stun = 0 + var/structure_piercing = 2 + var/structure_bleed_coeff = 0.7 + var/do_pierce = TRUE + var/obj/item/gun/energy/beam_rifle/host + +/obj/item/ammo_casing/energy/beam_rifle/proc/sync_stats() + var/obj/item/gun/energy/beam_rifle/BR = loc + if(!istype(BR)) + stack_trace("Beam rifle syncing error") + host = BR + do_pierce = BR.projectile_setting_pierce + wall_pierce_amount = BR.wall_pierce_amount + wall_devastate = BR.wall_devastate + aoe_structure_range = BR.aoe_structure_range + aoe_structure_damage = BR.aoe_structure_damage + aoe_fire_range = BR.aoe_fire_range + aoe_fire_chance = BR.aoe_fire_chance + aoe_mob_range = BR.aoe_mob_range + aoe_mob_damage = BR.aoe_mob_damage + impact_structure_damage = BR.impact_structure_damage + projectile_damage = BR.projectile_damage + projectile_stun = BR.projectile_stun + delay = BR.delay + structure_piercing = BR.structure_piercing + structure_bleed_coeff = BR.structure_bleed_coeff + +/obj/item/ammo_casing/energy/beam_rifle/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") + . = ..() + var/obj/item/projectile/beam/beam_rifle/hitscan/HS_BB = BB + if(!istype(HS_BB)) + return + HS_BB.impact_direct_damage = projectile_damage + HS_BB.stun = projectile_stun + HS_BB.impact_structure_damage = impact_structure_damage + HS_BB.aoe_mob_damage = aoe_mob_damage + HS_BB.aoe_mob_range = CLAMP(aoe_mob_range, 0, 15) //Badmin safety lock + HS_BB.aoe_fire_chance = aoe_fire_chance + HS_BB.aoe_fire_range = aoe_fire_range + HS_BB.aoe_structure_damage = aoe_structure_damage + HS_BB.aoe_structure_range = CLAMP(aoe_structure_range, 0, 15) //Badmin safety lock + HS_BB.wall_devastate = wall_devastate + HS_BB.wall_pierce_amount = wall_pierce_amount + HS_BB.structure_pierce_amount = structure_piercing + HS_BB.structure_bleed_coeff = structure_bleed_coeff + HS_BB.do_pierce = do_pierce + HS_BB.gun = host + +/obj/item/ammo_casing/energy/beam_rifle/throw_proj(atom/target, turf/targloc, mob/living/user, params, spread) + var/turf/curloc = get_turf(user) + if(!istype(curloc) || !BB) + return FALSE + var/obj/item/gun/energy/beam_rifle/gun = loc + if(!targloc && gun) + targloc = get_turf_in_angle(gun.lastangle, curloc, 10) + else if(!targloc) + return FALSE + var/firing_dir + if(BB.firer) + firing_dir = BB.firer.dir + if(!BB.suppressed && firing_effect_type) + new firing_effect_type(get_turf(src), firing_dir) + BB.preparePixelProjectile(target, user, params, spread) + BB.fire(gun? gun.lastangle : null, null) + BB = null + return TRUE + +/obj/item/ammo_casing/energy/beam_rifle/hitscan + projectile_type = /obj/item/projectile/beam/beam_rifle/hitscan + select_name = "beam" + e_cost = 5000 + fire_sound = 'sound/weapons/beam_sniper.ogg' + +/obj/item/projectile/beam/beam_rifle + name = "particle beam" + icon = "" + hitsound = 'sound/effects/explosion3.ogg' + damage = 0 //Handled manually. + damage_type = BURN + flag = "energy" + range = 150 + jitter = 10 + var/obj/item/gun/energy/beam_rifle/gun + var/structure_pierce_amount = 0 //All set to 0 so the gun can manually set them during firing. + var/structure_bleed_coeff = 0 + var/structure_pierce = 0 + var/do_pierce = TRUE + var/wall_pierce_amount = 0 + var/wall_pierce = 0 + var/wall_devastate = 0 + var/aoe_structure_range = 0 + var/aoe_structure_damage = 0 + var/aoe_fire_range = 0 + var/aoe_fire_chance = 0 + var/aoe_mob_range = 0 + var/aoe_mob_damage = 0 + var/impact_structure_damage = 0 + var/impact_direct_damage = 0 + var/turf/cached + var/list/pierced = list() + +/obj/item/projectile/beam/beam_rifle/proc/AOE(turf/epicenter) + set waitfor = FALSE + if(!epicenter) + return + new /obj/effect/temp_visual/explosion/fast(epicenter) + for(var/mob/living/L in range(aoe_mob_range, epicenter)) //handle aoe mob damage + L.adjustFireLoss(aoe_mob_damage) + to_chat(L, "\The [src] sears you!") + for(var/turf/T in range(aoe_fire_range, epicenter)) //handle aoe fire + if(prob(aoe_fire_chance)) + new /obj/effect/hotspot(T) + for(var/obj/O in range(aoe_structure_range, epicenter)) + if(!isitem(O)) + if(O.level == 1) //Please don't break underfloor items! + continue + O.take_damage(aoe_structure_damage * get_damage_coeff(O), BURN, "laser", FALSE) + +/obj/item/projectile/beam/beam_rifle/proc/check_pierce(atom/target) + if(!do_pierce) + return FALSE + if(pierced[target]) //we already pierced them go away + return TRUE + if(isclosedturf(target)) + if(wall_pierce++ < wall_pierce_amount) + if(prob(wall_devastate)) + if(iswallturf(target)) + var/turf/closed/wall/W = target + W.dismantle_wall(TRUE, TRUE) + else + target.ex_act(EXPLODE_HEAVY) + return TRUE + if(ismovableatom(target)) + var/atom/movable/AM = target + if(AM.density && !AM.CanPass(src, get_turf(target)) && !ismob(AM)) + if(structure_pierce < structure_pierce_amount) + if(isobj(AM)) + var/obj/O = AM + O.take_damage((impact_structure_damage + aoe_structure_damage) * structure_bleed_coeff * get_damage_coeff(AM), BURN, "energy", FALSE) + pierced[AM] = TRUE + structure_pierce++ + return TRUE + return FALSE + +/obj/item/projectile/beam/beam_rifle/proc/get_damage_coeff(atom/target) + if(istype(target, /obj/machinery/door)) + return 0.4 + if(istype(target, /obj/structure/window)) + return 0.5 + return 1 + +/obj/item/projectile/beam/beam_rifle/proc/handle_impact(atom/target) + if(isobj(target)) + var/obj/O = target + O.take_damage(impact_structure_damage * get_damage_coeff(target), BURN, "laser", FALSE) + if(isliving(target)) + var/mob/living/L = target + L.adjustFireLoss(impact_direct_damage) + L.emote("scream") + +/obj/item/projectile/beam/beam_rifle/proc/handle_hit(atom/target) + set waitfor = FALSE + if(!cached && !QDELETED(target)) + cached = get_turf(target) + if(nodamage) + return FALSE + playsound(cached, 'sound/effects/explosion3.ogg', 100, 1) + AOE(cached) + if(!QDELETED(target)) + handle_impact(target) + +/obj/item/projectile/beam/beam_rifle/Collide(atom/target) + if(check_pierce(target)) + permutated += target + trajectory_ignore_forcemove = TRUE + forceMove(target) + trajectory_ignore_forcemove = FALSE + return FALSE + if(!QDELETED(target)) + cached = get_turf(target) + . = ..() + +/obj/item/projectile/beam/beam_rifle/on_hit(atom/target, blocked = FALSE) + if(!QDELETED(target)) + cached = get_turf(target) + handle_hit(target) + . = ..() + +/obj/item/projectile/beam/beam_rifle/hitscan + icon_state = "" + hitscan = TRUE + tracer_type = /obj/effect/projectile/tracer/tracer/beam_rifle + var/constant_tracer = FALSE + +/obj/item/projectile/beam/beam_rifle/hitscan/generate_hitscan_tracers(cleanup = TRUE, duration = 5, impacting = TRUE, highlander) + set waitfor = FALSE + if(isnull(highlander)) + highlander = constant_tracer + if(highlander && istype(gun)) + QDEL_LIST(gun.current_tracers) + for(var/datum/point/p in beam_segments) + gun.current_tracers += generate_tracer_between_points(p, beam_segments[p], tracer_type, color, 0) + else + for(var/datum/point/p in beam_segments) + generate_tracer_between_points(p, beam_segments[p], tracer_type, color, duration) + if(cleanup) + QDEL_LIST(beam_segments) + beam_segments = null + QDEL_NULL(beam_index) + +/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam + tracer_type = /obj/effect/projectile/tracer/tracer/aiming + name = "aiming beam" + hitsound = null + hitsound_wall = null + nodamage = TRUE + damage = 0 + constant_tracer = TRUE + +/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/prehit(atom/target) + qdel(src) + return FALSE + +/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/on_hit() + qdel(src) + return FALSE diff --git a/code/modules/projectiles/guns/chem_gun.dm b/code/modules/projectiles/guns/misc/chem_gun.dm similarity index 95% rename from code/modules/projectiles/guns/chem_gun.dm rename to code/modules/projectiles/guns/misc/chem_gun.dm index b928abafef..17e3bd1876 100644 --- a/code/modules/projectiles/guns/chem_gun.dm +++ b/code/modules/projectiles/guns/misc/chem_gun.dm @@ -1,47 +1,47 @@ -//his isn't a subtype of the syringe gun because the syringegun subtype is made to hold syringes -//this is meant to hold reagents/obj/item/gun/syringe -/obj/item/gun/chem - name = "reagent gun" - desc = "A Nanotrasen syringe gun, modified to automatically synthesise chemical darts, and instead hold reagents." - icon_state = "chemgun" - item_state = "chemgun" - w_class = WEIGHT_CLASS_NORMAL - throw_speed = 3 - throw_range = 7 - force = 4 - materials = list(MAT_METAL=2000) - clumsy_check = FALSE - fire_sound = 'sound/items/syringeproj.ogg' - container_type = OPENCONTAINER - var/time_per_syringe = 250 - var/syringes_left = 4 - var/max_syringes = 4 - var/last_synth = 0 - -/obj/item/gun/chem/Initialize() - . = ..() - chambered = new /obj/item/ammo_casing/chemgun(src) - START_PROCESSING(SSobj, src) - create_reagents(100) - -/obj/item/gun/chem/Destroy() - . = ..() - STOP_PROCESSING(SSobj, src) - -/obj/item/gun/chem/can_shoot() - return syringes_left - -/obj/item/gun/chem/process_chamber() - if(chambered && !chambered.BB && syringes_left) - chambered.newshot() - -/obj/item/gun/chem/process() - if(syringes_left >= max_syringes) - return - if(world.time < last_synth+time_per_syringe) - return - to_chat(loc, "You hear a click as [src] synthesizes a new dart.") - syringes_left++ - if(chambered && !chambered.BB) - chambered.newshot() +//his isn't a subtype of the syringe gun because the syringegun subtype is made to hold syringes +//this is meant to hold reagents/obj/item/gun/syringe +/obj/item/gun/chem + name = "reagent gun" + desc = "A Nanotrasen syringe gun, modified to automatically synthesise chemical darts, and instead hold reagents." + icon_state = "chemgun" + item_state = "chemgun" + w_class = WEIGHT_CLASS_NORMAL + throw_speed = 3 + throw_range = 7 + force = 4 + materials = list(MAT_METAL=2000) + clumsy_check = FALSE + fire_sound = 'sound/items/syringeproj.ogg' + container_type = OPENCONTAINER + var/time_per_syringe = 250 + var/syringes_left = 4 + var/max_syringes = 4 + var/last_synth = 0 + +/obj/item/gun/chem/Initialize() + . = ..() + chambered = new /obj/item/ammo_casing/chemgun(src) + START_PROCESSING(SSobj, src) + create_reagents(100) + +/obj/item/gun/chem/Destroy() + . = ..() + STOP_PROCESSING(SSobj, src) + +/obj/item/gun/chem/can_shoot() + return syringes_left + +/obj/item/gun/chem/process_chamber() + if(chambered && !chambered.BB && syringes_left) + chambered.newshot() + +/obj/item/gun/chem/process() + if(syringes_left >= max_syringes) + return + if(world.time < last_synth+time_per_syringe) + return + to_chat(loc, "You hear a click as [src] synthesizes a new dart.") + syringes_left++ + if(chambered && !chambered.BB) + chambered.newshot() last_synth = world.time \ No newline at end of file diff --git a/code/modules/projectiles/guns/grenade_launcher.dm b/code/modules/projectiles/guns/misc/grenade_launcher.dm similarity index 97% rename from code/modules/projectiles/guns/grenade_launcher.dm rename to code/modules/projectiles/guns/misc/grenade_launcher.dm index 771c0091e3..e57d77bdf9 100644 --- a/code/modules/projectiles/guns/grenade_launcher.dm +++ b/code/modules/projectiles/guns/misc/grenade_launcher.dm @@ -1,52 +1,52 @@ -/obj/item/gun/grenadelauncher - name = "grenade launcher" - desc = "A terrible, terrible thing. It's really awful!" - icon = 'icons/obj/guns/projectile.dmi' - icon_state = "riotgun" - item_state = "riotgun" - w_class = WEIGHT_CLASS_BULKY - throw_speed = 2 - throw_range = 7 - force = 5 - var/list/grenades = new/list() - var/max_grenades = 3 - materials = list(MAT_METAL=2000) - -/obj/item/gun/grenadelauncher/examine(mob/user) - ..() - to_chat(user, "[grenades.len] / [max_grenades] grenades loaded.") - -/obj/item/gun/grenadelauncher/attackby(obj/item/I, mob/user, params) - - if((istype(I, /obj/item/grenade))) - if(grenades.len < max_grenades) - if(!user.transferItemToLoc(I, src)) - return - grenades += I - to_chat(user, "You put the grenade in the grenade launcher.") - to_chat(user, "[grenades.len] / [max_grenades] Grenades.") - else - to_chat(usr, "The grenade launcher cannot hold more grenades.") - -/obj/item/gun/grenadelauncher/afterattack(obj/target, mob/user , flag) - if(target == user) - return - - if(grenades.len) - fire_grenade(target,user) - else - to_chat(user, "The grenade launcher is empty.") - -/obj/item/gun/grenadelauncher/proc/fire_grenade(atom/target, mob/user) - user.visible_message("[user] fired a grenade!", \ - "You fire the grenade launcher!") - var/obj/item/grenade/F = grenades[1] //Now with less copypasta! - grenades -= F - F.forceMove(user.loc) - F.throw_at(target, 30, 2, user) - message_admins("[key_name_admin(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).") - log_game("[key_name(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).") - F.active = 1 - F.icon_state = initial(F.icon_state) + "_active" - playsound(user.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) - addtimer(CALLBACK(F, /obj/item/grenade.proc/prime), 15) +/obj/item/gun/grenadelauncher + name = "grenade launcher" + desc = "A terrible, terrible thing. It's really awful!" + icon = 'icons/obj/guns/projectile.dmi' + icon_state = "riotgun" + item_state = "riotgun" + w_class = WEIGHT_CLASS_BULKY + throw_speed = 2 + throw_range = 7 + force = 5 + var/list/grenades = new/list() + var/max_grenades = 3 + materials = list(MAT_METAL=2000) + +/obj/item/gun/grenadelauncher/examine(mob/user) + ..() + to_chat(user, "[grenades.len] / [max_grenades] grenades loaded.") + +/obj/item/gun/grenadelauncher/attackby(obj/item/I, mob/user, params) + + if((istype(I, /obj/item/grenade))) + if(grenades.len < max_grenades) + if(!user.transferItemToLoc(I, src)) + return + grenades += I + to_chat(user, "You put the grenade in the grenade launcher.") + to_chat(user, "[grenades.len] / [max_grenades] Grenades.") + else + to_chat(usr, "The grenade launcher cannot hold more grenades.") + +/obj/item/gun/grenadelauncher/afterattack(obj/target, mob/user , flag) + if(target == user) + return + + if(grenades.len) + fire_grenade(target,user) + else + to_chat(user, "The grenade launcher is empty.") + +/obj/item/gun/grenadelauncher/proc/fire_grenade(atom/target, mob/user) + user.visible_message("[user] fired a grenade!", \ + "You fire the grenade launcher!") + var/obj/item/grenade/F = grenades[1] //Now with less copypasta! + grenades -= F + F.forceMove(user.loc) + F.throw_at(target, 30, 2, user) + message_admins("[key_name_admin(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).") + log_game("[key_name(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).") + F.active = 1 + F.icon_state = initial(F.icon_state) + "_active" + playsound(user.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) + addtimer(CALLBACK(F, /obj/item/grenade.proc/prime), 15) diff --git a/code/modules/projectiles/guns/medbeam.dm b/code/modules/projectiles/guns/misc/medbeam.dm similarity index 96% rename from code/modules/projectiles/guns/medbeam.dm rename to code/modules/projectiles/guns/misc/medbeam.dm index 79cafe0dd6..8fb07c32e3 100644 --- a/code/modules/projectiles/guns/medbeam.dm +++ b/code/modules/projectiles/guns/misc/medbeam.dm @@ -1,133 +1,133 @@ -/obj/item/gun/medbeam - name = "Medical Beamgun" - desc = "Don't cross the streams!" - icon = 'icons/obj/chronos.dmi' - icon_state = "chronogun" - item_state = "chronogun" - w_class = WEIGHT_CLASS_NORMAL - - var/mob/living/current_target - var/last_check = 0 - var/check_delay = 10 //Check los as often as possible, max resolution is SSobj tick though - var/max_range = 8 - var/active = 0 - var/datum/beam/current_beam = null - var/mounted = 0 //Denotes if this is a handheld or mounted version - - weapon_weight = WEAPON_MEDIUM - -/obj/item/gun/medbeam/Initialize() - . = ..() - START_PROCESSING(SSobj, src) - -/obj/item/gun/medbeam/Destroy(mob/user) - STOP_PROCESSING(SSobj, src) - LoseTarget() - return ..() - -/obj/item/gun/medbeam/dropped(mob/user) - ..() - LoseTarget() - -/obj/item/gun/medbeam/equipped(mob/user) - ..() - LoseTarget() - -/obj/item/gun/medbeam/proc/LoseTarget() - if(active) - qdel(current_beam) - current_beam = null - active = 0 - on_beam_release(current_target) - current_target = null - -/obj/item/gun/medbeam/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) - if(isliving(user)) - add_fingerprint(user) - - if(current_target) - LoseTarget() - if(!isliving(target)) - return - - current_target = target - active = TRUE - current_beam = new(user,current_target,time=6000,beam_icon_state="medbeam",btype=/obj/effect/ebeam/medical) - INVOKE_ASYNC(current_beam, /datum/beam.proc/Start) - - SSblackbox.record_feedback("tally", "gun_fired", 1, type) - -/obj/item/gun/medbeam/process() - - var/source = loc - if(!mounted && !isliving(source)) - LoseTarget() - return - - if(!current_target) - LoseTarget() - return - - if(world.time <= last_check+check_delay) - return - - last_check = world.time - - if(get_dist(source, current_target)>max_range || !los_check(source, current_target)) - LoseTarget() - if(isliving(source)) - to_chat(source, "You lose control of the beam!") - return - - if(current_target) - on_beam_tick(current_target) - -/obj/item/gun/medbeam/proc/los_check(atom/movable/user, mob/target) - var/turf/user_turf = user.loc - if(mounted) - user_turf = get_turf(user) - else if(!istype(user_turf)) - return 0 - var/obj/dummy = new(user_turf) - dummy.pass_flags |= PASSTABLE|PASSGLASS|PASSGRILLE //Grille/Glass so it can be used through common windows - for(var/turf/turf in getline(user_turf,target)) - if(mounted && turf == user_turf) - continue //Mechs are dense and thus fail the check - if(turf.density) - qdel(dummy) - return 0 - for(var/atom/movable/AM in turf) - if(!AM.CanPass(dummy,turf,1)) - qdel(dummy) - return 0 - for(var/obj/effect/ebeam/medical/B in turf)// Don't cross the str-beams! - if(B.owner.origin != current_beam.origin) - explosion(B.loc,0,3,5,8) - qdel(dummy) - return 0 - qdel(dummy) - return 1 - -/obj/item/gun/medbeam/proc/on_beam_hit(var/mob/living/target) - return - -/obj/item/gun/medbeam/proc/on_beam_tick(var/mob/living/target) - if(target.health != target.maxHealth) - new /obj/effect/temp_visual/heal(get_turf(target), "#80F5FF") - target.adjustBruteLoss(-4) - target.adjustFireLoss(-4) - return - -/obj/item/gun/medbeam/proc/on_beam_release(var/mob/living/target) - return - -/obj/effect/ebeam/medical - name = "medical beam" - -//////////////////////////////Mech Version/////////////////////////////// -/obj/item/gun/medbeam/mech - mounted = 1 - -/obj/item/gun/medbeam/mech/Initialize() - . = ..() - STOP_PROCESSING(SSobj, src) //Mech mediguns do not process until installed, and are controlled by the holder obj +/obj/item/gun/medbeam + name = "Medical Beamgun" + desc = "Don't cross the streams!" + icon = 'icons/obj/chronos.dmi' + icon_state = "chronogun" + item_state = "chronogun" + w_class = WEIGHT_CLASS_NORMAL + + var/mob/living/current_target + var/last_check = 0 + var/check_delay = 10 //Check los as often as possible, max resolution is SSobj tick though + var/max_range = 8 + var/active = 0 + var/datum/beam/current_beam = null + var/mounted = 0 //Denotes if this is a handheld or mounted version + + weapon_weight = WEAPON_MEDIUM + +/obj/item/gun/medbeam/Initialize() + . = ..() + START_PROCESSING(SSobj, src) + +/obj/item/gun/medbeam/Destroy(mob/user) + STOP_PROCESSING(SSobj, src) + LoseTarget() + return ..() + +/obj/item/gun/medbeam/dropped(mob/user) + ..() + LoseTarget() + +/obj/item/gun/medbeam/equipped(mob/user) + ..() + LoseTarget() + +/obj/item/gun/medbeam/proc/LoseTarget() + if(active) + qdel(current_beam) + current_beam = null + active = 0 + on_beam_release(current_target) + current_target = null + +/obj/item/gun/medbeam/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) + if(isliving(user)) + add_fingerprint(user) + + if(current_target) + LoseTarget() + if(!isliving(target)) + return + + current_target = target + active = TRUE + current_beam = new(user,current_target,time=6000,beam_icon_state="medbeam",btype=/obj/effect/ebeam/medical) + INVOKE_ASYNC(current_beam, /datum/beam.proc/Start) + + SSblackbox.record_feedback("tally", "gun_fired", 1, type) + +/obj/item/gun/medbeam/process() + + var/source = loc + if(!mounted && !isliving(source)) + LoseTarget() + return + + if(!current_target) + LoseTarget() + return + + if(world.time <= last_check+check_delay) + return + + last_check = world.time + + if(get_dist(source, current_target)>max_range || !los_check(source, current_target)) + LoseTarget() + if(isliving(source)) + to_chat(source, "You lose control of the beam!") + return + + if(current_target) + on_beam_tick(current_target) + +/obj/item/gun/medbeam/proc/los_check(atom/movable/user, mob/target) + var/turf/user_turf = user.loc + if(mounted) + user_turf = get_turf(user) + else if(!istype(user_turf)) + return 0 + var/obj/dummy = new(user_turf) + dummy.pass_flags |= PASSTABLE|PASSGLASS|PASSGRILLE //Grille/Glass so it can be used through common windows + for(var/turf/turf in getline(user_turf,target)) + if(mounted && turf == user_turf) + continue //Mechs are dense and thus fail the check + if(turf.density) + qdel(dummy) + return 0 + for(var/atom/movable/AM in turf) + if(!AM.CanPass(dummy,turf,1)) + qdel(dummy) + return 0 + for(var/obj/effect/ebeam/medical/B in turf)// Don't cross the str-beams! + if(B.owner.origin != current_beam.origin) + explosion(B.loc,0,3,5,8) + qdel(dummy) + return 0 + qdel(dummy) + return 1 + +/obj/item/gun/medbeam/proc/on_beam_hit(var/mob/living/target) + return + +/obj/item/gun/medbeam/proc/on_beam_tick(var/mob/living/target) + if(target.health != target.maxHealth) + new /obj/effect/temp_visual/heal(get_turf(target), "#80F5FF") + target.adjustBruteLoss(-4) + target.adjustFireLoss(-4) + return + +/obj/item/gun/medbeam/proc/on_beam_release(var/mob/living/target) + return + +/obj/effect/ebeam/medical + name = "medical beam" + +//////////////////////////////Mech Version/////////////////////////////// +/obj/item/gun/medbeam/mech + mounted = 1 + +/obj/item/gun/medbeam/mech/Initialize() + . = ..() + STOP_PROCESSING(SSobj, src) //Mech mediguns do not process until installed, and are controlled by the holder obj diff --git a/code/modules/projectiles/guns/syringe_gun.dm b/code/modules/projectiles/guns/misc/syringe_gun.dm similarity index 96% rename from code/modules/projectiles/guns/syringe_gun.dm rename to code/modules/projectiles/guns/misc/syringe_gun.dm index ac9f7daedf..cc1b321e3a 100644 --- a/code/modules/projectiles/guns/syringe_gun.dm +++ b/code/modules/projectiles/guns/misc/syringe_gun.dm @@ -1,104 +1,104 @@ -/obj/item/gun/syringe - name = "syringe gun" - desc = "A spring loaded rifle designed to fit syringes, used to incapacitate unruly patients from a distance." - icon_state = "syringegun" - item_state = "syringegun" - w_class = WEIGHT_CLASS_NORMAL - throw_speed = 3 - throw_range = 7 - force = 4 - materials = list(MAT_METAL=2000) - clumsy_check = 0 - fire_sound = 'sound/items/syringeproj.ogg' - var/list/syringes = list() - var/max_syringes = 1 - -/obj/item/gun/syringe/Initialize() - . = ..() - chambered = new /obj/item/ammo_casing/syringegun(src) - -/obj/item/gun/syringe/recharge_newshot() - if(!syringes.len) - return - chambered.newshot() - -/obj/item/gun/syringe/can_shoot() - return syringes.len - -/obj/item/gun/syringe/process_chamber() - if(chambered && !chambered.BB) //we just fired - recharge_newshot() - -/obj/item/gun/syringe/examine(mob/user) - ..() - to_chat(user, "Can hold [max_syringes] syringe\s. Has [syringes.len] syringe\s remaining.") - -/obj/item/gun/syringe/attack_self(mob/living/user) - if(!syringes.len) - to_chat(user, "[src] is empty!") - return 0 - - var/obj/item/reagent_containers/syringe/S = syringes[syringes.len] - - if(!S) - return 0 - S.forceMove(user.loc) - - syringes.Remove(S) - to_chat(user, "You unload [S] from \the [src].") - - return 1 - -/obj/item/gun/syringe/attackby(obj/item/A, mob/user, params, show_msg = TRUE) - if(istype(A, /obj/item/reagent_containers/syringe)) - if(syringes.len < max_syringes) - if(!user.transferItemToLoc(A, src)) - return FALSE - to_chat(user, "You load [A] into \the [src].") - syringes += A - recharge_newshot() - return TRUE - else - to_chat(user, "[src] cannot hold more syringes!") - return FALSE - -/obj/item/gun/syringe/rapidsyringe - name = "rapid syringe gun" - desc = "A modification of the syringe gun design, using a rotating cylinder to store up to six syringes." - icon_state = "rapidsyringegun" - max_syringes = 6 - -/obj/item/gun/syringe/syndicate - name = "dart pistol" - desc = "A small spring-loaded sidearm that functions identically to a syringe gun." - icon_state = "syringe_pistol" - item_state = "gun" //Smaller inhand - w_class = WEIGHT_CLASS_SMALL - force = 2 //Also very weak because it's smaller - suppressed = TRUE //Softer fire sound - can_unsuppress = FALSE //Permanently silenced - -/obj/item/gun/syringe/dna - name = "modified syringe gun" - desc = "A syringe gun that has been modified to fit DNA injectors instead of normal syringes." - -/obj/item/gun/syringe/dna/Initialize() - . = ..() - chambered = new /obj/item/ammo_casing/dnainjector(src) - -/obj/item/gun/syringe/dna/attackby(obj/item/A, mob/user, params, show_msg = TRUE) - if(istype(A, /obj/item/dnainjector)) - var/obj/item/dnainjector/D = A - if(D.used) - to_chat(user, "This injector is used up!") - return - if(syringes.len < max_syringes) - if(!user.transferItemToLoc(D, src)) - return FALSE - to_chat(user, "You load \the [D] into \the [src].") - syringes += D - recharge_newshot() - return TRUE - else - to_chat(user, "[src] cannot hold more syringes!") - return FALSE +/obj/item/gun/syringe + name = "syringe gun" + desc = "A spring loaded rifle designed to fit syringes, used to incapacitate unruly patients from a distance." + icon_state = "syringegun" + item_state = "syringegun" + w_class = WEIGHT_CLASS_NORMAL + throw_speed = 3 + throw_range = 7 + force = 4 + materials = list(MAT_METAL=2000) + clumsy_check = 0 + fire_sound = 'sound/items/syringeproj.ogg' + var/list/syringes = list() + var/max_syringes = 1 + +/obj/item/gun/syringe/Initialize() + . = ..() + chambered = new /obj/item/ammo_casing/syringegun(src) + +/obj/item/gun/syringe/recharge_newshot() + if(!syringes.len) + return + chambered.newshot() + +/obj/item/gun/syringe/can_shoot() + return syringes.len + +/obj/item/gun/syringe/process_chamber() + if(chambered && !chambered.BB) //we just fired + recharge_newshot() + +/obj/item/gun/syringe/examine(mob/user) + ..() + to_chat(user, "Can hold [max_syringes] syringe\s. Has [syringes.len] syringe\s remaining.") + +/obj/item/gun/syringe/attack_self(mob/living/user) + if(!syringes.len) + to_chat(user, "[src] is empty!") + return 0 + + var/obj/item/reagent_containers/syringe/S = syringes[syringes.len] + + if(!S) + return 0 + S.forceMove(user.loc) + + syringes.Remove(S) + to_chat(user, "You unload [S] from \the [src].") + + return 1 + +/obj/item/gun/syringe/attackby(obj/item/A, mob/user, params, show_msg = TRUE) + if(istype(A, /obj/item/reagent_containers/syringe)) + if(syringes.len < max_syringes) + if(!user.transferItemToLoc(A, src)) + return FALSE + to_chat(user, "You load [A] into \the [src].") + syringes += A + recharge_newshot() + return TRUE + else + to_chat(user, "[src] cannot hold more syringes!") + return FALSE + +/obj/item/gun/syringe/rapidsyringe + name = "rapid syringe gun" + desc = "A modification of the syringe gun design, using a rotating cylinder to store up to six syringes." + icon_state = "rapidsyringegun" + max_syringes = 6 + +/obj/item/gun/syringe/syndicate + name = "dart pistol" + desc = "A small spring-loaded sidearm that functions identically to a syringe gun." + icon_state = "syringe_pistol" + item_state = "gun" //Smaller inhand + w_class = WEIGHT_CLASS_SMALL + force = 2 //Also very weak because it's smaller + suppressed = TRUE //Softer fire sound + can_unsuppress = FALSE //Permanently silenced + +/obj/item/gun/syringe/dna + name = "modified syringe gun" + desc = "A syringe gun that has been modified to fit DNA injectors instead of normal syringes." + +/obj/item/gun/syringe/dna/Initialize() + . = ..() + chambered = new /obj/item/ammo_casing/dnainjector(src) + +/obj/item/gun/syringe/dna/attackby(obj/item/A, mob/user, params, show_msg = TRUE) + if(istype(A, /obj/item/dnainjector)) + var/obj/item/dnainjector/D = A + if(D.used) + to_chat(user, "This injector is used up!") + return + if(syringes.len < max_syringes) + if(!user.transferItemToLoc(D, src)) + return FALSE + to_chat(user, "You load \the [D] into \the [src].") + syringes += D + recharge_newshot() + return TRUE + else + to_chat(user, "[src] cannot hold more syringes!") + return FALSE diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 235f27e9e5..725ef9baa6 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -7,422 +7,3 @@ flag = "bullet" hitsound_wall = "ricochet" impact_effect_type = /obj/effect/temp_visual/impact_effect - -/obj/item/projectile/bullet/incendiary - damage = 20 - var/fire_stacks = 4 - -/obj/item/projectile/bullet/incendiary/on_hit(atom/target, blocked = FALSE) - . = ..() - if(iscarbon(target)) - var/mob/living/carbon/M = target - M.adjust_fire_stacks(fire_stacks) - M.IgniteMob() - -/obj/item/projectile/bullet/incendiary/Move() - . = ..() - var/turf/location = get_turf(src) - if(location) - new /obj/effect/hotspot(location) - location.hotspot_expose(700, 50, 1) - -// .357 (Syndie Revolver) - -/obj/item/projectile/bullet/a357 - name = ".357 bullet" - damage = 60 - -// 7.62 (Nagant Rifle) - -/obj/item/projectile/bullet/a762 - name = "7.62 bullet" - damage = 60 - -/obj/item/projectile/bullet/a762_enchanted - name = "enchanted 7.62 bullet" - damage = 5 - stamina = 80 - -// 7.62x38mmR (Nagant Revolver) - -/obj/item/projectile/bullet/n762 - name = "7.62x38mmR bullet" - damage = 60 - -// .50AE (Desert Eagle) - -/obj/item/projectile/bullet/a50AE - name = ".50AE bullet" - damage = 60 - -// .38 (Detective's Gun) - -/obj/item/projectile/bullet/c38 - name = ".38 bullet" - damage = 15 - knockdown = 60 - stamina = 50 - -// 10mm (Stechkin) - -/obj/item/projectile/bullet/c10mm - name = "10mm bullet" - damage = 30 - -/obj/item/projectile/bullet/c10mm_ap - name = "10mm armor-piercing bullet" - damage = 27 - armour_penetration = 40 - -/obj/item/projectile/bullet/c10mm_hp - name = "10mm hollow-point bullet" - damage = 40 - armour_penetration = -50 - -/obj/item/projectile/bullet/incendiary/c10mm - name = "10mm incendiary bullet" - damage = 15 - fire_stacks = 2 - -// 9mm (Stechkin APS) - -/obj/item/projectile/bullet/c9mm - name = "9mm bullet" - damage = 20 - -/obj/item/projectile/bullet/c9mm_ap - name = "9mm armor-piercing bullet" - damage = 15 - armour_penetration = 40 - -/obj/item/projectile/bullet/incendiary/c9mm - name = "9mm incendiary bullet" - damage = 10 - fire_stacks = 1 - -// 4.6x30mm (Autorifles) - -/obj/item/projectile/bullet/c46x30mm - name = "4.6x30mm bullet" - damage = 20 - -/obj/item/projectile/bullet/c46x30mm_ap - name = "4.6x30mm armor-piercing bullet" - damage = 15 - armour_penetration = 40 - -/obj/item/projectile/bullet/incendiary/c46x30mm - name = "4.6x30mm incendiary bullet" - damage = 10 - fire_stacks = 1 - -// .45 (M1911 & C20r) - -/obj/item/projectile/bullet/c45 - name = ".45 bullet" - damage = 20 - stamina = 65 - -/obj/item/projectile/bullet/c45_nostamina - name = ".45 bullet" - damage = 30 - -// 5.56mm (M-90gl Carbine) - -/obj/item/projectile/bullet/a556 - name = "5.56mm bullet" - damage = 35 - -// 40mm (Grenade Launcher - -/obj/item/projectile/bullet/a40mm - name ="40mm grenade" - desc = "USE A WEEL GUN" - icon_state= "bolter" - damage = 60 - -/obj/item/projectile/bullet/a40mm/on_hit(atom/target, blocked = FALSE) - ..() - explosion(target, -1, 0, 2, 1, 0, flame_range = 3) - return TRUE - -// .50 (Sniper) - -/obj/item/projectile/bullet/p50 - name =".50 bullet" - speed = 0.4 - damage = 70 - knockdown = 100 - dismemberment = 50 - armour_penetration = 50 - var/breakthings = TRUE - -/obj/item/projectile/bullet/p50/on_hit(atom/target, blocked = 0) - if((blocked != 100) && (!ismob(target) && breakthings)) - target.ex_act(rand(1,2)) - return ..() - -/obj/item/projectile/bullet/p50/soporific - name =".50 soporific bullet" - armour_penetration = 0 - nodamage = TRUE - dismemberment = 0 - knockdown = 0 - breakthings = FALSE - -/obj/item/projectile/bullet/p50/soporific/on_hit(atom/target, blocked = FALSE) - if((blocked != 100) && isliving(target)) - var/mob/living/L = target - L.Sleeping(400) - return ..() - -/obj/item/projectile/bullet/p50/penetrator - name =".50 penetrator bullet" - icon_state = "gauss" - name = "penetrator round" - damage = 60 - forcedodge = TRUE - dismemberment = 0 //It goes through you cleanly. - knockdown = 0 - breakthings = FALSE - -// 1.95x129mm (SAW) - -/obj/item/projectile/bullet/mm195x129 - name = "1.95x129mm bullet" - damage = 45 - armour_penetration = 5 - -/obj/item/projectile/bullet/mm195x129_ap - name = "1.95x129mm armor-piercing bullet" - damage = 40 - armour_penetration = 75 - -/obj/item/projectile/bullet/mm195x129_hp - name = "1.95x129mm hollow-point bullet" - damage = 60 - armour_penetration = -60 - -/obj/item/projectile/bullet/incendiary/mm195x129 - name = "1.95x129mm incendiary bullet" - damage = 15 - fire_stacks = 3 - -// Shotgun - -/obj/item/projectile/bullet/shotgun_slug - name = "12g shotgun slug" - damage = 60 - -/obj/item/projectile/bullet/shotgun_beanbag - name = "beanbag slug" - damage = 5 - stamina = 80 - -/obj/item/projectile/bullet/incendiary/shotgun - name = "incendiary slug" - damage = 20 - -/obj/item/projectile/bullet/incendiary/shotgun/dragonsbreath - name = "dragonsbreath pellet" - damage = 5 - -/obj/item/projectile/bullet/shotgun_stunslug - name = "stunslug" - damage = 5 - knockdown = 100 - stutter = 5 - jitter = 20 - range = 7 - icon_state = "spark" - color = "#FFFF00" - -/obj/item/projectile/bullet/shotgun_meteorslug - name = "meteorslug" - icon = 'icons/obj/meteor.dmi' - icon_state = "dust" - damage = 20 - knockdown = 80 - hitsound = 'sound/effects/meteorimpact.ogg' - -/obj/item/projectile/bullet/shotgun_meteorslug/on_hit(atom/target, blocked = FALSE) - . = ..() - if(ismovableatom(target)) - var/atom/movable/M = target - var/atom/throw_target = get_edge_target_turf(M, get_dir(src, get_step_away(M, src))) - M.throw_at(throw_target, 3, 2) - -/obj/item/projectile/bullet/shotgun_meteorslug/Initialize() - . = ..() - SpinAnimation() - -/obj/item/projectile/bullet/shotgun_frag12 - name ="frag12 slug" - damage = 25 - knockdown = 50 - -/obj/item/projectile/bullet/shotgun_frag12/on_hit(atom/target, blocked = FALSE) - ..() - explosion(target, -1, 0, 1) - return TRUE - -/obj/item/projectile/bullet/pellet - var/tile_dropoff = 0.75 - var/tile_dropoff_s = 1.25 - -/obj/item/projectile/bullet/pellet/shotgun_buckshot - name = "buckshot pellet" - damage = 12.5 - -/obj/item/projectile/bullet/pellet/shotgun_rubbershot - name = "rubbershot pellet" - damage = 3 - stamina = 25 - -/obj/item/projectile/bullet/pellet/Range() - ..() - if(damage > 0) - damage -= tile_dropoff - if(stamina > 0) - stamina -= tile_dropoff_s - if(damage < 0 && stamina < 0) - qdel(src) - -/obj/item/projectile/bullet/pellet/shotgun_improvised - tile_dropoff = 0.55 //Come on it does 6 damage don't be like that. - damage = 6 - -/obj/item/projectile/bullet/pellet/shotgun_improvised/Initialize() - . = ..() - range = rand(1, 8) - -/obj/item/projectile/bullet/pellet/shotgun_improvised/on_range() - do_sparks(1, TRUE, src) - ..() - -// Scattershot - -/obj/item/projectile/bullet/scattershot - damage = 20 - stamina = 65 - -// LMD (exosuits) - -/obj/item/projectile/bullet/lmg - damage = 20 - -// Turrets - -/obj/item/projectile/bullet/manned_turret - damage = 20 - -/obj/item/projectile/bullet/syndicate_turret - damage = 20 - -// FNX-99 (Mechs) - -/obj/item/projectile/bullet/incendiary/fnx99 - damage = 20 - -// C3D (Borgs) - -/obj/item/projectile/bullet/c3d - damage = 20 - -// Honker - -/obj/item/projectile/bullet/honker - damage = 0 - knockdown = 60 - forcedodge = TRUE - nodamage = TRUE - hitsound = 'sound/items/bikehorn.ogg' - icon = 'icons/obj/hydroponics/harvest.dmi' - icon_state = "banana" - range = 200 - -/obj/item/projectile/bullet/honker/Initialize() - . = ..() - SpinAnimation() - -// Mime - -/obj/item/projectile/bullet/mime - damage = 20 - -/obj/item/projectile/bullet/mime/on_hit(atom/target, blocked = FALSE) - . = ..() - if(iscarbon(target)) - var/mob/living/carbon/M = target - M.silent = max(M.silent, 10) - -// Darts - -/obj/item/projectile/bullet/dart - name = "dart" - icon_state = "cbbolt" - damage = 6 - var/piercing = FALSE - -/obj/item/projectile/bullet/dart/Initialize() - . = ..() - create_reagents(50) - reagents.set_reacting(FALSE) - -/obj/item/projectile/bullet/dart/on_hit(atom/target, blocked = FALSE) - if(iscarbon(target)) - var/mob/living/carbon/M = target - if(blocked != 100) // not completely blocked - if(M.can_inject(null, FALSE, def_zone, piercing)) // Pass the hit zone to see if it can inject by whether it hit the head or the body. - ..() - reagents.reaction(M, INJECT) - reagents.trans_to(M, reagents.total_volume) - return TRUE - else - blocked = 100 - target.visible_message("\The [src] was deflected!", \ - "You were protected against \the [src]!") - - ..(target, blocked) - reagents.set_reacting(TRUE) - reagents.handle_reactions() - return TRUE - -/obj/item/projectile/bullet/dart/metalfoam/Initialize() - . = ..() - reagents.add_reagent("aluminium", 15) - reagents.add_reagent("foaming_agent", 5) - reagents.add_reagent("facid", 5) - -//This one is for future syringe guns update -/obj/item/projectile/bullet/dart/syringe - name = "syringe" - icon_state = "syringeproj" - -// DNA injector - -/obj/item/projectile/bullet/dnainjector - name = "\improper DNA injector" - icon_state = "syringeproj" - var/obj/item/dnainjector/injector - damage = 5 - hitsound_wall = "shatter" - -/obj/item/projectile/bullet/dnainjector/on_hit(atom/target, blocked = FALSE) - if(iscarbon(target)) - var/mob/living/carbon/M = target - if(blocked != 100) - if(M.can_inject(null, FALSE, def_zone, FALSE)) - if(injector.inject(M, firer)) - QDEL_NULL(injector) - return TRUE - else - blocked = 100 - target.visible_message("\The [src] was deflected!", \ - "You were protected against \the [src]!") - return ..() - -/obj/item/projectile/bullet/dnainjector/Destroy() - QDEL_NULL(injector) - return ..() - diff --git a/code/modules/projectiles/projectile/bullets/_incendiary.dm b/code/modules/projectiles/projectile/bullets/_incendiary.dm new file mode 100644 index 0000000000..d0cf74421c --- /dev/null +++ b/code/modules/projectiles/projectile/bullets/_incendiary.dm @@ -0,0 +1,17 @@ +/obj/item/projectile/bullet/incendiary + damage = 20 + var/fire_stacks = 4 + +/obj/item/projectile/bullet/incendiary/on_hit(atom/target, blocked = FALSE) + . = ..() + if(iscarbon(target)) + var/mob/living/carbon/M = target + M.adjust_fire_stacks(fire_stacks) + M.IgniteMob() + +/obj/item/projectile/bullet/incendiary/Move() + . = ..() + var/turf/location = get_turf(src) + if(location) + new /obj/effect/hotspot(location) + location.hotspot_expose(700, 50, 1) diff --git a/code/modules/projectiles/projectile/bullets/dart_syringe.dm b/code/modules/projectiles/projectile/bullets/dart_syringe.dm new file mode 100644 index 0000000000..023c3b9090 --- /dev/null +++ b/code/modules/projectiles/projectile/bullets/dart_syringe.dm @@ -0,0 +1,39 @@ +/obj/item/projectile/bullet/dart + name = "dart" + icon_state = "cbbolt" + damage = 6 + var/piercing = FALSE + +/obj/item/projectile/bullet/dart/Initialize() + . = ..() + create_reagents(50) + reagents.set_reacting(FALSE) + +/obj/item/projectile/bullet/dart/on_hit(atom/target, blocked = FALSE) + if(iscarbon(target)) + var/mob/living/carbon/M = target + if(blocked != 100) // not completely blocked + if(M.can_inject(null, FALSE, def_zone, piercing)) // Pass the hit zone to see if it can inject by whether it hit the head or the body. + ..() + reagents.reaction(M, INJECT) + reagents.trans_to(M, reagents.total_volume) + return TRUE + else + blocked = 100 + target.visible_message("\The [src] was deflected!", \ + "You were protected against \the [src]!") + + ..(target, blocked) + reagents.set_reacting(TRUE) + reagents.handle_reactions() + return TRUE + +/obj/item/projectile/bullet/dart/metalfoam/Initialize() + . = ..() + reagents.add_reagent("aluminium", 15) + reagents.add_reagent("foaming_agent", 5) + reagents.add_reagent("facid", 5) + +/obj/item/projectile/bullet/dart/syringe + name = "syringe" + icon_state = "syringeproj" diff --git a/code/modules/projectiles/projectile/bullets/dnainjector.dm b/code/modules/projectiles/projectile/bullets/dnainjector.dm new file mode 100644 index 0000000000..861ead5393 --- /dev/null +++ b/code/modules/projectiles/projectile/bullets/dnainjector.dm @@ -0,0 +1,24 @@ +/obj/item/projectile/bullet/dnainjector + name = "\improper DNA injector" + icon_state = "syringeproj" + var/obj/item/dnainjector/injector + damage = 5 + hitsound_wall = "shatter" + +/obj/item/projectile/bullet/dnainjector/on_hit(atom/target, blocked = FALSE) + if(iscarbon(target)) + var/mob/living/carbon/M = target + if(blocked != 100) + if(M.can_inject(null, FALSE, def_zone, FALSE)) + if(injector.inject(M, firer)) + QDEL_NULL(injector) + return TRUE + else + blocked = 100 + target.visible_message("\The [src] was deflected!", \ + "You were protected against \the [src]!") + return ..() + +/obj/item/projectile/bullet/dnainjector/Destroy() + QDEL_NULL(injector) + return ..() diff --git a/code/modules/projectiles/projectile/bullets/grenade.dm b/code/modules/projectiles/projectile/bullets/grenade.dm new file mode 100644 index 0000000000..965001b55f --- /dev/null +++ b/code/modules/projectiles/projectile/bullets/grenade.dm @@ -0,0 +1,12 @@ +// 40mm (Grenade Launcher + +/obj/item/projectile/bullet/a40mm + name ="40mm grenade" + desc = "USE A WEEL GUN" + icon_state= "bolter" + damage = 60 + +/obj/item/projectile/bullet/a40mm/on_hit(atom/target, blocked = FALSE) + ..() + explosion(target, -1, 0, 2, 1, 0, flame_range = 3) + return TRUE diff --git a/code/modules/projectiles/projectile/bullets/lmg.dm b/code/modules/projectiles/projectile/bullets/lmg.dm new file mode 100644 index 0000000000..03e64976d9 --- /dev/null +++ b/code/modules/projectiles/projectile/bullets/lmg.dm @@ -0,0 +1,44 @@ +// C3D (Borgs) + +/obj/item/projectile/bullet/c3d + damage = 20 + +// Mech LMG + +/obj/item/projectile/bullet/lmg + damage = 20 + +// Mech FNX-99 + +/obj/item/projectile/bullet/incendiary/fnx99 + damage = 20 + +// Turrets + +/obj/item/projectile/bullet/manned_turret + damage = 20 + +/obj/item/projectile/bullet/syndicate_turret + damage = 20 + +// 1.95x129mm (SAW) + +/obj/item/projectile/bullet/mm195x129 + name = "1.95x129mm bullet" + damage = 45 + armour_penetration = 5 + +/obj/item/projectile/bullet/mm195x129_ap + name = "1.95x129mm armor-piercing bullet" + damage = 40 + armour_penetration = 75 + +/obj/item/projectile/bullet/mm195x129_hp + name = "1.95x129mm hollow-point bullet" + damage = 60 + armour_penetration = -60 + +/obj/item/projectile/bullet/incendiary/mm195x129 + name = "1.95x129mm incendiary bullet" + damage = 15 + fire_stacks = 3 diff --git a/code/modules/projectiles/projectile/bullets/pistol.dm b/code/modules/projectiles/projectile/bullets/pistol.dm new file mode 100644 index 0000000000..ac14fa563c --- /dev/null +++ b/code/modules/projectiles/projectile/bullets/pistol.dm @@ -0,0 +1,36 @@ +// 9mm (Stechkin APS) + +/obj/item/projectile/bullet/c9mm + name = "9mm bullet" + damage = 20 + +/obj/item/projectile/bullet/c9mm_ap + name = "9mm armor-piercing bullet" + damage = 15 + armour_penetration = 40 + +/obj/item/projectile/bullet/incendiary/c9mm + name = "9mm incendiary bullet" + damage = 10 + fire_stacks = 1 + +// 10mm (Stechkin) + +/obj/item/projectile/bullet/c10mm + name = "10mm bullet" + damage = 30 + +/obj/item/projectile/bullet/c10mm_ap + name = "10mm armor-piercing bullet" + damage = 27 + armour_penetration = 40 + +/obj/item/projectile/bullet/c10mm_hp + name = "10mm hollow-point bullet" + damage = 40 + armour_penetration = -50 + +/obj/item/projectile/bullet/incendiary/c10mm + name = "10mm incendiary bullet" + damage = 15 + fire_stacks = 2 diff --git a/code/modules/projectiles/projectile/bullets/revolver.dm b/code/modules/projectiles/projectile/bullets/revolver.dm new file mode 100644 index 0000000000..fc4ed0fa50 --- /dev/null +++ b/code/modules/projectiles/projectile/bullets/revolver.dm @@ -0,0 +1,25 @@ +// 7.62x38mmR (Nagant Revolver) + +/obj/item/projectile/bullet/n762 + name = "7.62x38mmR bullet" + damage = 60 + +// .50AE (Desert Eagle) + +/obj/item/projectile/bullet/a50AE + name = ".50AE bullet" + damage = 60 + +// .38 (Detective's Gun) + +/obj/item/projectile/bullet/c38 + name = ".38 bullet" + damage = 15 + knockdown = 60 + stamina = 50 + +// .357 (Syndie Revolver) + +/obj/item/projectile/bullet/a357 + name = ".357 bullet" + damage = 60 diff --git a/code/modules/projectiles/projectile/bullets/rifle.dm b/code/modules/projectiles/projectile/bullets/rifle.dm new file mode 100644 index 0000000000..a019c05ef1 --- /dev/null +++ b/code/modules/projectiles/projectile/bullets/rifle.dm @@ -0,0 +1,16 @@ +// 5.56mm (M-90gl Carbine) + +/obj/item/projectile/bullet/a556 + name = "5.56mm bullet" + damage = 35 + +// 7.62 (Nagant Rifle) + +/obj/item/projectile/bullet/a762 + name = "7.62 bullet" + damage = 60 + +/obj/item/projectile/bullet/a762_enchanted + name = "enchanted 7.62 bullet" + damage = 5 + stamina = 80 diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm new file mode 100644 index 0000000000..ecbe2e96e4 --- /dev/null +++ b/code/modules/projectiles/projectile/bullets/shotgun.dm @@ -0,0 +1,95 @@ +/obj/item/projectile/bullet/shotgun_slug + name = "12g shotgun slug" + damage = 60 + +/obj/item/projectile/bullet/shotgun_beanbag + name = "beanbag slug" + damage = 5 + stamina = 80 + +/obj/item/projectile/bullet/incendiary/shotgun + name = "incendiary slug" + damage = 20 + +/obj/item/projectile/bullet/incendiary/shotgun/dragonsbreath + name = "dragonsbreath pellet" + damage = 5 + +/obj/item/projectile/bullet/shotgun_stunslug + name = "stunslug" + damage = 5 + knockdown = 100 + stutter = 5 + jitter = 20 + range = 7 + icon_state = "spark" + color = "#FFFF00" + +/obj/item/projectile/bullet/shotgun_meteorslug + name = "meteorslug" + icon = 'icons/obj/meteor.dmi' + icon_state = "dust" + damage = 20 + knockdown = 80 + hitsound = 'sound/effects/meteorimpact.ogg' + +/obj/item/projectile/bullet/shotgun_meteorslug/on_hit(atom/target, blocked = FALSE) + . = ..() + if(ismovableatom(target)) + var/atom/movable/M = target + var/atom/throw_target = get_edge_target_turf(M, get_dir(src, get_step_away(M, src))) + M.throw_at(throw_target, 3, 2) + +/obj/item/projectile/bullet/shotgun_meteorslug/Initialize() + . = ..() + SpinAnimation() + +/obj/item/projectile/bullet/shotgun_frag12 + name ="frag12 slug" + damage = 25 + knockdown = 50 + +/obj/item/projectile/bullet/shotgun_frag12/on_hit(atom/target, blocked = FALSE) + ..() + explosion(target, -1, 0, 1) + return TRUE + +/obj/item/projectile/bullet/pellet + var/tile_dropoff = 0.75 + var/tile_dropoff_s = 1.25 + +/obj/item/projectile/bullet/pellet/shotgun_buckshot + name = "buckshot pellet" + damage = 12.5 + +/obj/item/projectile/bullet/pellet/shotgun_rubbershot + name = "rubbershot pellet" + damage = 3 + stamina = 25 + +/obj/item/projectile/bullet/pellet/Range() + ..() + if(damage > 0) + damage -= tile_dropoff + if(stamina > 0) + stamina -= tile_dropoff_s + if(damage < 0 && stamina < 0) + qdel(src) + +/obj/item/projectile/bullet/pellet/shotgun_improvised + tile_dropoff = 0.55 //Come on it does 6 damage don't be like that. + damage = 6 + +/obj/item/projectile/bullet/pellet/shotgun_improvised/Initialize() + . = ..() + range = rand(1, 8) + +/obj/item/projectile/bullet/pellet/shotgun_improvised/on_range() + do_sparks(1, TRUE, src) + ..() + +// Mech Scattershot + +/obj/item/projectile/bullet/scattershot + damage = 20 + stamina = 65 diff --git a/code/modules/projectiles/projectile/bullets/smg.dm b/code/modules/projectiles/projectile/bullets/smg.dm new file mode 100644 index 0000000000..50532a5977 --- /dev/null +++ b/code/modules/projectiles/projectile/bullets/smg.dm @@ -0,0 +1,26 @@ +// .45 (M1911 & C20r) + +/obj/item/projectile/bullet/c45 + name = ".45 bullet" + damage = 20 + stamina = 65 + +/obj/item/projectile/bullet/c45_nostamina + name = ".45 bullet" + damage = 30 + +// 4.6x30mm (Autorifles) + +/obj/item/projectile/bullet/c46x30mm + name = "4.6x30mm bullet" + damage = 20 + +/obj/item/projectile/bullet/c46x30mm_ap + name = "4.6x30mm armor-piercing bullet" + damage = 15 + armour_penetration = 40 + +/obj/item/projectile/bullet/incendiary/c46x30mm + name = "4.6x30mm incendiary bullet" + damage = 10 + fire_stacks = 1 diff --git a/code/modules/projectiles/projectile/bullets/sniper.dm b/code/modules/projectiles/projectile/bullets/sniper.dm new file mode 100644 index 0000000000..d29cb70440 --- /dev/null +++ b/code/modules/projectiles/projectile/bullets/sniper.dm @@ -0,0 +1,39 @@ +// .50 (Sniper) + +/obj/item/projectile/bullet/p50 + name =".50 bullet" + speed = 0.4 + damage = 70 + knockdown = 100 + dismemberment = 50 + armour_penetration = 50 + var/breakthings = TRUE + +/obj/item/projectile/bullet/p50/on_hit(atom/target, blocked = 0) + if((blocked != 100) && (!ismob(target) && breakthings)) + target.ex_act(rand(1,2)) + return ..() + +/obj/item/projectile/bullet/p50/soporific + name =".50 soporific bullet" + armour_penetration = 0 + nodamage = TRUE + dismemberment = 0 + knockdown = 0 + breakthings = FALSE + +/obj/item/projectile/bullet/p50/soporific/on_hit(atom/target, blocked = FALSE) + if((blocked != 100) && isliving(target)) + var/mob/living/L = target + L.Sleeping(400) + return ..() + +/obj/item/projectile/bullet/p50/penetrator + name =".50 penetrator bullet" + icon_state = "gauss" + name = "penetrator round" + damage = 60 + forcedodge = TRUE + dismemberment = 0 //It goes through you cleanly. + knockdown = 0 + breakthings = FALSE diff --git a/code/modules/projectiles/projectile/bullets/special.dm b/code/modules/projectiles/projectile/bullets/special.dm new file mode 100644 index 0000000000..091dff454c --- /dev/null +++ b/code/modules/projectiles/projectile/bullets/special.dm @@ -0,0 +1,26 @@ +// Honker + +/obj/item/projectile/bullet/honker + damage = 0 + knockdown = 60 + forcedodge = TRUE + nodamage = TRUE + hitsound = 'sound/items/bikehorn.ogg' + icon = 'icons/obj/hydroponics/harvest.dmi' + icon_state = "banana" + range = 200 + +/obj/item/projectile/bullet/honker/Initialize() + . = ..() + SpinAnimation() + +// Mime + +/obj/item/projectile/bullet/mime + damage = 20 + +/obj/item/projectile/bullet/mime/on_hit(atom/target, blocked = FALSE) + . = ..() + if(iscarbon(target)) + var/mob/living/carbon/M = target + M.silent = max(M.silent, 10) diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm deleted file mode 100644 index 2d7f8f5cce..0000000000 --- a/code/modules/projectiles/projectile/energy.dm +++ /dev/null @@ -1,203 +0,0 @@ -/obj/item/projectile/energy - name = "energy" - icon_state = "spark" - damage = 0 - damage_type = BURN - flag = "energy" - is_reflectable = TRUE - -/obj/item/projectile/energy/chameleon - nodamage = TRUE - -/obj/item/projectile/energy/electrode - name = "electrode" - icon_state = "spark" - color = "#FFFF00" - nodamage = 1 - knockdown = 100 - stutter = 5 - jitter = 20 - hitsound = 'sound/weapons/taserhit.ogg' - range = 7 - tracer_type = /obj/effect/projectile/tracer/stun - muzzle_type = /obj/effect/projectile/muzzle/stun - impact_type = /obj/effect/projectile/impact/stun - -/obj/item/projectile/energy/electrode/on_hit(atom/target, blocked = FALSE) - . = ..() - if(!ismob(target) || blocked >= 100) //Fully blocked by mob or collided with dense object - burst into sparks! - do_sparks(1, TRUE, src) - else if(iscarbon(target)) - var/mob/living/carbon/C = target - if(C.dna && C.dna.check_mutation(HULK)) - C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) - else if((C.status_flags & CANKNOCKDOWN) && !C.has_trait(TRAIT_STUNIMMUNE)) - addtimer(CALLBACK(C, /mob/living/carbon.proc/do_jitter_animation, jitter), 5) - -/obj/item/projectile/energy/electrode/on_range() //to ensure the bolt sparks when it reaches the end of its range if it didn't hit a target yet - do_sparks(1, TRUE, src) - ..() - -/obj/item/projectile/energy/net - name = "energy netting" - icon_state = "e_netting" - damage = 10 - damage_type = STAMINA - hitsound = 'sound/weapons/taserhit.ogg' - range = 10 - -/obj/item/projectile/energy/net/Initialize() - . = ..() - SpinAnimation() - -/obj/item/projectile/energy/net/on_hit(atom/target, blocked = FALSE) - if(isliving(target)) - var/turf/Tloc = get_turf(target) - if(!locate(/obj/effect/nettingportal) in Tloc) - new /obj/effect/nettingportal(Tloc) - ..() - -/obj/item/projectile/energy/net/on_range() - do_sparks(1, TRUE, src) - ..() - -/obj/effect/nettingportal - name = "DRAGnet teleportation field" - desc = "A field of bluespace energy, locking on to teleport a target." - icon = 'icons/effects/effects.dmi' - icon_state = "dragnetfield" - light_range = 3 - anchored = TRUE - -/obj/effect/nettingportal/Initialize() - . = ..() - var/obj/item/device/radio/beacon/teletarget = null - for(var/obj/machinery/computer/teleporter/com in GLOB.machines) - if(com.target) - if(com.power_station && com.power_station.teleporter_hub && com.power_station.engaged) - teletarget = com.target - - addtimer(CALLBACK(src, .proc/pop, teletarget), 30) - -/obj/effect/nettingportal/proc/pop(teletarget) - if(teletarget) - for(var/mob/living/L in get_turf(src)) - do_teleport(L, teletarget, 2)//teleport what's in the tile to the beacon - else - for(var/mob/living/L in get_turf(src)) - do_teleport(L, L, 15) //Otherwise it just warps you off somewhere. - - qdel(src) - -/obj/effect/nettingportal/singularity_act() - return - -/obj/effect/nettingportal/singularity_pull() - return - - -/obj/item/projectile/energy/trap - name = "energy snare" - icon_state = "e_snare" - nodamage = 1 - knockdown = 20 - hitsound = 'sound/weapons/taserhit.ogg' - range = 4 - -/obj/item/projectile/energy/trap/on_hit(atom/target, blocked = FALSE) - if(!ismob(target) || blocked >= 100) //Fully blocked by mob or collided with dense object - drop a trap - new/obj/item/restraints/legcuffs/beartrap/energy(get_turf(loc)) - else if(iscarbon(target)) - var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy(get_turf(target)) - B.Crossed(target) - ..() - -/obj/item/projectile/energy/trap/on_range() - new /obj/item/restraints/legcuffs/beartrap/energy(loc) - ..() - -/obj/item/projectile/energy/trap/cyborg - name = "Energy Bola" - icon_state = "e_snare" - nodamage = 1 - knockdown = 0 - hitsound = 'sound/weapons/taserhit.ogg' - range = 10 - -/obj/item/projectile/energy/trap/cyborg/on_hit(atom/target, blocked = FALSE) - if(!ismob(target) || blocked >= 100) - do_sparks(1, TRUE, src) - qdel(src) - if(iscarbon(target)) - var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy/cyborg(get_turf(target)) - B.Crossed(target) - QDEL_IN(src, 10) - ..() - -/obj/item/projectile/energy/trap/cyborg/on_range() - do_sparks(1, TRUE, src) - qdel(src) - -/obj/item/projectile/energy/declone - name = "radiation beam" - icon_state = "declone" - damage = 20 - damage_type = CLONE - irradiate = 10 - impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser - -/obj/item/projectile/energy/dart //ninja throwing dart - name = "dart" - icon_state = "toxin" - damage = 5 - damage_type = TOX - knockdown = 100 - range = 7 - -/obj/item/projectile/energy/bolt //ebow bolts - name = "bolt" - icon_state = "cbbolt" - damage = 8 - damage_type = TOX - nodamage = 0 - knockdown = 100 - stutter = 5 - -/obj/item/projectile/energy/bolt/halloween - name = "candy corn" - icon_state = "candy_corn" - -/obj/item/projectile/energy/bolt/large - damage = 20 - -/obj/item/projectile/energy/tesla - name = "tesla bolt" - icon_state = "tesla_projectile" - impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser - var/chain - -/obj/item/projectile/energy/tesla/fire(setAngle) - if(firer) - chain = firer.Beam(src, icon_state = "lightning[rand(1, 12)]", time = INFINITY, maxdistance = INFINITY) - ..() - -/obj/item/projectile/energy/tesla/Destroy() - qdel(chain) - return ..() - -/obj/item/projectile/energy/tesla/revolver - name = "energy orb" - -/obj/item/projectile/energy/tesla/revolver/on_hit(atom/target) - . = ..() - if(isliving(target)) - tesla_zap(target, 3, 10000) - qdel(src) - -/obj/item/projectile/energy/tesla/cannon - name = "tesla orb" - -/obj/item/projectile/energy/tesla/cannon/on_hit(atom/target) - . = ..() - tesla_zap(target, 3, 10000, explosive = FALSE, stun_mobs = FALSE) - qdel(src) diff --git a/code/modules/projectiles/projectile/energy/_energy.dm b/code/modules/projectiles/projectile/energy/_energy.dm new file mode 100644 index 0000000000..3df1eb74d3 --- /dev/null +++ b/code/modules/projectiles/projectile/energy/_energy.dm @@ -0,0 +1,8 @@ +/obj/item/projectile/energy + name = "energy" + icon_state = "spark" + damage = 0 + damage_type = BURN + flag = "energy" + is_reflectable = TRUE + diff --git a/code/modules/projectiles/projectile/energy/chameleon.dm b/code/modules/projectiles/projectile/energy/chameleon.dm new file mode 100644 index 0000000000..8ed6283c51 --- /dev/null +++ b/code/modules/projectiles/projectile/energy/chameleon.dm @@ -0,0 +1,3 @@ +/obj/item/projectile/energy/chameleon + nodamage = TRUE + diff --git a/code/modules/projectiles/projectile/energy/ebow.dm b/code/modules/projectiles/projectile/energy/ebow.dm new file mode 100644 index 0000000000..3e65bbfad2 --- /dev/null +++ b/code/modules/projectiles/projectile/energy/ebow.dm @@ -0,0 +1,15 @@ +/obj/item/projectile/energy/bolt //ebow bolts + name = "bolt" + icon_state = "cbbolt" + damage = 8 + damage_type = TOX + nodamage = 0 + knockdown = 100 + stutter = 5 + +/obj/item/projectile/energy/bolt/halloween + name = "candy corn" + icon_state = "candy_corn" + +/obj/item/projectile/energy/bolt/large + damage = 20 diff --git a/code/modules/projectiles/projectile/energy/misc.dm b/code/modules/projectiles/projectile/energy/misc.dm new file mode 100644 index 0000000000..21c3138add --- /dev/null +++ b/code/modules/projectiles/projectile/energy/misc.dm @@ -0,0 +1,15 @@ +/obj/item/projectile/energy/declone + name = "radiation beam" + icon_state = "declone" + damage = 20 + damage_type = CLONE + irradiate = 10 + impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser + +/obj/item/projectile/energy/dart //ninja throwing dart + name = "dart" + icon_state = "toxin" + damage = 5 + damage_type = TOX + knockdown = 100 + range = 7 diff --git a/code/modules/projectiles/projectile/energy/net_snare.dm b/code/modules/projectiles/projectile/energy/net_snare.dm new file mode 100644 index 0000000000..01e87d26cd --- /dev/null +++ b/code/modules/projectiles/projectile/energy/net_snare.dm @@ -0,0 +1,98 @@ +/obj/item/projectile/energy/net + name = "energy netting" + icon_state = "e_netting" + damage = 10 + damage_type = STAMINA + hitsound = 'sound/weapons/taserhit.ogg' + range = 10 + +/obj/item/projectile/energy/net/Initialize() + . = ..() + SpinAnimation() + +/obj/item/projectile/energy/net/on_hit(atom/target, blocked = FALSE) + if(isliving(target)) + var/turf/Tloc = get_turf(target) + if(!locate(/obj/effect/nettingportal) in Tloc) + new /obj/effect/nettingportal(Tloc) + ..() + +/obj/item/projectile/energy/net/on_range() + do_sparks(1, TRUE, src) + ..() + +/obj/effect/nettingportal + name = "DRAGnet teleportation field" + desc = "A field of bluespace energy, locking on to teleport a target." + icon = 'icons/effects/effects.dmi' + icon_state = "dragnetfield" + light_range = 3 + anchored = TRUE + +/obj/effect/nettingportal/Initialize() + . = ..() + var/obj/item/device/radio/beacon/teletarget = null + for(var/obj/machinery/computer/teleporter/com in GLOB.machines) + if(com.target) + if(com.power_station && com.power_station.teleporter_hub && com.power_station.engaged) + teletarget = com.target + + addtimer(CALLBACK(src, .proc/pop, teletarget), 30) + +/obj/effect/nettingportal/proc/pop(teletarget) + if(teletarget) + for(var/mob/living/L in get_turf(src)) + do_teleport(L, teletarget, 2)//teleport what's in the tile to the beacon + else + for(var/mob/living/L in get_turf(src)) + do_teleport(L, L, 15) //Otherwise it just warps you off somewhere. + + qdel(src) + +/obj/effect/nettingportal/singularity_act() + return + +/obj/effect/nettingportal/singularity_pull() + return + +/obj/item/projectile/energy/trap + name = "energy snare" + icon_state = "e_snare" + nodamage = 1 + knockdown = 20 + hitsound = 'sound/weapons/taserhit.ogg' + range = 4 + +/obj/item/projectile/energy/trap/on_hit(atom/target, blocked = FALSE) + if(!ismob(target) || blocked >= 100) //Fully blocked by mob or collided with dense object - drop a trap + new/obj/item/restraints/legcuffs/beartrap/energy(get_turf(loc)) + else if(iscarbon(target)) + var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy(get_turf(target)) + B.Crossed(target) + ..() + +/obj/item/projectile/energy/trap/on_range() + new /obj/item/restraints/legcuffs/beartrap/energy(loc) + ..() + +/obj/item/projectile/energy/trap/cyborg + name = "Energy Bola" + icon_state = "e_snare" + nodamage = 1 + knockdown = 0 + hitsound = 'sound/weapons/taserhit.ogg' + range = 10 + +/obj/item/projectile/energy/trap/cyborg/on_hit(atom/target, blocked = FALSE) + if(!ismob(target) || blocked >= 100) + do_sparks(1, TRUE, src) + qdel(src) + if(iscarbon(target)) + var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy/cyborg(get_turf(target)) + B.Crossed(target) + QDEL_IN(src, 10) + ..() + +/obj/item/projectile/energy/trap/cyborg/on_range() + do_sparks(1, TRUE, src) + qdel(src) diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm new file mode 100644 index 0000000000..598b64d025 --- /dev/null +++ b/code/modules/projectiles/projectile/energy/stun.dm @@ -0,0 +1,28 @@ +/obj/item/projectile/energy/electrode + name = "electrode" + icon_state = "spark" + color = "#FFFF00" + nodamage = 1 + knockdown = 100 + stutter = 5 + jitter = 20 + hitsound = 'sound/weapons/taserhit.ogg' + range = 7 + tracer_type = /obj/effect/projectile/tracer/stun + muzzle_type = /obj/effect/projectile/muzzle/stun + impact_type = /obj/effect/projectile/impact/stun + +/obj/item/projectile/energy/electrode/on_hit(atom/target, blocked = FALSE) + . = ..() + if(!ismob(target) || blocked >= 100) //Fully blocked by mob or collided with dense object - burst into sparks! + do_sparks(1, TRUE, src) + else if(iscarbon(target)) + var/mob/living/carbon/C = target + if(C.dna && C.dna.check_mutation(HULK)) + C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) + else if((C.status_flags & CANKNOCKDOWN) && !C.has_trait(TRAIT_STUNIMMUNE)) + addtimer(CALLBACK(C, /mob/living/carbon.proc/do_jitter_animation, jitter), 5) + +/obj/item/projectile/energy/electrode/on_range() //to ensure the bolt sparks when it reaches the end of its range if it didn't hit a target yet + do_sparks(1, TRUE, src) + ..() diff --git a/code/modules/projectiles/projectile/energy/tesla.dm b/code/modules/projectiles/projectile/energy/tesla.dm new file mode 100644 index 0000000000..6eebd6afbf --- /dev/null +++ b/code/modules/projectiles/projectile/energy/tesla.dm @@ -0,0 +1,31 @@ +/obj/item/projectile/energy/tesla + name = "tesla bolt" + icon_state = "tesla_projectile" + impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser + var/chain + +/obj/item/projectile/energy/tesla/fire(setAngle) + if(firer) + chain = firer.Beam(src, icon_state = "lightning[rand(1, 12)]", time = INFINITY, maxdistance = INFINITY) + ..() + +/obj/item/projectile/energy/tesla/Destroy() + qdel(chain) + return ..() + +/obj/item/projectile/energy/tesla/revolver + name = "energy orb" + +/obj/item/projectile/energy/tesla/revolver/on_hit(atom/target) + . = ..() + if(isliving(target)) + tesla_zap(target, 3, 10000) + qdel(src) + +/obj/item/projectile/energy/tesla/cannon + name = "tesla orb" + +/obj/item/projectile/energy/tesla/cannon/on_hit(atom/target) + . = ..() + tesla_zap(target, 3, 10000, explosive = FALSE, stun_mobs = FALSE) + qdel(src) diff --git a/code/modules/projectiles/projectile/reusable/_reusable.dm b/code/modules/projectiles/projectile/reusable/_reusable.dm new file mode 100644 index 0000000000..33c9678fe4 --- /dev/null +++ b/code/modules/projectiles/projectile/reusable/_reusable.dm @@ -0,0 +1,20 @@ +/obj/item/projectile/bullet/reusable + name = "reusable bullet" + desc = "How do you even reuse a bullet?" + var/ammo_type = /obj/item/ammo_casing/caseless + var/dropped = FALSE + impact_effect_type = null + +/obj/item/projectile/bullet/reusable/on_hit(atom/target, blocked = FALSE) + . = ..() + handle_drop() + +/obj/item/projectile/bullet/reusable/on_range() + handle_drop() + ..() + +/obj/item/projectile/bullet/reusable/proc/handle_drop() + if(!dropped) + var/turf/T = get_turf(src) + new ammo_type(T) + dropped = TRUE diff --git a/code/modules/projectiles/projectile/reusable.dm b/code/modules/projectiles/projectile/reusable/foam_dart.dm similarity index 59% rename from code/modules/projectiles/projectile/reusable.dm rename to code/modules/projectiles/projectile/reusable/foam_dart.dm index ccd4b7589c..c7f99c75aa 100644 --- a/code/modules/projectiles/projectile/reusable.dm +++ b/code/modules/projectiles/projectile/reusable/foam_dart.dm @@ -1,69 +1,41 @@ -/obj/item/projectile/bullet/reusable - name = "reusable bullet" - desc = "How do you even reuse a bullet?" - var/ammo_type = /obj/item/ammo_casing/caseless - var/dropped = 0 - impact_effect_type = null - -/obj/item/projectile/bullet/reusable/on_hit(atom/target, blocked = FALSE) - . = ..() - handle_drop() - -/obj/item/projectile/bullet/reusable/on_range() - handle_drop() - ..() - -/obj/item/projectile/bullet/reusable/proc/handle_drop() - if(!dropped) - var/turf/T = get_turf(src) - new ammo_type(T) - dropped = 1 - -/obj/item/projectile/bullet/reusable/magspear - name = "magnetic spear" - desc = "WHITE WHALE, HOLY GRAIL" - damage = 30 //takes 3 spears to kill a mega carp, one to kill a normal carp - icon_state = "magspear" - ammo_type = /obj/item/ammo_casing/caseless/magspear - -/obj/item/projectile/bullet/reusable/foam_dart - name = "foam dart" - desc = "I hope you're wearing eye protection." - damage = 0 // It's a damn toy. - damage_type = OXY - nodamage = 1 - icon = 'icons/obj/guns/toy.dmi' - icon_state = "foamdart_proj" - ammo_type = /obj/item/ammo_casing/caseless/foam_dart - range = 10 - var/modified = 0 - var/obj/item/pen/pen = null - -/obj/item/projectile/bullet/reusable/foam_dart/handle_drop() - if(dropped) - return - var/turf/T = get_turf(src) - dropped = 1 - var/obj/item/ammo_casing/caseless/foam_dart/newcasing = new ammo_type(T) - newcasing.modified = modified - var/obj/item/projectile/bullet/reusable/foam_dart/newdart = newcasing.BB - newdart.modified = modified - newdart.damage = damage - newdart.nodamage = nodamage - newdart.damage_type = damage_type - if(pen) - newdart.pen = pen - pen.forceMove(newdart) - pen = null - newdart.update_icon() - - -/obj/item/projectile/bullet/reusable/foam_dart/Destroy() - pen = null - return ..() - -/obj/item/projectile/bullet/reusable/foam_dart/riot - name = "riot foam dart" - icon_state = "foamdart_riot_proj" - ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot - stamina = 25 +/obj/item/projectile/bullet/reusable/foam_dart + name = "foam dart" + desc = "I hope you're wearing eye protection." + damage = 0 // It's a damn toy. + damage_type = OXY + nodamage = 1 + icon = 'icons/obj/guns/toy.dmi' + icon_state = "foamdart_proj" + ammo_type = /obj/item/ammo_casing/caseless/foam_dart + range = 10 + var/modified = 0 + var/obj/item/pen/pen = null + +/obj/item/projectile/bullet/reusable/foam_dart/handle_drop() + if(dropped) + return + var/turf/T = get_turf(src) + dropped = 1 + var/obj/item/ammo_casing/caseless/foam_dart/newcasing = new ammo_type(T) + newcasing.modified = modified + var/obj/item/projectile/bullet/reusable/foam_dart/newdart = newcasing.BB + newdart.modified = modified + newdart.damage = damage + newdart.nodamage = nodamage + newdart.damage_type = damage_type + if(pen) + newdart.pen = pen + pen.forceMove(newdart) + pen = null + newdart.update_icon() + + +/obj/item/projectile/bullet/reusable/foam_dart/Destroy() + pen = null + return ..() + +/obj/item/projectile/bullet/reusable/foam_dart/riot + name = "riot foam dart" + icon_state = "foamdart_riot_proj" + ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot + stamina = 25 diff --git a/code/modules/projectiles/projectile/reusable/magspear.dm b/code/modules/projectiles/projectile/reusable/magspear.dm new file mode 100644 index 0000000000..7fcd6b80a6 --- /dev/null +++ b/code/modules/projectiles/projectile/reusable/magspear.dm @@ -0,0 +1,6 @@ +/obj/item/projectile/bullet/reusable/magspear + name = "magnetic spear" + desc = "WHITE WHALE, HOLY GRAIL" + damage = 30 //takes 3 spears to kill a mega carp, one to kill a normal carp + icon_state = "magspear" + ammo_type = /obj/item/ammo_casing/caseless/magspear diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm deleted file mode 100644 index e8f309309a..0000000000 --- a/code/modules/projectiles/projectile/special.dm +++ /dev/null @@ -1,617 +0,0 @@ -/obj/item/projectile/ion - name = "ion bolt" - icon_state = "ion" - damage = 0 - damage_type = BURN - nodamage = 1 - flag = "energy" - impact_effect_type = /obj/effect/temp_visual/impact_effect/ion - - -/obj/item/projectile/ion/on_hit(atom/target, blocked = FALSE) - ..() - empulse(target, 1, 1) - return 1 - - -/obj/item/projectile/ion/weak - -/obj/item/projectile/ion/weak/on_hit(atom/target, blocked = FALSE) - ..() - empulse(target, 0, 0) - return 1 - - -/obj/item/projectile/bullet/gyro - name ="explosive bolt" - icon_state= "bolter" - damage = 50 - -/obj/item/projectile/bullet/gyro/on_hit(atom/target, blocked = FALSE) - ..() - explosion(target, -1, 0, 2) - return 1 - -/obj/item/projectile/bullet/a84mm - name ="anti-armour rocket" - desc = "USE A WEEL GUN" - icon_state= "atrocket" - damage = 80 - var/anti_armour_damage = 200 - armour_penetration = 100 - dismemberment = 100 - -/obj/item/projectile/bullet/a84mm/on_hit(atom/target, blocked = FALSE) - ..() - explosion(target, -1, 1, 3, 1, 0, flame_range = 4) - - if(ismecha(target)) - var/obj/mecha/M = target - M.take_damage(anti_armour_damage) - if(issilicon(target)) - var/mob/living/silicon/S = target - S.take_overall_damage(anti_armour_damage*0.75, anti_armour_damage*0.25) - return 1 - -/obj/item/projectile/bullet/srmrocket - name ="SRM-8 Rocket" - desc = "Boom." - icon_state = "missile" - damage = 30 - ricochets_max = 0 //it's a MISSILE - -/obj/item/projectile/bullet/srmrocket/on_hit(atom/target, blocked=0) - ..() - if(!isliving(target)) //if the target isn't alive, so is a wall or something - explosion(target, 0, 1, 2, 4) - else - explosion(target, 0, 0, 2, 4) - return 1 - -/obj/item/projectile/temp - name = "freeze beam" - icon_state = "ice_2" - damage = 0 - damage_type = BURN - nodamage = 1 - flag = "energy" - var/temperature = 100 - - -/obj/item/projectile/temp/on_hit(atom/target, blocked = FALSE)//These two could likely check temp protection on the mob - ..() - if(isliving(target)) - var/mob/M = target - M.bodytemperature = temperature - return 1 - -/obj/item/projectile/temp/hot - name = "heat beam" - temperature = 400 - -/obj/item/projectile/meteor - name = "meteor" - icon = 'icons/obj/meteor.dmi' - icon_state = "small1" - damage = 0 - damage_type = BRUTE - nodamage = 1 - flag = "bullet" - -/obj/item/projectile/meteor/Collide(atom/A) - if(A == firer) - forceMove(A.loc) - return - A.ex_act(EXPLODE_HEAVY) - playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1) - for(var/mob/M in urange(10, src)) - if(!M.stat) - shake_camera(M, 3, 1) - qdel(src) - -/obj/item/projectile/energy/floramut - name = "alpha somatoray" - icon_state = "energy" - damage = 0 - damage_type = TOX - nodamage = 1 - flag = "energy" - -/obj/item/projectile/energy/floramut/on_hit(atom/target, blocked = FALSE) - . = ..() - if(iscarbon(target)) - var/mob/living/carbon/C = target - if(C.dna.species.id == "pod") - C.randmuti() - C.randmut() - C.updateappearance() - C.domutcheck() - -/obj/item/projectile/energy/florayield - name = "beta somatoray" - icon_state = "energy2" - damage = 0 - damage_type = TOX - nodamage = 1 - flag = "energy" - -/obj/item/projectile/beam/mindflayer - name = "flayer ray" - -/obj/item/projectile/beam/mindflayer/on_hit(atom/target, blocked = FALSE) - . = ..() - if(ishuman(target)) - var/mob/living/carbon/human/M = target - M.adjustBrainLoss(20) - M.hallucination += 20 - -/obj/item/projectile/beam/wormhole - name = "bluespace beam" - icon_state = "spark" - hitsound = "sparks" - damage = 3 - var/obj/item/gun/energy/wormhole_projector/gun - color = "#33CCFF" - -/obj/item/projectile/beam/wormhole/orange - name = "orange bluespace beam" - color = "#FF6600" - -/obj/item/projectile/beam/wormhole/New(var/obj/item/ammo_casing/energy/wormhole/casing) - if(casing) - gun = casing.gun - -/obj/item/ammo_casing/energy/wormhole/New(var/obj/item/gun/energy/wormhole_projector/wh) - gun = wh - -/obj/item/projectile/beam/wormhole/on_hit(atom/target) - if(ismob(target)) - var/turf/portal_destination = pick(orange(6, src)) - do_teleport(target, portal_destination) - return ..() - if(!gun) - qdel(src) - gun.create_portal(src, get_turf(src)) - -/obj/item/projectile/plasma - name = "plasma blast" - icon_state = "plasmacutter" - damage_type = BRUTE - damage = 20 - range = 4 - dismemberment = 20 - impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser - var/pressure_decrease_active = FALSE - var/pressure_decrease = 0.25 - var/mine_range = 3 //mines this many additional tiles of rock - tracer_type = /obj/effect/projectile/tracer/plasma_cutter - muzzle_type = /obj/effect/projectile/muzzle/plasma_cutter - impact_type = /obj/effect/projectile/impact/plasma_cutter - -/obj/item/projectile/plasma/Initialize() - . = ..() - if(!lavaland_equipment_pressure_check(get_turf(src))) - name = "weakened [name]" - damage = damage * pressure_decrease - pressure_decrease_active = TRUE - -/obj/item/projectile/plasma/on_hit(atom/target) - . = ..() - if(ismineralturf(target)) - var/turf/closed/mineral/M = target - M.gets_drilled(firer) - if(mine_range) - mine_range-- - range++ - if(range > 0) - return -1 - -/obj/item/projectile/plasma/adv - damage = 28 - range = 5 - mine_range = 5 - -/obj/item/projectile/plasma/adv/mech - damage = 40 - range = 9 - mine_range = 3 - -/obj/item/projectile/plasma/turret - //Between normal and advanced for damage, made a beam so not the turret does not destroy glass - name = "plasma beam" - damage = 24 - range = 7 - pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE - - -/obj/item/projectile/gravityrepulse - name = "repulsion bolt" - icon = 'icons/effects/effects.dmi' - icon_state = "chronofield" - hitsound = 'sound/weapons/wave.ogg' - damage = 0 - damage_type = BRUTE - nodamage = 1 - color = "#33CCFF" - var/turf/T - var/power = 4 - var/list/thrown_items = list() - -/obj/item/projectile/gravityrepulse/Initialize() - . = ..() - var/obj/item/ammo_casing/energy/gravityrepulse/C = loc - if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items - power = min(C.gun.power, 15) - -/obj/item/projectile/gravityrepulse/on_hit() - . = ..() - T = get_turf(src) - for(var/atom/movable/A in range(T, power)) - if(A == src || (firer && A == src.firer) || A.anchored || thrown_items[A]) - continue - var/throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(A, src))) - A.throw_at(throwtarget,power+1,1) - thrown_items[A] = A - for(var/turf/F in range(T,power)) - new /obj/effect/temp_visual/gravpush(F) - -/obj/item/projectile/gravityattract - name = "attraction bolt" - icon = 'icons/effects/effects.dmi' - icon_state = "chronofield" - hitsound = 'sound/weapons/wave.ogg' - damage = 0 - damage_type = BRUTE - nodamage = 1 - color = "#FF6600" - var/turf/T - var/power = 4 - var/list/thrown_items = list() - -/obj/item/projectile/gravityattract/Initialize() - . = ..() - var/obj/item/ammo_casing/energy/gravityattract/C = loc - if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items - power = min(C.gun.power, 15) - -/obj/item/projectile/gravityattract/on_hit() - . = ..() - T = get_turf(src) - for(var/atom/movable/A in range(T, power)) - if(A == src || (firer && A == src.firer) || A.anchored || thrown_items[A]) - continue - A.throw_at(T, power+1, 1) - thrown_items[A] = A - for(var/turf/F in range(T,power)) - new /obj/effect/temp_visual/gravpush(F) - -/obj/item/projectile/gravitychaos - name = "gravitational blast" - icon = 'icons/effects/effects.dmi' - icon_state = "chronofield" - hitsound = 'sound/weapons/wave.ogg' - damage = 0 - damage_type = BRUTE - nodamage = 1 - color = "#101010" - var/turf/T - var/power = 4 - var/list/thrown_items = list() - -/obj/item/projectile/gravitychaos/Initialize() - . = ..() - var/obj/item/ammo_casing/energy/gravitychaos/C = loc - if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items - power = min(C.gun.power, 15) - -/obj/item/projectile/gravitychaos/on_hit() - . = ..() - T = get_turf(src) - for(var/atom/movable/A in range(T, power)) - if(A == src|| (firer && A == src.firer) || A.anchored || thrown_items[A]) - continue - A.throw_at(get_edge_target_turf(A, pick(GLOB.cardinals)), power+1, 1) - thrown_items[A] = A - for(var/turf/Z in range(T,power)) - new /obj/effect/temp_visual/gravpush(Z) - -/obj/effect/ebeam/curse_arm - name = "curse arm" - layer = LARGE_MOB_LAYER - -/obj/item/projectile/curse_hand - name = "curse hand" - icon_state = "cursehand" - hitsound = 'sound/effects/curse4.ogg' - layer = LARGE_MOB_LAYER - damage_type = BURN - damage = 10 - knockdown = 20 - speed = 2 - range = 16 - forcedodge = TRUE - var/datum/beam/arm - var/handedness = 0 - -/obj/item/projectile/curse_hand/Initialize(mapload) - . = ..() - handedness = prob(50) - update_icon() - -/obj/item/projectile/curse_hand/update_icon() - icon_state = "[icon_state][handedness]" - -/obj/item/projectile/curse_hand/fire(setAngle) - if(starting) - arm = starting.Beam(src, icon_state = "curse[handedness]", time = INFINITY, maxdistance = INFINITY, beam_type=/obj/effect/ebeam/curse_arm) - ..() - -/obj/item/projectile/curse_hand/prehit(atom/target) - if(target == original) - forcedodge = FALSE - else if(!isturf(target)) - return FALSE - return ..() - -/obj/item/projectile/curse_hand/Destroy() - if(arm) - arm.End() - arm = null - if(forcedodge) - playsound(src, 'sound/effects/curse3.ogg', 25, 1, -1) - var/turf/T = get_step(src, dir) - new/obj/effect/temp_visual/dir_setting/curse/hand(T, dir, handedness) - for(var/obj/effect/temp_visual/dir_setting/curse/grasp_portal/G in starting) - qdel(G) - new /obj/effect/temp_visual/dir_setting/curse/grasp_portal/fading(starting, dir) - var/datum/beam/D = starting.Beam(T, icon_state = "curse[handedness]", time = 32, maxdistance = INFINITY, beam_type=/obj/effect/ebeam/curse_arm, beam_sleep_time = 1) - for(var/b in D.elements) - var/obj/effect/ebeam/B = b - animate(B, alpha = 0, time = 32) - return ..() - -/obj/item/projectile/hallucination - name = "bullet" - icon = null - icon_state = null - hitsound = "" - suppressed = TRUE - ricochets_max = 0 - ricochet_chance = 0 - damage = 0 - nodamage = TRUE - projectile_type = /obj/item/projectile/hallucination - log_override = TRUE - var/hal_icon_state - var/image/fake_icon - var/mob/living/carbon/hal_target - var/hal_fire_sound - var/hal_hitsound - var/hal_hitsound_wall - var/hal_impact_effect - var/hal_impact_effect_wall - var/hit_duration - var/hit_duration_wall - -/obj/item/projectile/hallucination/fire() - ..() - fake_icon = image('icons/obj/projectiles.dmi', src, hal_icon_state, ABOVE_MOB_LAYER) - if(hal_target.client) - hal_target.client.images += fake_icon - -/obj/item/projectile/hallucination/Destroy() - if(hal_target.client) - hal_target.client.images -= fake_icon - QDEL_NULL(fake_icon) - return ..() - -/obj/item/projectile/hallucination/Collide(atom/A) - if(!ismob(A)) - if(hal_hitsound_wall) - hal_target.playsound_local(loc, hal_hitsound_wall, 40, 1) - if(hal_impact_effect_wall) - spawn_hit(A, TRUE) - else if(A == hal_target) - if(hal_hitsound) - hal_target.playsound_local(A, hal_hitsound, 100, 1) - target_on_hit(A) - qdel(src) - return TRUE - -/obj/item/projectile/hallucination/proc/target_on_hit(mob/M) - if(M == hal_target) - to_chat(hal_target, "[M] is hit by \a [src] in the chest!") - hal_apply_effect() - else if(M in view(hal_target)) - to_chat(hal_target, "[M] is hit by \a [src] in the chest!!") - if(damage_type == BRUTE) - var/splatter_dir = dir - if(starting) - splatter_dir = get_dir(starting, get_turf(M)) - spawn_blood(M, splatter_dir) - else if(hal_impact_effect) - spawn_hit(M, FALSE) - -/obj/item/projectile/hallucination/proc/spawn_blood(mob/M, set_dir) - set waitfor = 0 - if(!hal_target.client) - return - - var/splatter_icon_state - if(set_dir in GLOB.diagonals) - splatter_icon_state = "splatter[pick(1, 2, 6)]" - else - splatter_icon_state = "splatter[pick(3, 4, 5)]" - - var/image/blood = image('icons/effects/blood.dmi', M, splatter_icon_state, ABOVE_MOB_LAYER) - var/target_pixel_x = 0 - var/target_pixel_y = 0 - switch(set_dir) - if(NORTH) - target_pixel_y = 16 - if(SOUTH) - target_pixel_y = -16 - layer = ABOVE_MOB_LAYER - if(EAST) - target_pixel_x = 16 - if(WEST) - target_pixel_x = -16 - if(NORTHEAST) - target_pixel_x = 16 - target_pixel_y = 16 - if(NORTHWEST) - target_pixel_x = -16 - target_pixel_y = 16 - if(SOUTHEAST) - target_pixel_x = 16 - target_pixel_y = -16 - layer = ABOVE_MOB_LAYER - if(SOUTHWEST) - target_pixel_x = -16 - target_pixel_y = -16 - layer = ABOVE_MOB_LAYER - hal_target.client.images += blood - animate(blood, pixel_x = target_pixel_x, pixel_y = target_pixel_y, alpha = 0, time = 5) - addtimer(CALLBACK(src, .proc/cleanup_blood), 5) - -/obj/item/projectile/hallucination/proc/cleanup_blood(image/blood) - hal_target.client.images -= blood - qdel(blood) - -/obj/item/projectile/hallucination/proc/spawn_hit(atom/A, is_wall) - set waitfor = 0 - if(!hal_target.client) - return - - var/image/hit_effect = image('icons/effects/blood.dmi', A, is_wall ? hal_impact_effect_wall : hal_impact_effect, ABOVE_MOB_LAYER) - hit_effect.pixel_x = A.pixel_x + rand(-4,4) - hit_effect.pixel_y = A.pixel_y + rand(-4,4) - hal_target.client.images += hit_effect - sleep(is_wall ? hit_duration_wall : hit_duration) - hal_target.client.images -= hit_effect - qdel(hit_effect) - - -/obj/item/projectile/hallucination/proc/hal_apply_effect() - return - -/obj/item/projectile/hallucination/bullet - name = "bullet" - hal_icon_state = "bullet" - hal_fire_sound = "gunshot" - hal_hitsound = 'sound/weapons/pierce.ogg' - hal_hitsound_wall = "ricochet" - hal_impact_effect = "impact_bullet" - hal_impact_effect_wall = "impact_bullet" - hit_duration = 5 - hit_duration_wall = 5 - -/obj/item/projectile/hallucination/bullet/hal_apply_effect() - hal_target.adjustStaminaLoss(60) - -/obj/item/projectile/hallucination/laser - name = "laser" - damage_type = BURN - hal_icon_state = "laser" - hal_fire_sound = 'sound/weapons/laser.ogg' - hal_hitsound = 'sound/weapons/sear.ogg' - hal_hitsound_wall = 'sound/weapons/effects/searwall.ogg' - hal_impact_effect = "impact_laser" - hal_impact_effect_wall = "impact_laser_wall" - hit_duration = 4 - hit_duration_wall = 10 - pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE - -/obj/item/projectile/hallucination/laser/hal_apply_effect() - hal_target.adjustStaminaLoss(20) - hal_target.blur_eyes(2) - -/obj/item/projectile/hallucination/taser - name = "electrode" - damage_type = BURN - hal_icon_state = "spark" - color = "#FFFF00" - hal_fire_sound = 'sound/weapons/taser.ogg' - hal_hitsound = 'sound/weapons/taserhit.ogg' - hal_hitsound_wall = null - hal_impact_effect = null - hal_impact_effect_wall = null - -/obj/item/projectile/hallucination/taser/hal_apply_effect() - hal_target.Knockdown(100) - hal_target.stuttering += 20 - if(hal_target.dna && hal_target.dna.check_mutation(HULK)) - hal_target.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) - else if((hal_target.status_flags & CANKNOCKDOWN) && !hal_target.has_trait(TRAIT_STUNIMMUNE)) - addtimer(CALLBACK(hal_target, /mob/living/carbon.proc/do_jitter_animation, 20), 5) - -/obj/item/projectile/hallucination/disabler - name = "disabler beam" - damage_type = STAMINA - hal_icon_state = "omnilaser" - hal_fire_sound = 'sound/weapons/taser2.ogg' - hal_hitsound = 'sound/weapons/tap.ogg' - hal_hitsound_wall = 'sound/weapons/effects/searwall.ogg' - hal_impact_effect = "impact_laser_blue" - hal_impact_effect_wall = null - hit_duration = 4 - pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE - -/obj/item/projectile/hallucination/disabler/hal_apply_effect() - hal_target.adjustStaminaLoss(25) - -/obj/item/projectile/hallucination/ebow - name = "bolt" - damage_type = TOX - hal_icon_state = "cbbolt" - hal_fire_sound = 'sound/weapons/genhit.ogg' - hal_hitsound = null - hal_hitsound_wall = null - hal_impact_effect = null - hal_impact_effect_wall = null - -/obj/item/projectile/hallucination/ebow/hal_apply_effect() - hal_target.Knockdown(100) - hal_target.stuttering += 5 - hal_target.adjustStaminaLoss(8) - -/obj/item/projectile/hallucination/change - name = "bolt of change" - damage_type = BURN - hal_icon_state = "ice_1" - hal_fire_sound = 'sound/magic/staff_change.ogg' - hal_hitsound = null - hal_hitsound_wall = null - hal_impact_effect = null - hal_impact_effect_wall = null - -/obj/item/projectile/hallucination/change/hal_apply_effect() - new /datum/hallucination/self_delusion(hal_target, TRUE, wabbajack = FALSE) - -/obj/item/projectile/hallucination/death - name = "bolt of death" - damage_type = BURN - hal_icon_state = "pulse1_bl" - hal_fire_sound = 'sound/magic/wandodeath.ogg' - hal_hitsound = null - hal_hitsound_wall = null - hal_impact_effect = null - hal_impact_effect_wall = null - -/obj/item/projectile/hallucination/death/hal_apply_effect() - new /datum/hallucination/death(hal_target, TRUE) - -// Neurotoxin - -/obj/item/projectile/bullet/neurotoxin - name = "neurotoxin spit" - icon_state = "neurotoxin" - damage = 5 - damage_type = TOX - knockdown = 100 - -/obj/item/projectile/bullet/neurotoxin/on_hit(atom/target, blocked = FALSE) - if(isalien(target)) - knockdown = 0 - nodamage = TRUE - return ..() diff --git a/code/modules/projectiles/projectile/special/curse.dm b/code/modules/projectiles/projectile/special/curse.dm new file mode 100644 index 0000000000..e5ac8126dd --- /dev/null +++ b/code/modules/projectiles/projectile/special/curse.dm @@ -0,0 +1,55 @@ +/obj/effect/ebeam/curse_arm + name = "curse arm" + layer = LARGE_MOB_LAYER + +/obj/item/projectile/curse_hand + name = "curse hand" + icon_state = "cursehand" + hitsound = 'sound/effects/curse4.ogg' + layer = LARGE_MOB_LAYER + damage_type = BURN + damage = 10 + knockdown = 20 + speed = 2 + range = 16 + forcedodge = TRUE + var/datum/beam/arm + var/handedness = 0 + +/obj/item/projectile/curse_hand/Initialize(mapload) + . = ..() + handedness = prob(50) + update_icon() + +/obj/item/projectile/curse_hand/update_icon() + icon_state = "[icon_state][handedness]" + +/obj/item/projectile/curse_hand/fire(setAngle) + if(starting) + arm = starting.Beam(src, icon_state = "curse[handedness]", time = INFINITY, maxdistance = INFINITY, beam_type=/obj/effect/ebeam/curse_arm) + ..() + +/obj/item/projectile/curse_hand/prehit(atom/target) + if(target == original) + forcedodge = FALSE + else if(!isturf(target)) + return FALSE + return ..() + +/obj/item/projectile/curse_hand/Destroy() + if(arm) + arm.End() + arm = null + if(forcedodge) + playsound(src, 'sound/effects/curse3.ogg', 25, 1, -1) + var/turf/T = get_step(src, dir) + new/obj/effect/temp_visual/dir_setting/curse/hand(T, dir, handedness) + for(var/obj/effect/temp_visual/dir_setting/curse/grasp_portal/G in starting) + qdel(G) + new /obj/effect/temp_visual/dir_setting/curse/grasp_portal/fading(starting, dir) + var/datum/beam/D = starting.Beam(T, icon_state = "curse[handedness]", time = 32, maxdistance = INFINITY, beam_type=/obj/effect/ebeam/curse_arm, beam_sleep_time = 1) + for(var/b in D.elements) + var/obj/effect/ebeam/B = b + animate(B, alpha = 0, time = 32) + return ..() + diff --git a/code/modules/projectiles/projectile/special/floral.dm b/code/modules/projectiles/projectile/special/floral.dm new file mode 100644 index 0000000000..295f89148a --- /dev/null +++ b/code/modules/projectiles/projectile/special/floral.dm @@ -0,0 +1,25 @@ +/obj/item/projectile/energy/floramut + name = "alpha somatoray" + icon_state = "energy" + damage = 0 + damage_type = TOX + nodamage = 1 + flag = "energy" + +/obj/item/projectile/energy/floramut/on_hit(atom/target, blocked = FALSE) + . = ..() + if(iscarbon(target)) + var/mob/living/carbon/C = target + if(C.dna.species.id == "pod") + C.randmuti() + C.randmut() + C.updateappearance() + C.domutcheck() + +/obj/item/projectile/energy/florayield + name = "beta somatoray" + icon_state = "energy2" + damage = 0 + damage_type = TOX + nodamage = 1 + flag = "energy" diff --git a/code/modules/projectiles/projectile/special/gravity.dm b/code/modules/projectiles/projectile/special/gravity.dm new file mode 100644 index 0000000000..89f753d36d --- /dev/null +++ b/code/modules/projectiles/projectile/special/gravity.dm @@ -0,0 +1,90 @@ +/obj/item/projectile/gravityrepulse + name = "repulsion bolt" + icon = 'icons/effects/effects.dmi' + icon_state = "chronofield" + hitsound = 'sound/weapons/wave.ogg' + damage = 0 + damage_type = BRUTE + nodamage = 1 + color = "#33CCFF" + var/turf/T + var/power = 4 + var/list/thrown_items = list() + +/obj/item/projectile/gravityrepulse/Initialize() + . = ..() + var/obj/item/ammo_casing/energy/gravityrepulse/C = loc + if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items + power = min(C.gun.power, 15) + +/obj/item/projectile/gravityrepulse/on_hit() + . = ..() + T = get_turf(src) + for(var/atom/movable/A in range(T, power)) + if(A == src || (firer && A == src.firer) || A.anchored || thrown_items[A]) + continue + var/throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(A, src))) + A.throw_at(throwtarget,power+1,1) + thrown_items[A] = A + for(var/turf/F in range(T,power)) + new /obj/effect/temp_visual/gravpush(F) + +/obj/item/projectile/gravityattract + name = "attraction bolt" + icon = 'icons/effects/effects.dmi' + icon_state = "chronofield" + hitsound = 'sound/weapons/wave.ogg' + damage = 0 + damage_type = BRUTE + nodamage = 1 + color = "#FF6600" + var/turf/T + var/power = 4 + var/list/thrown_items = list() + +/obj/item/projectile/gravityattract/Initialize() + . = ..() + var/obj/item/ammo_casing/energy/gravityattract/C = loc + if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items + power = min(C.gun.power, 15) + +/obj/item/projectile/gravityattract/on_hit() + . = ..() + T = get_turf(src) + for(var/atom/movable/A in range(T, power)) + if(A == src || (firer && A == src.firer) || A.anchored || thrown_items[A]) + continue + A.throw_at(T, power+1, 1) + thrown_items[A] = A + for(var/turf/F in range(T,power)) + new /obj/effect/temp_visual/gravpush(F) + +/obj/item/projectile/gravitychaos + name = "gravitational blast" + icon = 'icons/effects/effects.dmi' + icon_state = "chronofield" + hitsound = 'sound/weapons/wave.ogg' + damage = 0 + damage_type = BRUTE + nodamage = 1 + color = "#101010" + var/turf/T + var/power = 4 + var/list/thrown_items = list() + +/obj/item/projectile/gravitychaos/Initialize() + . = ..() + var/obj/item/ammo_casing/energy/gravitychaos/C = loc + if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items + power = min(C.gun.power, 15) + +/obj/item/projectile/gravitychaos/on_hit() + . = ..() + T = get_turf(src) + for(var/atom/movable/A in range(T, power)) + if(A == src|| (firer && A == src.firer) || A.anchored || thrown_items[A]) + continue + A.throw_at(get_edge_target_turf(A, pick(GLOB.cardinals)), power+1, 1) + thrown_items[A] = A + for(var/turf/Z in range(T,power)) + new /obj/effect/temp_visual/gravpush(Z) diff --git a/code/modules/projectiles/projectile/special/hallucination.dm b/code/modules/projectiles/projectile/special/hallucination.dm new file mode 100644 index 0000000000..e158ed89f0 --- /dev/null +++ b/code/modules/projectiles/projectile/special/hallucination.dm @@ -0,0 +1,230 @@ +/obj/item/projectile/hallucination + name = "bullet" + icon = null + icon_state = null + hitsound = "" + suppressed = TRUE + ricochets_max = 0 + ricochet_chance = 0 + damage = 0 + nodamage = TRUE + projectile_type = /obj/item/projectile/hallucination + log_override = TRUE + var/hal_icon_state + var/image/fake_icon + var/mob/living/carbon/hal_target + var/hal_fire_sound + var/hal_hitsound + var/hal_hitsound_wall + var/hal_impact_effect + var/hal_impact_effect_wall + var/hit_duration + var/hit_duration_wall + +/obj/item/projectile/hallucination/fire() + ..() + fake_icon = image('icons/obj/projectiles.dmi', src, hal_icon_state, ABOVE_MOB_LAYER) + if(hal_target.client) + hal_target.client.images += fake_icon + +/obj/item/projectile/hallucination/Destroy() + if(hal_target.client) + hal_target.client.images -= fake_icon + QDEL_NULL(fake_icon) + return ..() + +/obj/item/projectile/hallucination/Collide(atom/A) + if(!ismob(A)) + if(hal_hitsound_wall) + hal_target.playsound_local(loc, hal_hitsound_wall, 40, 1) + if(hal_impact_effect_wall) + spawn_hit(A, TRUE) + else if(A == hal_target) + if(hal_hitsound) + hal_target.playsound_local(A, hal_hitsound, 100, 1) + target_on_hit(A) + qdel(src) + return TRUE + +/obj/item/projectile/hallucination/proc/target_on_hit(mob/M) + if(M == hal_target) + to_chat(hal_target, "[M] is hit by \a [src] in the chest!") + hal_apply_effect() + else if(M in view(hal_target)) + to_chat(hal_target, "[M] is hit by \a [src] in the chest!!") + if(damage_type == BRUTE) + var/splatter_dir = dir + if(starting) + splatter_dir = get_dir(starting, get_turf(M)) + spawn_blood(M, splatter_dir) + else if(hal_impact_effect) + spawn_hit(M, FALSE) + +/obj/item/projectile/hallucination/proc/spawn_blood(mob/M, set_dir) + set waitfor = 0 + if(!hal_target.client) + return + + var/splatter_icon_state + if(set_dir in GLOB.diagonals) + splatter_icon_state = "splatter[pick(1, 2, 6)]" + else + splatter_icon_state = "splatter[pick(3, 4, 5)]" + + var/image/blood = image('icons/effects/blood.dmi', M, splatter_icon_state, ABOVE_MOB_LAYER) + var/target_pixel_x = 0 + var/target_pixel_y = 0 + switch(set_dir) + if(NORTH) + target_pixel_y = 16 + if(SOUTH) + target_pixel_y = -16 + layer = ABOVE_MOB_LAYER + if(EAST) + target_pixel_x = 16 + if(WEST) + target_pixel_x = -16 + if(NORTHEAST) + target_pixel_x = 16 + target_pixel_y = 16 + if(NORTHWEST) + target_pixel_x = -16 + target_pixel_y = 16 + if(SOUTHEAST) + target_pixel_x = 16 + target_pixel_y = -16 + layer = ABOVE_MOB_LAYER + if(SOUTHWEST) + target_pixel_x = -16 + target_pixel_y = -16 + layer = ABOVE_MOB_LAYER + hal_target.client.images += blood + animate(blood, pixel_x = target_pixel_x, pixel_y = target_pixel_y, alpha = 0, time = 5) + addtimer(CALLBACK(src, .proc/cleanup_blood), 5) + +/obj/item/projectile/hallucination/proc/cleanup_blood(image/blood) + hal_target.client.images -= blood + qdel(blood) + +/obj/item/projectile/hallucination/proc/spawn_hit(atom/A, is_wall) + set waitfor = 0 + if(!hal_target.client) + return + + var/image/hit_effect = image('icons/effects/blood.dmi', A, is_wall ? hal_impact_effect_wall : hal_impact_effect, ABOVE_MOB_LAYER) + hit_effect.pixel_x = A.pixel_x + rand(-4,4) + hit_effect.pixel_y = A.pixel_y + rand(-4,4) + hal_target.client.images += hit_effect + sleep(is_wall ? hit_duration_wall : hit_duration) + hal_target.client.images -= hit_effect + qdel(hit_effect) + + +/obj/item/projectile/hallucination/proc/hal_apply_effect() + return + +/obj/item/projectile/hallucination/bullet + name = "bullet" + hal_icon_state = "bullet" + hal_fire_sound = "gunshot" + hal_hitsound = 'sound/weapons/pierce.ogg' + hal_hitsound_wall = "ricochet" + hal_impact_effect = "impact_bullet" + hal_impact_effect_wall = "impact_bullet" + hit_duration = 5 + hit_duration_wall = 5 + +/obj/item/projectile/hallucination/bullet/hal_apply_effect() + hal_target.adjustStaminaLoss(60) + +/obj/item/projectile/hallucination/laser + name = "laser" + damage_type = BURN + hal_icon_state = "laser" + hal_fire_sound = 'sound/weapons/laser.ogg' + hal_hitsound = 'sound/weapons/sear.ogg' + hal_hitsound_wall = 'sound/weapons/effects/searwall.ogg' + hal_impact_effect = "impact_laser" + hal_impact_effect_wall = "impact_laser_wall" + hit_duration = 4 + hit_duration_wall = 10 + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE + +/obj/item/projectile/hallucination/laser/hal_apply_effect() + hal_target.adjustStaminaLoss(20) + hal_target.blur_eyes(2) + +/obj/item/projectile/hallucination/taser + name = "electrode" + damage_type = BURN + hal_icon_state = "spark" + color = "#FFFF00" + hal_fire_sound = 'sound/weapons/taser.ogg' + hal_hitsound = 'sound/weapons/taserhit.ogg' + hal_hitsound_wall = null + hal_impact_effect = null + hal_impact_effect_wall = null + +/obj/item/projectile/hallucination/taser/hal_apply_effect() + hal_target.Knockdown(100) + hal_target.stuttering += 20 + if(hal_target.dna && hal_target.dna.check_mutation(HULK)) + hal_target.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) + else if((hal_target.status_flags & CANKNOCKDOWN) && !hal_target.has_trait(TRAIT_STUNIMMUNE)) + addtimer(CALLBACK(hal_target, /mob/living/carbon.proc/do_jitter_animation, 20), 5) + +/obj/item/projectile/hallucination/disabler + name = "disabler beam" + damage_type = STAMINA + hal_icon_state = "omnilaser" + hal_fire_sound = 'sound/weapons/taser2.ogg' + hal_hitsound = 'sound/weapons/tap.ogg' + hal_hitsound_wall = 'sound/weapons/effects/searwall.ogg' + hal_impact_effect = "impact_laser_blue" + hal_impact_effect_wall = null + hit_duration = 4 + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE + +/obj/item/projectile/hallucination/disabler/hal_apply_effect() + hal_target.adjustStaminaLoss(25) + +/obj/item/projectile/hallucination/ebow + name = "bolt" + damage_type = TOX + hal_icon_state = "cbbolt" + hal_fire_sound = 'sound/weapons/genhit.ogg' + hal_hitsound = null + hal_hitsound_wall = null + hal_impact_effect = null + hal_impact_effect_wall = null + +/obj/item/projectile/hallucination/ebow/hal_apply_effect() + hal_target.Knockdown(100) + hal_target.stuttering += 5 + hal_target.adjustStaminaLoss(8) + +/obj/item/projectile/hallucination/change + name = "bolt of change" + damage_type = BURN + hal_icon_state = "ice_1" + hal_fire_sound = 'sound/magic/staff_change.ogg' + hal_hitsound = null + hal_hitsound_wall = null + hal_impact_effect = null + hal_impact_effect_wall = null + +/obj/item/projectile/hallucination/change/hal_apply_effect() + new /datum/hallucination/self_delusion(hal_target, TRUE, wabbajack = FALSE) + +/obj/item/projectile/hallucination/death + name = "bolt of death" + damage_type = BURN + hal_icon_state = "pulse1_bl" + hal_fire_sound = 'sound/magic/wandodeath.ogg' + hal_hitsound = null + hal_hitsound_wall = null + hal_impact_effect = null + hal_impact_effect_wall = null + +/obj/item/projectile/hallucination/death/hal_apply_effect() + new /datum/hallucination/death(hal_target, TRUE) diff --git a/code/modules/projectiles/projectile/special/ion.dm b/code/modules/projectiles/projectile/special/ion.dm new file mode 100644 index 0000000000..403a1bedd7 --- /dev/null +++ b/code/modules/projectiles/projectile/special/ion.dm @@ -0,0 +1,20 @@ +/obj/item/projectile/ion + name = "ion bolt" + icon_state = "ion" + damage = 0 + damage_type = BURN + nodamage = 1 + flag = "energy" + impact_effect_type = /obj/effect/temp_visual/impact_effect/ion + +/obj/item/projectile/ion/on_hit(atom/target, blocked = FALSE) + ..() + empulse(target, 1, 1) + return TRUE + +/obj/item/projectile/ion/weak + +/obj/item/projectile/ion/weak/on_hit(atom/target, blocked = FALSE) + ..() + empulse(target, 0, 0) + return TRUE diff --git a/code/modules/projectiles/projectile/special/meteor.dm b/code/modules/projectiles/projectile/special/meteor.dm new file mode 100644 index 0000000000..f4e60998e1 --- /dev/null +++ b/code/modules/projectiles/projectile/special/meteor.dm @@ -0,0 +1,19 @@ +/obj/item/projectile/meteor + name = "meteor" + icon = 'icons/obj/meteor.dmi' + icon_state = "small1" + damage = 0 + damage_type = BRUTE + nodamage = 1 + flag = "bullet" + +/obj/item/projectile/meteor/Collide(atom/A) + if(A == firer) + forceMove(A.loc) + return + A.ex_act(EXPLODE_HEAVY) + playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1) + for(var/mob/M in urange(10, src)) + if(!M.stat) + shake_camera(M, 3, 1) + qdel(src) diff --git a/code/modules/projectiles/projectile/special/mindflayer.dm b/code/modules/projectiles/projectile/special/mindflayer.dm new file mode 100644 index 0000000000..eaa998f7e0 --- /dev/null +++ b/code/modules/projectiles/projectile/special/mindflayer.dm @@ -0,0 +1,9 @@ +/obj/item/projectile/beam/mindflayer + name = "flayer ray" + +/obj/item/projectile/beam/mindflayer/on_hit(atom/target, blocked = FALSE) + . = ..() + if(ishuman(target)) + var/mob/living/carbon/human/M = target + M.adjustBrainLoss(20) + M.hallucination += 20 diff --git a/code/modules/projectiles/projectile/special/neurotoxin.dm b/code/modules/projectiles/projectile/special/neurotoxin.dm new file mode 100644 index 0000000000..46027e7bdf --- /dev/null +++ b/code/modules/projectiles/projectile/special/neurotoxin.dm @@ -0,0 +1,12 @@ +/obj/item/projectile/bullet/neurotoxin + name = "neurotoxin spit" + icon_state = "neurotoxin" + damage = 5 + damage_type = TOX + knockdown = 100 + +/obj/item/projectile/bullet/neurotoxin/on_hit(atom/target, blocked = FALSE) + if(isalien(target)) + knockdown = 0 + nodamage = TRUE + return ..() diff --git a/code/modules/projectiles/projectile/special/plasma.dm b/code/modules/projectiles/projectile/special/plasma.dm new file mode 100644 index 0000000000..aeafb6157a --- /dev/null +++ b/code/modules/projectiles/projectile/special/plasma.dm @@ -0,0 +1,49 @@ +/obj/item/projectile/plasma + name = "plasma blast" + icon_state = "plasmacutter" + damage_type = BRUTE + damage = 20 + range = 4 + dismemberment = 20 + impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser + var/pressure_decrease_active = FALSE + var/pressure_decrease = 0.25 + var/mine_range = 3 //mines this many additional tiles of rock + tracer_type = /obj/effect/projectile/tracer/plasma_cutter + muzzle_type = /obj/effect/projectile/muzzle/plasma_cutter + impact_type = /obj/effect/projectile/impact/plasma_cutter + +/obj/item/projectile/plasma/Initialize() + . = ..() + if(!lavaland_equipment_pressure_check(get_turf(src))) + name = "weakened [name]" + damage = damage * pressure_decrease + pressure_decrease_active = TRUE + +/obj/item/projectile/plasma/on_hit(atom/target) + . = ..() + if(ismineralturf(target)) + var/turf/closed/mineral/M = target + M.gets_drilled(firer) + if(mine_range) + mine_range-- + range++ + if(range > 0) + return -1 + +/obj/item/projectile/plasma/adv + damage = 28 + range = 5 + mine_range = 5 + +/obj/item/projectile/plasma/adv/mech + damage = 40 + range = 9 + mine_range = 3 + +/obj/item/projectile/plasma/turret + //Between normal and advanced for damage, made a beam so not the turret does not destroy glass + name = "plasma beam" + damage = 24 + range = 7 + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE diff --git a/code/modules/projectiles/projectile/special/rocket.dm b/code/modules/projectiles/projectile/special/rocket.dm new file mode 100644 index 0000000000..6518b2a4d5 --- /dev/null +++ b/code/modules/projectiles/projectile/special/rocket.dm @@ -0,0 +1,45 @@ +/obj/item/projectile/bullet/gyro + name ="explosive bolt" + icon_state= "bolter" + damage = 50 + +/obj/item/projectile/bullet/gyro/on_hit(atom/target, blocked = FALSE) + ..() + explosion(target, -1, 0, 2) + return TRUE + +/obj/item/projectile/bullet/a84mm + name ="anti-armour rocket" + desc = "USE A WEEL GUN" + icon_state= "atrocket" + damage = 80 + var/anti_armour_damage = 200 + armour_penetration = 100 + dismemberment = 100 + +/obj/item/projectile/bullet/a84mm/on_hit(atom/target, blocked = FALSE) + ..() + explosion(target, -1, 1, 3, 1, 0, flame_range = 4) + + if(ismecha(target)) + var/obj/mecha/M = target + M.take_damage(anti_armour_damage) + if(issilicon(target)) + var/mob/living/silicon/S = target + S.take_overall_damage(anti_armour_damage*0.75, anti_armour_damage*0.25) + return TRUE + +/obj/item/projectile/bullet/srmrocket + name ="SRM-8 Rocket" + desc = "Boom." + icon_state = "missile" + damage = 30 + ricochets_max = 0 //it's a MISSILE + +/obj/item/projectile/bullet/srmrocket/on_hit(atom/target, blocked=0) + ..() + if(!isliving(target)) //if the target isn't alive, so is a wall or something + explosion(target, 0, 1, 2, 4) + else + explosion(target, 0, 0, 2, 4) + return TRUE diff --git a/code/modules/projectiles/projectile/special/temperature.dm b/code/modules/projectiles/projectile/special/temperature.dm new file mode 100644 index 0000000000..7fb9c6efb2 --- /dev/null +++ b/code/modules/projectiles/projectile/special/temperature.dm @@ -0,0 +1,19 @@ +/obj/item/projectile/temp + name = "freeze beam" + icon_state = "ice_2" + damage = 0 + damage_type = BURN + nodamage = FALSE + flag = "energy" + var/temperature = 100 + +/obj/item/projectile/temp/on_hit(atom/target, blocked = FALSE)//These two could likely check temp protection on the mob + ..() + if(isliving(target)) + var/mob/M = target + M.bodytemperature = temperature + return TRUE + +/obj/item/projectile/temp/hot + name = "heat beam" + temperature = 400 diff --git a/code/modules/projectiles/projectile/special/wormhole.dm b/code/modules/projectiles/projectile/special/wormhole.dm new file mode 100644 index 0000000000..94ef5b9a23 --- /dev/null +++ b/code/modules/projectiles/projectile/special/wormhole.dm @@ -0,0 +1,25 @@ +/obj/item/projectile/beam/wormhole + name = "bluespace beam" + icon_state = "spark" + hitsound = "sparks" + damage = 3 + var/obj/item/gun/energy/wormhole_projector/gun + color = "#33CCFF" + +/obj/item/projectile/beam/wormhole/orange + name = "orange bluespace beam" + color = "#FF6600" + +/obj/item/projectile/beam/wormhole/Initialize(mapload, obj/item/ammo_casing/energy/wormhole/casing) + . = ..() + if(casing) + gun = casing.gun + +/obj/item/projectile/beam/wormhole/on_hit(atom/target) + if(ismob(target)) + var/turf/portal_destination = pick(orange(6, src)) + do_teleport(target, portal_destination) + return ..() + if(!gun) + qdel(src) + gun.create_portal(src, get_turf(src)) diff --git a/tgstation.dme b/tgstation.dme index a678b93d03..f6f772f8c8 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -2198,29 +2198,57 @@ #include "code\modules\procedural_mapping\mapGenerators\repair.dm" #include "code\modules\procedural_mapping\mapGenerators\shuttle.dm" #include "code\modules\procedural_mapping\mapGenerators\syndicate.dm" -#include "code\modules\projectiles\ammunition.dm" -#include "code\modules\projectiles\box_magazine.dm" -#include "code\modules\projectiles\firing.dm" #include "code\modules\projectiles\gun.dm" #include "code\modules\projectiles\pins.dm" #include "code\modules\projectiles\projectile.dm" -#include "code\modules\projectiles\ammunition\ammo_casings.dm" -#include "code\modules\projectiles\ammunition\caseless.dm" -#include "code\modules\projectiles\ammunition\energy.dm" -#include "code\modules\projectiles\ammunition\plasma.dm" -#include "code\modules\projectiles\ammunition\special.dm" +#include "code\modules\projectiles\ammunition\_ammunition.dm" +#include "code\modules\projectiles\ammunition\_firing.dm" +#include "code\modules\projectiles\ammunition\ballistic\lmg.dm" +#include "code\modules\projectiles\ammunition\ballistic\pistol.dm" +#include "code\modules\projectiles\ammunition\ballistic\revolver.dm" +#include "code\modules\projectiles\ammunition\ballistic\rifle.dm" +#include "code\modules\projectiles\ammunition\ballistic\shotgun.dm" +#include "code\modules\projectiles\ammunition\ballistic\smg.dm" +#include "code\modules\projectiles\ammunition\ballistic\sniper.dm" +#include "code\modules\projectiles\ammunition\caseless\_caseless.dm" +#include "code\modules\projectiles\ammunition\caseless\foam.dm" +#include "code\modules\projectiles\ammunition\caseless\misc.dm" +#include "code\modules\projectiles\ammunition\caseless\rocket.dm" +#include "code\modules\projectiles\ammunition\energy\_energy.dm" +#include "code\modules\projectiles\ammunition\energy\chameleon.dm" +#include "code\modules\projectiles\ammunition\energy\ebow.dm" +#include "code\modules\projectiles\ammunition\energy\gravity.dm" +#include "code\modules\projectiles\ammunition\energy\laser.dm" +#include "code\modules\projectiles\ammunition\energy\lmg.dm" +#include "code\modules\projectiles\ammunition\energy\plasma.dm" +#include "code\modules\projectiles\ammunition\energy\plasma_cit.dm" +#include "code\modules\projectiles\ammunition\energy\portal.dm" +#include "code\modules\projectiles\ammunition\energy\special.dm" +#include "code\modules\projectiles\ammunition\energy\stun.dm" +#include "code\modules\projectiles\ammunition\special\magic.dm" +#include "code\modules\projectiles\ammunition\special\syringe.dm" +#include "code\modules\projectiles\boxes_magazines\_box_magazine.dm" #include "code\modules\projectiles\boxes_magazines\ammo_boxes.dm" -#include "code\modules\projectiles\boxes_magazines\external_mag.dm" -#include "code\modules\projectiles\boxes_magazines\internal_mag.dm" +#include "code\modules\projectiles\boxes_magazines\external\grenade.dm" +#include "code\modules\projectiles\boxes_magazines\external\lmg.dm" +#include "code\modules\projectiles\boxes_magazines\external\pistol.dm" +#include "code\modules\projectiles\boxes_magazines\external\rechargable.dm" +#include "code\modules\projectiles\boxes_magazines\external\rifle.dm" +#include "code\modules\projectiles\boxes_magazines\external\shotgun.dm" +#include "code\modules\projectiles\boxes_magazines\external\smg.dm" +#include "code\modules\projectiles\boxes_magazines\external\sniper.dm" +#include "code\modules\projectiles\boxes_magazines\external\toy.dm" +#include "code\modules\projectiles\boxes_magazines\internal\_cylinder.dm" +#include "code\modules\projectiles\boxes_magazines\internal\_internal.dm" +#include "code\modules\projectiles\boxes_magazines\internal\grenade.dm" +#include "code\modules\projectiles\boxes_magazines\internal\misc.dm" +#include "code\modules\projectiles\boxes_magazines\internal\revolver.dm" +#include "code\modules\projectiles\boxes_magazines\internal\rifle.dm" +#include "code\modules\projectiles\boxes_magazines\internal\shotgun.dm" +#include "code\modules\projectiles\boxes_magazines\internal\toy.dm" #include "code\modules\projectiles\guns\ballistic.dm" -#include "code\modules\projectiles\guns\beam_rifle.dm" -#include "code\modules\projectiles\guns\chem_gun.dm" #include "code\modules\projectiles\guns\energy.dm" -#include "code\modules\projectiles\guns\grenade_launcher.dm" #include "code\modules\projectiles\guns\magic.dm" -#include "code\modules\projectiles\guns\medbeam.dm" -#include "code\modules\projectiles\guns\mounted.dm" -#include "code\modules\projectiles\guns\syringe_gun.dm" #include "code\modules\projectiles\guns\ballistic\automatic.dm" #include "code\modules\projectiles\guns\ballistic\laser_gatling.dm" #include "code\modules\projectiles\guns\ballistic\launchers.dm" @@ -2232,21 +2260,58 @@ #include "code\modules\projectiles\guns\energy\kinetic_accelerator.dm" #include "code\modules\projectiles\guns\energy\laser.dm" #include "code\modules\projectiles\guns\energy\megabuster.dm" -#include "code\modules\projectiles\guns\energy\plasma.dm" +#include "code\modules\projectiles\guns\energy\mounted.dm" +#include "code\modules\projectiles\guns\energy\plasma_cit.dm" #include "code\modules\projectiles\guns\energy\pulse.dm" #include "code\modules\projectiles\guns\energy\special.dm" #include "code\modules\projectiles\guns\energy\stun.dm" #include "code\modules\projectiles\guns\magic\staff.dm" #include "code\modules\projectiles\guns\magic\wand.dm" +#include "code\modules\projectiles\guns\misc\beam_rifle.dm" #include "code\modules\projectiles\guns\misc\blastcannon.dm" +#include "code\modules\projectiles\guns\misc\chem_gun.dm" +#include "code\modules\projectiles\guns\misc\grenade_launcher.dm" +#include "code\modules\projectiles\guns\misc\medbeam.dm" +#include "code\modules\projectiles\guns\misc\syringe_gun.dm" #include "code\modules\projectiles\projectile\beams.dm" #include "code\modules\projectiles\projectile\bullets.dm" -#include "code\modules\projectiles\projectile\energy.dm" #include "code\modules\projectiles\projectile\magic.dm" #include "code\modules\projectiles\projectile\megabuster.dm" #include "code\modules\projectiles\projectile\plasma.dm" -#include "code\modules\projectiles\projectile\reusable.dm" -#include "code\modules\projectiles\projectile\special.dm" +#include "code\modules\projectiles\projectile\bullets\_incendiary.dm" +#include "code\modules\projectiles\projectile\bullets\dart_syringe.dm" +#include "code\modules\projectiles\projectile\bullets\dnainjector.dm" +#include "code\modules\projectiles\projectile\bullets\grenade.dm" +#include "code\modules\projectiles\projectile\bullets\lmg.dm" +#include "code\modules\projectiles\projectile\bullets\pistol.dm" +#include "code\modules\projectiles\projectile\bullets\revolver.dm" +#include "code\modules\projectiles\projectile\bullets\rifle.dm" +#include "code\modules\projectiles\projectile\bullets\shotgun.dm" +#include "code\modules\projectiles\projectile\bullets\smg.dm" +#include "code\modules\projectiles\projectile\bullets\sniper.dm" +#include "code\modules\projectiles\projectile\bullets\special.dm" +#include "code\modules\projectiles\projectile\energy\_energy.dm" +#include "code\modules\projectiles\projectile\energy\chameleon.dm" +#include "code\modules\projectiles\projectile\energy\ebow.dm" +#include "code\modules\projectiles\projectile\energy\misc.dm" +#include "code\modules\projectiles\projectile\energy\net_snare.dm" +#include "code\modules\projectiles\projectile\energy\stun.dm" +#include "code\modules\projectiles\projectile\energy\tesla.dm" +#include "code\modules\projectiles\projectile\reusable\_reusable.dm" +#include "code\modules\projectiles\projectile\reusable\foam_dart.dm" +#include "code\modules\projectiles\projectile\reusable\magspear.dm" +#include "code\modules\projectiles\projectile\special\curse.dm" +#include "code\modules\projectiles\projectile\special\floral.dm" +#include "code\modules\projectiles\projectile\special\gravity.dm" +#include "code\modules\projectiles\projectile\special\hallucination.dm" +#include "code\modules\projectiles\projectile\special\ion.dm" +#include "code\modules\projectiles\projectile\special\meteor.dm" +#include "code\modules\projectiles\projectile\special\mindflayer.dm" +#include "code\modules\projectiles\projectile\special\neurotoxin.dm" +#include "code\modules\projectiles\projectile\special\plasma.dm" +#include "code\modules\projectiles\projectile\special\rocket.dm" +#include "code\modules\projectiles\projectile\special\temperature.dm" +#include "code\modules\projectiles\projectile\special\wormhole.dm" #include "code\modules\reagents\chem_splash.dm" #include "code\modules\reagents\reagent_containers.dm" #include "code\modules\reagents\reagent_dispenser.dm" From 848b12db64e97a368012df888944c49d150b4671 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 5 Mar 2018 14:38:30 -0600 Subject: [PATCH 20/45] [MIRROR] [READY]Hostile mobs can attack assemblies (#5821) * [READY]Hostile mobs can attack assemblies (#36157) * new fenotype * attack * Update items.dm * Update assemblies.dm * Update assemblies.dm * Update items.dm * [READY]Hostile mobs can attack assemblies --- code/game/objects/items.dm | 4 +++- code/modules/mob/living/simple_animal/hostile/hostile.dm | 7 ++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index b21d95e7ab..0cd102cb5a 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -674,6 +674,8 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) return 0 /obj/item/attack_animal(mob/living/simple_animal/M) + if (obj_flags & CAN_BE_HIT) + return ..() return 0 /obj/item/mech_melee_attack(obj/mecha/M) @@ -820,4 +822,4 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) // Returns a numeric value for sorting items used as parts in machines, so they can be replaced by the rped /obj/item/proc/get_part_rating() - return 0 \ No newline at end of file + return 0 diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 8207f321cd..edb6e47ca8 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -106,7 +106,7 @@ if(!search_objects) . = hearers(vision_range, targets_from) - src //Remove self, so we don't suicide - var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/mecha, /obj/structure/destructible/clockwork/ocular_warden)) + var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/mecha, /obj/structure/destructible/clockwork/ocular_warden,/obj/item/device/electronic_assembly)) for(var/HM in typecache_filter_list(range(vision_range, targets_from), hostile_machines)) if(can_see(targets_from, HM, vision_range)) @@ -209,6 +209,11 @@ return FALSE return TRUE + if(istype(the_target, /obj/item/device/electronic_assembly)) + var/obj/item/device/electronic_assembly/O = the_target + if(O.combat_circuits) + return TRUE + if(istype(the_target, /obj/structure/destructible/clockwork/ocular_warden)) var/obj/structure/destructible/clockwork/ocular_warden/OW = the_target if(OW.target != src) From f746366c36264ea00cd44f2fdc139f160e9a78af Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 5 Mar 2018 14:38:32 -0600 Subject: [PATCH 21/45] Automatic changelog generation for PR #5821 [ci skip] --- html/changelogs/AutoChangeLog-pr-5821.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5821.yml diff --git a/html/changelogs/AutoChangeLog-pr-5821.yml b/html/changelogs/AutoChangeLog-pr-5821.yml new file mode 100644 index 0000000000..86c02f0379 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5821.yml @@ -0,0 +1,4 @@ +author: "selea" +delete-after: True +changes: + - bugfix: "After several months of natural selection, hostile mobs started to attack assemblies with combat circuits." From 3569152bf8caab0f1e6f1026628d8ce4a17e960b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 5 Mar 2018 14:44:18 -0600 Subject: [PATCH 22/45] [MIRROR] Cleans up save file update code. (#5816) * Cleans up save file update code. * fixes merge issue --- code/modules/client/preferences_savefile.dm | 88 +++------------------ 1 file changed, 13 insertions(+), 75 deletions(-) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 12f2b8d4ee..9b776c48b2 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -1,8 +1,12 @@ //This is the lowest supported version, anything below this is completely obsolete and the entire savefile will be wiped. -#define SAVEFILE_VERSION_MIN 15 +#define SAVEFILE_VERSION_MIN 18 //This is the current version, anything below this will attempt to update (if it's not obsolete) +// You do not need to raise this if you are adding new values that have sane defaults. +// Only raise this value when changing the meaning/format/name/layout of an existing value +// where you would want the updater procs below to run #define SAVEFILE_VERSION_MAX 20 + /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn This proc checks if the current directory of the savefile S needs updating @@ -30,83 +34,17 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car return savefile_version return -1 - -/datum/preferences/proc/update_antagchoices(current_version, savefile/S) - if((!islist(be_special) || old_be_special ) && current_version < 12) - //Archived values of when antag pref defines were a bitfield+fitflags - var/B_traitor = 1 - var/B_operative = 2 - var/B_changeling = 4 - var/B_wizard = 8 - var/B_malf = 16 - var/B_rev = 32 - var/B_alien = 64 - var/B_pai = 128 - var/B_cultist = 256 - var/B_blob = 512 - var/B_ninja = 1024 - var/B_monkey = 2048 - var/B_gang = 4096 - var/B_abductor = 16384 - var/B_brother = 32768 - - var/list/archived = list(B_traitor,B_operative,B_changeling,B_wizard,B_malf,B_rev,B_alien,B_pai,B_cultist,B_blob,B_ninja,B_monkey,B_gang,B_abductor,B_brother) - - be_special = list() - - for(var/flag in archived) - if(old_be_special & flag) - //this is shitty, but this proc should only be run once per player and then never again for the rest of eternity, - switch(flag) - if(1) //why aren't these the variables above? Good question, it's because byond complains the expression isn't constant, when it is. - be_special += ROLE_TRAITOR - if(2) - be_special += ROLE_OPERATIVE - if(4) - be_special += ROLE_CHANGELING - if(8) - be_special += ROLE_WIZARD - if(16) - be_special += ROLE_MALF - if(32) - be_special += ROLE_REV - if(64) - be_special += ROLE_ALIEN - if(128) - be_special += ROLE_PAI - if(256) - be_special += ROLE_CULTIST - if(512) - be_special += ROLE_BLOB - if(1024) - be_special += ROLE_NINJA - if(2048) - be_special += ROLE_MONKEY - if(16384) - be_special += ROLE_ABDUCTOR - if(32768) - be_special += ROLE_BROTHER - - -/datum/preferences/proc/update_preferences(current_version, savefile/S) - - -//should this proc get fairly long (say 3 versions long), +//should these procs get fairly long //just increase SAVEFILE_VERSION_MIN so it's not as far behind //SAVEFILE_VERSION_MAX and then delete any obsolete if clauses -//from this proc. -//It's only really meant to avoid annoying frequent players +//from these procs. +//This only really meant to avoid annoying frequent players //if your savefile is 3 months out of date, then 'tough shit'. + +/datum/preferences/proc/update_preferences(current_version, savefile/S) + return + /datum/preferences/proc/update_character(current_version, savefile/S) - if(current_version < 16) - var/berandom - S["userandomjob"] >> berandom - if (berandom) - joblessrole = BERANDOMJOB - else - joblessrole = BEASSISTANT - if(current_version < 17) - features["legs"] = "Normal Legs" if(current_version < 20)//Raise this to the max savefile version every time we change something so we don't sanitize this whole list every time you save. features["mam_body_markings"] = sanitize_inlist(features["mam_body_markings"], GLOB.mam_body_markings_list) features["mam_ears"] = sanitize_inlist(features["mam_ears"], GLOB.mam_ears_list) @@ -139,6 +77,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car features["vag_color"] = sanitize_hexcolor(features["vag_color"], 3, 0) //womb features features["has_womb"] = sanitize_integer(features["has_womb"], 0, 1, 0) + if(current_version < 19) pda_style = "mono" if(current_version < 20) @@ -206,7 +145,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //try to fix any outdated data if necessary if(needs_update >= 0) update_preferences(needs_update, S) //needs_update = savefile_version if we need an update (positive integer) - update_antagchoices(needs_update, S) //Sanitize ooccolor = sanitize_ooccolor(sanitize_hexcolor(ooccolor, 6, 1, initial(ooccolor))) From 032511a03e7a787e9d5670361fad36104ea35cbf Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 5 Mar 2018 15:02:10 -0600 Subject: [PATCH 23/45] [MIRROR] Added a cooldown to being shown hud images (#5810) * Merge pull request #36144 from Cruix/hud_images_cd Added a cooldown to being shown hud images * Added a cooldown to being shown hud images --- code/__DEFINES/atom_hud.dm | 2 ++ code/datums/hud.dm | 29 ++++++++++++++++++++++++----- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/code/__DEFINES/atom_hud.dm b/code/__DEFINES/atom_hud.dm index 017a3f8bfe..0c5edf5b99 100644 --- a/code/__DEFINES/atom_hud.dm +++ b/code/__DEFINES/atom_hud.dm @@ -55,3 +55,5 @@ #define NOTIFY_JUMP "jump" #define NOTIFY_ATTACK "attack" #define NOTIFY_ORBIT "orbit" + +#define ADD_HUD_TO_COOLDOWN 20 //cooldown for being shown the images for any particular data hud diff --git a/code/datums/hud.dm b/code/datums/hud.dm index fc6c09be14..17632acba0 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -32,6 +32,9 @@ GLOBAL_LIST_INIT(huds, list( var/list/mob/hudusers = list() //list with all mobs who can see the hud var/list/hud_icons = list() //these will be the indexes for the atom's hud_list + var/list/next_time_allowed = list() //mobs associated with the next time this hud can be added to them + var/list/queued_to_see = list() //mobs that have triggered the cooldown and are queued to see the hud, but do not yet + /datum/atom_hud/New() GLOB.all_huds += src @@ -48,8 +51,11 @@ GLOBAL_LIST_INIT(huds, list( return if (!--hudusers[M]) hudusers -= M - for(var/atom/A in hudatoms) - remove_from_single_hud(M, A) + if(queued_to_see[M]) + queued_to_see -= M + else + for(var/atom/A in hudatoms) + remove_from_single_hud(M, A) /datum/atom_hud/proc/remove_from_hud(atom/A) if(!A) @@ -68,13 +74,26 @@ GLOBAL_LIST_INIT(huds, list( /datum/atom_hud/proc/add_hud_to(mob/M) if(!M) return - if (!hudusers[M]) + if(!hudusers[M]) hudusers[M] = 1 - for(var/atom/A in hudatoms) - add_to_single_hud(M, A) + if(next_time_allowed[M] > world.time) + if(!queued_to_see[M]) + addtimer(CALLBACK(src, .proc/show_hud_images_after_cooldown, M), next_time_allowed[M] - world.time) + queued_to_see[M] = TRUE + else + next_time_allowed[M] = world.time + ADD_HUD_TO_COOLDOWN + for(var/atom/A in hudatoms) + add_to_single_hud(M, A) else hudusers[M]++ +/datum/atom_hud/proc/show_hud_images_after_cooldown(M) + if(queued_to_see[M]) + queued_to_see -= M + next_time_allowed[M] = world.time + ADD_HUD_TO_COOLDOWN + for(var/atom/A in hudatoms) + add_to_single_hud(M, A) + /datum/atom_hud/proc/add_to_hud(atom/A) if(!A) return FALSE From 766b85908e7788253194dc4ae90d27d2a66109d9 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 5 Mar 2018 15:20:49 -0600 Subject: [PATCH 24/45] [MIRROR] Adds the Ancient Cloning Lab ruin (#5814) * Adds the Ancient Cloning Lab ruin * fixes conflicts --- .../SpaceRuins/cloning_facility.dmm | 503 ++++++++++++++++++ code/__DEFINES/DNA.dm | 25 +- code/__DEFINES/radio.dm | 110 ++-- code/__DEFINES/sight.dm | 60 +-- code/__DEFINES/traits.dm | 4 +- code/datums/ruins/space.dm | 8 +- code/game/area/areas/ruins/space.dm | 4 + code/game/machinery/cloning.dm | 52 +- code/game/machinery/exp_cloner.dm | 297 +++++++++++ .../circuitboards/computer_circuitboards.dm | 4 + .../circuitboards/machine_circuitboards.dm | 4 + .../crates_lockers/closets/fitness.dm | 128 ++--- code/modules/assembly/mousetrap.dm | 284 +++++----- code/modules/mob/living/carbon/human/life.dm | 6 +- .../mob/living/carbon/human/species.dm | 2 +- .../carbon/human/species_types/corporate.dm | 40 +- code/modules/mob/living/carbon/life.dm | 6 +- code/modules/reagents/chemistry/holder.dm | 4 +- code/modules/reagents/chemistry/reagents.dm | 1 + .../chemistry/reagents/medicine_reagents.dm | 1 + .../chemistry/reagents/toxin_reagents.dm | 1 + .../ruins/spaceruin_code/cloning_lab.dm | 35 ++ code/modules/surgery/organs/lungs.dm | 8 +- tgstation.dme | 2 + 24 files changed, 1221 insertions(+), 368 deletions(-) create mode 100644 _maps/RandomRuins/SpaceRuins/cloning_facility.dmm create mode 100644 code/game/machinery/exp_cloner.dm create mode 100644 code/modules/ruins/spaceruin_code/cloning_lab.dm diff --git a/_maps/RandomRuins/SpaceRuins/cloning_facility.dmm b/_maps/RandomRuins/SpaceRuins/cloning_facility.dmm new file mode 100644 index 0000000000..87f890e0d5 --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/cloning_facility.dmm @@ -0,0 +1,503 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"b" = ( +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"c" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/fulltile, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"d" = ( +/turf/closed/wall/r_wall/rust, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"e" = ( +/obj/machinery/defibrillator_mount/loaded, +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"f" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/fulltile, +/turf/open/floor/plasteel/airless, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"g" = ( +/obj/structure/table, +/obj/item/device/flashlight/lamp, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plasteel/whiteblue, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"h" = ( +/obj/structure/table, +/obj/item/pen, +/obj/item/paper/fluff/ruins/exp_cloning/log, +/turf/open/floor/plasteel/whiteblue, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"i" = ( +/obj/machinery/dna_scannernew, +/turf/open/floor/plasteel/whiteblue, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"j" = ( +/obj/machinery/computer/prototype_cloning, +/obj/machinery/light{ + dir = 1 + }, +/obj/item/paper/fluff/ruins/exp_cloning/manual, +/turf/open/floor/plasteel/whiteblue, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"k" = ( +/obj/machinery/clonepod/experimental, +/turf/open/floor/plasteel/whiteblue, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"l" = ( +/obj/effect/decal/cleanable/vomit/old, +/turf/open/floor/plasteel/whiteblue, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"m" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plasteel/whiteblue, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"n" = ( +/obj/structure/sign/nanotrasen, +/turf/closed/wall, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"o" = ( +/obj/machinery/vending/snack/teal, +/turf/open/floor/plasteel/airless/floorgrime, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"p" = ( +/turf/open/floor/plasteel/airless/floorgrime, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"q" = ( +/obj/structure/sign/directions/science{ + dir = 8 + }, +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"r" = ( +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"s" = ( +/obj/machinery/iv_drip, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"t" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/bed, +/obj/item/bedsheet/medical, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"u" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"v" = ( +/turf/open/floor/plasteel/whiteblue/corner{ + dir = 4 + }, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"w" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/turf/open/floor/plasteel/whiteblue/side{ + dir = 1 + }, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"x" = ( +/turf/open/floor/plasteel/whiteblue/side{ + dir = 1 + }, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"y" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/turf/open/floor/plasteel/whiteblue, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"z" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/whiteblue/corner{ + dir = 1 + }, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"A" = ( +/obj/structure/sign/departments/science, +/turf/closed/wall, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"B" = ( +/turf/open/floor/plasteel/airless, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"C" = ( +/turf/open/floor/plating/airless, +/area/space/nearstation) +"D" = ( +/obj/structure/chair/comfy{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"E" = ( +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"F" = ( +/obj/machinery/door/airlock/research/glass, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"G" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"H" = ( +/obj/machinery/door/airlock/research/glass, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"I" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"J" = ( +/turf/open/floor/plasteel/white, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"K" = ( +/obj/machinery/door/airlock/research/glass, +/turf/open/floor/plasteel/airless, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"L" = ( +/turf/open/floor/plating/airless{ + icon_state = "platingdmg1" + }, +/area/space/nearstation) +"M" = ( +/obj/structure/fluff/broken_flooring{ + name = "broken plating"; + icon_state = "plating"; + dir = 8 + }, +/turf/template_noop, +/area/space/nearstation) +"N" = ( +/obj/item/book/random/triple, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"O" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/bookcase/random/fiction, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"P" = ( +/obj/structure/table/glass, +/obj/machinery/light, +/obj/structure/bedsheetbin, +/turf/open/floor/plasteel/white, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"Q" = ( +/obj/structure/table/glass, +/turf/open/floor/plasteel/white, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"R" = ( +/obj/structure/table/glass, +/obj/item/storage/firstaid/regular, +/obj/item/device/healthanalyzer{ + desc = "A prototype hand-held body scanner able to distinguish vital signs of the subject."; + name = "prototype health analyzer" + }, +/turf/open/floor/plasteel/white, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"S" = ( +/obj/structure/table/glass, +/obj/item/storage/box/syringes, +/turf/open/floor/plasteel/white, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"T" = ( +/turf/closed/wall, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"U" = ( +/turf/open/floor/plating/airless{ + icon_state = "platingdmg2" + }, +/area/space/nearstation) +"V" = ( +/turf/closed/wall/r_wall/rust, +/area/space/nearstation) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +a +a +a +a +a +a +a +"} +(3,1,1) = {" +a +a +c +c +c +c +c +a +a +"} +(4,1,1) = {" +a +a +c +r +D +N +c +a +a +"} +(5,1,1) = {" +a +a +c +s +E +E +c +a +a +"} +(6,1,1) = {" +a +a +d +t +E +O +d +a +a +"} +(7,1,1) = {" +a +a +d +b +F +d +d +a +a +"} +(8,1,1) = {" +a +a +a +b +G +b +a +a +a +"} +(9,1,1) = {" +a +a +d +d +H +b +b +a +a +"} +(10,1,1) = {" +a +b +b +u +I +I +c +a +a +"} +(11,1,1) = {" +a +c +g +v +J +J +c +a +a +"} +(12,1,1) = {" +a +c +h +w +J +J +d +a +a +"} +(13,1,1) = {" +a +d +i +x +J +P +b +a +a +"} +(14,1,1) = {" +a +b +j +y +J +Q +c +a +a +"} +(15,1,1) = {" +a +b +k +x +J +R +c +a +a +"} +(16,1,1) = {" +a +e +l +x +J +S +d +a +a +"} +(17,1,1) = {" +a +d +m +z +J +J +d +a +a +"} +(18,1,1) = {" +a +d +n +A +K +T +b +a +a +"} +(19,1,1) = {" +a +f +o +B +p +C +V +a +a +"} +(20,1,1) = {" +a +f +p +p +C +U +M +a +a +"} +(21,1,1) = {" +a +d +q +C +L +M +a +a +a +"} +(22,1,1) = {" +a +a +b +f +M +a +a +a +a +"} +(23,1,1) = {" +a +a +a +a +a +a +a +a +a +"} diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 44fcce6253..bb07582dae 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -82,19 +82,18 @@ #define NOBLOOD 6 #define NOTRANSSTING 7 #define MUTCOLORS_PARTSONLY 8 //Used if we want the mutant colour to be only used by mutant bodyparts. Don't combine this with MUTCOLORS, or it will be useless. -#define NOCRITDAMAGE 9 -#define NOZOMBIE 10 -#define DIGITIGRADE 11 //Uses weird leg sprites. Optional for Lizards, required for ashwalkers. Don't give it to other races unless you make sprites for this (see human_parts_greyscale.dmi) -#define NO_UNDERWEAR 12 -#define NOLIVER 13 -#define NOSTOMACH 14 -#define NO_DNA_COPY 15 -#define DRINKSBLOOD 16 -#define SPECIES_ORGANIC 17 -#define SPECIES_INORGANIC 18 -#define SPECIES_UNDEAD 19 -#define SPECIES_ROBOTIC 20 -#define NOEYES 21 +#define NOZOMBIE 9 +#define DIGITIGRADE 10 //Uses weird leg sprites. Optional for Lizards, required for ashwalkers. Don't give it to other races unless you make sprites for this (see human_parts_greyscale.dmi) +#define NO_UNDERWEAR 11 +#define NOLIVER 12 +#define NOSTOMACH 13 +#define NO_DNA_COPY 14 +#define DRINKSBLOOD 15 +#define SPECIES_ORGANIC 16 +#define SPECIES_INORGANIC 17 +#define SPECIES_UNDEAD 18 +#define SPECIES_ROBOTIC 19 +#define NOEYES 20 #define ORGAN_SLOT_BRAIN "brain" #define ORGAN_SLOT_APPENDIX "appendix" diff --git a/code/__DEFINES/radio.dm b/code/__DEFINES/radio.dm index 97935d58b7..897d107939 100644 --- a/code/__DEFINES/radio.dm +++ b/code/__DEFINES/radio.dm @@ -1,55 +1,55 @@ -// Radios use a large variety of predefined frequencies. - -#define MIN_FREE_FREQ 1201 // ------------------------------------------------- -// Frequencies are always odd numbers and range from 1201 to 1599. - -#define FREQ_SYNDICATE 1213 // Nuke op comms frequency, dark brown -#define FREQ_CTF_RED 1215 // CTF red team comms frequency, red -#define FREQ_CTF_BLUE 1217 // CTF blue team comms frequency, blue -#define FREQ_CENTCOM 1337 // CentCom comms frequency, gray -#define FREQ_SUPPLY 1347 // Supply comms frequency, light brown -#define FREQ_SERVICE 1349 // Service comms frequency, green -#define FREQ_SCIENCE 1351 // Science comms frequency, plum -#define FREQ_COMMAND 1353 // Command comms frequency, gold -#define FREQ_MEDICAL 1355 // Medical comms frequency, soft blue -#define FREQ_ENGINEERING 1357 // Engineering comms frequency, orange -#define FREQ_SECURITY 1359 // Security comms frequency, red - -#define FREQ_STATUS_DISPLAYS 1435 -#define FREQ_ATMOS_ALARMS 1437 // air alarms <-> alert computers -#define FREQ_ATMOS_CONTROL 1439 // air alarms <-> vents and scrubbers - -#define MIN_FREQ 1441 // ------------------------------------------------------ -// Only the 1441 to 1489 range is freely available for general conversation. -// This represents 1/8th of the available spectrum. - -#define FREQ_ATMOS_STORAGE 1441 -#define FREQ_NAV_BEACON 1445 -#define FREQ_AI_PRIVATE 1447 // AI private comms frequency, magenta -#define FREQ_PRESSURE_PLATE 1447 -#define FREQ_AIRLOCK_CONTROL 1449 -#define FREQ_ELECTROPACK 1449 -#define FREQ_MAGNETS 1449 -#define FREQ_LOCATOR_IMPLANT 1451 -#define FREQ_SIGNALER 1457 // the default for new signalers -#define FREQ_COMMON 1459 // Common comms frequency, dark green - -#define MAX_FREQ 1489 // ------------------------------------------------------ - -#define MAX_FREE_FREQ 1599 // ------------------------------------------------- - -// Transmission types. -#define TRANSMISSION_WIRE 0 // some sort of wired connection, not used -#define TRANSMISSION_RADIO 1 // electromagnetic radiation (default) -#define TRANSMISSION_SUBSPACE 2 // subspace transmission (headsets only) -#define TRANSMISSION_SUPERSPACE 3 // reaches independent (CentCom) radios only - -// Filter types, used as an optimization to avoid unnecessary proc calls. -#define RADIO_TO_AIRALARM "to_airalarm" -#define RADIO_FROM_AIRALARM "from_airalarm" -#define RADIO_SIGNALER "signaler" -#define RADIO_ATMOSIA "atmosia" -#define RADIO_AIRLOCK "airlock" -#define RADIO_MAGNETS "magnets" - -#define DEFAULT_SIGNALER_CODE 30 +// Radios use a large variety of predefined frequencies. + +#define MIN_FREE_FREQ 1201 // ------------------------------------------------- +// Frequencies are always odd numbers and range from 1201 to 1599. + +#define FREQ_SYNDICATE 1213 // Nuke op comms frequency, dark brown +#define FREQ_CTF_RED 1215 // CTF red team comms frequency, red +#define FREQ_CTF_BLUE 1217 // CTF blue team comms frequency, blue +#define FREQ_CENTCOM 1337 // CentCom comms frequency, gray +#define FREQ_SUPPLY 1347 // Supply comms frequency, light brown +#define FREQ_SERVICE 1349 // Service comms frequency, green +#define FREQ_SCIENCE 1351 // Science comms frequency, plum +#define FREQ_COMMAND 1353 // Command comms frequency, gold +#define FREQ_MEDICAL 1355 // Medical comms frequency, soft blue +#define FREQ_ENGINEERING 1357 // Engineering comms frequency, orange +#define FREQ_SECURITY 1359 // Security comms frequency, red + +#define FREQ_STATUS_DISPLAYS 1435 +#define FREQ_ATMOS_ALARMS 1437 // air alarms <-> alert computers +#define FREQ_ATMOS_CONTROL 1439 // air alarms <-> vents and scrubbers + +#define MIN_FREQ 1441 // ------------------------------------------------------ +// Only the 1441 to 1489 range is freely available for general conversation. +// This represents 1/8th of the available spectrum. + +#define FREQ_ATMOS_STORAGE 1441 +#define FREQ_NAV_BEACON 1445 +#define FREQ_AI_PRIVATE 1447 // AI private comms frequency, magenta +#define FREQ_PRESSURE_PLATE 1447 +#define FREQ_AIRLOCK_CONTROL 1449 +#define FREQ_ELECTROPACK 1449 +#define FREQ_MAGNETS 1449 +#define FREQ_LOCATOR_IMPLANT 1451 +#define FREQ_SIGNALER 1457 // the default for new signalers +#define FREQ_COMMON 1459 // Common comms frequency, dark green + +#define MAX_FREQ 1489 // ------------------------------------------------------ + +#define MAX_FREE_FREQ 1599 // ------------------------------------------------- + +// Transmission types. +#define TRANSMISSION_WIRE 0 // some sort of wired connection, not used +#define TRANSMISSION_RADIO 1 // electromagnetic radiation (default) +#define TRANSMISSION_SUBSPACE 2 // subspace transmission (headsets only) +#define TRANSMISSION_SUPERSPACE 3 // reaches independent (CentCom) radios only + +// Filter types, used as an optimization to avoid unnecessary proc calls. +#define RADIO_TO_AIRALARM "to_airalarm" +#define RADIO_FROM_AIRALARM "from_airalarm" +#define RADIO_SIGNALER "signaler" +#define RADIO_ATMOSIA "atmosia" +#define RADIO_AIRLOCK "airlock" +#define RADIO_MAGNETS "magnets" + +#define DEFAULT_SIGNALER_CODE 30 diff --git a/code/__DEFINES/sight.dm b/code/__DEFINES/sight.dm index cfce95a65f..e307e8dd69 100644 --- a/code/__DEFINES/sight.dm +++ b/code/__DEFINES/sight.dm @@ -1,30 +1,30 @@ -#define SEE_INVISIBLE_MINIMUM 5 - -#define INVISIBILITY_LIGHTING 20 - -#define SEE_INVISIBLE_LIVING 25 - -//#define SEE_INVISIBLE_LEVEL_ONE 35 //currently unused -//#define INVISIBILITY_LEVEL_ONE 35 //currently unused - -//#define SEE_INVISIBLE_LEVEL_TWO 45 //currently unused -//#define INVISIBILITY_LEVEL_TWO 45 //currently unused - -#define INVISIBILITY_OBSERVER 60 -#define SEE_INVISIBLE_OBSERVER 60 - -#define INVISIBILITY_MAXIMUM 100 //the maximum allowed for "real" objects - -#define INVISIBILITY_ABSTRACT 101 //only used for abstract objects (e.g. spacevine_controller), things that are not really there. - -#define BORGMESON 1 -#define BORGTHERM 2 -#define BORGXRAY 4 -#define BORGMATERIAL 8 - -//for clothing visor toggles, these determine which vars to toggle -#define VISOR_FLASHPROTECT 1 -#define VISOR_TINT 2 -#define VISOR_VISIONFLAGS 4 //all following flags only matter for glasses -#define VISOR_DARKNESSVIEW 8 -#define VISOR_INVISVIEW 16 +#define SEE_INVISIBLE_MINIMUM 5 + +#define INVISIBILITY_LIGHTING 20 + +#define SEE_INVISIBLE_LIVING 25 + +//#define SEE_INVISIBLE_LEVEL_ONE 35 //currently unused +//#define INVISIBILITY_LEVEL_ONE 35 //currently unused + +//#define SEE_INVISIBLE_LEVEL_TWO 45 //currently unused +//#define INVISIBILITY_LEVEL_TWO 45 //currently unused + +#define INVISIBILITY_OBSERVER 60 +#define SEE_INVISIBLE_OBSERVER 60 + +#define INVISIBILITY_MAXIMUM 100 //the maximum allowed for "real" objects + +#define INVISIBILITY_ABSTRACT 101 //only used for abstract objects (e.g. spacevine_controller), things that are not really there. + +#define BORGMESON 1 +#define BORGTHERM 2 +#define BORGXRAY 4 +#define BORGMATERIAL 8 + +//for clothing visor toggles, these determine which vars to toggle +#define VISOR_FLASHPROTECT 1 +#define VISOR_TINT 2 +#define VISOR_VISIONFLAGS 4 //all following flags only matter for glasses +#define VISOR_DARKNESSVIEW 8 +#define VISOR_INVISVIEW 16 diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 6bc504d48a..854ea01114 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -21,6 +21,7 @@ #define TRAIT_SLEEPIMMUNE "sleep_immunity" #define TRAIT_PUSHIMMUNE "push_immunity" #define TRAIT_SHOCKIMMUNE "shock_immunity" +#define TRAIT_STABLEHEART "stable_heart" #define TRAIT_RESISTHEAT "resist_heat" #define TRAIT_RESISTCOLD "resist_cold" #define TRAIT_RESISTHIGHPRESSURE "resist_high_pressure" @@ -38,6 +39,7 @@ #define TRAIT_NOBREATH "no_breath" #define TRAIT_ANTIMAGIC "anti_magic" #define TRAIT_HOLY "holy" +#define TRAIT_NOCRITDAMAGE "no_crit" #define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance" #define TRAIT_AGEUSIA "ageusia" @@ -71,4 +73,4 @@ #define TRAIT_HULK "hulk" #define STASIS_MUTE "stasis" #define GENETICS_SPELL "genetics_spell" -#define EYES_COVERED "eyes_covered" \ No newline at end of file +#define EYES_COVERED "eyes_covered" diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm index eed23e0711..eea4088905 100644 --- a/code/datums/ruins/space.dm +++ b/code/datums/ruins/space.dm @@ -280,4 +280,10 @@ suffix = "mrow_thats_right.dmm" name = "Feline-Human Combination Den" description = "With heated debates over the legality of the catperson and their status in the workforce, there's always a place for the blackmarket to slip in for some cash. Whether the results \ - are morally sound or not is another issue entirely." \ No newline at end of file + are morally sound or not is another issue entirely." + +/datum/map_template/ruin/space/cloning_facility + id = "cloning_facility" + suffix = "cloning_facility.dmm" + name = "Ancient Cloning Lab" + description = "An experimental cloning lab snapped off from an ancient ship. The cloner model inside lacks many modern functionalities and security measures." \ No newline at end of file diff --git a/code/game/area/areas/ruins/space.dm b/code/game/area/areas/ruins/space.dm index 0f57c0ce3b..13b9905874 100644 --- a/code/game/area/areas/ruins/space.dm +++ b/code/game/area/areas/ruins/space.dm @@ -466,4 +466,8 @@ /area/ruin/space/has_grav/powered/scp_294 name = "Abandoned SCP-294 Containment" + icon_state = "yellow" + +/area/ruin/space/has_grav/powered/ancient_shuttle + name = "Ancient Shuttle" icon_state = "yellow" \ No newline at end of file diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index b46706ce9f..048cac8326 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -29,6 +29,7 @@ var/datum/mind/clonemind var/grab_ghost_when = CLONER_MATURE_CLONE + var/internal_radio = TRUE var/obj/item/device/radio/radio var/radio_key = /obj/item/device/encryptionkey/headset_med var/radio_channel = "Medical" @@ -38,24 +39,17 @@ var/list/unattached_flesh var/flesh_number = 0 - // The "brine" is the reagents that are automatically added in small - // amounts to the occupant. - var/static/list/brine_types = list( - "salbutamol", // anti-oxyloss - "bicaridine", // NOBREATHE species take brute in crit - "corazone", // prevents cardiac arrest and liver failure damage - "mimesbane", // stops them gasping from lack of air. - "mutetoxin") // stops them from killing themselves BY DEATHWHISPERING INSIDE A CLONE POD NICE JOB BREAKING IT HERO /obj/machinery/clonepod/Initialize() . = ..() countdown = new(src) - radio = new(src) - radio.keyslot = new radio_key - radio.subspace_transmission = TRUE - radio.canhear_range = 0 - radio.recalculateChannels() + if(internal_radio) + radio = new(src) + radio.keyslot = new radio_key + radio.subspace_transmission = TRUE + radio.canhear_range = 0 + radio.recalculateChannels() /obj/machinery/clonepod/Destroy() go_out() @@ -116,7 +110,7 @@ /obj/machinery/clonepod/return_air() // We want to simulate the clone not being in contact with // the atmosphere, so we'll put them in a constant pressure - // nitrogen. They'll breathe through the chemicals we pump into them. + // nitrogen. They don't need to breathe while cloning anyway. var/static/datum/gas_mixture/immutable/cloner/GM //global so that there's only one instance made for all cloning pods if(!GM) GM = new @@ -184,7 +178,11 @@ icon_state = "pod_1" //Get the clone body ready maim_clone(H) - check_brine() // put in chemicals NOW to stop death via cardiac arrest + H.add_trait(TRAIT_STABLEHEART, "cloning") + H.add_trait(TRAIT_EMOTEMUTE, "cloning") + H.add_trait(TRAIT_MUTE, "cloning") + H.add_trait(TRAIT_NOBREATH, "cloning") + H.add_trait(TRAIT_NOCRITDAMAGE, "cloning") H.Unconscious(80) clonemind.transfer_to(H) @@ -219,8 +217,9 @@ else if(mob_occupant && (mob_occupant.loc == src)) if((mob_occupant.stat == DEAD) || (mob_occupant.suiciding) || mob_occupant.hellbound) //Autoeject corpses and suiciding dudes. connected_message("Clone Rejected: Deceased.") - SPEAK("The cloning of [mob_occupant.real_name] has been \ - aborted due to unrecoverable tissue failure.") + if(internal_radio) + SPEAK("The cloning of [mob_occupant.real_name] has been \ + aborted due to unrecoverable tissue failure.") go_out() mob_occupant.apply_vore_prefs() @@ -248,13 +247,12 @@ //Premature clones may have brain damage. mob_occupant.adjustBrainLoss(-((speed_coeff / 2) * dmg_mult)) - check_brine() - use_power(7500) //This might need tweaking. else if((mob_occupant.cloneloss <= (100 - heal_level))) connected_message("Cloning Process Complete.") - SPEAK("The cloning cycle of [mob_occupant.real_name] is complete.") + if(internal_radio) + SPEAK("The cloning cycle of [mob_occupant.real_name] is complete.") // If the cloner is upgraded to debugging high levels, sometimes // organs and limbs can be missing. @@ -356,6 +354,11 @@ if(!mob_occupant) return + mob_occupant.remove_trait(TRAIT_STABLEHEART, "cloning") + mob_occupant.remove_trait(TRAIT_EMOTEMUTE, "cloning") + mob_occupant.remove_trait(TRAIT_MUTE, "cloning") + mob_occupant.remove_trait(TRAIT_NOCRITDAMAGE, "cloning") + mob_occupant.remove_trait(TRAIT_NOBREATH, "cloning") if(grab_ghost_when == CLONER_MATURE_CLONE) mob_occupant.grab_ghost() @@ -459,15 +462,6 @@ flesh_number = unattached_flesh.len -/obj/machinery/clonepod/proc/check_brine() - // Clones are in a pickled bath of mild chemicals, keeping - // them alive, despite their lack of internal organs - for(var/bt in brine_types) - if(bt == "corazone" && occupant.reagents.get_reagent_amount(bt) < 2) - occupant.reagents.add_reagent(bt, 2)//pump it full of extra corazone as a safety, you can't OD on corazone. - else if(occupant.reagents.get_reagent_amount(bt) < 1) - occupant.reagents.add_reagent(bt, 1) - /* * Manual -- A big ol' manual. */ diff --git a/code/game/machinery/exp_cloner.dm b/code/game/machinery/exp_cloner.dm new file mode 100644 index 0000000000..27618668fa --- /dev/null +++ b/code/game/machinery/exp_cloner.dm @@ -0,0 +1,297 @@ +//Experimental cloner; clones a body regardless of the owner's status, letting a ghost control it instead +/obj/machinery/clonepod/experimental + name = "experimental cloning pod" + desc = "An ancient cloning pod. It seems to be an early prototype of the experimental cloners used in Nanotrasen Stations." + icon = 'icons/obj/machines/cloning.dmi' + icon_state = "pod_0" + req_access = null + circuit = /obj/item/circuitboard/machine/clonepod/experimental + internal_radio = FALSE + +//Start growing a human clone in the pod! +/obj/machinery/clonepod/experimental/growclone(clonename, ui, se, datum/species/mrace, list/features, factions) + if(panel_open) + return FALSE + if(mess || attempting) + return FALSE + + attempting = TRUE //One at a time!! + countdown.start() + + var/mob/living/carbon/human/H = new /mob/living/carbon/human(src) + + H.hardset_dna(ui, se, H.real_name, null, mrace, features) + + if(efficiency > 2) + var/list/unclean_mutations = (GLOB.not_good_mutations|GLOB.bad_mutations) + H.dna.remove_mutation_group(unclean_mutations) + if(efficiency > 5 && prob(20)) + H.randmutvg() + if(efficiency < 3 && prob(50)) + var/mob/M = H.randmutb() + if(ismob(M)) + H = M + + H.silent = 20 //Prevents an extreme edge case where clones could speak if they said something at exactly the right moment. + occupant = H + + if(!clonename) //to prevent null names + clonename = "clone ([rand(0,999)])" + H.real_name = clonename + + icon_state = "pod_1" + //Get the clone body ready + maim_clone(H) + H.add_trait(TRAIT_STABLEHEART, "cloning") + H.add_trait(TRAIT_EMOTEMUTE, "cloning") + H.add_trait(TRAIT_MUTE, "cloning") + H.add_trait(TRAIT_NOBREATH, "cloning") + H.add_trait(TRAIT_NOCRITDAMAGE, "cloning") + H.Unconscious(80) + + var/list/candidates = pollCandidatesForMob("Do you want to play as [clonename]'s defective clone?", null, null, null, 100, H) + if(LAZYLEN(candidates)) + var/mob/dead/observer/C = pick(candidates) + H.key = C.key + + if(grab_ghost_when == CLONER_FRESH_CLONE) + H.grab_ghost() + to_chat(H, "Consciousness slowly creeps over you as your body regenerates.
So this is what cloning feels like?
") + + if(grab_ghost_when == CLONER_MATURE_CLONE) + H.ghostize(TRUE) //Only does anything if they were still in their old body and not already a ghost + to_chat(H.get_ghost(TRUE), "Your body is beginning to regenerate in a cloning pod. You will become conscious when it is complete.") + + if(H) + H.faction |= factions + + H.set_cloned_appearance() + + H.suiciding = FALSE + attempting = FALSE + return TRUE + + +//Prototype cloning console, much more rudimental and lacks modern functions such as saving records, autocloning, or safety checks. +/obj/machinery/computer/prototype_cloning + name = "prototype cloning console" + desc = "Used to operate an experimental cloner." + icon_screen = "dna" + icon_keyboard = "med_key" + circuit = /obj/item/circuitboard/computer/prototype_cloning + var/obj/machinery/dna_scannernew/scanner = null //Linked scanner. For scanning. + var/list/pods //Linked experimental cloning pods + var/temp = "Inactive" + var/scantemp = "Ready to Scan" + var/loading = FALSE // Nice loading text + + light_color = LIGHT_COLOR_BLUE + +/obj/machinery/computer/prototype_cloning/Initialize() + . = ..() + updatemodules(TRUE) + +/obj/machinery/computer/prototype_cloning/Destroy() + if(pods) + for(var/P in pods) + DetachCloner(P) + pods = null + return ..() + +/obj/machinery/computer/prototype_cloning/proc/GetAvailablePod(mind = null) + if(pods) + for(var/P in pods) + var/obj/machinery/clonepod/experimental/pod = P + if(pod.is_operational() && !(pod.occupant || pod.mess)) + return pod + +/obj/machinery/computer/prototype_cloning/proc/updatemodules(findfirstcloner) + scanner = findscanner() + if(findfirstcloner && !LAZYLEN(pods)) + findcloner() + +/obj/machinery/computer/prototype_cloning/proc/findscanner() + var/obj/machinery/dna_scannernew/scannerf = null + + // Loop through every direction + for(var/direction in GLOB.cardinals) + // Try to find a scanner in that direction + scannerf = locate(/obj/machinery/dna_scannernew, get_step(src, direction)) + // If found and operational, return the scanner + if (!isnull(scannerf) && scannerf.is_operational()) + return scannerf + + // If no scanner was found, it will return null + return null + +/obj/machinery/computer/prototype_cloning/proc/findcloner() + var/obj/machinery/clonepod/experimental/podf = null + for(var/direction in GLOB.cardinals) + podf = locate(/obj/machinery/clonepod/experimental, get_step(src, direction)) + if (!isnull(podf) && podf.is_operational()) + AttachCloner(podf) + +/obj/machinery/computer/prototype_cloning/proc/AttachCloner(obj/machinery/clonepod/experimental/pod) + if(!pod.connected) + pod.connected = src + LAZYADD(pods, pod) + +/obj/machinery/computer/prototype_cloning/proc/DetachCloner(obj/machinery/clonepod/experimental/pod) + pod.connected = null + LAZYREMOVE(pods, pod) + +/obj/machinery/computer/prototype_cloning/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/device/multitool)) + var/obj/item/device/multitool/P = W + + if(istype(P.buffer, /obj/machinery/clonepod/experimental)) + if(get_area(P.buffer) != get_area(src)) + to_chat(user, "-% Cannot link machines across power zones. Buffer cleared %-") + P.buffer = null + return + to_chat(user, "-% Successfully linked [P.buffer] with [src] %-") + var/obj/machinery/clonepod/experimental/pod = P.buffer + if(pod.connected) + pod.connected.DetachCloner(pod) + AttachCloner(pod) + else + P.buffer = src + to_chat(user, "-% Successfully stored [REF(P.buffer)] [P.buffer.name] in buffer %-") + return + else + return ..() + +/obj/machinery/computer/prototype_cloning/attack_hand(mob/user) + if(..()) + return + interact(user) + +/obj/machinery/computer/prototype_cloning/interact(mob/user) + user.set_machine(src) + add_fingerprint(user) + + if(..()) + return + + updatemodules(TRUE) + + var/dat = "" + dat += "Refresh" + + dat += "

Cloning Pod Status

" + dat += "
[temp] 
" + + if (isnull(src.scanner) || !LAZYLEN(pods)) + dat += "

Modules

" + //dat += "Reload Modules" + if (isnull(src.scanner)) + dat += "ERROR: No Scanner detected!
" + if (!LAZYLEN(pods)) + dat += "ERROR: No Pod detected
" + + // Scan-n-Clone + if (!isnull(src.scanner)) + var/mob/living/scanner_occupant = get_mob_or_brainmob(scanner.occupant) + + dat += "

Cloning

" + + dat += "
" + if(!scanner_occupant) + dat += "Scanner Unoccupied" + else if(loading) + dat += "[scanner_occupant] => Scanning..." + else + scantemp = "Ready to Clone" + dat += "[scanner_occupant] => [scantemp]" + dat += "
" + + if(scanner_occupant) + dat += "Clone" + dat += "
[src.scanner.locked ? "Unlock Scanner" : "Lock Scanner"]" + else + dat += "Clone" + + var/datum/browser/popup = new(user, "cloning", "Prototype Cloning System Control") + popup.set_content(dat) + popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() + +/obj/machinery/computer/prototype_cloning/Topic(href, href_list) + if(..()) + return + + if(loading) + return + + else if ((href_list["clone"]) && !isnull(scanner) && scanner.is_operational()) + scantemp = "" + + loading = TRUE + updateUsrDialog() + playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0) + say("Initiating scan...") + + spawn(20) + clone_occupant(scanner.occupant) + loading = FALSE + updateUsrDialog() + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) + + //No locking an open scanner. + else if ((href_list["lock"]) && !isnull(scanner) && scanner.is_operational()) + if ((!scanner.locked) && (scanner.occupant)) + scanner.locked = TRUE + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + else + scanner.locked = FALSE + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) + + else if (href_list["refresh"]) + updateUsrDialog() + playsound(src, "terminal_type", 25, 0) + + add_fingerprint(usr) + updateUsrDialog() + return + +/obj/machinery/computer/prototype_cloning/proc/clone_occupant(occupant) + var/mob/living/mob_occupant = get_mob_or_brainmob(occupant) + var/datum/dna/dna + if(ishuman(mob_occupant)) + var/mob/living/carbon/C = mob_occupant + dna = C.has_dna() + if(isbrain(mob_occupant)) + var/mob/living/brain/B = mob_occupant + dna = B.stored_dna + + if(!istype(dna)) + scantemp = "Unable to locate valid genetic data." + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + return + if((mob_occupant.has_trait(TRAIT_NOCLONE)) && (src.scanner.scan_level < 2)) + scantemp = "Subject no longer contains the fundamental materials required to create a living clone." + playsound(src, 'sound/machines/terminal_alert.ogg', 50, 0) + return + + var/clone_species + if(dna.species) + clone_species = dna.species + else + var/datum/species/rando_race = pick(GLOB.roundstart_races) + clone_species = rando_race.type + + var/obj/machinery/clonepod/pod = GetAvailablePod() + //Can't clone without someone to clone. Or a pod. Or if the pod is busy. Or full of gibs. + if(!LAZYLEN(pods)) + temp = "No Clonepods detected." + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + else if(!pod) + temp = "No Clonepods available." + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + else if(pod.occupant) + temp = "Cloning cycle already in progress." + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + else + pod.growclone(mob_occupant.real_name, dna.uni_identity, dna.struc_enzymes, clone_species, dna.features, mob_occupant.faction) + temp = "[mob_occupant.real_name] => Cloning data sent to pod." + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) \ No newline at end of file diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index 24038d9c69..f3c047715e 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -111,6 +111,10 @@ name = "Cloning (Computer Board)" build_path = /obj/machinery/computer/cloning +/obj/item/circuitboard/computer/prototype_cloning + name = "Prototype Cloning (Computer Board)" + build_path = /obj/machinery/computer/prototype_cloning + /obj/item/circuitboard/computer/arcade/battle name = "Arcade Battle (Computer Board)" build_path = /obj/machinery/computer/arcade/battle diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index bb0357b4b1..5fc4bf7068 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -31,6 +31,10 @@ /obj/item/stock_parts/manipulator = 2, /obj/item/stack/sheet/glass = 1) +/obj/item/circuitboard/machine/clonepod/experimental + name = "Experimental Clone Pod (Machine Board)" + build_path = /obj/machinery/clonepod/experimental + /obj/item/circuitboard/machine/abductor name = "alien board (Report This)" icon_state = "abductor_mod" diff --git a/code/game/objects/structures/crates_lockers/closets/fitness.dm b/code/game/objects/structures/crates_lockers/closets/fitness.dm index e4dd78a8d6..2a17e0038c 100644 --- a/code/game/objects/structures/crates_lockers/closets/fitness.dm +++ b/code/game/objects/structures/crates_lockers/closets/fitness.dm @@ -1,65 +1,65 @@ -/obj/structure/closet/athletic_mixed - name = "athletic wardrobe" - desc = "It's a storage unit for athletic wear." - icon_door = "mixed" - -/obj/structure/closet/athletic_mixed/PopulateContents() - ..() - new /obj/item/clothing/under/shorts/purple(src) - new /obj/item/clothing/under/shorts/grey(src) - new /obj/item/clothing/under/shorts/black(src) - new /obj/item/clothing/under/shorts/red(src) - new /obj/item/clothing/under/shorts/blue(src) - new /obj/item/clothing/under/shorts/green(src) - new /obj/item/clothing/under/jabroni(src) - - -/obj/structure/closet/boxinggloves - name = "boxing gloves" - desc = "It's a storage unit for gloves for use in the boxing ring." - -/obj/structure/closet/boxinggloves/PopulateContents() - ..() - new /obj/item/clothing/gloves/boxing/blue(src) - new /obj/item/clothing/gloves/boxing/green(src) - new /obj/item/clothing/gloves/boxing/yellow(src) - new /obj/item/clothing/gloves/boxing(src) - - -/obj/structure/closet/masks - name = "mask closet" - desc = "IT'S A STORAGE UNIT FOR FIGHTER MASKS OLE!" - -/obj/structure/closet/masks/PopulateContents() - ..() - new /obj/item/clothing/mask/luchador(src) - new /obj/item/clothing/mask/luchador/rudos(src) - new /obj/item/clothing/mask/luchador/tecnicos(src) - - -/obj/structure/closet/lasertag/red - name = "red laser tag equipment" - desc = "It's a storage unit for laser tag equipment." - icon_door = "red" - -/obj/structure/closet/lasertag/red/PopulateContents() - ..() - for(var/i in 1 to 3) - new /obj/item/gun/energy/laser/redtag(src) - for(var/i in 1 to 3) - new /obj/item/clothing/suit/redtag(src) - new /obj/item/clothing/head/helmet/redtaghelm(src) - - -/obj/structure/closet/lasertag/blue - name = "blue laser tag equipment" - desc = "It's a storage unit for laser tag equipment." - icon_door = "blue" - -/obj/structure/closet/lasertag/blue/PopulateContents() - ..() - for(var/i in 1 to 3) - new /obj/item/gun/energy/laser/bluetag(src) - for(var/i in 1 to 3) - new /obj/item/clothing/suit/bluetag(src) +/obj/structure/closet/athletic_mixed + name = "athletic wardrobe" + desc = "It's a storage unit for athletic wear." + icon_door = "mixed" + +/obj/structure/closet/athletic_mixed/PopulateContents() + ..() + new /obj/item/clothing/under/shorts/purple(src) + new /obj/item/clothing/under/shorts/grey(src) + new /obj/item/clothing/under/shorts/black(src) + new /obj/item/clothing/under/shorts/red(src) + new /obj/item/clothing/under/shorts/blue(src) + new /obj/item/clothing/under/shorts/green(src) + new /obj/item/clothing/under/jabroni(src) + + +/obj/structure/closet/boxinggloves + name = "boxing gloves" + desc = "It's a storage unit for gloves for use in the boxing ring." + +/obj/structure/closet/boxinggloves/PopulateContents() + ..() + new /obj/item/clothing/gloves/boxing/blue(src) + new /obj/item/clothing/gloves/boxing/green(src) + new /obj/item/clothing/gloves/boxing/yellow(src) + new /obj/item/clothing/gloves/boxing(src) + + +/obj/structure/closet/masks + name = "mask closet" + desc = "IT'S A STORAGE UNIT FOR FIGHTER MASKS OLE!" + +/obj/structure/closet/masks/PopulateContents() + ..() + new /obj/item/clothing/mask/luchador(src) + new /obj/item/clothing/mask/luchador/rudos(src) + new /obj/item/clothing/mask/luchador/tecnicos(src) + + +/obj/structure/closet/lasertag/red + name = "red laser tag equipment" + desc = "It's a storage unit for laser tag equipment." + icon_door = "red" + +/obj/structure/closet/lasertag/red/PopulateContents() + ..() + for(var/i in 1 to 3) + new /obj/item/gun/energy/laser/redtag(src) + for(var/i in 1 to 3) + new /obj/item/clothing/suit/redtag(src) + new /obj/item/clothing/head/helmet/redtaghelm(src) + + +/obj/structure/closet/lasertag/blue + name = "blue laser tag equipment" + desc = "It's a storage unit for laser tag equipment." + icon_door = "blue" + +/obj/structure/closet/lasertag/blue/PopulateContents() + ..() + for(var/i in 1 to 3) + new /obj/item/gun/energy/laser/bluetag(src) + for(var/i in 1 to 3) + new /obj/item/clothing/suit/bluetag(src) new /obj/item/clothing/head/helmet/bluetaghelm(src) \ No newline at end of file diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index 5e06851e58..2ffe64f327 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -1,142 +1,142 @@ -/obj/item/device/assembly/mousetrap - name = "mousetrap" - desc = "A handy little spring-loaded trap for catching pesty rodents." - icon_state = "mousetrap" - materials = list(MAT_METAL=100) - attachable = 1 - var/armed = 0 - - -/obj/item/device/assembly/mousetrap/examine(mob/user) - ..() - if(armed) - to_chat(user, "The mousetrap is armed!") - else - to_chat(user, "The mousetrap is not armed.") - -/obj/item/device/assembly/mousetrap/activate() - if(..()) - armed = !armed - if(!armed) - if(ishuman(usr)) - var/mob/living/carbon/human/user = usr - if((user.has_trait(TRAIT_DUMB) || user.has_trait(TRAIT_CLUMSY)) && prob(50)) - to_chat(user, "Your hand slips, setting off the trigger!") - pulse(0) - update_icon() - if(usr) - playsound(usr.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3) - -/obj/item/device/assembly/mousetrap/describe() - return "The pressure switch is [armed?"primed":"safe"]." - -/obj/item/device/assembly/mousetrap/update_icon() - if(armed) - icon_state = "mousetraparmed" - else - icon_state = "mousetrap" - if(holder) - holder.update_icon() - -/obj/item/device/assembly/mousetrap/proc/triggered(mob/target, type = "feet") - if(!armed) - return - var/obj/item/bodypart/affecting = null - if(ishuman(target)) - var/mob/living/carbon/human/H = target - if(H.has_trait(TRAIT_PIERCEIMMUNE)) - playsound(src.loc, 'sound/effects/snap.ogg', 50, 1) - armed = 0 - update_icon() - pulse(0) - return 0 - switch(type) - if("feet") - if(!H.shoes) - affecting = H.get_bodypart(pick("l_leg", "r_leg")) - H.Knockdown(60) - if("l_hand", "r_hand") - if(!H.gloves) - affecting = H.get_bodypart(type) - H.Stun(60) - if(affecting) - if(affecting.receive_damage(1, 0)) - H.update_damage_overlays() - else if(ismouse(target)) - var/mob/living/simple_animal/mouse/M = target - visible_message("SPLAT!") - M.splat() - playsound(src.loc, 'sound/effects/snap.ogg', 50, 1) - armed = 0 - update_icon() - pulse(0) - - -/obj/item/device/assembly/mousetrap/attack_self(mob/living/carbon/human/user) - if(!armed) - to_chat(user, "You arm [src].") - else - if((user.has_trait(TRAIT_DUMB) || user.has_trait(TRAIT_CLUMSY)) && prob(50)) - var/which_hand = "l_hand" - if(!(user.active_hand_index % 2)) - which_hand = "r_hand" - triggered(user, which_hand) - user.visible_message("[user] accidentally sets off [src], breaking their fingers.", \ - "You accidentally trigger [src]!") - return - to_chat(user, "You disarm [src].") - armed = !armed - update_icon() - playsound(user.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3) - - -/obj/item/device/assembly/mousetrap/attack_hand(mob/living/carbon/human/user) - if(armed) - if((user.has_trait(TRAIT_DUMB) || user.has_trait(TRAIT_CLUMSY)) && prob(50)) - var/which_hand = "l_hand" - if(!(user.active_hand_index % 2)) - which_hand = "r_hand" - triggered(user, which_hand) - user.visible_message("[user] accidentally sets off [src], breaking their fingers.", \ - "You accidentally trigger [src]!") - return - ..() - - -/obj/item/device/assembly/mousetrap/Crossed(atom/movable/AM as mob|obj) - if(armed) - if(ismob(AM)) - var/mob/MM = AM - if(!(MM.movement_type & FLYING)) - if(ishuman(AM)) - var/mob/living/carbon/H = AM - if(H.m_intent == MOVE_INTENT_RUN) - triggered(H) - H.visible_message("[H] accidentally steps on [src].", \ - "You accidentally step on [src]") - else if(ismouse(MM)) - triggered(MM) - else if(AM.density) // For mousetrap grenades, set off by anything heavy - triggered(AM) - ..() - - -/obj/item/device/assembly/mousetrap/on_found(mob/finder) - if(armed) - finder.visible_message("[finder] accidentally sets off [src], breaking their fingers.", \ - "You accidentally trigger [src]!") - triggered(finder, (finder.active_hand_index % 2 == 0) ? "r_hand" : "l_hand") - return 1 //end the search! - return 0 - - -/obj/item/device/assembly/mousetrap/hitby(A as mob|obj) - if(!armed) - return ..() - visible_message("[src] is triggered by [A].") - triggered(null) - - -/obj/item/device/assembly/mousetrap/armed - icon_state = "mousetraparmed" - armed = 1 +/obj/item/device/assembly/mousetrap + name = "mousetrap" + desc = "A handy little spring-loaded trap for catching pesty rodents." + icon_state = "mousetrap" + materials = list(MAT_METAL=100) + attachable = 1 + var/armed = 0 + + +/obj/item/device/assembly/mousetrap/examine(mob/user) + ..() + if(armed) + to_chat(user, "The mousetrap is armed!") + else + to_chat(user, "The mousetrap is not armed.") + +/obj/item/device/assembly/mousetrap/activate() + if(..()) + armed = !armed + if(!armed) + if(ishuman(usr)) + var/mob/living/carbon/human/user = usr + if((user.has_trait(TRAIT_DUMB) || user.has_trait(TRAIT_CLUMSY)) && prob(50)) + to_chat(user, "Your hand slips, setting off the trigger!") + pulse(0) + update_icon() + if(usr) + playsound(usr.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3) + +/obj/item/device/assembly/mousetrap/describe() + return "The pressure switch is [armed?"primed":"safe"]." + +/obj/item/device/assembly/mousetrap/update_icon() + if(armed) + icon_state = "mousetraparmed" + else + icon_state = "mousetrap" + if(holder) + holder.update_icon() + +/obj/item/device/assembly/mousetrap/proc/triggered(mob/target, type = "feet") + if(!armed) + return + var/obj/item/bodypart/affecting = null + if(ishuman(target)) + var/mob/living/carbon/human/H = target + if(H.has_trait(TRAIT_PIERCEIMMUNE)) + playsound(src.loc, 'sound/effects/snap.ogg', 50, 1) + armed = 0 + update_icon() + pulse(0) + return 0 + switch(type) + if("feet") + if(!H.shoes) + affecting = H.get_bodypart(pick("l_leg", "r_leg")) + H.Knockdown(60) + if("l_hand", "r_hand") + if(!H.gloves) + affecting = H.get_bodypart(type) + H.Stun(60) + if(affecting) + if(affecting.receive_damage(1, 0)) + H.update_damage_overlays() + else if(ismouse(target)) + var/mob/living/simple_animal/mouse/M = target + visible_message("SPLAT!") + M.splat() + playsound(src.loc, 'sound/effects/snap.ogg', 50, 1) + armed = 0 + update_icon() + pulse(0) + + +/obj/item/device/assembly/mousetrap/attack_self(mob/living/carbon/human/user) + if(!armed) + to_chat(user, "You arm [src].") + else + if((user.has_trait(TRAIT_DUMB) || user.has_trait(TRAIT_CLUMSY)) && prob(50)) + var/which_hand = "l_hand" + if(!(user.active_hand_index % 2)) + which_hand = "r_hand" + triggered(user, which_hand) + user.visible_message("[user] accidentally sets off [src], breaking their fingers.", \ + "You accidentally trigger [src]!") + return + to_chat(user, "You disarm [src].") + armed = !armed + update_icon() + playsound(user.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3) + + +/obj/item/device/assembly/mousetrap/attack_hand(mob/living/carbon/human/user) + if(armed) + if((user.has_trait(TRAIT_DUMB) || user.has_trait(TRAIT_CLUMSY)) && prob(50)) + var/which_hand = "l_hand" + if(!(user.active_hand_index % 2)) + which_hand = "r_hand" + triggered(user, which_hand) + user.visible_message("[user] accidentally sets off [src], breaking their fingers.", \ + "You accidentally trigger [src]!") + return + ..() + + +/obj/item/device/assembly/mousetrap/Crossed(atom/movable/AM as mob|obj) + if(armed) + if(ismob(AM)) + var/mob/MM = AM + if(!(MM.movement_type & FLYING)) + if(ishuman(AM)) + var/mob/living/carbon/H = AM + if(H.m_intent == MOVE_INTENT_RUN) + triggered(H) + H.visible_message("[H] accidentally steps on [src].", \ + "You accidentally step on [src]") + else if(ismouse(MM)) + triggered(MM) + else if(AM.density) // For mousetrap grenades, set off by anything heavy + triggered(AM) + ..() + + +/obj/item/device/assembly/mousetrap/on_found(mob/finder) + if(armed) + finder.visible_message("[finder] accidentally sets off [src], breaking their fingers.", \ + "You accidentally trigger [src]!") + triggered(finder, (finder.active_hand_index % 2 == 0) ? "r_hand" : "l_hand") + return 1 //end the search! + return 0 + + +/obj/item/device/assembly/mousetrap/hitby(A as mob|obj) + if(!armed) + return ..() + visible_message("[src] is triggered by [A].") + triggered(null) + + +/obj/item/device/assembly/mousetrap/armed + icon_state = "mousetraparmed" + armed = 1 diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 5e4db79e89..030501066e 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -97,7 +97,7 @@ if(!L) if(health >= HEALTH_THRESHOLD_CRIT) adjustOxyLoss(HUMAN_MAX_OXYLOSS + 1) - else if(!(NOCRITDAMAGE in dna.species.species_traits)) + else if(!has_trait(TRAIT_NOCRITDAMAGE)) adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS) failed_last_breath = 1 @@ -337,8 +337,8 @@ if(!undergoing_cardiac_arrest()) return - // Cardiac arrest, unless corazone - if(reagents.get_reagent_amount("corazone")) + // Cardiac arrest, unless heart is stabilized + if(has_trait(TRAIT_STABLEHEART)) return if(we_breath) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 0c5f68d9ba..14e301a692 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -866,7 +866,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) H.setOxyLoss(0) H.losebreath = 0 - var/takes_crit_damage = (!(NOCRITDAMAGE in species_traits)) + var/takes_crit_damage = (!H.has_trait(TRAIT_NOCRITDAMAGE)) if((H.health < HEALTH_THRESHOLD_CRIT) && takes_crit_damage) H.adjustBruteLoss(1) diff --git a/code/modules/mob/living/carbon/human/species_types/corporate.dm b/code/modules/mob/living/carbon/human/species_types/corporate.dm index 7c4143ec6a..552e413f4d 100644 --- a/code/modules/mob/living/carbon/human/species_types/corporate.dm +++ b/code/modules/mob/living/carbon/human/species_types/corporate.dm @@ -1,20 +1,20 @@ -/datum/species/corporate - name = "Corporate Agent" - id = "agent" - hair_alpha = 0 - say_mod = "declares" - speedmod = -2//Fast - brutemod = 0.7//Tough against firearms - burnmod = 0.65//Tough against lasers - coldmod = 0 - heatmod = 0.5//it's a little tough to burn them to death not as hard though. - punchdamagelow = 20 - punchdamagehigh = 30//they are inhumanly strong - punchstunthreshold = 25 - attack_verb = "smash" - attack_sound = 'sound/weapons/resonator_blast.ogg' - blacklisted = 1 - use_skintones = 0 - species_traits = list(SPECIES_ORGANIC,NOBLOOD,EYECOLOR) - inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER) - sexes = 0 +/datum/species/corporate + name = "Corporate Agent" + id = "agent" + hair_alpha = 0 + say_mod = "declares" + speedmod = -2//Fast + brutemod = 0.7//Tough against firearms + burnmod = 0.65//Tough against lasers + coldmod = 0 + heatmod = 0.5//it's a little tough to burn them to death not as hard though. + punchdamagelow = 20 + punchdamagehigh = 30//they are inhumanly strong + punchstunthreshold = 25 + attack_verb = "smash" + attack_sound = 'sound/weapons/resonator_blast.ogg' + blacklisted = 1 + use_skintones = 0 + species_traits = list(SPECIES_ORGANIC,NOBLOOD,EYECOLOR) + inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER) + sexes = 0 diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 5e5c77ee33..0cf7190420 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -436,10 +436,10 @@ L.damage += d /mob/living/carbon/proc/liver_failure() - if(reagents.get_reagent_amount("corazone"))//corazone is processed here an not in the liver because a failing liver can't metabolize reagents - reagents.remove_reagent("corazone", 0.4) //corazone slowly deletes itself. + reagents.metabolize(src, can_overdose=FALSE, liverless = TRUE) + if(has_trait(TRAIT_STABLEHEART)) return - adjustToxLoss(8, TRUE, TRUE) + adjustToxLoss(8, TRUE, TRUE) if(prob(30)) to_chat(src, "You feel confused and nauseous...")//actual symptoms of liver failure diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 0f3ac0e1bc..5735463af2 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -251,7 +251,7 @@ R.handle_reactions() return amount -/datum/reagents/proc/metabolize(mob/living/carbon/C, can_overdose = 0) +/datum/reagents/proc/metabolize(mob/living/carbon/C, can_overdose = FALSE, liverless = FALSE) var/list/cached_reagents = reagent_list var/list/cached_addictions = addiction_list if(C) @@ -261,6 +261,8 @@ var/datum/reagent/R = reagent if(QDELETED(R.holder)) continue + if(liverless && !R.self_consuming) //need to be metabolized + continue if(!C) C = R.holder.my_atom if(C && R) diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 4ca1efa4e7..70bb594c8b 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -31,6 +31,7 @@ var/addiction_threshold = 0 var/addiction_stage = 0 var/overdosed = 0 // You fucked up and this is now triggering its overdose effects, purge that shit quick. + var/self_consuming = FALSE /datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references . = ..() diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 2552bb7c8d..a3726897b3 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -1192,6 +1192,7 @@ id = "corazone" description = "A medication used to treat pain, fever, and inflammation, along with heart attacks." color = "#F5F5F5" + self_consuming = TRUE /datum/reagent/medicine/muscle_stimulant name = "Muscle Stimulant" diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 2eed6c33d5..e77d87c5b6 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -808,6 +808,7 @@ toxpwr = 1 var/acidpwr = 10 //the amount of protection removed from the armour taste_description = "acid" + self_consuming = TRUE /datum/reagent/toxin/acid/reaction_mob(mob/living/carbon/C, method=TOUCH, reac_volume) if(!istype(C)) diff --git a/code/modules/ruins/spaceruin_code/cloning_lab.dm b/code/modules/ruins/spaceruin_code/cloning_lab.dm new file mode 100644 index 0000000000..1e372f1fa4 --- /dev/null +++ b/code/modules/ruins/spaceruin_code/cloning_lab.dm @@ -0,0 +1,35 @@ +/obj/item/paper/fluff/ruins/exp_cloning/manual + name = "paper - 'H-11 Cloning Apparatus Manual" + info = {"

Getting Started

+ Congratulations, you are testing the H-11 experimental cloning device!
+ Using the H-11 is almost as simple as brain surgery! Simply insert the target humanoid into the scanning chamber and select the clone option to initiate cloning!
+ That's all there is to it!
+ Notice, cloning system cannot scan inorganic life or small primates. Scan may fail if subject has suffered extreme brain damage.
+

The provided CLONEPOD SYSTEM will produce the desired clone. Standard clone maturation times are roughly 90 seconds. + The cloning pod may be unlocked early after initial maturation is complete.


+ Please note that resulting clones will have a DEVELOPMENTAL DEFECT as a result of genetic drift. We hope to reduce this through further testing.
+ Clones may also experience memory loss and radical changes in personality as a result of the cloning process.

+
+ This technology produced under license from Thinktronic Systems, LTD."} + +/obj/item/paper/fluff/ruins/exp_cloning/log + name = "experiment log" + info = {"

Day 1

+ We are very excited to be part of the first crew of the SC Irmanda!
+ This ship is made to test an innovative FTL technology. I had some concerns at first, \ + but the engineers assure me that it is safe and there is absolutely no risk of the external wings breaking off from the acceleration.
+ We've been tasked with testing the latest model of the Thinktronic Cloning Pod. We'll stay in dock for a week before launching, but we're going to get started right away. \ + If the engine is as fast as they say, we might not have the time to run all the routine tests on the cloned subject!
+
+

Day 2

+ We cloned an unknown corpse that was given to us by the medical crew. The genetic replication is good enough to let the subject survive outside of the pod, \ + but the cellular damage remains a concern for his long-term survival. For safety we will be keeping him in quarantine.
+ We left him some books, but clearly we were too optimistic about his mental faculties. His brain seems to suffer from the same cloning decay that was caused by \ + the previous models. We will run further tests to see if there are improvements.
+

Day 4

+ It seems we'll be launching even sooner than expected! Apparently the press is starting to lose interest, so we have to cut short the pre-flight checks \ + and give them something to talk about. Hopefully this will end up with increased funding...
+ The crew has all been invited to the main hall, where we have seats for the initial FTL acceleration. Unfortunately the clone cannot leave the quarantine room \ + without risking infection, so we will strap him into the bed and hope for the best. We can grow another clone if anything goes wrong, anyway. +
+ Professor Galen Linkovich"} \ No newline at end of file diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 1aff20b81a..737ffbe6e8 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -68,17 +68,15 @@ /obj/item/organ/lungs/proc/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/H) if((H.status_flags & GODMODE)) return - - var/species_traits = list() - if(H && H.dna && H.dna.species && H.dna.species.species_traits) - species_traits = H.dna.species.species_traits + if(H.has_trait(TRAIT_NOBREATH)) + return if(!breath || (breath.total_moles() == 0)) if(H.reagents.has_reagent(crit_stabilizing_reagent)) return if(H.health >= HEALTH_THRESHOLD_CRIT) H.adjustOxyLoss(HUMAN_MAX_OXYLOSS) - else if(!(NOCRITDAMAGE in species_traits)) + else if(!H.has_trait(TRAIT_NOCRITDAMAGE)) H.adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS) H.failed_last_breath = TRUE diff --git a/tgstation.dme b/tgstation.dme index f6f772f8c8..70fc644736 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -542,6 +542,7 @@ #include "code\game\machinery\dna_scanner.dm" #include "code\game\machinery\doppler_array.dm" #include "code\game\machinery\droneDispenser.dm" +#include "code\game\machinery\exp_cloner.dm" #include "code\game\machinery\firealarm.dm" #include "code\game\machinery\flasher.dm" #include "code\game\machinery\gulag_item_reclaimer.dm" @@ -2408,6 +2409,7 @@ #include "code\modules\ruins\spaceruin_code\asteroid4.dm" #include "code\modules\ruins\spaceruin_code\bigderelict1.dm" #include "code\modules\ruins\spaceruin_code\caravanambush.dm" +#include "code\modules\ruins\spaceruin_code\cloning_lab.dm" #include "code\modules\ruins\spaceruin_code\crashedclownship.dm" #include "code\modules\ruins\spaceruin_code\crashedship.dm" #include "code\modules\ruins\spaceruin_code\deepstorage.dm" From a2e6253f0083a86a83392b1dcd824c1079969adb Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 5 Mar 2018 15:20:59 -0600 Subject: [PATCH 25/45] [MIRROR] Disease antagonist (#5815) * Disease antagonist * Update mobs.dm * can I go to sleep yet --- code/__DEFINES/atom_hud.dm | 33 +- code/__DEFINES/diseases.dm | 31 +- code/__HELPERS/cmp.dm | 5 +- code/__HELPERS/unsorted.dm | 4 +- code/_globalvars/lists/mobs.dm | 4 +- code/_onclick/other_mobs.dm | 2 +- code/controllers/subsystem/mobs.dm | 4 +- code/datums/action.dm | 49 ++- code/datums/brain_damage/imaginary_friend.dm | 3 - code/datums/diseases/_MobProcs.dm | 63 +--- code/datums/diseases/_disease.dm | 76 ++-- code/datums/diseases/advance/advance.dm | 143 ++++---- code/datums/diseases/advance/presets.dm | 63 ++-- .../datums/diseases/advance/symptoms/cough.dm | 2 +- .../diseases/advance/symptoms/symptoms.dm | 1 + code/datums/diseases/anxiety.dm | 4 +- code/datums/diseases/appendicitis.dm | 4 +- code/datums/diseases/beesease.dm | 4 +- code/datums/diseases/brainrot.dm | 4 +- code/datums/diseases/cold.dm | 8 +- code/datums/diseases/cold9.dm | 4 +- code/datums/diseases/dna_spread.dm | 4 +- code/datums/diseases/fake_gbs.dm | 4 +- code/datums/diseases/flu.dm | 2 +- code/datums/diseases/fluspanish.dm | 2 +- code/datums/diseases/gbs.dm | 4 +- code/datums/diseases/heart_failure.dm | 7 +- code/datums/diseases/magnitis.dm | 2 +- code/datums/diseases/parrotpossession.dm | 4 +- code/datums/diseases/pierrot_throat.dm | 2 +- code/datums/diseases/retrovirus.dm | 11 +- code/datums/diseases/rhumba_beat.dm | 4 +- code/datums/diseases/transformation.dm | 28 +- code/datums/diseases/tuberculosis.dm | 2 +- code/datums/diseases/wizarditis.dm | 2 +- code/datums/hud.dm | 1 + code/game/data_huds.dm | 19 +- code/game/objects/effects/decals/cleanable.dm | 2 +- code/game/objects/items/devices/scanners.dm | 2 +- code/modules/admin/admin_verbs.dm | 7 +- .../antagonists/abductor/equipment/gland.dm | 11 +- .../modules/antagonists/blob/blob/overmind.dm | 6 +- .../antagonists/changeling/powers/panacea.dm | 12 +- .../antagonists/disease/disease_abilities.dm | 347 ++++++++++++++++++ .../antagonists/disease/disease_datum.dm | 100 +++++ .../antagonists/disease/disease_disease.dm | 59 +++ .../antagonists/disease/disease_event.dm | 30 ++ .../antagonists/disease/disease_mob.dm | 318 ++++++++++++++++ code/modules/antagonists/monkey/monkey.dm | 5 +- .../revenant/revenant_abilities.dm | 4 +- .../antagonists/revenant/revenant_blight.dm | 4 +- .../awaymissions/mission_code/Academy.dm | 4 +- code/modules/events/disease_outbreak.dm | 11 +- code/modules/events/heart_attack.dm | 8 +- .../events/spontaneous_appendicitis.dm | 6 +- code/modules/language/language_holder.dm | 4 + .../mining/lavaland/necropolis_chests.dm | 2 +- code/modules/mob/camera/camera.dm | 16 +- code/modules/mob/living/blood.dm | 8 +- .../living/carbon/alien/special/facehugger.dm | 1 - code/modules/mob/living/carbon/carbon.dm | 4 +- .../mob/living/carbon/carbon_defense.dm | 18 +- code/modules/mob/living/carbon/human/human.dm | 6 +- .../mob/living/carbon/human/human_defines.dm | 2 +- code/modules/mob/living/carbon/human/say.dm | 4 +- .../mob/living/carbon/human/species.dm | 2 +- code/modules/mob/living/carbon/life.dm | 2 +- code/modules/mob/living/living.dm | 140 ++++++- code/modules/mob/living/living_defines.dm | 4 + .../mob/living/silicon/pai/software.dm | 2 +- .../mob/living/simple_animal/bot/medbot.dm | 12 +- code/modules/mob/mob.dm | 116 ------ code/modules/mob/mob_defines.dm | 4 - code/modules/mob/mob_helpers.dm | 6 +- code/modules/mob/transform_procs.dm | 12 +- .../reagents/chemistry/machinery/pandemic.dm | 12 +- .../chemistry/reagents/medicine_reagents.dm | 4 +- .../chemistry/reagents/other_reagents.dm | 44 ++- code/modules/reagents/reagent_containers.dm | 2 +- .../research/xenobiology/xenobiology.dm | 2 +- .../modules/surgery/advanced/viral_bonding.dm | 4 +- code/modules/surgery/organs/appendix.dm | 4 +- icons/mob/actions/actions_minor_antag.dmi | Bin 12098 -> 13836 bytes icons/mob/hud.dmi | Bin 13261 -> 13535 bytes tgstation.dme | 6 +- 85 files changed, 1483 insertions(+), 505 deletions(-) create mode 100644 code/modules/antagonists/disease/disease_abilities.dm create mode 100644 code/modules/antagonists/disease/disease_datum.dm create mode 100644 code/modules/antagonists/disease/disease_disease.dm create mode 100644 code/modules/antagonists/disease/disease_event.dm create mode 100644 code/modules/antagonists/disease/disease_mob.dm diff --git a/code/__DEFINES/atom_hud.dm b/code/__DEFINES/atom_hud.dm index 0c5edf5b99..393ffce4fd 100644 --- a/code/__DEFINES/atom_hud.dm +++ b/code/__DEFINES/atom_hud.dm @@ -19,8 +19,9 @@ #define DIAG_AIRLOCK_HUD "15"//Airlock shock overlay #define DIAG_PATH_HUD "16"//Bot path indicators #define GLAND_HUD "17"//Gland indicators for abductors +#define SENTIENT_DISEASE_HUD "18" //for antag huds. these are used at the /mob level -#define ANTAG_HUD "18" +#define ANTAG_HUD "19" //by default everything in the hud_list of an atom is an image //a value in hud_list with one of these will change that behavior @@ -35,21 +36,23 @@ #define DATA_HUD_DIAGNOSTIC_BASIC 5 #define DATA_HUD_DIAGNOSTIC_ADVANCED 6 #define DATA_HUD_ABDUCTOR 7 +#define DATA_HUD_SENTIENT_DISEASE 8 + //antag HUD defines -#define ANTAG_HUD_CULT 8 -#define ANTAG_HUD_REV 9 -#define ANTAG_HUD_OPS 10 -#define ANTAG_HUD_WIZ 11 -#define ANTAG_HUD_SHADOW 12 -#define ANTAG_HUD_TRAITOR 13 -#define ANTAG_HUD_NINJA 14 -#define ANTAG_HUD_CHANGELING 15 -#define ANTAG_HUD_ABDUCTOR 16 -#define ANTAG_HUD_DEVIL 17 -#define ANTAG_HUD_SINTOUCHED 18 -#define ANTAG_HUD_SOULLESS 19 -#define ANTAG_HUD_CLOCKWORK 20 -#define ANTAG_HUD_BROTHER 21 +#define ANTAG_HUD_CULT 9 +#define ANTAG_HUD_REV 10 +#define ANTAG_HUD_OPS 11 +#define ANTAG_HUD_WIZ 12 +#define ANTAG_HUD_SHADOW 13 +#define ANTAG_HUD_TRAITOR 14 +#define ANTAG_HUD_NINJA 15 +#define ANTAG_HUD_CHANGELING 16 +#define ANTAG_HUD_ABDUCTOR 17 +#define ANTAG_HUD_DEVIL 18 +#define ANTAG_HUD_SINTOUCHED 19 +#define ANTAG_HUD_SOULLESS 20 +#define ANTAG_HUD_CLOCKWORK 21 +#define ANTAG_HUD_BROTHER 22 // Notification action types #define NOTIFY_JUMP "jump" diff --git a/code/__DEFINES/diseases.dm b/code/__DEFINES/diseases.dm index 58d8066e9c..9f96d0374f 100644 --- a/code/__DEFINES/diseases.dm +++ b/code/__DEFINES/diseases.dm @@ -1,3 +1,7 @@ + +#define DISEASE_LIMIT 1 +#define VIRUS_SYMPTOM_LIMIT 6 + //Visibility Flags #define HIDDEN_SCANNER 1 #define HIDDEN_PANDEMIC 2 @@ -8,19 +12,18 @@ #define CAN_RESIST 4 //Spread Flags -#define VIRUS_SPREAD_SPECIAL 1 -#define VIRUS_SPREAD_NON_CONTAGIOUS 2 -#define VIRUS_SPREAD_BLOOD 4 -#define VIRUS_SPREAD_CONTACT_FLUIDS 8 -#define VIRUS_SPREAD_CONTACT_SKIN 16 -#define VIRUS_SPREAD_AIRBORNE 32 - +#define DISEASE_SPREAD_SPECIAL 1 +#define DISEASE_SPREAD_NON_CONTAGIOUS 2 +#define DISEASE_SPREAD_BLOOD 4 +#define DISEASE_SPREAD_CONTACT_FLUIDS 8 +#define DISEASE_SPREAD_CONTACT_SKIN 16 +#define DISEASE_SPREAD_AIRBORNE 32 //Severity Defines -#define VIRUS_SEVERITY_POSITIVE "Positive" //Diseases that buff, heal, or at least do nothing at all -#define VIRUS_SEVERITY_NONTHREAT "Harmless" //Diseases that may have annoying effects, but nothing disruptive (sneezing) -#define VIRUS_SEVERITY_MINOR "Minor" //Diseases that can annoy in concrete ways (dizziness) -#define VIRUS_SEVERITY_MEDIUM "Medium" //Diseases that can do minor harm, or severe annoyance (vomit) -#define VIRUS_SEVERITY_HARMFUL "Harmful" //Diseases that can do significant harm, or severe disruption (brainrot) -#define VIRUS_SEVERITY_DANGEROUS "Dangerous" //Diseases that can kill or maim if left untreated (flesh eating, blindness) -#define VIRUS_SEVERITY_BIOHAZARD "BIOHAZARD" //Diseases that can quickly kill an unprepared victim (fungal tb, gbs) +#define DISEASE_SEVERITY_POSITIVE "Positive" //Diseases that buff, heal, or at least do nothing at all +#define DISEASE_SEVERITY_NONTHREAT "Harmless" //Diseases that may have annoying effects, but nothing disruptive (sneezing) +#define DISEASE_SEVERITY_MINOR "Minor" //Diseases that can annoy in concrete ways (dizziness) +#define DISEASE_SEVERITY_MEDIUM "Medium" //Diseases that can do minor harm, or severe annoyance (vomit) +#define DISEASE_SEVERITY_HARMFUL "Harmful" //Diseases that can do significant harm, or severe disruption (brainrot) +#define DISEASE_SEVERITY_DANGEROUS "Dangerous" //Diseases that can kill or maim if left untreated (flesh eating, blindness) +#define DISEASE_SEVERITY_BIOHAZARD "BIOHAZARD" //Diseases that can quickly kill an unprepared victim (fungal tb, gbs) diff --git a/code/__HELPERS/cmp.dm b/code/__HELPERS/cmp.dm index 8c4d62c6a2..e09ebcb10c 100644 --- a/code/__HELPERS/cmp.dm +++ b/code/__HELPERS/cmp.dm @@ -77,4 +77,7 @@ GLOBAL_VAR_INIT(cmp_field, "name") if(A.plane != B.plane) return A.plane - B.plane else - return A.layer - B.layer \ No newline at end of file + return A.layer - B.layer + +/proc/cmp_advdisease_resistance_asc(datum/disease/advance/A, datum/disease/advance/B) + return A.totalResistance() - B.totalResistance() diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index a31ec4f037..cbd73627ff 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -995,9 +995,9 @@ GLOBAL_LIST_INIT(WALLITEMS_INVERSE, typecacheof(list( var/mob/living/LA = A if(LA.lying) return 0 - var/goal_dir = angle2dir(dir2angle(get_dir(B,A)+180)) + var/goal_dir = get_dir(A,B) var/clockwise_A_dir = turn(A.dir, -45) - var/anticlockwise_A_dir = turn(B.dir, 45) + var/anticlockwise_A_dir = turn(A.dir, 45) if(A.dir == goal_dir || clockwise_A_dir == goal_dir || anticlockwise_A_dir == goal_dir) return 1 diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index a3d14b26ad..e32405cad5 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -25,8 +25,10 @@ GLOBAL_LIST_EMPTY(available_ai_shells) GLOBAL_LIST_INIT(simple_animals, list(list(),list(),list(),list())) // One for each AI_* status define GLOBAL_LIST_EMPTY(spidermobs) //all sentient spider mobs GLOBAL_LIST_EMPTY(bots_list) +GLOBAL_LIST_EMPTY(living_cameras) GLOBAL_LIST_EMPTY(language_datum_instances) GLOBAL_LIST_EMPTY(all_languages) -GLOBAL_LIST_EMPTY(latejoiners) //CIT CHANGE - All latejoining people, for traitor-target purposes. \ No newline at end of file +GLOBAL_LIST_EMPTY(latejoiners) //CIT CHANGE - All latejoining people, for traitor-target purposes. +GLOBAL_LIST_EMPTY(sentient_disease_instances) diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index d52a7f6fdc..587236e802 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -103,7 +103,7 @@ "[name] bites [ML]!") if(armor >= 2) return - for(var/thing in viruses) + for(var/thing in diseases) var/datum/disease/D = thing ML.ForceContractDisease(D) else diff --git a/code/controllers/subsystem/mobs.dm b/code/controllers/subsystem/mobs.dm index cd47adf476..c0837ec76b 100644 --- a/code/controllers/subsystem/mobs.dm +++ b/code/controllers/subsystem/mobs.dm @@ -21,8 +21,8 @@ SUBSYSTEM_DEF(mobs) var/seconds = wait * 0.1 if (!resumed) src.currentrun = GLOB.mob_living_list.Copy() - if (GLOB.overminds.len) // blob cameras need to Life() - src.currentrun += GLOB.overminds + if (GLOB.living_cameras.len) + src.currentrun += GLOB.living_cameras //cache for sanic speed (lists are references anyways) var/list/currentrun = src.currentrun diff --git a/code/datums/action.dm b/code/datums/action.dm index 15f62b20b7..a7437a0440 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -11,6 +11,7 @@ var/processing = FALSE var/obj/screen/movable/action_button/button = null var/buttontooltipstyle = "" + var/transparent_when_unavailable = TRUE var/button_icon = 'icons/mob/actions/backgrounds.dmi' //This is the file for the BACKGROUND icon var/background_icon_state = ACTION_BUTTON_DEFAULT_BACKGROUND //And this is the state for the background icon @@ -124,7 +125,7 @@ ApplyIcon(button, force) if(!IsAvailable()) - button.color = rgb(128,0,0,128) + button.color = transparent_when_unavailable ? rgb(128,0,0,128) : rgb(128,0,0) else button.color = rgb(255,255,255,255) return 1 @@ -572,6 +573,52 @@ call(target, procname)(usr) return 1 + +//Preset for an action with a cooldown + +/datum/action/cooldown + check_flags = 0 + transparent_when_unavailable = FALSE + var/cooldown_time = 0 + var/next_use_time = 0 + +/datum/action/cooldown/New() + ..() + button.maptext = "" + button.maptext_x = 8 + button.maptext_y = 0 + button.maptext_width = 24 + button.maptext_height = 12 + +/datum/action/cooldown/IsAvailable() + return next_use_time <= world.time + +/datum/action/cooldown/proc/StartCooldown() + next_use_time = world.time + cooldown_time + button.maptext = "[round(cooldown_time/10, 0.1)]" + UpdateButtonIcon() + START_PROCESSING(SSfastprocess, src) + +/datum/action/cooldown/process() + if(!owner) + button.maptext = "" + STOP_PROCESSING(SSfastprocess, src) + var/timeleft = max(next_use_time - world.time, 0) + if(timeleft == 0) + button.maptext = "" + UpdateButtonIcon() + STOP_PROCESSING(SSfastprocess, src) + else + button.maptext = "[round(timeleft/10, 0.1)]" + +/datum/action/cooldown/Grant(mob/M) + ..() + if(owner) + UpdateButtonIcon() + if(next_use_time > world.time) + START_PROCESSING(SSfastprocess, src) + + //Stickmemes /datum/action/item_action/stickmen name = "Summon Stick Minions" diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm index 88c7d09005..a1a4c11ca6 100644 --- a/code/datums/brain_damage/imaginary_friend.dm +++ b/code/datums/brain_damage/imaginary_friend.dm @@ -142,9 +142,6 @@ var/link = FOLLOW_LINK(M, owner) to_chat(M, "[link] [dead_rendered]") -/mob/camera/imaginary_friend/emote(act,m_type=1,message = null) - return - /mob/camera/imaginary_friend/forceMove(atom/destination) dir = get_dir(get_turf(src), destination) loc = destination diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm index 9f4fa1fe63..bc04a67308 100644 --- a/code/datums/diseases/_MobProcs.dm +++ b/code/datums/diseases/_MobProcs.dm @@ -1,17 +1,17 @@ -/mob/proc/HasDisease(datum/disease/D) - for(var/thing in viruses) +/mob/living/proc/HasDisease(datum/disease/D) + for(var/thing in diseases) var/datum/disease/DD = thing if(D.IsSame(DD)) return TRUE return FALSE -/mob/proc/CanContractDisease(datum/disease/D) +/mob/living/proc/CanContractDisease(datum/disease/D) if(stat == DEAD) return FALSE - if(D.GetDiseaseID() in resistances) + if(D.GetDiseaseID() in disease_resistances) return FALSE if(HasDisease(D)) @@ -23,38 +23,10 @@ return TRUE -/mob/proc/ContactContractDisease(datum/disease/D) +/mob/living/proc/ContactContractDisease(datum/disease/D) if(!CanContractDisease(D)) return FALSE - AddDisease(D) - - -/mob/proc/AddDisease(datum/disease/D) - for(var/datum/disease/advance/P in viruses) - if(istype(D, /datum/disease/advance)) - var/datum/disease/advance/DD = D - if (P.totalResistance() < DD.totalTransmittable()) //Overwrite virus if the attacker's Transmission is lower than the defender's Resistance. This does not grant immunity to the lost virus. - P.remove_virus() - - if (!viruses.len) //Only add the new virus if it defeated the existing one - var/datum/disease/DD = new D.type(1, D, 0) - viruses += DD - DD.affected_mob = src - SSdisease.active_diseases += DD //Add it to the active diseases list, now that it's actually in a mob and being processed. - - //Copy properties over. This is so edited diseases persist. - var/list/skipped = list("affected_mob","holder","carrier","stage","type","parent_type","vars","transformed","symptoms","processing") - for(var/V in DD.vars) - if(V in skipped) - continue - if(islist(DD.vars[V])) - var/list/L = D.vars[V] - DD.vars[V] = L.Copy() - else - DD.vars[V] = D.vars[V] - - DD.after_add() - DD.affected_mob.med_hud_set_status() + D.try_infect(src) /mob/living/carbon/ContactContractDisease(datum/disease/D, target_zone) @@ -124,28 +96,33 @@ passed = prob((Cl.permeability_coefficient*100) - 1) if(passed) - AddDisease(D) + D.try_infect(src) -/mob/proc/AirborneContractDisease(datum/disease/D) - if((D.spread_flags & VIRUS_SPREAD_AIRBORNE) && prob((50*D.permeability_mod) - 1)) +/mob/living/proc/AirborneContractDisease(datum/disease/D, force_spread) + if( ((D.spread_flags & DISEASE_SPREAD_AIRBORNE) || force_spread) && prob((50*D.permeability_mod) - 1)) ForceContractDisease(D) -/mob/living/carbon/AirborneContractDisease(datum/disease/D) +/mob/living/carbon/AirborneContractDisease(datum/disease/D, force_spread) if(internal) return if(has_trait(TRAIT_NOBREATH)) return ..() -//Proc to use when you 100% want to infect someone, as long as they aren't immune -/mob/proc/ForceContractDisease(datum/disease/D) +//Proc to use when you 100% want to try to infect someone (ignoreing protective clothing and such), as long as they aren't immune +/mob/living/proc/ForceContractDisease(datum/disease/D, make_copy = TRUE, del_on_fail = FALSE) if(!CanContractDisease(D)) + if(del_on_fail) + qdel(D) return FALSE - AddDisease(D) + if(!D.try_infect(src, make_copy)) + if(del_on_fail) + qdel(D) + return FALSE + return TRUE /mob/living/carbon/human/CanContractDisease(datum/disease/D) - if(dna) if(has_trait(TRAIT_VIRUSIMMUNE) && !D.bypasses_immunity) return FALSE @@ -161,4 +138,4 @@ for(var/thing in D.required_organs) if(!((locate(thing) in bodyparts) || (locate(thing) in internal_organs))) return FALSE - return ..() \ No newline at end of file + return ..() diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index 5d49d7a523..614cd14abb 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -2,7 +2,7 @@ //Flags var/visibility_flags = 0 var/disease_flags = CURABLE|CAN_CARRY|CAN_RESIST - var/spread_flags = VIRUS_SPREAD_AIRBORNE | VIRUS_SPREAD_CONTACT_FLUIDS | VIRUS_SPREAD_CONTACT_SKIN + var/spread_flags = DISEASE_SPREAD_AIRBORNE | DISEASE_SPREAD_CONTACT_FLUIDS | DISEASE_SPREAD_CONTACT_SKIN //Fluff var/form = "Virus" @@ -26,7 +26,7 @@ var/carrier = FALSE //If our host is only a carrier var/bypasses_immunity = FALSE //Does it skip species virus immunity check? Some things may diseases and not viruses var/permeability_mod = 1 - var/severity = VIRUS_SEVERITY_POSITIVE + var/severity = DISEASE_SEVERITY_NONTHREAT var/list/required_organs = list() var/needs_all_cures = TRUE var/list/strain_data = list() //dna_spread special bullshit @@ -34,9 +34,27 @@ var/process_dead = FALSE //if this ticks while the host is dead /datum/disease/Destroy() - affected_mob = null + . = ..() + if(affected_mob) + remove_disease() SSdisease.active_diseases.Remove(src) - return ..() + +//add this disease if the host does not already have too many +/datum/disease/proc/try_infect(var/mob/living/infectee, make_copy = TRUE) + if(infectee.diseases.len < DISEASE_LIMIT) + infect(infectee, make_copy) + return TRUE + return FALSE + +//add the disease with no checks +/datum/disease/proc/infect(var/mob/living/infectee, make_copy = TRUE) + var/datum/disease/D = make_copy ? Copy() : src + infectee.diseases += D + D.affected_mob = infectee + SSdisease.active_diseases += D //Add it to the active diseases list, now that it's actually in a mob and being processed. + + D.after_add() + infectee.med_hud_set_status() /datum/disease/proc/stage_act() var/cure = has_cure() @@ -74,7 +92,7 @@ if(!affected_mob) return - if(!(spread_flags & VIRUS_SPREAD_AIRBORNE) && !force_spread) + if(!(spread_flags & DISEASE_SPREAD_AIRBORNE) && !force_spread) return if(affected_mob.reagents.has_reagent("spaceacillin") || (affected_mob.satiety > 0 && prob(affected_mob.satiety/10))) @@ -89,24 +107,25 @@ if(istype(T)) for(var/mob/living/carbon/C in oview(spread_range, affected_mob)) var/turf/V = get_turf(C) - if(V) - while(TRUE) - if(V == T) - C.AirborneContractDisease(src) - break - var/turf/Temp = get_step_towards(V, T) - if(!CANATMOSPASS(V, Temp)) - break - V = Temp + if(disease_air_spread_walk(T, V)) + C.AirborneContractDisease(src, force_spread) + +/proc/disease_air_spread_walk(turf/start, turf/end) + if(!start || !end) + return FALSE + while(TRUE) + if(end == start) + return TRUE + var/turf/Temp = get_step_towards(end, start) + if(!CANATMOSPASS(end, Temp)) + return FALSE + end = Temp /datum/disease/proc/cure(add_resistance = TRUE) if(affected_mob) - if(disease_flags & CAN_RESIST) - var/id = GetDiseaseID() - if(add_resistance && !(id in affected_mob.resistances)) - affected_mob.resistances += id - remove_virus() + if(add_resistance && (disease_flags & CAN_RESIST)) + affected_mob.disease_resistances |= GetDiseaseID() qdel(src) /datum/disease/proc/IsSame(datum/disease/D) @@ -116,8 +135,19 @@ /datum/disease/proc/Copy() + //note that stage is not copied over - the copy starts over at stage 1 + var/static/list/copy_vars = list("name", "visibility_flags", "disease_flags", "spread_flags", "form", "desc", "agent", "spread_text", + "cure_text", "max_stages", "stage_prob", "viable_mobtypes", "cures", "infectivity", "cure_chance", + "bypasses_immunity", "permeability_mod", "severity", "required_organs", "needs_all_cures", "strain_data", + "infectable_hosts", "process_dead") + var/datum/disease/D = new type() - D.strain_data = strain_data.Copy() + for(var/V in copy_vars) + var/val = vars[V] + if(islist(val)) + var/list/L = val + val = L.Copy() + D.vars[V] = val return D /datum/disease/proc/after_add() @@ -127,7 +157,7 @@ /datum/disease/proc/GetDiseaseID() return "[type]" -//don't use this proc directly. this should only ever be called by cure() -/datum/disease/proc/remove_virus() - affected_mob.viruses -= src //remove the datum from the list +/datum/disease/proc/remove_disease() + affected_mob.diseases -= src //remove the datum from the list affected_mob.med_hud_set_status() + affected_mob = null diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index d2ded9f907..64af3bc94d 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -7,7 +7,6 @@ */ -#define SYMPTOM_LIMIT 6 @@ -31,6 +30,7 @@ var/list/symptoms = list() // The symptoms of the disease. var/id = "" var/processing = FALSE + var/mutable = TRUE //set to FALSE to prevent most in-game methods of altering the disease via virology // The order goes from easy to cure to hard to cure. var/static/list/advance_cures = list( @@ -46,23 +46,8 @@ */ -/datum/disease/advance/New(var/process = 1, var/datum/disease/advance/D) - if(!istype(D)) - D = null - // Generate symptoms if we weren't given any. - - if(!symptoms || !symptoms.len) - - if(!D || !D.symptoms || !D.symptoms.len) - symptoms = GenerateSymptoms(0, 2) - else - for(var/datum/symptom/S in D.symptoms) - var/datum/symptom/new_symp = S.Copy() - symptoms += new_symp - +/datum/disease/advance/New() Refresh() - ..(process, D) - return /datum/disease/advance/Destroy() if(processing) @@ -70,6 +55,26 @@ S.End(src) return ..() +/datum/disease/advance/try_infect(var/mob/living/infectee, make_copy = TRUE) + var/replace_num = infectee.diseases.len + 1 - DISEASE_LIMIT + if(replace_num > 0) + //see if we are more transmittable than enough diseases to replace them + //diseases replaced in this way do not confer immunity + var/list/L = list() + for(var/datum/disease/advance/P in infectee.diseases) + L += P + sortTim(L, /proc/cmp_advdisease_resistance_asc) + var/datum/disease/advance/competition = L[replace_num] + if(totalTransmittable() > competition.totalResistance()) + for(var/i in 1 to replace_num) + var/datum/disease/advance/A = L[replace_num] + A.cure(FALSE) + else + //we are not strong enough to bully our way in + return FALSE + infect(infectee, make_copy) + return TRUE + // Randomly pick a symptom to activate. /datum/disease/advance/stage_act() ..() @@ -85,8 +90,6 @@ for(var/datum/symptom/S in symptoms) S.Activate(src) - else - CRASH("We do not have any symptoms during stage_act()!") // Compares type then ID. /datum/disease/advance/IsSame(datum/disease/advance/D) @@ -99,8 +102,15 @@ return 1 // Returns the advance disease with a different reference memory. -/datum/disease/advance/Copy(process = 0) - return new /datum/disease/advance(process, src, 1) +/datum/disease/advance/Copy() + var/datum/disease/advance/A = ..() + QDEL_LIST(A.symptoms) + for(var/datum/symptom/S in symptoms) + A.symptoms += S.Copy() + A.properties = properties.Copy() + A.id = id + //this is a new disease starting over at stage 1, so processing is not copied + return A /* @@ -130,7 +140,7 @@ var/list/possible_symptoms = list() for(var/symp in SSdisease.list_symptoms) var/datum/symptom/S = new symp - if(S.level >= level_min && S.level <= level_max) + if(S.naturally_occuring && S.level >= level_min && S.level <= level_max) if(!HasSymptom(S)) possible_symptoms += S @@ -154,22 +164,18 @@ AssignProperties() id = null - if(!SSdisease.archive_diseases[GetDiseaseID()]) + var/the_id = GetDiseaseID() + if(!SSdisease.archive_diseases[the_id]) if(new_name) AssignName() - SSdisease.archive_diseases[GetDiseaseID()] = src // So we don't infinite loop - SSdisease.archive_diseases[GetDiseaseID()] = new /datum/disease/advance(0, src, 1) + SSdisease.archive_diseases[the_id] = src // So we don't infinite loop + SSdisease.archive_diseases[the_id] = Copy() - var/datum/disease/advance/A = SSdisease.archive_diseases[GetDiseaseID()] - AssignName(A.name) + var/datum/disease/advance/A = SSdisease.archive_diseases[the_id] + name = A.name //Generate disease properties based on the effects. Returns an associated list. /datum/disease/advance/proc/GenerateProperties() - - if(!symptoms || !symptoms.len) - CRASH("We did not have any symptoms before generating properties.") - return - properties = list("resistance" = 0, "stealth" = 0, "stage_rate" = 0, "transmittable" = 0, "severity" = 0) for(var/datum/symptom/S in symptoms) @@ -179,7 +185,6 @@ properties["transmittable"] += S.transmittable if(!S.neutered) properties["severity"] = max(properties["severity"], S.severity) // severity is based on the highest severity non-neutered symptom - return // Assign the properties that are in the list. /datum/disease/advance/proc/AssignProperties() @@ -188,7 +193,7 @@ if(properties["stealth"] >= 2) visibility_flags = HIDDEN_SCANNER - SetSpread(CLAMP(2 ** (properties["transmittable"] - symptoms.len), VIRUS_SPREAD_BLOOD, VIRUS_SPREAD_AIRBORNE)) + SetSpread(CLAMP(2 ** (properties["transmittable"] - symptoms.len), DISEASE_SPREAD_BLOOD, DISEASE_SPREAD_AIRBORNE)) permeability_mod = max(CEILING(0.4 * properties["transmittable"], 1), 1) cure_chance = 15 - CLAMP(properties["resistance"], -5, 5) // can be between 10 and 20 @@ -202,23 +207,23 @@ // Assign the spread type and give it the correct description. /datum/disease/advance/proc/SetSpread(spread_id) switch(spread_id) - if(VIRUS_SPREAD_NON_CONTAGIOUS) - spread_flags = VIRUS_SPREAD_NON_CONTAGIOUS + if(DISEASE_SPREAD_NON_CONTAGIOUS) + spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS spread_text = "None" - if(VIRUS_SPREAD_SPECIAL) - spread_flags = VIRUS_SPREAD_SPECIAL + if(DISEASE_SPREAD_SPECIAL) + spread_flags = DISEASE_SPREAD_SPECIAL spread_text = "None" - if(VIRUS_SPREAD_BLOOD) - spread_flags = VIRUS_SPREAD_BLOOD + if(DISEASE_SPREAD_BLOOD) + spread_flags = DISEASE_SPREAD_BLOOD spread_text = "Blood" - if(VIRUS_SPREAD_CONTACT_FLUIDS) - spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_FLUIDS + if(DISEASE_SPREAD_CONTACT_FLUIDS) + spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_FLUIDS spread_text = "Fluids" - if(VIRUS_SPREAD_CONTACT_SKIN) - spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_FLUIDS | VIRUS_SPREAD_CONTACT_SKIN + if(DISEASE_SPREAD_CONTACT_SKIN) + spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_FLUIDS | DISEASE_SPREAD_CONTACT_SKIN spread_text = "On contact" - if(VIRUS_SPREAD_AIRBORNE) - spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_FLUIDS | VIRUS_SPREAD_CONTACT_SKIN | VIRUS_SPREAD_AIRBORNE + if(DISEASE_SPREAD_AIRBORNE) + spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_FLUIDS | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_AIRBORNE spread_text = "Airborne" /datum/disease/advance/proc/SetSeverity(level_sev) @@ -226,19 +231,19 @@ switch(level_sev) if(-INFINITY to 0) - severity = VIRUS_SEVERITY_POSITIVE + severity = DISEASE_SEVERITY_POSITIVE if(1) - severity = VIRUS_SEVERITY_NONTHREAT + severity = DISEASE_SEVERITY_NONTHREAT if(2) - severity = VIRUS_SEVERITY_MINOR + severity = DISEASE_SEVERITY_MINOR if(3) - severity = VIRUS_SEVERITY_MEDIUM + severity = DISEASE_SEVERITY_MEDIUM if(4) - severity = VIRUS_SEVERITY_HARMFUL + severity = DISEASE_SEVERITY_HARMFUL if(5) - severity = VIRUS_SEVERITY_DANGEROUS + severity = DISEASE_SEVERITY_DANGEROUS if(6 to INFINITY) - severity = VIRUS_SEVERITY_BIOHAZARD + severity = DISEASE_SEVERITY_BIOHAZARD else severity = "Unknown" @@ -253,11 +258,10 @@ var/datum/reagent/D = GLOB.chemical_reagents_list[cures[1]] cure_text = D.name - - return - // Randomly generate a symptom, has a chance to lose or gain a symptom. -/datum/disease/advance/proc/Evolve(min_level, max_level) +/datum/disease/advance/proc/Evolve(min_level, max_level, ignore_mutable = FALSE) + if(!mutable && !ignore_mutable) + return var/s = safepick(GenerateSymptoms(min_level, max_level, 1)) if(s) AddSymptom(s) @@ -265,27 +269,32 @@ return // Randomly remove a symptom. -/datum/disease/advance/proc/Devolve() +/datum/disease/advance/proc/Devolve(ignore_mutable = FALSE) + if(!mutable && !ignore_mutable) + return if(symptoms.len > 1) var/s = safepick(symptoms) if(s) RemoveSymptom(s) Refresh(TRUE) - return // Randomly neuter a symptom. -/datum/disease/advance/proc/Neuter() +/datum/disease/advance/proc/Neuter(ignore_mutable = FALSE) + if(!mutable && !ignore_mutable) + return if(symptoms.len) var/s = safepick(symptoms) if(s) NeuterSymptom(s) Refresh(TRUE) - return // Name the disease. /datum/disease/advance/proc/AssignName(name = "Unknown") - src.name = name - return + Refresh() + var/datum/disease/advance/A = SSdisease.archive_diseases[GetDiseaseID()] + A.name = name + for(var/datum/disease/advance/AD in SSdisease.active_diseases) + AD.Refresh() // Return a unique ID of the disease. /datum/disease/advance/GetDiseaseID() @@ -309,17 +318,15 @@ if(HasSymptom(S)) return - if(symptoms.len < (SYMPTOM_LIMIT - 1) + rand(-1, 1)) + if(symptoms.len < (VIRUS_SYMPTOM_LIMIT - 1) + rand(-1, 1)) symptoms += S else RemoveSymptom(pick(symptoms)) symptoms += S - return // Simply removes the symptom. /datum/disease/advance/proc/RemoveSymptom(datum/symptom/S) symptoms -= S - return // Neuter a symptom, so it will only affect stats /datum/disease/advance/proc/NeuterSymptom(datum/symptom/S) @@ -377,7 +384,7 @@ if(!user) return - var/i = SYMPTOM_LIMIT + var/i = VIRUS_SYMPTOM_LIMIT var/datum/disease/advance/D = new(0, null) D.symptoms = list() @@ -434,5 +441,3 @@ /datum/disease/advance/proc/totalTransmittable() return properties["transmittable"] - -#undef RANDOM_STARTING_LEVEL diff --git a/code/datums/diseases/advance/presets.dm b/code/datums/diseases/advance/presets.dm index d2f6a73365..9574338b51 100644 --- a/code/datums/diseases/advance/presets.dm +++ b/code/datums/diseases/advance/presets.dm @@ -1,59 +1,52 @@ // Cold -/datum/disease/advance/cold/New(var/process = TRUE, var/datum/disease/advance/D, var/copy = FALSE) - if(!D) - name = "Cold" - symptoms = list(new/datum/symptom/sneeze) - ..(process, D, copy) +/datum/disease/advance/cold/New() + name = "Cold" + symptoms = list(new/datum/symptom/sneeze) + ..() // Flu -/datum/disease/advance/flu/New(var/process = TRUE, var/datum/disease/advance/D, var/copy = FALSE) - if(!D) - name = "Flu" - symptoms = list(new/datum/symptom/cough) - ..(process, D, copy) +/datum/disease/advance/flu/New() + name = "Flu" + symptoms = list(new/datum/symptom/cough) + ..() // Voice Changing -/datum/disease/advance/voice_change/New(var/process = TRUE, var/datum/disease/advance/D, var/copy = FALSE) - if(!D) - name = "Epiglottis Mutation" - symptoms = list(new/datum/symptom/voice_change) - ..(process, D, copy) +/datum/disease/advance/voice_change/New() + name = "Epiglottis Mutation" + symptoms = list(new/datum/symptom/voice_change) + ..() // Toxin Filter -/datum/disease/advance/heal/New(var/process = TRUE, var/datum/disease/advance/D, var/copy = FALSE) - if(!D) - name = "Liver Enhancer" - symptoms = list(new/datum/symptom/heal) - ..(process, D, copy) +/datum/disease/advance/heal/New() + name = "Liver Enhancer" + symptoms = list(new/datum/symptom/heal) + ..() // Hallucigen -/datum/disease/advance/hallucigen/New(var/process = TRUE, var/datum/disease/advance/D, var/copy = FALSE) - if(!D) - name = "Second Sight" - symptoms = list(new/datum/symptom/hallucigen) - ..(process, D, copy) +/datum/disease/advance/hallucigen/New() + name = "Second Sight" + symptoms = list(new/datum/symptom/hallucigen) + ..() // Sensory Restoration -/datum/disease/advance/mind_restoration/New(var/process = TRUE, var/datum/disease/advance/D, var/copy = FALSE) - if(!D) - name = "Intelligence Booster" - symptoms = list(new/datum/symptom/mind_restoration) - ..(process, D, copy) +/datum/disease/advance/mind_restoration/New() + name = "Intelligence Booster" + symptoms = list(new/datum/symptom/mind_restoration) + ..() // Sensory Destruction -/datum/disease/advance/narcolepsy/New(var/process = TRUE, var/datum/disease/advance/D, var/copy = FALSE) - if(!D) - name = "Experimental Insomnia Cure" - symptoms = list(new/datum/symptom/narcolepsy) - ..(process, D, copy) \ No newline at end of file +/datum/disease/advance/narcolepsy/New() + name = "Experimental Insomnia Cure" + symptoms = list(new/datum/symptom/narcolepsy) + ..() \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/cough.dm b/code/datums/diseases/advance/symptoms/cough.dm index 323f794eee..1633b41352 100644 --- a/code/datums/diseases/advance/symptoms/cough.dm +++ b/code/datums/diseases/advance/symptoms/cough.dm @@ -40,7 +40,7 @@ BONUS return if(A.properties["stealth"] >= 4) suppress_warning = TRUE - if(A.spread_flags &= VIRUS_SPREAD_AIRBORNE) //infect bystanders + if(A.spread_flags &= DISEASE_SPREAD_AIRBORNE) //infect bystanders infective = TRUE if(A.properties["resistance"] >= 3) //strong enough to drop items power = 1.5 diff --git a/code/datums/diseases/advance/symptoms/symptoms.dm b/code/datums/diseases/advance/symptoms/symptoms.dm index 84e5884ffb..e42b68cc05 100644 --- a/code/datums/diseases/advance/symptoms/symptoms.dm +++ b/code/datums/diseases/advance/symptoms/symptoms.dm @@ -28,6 +28,7 @@ //A neutered symptom has no effect, and only affects statistics. var/neutered = FALSE var/list/thresholds + var/naturally_occuring = TRUE //if this symptom can appear from /datum/disease/advance/GenerateSymptoms() /datum/symptom/New() var/list/S = SSdisease.list_symptoms diff --git a/code/datums/diseases/anxiety.dm b/code/datums/diseases/anxiety.dm index 4673d2e980..2d96157bb0 100644 --- a/code/datums/diseases/anxiety.dm +++ b/code/datums/diseases/anxiety.dm @@ -3,13 +3,13 @@ form = "Infection" max_stages = 4 spread_text = "On contact" - spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_SKIN | VIRUS_SPREAD_CONTACT_FLUIDS + spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS cure_text = "Ethanol" cures = list("ethanol") agent = "Excess Lepidopticides" viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) desc = "If left untreated subject will regurgitate butterflies." - severity = VIRUS_SEVERITY_MINOR + severity = DISEASE_SEVERITY_MINOR /datum/disease/anxiety/stage_act() ..() diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm index 61d1519e7d..5708447542 100644 --- a/code/datums/diseases/appendicitis.dm +++ b/code/datums/diseases/appendicitis.dm @@ -7,9 +7,9 @@ viable_mobtypes = list(/mob/living/carbon/human) permeability_mod = 1 desc = "If left untreated the subject will become very weak, and may vomit often." - severity = VIRUS_SEVERITY_MEDIUM + severity = DISEASE_SEVERITY_MEDIUM disease_flags = CAN_CARRY|CAN_RESIST - spread_flags = VIRUS_SPREAD_NON_CONTAGIOUS + spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS visibility_flags = HIDDEN_PANDEMIC required_organs = list(/obj/item/organ/appendix) bypasses_immunity = TRUE // Immunity is based on not having an appendix; this isn't a virus diff --git a/code/datums/diseases/beesease.dm b/code/datums/diseases/beesease.dm index dc848ab622..f6504fa464 100644 --- a/code/datums/diseases/beesease.dm +++ b/code/datums/diseases/beesease.dm @@ -3,13 +3,13 @@ form = "Infection" max_stages = 4 spread_text = "On contact" - spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_SKIN | VIRUS_SPREAD_CONTACT_FLUIDS + spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS cure_text = "Sugar" cures = list("sugar") agent = "Apidae Infection" viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) desc = "If left untreated subject will regurgitate bees." - severity = VIRUS_SEVERITY_MEDIUM + severity = DISEASE_SEVERITY_MEDIUM infectable_hosts = list(SPECIES_ORGANIC, SPECIES_UNDEAD) //bees nesting in corpses /datum/disease/beesease/stage_act() diff --git a/code/datums/diseases/brainrot.dm b/code/datums/diseases/brainrot.dm index 49f8afcaff..0a34501763 100644 --- a/code/datums/diseases/brainrot.dm +++ b/code/datums/diseases/brainrot.dm @@ -2,7 +2,7 @@ name = "Brainrot" max_stages = 4 spread_text = "On contact" - spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_SKIN | VIRUS_SPREAD_CONTACT_FLUIDS + spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS cure_text = "Mannitol" cures = list("mannitol") agent = "Cryptococcus Cosmosis" @@ -10,7 +10,7 @@ cure_chance = 15//higher chance to cure, since two reagents are required desc = "This disease destroys the braincells, causing brain fever, brain necrosis and general intoxication." required_organs = list(/obj/item/organ/brain) - severity = VIRUS_SEVERITY_HARMFUL + severity = DISEASE_SEVERITY_HARMFUL /datum/disease/brainrot/stage_act() //Removed toxloss because damaging diseases are pretty horrible. Last round it killed the entire station because the cure didn't work -- Urist -ACTUALLY Removed rather than commented out, I don't see it returning - RR ..() diff --git a/code/datums/diseases/cold.dm b/code/datums/diseases/cold.dm index e9f02b91b6..22d45ffb29 100644 --- a/code/datums/diseases/cold.dm +++ b/code/datums/diseases/cold.dm @@ -7,7 +7,7 @@ viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) permeability_mod = 0.5 desc = "If left untreated the subject will contract the flu." - severity = VIRUS_SEVERITY_NONTHREAT + severity = DISEASE_SEVERITY_NONTHREAT /datum/disease/cold/stage_act() ..() @@ -47,7 +47,7 @@ if(prob(1)) to_chat(affected_mob, "Mucous runs down the back of your throat.") if(prob(1) && prob(50)) - if(!affected_mob.resistances.Find(/datum/disease/flu)) - var/datum/disease/Flu = new /datum/disease/flu(0) - affected_mob.ForceContractDisease(Flu) + if(!affected_mob.disease_resistances.Find(/datum/disease/flu)) + var/datum/disease/Flu = new /datum/disease/flu() + affected_mob.ForceContractDisease(Flu, FALSE, TRUE) cure() \ No newline at end of file diff --git a/code/datums/diseases/cold9.dm b/code/datums/diseases/cold9.dm index c68ee196c1..da5e67a4fb 100644 --- a/code/datums/diseases/cold9.dm +++ b/code/datums/diseases/cold9.dm @@ -2,13 +2,13 @@ name = "The Cold" max_stages = 3 spread_text = "On contact" - spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_SKIN | VIRUS_SPREAD_CONTACT_FLUIDS + spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS cure_text = "Common Cold Anti-bodies & Spaceacillin" cures = list("spaceacillin") agent = "ICE9-rhinovirus" viable_mobtypes = list(/mob/living/carbon/human) desc = "If left untreated the subject will slow, as if partly frozen." - severity = VIRUS_SEVERITY_HARMFUL + severity = DISEASE_SEVERITY_HARMFUL /datum/disease/cold9/stage_act() ..() diff --git a/code/datums/diseases/dna_spread.dm b/code/datums/diseases/dna_spread.dm index fefdabd9c8..267dd711a3 100644 --- a/code/datums/diseases/dna_spread.dm +++ b/code/datums/diseases/dna_spread.dm @@ -2,7 +2,7 @@ name = "Space Retrovirus" max_stages = 4 spread_text = "On contact" - spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_SKIN | VIRUS_SPREAD_CONTACT_FLUIDS + spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS cure_text = "Mutadone" cures = list("mutadone") disease_flags = CAN_CARRY|CAN_RESIST|CURABLE @@ -11,7 +11,7 @@ var/datum/dna/original_dna = null var/transformed = 0 desc = "This disease transplants the genetic code of the initial vector into new hosts." - severity = VIRUS_SEVERITY_MEDIUM + severity = DISEASE_SEVERITY_MEDIUM /datum/disease/dnaspread/stage_act() diff --git a/code/datums/diseases/fake_gbs.dm b/code/datums/diseases/fake_gbs.dm index e62a8b491d..add60c73f1 100644 --- a/code/datums/diseases/fake_gbs.dm +++ b/code/datums/diseases/fake_gbs.dm @@ -2,13 +2,13 @@ name = "GBS" max_stages = 5 spread_text = "On contact" - spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_SKIN | VIRUS_SPREAD_CONTACT_FLUIDS + spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS cure_text = "Synaptizine & Sulfur" cures = list("synaptizine","sulfur") agent = "Gravitokinetic Bipotential SADS-" viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) desc = "If left untreated death will occur." - severity = VIRUS_SEVERITY_BIOHAZARD + severity = DISEASE_SEVERITY_BIOHAZARD /datum/disease/fake_gbs/stage_act() ..() diff --git a/code/datums/diseases/flu.dm b/code/datums/diseases/flu.dm index 206b61fb35..e1943937ba 100644 --- a/code/datums/diseases/flu.dm +++ b/code/datums/diseases/flu.dm @@ -9,7 +9,7 @@ viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) permeability_mod = 0.75 desc = "If left untreated the subject will feel quite unwell." - severity = VIRUS_SEVERITY_MINOR + severity = DISEASE_SEVERITY_MINOR /datum/disease/flu/stage_act() ..() diff --git a/code/datums/diseases/fluspanish.dm b/code/datums/diseases/fluspanish.dm index 22787cc23a..9577ca43d0 100644 --- a/code/datums/diseases/fluspanish.dm +++ b/code/datums/diseases/fluspanish.dm @@ -9,7 +9,7 @@ viable_mobtypes = list(/mob/living/carbon/human) permeability_mod = 0.75 desc = "If left untreated the subject will burn to death for being a heretic." - severity = VIRUS_SEVERITY_DANGEROUS + severity = DISEASE_SEVERITY_DANGEROUS /datum/disease/fluspanish/stage_act() ..() diff --git a/code/datums/diseases/gbs.dm b/code/datums/diseases/gbs.dm index 6d77acd3ae..0487b1c815 100644 --- a/code/datums/diseases/gbs.dm +++ b/code/datums/diseases/gbs.dm @@ -2,7 +2,7 @@ name = "GBS" max_stages = 4 spread_text = "On contact" - spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_SKIN | VIRUS_SPREAD_CONTACT_FLUIDS + spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS cure_text = "Synaptizine & Sulfur" cures = list("synaptizine","sulfur") cure_chance = 15//higher chance to cure, since two reagents are required @@ -10,7 +10,7 @@ viable_mobtypes = list(/mob/living/carbon/human) disease_flags = CAN_CARRY|CAN_RESIST|CURABLE permeability_mod = 1 - severity = VIRUS_SEVERITY_BIOHAZARD + severity = DISEASE_SEVERITY_BIOHAZARD /datum/disease/gbs/stage_act() ..() diff --git a/code/datums/diseases/heart_failure.dm b/code/datums/diseases/heart_failure.dm index 06687cc12d..a9adf39812 100644 --- a/code/datums/diseases/heart_failure.dm +++ b/code/datums/diseases/heart_failure.dm @@ -10,12 +10,17 @@ desc = "If left untreated the subject will die!" severity = "Dangerous!" disease_flags = CAN_CARRY|CAN_RESIST - spread_flags = VIRUS_SPREAD_NON_CONTAGIOUS + spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS visibility_flags = HIDDEN_PANDEMIC required_organs = list(/obj/item/organ/heart) bypasses_immunity = TRUE // Immunity is based on not having an appendix; this isn't a virus var/sound = FALSE +/datum/disease/heart_failure/Copy() + var/datum/disease/heart_failure/D = ..() + D.sound = sound + return D + /datum/disease/heart_failure/stage_act() ..() var/obj/item/organ/heart/O = affected_mob.getorgan(/obj/item/organ/heart) diff --git a/code/datums/diseases/magnitis.dm b/code/datums/diseases/magnitis.dm index 91ce1ca71e..13959e9bda 100644 --- a/code/datums/diseases/magnitis.dm +++ b/code/datums/diseases/magnitis.dm @@ -9,7 +9,7 @@ disease_flags = CAN_CARRY|CAN_RESIST|CURABLE permeability_mod = 0.75 desc = "This disease disrupts the magnetic field of your body, making it act as if a powerful magnet. Injections of iron help stabilize the field." - severity = VIRUS_SEVERITY_MEDIUM + severity = DISEASE_SEVERITY_MEDIUM infectable_hosts = list(SPECIES_ORGANIC, SPECIES_ROBOTIC) process_dead = TRUE diff --git a/code/datums/diseases/parrotpossession.dm b/code/datums/diseases/parrotpossession.dm index 284c3bd7f2..4fe0dc21b0 100644 --- a/code/datums/diseases/parrotpossession.dm +++ b/code/datums/diseases/parrotpossession.dm @@ -2,7 +2,7 @@ name = "Parrot Possession" max_stages = 1 spread_text = "Paranormal" - spread_flags = VIRUS_SPREAD_SPECIAL + spread_flags = DISEASE_SPREAD_SPECIAL disease_flags = CURABLE cure_text = "Holy Water." cures = list("holywater") @@ -10,7 +10,7 @@ agent = "Avian Vengence" viable_mobtypes = list(/mob/living/carbon/human) desc = "Subject is possesed by the vengeful spirit of a parrot. Call the priest." - severity = VIRUS_SEVERITY_MEDIUM + severity = DISEASE_SEVERITY_MEDIUM infectable_hosts = list(SPECIES_ORGANIC, SPECIES_UNDEAD, SPECIES_INORGANIC, SPECIES_ROBOTIC) bypasses_immunity = TRUE //2spook var/mob/living/simple_animal/parrot/Poly/ghost/parrot diff --git a/code/datums/diseases/pierrot_throat.dm b/code/datums/diseases/pierrot_throat.dm index 89dce44536..8f13d2e2fa 100644 --- a/code/datums/diseases/pierrot_throat.dm +++ b/code/datums/diseases/pierrot_throat.dm @@ -9,7 +9,7 @@ viable_mobtypes = list(/mob/living/carbon/human) permeability_mod = 0.75 desc = "If left untreated the subject will probably drive others to insanity." - severity = VIRUS_SEVERITY_MEDIUM + severity = DISEASE_SEVERITY_MEDIUM /datum/disease/pierrot_throat/stage_act() ..() diff --git a/code/datums/diseases/retrovirus.dm b/code/datums/diseases/retrovirus.dm index ae5fa9655f..fe099e495b 100644 --- a/code/datums/diseases/retrovirus.dm +++ b/code/datums/diseases/retrovirus.dm @@ -2,20 +2,17 @@ name = "Retrovirus" max_stages = 4 spread_text = "Contact" - spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_SKIN | VIRUS_SPREAD_CONTACT_FLUIDS + spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS cure_text = "Rest or an injection of mutadone" cure_chance = 6 agent = "" viable_mobtypes = list(/mob/living/carbon/human) desc = "A DNA-altering retrovirus that scrambles the structural and unique enzymes of a host constantly." - severity = VIRUS_SEVERITY_HARMFUL + severity = DISEASE_SEVERITY_HARMFUL permeability_mod = 0.4 stage_prob = 2 - var/SE - var/UI var/restcure = 0 - /datum/disease/dna_retrovirus/New() ..() agent = "Virus class [pick("A","B","C","D","E","F")][pick("A","B","C","D","E","F")]-[rand(50,300)]" @@ -24,6 +21,10 @@ else restcure = 1 +/datum/disease/dna_retrovirus/Copy() + var/datum/disease/dna_retrovirus/D = ..() + D.restcure = restcure + return D /datum/disease/dna_retrovirus/stage_act() ..() diff --git a/code/datums/diseases/rhumba_beat.dm b/code/datums/diseases/rhumba_beat.dm index 8217364fb5..1aee35741a 100644 --- a/code/datums/diseases/rhumba_beat.dm +++ b/code/datums/diseases/rhumba_beat.dm @@ -2,13 +2,13 @@ name = "The Rhumba Beat" max_stages = 5 spread_text = "On contact" - spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_SKIN | VIRUS_SPREAD_CONTACT_FLUIDS + spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS cure_text = "Chick Chicky Boom!" cures = list("plasma") agent = "Unknown" viable_mobtypes = list(/mob/living/carbon/human) permeability_mod = 1 - severity = VIRUS_SEVERITY_BIOHAZARD + severity = DISEASE_SEVERITY_BIOHAZARD process_dead = TRUE /datum/disease/rhumba_beat/stage_act() diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index 17aebc4629..db88bd6777 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -2,11 +2,11 @@ name = "Transformation" max_stages = 5 spread_text = "Acute" - spread_flags = VIRUS_SPREAD_SPECIAL + spread_flags = DISEASE_SPREAD_SPECIAL cure_text = "A coder's love (theoretical)." agent = "Shenanigans" viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey, /mob/living/carbon/alien) - severity = VIRUS_SEVERITY_BIOHAZARD + severity = DISEASE_SEVERITY_BIOHAZARD stage_prob = 10 visibility_flags = HIDDEN_SCANNER|HIDDEN_PANDEMIC disease_flags = CURABLE @@ -17,6 +17,16 @@ var/list/stage5 = list("Oh the humanity!") var/new_form = /mob/living/carbon/human +/datum/disease/transformation/Copy() + var/datum/disease/transformation/D = ..() + D.stage1 = stage1.Copy() + D.stage2 = stage2.Copy() + D.stage3 = stage3.Copy() + D.stage4 = stage4.Copy() + D.stage5 = stage5.Copy() + D.new_form = D.new_form + return D + /datum/disease/transformation/stage_act() ..() switch(stage) @@ -68,13 +78,13 @@ cure_text = "Death." cures = list("adminordrazine") spread_text = "Monkey Bites" - spread_flags = VIRUS_SPREAD_SPECIAL + spread_flags = DISEASE_SPREAD_SPECIAL viable_mobtypes = list(/mob/living/carbon/monkey, /mob/living/carbon/human) permeability_mod = 1 cure_chance = 1 disease_flags = CAN_CARRY|CAN_RESIST desc = "Monkeys with this disease will bite humans, causing humans to mutate into a monkey." - severity = VIRUS_SEVERITY_BIOHAZARD + severity = DISEASE_SEVERITY_BIOHAZARD stage_prob = 4 visibility_flags = 0 agent = "Kongey Vibrion M-909" @@ -131,7 +141,7 @@ cure_chance = 5 agent = "R2D2 Nanomachines" desc = "This disease, actually acute nanomachine infection, converts the victim into a cyborg." - severity = VIRUS_SEVERITY_BIOHAZARD + severity = DISEASE_SEVERITY_BIOHAZARD visibility_flags = 0 stage1 = null stage2 = list("Your joints feel stiff.", "Beep...boop..") @@ -163,7 +173,7 @@ cure_chance = 5 agent = "Rip-LEY Alien Microbes" desc = "This disease changes the victim into a xenomorph." - severity = VIRUS_SEVERITY_BIOHAZARD + severity = DISEASE_SEVERITY_BIOHAZARD visibility_flags = 0 stage1 = null stage2 = list("Your throat feels scratchy.", "Kill...") @@ -191,7 +201,7 @@ cure_chance = 80 agent = "Advanced Mutation Toxin" desc = "This highly concentrated extract converts anything into more of itself." - severity = VIRUS_SEVERITY_BIOHAZARD + severity = DISEASE_SEVERITY_BIOHAZARD visibility_flags = 0 stage1 = list("You don't feel very well.") stage2 = list("Your skin feels a little slimy.") @@ -219,7 +229,7 @@ cures = list("adminordrazine") agent = "Fell Doge Majicks" desc = "This disease transforms the victim into a corgi." - severity = VIRUS_SEVERITY_BIOHAZARD + severity = DISEASE_SEVERITY_BIOHAZARD visibility_flags = 0 stage1 = list("BARK.") stage2 = list("You feel the need to wear silly hats.") @@ -245,7 +255,7 @@ agent = "Gluttony's Blessing" desc = "A 'gift' from somewhere terrible." stage_prob = 20 - severity = VIRUS_SEVERITY_BIOHAZARD + severity = DISEASE_SEVERITY_BIOHAZARD visibility_flags = 0 stage1 = list("Your stomach rumbles.") stage2 = list("Your skin feels saggy.") diff --git a/code/datums/diseases/tuberculosis.dm b/code/datums/diseases/tuberculosis.dm index c8524fd038..e413891e75 100644 --- a/code/datums/diseases/tuberculosis.dm +++ b/code/datums/diseases/tuberculosis.dm @@ -10,7 +10,7 @@ cure_chance = 5//like hell are you getting out of hell desc = "A rare highly transmittable virulent virus. Few samples exist, rumoured to be carefully grown and cultured by clandestine bio-weapon specialists. Causes fever, blood vomiting, lung damage, weight loss, and fatigue." required_organs = list(/obj/item/organ/lungs) - severity = VIRUS_SEVERITY_BIOHAZARD + severity = DISEASE_SEVERITY_BIOHAZARD bypasses_immunity = TRUE // TB primarily impacts the lungs; it's also bacterial or fungal in nature; viral immunity should do nothing. /datum/disease/tuberculosis/stage_act() //it begins diff --git a/code/datums/diseases/wizarditis.dm b/code/datums/diseases/wizarditis.dm index 612418b1ca..cfc848000b 100644 --- a/code/datums/diseases/wizarditis.dm +++ b/code/datums/diseases/wizarditis.dm @@ -10,7 +10,7 @@ disease_flags = CAN_CARRY|CAN_RESIST|CURABLE permeability_mod = 0.75 desc = "Some speculate that this virus is the cause of the Space Wizard Federation's existence. Subjects affected show the signs of mental retardation, yelling obscure sentences or total gibberish. On late stages subjects sometime express the feelings of inner power, and, cite, 'the ability to control the forces of cosmos themselves!' A gulp of strong, manly spirits usually reverts them to normal, humanlike, condition." - severity = VIRUS_SEVERITY_HARMFUL + severity = DISEASE_SEVERITY_HARMFUL required_organs = list(/obj/item/bodypart/head) /* diff --git a/code/datums/hud.dm b/code/datums/hud.dm index 17632acba0..54b28deeee 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -11,6 +11,7 @@ GLOBAL_LIST_INIT(huds, list( DATA_HUD_DIAGNOSTIC_BASIC = new/datum/atom_hud/data/diagnostic/basic(), DATA_HUD_DIAGNOSTIC_ADVANCED = new/datum/atom_hud/data/diagnostic/advanced(), DATA_HUD_ABDUCTOR = new/datum/atom_hud/abductor(), + DATA_HUD_SENTIENT_DISEASE = new/datum/atom_hud/sentient_disease(), ANTAG_HUD_CULT = new/datum/atom_hud/antag(), ANTAG_HUD_REV = new/datum/atom_hud/antag(), ANTAG_HUD_OPS = new/datum/atom_hud/antag(), diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 8024322037..24fa11eda0 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -63,6 +63,9 @@ /datum/atom_hud/abductor hud_icons = list(GLAND_HUD) +/datum/atom_hud/sentient_disease + hud_icons = list(SENTIENT_DISEASE_HUD) + /* MED/SEC/DIAG HUD HOOKS */ /* @@ -78,7 +81,7 @@ //called when a carbon changes virus /mob/living/carbon/proc/check_virus() var/threat - for(var/thing in viruses) + for(var/thing in diseases) var/datum/disease/D = thing if(!(D.visibility_flags & HIDDEN_SCANNER)) if(!threat || D.severity > threat) //a buffing virus gets an icon @@ -175,19 +178,19 @@ holder.icon_state = "huddead" else switch(virus_threat) - if(VIRUS_SEVERITY_BIOHAZARD) + if(DISEASE_SEVERITY_BIOHAZARD) holder.icon_state = "hudill5" - if(VIRUS_SEVERITY_DANGEROUS) + if(DISEASE_SEVERITY_DANGEROUS) holder.icon_state = "hudill4" - if(VIRUS_SEVERITY_HARMFUL) + if(DISEASE_SEVERITY_HARMFUL) holder.icon_state = "hudill3" - if(VIRUS_SEVERITY_MEDIUM) + if(DISEASE_SEVERITY_MEDIUM) holder.icon_state = "hudill2" - if(VIRUS_SEVERITY_MINOR) + if(DISEASE_SEVERITY_MINOR) holder.icon_state = "hudill1" - if(VIRUS_SEVERITY_NONTHREAT) + if(DISEASE_SEVERITY_NONTHREAT) holder.icon_state = "hudill0" - if(VIRUS_SEVERITY_POSITIVE) + if(DISEASE_SEVERITY_POSITIVE) holder.icon_state = "hudbuff" if(null) holder.icon_state = "hudhealthy" diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index f1c18f50a6..f23f13cca4 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -19,7 +19,7 @@ if(LAZYLEN(diseases)) var/list/datum/disease/diseases_to_add = list() for(var/datum/disease/D in diseases) - if(D.spread_flags & VIRUS_SPREAD_CONTACT_FLUIDS) + if(D.spread_flags & DISEASE_SPREAD_CONTACT_FLUIDS) diseases_to_add += D if(LAZYLEN(diseases_to_add)) AddComponent(/datum/component/infective, diseases_to_add) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 05264aaa5a..6488b4e001 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -262,7 +262,7 @@ GAS ANALYZER if(tdelta < (DEFIB_TIME_LIMIT * 10)) to_chat(user, "Subject died [DisplayTimeText(tdelta)] ago, defibrillation may be possible!") - for(var/thing in M.viruses) + for(var/thing in M.diseases) var/datum/disease/D = thing if(!(D.visibility_flags & HIDDEN_SCANNER)) to_chat(user, "Warning: [D.form] detected\nName: [D.name].\nType: [D.spread_text].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure_text]") diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 51cfdbe529..f38bfdd84d 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -589,14 +589,17 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list( message_admins("[key_name_admin(usr)] removed the spell [S] from [key_name(T)].") SSblackbox.record_feedback("tally", "admin_verb", 1, "Remove Spell") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/proc/give_disease(mob/T in GLOB.mob_list) +/client/proc/give_disease(mob/living/T in GLOB.mob_living_list) set category = "Fun" set name = "Give Disease" set desc = "Gives a Disease to a mob." + if(!istype(T)) + to_chat(src, "You can only give a disease to a mob of type /mob/living.") + return var/datum/disease/D = input("Choose the disease to give to that guy", "ACHOO") as null|anything in SSdisease.diseases if(!D) return - T.ForceContractDisease(new D) + T.ForceContractDisease(new D, FALSE, TRUE) SSblackbox.record_feedback("tally", "admin_verb", 1, "Give Disease") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] gave [key_name(T)] the disease [D].") message_admins("[key_name_admin(usr)] gave [key_name(T)] the disease [D].") diff --git a/code/modules/antagonists/abductor/equipment/gland.dm b/code/modules/antagonists/abductor/equipment/gland.dm index faa6b6c1e3..3db66dee57 100644 --- a/code/modules/antagonists/abductor/equipment/gland.dm +++ b/code/modules/antagonists/abductor/equipment/gland.dm @@ -194,15 +194,12 @@ to_chat(owner, "You feel sick.") var/datum/disease/advance/A = random_virus(pick(2,6),6) A.carrier = TRUE - owner.viruses += A - A.affected_mob = owner - owner.med_hud_set_status() + owner.ForceContractDisease(A, FALSE, TRUE) /obj/item/organ/heart/gland/viral/proc/random_virus(max_symptoms, max_level) - if(max_symptoms > SYMPTOM_LIMIT) - max_symptoms = SYMPTOM_LIMIT - var/datum/disease/advance/A = new(FALSE, null) - A.symptoms = list() + if(max_symptoms > VIRUS_SYMPTOM_LIMIT) + max_symptoms = VIRUS_SYMPTOM_LIMIT + var/datum/disease/advance/A = new /datum/disease/advance() var/list/datum/symptom/possible_symptoms = list() for(var/symptom in subtypesof(/datum/symptom)) var/datum/symptom/S = symptom diff --git a/code/modules/antagonists/blob/blob/overmind.dm b/code/modules/antagonists/blob/blob/overmind.dm index 6c852684b2..9d31852d28 100644 --- a/code/modules/antagonists/blob/blob/overmind.dm +++ b/code/modules/antagonists/blob/blob/overmind.dm @@ -20,6 +20,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) pass_flags = PASSBLOB faction = list(ROLE_BLOB) lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + call_life = TRUE var/obj/structure/blob/core/blob_core = null // The blob overmind's core var/blob_points = 0 var/max_blob_points = 100 @@ -67,7 +68,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) if(!T) CRASH("No blobspawnpoints and blob spawned in nullspace.") forceMove(T) - + /mob/camera/blob/proc/is_valid_turf(turf/T) var/area/A = get_area(T) if((A && !A.blob_allowed) || !T || !is_station_level(T.z) || isspaceturf(T)) @@ -217,9 +218,6 @@ GLOBAL_LIST_EMPTY(blob_nodes) var/link = FOLLOW_LINK(M, src) to_chat(M, "[link] [rendered]") -/mob/camera/blob/emote(act,m_type=1,message = null) - return - /mob/camera/blob/blob_act(obj/structure/blob/B) return diff --git a/code/modules/antagonists/changeling/powers/panacea.dm b/code/modules/antagonists/changeling/powers/panacea.dm index 93a05834fe..cb5aba6c99 100644 --- a/code/modules/antagonists/changeling/powers/panacea.dm +++ b/code/modules/antagonists/changeling/powers/panacea.dm @@ -30,9 +30,11 @@ user.reagents.add_reagent("antihol", 10) user.reagents.add_reagent("mannitol", 25) - for(var/thing in user.viruses) - var/datum/disease/D = thing - if(D.severity == VIRUS_SEVERITY_POSITIVE) - continue - D.cure() + if(isliving(user)) + var/mob/living/L = user + for(var/thing in L.diseases) + var/datum/disease/D = thing + if(D.severity == DISEASE_SEVERITY_POSITIVE) + continue + D.cure() return TRUE diff --git a/code/modules/antagonists/disease/disease_abilities.dm b/code/modules/antagonists/disease/disease_abilities.dm new file mode 100644 index 0000000000..8172d58d8e --- /dev/null +++ b/code/modules/antagonists/disease/disease_abilities.dm @@ -0,0 +1,347 @@ +/* +Abilities that can be purchased by disease mobs. Most are just passive symptoms that will be +added to their disease, but some are active abilites that affect only the target the overmind +is currently following. +*/ + +GLOBAL_LIST_INIT(disease_ability_singletons, list( + new /datum/disease_ability/action/cough(), + new /datum/disease_ability/action/sneeze(), + new /datum/disease_ability/symptom/cough(), + new /datum/disease_ability/symptom/sneeze(),\ + new /datum/disease_ability/symptom/hallucigen(), + new /datum/disease_ability/symptom/choking(), + new /datum/disease_ability/symptom/confusion(), + new /datum/disease_ability/symptom/youth(), + new /datum/disease_ability/symptom/vomit(), + new /datum/disease_ability/symptom/voice_change(), + new /datum/disease_ability/symptom/visionloss(), + new /datum/disease_ability/symptom/viraladaptation(), + new /datum/disease_ability/symptom/vitiligo(), + new /datum/disease_ability/symptom/sensory_restoration(), + new /datum/disease_ability/symptom/itching(), + new /datum/disease_ability/symptom/weight_loss(), + new /datum/disease_ability/symptom/metabolism_heal(), + new /datum/disease_ability/symptom/coma_heal() + )) + +/datum/disease_ability + var/name + var/cost = 0 + var/required_total_points = 0 + var/start_with = FALSE + var/short_desc = "" + var/long_desc = "" + var/stat_block = "" + var/threshold_block = "" + var/category = "" + + var/list/symptoms + var/list/actions + +/datum/disease_ability/New() + ..() + if(symptoms) + var/stealth = 0 + var/resistance = 0 + var/stage_speed = 0 + var/transmittable = 0 + for(var/T in symptoms) + var/datum/symptom/S = T + stealth += initial(S.stealth) + resistance += initial(S.resistance) + stage_speed += initial(S.stage_speed) + transmittable += initial(S.transmittable) + threshold_block += "

[initial(S.threshold_desc)]" + stat_block = "Resistance: [resistance]
Stealth: [stealth]
Stage Speed: [stage_speed]
Transmittability: [transmittable]

" + +/datum/disease_ability/proc/CanBuy(mob/camera/disease/D) + if(world.time < D.next_adaptation_time) + return FALSE + if(!D.unpurchased_abilities[src]) + return FALSE + return (D.points >= cost) && (D.total_points >= required_total_points) + +/datum/disease_ability/proc/Buy(mob/camera/disease/D, silent = FALSE, trigger_cooldown = TRUE) + if(!silent) + to_chat(D, "Purchased [name].") + D.points -= cost + D.unpurchased_abilities -= src + if(trigger_cooldown) + D.adapt_cooldown() + D.purchased_abilities[src] = TRUE + for(var/V in (D.disease_instances+D.disease_template)) + var/datum/disease/advance/sentient_disease/SD = V + if(symptoms) + for(var/T in symptoms) + var/datum/symptom/S = new T() + SD.symptoms += S + if(SD.processing) + S.Start(SD) + SD.Refresh() + for(var/T in actions) + var/datum/action/A = new T() + A.Grant(D) + + +/datum/disease_ability/proc/CanRefund(mob/camera/disease/D) + if(world.time < D.next_adaptation_time) + return FALSE + return D.purchased_abilities[src] + +/datum/disease_ability/proc/Refund(mob/camera/disease/D, silent = FALSE, trigger_cooldown = TRUE) + if(!silent) + to_chat(D, "Refunded [name].") + D.points += cost + D.unpurchased_abilities[src] = TRUE + if(trigger_cooldown) + D.adapt_cooldown() + D.purchased_abilities -= src + for(var/V in (D.disease_instances+D.disease_template)) + var/datum/disease/advance/sentient_disease/SD = V + if(symptoms) + for(var/T in symptoms) + var/datum/symptom/S = locate(T) in SD.symptoms + if(S) + SD.symptoms -= S + if(SD.processing) + S.End(SD) + qdel(S) + SD.Refresh() + for(var/T in actions) + var/datum/action/A = locate(T) in D.actions + qdel(A) + +//these sybtypes are for conveniently separating the different categories, they have no unique code. + +/datum/disease_ability/action + category = "Active" + +/datum/disease_ability/symptom + category = "Symptom" + +//active abilities and their associated actions + +/datum/disease_ability/action/cough + name = "Voluntary Coughing" + actions = list(/datum/action/cooldown/disease_cough) + cost = 0 + required_total_points = 0 + start_with = TRUE + short_desc = "Force the host you are following to cough, spreading your infection to those nearby." + long_desc = "Force the host you are following to cough with extra force, spreading your infection to those within two meters of your host even if your transmitability is low.
Cooldown: 10 seconds" + + +/datum/action/cooldown/disease_cough + name = "Cough" + icon_icon = 'icons/mob/actions/actions_minor_antag.dmi' + button_icon_state = "cough" + desc = "Force the host you are following to cough with extra force, spreading your infection to those within two meters of your host even if your transmitability is low.
Cooldown: 10 seconds" + cooldown_time = 100 + +/datum/action/cooldown/disease_cough/Trigger() + if(!..()) + return FALSE + var/mob/camera/disease/D = owner + var/mob/living/L = D.following_host + if(!L) + return FALSE + if(L.stat != CONSCIOUS) + to_chat(D, "Your host must be concious to cough.") + return FALSE + to_chat(D, "You force [L.real_name] to cough.") + L.emote("cough") + var/datum/disease/advance/sentient_disease/SD = D.hosts[L] + SD.spread(2) + StartCooldown() + return TRUE + + +/datum/disease_ability/action/sneeze + name = "Voluntary Sneezing" + actions = list(/datum/action/cooldown/disease_sneeze) + cost = 2 + required_total_points = 3 + short_desc = "Force the host you are following to sneeze, spreading your infection to those in front of them." + long_desc = "Force the host you are following to sneeze with extra force, spreading your infection to any victims in a 4 meter cone in front of your host.
Cooldown: 20 seconds" + + +/datum/action/cooldown/disease_sneeze + name = "Sneeze" + icon_icon = 'icons/mob/actions/actions_minor_antag.dmi' + button_icon_state = "sneeze" + desc = "Force the host you are following to sneeze with extra force, spreading your infection to any victims in a 4 meter cone in front of your host even if your transmitability is low.
Cooldown: 20 seconds" + cooldown_time = 200 + +/datum/action/cooldown/disease_sneeze/Trigger() + if(!..()) + return FALSE + var/mob/camera/disease/D = owner + var/mob/living/L = D.following_host + if(!L) + return FALSE + if(L.stat != CONSCIOUS) + to_chat(D, "Your host must be concious to sneeze.") + return FALSE + to_chat(D, "You force [L.real_name] to sneeze.") + L.emote("sneeze") + var/datum/disease/advance/sentient_disease/SD = D.hosts[L] + + for(var/mob/living/M in oview(4, SD.affected_mob)) + if(is_A_facing_B(SD.affected_mob, M) && disease_air_spread_walk(get_turf(SD.affected_mob), get_turf(M))) + M.AirborneContractDisease(SD, TRUE) + + StartCooldown() + return TRUE + +//passive symptom abilities + +/datum/disease_ability/symptom/cough + name = "Involuntary Coughing" + symptoms = list(/datum/symptom/cough) + cost = 2 + required_total_points = 4 + short_desc = "Cause victims to cough intermittently." + long_desc = "Cause victims to cough intermittently, spreading your infection if your transmitability is high." + +/datum/disease_ability/symptom/sneeze + name = "Involuntary Sneezing" + symptoms = list(/datum/symptom/sneeze) + cost = 2 + required_total_points = 4 + short_desc = "Cause victims to sneeze intermittently." + long_desc = "Cause victims to sneeze intermittently, spreading your infection and also increasing transmitability and resistance, at the cost of stealth." + +/datum/disease_ability/symptom/beard + //I don't think I need to justify the fact that this is the best symptom + name = "Beard Growth" + symptoms = list(/datum/symptom/beard) + cost = 1 + required_total_points = 8 + short_desc = "Cause all victims to grow a luscious beard." + long_desc = "Cause all victims to grow a luscious beard. Decreases stats slightly. Ineffective against Santa Claus." + +/datum/disease_ability/symptom/hallucigen + name = "Hallucinations" + symptoms = list(/datum/symptom/hallucigen) + cost = 4 + required_total_points = 8 + short_desc = "Cause victims to hallucinate." + long_desc = "Cause victims to hallucinate. Decreases stats, especially resistance." + + +/datum/disease_ability/symptom/choking + name = "Choking" + symptoms = list(/datum/symptom/choking) + cost = 4 + required_total_points = 8 + short_desc = "Cause victims to choke." + long_desc = "Cause victims to choke, threatening asphyxiation. Decreases stats, especially transmittability." + + +/datum/disease_ability/symptom/confusion + name = "Confusion" + symptoms = list(/datum/symptom/confusion) + cost = 4 + required_total_points = 8 + short_desc = "Cause victims to become confused." + long_desc = "Cause victims to become confused intermittently." + + +/datum/disease_ability/symptom/youth + name = "Eternal Youth" + symptoms = list(/datum/symptom/youth) + cost = 4 + required_total_points = 8 + short_desc = "Cause victims to become eternally young." + long_desc = "Cause victims to become eternally young. Provides boosts to all stats except transmittability." + + +/datum/disease_ability/symptom/vomit + name = "Vomiting" + symptoms = list(/datum/symptom/vomit) + cost = 4 + required_total_points = 8 + short_desc = "Cause victims to vomit." + long_desc = "Cause victims to vomit. Slightly increases transmittability. Vomiting also also causes the victims to lose nutrition and removes some toxin damage." + + +/datum/disease_ability/symptom/voice_change + name = "Voice Changing" + symptoms = list(/datum/symptom/voice_change) + cost = 4 + required_total_points = 8 + short_desc = "Change the voice of victims." + long_desc = "Change the voice of victims, causing confusion in communications." + + +/datum/disease_ability/symptom/visionloss + name = "Vision Loss" + symptoms = list(/datum/symptom/visionloss) + cost = 4 + required_total_points = 8 + short_desc = "Damage the eyes of victims, eventually causing blindness." + long_desc = "Damage the eyes of victims, eventually causing blindness. Decreases all stats." + + +/datum/disease_ability/symptom/viraladaptation + name = "Self-Adaptation" + symptoms = list(/datum/symptom/viraladaptation) + cost = 4 + required_total_points = 8 + short_desc = "Cause your infection to become more resistant to detection and eradication." + long_desc = "Cause your infection to mimic the function of normal body cells, becoming much harder to spot and to eradicate, but reducing its speed." + + +/datum/disease_ability/symptom/vitiligo + name = "Skin Paleness" + symptoms = list(/datum/symptom/vitiligo) + cost = 1 + required_total_points = 8 + short_desc = "Cause victims to become pale." + long_desc = "Cause victims to become pale. Decreases all stats." + + +/datum/disease_ability/symptom/sensory_restoration + name = "Sensory Restoration" + symptoms = list(/datum/symptom/sensory_restoration) + cost = 4 + required_total_points = 8 + short_desc = "Regenerate eye and ear damage of victims." + long_desc = "Regenerate eye and ear damage of victims." + + +/datum/disease_ability/symptom/itching + name = "Itching" + symptoms = list(/datum/symptom/itching) + cost = 4 + required_total_points = 8 + short_desc = "Cause victims to itch." + long_desc = "Cause victims to itch, increasing all stats except stealth." + + +/datum/disease_ability/symptom/weight_loss + name = "Weight Loss" + symptoms = list(/datum/symptom/weight_loss) + cost = 4 + required_total_points = 8 + short_desc = "Cause victims to lose weight." + long_desc = "Cause victims to lose weight, and make it almost immpossible for them to gain nutrition from food. Reduced nutrition allows your infection to spread more easily from hosts, especially by sneezing." + + +/datum/disease_ability/symptom/metabolism_heal + name = "Metabolic Boost" + symptoms = list(/datum/symptom/heal/metabolism) + cost = 4 + required_total_points = 16 + short_desc = "Increase the metabolism of victims, causing them to process chemicals and grow hungry faster." + long_desc = "Increase the metabolism of victims, causing them to process chemicals twice as fast and grow hungry more quickly." + + +/datum/disease_ability/symptom/coma_heal + name = "Regenerative Coma" + symptoms = list(/datum/symptom/heal/coma) + cost = 8 + required_total_points = 16 + short_desc = "Cause victims to fall into a healing coma when hurt." + long_desc = "Cause victims to fall into a healing coma when hurt." diff --git a/code/modules/antagonists/disease/disease_datum.dm b/code/modules/antagonists/disease/disease_datum.dm new file mode 100644 index 0000000000..0589b0c595 --- /dev/null +++ b/code/modules/antagonists/disease/disease_datum.dm @@ -0,0 +1,100 @@ +/datum/antagonist/disease + name = "Sentient Disease" + roundend_category = "diseases" + antagpanel_category = "Disease" + var/disease_name = "" + +/datum/antagonist/disease/on_gain() + owner.special_role = "Sentient Disease" + owner.assigned_role = "Sentient Disease" + var/datum/objective/O = new /datum/objective/disease_infect() + O.owner = owner + objectives += O + owner.objectives += O + + O = new /datum/objective/disease_infect_centcom() + O.owner = owner + objectives += O + owner.objectives += O + + . = ..() + +/datum/antagonist/disease/greet() + to_chat(owner.current, "You are the [owner.special_role]!") + to_chat(owner.current, "Infect members of the crew to gain adaptation points, and spread your infection further.") + owner.announce_objectives() + +/datum/antagonist/disease/apply_innate_effects(mob/living/mob_override) + if(!istype(owner.current, /mob/camera/disease)) + var/turf/T = get_turf(owner.current) + T = T ? T : locate(1, 1, 1) + var/mob/camera/disease/D = new /mob/camera/disease(T) + owner.transfer_to(D) + +/datum/antagonist/disease/admin_add(datum/mind/new_owner,mob/admin) + ..() + var/mob/camera/disease/D = new_owner.current + D.infect_patient_zero() + D.pick_name() + +/datum/antagonist/disease/roundend_report() + var/list/result = list() + + result += "Disease name: [disease_name]" + result += printplayer(owner) + + var/win = TRUE + var/objectives_text = "" + var/count = 1 + for(var/datum/objective/objective in objectives) + if(objective.check_completion()) + objectives_text += "
Objective #[count]: [objective.explanation_text] Success!" + else + objectives_text += "
Objective #[count]: [objective.explanation_text] Fail." + win = FALSE + count++ + + result += objectives_text + + var/special_role_text = lowertext(name) + + if(win) + result += "The [special_role_text] was successful!" + else + result += "The [special_role_text] has failed!" + + if(istype(owner.current, /mob/camera/disease)) + var/mob/camera/disease/D = owner.current + result += "[disease_name] completed the round with [D.hosts.len] infected hosts, and reached a maximum of [D.total_points] concurrent infections." + result += "[disease_name] completed the round with the following adaptations:" + var/list/adaptations = list() + for(var/V in D.purchased_abilities) + var/datum/disease_ability/A = V + adaptations += A.name + result += adaptations.Join(", ") + + return result.Join("
") + + +/datum/objective/disease_infect + explanation_text = "Survive and infect as many people as possible." + +/datum/objective/disease_infect/check_completion() + var/mob/camera/disease/D = owner.current + if(istype(D) && D.hosts.len) //theoretically it should not exist if it has no hosts, but better safe than sorry. + return TRUE + return FALSE + + +/datum/objective/disease_infect_centcom + explanation_text = "Ensure that at least one infected host escapes on the shuttle or an escape pod." + +/datum/objective/disease_infect_centcom/check_completion() + var/mob/camera/disease/D = owner.current + if(!istype(D)) + return FALSE + for(var/V in D.hosts) + var/mob/living/L = V + if(L.onCentCom() || L.onSyndieBase()) + return TRUE + return FALSE diff --git a/code/modules/antagonists/disease/disease_disease.dm b/code/modules/antagonists/disease/disease_disease.dm new file mode 100644 index 0000000000..8ee36e8829 --- /dev/null +++ b/code/modules/antagonists/disease/disease_disease.dm @@ -0,0 +1,59 @@ +/datum/disease/advance/sentient_disease + form = "Virus" + name = "Sentient Virus" + desc = "An apparently sentient virus, extremely adaptable and resistant to outside sources of mutation." + viable_mobtypes = list(/mob/living/carbon/human) + mutable = FALSE + var/mob/camera/disease/overmind + +/datum/disease/advance/sentient_disease/New() + ..() + GLOB.sentient_disease_instances += src + +/datum/disease/advance/sentient_disease/Destroy() + . = ..() + GLOB.sentient_disease_instances -= src + +/datum/disease/advance/sentient_disease/remove_disease() + if(overmind) + overmind.remove_infection(src) + ..() + +/datum/disease/advance/sentient_disease/infect(var/mob/living/infectee, make_copy = TRUE) + if(make_copy && overmind && (overmind.disease_template != src)) + overmind.disease_template.infect(infectee, TRUE) //get an updated version of the virus + else + ..() + + +/datum/disease/advance/sentient_disease/IsSame(datum/disease/D) + if(istype(src, D.type)) + var/datum/disease/advance/sentient_disease/V = D + if(V.overmind == overmind) + return TRUE + return FALSE + + +/datum/disease/advance/sentient_disease/Copy() + var/datum/disease/advance/sentient_disease/D = ..() + D.overmind = overmind + return D + +/datum/disease/advance/sentient_disease/after_add() + if(overmind) + overmind.add_infection(src) + + +/datum/disease/advance/sentient_disease/GetDiseaseID() + return "[type]|[overmind ? overmind.tag : null]" + +/datum/disease/advance/sentient_disease/GenerateCure() + if(cures.len) + return + var/list/not_used = advance_cures.Copy() + cures = list(pick_n_take(not_used), pick_n_take(not_used)) + + // Get the cure name from the cure_id + var/datum/reagent/D1 = GLOB.chemical_reagents_list[cures[1]] + var/datum/reagent/D2 = GLOB.chemical_reagents_list[cures[2]] + cure_text = "[D1.name] and [D2.name]" diff --git a/code/modules/antagonists/disease/disease_event.dm b/code/modules/antagonists/disease/disease_event.dm new file mode 100644 index 0000000000..ad9d07e95b --- /dev/null +++ b/code/modules/antagonists/disease/disease_event.dm @@ -0,0 +1,30 @@ + +/datum/round_event_control/sentient_disease + name = "Spawn Sentient Disease" + typepath = /datum/round_event/ghost_role/sentient_disease + weight = 7 + max_occurrences = 1 + min_players = 5 + + +/datum/round_event/ghost_role/sentient_disease + role_name = "sentient disease" + +/datum/round_event/ghost_role/sentient_disease/spawn_role() + var/list/candidates = get_candidates(ROLE_ALIEN, null, ROLE_ALIEN) + if(!candidates.len) + return NOT_ENOUGH_PLAYERS + + var/mob/dead/observer/selected = pick_n_take(candidates) + + var/mob/camera/disease/virus = new /mob/camera/disease(locate(1, 1, 1)) + if(!virus.infect_patient_zero()) + message_admins("Event attempted to spawn a sentient disease, but infection of patient zero failed.") + qdel(virus) + return WAITING_FOR_SOMETHING + virus.key = selected.key + INVOKE_ASYNC(virus, /mob/camera/disease/proc/pick_name) + message_admins("[key_name_admin(virus)] has been made into a sentient disease by an event.") + log_game("[key_name(virus)] was spawned as a sentient disease by an event.") + spawned_mobs += virus + return SUCCESSFUL_SPAWN diff --git a/code/modules/antagonists/disease/disease_mob.dm b/code/modules/antagonists/disease/disease_mob.dm new file mode 100644 index 0000000000..d14d34ef75 --- /dev/null +++ b/code/modules/antagonists/disease/disease_mob.dm @@ -0,0 +1,318 @@ +/* +A mob of type /mob/camera/disease is an overmind coordinating at least one instance of /datum/disease/advance/sentient_disease +that has infected a host. All instances in a host will be synchronized with the stats of the overmind's disease_template. Any +samples outside of a host will retain the stats they had when they left the host, but infecting a new host will cause +the new instance inside the host to be updated to the template's stats. +*/ + +/mob/camera/disease + name = "" + real_name = "" + desc = "" + icon = 'icons/mob/blob.dmi' + icon_state = "marker" + mouse_opacity = MOUSE_OPACITY_ICON + move_on_shuttle = 1 + see_in_dark = 8 + invisibility = INVISIBILITY_OBSERVER + layer = BELOW_MOB_LAYER + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + sight = SEE_SELF + initial_language_holder = /datum/language_holder/empty + + var/datum/action/innate/disease_adapt/adaptation_menu_action + var/datum/disease_ability/examining_ability + var/datum/browser/browser + var/browser_open = FALSE + + var/mob/living/following_host + var/datum/component/redirect/move_listener + var/list/disease_instances + var/list/hosts //this list is associative, affected_mob -> disease_instance + var/datum/disease/advance/sentient_disease/disease_template + + var/total_points = 0 + var/points = 0 + + var/last_move_tick = 0 + var/move_delay = 1 + + var/next_adaptation_time = 0 + var/adaptation_cooldown = 1200 + + var/list/purchased_abilities + var/list/unpurchased_abilities + +/mob/camera/disease/Initialize(mapload) + .= ..() + adaptation_menu_action = new /datum/action/innate/disease_adapt() + adaptation_menu_action.Grant(src) + + disease_instances = list() + hosts = list() + + purchased_abilities = list() + unpurchased_abilities = list() + for(var/V in GLOB.disease_ability_singletons) + unpurchased_abilities[V] = TRUE + var/datum/disease_ability/A = V + if(A.start_with && A.CanBuy(src)) + A.Buy(src, TRUE, FALSE) + + disease_template = new /datum/disease/advance/sentient_disease() + disease_template.overmind = src + qdel(SSdisease.archive_diseases[disease_template.GetDiseaseID()]) + SSdisease.archive_diseases[disease_template.GetDiseaseID()] = disease_template //important for stuff that uses disease IDs + + var/datum/atom_hud/my_hud = GLOB.huds[DATA_HUD_SENTIENT_DISEASE] + my_hud.add_hud_to(src) + + browser = new /datum/browser(src, "disease_menu", "Adaptation Menu", 1000, 770, src) + +/mob/camera/disease/Destroy() + . = ..() + for(var/V in GLOB.sentient_disease_instances) + var/datum/disease/advance/sentient_disease/S = V + if(S.overmind == src) + S.overmind = null + +/mob/camera/disease/Stat() + ..() + if(statpanel("Status")) + stat("Adaptation Points: [points]/[total_points]") + stat("Hosts: [disease_instances.len]") + var/adapt_ready = next_adaptation_time - world.time + if(adapt_ready > 0) + stat("Adaptation Ready: [round(adapt_ready/10, 0.1)]s") + +/mob/camera/disease/say(message) + return + +/mob/camera/disease/Move(NewLoc, Dir = 0) + if(world.time > (last_move_tick + move_delay)) + follow_next(Dir & NORTHWEST) + last_move_tick = world.time + +/mob/camera/disease/mind_initialize() + . = ..() + if(!mind.has_antag_datum(/datum/antagonist/disease)) + mind.add_antag_datum(/datum/antagonist/disease) + +/mob/camera/disease/proc/pick_name() + var/static/list/taken_names + if(!taken_names) + taken_names = list("Unknown" = TRUE) + for(var/T in (subtypesof(/datum/disease) - /datum/disease/advance)) + var/datum/disease/D = T + taken_names[initial(D.name)] = TRUE + var/set_name + while(!set_name) + var/input = stripped_input(src, "Select a name for your disease", "Select Name", "", MAX_NAME_LEN) + if(!input) + set_name = "Sentient Virus" + break + if(taken_names[input]) + to_chat(src, "You cannot use the name of such a well-known disease!") + else + set_name = input + real_name = "[set_name] (Sentient Disease)" + name = "[set_name] (Sentient Disease)" + disease_template.AssignName(set_name) + var/datum/antagonist/disease/A = mind.has_antag_datum(/datum/antagonist/disease) + if(A) + A.disease_name = set_name + +/mob/camera/disease/proc/infect_patient_zero() + var/list/possible_hosts = list() + var/datum/disease/advance/sentient_disease/V = disease_template.Copy() + for(var/mob/living/carbon/human/H in GLOB.carbon_list) + if((H.stat != DEAD) && H.CanContractDisease(V)) + possible_hosts += H + if(!possible_hosts.len) + return FALSE + var/mob/living/carbon/human/H = pick(possible_hosts) + if(H.ForceContractDisease(V, FALSE, TRUE)) + return TRUE + return FALSE + +/mob/camera/disease/proc/force_infect(mob/living/L) + var/datum/disease/advance/sentient_disease/V = disease_template.Copy() + return L.ForceContractDisease(V, FALSE, TRUE) + +/mob/camera/disease/proc/add_infection(datum/disease/advance/sentient_disease/V) + disease_instances += V + hosts[V.affected_mob] = V + total_points = max(total_points, disease_instances.len) + points += 1 + + var/image/holder = V.affected_mob.hud_list[SENTIENT_DISEASE_HUD] + var/mutable_appearance/MA = new /mutable_appearance(holder) + MA.icon_state = "virus_infected" + MA.layer = BELOW_MOB_LAYER + MA.color = COLOR_GREEN_GRAY + MA.alpha = 200 + holder.appearance = MA + var/datum/atom_hud/my_hud = GLOB.huds[DATA_HUD_SENTIENT_DISEASE] + my_hud.add_to_hud(V.affected_mob) + + to_chat(src, "A new host, [V.affected_mob.real_name], has been infected.") + + if(!following_host) + set_following(V.affected_mob) + refresh_adaptation_menu() + +/mob/camera/disease/proc/remove_infection(datum/disease/advance/sentient_disease/V) + if(QDELETED(src)) + disease_instances -= V + hosts -= V.affected_mob + else + points -= 1 + to_chat(src, "One of your hosts, [V.affected_mob.real_name], has been purged of your infection.") + + var/datum/atom_hud/my_hud = GLOB.huds[DATA_HUD_SENTIENT_DISEASE] + my_hud.remove_from_hud(V.affected_mob) + + if(following_host == V.affected_mob) + follow_next() + + disease_instances -= V + hosts -= V.affected_mob + + if(!disease_instances.len) + to_chat(src, "The last of your infection has disappeared.") + set_following(null) + qdel(src) + refresh_adaptation_menu() + +/mob/camera/disease/proc/set_following(mob/living/L) + following_host = L + if(!move_listener) + move_listener = L.AddComponent(/datum/component/redirect, COMSIG_MOVABLE_MOVED, CALLBACK(src, .proc/follow_mob)) + else + L.TakeComponent(move_listener) + if(QDELING(move_listener)) + move_listener = null + follow_mob() + +/mob/camera/disease/proc/follow_next(reverse = FALSE) + var/index = hosts.Find(following_host) + if(index) + if(reverse) + index = index == 1 ? hosts.len : index - 1 + else + index = index == hosts.len ? 1 : index + 1 + set_following(hosts[index]) + +/mob/camera/disease/proc/follow_mob(newloc, dir) + var/turf/T = get_turf(following_host) + if(T) + forceMove(T) + +/mob/camera/disease/DblClickOn(var/atom/A, params) + if(hosts[A]) + set_following(A) + else + ..() + +/mob/camera/disease/proc/adapt_cooldown() + to_chat(src, "You have altered your genetic structure. You will be unable to adapt again for [adaptation_cooldown/10] seconds.") + next_adaptation_time = world.time + adaptation_cooldown + addtimer(CALLBACK(src, .proc/notify_adapt_ready), adaptation_cooldown) + +/mob/camera/disease/proc/notify_adapt_ready() + to_chat(src, "You are now ready to adapt again.") + refresh_adaptation_menu() + +/mob/camera/disease/proc/refresh_adaptation_menu() + if(browser_open) + adaptation_menu() + +/mob/camera/disease/proc/adaptation_menu() + var/datum/disease/advance/sentient_disease/DT = disease_template + if(!DT) + return + var/list/dat = list() + + if(examining_ability) + dat += "Back

[examining_ability.name]

[examining_ability.stat_block][examining_ability.long_desc][examining_ability.threshold_block]" + else + dat += "

Disease Statistics


\ + Resistance: [DT.totalResistance()]
\ + Stealth: [DT.totalStealth()]
\ + Stage Speed: [DT.totalStageSpeed()]
\ + Transmittability: [DT.totalTransmittable()]
\ + Cure: [DT.cure_text]" + dat += "

Adaptations

\ + Points: [points] / [total_points]\ + \ + " + for(var/V in GLOB.disease_ability_singletons) + var/datum/disease_ability/A = V + var/purchase_text + if(unpurchased_abilities[A]) + if(A.CanBuy(src)) + purchase_text = "Purchase" + else + purchase_text = "Purchase" + else + if(A.CanRefund(src)) + purchase_text = "Refund" + else + purchase_text = "Refund" + dat += "" + + dat += "
CostUnlockNameTypeDescription
[A.cost][purchase_text][A.required_total_points][A.name][A.category][A.short_desc]

Infect many hosts at once to gain adaptation points.

Infected Hosts

" + for(var/V in hosts) + var/mob/living/L = V + dat += "
[L.real_name]" + + browser.set_content(dat.Join()) + browser.open() + browser_open = TRUE + +/mob/camera/disease/Topic(href, list/href_list) + ..() + if(href_list["close"]) + browser_open = FALSE + if(usr != src) + return + if(href_list["follow_instance"]) + var/mob/living/L = locate(href_list["follow_instance"]) in hosts + set_following(L) + + if(href_list["buy_ability"]) + var/datum/disease_ability/A = locate(href_list["buy_ability"]) + if(!istype(A)) + return + if(A.CanBuy(src)) + A.Buy(src) + adaptation_menu() + + if(href_list["refund_ability"]) + var/datum/disease_ability/A = locate(href_list["refund_ability"]) + if(!istype(A)) + return + if(A.CanRefund(src)) + A.Refund(src) + adaptation_menu() + + if(href_list["examine_ability"]) + var/datum/disease_ability/A = locate(href_list["examine_ability"]) + if(!istype(A)) + return + examining_ability = A + adaptation_menu() + + if(href_list["main_menu"]) + examining_ability = null + adaptation_menu() + + +/datum/action/innate/disease_adapt + name = "Adaptation Menu" + icon_icon = 'icons/mob/actions/actions_minor_antag.dmi' + button_icon_state = "disease_menu" + +/datum/action/innate/disease_adapt/Activate() + var/mob/camera/disease/D = owner + D.adaptation_menu() diff --git a/code/modules/antagonists/monkey/monkey.dm b/code/modules/antagonists/monkey/monkey.dm index 196adf5c22..9ce28eb60d 100644 --- a/code/modules/antagonists/monkey/monkey.dm +++ b/code/modules/antagonists/monkey/monkey.dm @@ -40,11 +40,10 @@ owner.special_role = null SSticker.mode.ape_infectees -= owner - var/datum/disease/transformation/jungle_fever/D = locate() in owner.current.viruses + var/datum/disease/transformation/jungle_fever/D = locate() in owner.current.diseases if(D) - D.remove_virus() qdel(D) - + . = ..() /datum/antagonist/monkey/create_team(datum/team/monkey/new_team) diff --git a/code/modules/antagonists/revenant/revenant_abilities.dm b/code/modules/antagonists/revenant/revenant_abilities.dm index b83892dd46..f81371b504 100644 --- a/code/modules/antagonists/revenant/revenant_abilities.dm +++ b/code/modules/antagonists/revenant/revenant_abilities.dm @@ -354,12 +354,12 @@ if(H.dna && H.dna.species) H.dna.species.handle_hair(H,"#1d2953") //will be reset when blight is cured var/blightfound = FALSE - for(var/datum/disease/revblight/blight in H.viruses) + for(var/datum/disease/revblight/blight in H.diseases) blightfound = TRUE if(blight.stage < 5) blight.stage++ if(!blightfound) - H.AddDisease(new /datum/disease/revblight) + H.ForceContractDisease(new /datum/disease/revblight(), FALSE, TRUE) to_chat(H, "You feel [pick("suddenly sick", "a surge of nausea", "like your skin is wrong")].") else if(mob.reagents) diff --git a/code/modules/antagonists/revenant/revenant_blight.dm b/code/modules/antagonists/revenant/revenant_blight.dm index 21bc534f27..7037ecae86 100644 --- a/code/modules/antagonists/revenant/revenant_blight.dm +++ b/code/modules/antagonists/revenant/revenant_blight.dm @@ -2,7 +2,7 @@ name = "Unnatural Wasting" max_stages = 5 stage_prob = 10 - spread_flags = VIRUS_SPREAD_NON_CONTAGIOUS + spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS cure_text = "Holy water or extensive rest." spread_text = "A burst of unholy energy" cures = list("holywater") @@ -11,7 +11,7 @@ viable_mobtypes = list(/mob/living/carbon/human) disease_flags = CURABLE permeability_mod = 1 - severity = VIRUS_SEVERITY_HARMFUL + severity = DISEASE_SEVERITY_HARMFUL var/stagedamage = 0 //Highest stage reached. var/finalstage = 0 //Because we're spawning off the cure in the final stage, we need to check if we've done the final stage's effects. diff --git a/code/modules/awaymissions/mission_code/Academy.dm b/code/modules/awaymissions/mission_code/Academy.dm index bfde6397b7..4fc3aaf55a 100644 --- a/code/modules/awaymissions/mission_code/Academy.dm +++ b/code/modules/awaymissions/mission_code/Academy.dm @@ -232,8 +232,8 @@ explosion(loc,-1,0,2, flame_range = 2) if(9) //Cold - var/datum/disease/D = new /datum/disease/cold - user.ForceContractDisease(D) + var/datum/disease/D = new /datum/disease/cold() + user.ForceContractDisease(D, FALSE, TRUE) if(10) //Nothing visible_message("[src] roll perfectly.") diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index 932a578d67..b19c8358c2 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -42,7 +42,7 @@ if(H.has_trait(TRAIT_VIRUSIMMUNE)) //Don't pick someone who's virus immune, only for it to not do anything. continue var/foundAlready = FALSE // don't infect someone that already has a disease - for(var/thing in H.viruses) + for(var/thing in H.diseases) foundAlready = TRUE break if(foundAlready) @@ -63,7 +63,7 @@ else D = make_virus(max_severity, max_severity) D.carrier = TRUE - H.AddDisease(D) + H.ForceContractDisease(D, FALSE, TRUE) if(advanced_virus) var/datum/disease/advance/A = D @@ -75,10 +75,9 @@ break /datum/round_event/disease_outbreak/proc/make_virus(max_symptoms, max_level) - if(max_symptoms > SYMPTOM_LIMIT) - max_symptoms = SYMPTOM_LIMIT - var/datum/disease/advance/A = new(FALSE, null) - A.symptoms = list() + if(max_symptoms > VIRUS_SYMPTOM_LIMIT) + max_symptoms = VIRUS_SYMPTOM_LIMIT + var/datum/disease/advance/A = new /datum/disease/advance() var/list/datum/symptom/possible_symptoms = list() for(var/symptom in subtypesof(/datum/symptom)) var/datum/symptom/S = symptom diff --git a/code/modules/events/heart_attack.dm b/code/modules/events/heart_attack.dm index ebe7dd5bfd..7f9c09dfd9 100644 --- a/code/modules/events/heart_attack.dm +++ b/code/modules/events/heart_attack.dm @@ -8,7 +8,7 @@ /datum/round_event/heart_attack/start() var/list/heart_attack_contestants = list() for(var/mob/living/carbon/human/H in shuffle(GLOB.player_list)) - if(!H.client || H.stat == DEAD || H.InCritical() || !H.can_heartattack() || H.has_status_effect(STATUS_EFFECT_EXERCISED) || (/datum/disease/heart_failure in H.viruses) || H.undergoing_cardiac_arrest()) + if(!H.client || H.stat == DEAD || H.InCritical() || !H.can_heartattack() || H.has_status_effect(STATUS_EFFECT_EXERCISED) || (/datum/disease/heart_failure in H.diseases) || H.undergoing_cardiac_arrest()) continue if(H.satiety <= -60) //Multiple junk food items recently heart_attack_contestants[H] = 3 @@ -17,6 +17,6 @@ if(LAZYLEN(heart_attack_contestants)) var/mob/living/carbon/human/winner = pickweight(heart_attack_contestants) - var/datum/disease/D = new /datum/disease/heart_failure - winner.ForceContractDisease(D) - notify_ghosts("[winner] is beginning to have a heart attack!", enter_link="(Click to orbit)", source=winner, action=NOTIFY_ORBIT) \ No newline at end of file + var/datum/disease/D = new /datum/disease/heart_failure() + winner.ForceContractDisease(D, FALSE, TRUE) + notify_ghosts("[winner] is beginning to have a heart attack!", enter_link="(Click to orbit)", source=winner, action=NOTIFY_ORBIT) diff --git a/code/modules/events/spontaneous_appendicitis.dm b/code/modules/events/spontaneous_appendicitis.dm index dfceb682cd..1407a98518 100644 --- a/code/modules/events/spontaneous_appendicitis.dm +++ b/code/modules/events/spontaneous_appendicitis.dm @@ -18,12 +18,12 @@ if(!H.getorgan(/obj/item/organ/appendix)) //Don't give the disease to some who lacks it, only for it to be auto-cured continue var/foundAlready = FALSE //don't infect someone that already has appendicitis - for(var/datum/disease/appendicitis/A in H.viruses) + for(var/datum/disease/appendicitis/A in H.diseases) foundAlready = TRUE break if(foundAlready) continue - var/datum/disease/D = new /datum/disease/appendicitis - H.ForceContractDisease(D) + var/datum/disease/D = new /datum/disease/appendicitis() + H.ForceContractDisease(D, FALSE, TRUE) break \ No newline at end of file diff --git a/code/modules/language/language_holder.dm b/code/modules/language/language_holder.dm index d15bc4c117..c1a336eb69 100644 --- a/code/modules/language/language_holder.dm +++ b/code/modules/language/language_holder.dm @@ -136,6 +136,10 @@ languages = list(/datum/language/common) shadow_languages = list(/datum/language/common, /datum/language/machine, /datum/language/draconic) +/datum/language_holder/empty + languages = list() + shadow_languages = list() + /datum/language_holder/universal/New() ..() grant_all_languages(omnitongue=TRUE) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index e5b9ddb4e4..450c2d5d0d 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -789,7 +789,7 @@ agent = "dragon's blood" desc = "What do dragons have to do with Space Station 13?" stage_prob = 20 - severity = VIRUS_SEVERITY_BIOHAZARD + severity = DISEASE_SEVERITY_BIOHAZARD visibility_flags = 0 stage1 = list("Your bones ache.") stage2 = list("Your skin feels scaly.") diff --git a/code/modules/mob/camera/camera.dm b/code/modules/mob/camera/camera.dm index 9a95bc9a4a..5f99cd8aa2 100644 --- a/code/modules/mob/camera/camera.dm +++ b/code/modules/mob/camera/camera.dm @@ -9,10 +9,24 @@ see_in_dark = 7 invisibility = INVISIBILITY_ABSTRACT // No one can see us sight = SEE_SELF - move_on_shuttle = 0 + move_on_shuttle = FALSE + var/call_life = FALSE //TRUE if Life() should be called on this camera every tick of the mobs subystem, as if it were a living mob + +/mob/camera/Initialize() + . = ..() + if(call_life) + GLOB.living_cameras += src + +/mob/camera/Destroy() + . = ..() + if(call_life) + GLOB.living_cameras -= src /mob/camera/experience_pressure_difference() return /mob/camera/forceMove(atom/destination) loc = destination + +/mob/camera/emote(act, m_type=1, message = null) + return diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index a30fd1492e..f7b3d15155 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -140,7 +140,7 @@ if(blood_data["viruses"]) for(var/thing in blood_data["viruses"]) var/datum/disease/D = thing - if((D.spread_flags & VIRUS_SPREAD_SPECIAL) || (D.spread_flags & VIRUS_SPREAD_NON_CONTAGIOUS)) + if((D.spread_flags & DISEASE_SPREAD_SPECIAL) || (D.spread_flags & DISEASE_SPREAD_NON_CONTAGIOUS)) continue C.ForceContractDisease(D) if(!(blood_data["blood_type"] in get_safe_blood(C.dna.blood_type))) @@ -164,13 +164,13 @@ blood_data["donor"] = src blood_data["viruses"] = list() - for(var/thing in viruses) + for(var/thing in diseases) var/datum/disease/D = thing blood_data["viruses"] += D.Copy() blood_data["blood_DNA"] = copytext(dna.unique_enzymes,1,0) - if(resistances && resistances.len) - blood_data["resistances"] = resistances.Copy() + if(disease_resistances && disease_resistances.len) + blood_data["resistances"] = disease_resistances.Copy() var/list/temp_chem = list() for(var/datum/reagent/R in reagents.reagent_list) temp_chem[R.id] = R.volume diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 8b8b8d5761..fe4454caeb 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -202,7 +202,6 @@ return if(!sterile) - //target.contract_disease(new /datum/disease/alien_embryo(0)) //so infection chance is same as virus infection chance target.visible_message("[src] falls limp after violating [target]'s face!", \ "[src] falls limp after violating [target]'s face!") diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index b530ab0cc0..ddc4e2e9c1 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -754,9 +754,9 @@ var/obj/item/organ/brain/B = getorgan(/obj/item/organ/brain) if(B) B.damaged_brain = FALSE - for(var/thing in viruses) + for(var/thing in diseases) var/datum/disease/D = thing - if(D.severity != VIRUS_SEVERITY_POSITIVE) + if(D.severity != DISEASE_SEVERITY_POSITIVE) D.cure(FALSE) if(admin_revive) regenerate_limbs() diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 56420df35a..4995caaca0 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -110,14 +110,14 @@ /mob/living/carbon/attack_hand(mob/living/carbon/human/user) - for(var/thing in viruses) + for(var/thing in diseases) var/datum/disease/D = thing - if(D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN) + if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN) user.ContactContractDisease(D) - for(var/thing in user.viruses) + for(var/thing in user.diseases) var/datum/disease/D = thing - if(D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN) + if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN) ContactContractDisease(D) if(lying && surgeries.len) @@ -131,14 +131,14 @@ /mob/living/carbon/attack_paw(mob/living/carbon/monkey/M) if(can_inject(M, TRUE)) - for(var/thing in viruses) + for(var/thing in diseases) var/datum/disease/D = thing - if((D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN) && prob(85)) + if((D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN) && prob(85)) M.ContactContractDisease(D) - for(var/thing in M.viruses) + for(var/thing in M.diseases) var/datum/disease/D = thing - if(D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN) + if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN) ContactContractDisease(D) if(M.a_intent == INTENT_HELP) @@ -146,7 +146,7 @@ return 0 if(..()) //successful monkey bite. - for(var/thing in M.viruses) + for(var/thing in M.diseases) var/datum/disease/D = thing ForceContractDisease(D) return 1 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 6b5d533f11..1321c499f4 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -90,10 +90,10 @@ stat("Radiation Levels:","[radiation] rad") stat("Body Temperature:","[bodytemperature-T0C] degrees C ([bodytemperature*1.8-459.67] degrees F)") - //Virsuses - if(viruses.len) + //Diseases + if(diseases.len) stat("Viruses:", null) - for(var/thing in viruses) + for(var/thing in diseases) var/datum/disease/D = thing stat("*", "[D.name], Type: [D.spread_text], Stage: [D.stage]/[D.max_stages], Possible Cure: [D.cure_text]") diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 2bc4de894e..60bb0fe497 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -1,5 +1,5 @@ /mob/living/carbon/human - hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPCHEM_HUD,IMPTRACK_HUD,ANTAG_HUD,GLAND_HUD) + hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPCHEM_HUD,IMPTRACK_HUD,ANTAG_HUD,GLAND_HUD,SENTIENT_DISEASE_HUD) possible_a_intents = list(INTENT_HELP, INTENT_DISARM, INTENT_GRAB, INTENT_HARM) pressure_resistance = 25 can_buckle = TRUE diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 56ba4dff81..c008be1093 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -7,8 +7,8 @@ /mob/living/carbon/human/treat_message(message) message = dna.species.handle_speech(message,src) - if(viruses.len) - for(var/datum/disease/pierrot_throat/D in viruses) + if(diseases.len) + for(var/datum/disease/pierrot_throat/D in diseases) var/list/temp_message = splittext(message, " ") //List each word in the message var/list/pick_list = list() for(var/i = 1, i <= temp_message.len, i++) //Create a second list for excluding words down the line diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 14e301a692..8a78c1532e 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -293,7 +293,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) C.add_trait(X, SPECIES_TRAIT) if(TRAIT_VIRUSIMMUNE in inherent_traits) - for(var/datum/disease/A in C.viruses) + for(var/datum/disease/A in C.diseases) A.cure(FALSE) //CITADEL EDIT diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 0cf7190420..bf10084758 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -251,7 +251,7 @@ O.on_life() /mob/living/carbon/handle_diseases() - for(var/thing in viruses) + for(var/thing in diseases) var/datum/disease/D = thing if(prob(D.infectivity)) D.spread() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index c78d8b19d7..dcd3789360 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -48,7 +48,7 @@ staticOverlays.len = 0 remove_from_all_data_huds() GLOB.mob_living_list -= src - + QDEL_LIST(diseases) return ..() /mob/living/ghostize(can_reenter_corpse = 1) @@ -108,24 +108,24 @@ /mob/living/proc/MobCollide(mob/M) //Even if we don't push/swap places, we "touched" them, so spread fire spreadFire(M) - //Also diseases - for(var/thing in viruses) - var/datum/disease/D = thing - if(D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN) - M.ContactContractDisease(D) - - for(var/thing in M.viruses) - var/datum/disease/D = thing - if(D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN) - ContactContractDisease(D) if(now_pushing) return TRUE - - //Should stop you pushing a restrained person out of the way if(isliving(M)) var/mob/living/L = M + //Also spread diseases + for(var/thing in diseases) + var/datum/disease/D = thing + if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN) + L.ContactContractDisease(D) + + for(var/thing in L.diseases) + var/datum/disease/D = thing + if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN) + ContactContractDisease(D) + + //Should stop you pushing a restrained person out of the way if(L.pulledby && L.pulledby != src && L.restrained()) if(!(world.time % 5)) to_chat(src, "[L] is restrained, you cannot push past.") @@ -224,6 +224,60 @@ AM.setDir(current_dir) now_pushing = 0 +/mob/living/start_pulling(atom/movable/AM, supress_message = 0) + if(!AM || !src) + return FALSE + if(!(AM.can_be_pulled(src))) + return FALSE + if(throwing || incapacitated()) + return FALSE + + AM.add_fingerprint(src) + + // If we're pulling something then drop what we're currently pulling and pull this instead. + if(pulling) + // Are we trying to pull something we are already pulling? Then just stop here, no need to continue. + if(AM == pulling) + return + stop_pulling() + + changeNext_move(CLICK_CD_GRABBING) + + if(AM.pulledby) + if(!supress_message) + visible_message("[src] has pulled [AM] from [AM.pulledby]'s grip.") + add_logs(AM, AM.pulledby, "pulled from", src) + AM.pulledby.stop_pulling() //an object can't be pulled by two mobs at once. + + pulling = AM + AM.pulledby = src + if(!supress_message) + playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + update_pull_hud_icon() + + if(ismob(AM)) + var/mob/M = AM + + add_logs(src, M, "grabbed", addition="passive grab") + if(!supress_message) + visible_message("[src] has grabbed [M] passively!") + if(!iscarbon(src)) + M.LAssailant = null + else + M.LAssailant = usr + if(isliving(M)) + var/mob/living/L = M + //Share diseases that are spread by touch + for(var/thing in diseases) + var/datum/disease/D = thing + if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN) + L.ContactContractDisease(D) + + for(var/thing in L.diseases) + var/datum/disease/D = thing + if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN) + ContactContractDisease(D) + //mob verbs are a lot faster than object verbs //for more info on why this is not atom/pull, see examinate() in mob.dm /mob/living/verb/pulled(atom/movable/AM as mob|obj in oview(1)) @@ -235,6 +289,15 @@ else stop_pulling() +/mob/living/stop_pulling() + ..() + update_pull_hud_icon() + +/mob/living/verb/stop_pulling1() + set name = "Stop Pulling" + set category = "IC" + stop_pulling() + //same as above /mob/living/pointed(atom/A as mob|obj|turf in view()) if(incapacitated()) @@ -1074,3 +1137,54 @@ return FALSE mob_pickup(user) return TRUE + +/mob/living/proc/get_static_viruses() //used when creating blood and other infective objects + if(!LAZYLEN(diseases)) + return + var/list/datum/disease/result = list() + for(var/datum/disease/D in diseases) + var/static_virus = D.Copy() + result += static_virus + return result + +/mob/living/reset_perspective(atom/A) + if(..()) + update_sight() + if(client.eye && client.eye != src) + var/atom/AT = client.eye + AT.get_remote_view_fullscreens(src) + else + clear_fullscreen("remote_view", 0) + update_pipe_vision() + +/mob/living/vv_edit_var(var_name, var_value) + switch(var_name) + if("stat") + if((stat == DEAD) && (var_value < DEAD))//Bringing the dead back to life + GLOB.dead_mob_list -= src + GLOB.alive_mob_list += src + if((stat < DEAD) && (var_value == DEAD))//Kill he + GLOB.alive_mob_list -= src + GLOB.dead_mob_list += src + . = ..() + switch(var_name) + if("knockdown") + SetKnockdown(var_value) + if("stun") + SetStun(var_value) + if("unconscious") + SetUnconscious(var_value) + if("sleeping") + SetSleeping(var_value) + if("eye_blind") + set_blindness(var_value) + if("eye_damage") + set_eye_damage(var_value) + if("eye_blurry") + set_blurriness(var_value) + if("maxHealth") + updatehealth() + if("resize") + update_transform() + if("lighting_alpha") + sync_lighting_plane_alpha() diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index f5c00b874a..f31d95a9d7 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -107,3 +107,7 @@ var/radiation = 0 //If the mob is irradiated. var/ventcrawl_layer = PIPING_LAYER_DEFAULT var/losebreath = 0 + + //List of active diseases + var/list/diseases = list() // list of all diseases in a mob + var/list/disease_resistances = list() diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index cc17d8e4bd..2a2cda19e0 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -511,7 +511,7 @@ Structural Integrity: [M.getBruteLoss() > 50 ? "" : ""][M.getBruteLoss()]
Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)
"} - for(var/thing in M.viruses) + for(var/thing in M.diseases) var/datum/disease/D = thing dat += {"

Infection Detected.


Name: [D.name]
diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index 6946c8992f..4cf1f6b13f 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -383,12 +383,12 @@ return TRUE if(treat_virus && !C.reagents.has_reagent(treatment_virus_avoid) && !C.reagents.has_reagent(treatment_virus)) - for(var/thing in C.viruses) + for(var/thing in C.diseases) var/datum/disease/D = thing //the medibot can't detect viruses that are undetectable to Health Analyzers or Pandemic machines. if(!(D.visibility_flags & HIDDEN_SCANNER || D.visibility_flags & HIDDEN_PANDEMIC) \ - && D.severity != VIRUS_SEVERITY_POSITIVE \ - && (D.stage > 1 || (D.spread_flags & VIRUS_SPREAD_AIRBORNE))) // medibot can't detect a virus in its initial stage unless it spreads airborne. + && D.severity != DISEASE_SEVERITY_POSITIVE \ + && (D.stage > 1 || (D.spread_flags & DISEASE_SPREAD_AIRBORNE))) // medibot can't detect a virus in its initial stage unless it spreads airborne. return TRUE //STOP DISEASE FOREVER return FALSE @@ -435,12 +435,12 @@ else if(treat_virus) var/virus = 0 - for(var/thing in C.viruses) + for(var/thing in C.diseases) var/datum/disease/D = thing //detectable virus if((!(D.visibility_flags & HIDDEN_SCANNER)) || (!(D.visibility_flags & HIDDEN_PANDEMIC))) - if(D.severity != VIRUS_SEVERITY_POSITIVE) //virus is harmful - if((D.stage > 1) || (D.spread_flags & VIRUS_SPREAD_AIRBORNE)) + if(D.severity != DISEASE_SEVERITY_POSITIVE) //virus is harmful + if((D.stage > 1) || (D.spread_flags & DISEASE_SPREAD_AIRBORNE)) virus = 1 if(!reagent_id && (virus)) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 4b53435b86..7deed01390 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -11,7 +11,6 @@ var/mob/dead/observe = M observe.reset_perspective(null) qdel(hud_used) - QDEL_LIST(viruses) for(var/cc in client_colours) qdel(cc) client_colours = null @@ -287,16 +286,6 @@ client.eye = loc return 1 -/mob/living/reset_perspective(atom/A) - if(..()) - update_sight() - if(client.eye && client.eye != src) - var/atom/AT = client.eye - AT.get_remote_view_fullscreens(src) - else - clear_fullscreen("remote_view", 0) - update_pipe_vision() - /mob/proc/show_inv(mob/user) return @@ -333,60 +322,6 @@ return 1 -//this and stop_pulling really ought to be /mob/living procs -/mob/start_pulling(atom/movable/AM, supress_message = 0) - if(!AM || !src) - return FALSE - if(!(AM.can_be_pulled(src))) - return FALSE - if(throwing || incapacitated()) - return FALSE - - AM.add_fingerprint(src) - - // If we're pulling something then drop what we're currently pulling and pull this instead. - if(pulling) - // Are we trying to pull something we are already pulling? Then just stop here, no need to continue. - if(AM == pulling) - return - stop_pulling() - - changeNext_move(CLICK_CD_GRABBING) - - if(AM.pulledby) - if(!supress_message) - visible_message("[src] has pulled [AM] from [AM.pulledby]'s grip.") - add_logs(AM, AM.pulledby, "pulled from", src) - AM.pulledby.stop_pulling() //an object can't be pulled by two mobs at once. - - pulling = AM - AM.pulledby = src - if(!supress_message) - playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - update_pull_hud_icon() - - if(ismob(AM)) - var/mob/M = AM - - //Share diseases that are spread by touch - for(var/thing in viruses) - var/datum/disease/D = thing - if(D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN) - M.ContactContractDisease(D) - - for(var/thing in M.viruses) - var/datum/disease/D = thing - if(D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN) - ContactContractDisease(D) - - add_logs(src, M, "grabbed", addition="passive grab") - if(!supress_message) - visible_message("[src] has grabbed [M][(zone_selected == "l_arm" || zone_selected == "r_arm")? " by their hands":" passively"]!") - if(!iscarbon(src)) - M.LAssailant = null - else - M.LAssailant = usr - /mob/proc/can_resist() return FALSE //overridden in living.dm @@ -409,15 +344,6 @@ setDir(D) spintime -= speed -/mob/stop_pulling() - ..() - update_pull_hud_icon() - -/mob/verb/stop_pulling1() - set name = "Stop Pulling" - set category = "IC" - stop_pulling() - /mob/proc/update_pull_hud_icon() if(hud_used) if(hud_used.pull_icon) @@ -927,39 +853,6 @@ if (L) L.alpha = lighting_alpha -/mob/living/vv_edit_var(var_name, var_value) - switch(var_name) - if("stat") - if((stat == DEAD) && (var_value < DEAD))//Bringing the dead back to life - GLOB.dead_mob_list -= src - GLOB.alive_mob_list += src - if((stat < DEAD) && (var_value == DEAD))//Kill he - GLOB.alive_mob_list -= src - GLOB.dead_mob_list += src - . = ..() - switch(var_name) - if("knockdown") - SetKnockdown(var_value) - if("stun") - SetStun(var_value) - if("unconscious") - SetUnconscious(var_value) - if("sleeping") - SetSleeping(var_value) - if("eye_blind") - set_blindness(var_value) - if("eye_damage") - set_eye_damage(var_value) - if("eye_blurry") - set_blurriness(var_value) - if("maxHealth") - updatehealth() - if("resize") - update_transform() - if("lighting_alpha") - sync_lighting_plane_alpha() - - /mob/proc/is_literate() return 0 @@ -969,15 +862,6 @@ /mob/proc/get_idcard() return -/mob/proc/get_static_viruses() //used when creating blood and other infective objects - if(!LAZYLEN(viruses)) - return - var/list/datum/disease/diseases = list() - for(var/datum/disease/D in viruses) - var/static_virus = D.Copy() - diseases += static_virus - return diseases - /mob/vv_get_dropdown() . = ..() diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index d4bebd6303..0088e09515 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -82,10 +82,6 @@ var/list/mob_spell_list = list() //construct spells and mime spells. Spells that do not transfer from one mob to another and can not be lost in mindswap. -//List of active diseases - - var/list/viruses = list() // list of all diseases in a mob - var/list/resistances = list() var/status_flags = CANSTUN|CANKNOCKDOWN|CANUNCONSCIOUS|CANPUSH //bitflags defining which status effects can be inflicted (replaces canknockdown, canstun, etc) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 989c8278a5..3b9930faa9 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -363,8 +363,10 @@ It's fairly easy to fix if dealing with single letters but not so much with comp if(M.mind in SSticker.mode.apprentices) return 2 if("monkey") - if(M.viruses && (locate(/datum/disease/transformation/jungle_fever) in M.viruses)) - return 2 + if(isliving(M)) + var/mob/living/L = M + if(L.diseases && (locate(/datum/disease/transformation/jungle_fever) in L.diseases)) + return 2 return TRUE if(M.mind && LAZYLEN(M.mind.antag_datums)) //they have an antag datum! return TRUE diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 64454b130e..240c4edd9f 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -62,9 +62,9 @@ //keep viruses? if (tr_flags & TR_KEEPVIRUS) - O.viruses = viruses - viruses = list() - for(var/thing in O.viruses) + O.diseases = diseases + diseases = list() + for(var/thing in O.diseases) var/datum/disease/D = thing D.affected_mob = O @@ -218,9 +218,9 @@ //keep viruses? if (tr_flags & TR_KEEPVIRUS) - O.viruses = viruses - viruses = list() - for(var/thing in O.viruses) + O.diseases = diseases + diseases = list() + for(var/thing in O.diseases) var/datum/disease/D = thing D.affected_mob = O O.med_hud_set_status() diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index b14d436df5..00a3f0effd 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -57,7 +57,7 @@ if(istype(D, /datum/disease/advance)) var/datum/disease/advance/A = D var/disease_name = SSdisease.get_disease_name(A.GetDiseaseID()) - if(disease_name == "Unknown") + if(disease_name == "Unknown" && A.mutable) this["can_rename"] = TRUE this["name"] = disease_name this["is_adv"] = TRUE @@ -180,17 +180,21 @@ if("rename_disease") var/id = get_virus_id_by_index(text2num(params["index"])) var/datum/disease/advance/A = SSdisease.archive_diseases[id] + if(!A.mutable) + return if(A) var/new_name = stripped_input(usr, "Name the disease", "New name", "", MAX_NAME_LEN) if(!new_name || ..()) return A.AssignName(new_name) - for(var/datum/disease/advance/AD in SSdisease.active_diseases) - AD.Refresh() . = TRUE if("create_culture_bottle") var/id = get_virus_id_by_index(text2num(params["index"])) - var/datum/disease/advance/A = new(FALSE, SSdisease.archive_diseases[id]) + var/datum/disease/advance/A = SSdisease.archive_diseases[id] + if(!A.mutable) + to_chat(usr, "ERROR: Cannot replicate virus strain.") + return + A = A.Copy() var/list/data = list("viruses" = list(A)) var/obj/item/reagent_containers/glass/bottle/B = new(drop_location()) B.name = "[A.name] culture bottle" diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index a3726897b3..2f7f9eaa08 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -60,9 +60,9 @@ M.SetSleeping(0, 0) M.jitteriness = 0 M.cure_all_traumas(TRUE, TRAUMA_RESILIENCE_MAGIC) - for(var/thing in M.viruses) + for(var/thing in M.diseases) var/datum/disease/D = thing - if(D.severity == VIRUS_SEVERITY_POSITIVE) + if(D.severity == DISEASE_SEVERITY_POSITIVE) continue D.cure() ..() diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 75b4552a58..1ecf22627a 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -16,13 +16,15 @@ for(var/thing in data["viruses"]) var/datum/disease/D = thing - if((D.spread_flags & VIRUS_SPREAD_SPECIAL) || (D.spread_flags & VIRUS_SPREAD_NON_CONTAGIOUS)) + if((D.spread_flags & DISEASE_SPREAD_SPECIAL) || (D.spread_flags & DISEASE_SPREAD_NON_CONTAGIOUS)) continue - if((method == TOUCH || method == VAPOR) && (D.spread_flags & VIRUS_SPREAD_CONTACT_FLUIDS)) - M.ContactContractDisease(D) - else //ingest, patch or inject - M.ForceContractDisease(D) + if(isliving(M)) + var/mob/living/L = M + if((method == TOUCH || method == VAPOR) && (D.spread_flags & DISEASE_SPREAD_CONTACT_FLUIDS)) + L.ContactContractDisease(D) + else //ingest, patch or inject + L.ForceContractDisease(D) if(iscarbon(M)) var/mob/living/carbon/C = M @@ -97,12 +99,15 @@ taste_description = "slime" /datum/reagent/vaccine/reaction_mob(mob/M, method=TOUCH, reac_volume) + if(!isliving(M)) + return + var/mob/living/L = M if(islist(data) && (method == INGEST || method == INJECT)) - for(var/thing in M.viruses) + for(var/thing in L.diseases) var/datum/disease/D = thing if(D.GetDiseaseID() in data) D.cure() - M.resistances |= data + L.disease_resistances |= data /datum/reagent/vaccine/on_merge(list/data) if(istype(data)) @@ -623,8 +628,11 @@ taste_description = "slime" /datum/reagent/aslimetoxin/reaction_mob(mob/M, method=TOUCH, reac_volume) + if(!isliving(M)) + return + var/mob/living/L = M if(method != TOUCH) - M.ForceContractDisease(new /datum/disease/transformation/slime(0)) + L.ForceContractDisease(new /datum/disease/transformation/slime(), FALSE, TRUE) /datum/reagent/gluttonytoxin name = "Gluttony's Blessing" @@ -635,7 +643,10 @@ taste_description = "decay" /datum/reagent/gluttonytoxin/reaction_mob(mob/M, method=TOUCH, reac_volume) - M.ForceContractDisease(new /datum/disease/transformation/morph(0)) + if(!isliving(M)) + return + var/mob/living/L = M + L.ForceContractDisease(new /datum/disease/transformation/morph(), FALSE, TRUE) /datum/reagent/serotrotium name = "Serotrotium" @@ -1103,8 +1114,11 @@ taste_description = "sludge" /datum/reagent/nanites/reaction_mob(mob/M, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0) + if(!isliving(M)) + return + var/mob/living/L = M if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection)))) - M.ForceContractDisease(new /datum/disease/transformation/robot(0)) + L.ForceContractDisease(new /datum/disease/transformation/robot(), FALSE, TRUE) /datum/reagent/xenomicrobes name = "Xenomicrobes" @@ -1115,8 +1129,11 @@ taste_description = "sludge" /datum/reagent/xenomicrobes/reaction_mob(mob/M, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0) + if(!isliving(M)) + return + var/mob/living/L = M if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection)))) - M.ForceContractDisease(new /datum/disease/transformation/xeno(0)) + L.ForceContractDisease(new /datum/disease/transformation/xeno(), FALSE, TRUE) /datum/reagent/fungalspores name = "Tubercle bacillus Cosmosis microbes" @@ -1127,8 +1144,11 @@ taste_description = "slime" /datum/reagent/fungalspores/reaction_mob(mob/M, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0) + if(!isliving(M)) + return + var/mob/living/L = M if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection)))) - M.ForceContractDisease(new /datum/disease/tuberculosis(0)) + L.ForceContractDisease(new /datum/disease/tuberculosis(), FALSE, TRUE) /datum/reagent/fluorosurfactant//foam precursor name = "Fluorosurfactant" diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index d6213a391b..054fe077c3 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -18,7 +18,7 @@ volume = vol create_reagents(volume) if(spawned_disease) - var/datum/disease/F = new spawned_disease(0) + var/datum/disease/F = new spawned_disease() var/list/data = list("viruses"= list(F)) reagents.add_reagent("blood", disease_amount, data) diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index e8937b5dae..f240e0b6af 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -350,7 +350,7 @@ switch(activation_type) if(SLIME_ACTIVATE_MINOR) to_chat(user, "You feel something wrong inside you...") - user.ForceContractDisease(new /datum/disease/transformation/slime(0)) + user.ForceContractDisease(new /datum/disease/transformation/slime(), FALSE, TRUE) return 100 if(SLIME_ACTIVATE_MAJOR) diff --git a/code/modules/surgery/advanced/viral_bonding.dm b/code/modules/surgery/advanced/viral_bonding.dm index f661373acd..da42e4fdb9 100644 --- a/code/modules/surgery/advanced/viral_bonding.dm +++ b/code/modules/surgery/advanced/viral_bonding.dm @@ -17,7 +17,7 @@ /datum/surgery/advanced/viral_bonding/can_start(mob/user, mob/living/carbon/target) if(!..()) return FALSE - if(!LAZYLEN(target.viruses)) + if(!LAZYLEN(target.diseases)) return FALSE return TRUE @@ -38,7 +38,7 @@ /datum/surgery_step/viral_bond/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) user.visible_message("[target]'s bone marrow begins pulsing slowly.", "[target]'s bone marrow begins pulsing slowly. The viral bonding is complete.") - for(var/X in target.viruses) + for(var/X in target.diseases) var/datum/disease/D = X D.carrier = TRUE return TRUE \ No newline at end of file diff --git a/code/modules/surgery/organs/appendix.dm b/code/modules/surgery/organs/appendix.dm index 35a2d851e3..4494148082 100644 --- a/code/modules/surgery/organs/appendix.dm +++ b/code/modules/surgery/organs/appendix.dm @@ -14,7 +14,7 @@ name = "appendix" /obj/item/organ/appendix/Remove(mob/living/carbon/M, special = 0) - for(var/datum/disease/appendicitis/A in M.viruses) + for(var/datum/disease/appendicitis/A in M.diseases) A.cure() inflamed = 1 update_icon() @@ -23,7 +23,7 @@ /obj/item/organ/appendix/Insert(mob/living/carbon/M, special = 0) ..() if(inflamed) - M.AddDisease(new /datum/disease/appendicitis) + M.ForceContractDisease(new /datum/disease/appendicitis(), FALSE, TRUE) /obj/item/organ/appendix/prepare_eat() var/obj/S = ..() diff --git a/icons/mob/actions/actions_minor_antag.dmi b/icons/mob/actions/actions_minor_antag.dmi index 4e5806f2fb9eac3064302fa676dac4ac53fe0078..20daacd32c4a930f907740e1c8803ab9b2d839b1 100644 GIT binary patch literal 13836 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 YVs(lws#c;9|MCLVm9>>>6s#lv4?N#>LI3~& literal 12098 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 DsnB#f literal 13261 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

pcle)&9m;vpB?B;Rlc~dTb#4(xSMMnp*Lz9 z5W@wWwJ0r>olB1@O>o=6f_g06o zN1bTOdxEGyb$|(yO~)NsBWccH3Q>Ea$p)`Jk**7-aG(-&e@_3T2A@qJiaXVXQk9_3 diff --git a/tgstation.dme b/tgstation.dme index 70fc644736..5690081ec3 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -400,7 +400,6 @@ #include "code\datums\diseases\advance\symptoms\fever.dm" #include "code\datums\diseases\advance\symptoms\fire.dm" #include "code\datums\diseases\advance\symptoms\flesh_eating.dm" -#include "code\datums\diseases\advance\symptoms\genetics.dm" #include "code\datums\diseases\advance\symptoms\hallucigen.dm" #include "code\datums\diseases\advance\symptoms\headache.dm" #include "code\datums\diseases\advance\symptoms\heal.dm" @@ -1220,6 +1219,11 @@ #include "code\modules\antagonists\devil\sintouched\objectives.dm" #include "code\modules\antagonists\devil\true_devil\_true_devil.dm" #include "code\modules\antagonists\devil\true_devil\inventory.dm" +#include "code\modules\antagonists\disease\disease_abilities.dm" +#include "code\modules\antagonists\disease\disease_datum.dm" +#include "code\modules\antagonists\disease\disease_disease.dm" +#include "code\modules\antagonists\disease\disease_event.dm" +#include "code\modules\antagonists\disease\disease_mob.dm" #include "code\modules\antagonists\ert\ert.dm" #include "code\modules\antagonists\greentext\greentext.dm" #include "code\modules\antagonists\highlander\highlander.dm" From b663cc73817c4863fe3e265545acdc377166c7c7 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 5 Mar 2018 15:21:02 -0600 Subject: [PATCH 26/45] Automatic changelog generation for PR #5815 [ci skip] --- html/changelogs/AutoChangeLog-pr-5815.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5815.yml diff --git a/html/changelogs/AutoChangeLog-pr-5815.yml b/html/changelogs/AutoChangeLog-pr-5815.yml new file mode 100644 index 0000000000..5054ef2a97 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5815.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - rscadd: "Added a new mini antagonist, the sentient disease." From b4e01ac82ce85d0912528ece3760c1048f2d4838 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Mon, 5 Mar 2018 22:12:35 +0000 Subject: [PATCH 27/45] Fixes widescreen pref regression (#5822) --- code/modules/client/client_procs.dm | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index b246c0c7b0..9181945ebd 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -409,7 +409,21 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) "Someone come hold me :(",\ "I need someone on me :(",\ "What happened? Where has everyone gone?",\ - "Forever alone :("\ + "Forever alone :(",\ + "My nipples are so stiff, but Zelda ain't here. :(",\ + "Leon senpai, play more Spessmans. :(",\ + "If only Serdy were here...",\ + "Panic bunker can't keep my love for you out.",\ + "Cebu needs to Awoo herself back into my heart.",\ + "I don't even have a Turry to snuggle viciously here.",\ + "MOM, WHERE ARE YOU??? D:",\ + "It's a beautiful day outside. Birds are singing, flowers are blooming. On days like this...kids like you...SHOULD BE BURNING IN HELL.",\ + "Sometimes when I have sex, I think about putting an entire peanut butter and jelly sandwich in the VCR.",\ + "Oh good, no-one around to watch me lick Goofball's nipples. :D",\ + "I've replaced Beepsky with a fidget spinner, glory be autism abuse.",\ + "i shure hop dere are no PRED arund!!!!",\ + "NO PRED CAN eVER CATCH MI",\ + "help, the clown is honking his horn in front of dorms and its interrupting everyones erp"\ ) send2irc("Server", "[cheesy_message] (No admins online)") @@ -716,6 +730,12 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) if (isnull(new_size)) CRASH("change_view called without argument.") +//CIT CHANGES START HERE - makes change_view change DEFAULT_VIEW to 15x15 depending on preferences + if(prefs && CONFIG_GET(string/default_view)) + if(!prefs.widescreenpref && new_size == CONFIG_GET(string/default_view)) + new_size = "15x15" +//END OF CIT CHANGES + view = new_size apply_clickcatcher() if (isliving(mob)) From b60e432c792ca3e3bfa7f3be83aaf53fe762ec1d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 5 Mar 2018 16:12:38 -0600 Subject: [PATCH 28/45] Automatic changelog generation for PR #5822 [ci skip] --- html/changelogs/AutoChangeLog-pr-5822.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5822.yml diff --git a/html/changelogs/AutoChangeLog-pr-5822.yml b/html/changelogs/AutoChangeLog-pr-5822.yml new file mode 100644 index 0000000000..7592b0a1dd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5822.yml @@ -0,0 +1,4 @@ +author: "deathride58" +delete-after: True +changes: + - bugfix: "Widescreen pref works again." From 558cf0306210b2b69307a46ffc819dff1c5de6bc Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 5 Mar 2018 16:55:09 -0600 Subject: [PATCH 29/45] [MIRROR] [s]Vvexploit (#5823) * Merge pull request #36181 from kevinz000/patch-460 [s]Vvexploit * [s]Vvexploit --- code/modules/spells/spell_types/aimed.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/spells/spell_types/aimed.dm b/code/modules/spells/spell_types/aimed.dm index 997c83249a..6980cba8e2 100644 --- a/code/modules/spells/spell_types/aimed.dm +++ b/code/modules/spells/spell_types/aimed.dm @@ -69,7 +69,7 @@ P.preparePixelProjectile(target, user) for(var/V in projectile_var_overrides) if(P.vars[V]) - P.vars[V] = projectile_var_overrides[V] + P.vv_edit_var(V, projectile_var_overrides[V]) P.fire() return TRUE From 6c732407e8571b73e260b5e0cf7a86d7c636daed Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 5 Mar 2018 16:55:19 -0600 Subject: [PATCH 30/45] [MIRROR] [s]Varedit exploit (#5824) * Merge pull request #36180 from kevinz000/patch-459 [s]Varedit exploit * [s]Varedit exploit --- code/modules/projectiles/ammunition/energy/chameleon.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/projectiles/ammunition/energy/chameleon.dm b/code/modules/projectiles/ammunition/energy/chameleon.dm index 4688518d46..b47b6c4e5e 100644 --- a/code/modules/projectiles/ammunition/energy/chameleon.dm +++ b/code/modules/projectiles/ammunition/energy/chameleon.dm @@ -10,6 +10,6 @@ newshot() for(var/V in projectile_vars) if(BB.vars.Find(V)) - BB.vars[V] = projectile_vars[V] + BB.vv_edit_var(V, projectile_vars[V]) if(hitscan_mode) BB.hitscan = TRUE From 54e33374d21cab0bc886d49af88250f93237c78b Mon Sep 17 00:00:00 2001 From: Poojawa Date: Tue, 6 Mar 2018 03:56:19 -0600 Subject: [PATCH 31/45] Hypospray MK IIs (#5722) * Initial commit * most of the work down itfinallycompiled * tweaks * ree * fixes bad attempt at mode switching * slight sprite tweak to give vials better clickability. * can I has real review now pls thx Bhijn * pre-emptively avoiding a troll 'review' * WEH * trying to code new functions is dumb * reeeeee put_in_hand doesn't exist apparently and the shitty thing wants me to select mobs, not modes? * ya lemmie just, rewrite everything * fixes adaptation issues and sprites. Loading/unloading works Now just to figure out reagent transfer_to code. aaaaaaaaaAAAAAAAAAAAAAAAAAAAAAAA * HAHAHA YES * Fully working with sounds and all. * remove a testy boi --- code/citadel/hypospraymkii.dm | 214 ++++++++++++++++++++++++++++++++ code/citadel/hypovial.dm | 105 ++++++++++++++++ icons/obj/citadel/hypospray.dmi | Bin 0 -> 1038 bytes icons/obj/citadel/vial.dmi | Bin 0 -> 1909 bytes sound/items/hypospray.ogg | Bin 0 -> 46081 bytes sound/items/hypospray2.ogg | Bin 0 -> 49985 bytes sound/items/hypospray_long.ogg | Bin 0 -> 101798 bytes tgstation.dme | 2 + 8 files changed, 321 insertions(+) create mode 100644 code/citadel/hypospraymkii.dm create mode 100644 code/citadel/hypovial.dm create mode 100644 icons/obj/citadel/hypospray.dmi create mode 100644 icons/obj/citadel/vial.dmi create mode 100644 sound/items/hypospray.ogg create mode 100644 sound/items/hypospray2.ogg create mode 100644 sound/items/hypospray_long.ogg diff --git a/code/citadel/hypospraymkii.dm b/code/citadel/hypospraymkii.dm new file mode 100644 index 0000000000..587a980cd5 --- /dev/null +++ b/code/citadel/hypospraymkii.dm @@ -0,0 +1,214 @@ +#define HYPO_SPRAY 0 +#define HYPO_INJECT 1 + +//A vial-loaded hypospray. Cartridge-based! +/obj/item/reagent_containers/hypospray/mkii + name = "hypospray mk.II" + icon = 'icons/obj/citadel/hypospray.dmi' + icon_state = "hypo2" + var/list/allowed_containers = list(/obj/item/reagent_containers/glass/bottle/vial/small) + desc = "A new development from DeForest Medical, this new hypospray takes 30-unit vials as the drug supply for easy swapping." + volume = 0 + amount_per_transfer_from_this = 5 + possible_transfer_amounts = list(5,10,15) + var/mode = HYPO_INJECT + var/obj/item/reagent_containers/glass/bottle/vial/vial + var/loaded_vial = /obj/item/reagent_containers/glass/bottle/vial/small + var/spawnwithvial = TRUE + var/start_vial = null + +/obj/item/reagent_containers/hypospray/mkii/CMO + name = "hypospray mk.II deluxe" + allowed_containers = list(/obj/item/reagent_containers/glass/bottle/vial/small, /obj/item/reagent_containers/glass/bottle/vial/large) + icon_state = "cmo2" + ignore_flags = 1 + desc = "The Chief Medical Officer's hypospray is identically functional to the base model, excepting that it can take larger vials in addition to regular sized. It is also able to penetrate harder materials and deliver more reagents per spray." + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF + loaded_vial = /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/CMO + possible_transfer_amounts = list(5,10,15,30,60) //cmo hypo should be able to dump lots into it + +/obj/item/reagent_containers/hypospray/mkii/Initialize() + . = ..() + if(!spawnwithvial) + update_icon() + return + if (!start_vial) + start_vial = new loaded_vial(src) + vial = start_vial + update_icon() + +/obj/item/reagent_containers/hypospray/mkii/update_icon() + ..() + icon_state = "[initial(icon_state)][vial ? "" : "-e"]" + if(ismob(loc)) + var/mob/M = loc + M.update_inv_hands() + return + +/obj/item/reagent_containers/hypospray/mkii/examine(mob/user) + . = ..() + to_chat(user, "[src] is set to [mode ? "Inject" : "Spray"] contents on application.") + +/obj/item/reagent_containers/hypospray/mkii/proc/unload_hypo(obj/item/I, mob/user) + if((istype(I, /obj/item/reagent_containers/glass/bottle/vial))) + var/obj/item/reagent_containers/glass/bottle/vial/V = I + reagents.trans_to(V, reagents.total_volume) + reagents.maximum_volume = 0 + V.forceMove(user.loc) + user.put_in_hands(V) + to_chat(user, "You remove the vial from the [src].") + vial = null + update_icon() + playsound(loc, 'sound/weapons/empty.ogg', 50, 1) + else + to_chat(user, "This hypo isn't loaded!") + return + +/obj/item/reagent_containers/hypospray/mkii/attackby(obj/item/I, mob/living/user) + if((istype(I, /obj/item/reagent_containers/glass/bottle/vial) && vial != null)) + to_chat(user, "[src] can not hold more than one vial!") + return FALSE + if((istype(I, /obj/item/reagent_containers/glass/bottle/vial))) + var/obj/item/reagent_containers/glass/bottle/vial/V = I + if(!is_type_in_list(V, allowed_containers)) + to_chat(user, "\The [src] doesn't accept this vial.") + return + vial = V + reagents.maximum_volume = V.volume + V.reagents.trans_to(src, V.reagents.total_volume) + if(!user.transferItemToLoc(V,src)) + return + user.visible_message("[user] has loads vial into \the [src].","You have loaded [vial] into \the [src].") + update_icon() + playsound(loc, 'sound/weapons/autoguninsert.ogg', 50, 1) + return TRUE + else + to_chat(user, "This doesn't fit in \the [src].") + return FALSE + return FALSE + +/obj/item/reagent_containers/hypospray/mkii/attack(obj/item/I, mob/user, params) + return + +/obj/item/reagent_containers/hypospray/mkii/afterattack(atom/target, mob/user, proximity) + if(!proximity) + return + + if(!ismob(target)) + return + + var/mob/living/L + if(isliving(target)) + L = target + if(!L.can_inject(user, 1)) + return + + if(!L && !target.is_injectable()) //only checks on non-living mobs, due to how can_inject() handles + to_chat(user, "You cannot directly fill [target]!") + return + + if(target.reagents.total_volume >= target.reagents.maximum_volume) + to_chat(user, "[target] is full.") + return + + var/contained = reagents.log_list() + add_logs(user, L, "attemped to inject", src, addition="which had [contained]") +//Always log attemped injections for admins + if(vial != null) + switch(mode) + if(HYPO_INJECT) + if(L) //living mob + if(!L.can_inject(user, TRUE)) + return + if(L != user) + L.visible_message("[user] is trying to inject [L] with [src]!", \ + "[user] is trying to inject [L] with the [src]!") + if(!do_mob(user, L, extra_checks=CALLBACK(L, /mob/living/proc/can_inject,user,1))) + return + if(!reagents.total_volume) + return + if(L.reagents.total_volume >= L.reagents.maximum_volume) + return + L.visible_message("[user] uses the [src] on [L]!", \ + "[user] uses the [src] on [L]!") + else + if(!do_mob(user, L, extra_checks=CALLBACK(L, /mob/living/proc/can_inject,user,1))) + return + if(!reagents.total_volume) + return + if(L.reagents.total_volume >= L.reagents.maximum_volume) + return + log_attack("[user.name] ([user.ckey]) applied [src] to [L.name] ([L.ckey]), which had [contained] (INTENT: [uppertext(user.a_intent)]) (MODE: [src.mode])") + L.log_message("applied [src] to themselves ([contained]).", INDIVIDUAL_ATTACK_LOG) + + var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1) + reagents.reaction(L, INJECT, fraction) + reagents.trans_to(target, amount_per_transfer_from_this) + if(amount_per_transfer_from_this >= 15) + playsound(loc,'sound/items/hypospray_long.ogg',50, 1, -1) + if(amount_per_transfer_from_this < 15) + playsound(loc, pick('sound/items/hypospray.ogg','sound/items/hypospray2.ogg'), 50, 1, -1) + to_chat(user, "You inject [amount_per_transfer_from_this] units of the solution. The hypospray's cartridge now contains [reagents.total_volume] units.") + + if(HYPO_SPRAY) + if(L) //living mob + if(!L.can_inject(user, TRUE)) + return + if(L != user) + L.visible_message("[user] is trying to inject [L] with [src]!", \ + "[user] is trying to inject [L] with the [src]!") + if(!do_mob(user, L, extra_checks=CALLBACK(L, /mob/living/proc/can_inject,user,1))) + return + if(!reagents.total_volume) + return + if(L.reagents.total_volume >= L.reagents.maximum_volume) + return + L.visible_message("[user] uses the [src] on [L]!", \ + "[user] uses the [src] on [L]!") + else + if(!do_mob(user, L, extra_checks=CALLBACK(L, /mob/living/proc/can_inject,user,1))) + return + if(!reagents.total_volume) + return + if(L.reagents.total_volume >= L.reagents.maximum_volume) + return + log_attack("[user.name] ([user.ckey]) applied [src] to [L.name] ([L.ckey]), which had [contained] (INTENT: [uppertext(user.a_intent)]) (MODE: [src.mode])") + L.log_message("applied [src] to themselves ([contained]).", INDIVIDUAL_ATTACK_LOG) + var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1) + reagents.reaction(L, PATCH, fraction) + reagents.trans_to(target, amount_per_transfer_from_this) + if(amount_per_transfer_from_this >= 15) + playsound(loc,'sound/items/hypospray_long.ogg',50, 1, -1) + if(amount_per_transfer_from_this < 15) + playsound(loc, pick('sound/items/hypospray.ogg','sound/items/hypospray2.ogg'), 50, 1, -1) + to_chat(user, "You spray [amount_per_transfer_from_this] units of the solution. The hypospray's cartridge now contains [reagents.total_volume] units.") + else + to_chat(user, "[src] doesn't work here!") + return + +/obj/item/reagent_containers/hypospray/mkii/AltClick(mob/living/user) + if(user) + if(user.incapacitated()) + return + else if(!contents) + to_chat(user, "This Hypo needs to be loaded first!") + return + else + for(var/obj/item/I in contents) + unload_hypo(I,user) + +/obj/item/reagent_containers/hypospray/mkii/verb/modes() + set name = "Change Application Method" + set category = "Object" + set src in usr + var/mob/M = usr + var/choice = alert(M, "Which application mode should this be? Current mode is: [mode ? "Spray" : "Inject"]", "", "Spray", "Cancel", "Inject") + switch(choice) + if("Cancel") + return + if("Inject") + mode = HYPO_INJECT + to_chat(M, "[src] is now set to inject contents on application.") + if("Spray") + mode = HYPO_SPRAY + to_chat(M, "[src] is now set to spray contents on application.") \ No newline at end of file diff --git a/code/citadel/hypovial.dm b/code/citadel/hypovial.dm new file mode 100644 index 0000000000..61c61ed6c3 --- /dev/null +++ b/code/citadel/hypovial.dm @@ -0,0 +1,105 @@ +/obj/item/reagent_containers/glass/bottle/vial + name = "hypospray vial" + desc = "This is a vial suitable for loading into mk II hyposprays." + icon = 'icons/obj/citadel/vial.dmi' + icon_state = "hypovial" + w_class = WEIGHT_CLASS_SMALL //Why would it be the same size as a beaker? + container_type = OPENCONTAINER + spillable = FALSE + resistance_flags = ACID_PROOF + var/comes_with = list() //Easy way of doing this. + volume = 10 + +/obj/item/reagent_containers/glass/bottle/vial/Initialize() + . = ..() + if(!icon_state) + icon_state = "hypovial" + update_icon() + +/obj/item/reagent_containers/glass/bottle/vial/on_reagent_change() + update_icon() + +/obj/item/reagent_containers/glass/bottle/vial/update_icon() + cut_overlays() + if(reagents.total_volume) + var/mutable_appearance/filling = mutable_appearance('icons/obj/citadel/vial.dmi', "[icon_state]10") + + var/percent = round((reagents.total_volume / volume) * 100) + switch(percent) + if(0 to 9) + filling.icon_state = "[icon_state]10" + if(10 to 29) + filling.icon_state = "[icon_state]25" + if(30 to 49) + filling.icon_state = "[icon_state]50" + if(50 to 69) + filling.icon_state = "[icon_state]75" + if(70 to INFINITY) + filling.icon_state = "[icon_state]100" + + filling.color = mix_color_from_reagents(reagents.reagent_list) + add_overlay(filling) + +/obj/item/reagent_containers/glass/bottle/vial/small + volume = 30 + +/obj/item/reagent_containers/glass/bottle/vial/large + name = "large hypospray vial" + desc = "This is a vial suitable for loading into the Chief Medical Officer's Hypospray mk II." + icon_state = "hypoviallarge" + volume = 60 + +/obj/item/reagent_containers/glass/bottle/vial/New() + ..() + for(var/R in comes_with) + reagents.add_reagent(R,comes_with[R]) + +/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/bicaridine + name = "vial (bicaridine)" + icon_state = "hypovial-b" + comes_with = list("bicaridine" = 30) + +/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/antitoxin + name = "vial (Anti-Tox)" + icon_state = "hypovial-a" + comes_with = list("antitoxin" = 30) + +/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/kelotane + name = "vial (kelotane)" + icon_state = "hypovial-k" + comes_with = list("kelotane" = 30) + +/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/dexalin + name = "vial (dexalin)" + icon_state = "hypovial-d" + comes_with = list("dexalin" = 30) + +/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/tricordrazine + name = "vial (tricordrazine)" + icon_state = "hypovial" + comes_with = list("tricordrazine" = 30) + +/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/CMO + name = "large vial (CMO Special)" + icon_state = "hypoviallarge-cmos" + comes_with = list("epinephrine" = 15, "kelotane" = 15, "charcoal" = 15, "bicaridine" = 15) + +/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/bicaridine + name = "large vial (bicaridine)" + icon_state = "hypoviallarge-b" + comes_with = list("bicaridine" = 60) + +/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/antitoxin + name = "large vial (Anti-Tox)" + icon_state = "hypoviallarge-a" + comes_with = list("antitoxin" = 60) + +/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/kelotane + name = "large vial (kelotane)" + icon_state = "hypoviallarge-k" + comes_with = list("kelotane" = 60) + +/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/dexalin + name = "large vial (dexalin)" + icon_state = "hypoviallarge-d" + comes_with = list("dexalin" = 60) diff --git a/icons/obj/citadel/hypospray.dmi b/icons/obj/citadel/hypospray.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f5e89227c77d936dc67045deefaedb0bbb704c5f GIT binary patch literal 1038 zcmV+p1o8WcP)V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex7wuvIWN;^NFm z%}mcIfpCgT5=&AQY!#G}bMuXKQJp@xj55`5_3}_Y!qb#6=hTw5UUEe zmC6dPel7|wzMfnFo>e)|=yNGa0009`NklPZepP0))PqaKZ+q=jHbgIq9>XYIj|f)Fb7 z&|vaBkQQ1R&CZ+dmh^oIX}hrd8-}+t?9SK%fdGnG`&1jCT9yM;8=zYI%}gHl`Hj?j z&7q;IyVGXgB)NRD1BQKm!&T)A}+Um#fMJt@!{> z{Jw1be+6^mNE+kDGC6iBf zz@O%;i7jBy#iJU3tX3FzwXw8fTUa5|l^m)K!1 zu_Lw=la>Ox`Q$VhUyE=5B@~E@PjbNE*)X)`S!_nPGS2Ek5{sryQNt%WpnuGb9_K}T z{}BZM1VdlYTT8S+G2bS79De)iozZyai}3Wv8`X6?-5tCnx}K@J zfC_mUJROm5GaWg`N$c%72LvaBFN2f8oZs`dw+OGd=e7X1iarfm4p41?YFQ3YZGdW7 z{Q+j+p2ix~yXyb|L-$6c_XlwB$^8MI#u~J>wxFWC3>D>N()$Cr_@w@T6nuQ;kmz*N z;^vdKK)t&T55wyK)-k68-pWK~eLl}sB2GRz3wSFN8Lxoc{s1mMsXt&U{0RWy05G+< zJua(1fRj%;3=RAI#^~b*SpKyF0O;)-K=1Xd(o!HNpPU9q9zDVQ{7>q1)8gWr>kl}t zxIch_Z}kUI`U3`TUfDH%>-K$V{Q;bO>o6obL67Ko|6wfWxD0Xg$yp$^{{Z0F(IeDl z$l~H#TYx&Tt#$hfdgiPAG8q@Y=$`<~0jdp9t)h1TIS8rbH)A^-pY literal 0 HcmV?d00001 diff --git a/icons/obj/citadel/vial.dmi b/icons/obj/citadel/vial.dmi new file mode 100644 index 0000000000000000000000000000000000000000..23bceb93b975232938a0470ea17a7d7e09353106 GIT binary patch literal 1909 zcmb7_3s4f+8pk2bG*i53=~`fKYget!S86U`TIPc-U!|Cu6o{4xVd4XE$ui%Ma?O08 zX*bOmil8JWX|9`(P%|}*uuU_iLNs+vfs5^9?%ug~?(EF}eBXR$zBBXv=ltfJq!Y+v zn(GbL0{{Tc<4z9l%3Qp<)Krx*g^x8+rYF&!r%4XyFQJLJa1st51^|!?at7+OXa}@a z$2gQ^jUIh?l1|DG`l{qakEiUq>$okcc*zMXG*KuRZw|eo;J+TEC#pXnWNxv>53Oqm zAIWj&_G~q8VAS62J9kq{`U^;vw)vnet|lLW%E{AZ5}>~2Wlh$8dyA;SLI$o~6g`fw zc9#2E8k@%2%cHQBDBp#+%L&eWL?dZ5+|hd7;V0D|IXjBD?xef0xsX`$z;!$!sH3SjJ|R=% z{59x8CSn`OeX%U9dl}gx>EXhTwi@ccqtK%jd{>y9&$XGm>E`OHU+i8}1h{OuMs44J zQ-$H64t$EZ)rcjXB-ubTiJCUs%G9=%ou;{*-u@%p;*V;M0r|6Xj#kI08&gPdr-|pl zDfrK)z7i#0+30d$_1xdp8miIwvsS|)dMmjlDt7kqKSo=y0X_(fqYUB!n~AiCrrG(o z5|>s6ev%e8FNO$g1@}{8c|tbq2^>>C0tKUhojX?d(54QNp+sJ=Q@ZPLv-<8xw`kF`XJmk)z`FLTIml4jHVU1|RG3UgKvJ4#0|fOh3R#4NGDIzFsJx`9Eze zL8o^V?XeVtSwCe{O1!KpLy}(H$f}+Hp5K{`8E&tH1+=i@LXGpp50-g<<`7xt|gKRLk-N-N;9oJL3PI z)~{s6zV}Oi(-h`#6M3&RZ1PeG$UYfhpS-(CWfM`|v-J1sQ2d7mmHYj`?T&y|d1Xt0 zQD8Qu@5{!fU?r0dB@Eaqy1#e)*7two#IjC5T`ptDS2{w6>uwmOk9@RS?wT#yG#}|o z5z(*5nJA$Jl718Qpac2pp&}R zj?RZymCwiAMwFoMe;XRi*+9# zEu^zousKJf#`%Lz(E^ryKeD~}g~YKM7Cr<2`t3<752w%d8l1*VWL+B+?S%4S9xIap zMHMqO67vnd_xR#XLGJJqN(gs1T6Cs0O73{S-F2q(Yd!lS%~>xZ@V$aH^x00*7GeUO zzK~g)tr1uvQaO^c_{UYv%AgD>`3-0Bl37i2pam3P^@QrosXlM&(A<6WjD$A)-oCE8 zThcas@Y%_Gqkdu(M$oe-1qG`&h&U>ww@%i+BhEm0FRYj@%V5aG%Z6e%Hi|&iaeqFW zn|9c(X$U4XaJhYEe~4@q+{4pfuyw2s^M1aOX{0nmefTTCHRPe7IWDxv?w0khT7k0H zpKq@Yb9EX#tk(iE&7fP;!ekUv)-w&3a>UFSDrV8%RPGnP3S%(~hSy!Z;u=rB&zdglWJ{7+u9sZd5m#c{i} zYJbx9?-Y3vmq9@>QV5S;B=k>?iCx+?ccIPO=0!e0l(Adi{h{sH-K{9JAJIS+UuU5j zTl^cpN}&I$u0`;j#GREV=SCp7LqY6pMFHcA(s@9-(!2eLA$T-J0(e!m9PAI7!9XC| za+T?L&O%}-s13X%kB{9?#=bGt|IcSf34j6^{(PmV@rs*7`HupQJ0cxw>;q~40?XBU A+yDRo literal 0 HcmV?d00001 diff --git a/sound/items/hypospray.ogg b/sound/items/hypospray.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b70d3fd5b586bfbdb2f44f2ad70125e1e805bfa4 GIT binary patch literal 46081 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%0A$07 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 F{{!*1k39eY literal 0 HcmV?d00001 diff --git a/sound/items/hypospray2.ogg b/sound/items/hypospray2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..14835e9bb6a433c4b23892cfdfd8ad3bb80e8296 GIT binary patch literal 49985 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 GgZ@7%Nl=6U literal 0 HcmV?d00001 diff --git a/sound/items/hypospray_long.ogg b/sound/items/hypospray_long.ogg new file mode 100644 index 0000000000000000000000000000000000000000..d7da6c839f37d6a424105fa94dd1645c255a9c23 GIT binary patch literal 101798 zcmce;c|4Tg|2KXOgTc_)rm;5mUB(t7+gP(R3{s3G#*!^5WNc%MC3}|0I@v>(N{cXv zQnIFnY$Z#Ik~Y6f@Av2X{oeQQ@wo5D@1Ng!Tyvaro&EV*uXC=8&DpaK00Z!En6&sO zF_|bshloHT&xH~E!w+sTkh=dV2`Xp#o45_JIcWJ`;h-f1%t@9B9N}`<|6hXx<3Byg zgB9@pA%03WVQ0~S{sgDL{iDs%D#{oYWff&rw2VzquzyIHPq^76^zMJfcBL91RkDc2+xc)934FSr zfcF6;Xx1Dt*_=nnu)Sbh1r^BtLK`0Io`9FvFzx)C&M6}emfJlO=W_kXFg#>ns zs(=~6{}~CaK&e-q$vtvL4*~-`PhWq?_jqYM?X$9h=Ea;1#8b z=88mI;mj?^49QlDWMrCH)Fs;5^Gnx6B>Y`D8UT_If4TTS(O*{nhl{IosB*(Hx1Oks zC>%tMeWTiIEqw?hI0ocm1$B^%Gdfnv!ke|s0%|&@T;*%>>@8$#{*fqMF5$8NaXtGiWXCNDUSleX4yw91N1StHkjvHcuey@mXU@+} z$IeY>oH#^FwYaXRY_+bE?SGRTKkAJ_>J19@Jtb2n zwZK2Mxc*LM;BfQW-T&+LUy@@QCIMcc-Up-=HuQ+M1K54IrbJYDmOAJ^#sb)2<1_GN80Q?~T&{-|lL#tSWSdiE@Vtw_bt<+E;Nx@d|ns?_j<1T(1i zpnx3!Fq?~+OFaIfQ)#-R@N6+vhl{jyQ7z-Wd70^Uln7wH6D4AmtCRhHObs*&5Ki!i zG^`MnXCP@pfHaAVBIaLoa=->wyrR?sTB^u19^*18Dt270qPT!|Q4Gu$OH(cF)IE#K zJ`_ofN8o66^`~44M7ztRi>1aL-NCH4bAjjxDE10As#e9mRJEsSsg?e{YKl+6tW@!T zvbuJT2W>4KaCe&5de7^QIpQk+I}6UutjzbIvVXBGxAAzAziaW?f3kjmvzKTe>Mh4{ zMV0mT?$gO@mn!S-f?cK3>ceng7Bs`pEyvEMRyJ@O<9v#n*(N8k<6!pV-)ucQjt}P$ zSwve?v6`-_Z)ShVXEmAsZ}x68yE8L5`@exyTio_U&HbwXU8TwM?zfx$>i?5<&Ihvq zK!UIUB!FjFAA}G>k^z7;kb!+JiVT9Hv8@AgZt==RiN|dqoSrVlQq<>aAb@_w?^DGN zEFZuo1pWzpo`)AIKVSlVGk`=7J*fV48#|_EmAhn?L%Ue^9)z!6&isG{b-?E1j<^DE z7qH(-zvBA(yDbN|LAe7hmR~U~wNj>-R)1GX&1xHK$7|()b3goV&5w86;5s&cZ%v;+ z@CW{v0P1BSO;G2d45aySNY5(P!y=^rFcb+x!O#mm*(_uw)u;xtl6f#gv%2a$b2G(` zDHR!6P+>{dv^%*DS65Hj2NdN^xCS%r_=Bh) z;5hQ)fCeClwAH@|e!S~Ad4M)<@_(QL0p?jb0evQo#>^0VH6-3|$O1q!0wfHxs5jhj z2$gi;RwN;~0YG^k^pZRb`DN6+C4nq9Kp$1b>osa_UZ-Lr`yQS5!qq3se$+swro&gZ z=2~KoeZW(D3oU8MnyF%0{zO{~izfAa73PY(JlBBHRD_{L6Mg0yk7!b!Yg((8w3n=G z2g)nldcfYEh#6S9=Fr@M^m+<9V5b5U2VB_!eZLR@INsuUJ}I}dwFe{@18@-lvg|FcM#7TAnurzYkwWL@X^2Co7VfkE*xkC53-;oJjjCH)Il@Q zDPcHZa6w}YX%ws6!5R^u%0Ttyg@cQd%x4oFKt~*`0tW-3Ndo7o2s(Z+(L8XWV_+57 z!OGI=lWjrXshM((P>is*Ft6)CRpp5#f%9zYK$U{4%>kQ%%S*4Ro^VaaXuS7U04o#H zTS227&;%~I>8aNHQvtG_sDPkRtsBvSm??Y!XtJ-nr8OPEpnNd|AX&78lJl!?^^VQ| z#o-PFNCy|b@*mS~UITI%II+Kk%dGYB~taoGPS)zo1k`_H|< z1$F;bENg#BQ6(yGSmtp)Npmc)_gNi^{ zfD*BMDRx?r=pDm{&O1A3mV@4$?Dy>`uNbF$1iUc60#c8PKRc0BR39 zN<68hqf;Q@sroeNv<<+Hc!AV>9eyCxNm-Zyfq>CF0O>W11?XoIXRW&hm(RHU84Bkz zs}OAfNGO0L3M3KQKomg52SA)!pfKC_+$zDTwHyEAURXP z_j;bmFZ^n*36A#|%+{&z=)h>ybm~WeK{giZ>#0g7A@7g}#onMz#+JVN6|j{qua8ZVTT%14015uwxZhy+9u8p&d- z&%kMY`(5fWop;RAA9(Y%!G~Eez^z=MkQC`0p*? z;1T|yG{2RZ=`iHc{yxY4zB~9J?+E_tua}ivzfn^N6o*Hzm$Ha33e|GN^MqQcF+#t9xpk^o&S~!1zvCO#hf_&Gj3lu>Lvh;Tn0Od+q!(nQtCdi8*}3Nv-bz( z*V$Xvcfk^tPjlDUKkfefy>d`=7Ldxle)+tL?62K!hW+1{AI^RH@okPz^KYZ{Gg{ZB zc|0EOU)aCwJbzG_zrA+~*gZA+o&n(7I;ebszV{^V;asp5*dQFT368S})`R>JBt>jhGtzfDj(?kaJ-c{Jdxe8ueTaq)0ftM5pAtkU!p*JAO zqxX$^QdowV5UiwZYgd?$8E8U*?h{L=ZAuG%T(WY$RT|N}zrVaD_iXy=wm^DstbX7wT> zc<%f60pBx+KE=e$Jbqp<+~78OeQEBVFykWnNgt&vrHsn)unCm$>FL;YTfU$sXqUlm^?_GWx5mn`q|k>Ww})s z&c8Vv_mkMpboWFg4W&H5RW%{e6-TdshS*|(PCve3aMdV zA#M;o$94T_AlB@8w*Gm!qL~@(&%c`;gmvPV0;6m%-<#(ZzP@^8P+yFbtCy$k#-W$1 z_4#AoP+Xj@2HIRgfd5PdycpIqV8RehJ6AjG-@_ym(jdlbqoc$d0`)f-jiHe(PKL=;pT!Yj!;5uk zeBVs2{8;sw(~h>fH$r8fAjgR~#IIl2zes~k;)W~PqwnBKs_}xzd}$Nw|Ayq&U46iAUThn8f?S(s_buyo7lt&PJW5b)wqA; z@XxY0pT(NaKKbMu`k2#SxA!MAYfV?nhU2drpHF$|JvbV!Yi;qYC^m@+@<3hx!`B77 zUTt;cHF4^VE?n26K%3AB=Xf&yMu=K+<2lt7$o?Ps4Q+Q8nbQ{0crwN6%;l*ZJ@J(X zhxbYjM{n%LdOWy3t3CX^5c9qwz5L4`^*)MtRC(E}gi~+xJ%v;=M$_C^ocB72;SqCN z@8QPog7EvwuV`-{43N*^&c51w98&I~IPN0W73Cxo#dzy&#w>kA;{m7tXo+ff*gJ;5 zT88B`sAYymH||_G5d~o(iXSrjeuUz4w9aa?@6 zTXPYmD?DkpO&amOe?#<$>)N-QlpB|YFQV?jCh7+vZx$qQ(n6DFIuMilF^{W$eySVO z`~Li_`R5za3uV~RQ`b`>EvugGhPnNjx?**-Na9sUw92=WSMR0szKfzCDp;OBAyAsR zaAnYFBGH5iA*F5aSR@bVUaxbF5iWfxj*Z`ZeAoZ?uFmC;PyWmpezdc{UV;ujJJl`3 z`8%YpW-aow>pxneB-g5t-&@?0PDl`wa7pZ>kbLia169zxa~V*qK-XX)(}dxemYo9g&rK!!6Em?P;8oRjdtj z*B^sG%K3ZQwQu)@jz!PyKLVO->j`rY_Zjm7qq|1?d@=G*o?kgS=f10SnYObYb0dO} zc;T85_p{cwsHqdzwfSfK(>z~BElrO*v^|dv<}B&HzPxbGBd{|yr|ITRlk2sAC|oMG z-(ri--e2I9&VPG4=I+}?N+(WZUsiq2ulR<+Gp$XJn+>~JPqyUA8#|ptPp|&@9PlRY zQHJ~RluOti~ze^M!95CQ`w>SAt~4RxWJ6 zV0F8yb=CsY)H%h!+-xnZ@_DB?gE;P2DdsE`lsi7RUWa)9RMSeaVz{%&@wS9<_V9DB4cxg{{_nO&4+xrY4`fSZZ@8-zO3LtLiR=)|X$Ej2E&IkXnLd|;I>#~85 zacmWe5A`nP+FDs~eG)zr92#By=FHHFiDBTrL!0i^x`tyVYIiPEX9gbVacZsKR}D%( zw(HtI9ap>bDluw0*2PAp^%z^u&%EKUcs3cccyoq=@a`t@9!AhsZ@$h9f3I3Grx3zsuF8>+6DP*2e z`F*Bg{iXv=e$5VPJ@B%_jTqVFz9z59^i}R|WX%Wm`gW?Ve8*bXgnO|ZM~BXs&`{_Dz0#HN3o!x!L5BT5mRa&++U= zvw|qP^#1G8pv!sFk2Um(hy6Er>KujeS_bEKx65vD)o=K1A`GxB#?Q_TN&Ft;K3)5E zWK;6GR^89AAA1cfW0!bK>-9BpdOr)Fy~q5V=XI;8ufG)9P2O+t)7vRtj!HS=tFohc zCGRCvj|>!7saW#et)>XYuD66+YmN=%-W z`+nPbGnMtu|7oXG>xK8o^JgyKn-1Hp+mK&U?Mm8FP}#~-Vtg~x!`!eMpQU>BwTSm& zO36^Wj#>ZkrctP>^y_Gyp1GZveX0Gu;;3Bms(Wbu@2ynytC0`L(&7kJj!mZ=dwAj5@lIUqaLk-j z#iy|I^f%deCt$OGY^SR|wl|->@02}*eiU`u=@WE3BxoUlpc_IH{scLrsq3T{W35xf zDlcBzXSdd75#W{k=YHgf&hjF+oldK$!5eYiG?i`tl&9zS1<$7MUk}Y|wUd-_3K`AF znGq5BymIs0v-Q2DnRDX`4TAb-30srwtm|vIchLkG{FUI){sPzaReNuy57qQ1Hj)V$I4s_vLS!(r28GZDh<{Q#A2Z|5^IvNZhCW2lFV`V@{hJ z0sAA79Vgt7Z;!-Eccs~n^2n;kA1hjlfB4OD>}zDB$Zh9*YU|Z!dU28C$6*h;wX9a( zKi-(uX}?t=a@5Zy<**zRQ(mvvNGuB>*UaCRAvzf71Vt!aLZR3*!kYc zRdT+iGk&E>W`lOb5%lp__#D&XxzsWI|&tAMG`4+OBYtyv+4Yr%~ zs9=%reo_0?l5@ElTZg~um#l={Q__2PFX5Z4>&twksh$<*%~z3Hn})*cpTaL3_nKpf zZ+UcL=eyFV`^f3wJ4##HF>S7t)-=obIr($%V>O0;@7hcE5*!C(I-RN<_hcN{MzmJv z8vL^rid@j`>cs3 zk)c-%FTFYU=jJDia_Rf@V!r9)HAUZcyU&gMtZ9{V{84dFvitcNZEVS}-Rb(7wN6y0 z)dR)g@VmU>Oi#Xl%R3_?vScM2CiIzU#nyTyvBGRd@3+mDH_Fkgb7hv5)kYK}MP?_g z!7s9v6@8_N7Gzw?Riz*{nQr*>@WpS^IDBL7(NS*t_G8j9kr;gsIPuJx#?OImxoIgO z#UFY1PhFl07IlzDZCsIl!rt@b^WJmFJ!oP}L4atOTM%jJ=Z)@e$2}c~a|w^9xdv4q znx-yX&Sufm4@FIUXV`TLCmwq%Hb6b(c7LrVHYDxC1|VK5yKruaA7e9oS(iL0qmX`E8C>cc8u|dy2~^(z1b4?V(2#?P$Z!&Sug>| zM7yJRy(%xd@%~6D&U><#dhW)v-#c$()Qe9Ab-TRWcb;rcRrH-aM+?Zd@;%o)&O(mY z)7!gHWhA)TrB`~QJ1?AJ>ATAA)3(oZgWu?gBiXOVO@5WRoL=8e(-pZF@u=_17vAn+ zB(5ReQ{56XVJ)mUEzs~$|K-;pgk?;OD@KlL8~)3U4Pz18KREg#fAN!zQJvDrAxTw$ zIimX17H*9+E+(NXOFlHAuO|`y;?R1I{Kz9Vv+51Ly@)TRo3*0Wl7G&xPaWfS9FCQ*J`N{`P#Ckd*-zrd{l8_=AiE*@ad!}aT#s!J3o3#05YLOOa z>e=gH^*a>8cx~{>j{NU0xUZ*DayVtrJt3bYkCC>3M~&>a(mzKOpDgeQZ@WEHbaV0D zZM+6fGk+OsXl*9n%rxTQ2Ve=3U18ttiwA%Dz!?tU6I}=B@5iY{G6DZ?R!IN%W(6adJW9tM5xNR) zA*7JWDGB7nbSgP1BmD|FJs~FPa%_BDGIpQLEF{?nKQhzcbJl9w3?iQlxBhcCPlDwE5kqlbLUXu(5ICudXj$ig=QC z^XQw#4>nCJzhbKA;yf1zQLh8nk1l^2Oj$hh;o4mc_2+5o5st#9Lz4 zZ5hXv*Oe_D_+EA4CI*1xjx9#;z8*w>e-ELxknocRqljt9(I(p|g%muzPYug^k)Q(9eZp@(`@4!_{&k51RdZLjtzJ# z%+0pjw-Idg_(n^&h?!oc zoKT4>)F-v#c^Sp=Nx+sS1M&*O*0I+R+(Pwefl*C8;THNAm6Jl|%R)V_IWwS>S`bhk z3c^srBUFYnC4LK#@9)*0C`TCe=h`mF4w)xAESf!L-I7p&kke8=%k-ykrB_2>%*c5P zG+yMaa?I>l&UZT>Zr zK{gexTGyG=UI*n7XEihaQ0Jh@w1wL;ErJS4*#q)H9nZ2 ztmbtm{Oy)NKc{kb9z0q^04oNE%#EMkIZ8g=X1+Rk{5DYDTf9+g`!i#Y>7xrfDf)tQ zP3tG)pV#$Xz25$?>Tz6H|x-(|3_ zyl@A}^?GEh42`GcO|YE5`g&xaoJOM*ni+e!wmwOnZmrInoTMK;o}3?Of--h>pxwDd zLhECDG^MTK*`WiP@6E6zE|`HQTwN=T8xS?@*H<=KB0SH8zAO@2X>%!<-MAIPmdLL5 zwNNQ3Eow)1^YCXxY2s~)>Ga~|*dgm~4vq#*j8&_vkOaK1-Amod)U@HL3=6{zYr5~T z(Dr&J%X}A&&Y4=0y5;e}$;x>I<(>QeXvH%7DDlCgD&%xgMp54j1~4H~g@?WnEZ#N= z7LclpMucd>3m6BDE-Ev*3o};TzJ%E|>^wn)KtH!UtI#bzR3LU=MC9XnvnwlU%Mb5Y z;@xMKVMiRS;0hIyjmW-wq$x|QHno88sFM0LB7wqG$93KuUP)sr`?#=*M50udp}ml zba&HEh?Y?CDINveBQCd-=LS+^-2gBC(b(3m2OQCtJr2Ra5p3DXXOt(LD%@l z8hNtBrTXn6a-0){#EYVZ`4haM`Z<`)AwWxoR|YVV)ql5R$a^UCdK#_yL$a)O7qN>C z*kWVSX9N_!`VA+)UFR_VWu%+25`sDQD=u#6S91oXMWEa%kma+f<0QgOS+a3TC1KLG z#KB-P73a%8BLGYx%40Dmt5(OZN-3KJNc|XN_$}%r*^6ay6Dv0%W;Wf^ z8ka-~FhImU8pGwdd~|I^Q6E&s8Py&Ozqsr7)-OBrKBMDTzof3qt$JJc>&r-6p{Lgm z#oRnn$ib3WDT6|$)u?flaPf>=gX2*%@FrHEX>e-n?3AJnDYP0{GU-@0&^Z~y56uH+ zi@QqiKR=W*_KQj;T#Y9`B5=W$8Q}VmBtzu_ilGdb7=kqlUO-A=MPyT$@Gy^7#G$n1 zkAVjHwRn`=`RHx^n4`e!tw@*1Use~HFD0zL+lUzcR`P{G@B=IDO#1Pw#z}MnS4ZvS zC7@nrgu-_m+R@=^#Yb;X9(vZOpwEaCV-Ny(V;L0PPPZro)Kv%ue{3~VuQh_4G`388 z^bW#l=mG2X3KdIY!C$5*6R;3o$E9|OUyf#O+ywajV6*C~Eid)zD>^FeFUH&jfc6iO zTvs;sn-x}Y+07I^&P&eB+x2st)_v~$qGVx@?|1I-wWRsq5bJber`^FhTDE$qTk7%Q z&|ijzsU&7Oa3_mdpB{E|wY%{yL@_|566)?GVT;m1GJ51udH@ekA%?}z-r`e3Txx!~ z32&lk3CBfHJr2+Dj}~QQcBV}aId`fIKjLfLYTg<&_%zO6NB=s#_{vks>yJ!|YfSK3 z&7+nNS+=dtEe@{c*!-l_#7RPntQ7G(q_(^hStRN72x#mNo)xz2W@0QKedyEm-6eu# zoT|shvI0xsQkJglh6zDbm`U+Y5-=fFNDqm{E`{0q(BTk|yoGcK<7jV4DjVi@uph~p z8|eQY*|MB@Y+sJSwpG4c@QjwV&gHA$1!N+9cAq{RxO(n_8t6P!)yk@q0(*mvdQz)A zT{Budsguf9p$p|?|E^)7@k$0wOptYx(>Oc?;=v=kamhc49_AZk_G?N>=bOyCnsz8F z0J|nH#tL{3L4=T8Vo~>oLg3hWxE()KOJm_$hjdVO>YccdV}d$+I#ZL)yL*XUc%PCl z7aLVyf7)g_*E-zk9#iBLH%+Xcw4Io+?^kZ2%nH-{L*Qu+a5zTjnl_Gw_hf^EG$)zF z(Uvr`G=oYV=x`9~E!FwY2yp@7@*iYq`?Q?!p zGeod?vLfPPeOMhhLZ^&Uj)K{s=RHsfIAS)buTn0X-3(jUSMCVqW#e0XQlD%VtaqIg zxQ+w>i47f6j>c!v-;w_BAw9thMn5(eQZn%CwhhJ{9Vm?{zCHp=WHC*)va=J8?Bm41 zmK8d;Ls_sl^Fm5pFNss9-dhe&aMhQbWENQnrs9xe}X77AYJJRz0Ld%s^G z#2zcywvlKi>hadztHYw`x2rvhZ4t}yhOsvpyQ1KB$4z!s-2^d{T@{^e=L`aa_{Qri zk)C~(oiwK7Ewgl92S?vPc=wFlbA8b5M7Jbr%ExUIZu-4DQC3L)E-m&e&`BR%4(Q{d zDV3T!`Y@E32%RSsn?y+r#VP=r_G|<;qP=U=TU4F1Cz`?Xodss7%l?ZByR)VK{rsG( z_bD<;)E3v@P@|?5yyJ%B@kZtu{~2oLj6ftGV_GS>$&&#q!j^CBF(~H52*A|F6tWg+ z6?~#~Ke?Z-vMS3Y8DpSu3(&s>EJ&bJm?VaP#Cs?t#1GZksu;@g+KMpQLOmoS%q0OX zg;gr5gw1K-P>Y(;#qPuQF8oX&3((aRX7NL|*qX-rClhsz3Q*eQlvpSAi8Y@O zq|7x?vC@nI$g(wE@xnE+Eq340)M5RWV(;h1i|sub(E*$~hnGX7=Zs~&v-A7~nOpXXlT5e$H!?0>k z;iH-0Za-%eph1_r;{1)XOvwcQ4ys3ejU!@Rxz$5k_SWsZ_&TRnDh(I0fl@jA=H8hG zQp){F6Y!whV+y{!)XO#`bCNY36V^d?{@(mYG^tH4Z^Ww1|0L&{!_fWSB0*oFBX>iv z0ENBS!ZuwM2P7#olZ}?#L0y{;HBq3-cZVWV&*o%1Dnjq$Tl)zZV(+hFxOUy_n{JhIJhD8cmjnYy-F~hF}9@+5EKHJX(`TkB{ zJKsfne0;^m5)P6+LJjdsC-0o%Y6Qc)WA2w%r(N>0liSK8XV{$7j|H_*XH#coD`}Ij znIE+mM!ssIPPP=QjI?~Ot00-W2GU#n0KoR<*h>9Sw!UOfQte8`MLxYEN9pu>$e4W2 zS3d>G@%|t4Pqyj?B=g!Dm-$ZRbcwXVvOYa3zZ`Yh1B0)Y09yY2c0phJzxNUjPG2k1 zJQf5mM<>O^#P9F_zLb!X8lOnIoJ2l&cLA}#U&H%Ghe_zVdb{V?Q)eJTYXp9lhwP5& z=VWwq!%WVI(PWYANF#;FG}Hr6dOIbmiANgV!6IeNLX0f5ds zzw62cX=k`DXm#+!ye`DGP*m6Ri|iZ;0bJ~aj^No^iYTqAiB7QV_{!HomCeg%KwpBO zzj!_YUsb8%a;=)JT;Wviqc8{*_K9Z?Qm^1-5`-YKeg|wL& z6wGP8CG9-Q$r7Us@h&K(6*EMUJXZfA){knZ-Dgf8 zpBg4G0rkufV13DgjTB5MXHJZgWYWKivE>+SAGelAa`h3!2`p(D1XQI4d6we;ytce8 z-7-f-&U>Jl$Ojxpc{rzW0Kg6EhlmHT1iHngCb@X&k{E?Kl9UxkZSVshR!S~gvG0%# zs-V!GCre)5xVgU$fnor930yLjuo5#-2%z@aqxFKq)sNg{JAK=A!I7Fy68-Xmbip?x z%kjY$2S-I$jTwA@C9*s5O{zm*ox_?fUx#rJ1QyVR=j&mF_DyL3fF`HzpSvret5+_i zLXB^h?Jh{(vnc2d|5SmzZ`or4d8;QXr)k%@wy+Qxfw)(+jjnj)MY}61XEbG zxIL;Lde@xiO-|;?A~dJ1v{l406>)i^g5)6;pH?)E0p{)J-1dVeoW3saisjnXT8^nUAZ6dFc0#zE-qV#Eg-)Jc8gAOpCd z8^+cyu(dYBxM@J1?12(PwmJZGWrg}$e?oDux*^nCPChNINsjDEptw#FxVAU?nH@M9 zXFLM}SZMX4PDYc;L6%&{H=^_{ZS4$@DiB?TS zf%*hCfE6Z6trd`(QX9UlQV+V8%CZ(|p!1mD=_flbvtc`HkIFP#jkdgT=rN4_K*PN2 zrv*j5QJJDGvxUVBBZDNbl`u>eO<@;ESzO%D<=;Gfd+hy#Na>~3SEs6qH!PxS<|i(f zVpXOFOne;D1dJ9d_@ZO|+tzyv{qf95sjba7Yz^WK#d4A>QYK5CCq<*a2igf{8;d4f zls1b$a{9`Lc&E>a+!nAQ%Fw;%&#>O=3K9GZUmy6Mk|8d{V|zZg%R#Sx@Myn$?Y7Mo z;$t?hSN)ZjEx8*UDqRHLnd_i58gqt(pf-*I7IG;yry_bOBVO@tUOhl#_cP4a7MB=% z#yg#hQ^w1hYB(}qTFn^m6D~0#T1g)&!I@|pB4dPBMchGW>Km%Ssp580&hO2_&;hM% z+4@d()a7@OYx92s4Q3P)K!Lm;0q8B_e5(YhdIIy;?5h#4TsG^A@ zI*tj+&F6wNG7?%$=Q8wpZDgjusVgti+rwy@DWqV9Q&u`tcbGYxnO%5aU2;^it4e(0 zN=AxRScKGS&8h17{)*HsH&_ip!43DKFyCNhkbAI3X7 zHB3Pv1wTPxx3WM@>L<(Or=o}R`rbhS_?|`0rhge!(lQ^akbSpcInh=C9qlw^SQO7^ zWSI}Tg@`nsacV97k(eMlQlOs5*25@v1#^$ZxQ zgDemXt@pA^3SFf8XN;~wv{M$1Z{wEYcdZm^&%rF#>Da-J@(|rjo-d6FO;Njexj9j(u5!IwG=)x00m@YY5*uIz_1-f}wV`yC zmfL<^?lV5|^jx&3jAM{JwQ2rqyb+zKtIHuYo%IDVKxe+i|fJ-P^f9f&0G3A3m9X@7z*(hVC=yF^k? z5?W_hy{Lf#Vv(~I%rpUFz|6Zee-8Mu1^@AC%H90DwKeCPGF01Cf3LBf09U8uTndB~SH~t=X&{SJ8Xn%kR;WR9 z2fcuGAaaI}2?0!SU}X3!v?U=+V@PKg&r`R01y(L;wUH>?tSFQuaZio^M#Yv4TZOVk zErSPu#;466{en1|1Oax;NPrrkz%=r6si5nw?Xj|i<(QaSH}_h>*mXxro23Isv>W`D z@nrj~KW2irVP@8~6OZXvo2W-JHk2ZZS_?bbKre{1K_C(U9xO{Mn^Kk>Tbw-h(<9os zpJSoDqIejEEy2SRmga!~9w8EqY0A^)4VA$j5*v{5a^-%=^M6j~Qpq+}CiLsU+ zb`$OntJ$u-s-2;8_Ho)e#J=)ZcX9{|V-Plo&&vnLfWbFBX19v_eYS5F)zJqKN|Xpo!vG zR#|iAN;Cl6+tX=xee#B~eQ)%=!B??OlWXsF+3Fp$kgct?6$+8Ht{VhbN8@!lHvc(_P41qFy^bsrfF z58M1!4Mk-(PjeM5q&;Wq%`z|U$Ry87r4uk%RLUSvD_%#DDJ$FdIl&Hkr~>HG)JaOQ z72-7Q@dV(PfCfeqsah#!UTWd+m;yos$_Kd!#G8 zmD8<*;tC;!bR2i(v)yEMAdVNcBA5GTTV5a|&(wFl91HwBy1|FgKKXV-YYP?`8EW zTNqnDcE}=)Ztd1;XB5~(_P2vFd$4HmHlWZ>@<=y_YC)<)D8aQq0o?xDnE7xl_d^aB z_&^ORn|P|(uNU+4KjgECTo#hgufQOevt?sFDnlWk5L_FD{`sp}QWSfz{l3tJeKXY^^}FAunWM6K%(AKIjw zeSNb>*Nr`FpfVrv3$;*bt+(FBF`Vr8z0~VoP}RALDlCipl~t=IQP|3JpC6YV+{dS$ z*qxiZy4-v*=Lmp;dLkIO7~k2sB**(Ra3*+?5Ut>ji>U`maz0hY5*q@8=Auae%m9t5 z8sM_K@5+SWW0_J#92*t=(t*DQ<@u_~`oWHz%&NkSCQV%m6 zHD(3Y0;Q`Jm1xl(``ldaaW*b5SzCq7Jiw5mEyiWj!^psFRE`6`x&y@1l`{;C08s{B zMp%?k8Q=-AH0Vi1d0i7Vl|U6rmNbR5OFE?lsvjY6S=VJMFY}uv zY*al@O4s*IVj24Mf^nHUwd>h%XGD+&+sZam6m~2u=UCgZvOsmz*$>^uqmM0CE$M?`<>(Hxu@|qcX-?rVx&s}mjedvgUce*r1NXv-kc>n=}ejbWT^^IQMTK=Bts87o< zU*_qTFr_>C+kKA@J5Wnp&RsFCH)0%S)2^})c7XNPurk~R`CESu|FmBPrH;6zf7^B> z-T@HNeeU@0iyQh*2OR@{zcK;eF9Z}z*zkP&`?>r3r2YNW{r!^t{j~l4oc;ae6SP}< z=)FnkoglSX*JmpmOU^7yonvs0!Wnvk|DzryHkuVixn;hbmT5fE(hv`!;jJ97LQr`k zPj@Y@`;FuHBWkT@y(seK3F$CSuMV$U^|f`J#A3qX@%H+%jBR8=Ovk z37OPlvTy@lQLdblDnRorCO+cwLiE|PI5tYvf2<{T$;i}ey7sG(MG5Md4T7CAw9f!u zLgDKP)`rV5*UOQ`ktJec%=jh(iuAFK->GEAs)6z}f~aoC<$$9j9<>*LA&b)d=U)vb z@bUF^dHz7gu#&z5?|K-(k9n#a0m@PMoSYLQr&BAw2}P3y>#kBLi4{&AY*Iui{_b(6 zf4&9I7B|E~4vEBjW>Bw58g055qX%@wH?u_<^xM$o^C!lt*cF88RJJ;}dD+BHK{+rj ziPk>AfZ8!{1S5gM6q~Ws4{(WPgStruNM}l903JtqNU}??bRd~YeC!zO4)pFdQZ2BZ z&iHu=f5-Gle3|Mfd-b4e8##T5!ImLAyx>~+rvN0htlwpsk0NQLkk_weAHsYO;Mz@( zH(eT%&pLYzbcnKb-s>-Eg^Haf>4X7~SyQ>Vj-k!5Lt4^?YAMV^K%qCMW;Q0+n|jSG z$s8)uXRRf5VM4X{MorF_T+ttwPE>zVbFtO1)VienSTW^FR{Z41KmVbG*;@%;2!97X zlNIOk_Erkea*^Ol6!3PHGWFon-D7@T@RHX$C&JoS`6aKDM!xZ>6(Soj!N3wM41*P^ zb#NL$Nfa(lQ?E@Z@Q3VRu9VJ^XE0Shx$Ky8XpzAuOSqjWp~9(kcG8zpCq_b%%4zu+ ztd%^O4G(I(CYpaMim2&oSz^5I)kP6Q^2n3u1a&4B9y`p&M?ZCDqsfRCO};d0eLTg} z0MX#tDnk^)Hd1S4(B;Thk7Al94qk#Y?P(Xt1f5u>)`SY=1mOaqL)0k^H{i&HogmT) zmE?MSD}{oZX(XoC*IIGVKLXU%{(c6s=Zr!nI?;+tJ&;h0$4t~~;`<36q?tUfz7S=& zr5$*zK`RD#UnrvWWUB%kwh?bh50)bqvPt1B`yB0zu09Q}t*G@Bpz&agvBrqTdZKz( zz_6nofc0QXn{+gS0^I28a++|Jkm;>Phqw0s;pt1Dl1%rw0RaKgK$eiy5SI|qz|_#JK?S$aK!MO|25>3Kx@zWF)64)W zA)=|Nky?Y8glLUgHZ?Yl2)MLOrZ(2pT(ixZnyJ~B?(KW)e&6>Vk4KLl4(HGFKF|OE z+g{%R%PMV6)e~RT6VPbW=Hy12P=dp(*R-+_Alh+IbIl(lbucEr6!AE~=Se?vbg@?W zTPj+EJ9xPkarE#*5-6`TENTj5_^@DW>cKH~T8PdgIWrP69vim^LR>6KrFE9(PwINM ztL(bqyiNqz^tT4sz02|^FS=h>lkzwmG|8RrROLac{k8IA?HW846;OFGi;f9IC@uyi zMFj1TdFq#fYE6Q;PCdHs{q+&;CAo>!BAVye2c#zM=nUES_(A(3g#=POYngemdtI7a z5&DokJ8jkKm5cjWq|X`+@1<$hq}U81w7?Ms>!_EC(J_aKTu`CG;M}p-yOjY-2Pv3K zz_?VAJxRG4GnDeRo#A>4coNULPj~-YrtssslseZy9}mWWNc!ePeKOo&{e7zzM!-hT zQI$O3*~cQ!jyY`IJyPA=ZjIW?vkUCgf&po<&7x?qR>=nydi|WxbCxMaC-6_k@EyLx zq>32~ZbbzP?}!>CD~*aI*sg8w9c5MJ4%m3ULJteh$DuR<5g`CknvG9Fqf^|%s7j`G zzBr^}1_;p@kUnpahzWIIqt-2ts?D7nP^fxi#KYEmigrMw9zA~cC^350tW#S<0XR)2 z?8xQw^UzSjtT{8IFO=w@>UDE=e8(NMUlN)hJsZXFQs!oG!|5a?tPb}`%nR3&ELMF{ zAF)pss9jx0f^Z;XAPvb9K+HZM_jls^+7Z+c$*`3t7WG?o#`XwL4a!EbBGB(vV}q)- zAe5md{ZVVI9)>10I6rV(MB{wmzdZCPc``bgW-*2A{|Utp-aHYD5?BmDYmz|u9A_oh zm0ms7s8Vn540K}%m>7@khQODqF;rw~;y6M_!d8`2R~=4>1IIq)$RTMhm?bqha5P^8 z@eu@kg93f-j0OGCx(ehDO8hyM)5rlK{OOxy{^~$X3b)M&Rkz~Yj{Bpy-uoKvR(H}8RJ{& zyCG1<3IZ>GRC>z$#hz}#^3Xs2*mn=I0b<829HBg5A7=TVXlr;C=+&xRS(-h-DDhpb zJaNKv``tekiQA88IJS1#IYHUY?-AiZoCip?W>rWe^V^Hj%cn7l?#$%Tz@6{Vu}f`d zD4(@#GI`yYxX+keRZ!3IW1zhhrK1gUg zB=t+q`29LGr@YOzJ44tk&*yPkqeMJ&mSowx9xIY?+Xw|bLoPZ`B0bqgxJrA^XLI;>rBhAi<==tvS_Hpa0Vn7*Y!A8KlVv;z=G#!wMxqp{xDlH*R@ zKH2w4;gg415^I?ueV8oYsC|~;Ku^lD5R&_*wD0ehomh@Jk8y(8c_I}n6Vad=RYDTn zdRfv_L06bw3j^4eD?DMe*FkrX9Tdx!SEnWer)AQ_WY=L-5IZRtYO!2ik$08V1*bK# zYlDrlXNX5e1!c|Yjd87GYFy$++r7{4@%7P^po3!DJI|MFjl-ch<-rM$qH1C9PhEk4 z4OM{?Hv$H)L54toj?8@eva{f6&Jpy6-&g+hZ*cpEqkbGFH|^KE=rH&`xFB9tl1o*m z2C(Cgf3p}rCjag=?!(g?_a^2%NILh3fBor~8`noI9P$X=T(KYY&!6uD7F6I|pg#G% z`R7%~jX!cB8*vC0LN=z_8a8!)Pe@JDUf;^>lJOIbbRU(mp-#=+!nA56E)E5?*vXXNp$$Um|;Rm zcz&*d1!hQvXct|7XIAlrx@gTTRi}2{$b)h0A~CFw5S`&rqLevbNRkIh3r30_JG0E^A208ijj9Gst zotM_uWfkZQ`3|iV$T9;BRDG{68m3Z>+B;K=P~3OF5GB z#~l%!bou>$j379YV!3)W?<;kg_%^KcS@PY7L4=_d%d664op6s7-yz)Mu4;}YmGW;LEtdvyxaGBdqSuJ^y?X!a4<<=%a$V0BRsG z9&8h#?f4WYU5BuQT6izo2D@V%%E3FL!4Bd`moWz5=!#gL4^4WYo_ObJNnN{Ar5QB> zzYhB7kya^YaEp_}%SW?>3~2_oPab#Y6ftR6Lj`WcFZ(uGqaam?XQKFh+qxJny+e(O z&=oPo@5a4#OXeEWrPuhGiI)ij(I3u4i$CTHFfG@T*8WG{@|JQ3!Kp|4^At~tYJIDq zWqpS~{HBr3ibW=B7|6%Jw--@aSH+@t5ir#n~EM3_C1a!3mD($9qcC2r&Oc3{mMso z^8n=`8lDg--Q@`%Nz)&`PTJTI&t8QtM@;r@k^xZbUzANyOusdZ(j4ENRjX?x^4;NSVn_)1gM=s7<;#2%^fcuMM4`ZrsCt*jd>+_0{JHXsv7%A`MCohWj@LLQGd7 zLdSM_>qjrgYguN#s>F9Myv|iRl^>`@E4s%co!gDyzAC{4XsZ8+X#r8dZz}@a!6ww_ z8gc$hAN_ADNz1~nd+Y-be_Gk`b^h(3ZO*0(Q2!%`=sOZlR550klo4&>0^7~m->f;v zs5C?L9@)<-3>89NnkOStEUJEgCji<+`G^ zt_WgZkyX>xR$9&tmke4%wQ4yq@kpOjB&-2ip0!pwK(=%>#FPr^q^!X{z4e~?)OT$@ zvkhbtL>o$vgi9Rd(7`^dzLt=b!Fp~~>d4*7`CW9S7&oIN8D+Y;sD6ZEdT<5YLXu=> z@G=1D^>CNAotVu}`9Zo%3Sh9Fvr&9;Q<;k@bw;6Q1P4#amOqc0Q`!jF>6XZ$EIp!l zem4cErpm9lZ?l;7AE$;wf|rko@otv~TXxzAbEoQkw|Kupd{m1RhJ>=``~em3rB#(z zHqq_93Bqul0%N04X{&nieCs^L@1v>@4_}{z?k8~@Ps;SLczBYg7Bz`r2WtJL0q#SH zkgCGe<@bZs$(0!NSXB*ax)X0e=Hn!?)&LJKb@Fm$f&>c!VPnHUEtBk!?JEDl{mBNb zAhEz#3eI1uwGw{{E3r!V@fy$vc<}m$qwUGwsA_S)F+tlLm{Ly1rj_M$Kvr*rPda|o z(~ra~8?9AGDbPNY$ZWWQMO6gp*l8F|mF2MViYol%t*uY^?ClM;Ps>fOBHEJ1PsnKZ zcew9fnhhG9nz&c$i2vpX>WM_i>f^uFw^L_5Fy|Xofr&=Y2K7?e5(0!!0fhsa8&EAF zy%p62J#f+fZ9=Hwa%ISU*vE|v@Ynr$Y*oMl9~LHf8kvHpZ>#qrZG>jjr*}_>LhG5) z!)uw^pENiAAM{i9?$zEwKW~8vUscd~0Q#wU^QQ65o3=M^j=p*GuQx!R$D1AgS`T(u z`&t^=ne7wt@YIg)O*EO_opVY$_jpG;A_lk4YLx?1u02kP#l!fx;aty=Z7yw*H4bHY zL9!`XOiwXKfOFZEz+YJ0ascWCj@1F_99?Gv%wNw@8u{=c`5BT0rB_fEt@C(-LnP`S z2L|<3My;Y9J}-0t6AFtk!{O)g2Tcn*q~R#VJjTw-uCYTnw!dk%L)i)5g;!hyYbeDoZ1AR8v$IicKx zAD$1Fgk{bJJ(S`8(~$F4>j$E+%9^q1b|~aSM4B%WL|=Veo?rtxu|5v+q(3BZTVvx!LV@QZ(ssR)Oh>hqhvA$g}rYQft%t}1u# zBD#r5V-tuqEUWM28oJNJSmr|~rK;%(^x>K?$SNX61+5`%@|x1Gx}L++_WwKvUM*r` zGQl918@5IlWL}dBudxHuZ*>(kxpPgv7iqh15YiqDE}>4T_jscb!4T|&&a2hP@z|tt zbbW7H(0yGgFpe6yL1h>6$=`Gdyp{!yu1S-rosCQ7u$|PKw}%{o$JF4J|N61@+94Cv zbI;6oM^eP#n1heDLxJcYkjnc3dKK8~vwY4+#gD0!#kAMn-)`vHc`w|K3fL2gFv-ZR zB^W*#p3uYe;ehhe?WNL{raa>_Rj=84?{o}*hADK2uu0*WzexwN9u}}J7tQ7O`7slA zDOzvsTD$EW(Sxe3HEQlDSQC1qWUxaoXN8-+h;>q@Qi^dX;~rTReKep`0Cur{OPnp# zV!gnh0f|S72zBjRD-VXpi(0X6Njzph)l0FK&&c!~DMHC?;w@o2Sahp;8(@h--D2_h z9o??8viVaD3L9Aw$9gW!7;zOY$x6@W@e*9xjM;K?%*mLPRWW@5#&b2jG8yn*w|Ne> zQ;i{3y0Z1rY;Eo=75>OrctIQbY@?913mPpTjCo^re{NkZeucGj%a=3Y=08m~+tS~s z_ZpLk>t#UUfE^;&=Y;gh~EFXEr41I0gZ` zxm+8q{^;>q#}BXKAXo?u6_`lk*^fL#Gt}o-S<&Fck4yV861bI5Nt7}m@`1`r@WfaU zHg74QQf)<$;*Y{9s|6YhHX%4vWU=E-fuh)egJV8r3Y~7!n+}sd64YXRASb=kgkyn$ z-$>=oDxJ43?@{zXko(Kd=2fhR@$8ALeUbHKw><88u4#~S!k5b~qv@7Ve+8}imgVM~ z^;9(>@M&y+burxV>U^>4Ug3*L_25#;!_rthDgV<*@3h5aAi+kVPAmz1Q~*x@BmcLD zojtg&i0Ojn28;rbE9b*O@OSV8sJeQ;y_2$Goi4t_Dafq8G8U;ugEq8Yd8ITQQ|+qW z?Q!JEU$PaGGu1zOd+)ObHSSeVv_-l(C7~&W!v%?*bgKreKNV^%?N{i5P)DV$9pK0G zy+fCzb369jxPt7Hmqvw4`l{qIlEOg1WY_;DE~e_UnY(s6r!knE?FR8J#{d~<1W~ef z1zBPBn;E#xn>c$1I-^MNw404U%h^Geuy#EPmre+<9z<{*i5Sg@N#gPVJD{a4=NqO= zU*3!H*BH*aLYhexonH3m@tccaLcVPWYL|u{dE0Io(-k7k&WlHMPw;= zfG)u^7$VVg?Ys*Mt?Lb;ZlLKA`?=_UYyZU`{z6|{+jF+cSa1cn9mw!TjvFIPc6vDH z?AfBhT*i9hU~9`4q?o-~Fyv*!`~9n*o7edxYHmDz1)=J_rNnQ3D}m+% zSSC5p9dnfvS-=chc>w%M31@$y=-E(qhW3FhYTugW{~8MWnw|Ia-Ak{ahNU|jZ})z+ zanFI0x6})8U2Wqm-}ma?fsh|=*GXzZUI%}%ailvm54KexdR^va0j--VY`R{&DgPQ* zmWB{WF=tW+ZVGHi(S`^R=o3p|^if6zWs}#l+=iBPZB(cgSMEl!-0PiF@?1=QU4U}1 zUlux;yK%+!q_lwR5PA&jMzqovx^wTbmgOUUbr*_%II1n0-=#O{yG(izMd7eYJy~Kj z>oS>6)!lJMWkeTiizc&#LI)DA*dy@8_sOjFU<%!xp&>!&AQd|f7`UBRhI)#JsQ>jnAGH-4{ZW z`n5%Qxw9I10$>P#UrN ze^uX@JhW!&=)I#7kv5lh{xlshZjvaD6?}H+|2q{mvd8=IVr1 z5Z%C7jLuEtEOb}m0o&h37~)sMzJ;rsgH5?RF_rMnz;0C2-OYbrl8*J<0zglqW#c- z1@C82@A|*K`DYH$AoXKwTZNuI>RV+774?4$QYLO<-|(Aues@Kjvts3NL?dO(&BOV( zRzB(UJ#=UOe#?hn9yoc^#i_2iTwd)ZL=9E%Jp-XK&zOI>rAA{GyjqYTe@iy$v;1YA zF*~-etqD!5xG75{`-1?d4~t(%81WS2v$6aR@zsLCS|gldQP=WdGlITevqoxQxios4 z%d7?ZK)2$U5t9U02lRs>P5PDEw7PqGiVdPiT6!(EYqmCFHgs60rvnU5yHU%_02r6YR=0`{ zIcrwr5TM0_wzz2C-1I=5!K7r96z&YOR(DOnV)3K-4ohBisjZ?8Cmzgo6=u(X-3f#d zU@E#*a8+K7%kC$Rkd5qgHR4v`$Rg07A%~Z~#>fw-$pZl**T7bo7CA^Oa8+f)pC4FJa2ivslx^MG# zM&t$vN*d#+GTlr=C0lo=#JgchlvURoOSQG&o@8nyWAyy?PJ*4ZPog6wU2iJ&TAIr4 z(Q{K9CmXSOX!-*Na%W{?e=6Z{AZwYSHHZu0jH^__#_ego-rnm!Zxs`Lo0i*9txb6T zm#HUq2b5&(Kp<}XbD8AUQ0@G60DjU9%Jr0EJbOlUULKAiuWpx~>T{6Cd+#*j3o`iX zFST6NO>QeSw13M7(jd4He8Sa(hSekn8_#C7=IEd1zpE1`tpflMQ&YAex8iNjg9Pix^6yl4PM&Br!JP zqx-EibAc}xI*fwEn5cPV2_q(&|D4EV=#5H{WsX^@^b>dR`gL<9AWSyefgiquaYpTx zPiXy;xPGE=qR_$QIrR#vp* zZM)G@RWvNkAh4b*!}7?)0km~aL`Xpkljh92JN=5mfC87&Cp=KncYn!bc`9RZOPzG$ zu=FwyUtTiMK}^a(duXnW3OeSv*cqygVc+du*G{s9pftK(ttNLi9-+t+W{c1(2)@VS zNW>IwM#nZnDkt^1Hb9#pK1NdJUiC{7^y|A2As_!cPSyOjlq#5#3f_3bJ1P!f01>f) z5boIJo0~H)r}>o#CPuF>LQsoqDiMcLcKG|>Z@L;_%-2)Y>?cFA{h4UyfO)kc_#`E> zKayfjKfZB%7MucVy>Z@c?{zR*aV6D|_g(y@W3EQ<%EyC277)k_BJN3lTAW^fdFtqn z9Uqg~q)ZC?TWtQ-%jq~YQP%#A>1MDOyG;}5KBjFrXE@(}_LJGY+G7Db(?^#F3i1-; zFk>x`x%Y1J-w&AEAK3NPy6aZfo@?XtCv-F!f7;W43`TC$?AeLnT<@XudhK99wl{ld z)4iGKG5N<3H}bdxc8iOsY>Rks*DG;se`V0X)(02Cd1h8w=i!v=$XI#s^;o;!-wsCB z%tmG&)Uo5tBU9BbVod|797Wg*ko!QjT7pgld6M_0h7{;0|FL2anX779$$6$B9OzO{ zHu|W?nrUY1^q1wfhh_3*aQF^4t?sb*Kj>s~s6`!J*Dt($W?mt2QRy@~5c5#MsNn6& z_d`FYS;PZ*@d^UQEet`mDNH8qDLo=QW$nl@&yJ$OEq+dB zr{3Do8-mitDfDv!;cytqD$n(+iHJ$bp0fj*9dUK)sg_gr)5IAje>iU51t5^DT?$;C zj(5ru;7brB5mpG3$^jA&>lC?rz^zi>k|^|Gy9AT$X&<0j+9iz4V>-EQn>axrV|rr6 z1Xm%83GkJ`T_FW5G_H7!O|LhTBwW8a=CM0YyDdhXlxhNd>AOvmkuHf-ad|fjh85!R z)3>1w?~ugh-CJL^{Z{sUMj^~4+=Bi=vGd~h)rjjy_k+0poxYSjZu1&1ryUK&1iViE z;=_~Mrt%c~%}9u&(176$A${>FztFrNm3{=ppi|NHH=+&&Bcf%B=xDyT3W0i(+F4zm z`hH~XKvcJ%sH*7(X2j~#f~{u{?c&4n{NL{uWWlJbjz z{Yp<-Xlx!dz0~n!)XXtcWj%FgEjONZ-G_LNq_G2Ym|I#G z77VWbEvXl+ZlY01enc52TH7CZc<;Gu`8S3~(WowSPPul2r|pK@HgR9~*8=J1yJc>r z#fWBD_ROg3D-P(+ZN!w$_Wv-OhPN;KKe^6ZhD&l&1x9;H5RDaa~$+}tldu_X58rIY{cJ>IkVo0fX}mpsznay&{%V4!}0FfXjZsICWVbg;RR?0;2Yukig->g*A>O@n0K9( zpD|vUX8L{WKEw0`uTvV0Is#90BTtCti9iH!(k-hxKtcbZ*S{Fg#0&7a6^bup1P7h8 z(+9)Q&P@XyrO=sx?$hH$;hD#zgB=krIUb7_^VbRF{n~q&?EZOA^o(@K)jcN>%U9ARZ4_qco@9SQu9Q zB;BX1e`)w4>s8n(Nf(t|pDYPXOoV(ob)@CFf5QbsK+|^PLKCdgd1ymy9YoYk%$yK? zSyiM;XAaIF@o2u&`{jV@>d(;qD2q?v;@v$9lRhPVD*AL&dIBYu<$aYMfGOej-ndtu z4h29Tbgie@`)cT5NV{yDb4Rg_jXyU#-Z%tNCmeM+Ao@}7`qkRj&P?yo6Yta_yC|(a zgBTCXjcqQ;>GK&a^6BL#zMS%H_#`|7C;BAt`%Q_D3eWxGT{G`ByrtyUkU<>=1u?6@ zpoc*q!c1xm?2BIj`23TeY~RiA8|&7_EDe>n-5(lu-^9P+2in{+c*?4gACE77tRU8X zNx7B7ozv?T(Z^)DbJJP3at3tQ6#Amx+?{{7IlSx0iWFYIP1}7tYiDHj{H!Pi3&uGb z2kTtZh2Re3JMpeX4tDP&OK@Qib|{QW`@j}-_9+0H9@gs#GfeF5L7MHHRga)lO)C!` z{bc)1z?p>~$vCBRMe)AlZY+$@017qP7gCX-?cn?lzg&%+5RLYLH)xB{6%Nd>`P@*0 zbZ#2Zxe55Nz9Mv6S%$cezBp@EuoZDS8(E37NBLt}yjhLOqHibiJb_-3*HU5vuc#Q2 z=gt-Kj!84>=DyEh`trNq&qL^HrGd92g5GIzRA|HZ-xhpLUirh_SkXrnVfW}6TmQ4X zS@iv_y1&t~-A(B+2j4?i9}%2CJJngr?t7R}n#af78G6or7)+{q=!`A>(i!Ag^>k?N zSX3NtW>8>W1$v)J?@Q|}rTiHCba_F|ktJqYFuZVzM>ZCXEVQHZA zm@p4j=>n+P=#%mgT4Se&rjid&rF#zCYOMoW%h?yq@X^!QmBGLl{5q~flqK+^2iX~wcEfH zqkOTX4ScuLso3c|W3D1Y_>e`AEN9v?-x-P??-HQk$q;Nx<8}uY^O^QUSMb`MVX@nN zDYd0-QgEd@UD()2cW+=w?@yAR=ybXhTg#|OU!U0RDD;KEMXyoT)9QsucBs48WUcN* zT8YyTSXQwdDGD&A@BURad9Zl(wWL7^UQ6N5*x5hD`2GNCs(x_xg!*Zn%tqr$0jkpaM52V~v0I4XfQ_H|GG5?<%ez|@EE|fb5uj(Nw?tq8o*?j>To@nkC z2u%{6B=*B~MbhGDJKj=_W_pO3xTn^-ZBB{M%9rDc1tQ=LV*r(H1#Fn-i6sE$2mmp% z+cDxXZ`x>AUS9Fq@cCKgo!Qemf?vYHz_-k)>ck$;YVXK#V6~uQ2guI}a9m?@$c0RbHjm8#{qhp+cGw3}oHe(EaNC^55M)nFS$>2@ z0pse+;9CB6x7~1BH#o(!R6Dca zyE(GT46=fOMR$hIzghc*B3Cd{E&&f-GJKw&+wEx_x}M-vnnJVzaTSCD!mur90>%Rg zfMmczBUOT2G2C)a#|Ny6=xM>Q4%qbSJhKOC74v>6JO*9*LSf@QC(h`5P1b8>R30|^ z7#Rd#be^r7TjXZA_k~J5XFqW!g9UsJ-ig$TJ99JoC62qU@yt=c`H~Gg>KOOl$Y;(r zgqkdK%D+Q(^E92#e1%J}pAAspqD5eWhhEBMQ}uVudNrUi6FX}4MdF#o*{Dv?p4aL>H!;0)a2F_6@7O;V)oaj+jo!!7SaHi~$3A;Za;I+E zw+s>~Nh^{4NZwvTVjcY+^NIm?cc^IIP`ZD@E91WVsgl zCF)OyZ3mkX(KX5Gd6!%FOu^h&ojNqT(vS!H__*HXsDy_w$0*Rng>0m#yGlqJ!wJ2v zt^$MG9+|dYsu|jG1<$ZwvdHt>4uUN=S|9_F@MF|qJYpF_b7A1-aNM1aW;bI z!TWz9F_G%exH~=#Ngx9A(bE>wxUjV`E}~r^09S8qk5E=7OtnM0+!b+~_v(8O}MCcjcLF>K8CtBEgS7Can zYquR`>7~OJ1QN$B_t-r%ku}TYqg~UH%64L1?h9=OAIpb=J2YUbB^(Vr69w4w7>2(P z`5fQFfeu$9WfyA1yAR!($V77BR1Bw5cxnNWxUKBQXfwZN(b*$gb30X@J=j4Q7p9@p&)?J_2EfZ!kr+%~pd%LG%`_b|n(KeN+|eo=Hq< z@G;gt#rL031lM2AD0y79rvY|h_1$nBhr-Y68tffS7hvpx!m^j7$@5we&2Pefe==&B zDTs8?o{b-K{lfCiT`WZaq50U<$Rb(tBBlgF?RR*P+7sm7%ae{>IG_p$fIy}mIBJJa z%+{dUfx+V)fqRdvNSpX!57Q6Tkh$+CXWHBI0aSG+%RU9AR~uA5xTSxu8q0n9{$^Zs zvu;l&ZBE*2_X)usgW5xfcHxK|2on5OwD9mBqW$dVJ3HszqSTklJ>s#I^Xx)fRmip- zlc^CQ4L<)V7^Mk0sR?MI6T=`n%hE6c4q(dQh)Nc3&_fs01fIuhf*b1T$gD%E%M#n`=KE{#1c_!0s z_zpq}%KH7|!f(0X?)|%TaREQGxWg7|l*LHzB?#U6Jo}`_=1*z=vbHN(K(HrQz+qU8 zdNpF>?Cu1@%;;ksg|3`$htQ0^PyrO&rvXeY*bdK;Di__-Aiu-!AfQublxue-=U_af zE?e%c-8#>yw~jSX5})PkH+NQ%vG*-Xee|Ak?F%#DLKM37{BW|zBNhyKH@xw4Mj=Iq z?ks$Dg3QIlHgw^l=#O*&b5%7}HR#O|L z<~Sd-4>0rxp|bHBOuV+nXZbR>Gg2=i$Qxb~zkRt@M4F~0aG;gclaUx%a|l91mB)B+ zvMARfsAKsz=a!0_ZOjSrCtZ%6M8H{Ff*Enbt`+OX+B^ZI$V>AS8dpEGl5 z9Ny0xmb}*dzWDm40?XxxvD@}4%qYbdHkoYxsxIPW^wA*!XO!eVK(~6D5G`wkm#eH* zu%G06rY5~!p0 z9@RRBNlKX=-EAMp$si<&85Kgu0QH%SyvQadxq4j+T^w0+Z};*UOkEsJGPuqZlkWxs zm|#BmvI~#?M|$n1k+{)k`{K} zlsa@C^`8G#&xB9wu{Br>D_)H^c zBNmJvi?!=iVhcJ}L*>?cVfLcXGCvM$J&Z$)Ty#V87BCH*5)-dQRBWK;sPBARf|l@XzkpH zN%YFRo+b`SLmA#JvUlH%zlNcvBBy?g1Af+OJ3d zpKGBvt?+8Z@9*VUdYC7T-@Zh0@nSdUrVJh)Q-?Btc|tNO8XX8lX^H@uzGyb0T%7dW z%x1wH&K=iuj>ju>^Hz;XsX)wAl(`t5sO?%WU2oF5DQPANm<3~uxoDz%ojEA+vctE` zw~Yjh51d)SV7rx(fA2=1uGb3E ziUsb%!8jII$e;vjWqP@*FgK$kl&Wl34tJ5X))xRiBN1_70NWQc;-Xe0xfY%HR2fjW z8?-(Jpvh+Si?`hSx$q0y99^F+o>6}Jkh{FYfqkoC0=*`A+})M;s(d)V=m`GqoBSrq zkF-Z`-uqL#%S`Jp^=Xe7I&GNP7*c+8$p7G@Gv^virNh6gSqu@#m{~Ydg<18(%L7nX z?<8yXh%-ogd=J8c4m~CcndcMtGmk>0(t7JFP_rDM0X3LkY0FkTQVvfWQFTpwslrrQ zzRnphf>3UvGDlY_0=$+flA|WrCF{Dzpr|xn4Z(eAbPf(?m~JvX(>evAtnFY^OYYWy zaUq5Yt;%AL9?ZelJt)=rHj6?-bJK3Lh-^L180b&Ls9Mzvoj7Iy)<;mY zNjBbu48b95nWgk`w!xMi*{%ieOkM+83@VS69 zH%rc;P@5so|CuiquDus5KGhh4J;!nV{z1T>Ud|V3z_Z2uhXZj(@>dt>ysYAN5!ke+ z0?Q6aim=~eLP0cL7Pf*wVAyV@B=A5UvO$Ml2T__8GE0=RfkL-fDajmUFntfER1rOE z-wmNDaF`iRIN+|^=jP1B;%6}{u(O#$V9uretPp}QEHIeQ<%UybtOort34jxhGKCB; z32X*4Q(I({GoT|d0igFIME9d49D?AZud(}Xc+fPx7V{@kY1>VcC6}M>LsFWR(J<`4 zQOeK%Wwd~;0oKp-wTH~-F9C?zjc(m)F^Dx=F24E;lFsKaf%I5C+1;IeOU>HFZyw!3&xcvqqd)l|LO zznKlF5ZP1-)#h7UnobwVROyKb5Wzp;S1Au6XCeCyt>sFz{~?E28UTk3pzPQ=C22H~ z#G%qRa$EIoSR|d1Ngz1O=3w zN7usAPlx~+36V)-n5J9%Y3M(hNvUBc%U+$(uV*fcES|?7cbf>}KlU%=S3mhPhcvnV zgU)ilhw@9K#~)P|d41=)>JzZyP1D`oD}Fy;c|)}<>+HS_?poEts}>5Zh;z; zVi5~b-^tH!{W-K=J?N!9h>4H78cdOnE(+uSC*uNY*jgQbSp0rJW&h$e^-PhzgR&tOD_j zX0y`aC^!m;g9i^MB*0isR7?d;u@gK9xw4xDwToye382?p-mIQpVLTF`uTIZ`q(o5TS$Eou9sZLj7K z*#^kDekB#OWKk6^r-HPNL4=N6!{9uY*wX)dE+5Trs4Dw)D~a052|AqIg=~%?-10q7LPHB#L3Jqdn=wq82Wz_b{)k4F`V%;~lP|Ad0t~ zkn0oJLzcQ}*b^RD9ZgZnRxR&A5UUWnVPYH12P~t+CumAJc!D23Lpk{Uv%1eaYYsWa z-ZRLUcWS#@PS-yr9FxP|<7EjhymqE}nooh0dxPQN|B{i(1*ax4EMKZuOz3gdCQ3#? z6}q|k5t4Yy>_~an$Z&SZz*q8Kp{!#;n?+tjVaqRTbO|s?s4laVq{r=eX6&l(W~uMo zwQz${VTP$#uOs#4;LCR@m)~_q%RM!r)#i#N0#O*<$YO+aUh>>5Q} zE2@fKW~*fLU0FKJ?Du zqIsGhQSb0A)1hH*vV*b34SVcQ_9Prl2?~rwVoTJjr1A5WC_@?eVCfq+ zM0t6lL=W4boVkZ-;0s!>#ZCuxWRcyGNv*e9*^|j)g#^c zR)_e1`yY6I7BzL=`+W9qZ*tb=yqsEc4qYDmC5KlCKeD_k9U=xHh7^nFP-a)nS z`eW=&fS9hLor9Prhhixj5<5-|Wbufc9N~(-&?^}9?2nZBfh|~&J!$}p$$nozfWd~N znFBJTf*|sYW{%sG1cn}H#${w#TQoF5wON{?viTaDCcGC1e&pzCWy7$^==SMBmepe5C_vyBz`W>flxN(2yPN9AZ z^Pl}8A$jiWiS>KXIfrup3}6nfDQUtG54#(FriQvtgOA0QC6*cLvw+V?)te;Twj;stZ!OT=BG%InTIY8|;?vvf%TaQ&AN^#^Ta~_W|9Vd-c2#A7M81(@i zFed%NhC3T46K=mkx;T9P053UNp4;2*6TCeVeTh3uKTXh?mr6utC=6T1cNM!ot4>o(V1D)D{>xP1HjkMJ>SEF z0PHybl$&8DI;W=tcn6seAKbx zf2tbEw$HQwj(>T)(KZ%7aymBn^?r{H*FX5+r=J!ceP`S_{u$_SFS4y_+mCP3yUD76 zcFXG`OyV5zUowWjXs5hJhZ+5)JbwM5pMnz>SoPnm^1jUUKmMl_d?ZWX{rMHyKzQEQ$2-0+wWTyGJk4LQK!4E{% z-fyhLc#Y#?y&AgncRcKj{jp_KwG4lqjqLITgY{;negZYXt)6%?6n{}AcJpv$sUFK- zu^|S#kjtn}#AqD95DF=X$-p720P_un84ku;_eCZONuinp6hh%+Olk-~v_SrU7bv}n zd*JP3O3bhC^4NHP$EQPa%AjY77mttITE0xDpE%JcYXp>0QmlL$d40dtyA(+lPyU@> z_)YGBsSp9C?A`F4&;JE@#@{XO|HIR}$0d3G|Km3&MMMJyLL);wA*lmX)3OEv9??L- z&<;a1Q#(veowe2wm2UBnr;N-BF_lmYO*?OIP(0RLr8YZk^Vqqq!`f``y|>?8`+R@5 zk4Fy;AN}#_y07bcJzvkmNBPu;g9(|;Uk?F1Ae4FZ&p!t~DySeAoew|$-8;{?mwwNp z-Q6^0Sh;+3C@q1N(Q-3s167kKj%AlRaIw`#k0z&7UO8~wp^PdHc7~JXqVA+gns-dc zU{l-v%ngI$W{eZiu{ zU8#Vpsc-{kk_>NvAhVm83dsxx8&UF(X39!6x||;vKnjcsjHW1(t)WJh=g2A;&W}Nl zI@{(@tSJXY)&NFawBX9jcvFk#N$05X<-x=DMSY%0^`%IMKOW6qD70Q}ir?DkNkyTp zF;bEeg>@R(SGNJ_GVjXz%e%r@;zTX-J3Z*S1q6m~=WOX`x!N`P``NTRhQlQ%bN}wg zW-GDH>+QLzGi_0@wrPiP_XJgKNWH^{icz(v;qLX~e(vCJT7PMOV(aKw><+s58?04_ z(jii{;_RBI{#4IR9^oGu?b@**K@uZpVi{#uk4QM!9vdfX6pe zOvrrPL~pQOiX{f}gixAPk+ex&_GKlH9Y*BB#DW!UyKVAhA_p@1uFkc?$vc%Mfi zF>(+CFvu!UiD*Mj6eh5Di*RCrBewjc-e9Nq_UX(L!Nf1=bme_#HJK)te!+d^NEA%q z1~K-@>Au(aqV;M+Sqe%pAhbZV>B)^DHC<6697imAm9Q^bDD;+`QzwsU^iV2$r%Gg1 z9sdbjr3JG7BqdC`3|{hH0=+95!l!)7>$S>;aJmRFrY2{Uy@r(cdWl)7|0YFapi`BM z6q^9*0SUk~HU!z#?fn9OV%rpxJ!L9kDnC*Z=f5rd-A=#^H?cxEErSDTf_1$c>B6fG z>@y_J#+Mhy{5Bo?2E8n@;?%nCVD(6M$UUK3tuFePUuij1!l!+%K2Ew<&X zLnfjRMr48;PtbCD{M0`=Ai-1aH;jS+ebOy5YHJDdo5GlJ}3G ztUiMsk4R!1iywrSd3skn6dr4AJO>Q>w*~!C z#Cq%Q%x!X(VJ{P&=h&S%o3MR9Y<%B|2vq;WJX3L(u8efXTD+|zt*3FG99Llc1~{C* zLiT21?}?hd+2#Yz+5QKybBq0^H)i*L;c>r|prb@1^4Af=+_53dhFAp}KpZ_)C%B~a z>y7@!pPiF+Yt`U~c1O#Le%sX+6&-V5fn`;Swrv`hd6Jh0pN4(gJHKJo347<%`Ocsp z#peUO*Jo6y_GPW3%6DNf1{&Hbap%N6r@-iY7U|V<6;s4(>UHSgd?ObC93`dos>};c zDl)xIndaa@a3ET9fZaR}VYiN|mJ<^ym$N(D;EF+Lo)gF0-Ko^(T6(D%1w$s2vAT3Y zTvk^DBI|IoejAP>>}%A?ipz}+jA{e*`z5{JUG zYhK*D(enJqDX_Tb49+$H1Go(JXO&SqvV-dvY)1E4#+;fXSvDb89F)~~(VRth8I=0y z+~)cY^r?Y)kX*l+HV)}HXaf9i_`pRk&`Vbkdwdf+-FnM;7JC+PZ@b$LJ==$+{mXO4`VSZzTX58;}Fo!zc>e z-h(sF1J0B%OY!lC`^5e)i(_h)ZpTGYN>9f;q!PoB!TNPR_N^wjW#+obaMF2GtK$&c z!#WDi96{!;@iicd(jkX$AI`E#x;^3*o4X5g-v7VHv+EFCIhCHL783%$?2RY4{d!Xr z`!>2p7wkyq!w0Wa#D_k&`nER#bNnV{_wDe`jW5L!77h0j-?95TVkwYlBec01di7^8 z=(NgHU(|?c>$0OOQ0$cBDUIZ3mUOeX6+v#F z!UQC7%A4h@Y6Pd~#SlgfCg0FN0Z!QXy-xFZEb=pqMoERwt(bHn`~)0iv+N*}V(bL) z+7W>l-1Ocyg!A2UR|peFp9SmT16d#yb%Y8(L}w(0d~`cJ*t?)??}w|82^TV5FZsn7-rKo5F*?FV{c+ z?)~}b3pD8Bd1`Oh3hS2O8P|P6q_ya8eE3vgk?oAYMhcq9DT;{RET8cHrzvn;3EP=xh4EcBCBaUmR6a^Z38T(jQPgT~-U`@GANR6xd8MKpxO;Cn9(T&YsY+Y2 zQ>Fr4-4G?N3;W^zmkvjyQtsFeU-Am^`+4LJ;ghyIpjEc$A=5Lqb5HGhPSY1wW_o;mtVPaxsyLaW1j3sonNt%&r_q((~p)H0spJ(CI<{4DC~W~(k~p%wX0CZ z6|0|^;YN^Z|4E;~^#Y-#z24g`BRre4fg)6@4zIJZ_<0~a7mse0Qm@>*!h2noyL7#F z*}30ey*#w8KlgpeuOr8<4i7vU3B`I~s;!nsQel^n9_A|rFnS2{QAvGdEeb5FagIV^ zzPi7L$A^79ixqvHPY_DCf}S7v#Y=oLXPoq!$c4+!>}!H;>~jm(-3-21(t-|&Zg;0e z#l`k_5?oK~w%zQGH83)^h0Hz)_595oklOuOI%zExE)fO3XggcL?bOJlGKtq@fj$st z0raf5DH=;P$Wd4bWRBf!fRj4y~4gbA(CDC~Je2n(UrS-e zTA0EjSb*_MAv-po$rmNui-mP7wF=#)le5s=1B$hFZdsFS`{2OPRLZ)z7q3HfjIsMJ zeWYs#Pp&C#O_(7pj0K0{PX)xMNSzctGgxwVTC+&U90F{uD=FLM@b&QP$#RAW<5TKL zftk^Pz_Qik4M^BQn7~R=|6~JgVurPDdQ)YwFw)jG-`UPZ^p}xGzx9L{XjKZs(=tG& zqA2bYJQE^g3Co<(hlih0M}*A{+4cc*-leXJ_*>v>dG$%i?7q;uH0S$jmb?i{WnAO= z+WmS9&eb0~%R*AN4{E3?EE&P{#BNfsa1~~U6iqoNDxhZ53@)XA- zG94DtuZ8=Z#u_OK58DwO=GBiBm)KsXRjXR1B}e)Rn3$$By839l$g3pf;CNDm`3tJGyb61=SDCP#DSjfo;IWl)*y zqr|A2FflSp$bF$q(d?s96P`;fhz3^-lh2^!3MIW~I zXw9o}IKnhHzMs$qyZ-jmcXd=+;`6P{amk-M8uo3z5tZYnu8V5zR-9SGw7uNysMD|x zNxnOd#(V0iT6NzPMi@3{bM(Svm=jF7$s}j4nskt%f{uTGsIPR(ng7C;UZdz?G&GR` z9QMjh!N8y^)W!%cGwrVoqs77FO86L&ULXn+o8sd0}#noY+&Le^P^SAilY|SslOEX8ak4 z=ia|g3d&{m+IUxEobuTLr|->lJrWcWW|+qC^E16G>~zC(GJZ_;l#!mrRIp8sDe#&4 zilskF@g#*CE+-fba{+`!F0-a}z!ztD2=dx8EMS7ZK0fT&vg07C0;m@hc>p^dq=EJ$ zcqe}=EF!+0R{HZvAyELYV-%mMvSRPm3aAb7QA9^Y5Z4NTx@Cvx9>*i}wtCaU) zkeMcBJ#jaC3IoXUAwO}+f`69~~vP3Lyrm2X7I^}mli21FlI?`;w z$lDn-eKJ!lAxcmy?jRIao@Jn`%GEQ`wzD>IVB7b8G@4#&`Zz?O`t!qoORH?udUE%M z9s_K)*I2$KRhLZllZi>-t0gJQEi=F*th7eU-bB}(3jX3cZKunvnhJg<=z}u_R6Y}i z3iJPRkE*@w>>YQDOGXQ+!-m$jw5O4PNzMg$?o|C4pAE@Q7AB+D^8`4#cn)m?F6Pb?vQ)$~$UJ*J9Xg9=M4 z+3}u?euUc(a2?5O9T@1yY{0DsIen%6NxkhyHp(>uEC-4 zCM2awKip5Qa5-FzhulChi>JE#acD9!hdmBB7!!ZhCJv1_zQ$^Y=K>hXiGSfJR;74| zN)d((cSUy$%u0Qp*8j_^{kR4d#hG{lJor=VCbwUlCP&HdC3{}Q>sTIin=kmCy04FV zpY162=_R(l_6gQ*ypZR2uhG?Ehw1_T|EaC!{$0vb(E#w_!nxend-=Z(IS_ki|3{#w z@#CKgXwf>-E1T4ndn$XghP}kmRdU(7%t;RM+LW-*HW6w-tjLf(%}eh#4x}sejKl<7x#GTBo($tGSAEx}){vlBLpcWr z;PJ!s8Vek^9K8 z8YbDkp-qxz(SXV1xBc%Smvv{iw@Kz|%+o`UnnT65?gO|ZJd+l3zMa3}rl z7r(tB>by~IP8p#4u4Z6eKJmtt#)k#AWanq0tzQNERMZ&B+J0_fALfxBq+?V6DwPuG z)1A!F@(VomV9))7X{JR;Z}+$v4UGU$g)l3RFB6dTbT_u|w?&^E;DinBvK=IEnku5c zRTf?jsYdg5SDstA1p<(4!u8FN$!9&yk$oR+eH&S?*xKrp?UrW>e(cJ$;>+r9R*!_L zcjeO9swVGw3kpb;+SpZZK7y9|R#5$w);w&5YftE~Q{9OEPfP`CVam%ZoCj81aEQ82 z^W4eLox|F?G1w}R#=`)7HxD?R7~Qil58}S01G!;j+vIxH}g%gy!+wm)9q!I%ErXb~T8$0x0W^y%(@fyX>uk zGNRVssP29vlPL<=MlKPHgW^Z5dEz~)L0zZ;V1Q+1Q;7f$nv=vgLTF-wouuPzW0?Xi zhBnJVwo$KB8)m5rBHlXTo`EmyOCa$0tqQq!3$WcNLJ^D-j(~6Eq7cN2R9)Lr8JNPt zCm^|EVS?CL><5K5M0e;1X&_o(=?Z4*=x(G4V&7{0AiX2e5z(u5gzZCVUPLuEm(%Mv`<3?+9Z+pAJ&St5x=-k24vxYGqbRe-5UUaAI` zz%li|Mps)P^ttTMfM;Sm97Lo*e{85__Lc6bxD`Ke$=LGji`UJX9M>+DjY<#DqIg*R z;IsYC-_qU~>7^o=uCqN4$Dl_FEyup87ku2v3Y2%Q|l-0Kyk zy*&8)_~ZV=+ZH(oS3y?zKF~y!eyjrDop)BWI$e*hC>eC?w_Thl8GbuTuCJ(usn^<2 zLfaLtJsLN(Y7bx|Y^n5Uw>bq0x`pAd?O%HSBFyy^k8Ks6+&AOCb%;Zb@LJkR3Hkg> z-1!HOuE7T9J!=-KEqmTP7JHwZ57Vtltw_SBqp-_|zevr5g|$T;Jm;RvqHk4E(=rrh zQ%(SXRjxT~)F)zY!pUd(jW&XGqq?~0Z2hwt_-2l&)s0^rf7@=f-uGNkk^Y~MMaQb< zv}n%wOrA2_Efc;UY6Zz3*WHtV7WocTVj@ZA6_tPL>d~=aZ;l;eFT_e&xZaUL7sdA6 z`}2lo|FPY5tk^lXiuY|ihaR@Vr^y^j&!L{_tGJ1MQr-Qbqj9XLcSJZYbgVqacK`4V z>Zm0S1Yi2jkYmfKH`;EWX=K52f)=FwIDdK??*8$4M+mEP^fW zOhkx96x6mvA5EgQHNP`U?>NBQN@C0BA9yR!Qk0RVhm+AH z*(^_3o(x5DXuv`HKF}9bcS%`!MvYu#G0W9@Wh~zg5?BY=-D;t$8>hW#@<2OoXOIZ; zGJ#AcsyD(QMtPgTSqG-9U2BF@p|sBrIJd$rPlaUQDiL>ZZ4FZz6I)#V%=L->6i|Mk z7O+ZQSu%qyMY~v`@iF4rlnqGlCJgG6(Xvp-5gR&N$g|K3Be}57pO(p(bSv9=Ss$kK zmA@^9ifdwd7U7E4EIcBomLRLXUo^XHBzcm73INiVR?Fsyz($w;S9?NvkM83Re_3I1 z4oi-2X0OU{?q8iJ@5DL4|0A`r*uZR7p0<;otXdO~@Q>m(p>Ks0*H<|;=cHG8!~Ffj zNUGXmOtt`B6@S^a2;EW$j(9l~2K!qb@yN!bW84uW9a4&22WM(unKxv+)OjfFizj4x zjFXr|M+G8XY$%CTR45TL;cOGC#UjtHCKcay-AJiqWcmF;-@tTHH+e^pgc$+|sso%Vyz+HY@C*7J@x$BcLy&)Gx+I@%~Xx$d&%f?P^hIX7u0&#s8 z98lRPM;!VfUiMj)vs@%WpaSj02MHB7uQ8Ay%FO1d$c~STvPGV zej7j<3ls5Q_Cl#q^sOYf4j!F>i;tZ!1x%Kylc!`U))p1Lfa9x^rLxR&l4h>1kWet56Sl8h9oq>iWz)oNGP+8y zv4(LZyZ2y`D_(y4L?)_+)-woBHh*Q>yW1eF=#pSugIw zJ4KnlFRNX%T<1CY;~a2{YR}jehVkMe72Q&oyU$z?c*v9ET_5?L963Ua*O7}c1DDUr zH32>55u?LSMiGAg3^TYV{B1Yy#tu9^n)(*U^H}38zM02zFODR3#4B+XKF!P{Ba6`v^s0nnt=rETks! z6g3x+u$V4;<*%7rU03_A*$PbDQ=;^eLF1zJ& z|2x{xZu35zxEtm0oV2ebd9?hibrs))9rr8yFg%dDC!)J#)^0flljM%=!?efy^1U** zc9H>T?^~^&EU#=qzsrj7#5G$xCg9&xQKe#n&hL7mBEvLM?n{$~(MfAkub+qBVs}f$pCij{G_{dg^&zCN@a$}y_8ZaBx48@Tj^-KQvRjWQ@$g4D2S6c=2 zVnai2bMG2maCtqbwU!VMB47M&7KR*I)0&eQeOymFXIBO&;KzA;cU}9@tfr{}HW|+S zu=xR}z@CGc9-?A%0(`fSri~7=J=qEFd62gyxB5h4=_|Q%RMezKo70V68Y_{ zptXx1?_TiV&8-9Hy$<>xv``gXW<24KU(#g&m3Olym~MH@0rsDfg-#E*(2vomaol^U zrRd?KzvVeTLFMIFq#;!FuCDXI_oOEaV<~ov>y#nX#RsuLn9JL1%3E1*%HV7Yi*WB) zZP_cb)|0)5=vAf6i2j@dd{uaG@0RmY3_3rR z8md;6EC}Rdx!4IEMS@47u&`^%J_-ZG_)oU$@DpMuOgQ|&UbtGFi3&t^rmjP`IdWdw zTgm8cAFhh}l+D{9O1JN@P6IZ!Wh$oR3JF#?4@hC`NjL*DH_2o+ty4P>%lUg=^ePAA z63mRYB3A$!?m10zkmUwLCea8Qo@O|9CZ2$&qU8p?jnr4AZlvm^T|tfud-ecgm?Kt# zf?O62OJpC&fId^03{6=6Y=%g{@=F*R;_{+~R=--EgfZXadH>+lT<`sc1_9^Of5KT` zoz-j5be+=f9#UatpD4sZ;k(Z)Snse;#~wj!eIbnjk~k;KtM$+tI(x} z;Mof-_aXD(sd^NeU3T@1XVffrNC9}HwibS0lmlsx*%T8$(yv9hPAif*yJhXqh!ojH zDUe6}SMRR}%iPV^HF0CJ?4BQu(dli{G|{)$+}T?3%*=at@bFAwxT5w-Fc_&dmN4Ux z<4%9DaRNe7^eVjWy1Nyc6-?Vd*W{MXgOA#2W|}IBmEP1ZDxA=3wtgpthuDWj4k0%k zO$ZjlA}wstv$~wKYKRVpufn~u=jGW%2BXtc8c!cEJ(mB?kE92B+O0Z2Ju*VgT+?*! z#iUAfPO&qj?Nv$cnpvxxK!4BWnOB#!w>+^}fnUiu82bC2^z5OBKRZ;%SLk6k-lT-` zEzG14)c?O0sdl7F-m`|>h0!z{kDWNPpy6t4ysr-`Apuv@WR;{BH_eRqJD5Ll-`KGi zhK^Z2o^vySq}BP3P(KHtu^%lm-P7Ka+2`g^^H4y+3fJqWA+et`B$0oR*!ghUS?O(1 z&=_~s03FfIUJ22li(o1xU6WM|@w2uk+SGHbgyKEgEM>juq6}}o%K+H;9{&+F`&)y| z3xn|_2@_042{TqyMZ}eF<4?sQuq-<)7s(QJo5KVNC|gTZbXT3ph zuo#`_Wd(VBR}2diCUL?~19`7Jw7=_~!QmwyGE}!gn2hi4$b1>+Yo+vNkWhh9<cYo*MemG@V{3`2nXW0CxV)}6z|MT9)I;U#Ug8>2?mXB#QYr=%Y6vqt*P z64=bda($_5PMi+s*mOB9OR5@PUhU&|m>ssE^TdO6;MhOkk*{ppE1oH;1kXkNig~VL zh~rXh_U<7aC9`DLLPBhtkXA>_{UbKJr+nBZKRlLOMU^|x@1j-KBhwYS`fPxU+e$|% zR;B$vFz4@ofA0gBV+(zoLZCl~z#PcvxbmNW^8fi~&qqiHa?knPCGSS!H1^L|VnIY( zvgZC-JTKRHv}dJF{`t7w%Tf`sxSM<5I=pY#xO3OVWqPWbNK7T*YO43p-d0=7)(-Xt zJ8KGTrS^$93C>ob(2%&;KwLg^fkWsP;qa1fs0EHgnG?keKpTV*PAX-hlD_BI9WT{S zcGP>%8wva!4h4cqf&hUn|8XmwWa5aslO!zBD@T6lHM?7|UdqlK4m#~d@a$x zHBm3kxAhdQ`Q7iU_8;F?jDI!0V%Iwpjs5t1LF}i6+B% zRb5J%{NJ6OO*yl@@v0b-Y}I?*dxK5ZLi!W00(HOxM~_j`7`Xn%(?_^j*p0xMW1lne z)+G)rW2&%8DHMK^(UVRn~Iw&Z0^TNrdX?|*Un_P*!y;A)?&-Ga8Un*JhuXv z{3!w!jvVNPq6G?26VGVz_T(KWIX`C=Q!#R#Lc8RqW`L#Ej;K#rC@!o#lXj7z&a{?Y zhX=s{uvtqbw<)Ew{`F}|)bf(-ED4W?WdRdXaEb|BQ_jj1W%@t8by?Fe3VRY@qPk_y zR&r`0sypP3?vR|?29sIqRA=c7eI}mwvsl0r?}ia3X^gB?=x-SB~x#x*Fi`D_l86T9mYod!8}(vm8%~~(*KuWFD)G~hjkvxWBq9p?5s{t8k0$45LI^ z!YOxLaRDa|FV(Aqs55B7@=a{iI=DNW-N9mDg(*x$WW8(CDaDZ%Hc+Y|yRo+n#fz>` zbwh9Ri#q+I&EURsQi^t2{S=Js#O3+Ky!{6la#eDPM*u42yLZ%D_TXB~t)>Tfri4(5 z*!PX&@m>K(wx$x#(yYNT;m4Lm%;D=2GVW}TaDrou5=vJH{bVn=)&O+SDU4a!; zq%aDSUb`b8BH0S;#vFpnCxqqxoo9nq9x#MN-dZjlxE}t<_ zTrGmdy{mos!>{hS1^ij3?Hf+DBeXb+3fpC1tU zAgSaIM-Nn-XMgt6>>k#ch2&0>V;SadB-gE~Ra8pm=%|Is<2Z-tsO@Ab!QDOFgb(4w z#+lyY09;SW3^R?Q^pH30D^pQ|qf;NED-hA1Xe7i5ALh`_fX4 zRvF6+itgGdGn|0IZX)g4Xm+@my$)SZH$PfcupVlzxs{QgUY@D+=It-RX!qk~qZwl( zD=q2Hq&_FTuApXLaOV!uHP)megP0oJi<{A9jP56D$3{}opG@ZL#mG9gFIIb z=Owz$Ro4Bi7^AGDQ!yk2bGO86A57W`+!dVN2m*5RIao zKb0+)a%(@-uDS_{hRxam6om81A;_)xhB35W0C#(PvxMd!?{GE48ot%ay2dHg!d^#t ze3UhtmH5Nr9444y?=*{1sEa%_3WsYt?TllB3_n?=!Ihh>@teX0VJW82!>+U%v+SJ| zbw_RtYuet`4_9tqy-P$6LzgHm@aUs}C6r*LQ9L|0j08lLBz%JRr zg#$znLDmWY?x)vjV?}FFRhNtSWm_qyA`Zc~PPQ!t97AnfUbF-6BNJXc;qTq*{&f0( z3zL)@>DBLWro{yGVeAM}xBsxr-u7+Msi(8IGKv=W?SE4J2@rgE(KQq;P4AYO3hDl* zSN`cvMY4s~6|ck5Vvu3Rq&WPEE1JdRQXiE0qwG}X@XLu> zJ~gsBxiWyyDEm3%ude%B98cY|-B`T_J_~Z_j2dNLA+o|GF?} zgYoy;dXMOR$UETI|4hQ}eKypR5nCfN6@i6|0G80IsPZoiwvVWA+Reua($F6O z_awLDF(rZ67%D~x1RsQx5a@M%jRUyX(#q|83xp;(?Pp>Pkv4MS96H}VGb%qhGz`hp z4u=&YkKjTf%^wvpewh(9zWQ+mn;PyqM7Eh(sKoo*3uw9NwYEpGP?UDz6_qLW};1ox-QIeRbC(WI(}Ti?mx^Yn!v5N(H7As}yV>rmy%ky` zyWwmk21h@^{_l;~Ue<*!!+S1lEQ(Of;d~fo$+<8H2Ab7i8Nw*c5O@aRsF?KnfMWmq zM1A9~MX;->q0iNq>Ye{Wxc8>z_8sBE(V&;&!?c%{ zyYZrhx@GyVe(2WQ0_Zm9poHhGoBzJnFYs>tEpJE2XZXM-eWth)fG=pJUCI1D&kk%Xo*J6OHMsQ}*Y8uPop#o9ZEqvdL>!>;_DN~S>#TqC_$>Dny<6iXu9 ztx)sa9dHe7#2F~pH)hl+loj0vTI24_OnOJQw+4z(z<3&{#?mm;e#uf2kq>xq($ zg`}!+DUlH+qF4ngxX=DGayHFEr4~9pL?n{70(iF>x&o9dK?yV1UZr^K&(Gdk9q(YM zrX1%o;nX5HN@3$Uym1~^LQ9cZ1BEu%#N*e0!+7RN}B;09YD~Lr`9DppkIb zUZMyb-$V%@-h&*7+rsR|$2+U_gSW*z*q4Bw*Bz5qq#KL&SA(rv+ciqG-muXVl1wMV zU`(V%ZjiTEWHKQ0Su9J!?@lI)V<7_MZ(y0evJ4I7`F2l>V>@-^xC(sEGnuG+S|T_B znE*7ZQr1E)o6o>|dxG#p?i7;Qm0nurkrfQ;)ZS2TX=hLnO~q&f7(wnZ1(C})lEJ~V z%9<}DT|d_F%8jq7zwO0rN{tydv!`!9wdV}oa_9&>8R@mg>$9&o4mhFD=w+p6KE^b$ zIIx8FE*l=nBs6_fYuaGlC4TDOYF5P1mzH~g&RodIL z_7dpyk7wg!&9#%D8)62n*=*`guk zF87K&44>RasP+x?f&P9WSC26BVl4lspmP3L^N$Lu z50}K^C)>CXBBTBoIbQP-l=;`#So2eF@lk9h+)CJ2T#C*VLHY4pQX2dU?W0$C&pq^r z!Fz`vTQ`0!-QpJER4ukWSOv*J@hBoJdglaIFo}I4`rX!*?1_jX~HvNv8WLxCR zVSv%mc;6eGef*@~Sbi3AzSb+iW;jNlsa3u6FNI@>JW{D^Fh?*zFf(OkDH5YMZ*cFmm8I%eQ6!Eflw_M5>3)*chXN&ohdqu^$ zLJPz)I}K1Z5ibLH0FFP{+oDH_tPz&Io65WsPZ%15%svs#G@+uzE()Mx6^+`g)tE-E z<>tSX#J__6vvGgJZu#9$$d|?@t1tcfRnog(Cq7O6TC!#p{A>PW^65`0gLg>YVWWO( z&nl06K5vlR{X?z1G6Q|f*~ z34+P#_(3LNxZ*v0=@~%8o?>~g{tKm-GOv@67~)T@x=xzYmsG*rhKC3It>-ww71l>G zd=w>BIgVjyzZH)`S&0StnC|4NDju$*+tP6Rw<5Xjjz!XkHc!Dd3-;bCt;=%#qmJct zYEL)Q@06QyApQ7E+cFBwIt&$RKQLzpW+IS{z}{lS%nO;|7_*w2-R*=KjO(Kf*>t*> zYz4})dAOqg)2{%p`VLl{jK}~V@5rFkbPgRCub7PVJo+@{^2fKI9=1A^{n<8Aj#%;H zx=%^=QS8ikB+@$=@RQ70^}*s;u)iT0L8PJh(n2s#FIpcsCp}$=QQ16&y|b)UyF$la zQGGl#`lb0K(D%sT^|g0uzwPv-%kDAhGsB!p|DAA@<3lOiAL#E6{*YQjdVF3 zTq!gYhJ6(p^^{RhjUK7T^H5uiI$1jds4pr}yU+Ew*Z25{p(P{F4;X~vsr2Bs3Tucf zhQvxBB`}`3hyA}aK?0H6eXpj+11|5Y@26?9oaMPpHuD7udhJ6RG~riD>-~`y-LKwD zVT4t9;soLy>|Lu1?T`t-DghwialVU6Iw6YzUW@LyJYJ6>;Qb4(VwjOe>E;^U0ZfJtl#j5T3=Zl@~V!rT(8-tu+7cd`dI*pCUy>K8rF-1p(J zB^$Q~#O$X;N7s!9&Lyp}T&n#~-1bl2Ry;Vy-gFSI`uysC^7Yi(%FrlJGht;!RXsM6 z3AsEtujG`PoC(ERXOGTs=R>{dZP-&{haL2lhC2MGRaU0z3V63aPM6gu1Hso!a=Dpf=$QmPJI ziwX7WTQR^D+7HcZ@^1L;JL*X~J@QpNdb#bDiDH^`&Q%aL3#bwHANExC(74OJn;Szn zoSblqWAaA?MkY+){%i{SB%V_$lLecw#YpJ1cH4l-mCq>t>~*sP17cQWXzkU>vF-94 zBy{NA%4Y--S+L^z@yN6N0d~mpgoO3WtVgP)q(I1A1jb0bM#KTvVnv-}JIJd=k^XQz z?7~*ynr`u1v@S?1chf3msU5UK@(xWgFK(b0mIdayol%HpTSLYByarw-9A!7Z(W@j6WS(|CG%QA$JnSHxB9moKfvuxldo zayt6Se_ai2kck8+*UFa^fBs(j{OY0X5>_Kat8msgC15PVt((U%XF@-T%zXS7Y{)o! z=dt&m5_$vzugGSTg?#)LnB?}e3D+QGr`<RZW^Z?QHmqh zKFVSr=;On=m&BwT zSmxeSwu@(~{F8p21&=*C^(G#*x8TU>xvd=m-|y{$2z?aUKrUx`rQ|vMYI^{fHFnm*ii|RgFbNK?pr4Mx6=;B?sG0FjUdo*B|&dF83P@_dnlZ;TO;_hYdGZw-D}M-4Ju_`b^O( zv#V`pealYl?v-s&qtA~CR-6(u+ai- z5~=kzdow}b#Gp$%wvZ4$cZy_$yKk2$fbI2QxKj4o-DfcM$Fx;8ZZntL&_(PTqj3&c zNwNZpWuqHmq<1}-+fK<_RjzkmKfZI~cQ?v%({~Q(OSao!L%3~+4{n@!vxKuOx>jZA zd%Y;Bh?3-MCK1YeOC7g!=Q%g0QS;pbCEyNboql;iVNa%cpY-#1@-DYAW}D-wx-Szi zyB&T8#-<66Q@So?T5&h5^Nwto4Dvg&Y3&^#3vwt{t~vGsxjK?TkzYZU2N(%#K~Oegzv4kU2P2r^anQZ;z2TyRIG3b`n%W75#MomzpcuqD=Q)q*HP}4 zN!=hrlbA$+I7r`y*=#p(OEOh|;c9wPUr!dTjf``PL8i%Gz~#%4xV{xuAW`B4QN6a= zPtR^f4FKV|G+07KzJkj5#1kYEJ`EHhCA)pqf1c$}GWVRf;duaoC>&GpDgH8}hR;j- zQAzKj=@L0?wiL4?W`*2$N2BKs0ZPOsiaz_cq&QQAhncpEbAp;Hz-AAfj)D{8CN}YK zjuP((-dIB}Nx<3u)q9QM*%p|ic*AQPUVPA&Hhc_R`ke>x_+sw_I@!?HTzX~F2cN)< zKI$-;T|g8K3=h$i-U`Sbf|}L{C$;OFpT-?jJ9oC$5AO`4V9^+kRpbf_t~Fb_O(B9+qNSChpP@R+VoHY z*8dc9u`JE&v*!uD&C1hq0||if-c} z@5KCK;^0VerH$Q|b@zp5wh06>+_g+{kdGd%lt~3xR06Z}PlKGUhA%00y+#Oef`r>1 zDvc`Ts!kJqwgPVSK3Twtt@4JPM64A>aw*UE8G&dF)sUEzBr%GZz!nS4_FH&IU|G^VA~vjCFFFS& zIhq+Uf|x6b-S>Sk$>)kdSF0sg#s`$TA7&00NdUJlvth`!=zPG%L2UQVwf z2r}(|I6Ch-p76l^@k@XB64&~%R5jof_LZRw3@NGHi2BLC05G+bMMpSX#z=KlmY(&_ud z(u6JP%B3@x@+n?wRj?!LPo}H`AIv;A%tx1l%Da@WAm0^xpq=vkMN$2T(NiZ6A1}?PT!{$NHW)Qf(EwL8A7-fR$(ULrUa+Xo?Lwg^Hqpw0uKB|R-0r8E+vsZB|byY9hrlH_I>Wpa9Dy7 zd@vQWIjtCH-$-2b1y#%Ghm7P#3?R)xaQMW zn)GIGRr)@{{GZ6&)UjT-_o3LNuF4`-Pk_C3CXy&rFle3_R+G{-x7WftTKE<+-T3Ne zIs;BaDTK7yW_PSbU`Bqt3l;|L(~iQdyj;s=FvZ`(VR6M7{$PF6MTog(bl1lS+m0*l zA2BXo7H)`@z%6FCqG?;-{FFry&%4`MZ zFx6BmV`;6Y{VSp80}hGKPf|I^FpVTPqR~5&1+^W;q?UUqXl^`T3AB7@4%^Hc&V5}P z0g=DP*kwVaZe`mV**+&kBwTdQpX8<&+c;p0B;v~q0;v8cFHS5B>}kc6{<^SS)7Ck7 zfkB%djo(*5snM_OYW*d|7BuYA)jR{1Zm3sGfZd8BFyXUm{uaiBf|_3CKY{#Df+ytv zCwRVa>;}%=?*kJ&HJ?B4{`?tC@N|Cu-2VAOepE6 zNC*Ihk^mBk&&%>GgVC5TH|s?&MSWqxi2}Bt_Q;DT+rF_(!Ql7?3fKl{Gs%15c)mkN zcf`6<5#k*NLaHUJP{Iqw($VKVEc@E@GcG95_63ZBA+3@p_B8Su?hyGl)z?cyq$syU z4TGzhVR1U;WJVMlZlbYk{X;CKg1BsUW|_hB%Wt4sb~A(h_l}Is*L_o7ev|%dL3jMu z2Y&lL?z^8->l^JwSlbc5D~(~=)yu8E(~TN5{(rz+92TsqkvwPVSa@H_K?LS?c5}id zJr^w}&j%OsEie`2uCQdBds~sbU2x4gfTXR&T3w!AfCGZ3L}+IfExd>8jiD=+K;%=A zDwn8Xs5F+`fb^8Qi}1l74h9!jQiWGjOLYIH7P)F9Oq14ex8GYVPEO#SQXpo}vRpy< zZ9BG+Kga-POJTP*1%tRPY>k&Q-N*^W5v6nwFOG#HF&x8@4NiN$NX;~m9lea0!*->i zIJ|d5>7}#s>?ij~;%(TXdg(oERwoo}z0z(1_Uz4y-JMG%)?))8<#ZnfZ_5xQC^ORe zIcA*o^|=;ZrE^UEqeI$13^8uMhJOF==6U1}%(n)oxgT+5tQb*zu=&w|ygF2=($J91 ziT)`2(XHXelqcY+4GxPB--ZBk7Y4riIOG&!hy<+KZn2`l&vLmp-#Tr@1aGVD!mKoW zYFXB@1LFSv4)F}@%9{_Vt!4vZJo0*TvaU&|UpLHM!N;RvLnxIQHw-0Hx_v_?VfoP1 zrHUEV5k)VmRjWv!8pc`B76T49dRw8gGExaqO7^7GUzRYZd6@I%769mW0K*O0UTkz` zVfj*gjam!nX_9m^_ZZZ%#!5^E%Z~UM_KT!Cq!16HY;Zi#2+PG*t22U{T?eB?8m`kn zCAZ2`CWC4{Ky5BSB~xr2=~R75H_}!stW&t3mM(@WG+?RE70ZODX?>JWhYdmyj~fFA zeONo>(+FIwQ4;Q#v!?qj{f+4smW>@C zW}?1RvK{t3mqfNc6AJgw9*K*$c(#Pie|tFM?{f8t>oLcc?|fM7^Xj!^m+1Lk%G-x)cb!PYcM zy)ZcIQ?LdF52LOEQhft@nC%wJU>si8YnU5?M3O|Hh)~a50SR%TG~0@c?rgxKD}Eos zU}Q>+RantT*e>FpQDJZrlP0OPl|f`)BV`0a>KGwP-ZPb+6Zdp66oPQaS~+4x!O=o` zX5vKi*7xSph0U8U1*rCXhY6*O9}nu`)W%uI6&HjC-}rL1F`lgd^NDUY`tRqA(=9We z71hIS!4GiN`S%cdQgQWNL7AcsBO!fuc)8eIc@2N%``# zr^pH2jg86IE-PG8@zfk%CB53y%Q1vm;ElRgsnARHfFpitfRzessJ7REpb@qiW#`D{ zGeAH*Mcxbkq$R`)i`6=kum?p}v>{2--c^cf;%TLBafmYgMG!9q#>%AOc#9|$u!R(c z?ygo|#r3(az@Sr@4AwO60NCS{$7I?;H6o>MrVXSe>gRQ`ygn-rxwJJEf4;oD%)MlV zw%le2SCh`aRBa|{uNt}>EG>fBI1X%)uGN6Xrw9rhF)NfrZ?UE|q*eDN*L@Em;BZ;I z>Ep*mYjJo+ijBou>`l$TSL>Fehbq3izwWQc-aKmj`<|cs_{)Fqz32dBjAk*4lt=KE3q1nDcf0(-ZJNU zWEW1B4WB(#kEk(Qo!mPA6nkMQqTM9HjW}S`?(=j5mu(aofoeD}?wX%HQUi@n_WCXD zjS-qgh=%2)t`DsLBeK$c<0x^I=T0NmMU)Y$p!hg4eI>E`6{BXslpRyGS77e|vMazL zg>UoFBsKrg7mIfCDD)Me0>5FPUsO#E2Ep zfWSBccF8&6e@SJ5K+YAQFv(g5NLsg$K!Q!GLva4fAnXbb1H~iGfP1Ex{_;`Z5K0W{ z*9#yp;|9XHLptIk5v6Ws_=dmZc1d3~{G_UEdczU^ovrbiQ6z{6d@_T1E3RpUHv8kPU4&&df?}} z_P8B83)V4MkFHA&eQka0<0%H#?foR~KW!V5S1gOZ_ImzSk`J2~x5H_%E6dYnU@I8s zXGo!L+oNpETlX(oixCV>+u(6yW|Lf>sektMq3^HV?%PMOPZuJ6UTm3G4Hux&MqD<| zHK(}*L;BP6VHlQ8#SMF!LC3~6`pl0174N}dC+_I9A%4RbXy8)!eF^ZO7 zaHD&i=%EJS28GN=y~|HtVb5d37j@%tSngtGuR!a5~h>rL^ z07-I$moiyABMfwY=6`8DgiOv#k;+WatV7nc2`S_VKxuegUKM4Aj4Yu5x=gIOOW6@Y zCdgVzvUGEhfoW)!=@!pmAb=f+u$#@uU{BQjvc+;9_8-WV+MY+^`@T$gi;JY8AR$|hg0{`88_M;%TiR+U*jjHl69 z-hC0Ru?)x|AlLRDU?^Q$55k4J7>r}XMyqA4RdEdB5KRRqr+;`AyUJf$>KbvmF)u>; zF&t-S5fLeM_ore%`a2N(ES6o$is&QL5(q}GHwLYXFUU#F^ddDnp)wK!QYiip>pbTA zay-5^vhAFKZIQ6OgMG}Ko=y|UC0CO}H8q@uVq(qGv$Otnmmi@FZj;|w2626?o@d_wox=sqw?<5@&agDiGb$qMC4xk&E~^+ChQ6uEM35O0R?ndpXF+_&Y1m=VYAu8b-&@`V75nN48eyMWtJdDdW&6mLdZ}5f30aYdhYcA~qQxNN zCo11t*i%vj0}It(d@Nmqds2r_5dcSs1z0KQs*@x4sKpA>{94duS0mq}la=W*hjPAL z!KL7>&k(Ncs?(kpUT)P*+FLmL#NeVp3Z!6)>W7qrht7=Fi^%-4Zr#G>e#yN4cI8#0 zFL58WBO)O%T$Y< zi%hXCe$ajYY>mZSKlM?DUS`d;l|q&f2L5oN?iqqRw7x;Pcmk2c$O#x}${ys$$#O;$ z8yqHTVw1|fKH{KzZUGU)n3cFI5M(x*kh~RPv~RF%cac)t6c+{ zYLYc`r|#pFwWN2Z>#e;n)bV{ zog-`5`eXQBjDe}~(FJKy4Wl=pc9kRB=ijZ%eFajyix=z_v+6m<&{W+!n!hcgF5pes zcP?lijF~;vGrgg;6I7n~_y}&vbh<9lnMVC;DH1WMkMv2fI%;O|6Q+iPVEH96^&VOg zNN6;D4P=2>SSuFrm0^z~#r{@cJYe9~LQA<8L z&Vs1i5pt;_(Z&_W>vjjpuv4_NAjc$!g^_kB_4>>r+|(hZ+k|Vw;^CW_cR7(3PcJynTPh3oT`lJW$-tw47=I=dr+bjK{SxfsJ=dE1ir*6iBoeX8(lx3cB=o92Fhz&K_) z^e#NsLI1=1edF`p1BQikV2;D7kCp_C#w&6u#MI>`gFx+u^ zHp4F%YC+iZtU6MvNT)Ustpw?=*z2Yvq39)%nPsPe?+9g^=SI6;$7g#ol9K8fQe!p1 z4g0|!UZ`fgfjisy96UaycyO$TrG|8PF1Z#4e3$JiI-2LOiWNEX_o+NVaSq>*%sEjCG73@gR|r z)?&g6 z5rwoURu0Gt0d4n2gT_@;k8iMBb=XmIR`6|`g%eTTo2s1d3(3b|D=kN|NC`c zy0gBN!N2~h%?(Tyb$|Zc@%i(J$JQqq}z~mGH1L0%`yoJSJ~xx+p&>RSf|1QFi|0J<1$I*q2u*d zD)>>wkxdm+glYaM?lr*$Lc^L+ico3PE5Lh};Fb!-V9S@jEuuw_Xwa=k#YLdMXolT6((`ReAD1Up9A{#f~H8eBG`)T}0vBa{da!%rqLE!$%JAm*yP$5HL(ic*{Eyw=)-_io))YTbM$s=a0ZMQt}YQ zfwl+jt6dvNrG@KlN31bzKB9;9xhl@$2CGO>4v7lR;eUq?-AL5&U9d3~+bJ+hR;^<0 z`FZVvaDU^*Hwv=8p@Iy9r;OE#-Rh zv$1Tj(Hp6wLg?HcZ{>Z^^%6yfikWT#EE8ssDf8N71cj14i&Uo5ctapvAiRi%gTrbd zALuZgudrPloL^VczmOYj_6gzfYK*`OLkKq*hGnvbDeFLS9l9cZ68f`c)qc-p=+Q43 zP3f{pC(lRd0x z=NJl!l`uj{loJ+nxJT?!&qYb9rKEt_9@>auR~*kI)C{u88jPq2v>m=Q1cg+@e8K|Q zY$RfrB9@=k=K}Ug&eJp+hrfAgGFoWwsuPSHwCAgFU;GGqF{M?ITrCTJjLL6%5pPxnm5YV4`?SU-fX|dErrt}k|^aRK5uGT?Esv}?xX7znZWE3m;vde~Z zQO8%xNkS_40s~2LpD#g&cQ}9Wml;O|sN01^Z7<90*LUfZnad$jFe*|e2$jn2y36$L zttCrIB)u$8F?u4iO@7}fi47AAhjHwD?hppgUDOB|ZK=F3zK2R5l1B(SWf*smj=|#j zN7?x`q?U>@FP|@^${CxZ-IvbHZL%!#uga(;?(7-!PRsM)WpN)KQN|L-v4VB|t()&Y zS~(rtyQ@AZj0ExQc7YO+;rC4+L?Zlc))~vexgTVj$i(DEYvXBhM!na!Cs$c1K7B2q z+4v3ikCMazsZ9Wg=dZi&k);^0g^KKb{Og7nJ3}=vqHqXHG&FHV)jfhP3@mb55nKE^ zupV1JDEu>$WuJQM2r%pJDifUwNaYK%y(ISOYrrS~$Kp@Hp1CR1We1{3oQYVK&K7a7 zOd6d6SWB~;6+jFNmO)Z2uV&fD6B)@5njMh-XN{gV<*bwF4dRMC6dGYVkbdw=eJ0}p z;J?t`kzyKa4{_SPyNu(|1Rb7_D{P?}Q6G0Bhpr8v%O2xY#?+J`U~Y!ivAd%_+;h`P zJLE9{U%2zzm1B<`WhtXmjNIxDidNrX+Vdiv+$(BmJPj-o~?+RDLjX9n$ovzKbnfsg(wc%}dNaKVWI|89GhWqg2>!y^6A z(M7*ii~L4R(ZjyP63b_^s3oiv7g^cW4aj-5mMdjNtKWd&PYz&VBBAss zAy5%BWot2fN+WiGY7c5=GU@n!q!-oFL0(9Mq5DC}ItId?-WCX z_~)K}>!)`KK~d-r4FwluB|9DjH$$$jq#*fFwD>9Hkp-{b*!4-nc0J&V

%z)TVAW0ZupFphpFba6xROmafdxF$Us$-*w|G(`gA)zIXgSR!ZQ$;?xx z<-YRh^a_MG(~^@zn?YD(-P_yL>QXPvv;k$*u3GN2<3PbJTL)dc&tQ8VLujoxQyqzZJX6;5!ufW z5zd?3z7ch6(?k0Yh3!wDhGF6Y#tFqGYcudIMf3UnM9}JClBBp>0O7)-2)Gn@z6{KD zQlX(dR?kDd8=7a@m)WiKA?Fm3NNUMR3RPgj(Gz)=HJQP~NsL5bE$(?Afuvmw8WM_% zxNP{8iOFheQiRiADBY9r+YJt8=Pr;scTS^3i51FeTov{#f`>PRwQ0>=9uzrQk>W5( zQTi7tQ96xQqeIQ;1WbOzCBA{ACM($dX%OBbRc_ypAS6%VMFUf z{ia|{ciT~O>ba)2qdojo-uP^a><15kHun)z1E|^<5ZhJobz9)Q9OwU!^%P9M)Po-+$04$8-x_RXEvDYl%H_UDfN;A}tXz{NM z-w1ma=i_5llU<3mIHco-L73s>V($ZW(`9iRb@c>~Yh{5tFD8(Qd0j5A3>+CN4;NQQ z>!_U-m$Hu5MPjh(++rxnxypSo5?viNYq8kPT6$$X6u0aM%ze;U*gg}}SKBiR6^>bt{^(zRY};gQz?#llX@Ec3*joD~==tA4d|u3fC*8TX4EQ>}p~@=@ zBU8v8s%|~{{#ZR;QI&dZw_R&veW6R7YFlsrOO4f>y5V_)dH3!tb&TU6ham&AvWS+Z*7beknjsZ35+)-zk(L9+M4_ z;$6@GjiG&l4F>_=_*m<7c|Pl)Ps){f5Kxs~h14FNA&53vwBAInpts7;wvM`B(pbw# zouL)9+x_qMi#s-L!bGvtm}|@|W{d+)@K6D#*U%sV8h5ToD=h6#QZ$sk^~~R|YcHQg zoeWD#z~7fxzs~+AuF{(Lcek>`cjhPVs=iS2t7?|jF$-8REZ6nW@TJ11`oxg78FW^p zEVW-+f75J@xZrG^g@N9XT#owV5D4y*JFRkB>Bww9K-hGHX(?UU2Jc!9mCd;sGnz`h z-Vp!#NCH9+K`Q14$mOsrktkZMlVQqxaT;~$C0_wF=lH&OQuD47$Cata&o#zAyr}uA zx2ZR|YrIK$^XY?`YW1${NS`~9z>6DqGYT&@=wDjF3gkqS&^3b5{8wb`Sm&Y=ZyK?H(xI*tyAJhkirN zpPhDLd+V{J7Lh+bk>Ct$O$VIGAHRf=2Xh1dnkd9^gU_C;jz?@`Zi$+vagMv>^oqq0 z>QN_E&NSsAK8o<0{fnAVLYT!SC9U^cJ8qNAu7|u&$S$V}_vtI@W+a&SGX);+!F$ z5+Uq~6a1ZgYy%JMJyee8l8~r?b6puH<0};Q&IV9hKx38l5_Ma?M#`6QeMAomSu{tD zs|9{M7y=^~m@to%)j9B{n=3?Mclg?GySubl=k%(6V1+Id&$U(~P+}gRwKF&$&qTv; zOfv}t;;Rv_2v9&;iz0bzGku}bX8}F>)B~+jb|RIiZ53k;Y|JA6qhA&tcwr>=(&Xmh zAU42lIPT5qaqwibMWkIfy)B`Iy{Ye$L5dy^FBZM~0@V5K?P0$Y^w||3*Yd5faNyFXFx$zy;jzy8Wu3)`4k@0fv z;tf^e`n4-iU7tiNC(zc_btOL@A6|6$ml><1+drgl9oX#s^SOBT5t=|x5xf3!tF!E0 z*`$^XElzeQOJ5O{H;Q2~C*njrOjy+G(EpsXrQc~lTwYGt;~q=+>+LU*zgEa3O2cqp zK*zQb8%Ikv)bp#{nH-?-tVNTPnpl}I!ks(COj8QxwDK#g|}B= zr9~K z>?Ee@@rHG}tIr(?STqM$XqBYtt&;(k{t{Ni^XRnvd&7Ke*Ucg_Z?&dHGxT|e~Qbi zIU_^EHq+v1o23D%>p6pE&(ufcW=za5sGscjwoUI%6LXVY*ol1e9n{AYKjRq8>D)=w zw;N~aphGxdIa@ee<%E*fUfE1oyouW+mu14lPNKh zJT9y`y7yWf=9}oV_tyDEZSx$LdMv7cgWI@0KF%_!Vdc@{xv{voLR)E+#W|MkrW^Ji zoI>j*S0+%jWgK!efbcBiRf4QQ2L-CksnFBdJ97TPwJs3(Q_F=_*f~$YoD-g=to5u? z+-}SW@z?rUVSOS1 zWuorD7bO5OMQL`ntq-u)d!4iNYZ$a`wsw^RKC(uv7vZfnj%&N2P(rw#fFMZ%F*Rn)?zN}z$B?#7->|*A zNMuM&7uZuudZW;*17s9$oyw&Ws&qNxYdK`l>z{6vQY1ZF=qwD@)J0s&2iDSIeXa4h zeTsM;<8o_V#Sx7*k%f!0X-TKbeQafS+r#^RZof+alv03-ouu_4DH9<#s1RzR|ad0~i0h0RtYp*S>^iqm!Bha2i!bI-?ZzL+5ZBd^KZuVD&rW0*1q-g~L`$ajwwU&Nb<%g)0&o&33MoW(09+ zRyX1#7g6;%$yVug)JD(DenQkCMWrXz(ezBbOU?L4=qJTT7~y@MtPw0uA)U9O12QX? zSa%;=dzxFa*z@?F$+EMR$D>vaUk#H!908+xm5};d*BC91?5nySlR@{n`2st>wl=?$9PYrc11GDxFvpzxrJ?)4Ayg zB>{z@I<{cy)JOYfc3MjOcvDeo3ajDm-9=FG9^Eot1(u$1t;Y9wlV5y1d3&7>r1JW# zORX6sQp*sYof&kq%xBXuZOV00;-pG$MQU>Mj$H%ke{6#f?7!=g#^NvAT$m1)S(^W# z{48xeeC6|T=<|SYn|q;c;T2Ca+@D1{UK*^{)6%6?RJnl62c9^p-ekl?IS&blhGTti?!mUbt z>wT&t6evqoWe!o_ehNMddlY)*OnY=w_FcV`!F6CMY16OI1o3${YDb`j;78TTvZ?83 znUMY52Fla8I~`u$St4mm+qTzc*bs6o+ICAWD`-+yk7#cHjQ_bMcr zjF*%WYz;wnA4BKoe=&}2^XV0(+dxuSQzyK62a(dPR+3h+{wVnpZU_(HhJh)~nrvrQ zkyij%TY}^8=xq=&xSrPbNbaIpFS!tavvz@5@DgL_7BCWV{Sc7AG49BNnf$#`j@-z8 zCT`zI5a&Eep%$ZL4pDT@0e5*Gb3Mkv%wqYS)^^PZ@fbQwAZ$e-9aBsw0II7N_bXgk zcrzDnEhT7`Em>+wlc2>VN6@zjs?jRj9I+<7&U{NBK~cC6MKyRcW|)MM2+ZYx zSj+dxB918gd-Yj6uylYHH7#-AoCN)sTS9QI{|#apt#v|^{_t~DCMTBk_|#8WLJh_S z8QQw{X48$%Q`p_yau0k~k1oYe?AEc^OZoZe+UuoKW+{QXI!J?&O%f>qhsK*@w;t0k z9&`1_uajJ0)JDHX4i6S!d&ilxag`Q~J?#gCHS%oe&Qo*xNlu2u@0)m7q!DCxPcQDLFfhe|a@D z-O0&>!4NE8MUxx_t69T!U7kBwI9nWAn4C>k%Y^H`H27~_+7vlinSl952Yt!xHPIAk*KY8 zCu(JRpt5rkY+Mh)`%=#p(yA=M8$4LZXT0D7DNJ^YS`9uPOf!SW;A1#n1+K^N_&sDr zwGvS46*F&?NMs10kw zi{Ih;TqnY&zy&5ls8WL<$;~(nwdr5Yo$b0Q^2M+)zr%%ZbM~)=Tl8d{9QZBR>ieI_ zvGL2_9q?c8@IXJA*qMYO5@6*{#$Vw%o;#WzC%;)ofF~~Gvc~WWy4nak$4j?S=PGVm zpUPG&7#g4cRjj@Mh3zZdJU*X0hTA8F1Ca+24x?C zSL}_uNj7qC`hd>#AZ%bK(eh`DCLv)DkwQYn0X0wl1|TF**s5X&QTPi>eNEP+ta-1|kIjOa7l3X}!SNCx&6#2-aAX#@?_b9mN#_B3}`wrXk zSQY7{;nu6?%Q72XVr`I(>yLq5m`OH!FO;f`I9pNfy@HYdgimb0^)KtZBjR)KtxM_* z(J5K;_27S^4oaPu_Pfe+wU@uSQ&|c6)dm6JrHi<%Z(04Rqxv#M(79dTTE%!RwqG?{ zZcT=-+P=3|(Qj#C>2ho{72B7m0mV(UlNbNla_x}$&L4c_I9j=>0FO>F3MF?3Hz+6) zXbAj$V4nsmy%7*F(!++)@x#X{n%hvNL(Vi51r>7Od>{?f+HnLgLae>(yon_c9%HJ` z(tIlkH+c&~gV73D0Do%6g^Uu-=rk>!*34`{w%ZCI3XfyZF?|P!sVTTQ2#(7cKGoN+ zSNf@uQhzMi_0$@I#ijsECK@vN!H=i~Z9*aW3@qFPlBi?zDB?3&t+w)N0-^y`7AY#G zu?05t_;LMH>O*pJvJ3j&TZ&>6ctHtL!}}K@lf@c|DOA}-1e7+}1(VVF-?1?6vCuD> z`q?eGorl_19Q^6R2l>j4yT=}e^mX+9{UBMM?Uja*I}z`k0`{m0R)EaiVPk9tdqL6( zL#E8Qh5<42A&^dwUp)z(_P#jUs#`r3PO+5wN)bn{Qb(X-Sb)fDsTRz4`0U{1QF|hH z(=fA`V4|2H%z6501+DDi9gLlOybve5(J4pPz+hF8ji{mA>{j4Nti2gqs3F8Ka#rJ& z#{}0nwXY^QcR@Js@NBM4U5`w(INFma^N=HD+vIQp)dopGb0Q5viA9CzD?=s>WT=cz zpzd*APCWDo>0sniouh-Zks=>NIrEQFm{!PV$m6rykQ3O!OQN%ABX-Urz)9`pplXqA z8?xf!bzCMwc9BYqgnPZJy?NmCo?7d@1$E1cKmLNF9=s__b`pJKr~2Rg5;%X6?w5-r z;|*olvz3SH`<%TUbM1F+Pw>mq_@?~+=W~bt?+z_eUCvz1dQfubFX!Kh&k5`hcmS#y z>LEQJ)^_-}H|xLyJnLXhzZ1^VBDGeq-1)3-rFw>7NPjYPq0jBo+57^9q$p(T-GzN8 zhC8#j*TT(uhV$sNXh0l)MA4;aQD~I}SyM72p;~+o*TB<`7NKwfl_;blt4ihq$o)iZ z;^g#kg;Gy$Sp%mhvi=F9j=r6KV*ARa>KNI~v7S{pwL+x9T$Y{fl?s;p%By;1pr3D-LRp9W-o)X%<^twHMJ#3@fPd(`_^ zsB=)rdaDGoSnEM-xyry?Iskz`AVYqO@3NmtZ91!s1*y;1IK@wTlK%0CguOnG-1FGAc~VP|80W<-Qg=f ze+D5(;5+CVuUb{?5&o;~2Tj~&r|Z1MoTs^S;;XEoUe)H7JHf7YX^&phzA-yeo;>S* zOI@9s%(^8J9#-mecUnwol)DZsGjgSU)~FJrkwWqH77Jmtm&ntXU{h!84-ggx)LAH< zuM|b}d0Aq{aBuW?Q(R_6K*nWKc99y%2l^F&`VH6#3Y?Zp2}&2OfVYB^5|%m?jY|Rd z)hJ%SGZDnM#zb$it??sCj(7tT-l`wjU_dD$DAL9;wvIdu4r9T5DVMn;B>nCQFSKR` zAJ6L+Kp19{EK^?>>hh2vs|HyhSq?93?un!DSlSdsFu4_g0gLcv z7(bsv1VT|?HdoQ_;<@6ajJyLib7i=m1>MDrGb5sMX{OEZ-y1wkhW8huXqwqksio*s zfEIdi@ip8>B1VHelW^TgCN)8}ZX8C#?2-6#ACFY{7``z% z=j0zz{(HP?g&x@QIVO}U5JTeF8I`oX@cjLnY*teE)26+PA&e^naS;{fx34iR8$BX! z9yf-rf$XMwJ|lV-F```$2J}dcmu8UT#89K~&ELq~PMaZM*jcGMRfT1(^_w1?uEXQazy6ee^a zImP=}wD&4e-nwO&VZEMQOr|rjf{B0t=Wn0P3wk~v$WVnlS<=*L>4_2R*`5@v7C^RD!2^I4gY)iJuP%S_NvjyM+)&t%$nCBOT zh$v)dMBssMlYu>pe~(Jf89{7*ykw(m9}t&AUT$-=wuj#G^CvI&Pe_n4MP2H~un$ub zv*BSeRL0YU*Q2eeM`LKE)I(JN2J|CXJTT3hi%tgi?oE z2}ltHz(g}h^9uh4`_T0s)l8n91-E`V59)UL(n<9Gufd5zCv=9526{;=QS+@wV@@Uh zVP1z_q5Vde1Xd_G+u*J;3pYnxfwQpQE0y(yZN6{&VKv(aJeA@ z^6hNjN9i2K`Miaqwe3MtDTxmjKYB(qEsdz22DaqEV8OSf$=wwen54WXGMfqUhSre< z>(=>MCl1x(nA4oqOfstK`pXi;saZ5$F0N0`gOVyx*RunL7oeJ|R^{W?Yd+1ZrDK~{ z)nMz3!~Iq>Y2o`}9W3OCd!Wg?=;>{ul5$Xu>xq51U)3=P&hY6iOX+3)g(7Z>#`W!oItutH zE~M1+Y>tAzPK8)-hk))-UHUXlFm<|J(Q*1jDt_p= zMB|8MGN%xXUr8d+S`WekzeTJ8fH^6no}NBsJ0iq|>-+WhK{u&Hr~B7t>W;v^%ug$6 z-{_&QPu^FpQ$UU^toiJvw(WKC*FLf6 zxOVSeyO@$P?`gC;O8XVdquby7`|hLH@9Mo02qR}F(Y6gDqW)am?#ezZB=nW7ZTAS~ z9xW|k>qi1?FpzZ-a60{tXX78*W0zP648)7Z~AB>Rc|-o-C$jr>9EC!-==Qf za}2_V1vqu?@iU3HdELvhbMC7--4lOC8*u(USX}~uGjD@0Pj*DEv+#sI_aZ=Jfpn-5 z*xFzJ`dh{ukgj0iai_Dm-T-FQ+cwj%4R=^3e&W!76vdB2r`JPXY&<{Oatq=6!8SF~ z!2}u&0_F= zQ}$9OSgW7)%3Bq>G68FNHw5#mo=ifnq7XDv<>1W|K#q+C{W40UMIzOXzotH<+hB)R z3wQ!%k0WzROq7BIk5o*)Ek!c(0wH&U3)VugY&y98A&GElrF}g(Gsd4>m#L)jdm%p3 zwLRPS9{AM$$KVn1C6t~0C)JAS|3}o9hb5W4VZUq&hz1CXONFS2h=r!6W(Er8f(8nN zW`(GgWQ|*8P0b)8A}*<^X;~qfA!?y%do#FZX1kWv)L6DJGq%i(Ei-*@GvDv~-aq(@ z<+{%GaL#k?=Uy%~e7U+H{#F(X1&CP?NW7obsBrG$r+G(Fk3V<_kg%Du-_0K$PqNSj znyjjI)Sj{Q!C*xVUa=p>HlOpkLa5K8yK!VG&@#tZ6pWytz~N7%8q*rX1(?K}P|QDhIkn zVYI?=Papg+s{`Y>-<#wY>}B00aX!d%n~vnIHA_LVNHA^@Ho{MgrikR!dVOlz;~KY> zzVnDvcNT|RFs4Z4kf)n^5N&JF`s}idFiwo$^pPcs+QE|j*;c^S2&{7Z%$X|0xr6vS zIKJ22!PFUoRk#}pB&am7E&*1a$lKjlip-ezFB)To-?x)G>UPVMYZk;+;@tyt%`N7( z*PUx~A~sE&jumD^xAq?84x-(jZ$ke+#3-Y8e9*SMx@2&0$L|_MAu1cQqg^Ay0bB%{ z{_U1?q`G|RhMrE|mYJSr*F%h0!d)@@jpz?k_M!##|k<_mRm{f zIo7?P|3Oz02J+Yf6ebX{?s{JLXu3;_v4Nn71^n681N7F+O(HHAl%wMc(CoUXa4%_~ ze;+}F>1`Wn*UDnHf>{Z;5MLs3QEn2|1VM#t^Db+%VIPqw z8t@|fYzxg#XE?@ab5%CQ!Y3yZd8ky6J+$DVMnajt!i_0euy@rbXCV1xbj}S(^q=oW zk_iJIvX6=%52NyJ%8C(#)u}3GjjE|D%3tZ0K`7~~spnDSjs$|)jEisNExtd{jIRy( z4CiQ=C$90oO?Ur&B3GaEsH}VtL3i7>PvqLFriQ{d%NsP?P?bE`Rq?4Mc~GGC_qAXJ z-i)$-!IzeTii`TY87m^v_CUaxJMwqD<2AA_H|fR%>$d?ue4pAYoeyJ(5EdeGL|$5H zG9_`wnQ(vJMkrKjC57G|(UW7+#H&C)I!tO$G>Rkv2glnl5}bW~rarWfWzup7{TNId5FZT} z;-XPfsG;ed^bCda16hHZ{A@wIO5_ybCgS6j(HFNT7sLaH4XyT0jp6hDGn-n2}-fhYY}iMDm?I%a@(Qh_BZ0N z%yobw2jhKz{{S6y`BK zy`$D};avu52qD;#+V$-p4*-#WsKO$N4!E#obBXsnddpQ&A^qyYPoS+FiLw61OE8kX48+<^>X7@7*C5&$5qc=lL^9%Z7Mf4omj- zbf*{~k^Oy-IMTt*NV0`G34<7d4{QblY-+uNI2Fi{+q!~hcVRzqSt$h_3zbrTPTo=v zt>XzWn%$H3Ns&>gblFOI=^>+lb4HEXR|xkI+nSUak~dgEmo34GH*sl1Cafvp@rhV4 z#NC4u)0M>Ic$4gUB_b}-JS-HHHq{1l#_~44s8C3iDH~If1`#IPbT<~(oQw&d4_KjP z?FNI=00N_;sVNVg+EF<>>!PUXN*V`KeKt6RXGQ{mi!ITX<3sR&v;Tx%hnA7hlE`mo zG;n&2|Mp2&@~chZ_oq9yTD6}2MY5^rZ>GTE5=Y4l$tHZZ{T06v61s&>ona_kg3k^5 zp-pS$?w?i^G`$)u`0dXFiOf3z4|edl^NtU#OCz1&ugm`_!>Sk zknNtm&5{uPAd#`ABIqKY0~f_ziUhZk+Wyv5GdLtea@m;v>_5gxHd9t`ij&?7@#%^~ zmQR{*k^;2AiU`5XnaN@v99TEv=6uAAO$VKq}Nhv7rdX{3cl+v&C?q?-z1b%Z|P(3V7~5;dMU!X!Y?5 zDG7SGp%zjA_teZhg#BOXTI>IZcfPsG{4?em2f{lbs`JCYMn~WO`&#hzYwm+Q+wxLB zTSUU}USn8o+~Nhpe(2Vu@d`&{oK)>Xz zLR2dV=a1gaq_hTVG;_lR18fYgruk7Zk-MuzI@_j|fktrZNh6b?xhXd-@lV^ZH)NzVvPub7^wbO$qz#{lEufXEb1ZM3rn=aW$6umFM zJC{lmJ`Z||#Hl*U_)Q<+94pJ?D%|Z$Pxc4ev-+moYA^njqXmjD)xn`he=Ya)+@4Wg zA&c~cHg8*w-Cu)xSvJOYwTa38*aKWZGHI{VJ|b~5v-1>`wRkA@H&cT6I7nm;=}Ypui6#cqkoF`@w|x& zz$#Y5GYC&Kysr^$_jPM_yl>gf745)peIHz(|LpY? zr`QWD1^%PGL7Ew;VX_SwV8x507kmxwckXKBzD}iq^rbH-E32DL29k>C;E)`Dl=?> z{ff~-!;r-gzuh>Q(M8hH^cwOvuYVDNEf~x)O>)oP74dr=&`4x|cP0Ga2I$(SyxOD( z8Tls-c|X7Y&~UHZcEOzT-rBIED`c)>27IIR89z6_b3!Tq2S4z|{YkGo%$T&0q6&+; z7nfBTO;uKx4?vvluF5jH(~!<3K}i+JQ;$bE1AUFYF0~Dk8yWT$z4w53&AU z7}vrooE7PX#QnI8lX|$)&yH4DsOyFv7;QbCV?ic1%xT`qxRiC#V&%fJY90Raax$6= z>}?!i(JrrpT!h-Yx|sG=BZNhqh(Ko>^82NM^N!_9Q(G#b!e`H4j<@n1hfjNcM#tY> z>2Z%R68K#iB%IWTKLQJZ98y0?hn(_FhV z5E(q+!Jo@}BTJB7KupY_42Aq#6dR>TG;xNsPCD01opd)kGTO(I)~t0Ahm)hGBQ++% zS;U~J228%eA%O7+4oJB$s3Hl`UYaC;0X21i<%GkP#SsiGQN4W-JmVrznF19@d zMxyDrB4b3>tONC+p_UnRhslKS?v-*91=z%zlCttKze|0>AzHi64*UWTof$M4e={5~ z>SzY^r(bS$z>o?g#rP9Oz+sNXr?b4z(E*KYAvDxTQv+hi3GgyC|5vJf(uhxmvRG0; z41fT99KmH%0(M{>nyf$&z%?=7+cT8NfCpoK%UN^!Zr!23uVkKe-{-hS(AWP9hwvSl zqsl5fl%|+EP3h3M7rFVHcEu$;$RLR{=?B+fH0V%$c$R$pz5n=NuZOtkNy2sgmADbX z2THl@RLDFOlSK5uo9wbZ)Y<)h3kxC8qjLaw>P0xEU^m`{G2{*$pqG2`$64D4FDPJOtTLQ{5Ss@glS-Yyur% zZ$|=95kV0ek1XV`RO?3ag@4-U_LcW(4FlnbgSf33XMrDwp1u1;H&$36eHmtg!xYsC z3*R3ioV&fvXKJSBm~B(pGl8W4?IUK`b9^(gEYSFNYKHuHuZz1~g~cyRBuR7O|5YRa zv|vlTN+ysNi*Ioj9NnWlsH*1%BVjPmMKSSC2%->Q6+}7Rn&(|@Y!Ss^rB^G^<=u0 z^yEU^x!6;>2lsySEr!)h;n?F5e28e`I+xAR$zDCng3$;bf`*ak5mwqqqXIO^HY%lE zkZ}`IcAk(XsKq8iY_@u7Kv_6Bh9S1a4baI{surnf(`KZ;G`wJ))}qOBTj3zuD2EYW z#fv&9%KEL`aSJXOIP1?z&oXHYF6f$6MM|&{95RArp`^|^3d#v}fwa^x+eYLA0%VLC zt)bXiE}^TFZt5SATblq~>%S|7{4Lb?nfTekOScm@jC=aszfYZu_nNK$Y3Z_ufzJz6yb;b3*pF{G8NB8H-u_$_-<>C(+cyLM&dCrHXpzgt!G zc4ko!`o|_x=1O+}mdYw?Zm1d6SowFf#BDgOSP`CI0J(%c_c;_}LKSP^i}h+-R(C1uV#0K@6q{A@jlYHYlYhp+*42bN)mO$D?P7C`6S-?de_c&Ixq=dOvJ$WZ-bmpF{~RF z8TajaXU~K`ay}+BIM{{T|zk7c9eyCn-XtS9a&qrDzv`R$23y$Je zJh9StbZ!rVO^X=@fVaCi=;0Lz3Do6s3&f!Y$>gkhJP&eEznwO(^l%RrVW8mJ%Y4R0 zHE&H=>lEhBJy&m=k%=r7=$cRNXO<3RUA|EX$DQTdADSbyw512jE+WdJubaWqscK+BR>?6ckYh0qd$A>nWxTmT&Pu0ycI0tVV%&f|SLmtQ z?+2eCL5sO9UDTtAaoM`Wh)Vuo=ZOmaMDs7?+e%W#0{FlatJhsmY3G-u`*zS4y}wZE zbn|gHzz6E0zUAY9PecUVs8O|6*I*F)^>{ZZhZ+B`{ga|%JuAX}1inf32R70T32(NW zT(Y&~gIlmwB?JU*_Tcx=hmYoc*^qxXYDL6jEBy;A>5pcxDs%%5f9+EF^)q){OuEJ$~tdAS!o5)PJV$u!+CWN@Lf zULmDuCN^taT3yH&Oh)}y4FI%SLxk{ALAr}vPZIOHw2;uP_e#mFM#F3{MQ5Q<8g?~l zk2kK0HykIB7aDa)bSh2xYI+r9tq~2Nuv8#a50dwU-=DTq`N7#dX<{7=@@ zaW6M7cbAT`6DO`v<`yfHqs}&y7St{4lbR&+tW)?B3=ZWEor@EFs7$ir;CAY?=IpZQ%{^q5t4$s$h}oUa!0;_D zSSmr2ik%RLu#cx)3dR8T#S7dhR9Rcsc;4mNR=ene?54zKCgw^ImcZ|aLZDqMW-Lqg zC5a!}ZZRv5q&2>5mU0I~Izd`Eqoa>4A(f`MIcy^%9d>c}!*e645$Ua^PUIg=tM+&> zpTBoF#5M+qrqat7EnGR(3wibS(TV7WT^HtU*{o;?@Oh_WG!}iNrR6&n?!ES~6q8W@ z_&i{Cu2-H;d-Q8SNh2ZDVfVvxLv0V9$b3=(R+U1B!=OwE`eD^7SHKT~t#->*l|LRH zhhPU1t)Kvng#a0h?+?U`dOUw8Y&G(?5)3do9cq}AVgM^H(;A-XO)*SDI6?}#@*;EqE-JNV#imQMf=C+QIp(A%Mlo^j0J7KIqgLM#Ee?#A~?(zW=_KVgxp| zZsZ)3fbFf@{1ioo_7J;hGpKqQN-x!kuvd{e-l=rg1xMLAk5XR*HRdXkroWqPO3b)07x z;(BXO(puN=zm;W>&Yk|7wi9*bIHS!uAvrw^nLNYs2fD+geUN*74J$uj@5wL?s zUGG0bc`zhRtBu%=iwGrQR85#_JNGPFMtq&0l?#u4& z+;M3P8`;6lq@P|D5ahMNqMp^1TEto2tvjBmt3;j29*zuV%G_>Zr(?lXsFFXoBh|8e zMa%U_|FH-+uc(A>R{8lr1q4^=jQ*0O>7W9jcrbVQ^Y#CsmUlV)h2K2g?Q zzB3ZvpBW2XRiy@2g8T(+%c4cBYynA&52`1PMZ&L*J)Z;2C;pFg)BpcbnQuIj3O|pl zAS$!<>(|P!UzPtdZuWouTJiPko(Fl0iprd+Qu=jJ5h5tL!vo`4^Zd$;cQL&n&4D|p zm1N_p)sw>i(>?wc4zKDz6GayZRlUyN*z zoPI$(rDYU^kP?fg2T|tj1?WV&Nekv6>ni$3QDqT` zX)>ae<#-;>QMQ1-KsH`Yfs>0^$JmX_qfR(e%;lc&ffp9K(+3FE(YeO6oBT`r%}7Rl zckqtR6GLY&otNj`Czco^KGAFjnnwNpgR~7V^u_a^^c1rKNLA6`y;)JZh^YJI23~+m zMdeX@>Jj&Dd;S8JT~x^!wOcwHT;vq&DE3UhoP)rXb)Q{+jJSKZR;pLf6*9%$7an$y z6weJoGDRJ6P<9-Y515QEOGRv+6PV;VK4XhB8I=?A5Hb{bLSa;ZkaCg`u~}ORh121Q zL_wlr%7O^dRbq9%>4ab12v))<0{s#Pg12M=s~|pH=3t+Z-l|b#ELCd1;|}@lM1e%p zNKb+fSLL3RB;xQm9VA+-#&G_-Ut8(a7}02Nu#>Eg4l?C_g7^#B;tZeU=-LIHt$L~9 zeyEYIo)8Xd|Md~j48fVP0+AOmmv2H-EOar7|7Z=fxz*e3=UJ@8H`NlK?_{*lnl~Lj zWo#KevOY3o-$F;T?_kp`U|~}Xt3s^K-RtcBmh9Q^CEnMxP_ZNkf1aRXVYCHV?#|qg z8yq2|Y3u7!&y$ynnau;pbd!)~7sKKxWX)5e=AHTf5HJwrBcvH`a5+Nm zm+Rlfg~xCgG-3=z**xeaq`0<@L#}9CD{aEK2OTCdP!T#QJ0CABr%3!&6^P`r*ryGH z_p33D*-zXL+hR$xrR>w^cu(&rFp#*%{540-PN?NKeo9EVe(?q7!pP2(SAEN^?rpe8 zAMiB6qju~+$}lS`En(<{^^nD#UWbNpS@EY}w{!g=Pa6}T+rCP9bG^5C4#wtNJT>@m zq-==lW_zS0v@8LOgn{0mRmPa`EZxwHv?Wzfs0~P^h1JMmb~ zU;uu~D~*i};9+A|G`YMKYl&wY4BZbs{qo$s?V5XXJ=>eKf!Lec1@Xb9T#TR{O_AHC zRno0cG5l;l1|`W!Pj3bB4efmWxq7tT?kt1{>DZct9kej3Et#Ue9<+g^kaU8+kw*n6 z{3zbX`Ycj*m&?IUSo&uY0G2mE)7cFOPuXD;k(~4f<{LR!Hhc>{c+ove4@ijhe{B~Y zi&;Y7!GU)>)9P2s5+b`)TxwfN;BYK~Uuc z6%^chZ{0^FQ4O>dlmyY`B6ke16?z7D_GTzx-z+Q?{PgjwZ6Igu)1JIJtp^%pDYc2R z2H}nKn*D23dpBdB`2cUj;vGnDZ=YCi*gb-!@XizcF~|e8g*RL zbl@j+;j`>B;W(s;QC^fkCa_;|sUT6KvrVPg!(NfC*?rZ3ks5|RSS!FjPY+Rzl8^V!%*>UZZ3-80b}?zd&{ zo1BMw2If&5E$UNy_5Uu%Bfr#>nlm2>vU}QWfvCm?e*_R{1ZRFb0sC+Dcco&|`Geg( zd%id0eq&Gb{-_t7tygtMX3NJN2^IW^K~QTSJKm}^YTByfV`}SVXQ=e4Bmz{BhtVg8xw5>1lzOVMp;%=kJ*a7~v{=8rMQ!N-|EZ<#d!=EEA5`_QeIOEiuZ;txJU zpoL*3j^72^{z!l_MC551Qm2!N02se?erpb~!2v8sF;)HzOMzn@xE#W@ZW(S+4y^OU zfqrNvFQ~NFo-;(rlD>YLg=Isq@VDhIm?Y%ON_i?A9`4rQ`b!Gk?EGxc+6{ z=7Vaom-AH(fYT>6ur!rrc@e%IUd}}R+7UbzV>T=w*K~`j`>@nS34$} z{ZG3c=r0y9$Wv}~h~^iM zb72=%HIW_9kGlx+Du(~qpVRxB=4^pAHpKs*YdaySS!9-5RJY81Xw_w^!Oh_2zPdd9 ze)I};biw#!y(y)x?8*KRo7m59sSfa4D~~_=JH93O6lTlt?7MACehR(x{@T(*spe;u zHsw%4e?qJKo#G3^E6Y!0S~pHEF+&l5_l;BHo;rq~d!&_fK1u{?cJt$^XOz-503182(ZtINk08lTU? zUs~X|l&&c!*%&iFl?f)8AwO;i%B~2zLeZAW&pdTZS$&W_B+6@xXq;j7@<^h$|jL>l^PD+puBs`YOs8Hw>G6-hiv38W>)=dKj zOt#noJK>sGcyBnI!1sv-aAxKF9bAaO4(em4x%RH5y~V z0T`V^{sAz2=kLQMUXKSIDLSs$!G%73a5kT?>~*?BYeAdxc%4Yl+(Flo>7m;0QSXFk zjDIw$b%=42!^RSC(xEbuQ#A~L0XhrAiw$J;Lm?LtF1WcSb;IE|DX5r#Ez-scmL3ne zmtbLKoBLTY;X~iQvo4)g9UZ@|wqT`Q3>n|tvaLWQI$&cZ`=MXreeU9EMX6r`;nin( zyN=)%cpG>o!Kh0;aWhEFZn$z5h5fC`mcyoU3{rpiV@Y1YSnhDc^{E8}WC5^TIYNLu zs-z)a@zXI-Sx6W1cnxdeIhr>Ea;S9oa{keiWX0^7;Y<3or{)nTy4VtXXxjIkCp^Z1 zg}qxCd!fW9?7S`PnCaanc>Usmy;)@S`n)7`xM^&crHS^G936Ef$p7PbTg4OPpgr|* z{}7zplc#O=$^&Lsi-j%BQyDC-;*WWLukeR zUrN`SJ0%7Xua4nHIWFveJsY_Jza{2+wBwwSRu6-tg^zuEgB>`O6`VZ|Noo!t7N+A? z*UOfV%aZ`xa7Y3hv+OPGT6O@Cu$mR)V9}bAV7_+kMj(9-$RTMb%aNq5{?;sO{`4jh zA26eJbiLG`Wu35=*zT>MY3{lJ0pbLoHx%e@KuKf)OblOOE9ml{H*PZ0Cn3u66n}w} z6L*}i+tga)4RaQWcmqsA?_7XD?Cnw*Y&|SAhLWTX?E*m1XQ8PF&^imFMtmIqh? z7624&_YhIK&!}wE?xQFR^s@mNNam@YZyobBh271U<5V?CU6OH^djn}VKuA4&u0%Nz z_HR9o|2kaLn;U0yV)Dmx4;C5iYEwVdR)nO$#qm@Ho>Xs%CA|uuzetAkFSXKi{$P&6 z{o-oJRn-5umsVOW#xWKYD@^wpW#~!gs$*L^eC@5IB$y^Js{Fz^88ytU{_+FhZ@z|Kg+W~kC`-FnrQZQ2yxq?i;! zvgZG0ISbln|CIN>*>Oo|T4^)oc1+8Qb(HyCK_fd>aqs3Eqod~D{@`dn8^QEGw$~+z z9`Ap+X6=?W5`u7I|5gsX?Nb=s5@8bXIYb{0uGU|zoEWt;3(fK)bSh#n(4(dxJzGxK z84W4^T+kuK7PwSsDCfcf;cGu45eykKC5iSrwzf$ZgD|K+2SO0O=6Pzg!A5Py@us>C zq@Ka4WOG}ZR(N0E@6$;&IO@`)_x8%_s=JNgL}j9dZ7(J^`2km?&z*jX6`3rF2^=`c z^5zQ;trYIW;Fw%&FG$`d0#+a=76wXEwHbH20I2-#T)w?IJ`kgJ0jGAMG_~@Fo*j{MU#%8?+ z5(cH`PB>2eNv{38vZ-s4a=i=~d?;76419h+%PiO!ZJ^@@k8g0@X#jT2#bS4FX0bra zs1h_Mgp-=O1%@+>wUG`lPze@^IBy6qZ*1Gl2Ik_#hOzF*68wTUITK=MjazR_}*s zr$-;elj*s!sOKhJ@Q)j(r?p4WV-3@rY$7NC8rB}hPfZ}gzefo%l*$hp_2hT+)8^WI zad-VPp6#+1msOfPNA<9Q*5H$r;j-6#)%)T#r96lGAqx)ntauL(){foOGyAz%61aNg zoh-E_y_>oIp>umk@0|3IXm-S4QNnWNpfuX=uu+5@d2S}s_UgTBZT^S!JovA^zgb7yf@A>+*_3PK> ze@%Tr>*$()a^Jg;n9kS8eNL_*-nM@HLcAIqP#oXcdL-W8`TnBwgNrZ(CeNpDbG>?> z=M6^o91oZ3ja~aBS;RphNb@-h&dqTpq_t7HxhOr2|NB=tu|hk zMLXFg08!mI4DCO7{FgGsT$^(hRN1d8WY9%i#`_<+ACs><`_f=>a@Kcf_Ybo<)s8OE zISngM1B-CS`Tm#AvOHrDhIf1NkGjfwvX9RB`i0cqT%9_Uub=mP8cCLAoBE4XNiMho z!ZMUc^NvKei7EDwb;YO6qiXex6oIui;Uk+f=6fXUCr3GNoKl(8-Un+Gdvq^wj(;r6 z`15v=Ccl1t3MB6RvoNfiqR2O=yfE#T#_533>Qiaxy%9Ccx&x!{dfxdDCmjzfK_F?9 z=YSB0;mC3=5#0>n3HX(Qks@--j#OP7bBgc)p#WrXKMZ!wNs4o?`zhDKJl-=7>oHH+ zayZOk#s*UWX9k_Y6>PbeUP(z zx6&tV4mlcrY3sMTb6Z@$96ZC`eBK*0n+X&z41LCnyG0dQ_`wxRaZTvof(}G%A-Uu> z;g-;Qn33xmG~Xt$ijKDnS%||rseL6VF(}=0Ap83$!Lz`uaqF}fPY*brJ)jA`SI{gE zeEp9OH%~9MS^P4odk{<*yWv@T@ZI=#57?|hXtai20&@DtP3>rz{}8`x6*1ADYo@OP zeQ-bzQ*AY(#fVSeF>XP`g86d5w@@cwUV>nt2MVTvW&o`ju7*j`1wUN7Nc8%V6awG| zApFuc`tHdLC>Tf&zN~CVYF5W`9hQp*{Sa7@plcsgF2Qj+&wOiBdr7jpyj3ET4-wG) zQE~@6#AgpFjnOY);6NuF)OYukrGOGx7^Rhb>`@_db`}r0xdz)l#3zUdH`P6W8Qe&F zwJu6P$|Z=dSF~-lOdymt0gO@;yyn~b)ZaTG-yyE-C2Y`p{dWD+Z}#_-#;mWLh`Lp| z?B*T!x8KE?tmYmZuEORVt+-Z&s5tR_%URW%i-~jpm^ad0q<(wQBd7`ATV3@2=JO06 zafu6FLGv$4;jFR9p0`UqV7FjgIIyR6xWDp~of-w-RdvA1D z37SILVcprsh7*PzBmTg!_hK91AIhTaeiBN}fmw6Rffs=42;rq{ik&!vNh$2-Ap3oT zLTq+J3!EMznKfkiX1sHy3oa<_T+3ASD9+x?tP--W>?;Vqe%bZ?TQ0s(igPqG$AS!z z0YDwWK^|@A8MNnV{h|X?syhf|)gtR;s+AMrRLId+D_(S5j+i?2`uQ*87Ec4yHV+)y zi>~kQvP$vzJ`o?QaMoU3pYtNL^4r<;-{YrUl#|?&#vO0RoWrce4XG?rYcICvhdZ3M4#~1K+V+aCyxg>v!Xx*knI|k)s(+vUY@4<48#ZZ`*!mDpKhYtSa}I89 zeb+U>9TXheQQ+M8rsY739N=!v%JFG3{`Z32sCuo zf3>v~%vqAIDxd#RN6ZF0ytX(3v6X^P6$<4|Ke<~1=V2-+ zhOU3y8Z|}4B6ry4o{Z=;-|}kZp|0FB0+Fh{OPlsHKe=45?N;;XKYxdC&^^ zTy~+q1{J#4CSpZZ3|buyG>z4w#Oq^N6jj0H$It?ACpZb*SQXFgz>D+l++2QOav1V& z?Z#Uc2Fb+Nn2U#QF8kf`U|!6g+RS{zj^zO{yEyvIL+#feQeJMl(|anEQe1j`$GZFl zNVx{tktz}nAggNB8*0AWbW6i2mn@Drh5Xu zmuA)%%pPG5TAoiq4g-}%&{1s|{K8Q+QU*1EwkY*TN?a_WeKXjXa)Bl0dr6BCHF>5Jj~{Tc(rFzKl#w|WB@{iHPx4)p3;!7i6*Y7aFi4CNDI zHUd}$e$VqlIz7N(80w+7HW`hRdccjGCcDcKV+Pip)YK#$JM+SJcq_vx!(CScLKXn| zdFWg9qYwFg{FdY9Mi*QE$CXL+zY|i{c?@~{bv$m(?tTcWPEj{fAMV~jPe=@eLV)X3 zhhQB(>zB+yejw>A*=fsTYQ+-o+(!9Bz4Ezx6}$pbGS=*P%*{%N#urCB2f~Kk)(<~h z1dm|ZpC*~>cCGSQfAO72!ghA~kay#c)VP8vZ{|*AZ*+#XP(alZ*X*In@Zq)E!W&E* zh^C`3QI#DwrF!kkWZlpO2h9x+BWW%aN*Oi-hb)$RBAxiWa#8Av^E^cu8$dqBY}dKQ z(NF?*PO%!vqu^E`sIY?9^Kvk7$vNvRKo5aC*Yk&Kj)aF*l9yOoR*;%E4-WXQf$Jxa zj#c8PX5FCn#aTHti=tDzkh}3Dn+7kI!$IZE>Kl`Om|KeY)0i%#TJ`RfGl%*p{q`^= zG4Y?5Yo9#pV3;Oy9oysg`q;f}OWZ%~b2(#4EW!o3>84x@H9!3Y2xQFvnKS3u2Vthj z>VhD5k7N3#hv$qSRL7cD67f|wi`QMczBl^Eh<~Ej{=M4K^Pj}8JI^h8i=N&a1cvRr zFW$#k9er$D^4{jn6z<{!vm+@Wfc_$QuC?VE_*x4sI&4$MGkrti!G?&Pu^G5so{MH{ zC;Y_%VHiAvcabbp(gJWDGWK{+&{>e%SX=YkX>ENvfpIG*6WTDMk0hLfg55D)Q7@w@ zfJw6*hsYZ^+Db>ZK;yYt<)aD}gP_x+r4l0dq(Xb(2N~J0T7cv7NnRz+UN)MHlYj>L z60JzltLw5O>}r}dkLqZViR_^dwh5w;vu_Y21pj1S2?{uszIwg=7A|Dvd=?Hej6~8S z?|y$!X*jZ+%^G^2zEH92w7V|7L!5BnQj&=5yg^Yn^kCFD*Jn%PKD#&aqrnCRR3{EF zM>zaviYjgYxc=s@%XObpe&)@%&2AJ-1Zpl$24Br+`~ISRq0je|2s!7YN>2H!-43_l z%ax}^hWdmTQ&z8YL$>JF?%!#jxnMKzUfV{|cId~-W4RY)s_&O~g|#uP(va>!cnGmgTDHJE&m1PC zovJ5@Z#H>!(#y_!UuASs#P+2!q|~wXzOqEW?}o5>lxy9S4AOWBz9R;T4WO9Rlf{C* zJU`*ajnMN%CxD3Kc-vJ*rPV6>y>v2H0E*m-R6vXY^>g$m0P!j(071;`FltiTKk2tx zLDfj9KZ3==t)=vf3H&cucz9cA11gN}$uBSkkBUmAbw_PXgR~~NR51k%AT@=>#mjD47%-e-BESx{z z)_&$R`IS2JPLCQkYE)Z9Z-H|WD0q-3&aeSY#gPn%cwkDpm;o2t1q z>ImahZBTQ8In*=ibofK$iLpyJ-ZkVum|uZg;1+}e%uHLyVsoIAB^L6%D|!Q|3!-Y? z?6(rIicF|y32sT}RzGyw)^YYB_rW3!z`!C;!ot}=|c}VFE-?y%08D#giP|Q+` zu_lM_j{a4&(hmq&@r>qR$fGkXXYPl)UM+2TV|PodQq4HhX z5FrqnS9(u(+W8nI|IWxnb@TpZojGS4v{#CoSVw)Gi8tX(_%M)~(;K_K6nC|@C-_nT zC5r$=;R#D2*FuES}fWvyE_D0rLi+7uwa}kDlT?A7cnR=E_ado118b!%1c8{{*>I2Sp zl1Rp({b?T)!d(>+G+GRl5-mQr-s``iYE^!>siAmIOyqpUvMEu}Czp+K4aGgN;KZ4Q z269YgzgJelPq7xk%0-Y13st1ZIBYhypmHD=$M_T1?5=&CxyI7(MpyKl_FkhVE~Ye} zq7ZbpmK@rV7`t{Mi0K=R|7U{NN)TdF|C?nGM%aT)BEx@S zWe;)}J&1N(7+gAywO<*d-h6je*EFYh(k44&f|*2+^}5@Y`hyu{7&e#>ve}Vl;VEKF z0-__Wp3%^BePwEyLMN?Dg=NXOT;5qJ+D_#yqZ_nPS#KCT%^#POsV1@;!31%XCQyX& z=|ob#JE?FKi%kC30Ak$a59w+TA#bJ7=oCXrJGilxzf(XBLpC_(CeT5RJrq~E8WSYj zIGLg`Sc8KoO^LDI2HFiKmMORb|JPs|wzSs=?z7D)oCC0Uh{?i?l#$7t#=4Cn6HP9; z)HUKtGU%and7n`y4hL}Gd{0U2K~sWh{(a(0_nkem8h52DiPG;=mv6E!qMYlG_-+f=oSu^nukpdap6MPrH`y5?1TmM= zmpfHQxUxA8F6dqrEn*L?4nH*AxZFh)=85&n0gg0Q`uImT+n|0am#+J=pNlh87N3%g za7YI%4yOiv zWX7E00qLw~vK`EQ{GX(Aim}`QW|fC|1GgT&2X7YjA;Q;nkP7%0knSwO5sf6#oc@u- zkVY|J1JL4DDWvR4lZ0|r(+mOhDUMN1hOSzL0ZmkB`_ii2!cEi& zQMN7B0a|s{%=rn}&psXMy`1$3G(b403IA4G0L3~MuPH($Zg+`U(@;piKTkX@zFu2T z^NH5w1lF7=Kj7TRv%B#e4dqed|Ft$<8dkItuZH*@w1)F9AAzQ^rjwR+K^?%}Gp6`% zX28n6Cu9)heEyW`HSnkMQpC|Z=N;`uPOUn98-a{}(plt3;kLHG6W5;_-G}B?lJ{uz z^0^5(F9iZIh~wXsg)?uUR}sJoA>n&h7pMb~z0xv)?cGY37F{_ZJDR9e7J7o+3AEMVoSI?r=gOV?O*^J6fQcs!m)Mr7EkaqH`gKQ zVuTQGmb>-~GCAPi$_M0Y#+GVE!a&*@k|INhd^%e77K)5SJ4A1g_a+g>mOCVd^PEHo zUI9chB+1UYn^aTN+eR)kP$ISyeK1{UicG7SjARL-If366beY4MKax*pKW)Su&0Ssb zwfXPGzdmZrdwkG{|B?{&Z0s3njVZ0en|J4aVdm;)Tkzx^^k zan|%Ap(^*3!#q%3ZE%~xpZmECRkL?cnZDH1eqilL+m7Rbuj7D^HfEq6rqqgfv3nHk z!#6X8cJa0@`C&wgy`Ga+GZ^Hx?kdoh`Igp=+ZI8Ac*a*?I0#&W}j z(5o&EmuwGC`)l3o-QB5tJpwO(c7>}Q)YUBTZx{ccqTV{H$@h;Nzc(0+bb}2?3Zq92 zBrQgV)F>$xM#%^XML>iBGDa#XEewS*KxrgIIu#`)L_kzRP*gmEnTUmY}NOXEr(1 z2uRjjh+sALp+33Wv(RGMPzozIX|$S-gcGEV)FZ%K0Efh-(+H{DBcSyHkIi{&iYide z8pU8`UTA!bx!d;Yn)dN-eCg2EMB|yq){%YHUFPw^@LqK}VQygczm4q?eDLqog}DSh zo0Uf#H+?>#I021S_tmCr_n^u}iD}D?Km>qz4uA(yp{6jpE9miHonjqCzN3Jd6CU=$ zHNe|%eanuG!&)C2$j{>`gq;Y?)w9hqN^W4AX%@tCa_|Y}hFB0F^-QP$QbToDz#ebW z%5Vp05O=#`nm#rqC2{}<`XC54ga9-ExzV6OoQaRmC$mt*86GU83tWR7x#CdTES3VL zbq^wXSi$gJSbzmgV}R-YbE^S~SBk-c;5fwv!HUG!l3cNLsu8Ll8V@PM0+q|5tcnK! z9JmkKWC7c`8EG7~kW(5H~Q*TmN~no6+5)1}=T z7(x%{knrYOaYMs_mshoO=ne+P8FEA&scCUG64}9tb+BK}x~fN;(u<7(SQV)rhX|H_ z1WN@1QqO%s1)AsU#X9pm&w=E&+Jz~1{376_2RYH5aJE8_c%(~+1Qhj}IF9`wSB1Y?Ab zo-3~F_zcb|f7F!E>U7Bd1(=F_ku?Up38qL_!Lt~)5x3*zuQDVHm!2uQTNs*$Klw@V6^s#&?T=x ziRS&+hVDPUrkS5P8tgQEPuz)aR<8$Nqqv3*yiVhMr)dPa<#a1#^ir}t)q^sLwjlIY zyr$UWWA(3Y7kie->A}2gPS3n;oCD zA20L^$>H@2Ruia!B>)NWW@VEU!x1w$j2&tvf}kPQjJ;^w3H|-31QQOg5d%Y-(;UUY zqrpo#a|H6#jQ$+pc!6Z$1b8M3xMi|aq%6?TQ|3K<$q%llP?Df5e4!hM#G$PKPpRY_ zeF~))rU0g>WbT1`#{m{XoDEV4`bO+E36*II)p>=IYOnpRhfR6cc>DHNHeU|r8yrOG zDS7aow~sj_On+`duNf(#VOnSJu7~v=SDiOv2VRGzo}Jgab7WHJZqDpCKEI9@v-HQO z7|Oyeqo*voBFRdg4WQOP9jv8Wwxj<#WF~$5Sq%_ZL(e$`oOO-HwDx-ZIfKrKZ8`-4&7eOa5F=VxXR9zZW2(j=I_LA%!EhOBwS zlw#X`fK}Vg5cqsiUW6i1;3i-kLffAu&+>hNe-PIQt@Q!PKL>Mtt5CjA`R1aQo8QRx zC+Al8qksxIbK-O~avgWiUvHf?pVOZ4#f4Wz>Qe8uBy?PgrJVQuLZ}31x$TK0xCrey z=R@8gwVLzxw|1md+Gmw8n3;M{`1Ja@*~9Sfx>e*>-!rLw_qZWBc3vB;7x)8EdP^ASn61QgqC*>G6pxCDtb4dH&|~ps!+HT^*az+PKhV3#;8a zp>4l=MQB7#(+S@{bJ%akvq-751PRVV2Uh4lH;UP%1lDhAGg1z1k-f?^Ob^Svs|CaX zQa`N@1aRB*KL|e!GU~8;aZof|>jC=z83l3KQ;47Z`U9O`It}beP5iir7vt6MxRo zLYN3c@XxpDI(0JTaBMWcqpL^_JroxspQOr4B+TF~6YE*Q-9s3iEusohf)T|9;0NCEYMted=6)ZpxP(o=%n2f`yE0+l^1^4AKC5t?j795l#xfB1zXB2NFl z{o@PTT% zU?ewPAAd%fwU<>fe!C?K@C*TL{qYf*SUFm)adqfKxjlhY%;K)jkb2`FM+v?yX2MDr zO1-1X$2R3Y<3*&2pOB_ct_ABSmN6Q%l@k3X(O1U%ocPtAwPI#32(HgQVf0kXcs{Lq zIKshoUtoEz(6SKY$50odWmUr|#vS+w?M#CR?YQ@QfY503CE#X)k9=ccnIA_sW=19Y zrhSxYP4*1NeuzPf5K(w@h)|eROi7d*$|Yxc{O^oTqz}Av=j|1(`(q`Ah4kngn;CJ= zjeM$;_x7S$2456CIr)G2<-nexE7`o4ASvol57@xNx8L$fs1^vsD^aSRlzT5Iwvvrk!r1R97Hu}nPDM1gU=QMHoZ^*Dg^u^S2Hyx&nwr}o z6f+$4dMm+qO(uF63jkxAOmgD{H*tq5K{GW+va;83V66z)8cHJu_XVsb!Gdac7^0Pv z1`>)!H*LV;v2J~P0Vs}TfGJ1zWC3}d{y8RtA#M(nON~!^<6o(mR>A6EN1Cr@mSH)^ zXz^PEba-U~2J0ipVyINfOqq=WxEnOk)4Ub{VJ6rR1v{CoX<*L-sDjz3Z!sWx1%^!8 z*9yp1a=6MfO^Z4s3VyAO3ecIlQL9WQfOD+;N`xi z&FZp#9mn(P=S=nsrtLf5J9qoi&rl(!a~tpRSv3|~q3v?E-=-ncBqiaj3gUetS0uNj zUAfpHe!1JgIo_S|0cAbH!D;Y*2+izG;KUmD>GnEAl3kr?HT;2s0K z(o`?DbNlpm%%82QESqL?iL(!2o z7*5Wbfgvfr;<6e)F%C%r#C%$tdq7A&|0dBhF5}^P$P4={$}L}nZLk22=vRqrcZ<>#q=NvM+8n|#M>P&@^xP{Q=$rgtruI@TI8 zWi!E;@bd|V7E1pwT*9QY+h^`!>z zXa@}?ntOmz?|>trfoWvuTq54&g3SB~eg*-UYT!;YlkSQ}M8`3i^4LZ?K)9fgg2gJN z*m)5Js+fh9DGX6^4f8zehma{juBNN2bUGjME=AGg%5s zcj7ezYi8#DM*W*;J5smvgZ+sYs!1-%32SlSZun77K;e=ZfK6r)!nT!?>o>H-6Rm~S ztZ{P}bv~|@(QVt-SDe=ZJewF5nn>g;oiU_Av(=s!>AiJD0ZSdReJpDtVTw?~0sXot5gNWWzwh97K`ULvs zY;Z>{!dEFl;2S9|KC>WW7Da4?%*X!kuHZDfq3 z*ioHI^HpTY>J>pefGVgHc zgia4@?V_L6S^5Joc4`;_LeMC*b9{T}p^M@#-HFn1E0nl`Uwyx#FMM-;Av?0&QX+v%kRU<{PizioI#A3$2MJOe{?&++t5kz5N zU@{rPMsYOgyEZ@w0kk}_D8N#4vuB1k|N*gQiW*^{WNaRjUPwmPaJ~) zX}w=Lm}x!?)9xbiFtG@Rh9ocR)NqcE zwr^*7KA#q5@)X(oAUh{rznR+t6kH;+v@4?`D@UTNx+WG-)j0Nc-*C*s?Tg+JY5n!y zmF7{+Q_=tYYULy)jngpMhCY?gf@KX-dbX4=j~iI#VnaRM5g z%e{&{F^y=;7>q=y-`jJFP1}e-j>@R<8ZlT`oUfqn`I2!B8=ewZ?;*6r4;= zv*DM!+9KlsgP6t>(d^}l7B*>rD!yHSJl$vQ?TkG!n^aAEc)yB&W_h~0JGq?pP_$GX&t$;$Enl`gqDn=7!I89o273e@|YxD{*YDbLVm~d)XvaR}V1%eC2SK zRZb0N@wrxjck7wY=$5ASDftr#k-lSF3x6LnPek>UY< ztO4gFQk*YWxh2^C1!~azsU>7jhC`bM3h8>%0frQwo+6!SIhpUyQ&ZAP=0rg2JHGNRaTY}V z^0aWV-MaGAp^JNsQYbEg&!C9|J%;dvVQ}CjHDHW~fKYv7+Bv-(0TUU7_>8S>BTGOJ z%kQ^c@!U(IoOWwHY%dI(n%ni*x2O zo%D8~nHL=|!kqe>opx|+2q;0}r=Fb0Kc&k5(!L-a`Y zHYaf>-86V4CtzX_Cs}C>!E>j0Cr41u7#JNlI0ktE%F9)`1$8+|hC?1h%51HgSkMCI(L!9|?X}@LtBtW9D93}&##128h-XXKKp;h|@Gxm<9eJHTFi{r9rH4to z2@>v(zD!w4rYb-%f&eiCn`4s?^lHP)Y3C~xlAz1G`p8a=k0q~P$EYkf-nZEKAcZtB z>BTEK5fp93E0Y(67#LE^sN%{0?pqZkVhtPxq^vBdoZKb{AMRLx6-3L^5nZG8^60qZ#<5wKe*L1QI3haCFmj<3X zv@f|f=sSqaj3m^CV9|+)_D})S{u3;?Y~5+b*i934#%wE`fE9H4t8i-lv!s zoz?Gc60;I5zqFBzGH0T(DXX;Gh*Udw8exFoge8PTC_+6Oz+i(_BsVe+fYnFP)A-F{ z2jxH2XQ%E_${}olya#MKuO1xchzdvM{VApzraA#jU zOCbegXfzf$GQpr8;Nt%b+!|cPTD;q(#ELjM+@;1DJ zD%&o?wQ^<*E%DZB!s#$vcg#ESPLsRpjhaG%yh&D9v_ZfOT|jPHIXtBX zI8hQSuKyV>(D#96c#4+?FxA*5dgdSh?Q^#lhmGFk9h-g~aCWWJ?8Gq==Bg{_lil6X zl*yW+S&|S~EOHL4II^g%92`=2P!evf^dlkrNhGHoL_x_Qt|w!bH?>g422l2Xy!j}w z;~L4Ck$96`L1bM+yy^=i%^hxtB_JshecGpbB=KyfasoAiyC zymXTjh!IwPx-&*o`-wGcu@yTT{cUnts!WOPjUkf8fQ@Tv`TU{> zxcz?2wCC?Ekm6g_{@W{o*}{d@FNJ2$&MNqxfs>kqmc zDt!E0QBZC@LsY`Bo;E500*6rHhO9FB2vvew9L+QzoNfreu0YEm+`H;2^9vQb#!FXo zdCP>}U*ZZp7yJ9=vxAu5`hll9|MWI%v@tv!`s-aRTKa8v=7;96?)i?XgXBes+S!1> zTDhAH{wiLXc_V-VhB8);)wmtC^N2XMVI^gc04VT!ZB)D<3M6G9RCmtX^@t40FkPKM zGlcR&V3aT;uh-go1J)g3PuN}ng<Y{7~}T% z6Bm;b*4*E2jzBWS$qg+HXhRr6tdA{V~349PP^Qb7p$!Izn5dT{m z7UM4KC)|a?>(d8OH3>qFdiFficph$hj++zfknpcIsnaQ}lI^Mn?iQ;8Pm9)MdwdtNx$X||*+Y!)56r5*il49!a^zAz z_#Vr3_jbRPy}NpC$?!XmG66cr12a2K!RO>Br?jtH?I6B^TSHr}!n5{*p4)quXJ<(^^?lyD`#vha*M!qFA7S4(P z7NQS7G&E+}M-VF}w-LpTpS0#JVuwC>o=~hT8Vi_`@g(ZT69(V&HV;fo+8f^Uus=nnvihornINk zh5r!q7DW;G#U5S)dMqKpqsL(KERYv=HcfcS70Il6I#})481^*{W6$y@R%F)v!8@U+ zP-i*Gem$0!d`Dy|XMPMhOmyRo{YXQqd1B+!RaXn5s@Far(IL{tA%I&oV29MU=E(#v zy?!Y)2IJjq&eX$|sTC1T-Jf`OG{3Lc%x3(>C*G-Z#}dm~Dm_l#tSgTp-|}tHfc2i? zvGDIgi&{+YrOU_TD0Ox6mDLASzeT^@RL|YL@oBQ)8`(%8Rc)R5#G!??eip3UL_n%&L=^NmW@@k2MEu({s{DQ8+u8 z^>^Rkr|_+4^_Z3x5o_LtO7_z;KYYIuK3v1Io_HIc))J-r&*|$}QB%C#zpdHY%jcdH zVBF}1aVz;L((8s3`C6?vR(`mR_K12MR1}Kuybk6LonSqo}W9}Ojkq3UVhJIbj|bOwHt;-4?YgJ=RVeZHJ++_(~WZ- zi)o$zG`j${KTl63UaD@mT4G!om~9a+v4-kQCZ~OHn+A;mm>2E4!Sx(aiJOQiA&Gc# zIh4>dABlu}Sqo2(jlX$%_{DGOBWa<($xATAyFd-Kb+V>Iw!eI2SxnJ8IhC53ZR~_H zv^oE1dKuaq`Iql@pLFi7@E@~B_tM>tp3aAmCb2eMa9~r#{w|KPE}tOeav{UN;Ku$; zR#s4maxCb(rMtzllVsF>gnz55LZ;BwzF&`pPF5egn#*deY5SsQT5{j!*JTJ`GvHoW zI+53^N+!Ws|9=ci>i=O_{}r5P|Gt(j5*wF5NzYCLAuH>+lpNZBf2e^EJNVG{_Yv@& zA0c6Pw?6AJGBf_H=`JM|yen^1$AXPbY?>xT%cPv6Cmo9&8dvV9*iyAtiy!fglGhH z^Lsg0q3>M`7~`vTC(aPfB61fJZTF9RR{Z90dHupr`$a8^{aL_d z8TrKz^-9MM0~IQ658^^+QT-P@m3r9>5UCD3mHBzWHUR<+f=&)IKJ(rgeyJSuMg#G* zH%R!#E7V0UawYk>YmZh27&;eBtSv;UUg^tJB@JjJv-sFieJm2h^3UWPZZ4^V@;Ql3 zueHjRB-dXHd^QDwJr=;up*D}RK)=~&#P=#$m~q}ujCg?behDB9)i%!ZcSyf5kEEn||vYt;Cr(dqkDl_e7Kwil;BK^*I*(;ZsgU~tg z{x&jXNJsX~fFOQ?m>kc4Zt6oH-cfKxzj2U@FYS2K{SCSOy zxKrF;CdHxJKBfDQiIj}oDj46iJEjE@$0g#qFSm! zMq^9OEE!khr%~4m7C9kW78is3H7wEnB+mv+e4$#~;^LwoZhn?rb*$CVt{iR=w&arQ zT%K3|J-uH2T?ax;;G+iTm^l8&wE#+S|*hFJqQOgYw1=pZanjt%etnk;O}Wmlz+EK#1!*!QHcG zsSmE}wVdyjH)%hnD!89as2w3+yn0N!#c8zy&<~-&#nr89tWVDa5&Rj)Myes9VFrAL zyO38lZCS;_?&A3@kII9jKmB{DV$pd+(ecCKE!m)hphK_lUt5*uRy4=ci#+>p2*20h zeWm;Rk>|x|pLCI89_z68U{{e}T4S0rLqg?^E{4SLU|_oI^677u)Q6i}mKstn_iyOc zcE7T3AvSM)M2T~g(PBws}h+8PNezoiCiR33Q3OC1TSM$ zIH7C0IM^6+R1acmG6?n9^s8H_4x;k-Gy+tTG4nH|lr6)-;1?eac})6Qx$;xYIbC{H z-ERL!b2a}Ur5;zl)%DAqdnt^8%;^06FzMCh%jYb8=T*EF49{F|+HCVXhGm&wdi+qA zSSEXNlP5P8?;uL=RV#6^(CIjhZm;xLL#DOy>qA&N|8QnSslP(;$M;))#cFTwl-?%; za%f}9MwI16W?GM7QDYZ$%u@V~VA95m2tqt2n@&74c)U@jRCe!+toqe)OsdSgH}pFn z`$J_s?*Wsh1~R&{;w!nKp88J~ymd=gxOekqU^P+S2%?`eBcO(o>c4nUwt zmEdo|0cvwg4_4Kw0*Ch>55U)Dxn=W{()#Y{RH{iJU*E+4jUvayD~3SMA`cU=V)bHq zcE+_%L&z%C^y5l4aEV)vE}8Jbbr0;#{xx_+&#*q`4Ak>8Q0{k%ybAE%tw_s*uuBbT zLrCJ>DZ~6=$rEAVQoZ&lBF^C>Mg{^MV~-%bCEx`>aENt~cL+|QBO!ktJdTz?q4^?Mv-CqFy%8B9S2*-RTn`zO;dr)z#4HF8$#Eu)$)Qep8Cnv}Y*-74!iyhxW;u(F zfA_oS$Mf#P>qwQsGfjI%B&@dM5SNmWHJQBDK zJp^VpyHIwK8%n-Aa~da02%Is>CR4i8E7~Vd|Gjaca@9XA&->R#(O$Kymh*>^{GzwH z)Y!3um_J$$&pVu3?Bq?FFlt(hzE(Zi_1~rAed2-qk-=w?%ro1M&7@NfcIQs$Hjgb_ z6P`!D>z#F`VSHbS+0cJ>{3eKJHtHc`C#EkSOZqYp<-&#`986Cn@3H~}mJ^Vf&2TKG z$Ser?-Sk`N zOuipK2RTVybg>`;lv_U4M|UiSr-V|Scq2c_y^$`Lg4yt2$g8?%k}nh~U5n4Z%0Km0 zY8C(OU^>(L*>@Xtgx!H-=B06jrS0U)iCw|s9o~1D`;$AxGMCwRQ)-_bCX_fcyM=O3 zryR-C)00znA^x-FSs}S7Io1>klMm7V#EgZPZO%rK9D=lS8sHI5GkdBzb6~_);g{0n z838tvmlkFortGYax#pRC%ebAfl^MhMaIph?hpS7Zt~6)M`RkvaOEFs?GX{?B{n^lN zFBzH&df#^m{K@j`2;)}}TEXjmOL$cI_C1@NdAE-Eb;$?kM$>AF$gzKg-)NmTwhRvW%-l_Xm?{E;9qD z>3XhrJiXDKE{cu@MzDq!7jE=4y#jOw_wNsrBWoDq;?%mk&O8cljyMY2*;}yKJO0oR z7}ofZ+%6yj1~pMqKx?ppl2c?qYT8ECVwxmdIf#S9*bg#+6u;{@>JVTWD+hbGAprh`3{kh!(Dd0&x+Q zJdq(l84C`i6Ce5LR2O35S@%OlcF5sKle28taMeIkUNcZlD||N_JYfpCo%KIc=dNdo%;%Uhz-A ze6Q43c(J$pb(t?;?Rn3`f>h5Mx2|9C(LAbG88`cKU(%<~Cj!3v*h6KzWquhg>1t*M zFQKWb5_aSe*9f-mmP#TO+5o59NaEnDe z69(=%h8=6$izPccR-CGBrYXyAQO_c;U!5+BwaA`<|EV_lWfvnc~1qT@K;1w_@0DR(lVN!x8WOaI3f`<%rrbB$;4{KluzpG6*Bzzk=qQVW z%^P+a^xaG39IblgftXNolAUItX3X?^9Nt>MV)Q0A~%-2~JD~n}CUGo}X%+Kn=qW4oaIKfJLeU zrI$=`;z4&xI3lOLput(mk*ji0xe}II@k|}nk}sa(vePx zG^d_Q1(;%S5}aO~yy;cy6D=tHEtY6LhgHM;MD6}vFK^sbbr7GOA6c1?tL*sJyq+xr zri$CTH>)!ddDIH4X1}_9lS7=tG_*zDOkUeGYpCRH4@5hR7AibkjJt`d?AZ?m34z;I z1)loSm|S;yhP(RnxIU~(U|yi6!qI>Q+OPfRqXVcPPfMSzy*sp)@9j1#KNVj7xADS+ z;L9^-hD$QAoef04rsC6IV-~80JO2KD^Sx71=*MDp_SlYC-@^GyETa%Tnpxr5OOVpmRf{L8}Z9VNf7e4SagMEquQ+^BYBPhsYy znwNzznK{@!C&orTF>mA~^b()$@SErPyOchaS1Wt$Id(f|GJC4^>YK%j zd0`V`>mIF)%#m!*AMYZYb1aU^$}l(NU((6)A&%FI$6FPBQ>35k2v>T~=qy_pjNJ*> z^uI3efBl8=SsfRzWcA9r`%f8M>1gvicJztF8tHd+#;)UFd8%qn3uhXUWasd5053g* zBDM`IsGExnP5PX;bJa-$Rn*d&XM046Ja1&L`t<(8{0GS%ZHhIm*t^D`KYCp;TrfU% za#<>SV?3WKpfHzRo4R=A*#-HT`bCs~q@B&cb0OIetkVuXWSzkA4qF+zyAw~~w4<6v zCET8#zFEAJKh+{XGW}x2kD&8MyrSudq~4L`zxqcVblUFp!}uoU>fBUn1RWA_4-A4B zPlT(Id;`@SZqz9XCvk0^TRA+FhlNM|3zye~B2rf|OVg zc1E@j&#It#7=`ZaI2*Y~fct+jY8_cm))yLn6>i|~d|$Tp*8QdX&+=MH?$E{MTk^Ps z?mN~eSc8}U7Jkwy-paawypO(n()j%EWXWN!&z}{E8Ew*Q0e99l!&UcM+QuJe#9k{{ z%{vQTm46pnsiFTsU;V4Kdp-9{Y>!{=qonJR;(u9v?MbP`k;zk9*N4egG5r^JbRYCK zTo8=GtdvE`|NU`8qq}|JPvK+F=-`{j%|F|V9E-odktUop7{874vG@A8eE+y&lkLP> z=|sn=FIMh+%T2zuC4r)9Q9lS_r5m1$k)MJOh6{Qh1;Djb#@63v#dYy6a86Y5SDU)H zb*V8LtG1hWe$Ax~r_Y(#uP%3q3Tz2@ivHr6e?eZ-CLbJ2ANGxT>HN5=e=>&IrlEJU z#l`tqsY_>p@5+kP1E-FZYw2e;0{2IC%|AR>SG5Srz3Bk^U+Kj=(`y2Arms?_Q`Fy#aAM2u@6Tzxr;vii**hrHu;eifzpXZZ!NTuvgfRSWA#)&y$m}o$iRj7$K-owvP)0;WGYJL;hQ@!>)@->UL3BS~5$P*5#u2SW0b#8?xUl zfAk?{?_98lCi3HcmB)K2*hhqaZv5~iaxcl?&!@e`Iv-$_xtRvFDjz`$;UtH)N4Lh~ zMXaqVUQ~3nsa(Cll5$u2WjLu@p=I#ZGt_LzGdb+@_Xs-y%3qh7d*v33*RNt(?0djw zHpQ>5BirL+v9V8v-}QXidEQ-o@s@zjWA9h`Z(AmiZ?4|{Se^00;Iyc8j(*mK=fh#! z>nC+jJalgP)Aq$F_+{DbV7dMmgab}=f%mnPp{;>kM=O8WsR+B-Jjs0tFE9VNg#N2n z_@ap??ul>{37Rb#PI@!>a;$x(0fldT0`KYsLBHrd~Fx4hb7Z7m$QZU1}u z3?|}*uk67ME@}J54NXRweTf{5VhbF#!GeZV@kjGFkOgxAh5y{n75sI*$QihCZQ%Ro zgZE*%FGBw|TvK_1|I_-d3Qc*mexgyaF#C%n;}7?Esj{$sW9HtaW$%B_9`g>;|oPYG=#uHz}q&1m(I2K`FDwEAq zIh&4X-i4E`tNmJFw|k} zN)@ZA#%}pvF572vN1q?ND$Eg9cN`w>m-<|*dH;(5?fUtt4zeJR_BZm_)rHCxT{r87 zj3Y0b+Pc>|Ib>#fy3b??dAZ0Wj_w>DAo24E6RRTIK?9wf6nL1yc?tF(5r5>v*G@X` zDIZgmqW=?F|6?@j-eg%ITNidaaP0L)T}8WUf-E-fM4R<`OtMKOLg0t8N!KzQxiCCCWB=sTwFjLky^PZJuH2vb zW~cA%3~s;w9I+_u1;m7PJ}eOyV-aESgazGt{I$mu{8maxqyjLCt2-x!>r`+GU#ID+ zK;H-}Wi7`RREz?E`qvm5BFnKwtM~P@-R?Z(Q4vX&Q`N!=_@fdRy6^fcUCCtMvnyRL zmEY64WvQSS9v&cl=lgY{$!ey7`r<$tkM*|C-}a&o*s6LWauZ%L$UllHBeXG+v(AO946<^8=lstOr_jenah%;&xP zeYf)&v-Qwg6BpRCSVG?*8L42^qca@L>Yo9D0qc>i1fA93!qnE(I) literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index 5690081ec3..d230786d4c 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -197,6 +197,8 @@ #include "code\citadel\cit_uniforms.dm" #include "code\citadel\cit_vendors.dm" #include "code\citadel\dogborgstuff.dm" +#include "code\citadel\hypospraymkii.dm" +#include "code\citadel\hypovial.dm" #include "code\citadel\plasmacases.dm" #include "code\citadel\crew_objectives\cit_crewobjectives_cargo.dm" #include "code\citadel\crew_objectives\cit_crewobjectives_civilian.dm" From 2c618b7fc55178f2cc3b150ca21f32e5a38ac48e Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 6 Mar 2018 03:56:22 -0600 Subject: [PATCH 32/45] Automatic changelog generation for PR #5722 [ci skip] --- html/changelogs/AutoChangeLog-pr-5722.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5722.yml diff --git a/html/changelogs/AutoChangeLog-pr-5722.yml b/html/changelogs/AutoChangeLog-pr-5722.yml new file mode 100644 index 0000000000..e3f570caa2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5722.yml @@ -0,0 +1,6 @@ +author: "Poojawa" +delete-after: True +changes: + - rscadd: "Hypospray mk IIs are being deployed to stations, these should provide an easier time for medical staff! They come with both inject and spray modes! Spray mode acts like a patch for applying meds" + - soundadd: "Hyposprays are fancy, you'll know when they're being used." + - server: "Due to fucky-ness, you'll need to unload, then reload the hypos at least once. just how it be." From 0afe9eb7c3c5a6123311c0d42c97cdd3c08a9df6 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Tue, 6 Mar 2018 03:59:11 -0600 Subject: [PATCH 33/45] All Maps now have Tesla as a primary engine (#5787) * Converts all stations except Omega to Tesla Engines * tweaks and meta fixes * removes an exploit * add some missing lights --- _maps/cit_map_files/BoxStation/BoxStation.dmm | 4220 ++++++----------- .../Deltastation/DeltaStation2.dmm | 604 ++- .../cit_map_files/MetaStation/MetaStation.dmm | 4213 +++++++--------- .../OmegaStation/OmegaStation.dmm | 215 +- .../PubbyStation/PubbyStation.dmm | 614 ++- _maps/map_files/BoxStation/BoxStation.dmm | 3875 ++++++--------- .../map_files/Deltastation/DeltaStation2.dmm | 433 +- _maps/map_files/MetaStation/MetaStation.dmm | 3468 ++++++-------- _maps/map_files/PubbyStation/PubbyStation.dmm | 200 +- code/modules/power/tesla/coil.dm | 4 +- tgstation.dme | 1 - 11 files changed, 6955 insertions(+), 10892 deletions(-) diff --git a/_maps/cit_map_files/BoxStation/BoxStation.dmm b/_maps/cit_map_files/BoxStation/BoxStation.dmm index 11646eaa1a..a0d27ff1da 100644 --- a/_maps/cit_map_files/BoxStation/BoxStation.dmm +++ b/_maps/cit_map_files/BoxStation/BoxStation.dmm @@ -78,7 +78,7 @@ /obj/item/device/plant_analyzer, /obj/machinery/camera{ c_tag = "Prison Common Room"; - network = list("SS13","Prison") + network = list("ss13","prison") }, /turf/open/floor/plasteel/green/side{ dir = 5 @@ -243,7 +243,7 @@ /obj/structure/lattice, /obj/structure/grille, /turf/open/space, -/area/space/nearstation) +/area/space) "aaU" = ( /obj/machinery/computer/arcade, /turf/open/floor/plasteel/floorgrime, @@ -758,8 +758,7 @@ }, /obj/machinery/camera{ c_tag = "Head of Security's Office"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/recharger{ pixel_y = 4 @@ -817,7 +816,7 @@ /obj/structure/bed, /obj/machinery/camera{ c_tag = "Prison Cell 3"; - network = list("SS13","Prison") + network = list("ss13","prison") }, /obj/item/device/radio/intercom{ desc = "Talk through this. It looks like it has been modified to not broadcast."; @@ -848,7 +847,7 @@ /obj/structure/bed, /obj/machinery/camera{ c_tag = "Prison Cell 2"; - network = list("SS13","Prison") + network = list("ss13","prison") }, /obj/item/device/radio/intercom{ desc = "Talk through this. It looks like it has been modified to not broadcast."; @@ -870,7 +869,7 @@ /obj/structure/bed, /obj/machinery/camera{ c_tag = "Prison Cell 1"; - network = list("SS13","Prison") + network = list("ss13","prison") }, /obj/item/device/radio/intercom{ desc = "Talk through this. It looks like it has been modified to not broadcast."; @@ -1605,7 +1604,7 @@ /obj/machinery/computer/security/telescreen{ desc = "Used for watching Prison Wing holding areas."; name = "Prison Monitor"; - network = list("Prison"); + network = list("prison"); pixel_y = 30 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -1644,7 +1643,7 @@ /obj/machinery/computer/security/telescreen{ desc = "Used for watching Prison Wing holding areas."; name = "Prison Monitor"; - network = list("Prison"); + network = list("prison"); pixel_y = 30 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -1652,7 +1651,7 @@ }, /obj/machinery/camera{ c_tag = "Prison Hallway"; - network = list("SS13","Prison") + network = list("ss13","prison") }, /turf/open/floor/plasteel/red/side{ dir = 1 @@ -1801,8 +1800,7 @@ "aeC" = ( /obj/machinery/camera{ c_tag = "Security Escape Pod"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plating, /area/security/main) @@ -2441,10 +2439,6 @@ }, /turf/open/floor/plating, /area/security/main) -"agd" = ( -/obj/machinery/atmospherics/pipe/manifold4w/general/visible, -/turf/open/floor/plasteel, -/area/engine/atmos) "agf" = ( /obj/structure/table, /obj/item/stack/sheet/metal, @@ -3441,8 +3435,7 @@ "aiq" = ( /obj/machinery/camera{ c_tag = "Security Office"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/machinery/computer/secure_data{ dir = 1 @@ -3865,7 +3858,7 @@ }, /obj/machinery/computer/security{ name = "Labor Camp Monitoring"; - network = list("Labor") + network = list("labor") }, /turf/open/floor/plasteel, /area/security/processing) @@ -7388,7 +7381,7 @@ /obj/machinery/camera{ c_tag = "Auxillary Mining Base"; dir = 8; - network = list("SS13","AuxBase") + network = list("ss13","auxbase") }, /turf/open/floor/plating, /area/shuttle/auxillary_base) @@ -7673,8 +7666,7 @@ /obj/structure/table/wood, /obj/machinery/camera{ c_tag = "Law Office"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/item/paper_bin{ pixel_x = -3; @@ -7685,7 +7677,7 @@ desc = "Used for watching Prison Wing holding areas."; dir = 1; name = "Prison Monitor"; - network = list("Prison"); + network = list("prison"); pixel_y = -27 }, /turf/open/floor/wood, @@ -8915,7 +8907,7 @@ desc = "Used for the Auxillary Mining Base."; dir = 8; name = "Auxillary Base Monitor"; - network = list("AuxBase"); + network = list("auxbase"); pixel_x = 28 }, /turf/open/floor/plasteel/yellow/side{ @@ -10504,8 +10496,7 @@ "aBh" = ( /obj/machinery/camera{ c_tag = "EVA Maintenance"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/light/small{ dir = 4 @@ -10973,8 +10964,7 @@ "aCp" = ( /obj/machinery/camera{ c_tag = "Arrivals North"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/structure/cable{ icon_state = "1-2" @@ -11963,8 +11953,7 @@ "aER" = ( /obj/machinery/camera{ c_tag = "Gateway"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/structure/table, /obj/structure/sign/warning/biohazard{ @@ -12319,8 +12308,7 @@ "aFO" = ( /obj/machinery/camera{ c_tag = "Garden"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/airalarm{ dir = 8; @@ -12435,7 +12423,7 @@ /obj/machinery/camera/motion{ c_tag = "Vault"; dir = 1; - network = list("MiniSat") + network = list("minisat") }, /obj/machinery/light, /turf/open/floor/plasteel/vault/corner{ @@ -12933,8 +12921,7 @@ }, /obj/machinery/camera{ c_tag = "Chapel Office"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/grimy, /area/chapel/office) @@ -13432,8 +13419,7 @@ /obj/structure/chair/office/dark, /obj/machinery/camera{ c_tag = "Library North"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -15079,8 +15065,7 @@ "aMM" = ( /obj/machinery/camera{ c_tag = "Chapel North"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/dark, /area/chapel/main) @@ -16856,8 +16841,7 @@ "aRP" = ( /obj/machinery/camera{ c_tag = "Library South"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/wood, /area/library) @@ -16972,8 +16956,7 @@ "aSf" = ( /obj/machinery/camera{ c_tag = "Arrivals Hallway"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) @@ -17276,8 +17259,7 @@ }, /obj/machinery/camera{ c_tag = "Bar"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/structure/table, /obj/machinery/chem_dispenser/drinks, @@ -17465,8 +17447,7 @@ }, /obj/machinery/camera{ c_tag = "Locker Room East"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/light{ dir = 4 @@ -17607,7 +17588,7 @@ /area/bridge) "aUd" = ( /obj/machinery/computer/security/mining{ - network = list("MINE","AuxBase") + network = list("mine","auxbase") }, /turf/open/floor/plasteel/brown{ dir = 6 @@ -17626,8 +17607,7 @@ }, /obj/machinery/camera{ c_tag = "Bar West"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/bar, /area/crew_quarters/bar) @@ -17756,8 +17736,7 @@ "aUy" = ( /obj/machinery/camera{ c_tag = "Vacant Office"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/wood, /area/security/vacantoffice) @@ -17843,8 +17822,7 @@ "aUM" = ( /obj/machinery/camera{ c_tag = "Arrivals Bay 2"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) @@ -18006,8 +17984,7 @@ }, /obj/machinery/camera{ c_tag = "Fore Primary Hallway"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel/red/corner{ @@ -18336,8 +18313,7 @@ "aVV" = ( /obj/machinery/camera{ c_tag = "Chapel South"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/dark, /area/chapel/main) @@ -19613,8 +19589,7 @@ "aYT" = ( /obj/machinery/camera{ c_tag = "Hydroponics South"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/structure/reagent_dispensers/watertank/high, /turf/open/floor/plasteel, @@ -19739,8 +19714,7 @@ "aZm" = ( /obj/machinery/camera{ c_tag = "Escape Arm Airlocks"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -20486,8 +20460,7 @@ "bbr" = ( /obj/machinery/camera{ c_tag = "Locker Room South"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, @@ -20554,8 +20527,7 @@ "bbA" = ( /obj/machinery/camera{ c_tag = "Starboard Primary Hallway 2"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/white/corner{ dir = 1 @@ -20846,8 +20818,7 @@ "bcr" = ( /obj/machinery/camera{ c_tag = "Starboard Primary Hallway"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) @@ -20884,8 +20855,7 @@ "bcx" = ( /obj/machinery/camera{ c_tag = "Starboard Primary Hallway 5"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) @@ -21155,8 +21125,7 @@ "bdn" = ( /obj/machinery/camera{ c_tag = "Central Hallway East"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/structure/disposalpipe/segment, /obj/machinery/status_display{ @@ -22443,8 +22412,7 @@ }, /obj/machinery/camera{ c_tag = "Cargo Delivery Office"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/requests_console{ department = "Cargo Bay"; @@ -22628,8 +22596,7 @@ "bhc" = ( /obj/machinery/camera{ c_tag = "Chemistry"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/machinery/firealarm{ dir = 2; @@ -22668,8 +22635,7 @@ "bhj" = ( /obj/machinery/camera{ c_tag = "Security Post - Medbay"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/machinery/requests_console{ department = "Security"; @@ -23335,7 +23301,7 @@ /obj/machinery/camera{ c_tag = "Robotics Lab"; dir = 2; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/machinery/button/door{ dir = 2; @@ -23377,8 +23343,7 @@ "biS" = ( /obj/machinery/camera{ c_tag = "Research Division Access"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/structure/sink{ dir = 4; @@ -23417,7 +23382,7 @@ /obj/machinery/camera{ c_tag = "Research and Development"; dir = 2; - network = list("SS13","RD"); + network = list("ss13","rd"); pixel_x = 22 }, /obj/machinery/button/door{ @@ -23657,8 +23622,7 @@ "bjy" = ( /obj/machinery/camera{ c_tag = "Gravity Generator Room"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -23858,8 +23822,7 @@ "bkb" = ( /obj/machinery/camera{ c_tag = "Medbay Morgue"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/airalarm{ dir = 8; @@ -24384,8 +24347,7 @@ /obj/structure/table/reinforced, /obj/machinery/camera{ c_tag = "Medbay Foyer"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/cell_charger, /turf/open/floor/plasteel/white, @@ -25488,7 +25450,7 @@ /obj/machinery/computer/security/telescreen{ desc = "Used for watching Prison Wing holding areas."; name = "Prison Monitor"; - network = list("Prison"); + network = list("prison"); pixel_y = 30 }, /obj/machinery/disposal/bin, @@ -26785,8 +26747,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay West"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -27065,7 +27026,7 @@ /obj/machinery/camera{ c_tag = "Experimentor Lab"; dir = 2; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/item/hand_labeler, /obj/item/stack/packageWrap, @@ -27194,8 +27155,7 @@ /obj/item/device/multitool, /obj/machinery/camera{ c_tag = "Cargo Office"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel, /area/quartermaster/office) @@ -27473,7 +27433,6 @@ /obj/machinery/camera{ c_tag = "Medbay East"; dir = 8; - network = list("SS13"); pixel_y = -22 }, /turf/open/floor/plasteel/white, @@ -27654,7 +27613,7 @@ /obj/machinery/camera{ c_tag = "Robotics Lab - South"; dir = 1; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/white, /area/science/robotics/lab) @@ -27935,8 +27894,7 @@ "btA" = ( /obj/machinery/camera{ c_tag = "Research Division West"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -28796,7 +28754,7 @@ /obj/machinery/camera{ c_tag = "Genetics Research"; dir = 1; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/machinery/firealarm{ dir = 1; @@ -28831,7 +28789,6 @@ /obj/machinery/camera{ c_tag = "Genetics Access"; dir = 8; - network = list("SS13"); pixel_y = -22 }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ @@ -29065,8 +29022,7 @@ "bwf" = ( /obj/machinery/camera{ c_tag = "Cargo Bay Entrance"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/brown/corner{ @@ -29288,8 +29244,7 @@ /obj/structure/table/glass, /obj/machinery/camera{ c_tag = "Medbay Cryogenics"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/item/reagent_containers/glass/beaker/cryoxadone, /obj/item/reagent_containers/glass/beaker/cryoxadone, @@ -29307,8 +29262,7 @@ "bwL" = ( /obj/machinery/camera{ c_tag = "Genetics Cloning"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/structure/table, /obj/machinery/firealarm{ @@ -29563,7 +29517,7 @@ /obj/machinery/computer/security/telescreen{ desc = "Used for watching the RD's goons and the AI's satellite from the safety of his office."; name = "Research Monitor"; - network = list("RD","MiniSat"); + network = list("rd","minisat"); pixel_y = 2 }, /obj/structure/table, @@ -30206,7 +30160,7 @@ }, /obj/machinery/computer/security/mining{ dir = 8; - network = list("MINE","AuxBase") + network = list("mine","auxbase") }, /turf/open/floor/plasteel/red/side{ dir = 4 @@ -30503,7 +30457,7 @@ /obj/machinery/camera{ c_tag = "Server Room"; dir = 2; - network = list("SS13","RD"); + network = list("ss13","rd"); pixel_x = 22 }, /obj/machinery/power/apc{ @@ -30558,7 +30512,7 @@ /obj/machinery/computer/security/telescreen{ desc = "Used for watching the RD's goons from the safety of your own office."; name = "Research Monitor"; - network = list("RD"); + network = list("rd"); pixel_y = 2 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -30879,8 +30833,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay Treatment Center"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel, /area/medical/sleeper) @@ -30983,7 +30936,7 @@ /obj/machinery/camera{ c_tag = "Security Post - Science"; dir = 4; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/machinery/newscaster{ pixel_x = -30 @@ -31100,7 +31053,7 @@ "bAS" = ( /obj/machinery/computer/security/mining{ dir = 4; - network = list("MINE","AuxBase") + network = list("mine","auxbase") }, /obj/machinery/camera{ c_tag = "Quartermaster's Office"; @@ -31671,7 +31624,7 @@ /obj/machinery/camera{ c_tag = "Research Director's Office"; dir = 1; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/item/device/radio/intercom{ name = "Station Intercom (General)"; @@ -31708,7 +31661,7 @@ /obj/machinery/camera{ c_tag = "Experimentor Lab Chamber"; dir = 1; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/machinery/light, /obj/structure/sign/warning/nosmoking{ @@ -31915,8 +31868,7 @@ /obj/structure/closet/secure_closet/medical3, /obj/machinery/camera{ c_tag = "Medbay Storage"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/white, /area/medical/sleeper) @@ -31998,8 +31950,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay South"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) @@ -32291,8 +32242,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay Recovery Room"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/iv_drip, /turf/open/floor/plasteel/white, @@ -32538,7 +32488,6 @@ /obj/machinery/camera{ c_tag = "Chief Medical Office"; dir = 8; - network = list("SS13"); pixel_y = -22 }, /turf/open/floor/plasteel/barber, @@ -32550,7 +32499,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Test Chamber"; dir = 2; - network = list("Xeno","RD") + network = list("xeno","rd") }, /obj/machinery/light{ dir = 1 @@ -32641,7 +32590,7 @@ /obj/machinery/camera{ c_tag = "Toxins Lab West"; dir = 2; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/stripes/line{ dir = 2 @@ -32751,12 +32700,11 @@ /area/maintenance/port/fore) "bEK" = ( /obj/machinery/computer/security/mining{ - network = list("MINE","AuxBase") + network = list("mine","auxbase") }, /obj/machinery/camera{ c_tag = "Mining Dock"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel, /area/quartermaster/miningdock) @@ -33293,7 +33241,7 @@ /turf/open/floor/plating, /area/science/mixing) "bGd" = ( -/obj/machinery/doppler_array{ +/obj/machinery/doppler_array/research/science{ dir = 4 }, /obj/effect/turf_decal/bot{ @@ -33737,7 +33685,7 @@ /obj/machinery/camera{ c_tag = "Toxins Storage"; dir = 4; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/floorgrime, /area/science/storage) @@ -33872,7 +33820,7 @@ dir = 8; layer = 4; name = "Test Chamber Telescreen"; - network = list("Toxins"); + network = list("toxins"); pixel_x = 30 }, /obj/effect/turf_decal/stripes/line{ @@ -33991,8 +33939,7 @@ "bHL" = ( /obj/machinery/camera{ c_tag = "Research Division South"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/door/firedoor/heavy, /turf/open/floor/plasteel/white/side{ @@ -34036,8 +33983,7 @@ /obj/structure/disposalpipe/segment, /obj/machinery/camera{ c_tag = "Aft Primary Hallway 2"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/caution/corner{ @@ -34134,7 +34080,6 @@ /obj/machinery/camera{ c_tag = "Surgery Operating"; dir = 1; - network = list("SS13"); pixel_x = 22 }, /obj/machinery/light, @@ -35522,7 +35467,7 @@ "bKY" = ( /obj/machinery/computer/security/telescreen{ name = "Test Chamber Monitor"; - network = list("Xeno"); + network = list("xeno"); pixel_y = 2 }, /obj/structure/table/reinforced, @@ -35686,7 +35631,7 @@ invuln = 1; light = null; name = "Hardened Bomb-Test Camera"; - network = list("Toxins"); + network = list("toxins"); use_power = 0 }, /obj/item/target/alien/anchored, @@ -36533,7 +36478,7 @@ /obj/machinery/camera{ c_tag = "Toxins Lab East"; dir = 8; - network = list("SS13","RD"); + network = list("ss13","rd"); pixel_y = -22 }, /obj/effect/turf_decal/stripes/line{ @@ -36663,8 +36608,7 @@ }, /obj/machinery/camera{ c_tag = "Atmospherics Monitoring"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/machinery/light{ dir = 4 @@ -36683,8 +36627,7 @@ "bNT" = ( /obj/machinery/camera{ c_tag = "Atmospherics North West"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/light{ dir = 8 @@ -36833,8 +36776,7 @@ /obj/structure/closet/emcloset, /obj/machinery/camera{ c_tag = "Virology Airlock"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -37750,8 +37692,7 @@ "bQq" = ( /obj/machinery/camera{ c_tag = "Security Post - Engineering"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/item/device/radio/intercom{ dir = 4; @@ -37924,7 +37865,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology North"; dir = 8; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -37961,7 +37902,7 @@ /obj/machinery/camera{ c_tag = "Testing Lab North"; dir = 2; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel, /area/science/misc_lab) @@ -38009,7 +37950,7 @@ desc = "Used for watching the RD's goons from the safety of his office."; dir = 2; name = "Research Monitor"; - network = list("RD"); + network = list("rd"); pixel_y = 28 }, /obj/item/device/integrated_circuit_printer, @@ -38134,7 +38075,7 @@ dir = 8; layer = 4; name = "Engine Monitor"; - network = list("Engine"); + network = list("singularity"); pixel_x = 30 }, /turf/open/floor/plasteel/red/side{ @@ -38560,8 +38501,7 @@ /obj/structure/closet/emcloset, /obj/machinery/camera{ c_tag = "Telecomms Monitoring"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, @@ -38903,7 +38843,7 @@ /obj/item/crowbar, /obj/machinery/computer/security/telescreen{ name = "Test Chamber Monitor"; - network = list("Test"); + network = list("test"); pixel_y = -30 }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, @@ -39941,8 +39881,7 @@ "bVN" = ( /obj/machinery/camera{ c_tag = "Atmospherics Access"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/light{ dir = 8 @@ -40367,8 +40306,7 @@ }, /obj/machinery/camera{ c_tag = "Atmospherics West"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/structure/cable{ icon_state = "1-2" @@ -40397,9 +40335,6 @@ /obj/machinery/light{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/atmos) "bWV" = ( @@ -40640,11 +40575,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/science/circuit) -"bXu" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "bXv" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -40828,8 +40758,7 @@ "bXV" = ( /obj/machinery/camera{ c_tag = "Atmospherics East"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/atmospherics/components/binary/pump{ dir = 8; @@ -41237,7 +41166,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology South"; dir = 4; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/white, /area/science/xenobiology) @@ -41881,8 +41810,7 @@ }, /obj/machinery/camera{ c_tag = "Atmospherics Central"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/atmospherics/components/binary/pump{ dir = 0; @@ -42184,8 +42112,7 @@ "cbl" = ( /obj/machinery/camera{ c_tag = "Telecomms Server Room"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/dark/telecomms/mainframe, /area/tcommsat/server) @@ -42267,7 +42194,6 @@ /obj/machinery/camera{ c_tag = "Aft Primary Hallway 1"; dir = 8; - network = list("SS13"); pixel_y = -22 }, /turf/open/floor/plasteel/yellow/corner{ @@ -42499,7 +42425,7 @@ /obj/machinery/camera{ c_tag = "Testing Chamber"; dir = 1; - network = list("Test","RD") + network = list("test","rd") }, /obj/machinery/light, /turf/open/floor/engine, @@ -42537,7 +42463,7 @@ desc = "Used for watching the RD's goons from the safety of his office."; dir = 1; name = "Research Monitor"; - network = list("RD"); + network = list("rd"); pixel_y = -28 }, /obj/item/device/integrated_circuit_printer, @@ -43473,8 +43399,7 @@ "cex" = ( /obj/machinery/camera{ c_tag = "Atmospherics South West"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 @@ -43794,7 +43719,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Kill Room"; dir = 4; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/circuit/killroom, /area/science/xenobiology) @@ -43895,16 +43820,6 @@ dir = 5 }, /area/crew_quarters/heads/chief) -"cfI" = ( -/obj/structure/closet/secure_closet/engineering_personal, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel/yellow/side{ - dir = 4 - }, -/area/engine/engineering) "cfJ" = ( /obj/machinery/light/small{ dir = 1 @@ -44207,13 +44122,13 @@ /area/engine/engineering) "cgw" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/engine/engineering) -"cgx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/closed/wall/r_wall, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, /area/engine/engineering) "cgy" = ( /obj/machinery/light/small{ @@ -44283,32 +44198,22 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"cgI" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) "cgJ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, /area/engine/engineering) "cgK" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) -"cgL" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine Room"; - req_access_txt = "10" - }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) "cgO" = ( /obj/structure/rack, @@ -44322,17 +44227,6 @@ dir = 5 }, /area/crew_quarters/heads/chief) -"cgQ" = ( -/obj/machinery/camera{ - c_tag = "Engineering East"; - dir = 8; - network = list("SS13") - }, -/obj/structure/closet/wardrobe/engineering_yellow, -/turf/open/floor/plasteel/yellow/corner{ - dir = 4 - }, -/area/engine/engineering) "cgR" = ( /turf/open/floor/plasteel, /area/engine/engineering) @@ -44693,25 +44587,24 @@ /turf/open/floor/plasteel, /area/engine/engineering) "chF" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" +/obj/effect/landmark/start/station_engineer, +/obj/structure/chair/office/dark{ + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, /area/engine/engineering) "chG" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) "chH" = ( /obj/structure/closet/firecloset, @@ -44809,35 +44702,15 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"chV" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/table/reinforced, -/obj/item/tank/internals/emergency_oxygen/engi{ - pixel_x = 5 - }, -/obj/item/clothing/gloves/color/black, -/obj/item/clothing/glasses/meson/engine, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) "chX" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/structure/cable/yellow{ + icon_state = "2-8" }, -/turf/open/floor/engine, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, /area/engine/engineering) "chY" = ( /obj/machinery/shieldgen, @@ -44921,24 +44794,6 @@ "cig" = ( /turf/closed/wall, /area/engine/engineering) -"cii" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/table/reinforced, -/obj/item/clothing/suit/radiation, -/obj/item/clothing/head/radiation, -/obj/item/clothing/glasses/meson, -/obj/item/device/geiger_counter, -/obj/item/device/geiger_counter, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) "cij" = ( /obj/machinery/modular_computer/console/preset/engineering, /obj/structure/cable{ @@ -44976,15 +44831,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/crew_quarters/heads/chief) -"cip" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/engine, -/area/engine/engineering) "ciq" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -44994,13 +44840,6 @@ }, /turf/open/floor/plating, /area/crew_quarters/heads/chief) -"cir" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) "cis" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel, @@ -45128,7 +44967,7 @@ /obj/machinery/camera{ c_tag = "Turbine Chamber"; dir = 4; - network = list("Turbine") + network = list("turbine") }, /turf/open/floor/engine/vacuum, /area/maintenance/disposal/incinerator) @@ -45141,14 +44980,18 @@ /turf/open/floor/plasteel, /area/engine/engineering) "ciO" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/item/book/manual/engineering_singularity_safety{ + pixel_x = 3; + pixel_y = 3 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/obj/item/book/manual/wiki/engineering_guide, +/obj/item/book/manual/engineering_particle_accelerator{ + pixel_x = -3; + pixel_y = -3 }, -/turf/open/floor/engine, +/obj/item/clothing/gloves/color/yellow, +/obj/structure/table/glass, +/turf/open/floor/plasteel, /area/engine/engineering) "ciP" = ( /obj/structure/cable{ @@ -45286,17 +45129,10 @@ }, /obj/machinery/camera{ c_tag = "Chief Engineer's Office"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/vault, /area/crew_quarters/heads/chief) -"cjh" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "cji" = ( /obj/structure/cable{ icon_state = "1-2" @@ -45335,8 +45171,7 @@ "cjl" = ( /obj/machinery/camera{ c_tag = "Engineering MiniSat Access"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -45515,8 +45350,7 @@ }, /obj/machinery/camera{ c_tag = "Engineering Secure Storage"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plating, /area/engine/engineering) @@ -45531,7 +45365,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side{ + dir = 6 + }, /area/engine/engineering) "cjP" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -45574,7 +45410,7 @@ desc = "Used for watching the RD's goons from the safety of your own office."; dir = 4; name = "Research Monitor"; - network = list("RD"); + network = list("rd"); pixel_x = -24 }, /turf/open/floor/plasteel/vault, @@ -46197,8 +46033,7 @@ /obj/structure/chair/stool, /obj/machinery/camera{ c_tag = "Aft Starboard Solar Control"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plating, /area/maintenance/solars/starboard/aft) @@ -46759,8 +46594,7 @@ }, /obj/machinery/camera{ c_tag = "SMES Room"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/plasteel/dark, @@ -46788,8 +46622,7 @@ "cnt" = ( /obj/machinery/camera{ c_tag = "Engineering West"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/structure/cable{ icon_state = "1-2" @@ -46805,16 +46638,11 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cnx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/structure/chair/sofa/left{ + icon_state = "sofaend_left"; dir = 4 }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) "cny" = ( /obj/effect/landmark/start/station_engineer, @@ -46999,8 +46827,7 @@ }, /obj/machinery/camera{ c_tag = "SMES Access"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 @@ -47049,15 +46876,12 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cnZ" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/airalarm{ - pixel_y = 23 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/engine/engineering) "coa" = ( @@ -47071,25 +46895,32 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cob" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" }, /turf/open/floor/plasteel, /area/engine/engineering) "coc" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine Room"; - req_access_txt = "10" +/obj/structure/table, +/obj/item/electronics/airlock, +/obj/item/electronics/airlock, +/obj/item/electronics/apc, +/obj/item/stock_parts/cell/high/plus, +/obj/item/stock_parts/cell/high/plus, +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/open/floor/engine, +/obj/item/stack/cable_coil, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, /area/engine/engineering) "cop" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/on{ @@ -47258,38 +47089,27 @@ /turf/open/floor/plasteel, /area/engine/engineering) "coK" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) -"coL" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/structure/cable{ icon_state = "1-2" }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"coM" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, +/obj/structure/chair/office/dark, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, +/area/engine/engineering) +"coL" = ( +/obj/structure/chair/office/dark, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, /area/engine/engineering) "coS" = ( /obj/structure/rack, @@ -47455,50 +47275,37 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cpt" = ( -/obj/structure/table, +/turf/open/floor/plasteel/yellow/side{ + dir = 8 + }, +/area/engine/engineering) +"cpu" = ( +/obj/item/book/manual/wiki/engineering_hacking{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/book/manual/wiki/engineering_construction, /obj/item/clothing/gloves/color/yellow, -/obj/item/storage/toolbox/electrical{ - pixel_y = 5 +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/table/glass, +/obj/item/device/flashlight, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cpx" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/closet/radiation, +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, /turf/open/floor/plasteel, /area/engine/engineering) -"cpu" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine Room"; - req_access_txt = "10" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cpv" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cpx" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/engine, -/area/engine/engineering) "cpy" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/engine, +/obj/structure/sign/warning/radiation/rad_area, +/turf/closed/wall/r_wall, /area/engine/engineering) "cpA" = ( /obj/structure/chair/office/dark{ @@ -47513,19 +47320,17 @@ /turf/open/floor/plasteel, /area/bridge) "cpD" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/structure/closet/secure_closet/engineering_welding, +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) "cpE" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 }, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "cpG" = ( /obj/structure/table/optable, @@ -47660,8 +47465,7 @@ "cpV" = ( /obj/machinery/camera{ c_tag = "Engineering Storage"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/rnd/protolathe/department/engineering, /turf/open/floor/plasteel, @@ -47683,133 +47487,72 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"cpZ" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical{ - pixel_y = 5 - }, -/obj/item/device/flashlight{ - pixel_x = 1; - pixel_y = 5 - }, -/obj/item/device/flashlight{ - pixel_x = 1; - pixel_y = 5 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "cqa" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cqb" = ( +/obj/structure/table, +/obj/machinery/cell_charger, /obj/structure/cable{ icon_state = "1-2" }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) -"cqc" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +"cqb" = ( +/obj/structure/chair/sofa/right{ + icon_state = "sofaend_right"; + dir = 4 }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) "cqd" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/green/visible{ +/obj/structure/closet/radiation, +/obj/structure/extinguisher_cabinet{ + pixel_x = 27 + }, +/obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/engine, -/area/engine/engineering) -"cqe" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 6 - }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) "cqf" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 +/obj/effect/turf_decal/stripes/line{ + dir = 9 }, -/turf/open/floor/engine, +/turf/open/floor/plating, /area/engine/engineering) "cqg" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Gas to Filter"; - on = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cqh" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -26 - }, /obj/machinery/camera{ - c_tag = "Engineering Supermatter Fore"; - dir = 1; - network = list("SS13","Engine"); + c_tag = "Engineering Center"; + dir = 2; + network = list("ss13","engine"); pixel_x = 23 }, -/obj/machinery/atmospherics/pipe/manifold/green/visible{ +/obj/machinery/light{ dir = 1 }, -/turf/open/floor/engine, -/area/engine/engineering) -"cqi" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cqj" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/button/door{ - id = "engsm"; - name = "Radiation Shutters Control"; - pixel_y = -24; - req_access_txt = "10" - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/engine, +/turf/open/floor/plating, /area/engine/engineering) -"cql" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, +"cqh" = ( /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/engine, +/turf/open/floor/plating, /area/engine/engineering) -"cqm" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 +"cqi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 }, -/obj/machinery/meter, -/turf/open/floor/plasteel, +/turf/open/floor/plating, +/area/engine/engineering) +"cqj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, /area/engine/engineering) "cqn" = ( /obj/structure/grille, @@ -47827,8 +47570,7 @@ "cqp" = ( /obj/machinery/camera{ c_tag = "Engineering Escape Pod"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plating, /area/engine/engineering) @@ -47906,54 +47648,39 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"cqA" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/airlock/external{ - name = "Engineering External Access"; - req_access = null; - req_access_txt = "10;13" +"cqC" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cqD" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, /turf/open/floor/plating, /area/engine/engineering) -"cqB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, +"cqE" = ( +/obj/structure/particle_accelerator/end_cap, +/turf/open/floor/plating, +/area/engine/engineering) +"cqF" = ( /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/open/floor/engine, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plating, /area/engine/engineering) -"cqC" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = 24 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cqD" = ( -/obj/structure/sign/warning/radiation, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"cqE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/engineering/glass{ - heat_proof = 1; - name = "Supermatter Chamber"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/engine, -/area/engine/supermatter) -"cqF" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/closed/wall/r_wall, -/area/engine/supermatter) "cqG" = ( /obj/structure/rack, /obj/item/storage/box/rubbershot{ @@ -48041,70 +47768,49 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cqS" = ( -/obj/machinery/light/small{ - dir = 8 +/turf/open/floor/plasteel/yellow/side{ + dir = 10 }, -/obj/structure/closet/emcloset/anchored, -/turf/open/floor/plating, /area/engine/engineering) "cqT" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 - }, -/turf/open/floor/plating, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "cqU" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 +/obj/machinery/button/door{ + id = "Singularity"; + name = "Shutters Control"; + pixel_x = 25; + req_access_txt = "11" }, -/obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister, -/turf/open/floor/plasteel/dark, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "cqY" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/engine/engineering) "cqZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/engine, -/area/engine/supermatter) -"cra" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Gas to Filter" - }, -/obj/machinery/airalarm/engine{ - dir = 4; - pixel_x = -23 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/engine, -/area/engine/supermatter) -"crb" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 2; - icon_state = "pump_map"; - name = "Gas to Chamber" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/engine, -/area/engine/supermatter) -"crc" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/engine, +/obj/structure/particle_accelerator/fuel_chamber, +/turf/open/floor/plating, /area/engine/engineering) -"crd" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine Room"; - req_access_txt = "10" +"cra" = ( +/obj/machinery/particle_accelerator/control_box, +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/engine/engineering) +"crb" = ( +/obj/effect/landmark/start/station_engineer, +/turf/open/floor/plating, +/area/engine/engineering) +"crc" = ( +/obj/machinery/camera/emp_proof{ + c_tag = "Engine Containment Starboard Fore"; + dir = 2; + network = list("engine") }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating/airless, /area/engine/engineering) "crh" = ( /obj/effect/turf_decal/stripes/line{ @@ -48167,40 +47873,38 @@ /turf/open/floor/plating, /area/engine/engineering) "crs" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 6 +/obj/item/stack/cable_coil{ + pixel_x = 3; + pixel_y = -7 }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) +/obj/item/stack/cable_coil{ + pixel_x = 3; + pixel_y = -7 + }, +/obj/item/crowbar, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/engineering) "crt" = ( -/obj/machinery/door/airlock/engineering/glass{ - heat_proof = 1; - name = "Supermatter Chamber"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/supermatter) +/obj/structure/particle_accelerator/power_box, +/turf/open/floor/plating, +/area/engine/engineering) "cru" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 - }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"crv" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) +/obj/item/screwdriver, +/turf/open/floor/plating, +/area/engine/engineering) "crw" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side{ + dir = 4 + }, /area/engine/engineering) "cry" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -48288,43 +47992,34 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/solar/starboard/aft) -"crH" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) "crI" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 9 - }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"crJ" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"crK" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ - dir = 8 - }, -/turf/closed/wall/r_wall, +/obj/structure/chair/stool, +/turf/open/floor/plating, /area/engine/engineering) -"crL" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 +"crJ" = ( +/obj/machinery/light/small{ + dir = 8; + light_color = "#fff4bc" }, -/turf/open/floor/plasteel/dark, +/obj/structure/closet/emcloset/anchored, +/turf/open/floor/plating, +/area/engine/engineering) +"crK" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 + }, +/turf/open/floor/plating, /area/engine/engineering) "crM" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 1 +/obj/machinery/light/small{ + dir = 4; + light_color = "#fff4bc" }, -/turf/open/floor/plasteel/dark, +/obj/structure/closet/emcloset/anchored, +/turf/open/floor/plating, /area/engine/engineering) "crP" = ( /obj/machinery/light, @@ -48337,25 +48032,12 @@ }, /turf/open/floor/plating, /area/engine/engineering) -"crT" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"crU" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 10 - }, -/turf/open/space, -/area/space/nearstation) "crV" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 8 +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "2-8" }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating/airless, /area/engine/engineering) "crW" = ( /obj/machinery/light/small{ @@ -48375,38 +48057,29 @@ /obj/structure/transit_tube, /turf/open/floor/plating, /area/engine/engineering) -"crZ" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) "csa" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating/airless, /area/engine/engineering) "csb" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 9 +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "2-4" }, -/turf/open/space, -/area/space/nearstation) +/turf/open/floor/plating/airless, +/area/engine/engineering) "csc" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/open/space, /area/maintenance/aft) "csd" = ( -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cse" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 8 +/obj/structure/cable{ + icon_state = "1-4" }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating/airless, /area/engine/engineering) "csg" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -48425,13 +48098,6 @@ }, /turf/open/space, /area/space/nearstation) -"csj" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/engine/engineering) "csk" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plating/airless, @@ -48462,7 +48128,7 @@ desc = "Used for watching the turbine vent."; dir = 1; name = "turbine vent monitor"; - network = list("Turbine"); + network = list("turbine"); pixel_y = -29 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ @@ -48492,26 +48158,22 @@ /turf/open/floor/plasteel/floorgrime, /area/maintenance/disposal/incinerator) "css" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/turf/open/space, -/area/space/nearstation) -"csu" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"csv" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 5 +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "csx" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/turf/open/space, -/area/space/nearstation) +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/grille, +/turf/open/floor/plating/airless, +/area/engine/engineering) "csy" = ( /obj/structure/table, /obj/item/weldingtool, @@ -48520,19 +48182,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"csA" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) "csD" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -48544,24 +48193,6 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/solar/starboard/aft) -"csH" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"csI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) "csM" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/yellow/visible, @@ -48579,27 +48210,9 @@ /area/ai_monitored/turret_protected/aisat_interior) "csP" = ( /obj/effect/turf_decal/stripes/line{ - dir = 4 + dir = 1 }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/green/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"csR" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/engine, +/turf/open/floor/plating/airless, /area/engine/engineering) "csT" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -48696,7 +48309,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Pod Access"; dir = 1; - network = list("MiniSat"); + network = list("minisat"); start_active = 1 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, @@ -48978,7 +48591,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Teleporter"; dir = 1; - network = list("MiniSat"); + network = list("minisat"); start_active = 1 }, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -49033,7 +48646,7 @@ /obj/machinery/camera/motion{ c_tag = "MiniSat Foyer"; dir = 1; - network = list("MiniSat") + network = list("minisat") }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) @@ -49213,7 +48826,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Atmospherics"; dir = 4; - network = list("MiniSat"); + network = list("minisat"); start_active = 1 }, /obj/machinery/airalarm{ @@ -49253,7 +48866,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Antechamber"; dir = 4; - network = list("MiniSat"); + network = list("minisat"); start_active = 1 }, /obj/machinery/turretid{ @@ -49342,7 +48955,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Service Bay"; dir = 8; - network = list("MiniSat"); + network = list("minisat"); start_active = 1 }, /obj/machinery/airalarm{ @@ -49772,7 +49385,7 @@ /obj/machinery/camera{ c_tag = "MiniSat External NorthWest"; dir = 8; - network = list("MiniSat"); + network = list("minisat"); start_active = 1 }, /turf/open/space, @@ -49819,7 +49432,7 @@ /obj/machinery/camera{ c_tag = "MiniSat External NorthEast"; dir = 4; - network = list("MiniSat"); + network = list("minisat"); start_active = 1 }, /turf/open/space, @@ -49835,7 +49448,7 @@ /obj/machinery/camera/motion{ c_tag = "MiniSat Core Hallway"; dir = 4; - network = list("MiniSat") + network = list("minisat") }, /obj/machinery/firealarm{ dir = 8; @@ -50213,7 +49826,7 @@ /obj/machinery/camera/motion{ c_tag = "MiniSat AI Chamber North"; dir = 1; - network = list("MiniSat") + network = list("minisat") }, /turf/open/floor/circuit, /area/ai_monitored/turret_protected/ai) @@ -50629,18 +50242,14 @@ }, /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat_interior) -"czE" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) "czF" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/machinery/meter, -/turf/open/floor/plasteel/dark, +/obj/structure/sign/warning/vacuum/external{ + pixel_x = -32 + }, +/turf/open/floor/plating, /area/engine/engineering) "czG" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -50874,97 +50483,40 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"cAl" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, +"cAm" = ( +/obj/item/wirecutters, /obj/structure/cable/yellow{ - icon_state = "1-4" + icon_state = "2-8" }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/engine/engineering) +"cAo" = ( /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"cAm" = ( -/obj/machinery/power/supermatter_shard/crystal/engine, -/turf/open/floor/engine, -/area/engine/supermatter) -"cAo" = ( -/obj/structure/cable{ +/obj/structure/cable/yellow{ icon_state = "1-4" }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/engine, +/turf/open/floor/plating/airless, /area/engine/engineering) "cAp" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/cable/yellow{ + icon_state = "2-4" }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "Cooling Loop to Gas"; - on = 1 - }, -/turf/open/floor/engine, +/turf/open/floor/plating/airless, /area/engine/engineering) "cAq" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/orange/visible{ - dir = 4 - }, -/turf/open/floor/engine, +/turf/open/floor/plating/airless, /area/engine/engineering) "cAr" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/cable/yellow{ + icon_state = "2-8" }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "Gas to Mix"; - on = 0 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cAs" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cAt" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cAu" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/power/emitter/anchored{ - dir = 4; - state = 2 - }, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/engine/engineering) "cAy" = ( /obj/structure/closet/secure_closet/freezer/kitchen/maintenance, @@ -51079,9 +50631,17 @@ /turf/open/floor/plating, /area/maintenance/fore/secondary) "cAP" = ( -/obj/structure/sign/warning/fire, -/turf/closed/wall/r_wall, -/area/engine/supermatter) +/obj/machinery/button/door{ + id = "Singularity"; + name = "Shutters Control"; + pixel_x = 25; + req_access_txt = "11" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) "cAQ" = ( /obj/structure/chair, /turf/open/floor/plating, @@ -51147,7 +50707,7 @@ /obj/machinery/camera{ c_tag = "MiniSat External SouthWest"; dir = 8; - network = list("MiniSat"); + network = list("minisat"); start_active = 1 }, /turf/open/space, @@ -51182,7 +50742,7 @@ /obj/machinery/camera{ c_tag = "MiniSat External SouthEast"; dir = 4; - network = list("MiniSat"); + network = list("minisat"); start_active = 1 }, /turf/open/space, @@ -51212,7 +50772,7 @@ /obj/machinery/camera/motion{ c_tag = "MiniSat AI Chamber South"; dir = 2; - network = list("MiniSat") + network = list("minisat") }, /turf/open/floor/circuit, /area/ai_monitored/turret_protected/ai) @@ -51244,7 +50804,7 @@ /obj/machinery/camera{ c_tag = "MiniSat External South"; dir = 2; - network = list("MiniSat"); + network = list("minisat"); start_active = 1 }, /turf/open/space, @@ -51290,8 +50850,7 @@ "cBn" = ( /obj/machinery/camera{ c_tag = "Locker Room Toilets"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel/freezer, @@ -51496,10 +51055,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/turf/open/floor/engine, +/turf/open/floor/plating/airless, /area/engine/engineering) "cBS" = ( /obj/structure/cable{ @@ -51675,89 +51231,6 @@ }, /turf/open/floor/plating, /area/shuttle/auxillary_base) -"cCB" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"cCC" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"cCD" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "Mix to Engine"; - on = 0 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"cCE" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"cCF" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/atmos) -"cCG" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 10 - }, -/turf/open/space, -/area/space/nearstation) -"cCH" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"cCI" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"cCJ" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"cCP" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 5 - }, -/turf/open/space, -/area/space/nearstation) -"cCQ" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"cCS" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) "cCT" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -51777,77 +51250,33 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cDe" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/closet/radiation, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, /turf/open/floor/plasteel, /area/engine/engineering) -"cDg" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) "cDh" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/structure/table/reinforced, -/obj/item/storage/toolbox/mechanical, -/obj/item/device/flashlight, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/item/pipe_dispenser, -/turf/open/floor/engine, -/area/engine/engineering) -"cDi" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/table/reinforced, -/obj/item/clothing/suit/radiation, -/obj/item/clothing/head/radiation, -/obj/item/clothing/glasses/meson, -/obj/item/clothing/glasses/meson, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDj" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, /area/engine/engineering) "cDk" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, /area/engine/engineering) "cDl" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -51864,90 +51293,39 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cDo" = ( -/obj/structure/cable{ - icon_state = "1-4" +/obj/item/pen, +/obj/item/storage/belt/utility, +/obj/item/clothing/glasses/meson, +/obj/item/paper_bin{ + layer = 2.9 + }, +/obj/structure/table/glass, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cDt" = ( +/obj/structure/table, +/obj/item/twohanded/rcl/pre_loaded, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cDw" = ( +/obj/structure/closet/secure_closet/engineering_electrical, +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, /turf/open/floor/plasteel, /area/engine/engineering) -"cDp" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDr" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDs" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDt" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDv" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDw" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) "cDx" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/chair/sofa{ + icon_state = "sofamiddle"; + dir = 4 }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Atmos to Loop"; - on = 0 - }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) "cDy" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDz" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, +/obj/structure/table, +/obj/item/clothing/gloves/color/yellow, +/obj/item/storage/belt/utility, +/obj/item/clothing/glasses/meson, /turf/open/floor/plasteel, /area/engine/engineering) "cDB" = ( @@ -51957,102 +51335,23 @@ /obj/effect/landmark/start/station_engineer, /turf/open/floor/plasteel, /area/engine/engineering) -"cDC" = ( -/obj/item/wrench, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 6 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cDD" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ - dir = 4 - }, -/obj/machinery/meter, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cDE" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "External Gas to Loop" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "cDF" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "External Gas to Loop" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cDG" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"cDH" = ( -/obj/structure/rack, -/obj/item/clothing/mask/gas{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/clothing/mask/gas, -/obj/item/clothing/mask/gas{ - pixel_x = -3; - pixel_y = -3 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"cDI" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"cDJ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/engineering) "cDK" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ +/turf/open/floor/plasteel/yellow/side{ dir = 4 }, -/turf/open/floor/plasteel, /area/engine/engineering) -"cDL" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"cDN" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/closed/wall, -/area/engine/engineering) -"cDY" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ +"cDO" = ( +/obj/effect/turf_decal/stripes/line{ dir = 9 }, -/turf/open/space, +/turf/open/floor/plating/airless, /area/space/nearstation) "cDZ" = ( /obj/structure/cable{ @@ -52062,824 +51361,139 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cEa" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister/nitrogen, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cEd" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/camera{ - c_tag = "Engineering Supermatter Port"; - dir = 4; - network = list("SS13","Engine") - }, -/turf/open/floor/engine, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) -"cEe" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"cEf" = ( -/obj/machinery/ai_status_display, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"cEg" = ( -/obj/machinery/status_display, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"cEh" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"cEi" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Engineering Supermatter Starboard"; - dir = 8; - network = list("SS13","Engine") - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cEk" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = 24 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cEl" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 6 - }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) "cEm" = ( /obj/machinery/vending/autodrobe, /turf/open/floor/wood, /area/maintenance/bar) -"cEr" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) "cEs" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Gas to Cooling Loop"; - on = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cEt" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) -"cEu" = ( -/obj/machinery/camera{ - c_tag = "Supermatter Chamber"; - dir = 2; - network = list("Engine"); - pixel_x = 23 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cEv" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 8 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/structure/window/plasma/reinforced{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cEw" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cEx" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cEy" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 4 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/structure/window/plasma/reinforced{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cEz" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cEA" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) -"cEB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cEC" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Mix to Gas"; - on = 0 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cED" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cEE" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 5 - }, -/turf/open/space, -/area/space/nearstation) -"cEK" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"cEL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -22 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cEM" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/item/tank/internals/plasma, -/turf/open/floor/plating, -/area/engine/supermatter) -"cET" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/oil, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) -"cEU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"cEW" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cFb" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, -/turf/open/floor/engine, +/obj/machinery/power/grounding_rod, +/turf/open/floor/plating/airless, /area/engine/engineering) -"cFc" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, +"cEv" = ( /obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 2; - icon_state = "pump_map"; - name = "Cooling Loop Bypass" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFe" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/structure/window/plasma/reinforced{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cFh" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 9 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/structure/window/plasma/reinforced{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cFj" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" + icon_state = "1-2" }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /turf/open/floor/plating, -/area/engine/supermatter) -"cFk" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Mix Bypass" - }, -/turf/open/floor/engine, /area/engine/engineering) -"cFm" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"cFn" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ +"cEw" = ( +/obj/structure/particle_accelerator/particle_emitter/left, +/turf/open/floor/plating, +/area/engine/engineering) +"cEx" = ( +/obj/structure/particle_accelerator/particle_emitter/right, +/turf/open/floor/plating, +/area/engine/engineering) +"cEy" = ( +/obj/effect/turf_decal/stripes/line{ dir = 6 }, -/turf/open/space, -/area/space/nearstation) -"cFo" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 10 - }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"cFu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/obj/machinery/meter, -/turf/open/floor/engine, +/turf/open/floor/plating, /area/engine/engineering) -"cFw" = ( -/obj/structure/sign/warning/electricshock, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"cFy" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 +"cEK" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 }, -/turf/open/floor/engine, +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access = null; + req_access_txt = "10;13" + }, +/turf/open/floor/plating, /area/engine/engineering) -"cFz" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 +"cFb" = ( +/obj/machinery/camera/emp_proof{ + c_tag = "Engine Containment Port Fore"; + dir = 2; + network = list("engine") }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating/airless, /area/engine/engineering) -"cFA" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible, -/turf/open/floor/plasteel/dark, +"cFn" = ( +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/airless, /area/engine/engineering) "cFI" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFJ" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/floor/engine, +/turf/open/floor/plating/airless, /area/engine/engineering) "cFK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/machinery/field/generator{ + anchored = 1; + state = 2 }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 6 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFM" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFN" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/camera{ - c_tag = "Engineering Supermatter Aft"; - dir = 2; - network = list("SS13","Engine"); - pixel_x = 23 - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cFP" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFR" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFT" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 9 - }, -/turf/open/floor/engine, -/area/engine/engineering) +/turf/open/floor/plating/airless, +/area/space/nearstation) "cFU" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGd" = ( -/obj/structure/closet/crate/bin, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGe" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGf" = ( -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 8; - filter_type = "n2" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGg" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGh" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/engine, -/area/engine/engineering) -"cGi" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/engine, -/area/engine/engineering) -"cGj" = ( -/obj/structure/table, -/obj/item/pipe_dispenser, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGk" = ( -/obj/machinery/light, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGl" = ( -/obj/structure/closet/secure_closet/engineering_personal, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGr" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"cGs" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"cGt" = ( -/obj/structure/closet/wardrobe/engineering_yellow, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGu" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 6 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGv" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGx" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible, -/obj/machinery/meter, -/turf/open/floor/engine, -/area/engine/engineering) -"cGC" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/atmospherics/components/binary/valve/digital{ - dir = 4; - name = "Output Release"; - open = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGD" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"cGE" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 10 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cGH" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cGI" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Laser Room"; - req_access_txt = "10" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGK" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cGL" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"cGM" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/plating/airless, -/area/engine/engineering) -"cGR" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGS" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cGT" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGU" = ( -/obj/structure/reflector/double/anchored{ - dir = 6 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGV" = ( -/obj/structure/reflector/box/anchored{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGY" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGZ" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - dir = 1; - volume_rate = 200 - }, -/turf/open/floor/plating/airless, -/area/engine/engineering) -"cHa" = ( -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -22 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cHb" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cHc" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cHd" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cHe" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cHg" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cHj" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, /obj/machinery/power/emitter/anchored{ dir = 8; state = 2 }, -/turf/open/floor/plating, -/area/engine/engineering) -"cHn" = ( /obj/structure/cable{ - icon_state = "1-4" + icon_state = "0-4" }, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/engine/engineering) -"cHo" = ( -/obj/structure/reflector/single/anchored{ - dir = 9 +"cGh" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cHp" = ( -/obj/structure/reflector/single/anchored{ - dir = 5 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cHr" = ( -/obj/structure/cable{ +/obj/structure/cable/yellow{ icon_state = "1-8" }, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"cGr" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/grille, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"cGE" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/grille, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"cGU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"cGV" = ( +/obj/machinery/the_singularitygen/tesla, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"cGZ" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/grille, +/turf/open/floor/plating/airless, /area/engine/engineering) "cHD" = ( /obj/structure/cable{ @@ -53218,8 +51832,13 @@ /turf/open/floor/plating, /area/security/brig) "cMm" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/chair/office/dark{ + dir = 1 + }, +/turf/open/floor/plasteel, /area/engine/engineering) "cMC" = ( /obj/machinery/computer/security/telescreen{ @@ -53227,7 +51846,7 @@ dir = 8; layer = 4; name = "Engine Monitor"; - network = list("Engine"); + network = list("singularity"); pixel_x = 30 }, /obj/effect/turf_decal/stripes/line{ @@ -53238,15 +51857,24 @@ }, /area/engine/engineering) "cMD" = ( -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"cMH" = ( -/turf/open/floor/engine, -/area/engine/supermatter) -"cMN" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /turf/open/floor/plating, -/area/engine/supermatter) +/area/engine/engineering) +"cMH" = ( +/obj/structure/particle_accelerator/particle_emitter/center, +/turf/open/floor/plating, +/area/engine/engineering) +"cMN" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "cMQ" = ( /obj/structure/cable{ icon_state = "0-2" @@ -53454,6 +52082,12 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"cQZ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "cSz" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -53479,41 +52113,23 @@ /turf/open/floor/plasteel/dark/telecomms/mainframe, /area/tcommsat/server) "cSG" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/closed/wall/r_wall, -/area/engine/supermatter) +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/engine/engineering) "cSH" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/cable/yellow{ + icon_state = "0-8" }, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 5 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cSI" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cSJ" = ( -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) +/obj/machinery/power/tesla_coil, +/turf/open/floor/plating/airless, +/area/space) "cSK" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/cable/yellow{ + icon_state = "0-4" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 10 - }, -/turf/open/floor/engine, -/area/engine/engineering) +/obj/machinery/power/tesla_coil, +/turf/open/floor/plating/airless, +/area/space) "cSL" = ( /obj/machinery/button/door{ id = "atmos"; @@ -53944,6 +52560,13 @@ }, /turf/open/floor/plating, /area/security/brig) +"ejb" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/engine/engineering) "ejX" = ( /obj/machinery/light{ dir = 1 @@ -53999,6 +52622,13 @@ icon_state = "wood-broken5" }, /area/maintenance/bar) +"eHD" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/engine/engineering) "eRz" = ( /obj/structure/lattice, /obj/structure/grille, @@ -54057,9 +52687,16 @@ }, /turf/open/floor/plasteel, /area/ai_monitored/security/armory) -"fsQ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/dark, +"fFB" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "Singularity"; + name = "radiation shutters" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, /area/engine/engineering) "fIx" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -54124,6 +52761,9 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel/showroomfloor, /area/space) +"gre" = ( +/turf/open/floor/plating/airless, +/area/engine/engineering) "gtB" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -54227,18 +52867,61 @@ /obj/structure/closet/bombcloset/security, /turf/open/floor/plasteel/showroomfloor, /area/space) +"hmW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"hyz" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "Singularity"; + name = "radiation shutters" + }, +/obj/effect/turf_decal/bot{ + dir = 2 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) "hCi" = ( /obj/structure/lattice, /turf/open/space/basic, /area/space) +"hDa" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/grille, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"hMa" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access = null; + req_access_txt = "10;13" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"hQd" = ( +/turf/open/space/basic, +/area/engine/engineering) "hSW" = ( /turf/open/floor/plasteel/red/side, /area/security/brig) -"ijc" = ( -/obj/structure/table, -/obj/item/stack/sheet/metal/fifty, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) +"ieW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "ilg" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/wood{ @@ -54255,6 +52938,14 @@ /obj/machinery/droneDispenser, /turf/open/floor/plating, /area/maintenance/department/medical/morgue) +"iqO" = ( +/obj/machinery/camera/emp_proof{ + c_tag = "Engine Containment Port Aft"; + dir = 1; + network = list("engine") + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "itG" = ( /obj/structure/table/reinforced, /obj/item/paper_bin, @@ -54330,7 +53021,7 @@ /obj/machinery/camera{ c_tag = "Circuitry Lab"; dir = 8; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel, /area/science/circuit) @@ -54368,6 +53059,10 @@ /obj/structure/table/wood, /turf/open/floor/wood, /area/maintenance/bar) +"jyX" = ( +/obj/structure/sign/warning/securearea, +/turf/closed/wall/r_wall, +/area/engine/engineering) "jAD" = ( /obj/structure/grille, /turf/open/floor/plating/airless, @@ -54412,15 +53107,6 @@ dir = 9 }, /area/security/brig) -"jMY" = ( -/obj/structure/table, -/obj/item/stack/cable_coil{ - pixel_x = 3; - pixel_y = -7 - }, -/obj/item/stack/cable_coil, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "jSO" = ( /obj/machinery/light{ dir = 4 @@ -54439,6 +53125,13 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"jZh" = ( +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "khb" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 @@ -54497,6 +53190,9 @@ /obj/structure/table/wood, /turf/open/floor/wood, /area/maintenance/bar) +"kAr" = ( +/turf/open/floor/plating/airless, +/area/space) "kDA" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -54519,6 +53215,12 @@ icon_state = "wood-broken7" }, /area/maintenance/bar) +"kNw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "kPd" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/structure/cable{ @@ -54534,13 +53236,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/medical/morgue) -"kQq" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) "kSb" = ( /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, @@ -54707,27 +53402,44 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) -"mBv" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/binary/valve{ - dir = 4; - name = "Output to Waste" - }, -/turf/open/floor/engine, +"mzz" = ( +/obj/structure/grille, +/turf/open/floor/plating/airless, /area/engine/engineering) "mHd" = ( /obj/structure/falsewall, /turf/open/floor/plating, /area/maintenance/bar) +"mLm" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/grille, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"mMg" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/engine/engineering) "mNi" = ( /obj/machinery/light_switch{ pixel_x = -20 }, /turf/open/floor/plasteel/white, /area/science/circuit) +"mQs" = ( +/obj/machinery/power/emitter/anchored{ + dir = 4; + state = 2 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "mRe" = ( /obj/machinery/light{ dir = 8 @@ -54750,10 +53462,6 @@ "nnM" = ( /turf/closed/wall/r_wall, /area/security/armory) -"noK" = ( -/obj/structure/girder, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "nsq" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -54787,10 +53495,6 @@ }, /turf/open/floor/plasteel/floorgrime, /area/security/brig) -"nzh" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "nAv" = ( /obj/structure/table, /obj/item/grenade/barrier{ @@ -54853,6 +53557,10 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"nXy" = ( +/obj/structure/lattice, +/turf/open/space, +/area/space) "nYI" = ( /obj/effect/spawner/lootdrop/maintenance{ lootcount = 2; @@ -54862,6 +53570,13 @@ /obj/item/device/electropack/shockcollar, /turf/open/floor/plating, /area/maintenance/bar) +"oaS" = ( +/obj/effect/landmark/start/station_engineer, +/obj/structure/chair/office/dark{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) "obC" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 @@ -54932,10 +53647,19 @@ dir = 10 }, /area/security/brig) -"oDF" = ( -/obj/machinery/light, +"oAQ" = ( +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/engine/engineering) +"oHi" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) "oHU" = ( /obj/structure/cable{ icon_state = "1-2" @@ -54959,6 +53683,21 @@ /obj/machinery/disposal/bin, /turf/open/floor/plasteel/white, /area/science/circuit) +"oUs" = ( +/obj/machinery/button/door{ + id = "Singularity"; + name = "Shutters Control"; + pixel_x = -25; + req_access_txt = "11" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/engineering) "oZl" = ( /turf/open/floor/plasteel/purple/side{ tag = "icon-purple (NORTH)"; @@ -55002,6 +53741,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/hallway/primary/fore) +"pmD" = ( +/turf/open/space/basic, +/area/space/nearstation) "pzG" = ( /obj/structure/sign/poster/random{ pixel_x = -32 @@ -55168,6 +53910,14 @@ /obj/item/device/assembly/signaler, /turf/open/floor/plating, /area/maintenance/bar) +"riY" = ( +/obj/machinery/camera/emp_proof{ + c_tag = "Engine Containment Starboard Aft"; + dir = 1; + network = list("engine") + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "rmX" = ( /obj/structure/table, /obj/item/reagent_containers/food/drinks/beer, @@ -55210,11 +53960,22 @@ }, /turf/open/floor/wood, /area/maintenance/bar) +"rNn" = ( +/obj/machinery/power/grounding_rod, +/turf/open/floor/plating/airless, +/area/engine/engineering) "rWu" = ( /turf/open/floor/wood{ icon_state = "wood-broken6" }, /area/maintenance/bar) +"rZV" = ( +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "saK" = ( /obj/structure/closet/crate, /obj/item/target/alien, @@ -55227,6 +53988,20 @@ /obj/item/gun/energy/laser/practice, /turf/open/floor/plasteel/white, /area/science/circuit) +"spp" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "Singularity"; + name = "radiation shutters" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/bot{ + dir = 2 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) "srd" = ( /turf/open/floor/plasteel/red/corner{ dir = 4 @@ -55249,6 +54024,12 @@ /obj/item/shovel/spade, /turf/open/floor/plasteel/hydrofloor, /area/hallway/secondary/service) +"sAz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "sGJ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/wood{ @@ -55315,6 +54096,12 @@ /obj/structure/chair/office/light, /turf/open/floor/plasteel/white, /area/science/circuit) +"sWi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "sXy" = ( /obj/machinery/door/airlock/external{ name = "Security External Airlock"; @@ -55345,6 +54132,11 @@ }, /turf/open/floor/plating, /area/maintenance/fore/secondary) +"tfw" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/space/basic, +/area/space) "thu" = ( /obj/structure/cable{ icon_state = "1-2" @@ -55378,6 +54170,12 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/space/nearstation) +"tHc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 2 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "tMl" = ( /obj/effect/turf_decal/loading_area, /turf/open/floor/plasteel/showroomfloor, @@ -55408,21 +54206,14 @@ /obj/item/storage/box/drinkingglasses, /turf/open/floor/wood, /area/maintenance/bar) -"udp" = ( -/obj/item/crowbar/large, -/obj/structure/rack, -/obj/item/device/flashlight, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"uhH" = ( -/obj/item/wrench, -/obj/item/weldingtool, -/obj/item/clothing/head/welding{ - pixel_x = -3; - pixel_y = 5 +"ugZ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" }, -/obj/structure/rack, -/turf/open/floor/plasteel/dark, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plating, /area/engine/engineering) "ujc" = ( /obj/machinery/vending/cigarette, @@ -55462,7 +54253,7 @@ /obj/item/screwdriver, /obj/machinery/camera{ c_tag = "Circuitry Lab North"; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/white, /area/science/circuit) @@ -55480,6 +54271,20 @@ }, /turf/open/floor/wood, /area/maintenance/bar) +"uuA" = ( +/obj/structure/table, +/obj/item/storage/toolbox/electrical{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/storage/toolbox/electrical{ + pixel_x = -2 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) "uvc" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/wood, @@ -55487,6 +54292,12 @@ "uvy" = ( /turf/closed/wall/r_wall, /area/space) +"uAt" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/yellow/side, +/area/engine/engineering) "uMX" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -55566,6 +54377,12 @@ }, /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) +"vie" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "vxh" = ( /obj/structure/table, /obj/effect/spawner/lootdrop/maintenance{ @@ -55596,6 +54413,13 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel/white, /area/science/circuit) +"vHQ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/grille, +/turf/open/floor/plating/airless, +/area/engine/engineering) "vNJ" = ( /obj/machinery/vending/clothing, /turf/open/floor/wood, @@ -55819,6 +54643,22 @@ /obj/effect/spawner/lootdrop/grille_or_trash, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"xJs" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"xMh" = ( +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "xTa" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 @@ -55847,6 +54687,10 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) +"yam" = ( +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/plasteel, +/area/engine/atmos) "ycu" = ( /obj/structure/cable{ icon_state = "2-4" @@ -78826,10 +77670,10 @@ abc abc afu abc -aaa -aaa -aaa -aaa +abc +abc +abc +abc aaa aaa aaa @@ -79203,8 +78047,8 @@ aaa aaa aaa aaa -aaT -aaT +aaa +aaa aaa aaa aaa @@ -79448,21 +78292,21 @@ cjJ aaa aaa crn -aaf -aaT -aaT -aaT -aaT -aaT -aaT -aaT -aaT -aaT +pmD +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa -aaf -ctv -aaT -aaT aaa aaa aaa @@ -79705,21 +78549,21 @@ cjJ aaa aaa crn -aaf -aaT -ctv -ctv -ctv -ctv -ctv -ctv -ctv -aaT +pmD +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa -aaf -ctv -ctv -aaT aaa aaa aaa @@ -79962,20 +78806,20 @@ cjJ aaf aaf cig -aaf -aaT -aaT -aaT -aaT -aaT -aaT -aaT -aaT -aaT -aaf -aaf -aaf -aaf +pmD +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -80220,17 +79064,17 @@ ccw ccw ccw aaa -aaf -aaa -aaa -aaf -aaa -aaa -aaf aaa aaa aaa -aaf +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -80477,19 +79321,19 @@ cqw cqO crp aaa -aaf -aaa -aaa -aaf -aaa -aaa -aaf aaa aaa aaa -aaT -aaT -aaT +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -80733,20 +79577,20 @@ cgR cgR cqN cro -cEl -cEE -cEl -cFm -csx -cFm -cFm -csx -csv +pmD +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa -aaT -ctv -aaT aaa aaa aaa @@ -80990,20 +79834,20 @@ ciN cji cDZ crr -crJ -crT -crJ -cFn -css -csx -csx -css -csb -aaf -aaf -aaT -ctv -aaT +pmD +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -81243,24 +80087,24 @@ ccw cfL coH cBO -cgR +cnv cDB cqP crq -crZ -crT -crZ -cFo -css -cFm -cFm -css -csv +pmD +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa -aaT -ctv -aaT aaa aaa aaa @@ -81504,21 +80348,21 @@ cgR cqx cqR crp -crJ -crT -crJ -cFn -css -csx -csx -css -csb -aaf -aaf -aaT -ctv -aaT -aaa +gXs +gXs +gXs +gXs +gXs +gXs +gXs +gXs +gXs +gXs +gXs +gXs +gXs +gXs +hCi aaa aaa aaa @@ -81761,25 +80605,25 @@ cpX cqz cqQ ccw -crH -crT -crZ -cFo -css -cFm -cFm -css -csv +pmD aaa aaa -aaT -ctv -aaT +uvy +uvy +uvy aaa aaa aaa aaa aaa +uvy +uvy +uvy +hCi +hCi +aaa +aaa +aaa aaa aaa aaa @@ -82018,24 +80862,24 @@ clJ cig cig ccw -crJ -crT -crJ -cFn -css -csx -csx -css -csb -aaf -aaf -aaT -ctv -aaT -aaa +pmD +pmD +uvy +uvy +uvy +uvy +uvy aaa aaa aaa +uvy +uvy +uvy +uvy +uvy +hCi +hCi +hCi aaa aaa aaa @@ -82269,30 +81113,30 @@ ccw ccw ccw cnZ -coH +oHi +cpt +cpt cpt -cpZ -cig cqS ccw -crH -crT -crZ -cFo -css -cFm -cFm -css -csv -aaa -aaa -aaT -ctv -aaT -aaa -aaa -aaf -aaa +ccw +ccw +ccw +ccw +ccw +ccw +ccw +ccw +cpy +ccw +ccw +ccw +ccw +ccw +ccw +ccw +uvy +hCi aaa aaa aaa @@ -82528,28 +81372,28 @@ cnt cob coL cDo +oaS cgR -cqA cqT -csg +ccw crJ -crU +ccw csb cFn css +cFn csx -csx -css -csb -aaf -aaf -aaT -aaT -aaT -gXs -aaf -aaf -aaf +ccw +ccw +ccw +cGE +cFn +jZh +mzz +mzz +ccw +uvy +nXy aaa aaa aaa @@ -82786,27 +81630,27 @@ cgw coK cpu cMm -ccw -ccw -ccw +ckH +uAt +hMa crK cEK csa -csj -csa -csa +gre +mQs +gre cGr -aaa -aaa -aaa -aaa -aaf -aaa -aaa -aaa -aaa -aaf -aaa +vHQ +hDa +vHQ +mLm +gre +mQs +gre +gre +ccw +uvy +hCi aaa aaa aaa @@ -83039,31 +81883,31 @@ ckG clJ cmF cgR -cgI +cnZ chF ciO -cqc -cqc -cqc -cEd -cEr -cEL +oaS +cgR +cqT +ccw +cig +ccw cFb -cFu +gre cFI -cGd -cGs -cGr +gre +gre +gre +gre +gre +gre +gre +cFI +gre +iqO ccw -ccw -ccw -ccw -ccw -ccw -aaa -eRz -aaT -eRz +uvy +tfw aaa aaa aaa @@ -83296,30 +82140,30 @@ cTa ceZ clQ cgR -cgx -coM -cpv -cqb -cqb -cqb -cqb +cnZ +oHi +cgR +cgR +cgR +cqT +fFB cEs -cqb -cqb +gre +rNn cAp -cqb +xJs cAo -cGt -cgx -jMY -csd -cHa -csd -uhH +xJs +cAo +xJs +cAo +xJs +cQZ +gre +gre +gre ccw -aaa -aaT -ctv +uvy aaT aaa aaa @@ -83554,29 +82398,29 @@ cTd ckF ckF cgK -cDg -cDp -cqe -cqB -cqB -cEe +oHi +cgR +cgR +cgR +cqT +fFB csP -cAl -cFc +gre +gre cAq -cFJ +kAr cSH -cGu -cGH -fsQ -fsQ -cGR -csd -csd +kAr +cSH +kAr +cSH +kAr +cSH +kAr +gre +gre ccw -aaa -aaT -ctv +uvy aaT aaa aaa @@ -83814,26 +82658,26 @@ cgJ chG cpx cqd -cDC +cjc cqU -cEf -cEt -cEM -csA -cEg +fFB +csP +gre +rNn +cAq cFK -cGe -cGv -cGI -cGS -cHb -cHg -cHn -oDF +aoV +aoV +cFK +gXs +aaa +aoV +aoV +cFK +kAr +gre ccw -aaf -aaT -ctv +uvy aaT aaf aaa @@ -84067,30 +82911,30 @@ cig cig cTf cgR -ccw +cnZ cDh cpy -cDv -cDD -cqU -cMD -cEu -cEz -cEz -cMD -cFL -cGf -kQq -cMm -ciZ -cHc -cAu -cAu -ciZ ccw +hyz +ccw +ccw +cqY +cqY +cqY +cAq +aoV +aoV +aoV +hCi +aaf aaa -aaT -ctv +aoV +aoV +aoV +kAr +gre +ccw +uvy aaT aaa aaa @@ -84324,30 +83168,30 @@ ckI clJ cmL cBO +cnZ +cDh ccw -chV -cpx cqf cqD -cMD +oUs crs cEv -cEv -cFe -cMD -cFM -czE -kQq -ccw -cGT -csd -csd -csd -csd -ccw +ugZ +cqY +cAq +aoV +aoV +aaa +aaa aaf -aaT -ctv +aaa +aaa +aoV +aoV +kAr +gre +ccw +uvy aaT aaa aaa @@ -84581,30 +83425,30 @@ ckK clJ cmL cgR -cgL +cnZ chX -cpx +spp cqh cqF cra crI cEw -cEw -cEw -cFw -cFN -csH -csR -cMm -cGU -csd -csd -cHo -csd -ccw +ejb +cqY +cAq aaa -aaT -ctv +aaa +aaa +cDO +cGU +sWi +aaa +hCi +cFK +kAr +gre +ccw +uvy aaT aaa aaa @@ -84838,30 +83682,30 @@ ckI clJ cmL cnv -cMm -chX -cpx +cnZ +eHD +ccw cqg cqE cqZ crt cMH cAm -cMH +mMg cMN -cFO -cSI -cSI -cMm +gXs +aaf +aaf +kNw cGV -csd -cGV -noK -csd +tHc +aaf +aaf +gXs +kAr +gre ccw -aaa -aaT -ctv +uvy aaT aaa aaa @@ -85095,30 +83939,30 @@ cfb ccw cmN cgR -cgL -chX -cpx +cnZ +eHD +hyz cqj cSG crb cru cEx -cEx -cEx -cAP -cFP -csI -cAt -cMm -csd -csd -csd -cHp -csd +oAQ +cqY +cAq +cFK +hCi +aaa +hmW +sAz +ieW +aaa +aaa +aaa +kAr +gre ccw -aaf -aaT -ctv +uvy aaT aaa aaa @@ -85352,30 +84196,30 @@ cfb clM cfz cgR +cnZ +eHD ccw -cii -cpx cqi cMD cAP -crv -cEy -cEy -cFh cMD -cFM -czE -kQq -ccw -cGT -csd -csd -csd -csd -ccw +cMD +cEy +cqY +cAq +aoV +aoV +aaa +aaa aaf -aaT -ctv +aaa +aaa +aoV +aoV +kAr +gre +ccw +uvy aaT aaa aaa @@ -85609,30 +84453,30 @@ cfb cfa cje cgR +cnZ +eHD +cpy ccw -cDi -cDr -cDw -cDE -cEa -cMD -cEz -cEz -cEz -cMD -cFR -cSJ -kQq -cMm -ciZ -cHd -cHj -cHd -ciZ +hyz ccw +ccw +cqY +cqY +cqY +cAq +aoV +aoV aaa -aaT -ctv +aaa +aaf +hCi +aaa +aoV +aoV +kAr +gre +ccw +uvy aaT aaa aaa @@ -85866,30 +84710,30 @@ ckL cmF cje cgR -cMm -chX +cnZ +cjS cpD cDw cDF cEa -cEg -cEA -cET -cFj -cEf -cFS -cGg -mBv -cGI -cGS -cHe -cHe -cHr -oDF +fFB +csP +gre +rNn +cAq +cFK +aoV +aaa +aaa +gXs +cFK +aoV +aoV +cFK +kAr +gre ccw -aaf -aaT -ctv +uvy aaT aaf aaa @@ -86123,30 +84967,30 @@ ceq clQ cje cgR -cMm -cDj -cDs -cql -cDG -cDG -cEh -cEB -cEU -cFk -cAs -cFT +cnZ +cjS +cgR +cgR +cgR +cqT +fFB +csP +gre +gre +cAq +kAr cSK -cGx -cGK -nzh -nzh -cGY -csd -csd +kAr +cSK +kAr +cSK +kAr +cSK +kAr +gre +gre ccw -aaf -aaT -ctv +uvy aaT aaa aaa @@ -86380,30 +85224,30 @@ ckO ckH cja cny -ccw -cip +cnZ +cjS cnx cDx cqb -cqb -cqb -cEC -cqb -cqb +cqT +fFB +cEs +gre +rNn cAr -cqb +xJs cGh -cGC -cey -ijc -csd -cEk -csd -udp +xJs +cGh +xJs +cGh +xJs +vie +gre +gre +gre ccw -aaf -aaT -ctv +uvy aaT aaa aaa @@ -86637,30 +85481,30 @@ cfb clR cgR cgR -cMm -cir +cnZ +cjS cDt cDy cqC +cqT +ccw +ccw +ccw crc -cEi -cED -crc -crc -cFy +gre cBR -cGi -cGD -cGL +gre +gre +gre +gre +gre +gre +gre +cBR +gre +riY ccw -ccw -ccw -ccw -ccw -ccw -aaa -aaT -aaT +uvy aaT aaa aaa @@ -86898,27 +85742,27 @@ cDe cDk coc cqa -cig -ccw -ccw +uuA +uAt +hMa czF +cEK csd -csd -cFz +gre cFU -cGj +gre cGE -cGM +vHQ cGZ -aag -aaa -aaf -aaa -aaa -aaa -aaa -aaf -aaa +vHQ +csx +gre +cFU +gre +gre +ccw +uvy +hCi aaa aaa aaa @@ -87154,28 +85998,28 @@ cgU cgU cis cjN -cDz -cDH -cMm -csd -crM -crV -crV -cFA -csd -cGk +cgR +cgR +cqT ccw -aag -aag -aag -aaf -aaf -aaf -aaf -gXs -aaf -aaf -aaf +crM +ccw +crV +cFn +xMh +cFn +mLm +ccw +ccw +ccw +cGr +cFn +rZV +mzz +mzz +ccw +uvy +nXy aaf aaa aaa @@ -87407,32 +86251,32 @@ ccw cet cfd cfB -cfI -cgQ +cfB +cfB cjS cjN -cqm cgR -crd -cEk -crL -cEW -cse -cse -csu -cGl +cgR +cqT ccw -aaa -aaa -aaf -aaa -aaf -ctv -aaT -aaa -aaa -aaf -aaa +ccw +ccw +ccw +ccw +ccw +ccw +ccw +ccw +cpy +ccw +ccw +ccw +ccw +ccw +ccw +jyX +uvy +hCi aaa aaa aaa @@ -87668,28 +86512,28 @@ ccw ccw cDl cjN -cjh -cDI +cgR +cgR +cgR +cqS ccw ccw ccw ccw ccw -cMm -cMm -cMm ccw -aaf -aaf -aaf -aaf -aaf -ctv -aaT -aaa -aaa -aaf +hQd +pmD +pmD +pmD +uvy +uvy +uvy +uvy +uvy aaa +nXy +hCi aaa aaa aaa @@ -87926,7 +86770,7 @@ ccw cDm cjP ckF -cDJ +ckF ckF cpE cjR @@ -87939,13 +86783,13 @@ aaa aaa aaa aaa -ctv -ctv -ctv -aaT -aaa -aaa -aaa +pmD +uvy +uvy +uvy +hCi +hCi +hCi aaa aaa aaa @@ -88168,7 +87012,7 @@ caE cbA ccy bOd -bOd +yam bQu cfO cgW @@ -88190,17 +87034,17 @@ ccw crX cfK aag -aaa -aaa -aaa -aaa -aaa -aaa -aaT -aaT -aaT -aaT -aaa +hCi +hCi +hCi +hCi +hCi +hCi +gXs +gXs +gXs +gXs +hCi aaa aaa aae @@ -88413,7 +87257,7 @@ bIF bOZ bQp bRA -bOd +yam bTO bUL bVU @@ -88440,7 +87284,7 @@ ccw cpa cjc cqo -cDL +ccw cjk cjm ccw @@ -88456,7 +87300,7 @@ aaa aaa aaa aaa -eRz +gXs aaa aaa aaa @@ -88697,7 +87541,7 @@ ccw ccw cpI ccw -cDL +ccw cjl cjQ cjV @@ -88954,7 +87798,7 @@ cig cpb ciZ cqp -cDN +cig cjT cgR crP @@ -89211,7 +88055,7 @@ cig cig czg cig -cDN +cig crh crA crR @@ -89468,7 +88312,7 @@ cig cpc cpJ cpc -cDN +cig cqY cqY cqY @@ -89701,7 +88545,7 @@ bRF bSM bTS bUQ -agd +bWa bUO bVZ bVZ @@ -89725,7 +88569,7 @@ cig cpd czM cpd -cDN +cig aaa aaa aaa @@ -89958,8 +88802,8 @@ bRE bSJ bPe bOd -cCB -cCC +bOd +bOd bXT bXT bXT @@ -89982,7 +88826,7 @@ ccw cpd czL cpd -cDL +ccw aaf aaa aaa @@ -90216,7 +89060,7 @@ bSM bTU bUS bUS -cCD +bUS bXU bUS bUS @@ -90239,7 +89083,7 @@ aaa cpd cpM cpd -cCQ +aaf aaf aaa aaa @@ -90473,7 +89317,7 @@ bSN bTT bUR bWb -cCE +bUR bTT bUR bZJ @@ -90496,7 +89340,7 @@ aaa aaa czN aaa -cCQ +aaf aaf aaa aaa @@ -90753,7 +89597,7 @@ aaa aaa aaa aaa -cCQ +aaf aaf aaa aaa @@ -90987,7 +89831,7 @@ bSP bPh bQy bRI -cCF +bQy bPh bQy bRI @@ -91010,7 +89854,7 @@ aaa aaa aaa aaa -cCQ +aaf aaf aaa aaa @@ -91244,16 +90088,16 @@ aaf bRK aaf bVv -cCG -cCH -cCI -cCJ -cCI -cCH -cCI -cCJ -cCI -cCP +aaf +bRK +aaf +bVv +aaf +bRK +aaf +bVv +aaf +aaf bLK chg bLK @@ -91267,7 +90111,7 @@ aoV aoV aoV aoV -cCQ +aaf aoV aaa aaa @@ -91510,7 +90354,7 @@ bPj bQA bPj bOh -cCQ +aaf bLK cyG bLK @@ -91524,7 +90368,7 @@ aoV aoV aoV aoV -cCQ +aaf aoV aaa aaa @@ -91767,21 +90611,21 @@ cbI ccC cdD bOh -cCG -cCS -cCS -cCI -cCI -cCI -cCI -cCI -cCI -cCI -cCI -cCI -cCI -cCI -cDY +aaf +aah +aah +aaf +aaf +aaf +aaf +aaf +aah +aah +aah +aah +aah +aah +aaf aaf aaf aaf @@ -106150,7 +104994,7 @@ bTr bTr bTr bTr -bXu +bTr bTr bTr bTr diff --git a/_maps/cit_map_files/Deltastation/DeltaStation2.dmm b/_maps/cit_map_files/Deltastation/DeltaStation2.dmm index f4821e135d..4493d6b2dd 100644 --- a/_maps/cit_map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/cit_map_files/Deltastation/DeltaStation2.dmm @@ -3966,7 +3966,7 @@ /obj/machinery/camera{ c_tag = "Supermatter Engine - Fore"; name = "atmospherics camera"; - network = list("SS13","Engine") + network = list("ss13","engine") }, /turf/open/floor/plasteel/vault{ dir = 8 @@ -8666,7 +8666,7 @@ /obj/machinery/camera{ c_tag = "Supermatter Chamber"; dir = 2; - network = list("Engine") + network = list("engine") }, /turf/open/floor/engine, /area/engine/supermatter) @@ -9182,10 +9182,6 @@ }, /turf/open/floor/circuit/green, /area/engine/supermatter) -"ayK" = ( -/obj/machinery/power/supermatter_shard/crystal/engine, -/turf/open/floor/engine, -/area/engine/supermatter) "ayL" = ( /obj/machinery/atmospherics/pipe/manifold/general/visible{ dir = 4 @@ -9245,7 +9241,7 @@ c_tag = "Supermatter Engine - Starboard"; dir = 8; name = "atmospherics camera"; - network = list("SS13","Engine") + network = list("ss13","engine") }, /obj/structure/cable{ icon_state = "1-2" @@ -9646,7 +9642,7 @@ c_tag = "Supermatter Engine - Port"; dir = 4; name = "atmospherics camera"; - network = list("SS13","Engine") + network = list("ss13","engine") }, /obj/effect/turf_decal/bot, /obj/machinery/atmospherics/components/unary/thermomachine/heater{ @@ -11684,7 +11680,7 @@ /obj/machinery/camera{ c_tag = "Supermatter Engine - Aft"; name = "atmospherics camera"; - network = list("SS13","Engine") + network = list("ss13","engine") }, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -12900,7 +12896,7 @@ c_tag = "Prison - Garden"; dir = 2; name = "prison camera"; - network = list("SS13","prison") + network = list("ss13","prison") }, /turf/open/floor/plasteel/neutral/side{ dir = 1 @@ -17780,7 +17776,7 @@ c_tag = "Prison - Relaxation Area"; dir = 1; name = "prison camera"; - network = list("SS13","prison") + network = list("ss13","prison") }, /turf/open/floor/plating, /area/security/prison) @@ -19590,7 +19586,7 @@ c_tag = "Prison - Cell 3"; dir = 2; name = "prison camera"; - network = list("SS13","prison") + network = list("ss13","prison") }, /turf/open/floor/plating{ icon_state = "panelscorched" @@ -19630,7 +19626,7 @@ c_tag = "Prison - Cell 2"; dir = 2; name = "prison camera"; - network = list("SS13","prison") + network = list("ss13","prison") }, /turf/open/floor/plasteel/red/side{ dir = 4 @@ -19662,7 +19658,7 @@ c_tag = "Prison - Cell 1"; dir = 2; name = "prison camera"; - network = list("SS13","prison") + network = list("ss13","prison") }, /turf/open/floor/plasteel/red/side{ dir = 4 @@ -29378,7 +29374,7 @@ "bpg" = ( /obj/machinery/computer/security{ name = "Labor Camp Monitoring"; - network = list("Labor") + network = list("labor") }, /obj/item/device/radio/intercom{ name = "Station Intercom"; @@ -29694,7 +29690,7 @@ c_tag = "AI Satellite - Fore"; dir = 1; name = "ai camera"; - network = list("Sat"); + network = list("minisat"); start_active = 1 }, /turf/open/floor/plasteel/vault{ @@ -32973,7 +32969,7 @@ /obj/machinery/camera/motion{ c_tag = "AI Chamber - Fore"; name = "motion-sensitive ai camera"; - network = list("AI") + network = list("ai") }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel/dark, @@ -33462,8 +33458,7 @@ "bxe" = ( /obj/machinery/camera/motion{ c_tag = "Vault"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -33589,7 +33584,7 @@ c_tag = "AI Satellite - Fore Port"; dir = 8; name = "ai camera"; - network = list("Sat"); + network = list("minisat"); start_active = 1 }, /turf/open/floor/plasteel/vault{ @@ -33649,7 +33644,7 @@ c_tag = "AI Satellite - Fore Starboard"; dir = 4; name = "ai camera"; - network = list("Sat"); + network = list("minisat"); start_active = 1 }, /turf/open/floor/plasteel/vault{ @@ -35403,7 +35398,7 @@ dir = 4; layer = 4; name = "Engine Monitor"; - network = list("Engine"); + network = list("engine"); pixel_x = -24 }, /turf/open/floor/plasteel/caution{ @@ -35744,7 +35739,7 @@ /obj/machinery/computer/security/telescreen{ desc = "Used for watching the RD's goons and the AI's satellite from the safety of his office."; name = "Research Monitor"; - network = list("RD","Sat"); + network = list("rd","minisat"); pixel_y = 2 }, /turf/open/floor/plasteel/dark, @@ -41547,7 +41542,7 @@ c_tag = "Telecomms - Monitoring"; dir = 2; name = "telecomms camera"; - network = list("SS13","tcomm") + network = list("ss13","tcomm") }, /turf/open/floor/plasteel/grimy, /area/tcommsat/computer) @@ -42033,7 +42028,7 @@ c_tag = "AI Chamber - Aft"; dir = 1; name = "motion-sensitive ai camera"; - network = list("AI") + network = list("ai") }, /turf/open/floor/plasteel/vault, /area/ai_monitored/turret_protected/ai) @@ -42974,7 +42969,7 @@ c_tag = "AI Satellite - Port"; dir = 8; name = "ai camera"; - network = list("Sat"); + network = list("minisat"); start_active = 1 }, /turf/open/floor/plasteel/vault{ @@ -43042,7 +43037,7 @@ c_tag = "AI Satellite - Starboard"; dir = 4; name = "ai camera"; - network = list("Sat"); + network = list("minisat"); start_active = 1 }, /turf/open/floor/plasteel/vault{ @@ -43954,7 +43949,7 @@ c_tag = "AI Satellite - Antechamber"; dir = 2; name = "ai camera"; - network = list("Sat"); + network = list("minisat"); start_active = 1 }, /turf/open/floor/plasteel/vault, @@ -44798,8 +44793,7 @@ "bTl" = ( /obj/machinery/camera/motion{ c_tag = "Armoury - Exterior"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/space, /area/space/nearstation) @@ -44874,7 +44868,7 @@ c_tag = "AI Satellite - Maintenance"; dir = 8; name = "ai camera"; - network = list("Sat"); + network = list("minisat"); start_active = 1 }, /obj/effect/turf_decal/stripes/line, @@ -44962,7 +44956,7 @@ c_tag = "AI Satellite - Teleporter"; dir = 4; name = "ai camera"; - network = list("Sat"); + network = list("minisat"); start_active = 1 }, /turf/open/floor/plasteel/vault{ @@ -45078,7 +45072,7 @@ c_tag = "AI Satellite - Transit Tube"; dir = 2; name = "ai camera"; - network = list("Sat"); + network = list("minisat"); start_active = 1 }, /obj/item/clipboard, @@ -46442,7 +46436,7 @@ desc = "Used for watching the AI's satellite."; dir = 4; name = "Research Monitor"; - network = list("Sat"); + network = list("minisat"); pixel_y = 2 }, /turf/open/floor/plasteel/vault{ @@ -46489,7 +46483,7 @@ dir = 4; layer = 4; name = "Engine Monitor"; - network = list("Engine"); + network = list("engine"); pixel_x = -30 }, /mob/living/simple_animal/parrot/Poly, @@ -49781,7 +49775,7 @@ c_tag = "Telecomms - Chamber Port"; dir = 4; name = "telecomms camera"; - network = list("SS13","tcomm") + network = list("ss13","tcomm") }, /turf/open/floor/plasteel/vault/telecomms{ dir = 8 @@ -50225,7 +50219,7 @@ /obj/machinery/camera/motion{ c_tag = "AI - Upload"; name = "motion-sensitive ai camera"; - network = list("Sat") + network = list("minisat") }, /turf/open/floor/plasteel/vault, /area/ai_monitored/turret_protected/ai_upload) @@ -50253,6 +50247,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/power/emitter{ + anchored = 1; + state = 2 + }, /turf/open/floor/plating/airless, /area/engine/engineering) "cdE" = ( @@ -51319,8 +51317,9 @@ /obj/machinery/camera/emp_proof{ c_tag = "Containment - Fore Starboard"; dir = 8; - network = list("Singularity") + network = list("singularity") }, +/obj/machinery/power/grounding_rod, /turf/open/floor/plating/airless, /area/engine/engineering) "cfC" = ( @@ -51668,7 +51667,7 @@ c_tag = "Telecomms - Chamber Starboard"; dir = 8; name = "telecomms camera"; - network = list("SS13","tcomm") + network = list("ss13","tcomm") }, /turf/open/floor/plasteel/vault/telecomms{ dir = 8 @@ -52292,7 +52291,6 @@ /turf/open/space, /area/space/nearstation) "chu" = ( -/obj/structure/reagent_dispensers/fueltank, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/engine/engineering) @@ -53036,7 +53034,7 @@ /obj/machinery/camera/emp_proof{ c_tag = "Containment - Fore Port"; dir = 4; - network = list("Singularity") + network = list("singularity") }, /turf/open/space, /area/space/nearstation) @@ -53057,10 +53055,10 @@ "cjb" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ - icon_state = "2-4" + icon_state = "4-8" }, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "2-4" }, /turf/open/space, /area/space/nearstation) @@ -53076,28 +53074,11 @@ /turf/open/floor/plating, /area/engine/engineering) "cje" = ( -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable{ - icon_state = "0-4" - }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, /turf/open/floor/plating, /area/engine/engineering) -"cjf" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engpa"; - name = "Engineering Chamber Shutters" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/engine/engineering) "cjg" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -53334,8 +53315,7 @@ /obj/machinery/camera/motion{ c_tag = "Bridge - Captain's Emergency Escape"; dir = 4; - name = "command camera"; - network = list("SS13") + name = "command camera" }, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -53663,13 +53643,6 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) -"ckx" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) "cky" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -53685,6 +53658,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 8 }, +/obj/machinery/power/grounding_rod, /turf/open/floor/plating/airless, /area/space/nearstation) "ckA" = ( @@ -53693,35 +53667,11 @@ id = "engpa"; name = "Engineering Chamber Shutters" }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, /turf/open/floor/plating, /area/engine/engineering) -"ckB" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"ckC" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel/neutral, -/area/engine/engineering) "ckD" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/neutral, @@ -54292,20 +54242,9 @@ /turf/open/floor/plating/airless, /area/space/nearstation) "clS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, /obj/machinery/field/generator{ - anchored = 1 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"clT" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/field/generator{ - anchored = 1 + anchored = 1; + state = 2 }, /turf/open/floor/plating/airless, /area/space/nearstation) @@ -54318,19 +54257,6 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) -"clV" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engpa"; - name = "Engineering Chamber Shutters" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/engine/engineering) "clW" = ( /obj/structure/rack, /obj/item/crowbar, @@ -54340,9 +54266,6 @@ /turf/open/floor/plasteel, /area/engine/engineering) "clX" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/engine/engineering) @@ -55094,7 +55017,7 @@ c_tag = "AI Satellite - Aft Port"; dir = 8; name = "ai camera"; - network = list("Sat"); + network = list("minisat"); start_active = 1 }, /turf/open/floor/plasteel/vault{ @@ -55169,7 +55092,7 @@ c_tag = "AI Satellite - Aft Starboard"; dir = 4; name = "ai camera"; - network = list("Sat"); + network = list("minisat"); start_active = 1 }, /turf/open/floor/plasteel/vault{ @@ -55208,9 +55131,6 @@ id = "engpa"; name = "Engineering Chamber Shutters" }, -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/effect/turf_decal/stripes/line{ dir = 2 }, @@ -55473,7 +55393,7 @@ c_tag = "Telecomms - Cooling Room"; dir = 8; name = "telecomms camera"; - network = list("SS13","tcomm") + network = list("ss13","tcomm") }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, @@ -55896,9 +55816,6 @@ /obj/structure/cable{ icon_state = "2-8" }, -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -56458,6 +56375,10 @@ /turf/open/floor/plating, /area/engine/engineering) "cqr" = ( +/obj/structure/particle_accelerator/particle_emitter/left{ + icon_state = "emitter_left"; + dir = 8 + }, /turf/open/floor/plating, /area/engine/engineering) "cqs" = ( @@ -56466,6 +56387,7 @@ /area/engine/engineering) "cqt" = ( /obj/structure/cable, +/obj/machinery/particle_accelerator/control_box, /turf/open/floor/plating, /area/engine/engineering) "cqu" = ( @@ -57027,7 +56949,7 @@ /turf/open/floor/plating/airless, /area/space/nearstation) "crJ" = ( -/obj/item/wrench, +/obj/machinery/the_singularitygen/tesla, /turf/open/floor/plating/airless, /area/space/nearstation) "crK" = ( @@ -57068,7 +56990,10 @@ /turf/open/floor/plating, /area/engine/engineering) "crO" = ( -/obj/item/weldingtool/largetank, +/obj/structure/particle_accelerator/fuel_chamber{ + icon_state = "fuel_chamber"; + dir = 8 + }, /turf/open/floor/plating, /area/engine/engineering) "crP" = ( @@ -57092,7 +57017,7 @@ dir = 4; layer = 4; name = "Engine Containment Telescreen"; - network = list("Singularity"); + network = list("singularity"); pixel_x = -30 }, /obj/effect/turf_decal/stripes/line{ @@ -57846,7 +57771,10 @@ /turf/open/floor/plating/airless, /area/space/nearstation) "ctp" = ( -/obj/item/wrench, +/obj/structure/particle_accelerator/particle_emitter/right{ + icon_state = "emitter_right"; + dir = 8 + }, /turf/open/floor/plating, /area/engine/engineering) "ctq" = ( @@ -58650,7 +58578,7 @@ /obj/machinery/camera/emp_proof{ c_tag = "Containment - Particle Accelerator"; dir = 1; - network = list("Singularity") + network = list("singularity") }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, @@ -58659,9 +58587,6 @@ /obj/structure/cable{ icon_state = "1-8" }, -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/engine/engineering) @@ -58716,6 +58641,7 @@ dir = 8 }, /obj/effect/turf_decal/bot, +/obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plasteel, /area/engine/engineering) "cva" = ( @@ -59873,24 +59799,6 @@ dir = 4 }, /area/crew_quarters/fitness/recreation) -"cxA" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/field/generator{ - anchored = 1 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"cxB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/field/generator{ - anchored = 1 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) "cxD" = ( /obj/structure/rack, /obj/item/crowbar, @@ -60710,13 +60618,6 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) -"czp" = ( -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating/airless, -/area/space/nearstation) "czq" = ( /obj/structure/cable{ icon_state = "0-2" @@ -60730,33 +60631,9 @@ icon_state = "1-2" }, /obj/effect/turf_decal/stripes/corner, +/obj/machinery/power/grounding_rod, /turf/open/floor/plating/airless, /area/space/nearstation) -"czs" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engpa"; - name = "Engineering Chamber Shutters" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"czt" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel/neutral, -/area/engine/engineering) "czu" = ( /obj/structure/cable/white{ icon_state = "0-2" @@ -61344,7 +61221,7 @@ /obj/machinery/camera/emp_proof{ c_tag = "Containment - Aft Port"; dir = 4; - network = list("Singularity") + network = list("singularity") }, /turf/open/space, /area/space/nearstation) @@ -61358,10 +61235,10 @@ "cAI" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ - icon_state = "1-4" + icon_state = "4-8" }, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-4" }, /turf/open/space, /area/space/nearstation) @@ -61373,11 +61250,7 @@ /turf/open/space, /area/space/nearstation) "cAK" = ( -/obj/machinery/power/rad_collector/anchored, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable{ - icon_state = "0-4" - }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, @@ -62961,8 +62834,9 @@ /obj/machinery/camera/emp_proof{ c_tag = "Containment - Aft Starboard"; dir = 8; - network = list("Singularity") + network = list("singularity") }, +/obj/machinery/power/grounding_rod, /turf/open/floor/plating/airless, /area/engine/engineering) "cDW" = ( @@ -63846,6 +63720,12 @@ icon_state = "0-2" }, /obj/effect/turf_decal/stripes/line, +/obj/machinery/power/emitter{ + anchored = 1; + dir = 1; + icon_state = "emitter"; + state = 2 + }, /turf/open/floor/plating/airless, /area/engine/engineering) "cFI" = ( @@ -67620,7 +67500,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology - Cell 1"; name = "xenobiology camera"; - network = list("SS13","xeno","RD") + network = list("ss13","xeno","rd") }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -67633,7 +67513,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology - Cell 2"; name = "xenobiology camera"; - network = list("SS13","xeno","RD") + network = list("ss13","xeno","rd") }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -67646,7 +67526,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology - Cell 3"; name = "xenobiology camera"; - network = list("SS13","xeno","RD") + network = list("ss13","xeno","rd") }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -67663,7 +67543,7 @@ c_tag = "Xenobiology - Killroom Chamber"; dir = 2; name = "xenobiology camera"; - network = list("SS13","xeno","RD") + network = list("ss13","xeno","rd") }, /turf/open/floor/plasteel/vault/killroom, /area/science/xenobiology) @@ -69712,7 +69592,7 @@ c_tag = "Xenobiology - Port"; dir = 2; name = "xenobiology camera"; - network = list("SS13","xeno","RD") + network = list("ss13","xeno","rd") }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, @@ -72180,7 +72060,7 @@ c_tag = "Xenobiology - Secure Cell"; dir = 4; name = "xenobiology camera"; - network = list("SS13","xeno","RD") + network = list("ss13","xeno","rd") }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -72394,7 +72274,7 @@ c_tag = "Science - Fore"; dir = 8; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/whitepurple/corner{ dir = 4 @@ -72454,7 +72334,7 @@ c_tag = "Security Post - Science"; dir = 8; name = "security camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/red/side{ dir = 6 @@ -72505,7 +72385,7 @@ c_tag = "Science - Waiting Room"; dir = 1; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/whitepurple/corner{ dir = 8 @@ -73201,7 +73081,7 @@ c_tag = "Xenobiology - Starboard"; dir = 8; name = "xenobiology camera"; - network = list("SS13","xeno","RD") + network = list("ss13","xeno","rd") }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, @@ -74963,7 +74843,7 @@ c_tag = "Science - Research Division Access"; dir = 8; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, @@ -76222,7 +76102,7 @@ c_tag = "Science - Research and Development"; dir = 8; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/whitepurple/corner, /area/science/lab) @@ -76290,7 +76170,7 @@ c_tag = "Medbay - Chemistry"; dir = 8; name = "medbay camera"; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /turf/open/floor/plasteel/whiteyellow/corner, /area/medical/chemistry) @@ -76676,7 +76556,7 @@ c_tag = "Xenobiology - Cell 4"; dir = 1; name = "xenobiology camera"; - network = list("SS13","xeno","RD") + network = list("ss13","xeno","rd") }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -76688,7 +76568,7 @@ c_tag = "Xenobiology - Cell 5"; dir = 1; name = "xenobiology camera"; - network = list("SS13","xeno","RD") + network = list("ss13","xeno","rd") }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -76700,7 +76580,7 @@ c_tag = "Xenobiology - Cell 6"; dir = 1; name = "xenobiology camera"; - network = list("SS13","xeno","RD") + network = list("ss13","xeno","rd") }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -76745,7 +76625,7 @@ c_tag = "Science - Port"; dir = 2; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/whitepurple/corner{ dir = 1 @@ -76812,7 +76692,7 @@ c_tag = "Science - Center"; dir = 2; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/whitepurple/corner{ dir = 1 @@ -77966,7 +77846,7 @@ desc = "Used for watching the RD's goons from the safety of his office."; dir = 4; name = "Research Monitor"; - network = list("RD"); + network = list("rd"); pixel_x = -28 }, /turf/open/floor/plasteel/white/corner, @@ -78125,7 +78005,7 @@ c_tag = "Science - Experimentation Lab"; dir = 2; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, @@ -79526,7 +79406,7 @@ c_tag = "Science - Lab Access"; dir = 8; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, @@ -81872,7 +81752,7 @@ desc = "Used for watching the RD's goons from the safety of his office."; dir = 4; name = "Research Monitor"; - network = list("RD"); + network = list("rd"); pixel_x = -28 }, /turf/open/floor/plasteel/white/corner{ @@ -82119,7 +81999,7 @@ c_tag = "Science - Research Director's Office"; dir = 8; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, @@ -83970,7 +83850,7 @@ c_tag = "Science - Experimentor"; dir = 1; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -83985,7 +83865,7 @@ c_tag = "Science - Toxins Mixing Lab Fore"; dir = 4; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/escape{ dir = 8 @@ -84027,7 +83907,7 @@ c_tag = "Science - Firing Range"; dir = 4; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -84124,7 +84004,7 @@ c_tag = "Science - Aft Center"; dir = 8; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/whitepurple/corner, /area/science/research) @@ -84167,7 +84047,7 @@ c_tag = "Science - Mech Bay"; dir = 1; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, @@ -87081,7 +86961,7 @@ c_tag = "Science - Research Director's Quarters"; dir = 1; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/machinery/modular_computer/console/preset/research{ dir = 1 @@ -87777,7 +87657,7 @@ c_tag = "Science - Robotics Lab"; dir = 8; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -88615,7 +88495,7 @@ c_tag = "Science - Toxins Launch Site"; dir = 2; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, @@ -88730,7 +88610,7 @@ c_tag = "Science - Toxins Mixing Lab Aft"; dir = 8; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -89358,7 +89238,7 @@ dir = 4; layer = 4; name = "Testing Site Telescreen"; - network = list("Toxins") + network = list("toxins") }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -90187,7 +90067,7 @@ c_tag = "Science - Server Room"; dir = 8; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/circuit/green/telecomms/mainframe, /area/science/server) @@ -90200,7 +90080,7 @@ c_tag = "Science - Aft"; dir = 4; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/whitepurple/corner{ dir = 8 @@ -90673,7 +90553,7 @@ /turf/open/floor/plating/airless, /area/science/test_area) "dJJ" = ( -/obj/machinery/doppler_array{ +/obj/machinery/doppler_array/research/science{ dir = 8 }, /obj/structure/extinguisher_cabinet{ @@ -90861,7 +90741,7 @@ c_tag = "Science - Toxins Secure Storage"; dir = 4; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, @@ -91663,7 +91543,7 @@ invuln = 1; light = null; name = "hardened testing camera"; - network = list("Toxins"); + network = list("toxins"); start_active = 1; use_power = 0 }, @@ -93003,7 +92883,7 @@ c_tag = "Science - Break Room"; dir = 8; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/neutral/side{ dir = 4 @@ -100888,7 +100768,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Service Bay"; dir = 8; - network = list("MiniSat"); + network = list("minisat"); start_active = 1 }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ @@ -100912,6 +100792,13 @@ }, /turf/open/floor/plating, /area/maintenance/port) +"giB" = ( +/obj/structure/particle_accelerator/end_cap{ + icon_state = "end_cap"; + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/engineering) "gmj" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, @@ -100954,6 +100841,12 @@ dir = 10 }, /area/science/circuit) +"hiz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 2 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "hrP" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -101032,7 +100925,7 @@ c_tag = "Science - Experimentation Lab"; dir = 2; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/machinery/requests_console{ department = "Circuitry Lab"; @@ -101159,6 +101052,15 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/circuit/green, /area/science/research/abandoned) +"mId" = ( +/turf/open/space/basic, +/area/space/nearstation) +"mRo" = ( +/turf/open/floor/plating/airless, +/area/space/nearstation) +"nBz" = ( +/turf/open/floor/plating/airless, +/area/space) "oZC" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command{ @@ -101232,9 +101134,27 @@ dir = 6 }, /area/science/circuit) +"rQf" = ( +/obj/structure/particle_accelerator/particle_emitter/center{ + icon_state = "emitter_center"; + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"sar" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) "saw" = ( /turf/closed/wall, /area/science/circuit) +"taK" = ( +/obj/structure/particle_accelerator/power_box{ + icon_state = "power_box"; + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/engineering) "tmi" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -101249,6 +101169,9 @@ dir = 10 }, /area/science/misc_lab) +"tTq" = ( +/turf/open/space, +/area/space/nearstation) "upk" = ( /obj/machinery/door/airlock/public/glass{ name = "Holodeck Access" @@ -101294,6 +101217,9 @@ dir = 5 }, /area/medical/morgue) +"vYn" = ( +/turf/open/space, +/area/space) "wei" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, @@ -101338,7 +101264,7 @@ c_tag = "Science - Lab Access"; dir = 8; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/structure/sign/departments/science{ pixel_x = 32 @@ -101363,6 +101289,10 @@ }, /turf/open/floor/plasteel/white/side, /area/science/circuit) +"xSx" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "yjc" = ( /obj/machinery/power/apc{ areastring = "/area/science/research/abandoned"; @@ -121815,14 +121745,14 @@ aaa cja ckw clS -aad -aad -clR -aaa -abj -aad -aad -cxA +tTq +tTq +clS +sar +mId +tTq +tTq +clS ctn cja aaa @@ -122070,17 +122000,17 @@ cdC cfA aad cjb -ckx +cky +tTq +vYn +vYn +xSx aad -aaa -aaa -abj -aad -abj -aaa -aaa -aad -czp +mId +vYn +vYn +tTq +czq cAI aad cDT @@ -122328,15 +122258,15 @@ cfA aaa cja ckw +tTq +vYn +mId +mId aad -aaa -abj -abj -abj -abj -abj -aaa -aad +mId +mId +vYn +tTq ctn cja aaa @@ -122583,19 +122513,19 @@ car cbP cfA abj -cja -ckw -ckw -abj -abj +cjb +cky +mId +mId +mId cqo clR ctm -abj -abj -abj -ctn -cja +mId +xSx +clS +czq +cAI abj cDT cFJ @@ -122840,19 +122770,19 @@ car cbP cdC aad -cjb -cky -aaa +cja +ckw +sar +aad aad -abj ckw crJ -ctn -abj +hiz aad -aaa -czq -cAI +aad +sar +ctn +cja aad cdC cFJ @@ -123097,19 +123027,19 @@ car cbP cfA abj -cja -ckw -abj -abj -abj +cjb +cky +clS +xSx +mId cqp crK cto -abj -abj -ctn -ctn -cja +mId +mId +mId +czq +cAI abj cDT cFJ @@ -123356,15 +123286,15 @@ cfA aaa cja ckw +tTq +vYn +mId +mId aad -aaa -abj -abj -abj -abj -abj -aaa -aad +mId +mId +vYn +tTq ctn cja aaa @@ -123612,17 +123542,17 @@ cdC cfA aad cjb -ckx +cky +tTq +vYn +aaa +mId aad +xSx aaa -aaa -abj -aad -abj -aaa -aaa -aad -czp +vYn +tTq +czq cAI aad cDU @@ -123870,15 +123800,15 @@ cfA aaa cja ckw -clT -aad -aad -abj -aaa -crK -aad -aad -cxB +clS +tTq +mId +mId +sar +clS +tTq +tTq +clS ctn cja aaa @@ -124381,8 +124311,8 @@ car cbT cdG cfB -aaa -aad +nBz +mRo aaa aad cjd @@ -124394,8 +124324,8 @@ cjd cjd aad aaa -aad -aaa +mRo +nBz cDV cFL cHg @@ -124902,7 +124832,7 @@ cje cjd cpa cqr -cqr +rQf ctp cuQ cjd @@ -125153,19 +125083,19 @@ cbV cdJ car chv -cjf +chv ckA -clV +chv cnC cpa cqs -cqr +taK ctq cuR cnC -cjf -czs -clV +chv +chv +chv chv car cFO @@ -125411,7 +125341,7 @@ cdK cfD chw cjg -ckB +chw clW cnD cpb @@ -125421,7 +125351,7 @@ ctr cuS cnD cxD -ckB +chw chw chw cDW @@ -125668,17 +125598,17 @@ cdL cfE chx cjh -ckC +cjn clX cnE cpc cqu -cqr +giB cts cuT cnE clX -czt +cjn cAL cCs cDX @@ -127155,7 +127085,7 @@ atS avb awh axz -ayK +axz axz aAW axz diff --git a/_maps/cit_map_files/MetaStation/MetaStation.dmm b/_maps/cit_map_files/MetaStation/MetaStation.dmm index 96021ab0f9..0a66de578c 100644 --- a/_maps/cit_map_files/MetaStation/MetaStation.dmm +++ b/_maps/cit_map_files/MetaStation/MetaStation.dmm @@ -188,7 +188,7 @@ }, /obj/machinery/camera{ c_tag = "Prison Hydroponics"; - network = list("SS13","Prison") + network = list("ss13","prison") }, /turf/open/floor/plasteel/floorgrime, /area/security/prison) @@ -1035,7 +1035,7 @@ /obj/machinery/camera{ c_tag = "Prison Chamber"; dir = 1; - network = list("SS13","Prison") + network = list("ss13","prison") }, /turf/open/floor/plasteel/floorgrime, /area/security/prison) @@ -1120,7 +1120,7 @@ /obj/machinery/camera{ c_tag = "Prison Sanitarium"; dir = 2; - network = list("SS13","Prison") + network = list("ss13","prison") }, /turf/open/floor/plasteel/whitered/side{ dir = 1 @@ -1425,7 +1425,7 @@ /obj/structure/bed, /obj/machinery/camera{ c_tag = "Prison Cell 3"; - network = list("SS13","Prison") + network = list("ss13","prison") }, /turf/open/floor/plasteel/floorgrime, /area/security/prison) @@ -1448,7 +1448,7 @@ /obj/structure/bed, /obj/machinery/camera{ c_tag = "Prison Cell 2"; - network = list("SS13","Prison") + network = list("ss13","prison") }, /turf/open/floor/plasteel/floorgrime, /area/security/prison) @@ -1480,7 +1480,7 @@ /obj/structure/bed, /obj/machinery/camera{ c_tag = "Prison Cell 1"; - network = list("SS13","Prison") + network = list("ss13","prison") }, /turf/open/floor/plasteel/floorgrime, /area/security/prison) @@ -1533,8 +1533,7 @@ /obj/structure/lattice, /obj/machinery/camera/motion{ c_tag = "Armory - External"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/space, /area/space/nearstation) @@ -2147,12 +2146,12 @@ /obj/machinery/computer/security/telescreen{ desc = "Used for watching Prison Wing holding areas."; name = "Prison Monitor"; - network = list("Prison"); + network = list("prison"); pixel_y = 30 }, /obj/machinery/camera{ c_tag = "Prison Hallway Port"; - network = list("SS13","Prison") + network = list("ss13","prison") }, /turf/open/floor/plasteel/red/corner{ dir = 2 @@ -2218,7 +2217,7 @@ /obj/machinery/computer/security/telescreen{ desc = "Used for watching Prison Wing holding areas."; name = "Prison Monitor"; - network = list("Prison"); + network = list("prison"); pixel_y = 30 }, /turf/open/floor/plasteel/red/corner{ @@ -2295,7 +2294,7 @@ /obj/machinery/camera{ c_tag = "Prison Hallway Starboard"; dir = 2; - network = list("SS13","Prison") + network = list("ss13","prison") }, /turf/open/floor/plasteel/red/corner{ dir = 2 @@ -2399,8 +2398,7 @@ }, /obj/machinery/camera{ c_tag = "Head of Security's Office"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hos) @@ -3421,8 +3419,7 @@ pixel_y = 8 }, /obj/machinery/camera/autoname{ - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plating, /area/maintenance/solars/port/fore) @@ -3562,8 +3559,7 @@ /obj/machinery/light, /obj/machinery/camera/motion{ c_tag = "Armory - Internal"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/vault, /area/ai_monitored/security/armory) @@ -3622,7 +3618,7 @@ desc = "Used for watching certain areas."; dir = 1; name = "Head of Security's Monitor"; - network = list("Prison","MiniSat","tcomm"); + network = list("prison","minisat","tcomm"); pixel_y = -30 }, /turf/open/floor/plasteel/vault, @@ -3925,8 +3921,7 @@ /obj/machinery/light/small, /obj/machinery/camera{ c_tag = "Security - EVA Storage"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/vault{ dir = 8 @@ -3991,8 +3986,7 @@ /obj/effect/landmark/blobstart, /obj/machinery/camera{ c_tag = "Evidence Storage"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/item/storage/secure/safe{ name = "evidence safe"; @@ -4446,7 +4440,7 @@ /obj/machinery/computer/security/telescreen{ desc = "Used for watching Prison Wing holding areas."; name = "Prison Monitor"; - network = list("Prison"); + network = list("prison"); pixel_y = 30 }, /turf/open/floor/plasteel/vault, @@ -4922,8 +4916,7 @@ }, /obj/machinery/camera{ c_tag = "Security - Secure Gear Storage"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/flasher/portable, /obj/effect/turf_decal/bot, @@ -5182,8 +5175,7 @@ }, /obj/machinery/camera{ c_tag = "Firing Range"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -5322,10 +5314,6 @@ "alq" = ( /turf/closed/wall, /area/maintenance/starboard) -"alr" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/maintenance/starboard) "als" = ( /obj/machinery/light{ dir = 8 @@ -6050,8 +6038,7 @@ "amM" = ( /obj/machinery/camera{ c_tag = "Gravity Generator Room"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 @@ -6349,8 +6336,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/camera{ c_tag = "Security - Office - Port"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/red/side{ dir = 8 @@ -6749,8 +6735,7 @@ }, /obj/machinery/camera{ c_tag = "Brig - Infirmary"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/item/clothing/under/rank/medical/purple{ pixel_y = -4 @@ -7464,8 +7449,7 @@ }, /obj/machinery/camera{ c_tag = "Warden's Office"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/structure/rack, /obj/item/storage/toolbox/mechanical{ @@ -7508,8 +7492,7 @@ /obj/structure/closet/wardrobe/red, /obj/machinery/camera{ c_tag = "Security - Gear Room"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) @@ -7567,8 +7550,7 @@ }, /obj/machinery/camera{ c_tag = "Security - Office - Starboard"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/plasteel/red/side{ @@ -7776,8 +7758,7 @@ pixel_y = 8 }, /obj/machinery/camera/autoname{ - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plating, /area/maintenance/solars/starboard/fore) @@ -7976,7 +7957,7 @@ "aqY" = ( /obj/machinery/computer/security{ name = "Labor Camp Monitoring"; - network = list("Labor") + network = list("labor") }, /turf/open/floor/plasteel/dark, /area/security/brig) @@ -7992,7 +7973,7 @@ desc = "Used for watching Prison Wing holding areas."; dir = 2; name = "Prison Monitor"; - network = list("Prison"); + network = list("prison"); pixel_x = -30 }, /turf/open/floor/plasteel/showroomfloor, @@ -9947,8 +9928,7 @@ }, /obj/machinery/camera{ c_tag = "Brig - Hallway - Entrance"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/red/corner{ dir = 4 @@ -10927,8 +10907,7 @@ /obj/machinery/light, /obj/machinery/camera{ c_tag = "Brig - Hallway - Port"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/machinery/door_timer{ id = "Cell 1"; @@ -11100,8 +11079,7 @@ /obj/machinery/light, /obj/machinery/camera{ c_tag = "Brig - Hallway - Starboard"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/red/corner{ dir = 2 @@ -11269,6 +11247,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, +/obj/machinery/light/small{ + dir = 1 + }, /turf/open/floor/plating, /area/maintenance/starboard/fore) "axN" = ( @@ -11372,17 +11353,21 @@ req_one_access_txt = "0" }, /obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side{ + dir = 9 + }, /area/engine/engineering) "axV" = ( /obj/structure/sign/warning/securearea{ pixel_y = 32 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/yellow/side{ + dir = 1 }, -/turf/open/floor/plasteel, /area/engine/engineering) "axW" = ( /obj/structure/disposalpipe/segment, @@ -11392,10 +11377,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 1 }, -/turf/open/floor/plasteel, /area/engine/engineering) "axX" = ( /obj/machinery/light_switch{ @@ -11411,41 +11395,21 @@ /obj/structure/sign/warning/securearea{ pixel_y = 32 }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 5 }, -/turf/open/floor/plasteel, /area/engine/engineering) "axY" = ( /turf/closed/wall/r_wall, /area/engine/engineering) -"axZ" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"aya" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "ayc" = ( -/obj/structure/table/reinforced, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/item/clothing/mask/breath{ - pixel_x = 4 +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/white{ + icon_state = "2-4" }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating/airless, /area/engine/engineering) -"aye" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 10 - }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/space/nearstation) "ayf" = ( /obj/structure/closet/crate, /obj/item/stack/sheet/glass{ @@ -11788,46 +11752,59 @@ dir = 1; pixel_y = 2 }, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side{ + dir = 8 + }, /area/engine/engineering) "ayT" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "ayV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/engine/engineering) "ayW" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/structure/cable/white{ + icon_state = "4-8" }, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine"; - req_access_txt = "10" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"ayX" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, /area/engine/engineering) -"aza" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +"ayX" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/turf/open/floor/plasteel/dark, +/obj/machinery/door/airlock/external{ + name = "External Containment Access"; + req_access_txt = "10; 13" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"aza" = ( +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/turf/open/floor/plating/airless, /area/engine/engineering) "azb" = ( /obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, @@ -11839,13 +11816,18 @@ }, /area/security/brig) "azd" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/space/nearstation) +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "aze" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-22" @@ -12231,7 +12213,7 @@ /obj/machinery/computer/security/telescreen{ desc = "Used for watching Prison Wing holding areas."; name = "Prison Monitor"; - network = list("Prison"); + network = list("prison"); pixel_y = 30 }, /obj/item/device/flashlight/lamp/green{ @@ -12284,6 +12266,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/light/small{ + dir = 1 + }, /turf/open/floor/plating{ icon_state = "platingdmg2" }, @@ -12473,13 +12458,20 @@ "aAo" = ( /obj/structure/closet/secure_closet/engineering_personal, /obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side{ + dir = 9 + }, /area/engine/engineering) "aAp" = ( /obj/structure/closet/secure_closet/engineering_personal, /obj/item/clothing/suit/hooded/wintercoat/engineering, /obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/yellow/side{ + dir = 1 + }, /area/engine/engineering) "aAr" = ( /obj/item/device/radio/intercom{ @@ -12490,18 +12482,14 @@ }, /obj/machinery/camera{ c_tag = "Engineering - Fore"; - dir = 2; - network = list("SS13") + dir = 2 }, -/obj/effect/turf_decal/stripes/line{ +/obj/structure/closet/secure_closet/engineering_personal, +/turf/open/floor/plasteel/yellow/side{ dir = 1 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aAt" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 }, @@ -12515,27 +12503,21 @@ sortType = 4 }, /obj/effect/landmark/start/station_engineer, +/obj/structure/cable/white{ + icon_state = "1-4" + }, /turf/open/floor/plasteel, /area/engine/engineering) "aAv" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plasteel, /area/engine/engineering) -"aAw" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "aAx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/r_wall, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, /area/engine/engineering) "aAz" = ( /obj/structure/table/wood, @@ -12559,7 +12541,7 @@ id = "mining_home"; name = "mining shuttle bay"; width = 7; - roundstart_template = /datum/map_template/shuttle/mining/box; + roundstart_template = /datum/map_template/shuttle/mining/box }, /turf/open/space/basic, /area/space) @@ -12762,7 +12744,7 @@ id = "laborcamp_home"; name = "fore bay 1"; width = 9; - roundstart_template = /datum/map_template/shuttle/labour/box; + roundstart_template = /datum/map_template/shuttle/labour/box }, /turf/open/space/basic, /area/space) @@ -12782,8 +12764,7 @@ }, /obj/machinery/camera{ c_tag = "Labor Shuttle Dock"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/flasher{ id = "PRelease"; @@ -12894,8 +12875,7 @@ /obj/effect/landmark/blobstart, /obj/machinery/camera{ c_tag = "Detective's Office"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/grimy, /area/security/detectives_office) @@ -13115,8 +13095,7 @@ "aBG" = ( /obj/machinery/camera{ c_tag = "Engineering - Storage"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/machinery/suit_storage_unit/engine, /obj/effect/turf_decal/bot{ @@ -13156,18 +13135,14 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/turf/open/floor/plasteel/yellow/side{ + dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aBK" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aBL" = ( @@ -13179,9 +13154,6 @@ }, /obj/machinery/rnd/circuit_imprinter, /obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aBM" = ( @@ -13191,9 +13163,6 @@ }, /obj/machinery/rnd/protolathe/department/engineering, /obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aBN" = ( @@ -13202,21 +13171,10 @@ dir = 1 }, /obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aBO" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) -"aBQ" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, /area/engine/engineering) "aBS" = ( /obj/item/stack/ore/silver, @@ -13230,8 +13188,7 @@ /obj/structure/reagent_dispensers/fueltank, /obj/machinery/camera{ c_tag = "Mining Dock"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, @@ -13259,8 +13216,7 @@ }, /obj/machinery/camera{ c_tag = "Mining Office"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/mineral/equipment_vendor, /turf/open/floor/plasteel/brown{ @@ -13336,8 +13292,7 @@ "aCg" = ( /obj/machinery/camera/motion{ c_tag = "Vault"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/machinery/light, /obj/structure/cable/yellow{ @@ -13732,9 +13687,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aCV" = ( @@ -13744,38 +13696,29 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/engine/engineering) "aCW" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) -"aCX" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/closed/wall/r_wall, +/turf/open/floor/plasteel, /area/engine/engineering) "aCY" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/structure/cable{ + icon_state = "2-4" }, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine"; - req_access_txt = "10" - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) +/obj/machinery/power/grounding_rod, +/turf/open/floor/plating/airless, +/area/space) "aCZ" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/power/tesla_coil, +/turf/open/floor/plating/airless, +/area/space) "aDa" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -13939,8 +13882,7 @@ }, /obj/machinery/camera{ c_tag = "Fore Primary Hallway Cells"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/red/corner{ dir = 1 @@ -14057,8 +13999,7 @@ }, /obj/machinery/camera{ c_tag = "Brig - Desk"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/item/device/radio/intercom{ freerange = 0; @@ -14379,10 +14320,9 @@ icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aEo" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -14405,31 +14345,16 @@ /obj/structure/cable/yellow{ icon_state = "2-8" }, -/obj/structure/cable/white{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aEq" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aEr" = ( -/obj/structure/cable/white{ - icon_state = "4-8" +/obj/machinery/camera/emp_proof{ + c_tag = "Containment - Fore Port"; + dir = 4; + network = list("singularity") }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, +/obj/machinery/power/grounding_rod, +/turf/open/floor/plating/airless, /area/engine/engineering) "aEt" = ( /obj/structure/table, @@ -14448,7 +14373,7 @@ "aEv" = ( /obj/machinery/computer/security/mining{ dir = 4; - network = list("MINE","AuxBase") + network = list("mine","auxbase") }, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) @@ -14777,8 +14702,7 @@ }, /obj/machinery/camera{ c_tag = "Restrooms"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/restrooms) @@ -14968,10 +14892,9 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 2 }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aFw" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ @@ -14989,52 +14912,26 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"aFz" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine"; - req_access_txt = "10" - }, -/turf/open/floor/plating, -/area/engine/engineering) "aFA" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/engine, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "aFB" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/rack, +/obj/machinery/button/door{ + id = "engpa"; + name = "Engineering Chamber Shutters Control"; + pixel_y = -26; + req_access_txt = "11" }, -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 6 - }, -/turf/open/floor/engine, +/obj/item/clothing/gloves/color/black, +/obj/item/wrench, +/obj/item/clothing/glasses/meson/engine, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "aFC" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"aFD" = ( -/obj/structure/cable/white{ - icon_state = "1-4" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/meter, -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible, -/turf/open/floor/engine, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "aFE" = ( /obj/structure/table/wood, @@ -15215,8 +15112,7 @@ }, /obj/machinery/camera{ c_tag = "Storage Wing - Security Access Door"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/light/small{ dir = 8 @@ -15457,7 +15353,7 @@ desc = "Used for watching Prison Wing holding areas."; dir = 1; name = "Prison Monitor"; - network = list("Prison"); + network = list("prison"); pixel_y = -30 }, /obj/item/restraints/handcuffs, @@ -15782,10 +15678,9 @@ /obj/structure/extinguisher_cabinet{ pixel_x = -27 }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aGW" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -15796,31 +15691,14 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/engineering) -"aGY" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) "aGZ" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "External Gas to Loop" +/obj/machinery/door/poddoor/shutters/preopen{ + id = "engpa"; + name = "Engineering Chamber Shutters" }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"aHa" = ( -/obj/structure/cable/white, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/engine/engineering) "aHb" = ( /obj/machinery/camera{ @@ -16225,6 +16103,9 @@ lootcount = 2; name = "2maintenance loot spawner" }, +/obj/machinery/light/small{ + dir = 8 + }, /turf/open/floor/plating, /area/maintenance/starboard/fore) "aHW" = ( @@ -16241,42 +16122,21 @@ dir = 8; pixel_x = -24 }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aHY" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/engine/engineering) -"aHZ" = ( -/obj/item/clothing/gloves/color/yellow, -/obj/item/clothing/gloves/color/yellow, -/obj/item/clothing/gloves/color/yellow, -/obj/item/clothing/suit/hazardvest, -/obj/item/clothing/suit/hazardvest, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/effect/turf_decal/delivery, -/obj/structure/table, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aIc" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/plating, -/area/engine/engineering) "aIe" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/engine/engineering) +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/space, +/area/space) "aIf" = ( /obj/machinery/camera{ c_tag = "Auxillary Base Construction"; @@ -16352,8 +16212,7 @@ }, /obj/machinery/camera{ c_tag = "Cargo Bay - Fore"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/structure/sign/map/right{ desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; @@ -16478,8 +16337,7 @@ "aIt" = ( /obj/machinery/camera{ c_tag = "Cargo Bay - Storage Wing Entrance"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -16544,8 +16402,7 @@ }, /obj/machinery/camera{ c_tag = "Storage Wing"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/machinery/light, /obj/structure/cable/yellow{ @@ -16745,8 +16602,7 @@ }, /obj/machinery/camera{ c_tag = "Courtroom"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/blue/side{ dir = 1 @@ -16795,7 +16651,7 @@ /obj/machinery/computer/security/telescreen{ desc = "Used for watching Prison Wing holding areas."; name = "Prison Monitor"; - network = list("Prison"); + network = list("prison"); pixel_y = 30 }, /turf/open/floor/wood, @@ -16945,8 +16801,7 @@ }, /obj/machinery/camera{ c_tag = "Engineering - Secure Storage"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plating, /area/engine/engineering) @@ -16958,34 +16813,13 @@ /obj/structure/table, /obj/item/airlock_painter, /obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aJp" = ( -/obj/structure/table, -/obj/effect/turf_decal/delivery, -/obj/item/clothing/glasses/meson/engine, -/obj/item/clothing/glasses/meson/engine, -/obj/item/clothing/glasses/meson/engine, -/obj/machinery/light{ - dir = 4 +/turf/open/floor/plasteel/yellow/side{ + dir = 9 }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/item/pipe_dispenser, -/obj/item/pipe_dispenser, -/obj/item/pipe_dispenser, -/turf/open/floor/plasteel, /area/engine/engineering) "aJu" = ( /turf/open/floor/plating, /area/engine/engineering) -"aJv" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 6 - }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) "aJB" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum/external, @@ -17432,12 +17266,6 @@ }, /turf/open/floor/plating, /area/engine/engineering) -"aKA" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "aKB" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -17451,53 +17279,26 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/engine/engineering) -"aKF" = ( -/obj/machinery/button/door{ - id = "engsm"; - name = "Radiation Shutters Control"; - pixel_x = 24; - req_access_txt = "10" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) "aKG" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ +/obj/structure/particle_accelerator/end_cap{ + icon_state = "end_cap"; dir = 4 }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) +/turf/open/floor/plating, +/area/engine/engineering) "aKH" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 4; - name = "Gas to Chamber"; - on = 0 +/obj/structure/particle_accelerator/fuel_chamber{ + icon_state = "fuel_chamber"; + dir = 4 }, -/turf/open/floor/engine, -/area/engine/supermatter) +/turf/open/floor/plating, +/area/engine/engineering) "aKI" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 9 +/obj/structure/particle_accelerator/power_box{ + icon_state = "power_box"; + dir = 4 }, -/obj/machinery/meter, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"aKL" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 8; - name = "Mix Bypass"; - on = 0 - }, -/turf/open/floor/engine, +/turf/open/floor/plating, /area/engine/engineering) "aKN" = ( /obj/machinery/door/poddoor{ @@ -17792,7 +17593,7 @@ /obj/structure/table, /obj/machinery/camera/motion{ c_tag = "AI Upload Chamber - Fore"; - network = list("SS13","RD","AIUpload") + network = list("ss13","rd","aiupload") }, /obj/item/twohanded/required/kirbyplants/photosynthetic{ pixel_y = 10 @@ -17891,8 +17692,7 @@ /obj/machinery/photocopier, /obj/machinery/camera{ c_tag = "Law Office"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/wood, /area/lawoffice) @@ -17962,8 +17762,7 @@ /obj/structure/disposalpipe/trunk, /obj/machinery/camera{ c_tag = "Locker Room Starboard"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/structure/sign/warning/pods{ pixel_y = 30 @@ -18050,12 +17849,6 @@ /obj/effect/landmark/blobstart, /turf/open/floor/plating, /area/engine/engineering) -"aMc" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "aMd" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable{ @@ -18076,62 +17869,52 @@ /turf/open/floor/plasteel, /area/engine/engineering) "aMg" = ( -/obj/machinery/door/firedoor, /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine"; - req_access_txt = "10" +/turf/open/floor/plasteel/yellow/side{ + dir = 4 }, -/turf/open/floor/plating, /area/engine/engineering) "aMh" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "engpa"; + name = "Engineering Chamber Shutters" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aMi" = ( /obj/structure/cable{ icon_state = "2-8" }, -/obj/structure/cable{ - icon_state = "1-8" - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/engine, +/turf/open/floor/plating, /area/engine/engineering) -"aMi" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - name = "Gas to Filter" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"aMj" = ( -/obj/machinery/door/airlock/engineering/glass{ - heat_proof = 1; - name = "Supermatter Chamber"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/supermatter) "aMk" = ( -/turf/open/floor/engine, -/area/engine/supermatter) -"aMm" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/plasteel/dark, +/obj/machinery/particle_accelerator/control_box, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/turf/open/floor/plating, /area/engine/engineering) "aMo" = ( -/obj/structure/reflector/box/anchored{ - dir = 8 +/obj/effect/turf_decal/stripes/line{ + dir = 2 }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) +/turf/open/floor/plating/airless, +/area/space/nearstation) "aMq" = ( /obj/structure/window/reinforced, /turf/open/space, @@ -18200,8 +17983,7 @@ /area/quartermaster/storage) "aMA" = ( /obj/machinery/camera/autoname{ - dir = 4; - network = list("SS13") + dir = 4 }, /obj/structure/rack, /obj/item/storage/toolbox/electrical{ @@ -18579,7 +18361,9 @@ maxcharge = 15000 }, /obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side{ + dir = 10 + }, /area/engine/engineering) "aNr" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -18589,17 +18373,27 @@ /turf/open/floor/plasteel, /area/engine/engineering) "aNu" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 8; - name = "Gas to Filter"; - on = 0 +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/engine, -/area/engine/supermatter) +/obj/machinery/camera/emp_proof{ + c_tag = "Containment - Particle Accelerator"; + dir = 1; + network = list("singularity") + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/engine/engineering) "aNv" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/turf/open/floor/engine, -/area/engine/supermatter) +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/engine/engineering) "aNw" = ( /obj/structure/window/reinforced{ dir = 4 @@ -18772,8 +18566,7 @@ /area/quartermaster/qm) "aNP" = ( /obj/machinery/camera/autoname{ - dir = 2; - network = list("SS13") + dir = 2 }, /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -19245,8 +19038,7 @@ /obj/machinery/disposal/bin, /obj/machinery/camera{ c_tag = "Garden"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/structure/disposalpipe/trunk{ dir = 8 @@ -19265,10 +19057,9 @@ /obj/structure/cable/yellow{ icon_state = "0-4" }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aOP" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -19291,26 +19082,12 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"aOR" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/closet/firecloset, -/obj/effect/turf_decal/stripes/line{ +"aOS" = ( +/obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aOS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/item/device/radio/intercom{ - freerange = 0; - frequency = 1459; - name = "Station Intercom (General)"; - pixel_y = 21 - }, -/turf/open/floor/engine, -/area/engine/engineering) +/turf/open/floor/plating/airless, +/area/space) "aOT" = ( /obj/structure/window/reinforced{ dir = 4 @@ -19556,8 +19333,7 @@ }, /obj/machinery/camera{ c_tag = "Tool Storage"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/brown{ dir = 4 @@ -19637,8 +19413,7 @@ }, /obj/machinery/camera{ c_tag = "Fore Primary Hallway Aft"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/red/corner{ dir = 2 @@ -19838,8 +19613,7 @@ }, /obj/machinery/camera{ c_tag = "Engineering - Power Monitoring"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/machinery/modular_computer/console/preset/engineering, /turf/open/floor/plasteel/vault, @@ -19857,41 +19631,32 @@ icon_state = "2-8" }, /obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side{ + dir = 9 + }, /area/engine/engineering) "aPZ" = ( /obj/machinery/vending/tool, /obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aQa" = ( -/obj/structure/table, -/obj/effect/turf_decal/delivery, -/obj/item/clothing/glasses/meson, -/obj/item/clothing/glasses/meson, -/obj/item/clothing/glasses/meson, -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/turf/open/floor/plasteel/yellow/side{ + dir = 1 }, -/obj/item/storage/belt/utility, -/obj/item/storage/belt/utility, -/turf/open/floor/plasteel, /area/engine/engineering) "aQd" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/structure/rack, +/obj/machinery/button/door{ + id = "engpa"; + name = "Engineering Chamber Shutters Control"; + pixel_y = 26; + req_access_txt = "11" }, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ +/obj/item/storage/belt/utility, +/obj/item/weldingtool, +/obj/item/clothing/head/welding, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/yellow/side{ dir = 1 }, -/turf/open/floor/engine, -/area/engine/engineering) -"aQe" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, /area/engine/engineering) "aQf" = ( /obj/structure/chair{ @@ -19979,8 +19744,7 @@ }, /obj/machinery/camera{ c_tag = "Cargo Bay - Starboard"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/item/paper_bin{ pixel_x = -1; @@ -19997,7 +19761,7 @@ "aQq" = ( /obj/machinery/computer/security/mining{ dir = 4; - network = list("MINE","AuxBase") + network = list("mine","auxbase") }, /obj/machinery/light_switch{ pixel_x = -23 @@ -20111,7 +19875,7 @@ /obj/machinery/camera/motion{ c_tag = "AI Upload Chamber - Port"; dir = 1; - network = list("SS13","RD","AIUpload") + network = list("ss13","rd","aiupload") }, /turf/open/floor/circuit, /area/ai_monitored/turret_protected/ai_upload) @@ -20134,7 +19898,7 @@ /obj/machinery/camera/motion{ c_tag = "AI Upload Chamber - Starboard"; dir = 1; - network = list("SS13","RD","AIUpload") + network = list("ss13","rd","aiupload") }, /turf/open/floor/circuit, /area/ai_monitored/turret_protected/ai_upload) @@ -20248,8 +20012,7 @@ }, /obj/machinery/camera{ c_tag = "Crew Quarters Entrance"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/neutral/corner{ dir = 1 @@ -20498,19 +20261,9 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/turf/open/floor/plasteel/yellow/side{ + dir = 8 }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aRo" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, /area/engine/engineering) "aRp" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -20522,9 +20275,6 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aRq" = ( @@ -20551,13 +20301,6 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel, /area/engine/engineering) -"aRv" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 5 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "aRy" = ( /turf/closed/wall/r_wall, /area/aisat) @@ -20974,10 +20717,9 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aSu" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ @@ -21006,9 +20748,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, /turf/open/floor/plasteel, /area/engine/engineering) "aSx" = ( @@ -21019,36 +20759,39 @@ /obj/structure/cable/yellow{ icon_state = "1-8" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/engineering) "aSz" = ( -/obj/structure/cable{ - icon_state = "1-4" +/obj/item/pen, +/obj/item/storage/belt/utility, +/obj/item/clothing/glasses/meson, +/obj/item/paper_bin{ + layer = 2.9 }, -/obj/effect/turf_decal/stripes/line{ +/obj/structure/table/glass, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) "aSA" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/item/book/manual/wiki/engineering_hacking{ + pixel_x = 3; + pixel_y = 3 }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 5 - }, -/turf/open/floor/engine, +/obj/item/book/manual/wiki/engineering_construction, +/obj/item/clothing/gloves/color/yellow, +/obj/structure/table/glass, +/obj/item/device/flashlight, +/turf/open/floor/plasteel, /area/engine/engineering) "aSB" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aSD" = ( @@ -21366,8 +21109,7 @@ /obj/machinery/light, /obj/machinery/camera{ c_tag = "Courtroom - Gallery"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/dark, /area/security/courtroom) @@ -21458,8 +21200,7 @@ }, /obj/machinery/camera{ c_tag = "Locker Room Port"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/neutral/corner{ dir = 2 @@ -21535,10 +21276,9 @@ /obj/structure/cable/yellow{ icon_state = "1-8" }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/turf/open/floor/plasteel/yellow/side{ + dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aTG" = ( /obj/structure/disposalpipe/segment{ @@ -21550,26 +21290,18 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aTH" = ( /obj/structure/disposalpipe/segment{ dir = 9 }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/open/floor/plasteel, +/obj/machinery/light, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "aTI" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -21580,9 +21312,6 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, @@ -21595,31 +21324,6 @@ /obj/structure/cable/white{ icon_state = "4-8" }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aTM" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"aTN" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/engine, -/area/engine/engineering) -"aTO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aTQ" = ( @@ -21655,7 +21359,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Exterior - Fore Port"; dir = 8; - network = list("MiniSat") + network = list("minisat") }, /turf/open/floor/plasteel/dark, /area/aisat) @@ -21707,7 +21411,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Exterior - Fore Starboard"; dir = 4; - network = list("MiniSat") + network = list("minisat") }, /turf/open/floor/plasteel/dark, /area/aisat) @@ -21757,8 +21461,7 @@ }, /obj/machinery/camera{ c_tag = "Cargo Bay - Port"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/conveyor{ dir = 1; @@ -21957,7 +21660,7 @@ desc = "Used for watching the AI Upload."; dir = 4; name = "AI Upload Monitor"; - network = list("AIUpload"); + network = list("aiupload"); pixel_x = -29 }, /turf/open/floor/plasteel/vault{ @@ -21983,12 +21686,12 @@ desc = "Used for watching areas on the MiniSat."; dir = 8; name = "MiniSat Monitor"; - network = list("MiniSat","tcomm"); + network = list("minisat","tcomm"); pixel_x = 29 }, /obj/machinery/camera/motion{ c_tag = "AI Upload Foyer"; - network = list("SS13","RD","AIUpload") + network = list("ss13","rd","aiupload") }, /obj/machinery/airalarm{ pixel_y = 26 @@ -22225,7 +21928,9 @@ "aUY" = ( /obj/effect/turf_decal/delivery, /obj/structure/closet/wardrobe/engineering_yellow, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side{ + dir = 10 + }, /area/engine/engineering) "aUZ" = ( /obj/structure/disposalpipe/segment, @@ -22236,8 +21941,8 @@ /obj/effect/turf_decal/bot{ dir = 1 }, -/turf/open/floor/plasteel{ - dir = 1 +/turf/open/floor/plasteel/yellow/side{ + dir = 6 }, /area/engine/engineering) "aVa" = ( @@ -22274,31 +21979,13 @@ dir = 4 }, /obj/structure/closet/secure_closet/engineering_electrical, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "aVe" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"aVf" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/engineering{ - name = "Supermatter Engine"; - req_access_txt = "10" - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"aVh" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "aVk" = ( /obj/structure/window/reinforced{ @@ -22334,7 +22021,7 @@ /obj/machinery/camera{ c_tag = "AI Chamber - Fore"; dir = 2; - network = list("RD") + network = list("rd") }, /obj/structure/showcase/cyborg/old{ dir = 2; @@ -22402,8 +22089,7 @@ /obj/structure/chair, /obj/machinery/camera{ c_tag = "Arrivals - Fore Arm - Far"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -22584,7 +22270,7 @@ }, /obj/machinery/computer/security/mining{ dir = 8; - network = list("MINE","AuxBase") + network = list("mine","auxbase") }, /turf/open/floor/plasteel/red/side{ dir = 4 @@ -22688,8 +22374,7 @@ "aWd" = ( /obj/machinery/camera{ c_tag = "Central Primary Hallway - Fore"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/red/corner{ dir = 1 @@ -22840,8 +22525,10 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "aWu" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/obj/machinery/door/airlock/external{ + name = "Escape Pod Four"; + req_access = null; + req_access_txt = "32" }, /turf/open/floor/plating, /area/maintenance/starboard) @@ -22929,18 +22616,16 @@ dir = 1 }, /area/engine/engineering) -"aWH" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 10 - }, -/turf/open/floor/plating, -/area/maintenance/starboard) "aWK" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 10 +/obj/structure/cable/white{ + icon_state = "2-4" }, -/turf/open/space, -/area/space/nearstation) +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "aWL" = ( /obj/machinery/ai_status_display{ pixel_x = -32 @@ -23063,8 +22748,7 @@ }, /obj/machinery/camera{ c_tag = "Arrivals - Fore Arm"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/light{ dir = 4 @@ -23183,8 +22867,7 @@ /obj/structure/table/reinforced, /obj/machinery/camera{ c_tag = "Security Post - Cargo"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/red/side, /area/security/checkpoint/supply) @@ -23368,8 +23051,7 @@ }, /obj/machinery/camera{ c_tag = "Central Primary Hallway - Fore - AI Upload"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/structure/sign/warning/securearea{ desc = "A warning sign which reads 'HIGH-POWER TURRETS AHEAD'."; @@ -23785,8 +23467,7 @@ }, /obj/machinery/camera{ c_tag = "Chief Engineer's Office"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -23841,17 +23522,20 @@ /turf/closed/wall, /area/security/checkpoint/engineering) "aYx" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "aYy" = ( /obj/machinery/camera{ c_tag = "AI Chamber - Port"; dir = 4; - network = list("RD") + network = list("rd") }, /obj/structure/showcase/cyborg/old{ dir = 4; @@ -23997,8 +23681,7 @@ "aYP" = ( /obj/machinery/camera{ c_tag = "Cargo Bay - Aft"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/effect/turf_decal/stripes/line{ dir = 2 @@ -24565,7 +24248,7 @@ /obj/machinery/camera{ c_tag = "AI Chamber - Core"; dir = 2; - network = list("RD") + network = list("rd") }, /turf/open/floor/plasteel/vault{ dir = 10 @@ -24968,8 +24651,7 @@ }, /obj/machinery/camera{ c_tag = "Central Primary Hallway - Fore - Port Corner"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/neutral/corner{ dir = 1 @@ -25150,8 +24832,7 @@ }, /obj/machinery/camera{ c_tag = "Central Primary Hallway - Fore - Courtroom"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/neutral/corner{ dir = 8 @@ -25219,8 +24900,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/camera{ c_tag = "Central Primary Hallway - Fore - Starboard Corner"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/neutral/corner{ dir = 4 @@ -25464,7 +25144,7 @@ desc = "Used for monitoring the engine."; dir = 8; name = "Engine Monitor"; - network = list("Engine"); + network = list("engine"); pixel_x = 32 }, /turf/open/floor/plasteel/vault{ @@ -25503,8 +25183,7 @@ }, /obj/machinery/camera{ c_tag = "Engineering - Entrance"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -25519,7 +25198,7 @@ /obj/machinery/computer/security/telescreen{ dir = 4; name = "MiniSat Monitor"; - network = list("MiniSat","tcomm"); + network = list("minisat","tcomm"); pixel_x = -29 }, /turf/open/floor/plasteel/red/side{ @@ -25577,7 +25256,7 @@ /obj/machinery/camera{ c_tag = "AI Chamber - Starboard"; dir = 8; - network = list("RD") + network = list("rd") }, /obj/structure/showcase/cyborg/old{ dir = 8; @@ -25731,8 +25410,7 @@ }, /obj/machinery/camera{ c_tag = "Cargo - Foyer"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/brown{ dir = 4 @@ -25842,8 +25520,7 @@ "bcr" = ( /obj/machinery/camera{ c_tag = "Auxiliary Tool Storage"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/airalarm{ dir = 8; @@ -26062,7 +25739,7 @@ desc = "Used for monitoring the engine."; dir = 8; name = "Engine Monitor"; - network = list("Engine"); + network = list("engine"); pixel_x = 32 }, /turf/open/floor/plasteel/red/side{ @@ -26166,8 +25843,7 @@ }, /obj/machinery/camera{ c_tag = "Customs Checkpoint"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/red/side{ dir = 1 @@ -26687,7 +26363,7 @@ /obj/machinery/computer/security/telescreen{ dir = 1; name = "MiniSat Monitor"; - network = list("MiniSat","tcomm"); + network = list("minisat","tcomm"); pixel_y = -30 }, /turf/open/floor/plasteel/vault{ @@ -26754,8 +26430,7 @@ "bem" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/machinery/camera/autoname{ - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/button/door{ desc = "A remote control-switch for the engineering security doors."; @@ -26835,7 +26510,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Exterior - Port Fore"; dir = 8; - network = list("MiniSat") + network = list("minisat") }, /turf/open/floor/plasteel/dark, /area/aisat) @@ -26876,7 +26551,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Exterior - Starboard Fore"; dir = 4; - network = list("MiniSat") + network = list("minisat") }, /turf/open/floor/plasteel/dark, /area/aisat) @@ -27046,8 +26721,7 @@ }, /obj/machinery/camera{ c_tag = "Cargo - Office"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/brown{ dir = 8 @@ -27117,8 +26791,7 @@ /obj/item/reagent_containers/spray/cleaner, /obj/machinery/camera{ c_tag = "Custodial Closet"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/light/small{ dir = 8 @@ -27321,8 +26994,7 @@ /obj/effect/landmark/start/captain, /obj/machinery/camera{ c_tag = "Captain's Quarters"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/wood, /area/crew_quarters/heads/captain/private) @@ -28105,8 +27777,7 @@ }, /obj/machinery/camera{ c_tag = "Bridge - Central"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/structure/table/glass, /turf/open/floor/plasteel/darkbrown/side{ @@ -28331,8 +28002,7 @@ }, /obj/machinery/camera{ c_tag = "Starboard Primary Hallway - Tech Storage"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/yellow/corner{ dir = 1 @@ -28626,7 +28296,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Exterior - Space Access"; dir = 1; - network = list("MiniSat") + network = list("minisat") }, /turf/open/floor/plasteel/vault{ dir = 8 @@ -28669,7 +28339,7 @@ /obj/machinery/camera{ c_tag = "AI Chamber - Aft"; dir = 1; - network = list("RD") + network = list("rd") }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/plasteel/dark, @@ -29569,8 +29239,7 @@ }, /obj/machinery/camera{ c_tag = "Cargo - Mailroom"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/arrival{ dir = 2 @@ -29856,7 +29525,7 @@ icon_state = "2-4" }, /obj/machinery/computer/security/mining{ - network = list("MINE","AuxBase") + network = list("mine","auxbase") }, /obj/machinery/keycard_auth{ pixel_y = 24 @@ -30071,8 +29740,7 @@ }, /obj/machinery/camera{ c_tag = "Starboard Primary Hallway - Auxiliary Tool Storage"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/caution/corner{ dir = 8 @@ -30114,8 +29782,7 @@ }, /obj/machinery/camera{ c_tag = "Starboard Primary Hallway - Engineering"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/caution/corner{ dir = 8 @@ -30610,7 +30277,7 @@ /obj/machinery/computer/security/telescreen{ desc = "Used for watching Prison Wing holding areas."; name = "Prison Monitor"; - network = list("Prison"); + network = list("prison"); pixel_y = 30 }, /turf/open/floor/wood, @@ -30786,8 +30453,7 @@ }, /obj/machinery/camera{ c_tag = "Bridge - Starboard"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/darkblue/side{ dir = 4 @@ -31029,8 +30695,7 @@ }, /obj/machinery/camera{ c_tag = "Engineering - Foyer - Starboard"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel, /area/engine/break_room) @@ -31226,7 +30891,7 @@ /obj/machinery/camera{ c_tag = "MiniSat - Antechamber"; dir = 4; - network = list("MiniSat") + network = list("minisat") }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 @@ -31352,8 +31017,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/camera{ c_tag = "Arrivals - Station Entrance"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -31475,8 +31139,7 @@ }, /obj/machinery/camera{ c_tag = "Port Primary Hallway - Middle"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/neutral/corner{ dir = 1 @@ -31649,8 +31312,7 @@ /obj/structure/cable/yellow, /obj/machinery/camera{ c_tag = "Bridge - Port"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/darkblue/side{ dir = 8 @@ -31808,8 +31470,7 @@ }, /obj/machinery/camera{ c_tag = "Central Primary Hallway - Starboard - Art Storage"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/neutral/corner{ @@ -31882,8 +31543,7 @@ /obj/item/gun/ballistic/revolver/doublebarrel, /obj/machinery/camera{ c_tag = "Bar - Backroom"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/wood, /area/crew_quarters/bar) @@ -32095,7 +31755,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Exterior - Fore"; dir = 1; - network = list("MiniSat") + network = list("minisat") }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, @@ -32110,9 +31770,6 @@ dir = 6 }, /area/security/checkpoint/customs) -"bpu" = ( -/turf/closed/wall/r_wall, -/area/space/nearstation) "bpv" = ( /obj/structure/sign/warning/securearea{ pixel_y = 32 @@ -32495,8 +32152,7 @@ }, /obj/machinery/camera{ c_tag = "Arrivals - Lounge"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/effect/landmark/start/assistant, /turf/open/floor/plasteel/grimy, @@ -32816,7 +32472,7 @@ /obj/machinery/computer/security/telescreen{ dir = 1; name = "MiniSat Monitor"; - network = list("MiniSat","tcomm"); + network = list("minisat","tcomm"); pixel_y = -29 }, /turf/open/floor/plasteel/darkblue/side{ @@ -33285,8 +32941,7 @@ }, /obj/machinery/camera{ c_tag = "Engineering - Foyer - Port"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/structure/table/glass, /turf/open/floor/plasteel/cafeteria{ @@ -33456,7 +33111,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Exterior Access"; dir = 1; - network = list("MiniSat") + network = list("minisat") }, /obj/machinery/power/apc{ aidisabled = 0; @@ -33550,7 +33205,7 @@ desc = "Used for watching the RD's goons from the safety of his office."; dir = 4; name = "Research Monitor"; - network = list("RD"); + network = list("rd"); pixel_x = -28 }, /turf/open/floor/plasteel/vault{ @@ -33572,7 +33227,7 @@ /obj/machinery/camera/motion{ c_tag = "MiniSat Foyer"; dir = 8; - network = list("MiniSat") + network = list("minisat") }, /turf/open/floor/plasteel/darkblue/corner{ dir = 8 @@ -33630,7 +33285,7 @@ /obj/machinery/computer/security/telescreen{ dir = 8; name = "MiniSat Monitor"; - network = list("MiniSat","tcomm"); + network = list("minisat","tcomm"); pixel_x = 28 }, /turf/open/floor/plasteel/vault{ @@ -33655,7 +33310,7 @@ /obj/machinery/computer/security/telescreen{ dir = 1; name = "MiniSat Monitor"; - network = list("MiniSat","tcomm"); + network = list("minisat","tcomm"); pixel_y = -29 }, /turf/open/floor/plasteel/dark, @@ -33679,7 +33334,7 @@ /obj/machinery/camera/motion{ c_tag = "MiniSat Maintenance"; dir = 8; - network = list("MiniSat") + network = list("minisat") }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 @@ -33904,8 +33559,7 @@ }, /obj/machinery/camera{ c_tag = "Port Primary Hallway - Starboard"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/neutral/corner{ dir = 8 @@ -34050,8 +33704,7 @@ }, /obj/machinery/camera{ c_tag = "Bridge - Command Chair"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/carpet, /area/bridge) @@ -34424,7 +34077,7 @@ /obj/machinery/computer/security/telescreen{ dir = 1; name = "MiniSat Monitor"; - network = list("MiniSat","tcomm"); + network = list("minisat","tcomm"); pixel_y = -28 }, /turf/open/floor/plasteel/darkblue/corner, @@ -34555,8 +34208,7 @@ }, /obj/machinery/camera{ c_tag = "Port Primary Hallway - Port"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/dark, /area/hallway/primary/port) @@ -34870,8 +34522,7 @@ "buJ" = ( /obj/machinery/camera{ c_tag = "Captain's Office"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/carpet, /area/crew_quarters/heads/captain/private) @@ -34883,8 +34534,7 @@ }, /obj/machinery/camera{ c_tag = "Captain's Office - Emergency Escape"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plating{ icon_state = "platingdmg2" @@ -35173,8 +34823,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /obj/machinery/camera{ c_tag = "Engineering - Transit Tube Access"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/effect/turf_decal/stripes/corner{ dir = 2 @@ -35659,8 +35308,7 @@ }, /obj/machinery/camera{ c_tag = "Bridge - Port Access"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/darkblue/corner{ dir = 1 @@ -35699,8 +35347,7 @@ "bwv" = ( /obj/machinery/camera{ c_tag = "Council Chamber"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/machinery/light{ dir = 1 @@ -35737,8 +35384,7 @@ }, /obj/machinery/camera{ c_tag = "Bridge - Starboard Access"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/darkblue/corner, /area/bridge) @@ -35886,8 +35532,7 @@ "bwM" = ( /obj/machinery/camera{ c_tag = "Bar"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/machinery/requests_console{ department = "Bar"; @@ -35985,8 +35630,7 @@ }, /obj/machinery/camera{ c_tag = "Club - Fore"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/wood, /area/crew_quarters/bar) @@ -36182,8 +35826,7 @@ "bxu" = ( /obj/machinery/camera{ c_tag = "Arrivals - Middle Arm - Far"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/machinery/status_display{ pixel_y = -32 @@ -36229,8 +35872,7 @@ }, /obj/machinery/camera{ c_tag = "Arrivals - Middle Arm"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, @@ -36885,8 +36527,7 @@ pixel_y = 32 }, /obj/machinery/camera{ - c_tag = "Atmospherics - Control Room"; - network = list("SS13") + c_tag = "Atmospherics - Control Room" }, /obj/machinery/computer/station_alert, /turf/open/floor/plasteel/caution{ @@ -36954,8 +36595,7 @@ icon_state = "0-2" }, /obj/machinery/camera{ - c_tag = "Atmospherics - Entrance"; - network = list("SS13") + c_tag = "Atmospherics - Entrance" }, /turf/open/floor/plasteel, /area/engine/atmos) @@ -37041,8 +36681,7 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/camera{ - c_tag = "Atmospherics - Distro Loop"; - network = list("SS13") + c_tag = "Atmospherics - Distro Loop" }, /turf/open/floor/plasteel/caution{ dir = 1 @@ -37110,7 +36749,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Exterior - Port Aft"; dir = 8; - network = list("MiniSat") + network = list("minisat") }, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 @@ -37202,7 +36841,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Exterior - Starboard Aft"; dir = 4; - network = list("MiniSat") + network = list("minisat") }, /turf/open/floor/plasteel/dark, /area/aisat) @@ -37281,8 +36920,7 @@ dir = 4 }, /obj/machinery/camera/autoname{ - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/carpet, @@ -37493,7 +37131,7 @@ /obj/machinery/computer/security/telescreen{ dir = 1; name = "MiniSat Monitor"; - network = list("MiniSat","tcomm"); + network = list("minisat","tcomm"); pixel_y = -29 }, /obj/structure/bed/dogbed/renault, @@ -37640,8 +37278,7 @@ }, /obj/machinery/camera{ c_tag = "Starboard Primary Hallway - Atmospherics"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/arrival{ dir = 8 @@ -37859,8 +37496,7 @@ "bAZ" = ( /obj/machinery/camera{ c_tag = "Head of Personnel's Office"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/structure/table/wood, /obj/item/storage/box/PDAs{ @@ -38565,7 +38201,6 @@ /obj/machinery/atmospherics/pipe/simple/purple/visible{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/orange/visible, /turf/open/space, /area/space/nearstation) "bCA" = ( @@ -38670,8 +38305,7 @@ /obj/machinery/light/small, /obj/machinery/camera{ c_tag = "Auxilary Restrooms"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plating, /area/crew_quarters/toilet/auxiliary) @@ -38948,8 +38582,7 @@ }, /obj/machinery/camera{ c_tag = "Command Hallway - Starboard"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/neutral/corner{ dir = 4 @@ -39246,7 +38879,7 @@ /obj/machinery/camera{ c_tag = "Telecomms - Server Room - Fore-Port"; dir = 2; - network = list("SS13","tcomm") + network = list("ss13","tcomm") }, /turf/open/floor/circuit/green/telecomms/mainframe, /area/tcommsat/server) @@ -39277,7 +38910,7 @@ /obj/machinery/camera{ c_tag = "Telecomms - Server Room - Fore-Starboard"; dir = 2; - network = list("SS13","tcomm") + network = list("ss13","tcomm") }, /turf/open/floor/circuit/green/telecomms/mainframe, /area/tcommsat/server) @@ -39376,8 +39009,7 @@ pixel_x = -32 }, /obj/machinery/camera/autoname{ - dir = 4; - network = list("SS13") + dir = 4 }, /obj/structure/displaycase/trophy, /turf/open/floor/wood, @@ -39511,8 +39143,7 @@ }, /obj/machinery/camera{ c_tag = "Command Hallway - Port"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/neutral/corner{ dir = 8 @@ -40310,8 +39941,7 @@ "bGb" = ( /obj/machinery/camera{ c_tag = "Atmospherics Tank - Mix"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/engine/vacuum, /area/engine/atmos) @@ -40432,8 +40062,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/camera{ c_tag = "Central Primary Hallway - Port"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/neutral/corner{ dir = 2 @@ -40565,8 +40194,7 @@ }, /obj/machinery/camera{ c_tag = "Command Hallway - Central"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/neutral/corner{ dir = 2 @@ -41358,8 +40986,7 @@ /obj/machinery/light, /obj/machinery/camera{ c_tag = "Kitchen Hatch"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/bar, /area/crew_quarters/bar) @@ -41641,7 +41268,7 @@ /obj/machinery/camera{ c_tag = "Telecomms - Control Room"; dir = 1; - network = list("SS13","tcomm") + network = list("ss13","tcomm") }, /obj/structure/table/wood, /obj/item/pen, @@ -42181,8 +41808,7 @@ "bKn" = ( /obj/machinery/camera{ c_tag = "Club - Aft"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/machinery/computer/security/telescreen/entertainment{ pixel_y = -29 @@ -42404,7 +42030,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Exterior - Aft Starboard"; dir = 4; - network = list("MiniSat") + network = list("minisat") }, /obj/structure/window/reinforced{ dir = 4 @@ -42457,8 +42083,7 @@ }, /obj/machinery/camera{ c_tag = "Arrivals - Aft Arm"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/arrival{ dir = 4 @@ -42793,8 +42418,7 @@ }, /obj/machinery/camera{ c_tag = "Central Primary Hallway - Starboard - Kitchen"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/neutral/corner{ dir = 1 @@ -42921,8 +42545,7 @@ }, /obj/machinery/camera{ c_tag = "Telecomms - Storage"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/dark, /area/storage/tcom) @@ -43002,8 +42625,7 @@ }, /obj/machinery/camera{ c_tag = "Atmospherics - Central"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, @@ -43032,10 +42654,6 @@ /obj/machinery/meter, /turf/open/floor/plasteel, /area/engine/atmos) -"bMi" = ( -/obj/machinery/atmospherics/pipe/manifold4w/general/visible, -/turf/open/floor/plasteel, -/area/engine/atmos) "bMj" = ( /obj/machinery/holopad, /turf/open/floor/plasteel, @@ -43073,8 +42691,7 @@ "bMn" = ( /obj/machinery/camera{ c_tag = "Atmospherics Tank - N2O"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/engine/n2o, /area/engine/atmos) @@ -43089,7 +42706,7 @@ /obj/machinery/camera{ c_tag = "Telecomms - Server Room - Aft-Port"; dir = 4; - network = list("SS13","tcomm") + network = list("ss13","tcomm") }, /turf/open/floor/plasteel/dark/telecomms/mainframe, /area/tcommsat/server) @@ -43127,7 +42744,7 @@ /obj/machinery/camera{ c_tag = "Telecomms - Server Room - Aft-Starboard"; dir = 8; - network = list("SS13","tcomm") + network = list("ss13","tcomm") }, /obj/structure/cable/yellow{ icon_state = "0-8" @@ -43146,8 +42763,7 @@ "bMu" = ( /obj/machinery/camera{ c_tag = "Arrivals - Aft Arm - Far"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, @@ -43325,8 +42941,7 @@ /obj/item/folder, /obj/item/folder, /obj/machinery/camera/autoname{ - dir = 1; - network = list("SS13") + dir = 1 }, /obj/structure/table/wood, /obj/item/device/taperecorder, @@ -43435,8 +43050,7 @@ "bMZ" = ( /obj/machinery/camera{ c_tag = "Teleporter Room"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/structure/rack, /obj/structure/window/reinforced{ @@ -43531,8 +43145,7 @@ /obj/item/clothing/glasses/sunglasses, /obj/machinery/camera{ c_tag = "Corporate Showroom"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/wood, /area/bridge/showroom/corporate) @@ -43591,8 +43204,7 @@ }, /obj/machinery/camera{ c_tag = "Gateway - Atrium"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/effect/turf_decal/bot{ dir = 1 @@ -43921,7 +43533,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Exterior - Aft Port"; dir = 8; - network = list("MiniSat") + network = list("minisat") }, /obj/structure/window/reinforced{ dir = 8 @@ -43944,7 +43556,7 @@ /obj/machinery/camera{ c_tag = "Telecomms - Server Room - Aft"; dir = 1; - network = list("SS13","tcomm") + network = list("ss13","tcomm") }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/ntnet_relay, @@ -45605,8 +45217,7 @@ }, /obj/machinery/camera{ c_tag = "Gateway - Access"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 2 @@ -45686,8 +45297,7 @@ /obj/item/kitchen/rollingpin, /obj/machinery/camera{ c_tag = "Kitchen"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/cafeteria{ dir = 2 @@ -45779,8 +45389,7 @@ }, /obj/machinery/camera{ c_tag = "Kitchen - Coldroom"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/showroomfloor, /area/crew_quarters/kitchen) @@ -45843,8 +45452,7 @@ }, /obj/machinery/camera{ c_tag = "Atmospherics - Port"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/light{ dir = 8 @@ -45901,8 +45509,7 @@ "bSl" = ( /obj/machinery/camera{ c_tag = "Atmospherics Tank - Toxins"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/engine/plasma, /area/engine/atmos) @@ -46366,8 +45973,7 @@ }, /obj/machinery/camera{ c_tag = "Atmospherics - Starboard"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel, /area/engine/atmos) @@ -46402,10 +46008,10 @@ /turf/closed/wall, /area/maintenance/solars/port/aft) "bTq" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 }, -/turf/closed/wall/r_wall, +/turf/open/floor/plasteel, /area/engine/engineering) "bTr" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -46453,8 +46059,7 @@ pixel_y = -24 }, /obj/machinery/camera/autoname{ - dir = 1; - network = list("SS13") + dir = 1 }, /obj/structure/table/wood, /turf/open/floor/wood, @@ -46982,8 +46587,12 @@ }, /area/maintenance/starboard) "bUw" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible, -/turf/open/floor/plasteel/dark, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plating, /area/engine/engineering) "bUx" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ @@ -47470,7 +47079,6 @@ /turf/closed/wall, /area/hallway/secondary/service) "bVA" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/door/airlock{ name = "Service Hall"; req_access_txt = "null"; @@ -47619,8 +47227,7 @@ }, /obj/machinery/camera{ c_tag = "Aft Port Solar Maintenance"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plating, /area/maintenance/solars/port/aft) @@ -47801,8 +47408,7 @@ }, /obj/machinery/camera{ c_tag = "Central Primary Hallway - Aft-Port Corner"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/neutral/corner{ dir = 8 @@ -48018,8 +47624,7 @@ }, /obj/machinery/camera{ c_tag = "Central Primary Hallway - Aft-Starboard Corner"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/neutral/corner{ dir = 2 @@ -48233,6 +47838,9 @@ /obj/structure/cable/yellow{ icon_state = "2-4" }, +/obj/machinery/light/small{ + dir = 1 + }, /turf/open/floor/plating, /area/maintenance/starboard) "bXc" = ( @@ -48405,8 +48013,7 @@ "bXs" = ( /obj/machinery/camera{ c_tag = "Atmospherics Tank - CO2"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/engine/co2, /area/engine/atmos) @@ -48561,8 +48168,7 @@ "bXQ" = ( /obj/machinery/camera{ c_tag = "Central Primary Hallway - Aft-Port"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/blue/corner{ dir = 8 @@ -48600,8 +48206,7 @@ "bXW" = ( /obj/machinery/camera{ c_tag = "Central Primary Hallway - Aft-Starboard"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/purple/corner{ dir = 2 @@ -48669,8 +48274,7 @@ /area/hallway/primary/central) "bYe" = ( /obj/machinery/camera/autoname{ - dir = 4; - network = list("SS13") + dir = 4 }, /obj/item/book/manual/hydroponics_pod_people, /obj/item/paper/guides/jobs/hydroponics, @@ -48737,8 +48341,7 @@ dir = 4 }, /obj/machinery/camera/autoname{ - dir = 8; - network = list("SS13") + dir = 8 }, /obj/structure/table/glass, /obj/effect/turf_decal/stripes/line{ @@ -48843,8 +48446,7 @@ }, /obj/machinery/camera{ c_tag = "Atmospherics - Port-Aft"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/caution{ dir = 8 @@ -49125,7 +48727,7 @@ /obj/machinery/camera{ c_tag = "Security Post - Medbay"; dir = 2; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /turf/open/floor/plasteel/red/side{ dir = 1 @@ -49831,7 +49433,7 @@ /obj/machinery/camera{ c_tag = "Research Division - Lobby"; dir = 2; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/whitepurple/side{ dir = 1 @@ -50547,7 +50149,7 @@ /obj/machinery/camera{ c_tag = "Medbay Storage"; dir = 8; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/closet/crate/freezer/surplus_limbs, @@ -50573,7 +50175,7 @@ desc = "Used for monitoring medbay to ensure patient safety."; dir = 1; name = "Medbay Monitor"; - network = list("Medbay"); + network = list("medbay"); pixel_y = -29 }, /obj/item/device/radio/intercom{ @@ -50755,7 +50357,7 @@ desc = "Used for watching the RD's goons from the safety of his office."; dir = 8; name = "Research Monitor"; - network = list("RD"); + network = list("rd"); pixel_x = 28; pixel_y = 2 }, @@ -50789,8 +50391,7 @@ /obj/item/paper/guides/jobs/hydroponics, /obj/machinery/camera{ c_tag = "Hydroponics - Foyer"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/item/device/radio/intercom{ pixel_y = -25 @@ -51093,8 +50694,7 @@ }, /obj/machinery/camera{ c_tag = "Atmospherics - Starboard Aft"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/dark, /area/engine/atmos) @@ -51539,7 +51139,7 @@ /obj/machinery/camera{ c_tag = "Security Post - Research Division"; dir = 8; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/red/side{ dir = 4 @@ -51908,7 +51508,7 @@ /obj/machinery/camera{ c_tag = "Medbay Foyer"; dir = 1; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /turf/open/floor/plasteel/whiteblue/side{ dir = 2 @@ -53294,7 +52894,7 @@ /obj/machinery/camera{ c_tag = "Experimentation Lab - Test Chamber"; dir = 2; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/machinery/light{ dir = 1 @@ -53413,7 +53013,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Exterior - Aft"; dir = 2; - network = list("MiniSat") + network = list("minisat") }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, @@ -53662,7 +53262,7 @@ /obj/machinery/camera{ c_tag = "Medbay Hallway Fore"; dir = 2; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /turf/open/floor/plasteel/whiteblue/corner{ dir = 4 @@ -53890,7 +53490,7 @@ /obj/machinery/camera{ c_tag = "Research Division - Airlock"; dir = 2; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -54041,8 +53641,7 @@ "cje" = ( /obj/machinery/camera{ c_tag = "Atmospherics Tank - N2"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/engine/n2, /area/engine/atmos) @@ -54056,8 +53655,7 @@ "cjh" = ( /obj/machinery/camera{ c_tag = "Atmospherics Tank - O2"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/engine/o2, /area/engine/atmos) @@ -54072,8 +53670,7 @@ "cjk" = ( /obj/machinery/camera{ c_tag = "Atmospherics Tank - Air"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/engine/air, /area/engine/atmos) @@ -54234,7 +53831,7 @@ /obj/machinery/camera{ c_tag = "Medbay Sleepers"; dir = 4; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /turf/open/floor/plasteel/whiteblue/side{ dir = 10 @@ -55119,8 +54716,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/camera{ c_tag = "Aft Primary Hallway - Fore"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/firealarm{ dir = 4; @@ -55305,7 +54901,7 @@ /obj/machinery/camera{ c_tag = "Research Division - Break Room"; dir = 1; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/cafeteria{ dir = 5 @@ -55667,7 +55263,7 @@ /obj/machinery/camera{ c_tag = "Research and Development"; dir = 8; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/machinery/light_switch{ pixel_x = 27 @@ -56199,7 +55795,7 @@ /obj/machinery/camera{ c_tag = "Chemistry"; dir = 4; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /obj/machinery/light{ dir = 8 @@ -56394,7 +55990,7 @@ /obj/machinery/camera{ c_tag = "Research Division Hallway - Central"; dir = 2; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/white, /area/science/research) @@ -56781,7 +56377,7 @@ /obj/machinery/camera{ c_tag = "CMO's Office"; dir = 8; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /turf/open/floor/plasteel/barber{ dir = 8 @@ -57306,23 +56902,23 @@ }, /area/maintenance/port/aft) "cpR" = ( +/obj/machinery/button/door{ + id = "engpa"; + name = "Engineering Chamber Shutters Control"; + pixel_y = -26; + req_access_txt = "11" + }, /obj/effect/turf_decal/stripes/line{ - dir = 4 + dir = 10 }, -/obj/machinery/camera{ - c_tag = "Engineering Supermatter Port"; - dir = 8; - network = list("SS13","Engine") +/obj/structure/cable{ + icon_state = "1-4" }, -/obj/machinery/airalarm/engine{ - dir = 8; - pixel_x = 24 - }, -/obj/machinery/atmospherics/pipe/manifold/green/visible{ +/obj/machinery/light{ dir = 8 }, -/turf/open/floor/engine, -/area/engine/supermatter) +/turf/open/floor/plating, +/area/engine/engineering) "cpS" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -57816,7 +57412,7 @@ /obj/machinery/camera{ c_tag = "Research Division Hallway - Starboard"; dir = 1; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/white, /area/science/research) @@ -57901,7 +57497,7 @@ /obj/machinery/camera{ c_tag = "Experimentation Lab"; dir = 1; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/machinery/light, /turf/open/floor/plasteel/white, @@ -58089,7 +57685,7 @@ /obj/machinery/camera{ c_tag = "Medbay Cryo"; dir = 1; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /obj/item/screwdriver{ pixel_y = 6 @@ -58524,7 +58120,7 @@ /obj/machinery/camera{ c_tag = "Medbay Surgery"; dir = 1; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /turf/open/floor/plasteel/white, /area/medical/surgery) @@ -58587,7 +58183,7 @@ /obj/machinery/camera{ c_tag = "Medbay Recovery Room"; dir = 1; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /turf/open/floor/plasteel/whiteblue/side{ dir = 2 @@ -58611,7 +58207,7 @@ /obj/machinery/camera{ c_tag = "Medbay Hallway Central"; dir = 4; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /turf/open/floor/plasteel/whiteblue/corner{ dir = 8 @@ -58735,7 +58331,7 @@ desc = "Used for monitoring medbay to ensure patient safety."; dir = 8; name = "Medbay Monitor"; - network = list("Medbay"); + network = list("medbay"); pixel_x = 29 }, /obj/item/device/radio/intercom{ @@ -59004,7 +58600,7 @@ /obj/machinery/computer/security/telescreen{ desc = "Used for watching the RD's goons from the safety of his office."; name = "Research Monitor"; - network = list("RD"); + network = list("rd"); pixel_y = 2 }, /obj/structure/table/reinforced, @@ -59127,7 +58723,7 @@ active_power_usage = 0; c_tag = "Turbine Vent"; dir = 4; - network = list("Turbine"); + network = list("turbine"); use_power = 0 }, /turf/open/space, @@ -59971,7 +59567,7 @@ /obj/machinery/camera{ c_tag = "Toxins Storage"; dir = 8; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, @@ -60177,7 +59773,7 @@ /obj/machinery/camera{ c_tag = "Genetics Lab"; dir = 4; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /turf/open/floor/plasteel/whiteblue, /area/medical/genetics) @@ -60717,7 +60313,7 @@ /obj/machinery/camera{ c_tag = "Genetics Desk"; dir = 4; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /obj/structure/table/glass, /turf/open/floor/plasteel/blue/side{ @@ -60802,7 +60398,7 @@ /obj/machinery/camera{ c_tag = "Research Division Hallway - Mech Bay"; dir = 4; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/machinery/airalarm{ dir = 4; @@ -60879,7 +60475,7 @@ /obj/machinery/camera{ c_tag = "Research Director's Office"; dir = 1; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/machinery/light, /turf/open/floor/plasteel/cafeteria{ @@ -61242,7 +60838,7 @@ /obj/machinery/camera{ c_tag = "Mech Bay"; dir = 8; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/circuit/green, /area/science/robotics/mechbay) @@ -61253,7 +60849,7 @@ /obj/machinery/camera{ c_tag = "Research Testing Range"; dir = 8; - network = list("SS13","RD"); + network = list("ss13","rd"); pixel_y = -22 }, /obj/machinery/airalarm{ @@ -61670,7 +61266,7 @@ /obj/machinery/camera{ c_tag = "Toxins - Lab"; dir = 2; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/machinery/portable_atmospherics/canister, @@ -61856,7 +61452,7 @@ /obj/machinery/camera{ c_tag = "Genetics Cloning Lab"; dir = 8; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /turf/open/floor/plasteel/whiteblue/side{ dir = 6 @@ -62443,8 +62039,7 @@ }, /obj/machinery/camera{ c_tag = "Aft Primary Hallway - Middle"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 @@ -62799,7 +62394,7 @@ dir = 8; layer = 4; name = "Test Chamber Telescreen"; - network = list("Toxins"); + network = list("toxins"); pixel_x = 30 }, /obj/effect/turf_decal/stripes/line{ @@ -63237,7 +62832,7 @@ dir = 8; layer = 4; name = "Test Chamber Telescreen"; - network = list("Toxins"); + network = list("toxins"); pixel_x = 30 }, /obj/effect/turf_decal/stripes/line{ @@ -63328,7 +62923,7 @@ /obj/machinery/camera{ c_tag = "Medbay Break Room"; dir = 1; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /turf/open/floor/plasteel/cafeteria{ dir = 5 @@ -63715,7 +63310,7 @@ /obj/machinery/camera{ c_tag = "Medbay Hallway Aft"; dir = 4; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /turf/open/floor/plasteel/white/side{ dir = 5 @@ -63899,7 +63494,7 @@ /obj/machinery/camera{ c_tag = "Robotics - Fore"; dir = 2; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, @@ -64060,7 +63655,7 @@ light = null; luminosity = 3; name = "Hardened Bomb-Test Camera"; - network = list("Toxins"); + network = list("toxins"); use_power = 0 }, /obj/item/target/alien/anchored, @@ -64978,7 +64573,7 @@ /obj/machinery/camera{ c_tag = "Research Division Hallway - Robotics"; dir = 4; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/white, /area/science/research) @@ -65047,7 +64642,7 @@ /obj/machinery/camera{ c_tag = "Toxins - Mixing Area"; dir = 8; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -65107,7 +64702,7 @@ /obj/machinery/camera{ c_tag = "Virology - Cells"; dir = 4; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /turf/open/floor/plasteel/whitegreen/side{ dir = 9 @@ -66174,7 +65769,7 @@ /obj/machinery/camera{ c_tag = "Virology - Lab"; dir = 8; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /obj/structure/sink{ dir = 4; @@ -66201,7 +65796,7 @@ /obj/machinery/camera{ c_tag = "Virology - Airlock"; dir = 1; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /obj/machinery/light, /obj/structure/closet/l3closet, @@ -66233,7 +65828,7 @@ /obj/machinery/camera{ c_tag = "Virology - Entrance"; dir = 8; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /obj/machinery/light/small{ dir = 4 @@ -66531,7 +66126,7 @@ /obj/machinery/camera{ c_tag = "Research Division - Server Room"; dir = 2; - network = list("SS13","RD"); + network = list("ss13","rd"); pixel_x = 22 }, /obj/machinery/power/apc{ @@ -66826,8 +66421,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/camera{ c_tag = "Aft Primary Hallway - Aft"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/escape{ dir = 2 @@ -67585,7 +67179,7 @@ /obj/machinery/camera{ c_tag = "Virology - Break Room"; dir = 2; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /turf/open/floor/plasteel/whitegreen/side{ dir = 1 @@ -68280,7 +67874,7 @@ desc = "Used for watching the turbine vent."; dir = 8; name = "turbine vent monitor"; - network = list("Turbine"); + network = list("turbine"); pixel_x = 29 }, /obj/machinery/button/door{ @@ -68565,8 +68159,7 @@ }, /obj/machinery/camera{ c_tag = "Departure Lounge - Starboard Fore"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/structure/extinguisher_cabinet{ pixel_x = 27 @@ -68640,8 +68233,7 @@ }, /obj/machinery/camera{ c_tag = "Aft Starboard Solar Maintenance"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plating, /area/maintenance/solars/starboard/aft) @@ -68811,8 +68403,7 @@ }, /obj/machinery/camera{ c_tag = "Chapel - Fore"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/structure/table/wood, /turf/open/floor/plasteel/vault, @@ -68983,7 +68574,6 @@ /obj/machinery/computer/security/telescreen{ desc = "Used for watching output from station security cameras."; name = "Security Camera Monitor"; - network = list("SS13"); pixel_y = 30 }, /turf/open/floor/plasteel/red/side{ @@ -69192,8 +68782,7 @@ "cNu" = ( /obj/machinery/camera{ c_tag = "Chapel Office - Backroom"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/item/device/radio/intercom{ dir = 4; @@ -69524,8 +69113,7 @@ }, /obj/machinery/camera{ c_tag = "Chapel Office"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/grimy, /area/chapel/office) @@ -69697,8 +69285,7 @@ }, /obj/machinery/camera{ c_tag = "Departure Lounge - Security Post"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/item/book/manual/wiki/security_space_law{ pixel_x = -4; @@ -70243,8 +69830,7 @@ "cPO" = ( /obj/machinery/camera{ c_tag = "Departure Lounge - Port Aft"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/light{ dir = 8 @@ -70309,8 +69895,7 @@ "cPV" = ( /obj/machinery/camera{ c_tag = "Departure Lounge - Starboard Aft"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/light{ dir = 4 @@ -70514,7 +70099,7 @@ /obj/machinery/camera{ c_tag = "Research Division Hallway - Xenobiology Lab Access"; dir = 2; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/whitepurple/side{ dir = 1 @@ -70560,7 +70145,7 @@ /obj/machinery/camera{ c_tag = "Toxins - Launch Area"; dir = 2; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/machinery/suit_storage_unit/rd, /obj/effect/turf_decal/bot{ @@ -70577,7 +70162,7 @@ /turf/open/floor/plasteel/vault, /area/chapel/main) "cQB" = ( -/obj/machinery/doppler_array{ +/obj/machinery/doppler_array/research/science{ dir = 4 }, /obj/item/device/radio/intercom{ @@ -70658,8 +70243,7 @@ }, /obj/machinery/camera{ c_tag = "Chapel - Starboard"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/chapel{ dir = 4 @@ -70884,8 +70468,7 @@ "cRn" = ( /obj/machinery/camera{ c_tag = "Chapel - Port"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/structure/chair/comfy/black{ dir = 4 @@ -71334,7 +70917,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Lab - Pen #1"; dir = 4; - network = list("SS13","RD","Xeno") + network = list("ss13","rd","xeno") }, /turf/open/floor/engine, /area/science/xenobiology) @@ -71408,7 +70991,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Lab - Pen #2"; dir = 8; - network = list("SS13","RD","Xeno") + network = list("ss13","rd","xeno") }, /turf/open/floor/engine, /area/science/xenobiology) @@ -71909,7 +71492,7 @@ /obj/machinery/computer/security/telescreen{ dir = 1; name = "Test Chamber Monitor"; - network = list("Xeno"); + network = list("xeno"); pixel_y = 2 }, /obj/structure/table/reinforced, @@ -72253,6 +71836,12 @@ }, /turf/open/floor/plating, /area/shuttle/auxillary_base) +"cWu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "cWA" = ( /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, @@ -72289,18 +71878,6 @@ /obj/structure/easel, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"cXz" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/camera{ - c_tag = "Engineering Supermatter Aft"; - dir = 1; - network = list("SS13","Engine") - }, -/turf/open/floor/engine, -/area/engine/engineering) "cXA" = ( /turf/closed/wall/r_wall, /area/security/checkpoint/engineering) @@ -72313,7 +71890,12 @@ }, /area/construction/mining/aux_base) "cXI" = ( -/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 + }, +/obj/machinery/light/small{ + dir = 1 + }, /turf/open/floor/plating, /area/maintenance/starboard) "cXR" = ( @@ -72325,11 +71907,12 @@ }, /area/construction/mining/aux_base) "cXZ" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/structure/window/reinforced{ - dir = 8 +/obj/machinery/door/airlock/external{ + req_access_txt = "13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 }, -/obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/starboard) "cYc" = ( @@ -72342,15 +71925,16 @@ /obj/machinery/camera{ c_tag = "Robotics - Aft"; dir = 1; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/white/side{ dir = 1 }, /area/science/robotics/lab) "cYj" = ( -/obj/structure/closet/firecloset, -/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/starboard) "cYE" = ( @@ -72386,7 +71970,7 @@ desc = "Used for the Auxillary Mining Base."; dir = 1; name = "Auxillary Base Monitor"; - network = list("AuxBase"); + network = list("auxbase"); pixel_y = -28 }, /obj/machinery/atmospherics/components/unary/vent_pump/on, @@ -72582,7 +72166,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Lab - Test Chamber"; dir = 1; - network = list("SS13","RD","Xeno") + network = list("ss13","rd","xeno") }, /turf/open/floor/engine, /area/science/xenobiology) @@ -72657,14 +72241,19 @@ /turf/open/floor/circuit/killroom, /area/science/xenobiology) "daW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/machinery/button/door{ + id = "engpa"; + name = "Engineering Chamber Shutters Control"; + pixel_y = 26; + req_access_txt = "11" }, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/light{ dir = 8 }, -/turf/open/floor/engine, +/turf/open/floor/plating, /area/engine/engineering) "daX" = ( /obj/structure/cable/yellow{ @@ -72674,27 +72263,20 @@ icon_state = "platingdmg2" }, /area/maintenance/port/fore) -"daY" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/engine, -/area/engine/supermatter) "daZ" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 1 +/obj/structure/particle_accelerator/particle_emitter/right{ + icon_state = "emitter_right"; + dir = 4 }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable, -/obj/structure/window/plasma/reinforced, -/turf/open/floor/engine, -/area/engine/supermatter) +/turf/open/floor/plating, +/area/engine/engineering) "dbb" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 +/obj/structure/particle_accelerator/particle_emitter/center{ + icon_state = "emitter_center"; + dir = 4 }, -/turf/open/floor/engine, -/area/engine/supermatter) +/turf/open/floor/plating, +/area/engine/engineering) "dbd" = ( /obj/structure/sink/kitchen{ pixel_y = 28 @@ -72707,30 +72289,6 @@ }, /turf/open/floor/carpet, /area/crew_quarters/heads/hop) -"dbg" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/green/visible{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dbh" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) "dbj" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -72760,7 +72318,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Lab - Pen #3"; dir = 4; - network = list("SS13","RD","Xeno") + network = list("ss13","rd","xeno") }, /turf/open/floor/engine, /area/science/xenobiology) @@ -72771,7 +72329,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Lab - Pen #4"; dir = 8; - network = list("SS13","RD","Xeno") + network = list("ss13","rd","xeno") }, /turf/open/floor/engine, /area/science/xenobiology) @@ -72784,7 +72342,7 @@ /obj/machinery/camera{ c_tag = "Morgue"; dir = 2; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /obj/structure/bodycontainer/morgue{ dir = 8 @@ -72798,7 +72356,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Lab - Pen #5"; dir = 4; - network = list("SS13","RD","Xeno") + network = list("ss13","rd","xeno") }, /turf/open/floor/engine, /area/science/xenobiology) @@ -72809,7 +72367,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Lab - Pen #6"; dir = 8; - network = list("SS13","RD","Xeno") + network = list("ss13","rd","xeno") }, /turf/open/floor/engine, /area/science/xenobiology) @@ -72822,7 +72380,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Lab - Kill Chamber"; dir = 1; - network = list("SS13","RD","Xeno"); + network = list("ss13","rd","xeno"); start_active = 1 }, /turf/open/floor/circuit/killroom, @@ -73059,7 +72617,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Lab - Fore"; dir = 2; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/whitepurple/side{ dir = 1 @@ -73299,7 +72857,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Lab - Airlock"; dir = 4; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -73492,7 +73050,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Lab - Central"; dir = 8; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/stripes/line{ @@ -73687,7 +73245,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Lab - Aft-Port"; dir = 4; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -73702,7 +73260,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Lab - Aft-Starboard"; dir = 8; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -73927,16 +73485,12 @@ /turf/open/floor/plating, /area/shuttle/auxillary_base) "ddO" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating/airless, /area/engine/engineering) "ddP" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/engine/engineering) @@ -73950,41 +73504,10 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"ddS" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 6 - }, -/obj/machinery/camera{ - c_tag = "Engineering Supermatter Fore"; - dir = 4; - network = list("SS13","Engine") - }, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = -26 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"ddT" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"ddU" = ( -/obj/machinery/atmospherics/pipe/manifold4w/general/visible, -/obj/machinery/meter, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"ddV" = ( -/obj/machinery/atmospherics/pipe/manifold4w/general/visible, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "ddW" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, /obj/structure/cable/yellow{ icon_state = "2-4" }, @@ -73997,28 +73520,14 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/plasteel, -/area/engine/engineering) -"ddY" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/engine/engineering) "ddZ" = ( -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"dea" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - volume_rate = 200 +/obj/effect/turf_decal/stripes/line{ + dir = 9 }, /turf/open/floor/plating/airless, -/area/engine/engineering) +/area/space) "deb" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -74026,644 +73535,153 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"ded" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) -"dee" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/engine/engineering) "def" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"deh" = ( -/obj/structure/cable/white{ +/obj/structure/lattice/catwalk, +/obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) -"dei" = ( -/obj/structure/cable/white{ - icon_state = "4-8" +/obj/structure/cable{ + icon_state = "2-8" }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dej" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dek" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 2; - name = "Mix to Gas" - }, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"del" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) +/turf/open/space, +/area/space) "dem" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Gas to Mix" - }, -/obj/structure/cable/white{ - icon_state = "2-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"den" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"dep" = ( -/obj/machinery/firealarm{ - pixel_y = 32 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"deq" = ( -/obj/item/device/radio/intercom{ - freerange = 0; - frequency = 1459; - name = "Station Intercom (General)"; - pixel_y = 21 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"der" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"des" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"deu" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 10 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dev" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"dew" = ( -/obj/machinery/door/firedoor, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/engineering/glass{ - name = "Laser Room"; - req_access_txt = "10" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"dex" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"dey" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/structure/cable/white{ - icon_state = "2-8" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"deA" = ( -/obj/structure/cable/white{ - icon_state = "2-8" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"deB" = ( +/obj/structure/lattice/catwalk, /obj/structure/cable{ icon_state = "1-2" }, +/turf/open/space, +/area/space) +"den" = ( /obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"deC" = ( -/obj/effect/turf_decal/bot{ dir = 1 }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/canister/nitrogen, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"der" = ( +/obj/structure/closet/secure_closet/engineering_welding, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) -"deD" = ( -/obj/machinery/status_display, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"deI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"deJ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical, -/turf/open/floor/engine, -/area/engine/engineering) -"deK" = ( -/obj/structure/cable/white, -/obj/machinery/power/emitter/anchored{ - dir = 2; +"dev" = ( +/obj/machinery/field/generator{ + anchored = 1; state = 2 }, -/turf/open/floor/plating, -/area/engine/engineering) -"deL" = ( -/obj/structure/cable/white, -/obj/machinery/light{ - dir = 4 +/turf/open/floor/plating/airless, +/area/space/nearstation) +"dew" = ( +/turf/open/space, +/area/space/nearstation) +"deB" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "engpa"; + name = "Engineering Chamber Shutters" }, -/turf/open/floor/plating, -/area/engine/engineering) -"deM" = ( -/obj/structure/sign/warning/securearea, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"deN" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"deO" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) -"deS" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable, -/obj/structure/window/plasma/reinforced, -/turf/open/floor/engine, -/area/engine/supermatter) -"deU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 +"deD" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-2" }, +/turf/open/floor/plating/airless, +/area/space) +"deM" = ( +/obj/structure/table, +/obj/effect/turf_decal/delivery, +/obj/item/clothing/glasses/meson/engine, +/obj/item/clothing/glasses/meson/engine, +/obj/item/clothing/glasses/meson/engine, /obj/machinery/light{ dir = 4 }, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical, -/turf/open/floor/engine, +/obj/item/pipe_dispenser, +/obj/item/pipe_dispenser, +/obj/item/pipe_dispenser, +/turf/open/floor/plasteel/yellow/side{ + dir = 4 + }, /area/engine/engineering) "deV" = ( -/obj/structure/sign/warning/fire, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"deW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/obj/structure/cable{ + icon_state = "1-8" }, -/obj/machinery/camera{ - c_tag = "Engineering Supermatter Starboard"; - dir = 4; - network = list("SS13","Engine") +/obj/structure/cable{ + icon_state = "2-8" }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"deX" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/engine, -/area/engine/engineering) +/turf/open/floor/plating/airless, +/area/space) "deY" = ( -/obj/structure/reflector/single/anchored{ - dir = 9 +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/turf/open/floor/plating, -/area/engine/engineering) +/turf/open/floor/plating/airless, +/area/space/nearstation) "dfa" = ( -/obj/machinery/power/supermatter_shard/crystal/engine, -/turf/open/floor/engine, -/area/engine/supermatter) -"dfb" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, -/obj/machinery/meter, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"dfc" = ( -/obj/structure/sign/warning/electricshock, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"dfd" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfe" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical, -/turf/open/floor/engine, -/area/engine/engineering) -"dff" = ( -/obj/structure/reflector/double/anchored{ - dir = 5 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"dfg" = ( -/obj/structure/reflector/single/anchored{ - dir = 10 +/obj/structure/cable{ + icon_state = "1-2" }, /turf/open/floor/plating, /area/engine/engineering) "dfh" = ( -/obj/structure/sign/warning/nosmoking, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"dfi" = ( -/obj/effect/turf_decal/stripes/line{ +/obj/structure/table, +/obj/item/clothing/glasses/meson, +/obj/item/clothing/glasses/meson, +/obj/item/clothing/glasses/meson, +/obj/item/storage/belt/utility, +/obj/item/storage/belt/utility, +/obj/item/storage/toolbox/electrical{ + pixel_x = 1; + pixel_y = 10 + }, +/turf/open/floor/plasteel/yellow/side{ dir = 4 }, -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/open/floor/engine, /area/engine/engineering) -"dfj" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 - }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"dfk" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/structure/window/plasma/reinforced{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"dfm" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 9 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/structure/window/plasma/reinforced{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/supermatter) "dfp" = ( -/obj/effect/turf_decal/bot{ +/obj/structure/closet/firecloset, +/turf/open/floor/plasteel/yellow/side{ dir = 1 }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/canister, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"dfq" = ( -/obj/machinery/camera{ - c_tag = "Supermatter Chamber"; - dir = 4; - network = list("Engine") - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"dft" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 5 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - filter_type = "n2" - }, -/turf/open/floor/engine, /area/engine/engineering) "dfz" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"dfA" = ( -/obj/structure/cable/white{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"dfB" = ( -/obj/structure/cable/white{ - icon_state = "0-2" - }, -/obj/machinery/power/emitter/anchored{ - dir = 1; - state = 2 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"dfC" = ( -/obj/structure/cable/white{ - icon_state = "0-2" - }, -/obj/machinery/power/emitter/anchored{ - dir = 1; - state = 2 - }, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/engineering) +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, +/area/space) "dfD" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/item/book/manual/engineering_singularity_safety{ + pixel_x = 3; + pixel_y = 3 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/item/book/manual/wiki/engineering_guide, +/obj/item/book/manual/engineering_particle_accelerator{ + pixel_x = -3; + pixel_y = -3 }, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfE" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/green/visible{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfF" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/meter, -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfG" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/turf/open/floor/engine, +/obj/item/clothing/gloves/color/yellow, +/obj/structure/table/glass, +/turf/open/floor/plasteel, /area/engine/engineering) "dfI" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "Cooling Loop Bypass" +/obj/structure/cable{ + icon_state = "1-4" }, -/obj/structure/cable/white{ - icon_state = "2-4" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfJ" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/orange/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfM" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/structure/cable/white{ - icon_state = "1-8" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"dfO" = ( -/obj/structure/cable/white{ - icon_state = "1-8" - }, -/turf/open/floor/plating, -/area/engine/engineering) +/obj/machinery/power/grounding_rod, +/turf/open/floor/plating/airless, +/area/space) "dfP" = ( /obj/structure/cable/white{ - icon_state = "4-8" + icon_state = "2-8" }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Atmos to Loop" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfQ" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/engine, -/area/engine/engineering) -"dfR" = ( -/obj/machinery/atmospherics/components/binary/pump{ - name = "Gas to Cold Loop"; - on = 1 - }, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/engine, -/area/engine/engineering) -"dfS" = ( -/obj/structure/cable/white{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/engine, -/area/engine/engineering) -"dfT" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/engine, -/area/engine/engineering) -"dfU" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Cold Loop to Gas"; - on = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfV" = ( -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"dfW" = ( -/obj/item/wrench, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, /area/engine/engineering) "dfX" = ( /obj/structure/disposalpipe/segment, @@ -74681,272 +73699,90 @@ }, /area/engine/engineering) "dfY" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/structure/cable/white{ + icon_state = "1-4" }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"dfZ" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/closed/wall/r_wall, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "dga" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/junction, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/structure/cable/white{ + icon_state = "2-8" }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"dgb" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/closed/wall/r_wall, +/turf/open/floor/plating/airless, /area/engine/engineering) "dgc" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 5 +/obj/item/clothing/gloves/color/rainbow, +/obj/item/clothing/head/soft/rainbow, +/obj/item/clothing/shoes/sneakers/rainbow, +/obj/item/clothing/under/color/rainbow, +/turf/open/floor/plating{ + icon_state = "platingdmg3" }, -/turf/open/floor/plating, /area/maintenance/starboard) "dgd" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/turf/open/space, -/area/space/nearstation) +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "dge" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/space/nearstation) -"dgf" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 6 +/obj/structure/cable/white{ + icon_state = "0-2" }, -/turf/open/space, -/area/space/nearstation) +/obj/effect/turf_decal/stripes/line, +/obj/machinery/power/emitter{ + anchored = 1; + dir = 1; + icon_state = "emitter"; + state = 2 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "dgg" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 6 +/obj/structure/cable/white{ + icon_state = "4-8" }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/space/nearstation) -"dgh" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 6 +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"dgi" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/floor/plating, -/area/maintenance/starboard) +/turf/open/floor/plating/airless, +/area/engine/engineering) "dgj" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 5 +/obj/structure/grille, +/obj/structure/cable/white{ + icon_state = "1-4" }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) +/turf/open/floor/plating/airless, +/area/engine/engineering) "dgk" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/obj/structure/grille, +/obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) +/turf/open/floor/plating/airless, +/area/engine/engineering) "dgm" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 +/obj/structure/cable/white{ + icon_state = "1-4" }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"dgo" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 +/obj/structure/grille, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"dgp" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"dgr" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 10 - }, -/turf/open/space, -/area/space/nearstation) -"dgt" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"dgu" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/turf/open/space, -/area/space/nearstation) -"dgv" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 9 - }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/space/nearstation) -"dgw" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) +/turf/open/floor/plating/airless, +/area/engine/engineering) "dgz" = ( /obj/structure/closet/toolcloset, /obj/effect/turf_decal/delivery, /obj/item/clothing/glasses/meson/engine, /turf/open/floor/plasteel, /area/engine/engineering) -"dgA" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"dgB" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 5 - }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/space/nearstation) "dgI" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 5 - }, -/turf/open/space, -/area/space/nearstation) -"dgJ" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"dgK" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"dgM" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 10 - }, -/turf/open/space, -/area/space/nearstation) -"dgN" = ( -/obj/structure/lattice, -/obj/structure/grille, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"dgO" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"dgS" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/transit_tube/horizontal, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"dha" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"dhc" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"dhe" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"dhg" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"dhh" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "Mix to Engine"; - on = 0 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"dhi" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/machinery/door/window/northleft{ - dir = 8; - icon_state = "left"; - name = "Inner Pipe Access"; - req_access_txt = "24" - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"dhj" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"dhk" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/atmos) -"dhl" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 9 - }, -/turf/open/space, +/turf/closed/wall/mineral/plastitanium, /area/space/nearstation) "dhn" = ( /obj/structure/table, @@ -75376,8 +74212,7 @@ }, /obj/machinery/camera{ c_tag = "Theatre - Stage"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/light/small{ dir = 4 @@ -75544,8 +74379,7 @@ "dir" = ( /obj/machinery/camera{ c_tag = "Theatre - Backstage"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/structure/sign/poster/contraband/random{ pixel_y = -32 @@ -75894,8 +74728,7 @@ }, /obj/machinery/camera{ c_tag = "Departure Lounge - Port Fore"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-24" @@ -75945,8 +74778,7 @@ }, /obj/machinery/camera{ c_tag = "Chapel - Funeral Parlour"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/plasteel/dark, @@ -75969,26 +74801,18 @@ /turf/open/space, /area/science/xenobiology) "djt" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/engine/supermatter) +/area/engine/engineering) "djx" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/camera/emp_proof{ + c_tag = "Containment - Aft Port"; + dir = 4; + network = list("singularity") }, -/obj/item/crowbar, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plating, -/area/engine/supermatter) +/obj/machinery/power/grounding_rod, +/turf/open/floor/plating/airless, +/area/engine/engineering) "djz" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/external{ @@ -76026,7 +74850,7 @@ id = "arrivals_stationary"; name = "arrivals"; width = 7; - roundstart_template = /datum/map_template/shuttle/arrival/box; + roundstart_template = /datum/map_template/shuttle/arrival/box }, /turf/open/space/basic, /area/space) @@ -76048,12 +74872,11 @@ /turf/open/floor/plating, /area/chapel/main) "dlI" = ( -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"dlN" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/supermatter) +/obj/structure/closet/secure_closet/engineering_electrical, +/turf/open/floor/plasteel/yellow/side{ + dir = 1 + }, +/area/engine/engineering) "dlV" = ( /turf/closed/wall/r_wall, /area/maintenance/department/science/xenobiology) @@ -76264,6 +75087,14 @@ icon_state = "platingdmg2" }, /area/maintenance/port/fore) +"drT" = ( +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "dsg" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -76304,6 +75135,13 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"dtL" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/space, +/area/space) "dtP" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -76637,46 +75475,24 @@ /turf/closed/wall, /area/engine/gravity_generator) "dBw" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"dBx" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"dBy" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"dBz" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"dBA" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"dBB" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/engine, +/turf/open/floor/plating, /area/engine/engineering) +"dBy" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/engine/engineering) +"dBB" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/space) "dBC" = ( /obj/machinery/meter, /obj/structure/grille, @@ -77356,6 +76172,16 @@ }, /turf/open/floor/plating, /area/maintenance/starboard) +"dPf" = ( +/obj/structure/cable/white{ + icon_state = "1-4" + }, +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "dYu" = ( /obj/machinery/door/airlock/external{ name = "Auxiliary Airlock" @@ -77365,6 +76191,19 @@ }, /turf/open/floor/plating, /area/hallway/secondary/entry) +"dZD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/space) +"eln" = ( +/turf/open/space/basic, +/area/engine/engineering) +"enN" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/engine/engineering) "eoK" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -77397,6 +76236,17 @@ }, /turf/open/floor/plasteel, /area/science/circuit) +"esV" = ( +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "evy" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -77407,6 +76257,25 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) +"eEu" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external{ + name = "External Containment Access"; + req_access_txt = "10; 13" + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) "eFN" = ( /obj/structure/bodycontainer/crematorium{ id = "crematoriumChapel"; @@ -77414,6 +76283,12 @@ }, /turf/open/floor/plasteel/dark, /area/chapel/office) +"eHX" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) "eXy" = ( /obj/machinery/airalarm{ pixel_y = 32 @@ -77437,12 +76312,48 @@ /obj/structure/closet/firecloset, /turf/open/floor/plating, /area/engine/engineering) +"fjy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plating/airless, +/area/space) +"foU" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/computer/security/telescreen{ + desc = "Used for watching the Engine."; + dir = 8; + layer = 4; + name = "Engine Monitor"; + network = list("singularity"); + pixel_x = 30 + }, +/turf/open/floor/plasteel/yellow/side{ + dir = 4 + }, +/area/engine/engineering) "fDD" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plasteel/white, /area/science/circuit) +"fGs" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"fWO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plating/airless, +/area/space) "gfh" = ( /obj/machinery/libraryscanner, /turf/open/floor/plasteel/white, @@ -77465,6 +76376,14 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) +"goZ" = ( +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "gEk" = ( /obj/structure/cable/yellow{ icon_state = "2-8" @@ -77490,6 +76409,14 @@ /obj/effect/spawner/structure/window/plasma/reinforced, /turf/open/floor/plating, /area/engine/atmos) +"gKb" = ( +/obj/machinery/camera/emp_proof{ + c_tag = "Containment - Fore Starboard"; + dir = 8; + network = list("singularity") + }, +/turf/open/floor/plating/airless, +/area/space) "gLC" = ( /obj/structure/reagent_dispensers/water_cooler, /turf/open/floor/plasteel, @@ -77522,6 +76449,9 @@ }, /turf/open/floor/plating, /area/security/prison) +"hWU" = ( +/turf/open/floor/plating/airless, +/area/space) "ioI" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -77549,6 +76479,33 @@ }, /turf/open/floor/plasteel/whitepurple, /area/science/lab) +"iOa" = ( +/turf/closed/wall/mineral/plastitanium, +/area/maintenance/starboard) +"iTS" = ( +/obj/item/clothing/gloves/color/yellow, +/obj/item/clothing/gloves/color/yellow, +/obj/item/clothing/gloves/color/yellow, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/suit/hazardvest, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/effect/turf_decal/delivery, +/obj/structure/table, +/turf/open/floor/plasteel/yellow/side{ + dir = 4 + }, +/area/engine/engineering) +"jjF" = ( +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "jwW" = ( /turf/closed/wall/mineral/plastitanium, /area/crew_quarters/fitness/recreation) @@ -77560,7 +76517,7 @@ /obj/machinery/computer/security/telescreen{ desc = "Used for watching the RD's goons from the safety of your own office."; name = "Research Monitor"; - network = list("RD"); + network = list("rd"); pixel_y = 32 }, /turf/open/floor/plasteel/white, @@ -77579,6 +76536,21 @@ }, /turf/open/floor/plating, /area/maintenance/solars/port/aft) +"jFx" = ( +/obj/machinery/door/airlock/external{ + req_access_txt = "13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard) +"jIV" = ( +/obj/structure/closet/secure_closet/engineering_personal, +/turf/open/floor/plasteel/yellow/side{ + dir = 1 + }, +/area/engine/engineering) "jKK" = ( /obj/machinery/door/airlock/external{ req_access_txt = "13" @@ -77693,6 +76665,14 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) +"lHL" = ( +/turf/open/space/basic, +/area/space/nearstation) +"lLj" = ( +/turf/open/floor/plasteel/yellow/side{ + dir = 8 + }, +/area/engine/engineering) "lMz" = ( /obj/structure/falsewall, /turf/open/floor/plating, @@ -77734,6 +76714,12 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"moI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plating/airless, +/area/space) "mvj" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -77743,6 +76729,12 @@ }, /turf/closed/wall, /area/hallway/secondary/service) +"mwK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/space) "mzh" = ( /obj/machinery/firealarm{ dir = 1; @@ -77771,6 +76763,30 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/science/circuit) +"nte" = ( +/obj/machinery/the_singularitygen/tesla, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"nwU" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external{ + name = "External Containment Access"; + req_access_txt = "10; 13" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) "nyo" = ( /obj/structure/cable/yellow{ icon_state = "1-4" @@ -77805,10 +76821,33 @@ }, /turf/open/floor/plasteel, /area/construction/storage/wing) +"nKh" = ( +/turf/open/floor/plasteel/yellow/side{ + dir = 1 + }, +/area/engine/engineering) "obb" = ( /obj/structure/target_stake, /turf/open/floor/plasteel/white, /area/science/circuit) +"obN" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/space, +/area/space) +"ocj" = ( +/obj/structure/cable/white{ + icon_state = "2-4" + }, +/obj/structure/grille, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plating/airless, +/area/engine/engineering) "ocT" = ( /obj/machinery/light{ dir = 1 @@ -77823,7 +76862,7 @@ /obj/machinery/computer/security/telescreen{ desc = "Used for watching the RD's goons from the safety of your own office."; name = "Research Monitor"; - network = list("RD"); + network = list("rd"); pixel_y = 32 }, /turf/open/floor/plasteel/white, @@ -77875,6 +76914,14 @@ /obj/item/pen, /turf/open/floor/plasteel/white, /area/science/circuit) +"oWo" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/maintenance/starboard/fore) "pvA" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -77923,6 +76970,20 @@ dir = 2 }, /area/crew_quarters/locker) +"pWF" = ( +/obj/effect/decal/cleanable/oil, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"pYA" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/engine/engineering) "qnJ" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -77937,6 +76998,12 @@ /obj/machinery/door/firedoor, /turf/open/floor/plating, /area/science/circuit) +"qoX" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/engine/engineering) "qqg" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 @@ -77953,6 +77020,12 @@ "qBq" = ( /turf/closed/wall/mineral/plastitanium, /area/hallway/secondary/entry) +"qJG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/engine/engineering) "qJZ" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -77963,7 +77036,7 @@ /obj/machinery/camera{ c_tag = "Research Division Circuitry Lab"; dir = 1; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/white, /area/science/circuit) @@ -77976,6 +77049,12 @@ dir = 1 }, /area/science/lab) +"rEi" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/engine/engineering) "rQK" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -77995,6 +77074,29 @@ /obj/machinery/vending/snack/random, /turf/open/floor/plasteel, /area/science/mixing) +"rTo" = ( +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"rVX" = ( +/obj/structure/particle_accelerator/particle_emitter/left{ + icon_state = "emitter_left"; + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"rWa" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel/yellow/side, +/area/engine/engineering) "sdi" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -78005,6 +77107,10 @@ /obj/structure/grille, /turf/open/floor/plating/airless, /area/space/nearstation) +"swQ" = ( +/obj/machinery/light/small, +/turf/open/floor/plating, +/area/engine/engineering) "sGh" = ( /obj/structure/cable{ icon_state = "1-2" @@ -78031,6 +77137,19 @@ "sJW" = ( /turf/closed/wall/mineral/plastitanium, /area/engine/break_room) +"sOW" = ( +/obj/structure/lattice, +/turf/open/space, +/area/space) +"sSU" = ( +/turf/closed/wall/r_wall, +/area/space) +"sZQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/engine/engineering) "tjH" = ( /obj/structure/table/reinforced, /obj/machinery/computer/libraryconsole/bookmanagement, @@ -78052,22 +77171,19 @@ /turf/open/floor/plasteel/white, /area/science/circuit) "tDM" = ( -/obj/machinery/door/airlock/engineering/glass{ - heat_proof = 1; - name = "Supermatter Chamber"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/supermatter) +/obj/item/wrench, +/turf/open/floor/plating, +/area/engine/engineering) "tFJ" = ( /obj/structure/bodycontainer/morgue{ dir = 8 }, /turf/open/floor/plasteel/dark, /area/medical/morgue) +"tMT" = ( +/obj/structure/lattice, +/turf/open/space, +/area/engine/engineering) "tVY" = ( /obj/structure/closet/crate, /obj/item/target/alien, @@ -78118,6 +77234,11 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/starboard) +"uQo" = ( +/turf/open/floor/plasteel/yellow/side{ + dir = 4 + }, +/area/engine/engineering) "uRM" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -78142,15 +77263,34 @@ "vhG" = ( /obj/structure/table/glass, /obj/machinery/camera/autoname{ - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel, /area/science/misc_lab) +"vmz" = ( +/obj/structure/lattice/catwalk, +/turf/open/space, +/area/space) +"vHD" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "vLD" = ( /obj/structure/lattice, /turf/open/space/basic, /area/space) +"vSl" = ( +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "wiZ" = ( /obj/machinery/door/airlock/external{ name = "Security External Airlock"; @@ -78201,11 +77341,39 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/science/misc_lab) +"xcM" = ( +/obj/structure/closet/firecloset, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/yellow/side{ + dir = 4 + }, +/area/engine/engineering) +"xfK" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/power/tesla_coil, +/turf/open/floor/plating/airless, +/area/space) "xkG" = ( /obj/item/device/integrated_electronics/wirer, /obj/structure/table/reinforced, /turf/open/floor/plasteel/white, /area/science/circuit) +"xqB" = ( +/obj/structure/cable/white, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/power/emitter{ + anchored = 1; + state = 2 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "xse" = ( /obj/machinery/door/airlock/external{ name = "Solar Maintenance"; @@ -78237,6 +77405,19 @@ /obj/structure/chair/comfy, /turf/open/floor/plasteel, /area/science/misc_lab) +"xLP" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/space, +/area/space) +"xNI" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "xVl" = ( /turf/closed/wall, /area/hallway/secondary/service) @@ -78247,6 +77428,24 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) +"xWZ" = ( +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/obj/structure/grille, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"yeY" = ( +/obj/machinery/camera/emp_proof{ + c_tag = "Containment - Aft Starboard"; + dir = 8; + network = list("singularity") + }, +/turf/open/floor/plating/airless, +/area/space) "ygk" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -118454,12 +117653,12 @@ aFu aBI aBI aJn -aCO -aFq +lLj +lLj aNq aBI aPZ -aRo +aSB aSu aTG aUZ @@ -118700,7 +117899,7 @@ arJ arI dnh dqu -doh +oWo axO axY aAo @@ -118710,12 +117909,12 @@ aEn aFv aGV aHX -aEi -aKA -aMc -aEi +aBO +aBO +aBO +aBO aOO -aEi +aBO aRp aSv aTH @@ -119217,7 +118416,7 @@ avt awJ axS axY -aCO +jIV ddW aCT aEp @@ -119477,18 +118676,18 @@ axY aAr ddX aCU -aEq -aTO +aCW +aBO aGX -aHZ -aJp -aTO +aBO +aBO +aBO aSB -aTO -aOR -aQa +aBO +aBO +aBO aGX -aTO +aBK aTK aVd aBI @@ -119731,23 +118930,23 @@ avv axY axU ayS -dCk -ddY +enN +ddX deb -deh -aFz -aCZ +aBO +aBO +iTS deM -axY -aCZ +uQo +foU aMg -aCZ +xcM dfh -deM -aCZ -aFz -deh -aVe +aBO +aBO +aBK +pYA +sZQ axY aYu aYu @@ -119991,21 +119190,21 @@ ddP aAt aBL deb -dei +aBO aFA +axY +axY deB -deB -deB -deB +axY aMh -deB -deB -deB -deB +axY +axY +nKh +aBO aSz -aTM +aTK aVe -apc +aJu aYu aZL bbB @@ -120248,21 +119447,21 @@ aAu ddQ aBM aCV -aEr +aBO aFB -aGY +axY daW dBw -aKF +dBw aMi cpR -dfi +axY aQd -dBA +aBO aSA -aTN -aVf -apc +aTK +aVe +aJu aYu aZM bbC @@ -120505,21 +119704,21 @@ ayV aAv aBN aCW -aEr -aFC +aBO +aFA aGZ -aGZ -dlI +qJG +aJu aKG -aMj +aJu dBy -dlI -aQe -aRv +aGZ +nKh +aBO dfD -aTN -aVe -apc +aTK +rWa +aJu aYu aZN bbD @@ -120760,23 +119959,23 @@ axY axY ayW bTq +eHX +aBO aBO -aCX -dej aFC -deC -deC -dlI +axY +qJG +aJu aKH aMk aNu -dlI +axY dfp -dfp -dfE +aBO +eHX dfP dfY -dgc +axY aYu cXA cXA @@ -121014,30 +120213,30 @@ ath ajb avA axY -axZ +axY ayX -ddS -bUw -aCY -dek +axY +axY +aBO +aBO der -deD -dlI -aJv +axY +qJG +aJu aKI tDM -dfb -dfj +dBy +axY dlI -deD -dfF -aTN -aVe -aWH -dgi +aBO +axY +axY +ayX +axY +atm dgc -aqq -aqr +alq +apc aWu bif bif @@ -121271,29 +120470,29 @@ ati ajb avB axY -ddO +qoX bUw -ddT -ddZ -ded -del -des +aJu +axY +axY +axY +axY djt -daY +qJG daZ dbb -aMk -aNv -dfk -dfq +rVX +dBy djt -dfG -dfQ -dfZ -apc -apc -dgo -apc +axY +axY +axY +aJu +bUw +swQ +axY +alq +alq cXZ atm bfZ @@ -121528,31 +120727,31 @@ ajb ajb avC axY -aya -bUw -ddU -aBQ -dee +axY +eEu +axY +axY +ddO aEr -des +ddO djt -daY -daZ -dbb +qJG +aJu +rEi dfa aNv -dfk -daY +djt +ddO djx -dfG -cXz -aVe -atm -alr -dgp +axY +axY +nwU +axY +axY +alq cXI cYj -atm +iOa bga big bga @@ -121571,7 +120770,7 @@ bFS bHy bIV bKC -bMi +bAQ bNU bMg bQV @@ -121785,31 +120984,31 @@ dps dpL avD axY +axY +xNI +ddO +ddO +ddO +ddO ddO -bUw -ddV -aBQ -dee -aEr -aKL djt -daY -deS -dbb -aMk -aNv -dfm -daY djt -dbg -dfR +djt +aRm +djt +djt +djt +ddO +ddO +ddO +ddO dga dgd dgj -dgp -alr -atm atm +alq +jFx +iOa bgb cTu bgb @@ -121828,8 +121027,8 @@ bFT bHz bIW bKD -dhe -dhg +bCi +bCi bPu bPu bPu @@ -122044,28 +121243,28 @@ avE axY ayc aza -aAw -bUw +ddO +aaa aCY dem -aFD +dem +deD +deD deD -dlI -dlI deV -dlN -dfc -dlI -dlI -deD +dem +dem +dem +dem +dem dfI -dfS -aVh -aaf +aaa +ddO +ddO aYx -dgr -dgw -dgA +sSU +lHL +lMJ dgI bgb cTi @@ -122086,7 +121285,7 @@ bHy bIX bKE bKE -dhh +bKE bPv bKE bKE @@ -122296,34 +121495,34 @@ apn aqy arT apm -dnS +vHD avB axY -axY -bTq +goZ +ddO aAx -aBO +sOW aIe aOS -deu -deI -deN -deI -deW -aMm -dfd -deN -dft +mwK +mwK +mwK +mwK +mwK +mwK +mwK +mwK +mwK dBB -dbh -dfT -aVh -aaa +aIe +sOW +cWu +ddO aYx -dgf -dgj -ack -dgJ +sSU +lMJ +lMJ +lHL bgb bij bgb @@ -122343,7 +121542,7 @@ bHA bIY bKF bMk -dhi +bNV bPw bQW bSj @@ -122556,31 +121755,31 @@ atk aux avF dqT -dqT -aaf -ack -dea -aIc -den +esV +xqB +aAx +aaa +aIe +dZD +dev +aav +aav +dev +lMJ +aaa +aav +aav dev -deJ -deO -deU -deX -dBx -dfe -dBz -dfu dfz -dfJ -dfU -dga +aIe +aaa +cWu dge azd -azd -azd -dgB -dgK +sSU +lMJ +lMJ +lHL aaa cUL aaa @@ -122600,7 +121799,7 @@ bHB bIZ bKG bMl -dhj +bKG bIZ bKG bMl @@ -122813,31 +122012,31 @@ atl auy dnS dqT -dqT -aaf -ack -ack +fGs +ddO +aAx +sOW def aCZ -dew -aCZ -axY -axY -aCZ -aCZ -aCZ -axY -axY -aCZ -dew -aCZ -aVe -dgf -dgk -dgt -dgk -dgv -dgJ +aav +aav +aav +vLD +aaf +aaa +aav +aav +aav +xfK +obN +sOW +cWu +ddO +dgg +sSU +lMJ +lHL +lHL anT aaf aaf @@ -122857,7 +122056,7 @@ bza bJa bza bFX -dhk +bza bJa bza bFX @@ -123069,52 +122268,52 @@ apm apm dnh dnS -dnz dqT +xWZ +dPf +aAx +aaa +aIe +dZD +aav +aav +aaa +aaa aaf -aaf -aaf -def -ddZ -dex -aJu -ddZ -ddZ -ddZ -aMo -dff -ddZ -ddZ -aJu -dex -ddZ -aVe +aaa +aaa +aav +aav +dfz +aIe +aaa +cWu aWK dgk -dgt -dgk -dgB -dgM -dgN -dgO -dgO -dgw -dgO -dgS -dgO -dgO -dgw -dgw -dgw -dgw +sSU +lMJ +lHL +lHL +anT +dew +dew +aaf +dew +bpw +dew +dew +aaf +aaf +aaf +aaf bCz -dgw -dha -dgw -dhc -dgw -dha -dhl +aaf +bFY +aaf +bJb +aaf +bFY +aaf bJb aaf bFY @@ -123327,31 +122526,31 @@ dnh auz dqp dqT -dqT +axY +fGs +aAx +vmz +def +aCZ aaa aaa aaa -bTq -dep -dey -aHa ddZ -ddZ -ddZ -ddZ -ddZ -ddZ -ddZ -dfA -dfM -dfV -dgb +cDu +fWO +aaa +vLD +dev +xfK +obN +vmz +cWu dgg -azd -azd -azd -dgv -aaf +axY +sSU +lMJ +lHL +lHL anT aaa aaa @@ -123584,30 +122783,30 @@ dni auA dnS dqT -aaa -aaa -aaa -aaa axY -deq -dey -deK -ddZ -ddZ -ddZ +fGs +ddO +sOW +aIe +dZD +lMJ +aaf +aaf +den +nte aMo -ddZ -ddZ -ddZ -dfB -dfM -dfW +aaf +aaf +lMJ +dfz +aIe +sOW +ddO +dgg axY -aWK -dgk -dgt -dgk -dgB +sSU +lMJ +lHL aaa anT aaa @@ -123841,31 +123040,31 @@ dnh auB avG dqT -aaa -aaa -aaa -aaa axY -aJu -deA -deL -aJu -aJu +fGs +aAx +vmz +def +aCZ +dev +vLD +aaa +fjy deY +moI +aaa +aaa +aaa +xfK +obN +vmz +cWu +dgg axY -dfg -aJu -aJu -dfC -dfO -ddZ -axY -dgh -dgk -dgk -dgk -dgv -aaf +sSU +lMJ +lHL +lHL anT aaa aaa @@ -124098,30 +123297,30 @@ dnh dnh jKK dqT +ocj +rTo +aAx +aaa +aIe +dZD +aav +aav +aaa +aaa aaf aaa aaa +aav +aav +dfz +aIe aaa -axY -axY -axY -axY -axY -axY -axY -axY -axY -axY -axY -axY -axY -axY -axY -aWK +cWu +jjF dgm -dgu -dgm -dgB +sSU +lMJ +lHL aaa anT aaa @@ -124355,31 +123554,31 @@ atn bOY avG dqT -aaf -aaa -aaa +fGs +ddO +aAx +sOW +dtL +aCZ +aav +aav aaa aaa aaf +vLD aaa -aaf -aaa -aaa -aaf -aaa -aaf -aaa -aaf -aaa -aaf -aaf -ack -ack -aye -dgv -aye -dgv -aaf +aav +aav +xfK +xLP +sOW +pWF +ddO +dgg +sSU +lMJ +lHL +lHL anT aaf aaf @@ -124612,29 +123811,29 @@ dnh dnh lNZ dqT -aaf +drT +xqB +aAx +aaa +vmz +dZD +dev +aav aaa aaa +lMJ +dev +aav +aav +dev +dfz +vmz aaa -aaa -aaf -aaa -aaf -aaa -aaa -aaf -aaa -aaf -aaa -aaf -aaa -aaa -aaf -aaf -aaf -aaa -aaa -aaf +cWu +dge +vSl +sSU +lMJ aaa aaa aaf @@ -124869,29 +124068,29 @@ aaa aaf ack dqT -aaf -anT -anT -anT -anT -aaf -anT -anT -anT -anT -anT -anT -aqB -anT -anT -anT -anT -anT -anT -aaf -aaa -aaa -aaf +axY +axY +ddO +hWU +hWU +gKb +hWU +hWU +hWU +hWU +hWU +hWU +hWU +hWU +hWU +yeY +hWU +hWU +ddO +axY +axY +sSU +lMJ aaa aaa aaf @@ -125126,29 +124325,29 @@ aaf aaf ack aaf -aaa -aaa -aaa -aaf -aaa -aaa -bpu -bpu -bpu -bpu -bpu -bpu -bpu -bpu -bpu -bpu -aaa -aaa -aaa -aaf -aaf -aaf -aaf +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +sSU +lMJ aaa aaa aaa @@ -125382,30 +124581,30 @@ aaa aaa aaa aaa +vLD aaa +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +eln +tMT aaa -aaa -aaa -aaf -aaf -aaf -anT -anT -anT -anT -aqB -anT -anT -anT -anT -aqB -aaf -aaf -aaf -aaf -aaa -aaf -aaf +lHL +lMJ aaa aaa aaa @@ -125639,7 +124838,7 @@ aaa aaa aaa aaa -aaa +vLD aaa aaa aaa @@ -125896,26 +125095,26 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD aaf aai aaa diff --git a/_maps/cit_map_files/OmegaStation/OmegaStation.dmm b/_maps/cit_map_files/OmegaStation/OmegaStation.dmm index 88e19bad50..ccef5665e1 100644 --- a/_maps/cit_map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/cit_map_files/OmegaStation/OmegaStation.dmm @@ -2574,7 +2574,7 @@ c_tag = "AI Vault - Port"; dir = 4; name = "ai camera"; - network = list("Sat"); + network = list("minisat"); start_active = 1 }, /obj/effect/turf_decal/stripes/line{ @@ -3515,7 +3515,7 @@ c_tag = "AI Vault - Starboard"; dir = 8; name = "ai camera"; - network = list("Sat"); + network = list("minisat"); start_active = 1 }, /obj/effect/turf_decal/stripes/line{ @@ -4081,8 +4081,7 @@ }, /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/machinery/camera{ - c_tag = "Armoury - Internal"; - network = list("Labor") + c_tag = "Armoury - Internal" }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -4542,8 +4541,7 @@ dir = 8 }, /obj/machinery/camera{ - c_tag = "Security - Cell 1"; - network = list("MINE") + c_tag = "Security - Cell 1" }, /turf/open/floor/plasteel/red/side{ dir = 5 @@ -4569,8 +4567,7 @@ }, /obj/machinery/camera{ c_tag = "Fore Primary Hallway"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/red/corner{ dir = 1 @@ -5967,8 +5964,7 @@ /obj/item/stamp, /obj/machinery/camera{ c_tag = "Cargo Bay Entrance"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/brown{ dir = 8 @@ -6147,8 +6143,7 @@ dir = 8 }, /obj/machinery/camera{ - c_tag = "Security - Cell 2"; - network = list("MINE") + c_tag = "Security - Cell 2" }, /turf/open/floor/plasteel/red/side{ dir = 5 @@ -6521,8 +6516,7 @@ }, /obj/machinery/camera{ c_tag = "Security - Office"; - dir = 4; - network = list("MINE") + dir = 4 }, /turf/open/floor/plasteel/red/corner{ dir = 1 @@ -6547,8 +6541,7 @@ "amK" = ( /obj/machinery/camera{ c_tag = "Security - Central"; - dir = 4; - network = list("MINE") + dir = 4 }, /turf/open/floor/plasteel/neutral/side{ dir = 8 @@ -6629,8 +6622,7 @@ "amS" = ( /obj/machinery/camera{ c_tag = "Locker Room Toilets"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/freezer, /area/hallway/primary/central) @@ -8505,8 +8497,7 @@ /obj/item/shovel, /obj/machinery/camera{ c_tag = "Mining Dock"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, @@ -9015,7 +9006,6 @@ }, /obj/machinery/camera{ c_tag = "Atmospherics Tank 4"; - network = list("thunder"); pixel_x = 10 }, /turf/open/floor/plasteel/green/side{ @@ -9418,8 +9408,7 @@ }, /obj/machinery/camera{ c_tag = "Central Diner 3"; - dir = 4; - network = list("MINE") + dir = 4 }, /turf/open/floor/plasteel/vault/side{ dir = 4 @@ -10058,8 +10047,7 @@ "atz" = ( /obj/machinery/camera{ c_tag = "Atmospherics Tank 1"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -10454,8 +10442,7 @@ }, /obj/machinery/camera{ c_tag = "Bar"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/vault{ dir = 8 @@ -10473,8 +10460,7 @@ }, /obj/machinery/camera{ c_tag = "Bar Backroom"; - dir = 4; - network = list("MINE") + dir = 4 }, /turf/open/floor/plasteel/vault, /area/crew_quarters/bar/atrium) @@ -11736,8 +11722,7 @@ }, /obj/machinery/camera{ c_tag = "Atmospherics East"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/caution{ dir = 4 @@ -11956,8 +11941,7 @@ "axj" = ( /obj/machinery/camera{ c_tag = "Atmospherics Tank 2"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -12059,8 +12043,7 @@ /obj/machinery/portable_atmospherics/canister/nitrogen, /obj/machinery/camera{ c_tag = "Atmospherics Monitoring"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, @@ -12634,8 +12617,7 @@ }, /obj/machinery/camera{ c_tag = "Central Diner 2"; - dir = 4; - network = list("MINE") + dir = 4 }, /turf/open/floor/plasteel/vault/side{ dir = 4 @@ -13466,8 +13448,7 @@ /obj/structure/bedsheetbin, /obj/machinery/camera{ c_tag = "Locker Room East"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel/arrival{ @@ -14488,8 +14469,7 @@ }, /obj/machinery/camera{ c_tag = "Central Hallway East"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/neutral/corner{ dir = 1 @@ -15091,8 +15071,7 @@ }, /obj/machinery/camera{ c_tag = "Engineering Secure Storage"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel/vault/side{ @@ -15337,8 +15316,7 @@ }, /obj/machinery/camera{ c_tag = "Locker Room South"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel/vault{ @@ -15695,8 +15673,7 @@ }, /obj/machinery/camera{ c_tag = "SMES Access"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 2 @@ -15739,8 +15716,7 @@ }, /obj/machinery/camera{ c_tag = "Engineering Access"; - dir = 8; - network = list("Labor") + dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -15877,8 +15853,7 @@ }, /obj/machinery/camera{ c_tag = "Central Diner 1"; - dir = 4; - network = list("MINE") + dir = 4 }, /turf/open/floor/plasteel/redyellow, /area/crew_quarters/bar/atrium) @@ -16458,8 +16433,7 @@ "aHg" = ( /obj/machinery/camera{ c_tag = "Gravity Generator Room"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/effect/turf_decal/bot_white/left, /turf/open/floor/plasteel/vault{ @@ -16559,7 +16533,7 @@ /obj/machinery/camera{ c_tag = "Engineering Fore"; dir = 2; - network = list("SS13","Engine"); + network = list("ss13","engine"); pixel_x = 23 }, /turf/open/floor/engine, @@ -17184,8 +17158,7 @@ }, /obj/machinery/camera{ c_tag = "Engineering Monitoring"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, @@ -18010,7 +17983,7 @@ /obj/machinery/camera{ c_tag = "Kitchen Coldroom"; dir = 4; - network = list("MINE") + network = list("mine") }, /turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) @@ -19145,7 +19118,7 @@ /obj/machinery/camera{ c_tag = "Engineering Port"; dir = 4; - network = list("SS13","Engine") + network = list("ss13","engine") }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -19171,7 +19144,7 @@ /obj/machinery/camera{ c_tag = "Supermatter Chamber"; dir = 2; - network = list("Engine"); + network = list("engine"); pixel_x = 23 }, /obj/structure/cable{ @@ -19285,7 +19258,7 @@ desc = "Used for watching the Engine."; dir = 1; name = "Engine Monitor"; - network = list("Engine"); + network = list("engine"); pixel_y = -32 }, /obj/machinery/rnd/protolathe/department/engineering, @@ -19335,8 +19308,7 @@ }, /obj/machinery/camera{ c_tag = "Atmospherics South West"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/neutral/corner{ dir = 8; @@ -19468,8 +19440,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/camera{ c_tag = "Hydroponics South"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel/vault/side{ @@ -20153,8 +20124,7 @@ icon_state = "4-8" }, /obj/machinery/camera{ - c_tag = "Aft Primary Hallway 4"; - network = list("SS13","Prison") + c_tag = "Aft Primary Hallway 4" }, /turf/open/floor/plasteel/green/corner{ dir = 1 @@ -20262,8 +20232,7 @@ icon_state = "4-8" }, /obj/machinery/camera{ - c_tag = "Aft Primary Hallway 3"; - network = list("SS13","Prison") + c_tag = "Aft Primary Hallway 3" }, /turf/open/floor/plasteel/green/corner{ dir = 1 @@ -21100,7 +21069,7 @@ /obj/machinery/camera{ c_tag = "Engineering Aft"; dir = 2; - network = list("SS13","Engine"); + network = list("ss13","engine"); pixel_x = 23 }, /obj/machinery/atmospherics/pipe/simple/orange/visible{ @@ -21257,8 +21226,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/camera{ c_tag = "Aft Primary Hallway 2"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/yellow/corner{ dir = 8 @@ -21535,8 +21503,7 @@ }, /obj/machinery/camera{ c_tag = "Library 2"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/dark, /area/library) @@ -21685,8 +21652,7 @@ }, /obj/machinery/camera{ c_tag = "Chemistry"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/whiteyellow/corner{ dir = 1 @@ -22567,8 +22533,7 @@ "aUo" = ( /obj/machinery/camera{ c_tag = "Genetics Cloning"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/whiteblue/corner{ dir = 1 @@ -23136,7 +23101,7 @@ /obj/machinery/camera{ c_tag = "Server Room"; dir = 2; - network = list("SS13","RD"); + network = list("ss13","rd"); pixel_x = 22 }, /turf/open/floor/circuit/green/telecomms/mainframe, @@ -23645,8 +23610,7 @@ /obj/structure/closet/crate/bin, /obj/machinery/camera{ c_tag = "Medbay Morgue"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/vault/side{ dir = 8 @@ -23914,8 +23878,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay West"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -24230,8 +24193,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay Storage"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/effect/turf_decal/delivery, /obj/structure/window/reinforced{ @@ -24495,8 +24457,7 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /obj/machinery/camera{ c_tag = "Research Division South"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/whitepurple/corner, /area/science/research) @@ -25331,7 +25292,7 @@ /obj/machinery/camera{ c_tag = "Robotics Lab"; dir = 2; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel/vault/side, @@ -25637,8 +25598,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay Foyer"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/neutral, /area/hallway/primary/central) @@ -26708,8 +26668,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay South"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/whiteblue/corner{ dir = 8 @@ -27226,8 +27185,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay Recovery Room"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/vault/side{ dir = 8 @@ -28451,7 +28409,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Test Chamber"; dir = 2; - network = list("Xeno","RD") + network = list("xeno","rd") }, /turf/open/floor/plasteel/vault{ dir = 4 @@ -28546,7 +28504,7 @@ /obj/machinery/camera{ c_tag = "Crematorium"; dir = 4; - network = list("MINE") + network = list("mine") }, /turf/open/floor/plasteel/vault/side{ dir = 4 @@ -29231,8 +29189,7 @@ }, /obj/machinery/camera{ c_tag = "Chaplain's Quarters"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/vault{ dir = 8 @@ -29278,8 +29235,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/machinery/camera{ c_tag = "Chapel Office"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/wood, /area/chapel/main) @@ -29714,8 +29670,7 @@ }, /obj/machinery/camera{ c_tag = "Chapel South"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -29737,8 +29692,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/camera{ c_tag = "Arrivals Hallway 3"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 2 @@ -29825,7 +29779,7 @@ c_tag = "Science - Server Room"; dir = 8; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/circuit/green/telecomms/mainframe, /area/science/xenobiology) @@ -30413,8 +30367,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/camera{ c_tag = "Port Primary Hallway"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/effect/turf_decal/stripes/line{ dir = 2 @@ -30431,8 +30384,7 @@ }, /obj/machinery/camera{ c_tag = "Starboard Primary Hallway 2"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/neutral/corner, /area/hallway/primary/central) @@ -30440,8 +30392,7 @@ /obj/structure/closet/firecloset, /obj/machinery/camera{ c_tag = "Starboard Primary Hallway 2"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel/vault/side{ @@ -30464,8 +30415,7 @@ "blk" = ( /obj/machinery/camera{ c_tag = "Atmospherics Tank 3"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -30478,12 +30428,11 @@ /obj/machinery/camera{ c_tag = "Shuttle Docking Foyer"; dir = 8; - network = list("MINE") + network = list("mine") }, /obj/machinery/camera{ c_tag = "Escape Arm Airlocks"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, @@ -30492,8 +30441,7 @@ /obj/structure/closet/emcloset, /obj/machinery/camera{ c_tag = "Starboard Primary Hallway"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel/vault/side{ @@ -30507,7 +30455,7 @@ /obj/machinery/camera{ c_tag = "Engineering Starboard"; dir = 8; - network = list("SS13","Engine") + network = list("ss13","engine") }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -30523,8 +30471,7 @@ }, /obj/machinery/camera{ c_tag = "Research Division Access"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/structure/cable/white{ icon_state = "2-8" @@ -30538,7 +30485,6 @@ /obj/machinery/camera{ c_tag = "Aft Primary Hallway 1"; dir = 8; - network = list("SS13"); pixel_y = -22 }, /turf/open/floor/plasteel/purple/corner, @@ -30583,7 +30529,6 @@ /obj/machinery/camera{ c_tag = "Surgery Operating"; dir = 1; - network = list("SS13"); pixel_x = 22 }, /turf/open/floor/plasteel/neutral, @@ -30592,7 +30537,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Test Chamber"; dir = 2; - network = list("Xeno","RD") + network = list("xeno","rd") }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -30615,8 +30560,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/camera{ c_tag = "Arrivals Hallway"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -30627,8 +30571,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/camera{ c_tag = "Arrivals Hallway 2"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -30685,8 +30628,7 @@ }, /obj/machinery/camera{ c_tag = "Chapel Mass Driver"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/light/small, /obj/machinery/button/massdriver{ @@ -31264,8 +31206,7 @@ "buU" = ( /obj/machinery/camera{ c_tag = "Communications Relay"; - dir = 8; - network = list("MINE") + dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -33064,7 +33005,7 @@ c_tag = "AI Chamber - Core"; dir = 2; name = "core camera"; - network = list("RD") + network = list("rd") }, /obj/machinery/cell_charger, /turf/open/floor/plasteel/vault/side, @@ -33247,7 +33188,7 @@ c_tag = "AI Chamber - Core"; dir = 2; name = "core camera"; - network = list("RD") + network = list("rd") }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -33384,7 +33325,7 @@ c_tag = "AI Chamber - Core"; dir = 2; name = "core camera"; - network = list("RD") + network = list("rd") }, /obj/machinery/light{ dir = 1 @@ -33617,7 +33558,7 @@ c_tag = "AI Satellite - Access"; dir = 4; name = "ai camera"; - network = list("Sat"); + network = list("minisat"); start_active = 1 }, /turf/open/floor/plasteel/vault/side{ @@ -33905,7 +33846,7 @@ c_tag = "AI Satellite - Maintenance"; dir = 8; name = "ai camera"; - network = list("Sat"); + network = list("minisat"); start_active = 1 }, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -33977,7 +33918,7 @@ c_tag = "AI Satellite - Antechamber"; dir = 4; name = "ai camera"; - network = list("Sat"); + network = list("minisat"); start_active = 1 }, /turf/open/floor/plasteel/vault/side{ diff --git a/_maps/cit_map_files/PubbyStation/PubbyStation.dmm b/_maps/cit_map_files/PubbyStation/PubbyStation.dmm index 592a3d6b26..0f56742f49 100644 --- a/_maps/cit_map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/cit_map_files/PubbyStation/PubbyStation.dmm @@ -12234,6 +12234,11 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/hallway/primary/central) +"aEY" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "aEZ" = ( /obj/structure/sink{ dir = 8; @@ -12937,11 +12942,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) -"aGW" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "aGX" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -36419,14 +36419,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/hallway/primary/aft) -"bKN" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/poddoor/preopen{ - id = "prison release"; - name = "prisoner processing blast door" - }, -/turf/open/floor/plasteel/dark, -/area/security/brig) "bKO" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/poddoor/preopen{ @@ -45137,9 +45129,6 @@ icon_state = "0-8" }, /obj/machinery/power/tesla_coil, -/obj/structure/window/plasma/reinforced{ - dir = 4 - }, /turf/open/floor/plating/airless, /area/engine/engineering) "chz" = ( @@ -45147,9 +45136,6 @@ icon_state = "0-4" }, /obj/machinery/power/tesla_coil, -/obj/structure/window/plasma/reinforced{ - dir = 8 - }, /turf/open/floor/plating/airless, /area/engine/engineering) "chA" = ( @@ -45257,16 +45243,6 @@ /obj/structure/grille, /turf/open/floor/plating/airless, /area/engine/engineering) -"chQ" = ( -/obj/structure/window/plasma/reinforced{ - dir = 4 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/turf/open/floor/plating/airless, -/area/engine/engineering) "chR" = ( /obj/structure/cable{ icon_state = "2-4" @@ -45420,14 +45396,13 @@ /turf/open/floor/plating/airless, /area/space/nearstation) "cit" = ( -/obj/machinery/the_singularitygen, +/obj/machinery/the_singularitygen/tesla, /turf/open/floor/plating/airless, /area/space/nearstation) "ciu" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/the_singularitygen/tesla, /turf/open/floor/plating/airless, /area/space/nearstation) "civ" = ( @@ -49358,18 +49333,6 @@ dir = 1 }, /area/library/lounge) -"cyr" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = 29 - }, -/turf/open/floor/plasteel/red/side{ - dir = 1 - }, -/area/security/brig) "cyy" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 @@ -49969,29 +49932,9 @@ /turf/open/floor/plasteel/white, /area/medical/chemistry) "cBQ" = ( -/obj/machinery/power/rad_collector/anchored, +/obj/machinery/power/rad_collector, /turf/open/floor/plating, /area/engine/engineering) -"cBR" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/item/tank/internals/plasma, -/turf/open/floor/plating/airless, -/area/engine/engineering) -"cBS" = ( -/obj/structure/window/plasma/reinforced{ - dir = 8 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/open/floor/plating/airless, -/area/engine/engineering) "cBT" = ( /obj/effect/spawner/structure/window/plasma/reinforced, /turf/open/floor/plating/airless, @@ -50114,25 +50057,18 @@ "cDa" = ( /turf/closed/wall, /area/quartermaster/warehouse) -"dTw" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable{ - icon_state = "1-4" +"dse" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 }, -/turf/open/floor/carpet, -/area/library) -"ecV" = ( +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"dMB" = ( /turf/open/floor/plasteel, /area/quartermaster/sorting) "eHp" = ( /turf/closed/wall, /area/crew_quarters/cryopod) -"eIE" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/library/lounge) "eJt" = ( /obj/machinery/computer/cryopod{ pixel_y = 24 @@ -50146,33 +50082,29 @@ }, /turf/open/floor/plasteel/darkpurple, /area/crew_quarters/cryopod) -"fki" = ( +"fwl" = ( /obj/structure/disposalpipe/segment{ - dir = 6 + dir = 4 }, /turf/open/floor/plasteel, /area/quartermaster/sorting) -"fyh" = ( +"fWv" = ( +/obj/structure/bookcase/random/religion, +/turf/open/floor/plasteel/dark, +/area/library/lounge) +"ick" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/library) +"ijF" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable{ icon_state = "1-2" }, /turf/open/floor/carpet, /area/library) -"fID" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/sorting) -"izp" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/preopen{ - id = "Engineering"; - name = "engineering security door" - }, -/turf/open/floor/plating, -/area/security/checkpoint/engineering) "izB" = ( /obj/machinery/door/airlock/external{ name = "Escape Pod" @@ -50182,7 +50114,7 @@ }, /turf/open/floor/plating, /area/crew_quarters/dorms) -"iCc" = ( +"iKb" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/quartermaster/sorting) @@ -50209,6 +50141,31 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/library) +"jvi" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/turf/open/floor/plasteel/darkred/side{ + dir = 1 + }, +/area/crew_quarters/heads/hos) +"jFO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/carpet, +/area/library/lounge) +"jXh" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/library/lounge) "jZg" = ( /obj/machinery/cryopod, /turf/open/floor/plasteel/darkpurple, @@ -50240,12 +50197,6 @@ }, /turf/open/floor/plating, /area/ai_monitored/turret_protected/AIsatextAP) -"krG" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel/dark, -/area/library) "lqy" = ( /obj/machinery/door/airlock/centcom{ name = "Library" @@ -50255,50 +50206,37 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/library/lounge) -"mHo" = ( +"lAs" = ( +/turf/closed/wall, +/area/quartermaster/sorting) +"lQQ" = ( +/obj/machinery/door/poddoor/preopen{ + id = "bridgespace"; + name = "bridge external shutters" + }, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/bridge) +"mdL" = ( /obj/structure/table, -/obj/machinery/microwave{ - pixel_x = -3; - pixel_y = 6 +/obj/item/stock_parts/matter_bin, +/obj/item/stock_parts/matter_bin, +/obj/item/stock_parts/micro_laser, +/obj/item/stock_parts/micro_laser, +/obj/item/stack/cable_coil, +/obj/item/stack/cable_coil, +/turf/open/floor/plasteel/whitepurple/side, +/area/science/lab) +"mCe" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "Engineering"; + name = "engineering security door" }, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = 27 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/kitchen) -"mLe" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -26 - }, -/turf/open/floor/plasteel/darkred/side{ - dir = 1 - }, -/area/crew_quarters/heads/hos) -"nuB" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/carpet, -/area/library/lounge) -"opC" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/obj/machinery/power/apc{ - dir = 4; - name = "Library APC"; - pixel_x = 24 - }, -/obj/structure/cable, -/turf/open/floor/plasteel/dark, -/area/library) -"oJF" = ( +/turf/open/floor/plating, +/area/security/checkpoint/engineering) +"mKc" = ( /obj/structure/bookcase/random/nonfiction, /turf/open/floor/plasteel/dark, /area/library/lounge) @@ -50325,6 +50263,16 @@ "pps" = ( /turf/closed/wall, /area/engine/break_room) +"pXc" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/carpet, +/area/library) +"qOE" = ( +/turf/open/floor/plasteel/dark, +/area/library/lounge) "qWK" = ( /obj/structure/cable{ icon_state = "4-8" @@ -50337,10 +50285,30 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"sHK" = ( -/obj/structure/bookcase/random/religion, -/turf/open/floor/plasteel/dark, -/area/library/lounge) +"rxV" = ( +/obj/structure/table, +/obj/machinery/microwave{ + pixel_x = -3; + pixel_y = 6 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 27 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"sBA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 29 + }, +/turf/open/floor/plasteel/red/side{ + dir = 1 + }, +/area/security/brig) "sQt" = ( /obj/machinery/door/airlock/external{ name = "Supply Dock Airlock"; @@ -50363,10 +50331,6 @@ }, /turf/open/floor/plasteel/darkpurple, /area/crew_quarters/cryopod) -"tez" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/carpet, -/area/library/lounge) "tjW" = ( /obj/machinery/light{ dir = 8 @@ -50378,15 +50342,6 @@ }, /turf/open/floor/plasteel/dark, /area/security/prison) -"ufi" = ( -/turf/open/floor/plasteel/dark, -/area/library/lounge) -"urZ" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/library) "uyt" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -50396,9 +50351,16 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"uTf" = ( +/turf/closed/wall/r_wall, +/area/space) "vpU" = ( /turf/open/floor/plasteel/darkpurple, /area/crew_quarters/cryopod) +"vyc" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) "vzz" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -50423,28 +50385,36 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/library) -"vTA" = ( +"wxJ" = ( +/obj/effect/turf_decal/delivery, /obj/machinery/door/poddoor/preopen{ - id = "bridgespace"; - name = "bridge external shutters" + id = "prison release"; + name = "prisoner processing blast door" }, -/turf/open/floor/plasteel/vault{ - dir = 8 +/turf/open/floor/plasteel/dark, +/area/security/brig) +"xhj" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/carpet, +/area/library/lounge) +"xja" = ( +/obj/machinery/light/small{ + dir = 4 }, -/area/bridge) -"xzr" = ( -/turf/closed/wall, -/area/quartermaster/sorting) -"yhZ" = ( -/obj/structure/table, -/obj/item/stock_parts/matter_bin, -/obj/item/stock_parts/matter_bin, -/obj/item/stock_parts/micro_laser, -/obj/item/stock_parts/micro_laser, -/obj/item/stack/cable_coil, -/obj/item/stack/cable_coil, -/turf/open/floor/plasteel/whitepurple/side, -/area/science/lab) +/obj/machinery/power/apc{ + dir = 4; + name = "Library APC"; + pixel_x = 24 + }, +/obj/structure/cable, +/turf/open/floor/plasteel/dark, +/area/library) +"xjc" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/library) (1,1,1) = {" aaa @@ -68110,13 +68080,13 @@ cgG cfn ckE ckT -tez -tez +xhj +xhj cwK -tez -tez +xhj +xhj cxn -tez +xhj lqy cxC cxK @@ -68368,12 +68338,12 @@ cvw cvK cwg cjR -nuB +jFO ckF -nuB +jFO cxe -nuB -nuB +jFO +jFO cxz cxD cxL @@ -68381,8 +68351,8 @@ cxY cym cyA vOw -fyh -dTw +ijF +pXc ckm ckm ckm @@ -68628,7 +68598,7 @@ cwr clm ckG cwU -eIE +jXh ckU cwe cwe @@ -68639,7 +68609,7 @@ cxM cyB cjp cyR -urZ +ick ckH ckH ckH @@ -68882,10 +68852,10 @@ cvy cvL cwe cwe -sHK -ufi +fWv +qOE ckV -ufi +qOE cln cwe cfN @@ -68896,7 +68866,7 @@ aaa aaa cjp cyS -urZ +ick cyZ ckH czo @@ -69139,10 +69109,10 @@ cvc cvM cfm cwe -sHK -ufi -oJF -ufi +fWv +qOE +mKc +qOE cln cwe caS @@ -69153,7 +69123,7 @@ aht aht cjp cko -urZ +ick ckH ckH clp @@ -69410,7 +69380,7 @@ aaa aaa cjp cyT -urZ +ick cyZ ckH czp @@ -69667,8 +69637,8 @@ aht aht cjp cjp -krG -opC +xjc +xja ckH czq czw @@ -70574,7 +70544,7 @@ aok aoO apF apE -bKN +wxJ apE bBW ajM @@ -73914,7 +73884,7 @@ anJ amX aoY apN -cyr +sBA arp asB atB @@ -74701,7 +74671,7 @@ aDv aBh aBh aGd -aGW +aEY aHG aIM aJG @@ -77251,7 +77221,7 @@ akW alK amw ani -mLe +jvi aiR aph ajM @@ -79160,8 +79130,8 @@ bXk bXk bXk bXk -aaa -aaa +bXk +uTf aaa aaa aaa @@ -79416,9 +79386,9 @@ chR cgt cjT ckq +ckq bXk -aaa -aaa +uTf aaa aaa aaa @@ -79673,9 +79643,9 @@ chS cfV cgS cfV +cfV bXk -aaa -aaa +uTf aaa aaa aaa @@ -79858,7 +79828,7 @@ aRN aWa aRN aRN -mHo +rxV aYS cpn bch @@ -79929,10 +79899,10 @@ cfV cfV cfV cgT +cfV ckr bXk -aaa -aaa +uTf aaa aaa aaa @@ -80179,17 +80149,17 @@ cfU cgu cgU chw -cBR -chw -chw +cgU chw +cgU chw +cgU cjs cfV cfV -bTE -aaa -aaa +cfV +bXk +uTf aaa aaa aaa @@ -80436,17 +80406,17 @@ cfV cgv cfV chx -chQ +cfV chx -chQ +cfV chx -chQ +cfV chx cfV cfV -bTE -abI -aaa +cfV +bXk +uTf aaa aaa aaa @@ -80694,16 +80664,16 @@ cgv cgV bBW bBW -aaa cgV +aht aaa bBW bBW cgV cfV -bTE -abI -abI +cfV +bXk +uTf aaa aaa aaa @@ -80951,16 +80921,16 @@ cgv bBW bBW bBW -aaa +vyc abI aaa bBW bBW bBW cfV -bTE -abI -aaa +cfV +bXk +uTf aaa aaa aaa @@ -81215,9 +81185,9 @@ aaa bBW bBW cfV -bTE -abI -aaa +cfV +bXk +uTf aaa aaa aaa @@ -81469,12 +81439,12 @@ cii cis ciG aaa -aaa -aaa +vyc +cgV cfV -bTE -abI -aaa +cfV +bXk +uTf aaa aaa aaa @@ -81719,7 +81689,7 @@ cfd cfw cfW cgw -cgV +aht abI abI cij @@ -81727,11 +81697,11 @@ cit ciH abI abI -cgV +aht cfV -bTE -abI -aaa +cfV +bXk +uTf aaa aaa aaa @@ -81976,8 +81946,8 @@ cfe cfx cfa cgv -aaa -aaa +cgV +vyc aaa cik ciu @@ -81986,9 +81956,9 @@ aaa aaa aaa cfV -bTE -aaa -aaa +cfV +bXk +uTf aaa aaa aaa @@ -82243,9 +82213,9 @@ aaa bBW bBW cfV -bTE -aaa -aaa +cfV +bXk +uTf aaa aaa aaa @@ -82495,14 +82465,14 @@ bBW aaa aaa abI -aaa +vyc aaa bBW bBW cfV -bTE -aaa -aaa +cfV +bXk +uTf aaa aaa aaa @@ -82733,7 +82703,7 @@ bUi bUV bVO bWA -izp +mCe bYj bYQ bZA @@ -82751,15 +82721,15 @@ cgV bBW aaa aaa +aht cgV -aaa bBW bBW cgV cfV -bTE -abI -aaa +cfV +bXk +uTf aaa aaa aaa @@ -82990,7 +82960,7 @@ bUj bUW bVP bWB -izp +mCe bYk bYQ bZA @@ -83006,17 +82976,17 @@ cfV cgv cfV chz -cBS +cfV chz -cBS +cfV chz -cBS +cfV chz cfV cfV -bTE -abI -abI +cfV +bXk +uTf abI abI aaa @@ -83172,7 +83142,7 @@ ahi atY auU atY -vTA +lQQ ayf axf aAF @@ -83247,7 +83217,7 @@ bUk bUX bVQ bWC -izp +mCe bYl bYO bZC @@ -83263,17 +83233,17 @@ cfU cgx cgU chA +cgU chA +cgU chA -chA -chA -chA +cgU cjt cfV cfV -bTE -abI -aaa +cfV +bXk +uTf abI aaa aaa @@ -83527,10 +83497,10 @@ cfV cfV cfV cgY +cfV cks bXk -abI -aaa +uTf aaa aaa aaa @@ -83785,9 +83755,9 @@ chO cfV cgZ cfV +cfV bXk -abI -abI +uTf abI aaa aaa @@ -84042,9 +84012,9 @@ chP cgt cjU ckq +ckq bXk -abI -aaa +uTf aaa aaa aaa @@ -84299,9 +84269,9 @@ bXk bXk bXk bXk +bXk ckJ -abI -aaa +uTf aaa aaa aaa @@ -85021,7 +84991,7 @@ bsT bus bvz bxg -yhZ +mdL bAs bBu bCI @@ -85752,7 +85722,7 @@ aBI aES aBI aBI -aGW +aEY aHG aBI aJX @@ -85775,7 +85745,7 @@ aMb aSX aMb aBI -aGW +aEY bgA bhe aDZ @@ -87555,13 +87525,13 @@ eHp aHN aIU aJI -xzr -xzr +lAs +lAs aNG aOR -iCc -xzr -xzr +iKb +lAs +lAs aTb aOT aVp @@ -87812,7 +87782,7 @@ aET aHN aIU aJI -xzr +lAs aMg aNH aOS @@ -88069,11 +88039,11 @@ aET aHN aJh bhe -xzr +lAs aMh aNI -fID -ecV +fwl +dMB aRi aSf aTd @@ -88326,13 +88296,13 @@ aHn aIi aJi aKe -xzr +lAs aMi aNJ -fID +fwl aPZ aRj -xzr +lAs aTe aUo aVs @@ -88583,13 +88553,13 @@ aET aHN aIU aJI -xzr +lAs aMj aNK -fID -ecV -ecV -iCc +fwl +dMB +dMB +iKb aTf aUp aVt @@ -88840,7 +88810,7 @@ aET aHN aIU aJI -xzr +lAs aMk aNL aOU @@ -89097,10 +89067,10 @@ cos coy aJj aJI -xzr +lAs aMl aNM -fki +dse aQb aRl aSh @@ -89354,13 +89324,13 @@ aDZ aDZ aJk aJH -xzr +lAs aMm -xzr +lAs aOW -xzr -xzr -xzr +lAs +lAs +lAs aSY aUs aLf @@ -89604,18 +89574,18 @@ aAP avk aDg aEc -aGW +aEY cot aBI aBI aBI aJl aKf -xzr +lAs aMn -xzr +lAs aOX -xzr +lAs aRm aLg aTi diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 7507cf7ce5..eb44fb01e6 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -243,7 +243,7 @@ /obj/structure/lattice, /obj/structure/grille, /turf/open/space, -/area/space/nearstation) +/area/space) "aaU" = ( /obj/machinery/computer/arcade, /turf/open/floor/plasteel/floorgrime, @@ -2439,10 +2439,6 @@ }, /turf/open/floor/plating, /area/security/main) -"agd" = ( -/obj/machinery/atmospherics/pipe/manifold4w/general/visible, -/turf/open/floor/plasteel, -/area/engine/atmos) "agf" = ( /obj/structure/table, /obj/item/stack/sheet/metal, @@ -38079,7 +38075,7 @@ dir = 8; layer = 4; name = "Engine Monitor"; - network = list("engine"); + network = list("singularity"); pixel_x = 30 }, /turf/open/floor/plasteel/red/side{ @@ -40339,9 +40335,6 @@ /obj/machinery/light{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/atmos) "bWV" = ( @@ -43827,16 +43820,6 @@ dir = 5 }, /area/crew_quarters/heads/chief) -"cfI" = ( -/obj/structure/closet/secure_closet/engineering_personal, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel/yellow/side{ - dir = 4 - }, -/area/engine/engineering) "cfJ" = ( /obj/machinery/light/small{ dir = 1 @@ -44139,13 +44122,13 @@ /area/engine/engineering) "cgw" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/engine/engineering) -"cgx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/closed/wall/r_wall, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, /area/engine/engineering) "cgy" = ( /obj/machinery/light/small{ @@ -44215,32 +44198,22 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"cgI" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) "cgJ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, /area/engine/engineering) "cgK" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) -"cgL" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine Room"; - req_access_txt = "10" - }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) "cgO" = ( /obj/structure/rack, @@ -44254,16 +44227,6 @@ dir = 5 }, /area/crew_quarters/heads/chief) -"cgQ" = ( -/obj/machinery/camera{ - c_tag = "Engineering East"; - dir = 8 - }, -/obj/structure/closet/wardrobe/engineering_yellow, -/turf/open/floor/plasteel/yellow/corner{ - dir = 4 - }, -/area/engine/engineering) "cgR" = ( /turf/open/floor/plasteel, /area/engine/engineering) @@ -44624,25 +44587,24 @@ /turf/open/floor/plasteel, /area/engine/engineering) "chF" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" +/obj/effect/landmark/start/station_engineer, +/obj/structure/chair/office/dark{ + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, /area/engine/engineering) "chG" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) "chH" = ( /obj/structure/closet/firecloset, @@ -44740,35 +44702,15 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"chV" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/table/reinforced, -/obj/item/tank/internals/emergency_oxygen/engi{ - pixel_x = 5 - }, -/obj/item/clothing/gloves/color/black, -/obj/item/clothing/glasses/meson/engine, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) "chX" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/structure/cable/yellow{ + icon_state = "2-8" }, -/turf/open/floor/engine, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, /area/engine/engineering) "chY" = ( /obj/machinery/shieldgen, @@ -44852,24 +44794,6 @@ "cig" = ( /turf/closed/wall, /area/engine/engineering) -"cii" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/table/reinforced, -/obj/item/clothing/suit/radiation, -/obj/item/clothing/head/radiation, -/obj/item/clothing/glasses/meson, -/obj/item/device/geiger_counter, -/obj/item/device/geiger_counter, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) "cij" = ( /obj/machinery/modular_computer/console/preset/engineering, /obj/structure/cable{ @@ -44907,15 +44831,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/crew_quarters/heads/chief) -"cip" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/engine, -/area/engine/engineering) "ciq" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -44925,13 +44840,6 @@ }, /turf/open/floor/plating, /area/crew_quarters/heads/chief) -"cir" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) "cis" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel, @@ -45072,14 +44980,18 @@ /turf/open/floor/plasteel, /area/engine/engineering) "ciO" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/item/book/manual/engineering_singularity_safety{ + pixel_x = 3; + pixel_y = 3 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/obj/item/book/manual/wiki/engineering_guide, +/obj/item/book/manual/engineering_particle_accelerator{ + pixel_x = -3; + pixel_y = -3 }, -/turf/open/floor/engine, +/obj/item/clothing/gloves/color/yellow, +/obj/structure/table/glass, +/turf/open/floor/plasteel, /area/engine/engineering) "ciP" = ( /obj/structure/cable{ @@ -45221,12 +45133,6 @@ }, /turf/open/floor/plasteel/vault, /area/crew_quarters/heads/chief) -"cjh" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "cji" = ( /obj/structure/cable{ icon_state = "1-2" @@ -45459,7 +45365,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side{ + dir = 6 + }, /area/engine/engineering) "cjP" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -46730,16 +46638,11 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cnx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/structure/chair/sofa/left{ + icon_state = "sofaend_left"; dir = 4 }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) "cny" = ( /obj/effect/landmark/start/station_engineer, @@ -46973,15 +46876,12 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cnZ" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/airalarm{ - pixel_y = 23 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/engine/engineering) "coa" = ( @@ -46995,25 +46895,32 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cob" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" }, /turf/open/floor/plasteel, /area/engine/engineering) "coc" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine Room"; - req_access_txt = "10" +/obj/structure/table, +/obj/item/electronics/airlock, +/obj/item/electronics/airlock, +/obj/item/electronics/apc, +/obj/item/stock_parts/cell/high/plus, +/obj/item/stock_parts/cell/high/plus, +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/open/floor/engine, +/obj/item/stack/cable_coil, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, /area/engine/engineering) "cop" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/on{ @@ -47182,38 +47089,27 @@ /turf/open/floor/plasteel, /area/engine/engineering) "coK" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) -"coL" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/structure/cable{ icon_state = "1-2" }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"coM" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, +/obj/structure/chair/office/dark, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, +/area/engine/engineering) +"coL" = ( +/obj/structure/chair/office/dark, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, /area/engine/engineering) "coS" = ( /obj/structure/rack, @@ -47379,50 +47275,37 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cpt" = ( -/obj/structure/table, +/turf/open/floor/plasteel/yellow/side{ + dir = 8 + }, +/area/engine/engineering) +"cpu" = ( +/obj/item/book/manual/wiki/engineering_hacking{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/book/manual/wiki/engineering_construction, /obj/item/clothing/gloves/color/yellow, -/obj/item/storage/toolbox/electrical{ - pixel_y = 5 +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/table/glass, +/obj/item/device/flashlight, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cpx" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/closet/radiation, +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, /turf/open/floor/plasteel, /area/engine/engineering) -"cpu" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine Room"; - req_access_txt = "10" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cpv" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cpx" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/engine, -/area/engine/engineering) "cpy" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/engine, +/obj/structure/sign/warning/radiation/rad_area, +/turf/closed/wall/r_wall, /area/engine/engineering) "cpA" = ( /obj/structure/chair/office/dark{ @@ -47437,19 +47320,17 @@ /turf/open/floor/plasteel, /area/bridge) "cpD" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/structure/closet/secure_closet/engineering_welding, +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) "cpE" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 }, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "cpG" = ( /obj/structure/table/optable, @@ -47606,133 +47487,72 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"cpZ" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical{ - pixel_y = 5 - }, -/obj/item/device/flashlight{ - pixel_x = 1; - pixel_y = 5 - }, -/obj/item/device/flashlight{ - pixel_x = 1; - pixel_y = 5 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "cqa" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cqb" = ( +/obj/structure/table, +/obj/machinery/cell_charger, /obj/structure/cable{ icon_state = "1-2" }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) -"cqc" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +"cqb" = ( +/obj/structure/chair/sofa/right{ + icon_state = "sofaend_right"; + dir = 4 }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) "cqd" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/green/visible{ +/obj/structure/closet/radiation, +/obj/structure/extinguisher_cabinet{ + pixel_x = 27 + }, +/obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/engine, -/area/engine/engineering) -"cqe" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 6 - }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) "cqf" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 +/obj/effect/turf_decal/stripes/line{ + dir = 9 }, -/turf/open/floor/engine, +/turf/open/floor/plating, /area/engine/engineering) "cqg" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Gas to Filter"; - on = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cqh" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -26 - }, /obj/machinery/camera{ - c_tag = "Engineering Supermatter Fore"; - dir = 1; + c_tag = "Engineering Center"; + dir = 2; network = list("ss13","engine"); pixel_x = 23 }, -/obj/machinery/atmospherics/pipe/manifold/green/visible{ +/obj/machinery/light{ dir = 1 }, -/turf/open/floor/engine, -/area/engine/engineering) -"cqi" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cqj" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/button/door{ - id = "engsm"; - name = "Radiation Shutters Control"; - pixel_y = -24; - req_access_txt = "10" - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/engine, +/turf/open/floor/plating, /area/engine/engineering) -"cql" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, +"cqh" = ( /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/engine, +/turf/open/floor/plating, /area/engine/engineering) -"cqm" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 +"cqi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 }, -/obj/machinery/meter, -/turf/open/floor/plasteel, +/turf/open/floor/plating, +/area/engine/engineering) +"cqj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, /area/engine/engineering) "cqn" = ( /obj/structure/grille, @@ -47828,54 +47648,39 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"cqA" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/airlock/external{ - name = "Engineering External Access"; - req_access = null; - req_access_txt = "10;13" +"cqC" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cqD" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, /turf/open/floor/plating, /area/engine/engineering) -"cqB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, +"cqE" = ( +/obj/structure/particle_accelerator/end_cap, +/turf/open/floor/plating, +/area/engine/engineering) +"cqF" = ( /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/open/floor/engine, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plating, /area/engine/engineering) -"cqC" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = 24 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cqD" = ( -/obj/structure/sign/warning/radiation, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"cqE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/engineering/glass{ - heat_proof = 1; - name = "Supermatter Chamber"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/engine, -/area/engine/supermatter) -"cqF" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/closed/wall/r_wall, -/area/engine/supermatter) "cqG" = ( /obj/structure/rack, /obj/item/storage/box/rubbershot{ @@ -47963,70 +47768,49 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cqS" = ( -/obj/machinery/light/small{ - dir = 8 +/turf/open/floor/plasteel/yellow/side{ + dir = 10 }, -/obj/structure/closet/emcloset/anchored, -/turf/open/floor/plating, /area/engine/engineering) "cqT" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 - }, -/turf/open/floor/plating, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "cqU" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 +/obj/machinery/button/door{ + id = "Singularity"; + name = "Shutters Control"; + pixel_x = 25; + req_access_txt = "11" }, -/obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister, -/turf/open/floor/plasteel/dark, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "cqY" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/engine/engineering) "cqZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/engine, -/area/engine/supermatter) -"cra" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Gas to Filter" - }, -/obj/machinery/airalarm/engine{ - dir = 4; - pixel_x = -23 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/engine, -/area/engine/supermatter) -"crb" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 2; - icon_state = "pump_map"; - name = "Gas to Chamber" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/engine, -/area/engine/supermatter) -"crc" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/engine, +/obj/structure/particle_accelerator/fuel_chamber, +/turf/open/floor/plating, /area/engine/engineering) -"crd" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine Room"; - req_access_txt = "10" +"cra" = ( +/obj/machinery/particle_accelerator/control_box, +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/engine/engineering) +"crb" = ( +/obj/effect/landmark/start/station_engineer, +/turf/open/floor/plating, +/area/engine/engineering) +"crc" = ( +/obj/machinery/camera/emp_proof{ + c_tag = "Engine Containment Starboard Fore"; + dir = 2; + network = list("engine") }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating/airless, /area/engine/engineering) "crh" = ( /obj/effect/turf_decal/stripes/line{ @@ -48089,40 +47873,38 @@ /turf/open/floor/plating, /area/engine/engineering) "crs" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 6 +/obj/item/stack/cable_coil{ + pixel_x = 3; + pixel_y = -7 }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) +/obj/item/stack/cable_coil{ + pixel_x = 3; + pixel_y = -7 + }, +/obj/item/crowbar, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/engineering) "crt" = ( -/obj/machinery/door/airlock/engineering/glass{ - heat_proof = 1; - name = "Supermatter Chamber"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/supermatter) +/obj/structure/particle_accelerator/power_box, +/turf/open/floor/plating, +/area/engine/engineering) "cru" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 - }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"crv" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) +/obj/item/screwdriver, +/turf/open/floor/plating, +/area/engine/engineering) "crw" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side{ + dir = 4 + }, /area/engine/engineering) "cry" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -48210,43 +47992,34 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/solar/starboard/aft) -"crH" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) "crI" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 9 - }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"crJ" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"crK" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ - dir = 8 - }, -/turf/closed/wall/r_wall, +/obj/structure/chair/stool, +/turf/open/floor/plating, /area/engine/engineering) -"crL" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 +"crJ" = ( +/obj/machinery/light/small{ + dir = 8; + light_color = "#fff4bc" }, -/turf/open/floor/plasteel/dark, +/obj/structure/closet/emcloset/anchored, +/turf/open/floor/plating, +/area/engine/engineering) +"crK" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 + }, +/turf/open/floor/plating, /area/engine/engineering) "crM" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 1 +/obj/machinery/light/small{ + dir = 4; + light_color = "#fff4bc" }, -/turf/open/floor/plasteel/dark, +/obj/structure/closet/emcloset/anchored, +/turf/open/floor/plating, /area/engine/engineering) "crP" = ( /obj/machinery/light, @@ -48259,25 +48032,12 @@ }, /turf/open/floor/plating, /area/engine/engineering) -"crT" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"crU" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 10 - }, -/turf/open/space, -/area/space/nearstation) "crV" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 8 +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "2-8" }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating/airless, /area/engine/engineering) "crW" = ( /obj/machinery/light/small{ @@ -48297,38 +48057,29 @@ /obj/structure/transit_tube, /turf/open/floor/plating, /area/engine/engineering) -"crZ" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) "csa" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating/airless, /area/engine/engineering) "csb" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 9 +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "2-4" }, -/turf/open/space, -/area/space/nearstation) +/turf/open/floor/plating/airless, +/area/engine/engineering) "csc" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/open/space, /area/maintenance/aft) "csd" = ( -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cse" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 8 +/obj/structure/cable{ + icon_state = "1-4" }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating/airless, /area/engine/engineering) "csg" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -48347,13 +48098,6 @@ }, /turf/open/space, /area/space/nearstation) -"csj" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/engine/engineering) "csk" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plating/airless, @@ -48414,26 +48158,22 @@ /turf/open/floor/plasteel/floorgrime, /area/maintenance/disposal/incinerator) "css" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/turf/open/space, -/area/space/nearstation) -"csu" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"csv" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 5 +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "csx" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/turf/open/space, -/area/space/nearstation) +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/grille, +/turf/open/floor/plating/airless, +/area/engine/engineering) "csy" = ( /obj/structure/table, /obj/item/weldingtool, @@ -48442,19 +48182,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"csA" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) "csD" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -48466,24 +48193,6 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/solar/starboard/aft) -"csH" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"csI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) "csM" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/yellow/visible, @@ -48501,27 +48210,9 @@ /area/ai_monitored/turret_protected/aisat_interior) "csP" = ( /obj/effect/turf_decal/stripes/line{ - dir = 4 + dir = 1 }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/green/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"csR" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/engine, +/turf/open/floor/plating/airless, /area/engine/engineering) "csT" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -50551,18 +50242,14 @@ }, /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat_interior) -"czE" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) "czF" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/machinery/meter, -/turf/open/floor/plasteel/dark, +/obj/structure/sign/warning/vacuum/external{ + pixel_x = -32 + }, +/turf/open/floor/plating, /area/engine/engineering) "czG" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -50796,97 +50483,40 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"cAl" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, +"cAm" = ( +/obj/item/wirecutters, /obj/structure/cable/yellow{ - icon_state = "1-4" + icon_state = "2-8" }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/engine/engineering) +"cAo" = ( /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"cAm" = ( -/obj/machinery/power/supermatter_shard/crystal/engine, -/turf/open/floor/engine, -/area/engine/supermatter) -"cAo" = ( -/obj/structure/cable{ +/obj/structure/cable/yellow{ icon_state = "1-4" }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/engine, +/turf/open/floor/plating/airless, /area/engine/engineering) "cAp" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/cable/yellow{ + icon_state = "2-4" }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "Cooling Loop to Gas"; - on = 1 - }, -/turf/open/floor/engine, +/turf/open/floor/plating/airless, /area/engine/engineering) "cAq" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/orange/visible{ - dir = 4 - }, -/turf/open/floor/engine, +/turf/open/floor/plating/airless, /area/engine/engineering) "cAr" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/cable/yellow{ + icon_state = "2-8" }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "Gas to Mix"; - on = 0 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cAs" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cAt" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cAu" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/power/emitter/anchored{ - dir = 4; - state = 2 - }, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/engine/engineering) "cAy" = ( /obj/structure/closet/secure_closet/freezer/kitchen/maintenance, @@ -51001,9 +50631,17 @@ /turf/open/floor/plating, /area/maintenance/fore/secondary) "cAP" = ( -/obj/structure/sign/warning/fire, -/turf/closed/wall/r_wall, -/area/engine/supermatter) +/obj/machinery/button/door{ + id = "Singularity"; + name = "Shutters Control"; + pixel_x = 25; + req_access_txt = "11" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) "cAQ" = ( /obj/structure/chair, /turf/open/floor/plating, @@ -51417,10 +51055,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/turf/open/floor/engine, +/turf/open/floor/plating/airless, /area/engine/engineering) "cBS" = ( /obj/structure/cable{ @@ -51596,89 +51231,6 @@ }, /turf/open/floor/plating, /area/shuttle/auxillary_base) -"cCB" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"cCC" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"cCD" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "Mix to Engine"; - on = 0 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"cCE" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"cCF" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/atmos) -"cCG" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 10 - }, -/turf/open/space, -/area/space/nearstation) -"cCH" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"cCI" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"cCJ" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"cCP" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 5 - }, -/turf/open/space, -/area/space/nearstation) -"cCQ" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"cCS" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) "cCT" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -51698,77 +51250,33 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cDe" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/closet/radiation, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, /turf/open/floor/plasteel, /area/engine/engineering) -"cDg" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) "cDh" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/structure/table/reinforced, -/obj/item/storage/toolbox/mechanical, -/obj/item/device/flashlight, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/item/pipe_dispenser, -/turf/open/floor/engine, -/area/engine/engineering) -"cDi" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/table/reinforced, -/obj/item/clothing/suit/radiation, -/obj/item/clothing/head/radiation, -/obj/item/clothing/glasses/meson, -/obj/item/clothing/glasses/meson, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDj" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, /area/engine/engineering) "cDk" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, /area/engine/engineering) "cDl" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -51785,90 +51293,39 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cDo" = ( -/obj/structure/cable{ - icon_state = "1-4" +/obj/item/pen, +/obj/item/storage/belt/utility, +/obj/item/clothing/glasses/meson, +/obj/item/paper_bin{ + layer = 2.9 + }, +/obj/structure/table/glass, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cDt" = ( +/obj/structure/table, +/obj/item/twohanded/rcl/pre_loaded, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cDw" = ( +/obj/structure/closet/secure_closet/engineering_electrical, +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, /turf/open/floor/plasteel, /area/engine/engineering) -"cDp" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDr" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDs" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDt" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDv" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDw" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) "cDx" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/chair/sofa{ + icon_state = "sofamiddle"; + dir = 4 }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Atmos to Loop"; - on = 0 - }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) "cDy" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDz" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, +/obj/structure/table, +/obj/item/clothing/gloves/color/yellow, +/obj/item/storage/belt/utility, +/obj/item/clothing/glasses/meson, /turf/open/floor/plasteel, /area/engine/engineering) "cDB" = ( @@ -51878,102 +51335,23 @@ /obj/effect/landmark/start/station_engineer, /turf/open/floor/plasteel, /area/engine/engineering) -"cDC" = ( -/obj/item/wrench, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 6 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cDD" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ - dir = 4 - }, -/obj/machinery/meter, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cDE" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "External Gas to Loop" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "cDF" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "External Gas to Loop" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cDG" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"cDH" = ( -/obj/structure/rack, -/obj/item/clothing/mask/gas{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/clothing/mask/gas, -/obj/item/clothing/mask/gas{ - pixel_x = -3; - pixel_y = -3 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"cDI" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"cDJ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/engineering) "cDK" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ +/turf/open/floor/plasteel/yellow/side{ dir = 4 }, -/turf/open/floor/plasteel, /area/engine/engineering) -"cDL" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"cDN" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/closed/wall, -/area/engine/engineering) -"cDY" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ +"cDO" = ( +/obj/effect/turf_decal/stripes/line{ dir = 9 }, -/turf/open/space, +/turf/open/floor/plating/airless, /area/space/nearstation) "cDZ" = ( /obj/structure/cable{ @@ -51983,824 +51361,139 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cEa" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister/nitrogen, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cEd" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/camera{ - c_tag = "Engineering Supermatter Port"; - dir = 4; - network = list("ss13","engine") - }, -/turf/open/floor/engine, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) -"cEe" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"cEf" = ( -/obj/machinery/ai_status_display, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"cEg" = ( -/obj/machinery/status_display, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"cEh" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"cEi" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Engineering Supermatter Starboard"; - dir = 8; - network = list("ss13","engine") - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cEk" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = 24 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cEl" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 6 - }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) "cEm" = ( /obj/machinery/vending/autodrobe, /turf/open/floor/wood, /area/maintenance/bar) -"cEr" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) "cEs" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Gas to Cooling Loop"; - on = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cEt" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) -"cEu" = ( -/obj/machinery/camera{ - c_tag = "Supermatter Chamber"; - dir = 2; - network = list("engine"); - pixel_x = 23 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cEv" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 8 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/structure/window/plasma/reinforced{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cEw" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cEx" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cEy" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 4 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/structure/window/plasma/reinforced{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cEz" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cEA" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) -"cEB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cEC" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Mix to Gas"; - on = 0 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cED" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cEE" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 5 - }, -/turf/open/space, -/area/space/nearstation) -"cEK" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"cEL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -22 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cEM" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/item/tank/internals/plasma, -/turf/open/floor/plating, -/area/engine/supermatter) -"cET" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/oil, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) -"cEU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"cEW" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cFb" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, -/turf/open/floor/engine, +/obj/machinery/power/grounding_rod, +/turf/open/floor/plating/airless, /area/engine/engineering) -"cFc" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, +"cEv" = ( /obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 2; - icon_state = "pump_map"; - name = "Cooling Loop Bypass" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFe" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/structure/window/plasma/reinforced{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cFh" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 9 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/structure/window/plasma/reinforced{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cFj" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" + icon_state = "1-2" }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /turf/open/floor/plating, -/area/engine/supermatter) -"cFk" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Mix Bypass" - }, -/turf/open/floor/engine, /area/engine/engineering) -"cFm" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"cFn" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ +"cEw" = ( +/obj/structure/particle_accelerator/particle_emitter/left, +/turf/open/floor/plating, +/area/engine/engineering) +"cEx" = ( +/obj/structure/particle_accelerator/particle_emitter/right, +/turf/open/floor/plating, +/area/engine/engineering) +"cEy" = ( +/obj/effect/turf_decal/stripes/line{ dir = 6 }, -/turf/open/space, -/area/space/nearstation) -"cFo" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 10 - }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"cFu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/obj/machinery/meter, -/turf/open/floor/engine, +/turf/open/floor/plating, /area/engine/engineering) -"cFw" = ( -/obj/structure/sign/warning/electricshock, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"cFy" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 +"cEK" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 }, -/turf/open/floor/engine, +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access = null; + req_access_txt = "10;13" + }, +/turf/open/floor/plating, /area/engine/engineering) -"cFz" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 +"cFb" = ( +/obj/machinery/camera/emp_proof{ + c_tag = "Engine Containment Port Fore"; + dir = 2; + network = list("engine") }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating/airless, /area/engine/engineering) -"cFA" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible, -/turf/open/floor/plasteel/dark, +"cFn" = ( +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/airless, /area/engine/engineering) "cFI" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFJ" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/floor/engine, +/turf/open/floor/plating/airless, /area/engine/engineering) "cFK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/machinery/field/generator{ + anchored = 1; + state = 2 }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 6 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFM" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFN" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/camera{ - c_tag = "Engineering Supermatter Aft"; - dir = 2; - network = list("ss13","engine"); - pixel_x = 23 - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cFP" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFR" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFT" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 9 - }, -/turf/open/floor/engine, -/area/engine/engineering) +/turf/open/floor/plating/airless, +/area/space/nearstation) "cFU" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGd" = ( -/obj/structure/closet/crate/bin, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGe" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGf" = ( -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 8; - filter_type = "n2" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGg" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGh" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/engine, -/area/engine/engineering) -"cGi" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/engine, -/area/engine/engineering) -"cGj" = ( -/obj/structure/table, -/obj/item/pipe_dispenser, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGk" = ( -/obj/machinery/light, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGl" = ( -/obj/structure/closet/secure_closet/engineering_personal, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGr" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"cGs" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"cGt" = ( -/obj/structure/closet/wardrobe/engineering_yellow, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGu" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 6 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGv" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGx" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible, -/obj/machinery/meter, -/turf/open/floor/engine, -/area/engine/engineering) -"cGC" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/atmospherics/components/binary/valve/digital{ - dir = 4; - name = "Output Release"; - open = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGD" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"cGE" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 10 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cGH" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cGI" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Laser Room"; - req_access_txt = "10" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGK" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cGL" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"cGM" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/plating/airless, -/area/engine/engineering) -"cGR" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGS" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cGT" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGU" = ( -/obj/structure/reflector/double/anchored{ - dir = 6 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGV" = ( -/obj/structure/reflector/box/anchored{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGY" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGZ" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - dir = 1; - volume_rate = 200 - }, -/turf/open/floor/plating/airless, -/area/engine/engineering) -"cHa" = ( -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -22 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cHb" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cHc" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cHd" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cHe" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cHg" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cHj" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, /obj/machinery/power/emitter/anchored{ dir = 8; state = 2 }, -/turf/open/floor/plating, -/area/engine/engineering) -"cHn" = ( /obj/structure/cable{ - icon_state = "1-4" + icon_state = "0-4" }, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/engine/engineering) -"cHo" = ( -/obj/structure/reflector/single/anchored{ - dir = 9 +"cGh" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cHp" = ( -/obj/structure/reflector/single/anchored{ - dir = 5 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cHr" = ( -/obj/structure/cable{ +/obj/structure/cable/yellow{ icon_state = "1-8" }, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"cGr" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/grille, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"cGE" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/grille, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"cGU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"cGV" = ( +/obj/machinery/the_singularitygen/tesla, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"cGZ" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/grille, +/turf/open/floor/plating/airless, /area/engine/engineering) "cHD" = ( /obj/structure/cable{ @@ -53139,8 +51832,13 @@ /turf/open/floor/plating, /area/security/brig) "cMm" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/chair/office/dark{ + dir = 1 + }, +/turf/open/floor/plasteel, /area/engine/engineering) "cMC" = ( /obj/machinery/computer/security/telescreen{ @@ -53148,7 +51846,7 @@ dir = 8; layer = 4; name = "Engine Monitor"; - network = list("engine"); + network = list("singularity"); pixel_x = 30 }, /obj/effect/turf_decal/stripes/line{ @@ -53159,15 +51857,24 @@ }, /area/engine/engineering) "cMD" = ( -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"cMH" = ( -/turf/open/floor/engine, -/area/engine/supermatter) -"cMN" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /turf/open/floor/plating, -/area/engine/supermatter) +/area/engine/engineering) +"cMH" = ( +/obj/structure/particle_accelerator/particle_emitter/center, +/turf/open/floor/plating, +/area/engine/engineering) +"cMN" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "cMQ" = ( /obj/structure/cable{ icon_state = "0-2" @@ -53375,6 +52082,12 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"cQZ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "cSz" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -53400,41 +52113,23 @@ /turf/open/floor/plasteel/dark/telecomms/mainframe, /area/tcommsat/server) "cSG" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/closed/wall/r_wall, -/area/engine/supermatter) +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/engine/engineering) "cSH" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/cable/yellow{ + icon_state = "0-8" }, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 5 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cSI" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cSJ" = ( -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) +/obj/machinery/power/tesla_coil, +/turf/open/floor/plating/airless, +/area/space) "cSK" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/cable/yellow{ + icon_state = "0-4" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 10 - }, -/turf/open/floor/engine, -/area/engine/engineering) +/obj/machinery/power/tesla_coil, +/turf/open/floor/plating/airless, +/area/space) "cSL" = ( /obj/machinery/button/door{ id = "atmos"; @@ -53865,6 +52560,13 @@ }, /turf/open/floor/plating, /area/security/brig) +"ejb" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/engine/engineering) "ejX" = ( /obj/machinery/light{ dir = 1 @@ -53920,6 +52622,13 @@ icon_state = "wood-broken5" }, /area/maintenance/bar) +"eHD" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/engine/engineering) "eRz" = ( /obj/structure/lattice, /obj/structure/grille, @@ -53935,6 +52644,11 @@ }, /turf/open/floor/plasteel, /area/quartermaster/miningdock) +"fdi" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/space/basic, +/area/space) "fgi" = ( /turf/closed/wall, /area/crew_quarters/cryopod) @@ -53978,9 +52692,16 @@ }, /turf/open/floor/plasteel, /area/ai_monitored/security/armory) -"fsQ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/dark, +"fFB" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "Singularity"; + name = "radiation shutters" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, /area/engine/engineering) "fIx" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -54045,6 +52766,9 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel/showroomfloor, /area/space) +"gre" = ( +/turf/open/floor/plating/airless, +/area/engine/engineering) "gtB" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -54148,18 +52872,61 @@ /obj/structure/closet/bombcloset/security, /turf/open/floor/plasteel/showroomfloor, /area/space) +"hmW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"hyz" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "Singularity"; + name = "radiation shutters" + }, +/obj/effect/turf_decal/bot{ + dir = 2 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) "hCi" = ( /obj/structure/lattice, /turf/open/space/basic, /area/space) +"hDa" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/grille, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"hMa" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access = null; + req_access_txt = "10;13" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"hQd" = ( +/turf/open/space/basic, +/area/engine/engineering) "hSW" = ( /turf/open/floor/plasteel/red/side, /area/security/brig) -"ijc" = ( -/obj/structure/table, -/obj/item/stack/sheet/metal/fifty, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) +"ieW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "ilg" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/wood{ @@ -54176,6 +52943,14 @@ /obj/machinery/droneDispenser, /turf/open/floor/plating, /area/maintenance/department/medical/morgue) +"iqO" = ( +/obj/machinery/camera/emp_proof{ + c_tag = "Engine Containment Port Aft"; + dir = 1; + network = list("engine") + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "itG" = ( /obj/structure/table/reinforced, /obj/item/paper_bin, @@ -54289,6 +53064,10 @@ /obj/structure/table/wood, /turf/open/floor/wood, /area/maintenance/bar) +"jyX" = ( +/obj/structure/sign/warning/securearea, +/turf/closed/wall/r_wall, +/area/engine/engineering) "jAD" = ( /obj/structure/grille, /turf/open/floor/plating/airless, @@ -54333,15 +53112,6 @@ dir = 9 }, /area/security/brig) -"jMY" = ( -/obj/structure/table, -/obj/item/stack/cable_coil{ - pixel_x = 3; - pixel_y = -7 - }, -/obj/item/stack/cable_coil, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "jSO" = ( /obj/machinery/light{ dir = 4 @@ -54360,6 +53130,13 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"jZh" = ( +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "khb" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 @@ -54440,6 +53217,12 @@ icon_state = "wood-broken7" }, /area/maintenance/bar) +"kNw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "kPd" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/structure/cable{ @@ -54455,13 +53238,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/medical/morgue) -"kQq" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) "kSb" = ( /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, @@ -54628,27 +53404,44 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) -"mBv" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/binary/valve{ - dir = 4; - name = "Output to Waste" - }, -/turf/open/floor/engine, +"mzz" = ( +/obj/structure/grille, +/turf/open/floor/plating/airless, /area/engine/engineering) "mHd" = ( /obj/structure/falsewall, /turf/open/floor/plating, /area/maintenance/bar) +"mLm" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/grille, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"mMg" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/engine/engineering) "mNi" = ( /obj/machinery/light_switch{ pixel_x = -20 }, /turf/open/floor/plasteel/white, /area/science/circuit) +"mQs" = ( +/obj/machinery/power/emitter/anchored{ + dir = 4; + state = 2 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "mRe" = ( /obj/machinery/light{ dir = 8 @@ -54662,6 +53455,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, /area/maintenance/fore/secondary) +"mWO" = ( +/turf/open/floor/plating/airless, +/area/space) "mXj" = ( /turf/open/floor/plasteel/showroomfloor, /area/space) @@ -54671,10 +53467,6 @@ "nnM" = ( /turf/closed/wall/r_wall, /area/security/armory) -"noK" = ( -/obj/structure/girder, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "nsq" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -54708,10 +53500,6 @@ }, /turf/open/floor/plasteel/floorgrime, /area/security/brig) -"nzh" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "nAv" = ( /obj/structure/table, /obj/item/grenade/barrier{ @@ -54783,6 +53571,13 @@ /obj/item/device/electropack/shockcollar, /turf/open/floor/plating, /area/maintenance/bar) +"oaS" = ( +/obj/effect/landmark/start/station_engineer, +/obj/structure/chair/office/dark{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) "obC" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 @@ -54853,10 +53648,19 @@ dir = 10 }, /area/security/brig) -"oDF" = ( -/obj/machinery/light, +"oAQ" = ( +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/engine/engineering) +"oHi" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) "oHU" = ( /obj/structure/cable{ icon_state = "1-2" @@ -54880,6 +53684,21 @@ /obj/machinery/disposal/bin, /turf/open/floor/plasteel/white, /area/science/circuit) +"oUs" = ( +/obj/machinery/button/door{ + id = "Singularity"; + name = "Shutters Control"; + pixel_x = -25; + req_access_txt = "11" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/engineering) "oZl" = ( /turf/open/floor/plasteel/purple/side{ tag = "icon-purple (NORTH)"; @@ -54923,6 +53742,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/hallway/primary/fore) +"pmD" = ( +/turf/open/space/basic, +/area/space/nearstation) "pzG" = ( /obj/structure/sign/poster/random{ pixel_x = -32 @@ -55089,6 +53911,14 @@ /obj/item/device/assembly/signaler, /turf/open/floor/plating, /area/maintenance/bar) +"riY" = ( +/obj/machinery/camera/emp_proof{ + c_tag = "Engine Containment Starboard Aft"; + dir = 1; + network = list("engine") + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "rmX" = ( /obj/structure/table, /obj/item/reagent_containers/food/drinks/beer, @@ -55131,11 +53961,22 @@ }, /turf/open/floor/wood, /area/maintenance/bar) +"rNn" = ( +/obj/machinery/power/grounding_rod, +/turf/open/floor/plating/airless, +/area/engine/engineering) "rWu" = ( /turf/open/floor/wood{ icon_state = "wood-broken6" }, /area/maintenance/bar) +"rZV" = ( +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "saK" = ( /obj/structure/closet/crate, /obj/item/target/alien, @@ -55148,6 +53989,20 @@ /obj/item/gun/energy/laser/practice, /turf/open/floor/plasteel/white, /area/science/circuit) +"spp" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "Singularity"; + name = "radiation shutters" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/bot{ + dir = 2 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) "srd" = ( /turf/open/floor/plasteel/red/corner{ dir = 4 @@ -55170,6 +54025,12 @@ /obj/item/shovel/spade, /turf/open/floor/plasteel/hydrofloor, /area/hallway/secondary/service) +"sAz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "sGJ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/wood{ @@ -55236,6 +54097,12 @@ /obj/structure/chair/office/light, /turf/open/floor/plasteel/white, /area/science/circuit) +"sWi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "sXy" = ( /obj/machinery/door/airlock/external{ name = "Security External Airlock"; @@ -55299,6 +54166,12 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/space/nearstation) +"tHc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 2 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "tMl" = ( /obj/effect/turf_decal/loading_area, /turf/open/floor/plasteel/showroomfloor, @@ -55329,21 +54202,14 @@ /obj/item/storage/box/drinkingglasses, /turf/open/floor/wood, /area/maintenance/bar) -"udp" = ( -/obj/item/crowbar/large, -/obj/structure/rack, -/obj/item/device/flashlight, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"uhH" = ( -/obj/item/wrench, -/obj/item/weldingtool, -/obj/item/clothing/head/welding{ - pixel_x = -3; - pixel_y = 5 +"ugZ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" }, -/obj/structure/rack, -/turf/open/floor/plasteel/dark, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plating, /area/engine/engineering) "ujc" = ( /obj/machinery/vending/cigarette, @@ -55401,6 +54267,20 @@ }, /turf/open/floor/wood, /area/maintenance/bar) +"uuA" = ( +/obj/structure/table, +/obj/item/storage/toolbox/electrical{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/storage/toolbox/electrical{ + pixel_x = -2 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) "uvc" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/wood, @@ -55408,6 +54288,12 @@ "uvy" = ( /turf/closed/wall/r_wall, /area/space) +"uAt" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/yellow/side, +/area/engine/engineering) "uMX" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -55487,6 +54373,12 @@ }, /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) +"vie" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "vxh" = ( /obj/structure/table, /obj/effect/spawner/lootdrop/maintenance{ @@ -55517,6 +54409,13 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel/white, /area/science/circuit) +"vHQ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/grille, +/turf/open/floor/plating/airless, +/area/engine/engineering) "vNJ" = ( /obj/machinery/vending/clothing, /turf/open/floor/wood, @@ -55740,6 +54639,22 @@ /obj/effect/spawner/lootdrop/grille_or_trash, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"xJs" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"xMh" = ( +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "xTa" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 @@ -55768,6 +54683,14 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) +"yam" = ( +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/plasteel, +/area/engine/atmos) +"yck" = ( +/obj/structure/lattice, +/turf/open/space, +/area/space) "ycu" = ( /obj/structure/cable{ icon_state = "2-4" @@ -78747,10 +77670,10 @@ abc abc afu abc -aaa -aaa -aaa -aaa +abc +abc +abc +abc aaa aaa aaa @@ -79124,8 +78047,8 @@ aaa aaa aaa aaa -aaT -aaT +aaa +aaa aaa aaa aaa @@ -79369,21 +78292,21 @@ cjJ aaa aaa crn -aaf -aaT -aaT -aaT -aaT -aaT -aaT -aaT -aaT -aaT +pmD +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa -aaf -ctv -aaT -aaT aaa aaa aaa @@ -79626,21 +78549,21 @@ cjJ aaa aaa crn -aaf -aaT -ctv -ctv -ctv -ctv -ctv -ctv -ctv -aaT +pmD +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa -aaf -ctv -ctv -aaT aaa aaa aaa @@ -79883,20 +78806,20 @@ cjJ aaf aaf cig -aaf -aaT -aaT -aaT -aaT -aaT -aaT -aaT -aaT -aaT -aaf -aaf -aaf -aaf +pmD +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -80141,17 +79064,17 @@ ccw ccw ccw aaa -aaf -aaa -aaa -aaf -aaa -aaa -aaf aaa aaa aaa -aaf +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -80398,19 +79321,19 @@ cqw cqO crp aaa -aaf -aaa -aaa -aaf -aaa -aaa -aaf aaa aaa aaa -aaT -aaT -aaT +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -80654,20 +79577,20 @@ cgR cgR cqN cro -cEl -cEE -cEl -cFm -csx -cFm -cFm -csx -csv +pmD +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa -aaT -ctv -aaT aaa aaa aaa @@ -80911,20 +79834,20 @@ ciN cji cDZ crr -crJ -crT -crJ -cFn -css -csx -csx -css -csb -aaf -aaf -aaT -ctv -aaT +pmD +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -81164,24 +80087,24 @@ ccw cfL coH cBO -cgR +cnv cDB cqP crq -crZ -crT -crZ -cFo -css -cFm -cFm -css -csv +pmD +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa -aaT -ctv -aaT aaa aaa aaa @@ -81425,21 +80348,21 @@ cgR cqx cqR crp -crJ -crT -crJ -cFn -css -csx -csx -css -csb -aaf -aaf -aaT -ctv -aaT -aaa +gXs +gXs +gXs +gXs +gXs +gXs +gXs +gXs +gXs +gXs +gXs +gXs +gXs +gXs +hCi aaa aaa aaa @@ -81682,25 +80605,25 @@ cpX cqz cqQ ccw -crH -crT -crZ -cFo -css -cFm -cFm -css -csv +pmD aaa aaa -aaT -ctv -aaT +uvy +uvy +uvy aaa aaa aaa aaa aaa +uvy +uvy +uvy +hCi +hCi +aaa +aaa +aaa aaa aaa aaa @@ -81939,24 +80862,24 @@ clJ cig cig ccw -crJ -crT -crJ -cFn -css -csx -csx -css -csb -aaf -aaf -aaT -ctv -aaT -aaa +pmD +pmD +uvy +uvy +uvy +uvy +uvy aaa aaa aaa +uvy +uvy +uvy +uvy +uvy +hCi +hCi +hCi aaa aaa aaa @@ -82190,30 +81113,30 @@ ccw ccw ccw cnZ -coH +oHi +cpt +cpt cpt -cpZ -cig cqS ccw -crH -crT -crZ -cFo -css -cFm -cFm -css -csv -aaa -aaa -aaT -ctv -aaT -aaa -aaa -aaf -aaa +ccw +ccw +ccw +ccw +ccw +ccw +ccw +ccw +cpy +ccw +ccw +ccw +ccw +ccw +ccw +ccw +uvy +hCi aaa aaa aaa @@ -82449,28 +81372,28 @@ cnt cob coL cDo +oaS cgR -cqA cqT -csg +ccw crJ -crU +ccw csb cFn css +cFn csx -csx -css -csb -aaf -aaf -aaT -aaT -aaT -gXs -aaf -aaf -aaf +ccw +ccw +ccw +cGE +cFn +jZh +mzz +mzz +ccw +uvy +yck aaa aaa aaa @@ -82707,27 +81630,27 @@ cgw coK cpu cMm -ccw -ccw -ccw +ckH +uAt +hMa crK cEK csa -csj -csa -csa +gre +mQs +gre cGr -aaa -aaa -aaa -aaa -aaf -aaa -aaa -aaa -aaa -aaf -aaa +vHQ +hDa +vHQ +mLm +gre +mQs +gre +gre +ccw +uvy +hCi aaa aaa aaa @@ -82960,31 +81883,31 @@ ckG clJ cmF cgR -cgI +cnZ chF ciO -cqc -cqc -cqc -cEd -cEr -cEL +oaS +cgR +cqT +ccw +cig +ccw cFb -cFu +gre cFI -cGd -cGs -cGr +gre +gre +gre +gre +gre +gre +gre +cFI +gre +iqO ccw -ccw -ccw -ccw -ccw -ccw -aaa -eRz -aaT -eRz +uvy +fdi aaa aaa aaa @@ -83217,30 +82140,30 @@ cTa ceZ clQ cgR -cgx -coM -cpv -cqb -cqb -cqb -cqb +cnZ +oHi +cgR +cgR +cgR +cqT +fFB cEs -cqb -cqb +gre +rNn cAp -cqb +xJs cAo -cGt -cgx -jMY -csd -cHa -csd -uhH +xJs +cAo +xJs +cAo +xJs +cQZ +gre +gre +gre ccw -aaa -aaT -ctv +uvy aaT aaa aaa @@ -83475,29 +82398,29 @@ cTd ckF ckF cgK -cDg -cDp -cqe -cqB -cqB -cEe +oHi +cgR +cgR +cgR +cqT +fFB csP -cAl -cFc +gre +gre cAq -cFJ +mWO cSH -cGu -cGH -fsQ -fsQ -cGR -csd -csd +mWO +cSH +mWO +cSH +mWO +cSH +mWO +gre +gre ccw -aaa -aaT -ctv +uvy aaT aaa aaa @@ -83735,26 +82658,26 @@ cgJ chG cpx cqd -cDC +cjc cqU -cEf -cEt -cEM -csA -cEg +fFB +csP +gre +rNn +cAq cFK -cGe -cGv -cGI -cGS -cHb -cHg -cHn -oDF +aoV +aoV +cFK +gXs +aaa +aoV +aoV +cFK +mWO +gre ccw -aaf -aaT -ctv +uvy aaT aaf aaa @@ -83988,30 +82911,30 @@ cig cig cTf cgR -ccw +cnZ cDh cpy -cDv -cDD -cqU -cMD -cEu -cEz -cEz -cMD -cFL -cGf -kQq -cMm -ciZ -cHc -cAu -cAu -ciZ ccw +hyz +ccw +ccw +cqY +cqY +cqY +cAq +aoV +aoV +aoV +hCi +aaf aaa -aaT -ctv +aoV +aoV +aoV +mWO +gre +ccw +uvy aaT aaa aaa @@ -84245,30 +83168,30 @@ ckI clJ cmL cBO +cnZ +cDh ccw -chV -cpx cqf cqD -cMD +oUs crs cEv -cEv -cFe -cMD -cFM -czE -kQq -ccw -cGT -csd -csd -csd -csd -ccw +ugZ +cqY +cAq +aoV +aoV +aaa +aaa aaf -aaT -ctv +aaa +aaa +aoV +aoV +mWO +gre +ccw +uvy aaT aaa aaa @@ -84502,30 +83425,30 @@ ckK clJ cmL cgR -cgL +cnZ chX -cpx +spp cqh cqF cra crI cEw -cEw -cEw -cFw -cFN -csH -csR -cMm -cGU -csd -csd -cHo -csd -ccw +ejb +cqY +cAq aaa -aaT -ctv +aaa +aaa +cDO +cGU +sWi +aaa +hCi +cFK +mWO +gre +ccw +uvy aaT aaa aaa @@ -84759,30 +83682,30 @@ ckI clJ cmL cnv -cMm -chX -cpx +cnZ +eHD +ccw cqg cqE cqZ crt cMH cAm -cMH +mMg cMN -cFO -cSI -cSI -cMm +gXs +aaf +aaf +kNw cGV -csd -cGV -noK -csd +tHc +aaf +aaf +gXs +mWO +gre ccw -aaa -aaT -ctv +uvy aaT aaa aaa @@ -85016,30 +83939,30 @@ cfb ccw cmN cgR -cgL -chX -cpx +cnZ +eHD +hyz cqj cSG crb cru cEx -cEx -cEx -cAP -cFP -csI -cAt -cMm -csd -csd -csd -cHp -csd +oAQ +cqY +cAq +cFK +hCi +aaa +hmW +sAz +ieW +aaa +aaa +aaa +mWO +gre ccw -aaf -aaT -ctv +uvy aaT aaa aaa @@ -85273,30 +84196,30 @@ cfb clM cfz cgR +cnZ +eHD ccw -cii -cpx cqi cMD cAP -crv -cEy -cEy -cFh cMD -cFM -czE -kQq -ccw -cGT -csd -csd -csd -csd -ccw +cMD +cEy +cqY +cAq +aoV +aoV +aaa +aaa aaf -aaT -ctv +aaa +aaa +aoV +aoV +mWO +gre +ccw +uvy aaT aaa aaa @@ -85530,30 +84453,30 @@ cfb cfa cje cgR +cnZ +eHD +cpy ccw -cDi -cDr -cDw -cDE -cEa -cMD -cEz -cEz -cEz -cMD -cFR -cSJ -kQq -cMm -ciZ -cHd -cHj -cHd -ciZ +hyz ccw +ccw +cqY +cqY +cqY +cAq +aoV +aoV aaa -aaT -ctv +aaa +aaf +hCi +aaa +aoV +aoV +mWO +gre +ccw +uvy aaT aaa aaa @@ -85787,30 +84710,30 @@ ckL cmF cje cgR -cMm -chX +cnZ +cjS cpD cDw cDF cEa -cEg -cEA -cET -cFj -cEf -cFS -cGg -mBv -cGI -cGS -cHe -cHe -cHr -oDF +fFB +csP +gre +rNn +cAq +cFK +aoV +aaa +aaa +gXs +cFK +aoV +aoV +cFK +mWO +gre ccw -aaf -aaT -ctv +uvy aaT aaf aaa @@ -86044,30 +84967,30 @@ ceq clQ cje cgR -cMm -cDj -cDs -cql -cDG -cDG -cEh -cEB -cEU -cFk -cAs -cFT +cnZ +cjS +cgR +cgR +cgR +cqT +fFB +csP +gre +gre +cAq +mWO cSK -cGx -cGK -nzh -nzh -cGY -csd -csd +mWO +cSK +mWO +cSK +mWO +cSK +mWO +gre +gre ccw -aaf -aaT -ctv +uvy aaT aaa aaa @@ -86301,30 +85224,30 @@ ckO ckH cja cny -ccw -cip +cnZ +cjS cnx cDx cqb -cqb -cqb -cEC -cqb -cqb +cqT +fFB +cEs +gre +rNn cAr -cqb +xJs cGh -cGC -cey -ijc -csd -cEk -csd -udp +xJs +cGh +xJs +cGh +xJs +vie +gre +gre +gre ccw -aaf -aaT -ctv +uvy aaT aaa aaa @@ -86558,30 +85481,30 @@ cfb clR cgR cgR -cMm -cir +cnZ +cjS cDt cDy cqC +cqT +ccw +ccw +ccw crc -cEi -cED -crc -crc -cFy +gre cBR -cGi -cGD -cGL +gre +gre +gre +gre +gre +gre +gre +cBR +gre +riY ccw -ccw -ccw -ccw -ccw -ccw -aaa -aaT -aaT +uvy aaT aaa aaa @@ -86819,27 +85742,27 @@ cDe cDk coc cqa -cig -ccw -ccw +uuA +uAt +hMa czF +cEK csd -csd -cFz +gre cFU -cGj +gre cGE -cGM +vHQ cGZ -aag -aaa -aaf -aaa -aaa -aaa -aaa -aaf -aaa +vHQ +csx +gre +cFU +gre +gre +ccw +uvy +hCi aaa aaa aaa @@ -87075,28 +85998,28 @@ cgU cgU cis cjN -cDz -cDH -cMm -csd -crM -crV -crV -cFA -csd -cGk +cgR +cgR +cqT ccw -aag -aag -aag -aaf -aaf -aaf -aaf -gXs -aaf -aaf -aaf +crM +ccw +crV +cFn +xMh +cFn +mLm +ccw +ccw +ccw +cGr +cFn +rZV +mzz +mzz +ccw +uvy +yck aaf aaa aaa @@ -87328,32 +86251,32 @@ ccw cet cfd cfB -cfI -cgQ +cfB +cfB cjS cjN -cqm cgR -crd -cEk -crL -cEW -cse -cse -csu -cGl +cgR +cqT ccw -aaa -aaa -aaf -aaa -aaf -ctv -aaT -aaa -aaa -aaf -aaa +ccw +ccw +ccw +ccw +ccw +ccw +ccw +ccw +cpy +ccw +ccw +ccw +ccw +ccw +ccw +jyX +uvy +hCi aaa aaa aaa @@ -87589,28 +86512,28 @@ ccw ccw cDl cjN -cjh -cDI +cgR +cgR +cgR +cqS ccw ccw ccw ccw ccw -cMm -cMm -cMm ccw -aaf -aaf -aaf -aaf -aaf -ctv -aaT -aaa -aaa -aaf +hQd +pmD +pmD +pmD +uvy +uvy +uvy +uvy +uvy aaa +yck +hCi aaa aaa aaa @@ -87847,7 +86770,7 @@ ccw cDm cjP ckF -cDJ +ckF ckF cpE cjR @@ -87860,13 +86783,13 @@ aaa aaa aaa aaa -ctv -ctv -ctv -aaT -aaa -aaa -aaa +pmD +uvy +uvy +uvy +hCi +hCi +hCi aaa aaa aaa @@ -88089,7 +87012,7 @@ caE cbA ccy bOd -bOd +yam bQu cfO cgW @@ -88111,17 +87034,17 @@ ccw crX cfK aag -aaa -aaa -aaa -aaa -aaa -aaa -aaT -aaT -aaT -aaT -aaa +hCi +hCi +hCi +hCi +hCi +hCi +gXs +gXs +gXs +gXs +hCi aaa aaa aae @@ -88334,7 +87257,7 @@ bIF bOZ bQp bRA -bOd +yam bTO bUL bVU @@ -88361,7 +87284,7 @@ ccw cpa cjc cqo -cDL +ccw cjk cjm ccw @@ -88377,7 +87300,7 @@ aaa aaa aaa aaa -eRz +gXs aaa aaa aaa @@ -88618,7 +87541,7 @@ ccw ccw cpI ccw -cDL +ccw cjl cjQ cjV @@ -88875,7 +87798,7 @@ cig cpb ciZ cqp -cDN +cig cjT cgR crP @@ -89132,7 +88055,7 @@ cig cig czg cig -cDN +cig crh crA crR @@ -89389,7 +88312,7 @@ cig cpc cpJ cpc -cDN +cig cqY cqY cqY @@ -89622,7 +88545,7 @@ bRF bSM bTS bUQ -agd +bWa bUO bVZ bVZ @@ -89646,7 +88569,7 @@ cig cpd czM cpd -cDN +cig aaa aaa aaa @@ -89879,8 +88802,8 @@ bRE bSJ bPe bOd -cCB -cCC +bOd +bOd bXT bXT bXT @@ -89903,7 +88826,7 @@ ccw cpd czL cpd -cDL +ccw aaf aaa aaa @@ -90137,7 +89060,7 @@ bSM bTU bUS bUS -cCD +bUS bXU bUS bUS @@ -90160,7 +89083,7 @@ aaa cpd cpM cpd -cCQ +aaf aaf aaa aaa @@ -90394,7 +89317,7 @@ bSN bTT bUR bWb -cCE +bUR bTT bUR bZJ @@ -90417,7 +89340,7 @@ aaa aaa czN aaa -cCQ +aaf aaf aaa aaa @@ -90674,7 +89597,7 @@ aaa aaa aaa aaa -cCQ +aaf aaf aaa aaa @@ -90908,7 +89831,7 @@ bSP bPh bQy bRI -cCF +bQy bPh bQy bRI @@ -90931,7 +89854,7 @@ aaa aaa aaa aaa -cCQ +aaf aaf aaa aaa @@ -91165,16 +90088,16 @@ aaf bRK aaf bVv -cCG -cCH -cCI -cCJ -cCI -cCH -cCI -cCJ -cCI -cCP +aaf +bRK +aaf +bVv +aaf +bRK +aaf +bVv +aaf +aaf bLK chg bLK @@ -91188,7 +90111,7 @@ aoV aoV aoV aoV -cCQ +aaf aoV aaa aaa @@ -91431,7 +90354,7 @@ bPj bQA bPj bOh -cCQ +aaf bLK cyG bLK @@ -91445,7 +90368,7 @@ aoV aoV aoV aoV -cCQ +aaf aoV aaa aaa @@ -91688,21 +90611,21 @@ cbI ccC cdD bOh -cCG -cCS -cCS -cCI -cCI -cCI -cCI -cCI -cCI -cCI -cCI -cCI -cCI -cCI -cDY +aaf +aah +aah +aaf +aaf +aaf +aaf +aaf +aah +aah +aah +aah +aah +aah +aaf aaf aaf aaf diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 7951c5a282..4777dc3e29 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -9182,10 +9182,6 @@ }, /turf/open/floor/circuit/green, /area/engine/supermatter) -"ayK" = ( -/obj/machinery/power/supermatter_shard/crystal/engine, -/turf/open/floor/engine, -/area/engine/supermatter) "ayL" = ( /obj/machinery/atmospherics/pipe/manifold/general/visible{ dir = 4 @@ -50251,6 +50247,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/power/emitter{ + anchored = 1; + state = 2 + }, /turf/open/floor/plating/airless, /area/engine/engineering) "cdE" = ( @@ -51319,6 +51319,7 @@ dir = 8; network = list("singularity") }, +/obj/machinery/power/grounding_rod, /turf/open/floor/plating/airless, /area/engine/engineering) "cfC" = ( @@ -52290,7 +52291,6 @@ /turf/open/space, /area/space/nearstation) "chu" = ( -/obj/structure/reagent_dispensers/fueltank, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/engine/engineering) @@ -53055,10 +53055,10 @@ "cjb" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ - icon_state = "2-4" + icon_state = "4-8" }, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "2-4" }, /turf/open/space, /area/space/nearstation) @@ -53074,28 +53074,11 @@ /turf/open/floor/plating, /area/engine/engineering) "cje" = ( -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable{ - icon_state = "0-4" - }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, /turf/open/floor/plating, /area/engine/engineering) -"cjf" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engpa"; - name = "Engineering Chamber Shutters" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/engine/engineering) "cjg" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -53660,13 +53643,6 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) -"ckx" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) "cky" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -53682,6 +53658,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 8 }, +/obj/machinery/power/grounding_rod, /turf/open/floor/plating/airless, /area/space/nearstation) "ckA" = ( @@ -53690,35 +53667,11 @@ id = "engpa"; name = "Engineering Chamber Shutters" }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, /turf/open/floor/plating, /area/engine/engineering) -"ckB" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"ckC" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel/neutral, -/area/engine/engineering) "ckD" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/neutral, @@ -54289,20 +54242,9 @@ /turf/open/floor/plating/airless, /area/space/nearstation) "clS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, /obj/machinery/field/generator{ - anchored = 1 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"clT" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/field/generator{ - anchored = 1 + anchored = 1; + state = 2 }, /turf/open/floor/plating/airless, /area/space/nearstation) @@ -54315,19 +54257,6 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) -"clV" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engpa"; - name = "Engineering Chamber Shutters" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/engine/engineering) "clW" = ( /obj/structure/rack, /obj/item/crowbar, @@ -54337,9 +54266,6 @@ /turf/open/floor/plasteel, /area/engine/engineering) "clX" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/engine/engineering) @@ -55205,9 +55131,6 @@ id = "engpa"; name = "Engineering Chamber Shutters" }, -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/effect/turf_decal/stripes/line{ dir = 2 }, @@ -55893,9 +55816,6 @@ /obj/structure/cable{ icon_state = "2-8" }, -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -56455,6 +56375,10 @@ /turf/open/floor/plating, /area/engine/engineering) "cqr" = ( +/obj/structure/particle_accelerator/particle_emitter/left{ + icon_state = "emitter_left"; + dir = 8 + }, /turf/open/floor/plating, /area/engine/engineering) "cqs" = ( @@ -56463,6 +56387,7 @@ /area/engine/engineering) "cqt" = ( /obj/structure/cable, +/obj/machinery/particle_accelerator/control_box, /turf/open/floor/plating, /area/engine/engineering) "cqu" = ( @@ -57024,7 +56949,7 @@ /turf/open/floor/plating/airless, /area/space/nearstation) "crJ" = ( -/obj/item/wrench, +/obj/machinery/the_singularitygen/tesla, /turf/open/floor/plating/airless, /area/space/nearstation) "crK" = ( @@ -57065,7 +56990,10 @@ /turf/open/floor/plating, /area/engine/engineering) "crO" = ( -/obj/item/weldingtool/largetank, +/obj/structure/particle_accelerator/fuel_chamber{ + icon_state = "fuel_chamber"; + dir = 8 + }, /turf/open/floor/plating, /area/engine/engineering) "crP" = ( @@ -57843,7 +57771,10 @@ /turf/open/floor/plating/airless, /area/space/nearstation) "ctp" = ( -/obj/item/wrench, +/obj/structure/particle_accelerator/particle_emitter/right{ + icon_state = "emitter_right"; + dir = 8 + }, /turf/open/floor/plating, /area/engine/engineering) "ctq" = ( @@ -58656,9 +58587,6 @@ /obj/structure/cable{ icon_state = "1-8" }, -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/engine/engineering) @@ -58713,6 +58641,7 @@ dir = 8 }, /obj/effect/turf_decal/bot, +/obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plasteel, /area/engine/engineering) "cva" = ( @@ -59870,24 +59799,6 @@ dir = 4 }, /area/crew_quarters/fitness/recreation) -"cxA" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/field/generator{ - anchored = 1 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"cxB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/field/generator{ - anchored = 1 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) "cxD" = ( /obj/structure/rack, /obj/item/crowbar, @@ -60707,13 +60618,6 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) -"czp" = ( -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating/airless, -/area/space/nearstation) "czq" = ( /obj/structure/cable{ icon_state = "0-2" @@ -60727,33 +60631,9 @@ icon_state = "1-2" }, /obj/effect/turf_decal/stripes/corner, +/obj/machinery/power/grounding_rod, /turf/open/floor/plating/airless, /area/space/nearstation) -"czs" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engpa"; - name = "Engineering Chamber Shutters" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"czt" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel/neutral, -/area/engine/engineering) "czu" = ( /obj/structure/cable/white{ icon_state = "0-2" @@ -61355,10 +61235,10 @@ "cAI" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ - icon_state = "1-4" + icon_state = "4-8" }, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-4" }, /turf/open/space, /area/space/nearstation) @@ -61370,11 +61250,7 @@ /turf/open/space, /area/space/nearstation) "cAK" = ( -/obj/machinery/power/rad_collector/anchored, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable{ - icon_state = "0-4" - }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, @@ -62960,6 +62836,7 @@ dir = 8; network = list("singularity") }, +/obj/machinery/power/grounding_rod, /turf/open/floor/plating/airless, /area/engine/engineering) "cDW" = ( @@ -63843,6 +63720,12 @@ icon_state = "0-2" }, /obj/effect/turf_decal/stripes/line, +/obj/machinery/power/emitter{ + anchored = 1; + dir = 1; + icon_state = "emitter"; + state = 2 + }, /turf/open/floor/plating/airless, /area/engine/engineering) "cFI" = ( @@ -100905,6 +100788,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, /area/science/circuit) +"gsR" = ( +/turf/open/space, +/area/space) "gKr" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 @@ -100995,6 +100881,9 @@ dir = 9 }, /area/science/circuit) +"hRG" = ( +/turf/open/space/basic, +/area/space/nearstation) "iQh" = ( /obj/structure/bodycontainer/morgue{ dir = 1 @@ -101053,6 +100942,9 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/neutral, /area/medical/morgue) +"jKb" = ( +/turf/open/space, +/area/space/nearstation) "kwx" = ( /obj/effect/turf_decal/loading_area, /turf/open/floor/plasteel/whitepurple/corner, @@ -101078,6 +100970,9 @@ dir = 5 }, /area/crew_quarters/locker) +"lkn" = ( +/turf/open/floor/plating/airless, +/area/space/nearstation) "loI" = ( /obj/machinery/autolathe, /obj/machinery/door/window/southleft{ @@ -101093,6 +100988,10 @@ dir = 4 }, /area/science/lab) +"lxv" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "lEl" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -101137,6 +101036,13 @@ dir = 1 }, /area/science/circuit) +"mqk" = ( +/obj/structure/particle_accelerator/end_cap{ + icon_state = "end_cap"; + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/engineering) "mvm" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ @@ -101148,6 +101054,10 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/circuit/green, /area/science/research/abandoned) +"nJG" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) "oZC" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command{ @@ -101161,6 +101071,13 @@ }, /turf/open/floor/wood, /area/bridge/showroom/corporate) +"pfd" = ( +/obj/structure/particle_accelerator/particle_emitter/center{ + icon_state = "emitter_center"; + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/engineering) "pmQ" = ( /obj/structure/table/reinforced, /obj/machinery/newscaster{ @@ -101224,6 +101141,12 @@ "saw" = ( /turf/closed/wall, /area/science/circuit) +"tdp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 2 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "tmi" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -101262,6 +101185,9 @@ /obj/structure/reagent_dispensers/water_cooler, /turf/open/floor/plasteel/whitepurple/side, /area/science/misc_lab) +"uDN" = ( +/turf/open/floor/plating/airless, +/area/space) "uYS" = ( /obj/machinery/door/airlock/atmos/glass{ heat_proof = 1; @@ -101319,6 +101245,13 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) +"xwB" = ( +/obj/structure/particle_accelerator/power_box{ + icon_state = "power_box"; + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/engineering) "xwK" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -121811,14 +121744,14 @@ aaa cja ckw clS -aad -aad -clR -aaa -abj -aad -aad -cxA +jKb +jKb +clS +nJG +hRG +jKb +jKb +clS ctn cja aaa @@ -122066,17 +121999,17 @@ cdC cfA aad cjb -ckx +cky +jKb +gsR +gsR +lxv aad -aaa -aaa -abj -aad -abj -aaa -aaa -aad -czp +hRG +gsR +gsR +jKb +czq cAI aad cDT @@ -122324,15 +122257,15 @@ cfA aaa cja ckw +jKb +gsR +hRG +hRG aad -aaa -abj -abj -abj -abj -abj -aaa -aad +hRG +hRG +gsR +jKb ctn cja aaa @@ -122579,19 +122512,19 @@ car cbP cfA abj -cja -ckw -ckw -abj -abj +cjb +cky +hRG +hRG +hRG cqo clR ctm -abj -abj -abj -ctn -cja +hRG +lxv +clS +czq +cAI abj cDT cFJ @@ -122836,19 +122769,19 @@ car cbP cdC aad -cjb -cky -aaa +cja +ckw +nJG +aad aad -abj ckw crJ -ctn -abj +tdp aad -aaa -czq -cAI +aad +nJG +ctn +cja aad cdC cFJ @@ -123093,19 +123026,19 @@ car cbP cfA abj -cja -ckw -abj -abj -abj +cjb +cky +clS +lxv +hRG cqp crK cto -abj -abj -ctn -ctn -cja +hRG +hRG +hRG +czq +cAI abj cDT cFJ @@ -123352,15 +123285,15 @@ cfA aaa cja ckw +jKb +gsR +hRG +hRG aad -aaa -abj -abj -abj -abj -abj -aaa -aad +hRG +hRG +gsR +jKb ctn cja aaa @@ -123608,17 +123541,17 @@ cdC cfA aad cjb -ckx +cky +jKb +gsR +aaa +hRG aad +lxv aaa -aaa -abj -aad -abj -aaa -aaa -aad -czp +gsR +jKb +czq cAI aad cDU @@ -123866,15 +123799,15 @@ cfA aaa cja ckw -clT -aad -aad -abj -aaa -crK -aad -aad -cxB +clS +jKb +hRG +hRG +nJG +clS +jKb +jKb +clS ctn cja aaa @@ -124377,8 +124310,8 @@ car cbT cdG cfB -aaa -aad +uDN +lkn aaa aad cjd @@ -124390,8 +124323,8 @@ cjd cjd aad aaa -aad -aaa +lkn +uDN cDV cFL cHg @@ -124898,7 +124831,7 @@ cje cjd cpa cqr -cqr +pfd ctp cuQ cjd @@ -125149,19 +125082,19 @@ cbV cdJ car chv -cjf +chv ckA -clV +chv cnC cpa cqs -cqr +xwB ctq cuR cnC -cjf -czs -clV +chv +chv +chv chv car cFO @@ -125407,7 +125340,7 @@ cdK cfD chw cjg -ckB +chw clW cnD cpb @@ -125417,7 +125350,7 @@ ctr cuS cnD cxD -ckB +chw chw chw cDW @@ -125664,17 +125597,17 @@ cdL cfE chx cjh -ckC +cjn clX cnE cpc cqu -cqr +mqk cts cuT cnE clX -czt +cjn cAL cCs cDX @@ -127151,7 +127084,7 @@ atS avb awh axz -ayK +axz axz aAW axz diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index a2e2d840b5..016b1dd128 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -5314,10 +5314,6 @@ "alq" = ( /turf/closed/wall, /area/maintenance/starboard) -"alr" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/maintenance/starboard) "als" = ( /obj/machinery/light{ dir = 8 @@ -11251,6 +11247,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, +/obj/machinery/light/small{ + dir = 1 + }, /turf/open/floor/plating, /area/maintenance/starboard/fore) "axN" = ( @@ -11354,17 +11353,21 @@ req_one_access_txt = "0" }, /obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side{ + dir = 9 + }, /area/engine/engineering) "axV" = ( /obj/structure/sign/warning/securearea{ pixel_y = 32 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/yellow/side{ + dir = 1 }, -/turf/open/floor/plasteel, /area/engine/engineering) "axW" = ( /obj/structure/disposalpipe/segment, @@ -11374,10 +11377,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 1 }, -/turf/open/floor/plasteel, /area/engine/engineering) "axX" = ( /obj/machinery/light_switch{ @@ -11393,41 +11395,21 @@ /obj/structure/sign/warning/securearea{ pixel_y = 32 }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 5 }, -/turf/open/floor/plasteel, /area/engine/engineering) "axY" = ( /turf/closed/wall/r_wall, /area/engine/engineering) -"axZ" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"aya" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "ayc" = ( -/obj/structure/table/reinforced, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/item/clothing/mask/breath{ - pixel_x = 4 +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/white{ + icon_state = "2-4" }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating/airless, /area/engine/engineering) -"aye" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 10 - }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/space/nearstation) "ayf" = ( /obj/structure/closet/crate, /obj/item/stack/sheet/glass{ @@ -11770,46 +11752,59 @@ dir = 1; pixel_y = 2 }, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side{ + dir = 8 + }, /area/engine/engineering) "ayT" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "ayV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/engine/engineering) "ayW" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/structure/cable/white{ + icon_state = "4-8" }, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine"; - req_access_txt = "10" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"ayX" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, /area/engine/engineering) -"aza" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +"ayX" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/turf/open/floor/plasteel/dark, +/obj/machinery/door/airlock/external{ + name = "External Containment Access"; + req_access_txt = "10; 13" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"aza" = ( +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/turf/open/floor/plating/airless, /area/engine/engineering) "azb" = ( /obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, @@ -11821,13 +11816,18 @@ }, /area/security/brig) "azd" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/space/nearstation) +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "aze" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-22" @@ -12266,6 +12266,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/light/small{ + dir = 1 + }, /turf/open/floor/plating{ icon_state = "platingdmg2" }, @@ -12455,13 +12458,20 @@ "aAo" = ( /obj/structure/closet/secure_closet/engineering_personal, /obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side{ + dir = 9 + }, /area/engine/engineering) "aAp" = ( /obj/structure/closet/secure_closet/engineering_personal, /obj/item/clothing/suit/hooded/wintercoat/engineering, /obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/yellow/side{ + dir = 1 + }, /area/engine/engineering) "aAr" = ( /obj/item/device/radio/intercom{ @@ -12474,15 +12484,12 @@ c_tag = "Engineering - Fore"; dir = 2 }, -/obj/effect/turf_decal/stripes/line{ +/obj/structure/closet/secure_closet/engineering_personal, +/turf/open/floor/plasteel/yellow/side{ dir = 1 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aAt" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 }, @@ -12496,27 +12503,21 @@ sortType = 4 }, /obj/effect/landmark/start/station_engineer, +/obj/structure/cable/white{ + icon_state = "1-4" + }, /turf/open/floor/plasteel, /area/engine/engineering) "aAv" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plasteel, /area/engine/engineering) -"aAw" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "aAx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/r_wall, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, /area/engine/engineering) "aAz" = ( /obj/structure/table/wood, @@ -12540,7 +12541,7 @@ id = "mining_home"; name = "mining shuttle bay"; width = 7; - roundstart_template = /datum/map_template/shuttle/mining/box; + roundstart_template = /datum/map_template/shuttle/mining/box }, /turf/open/space/basic, /area/space) @@ -12743,7 +12744,7 @@ id = "laborcamp_home"; name = "fore bay 1"; width = 9; - roundstart_template = /datum/map_template/shuttle/labour/box; + roundstart_template = /datum/map_template/shuttle/labour/box }, /turf/open/space/basic, /area/space) @@ -13134,18 +13135,14 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/turf/open/floor/plasteel/yellow/side{ + dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aBK" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aBL" = ( @@ -13157,9 +13154,6 @@ }, /obj/machinery/rnd/circuit_imprinter, /obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aBM" = ( @@ -13169,9 +13163,6 @@ }, /obj/machinery/rnd/protolathe/department/engineering, /obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aBN" = ( @@ -13180,21 +13171,10 @@ dir = 1 }, /obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aBO" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) -"aBQ" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, /area/engine/engineering) "aBS" = ( /obj/item/stack/ore/silver, @@ -13707,9 +13687,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aCV" = ( @@ -13719,38 +13696,29 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/engine/engineering) "aCW" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) -"aCX" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/closed/wall/r_wall, +/turf/open/floor/plasteel, /area/engine/engineering) "aCY" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/structure/cable{ + icon_state = "2-4" }, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine"; - req_access_txt = "10" - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) +/obj/machinery/power/grounding_rod, +/turf/open/floor/plating/airless, +/area/space) "aCZ" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/power/tesla_coil, +/turf/open/floor/plating/airless, +/area/space) "aDa" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -14352,10 +14320,9 @@ icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aEo" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -14378,31 +14345,16 @@ /obj/structure/cable/yellow{ icon_state = "2-8" }, -/obj/structure/cable/white{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aEq" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aEr" = ( -/obj/structure/cable/white{ - icon_state = "4-8" +/obj/machinery/camera/emp_proof{ + c_tag = "Containment - Fore Port"; + dir = 4; + network = list("singularity") }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, +/obj/machinery/power/grounding_rod, +/turf/open/floor/plating/airless, /area/engine/engineering) "aEt" = ( /obj/structure/table, @@ -14940,10 +14892,9 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 2 }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aFw" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ @@ -14961,52 +14912,26 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"aFz" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine"; - req_access_txt = "10" - }, -/turf/open/floor/plating, -/area/engine/engineering) "aFA" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/engine, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "aFB" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/rack, +/obj/machinery/button/door{ + id = "engpa"; + name = "Engineering Chamber Shutters Control"; + pixel_y = -26; + req_access_txt = "11" }, -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 6 - }, -/turf/open/floor/engine, +/obj/item/clothing/gloves/color/black, +/obj/item/wrench, +/obj/item/clothing/glasses/meson/engine, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "aFC" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"aFD" = ( -/obj/structure/cable/white{ - icon_state = "1-4" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/meter, -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible, -/turf/open/floor/engine, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "aFE" = ( /obj/structure/table/wood, @@ -15753,10 +15678,9 @@ /obj/structure/extinguisher_cabinet{ pixel_x = -27 }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aGW" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -15767,31 +15691,14 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/engineering) -"aGY" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) "aGZ" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "External Gas to Loop" +/obj/machinery/door/poddoor/shutters/preopen{ + id = "engpa"; + name = "Engineering Chamber Shutters" }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"aHa" = ( -/obj/structure/cable/white, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/engine/engineering) "aHb" = ( /obj/machinery/camera{ @@ -16196,6 +16103,9 @@ lootcount = 2; name = "2maintenance loot spawner" }, +/obj/machinery/light/small{ + dir = 8 + }, /turf/open/floor/plating, /area/maintenance/starboard/fore) "aHW" = ( @@ -16212,42 +16122,21 @@ dir = 8; pixel_x = -24 }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aHY" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/engine/engineering) -"aHZ" = ( -/obj/item/clothing/gloves/color/yellow, -/obj/item/clothing/gloves/color/yellow, -/obj/item/clothing/gloves/color/yellow, -/obj/item/clothing/suit/hazardvest, -/obj/item/clothing/suit/hazardvest, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/effect/turf_decal/delivery, -/obj/structure/table, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aIc" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/plating, -/area/engine/engineering) "aIe" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/engine/engineering) +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/space, +/area/space) "aIf" = ( /obj/machinery/camera{ c_tag = "Auxillary Base Construction"; @@ -16924,34 +16813,13 @@ /obj/structure/table, /obj/item/airlock_painter, /obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aJp" = ( -/obj/structure/table, -/obj/effect/turf_decal/delivery, -/obj/item/clothing/glasses/meson/engine, -/obj/item/clothing/glasses/meson/engine, -/obj/item/clothing/glasses/meson/engine, -/obj/machinery/light{ - dir = 4 +/turf/open/floor/plasteel/yellow/side{ + dir = 9 }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/item/pipe_dispenser, -/obj/item/pipe_dispenser, -/obj/item/pipe_dispenser, -/turf/open/floor/plasteel, /area/engine/engineering) "aJu" = ( /turf/open/floor/plating, /area/engine/engineering) -"aJv" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 6 - }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) "aJB" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum/external, @@ -17398,12 +17266,6 @@ }, /turf/open/floor/plating, /area/engine/engineering) -"aKA" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "aKB" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -17417,53 +17279,26 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/engine/engineering) -"aKF" = ( -/obj/machinery/button/door{ - id = "engsm"; - name = "Radiation Shutters Control"; - pixel_x = 24; - req_access_txt = "10" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) "aKG" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ +/obj/structure/particle_accelerator/end_cap{ + icon_state = "end_cap"; dir = 4 }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) +/turf/open/floor/plating, +/area/engine/engineering) "aKH" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 4; - name = "Gas to Chamber"; - on = 0 +/obj/structure/particle_accelerator/fuel_chamber{ + icon_state = "fuel_chamber"; + dir = 4 }, -/turf/open/floor/engine, -/area/engine/supermatter) +/turf/open/floor/plating, +/area/engine/engineering) "aKI" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 9 +/obj/structure/particle_accelerator/power_box{ + icon_state = "power_box"; + dir = 4 }, -/obj/machinery/meter, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"aKL" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 8; - name = "Mix Bypass"; - on = 0 - }, -/turf/open/floor/engine, +/turf/open/floor/plating, /area/engine/engineering) "aKN" = ( /obj/machinery/door/poddoor{ @@ -18014,12 +17849,6 @@ /obj/effect/landmark/blobstart, /turf/open/floor/plating, /area/engine/engineering) -"aMc" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "aMd" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable{ @@ -18040,62 +17869,52 @@ /turf/open/floor/plasteel, /area/engine/engineering) "aMg" = ( -/obj/machinery/door/firedoor, /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine"; - req_access_txt = "10" +/turf/open/floor/plasteel/yellow/side{ + dir = 4 }, -/turf/open/floor/plating, /area/engine/engineering) "aMh" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "engpa"; + name = "Engineering Chamber Shutters" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aMi" = ( /obj/structure/cable{ icon_state = "2-8" }, -/obj/structure/cable{ - icon_state = "1-8" - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/engine, +/turf/open/floor/plating, /area/engine/engineering) -"aMi" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - name = "Gas to Filter" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"aMj" = ( -/obj/machinery/door/airlock/engineering/glass{ - heat_proof = 1; - name = "Supermatter Chamber"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/supermatter) "aMk" = ( -/turf/open/floor/engine, -/area/engine/supermatter) -"aMm" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/plasteel/dark, +/obj/machinery/particle_accelerator/control_box, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/turf/open/floor/plating, /area/engine/engineering) "aMo" = ( -/obj/structure/reflector/box/anchored{ - dir = 8 +/obj/effect/turf_decal/stripes/line{ + dir = 2 }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) +/turf/open/floor/plating/airless, +/area/space/nearstation) "aMq" = ( /obj/structure/window/reinforced, /turf/open/space, @@ -18542,7 +18361,9 @@ maxcharge = 15000 }, /obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side{ + dir = 10 + }, /area/engine/engineering) "aNr" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -18552,17 +18373,27 @@ /turf/open/floor/plasteel, /area/engine/engineering) "aNu" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 8; - name = "Gas to Filter"; - on = 0 +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/engine, -/area/engine/supermatter) +/obj/machinery/camera/emp_proof{ + c_tag = "Containment - Particle Accelerator"; + dir = 1; + network = list("singularity") + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/engine/engineering) "aNv" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/turf/open/floor/engine, -/area/engine/supermatter) +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/engine/engineering) "aNw" = ( /obj/structure/window/reinforced{ dir = 4 @@ -19226,10 +19057,9 @@ /obj/structure/cable/yellow{ icon_state = "0-4" }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aOP" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -19252,26 +19082,12 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"aOR" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/closet/firecloset, -/obj/effect/turf_decal/stripes/line{ +"aOS" = ( +/obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aOS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/item/device/radio/intercom{ - freerange = 0; - frequency = 1459; - name = "Station Intercom (General)"; - pixel_y = 21 - }, -/turf/open/floor/engine, -/area/engine/engineering) +/turf/open/floor/plating/airless, +/area/space) "aOT" = ( /obj/structure/window/reinforced{ dir = 4 @@ -19815,41 +19631,32 @@ icon_state = "2-8" }, /obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side{ + dir = 9 + }, /area/engine/engineering) "aPZ" = ( /obj/machinery/vending/tool, /obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aQa" = ( -/obj/structure/table, -/obj/effect/turf_decal/delivery, -/obj/item/clothing/glasses/meson, -/obj/item/clothing/glasses/meson, -/obj/item/clothing/glasses/meson, -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/turf/open/floor/plasteel/yellow/side{ + dir = 1 }, -/obj/item/storage/belt/utility, -/obj/item/storage/belt/utility, -/turf/open/floor/plasteel, /area/engine/engineering) "aQd" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/structure/rack, +/obj/machinery/button/door{ + id = "engpa"; + name = "Engineering Chamber Shutters Control"; + pixel_y = 26; + req_access_txt = "11" }, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ +/obj/item/storage/belt/utility, +/obj/item/weldingtool, +/obj/item/clothing/head/welding, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/yellow/side{ dir = 1 }, -/turf/open/floor/engine, -/area/engine/engineering) -"aQe" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, /area/engine/engineering) "aQf" = ( /obj/structure/chair{ @@ -20454,19 +20261,9 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/turf/open/floor/plasteel/yellow/side{ + dir = 8 }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aRo" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, /area/engine/engineering) "aRp" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -20478,9 +20275,6 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aRq" = ( @@ -20507,13 +20301,6 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel, /area/engine/engineering) -"aRv" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 5 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "aRy" = ( /turf/closed/wall/r_wall, /area/aisat) @@ -20930,10 +20717,9 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aSu" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ @@ -20962,9 +20748,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, /turf/open/floor/plasteel, /area/engine/engineering) "aSx" = ( @@ -20975,36 +20759,39 @@ /obj/structure/cable/yellow{ icon_state = "1-8" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/engineering) "aSz" = ( -/obj/structure/cable{ - icon_state = "1-4" +/obj/item/pen, +/obj/item/storage/belt/utility, +/obj/item/clothing/glasses/meson, +/obj/item/paper_bin{ + layer = 2.9 }, -/obj/effect/turf_decal/stripes/line{ +/obj/structure/table/glass, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) "aSA" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/item/book/manual/wiki/engineering_hacking{ + pixel_x = 3; + pixel_y = 3 }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 5 - }, -/turf/open/floor/engine, +/obj/item/book/manual/wiki/engineering_construction, +/obj/item/clothing/gloves/color/yellow, +/obj/structure/table/glass, +/obj/item/device/flashlight, +/turf/open/floor/plasteel, /area/engine/engineering) "aSB" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aSD" = ( @@ -21489,10 +21276,9 @@ /obj/structure/cable/yellow{ icon_state = "1-8" }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/turf/open/floor/plasteel/yellow/side{ + dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aTG" = ( /obj/structure/disposalpipe/segment{ @@ -21504,26 +21290,18 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aTH" = ( /obj/structure/disposalpipe/segment{ dir = 9 }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/open/floor/plasteel, +/obj/machinery/light, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "aTI" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -21534,9 +21312,6 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, @@ -21549,31 +21324,6 @@ /obj/structure/cable/white{ icon_state = "4-8" }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aTM" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"aTN" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/engine, -/area/engine/engineering) -"aTO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aTQ" = ( @@ -22178,7 +21928,9 @@ "aUY" = ( /obj/effect/turf_decal/delivery, /obj/structure/closet/wardrobe/engineering_yellow, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side{ + dir = 10 + }, /area/engine/engineering) "aUZ" = ( /obj/structure/disposalpipe/segment, @@ -22189,8 +21941,8 @@ /obj/effect/turf_decal/bot{ dir = 1 }, -/turf/open/floor/plasteel{ - dir = 1 +/turf/open/floor/plasteel/yellow/side{ + dir = 6 }, /area/engine/engineering) "aVa" = ( @@ -22227,31 +21979,13 @@ dir = 4 }, /obj/structure/closet/secure_closet/engineering_electrical, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "aVe" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"aVf" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/engineering{ - name = "Supermatter Engine"; - req_access_txt = "10" - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"aVh" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "aVk" = ( /obj/structure/window/reinforced{ @@ -22791,8 +22525,10 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "aWu" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/obj/machinery/door/airlock/external{ + name = "Escape Pod Four"; + req_access = null; + req_access_txt = "32" }, /turf/open/floor/plating, /area/maintenance/starboard) @@ -22880,18 +22616,16 @@ dir = 1 }, /area/engine/engineering) -"aWH" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 10 - }, -/turf/open/floor/plating, -/area/maintenance/starboard) "aWK" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 10 +/obj/structure/cable/white{ + icon_state = "2-4" }, -/turf/open/space, -/area/space/nearstation) +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "aWL" = ( /obj/machinery/ai_status_display{ pixel_x = -32 @@ -23788,12 +23522,15 @@ /turf/closed/wall, /area/security/checkpoint/engineering) "aYx" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "aYy" = ( /obj/machinery/camera{ c_tag = "AI Chamber - Port"; @@ -32033,9 +31770,6 @@ dir = 6 }, /area/security/checkpoint/customs) -"bpu" = ( -/turf/closed/wall/r_wall, -/area/space/nearstation) "bpv" = ( /obj/structure/sign/warning/securearea{ pixel_y = 32 @@ -38467,7 +38201,6 @@ /obj/machinery/atmospherics/pipe/simple/purple/visible{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/orange/visible, /turf/open/space, /area/space/nearstation) "bCA" = ( @@ -42921,10 +42654,6 @@ /obj/machinery/meter, /turf/open/floor/plasteel, /area/engine/atmos) -"bMi" = ( -/obj/machinery/atmospherics/pipe/manifold4w/general/visible, -/turf/open/floor/plasteel, -/area/engine/atmos) "bMj" = ( /obj/machinery/holopad, /turf/open/floor/plasteel, @@ -46279,10 +46008,10 @@ /turf/closed/wall, /area/maintenance/solars/port/aft) "bTq" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 }, -/turf/closed/wall/r_wall, +/turf/open/floor/plasteel, /area/engine/engineering) "bTr" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -46858,8 +46587,12 @@ }, /area/maintenance/starboard) "bUw" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible, -/turf/open/floor/plasteel/dark, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plating, /area/engine/engineering) "bUx" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ @@ -47346,7 +47079,6 @@ /turf/closed/wall, /area/hallway/secondary/service) "bVA" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/door/airlock{ name = "Service Hall"; req_access_txt = "null"; @@ -48106,6 +47838,9 @@ /obj/structure/cable/yellow{ icon_state = "2-4" }, +/obj/machinery/light/small{ + dir = 1 + }, /turf/open/floor/plating, /area/maintenance/starboard) "bXc" = ( @@ -57167,23 +56902,23 @@ }, /area/maintenance/port/aft) "cpR" = ( +/obj/machinery/button/door{ + id = "engpa"; + name = "Engineering Chamber Shutters Control"; + pixel_y = -26; + req_access_txt = "11" + }, /obj/effect/turf_decal/stripes/line{ - dir = 4 + dir = 10 }, -/obj/machinery/camera{ - c_tag = "Engineering Supermatter Port"; - dir = 8; - network = list("ss13","engine") +/obj/structure/cable{ + icon_state = "1-4" }, -/obj/machinery/airalarm/engine{ - dir = 8; - pixel_x = 24 - }, -/obj/machinery/atmospherics/pipe/manifold/green/visible{ +/obj/machinery/light{ dir = 8 }, -/turf/open/floor/engine, -/area/engine/supermatter) +/turf/open/floor/plating, +/area/engine/engineering) "cpS" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -72101,6 +71836,12 @@ }, /turf/open/floor/plating, /area/shuttle/auxillary_base) +"cWu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "cWA" = ( /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, @@ -72137,18 +71878,6 @@ /obj/structure/easel, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"cXz" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/camera{ - c_tag = "Engineering Supermatter Aft"; - dir = 1; - network = list("ss13","engine") - }, -/turf/open/floor/engine, -/area/engine/engineering) "cXA" = ( /turf/closed/wall/r_wall, /area/security/checkpoint/engineering) @@ -72161,7 +71890,12 @@ }, /area/construction/mining/aux_base) "cXI" = ( -/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 + }, +/obj/machinery/light/small{ + dir = 1 + }, /turf/open/floor/plating, /area/maintenance/starboard) "cXR" = ( @@ -72173,11 +71907,12 @@ }, /area/construction/mining/aux_base) "cXZ" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/structure/window/reinforced{ - dir = 8 +/obj/machinery/door/airlock/external{ + req_access_txt = "13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 }, -/obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/starboard) "cYc" = ( @@ -72197,8 +71932,9 @@ }, /area/science/robotics/lab) "cYj" = ( -/obj/structure/closet/firecloset, -/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/starboard) "cYE" = ( @@ -72505,14 +72241,19 @@ /turf/open/floor/circuit/killroom, /area/science/xenobiology) "daW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/machinery/button/door{ + id = "engpa"; + name = "Engineering Chamber Shutters Control"; + pixel_y = 26; + req_access_txt = "11" }, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/light{ dir = 8 }, -/turf/open/floor/engine, +/turf/open/floor/plating, /area/engine/engineering) "daX" = ( /obj/structure/cable/yellow{ @@ -72522,27 +72263,20 @@ icon_state = "platingdmg2" }, /area/maintenance/port/fore) -"daY" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/engine, -/area/engine/supermatter) "daZ" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 1 +/obj/structure/particle_accelerator/particle_emitter/right{ + icon_state = "emitter_right"; + dir = 4 }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable, -/obj/structure/window/plasma/reinforced, -/turf/open/floor/engine, -/area/engine/supermatter) +/turf/open/floor/plating, +/area/engine/engineering) "dbb" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 +/obj/structure/particle_accelerator/particle_emitter/center{ + icon_state = "emitter_center"; + dir = 4 }, -/turf/open/floor/engine, -/area/engine/supermatter) +/turf/open/floor/plating, +/area/engine/engineering) "dbd" = ( /obj/structure/sink/kitchen{ pixel_y = 28 @@ -72555,30 +72289,6 @@ }, /turf/open/floor/carpet, /area/crew_quarters/heads/hop) -"dbg" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/green/visible{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dbh" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) "dbj" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -73775,16 +73485,12 @@ /turf/open/floor/plating, /area/shuttle/auxillary_base) "ddO" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating/airless, /area/engine/engineering) "ddP" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/engine/engineering) @@ -73798,41 +73504,10 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"ddS" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 6 - }, -/obj/machinery/camera{ - c_tag = "Engineering Supermatter Fore"; - dir = 4; - network = list("ss13","engine") - }, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = -26 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"ddT" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"ddU" = ( -/obj/machinery/atmospherics/pipe/manifold4w/general/visible, -/obj/machinery/meter, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"ddV" = ( -/obj/machinery/atmospherics/pipe/manifold4w/general/visible, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "ddW" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, /obj/structure/cable/yellow{ icon_state = "2-4" }, @@ -73845,28 +73520,14 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/plasteel, -/area/engine/engineering) -"ddY" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/engine/engineering) "ddZ" = ( -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"dea" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - volume_rate = 200 +/obj/effect/turf_decal/stripes/line{ + dir = 9 }, /turf/open/floor/plating/airless, -/area/engine/engineering) +/area/space) "deb" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -73874,644 +73535,153 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"ded" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) -"dee" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/engine/engineering) "def" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"deh" = ( -/obj/structure/cable/white{ +/obj/structure/lattice/catwalk, +/obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) -"dei" = ( -/obj/structure/cable/white{ - icon_state = "4-8" +/obj/structure/cable{ + icon_state = "2-8" }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dej" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dek" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 2; - name = "Mix to Gas" - }, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"del" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) +/turf/open/space, +/area/space) "dem" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Gas to Mix" - }, -/obj/structure/cable/white{ - icon_state = "2-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"den" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"dep" = ( -/obj/machinery/firealarm{ - pixel_y = 32 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"deq" = ( -/obj/item/device/radio/intercom{ - freerange = 0; - frequency = 1459; - name = "Station Intercom (General)"; - pixel_y = 21 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"der" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"des" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"deu" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 10 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dev" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"dew" = ( -/obj/machinery/door/firedoor, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/engineering/glass{ - name = "Laser Room"; - req_access_txt = "10" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"dex" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"dey" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/structure/cable/white{ - icon_state = "2-8" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"deA" = ( -/obj/structure/cable/white{ - icon_state = "2-8" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"deB" = ( +/obj/structure/lattice/catwalk, /obj/structure/cable{ icon_state = "1-2" }, +/turf/open/space, +/area/space) +"den" = ( /obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"deC" = ( -/obj/effect/turf_decal/bot{ dir = 1 }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/canister/nitrogen, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"der" = ( +/obj/structure/closet/secure_closet/engineering_welding, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) -"deD" = ( -/obj/machinery/status_display, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"deI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"deJ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical, -/turf/open/floor/engine, -/area/engine/engineering) -"deK" = ( -/obj/structure/cable/white, -/obj/machinery/power/emitter/anchored{ - dir = 2; +"dev" = ( +/obj/machinery/field/generator{ + anchored = 1; state = 2 }, -/turf/open/floor/plating, -/area/engine/engineering) -"deL" = ( -/obj/structure/cable/white, -/obj/machinery/light{ - dir = 4 +/turf/open/floor/plating/airless, +/area/space/nearstation) +"dew" = ( +/turf/open/space, +/area/space/nearstation) +"deB" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "engpa"; + name = "Engineering Chamber Shutters" }, -/turf/open/floor/plating, -/area/engine/engineering) -"deM" = ( -/obj/structure/sign/warning/securearea, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"deN" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"deO" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) -"deS" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable, -/obj/structure/window/plasma/reinforced, -/turf/open/floor/engine, -/area/engine/supermatter) -"deU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 +"deD" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-2" }, +/turf/open/floor/plating/airless, +/area/space) +"deM" = ( +/obj/structure/table, +/obj/effect/turf_decal/delivery, +/obj/item/clothing/glasses/meson/engine, +/obj/item/clothing/glasses/meson/engine, +/obj/item/clothing/glasses/meson/engine, /obj/machinery/light{ dir = 4 }, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical, -/turf/open/floor/engine, +/obj/item/pipe_dispenser, +/obj/item/pipe_dispenser, +/obj/item/pipe_dispenser, +/turf/open/floor/plasteel/yellow/side{ + dir = 4 + }, /area/engine/engineering) "deV" = ( -/obj/structure/sign/warning/fire, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"deW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/obj/structure/cable{ + icon_state = "1-8" }, -/obj/machinery/camera{ - c_tag = "Engineering Supermatter Starboard"; - dir = 4; - network = list("ss13","engine") +/obj/structure/cable{ + icon_state = "2-8" }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"deX" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/engine, -/area/engine/engineering) +/turf/open/floor/plating/airless, +/area/space) "deY" = ( -/obj/structure/reflector/single/anchored{ - dir = 9 +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/turf/open/floor/plating, -/area/engine/engineering) +/turf/open/floor/plating/airless, +/area/space/nearstation) "dfa" = ( -/obj/machinery/power/supermatter_shard/crystal/engine, -/turf/open/floor/engine, -/area/engine/supermatter) -"dfb" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, -/obj/machinery/meter, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"dfc" = ( -/obj/structure/sign/warning/electricshock, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"dfd" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfe" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical, -/turf/open/floor/engine, -/area/engine/engineering) -"dff" = ( -/obj/structure/reflector/double/anchored{ - dir = 5 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"dfg" = ( -/obj/structure/reflector/single/anchored{ - dir = 10 +/obj/structure/cable{ + icon_state = "1-2" }, /turf/open/floor/plating, /area/engine/engineering) "dfh" = ( -/obj/structure/sign/warning/nosmoking, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"dfi" = ( -/obj/effect/turf_decal/stripes/line{ +/obj/structure/table, +/obj/item/clothing/glasses/meson, +/obj/item/clothing/glasses/meson, +/obj/item/clothing/glasses/meson, +/obj/item/storage/belt/utility, +/obj/item/storage/belt/utility, +/obj/item/storage/toolbox/electrical{ + pixel_x = 1; + pixel_y = 10 + }, +/turf/open/floor/plasteel/yellow/side{ dir = 4 }, -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/open/floor/engine, /area/engine/engineering) -"dfj" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 - }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"dfk" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/structure/window/plasma/reinforced{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"dfm" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 9 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/structure/window/plasma/reinforced{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/supermatter) "dfp" = ( -/obj/effect/turf_decal/bot{ +/obj/structure/closet/firecloset, +/turf/open/floor/plasteel/yellow/side{ dir = 1 }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/canister, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"dfq" = ( -/obj/machinery/camera{ - c_tag = "Supermatter Chamber"; - dir = 4; - network = list("engine") - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"dft" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 5 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - filter_type = "n2" - }, -/turf/open/floor/engine, /area/engine/engineering) "dfz" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"dfA" = ( -/obj/structure/cable/white{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"dfB" = ( -/obj/structure/cable/white{ - icon_state = "0-2" - }, -/obj/machinery/power/emitter/anchored{ - dir = 1; - state = 2 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"dfC" = ( -/obj/structure/cable/white{ - icon_state = "0-2" - }, -/obj/machinery/power/emitter/anchored{ - dir = 1; - state = 2 - }, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/engineering) +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, +/area/space) "dfD" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/item/book/manual/engineering_singularity_safety{ + pixel_x = 3; + pixel_y = 3 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/item/book/manual/wiki/engineering_guide, +/obj/item/book/manual/engineering_particle_accelerator{ + pixel_x = -3; + pixel_y = -3 }, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfE" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/green/visible{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfF" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/meter, -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfG" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/turf/open/floor/engine, +/obj/item/clothing/gloves/color/yellow, +/obj/structure/table/glass, +/turf/open/floor/plasteel, /area/engine/engineering) "dfI" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "Cooling Loop Bypass" +/obj/structure/cable{ + icon_state = "1-4" }, -/obj/structure/cable/white{ - icon_state = "2-4" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfJ" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/orange/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfM" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/structure/cable/white{ - icon_state = "1-8" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"dfO" = ( -/obj/structure/cable/white{ - icon_state = "1-8" - }, -/turf/open/floor/plating, -/area/engine/engineering) +/obj/machinery/power/grounding_rod, +/turf/open/floor/plating/airless, +/area/space) "dfP" = ( /obj/structure/cable/white{ - icon_state = "4-8" + icon_state = "2-8" }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Atmos to Loop" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfQ" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/engine, -/area/engine/engineering) -"dfR" = ( -/obj/machinery/atmospherics/components/binary/pump{ - name = "Gas to Cold Loop"; - on = 1 - }, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/engine, -/area/engine/engineering) -"dfS" = ( -/obj/structure/cable/white{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/engine, -/area/engine/engineering) -"dfT" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/engine, -/area/engine/engineering) -"dfU" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Cold Loop to Gas"; - on = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfV" = ( -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"dfW" = ( -/obj/item/wrench, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, /area/engine/engineering) "dfX" = ( /obj/structure/disposalpipe/segment, @@ -74529,137 +73699,82 @@ }, /area/engine/engineering) "dfY" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/structure/cable/white{ + icon_state = "1-4" }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"dfZ" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/closed/wall/r_wall, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "dga" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/junction, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/structure/cable/white{ + icon_state = "2-8" }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"dgb" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/closed/wall/r_wall, +/turf/open/floor/plating/airless, /area/engine/engineering) "dgc" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 5 +/obj/item/clothing/gloves/color/rainbow, +/obj/item/clothing/head/soft/rainbow, +/obj/item/clothing/shoes/sneakers/rainbow, +/obj/item/clothing/under/color/rainbow, +/turf/open/floor/plating{ + icon_state = "platingdmg3" }, -/turf/open/floor/plating, /area/maintenance/starboard) "dgd" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/turf/open/space, -/area/space/nearstation) +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "dge" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/space/nearstation) -"dgf" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 6 +/obj/structure/cable/white{ + icon_state = "0-2" }, -/turf/open/space, -/area/space/nearstation) +/obj/effect/turf_decal/stripes/line, +/obj/machinery/power/emitter{ + anchored = 1; + dir = 1; + icon_state = "emitter"; + state = 2 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "dgg" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 6 +/obj/structure/cable/white{ + icon_state = "4-8" }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/space/nearstation) -"dgh" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 6 +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"dgi" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/floor/plating, -/area/maintenance/starboard) +/turf/open/floor/plating/airless, +/area/engine/engineering) "dgj" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 5 +/obj/structure/grille, +/obj/structure/cable/white{ + icon_state = "1-4" }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) +/turf/open/floor/plating/airless, +/area/engine/engineering) "dgk" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/obj/structure/grille, +/obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) +/turf/open/floor/plating/airless, +/area/engine/engineering) "dgm" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 +/obj/structure/cable/white{ + icon_state = "1-4" }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"dgo" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 +/obj/structure/grille, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"dgp" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"dgr" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 10 - }, -/turf/open/space, -/area/space/nearstation) -"dgt" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"dgu" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/turf/open/space, -/area/space/nearstation) -"dgv" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 9 - }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/space/nearstation) -"dgw" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) +/turf/open/floor/plating/airless, +/area/engine/engineering) "dgz" = ( /obj/structure/closet/toolcloset, /obj/effect/turf_decal/delivery, @@ -74667,134 +73782,13 @@ /turf/open/floor/plasteel, /area/engine/engineering) "dgA" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"dgB" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 5 +/obj/machinery/light{ + dir = 4 }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/space/nearstation) +/turf/open/floor/plasteel, +/area/engine/engineering) "dgI" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 5 - }, -/turf/open/space, -/area/space/nearstation) -"dgJ" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"dgK" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"dgM" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 10 - }, -/turf/open/space, -/area/space/nearstation) -"dgN" = ( -/obj/structure/lattice, -/obj/structure/grille, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"dgO" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"dgS" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/transit_tube/horizontal, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"dha" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"dhc" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"dhe" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"dhg" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"dhh" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "Mix to Engine"; - on = 0 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"dhi" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/machinery/door/window/northleft{ - dir = 8; - icon_state = "left"; - name = "Inner Pipe Access"; - req_access_txt = "24" - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"dhj" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"dhk" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/atmos) -"dhl" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 9 - }, -/turf/open/space, +/turf/closed/wall/mineral/plastitanium, /area/space/nearstation) "dhn" = ( /obj/structure/table, @@ -75813,26 +74807,18 @@ /turf/open/space, /area/science/xenobiology) "djt" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/engine/supermatter) +/area/engine/engineering) "djx" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/camera/emp_proof{ + c_tag = "Containment - Aft Port"; + dir = 4; + network = list("singularity") }, -/obj/item/crowbar, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plating, -/area/engine/supermatter) +/obj/machinery/power/grounding_rod, +/turf/open/floor/plating/airless, +/area/engine/engineering) "djz" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/external{ @@ -75870,7 +74856,7 @@ id = "arrivals_stationary"; name = "arrivals"; width = 7; - roundstart_template = /datum/map_template/shuttle/arrival/box; + roundstart_template = /datum/map_template/shuttle/arrival/box }, /turf/open/space/basic, /area/space) @@ -75892,12 +74878,11 @@ /turf/open/floor/plating, /area/chapel/main) "dlI" = ( -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"dlN" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/supermatter) +/obj/structure/closet/secure_closet/engineering_electrical, +/turf/open/floor/plasteel/yellow/side{ + dir = 1 + }, +/area/engine/engineering) "dlV" = ( /turf/closed/wall/r_wall, /area/maintenance/department/science/xenobiology) @@ -76108,6 +75093,14 @@ icon_state = "platingdmg2" }, /area/maintenance/port/fore) +"drT" = ( +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "dsg" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -76148,6 +75141,13 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"dtL" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/space, +/area/space) "dtP" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -76481,46 +75481,24 @@ /turf/closed/wall, /area/engine/gravity_generator) "dBw" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"dBx" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"dBy" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"dBz" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"dBA" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"dBB" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/engine, +/turf/open/floor/plating, /area/engine/engineering) +"dBy" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/engine/engineering) +"dBB" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/space) "dBC" = ( /obj/machinery/meter, /obj/structure/grille, @@ -77200,6 +76178,23 @@ }, /turf/open/floor/plating, /area/maintenance/starboard) +"dPf" = ( +/obj/structure/cable/white{ + icon_state = "1-4" + }, +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"dPp" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/engine/engineering) "dYu" = ( /obj/machinery/door/airlock/external{ name = "Auxiliary Airlock" @@ -77209,6 +76204,19 @@ }, /turf/open/floor/plating, /area/hallway/secondary/entry) +"dZD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/space) +"eln" = ( +/turf/open/space/basic, +/area/engine/engineering) +"enN" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/engine/engineering) "eoK" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -77241,6 +76249,17 @@ }, /turf/open/floor/plasteel, /area/science/circuit) +"esV" = ( +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "evy" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -77251,6 +76270,25 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) +"eEu" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external{ + name = "External Containment Access"; + req_access_txt = "10; 13" + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) "eFN" = ( /obj/structure/bodycontainer/crematorium{ id = "crematoriumChapel"; @@ -77281,12 +76319,48 @@ /obj/structure/closet/firecloset, /turf/open/floor/plating, /area/engine/engineering) +"fjy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plating/airless, +/area/space) +"foU" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/computer/security/telescreen{ + desc = "Used for watching the Engine."; + dir = 8; + layer = 4; + name = "Engine Monitor"; + network = list("singularity"); + pixel_x = 30 + }, +/turf/open/floor/plasteel/yellow/side{ + dir = 4 + }, +/area/engine/engineering) "fDD" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plasteel/white, /area/science/circuit) +"fGs" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"fWO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plating/airless, +/area/space) "gfh" = ( /obj/machinery/libraryscanner, /turf/open/floor/plasteel/white, @@ -77309,6 +76383,14 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) +"goZ" = ( +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "gEk" = ( /obj/structure/cable/yellow{ icon_state = "2-8" @@ -77334,6 +76416,14 @@ /obj/effect/spawner/structure/window/plasma/reinforced, /turf/open/floor/plating, /area/engine/atmos) +"gKb" = ( +/obj/machinery/camera/emp_proof{ + c_tag = "Containment - Fore Starboard"; + dir = 8; + network = list("singularity") + }, +/turf/open/floor/plating/airless, +/area/space) "gLC" = ( /obj/structure/reagent_dispensers/water_cooler, /turf/open/floor/plasteel, @@ -77366,6 +76456,9 @@ }, /turf/open/floor/plating, /area/security/prison) +"hWU" = ( +/turf/open/floor/plating/airless, +/area/space) "ioI" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -77393,6 +76486,37 @@ }, /turf/open/floor/plasteel/whitepurple, /area/science/lab) +"iOa" = ( +/turf/closed/wall/mineral/plastitanium, +/area/maintenance/starboard) +"iTS" = ( +/obj/item/clothing/gloves/color/yellow, +/obj/item/clothing/gloves/color/yellow, +/obj/item/clothing/gloves/color/yellow, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/suit/hazardvest, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/effect/turf_decal/delivery, +/obj/structure/table, +/turf/open/floor/plasteel/yellow/side{ + dir = 4 + }, +/area/engine/engineering) +"iYY" = ( +/obj/machinery/light/small, +/turf/open/floor/plating, +/area/engine/engineering) +"jjF" = ( +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "jwW" = ( /turf/closed/wall/mineral/plastitanium, /area/crew_quarters/fitness/recreation) @@ -77423,6 +76547,21 @@ }, /turf/open/floor/plating, /area/maintenance/solars/port/aft) +"jFx" = ( +/obj/machinery/door/airlock/external{ + req_access_txt = "13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard) +"jIV" = ( +/obj/structure/closet/secure_closet/engineering_personal, +/turf/open/floor/plasteel/yellow/side{ + dir = 1 + }, +/area/engine/engineering) "jKK" = ( /obj/machinery/door/airlock/external{ req_access_txt = "13" @@ -77432,6 +76571,12 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"jYQ" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/engine/engineering) "kfu" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/white, @@ -77537,6 +76682,14 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) +"lHL" = ( +/turf/open/space/basic, +/area/space/nearstation) +"lLj" = ( +/turf/open/floor/plasteel/yellow/side{ + dir = 8 + }, +/area/engine/engineering) "lMz" = ( /obj/structure/falsewall, /turf/open/floor/plating, @@ -77578,6 +76731,12 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"moI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plating/airless, +/area/space) "mvj" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -77587,6 +76746,12 @@ }, /turf/closed/wall, /area/hallway/secondary/service) +"mwK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/space) "mzh" = ( /obj/machinery/firealarm{ dir = 1; @@ -77615,6 +76780,30 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/science/circuit) +"nte" = ( +/obj/machinery/the_singularitygen/tesla, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"nwU" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external{ + name = "External Containment Access"; + req_access_txt = "10; 13" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) "nyo" = ( /obj/structure/cable/yellow{ icon_state = "1-4" @@ -77649,10 +76838,33 @@ }, /turf/open/floor/plasteel, /area/construction/storage/wing) +"nKh" = ( +/turf/open/floor/plasteel/yellow/side{ + dir = 1 + }, +/area/engine/engineering) "obb" = ( /obj/structure/target_stake, /turf/open/floor/plasteel/white, /area/science/circuit) +"obN" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/space, +/area/space) +"ocj" = ( +/obj/structure/cable/white{ + icon_state = "2-4" + }, +/obj/structure/grille, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plating/airless, +/area/engine/engineering) "ocT" = ( /obj/machinery/light{ dir = 1 @@ -77767,6 +76979,13 @@ dir = 2 }, /area/crew_quarters/locker) +"pWF" = ( +/obj/effect/decal/cleanable/oil, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "qnJ" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -77797,6 +77016,12 @@ "qBq" = ( /turf/closed/wall/mineral/plastitanium, /area/hallway/secondary/entry) +"qJG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/engine/engineering) "qJZ" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -77820,6 +77045,18 @@ dir = 1 }, /area/science/lab) +"rEi" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"rFx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/engine/engineering) "rQK" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -77839,6 +77076,29 @@ /obj/machinery/vending/snack/random, /turf/open/floor/plasteel, /area/science/mixing) +"rTo" = ( +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"rVX" = ( +/obj/structure/particle_accelerator/particle_emitter/left{ + icon_state = "emitter_left"; + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"rWa" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel/yellow/side, +/area/engine/engineering) "sdi" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -77875,6 +77135,21 @@ "sJW" = ( /turf/closed/wall/mineral/plastitanium, /area/engine/break_room) +"sOW" = ( +/obj/structure/lattice, +/turf/open/space, +/area/space) +"sSU" = ( +/turf/closed/wall/r_wall, +/area/space) +"tdB" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/maintenance/starboard/fore) "tjH" = ( /obj/structure/table/reinforced, /obj/machinery/computer/libraryconsole/bookmanagement, @@ -77896,22 +77171,19 @@ /turf/open/floor/plasteel/white, /area/science/circuit) "tDM" = ( -/obj/machinery/door/airlock/engineering/glass{ - heat_proof = 1; - name = "Supermatter Chamber"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/supermatter) +/obj/item/wrench, +/turf/open/floor/plating, +/area/engine/engineering) "tFJ" = ( /obj/structure/bodycontainer/morgue{ dir = 8 }, /turf/open/floor/plasteel/dark, /area/medical/morgue) +"tMT" = ( +/obj/structure/lattice, +/turf/open/space, +/area/engine/engineering) "tVY" = ( /obj/structure/closet/crate, /obj/item/target/alien, @@ -77962,6 +77234,11 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/starboard) +"uQo" = ( +/turf/open/floor/plasteel/yellow/side{ + dir = 4 + }, +/area/engine/engineering) "uRM" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -77990,10 +77267,30 @@ }, /turf/open/floor/plasteel, /area/science/misc_lab) +"vmz" = ( +/obj/structure/lattice/catwalk, +/turf/open/space, +/area/space) +"vAk" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "vLD" = ( /obj/structure/lattice, /turf/open/space/basic, /area/space) +"vSl" = ( +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "wiZ" = ( /obj/machinery/door/airlock/external{ name = "Security External Airlock"; @@ -78044,11 +77341,39 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/science/misc_lab) +"xcM" = ( +/obj/structure/closet/firecloset, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/yellow/side{ + dir = 4 + }, +/area/engine/engineering) +"xfK" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/power/tesla_coil, +/turf/open/floor/plating/airless, +/area/space) "xkG" = ( /obj/item/device/integrated_electronics/wirer, /obj/structure/table/reinforced, /turf/open/floor/plasteel/white, /area/science/circuit) +"xqB" = ( +/obj/structure/cable/white, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/power/emitter{ + anchored = 1; + state = 2 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "xse" = ( /obj/machinery/door/airlock/external{ name = "Solar Maintenance"; @@ -78080,6 +77405,19 @@ /obj/structure/chair/comfy, /turf/open/floor/plasteel, /area/science/misc_lab) +"xLP" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/space, +/area/space) +"xNI" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "xVl" = ( /turf/closed/wall, /area/hallway/secondary/service) @@ -78090,6 +77428,24 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) +"xWZ" = ( +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/obj/structure/grille, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"yeY" = ( +/obj/machinery/camera/emp_proof{ + c_tag = "Containment - Aft Starboard"; + dir = 8; + network = list("singularity") + }, +/turf/open/floor/plating/airless, +/area/space) "ygk" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -118297,12 +117653,12 @@ aFu aBI aBI aJn -aCO -aFq +lLj +lLj aNq aBI aPZ -aRo +aSB aSu aTG aUZ @@ -118543,7 +117899,7 @@ arJ arI dnh dqu -doh +tdB axO axY aAo @@ -118553,12 +117909,12 @@ aEn aFv aGV aHX -aEi -aKA -aMc -aEi +aBO +aBO +aBO +aBO aOO -aEi +aBO aRp aSv aTH @@ -119060,7 +118416,7 @@ avt awJ axS axY -aCO +jIV ddW aCT aEp @@ -119320,18 +118676,18 @@ axY aAr ddX aCU -aEq -aTO +aCW +aBO aGX -aHZ -aJp -aTO +aBO +aBO +aBO aSB -aTO -aOR -aQa +aBO +aBO +aBO aGX -aTO +aBK aTK aVd aBI @@ -119574,23 +118930,23 @@ avv axY axU ayS -dCk -ddY +enN +ddX deb -deh -aFz -aCZ +aBO +aBO +iTS deM -axY -aCZ +uQo +foU aMg -aCZ +xcM dfh -deM -aCZ -aFz -deh -aVe +aBO +aBO +aBK +dPp +rFx axY aYu aYu @@ -119834,21 +119190,21 @@ ddP aAt aBL deb -dei +aBO aFA +axY +axY deB -deB -deB -deB +axY aMh -deB -deB -deB -deB +axY +axY +nKh +aBO aSz -aTM +aTK aVe -apc +aJu aYu aZL bbB @@ -120091,21 +119447,21 @@ aAu ddQ aBM aCV -aEr +aBO aFB -aGY +axY daW dBw -aKF +dBw aMi cpR -dfi +axY aQd -dBA +aBO aSA -aTN -aVf -apc +aTK +aVe +aJu aYu aZM bbC @@ -120348,21 +119704,21 @@ ayV aAv aBN aCW -aEr -aFC +aBO +aFA aGZ -aGZ -dlI +qJG +aJu aKG -aMj +aJu dBy -dlI -aQe -aRv +aGZ +nKh +aBO dfD -aTN -aVe -apc +aTK +rWa +aJu aYu aZN bbD @@ -120603,23 +119959,23 @@ axY axY ayW bTq +dgA +aBO aBO -aCX -dej aFC -deC -deC -dlI +axY +qJG +aJu aKH aMk aNu -dlI +axY dfp -dfp -dfE +aBO +dgA dfP dfY -dgc +axY aYu cXA cXA @@ -120857,30 +120213,30 @@ ath ajb avA axY -axZ +axY ayX -ddS -bUw -aCY -dek +axY +axY +aBO +aBO der -deD -dlI -aJv +axY +qJG +aJu aKI tDM -dfb -dfj +dBy +axY dlI -deD -dfF -aTN -aVe -aWH -dgi +aBO +axY +axY +ayX +axY +atm dgc -aqq -aqr +alq +apc aWu bif bif @@ -121114,29 +120470,29 @@ ati ajb avB axY -ddO +jYQ bUw -ddT -ddZ -ded -del -des +aJu +axY +axY +axY +axY djt -daY +qJG daZ dbb -aMk -aNv -dfk -dfq +rVX +dBy djt -dfG -dfQ -dfZ -apc -apc -dgo -apc +axY +axY +axY +aJu +bUw +iYY +axY +alq +alq cXZ atm bfZ @@ -121371,31 +120727,31 @@ ajb ajb avC axY -aya -bUw -ddU -aBQ -dee +axY +eEu +axY +axY +ddO aEr -des +ddO djt -daY -daZ -dbb +qJG +aJu +rEi dfa aNv -dfk -daY +djt +ddO djx -dfG -cXz -aVe -atm -alr -dgp +axY +axY +nwU +axY +axY +alq cXI cYj -atm +iOa bga big bga @@ -121414,7 +120770,7 @@ bFS bHy bIV bKC -bMi +bAQ bNU bMg bQV @@ -121628,31 +120984,31 @@ dps dpL avD axY +axY +xNI +ddO +ddO +ddO +ddO ddO -bUw -ddV -aBQ -dee -aEr -aKL djt -daY -deS -dbb -aMk -aNv -dfm -daY djt -dbg -dfR +djt +aRm +djt +djt +djt +ddO +ddO +ddO +ddO dga dgd dgj -dgp -alr -atm atm +alq +jFx +iOa bgb cTu bgb @@ -121671,8 +121027,8 @@ bFT bHz bIW bKD -dhe -dhg +bCi +bCi bPu bPu bPu @@ -121887,28 +121243,28 @@ avE axY ayc aza -aAw -bUw +ddO +aaa aCY dem -aFD +dem +deD +deD deD -dlI -dlI deV -dlN -dfc -dlI -dlI -deD +dem +dem +dem +dem +dem dfI -dfS -aVh -aaf +aaa +ddO +ddO aYx -dgr -dgw -dgA +sSU +lHL +lMJ dgI bgb cTi @@ -121929,7 +121285,7 @@ bHy bIX bKE bKE -dhh +bKE bPv bKE bKE @@ -122139,34 +121495,34 @@ apn aqy arT apm -dnS +vAk avB axY -axY -bTq +goZ +ddO aAx -aBO +sOW aIe aOS -deu -deI -deN -deI -deW -aMm -dfd -deN -dft +mwK +mwK +mwK +mwK +mwK +mwK +mwK +mwK +mwK dBB -dbh -dfT -aVh -aaa +aIe +sOW +cWu +ddO aYx -dgf -dgj -ack -dgJ +sSU +lMJ +lMJ +lHL bgb bij bgb @@ -122186,7 +121542,7 @@ bHA bIY bKF bMk -dhi +bNV bPw bQW bSj @@ -122399,31 +121755,31 @@ atk aux avF dqT -dqT -aaf -ack -dea -aIc -den +esV +xqB +aAx +aaa +aIe +dZD +dev +aav +aav +dev +lMJ +aaa +aav +aav dev -deJ -deO -deU -deX -dBx -dfe -dBz -dfu dfz -dfJ -dfU -dga +aIe +aaa +cWu dge azd -azd -azd -dgB -dgK +sSU +lMJ +lMJ +lHL aaa cUL aaa @@ -122443,7 +121799,7 @@ bHB bIZ bKG bMl -dhj +bKG bIZ bKG bMl @@ -122656,31 +122012,31 @@ atl auy dnS dqT -dqT -aaf -ack -ack +fGs +ddO +aAx +sOW def aCZ -dew -aCZ -axY -axY -aCZ -aCZ -aCZ -axY -axY -aCZ -dew -aCZ -aVe -dgf -dgk -dgt -dgk -dgv -dgJ +aav +aav +aav +vLD +aaf +aaa +aav +aav +aav +xfK +obN +sOW +cWu +ddO +dgg +sSU +lMJ +lHL +lHL anT aaf aaf @@ -122700,7 +122056,7 @@ bza bJa bza bFX -dhk +bza bJa bza bFX @@ -122912,52 +122268,52 @@ apm apm dnh dnS -dnz dqT +xWZ +dPf +aAx +aaa +aIe +dZD +aav +aav +aaa +aaa aaf -aaf -aaf -def -ddZ -dex -aJu -ddZ -ddZ -ddZ -aMo -dff -ddZ -ddZ -aJu -dex -ddZ -aVe +aaa +aaa +aav +aav +dfz +aIe +aaa +cWu aWK dgk -dgt -dgk -dgB -dgM -dgN -dgO -dgO -dgw -dgO -dgS -dgO -dgO -dgw -dgw -dgw -dgw +sSU +lMJ +lHL +lHL +anT +dew +dew +aaf +dew +bpw +dew +dew +aaf +aaf +aaf +aaf bCz -dgw -dha -dgw -dhc -dgw -dha -dhl +aaf +bFY +aaf +bJb +aaf +bFY +aaf bJb aaf bFY @@ -123170,31 +122526,31 @@ dnh auz dqp dqT -dqT +axY +fGs +aAx +vmz +def +aCZ aaa aaa aaa -bTq -dep -dey -aHa ddZ -ddZ -ddZ -ddZ -ddZ -ddZ -ddZ -dfA -dfM -dfV -dgb +cDu +fWO +aaa +vLD +dev +xfK +obN +vmz +cWu dgg -azd -azd -azd -dgv -aaf +axY +sSU +lMJ +lHL +lHL anT aaa aaa @@ -123427,30 +122783,30 @@ dni auA dnS dqT -aaa -aaa -aaa -aaa axY -deq -dey -deK -ddZ -ddZ -ddZ +fGs +ddO +sOW +aIe +dZD +lMJ +aaf +aaf +den +nte aMo -ddZ -ddZ -ddZ -dfB -dfM -dfW +aaf +aaf +lMJ +dfz +aIe +sOW +ddO +dgg axY -aWK -dgk -dgt -dgk -dgB +sSU +lMJ +lHL aaa anT aaa @@ -123684,31 +123040,31 @@ dnh auB avG dqT -aaa -aaa -aaa -aaa axY -aJu -deA -deL -aJu -aJu +fGs +aAx +vmz +def +aCZ +dev +vLD +aaa +fjy deY +moI +aaa +aaa +aaa +xfK +obN +vmz +cWu +dgg axY -dfg -aJu -aJu -dfC -dfO -ddZ -axY -dgh -dgk -dgk -dgk -dgv -aaf +sSU +lMJ +lHL +lHL anT aaa aaa @@ -123941,30 +123297,30 @@ dnh dnh jKK dqT +ocj +rTo +aAx +aaa +aIe +dZD +aav +aav +aaa +aaa aaf aaa aaa +aav +aav +dfz +aIe aaa -axY -axY -axY -axY -axY -axY -axY -axY -axY -axY -axY -axY -axY -axY -axY -aWK +cWu +jjF dgm -dgu -dgm -dgB +sSU +lMJ +lHL aaa anT aaa @@ -124198,31 +123554,31 @@ atn bOY avG dqT -aaf -aaa -aaa +fGs +ddO +aAx +sOW +dtL +aCZ +aav +aav aaa aaa aaf +vLD aaa -aaf -aaa -aaa -aaf -aaa -aaf -aaa -aaf -aaa -aaf -aaf -ack -ack -aye -dgv -aye -dgv -aaf +aav +aav +xfK +xLP +sOW +pWF +ddO +dgg +sSU +lMJ +lHL +lHL anT aaf aaf @@ -124455,29 +123811,29 @@ dnh dnh lNZ dqT -aaf +drT +xqB +aAx +aaa +vmz +dZD +dev +aav aaa aaa +lMJ +dev +aav +aav +dev +dfz +vmz aaa -aaa -aaf -aaa -aaf -aaa -aaa -aaf -aaa -aaf -aaa -aaf -aaa -aaa -aaf -aaf -aaf -aaa -aaa -aaf +cWu +dge +vSl +sSU +lMJ aaa aaa aaf @@ -124712,29 +124068,29 @@ aaa aaf ack dqT -aaf -anT -anT -anT -anT -aaf -anT -anT -anT -anT -anT -anT -aqB -anT -anT -anT -anT -anT -anT -aaf -aaa -aaa -aaf +axY +axY +ddO +hWU +hWU +gKb +hWU +hWU +hWU +hWU +hWU +hWU +hWU +hWU +hWU +yeY +hWU +hWU +ddO +axY +axY +sSU +lMJ aaa aaa aaf @@ -124969,29 +124325,29 @@ aaf aaf ack aaf -aaa -aaa -aaa -aaf -aaa -aaa -bpu -bpu -bpu -bpu -bpu -bpu -bpu -bpu -bpu -bpu -aaa -aaa -aaa -aaf -aaf -aaf -aaf +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +sSU +lMJ aaa aaa aaa @@ -125225,30 +124581,30 @@ aaa aaa aaa aaa +vLD aaa +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +eln +tMT aaa -aaa -aaa -aaf -aaf -aaf -anT -anT -anT -anT -aqB -anT -anT -anT -anT -aqB -aaf -aaf -aaf -aaf -aaa -aaf -aaf +lHL +lMJ aaa aaa aaa @@ -125482,7 +124838,7 @@ aaa aaa aaa aaa -aaa +vLD aaa aaa aaa @@ -125739,26 +125095,26 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD aaf aai aaa diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index d1c0b770dd..0f56742f49 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -45129,9 +45129,6 @@ icon_state = "0-8" }, /obj/machinery/power/tesla_coil, -/obj/structure/window/plasma/reinforced{ - dir = 4 - }, /turf/open/floor/plating/airless, /area/engine/engineering) "chz" = ( @@ -45139,9 +45136,6 @@ icon_state = "0-4" }, /obj/machinery/power/tesla_coil, -/obj/structure/window/plasma/reinforced{ - dir = 8 - }, /turf/open/floor/plating/airless, /area/engine/engineering) "chA" = ( @@ -45249,16 +45243,6 @@ /obj/structure/grille, /turf/open/floor/plating/airless, /area/engine/engineering) -"chQ" = ( -/obj/structure/window/plasma/reinforced{ - dir = 4 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/turf/open/floor/plating/airless, -/area/engine/engineering) "chR" = ( /obj/structure/cable{ icon_state = "2-4" @@ -45412,14 +45396,13 @@ /turf/open/floor/plating/airless, /area/space/nearstation) "cit" = ( -/obj/machinery/the_singularitygen, +/obj/machinery/the_singularitygen/tesla, /turf/open/floor/plating/airless, /area/space/nearstation) "ciu" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/the_singularitygen/tesla, /turf/open/floor/plating/airless, /area/space/nearstation) "civ" = ( @@ -49952,26 +49935,6 @@ /obj/machinery/power/rad_collector, /turf/open/floor/plating, /area/engine/engineering) -"cBR" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/item/tank/internals/plasma, -/turf/open/floor/plating/airless, -/area/engine/engineering) -"cBS" = ( -/obj/structure/window/plasma/reinforced{ - dir = 8 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/open/floor/plating/airless, -/area/engine/engineering) "cBT" = ( /obj/effect/spawner/structure/window/plasma/reinforced, /turf/open/floor/plating/airless, @@ -50388,9 +50351,16 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"uTf" = ( +/turf/closed/wall/r_wall, +/area/space) "vpU" = ( /turf/open/floor/plasteel/darkpurple, /area/crew_quarters/cryopod) +"vyc" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) "vzz" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -79160,8 +79130,8 @@ bXk bXk bXk bXk -aaa -aaa +bXk +uTf aaa aaa aaa @@ -79416,9 +79386,9 @@ chR cgt cjT ckq +ckq bXk -aaa -aaa +uTf aaa aaa aaa @@ -79673,9 +79643,9 @@ chS cfV cgS cfV +cfV bXk -aaa -aaa +uTf aaa aaa aaa @@ -79929,10 +79899,10 @@ cfV cfV cfV cgT +cfV ckr bXk -aaa -aaa +uTf aaa aaa aaa @@ -80179,17 +80149,17 @@ cfU cgu cgU chw -cBR -chw -chw +cgU chw +cgU chw +cgU cjs cfV cfV -bTE -aaa -aaa +cfV +bXk +uTf aaa aaa aaa @@ -80436,17 +80406,17 @@ cfV cgv cfV chx -chQ +cfV chx -chQ +cfV chx -chQ +cfV chx cfV cfV -bTE -abI -aaa +cfV +bXk +uTf aaa aaa aaa @@ -80694,16 +80664,16 @@ cgv cgV bBW bBW -aaa cgV +aht aaa bBW bBW cgV cfV -bTE -abI -abI +cfV +bXk +uTf aaa aaa aaa @@ -80951,16 +80921,16 @@ cgv bBW bBW bBW -aaa +vyc abI aaa bBW bBW bBW cfV -bTE -abI -aaa +cfV +bXk +uTf aaa aaa aaa @@ -81215,9 +81185,9 @@ aaa bBW bBW cfV -bTE -abI -aaa +cfV +bXk +uTf aaa aaa aaa @@ -81469,12 +81439,12 @@ cii cis ciG aaa -aaa -aaa +vyc +cgV cfV -bTE -abI -aaa +cfV +bXk +uTf aaa aaa aaa @@ -81719,7 +81689,7 @@ cfd cfw cfW cgw -cgV +aht abI abI cij @@ -81727,11 +81697,11 @@ cit ciH abI abI -cgV +aht cfV -bTE -abI -aaa +cfV +bXk +uTf aaa aaa aaa @@ -81976,8 +81946,8 @@ cfe cfx cfa cgv -aaa -aaa +cgV +vyc aaa cik ciu @@ -81986,9 +81956,9 @@ aaa aaa aaa cfV -bTE -aaa -aaa +cfV +bXk +uTf aaa aaa aaa @@ -82243,9 +82213,9 @@ aaa bBW bBW cfV -bTE -aaa -aaa +cfV +bXk +uTf aaa aaa aaa @@ -82495,14 +82465,14 @@ bBW aaa aaa abI -aaa +vyc aaa bBW bBW cfV -bTE -aaa -aaa +cfV +bXk +uTf aaa aaa aaa @@ -82751,15 +82721,15 @@ cgV bBW aaa aaa +aht cgV -aaa bBW bBW cgV cfV -bTE -abI -aaa +cfV +bXk +uTf aaa aaa aaa @@ -83006,17 +82976,17 @@ cfV cgv cfV chz -cBS +cfV chz -cBS +cfV chz -cBS +cfV chz cfV cfV -bTE -abI -abI +cfV +bXk +uTf abI abI aaa @@ -83263,17 +83233,17 @@ cfU cgx cgU chA +cgU chA +cgU chA -chA -chA -chA +cgU cjt cfV cfV -bTE -abI -aaa +cfV +bXk +uTf abI aaa aaa @@ -83527,10 +83497,10 @@ cfV cfV cfV cgY +cfV cks bXk -abI -aaa +uTf aaa aaa aaa @@ -83785,9 +83755,9 @@ chO cfV cgZ cfV +cfV bXk -abI -abI +uTf abI aaa aaa @@ -84042,9 +84012,9 @@ chP cgt cjU ckq +ckq bXk -abI -aaa +uTf aaa aaa aaa @@ -84299,9 +84269,9 @@ bXk bXk bXk bXk +bXk ckJ -abI -aaa +uTf aaa aaa aaa diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm index 85fc5b234b..49eb7535d8 100644 --- a/code/modules/power/tesla/coil.dm +++ b/code/modules/power/tesla/coil.dm @@ -25,7 +25,7 @@ /obj/machinery/power/tesla_coil/Initialize() . = ..() - wires = new /datum/wires/tesla_coil(src) +// wires = new /datum/wires/tesla_coil(src) //CITADEL EDIT, Kevinz you cheaty fuccboi. linked_techweb = SSresearch.science_tech /obj/machinery/power/tesla_coil/RefreshParts() @@ -79,8 +79,6 @@ /obj/machinery/power/tesla_coil/tesla_act(var/power) if(anchored && !panel_open) obj_flags |= BEING_SHOCKED - //don't lose arc power when it's not connected to anything - //please place tesla coils all around the station to maximize effectiveness var/power_produced = powernet ? power / power_loss : power add_avail(power_produced*input_power_multiplier) flick("coilhit", src) diff --git a/tgstation.dme b/tgstation.dme index d230786d4c..3a2b9afee0 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -475,7 +475,6 @@ #include "code\datums\wires\robot.dm" #include "code\datums\wires\suit_storage_unit.dm" #include "code\datums\wires\syndicatebomb.dm" -#include "code\datums\wires\tesla_coil.dm" #include "code\datums\wires\vending.dm" #include "code\datums\wires\wires.dm" #include "code\game\alternate_appearance.dm" From 9d8286ee530ed877bb10a4d842cde8d178711bbc Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 6 Mar 2018 03:59:13 -0600 Subject: [PATCH 34/45] Automatic changelog generation for PR #5787 [ci skip] --- html/changelogs/AutoChangeLog-pr-5787.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5787.yml diff --git a/html/changelogs/AutoChangeLog-pr-5787.yml b/html/changelogs/AutoChangeLog-pr-5787.yml new file mode 100644 index 0000000000..6b44ee591e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5787.yml @@ -0,0 +1,6 @@ +author: "Poojawa" +delete-after: True +changes: + - rscadd: "Tesla Engines are now standard on all but Omega." + - bugfix: "fixed a pipe in Meta station that wasn't connected properly." + - bugfix: "fixed an exploit related to Tesla wires." From 6e5131cfc59cfee2dbc4274283770bec3157d55f Mon Sep 17 00:00:00 2001 From: Poojawa Date: Tue, 6 Mar 2018 03:59:31 -0600 Subject: [PATCH 35/45] Vore code to json and more (#5789) * Vore 2.0 Initial commit * double checked porting * Fixes compile issues * converts Ash Drake bellies to new system digs out lingering datum/belly stuff too * Let's just work on this later * System operational * Update preferences.dm --- code/__DEFINES/preferences.dm | 9 +- code/__DEFINES/sound.dm | 5 +- code/__DEFINES/voreconstants.dm | 18 + code/__HELPERS/type2type_vr.dm | 4 + code/citadel/dogborgstuff.dm | 6 + code/controllers/subsystem/vore.dm | 41 ++ code/modules/client/preferences.dm | 9 + code/modules/client/preferences_vr.dm | 5 +- .../mob/living/carbon/human/examine.dm | 6 +- .../mob/living/carbon/human/examine_vr.dm | 9 - code/modules/mob/living/carbon/human/human.dm | 1 + code/modules/mob/living/carbon/human/life.dm | 10 +- .../carbon/human/species_types/furrypeople.dm | 7 + code/modules/mob/living/carbon/life.dm | 2 + code/modules/mob/living/life.dm | 3 - .../hostile/megafauna/dragon_vore.dm | 27 +- .../mob/living/simple_animal/simple_animal.dm | 3 +- .../living/simple_animal/simple_animal_vr.dm | 53 +- code/modules/unit_tests/_unit_tests.dm | 3 +- code/modules/unit_tests/vore_tests.dm | 218 ++++++ code/modules/vore/eating/belly_dat_vr.dm | 162 +++++ code/modules/vore/eating/belly_obj_vr.dm | 655 ++++++++++++++++++ code/modules/vore/eating/belly_vr.dm | 467 ------------- code/modules/vore/eating/bellymodes_vr.dm | 141 ++-- code/modules/vore/eating/digest_act_vr.dm | 119 ++++ code/modules/vore/eating/living_vr.dm | 203 +++--- code/modules/vore/eating/simple_animal_vr.dm | 2 +- code/modules/vore/eating/vore_vr.dm | 108 +-- code/modules/vore/eating/voreitems.dm | 5 +- code/modules/vore/eating/vorepanel_vr.dm | 427 +++++++----- code/modules/vore/persistence.dm | 90 +++ .../modules/client/preferences_toggles.dm | 22 + tgstation.dme | 7 +- 33 files changed, 1976 insertions(+), 871 deletions(-) create mode 100644 code/controllers/subsystem/vore.dm create mode 100644 code/modules/unit_tests/vore_tests.dm create mode 100644 code/modules/vore/eating/belly_dat_vr.dm create mode 100644 code/modules/vore/eating/belly_obj_vr.dm delete mode 100644 code/modules/vore/eating/belly_vr.dm create mode 100644 code/modules/vore/eating/digest_act_vr.dm create mode 100644 code/modules/vore/persistence.dm create mode 100644 modular_citadel/code/modules/client/preferences_toggles.dm diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index db496f1cba..b4a9f41213 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -14,9 +14,10 @@ #define SOUND_ANNOUNCEMENTS 2048 #define DISABLE_DEATHRATTLE 4096 #define DISABLE_ARRIVALRATTLE 8192 -#define MEDIHOUND_SLEEPER 16384 - -#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|MEMBER_PUBLIC|INTENT_STYLE|MIDROUND_ANTAG|SOUND_INSTRUMENTS|SOUND_SHIP_AMBIENCE|SOUND_PRAYERS|SOUND_ANNOUNCEMENTS|MEDIHOUND_SLEEPER) +#define MEDIHOUND_SLEEPER 16384 //CITADEL EDITS, vore prefs. +#define EATING_NOISES 32768 +#define DIGESTION_NOISES 65536 +#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|MEMBER_PUBLIC|INTENT_STYLE|MIDROUND_ANTAG|SOUND_INSTRUMENTS|SOUND_SHIP_AMBIENCE|SOUND_PRAYERS|SOUND_ANNOUNCEMENTS|MEDIHOUND_SLEEPER|EATING_NOISES|DIGESTION_NOISES) //Chat toggles #define CHAT_OOC 1 @@ -66,4 +67,4 @@ #define EXP_TYPE_GHOST "Ghost" //Flags in the players table in the db -#define DB_FLAG_EXEMPT 1 \ No newline at end of file +#define DB_FLAG_EXEMPT 1 diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm index 7766bd2319..453a02db01 100644 --- a/code/__DEFINES/sound.dm +++ b/code/__DEFINES/sound.dm @@ -11,12 +11,13 @@ //CIT CHANNELS - TRY NOT TO REGRESS #define CHANNEL_PRED 1015 -#define CHANNEL_PREYLOOP 1014 +#define CHANNEL_DIGEST 1014 +#define CHANNEL_PREYLOOP 1013 //THIS SHOULD ALWAYS BE THE LOWEST ONE! //KEEP IT UPDATED -#define CHANNEL_HIGHEST_AVAILABLE 1013 //CIT CHANGE - COMPENSATES FOR VORESOUND CHANNELS +#define CHANNEL_HIGHEST_AVAILABLE 1012 //CIT CHANGE - COMPENSATES FOR VORESOUND CHANNELS #define SOUND_MINIMUM_PRESSURE 10 diff --git a/code/__DEFINES/voreconstants.dm b/code/__DEFINES/voreconstants.dm index edcf4f7fd2..19830c9f72 100644 --- a/code/__DEFINES/voreconstants.dm +++ b/code/__DEFINES/voreconstants.dm @@ -5,6 +5,9 @@ #define DM_NOISY "Noisy" #define DM_DRAGON "Dragon" +#define isbelly(A) istype(A, /obj/belly) + +#define QDEL_NULL_LIST(x) if(x) { for(var/y in x) { qdel(y) } ; x = null } #define VORE_STRUGGLE_EMOTE_CHANCE 40 // Stance for hostile mobs to be in while devouring someone. @@ -60,6 +63,10 @@ GLOBAL_LIST_INIT(pred_vore_sounds, list( "Squish3" = 'sound/vore/pred/squish_03.ogg', "Squish4" = 'sound/vore/pred/squish_04.ogg', "Rustle (cloth)" = 'sound/effects/rustle5.ogg', + "rustle2(cloth)" = 'sound/effects/rustle2.ogg', + "rustle3(cloth)" = 'sound/effects/rustle3.ogg', + "rustle4(cloth)" = 'sound/effects/rustle4.ogg', + "rustle5(cloth)" = 'sound/effects/rustle5.ogg', "None" = null)) /* GLOBAL_LIST_INIT(pred_struggle_sounds, list( @@ -121,3 +128,14 @@ GLOBAL_LIST_INIT(death_prey, list( "death9" = 'sound/vore/prey/death_09.ogg', "death10" = 'sound/vore/prey/death_10.ogg')) */ + +GLOBAL_LIST_INIT(release_sound, list( + "rustle (cloth)" = 'sound/effects/rustle1.ogg', + "rustle2 (cloth)" = 'sound/effects/rustle2.ogg', + "rustle3 (cloth)" = 'sound/effects/rustle3.ogg', + "rustle4 (cloth)" = 'sound/effects/rustle4.ogg', + "rustle5 (cloth)" = 'sound/effects/rustle5.ogg', + "Stomach Move" = 'sound/vore/pred/stomachmove.ogg', + "Pred Escape" = 'sound/vore/pred/escape.ogg', + "Splatter" = 'sound/effects/splat.ogg', + "None" = null)) \ No newline at end of file diff --git a/code/__HELPERS/type2type_vr.dm b/code/__HELPERS/type2type_vr.dm index 09ea0a158a..96e04585d7 100644 --- a/code/__HELPERS/type2type_vr.dm +++ b/code/__HELPERS/type2type_vr.dm @@ -105,3 +105,7 @@ . += copytext(text, last_found, found) last_found = found + delim_len while (found) + +// Returns true if val is from min to max, inclusive. +/proc/IsInRange(val, min, max) + return (val >= min) && (val <= max) \ No newline at end of file diff --git a/code/citadel/dogborgstuff.dm b/code/citadel/dogborgstuff.dm index 55eb6fe356..fcefdcc3e3 100644 --- a/code/citadel/dogborgstuff.dm +++ b/code/citadel/dogborgstuff.dm @@ -608,6 +608,12 @@ playsound(get_turf(hound),"death_pred",50,0,-6,0,channel=CHANNEL_PRED,ignore_walls = FALSE) T.stop_sound_channel(CHANNEL_PRED) T.playsound_local("death_prey",60) + for(var/belly in T.vore_organs) + var/obj/belly/B = belly + for(var/atom/movable/thing in B) + thing.forceMove(src) + if(ismob(thing)) + to_chat(thing, "As [T] melts away around you, you find yourself in [hound]'s [name]") for(var/obj/item/W in T) if(!T.dropItemToGround(W)) qdel(W) diff --git a/code/controllers/subsystem/vore.dm b/code/controllers/subsystem/vore.dm new file mode 100644 index 0000000000..faaa297ca3 --- /dev/null +++ b/code/controllers/subsystem/vore.dm @@ -0,0 +1,41 @@ +#define SSBELLIES_PROCESSED 1 +#define SSBELLIES_IGNORED 2 + +// +// Bellies subsystem - Process vore bellies +// + +SUBSYSTEM_DEF(bellies) + name = "Bellies" + priority = 5 + wait = 1 SECONDS + flags = SS_KEEP_TIMING|SS_NO_INIT + runlevels = RUNLEVEL_GAME|RUNLEVEL_POSTGAME + + var/static/list/belly_list = list() + var/list/currentrun = list() + var/ignored_bellies = 0 + +/datum/controller/subsystem/bellies/stat_entry() + ..("#: [belly_list.len] | P: [ignored_bellies]") + +/datum/controller/subsystem/bellies/fire(resumed = 0) + if (!resumed) + ignored_bellies = 0 + src.currentrun = belly_list.Copy() + + //cache for sanic speed (lists are references anyways) + var/list/currentrun = src.currentrun + var/times_fired = src.times_fired + while(currentrun.len) + var/obj/belly/B = currentrun[currentrun.len] + currentrun.len-- + + if(QDELETED(B)) + belly_list -= B + else + if(B.process_belly(times_fired,wait) == SSBELLIES_IGNORED) + ignored_bellies++ + + if (MC_TICK_CHECK) + return diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 06af2abb9d..c565847c18 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -324,6 +324,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Ghost pda: [(chat_toggles & CHAT_GHOSTPDA) ? "All Messages" : "Nearest Creatures"]
" dat += "Pull requests: [(chat_toggles & CHAT_PULLR) ? "Yes" : "No"]
" dat += "Midround Antagonist: [(toggles & MIDROUND_ANTAG) ? "Yes" : "No"]
" + //VORE SOUNDS + dat += "Hear Vore Sounds: [(toggles & EATING_NOISES) ? "Yes" : "No"]
" + dat += "Hear Vore Digestion Sounds: [(toggles & DIGESTION_NOISES) ? "Yes" : "No"]
" if(CONFIG_GET(flag/allow_metadata)) dat += "OOC Notes: Edit
" @@ -1765,6 +1768,12 @@ GLOBAL_LIST_EMPTY(preferences_datums) user.client.playtitlemusic() else user.stop_sound_channel(CHANNEL_LOBBYMUSIC) + // VORE SOUND TOGGLES + if("toggleeatingnoise") + toggles ^= EATING_NOISES + + if("toggledigestionnoise") + toggles ^= DIGESTION_NOISES if("ghost_ears") chat_toggles ^= CHAT_GHOSTEARS diff --git a/code/modules/client/preferences_vr.dm b/code/modules/client/preferences_vr.dm index 0f9b6935d3..d787e7e9a8 100644 --- a/code/modules/client/preferences_vr.dm +++ b/code/modules/client/preferences_vr.dm @@ -5,4 +5,7 @@ /datum/preferences/proc/set_biological_gender(var/gender) biological_gender = gender - identifying_gender = gender \ No newline at end of file + identifying_gender = gender + + +/obj/item/clothing/var/hides_bulges = FALSE // OwO wats this? diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 82706b46ee..d090b9f0f7 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -252,10 +252,6 @@ if(91.01 to INFINITY) msg += "[t_He] [t_is] a shitfaced, slobbering wreck.\n" - for (var/I in src.vore_organs) - var/datum/belly/B = vore_organs[I] - msg += B.get_examine_msg() - msg += "" if(!appears_dead) @@ -329,7 +325,7 @@ if(print_flavor_text() && get_visible_name() != "Unknown")//Are we sure we know who this is? Don't show flavor text unless we can recognize them. Prevents certain metagaming with impersonation. msg += "[print_flavor_text()]\n" - + msg += "*---------*" to_chat(user, msg) diff --git a/code/modules/mob/living/carbon/human/examine_vr.dm b/code/modules/mob/living/carbon/human/examine_vr.dm index 8578db809e..6ef1b687c2 100644 --- a/code/modules/mob/living/carbon/human/examine_vr.dm +++ b/code/modules/mob/living/carbon/human/examine_vr.dm @@ -42,13 +42,4 @@ message = "[t_His] stomach is firmly packed with digesting slop. [t_He] must have eaten at least a few times worth their body weight! It looks hard for them to stand, and [t_his] gut jiggles when they move.\n" if(4075 to 10000) // Four or more people. message = "[t_He] [t_is] so absolutely stuffed that you aren't sure how it's possible to move. [t_He] can't seem to swell any bigger. The surface of [t_his] belly looks sorely strained!\n" - return message - -/mob/living/carbon/human/proc/examine_bellies() - var/message = "" - - for (var/I in src.vore_organs) - var/datum/belly/B = vore_organs[I] - message += B.get_examine_msg() - return message \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 1321c499f4..2061924951 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -32,6 +32,7 @@ /mob/living/carbon/human/Destroy() QDEL_NULL(physiology) + QDEL_NULL_LIST(vore_organs) // CITADEL EDIT belly stuff return ..() /mob/living/carbon/human/OpenCraftingMenu() diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 030501066e..bf9a4492d6 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -64,6 +64,10 @@ /mob/living/carbon/human/calculate_affecting_pressure(pressure) if((wear_suit && (wear_suit.flags_1 & STOPSPRESSUREDMAGE_1)) && (head && (head.flags_1 & STOPSPRESSUREDMAGE_1))) return ONE_ATMOSPHERE + if(istype(loc, /obj/belly)) + return ONE_ATMOSPHERE + if(istype(loc, /obj/item/device/dogborg/sleeper)) + return ONE_ATMOSPHERE else return pressure @@ -138,6 +142,8 @@ return FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT if(ismob(loc)) return FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT + if(istype(loc, /obj/belly)) + return FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT //END EDIT if(wear_suit) if(wear_suit.max_heat_protection_temperature >= FIRE_SUIT_MAX_TEMP_PROTECT) @@ -246,10 +252,12 @@ /mob/living/carbon/human/proc/get_cold_protection(temperature) if(has_trait(TRAIT_RESISTCOLD)) return TRUE - + //CITADEL EDIT Mandatory for vore code. if(istype(loc, /obj/item/device/dogborg/sleeper)) return 1 //freezing to death in sleepers ruins fun. + if(istype(loc, /obj/belly)) + return 1 if(ismob(loc)) return 1 //because lazy and being inside somemone insulates you from space //END EDIT diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm index fba69e4e8b..3317bb2cda 100644 --- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm @@ -351,3 +351,10 @@ H.update_body() else return + +//misc +/mob/living/carbon/human/dummy + no_vore = TRUE + +/mob/living/carbon/human/vore + devourable = TRUE \ No newline at end of file diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index bf10084758..e5c82f0ead 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -52,6 +52,8 @@ return if(ismob(loc)) return + if(istype(loc, /obj/belly)) + return var/datum/gas_mixture/environment if(loc) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 8043f055bb..0c63ad2ab4 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -54,9 +54,6 @@ handle_fire() - // Citadel Vore code for belly processes - handle_internal_contents() - //stuff in the stomach handle_stomach() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm index 898a2ad734..1af22a8960 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm @@ -1,26 +1,27 @@ /mob/living/simple_animal/hostile/megafauna/dragon vore_active = TRUE + no_vore = FALSE /mob/living/simple_animal/hostile/megafauna/dragon/Initialize() // Create and register 'stomachs' - var/datum/belly/megafauna/dragon/maw/maw = new(src) - var/datum/belly/megafauna/dragon/gullet/gullet = new(src) - var/datum/belly/megafauna/dragon/gut/gut = new(src) - for(var/datum/belly/X in list(maw, gullet, gut)) - vore_organs[X.name] = X + var/obj/belly/megafauna/dragon/maw/maw = new(src) + var/obj/belly/megafauna/dragon/gullet/gullet = new(src) + var/obj/belly/megafauna/dragon/gut/gut = new(src) +// for(var/obj/belly/X in list(maw, gullet, gut)) +// vore_organs[X.name] = X // Connect 'stomachs' together maw.transferlocation = gullet gullet.transferlocation = gut - vore_selected = maw.name // NPC eats into maw + vore_selected = maw // NPC eats into maw return ..() -/datum/belly/megafauna/dragon +/obj/belly/megafauna/dragon human_prey_swallow_time = 50 // maybe enough to switch targets if distracted nonhuman_prey_swallow_time = 50 -/datum/belly/megafauna/dragon/maw +/obj/belly/megafauna/dragon/maw name = "maw" - inside_flavor = "The maw of the dreaded Ash drake closes around you, engulfing you into a swelteringly hot, disgusting enviroment. The acidic saliva tingles over your form while that tongue pushes you further back...towards the dark gullet beyond." + desc = "The maw of the dreaded Ash drake closes around you, engulfing you into a swelteringly hot, disgusting enviroment. The acidic saliva tingles over your form while that tongue pushes you further back...towards the dark gullet beyond." vore_verb = "scoop" vore_sound = 'sound/vore/pred/taurswallow.ogg' swallow_time = 20 @@ -30,9 +31,9 @@ autotransferchance = 66 autotransferwait = 200 -/datum/belly/megafauna/dragon/gullet +/obj/belly/megafauna/dragon/gullet name = "gullet" - inside_flavor = "A ripple of muscle and arching of the tongue pushes you down like any other food. No choice in the matter, you're simply consumed. The dark ambiance of the outside world is replaced with working, wet flesh. Your only light being what you brought with you." + desc = "A ripple of muscle and arching of the tongue pushes you down like any other food. No choice in the matter, you're simply consumed. The dark ambiance of the outside world is replaced with working, wet flesh. Your only light being what you brought with you." swallow_time = 60 // costs extra time to eat directly to here escapechance = 5 // From above, will transfer into gut @@ -40,10 +41,10 @@ autotransferchance = 50 autotransferwait = 200 -/datum/belly/megafauna/dragon/gut +/obj/belly/megafauna/dragon/gut name = "stomach" vore_capacity = 5 //I doubt this many people will actually last in the gut, but... - inside_flavor = "With a rush of burning ichor greeting you, you're introduced to the Drake's stomach. Wrinkled walls greedily grind against you, acidic slimes working into your body as you become fuel and nutriton for a superior predator. All that's left is your body's willingness to resist your destiny." + desc = "With a rush of burning ichor greeting you, you're introduced to the Drake's stomach. Wrinkled walls greedily grind against you, acidic slimes working into your body as you become fuel and nutriton for a superior predator. All that's left is your body's willingness to resist your destiny." digest_mode = DM_DRAGON digest_burn = 5 swallow_time = 100 // costs extra time to eat directly to here diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 09eb099ae7..61e7153434 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -103,7 +103,8 @@ stack_trace("Simple animal being instantiated in nullspace") if(vore_active) init_belly() - verbs |= /mob/living/proc/animal_nom + if(!IsAdvancedToolUser()) + verbs |= /mob/living/simple_animal/proc/animal_nom /mob/living/simple_animal/Destroy() GLOB.simple_animals[AIStatus] -= src diff --git a/code/modules/mob/living/simple_animal/simple_animal_vr.dm b/code/modules/mob/living/simple_animal/simple_animal_vr.dm index 2eca841c17..72459cc74d 100644 --- a/code/modules/mob/living/simple_animal/simple_animal_vr.dm +++ b/code/modules/mob/living/simple_animal/simple_animal_vr.dm @@ -7,18 +7,18 @@ var/vore_default_mode = DM_DIGEST // Default bellymode (DM_DIGEST, DM_HOLD, DM_ABSORB) var/vore_digest_chance = 25 // Chance to switch to digest mode if resisted var/vore_escape_chance = 25 // Chance of resisting out of mob + var/vore_absorb_chance = 0 // chance of absorbtion by mob var/vore_stomach_name // The name for the first belly if not "stomach" var/vore_stomach_flavor // The flavortext for the first belly if not the default var/vore_fullness = 0 // How "full" the belly is (controls icons) + var/list/living_mobs = list() // Release belly contents beforey being gc'd! /mob/living/simple_animal/Destroy() - for(var/I in vore_organs) - var/datum/belly/B = vore_organs[I] - B.release_all_contents() // When your stomach is empty + release_vore_contents() prey_excludes.Cut() . = ..() @@ -34,10 +34,10 @@ vore_fullness = new_fullness - +/* /mob/living/simple_animal/proc/swallow_check() for(var/I in vore_organs) - var/datum/belly/B = vore_organs[I] + var/obj/belly/B = vore_organs[I] if(vore_active) update_fullness() if(!vore_fullness) @@ -48,16 +48,14 @@ /mob/living/simple_animal/proc/swallow_mob() for(var/I in vore_organs) - var/datum/belly/B = vore_organs[I] - for(var/mob/living/M in B.internal_contents) - B.transfer_contents(M, B.transferlocation) - + var/obj/belly/B = vore_organs[I] + for(var/mob/living/M in B.contents) + B.transfer_contents(M, transferlocation) +*/ /mob/living/simple_animal/death() - for(var/I in vore_organs) - var/datum/belly/B = vore_organs[I] - B.release_all_contents() // When your stomach is empty - ..() // then you have my permission to die. + release_vore_contents() + . = ..() // Simple animals have only one belly. This creates it (if it isn't already set up) /mob/living/simple_animal/proc/init_belly() @@ -66,18 +64,19 @@ if(no_vore) //If it can't vore, let's not give it a stomach. return - var/datum/belly/B = new /datum/belly(src) - B.immutable = TRUE + var/obj/belly/B = new /obj/belly(src) + vore_selected = B + B.immutable = 1 B.name = vore_stomach_name ? vore_stomach_name : "stomach" - B.inside_flavor = vore_stomach_flavor ? vore_stomach_flavor : "Your surroundings are warm, soft, and slimy. Makes sense, considering you're inside \the [name]." + B.desc = vore_stomach_flavor ? vore_stomach_flavor : "Your surroundings are warm, soft, and slimy. Makes sense, considering you're inside \the [name]." B.digest_mode = vore_default_mode B.escapable = vore_escape_chance > 0 B.escapechance = vore_escape_chance B.digestchance = vore_digest_chance + B.absorbchance = vore_absorb_chance B.human_prey_swallow_time = swallowTime B.nonhuman_prey_swallow_time = swallowTime B.vore_verb = "swallow" - // TODO - Customizable per mob B.emote_lists[DM_HOLD] = list( // We need more that aren't repetitive. I suck at endo. -Ace "The insides knead at you gently for a moment.", "The guts glorp wetly around you as some air shifts.", @@ -98,5 +97,21 @@ "The juices pooling beneath you sizzle against your sore skin.", "The churning walls slowly pulverize you into meaty nutrients.", "The stomach glorps and gurgles as it tries to work you into slop.") - src.vore_organs[B.name] = B - src.vore_selected = B.name +/* B.emote_lists[DM_ITEMWEAK] = list( + "The burning acids eat away at your form.", + "The muscular stomach flesh grinds harshly against you.", + "The caustic air stings your chest when you try to breathe.", + "The slimy guts squeeze inward to help the digestive juices soften you up.", + "The onslaught against your body doesn't seem to be letting up; you're food now.", + "The predator's body ripples and crushes against you as digestive enzymes pull you apart.", + "The juices pooling beneath you sizzle against your sore skin.", + "The churning walls slowly pulverize you into meaty nutrients.", + "The stomach glorps and gurgles as it tries to work you into slop.")*/ + +//Grab = Nomf +/* +/mob/living/simple_animal/UnarmedAttack(var/atom/A, var/proximity) + . = ..() + + if(a_intent == I_GRAB && isliving(A) && !has_hands) + animal_nom(A)*/ \ No newline at end of file diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index 47d35108a1..862991c4b8 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -1,7 +1,8 @@ //include unit test files in this module in this ifdef - +// CITADEL EDIT add vore_tests.dm #ifdef UNIT_TESTS #include "unit_test.dm" #include "reagent_recipe_collisions.dm" #include "reagent_id_typos.dm" +//#include "vore_tests.dm" #endif diff --git a/code/modules/unit_tests/vore_tests.dm b/code/modules/unit_tests/vore_tests.dm new file mode 100644 index 0000000000..6549aa9ce7 --- /dev/null +++ b/code/modules/unit_tests/vore_tests.dm @@ -0,0 +1,218 @@ +/datum/unit_test + var/static/default_mobloc = null + +/datum/unit_test/proc/create_test_mob(var/turf/mobloc = null, var/mobtype = /mob/living/carbon/human, var/with_mind = FALSE) + if(isnull(mobloc)) + if(!default_mobloc) + for(var/turf/simulated/floor/tiled/T in world) + var/pressure = T.zone.air.return_pressure() + if(90 < pressure && pressure < 120) // Find a turf between 90 and 120 + default_mobloc = T + break + mobloc = default_mobloc + if(!mobloc) + Fail("Unable to find a location to create test mob") + return FALSE + + var/mob/living/carbon/human/H = new mobtype(mobloc) + + if(with_mind) + H.mind_initialize("TestKey[rand(0,10000)]") + + return H + +/datum/unit_test/space_suffocation + name = "MOB: human mob suffocates in space" + + var/startOxyloss + var/endOxyloss + var/mob/living/carbon/human/H + async = 1 + +/datum/unit_test/space_suffocation/Run() + var/turf/open/space/T = locate() + + H = new(T) + startOxyloss = H.getOxyLoss() + + return 1 + +/datum/unit_test/space_suffocation/check_result() + if(H.life_tick < 10) + return 0 + + endOxyloss = H.getOxyLoss() + + if(!startOxyloss < endOxyloss) + Fail("Human mob is not taking oxygen damage in space. (Before: [startOxyloss]; after: [endOxyloss])") + + qdel(H) + return 1 + +/datum/unit_test/belly_nonsuffocation + name = "MOB: human mob does not suffocate in a belly" + var/startLifeTick + var/startOxyloss + var/endOxyloss + var/mob/living/carbon/human/pred + var/mob/living/carbon/human/prey + +/datum/unit_test/belly_nonsuffocation/Run() + pred = create_test_mob() + if(!istype(pred)) + return FALSE + prey = create_test_mob(pred.loc) + if(!istype(prey)) + return FALSE + + return TRUE + +/datum/unit_test/belly_nonsuffocation/check_result() + // Unfortuantely we need to wait for the pred's belly to initialize. (Currently after a spawn()) + if(!pred.vore_organs || !pred.vore_organs.len) + return FALSE + + // Now that pred belly exists, we can eat the prey. + if(!pred.vore_selected) + Fail("[pred] has no vore_selected.") + return TRUE + + // Attempt to eat the prey + if(prey.loc != pred.vore_selected) + pred.vore_selected.nom_mob(prey) + + if(prey.loc != pred.vore_selected) + Fail("[pred.vore_selected].nom_mob([prey]) did not put prey inside [pred]") + return TRUE + + // Okay, we succeeded in eating them, now lets wait a bit + startLifeTick = pred.life_tick + startOxyloss = prey.getOxyLoss() + return FALSE + + if(pred.life_tick < (startLifeTick + 10)) + return FALSE // Wait for them to breathe a few times + + // Alright lets check it! + endOxyloss = prey.getOxyLoss() + if(startOxyloss < endOxyloss) + Fail("Prey takes oxygen damage in a pred's belly! (Before: [startOxyloss]; after: [endOxyloss])") + qdel(prey) + qdel(pred) + return TRUE +//////////////////////////////////////////////////////////////// +/datum/unit_test/belly_spacesafe + name = "MOB: human mob protected from space in a belly" + var/startLifeTick + var/startOxyloss + var/startBruteloss + var/endOxyloss + var/endBruteloss + var/mob/living/carbon/human/pred + var/mob/living/carbon/human/prey + +/datum/unit_test/belly_spacesafe/Run() + pred = create_test_mob() + if(!istype(pred)) + return FALSE + prey = create_test_mob(pred.loc) + if(!istype(prey)) + return FALSE + + return TRUE + +/datum/unit_test/belly_spacesafe/check_result() + // Unfortuantely we need to wait for the pred's belly to initialize. (Currently after a spawn()) + if(!pred.vore_organs || !pred.vore_organs.len) + return FALSE + + // Now that pred belly exists, we can eat the prey. + if(!pred.vore_selected) + Fail("[pred] has no vore_selected.") + return TRUE + + // Attempt to eat the prey + if(prey.loc != pred.vore_selected) + pred.vore_selected.nom_mob(prey) + + if(prey.loc != pred.vore_selected) + Fail("[pred.vore_selected].nom_mob([prey]) did not put prey inside [pred]") + return TRUE + else + var/turf/T = locate(/turf/open/space) + if(!T) + Fail("could not find a space turf for testing") + return TRUE + else + pred.forceMove(T) + + // Okay, we succeeded in eating them, now lets wait a bit + startLifeTick = pred.life_tick + startOxyloss = prey.getOxyLoss() + startBruteloss = prey.getBruteloss() + return FALSE + + if(pred.life_tick < (startLifeTick + 10)) + return FALSE // Wait for them to breathe a few times + + // Alright lets check it! + endOxyloss = prey.getOxyLoss() + endBruteloss = prey.getBruteLoss() + if(startBruteloss < endBruteloss) + Fail("Prey takes brute damage in space! (Before: [startBruteloss]; after: [endBruteloss])") + qdel(prey) + qdel(pred) + return TRUE +//////////////////////////////////////////////////////////////// +/datum/unit_test/belly_damage + name = "MOB: human mob takes damage from digestion" + var/startLifeTick + var/startBruteBurn + var/endBruteBurn + var/mob/living/carbon/human/pred + var/mob/living/carbon/human/prey + +/datum/unit_test/belly_damage/Run() + pred = create_test_mob() + if(!istype(pred)) + return FALSE + prey = create_test_mob(pred.loc) + if(!istype(prey)) + return FALSE + + return TRUE + +/datum/unit_test/belly_damage/check_result() + // Unfortuantely we need to wait for the pred's belly to initialize. (Currently after a spawn()) + if(!pred.vore_organs || !pred.vore_organs.len) + return FALSE + + // Now that pred belly exists, we can eat the prey. + if(!pred.vore_selected) + Fail("[pred] has no vore_selected.") + return TRUE + + // Attempt to eat the prey + if(prey.loc != pred.vore_selected) + pred.vore_selected.nom_mob(prey) + + if(prey.loc != pred.vore_selected) + Fail("[pred.vore_selected].nom_mob([prey]) did not put prey inside [pred]") + return TRUE + + // Okay, we succeeded in eating them, now lets wait a bit + pred.vore_selected.digest_mode = DM_DIGEST + startLifeTick = pred.life_tick + startBruteBurn = prey.getBruteLoss() + prey.getFireLoss() + return FALSE + + if(pred.life_tick < (startLifeTick + 10)) + return FALSE // Wait a few ticks for damage to happen + + // Alright lets check it! + endBruteBurn = prey.getBruteLoss() + prey.getFireLoss() + if(startBruteBurn >= endBruteBurn) + Fail("Prey doesn't take damage in digesting belly! (Before: [startBruteBurn]; after: [endBruteBurn])") + qdel(prey) + qdel(pred) + return TRUE diff --git a/code/modules/vore/eating/belly_dat_vr.dm b/code/modules/vore/eating/belly_dat_vr.dm new file mode 100644 index 0000000000..3886eb14cf --- /dev/null +++ b/code/modules/vore/eating/belly_dat_vr.dm @@ -0,0 +1,162 @@ +// THIS IS NOW MERELY LEGACY, because memes. hopefully it won't be dumb. + +// +// The belly object is what holds onto a mob while they're inside a predator. +// It takes care of altering the pred's decription, digesting the prey, relaying struggles etc. +// + +// If you change what variables are on this, then you need to update the copy() proc. + +// +// Parent type of all the various "belly" varieties. +// +/datum/belly + var/name // Name of this location + var/inside_flavor // Flavor text description of inside sight/sound/smells/feels. + var/vore_sound = 'sound/vore/pred/swallow_01.ogg' // Sound when ingesting someone + var/vore_verb = "ingest" // Verb for eating with this in messages + var/human_prey_swallow_time = 10 SECONDS // Time in deciseconds to swallow /mob/living/carbon/human + var/nonhuman_prey_swallow_time = 5 SECONDS // Time in deciseconds to swallow anything else + var/emoteTime = 30 SECONDS // How long between stomach emotes at prey + var/digest_brute = 0 // Brute damage per tick in digestion mode + var/digest_burn = 1 // Burn damage per tick in digestion mode + var/digest_tickrate = 9 // Modulus this of air controller tick number to iterate gurgles on + var/immutable = FALSE // Prevents this belly from being deleted + var/escapable = FALSE // Belly can be resisted out of at any time + var/escapetime = 60 SECONDS // Deciseconds, how long to escape this belly + var/digestchance = 0 // % Chance of stomach beginning to digest if prey struggles +// var/silenced = FALSE // Will the heartbeat/fleshy internal loop play? + var/escapechance = 0 // % Chance of prey beginning to escape if prey struggles. + + var/datum/belly/transferlocation = null // Location that the prey is released if they struggle and get dropped off. + var/transferchance = 0 // % Chance of prey being transferred to transfer location when resisting + var/autotransferchance = 0 // % Chance of prey being autotransferred to transfer location + var/autotransferwait = 10 // Time between trying to transfer. + var/can_taste = FALSE // If this belly prints the flavor of prey when it eats someone. + + var/tmp/digest_mode = DM_HOLD // Whether or not to digest. Default to not digest. + var/tmp/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_HEAL,DM_NOISY) // Possible digest modes + var/tmp/mob/living/owner // The mob whose belly this is. + var/tmp/list/internal_contents = list() // People/Things you've eaten into this belly! + var/tmp/is_full // Flag for if digested remeans are present. (for disposal messages) + var/tmp/emotePend = FALSE // If there's already a spawned thing counting for the next emote + var/swallow_time = 10 SECONDS // for mob transfering automation + var/vore_capacity = 1 // The capacity (in people) this person can hold + + // Don't forget to watch your commas at the end of each line if you change these. + var/list/struggle_messages_outside = list( + "%pred's %belly wobbles with a squirming meal.", + "%pred's %belly jostles with movement.", + "%pred's %belly briefly swells outward as someone pushes from inside.", + "%pred's %belly fidgets with a trapped victim.", + "%pred's %belly jiggles with motion from inside.", + "%pred's %belly sloshes around.", + "%pred's %belly gushes softly.", + "%pred's %belly lets out a wet squelch.") + + var/list/struggle_messages_inside = list( + "Your useless squirming only causes %pred's slimy %belly to squelch over your body.", + "Your struggles only cause %pred's %belly to gush softly around you.", + "Your movement only causes %pred's %belly to slosh around you.", + "Your motion causes %pred's %belly to jiggle.", + "You fidget around inside of %pred's %belly.", + "You shove against the walls of %pred's %belly, making it briefly swell outward.", + "You jostle %pred's %belly with movement.", + "You squirm inside of %pred's %belly, making it wobble around.") + + var/list/digest_messages_owner = list( + "You feel %prey's body succumb to your digestive system, which breaks it apart into soft slurry.", + "You hear a lewd glorp as your %belly muscles grind %prey into a warm pulp.", + "Your %belly lets out a rumble as it melts %prey into sludge.", + "You feel a soft gurgle as %prey's body loses form in your %belly. They're nothing but a soft mass of churning slop now.", + "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your thighs.", + "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your rump.", + "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your belly.", + "Your %belly groans as %prey falls apart into a thick soup. You can feel their remains soon flowing deeper into your body to be absorbed.", + "Your %belly kneads on every fiber of %prey, softening them down into mush to fuel your next hunt.", + "Your %belly churns %prey down into a hot slush. You can feel the nutrients coursing through your digestive track with a series of long, wet glorps.") + + var/list/digest_messages_prey = list( + "Your body succumbs to %pred's digestive system, which breaks you apart into soft slurry.", + "%pred's %belly lets out a lewd glorp as their muscles grind you into a warm pulp.", + "%pred's %belly lets out a rumble as it melts you into sludge.", + "%pred feels a soft gurgle as your body loses form in their %belly. You're nothing but a soft mass of churning slop now.", + "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's thighs.", + "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's rump.", + "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's belly.", + "%pred's %belly groans as you fall apart into a thick soup. Your remains soon flow deeper into %pred's body to be absorbed.", + "%pred's %belly kneads on every fiber of your body, softening you down into mush to fuel their next hunt.", + "%pred's %belly churns you down into a hot slush. Your nutrient-rich remains course through their digestive track with a series of long, wet glorps.") + + var/list/examine_messages = list( + "They have something solid in their %belly!", + "It looks like they have something in their %belly!") + + //Mostly for being overridden on precreated bellies on mobs. Could be VV'd into + //a carbon's belly if someone really wanted. No UI for carbons to adjust this. + //List has indexes that are the digestion mode strings, and keys that are lists of strings. + var/list/emote_lists = list() + +//OLD: This only exists for legacy conversion purposes +//It's called whenever an old datum-style belly is loaded +/datum/belly/proc/copy(obj/belly/new_belly) + + //// Non-object variables + new_belly.name = name + new_belly.desc = inside_flavor + new_belly.vore_sound = vore_sound + new_belly.vore_verb = vore_verb + new_belly.human_prey_swallow_time = human_prey_swallow_time + new_belly.nonhuman_prey_swallow_time = nonhuman_prey_swallow_time + new_belly.emote_time = emoteTime + new_belly.digest_brute = digest_brute + new_belly.digest_burn = digest_burn + new_belly.immutable = immutable + new_belly.can_taste = can_taste + new_belly.escapable = escapable + new_belly.escapetime = escapetime + new_belly.digestchance = digestchance + new_belly.escapechance = escapechance + new_belly.transferchance = transferchance + new_belly.transferlocation = transferlocation + + //// Object-holding variables + //struggle_messages_outside - strings + new_belly.struggle_messages_outside.Cut() + for(var/I in struggle_messages_outside) + new_belly.struggle_messages_outside += I + + //struggle_messages_inside - strings + new_belly.struggle_messages_inside.Cut() + for(var/I in struggle_messages_inside) + new_belly.struggle_messages_inside += I + + //digest_messages_owner - strings + new_belly.digest_messages_owner.Cut() + for(var/I in digest_messages_owner) + new_belly.digest_messages_owner += I + + //digest_messages_prey - strings + new_belly.digest_messages_prey.Cut() + for(var/I in digest_messages_prey) + new_belly.digest_messages_prey += I + + //examine_messages - strings + new_belly.examine_messages.Cut() + for(var/I in examine_messages) + new_belly.examine_messages += I + + //emote_lists - index: digest mode, key: list of strings + new_belly.emote_lists.Cut() + for(var/K in emote_lists) + new_belly.emote_lists[K] = list() + for(var/I in emote_lists[K]) + new_belly.emote_lists[K] += I + + return new_belly + +// // // // // // // // // // // // +// // // LEGACY USE ONLY!! // // // +// // // // // // // // // // // // +// See top of file! // +// // // // // // // // // // // // diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm new file mode 100644 index 0000000000..14ded0b7cc --- /dev/null +++ b/code/modules/vore/eating/belly_obj_vr.dm @@ -0,0 +1,655 @@ +//#define VORE_SOUND_FALLOFF 0.05 + +// +// Belly system 2.0, now using objects instead of datums because EH at datums. +// How many times have I rewritten bellies and vore now? -Aro +// + +// If you change what variables are on this, then you need to update the copy() proc. + +// +// Parent type of all the various "belly" varieties. +// +/obj/belly + name = "belly" // Name of this location + desc = "It's a belly! You're in it!" // Flavor text description of inside sight/sound/smells/feels. + var/vore_sound = 'sound/vore/pred/swallow_01.ogg' // Sound when ingesting someone + var/vore_verb = "ingest" // Verb for eating with this in messages + var/release_sound = 'sound/effects/splat.ogg' + var/human_prey_swallow_time = 100 // Time in deciseconds to swallow /mob/living/carbon/human + var/nonhuman_prey_swallow_time = 30 // Time in deciseconds to swallow anything else + var/emote_time = 60 SECONDS // How long between stomach emotes at prey + var/digest_brute = 2 // Brute damage per tick in digestion mode + var/digest_burn = 2 // Burn damage per tick in digestion mode + var/immutable = FALSE // Prevents this belly from being deleted + var/escapable = TRUE // Belly can be resisted out of at any time + var/escapetime = 20 SECONDS // Deciseconds, how long to escape this belly + var/digestchance = 0 // % Chance of stomach beginning to digest if prey struggles + var/absorbchance = 0 // % Chance of stomach beginning to absorb if prey struggles + var/escapechance = 100 // % Chance of prey beginning to escape if prey struggles. + var/can_taste = FALSE // If this belly prints the flavor of prey when it eats someone. + var/bulge_size = 0.25 // The minimum size the prey has to be in order to show up on examine. +// var/shrink_grow_size = 1 // This horribly named variable determines the minimum/maximum size it will shrink/grow prey to. + var/silent = FALSE + + var/transferlocation = null // Location that the prey is released if they struggle and get dropped off. + var/transferchance = 0 // % Chance of prey being transferred to transfer location when resisting + var/autotransferchance = 0 // % Chance of prey being autotransferred to transfer location + var/autotransferwait = 10 // Time between trying to transfer. + var/swallow_time = 10 SECONDS // for mob transfering automation + var/vore_capacity = 1 // simple animal nom capacity + + //I don't think we've ever altered these lists. making them static until someone actually overrides them somewhere. + var/tmp/static/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_HEAL,DM_NOISY) // Possible digest modes + + var/tmp/mob/living/owner // The mob whose belly this is. + var/tmp/digest_mode = DM_HOLD // Current mode the belly is set to from digest_modes (+transform_modes if human) + var/tmp/next_process = 0 // Waiting for this SSbellies times_fired to process again. + var/tmp/list/items_preserved = list() // Stuff that wont digest so we shouldn't process it again. + var/tmp/next_emote = 0 // When we're supposed to print our next emote, as a belly controller tick # + var/tmp/recent_sound = FALSE // Prevent audio spam + + // Don't forget to watch your commas at the end of each line if you change these. + var/list/struggle_messages_outside = list( + "%pred's %belly wobbles with a squirming meal.", + "%pred's %belly jostles with movement.", + "%pred's %belly briefly swells outward as someone pushes from inside.", + "%pred's %belly fidgets with a trapped victim.", + "%pred's %belly jiggles with motion from inside.", + "%pred's %belly sloshes around.", + "%pred's %belly gushes softly.", + "%pred's %belly lets out a wet squelch.") + + var/list/struggle_messages_inside = list( + "Your useless squirming only causes %pred's slimy %belly to squelch over your body.", + "Your struggles only cause %pred's %belly to gush softly around you.", + "Your movement only causes %pred's %belly to slosh around you.", + "Your motion causes %pred's %belly to jiggle.", + "You fidget around inside of %pred's %belly.", + "You shove against the walls of %pred's %belly, making it briefly swell outward.", + "You jostle %pred's %belly with movement.", + "You squirm inside of %pred's %belly, making it wobble around.") + + var/list/digest_messages_owner = list( + "You feel %prey's body succumb to your digestive system, which breaks it apart into soft slurry.", + "You hear a lewd glorp as your %belly muscles grind %prey into a warm pulp.", + "Your %belly lets out a rumble as it melts %prey into sludge.", + "You feel a soft gurgle as %prey's body loses form in your %belly. They're nothing but a soft mass of churning slop now.", + "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your thighs.", + "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your rump.", + "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your belly.", + "Your %belly groans as %prey falls apart into a thick soup. You can feel their remains soon flowing deeper into your body to be absorbed.", + "Your %belly kneads on every fiber of %prey, softening them down into mush to fuel your next hunt.", + "Your %belly churns %prey down into a hot slush. You can feel the nutrients coursing through your digestive track with a series of long, wet glorps.") + + var/list/digest_messages_prey = list( + "Your body succumbs to %pred's digestive system, which breaks you apart into soft slurry.", + "%pred's %belly lets out a lewd glorp as their muscles grind you into a warm pulp.", + "%pred's %belly lets out a rumble as it melts you into sludge.", + "%pred feels a soft gurgle as your body loses form in their %belly. You're nothing but a soft mass of churning slop now.", + "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's thighs.", + "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's rump.", + "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's belly.", + "%pred's %belly groans as you fall apart into a thick soup. Your remains soon flow deeper into %pred's body to be absorbed.", + "%pred's %belly kneads on every fiber of your body, softening you down into mush to fuel their next hunt.", + "%pred's %belly churns you down into a hot slush. Your nutrient-rich remains course through their digestive track with a series of long, wet glorps.") + + var/list/examine_messages = list( + "They have something solid in their %belly!", + "It looks like they have something in their %belly!") + + //Mostly for being overridden on precreated bellies on mobs. Could be VV'd into + //a carbon's belly if someone really wanted. No UI for carbons to adjust this. + //List has indexes that are the digestion mode strings, and keys that are lists of strings. + var/tmp/list/emote_lists = list() + +//For serialization, keep this updated, required for bellies to save correctly. +/obj/belly/vars_to_save() + return ..() + list( + "name", + "desc", + "vore_sound", + "vore_verb", + "release_sound", + "human_prey_swallow_time", + "nonhuman_prey_swallow_time", + "emote_time", + "digest_brute", + "digest_burn", + "immutable", + "can_taste", + "escapable", + "escapetime", + "digestchance", + "absorbchance", + "escapechance", + "transferchance", + "transferlocation", + "bulge_size", + "struggle_messages_outside", + "struggle_messages_inside", + "digest_messages_owner", + "digest_messages_prey", + "examine_messages", + "emote_lists", + "silent" + ) + + //ommitted list + // "shrink_grow_size", +/obj/belly/New(var/newloc) + . = ..(newloc) + //If not, we're probably just in a prefs list or something. + if(isliving(newloc)) + owner = loc + owner.vore_organs |= src + SSbellies.belly_list += src + +/obj/belly/Destroy() + SSbellies.belly_list -= src + if(owner) + owner.vore_organs -= src + owner = null + . = ..() + +// Called whenever an atom enters this belly +/obj/belly/Entered(var/atom/movable/thing,var/atom/OldLoc) + if(OldLoc in contents) + return //Someone dropping something (or being stripdigested) + + //Generic entered message + to_chat(owner,"[thing] slides into your [lowertext(name)].") + + //Sound w/ antispam flag setting + if(!silent && !recent_sound) + for(var/mob/M in get_hearers_in_view(5, get_turf(owner))) + if(M.client && M.client.prefs.toggles & EATING_NOISES) + playsound(get_turf(owner),"[src.vore_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED) + recent_sound = TRUE + + //Messages if it's a mob + if(isliving(thing)) + var/mob/living/M = thing + if(desc) + to_chat(M, "[desc]") + var/taste + if(can_taste && (taste = M.get_taste_message(FALSE))) + to_chat(owner, "[M] tastes of [taste].") + +// Release all contents of this belly into the owning mob's location. +// If that location is another mob, contents are transferred into whichever of its bellies the owning mob is in. +// Returns the number of mobs so released. +/obj/belly/proc/release_all_contents(var/include_absorbed = FALSE) + var/atom/destination = drop_location() + var/count = 0 + for(var/thing in contents) + var/atom/movable/AM = thing + if(isliving(AM)) + var/mob/living/L = AM + if(L.absorbed && !include_absorbed) + continue + L.absorbed = FALSE + for(var/mob/living/W in AM) + W.stop_sound_channel(CHANNEL_PREYLOOP) + AM.forceMove(destination) // Move the belly contents into the same location as belly's owner. + count++ + for(var/mob/M in get_hearers_in_view(5, get_turf(owner))) + if(M.client && M.client.prefs.toggles & EATING_NOISES) + playsound(get_turf(owner),"[src.release_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED) + items_preserved.Cut() + owner.visible_message("[owner] expels everything from their [lowertext(name)]!") + owner.update_icons() + + return count + +// Release a specific atom from the contents of this belly into the owning mob's location. +// If that location is another mob, the atom is transferred into whichever of its bellies the owning mob is in. +// Returns the number of atoms so released. +/obj/belly/proc/release_specific_contents(var/atom/movable/M) + if (!(M in contents)) + return FALSE // They weren't in this belly anyway + + M.forceMove(drop_location()) // Move the belly contents into the same location as belly's owner. + items_preserved -= M + for(var/mob/living/P in M) + P.stop_sound_channel(CHANNEL_PREYLOOP) + if(release_sound) + for(var/mob/H in get_hearers_in_view(5, get_turf(owner))) + if(H.client && H.client.prefs.toggles & EATING_NOISES) + playsound(get_turf(owner),"[src.release_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED) + + if(istype(M,/mob/living)) + var/mob/living/ML = M + var/mob/living/OW = owner + if(ML.absorbed) + ML.absorbed = FALSE + if(ishuman(M) && ishuman(OW)) + var/mob/living/carbon/human/Prey = M + var/mob/living/carbon/human/Pred = OW + var/absorbed_count = 2 //Prey that we were, plus the pred gets a portion + for(var/mob/living/P in contents) + if(P.absorbed) + absorbed_count++ + Pred.reagents.trans_to(Prey, Pred.reagents.total_volume / absorbed_count) + + owner.visible_message("[owner] expels [M] from their [lowertext(name)]!") + owner.update_icons() + return TRUE + +// Actually perform the mechanics of devouring the tasty prey. +// The purpose of this method is to avoid duplicate code, and ensure that all necessary +// steps are taken. +/obj/belly/proc/nom_mob(var/mob/prey, var/mob/user) + var/sound/preyloop = sound('sound/vore/prey/loop.ogg', repeat = TRUE) + if(owner.stat == DEAD) + return + if (prey.buckled) + prey.buckled.unbuckle_mob(prey,TRUE) + + prey.forceMove(src) + prey.playsound_local(loc,preyloop,70,0, channel = CHANNEL_PREYLOOP) + owner.updateVRPanel() + + for(var/mob/living/M in contents) + M.updateVRPanel() + + // Setup the autotransfer checks if needed + if(transferlocation && autotransferchance > 0) + addtimer(CALLBACK(src, /obj/belly/.proc/check_autotransfer, prey), autotransferwait) + +/obj/belly/proc/check_autotransfer(var/mob/prey) + // Some sanity checks + if(transferlocation && (autotransferchance > 0) && (prey in contents)) + if(prob(autotransferchance)) + // Double check transferlocation isn't insane + if(verify_transferlocation()) + transfer_contents(prey, transferlocation) + else + // Didn't transfer, so wait before retrying + addtimer(CALLBACK(src, /obj/belly/.proc/check_autotransfer, prey), autotransferwait) + +/obj/belly/proc/verify_transferlocation() + for(var/I in owner.vore_organs) + var/obj/belly/B = owner.vore_organs[I] + if(B == transferlocation) + return TRUE + + for(var/I in owner.vore_organs) + var/obj/belly/B = owner.vore_organs[I] + if(B == transferlocation) + transferlocation = B + return TRUE + return FALSE + + +// Get the line that should show up in Examine message if the owner of this belly +// is examined. By making this a proc, we not only take advantage of polymorphism, +// but can easily make the message vary based on how many people are inside, etc. +// Returns a string which shoul be appended to the Examine output. +/obj/belly/proc/get_examine_msg() + if(contents.len && examine_messages.len) + var/formatted_message + var/raw_message = pick(examine_messages) + var/total_bulge = 0 + + formatted_message = replacetext(raw_message,"%belly",lowertext(name)) + formatted_message = replacetext(formatted_message,"%pred",owner) + formatted_message = replacetext(formatted_message,"%prey",english_list(contents)) + for(var/mob/living/P in contents) + if(!P.absorbed) //This is required first, in case there's a person absorbed and not absorbed in a stomach. + total_bulge += P.mob_size + if(total_bulge >= bulge_size && bulge_size != 0) + return("[formatted_message]
") + else + return "" + +// The next function gets the messages set on the belly, in human-readable format. +// This is useful in customization boxes and such. The delimiter right now is \n\n so +// in message boxes, this looks nice and is easily delimited. +/obj/belly/proc/get_messages(var/type, var/delim = "\n\n") + ASSERT(type == "smo" || type == "smi" || type == "dmo" || type == "dmp" || type == "em") + var/list/raw_messages + + switch(type) + if("smo") + raw_messages = struggle_messages_outside + if("smi") + raw_messages = struggle_messages_inside + if("dmo") + raw_messages = digest_messages_owner + if("dmp") + raw_messages = digest_messages_prey + if("em") + raw_messages = examine_messages + + var/messages = list2text(raw_messages,delim) + return messages + +// The next function sets the messages on the belly, from human-readable var +// replacement strings and linebreaks as delimiters (two \n\n by default). +// They also sanitize the messages. +/obj/belly/proc/set_messages(var/raw_text, var/type, var/delim = "\n\n") + ASSERT(type == "smo" || type == "smi" || type == "dmo" || type == "dmp" || type == "em") + + var/list/raw_list = text2list(html_encode(raw_text),delim) + if(raw_list.len > 10) + raw_list.Cut(11) + testing("[owner] tried to set [lowertext(name)] with 11+ messages") + + for(var/i = 1, i <= raw_list.len, i++) + if(length(raw_list[i]) > 160 || length(raw_list[i]) < 10) //160 is fudged value due to htmlencoding increasing the size + raw_list.Cut(i,i) + testing("[owner] tried to set [lowertext(name)] with >121 or <10 char message") + else + raw_list[i] = readd_quotes(raw_list[i]) + //Also fix % sign for var replacement + raw_list[i] = replacetext(raw_list[i],"%","%") + + ASSERT(raw_list.len <= 10) //Sanity + + switch(type) + if("smo") + struggle_messages_outside = raw_list + if("smi") + struggle_messages_inside = raw_list + if("dmo") + digest_messages_owner = raw_list + if("dmp") + digest_messages_prey = raw_list + if("em") + examine_messages = raw_list + + return + +// Handle the death of a mob via digestion. +// Called from the process_Life() methods of bellies that digest prey. +// Default implementation calls M.death() and removes from internal contents. +// Indigestable items are removed, and M is deleted. +/obj/belly/proc/digestion_death(var/mob/living/M) + //M.death(1) // "Stop it he's already dead..." Basically redundant and the reason behind screaming mouse carcasses. + if(M.ckey) + message_admins("[key_name(owner)] has digested [key_name(M)] in their [lowertext(name)] ([owner ? "JMP" : "null"])") + log_attack("[key_name(owner)] digested [key_name(M)].") + + // If digested prey is also a pred... anyone inside their bellies gets moved up. + if(is_vore_predator(M)) + for(var/belly in M.vore_organs) + var/obj/belly/B = belly + for(var/thing in B) + var/atom/movable/AM = thing + AM.forceMove(owner.loc) + if(isliving(AM)) + to_chat(AM,"As [M] melts away around you, you find yourself in [owner]'s [lowertext(name)]") + + //Drop all items into the belly + for(var/obj/item/W in M) + if(!M.dropItemToGround(W)) + qdel(W) + +/* //Reagent transfer //maybe someday + if(ishuman(owner)) + var/mob/living/carbon/human/Pred = owner + if(ishuman(M)) + var/mob/living/carbon/human/Prey = M + Prey.bloodstr.del_reagent("numbenzyme") + Prey.bloodstr.trans_to_holder(Pred.bloodstr, Prey.bloodstr.total_volume, 0.5, TRUE) // Copy=TRUE because we're deleted anyway + Prey.ingested.trans_to_holder(Pred.bloodstr, Prey.ingested.total_volume, 0.5, TRUE) // Therefore don't bother spending cpu + Prey.touching.trans_to_holder(Pred.bloodstr, Prey.touching.total_volume, 0.5, TRUE) // On updating the prey's reagents + else if(M.reagents) + M.reagents.trans_to_holder(Pred.bloodstr, M.reagents.total_volume, 0.5, TRUE) */ + + // Delete the digested mob + qdel(M) + +// Handle a mob being absorbed +/obj/belly/proc/absorb_living(var/mob/living/M) + M.absorbed = TRUE + to_chat(M,"[owner]'s [lowertext(name)] absorbs your body, making you part of them.") + to_chat(owner,"Your [lowertext(name)] absorbs [M]'s body, making them part of you.") + +// Reagent sharing is neat, but eh. I'll figure it out later +/* if(ishuman(M) && ishuman(owner)) + var/mob/living/carbon/human/Prey = M + var/mob/living/carbon/human/Pred = owner + //Reagent sharing for absorbed with pred - Copy so both pred and prey have these reagents. + Prey.bloodstr.trans_to_holder(Pred.bloodstr, Prey.bloodstr.total_volume, copy = TRUE) + Prey.ingested.trans_to_holder(Pred.bloodstr, Prey.ingested.total_volume, copy = TRUE) + Prey.touching.trans_to_holder(Pred.bloodstr, Prey.touching.total_volume, copy = TRUE) + // TODO - Find a way to make the absorbed prey share the effects with the pred. + // Currently this is infeasible because reagent containers are designed to have a single my_atom, and we get + // problems when A absorbs B, and then C absorbs A, resulting in B holding onto an invalid reagent container. +*/ + //This is probably already the case, but for sub-prey, it won't be. + if(M.loc != src) + M.forceMove(src) + + //Seek out absorbed prey of the prey, absorb them too. + //This in particular will recurse oddly because if there is absorbed prey of prey of prey... + //it will just move them up one belly. This should never happen though since... when they were + //absobred, they should have been absorbed as well! + for(var/belly in M.vore_organs) + var/obj/belly/B = belly + for(var/mob/living/Mm in B) + if(Mm.absorbed) + absorb_living(Mm) + + //Update owner + owner.updateVRPanel() + +//Digest a single item +//Receives a return value from digest_act that's how much nutrition +//the item should be worth +/obj/belly/proc/digest_item(var/obj/item/item) + var/digested = item.digest_act(src, owner) + if(!digested) + items_preserved |= item + else +// owner.nutrition += (5 * digested) // haha no. + if(iscyborg(owner)) + var/mob/living/silicon/robot/R = owner + R.cell.charge += (50 * digested) + +//Determine where items should fall out of us into. +//Typically just to the owner's location. +/obj/belly/drop_location() + //Should be the case 99.99% of the time + if(owner) + return owner.loc + //Sketchy fallback for safety, put them somewhere safe. + else if(ismob(src)) + testing("[src] (\ref[src]) doesn't have an owner, and dropped someone at a latespawn point!") + SSjob.SendToLateJoin(src) + // wew lad. let's see if this never gets used, hopefully + else + qdel(src) //final option, I guess. + testing("[src] (\ref[src]) was QDEL'd for not having a drop_location!") + +//Handle a mob struggling +// Called from /mob/living/carbon/relaymove() +/obj/belly/proc/relay_resist(var/mob/living/R) + if (!(R in contents)) + return // User is not in this belly + + R.setClickCooldown(50) + + if(owner.stat || !owner.client && R.a_intent != INTENT_HELP) //If owner is stat (dead, KO) we can actually escape + to_chat(R,"You attempt to climb out of \the [lowertext(name)]. (This will take around 5 seconds.)") + to_chat(owner,"Someone is attempting to climb out of your [lowertext(name)]!") + + if(do_after(R, 50, owner)) + if(owner.stat && (R in contents) && R.a_intent != INTENT_HELP) //Can still escape and want to? + release_specific_contents(R) + return + else if(!(R in contents)) //Aren't even in the belly. Quietly fail. + return + else //Belly became inescapable or mob revived + to_chat(R,"Your attempt to escape [lowertext(name)] has failed!") + to_chat(owner,"The attempt to escape from your [lowertext(name)] has failed!") + return + return + var/struggle_outer_message = pick(struggle_messages_outside) + var/struggle_user_message = pick(struggle_messages_inside) + + struggle_outer_message = replacetext(struggle_outer_message,"%pred",owner) + struggle_outer_message = replacetext(struggle_outer_message,"%prey",R) + struggle_outer_message = replacetext(struggle_outer_message,"%belly",lowertext(name)) + + struggle_user_message = replacetext(struggle_user_message,"%pred",owner) + struggle_user_message = replacetext(struggle_user_message,"%prey",R) + struggle_user_message = replacetext(struggle_user_message,"%belly",lowertext(name)) + + struggle_outer_message = "" + struggle_outer_message + "" + struggle_user_message = "" + struggle_user_message + "" + + for(var/mob/M in get_hearers_in_view(3, get_turf(owner))) + M.show_message(struggle_outer_message, 2) // hearable + to_chat(R,struggle_user_message) + + if(!silent) + for(var/mob/M in get_hearers_in_view(5, get_turf(owner))) + if(M.client && M.client.prefs.toggles & EATING_NOISES) + playsound(get_turf(owner),"struggle_sound",35,0,-5,1,ignore_walls = FALSE,channel=CHANNEL_PRED) + R.stop_sound_channel(CHANNEL_PRED) + var/sound/prey_struggle = sound(get_sfx("prey_struggle")) + R.playsound_local(get_turf(R),prey_struggle,45,0) + + if(R.a_intent != INTENT_HELP) //If on non help intent + to_chat(R,"You start to climb out of \the [lowertext(name)].") + to_chat(owner,"Someone is attempting to climb out of your [lowertext(name)]!") + if(do_after(R, escapetime, owner)) + if((owner.stat || !owner.client || escapable) && (R in contents)) + release_specific_contents(R) + to_chat(R,"You climb out of \the [lowertext(name)].") + to_chat(owner,"[R] climbs out of your [lowertext(name)]!") + for(var/mob/M in hearers(4, owner)) + M.show_message("[R] climbs out of [owner]'s [lowertext(name)]!", 2) + return + else if(!istype(loc, /obj/belly)) //Aren't even in the belly. Quietly fail. + return + else //Belly became inescapable. + to_chat(R,"Your attempt to escape [lowertext(name)] has failed!") + to_chat(owner,"The attempt to escape from your [lowertext(name)] has failed!") + return + + else if(prob(transferchance) && transferlocation) //Next, let's have it see if they end up getting into an even bigger mess then when they started. + var/obj/belly/dest_belly + for(var/belly in owner.vore_organs) + var/obj/belly/B = belly + if(B.name == transferlocation) + dest_belly = B + break + if(!dest_belly) + to_chat(owner, "Something went wrong with your belly transfer settings. Your [lowertext(name)] has had it's transfer chance and transfer location cleared as a precaution.") + transferchance = 0 + transferlocation = null + return + + to_chat(R,"Your attempt to escape [lowertext(name)] has failed and your struggles only results in you sliding into [owner]'s [transferlocation]!") + to_chat(owner,"Someone slid into your [transferlocation] due to their struggling inside your [lowertext(name)]!") + transfer_contents(R, dest_belly) + return +/* + else if(prob(absorbchance) && digest_mode != DM_ABSORB) //After that, let's have it run the absorb chance. + to_chat(R,"In response to your struggling, \the [lowertext(name)] begins to cling more tightly...") + to_chat(owner,"You feel your [lowertext(name)] start to cling onto its contents...") + digest_mode = DM_ABSORB + return + + else if(prob(digestchance) && digest_mode != DM_ITEMWEAK && digest_mode != DM_DIGEST) //Finally, let's see if it should run the digest chance. + to_chat(R,"In response to your struggling, \the [lowertext(name)] begins to get more active...") + to_chat(owner,"You feel your [lowertext(name)] beginning to become active!") + digest_mode = DM_ITEMWEAK + return + + else if(prob(digestchance) && digest_mode == DM_ITEMWEAK) //Oh god it gets even worse if you fail twice! + to_chat(R,"In response to your struggling, \the [lowertext(name)] begins to get even more active!") + to_chat(owner,"You feel your [lowertext(name)] beginning to become even more active!") + digest_mode = DM_DIGEST + return */ + else if(prob(digestchance)) //Finally, let's see if it should run the digest chance.) + to_chat(R, "In response to your struggling, \the [name] begins to get more active...") + to_chat(owner, "You feel your [name] beginning to become active!") + digest_mode = DM_DIGEST + return + + else //Nothing interesting happened. + to_chat(R,"You make no progress in escaping [owner]'s [lowertext(name)].") + to_chat(owner,"Your prey appears to be unable to make any progress in escaping your [lowertext(name)].") + return + +//Transfers contents from one belly to another +/obj/belly/proc/transfer_contents(var/atom/movable/content, var/obj/belly/target, silent = FALSE) + if(!(content in src) || !istype(target)) + return + target.nom_mob(content, target.owner) + if(!silent) + for(var/mob/M in get_hearers_in_view(5, get_turf(owner))) + if(M.client && M.client.prefs.toggles & EATING_NOISES) + playsound(get_turf(owner),"[src.vore_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED) + owner.updateVRPanel() + for(var/mob/living/M in contents) + M.updateVRPanel() + +// Belly copies and then returns the copy +// Needs to be updated for any var changes +/obj/belly/proc/copy(mob/new_owner) + var/obj/belly/dupe = new /obj/belly(new_owner) + + //// Non-object variables + dupe.name = name + dupe.desc = desc + dupe.vore_sound = vore_sound + dupe.vore_verb = vore_verb + dupe.release_sound = release_sound + dupe.human_prey_swallow_time = human_prey_swallow_time + dupe.nonhuman_prey_swallow_time = nonhuman_prey_swallow_time + dupe.emote_time = emote_time + dupe.digest_brute = digest_brute + dupe.digest_burn = digest_burn + dupe.immutable = immutable + dupe.can_taste = can_taste + dupe.escapable = escapable + dupe.escapetime = escapetime + dupe.digestchance = digestchance + dupe.absorbchance = absorbchance + dupe.escapechance = escapechance + dupe.transferchance = transferchance + dupe.transferlocation = transferlocation + dupe.bulge_size = bulge_size +// dupe.shrink_grow_size = shrink_grow_size + + //// Object-holding variables + //struggle_messages_outside - strings + dupe.struggle_messages_outside.Cut() + for(var/I in struggle_messages_outside) + dupe.struggle_messages_outside += I + + //struggle_messages_inside - strings + dupe.struggle_messages_inside.Cut() + for(var/I in struggle_messages_inside) + dupe.struggle_messages_inside += I + + //digest_messages_owner - strings + dupe.digest_messages_owner.Cut() + for(var/I in digest_messages_owner) + dupe.digest_messages_owner += I + + //digest_messages_prey - strings + dupe.digest_messages_prey.Cut() + for(var/I in digest_messages_prey) + dupe.digest_messages_prey += I + + //examine_messages - strings + dupe.examine_messages.Cut() + for(var/I in examine_messages) + dupe.examine_messages += I + + //emote_lists - index: digest mode, key: list of strings + dupe.emote_lists.Cut() + for(var/K in emote_lists) + dupe.emote_lists[K] = list() + for(var/I in emote_lists[K]) + dupe.emote_lists[K] += I + dupe.silent = silent + + return dupe diff --git a/code/modules/vore/eating/belly_vr.dm b/code/modules/vore/eating/belly_vr.dm deleted file mode 100644 index d175f51e02..0000000000 --- a/code/modules/vore/eating/belly_vr.dm +++ /dev/null @@ -1,467 +0,0 @@ -// -// The belly object is what holds onto a mob while they're inside a predator. -// It takes care of altering the pred's decription, digesting the prey, relaying struggles etc. -// - -// If you change what variables are on this, then you need to update the copy() proc. - -// -// Parent type of all the various "belly" varieties. -// -/datum/belly - var/name // Name of this location - var/inside_flavor // Flavor text description of inside sight/sound/smells/feels. - var/vore_sound = 'sound/vore/pred/swallow_01.ogg' // Sound when ingesting someone - var/vore_verb = "ingest" // Verb for eating with this in messages - var/human_prey_swallow_time = 10 SECONDS // Time in deciseconds to swallow /mob/living/carbon/human - var/nonhuman_prey_swallow_time = 5 SECONDS // Time in deciseconds to swallow anything else - var/emoteTime = 30 SECONDS // How long between stomach emotes at prey - var/digest_brute = 0 // Brute damage per tick in digestion mode - var/digest_burn = 1 // Burn damage per tick in digestion mode - var/digest_tickrate = 9 // Modulus this of air controller tick number to iterate gurgles on - var/immutable = FALSE // Prevents this belly from being deleted - var/escapable = FALSE // Belly can be resisted out of at any time - var/escapetime = 60 SECONDS // Deciseconds, how long to escape this belly - var/digestchance = 0 // % Chance of stomach beginning to digest if prey struggles -// var/silenced = FALSE // Will the heartbeat/fleshy internal loop play? - var/escapechance = 0 // % Chance of prey beginning to escape if prey struggles. - - var/datum/belly/transferlocation = null // Location that the prey is released if they struggle and get dropped off. - var/transferchance = 0 // % Chance of prey being transferred to transfer location when resisting - var/autotransferchance = 0 // % Chance of prey being autotransferred to transfer location - var/autotransferwait = 10 // Time between trying to transfer. - var/can_taste = FALSE // If this belly prints the flavor of prey when it eats someone. - - var/tmp/digest_mode = DM_HOLD // Whether or not to digest. Default to not digest. - var/tmp/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_HEAL,DM_NOISY) // Possible digest modes - var/tmp/mob/living/owner // The mob whose belly this is. - var/tmp/list/internal_contents = list() // People/Things you've eaten into this belly! - var/tmp/is_full // Flag for if digested remeans are present. (for disposal messages) - var/tmp/emotePend = FALSE // If there's already a spawned thing counting for the next emote - var/swallow_time = 10 SECONDS // for mob transfering automation - var/vore_capacity = 1 // The capacity (in people) this person can hold - - // Don't forget to watch your commas at the end of each line if you change these. - var/list/struggle_messages_outside = list( - "%pred's %belly wobbles with a squirming meal.", - "%pred's %belly jostles with movement.", - "%pred's %belly briefly swells outward as someone pushes from inside.", - "%pred's %belly fidgets with a trapped victim.", - "%pred's %belly jiggles with motion from inside.", - "%pred's %belly sloshes around.", - "%pred's %belly gushes softly.", - "%pred's %belly lets out a wet squelch.") - - var/list/struggle_messages_inside = list( - "Your useless squirming only causes %pred's slimy %belly to squelch over your body.", - "Your struggles only cause %pred's %belly to gush softly around you.", - "Your movement only causes %pred's %belly to slosh around you.", - "Your motion causes %pred's %belly to jiggle.", - "You fidget around inside of %pred's %belly.", - "You shove against the walls of %pred's %belly, making it briefly swell outward.", - "You jostle %pred's %belly with movement.", - "You squirm inside of %pred's %belly, making it wobble around.") - - var/list/digest_messages_owner = list( - "You feel %prey's body succumb to your digestive system, which breaks it apart into soft slurry.", - "You hear a lewd glorp as your %belly muscles grind %prey into a warm pulp.", - "Your %belly lets out a rumble as it melts %prey into sludge.", - "You feel a soft gurgle as %prey's body loses form in your %belly. They're nothing but a soft mass of churning slop now.", - "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your thighs.", - "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your rump.", - "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your belly.", - "Your %belly groans as %prey falls apart into a thick soup. You can feel their remains soon flowing deeper into your body to be absorbed.", - "Your %belly kneads on every fiber of %prey, softening them down into mush to fuel your next hunt.", - "Your %belly churns %prey down into a hot slush. You can feel the nutrients coursing through your digestive track with a series of long, wet glorps.") - - var/list/digest_messages_prey = list( - "Your body succumbs to %pred's digestive system, which breaks you apart into soft slurry.", - "%pred's %belly lets out a lewd glorp as their muscles grind you into a warm pulp.", - "%pred's %belly lets out a rumble as it melts you into sludge.", - "%pred feels a soft gurgle as your body loses form in their %belly. You're nothing but a soft mass of churning slop now.", - "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's thighs.", - "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's rump.", - "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's belly.", - "%pred's %belly groans as you fall apart into a thick soup. Your remains soon flow deeper into %pred's body to be absorbed.", - "%pred's %belly kneads on every fiber of your body, softening you down into mush to fuel their next hunt.", - "%pred's %belly churns you down into a hot slush. Your nutrient-rich remains course through their digestive track with a series of long, wet glorps.") - - var/list/examine_messages = list( - "They have something solid in their %belly!", - "It looks like they have something in their %belly!") - - //Mostly for being overridden on precreated bellies on mobs. Could be VV'd into - //a carbon's belly if someone really wanted. No UI for carbons to adjust this. - //List has indexes that are the digestion mode strings, and keys that are lists of strings. - var/list/emote_lists = list() - -// Constructor that sets the owning mob -/datum/belly/New(var/mob/living/owning_mob) - owner = owning_mob - -// Toggle digestion on/off and notify user of the new setting. -// If multiple digestion modes are avaliable (i.e. unbirth) then user should be prompted. -/datum/belly/proc/toggle_digestion() - return - -// Checks if any mobs are present inside the belly -// return True if the belly is empty. -/datum/belly/proc/is_empty() - return internal_contents.len == 0 - -// Release all contents of this belly into the owning mob's location. -// If that location is another mob, contents are transferred into whichever of its bellies the owning mob is in. -// Returns the number of mobs so released. -/datum/belly/proc/release_all_contents() - if (internal_contents.len == 0) - return 0 - for (var/atom/movable/M in internal_contents) - M.forceMove(owner.loc) // Move the belly contents into the same location as belly's owner. - for(var/mob/living/W in M) - W.stop_sound_channel(CHANNEL_PREYLOOP) - internal_contents.Remove(M) // Remove from the belly contents - - var/datum/belly/B = check_belly(owner) // This makes sure that the mob behaves properly if released into another mob - if(B) - B.internal_contents.Add(M) - - owner.visible_message("[owner] expels everything from their [lowertext(name)]!") - return TRUE - -// Release a specific atom from the contents of this belly into the owning mob's location. -// If that location is another mob, the atom is transferred into whichever of its bellies the owning mob is in. -// Returns the number of atoms so released. -/datum/belly/proc/release_specific_contents(var/atom/movable/M) - if (!(M in internal_contents)) - return FALSE // They weren't in this belly anyway - - M.forceMove(owner.loc) // Move the belly contents into the same location as belly's owner. - for(var/mob/living/W in M) - W.stop_sound_channel(CHANNEL_PREYLOOP) - src.internal_contents.Remove(M) // Remove from the belly contents - - var/datum/belly/B = check_belly(owner) - if(B) - B.internal_contents.Add(M) - - owner.visible_message("[owner] expels [M] from their [lowertext(name)]!") -// owner.regenerate_icons() - return TRUE - -// Actually perform the mechanics of devouring the tasty prey. -// The purpose of this method is to avoid duplicate code, and ensure that all necessary -// steps are taken. -/datum/belly/proc/nom_mob(var/mob/prey, var/mob/user) - var/sound/preyloop = sound('sound/vore/prey/loop.ogg', repeat = TRUE) - - prey.forceMove(owner) - internal_contents.Add(prey) - prey.playsound_local(get_turf(prey),preyloop,40,0, channel = CHANNEL_PREYLOOP) - - // Handle prey messages - if(inside_flavor) - to_chat(prey, "[src.inside_flavor]") - if(isliving(prey)) - var/mob/living/M = prey - if(can_taste && M.get_taste_message(0)) - to_chat(owner, "[M] tastes of [M.get_taste_message(0)].") - - // Setup the autotransfer checks if needed - if(transferlocation && autotransferchance > 0) - addtimer(CALLBACK(src, /datum/belly/.proc/check_autotransfer, prey), autotransferwait) - -/datum/belly/proc/check_autotransfer(var/mob/prey) - // Some sanity checks - if(transferlocation && (autotransferchance > 0) && (prey in internal_contents)) - if(prob(autotransferchance)) - // Double check transferlocation isn't insane - if(verify_transferlocation()) - transfer_contents(prey, transferlocation) - else - // Didn't transfer, so wait before retrying - addtimer(CALLBACK(src, /datum/belly/.proc/check_autotransfer, prey), autotransferwait) - -/datum/belly/proc/verify_transferlocation() - for(var/I in owner.vore_organs) - var/datum/belly/B = owner.vore_organs[I] - if(B == transferlocation) - return TRUE - - for(var/I in owner.vore_organs) - var/datum/belly/B = owner.vore_organs[I] - if(B.name == transferlocation.name) - transferlocation = B - return TRUE - return FALSE - -// Get the line that should show up in Examine message if the owner of this belly -// is examined. By making this a proc, we not only take advantage of polymorphism, -// but can easily make the message vary based on how many people are inside, etc. -// Returns a string which shoul be appended to the Examine output. -/datum/belly/proc/get_examine_msg() - if(internal_contents.len && examine_messages.len) - var/formatted_message - var/raw_message = pick(examine_messages) - - formatted_message = replacetext(raw_message,"%belly",lowertext(name)) - formatted_message = replacetext(formatted_message,"%pred",owner) - formatted_message = replacetext(formatted_message,"%prey",english_list(internal_contents)) - - return("[formatted_message]
") - -// The next function gets the messages set on the belly, in human-readable format. -// This is useful in customization boxes and such. The delimiter right now is \n\n so -// in message boxes, this looks nice and is easily delimited. -/datum/belly/proc/get_messages(var/type, var/delim = "\n\n") - ASSERT(type == "smo" || type == "smi" || type == "dmo" || type == "dmp" || type == "em") - var/list/raw_messages - - switch(type) - if("smo") - raw_messages = struggle_messages_outside - if("smi") - raw_messages = struggle_messages_inside - if("dmo") - raw_messages = digest_messages_owner - if("dmp") - raw_messages = digest_messages_prey - if("em") - raw_messages = examine_messages - - var/messages = list2text(raw_messages,delim) - return messages - -// The next function sets the messages on the belly, from human-readable var -// replacement strings and linebreaks as delimiters (two \n\n by default). -// They also sanitize the messages. -/datum/belly/proc/set_messages(var/raw_text, var/type, var/delim = "\n\n") - ASSERT(type == "smo" || type == "smi" || type == "dmo" || type == "dmp" || type == "em") - - var/list/raw_list = text2list(html_encode(raw_text),delim) - if(raw_list.len > 10) - raw_list.Cut(11) - - for(var/i = 1, i <= raw_list.len, i++) - if(length(raw_list[i]) > 160 || length(raw_list[i]) < 10) //160 is fudged value due to htmlencoding increasing the size - raw_list.Cut(i,i) - else - raw_list[i] = readd_quotes(raw_list[i]) - //Also fix % sign for var replacement - raw_list[i] = replacetext(raw_list[i],"%","%") - - ASSERT(raw_list.len <= 10) //Sanity - - switch(type) - if("smo") - struggle_messages_outside = raw_list - if("smi") - struggle_messages_inside = raw_list - if("dmo") - digest_messages_owner = raw_list - if("dmp") - digest_messages_prey = raw_list - if("em") - examine_messages = raw_list - - return - -// Handle the death of a mob via digestion. -// Called from the process_Life() methods of bellies that digest prey. -// Default implementation calls M.death() and removes from internal contents. -// Indigestable items are removed, and M is deleted. -/datum/belly/proc/digestion_death(var/mob/living/M) - is_full = TRUE - internal_contents.Remove(M) - M.stop_sound_channel(CHANNEL_PREYLOOP) - // If digested prey is also a pred... anyone inside their bellies gets moved up. - if(is_vore_predator(M)) - for(var/bellytype in M.vore_organs) - var/datum/belly/belly = M.vore_organs[bellytype] - for (var/obj/thing in belly.internal_contents) - thing.loc = owner - internal_contents.Add(thing) - for (var/mob/subprey in belly.internal_contents) - subprey.loc = owner - internal_contents.Add(subprey) - to_chat(subprey, "As [M] melts away around you, you find yourself in [owner]'s [name]") - - //Drop all items into the belly - for(var/obj/item/W in M) - if(!M.dropItemToGround(W)) - qdel(W) - - message_admins("[key_name(owner)] digested [key_name(M)].") - log_attack("[key_name(owner)] digested [key_name(M)].") - - // Delete the digested mob - qdel(M) - -//Handle a mob struggling -// Called from /mob/living/carbon/relaymove() -/datum/belly/proc/relay_resist(var/mob/living/R) - if (!(R in internal_contents)) - return // User is not in this belly, or struggle too soon. - - R.setClickCooldown(50) - var/sound/prey_struggle = sound(get_sfx("prey_struggle")) - - if(owner.stat) //If owner is stat (dead, KO) we can actually escape - to_chat(R, "You attempt to climb out of \the [name]. (This will take around [escapetime/10] seconds.)") - to_chat(owner, "Someone is attempting to climb out of your [name]!") - - if(do_after(R, escapetime, owner)) - if((owner.stat || escapable) && (R in internal_contents)) //Can still escape? - release_specific_contents(R) - return - else if(!(R in internal_contents)) //Aren't even in the belly. Quietly fail. - return - else //Belly became inescapable or mob revived - to_chat(R, "Your attempt to escape [name] has failed!") - to_chat(owner, "The attempt to escape from your [name] has failed!") - return - return - var/struggle_outer_message = pick(struggle_messages_outside) - var/struggle_user_message = pick(struggle_messages_inside) - - struggle_outer_message = replacetext(struggle_outer_message,"%pred",owner) - struggle_outer_message = replacetext(struggle_outer_message,"%prey",R) - struggle_outer_message = replacetext(struggle_outer_message,"%belly",lowertext(name)) - - struggle_user_message = replacetext(struggle_user_message,"%pred",owner) - struggle_user_message = replacetext(struggle_user_message,"%prey",R) - struggle_user_message = replacetext(struggle_user_message,"%belly",lowertext(name)) - - struggle_outer_message = "" + struggle_outer_message + "" - struggle_user_message = "" + struggle_user_message + "" - - R.visible_message( "[struggle_outer_message]", "[struggle_user_message]") - playsound(get_turf(owner),"struggle_sound",35,0,-6,1,channel=151,ignore_walls = FALSE) - R.stop_sound_channel(151) - R.playsound_local(get_turf(R),prey_struggle,45,0) - - if(escapable && R.a_intent != "help") //If the stomach has escapable enabled and the person is actually trying to kick out - to_chat(R, "You attempt to climb out of \the [name].") - to_chat(owner, "Someone is attempting to climb out of your [name]!") - if(prob(escapechance)) //Let's have it check to see if the prey escapes first. - if(do_after(R, escapetime)) - if((escapable) && (R in internal_contents)) //Does the owner still have escapable enabled? - release_specific_contents(R) - to_chat(R, "You climb out of \the [name].") - to_chat(owner, "[R] climbs out of your [name]!") - for(var/mob/M in viewers(4, owner)) - M.visible_message("[R] climbs out of [owner]'s [name]!", 2) - return - else if(!(R in internal_contents)) //Aren't even in the belly. Quietly fail. - return - else //Belly became inescapable. - to_chat(R, "Your attempt to escape [name] has failed!") - to_chat(owner, "The attempt to escape from your [name] has failed!/span>") - return - - else if(prob(transferchance) && istype(transferlocation)) //Next, let's have it see if they end up getting into an even bigger mess then when they started. - var/location_ok = verify_transferlocation() - - if(!location_ok) - to_chat(owner, "Something went wrong with your belly transfer settings.") - transferlocation = null - return - - to_chat(R, "Your attempt to escape [name] has failed and your struggles only results in you sliding into [owner]'s [transferlocation]!") - to_chat(owner, "Someone slid into your [transferlocation] due to their struggling inside your [name]!") - transfer_contents(R, transferlocation) - return - - else if(prob(digestchance)) //Finally, let's see if it should run the digest chance.) - to_chat(R, "In response to your struggling, \the [name] begins to get more active...") - to_chat(owner, "You feel your [name] beginning to become active!") - digest_mode = DM_DIGEST - return - else //Nothing interesting happened. - to_chat(R, "But make no progress in escaping [owner]'s [name].") - to_chat(owner, "But appears to be unable to make any progress in escaping your [name].") - return - -//Transfers contents from one belly to another -/datum/belly/proc/transfer_contents(var/atom/movable/content, var/datum/belly/target, silent = 0) - if(!(content in internal_contents)) - return - internal_contents.Remove(content) - // Re-use nom_mob - target.nom_mob(content, target.owner) - if(!silent) - playsound(get_turf(owner),"[target].vore_sound",35,0,-6,1,ignore_walls = FALSE) -/* -//Handles creation of temporary 'vore chest' upon digestion -/datum/belly/proc/slimy_mass(var/obj/item/content, var/mob/living/M) - if(!content in internal_contents) - return - internal_contents += new /obj/structure/closet/crate/vore(src) - internal_contents.Remove(content) - M.transferItemToLoc(content, /obj/structure/closet/crate/vore) - if(!M.transferItemToLoc(W)) - qdel(W) - -/datum/belly/proc/regurgitate_items(var/obj/structure/closet/crate/vore/C) - */ - -// Belly copies and then returns the copy -// Needs to be updated for any var changes -/datum/belly/proc/copy(mob/new_owner) - var/datum/belly/dupe = new /datum/belly(new_owner) - - //// Non-object variables - dupe.name = name - dupe.inside_flavor = inside_flavor - dupe.vore_sound = vore_sound - dupe.vore_verb = vore_verb - dupe.human_prey_swallow_time = human_prey_swallow_time - dupe.nonhuman_prey_swallow_time = nonhuman_prey_swallow_time - dupe.emoteTime = emoteTime - dupe.digest_brute = digest_brute - dupe.digest_burn = digest_burn - dupe.digest_tickrate = digest_tickrate - dupe.immutable = immutable - dupe.can_taste = can_taste - dupe.escapable = escapable - dupe.escapetime = escapetime - dupe.digestchance = digestchance - dupe.escapechance = escapechance - dupe.transferchance = transferchance - dupe.transferlocation = transferlocation - dupe.autotransferchance = autotransferchance - dupe.autotransferwait = autotransferwait - - //// Object-holding variables - //struggle_messages_outside - strings - dupe.struggle_messages_outside.Cut() - for(var/I in struggle_messages_outside) - dupe.struggle_messages_outside += I - - //struggle_messages_inside - strings - dupe.struggle_messages_inside.Cut() - for(var/I in struggle_messages_inside) - dupe.struggle_messages_inside += I - - //digest_messages_owner - strings - dupe.digest_messages_owner.Cut() - for(var/I in digest_messages_owner) - dupe.digest_messages_owner += I - - //digest_messages_prey - strings - dupe.digest_messages_prey.Cut() - for(var/I in digest_messages_prey) - dupe.digest_messages_prey += I - - //examine_messages - strings - dupe.examine_messages.Cut() - for(var/I in examine_messages) - dupe.examine_messages += I - - //emote_lists - index: digest mode, key: list of strings - dupe.emote_lists.Cut() - for(var/K in emote_lists) - dupe.emote_lists[K] = list() - for(var/I in emote_lists[K]) - dupe.emote_lists[K] += I - - return dupe diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm index 3d00f9e0fe..3260e2ae99 100644 --- a/code/modules/vore/eating/bellymodes_vr.dm +++ b/code/modules/vore/eating/bellymodes_vr.dm @@ -1,34 +1,53 @@ // Process the predator's effects upon the contents of its belly (i.e digestion/transformation etc) -// Called from /mob/living/Life() proc. -/datum/belly/proc/process_Life() - var/sound/prey_gurgle = sound(get_sfx("digest_prey")) - var/sound/prey_digest = sound(get_sfx("death_prey")) +/obj/belly/proc/process_belly(var/times_fired,var/wait) //Passed by controller + if((times_fired < next_process) || !contents.len) + recent_sound = FALSE + return SSBELLIES_IGNORED + + if(loc != owner) + if(istype(owner)) + loc = owner + else + qdel(src) + return SSBELLIES_PROCESSED + + next_process = times_fired + (6 SECONDS/wait) //Set up our next process time. /////////////////////////// Auto-Emotes /////////////////////////// - if((digest_mode in emote_lists) && !emotePend) - emotePend = TRUE + if(contents.len && next_emote <= times_fired) + next_emote = times_fired + round(emote_time/wait,1) + var/list/EL = emote_lists[digest_mode] + for(var/mob/living/M in contents) + if(M.digestable || !(digest_mode == DM_DIGEST)) // don't give digesty messages to indigestible people + to_chat(M,"[pick(EL)]") + +/////////////////////////// Exit Early //////////////////////////// + var/list/touchable_items = contents - items_preserved + if(!length(touchable_items)) + return SSBELLIES_PROCESSED + +////////////////////////// Sound vars ///////////////////////////// + var/sound/prey_digest = sound(get_sfx("digest_prey")) + var/sound/prey_death = sound(get_sfx("death_prey")) - spawn(emoteTime) - var/list/EL = emote_lists[digest_mode] - for(var/mob/living/M in internal_contents) - M << "[pick(EL)]" - src.emotePend = FALSE ///////////////////////////// DM_HOLD ///////////////////////////// if(digest_mode == DM_HOLD) - return //Pretty boring, huh + return SSBELLIES_PROCESSED //////////////////////////// DM_DIGEST //////////////////////////// - if(digest_mode == DM_DIGEST) - for (var/mob/living/M in internal_contents) + else if(digest_mode == DM_DIGEST) + for (var/mob/living/M in contents) if(prob(25)) - M.stop_sound_channel(CHANNEL_PRED) - playsound(get_turf(owner),"digest_pred",50,0,-6,0,channel=CHANNEL_PRED,ignore_walls = FALSE) - M.stop_sound_channel(CHANNEL_PRED) - M.playsound_local(get_turf(M), null, 45, S = prey_gurgle) + M.stop_sound_channel(CHANNEL_DIGEST) + for(var/mob/H in get_hearers_in_view(5, get_turf(owner))) + if(H.client && H.client.prefs.toggles & DIGESTION_NOISES) + playsound(get_turf(owner),"digest_pred",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_DIGEST) + M.stop_sound_channel(CHANNEL_DIGEST) + M.playsound_local(get_turf(M), prey_digest, 45) //Pref protection! - if (!M.digestable) + if (!M.digestable || M.absorbed) continue //Person just died in guts! @@ -51,10 +70,13 @@ M.visible_message("You watch as [owner]'s form loses its additions.") owner.nutrition += 400 // so eating dead mobs gives you *something*. - M.stop_sound_channel(CHANNEL_PRED) - playsound(get_turf(owner),"death_pred",45,0,-6,0,channel=CHANNEL_PRED,ignore_walls = FALSE) - M.stop_sound_channel(CHANNEL_PRED) - M.playsound_local(get_turf(M), null, 45, S = prey_digest) + M.stop_sound_channel(DIGESTION_NOISES) + for(var/mob/H in get_hearers_in_view(5, get_turf(owner))) + if(H.client && H.client.prefs.toggles & DIGESTION_NOISES) + playsound(get_turf(owner),"death_pred",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_DIGEST) + M.stop_sound_channel(DIGESTION_NOISES) + M.stop_sound_channel(CHANNEL_PREYLOOP) + M.playsound_local(get_turf(M), prey_death, 65) digestion_death(M) owner.update_icons() continue @@ -64,44 +86,57 @@ if(!(M.status_flags & GODMODE)) M.adjustFireLoss(digest_burn) owner.nutrition += 1 - return + + //Contaminate or gurgle items + var/obj/item/T = pick(touchable_items) + if(istype(T)) + if(istype(T,/obj/item/reagent_containers/food) || istype(T,/obj/item/organ)) + digest_item(T) + + owner.updateVRPanel() ///////////////////////////// DM_HEAL ///////////////////////////// if(digest_mode == DM_HEAL) - for (var/mob/living/M in internal_contents) + for (var/mob/living/M in contents) if(prob(25)) - M.stop_sound_channel(CHANNEL_PRED) - playsound(get_turf(owner),"digest_pred",35,0,-6,0,channel=CHANNEL_PRED,ignore_walls = FALSE) - M.stop_sound_channel(CHANNEL_PRED) - M.playsound_local(get_turf(M), null, 45, S = prey_gurgle) + M.stop_sound_channel(CHANNEL_DIGEST) + for(var/mob/H in get_hearers_in_view(5, get_turf(owner))) + if(H.client && H.client.prefs.toggles & DIGESTION_NOISES) + playsound(get_turf(owner),"digest_pred",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_DIGEST) + M.stop_sound_channel(CHANNEL_DIGEST) + M.playsound_local(get_turf(M), prey_digest, 65) if(M.stat != DEAD) if(owner.nutrition >= NUTRITION_LEVEL_STARVING && (M.health < M.maxHealth)) - M.adjustBruteLoss(-1) - M.adjustFireLoss(-1) - owner.nutrition -= 10 + M.adjustBruteLoss(-3) + M.adjustFireLoss(-3) + owner.nutrition -= 5 return ////////////////////////// DM_NOISY ///////////////////////////////// //for when you just want people to squelch around if(digest_mode == DM_NOISY) - for (var/mob/living/M in internal_contents) + for (var/mob/living/M in contents) if(prob(35)) + M.stop_sound_channel(CHANNEL_DIGEST) + for(var/mob/H in get_hearers_in_view(5, get_turf(owner))) + if(H.client && H.client.prefs.toggles & DIGESTION_NOISES) + playsound(get_turf(owner),"digest_pred",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_DIGEST) M.stop_sound_channel(CHANNEL_PRED) - playsound(get_turf(owner),"digest_pred",35,0,-6,0,channel=CHANNEL_PRED,ignore_walls = FALSE) - M.stop_sound_channel(CHANNEL_PRED) - M.playsound_local(get_turf(M), null, 45, S = prey_gurgle) + M.playsound_local(get_turf(M), prey_digest, 65) //////////////////////////DM_DRAGON ///////////////////////////////////// //because dragons need snowflake guts if(digest_mode == DM_DRAGON) - for (var/mob/living/M in internal_contents) + for (var/mob/living/M in contents) if(prob(25)) - M.stop_sound_channel(CHANNEL_PRED) - playsound(get_turf(owner),"digest_pred",50,0,-6,0,channel=CHANNEL_PRED,ignore_walls = FALSE) - M.stop_sound_channel(CHANNEL_PRED) - M.playsound_local(get_turf(M), null, 45, S = prey_gurgle) + M.stop_sound_channel(CHANNEL_DIGEST) + for(var/mob/H in get_hearers_in_view(5, get_turf(owner))) + if(H.client && H.client.prefs.toggles & DIGESTION_NOISES) + playsound(get_turf(owner),"digest_pred",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_DIGEST) + M.stop_sound_channel(CHANNEL_DIGEST) + M.playsound_local(get_turf(M), prey_digest, 65) //No digestion protection for megafauna. @@ -124,12 +159,14 @@ to_chat(M, "[digest_alert_prey]") M.visible_message("You watch as [owner]'s guts loudly rumble as it finishes off a meal.") - M.stop_sound_channel(CHANNEL_PRED) - playsound(get_turf(owner),"death_pred",45,0,-6,0,channel=CHANNEL_PRED) - M.stop_sound_channel(CHANNEL_PRED) - M.playsound_local(get_turf(M), null, 45, S = prey_digest) + M.stop_sound_channel(CHANNEL_DIGEST) + for(var/mob/H in get_hearers_in_view(5, get_turf(owner))) + if(H.client && H.client.prefs.toggles & DIGESTION_NOISES) + playsound(get_turf(owner),"death_pred",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_DIGEST) + M.stop_sound_channel(CHANNEL_DIGEST) + M.playsound_local(get_turf(M), prey_death, 65) M.spill_organs(FALSE,TRUE,TRUE) - M << sound(null, repeat = 0, wait = 0, volume = 80, channel = CHANNEL_PREYLOOP) + M.stop_sound_channel(CHANNEL_PREYLOOP) digestion_death(M) owner.update_icons() continue @@ -138,6 +175,12 @@ // Deal digestion damage (and feed the pred) if(!(M.status_flags & GODMODE)) M.adjustFireLoss(digest_burn) - M.adjustToxLoss(4) // something something plasma based acids - M.adjustCloneLoss(3) // eventually this'll kill you if you're healing everything else, you nerds. - return \ No newline at end of file + M.adjustToxLoss(2) // something something plasma based acids + M.adjustCloneLoss(1) // eventually this'll kill you if you're healing everything else, you nerds. + //Contaminate or gurgle items + var/obj/item/T = pick(touchable_items) + if(istype(T)) + if(istype(T,/obj/item/reagent_containers/food) || istype(T,/obj/item/organ)) + digest_item(T) + + owner.updateVRPanel() \ No newline at end of file diff --git a/code/modules/vore/eating/digest_act_vr.dm b/code/modules/vore/eating/digest_act_vr.dm new file mode 100644 index 0000000000..faa458ad56 --- /dev/null +++ b/code/modules/vore/eating/digest_act_vr.dm @@ -0,0 +1,119 @@ +//Please make sure to: +//return FALSE: You are not going away, stop asking me to digest. +//return non-negative integer: Amount of nutrition/charge gained (scaled to nutrition, other end can multiply for charge scale). + +// Ye default implementation. +/obj/item/proc/digest_act(var/atom/movable/item_storage = null) + for(var/obj/item/O in contents) + if(istype(O,/obj/item/storage/internal)) //Dump contents from dummy pockets. + for(var/obj/item/SO in O) + if(item_storage) + SO.forceMove(item_storage) + qdel(O) + else if(item_storage) + O.forceMove(item_storage) + + qdel(src) + return w_class + +///////////// +// Some indigestible stuff +///////////// +/obj/item/hand_tele/digest_act(...) + return FALSE +/obj/item/card/id/digest_act(...) + return FALSE +/obj/item/aicard/digest_act(...) + return FALSE +/obj/item/paicard/digest_act(...) + return FALSE +/obj/item/pinpointer/digest_act(...) + return FALSE +/obj/item/disk/nuclear/digest_act(...) + return FALSE +/obj/item/device/perfect_tele_beacon/digest_act(...) + return FALSE //Sorta important to not digest your own beacons. +/obj/item/device/pda/digest_act(...) + return FALSE +/obj/item/gun/digest_act(...) + return FALSE +/obj/item/clothing/shoes/magboots/digest_act(...) + return FALSE +/obj/item/clothing/head/helmet/space/digest_act(...) + return FALSE +/obj/item/clothing/suit/space/digest_act(...) + return FALSE +/obj/item/reagent_containers/hypospray/CMO/digest_act(...) + return FALSE +/obj/item/tank/jetpack/oxygen/captain/digest_act(...) + return FALSE +/obj/item/clothing/accessory/medal/gold/captain/digest_act(...) + return FALSE +/obj/item/clothing/suit/armor/digest_act(...) + return FALSE +/obj/item/documents/digest_act(...) + return FALSE +/obj/item/nuke_core/digest_act(...) + return FALSE +/obj/item/nuke_core_container/digest_act(...) + return FALSE +/obj/item/areaeditor/blueprints/digest_act(...) + return FALSE +/obj/item/documents/syndicate/digest_act(...) + return FALSE +/obj/item/bombcore/digest_act(...) + return FALSE +/obj/item/grenade/digest_act(...) + return FALSE +/obj/item/storage/digest_act(...) + return FALSE + +///////////// +// Some special treatment +///////////// +/* +//PDAs need to lose their ID to not take it with them, so we can get a digested ID +/obj/item/device/pda/digest_act(var/atom/movable/item_storage = null) + if(id) + id = null + + . = ..() +*/ + +/obj/item/reagent_containers/food/digest_act(var/atom/movable/item_storage = null) + if(isbelly(item_storage)) + var/obj/belly/B = item_storage + if(ishuman(B.owner)) + var/mob/living/carbon/human/H = B.owner + reagents.trans_to(H, (reagents.total_volume * 0.3), 1, 0) + else if(iscyborg(B.owner)) + var/mob/living/silicon/robot/R = B.owner + R.cell.charge += 150 + + . = ..() + +/* +/obj/item/holder/digest_act(var/atom/movable/item_storage = null) + for(var/mob/living/M in contents) + if(item_storage) + M.forceMove(item_storage) + held_mob = null + + . = ..() */ + +/obj/item/organ/digest_act(var/atom/movable/item_storage = null) + if((. = ..())) + . += 70 //Organs give a little more + +/obj/item/storage/digest_act(var/atom/movable/item_storage = null) + for(var/obj/item/I in contents) + I.screen_loc = null + + . = ..() + +///////////// +// Some more complicated stuff +///////////// +/obj/item/device/mmi/digital/posibrain/digest_act(var/atom/movable/item_storage = null) + //Replace this with a VORE setting so all types of posibrains can/can't be digested on a whim + return FALSE diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm index 16a63c40ac..5b2ad312ab 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/code/modules/vore/eating/living_vr.dm @@ -1,23 +1,24 @@ ///////////////////// Mob Living ///////////////////// /mob/living var/digestable = TRUE // Can the mob be digested inside a belly? - var/datum/belly/vore_selected // Default to no vore capability. + var/obj/belly/vore_selected // Default to no vore capability. var/list/vore_organs = list() // List of vore containers inside a mob var/devourable = FALSE // Can the mob be vored at all? // var/feeding = FALSE // Are we going to feed someone else? var/vore_taste = null // What the character tastes like var/no_vore = FALSE // If the character/mob can vore. var/openpanel = 0 // Is the vore panel open? + var/noisy = FALSE // tummies are rumbly? + var/absorbed = FALSE //are we absorbed? // // Hook for generic creation of stuff on new creatures // /hook/living_new/proc/vore_setup(mob/living/M) - M.verbs += /mob/living/proc/lick M.verbs += /mob/living/proc/preyloop_refresh - if(M.no_vore) //If the mob isn's supposed to have a stomach, let's not give it an insidepanel so it can make one for itself, or a stomach. - M << "The creature that you are can not eat others." - return TRUE + M.verbs += /mob/living/proc/lick + if(M.no_vore) //If the mob isn't supposed to have a stomach, let's not give it an insidepanel so it can make one for itself, or a stomach. + return 1 M.verbs += /mob/living/proc/insidePanel //Tries to load prefs if a client is present otherwise gives freebie stomach @@ -27,44 +28,36 @@ if(M.client && M.client.prefs_vr) if(!M.copy_from_prefs_vr()) - M << "ERROR: You seem to have saved vore prefs, but they couldn't be loaded." - return FALSE + to_chat(M,"ERROR: You seem to have saved vore prefs, but they couldn't be loaded.") + return 0 if(M.vore_organs && M.vore_organs.len) M.vore_selected = M.vore_organs[1] if(!M.vore_organs || !M.vore_organs.len) if(!M.vore_organs) M.vore_organs = list() - var/datum/belly/B = new /datum/belly(M) + var/obj/belly/B = new /obj/belly(M) + M.vore_selected = B B.immutable = TRUE B.name = "Stomach" - B.inside_flavor = "It appears to be rather warm and wet. Makes sense, considering it's inside \the [M.name]" - B.can_taste = TRUE - M.vore_organs[B.name] = B - M.vore_selected = B.name - - //Simple_animal gets emotes. move this to that hook instead? - if(istype(src,/mob/living/simple_animal)) - B.emote_lists[DM_HOLD] = list( - "The insides knead at you gently for a moment.", - "The guts glorp wetly around you as some air shifts.", - "Your predator takes a deep breath and sighs, shifting you somewhat.", - "The stomach squeezes you tight for a moment, then relaxes.", - "During a moment of quiet, breathing becomes the most audible thing.", - "The warm slickness surrounds and kneads on you.") - - B.emote_lists[DM_DIGEST] = list( - "The caustic acids eat away at your form.", - "The acrid air burns at your lungs.", - "Without a thought for you, the stomach grinds inwards painfully.", - "The guts treat you like food, squeezing to press more acids against you.", - "The onslaught against your body doesn't seem to be letting up; you're food now.", - "The insides work on you like they would any other food.") + B.desc = "It appears to be rather warm and wet. Makes sense, considering it's inside \the [M.name]." + B.can_taste = FALSE //Return 1 to hook-caller return 1 +/* +// Hide vore organs in contents // +/datum/proc/view_variables_filter_contents(list/L) + return 0 + +/mob/living/view_variables_filter_contents(list/L) + . = ..() + var/len_before = L.len + L -= vore_organs + . += len_before - L.len*/ + // Handle being clicked, perhaps with something to devour // @@ -126,33 +119,37 @@ var/belly = user.vore_selected return perform_dragon(user, prey, user, belly) -/mob/living/proc/perform_dragon(var/mob/living/user, var/mob/living/prey, var/mob/living/pred, var/belly, swallow_time = 20) +/mob/living/proc/perform_dragon(var/mob/living/user, var/mob/living/prey, var/mob/living/pred, var/obj/belly/belly, swallow_time = 20) //Sanity - if(!user || !prey || !pred || !belly || !(belly in pred.vore_organs)) + if(!user || !prey || !pred || !istype(belly) || !(belly in pred.vore_organs)) + testing("[user] attempted to feed [prey] to [pred], via [lowertext(belly.name)] but it went wrong.") return // The belly selected at the time of noms - var/datum/belly/belly_target = pred.vore_organs[belly] var/attempt_msg = "ERROR: Vore message couldn't be created. Notify a dev. (at)" var/success_msg = "ERROR: Vore message couldn't be created. Notify a dev. (sc)" +/* //Final distance check. Time has passed, menus have come and gone. Can't use do_after adjacent because doesn't behave for held micros + var/user_to_pred = get_dist(get_turf(user),get_turf(pred)) + var/user_to_prey = get_dist(get_turf(user),get_turf(prey)) */ + // Prepare messages if(user == pred) //Feeding someone to yourself - attempt_msg = text("[] starts to [] [] into their []!",pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name)) - success_msg = text("[] manages to [] [] into their []!",pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name)) + attempt_msg = text("[] starts to [] [] into their []!",pred,lowertext(belly.vore_verb),prey,lowertext(belly.name)) + success_msg = text("[] manages to [] [] into their []!",pred,lowertext(belly.vore_verb),prey,lowertext(belly.name)) // Announce that we start the attempt! user.visible_message(attempt_msg) - if(!do_mob(src, user, swallow_time)) // one second should be good enough, right? + if(!do_mob(src, user, swallow_time)) return FALSE // Prey escaped (or user disabled) before timer expired. // If we got this far, nom successful! Announce it! user.visible_message(success_msg) - playsound(get_turf(user), belly_target.vore_sound,75,0,-6,0) + playsound(get_turf(user), "[belly.vore_sound]",75,0,-6,0) // Actually shove prey into the belly. - belly_target.nom_mob(prey, user) + belly.nom_mob(prey, user) if (pred == user) message_admins("[key_name(pred)] ate [key_name(prey)].") log_attack("[key_name(pred)] ate [key_name(prey)]") @@ -161,43 +158,55 @@ // Master vore proc that actually does vore procedures // -/mob/living/proc/perform_the_nom(var/mob/living/user, var/mob/living/prey, var/mob/living/pred, var/belly, swallow_time = 100) +/mob/living/proc/perform_the_nom(var/mob/living/user, var/mob/living/prey, var/mob/living/pred, var/obj/belly/belly, var/delay) //Sanity - if(!user || !prey || !pred || !belly || !(belly in pred.vore_organs)) + if(!user || !prey || !pred || !istype(belly) || !(belly in pred.vore_organs)) + testing("[user] attempted to feed [prey] to [pred], via [lowertext(belly.name)] but it went wrong.") return if (!prey.devourable) to_chat(user, "This can't be eaten!") return // The belly selected at the time of noms - var/datum/belly/belly_target = pred.vore_organs[belly] var/attempt_msg = "ERROR: Vore message couldn't be created. Notify a dev. (at)" var/success_msg = "ERROR: Vore message couldn't be created. Notify a dev. (sc)" +/* //Final distance check. Time has passed, menus have come and gone. Can't use do_after adjacent because doesn't behave for held micros + var/user_to_pred = get_dist(get_turf(user),get_turf(pred)) + var/user_to_prey = get_dist(get_turf(user),get_turf(prey)) */ + // Prepare messages if(user == pred) //Feeding someone to yourself - attempt_msg = text("[] is attemping to [] [] into their []!",pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name)) - success_msg = text("[] manages to [] [] into their []!",pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name)) + attempt_msg = text("[] is attemping to [] [] into their []!",pred,lowertext(belly.vore_verb),prey,lowertext(belly.name)) + success_msg = text("[] manages to [] [] into their []!",pred,lowertext(belly.vore_verb),prey,lowertext(belly.name)) else //Feeding someone to another person - attempt_msg = text("[] is attempting to make [] [] [] into their []!",user,pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name)) - success_msg = text("[] manages to make [] [] [] into their []!",user,pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name)) + attempt_msg = text("[] is attempting to make [] [] [] into their []!",user,pred,lowertext(belly.vore_verb),prey,lowertext(belly.name)) + success_msg = text("[] manages to make [] [] [] into their []!",user,pred,lowertext(belly.vore_verb),prey,lowertext(belly.name)) // Announce that we start the attempt! user.visible_message(attempt_msg) // Now give the prey time to escape... return if they did + var/swallow_time = delay || ishuman(prey) ? belly.human_prey_swallow_time : belly.nonhuman_prey_swallow_time + if(!do_mob(src, user, swallow_time)) return FALSE // Prey escaped (or user disabled) before timer expired. // If we got this far, nom successful! Announce it! user.visible_message(success_msg) - playsound(get_turf(user), belly_target.vore_sound,75,0,-6,0,ignore_walls = FALSE) + for(var/mob/M in get_hearers_in_view(5, get_turf(user))) + if(M.client && M.client.prefs.toggles & EATING_NOISES) + playsound(get_turf(user),"[belly.vore_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED) // Actually shove prey into the belly. - belly_target.nom_mob(prey, user) + belly.nom_mob(prey, user) // user.update_icons() stop_pulling() + // Flavor handling + if(belly.can_taste && prey.get_taste_message(FALSE)) + to_chat(belly.owner, "[prey] tastes of [prey.get_taste_message(FALSE)].") + // Inform Admins var/prey_braindead var/prey_stat @@ -250,50 +259,38 @@ return 0 */ + +// +// Release everything in every vore organ +// +/mob/living/proc/release_vore_contents(var/include_absorbed = TRUE) + for(var/belly in vore_organs) + var/obj/belly/B = belly + B.release_all_contents(include_absorbed) + // // Custom resist catches for /mob/living // /mob/living/proc/vore_process_resist() //Are we resisting from inside a belly? - var/datum/belly/B = check_belly(src) - if(B) - spawn() B.relay_resist(src) + if(isbelly(loc)) + var/obj/belly/B = loc + B.relay_resist(src) return TRUE //resist() on living does this TRUE thing. //Other overridden resists go here - return FALSE -// -// Proc for updating vore organs and digestion/healing/absorbing -// -/mob/living/proc/handle_internal_contents() - if(SSmobs.times_fired%6==1) - return //The accursed timer - - for (var/I in vore_organs) - var/datum/belly/B = vore_organs[I] - if(B.internal_contents.len) - B.process_Life() //AKA 'do bellymodes_vr.dm' - - for (var/I in vore_organs) - var/datum/belly/B = vore_organs[I] - if(B.internal_contents.len) - listclearnulls(B.internal_contents) - for(var/atom/movable/M in B.internal_contents) - if(M.loc != src) - B.internal_contents.Remove(M) - // internal slimy button in case the loop stops playing but the player wants to hear it /mob/living/proc/preyloop_refresh() set name = "Internal loop refresh" set category = "Vore" - if(ismob(src.loc)) + if(istype(src.loc, /obj/belly)) src.stop_sound_channel(CHANNEL_PREYLOOP) // sanity just in case var/sound/preyloop = sound('sound/vore/prey/loop.ogg', repeat = TRUE) - src.playsound_local(get_turf(src),preyloop,40,0, channel = CHANNEL_PREYLOOP) + src.playsound_local(get_turf(src),preyloop,80,0, channel = CHANNEL_PREYLOOP) else to_chat(src, "You aren't inside anything, you clod.") @@ -309,7 +306,7 @@ var/confirm = alert(src, "You're in a mob. Use this as a trick to get out of hostile animals. If you are in more than one pred, use this more than once.", "Confirmation", "Okay", "Cancel") if(confirm == "Okay") for(var/I in pred.vore_organs) - var/datum/belly/B = pred.vore_organs[I] + var/obj/belly/B = pred.vore_organs[I] B.release_specific_contents(src) for(var/mob/living/simple_animal/SA in range(10)) @@ -355,9 +352,15 @@ P.digestable = src.digestable P.devourable = src.devourable - P.belly_prefs = src.vore_organs P.vore_taste = src.vore_taste + var/list/serialized = list() + for(var/belly in src.vore_organs) + var/obj/belly/B = belly + serialized += list(B.serialize()) //Can't add a list as an object to another list in Byond. Thanks. + + P.belly_prefs = serialized + return TRUE // @@ -370,16 +373,52 @@ var/datum/vore_preferences/P = client.prefs_vr - src.digestable = P.digestable - src.devourable = P.devourable - src.vore_organs = list() - src.vore_taste = P.vore_taste + digestable = P.digestable + devourable = P.devourable + vore_taste = P.vore_taste - for(var/I in P.belly_prefs) - var/datum/belly/Bp = P.belly_prefs[I] - src.vore_organs[Bp.name] = Bp.copy(src) + vore_organs.Cut() + for(var/entry in P.belly_prefs) + list_to_object(entry,src) return TRUE + +// +// Returns examine messages for bellies +// +/mob/living/proc/examine_bellies() + if(!show_pudge()) //Some clothing or equipment can hide this. + return "" + + var/message = "" + for (var/belly in vore_organs) + var/obj/belly/B = belly + message += B.get_examine_msg() + + return message + +// +// Whether or not people can see our belly messages +// +/mob/living/proc/show_pudge() + return TRUE //Can override if you want. + +/mob/living/carbon/human/show_pudge() + //A uniform could hide it. + if(istype(w_uniform,/obj/item/clothing)) + var/obj/item/clothing/under = w_uniform + if(under.hides_bulges) + return FALSE + + //We return as soon as we find one, no need for 'else' really. + if(istype(wear_suit,/obj/item/clothing)) + var/obj/item/clothing/suit = wear_suit + if(suit.hides_bulges) + return FALSE + + + return ..() + // // Clearly super important. Obviously. // diff --git a/code/modules/vore/eating/simple_animal_vr.dm b/code/modules/vore/eating/simple_animal_vr.dm index 4e7c453371..a93eb2fcf4 100644 --- a/code/modules/vore/eating/simple_animal_vr.dm +++ b/code/modules/vore/eating/simple_animal_vr.dm @@ -31,7 +31,7 @@ // // Simple nom proc for if you get ckey'd into a simple_animal mob! Avoids grabs. // -/mob/living/proc/animal_nom(var/mob/living/T in oview(1)) +/mob/living/simple_animal/proc/animal_nom(var/mob/living/T in oview(1)) set name = "Animal Nom" set category = "Vore" set desc = "Since you can't grab, you get a verb!" diff --git a/code/modules/vore/eating/vore_vr.dm b/code/modules/vore/eating/vore_vr.dm index f6d886e93f..f0ceb97e31 100644 --- a/code/modules/vore/eating/vore_vr.dm +++ b/code/modules/vore/eating/vore_vr.dm @@ -23,6 +23,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE // Overrides/additions to stock defines go here, as well as hooks. Sort them by // the object they are overriding. So all /mob/living together, etc. // + // // The datum type bolted onto normal preferences datums for storing Vore stuff // @@ -40,21 +41,23 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE //Actual preferences var/digestable = TRUE var/devourable = FALSE +// var/allowmobvore = TRUE var/list/belly_prefs = list() - var/vore_taste + var/vore_taste = "nothing in particular" +// var/can_be_drop_prey = FALSE +// var/can_be_drop_pred = FALSE //Mechanically required var/path var/slot var/client/client var/client_ckey - var/client/parent /datum/vore_preferences/New(client/C) if(istype(C)) client = C client_ckey = C.ckey - load_vore(C) + load_vore() // // Check if an object is capable of eating things, based on vore_organs @@ -68,46 +71,60 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE // // Belly searching for simplifying other procs +// Mostly redundant now with belly-objects and isbelly(loc) // /proc/check_belly(atom/movable/A) - if(istype(A.loc,/mob/living)) - var/mob/living/M = A.loc - for(var/I in M.vore_organs) - var/datum/belly/B = M.vore_organs[I] - if(A in B.internal_contents) - return(B) - - return FALSE + return isbelly(A.loc) // // Save/Load Vore Preferences // +/datum/vore_preferences/proc/load_path(ckey,slot,filename="character",ext="json") + if(!ckey || !slot) return + path = "data/player_saves/[copytext(ckey,1,2)]/[ckey]/vore/[filename][slot].[ext]" + + /datum/vore_preferences/proc/load_vore() - if(!client || !client_ckey) return FALSE //No client, how can we save? + if(!client || !client_ckey) + return FALSE //No client, how can we save? + if(!client.prefs || !client.prefs.default_slot) + return FALSE //Need to know what character to load! slot = client.prefs.default_slot - path = client.prefs.path + load_path(client_ckey,slot) if(!path) return FALSE //Path couldn't be set? if(!fexists(path)) //Never saved before save_vore() //Make the file first return TRUE - var/savefile/S = new /savefile(path) - if(!S) return FALSE //Savefile object couldn't be created? + var/list/json_from_file = json_decode(file2text(path)) + if(!json_from_file) + return FALSE //My concern grows - S.cd = "/character[slot]" + var/version = json_from_file["version"] + json_from_file = patch_version(json_from_file,version) - S["digestable"] >> digestable - S["devourable"] >> devourable - S["belly_prefs"] >> belly_prefs - S["vore_taste"] >> vore_taste + digestable = json_from_file["digestable"] + devourable = json_from_file["devourable"] +// allowmobvore = json_from_file["allowmobvore"] + vore_taste = json_from_file["vore_taste"] +// can_be_drop_prey = json_from_file["can_be_drop_prey"] +// can_be_drop_prey = json_from_file["can_be_drop_pred"] + belly_prefs = json_from_file["belly_prefs"] + //Quick sanitize if(isnull(digestable)) digestable = TRUE if(isnull(devourable)) devourable = FALSE +/* if(isnull(allowmobvore)) + allowmobvore = TRUE + if(isnull(can_be_drop_prey)) + allowmobvore = FALSE + if(isnull(can_be_drop_pred)) + allowmobvore = FALSE */ if(isnull(belly_prefs)) belly_prefs = list() @@ -115,28 +132,37 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE /datum/vore_preferences/proc/save_vore() if(!path) return FALSE - if(!slot) return FALSE - var/savefile/S = new /savefile(path) - if(!S) return FALSE - S.cd = "/character[slot]" - WRITE_FILE(S["digestable"], digestable) - WRITE_FILE(S["devourable"], devourable) - WRITE_FILE(S["belly_prefs"], belly_prefs) - WRITE_FILE(S["vore_taste"], vore_taste) + var/version = 1 //For "good times" use in the future + var/list/settings_list = list( + "version" = version, + "digestable" = digestable, + "devourable" = devourable, + "vore_taste" = vore_taste, + "belly_prefs" = belly_prefs, + ) + + /* commented out list things + "allowmobvore" = allowmobvore, + "can_be_drop_prey" = can_be_drop_prey, + "can_be_drop_pred" = can_be_drop_pred, */ + + //List to JSON + var/json_to_file = json_encode(settings_list) + if(!json_to_file) + testing("Saving: [path] failed jsonencode") + return FALSE + + //Write it out + if(fexists(path)) + fdel(path) //Byond only supports APPENDING to files, not replacing. + text2file(json_to_file,path) + if(!fexists(path)) + testing("Saving: [path] failed file write") + return FALSE return TRUE -#ifdef TESTING -//DEBUG -//Some crude tools for testing savefiles -//path is the savefile path -/client/verb/vore_savefile_export(path as text) - var/savefile/S = new /savefile(path) - S.ExportText("/",file("[path].txt")) -//path is the savefile path -/client/verb/vore_savefile_import(path as text) - var/savefile/S = new /savefile(path) - S.ImportText("/",file("[path].txt")) - -#endif \ No newline at end of file +//Can do conversions here +/datum/vore_preferences/proc/patch_version(var/list/json_from_file,var/version) + return json_from_file \ No newline at end of file diff --git a/code/modules/vore/eating/voreitems.dm b/code/modules/vore/eating/voreitems.dm index 5d157c39fe..741782545a 100644 --- a/code/modules/vore/eating/voreitems.dm +++ b/code/modules/vore/eating/voreitems.dm @@ -16,7 +16,7 @@ /obj/item/projectile/sickshot name = "sickshot pulse" icon_state = "e_netting" - damage = 1 + damage = 0 damage_type = STAMINA range = 2 @@ -25,8 +25,7 @@ var/mob/living/carbon/H = target if(prob(5)) for(var/X in H.vore_organs) - var/datum/belly/B = H.vore_organs[X] - B.release_all_contents() + H.release_vore_contents() H.visible_message("[H] contracts strangely, spewing out contents on the floor!", \ "You spew out everything inside you on the floor!") return diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm index e9bb44765f..7d7a48ed28 100644 --- a/code/modules/vore/eating/vorepanel_vr.dm +++ b/code/modules/vore/eating/vorepanel_vr.dm @@ -14,7 +14,7 @@ var/datum/vore_look/picker_holder = new() picker_holder.loop = picker_holder - picker_holder.selected = vore_organs[vore_selected] + picker_holder.selected = vore_selected var/dat = picker_holder.gen_vui(src) @@ -22,11 +22,23 @@ picker_holder.popup.set_content(dat) picker_holder.popup.open() +/mob/living/proc/updateVRPanel() //Panel popup update call from belly events. + if(src.openpanel == 1) + var/datum/vore_look/picker_holder = new() + picker_holder.loop = picker_holder + picker_holder.selected = vore_selected + + var/dat = picker_holder.gen_vui(src) + + picker_holder.popup = new(src, "insidePanel","Vore Panel", 400, 600, picker_holder) + picker_holder.popup.set_content(dat) + picker_holder.popup.open() + // // Callback Handler for the Inside form // /datum/vore_look - var/datum/belly/selected + var/obj/belly/selected var/show_interacts = TRUE var/datum/browser/popup var/loop = null; // Magic self-reference to stop the handler from being GC'd before user takes action. @@ -44,29 +56,38 @@ /datum/vore_look/proc/gen_vui(var/mob/living/user) var/dat - if (is_vore_predator(user.loc)) - var/mob/living/eater = user.loc - var/datum/belly/inside_belly - - //This big block here figures out where the prey is - inside_belly = check_belly(user) + var/atom/userloc = user.loc + if (isbelly(userloc)) + var/obj/belly/inside_belly = userloc + var/mob/living/eater = inside_belly.owner + //Don't display this part if we couldn't find the belly since could be held in hand. if(inside_belly) - dat += "You are currently inside [eater]'s [inside_belly]!

" + dat += "You are currently [user.absorbed ? "absorbed into " : "inside "] [eater]'s [inside_belly]!

" - if(inside_belly.inside_flavor) - dat += "[inside_belly.inside_flavor]

" + if(inside_belly.desc) + dat += "[inside_belly.desc]

" - if (inside_belly.internal_contents.len > 1) + if (inside_belly.contents.len > 1) dat += "You can see the following around you:
" - for (var/atom/movable/O in inside_belly.internal_contents) + for (var/atom/movable/O in inside_belly) if(istype(O,/mob/living)) var/mob/living/M = O //That's just you if(M == user) continue + + //That's an absorbed person you're checking + if(M.absorbed) + if(user.absorbed) + dat += "[O]" + continue + else + continue + //Anything else - dat += "[O]" + dat += "[O]​" + //Zero-width space, for wrapping dat += "​" else @@ -75,8 +96,8 @@ dat += "


" dat += "
    " - for(var/K in user.vore_organs) //Fuggin can't iterate over values - var/datum/belly/B = user.vore_organs[K] + for(var/belly in user.vore_organs) + var/obj/belly/B = belly if(B == selected) dat += "
  1. [B.name]" else @@ -90,8 +111,10 @@ spanstyle = "color:red;" if(DM_HEAL) spanstyle = "color:green;" + if(DM_NOISY) + spanstyle = "color:purple;" - dat += " ([B.internal_contents.len])
  2. " + dat += " ([B.contents.len])" if(user.vore_organs.len < BELLIES_MAX) dat += "
  3. New+
  4. " @@ -102,15 +125,27 @@ if(!selected) dat += "No belly selected. Click one to select it." else - if(selected.internal_contents.len > 0) + if(selected.contents.len) dat += "Contents: " - for(var/O in selected.internal_contents) + for(var/O in selected) + + //Mobs can be absorbed, so treat them separately from everything else + if(istype(O,/mob/living)) + var/mob/living/M = O + + //Absorbed gets special color OOoOOOOoooo + if(M.absorbed) + dat += "[O]" + continue + + //Anything else dat += "[O]" //Zero-width space, for wrapping dat += "​" + //If there's more than one thing, add an [All] button - if(selected.internal_contents.len > 1) + if(selected.contents.len > 1) dat += "\[All\]" dat += "
    " @@ -129,14 +164,15 @@ //Inside flavortext dat += "
    Flavor Text:" - dat += " '[selected.inside_flavor]'" + dat += " '[selected.desc]'" //Belly sound dat += "
    Set Vore Sound" dat += "Test" - // //Belly silence - // dat += "
    Belly Silence ([selected.silenced ? "Silenced" : "Noisy"])" + //Release sound + dat += "
    Set Release Sound" + dat += "Test" //Belly messages dat += "
    Belly Messages" @@ -145,6 +181,10 @@ dat += "
    Can Taste:" dat += " [selected.can_taste ? "Yes" : "No"]" + //Minimum size prey must be to show up. + dat += "
    Required examine size:" + dat += " [selected.bulge_size*100]%" + //Belly escapability dat += "
    Belly Interactions ([selected.escapable ? "On" : "Off"])" if(selected.escapable) @@ -173,15 +213,21 @@ dat += " [selected.digestchance]%" dat += "
    " + // Belly Silence + dat += "
    Belly Silence (for not belly bellies):" + dat += " [selected.silent ? "Yes" : "No"]" + //Delete button dat += "
    Delete Belly" + dat += "Set Flavor" + dat += "Toggle Hunger Noises" + dat += "
    " //Under the last HR, save and stuff. dat += "Save Prefs" dat += "Refresh" - dat += "Set Flavor" dat += "
    " switch(user.digestable) @@ -221,8 +267,8 @@ if(href_list["outsidepick"]) var/atom/movable/tgt = locate(href_list["outsidepick"]) - var/datum/belly/OB = locate(href_list["outsidebelly"]) - if(!(tgt in OB.internal_contents)) //Aren't here anymore, need to update menu. + var/obj/belly/OB = locate(href_list["outsidebelly"]) + if(!(tgt in OB)) //Aren't here anymore, need to update menu. return TRUE var/intent = "Examine" @@ -234,42 +280,49 @@ M.examine(user) if("Help Out") //Help the inside-mob out - to_chat(user, "You begin to push [M] to freedom!") - to_chat(M, "[usr] begins to push you to freedom!") - M.loc << "Someone is trying to escape from inside you!" + if(user.stat || user.absorbed || M.absorbed) + to_chat(user,"You can't do that in your state!") + return 1 + + to_chat(user,"You begin to push [M] to freedom!") + to_chat(M,"[usr] begins to push you to freedom!") + to_chat(M.loc,"Someone is trying to escape from inside you!") sleep(50) if(prob(33)) OB.release_specific_contents(M) - to_chat(usr, "You manage to help [M] to safety!") - to_chat(M, "[user] pushes you free!") - M.loc << "[M] forces free of the confines of your body!" + to_chat(usr,"You manage to help [M] to safety!") + to_chat(M,"[user] pushes you free!") + to_chat(OB.owner,"[M] forces free of the confines of your body!") else - to_chat(user, "[M] slips back down inside despite your efforts.") - to_chat(M, " Even with [user]'s help, you slip back inside again.") - M.loc << "Your body efficiently shoves [M] back where they belong." + to_chat(user,"[M] slips back down inside despite your efforts.") + to_chat(M," Even with [user]'s help, you slip back inside again.") + to_chat(OB.owner,"Your body efficiently shoves [M] back where they belong.") + if("Devour") //Eat the inside mob + if(user.absorbed || user.stat) + to_chat(user,"You can't do that in your state!") + return 1 + if(!user.vore_selected) - to_chat(user, "Pick a belly on yourself first!") - return + to_chat(user,"Pick a belly on yourself first!") + return 1 - var/datum/belly/TB = user.vore_organs[user.vore_selected] - to_chat(user, "You begin to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]!") - to_chat(M, "[user] begins to [lowertext(TB.vore_verb)] you into their [lowertext(TB.name)]!") - M.loc << "Someone inside you is eating someone else!" + var/obj/belly/TB = user.vore_selected + to_chat(user,"You begin to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]!") + to_chat(M,"[user] begins to [lowertext(TB.vore_verb)] you into their [lowertext(TB.name)]!") + to_chat(OB.owner,"Someone inside you is eating someone else!") - sleep(TB.nonhuman_prey_swallow_time) - if((user in OB.internal_contents) && (M in OB.internal_contents)) - to_chat(user, "You manage to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]!") - to_chat(M, "[user] manages to [lowertext(TB.vore_verb)] you into their [lowertext(TB.name)]!") - M.loc << "Someone inside you has eaten someone else!" - M.loc = user + sleep(TB.nonhuman_prey_swallow_time) //Can't do after, in a stomach, weird things abound. + if((user in OB) && (M in OB)) //Make sure they're still here. + to_chat(user,"You manage to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]!") + to_chat(M,"[user] manages to [lowertext(TB.vore_verb)] you into their [lowertext(TB.name)]!") + to_chat(OB.owner,"Someone inside you has eaten someone else!") TB.nom_mob(M) - OB.internal_contents -= M else if(istype(tgt,/obj/item)) var/obj/item/T = tgt - if(!(tgt in OB.internal_contents)) + if(!(tgt in OB.contents)) //Doesn't exist anymore, update. return TRUE intent = alert("What do you want to do to that?","Query","Examine","Use Hand") @@ -301,27 +354,29 @@ return selected.release_all_contents() - playsound(get_turf(user),'sound/vore/pred/escape.ogg',50,0,-5,0,ignore_walls = FALSE) + for(var/mob/M in get_hearers_in_view(5, get_turf(user))) + if(M.client && M.client.prefs.toggles & EATING_NOISES) + playsound(get_turf(user),'sound/vore/pred/escape.ogg',50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED) to_chat(user.loc,"Everything is released from [user]!") if("Move all") if(user.stat) to_chat(user, "You can't do that in your state!") - return + return FALSE - var/choice = input("Move all where?","Select Belly") in user.vore_organs + "Cancel - Don't Move" + var/obj/belly/choice = input("Move all where?","Select Belly") as null|anything in user.vore_organs + if(!choice) + return FALSE - if(choice == "Cancel - Don't Move") - return - else - var/datum/belly/B = user.vore_organs[choice] - for(var/atom/movable/tgt in selected.internal_contents) - to_chat(tgt, "You're squished from [user]'s [selected] to their [B]!") - selected.transfer_contents(tgt, B, 1) - playsound(get_turf(user),'sound/vore/pred/stomachmove.ogg',50,0,-5,0,ignore_walls = FALSE) + for(var/atom/movable/tgt in selected) + selected.transfer_contents(tgt, choice, 1) + for(var/mob/M in get_hearers_in_view(5, get_turf(user))) + if(M.client && M.client.prefs.toggles & EATING_NOISES) + playsound(get_turf(user),'sound/vore/pred/stomachmove.ogg',50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED) + to_chat(tgt,"You're squished from [user]'s [lowertext(selected)] to their [lowertext(choice.name)]!") var/atom/movable/tgt = locate(href_list["insidepick"]) - if(!(tgt in selected.internal_contents)) //Old menu, needs updating because they aren't really there. + if(!(tgt in selected)) //Old menu, needs updating because they aren't really there. return TRUE//Forces update intent = "Examine" intent = alert("Examine, Eject, Move? Examine if you want to leave this box.","Query","Examine","Eject","Move") @@ -335,48 +390,54 @@ return FALSE selected.release_specific_contents(tgt) - playsound(get_turf(user),'sound/effects/splat.ogg',50,0,-5,0,ignore_walls = FALSE) + for(var/mob/M in get_hearers_in_view(5, get_turf(user))) + if(M.client && M.client.prefs.toggles & EATING_NOISES) + playsound(get_turf(user),'sound/vore/pred/escape.ogg',50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED) user.loc << "[tgt] is released from [user]!" if("Move") if(user.stat) - to_chat(user, "You can't do that in your state!") - return FALSE + to_chat(user,"You can't do that in your state!") + return 0 - var/choice = input("Move [tgt] where?","Select Belly") in user.vore_organs + "Cancel - Don't Move" + var/obj/belly/choice = input("Move [tgt] where?","Select Belly") as null|anything in user.vore_organs + if(!choice || !(tgt in selected)) + return 0 - if(choice == "Cancel - Don't Move") - return - else - var/datum/belly/B = user.vore_organs[choice] - if (!(tgt in selected.internal_contents)) - return FALSE - to_chat(tgt, "You're moved from [user]'s [lowertext(selected.name)] to their [lowertext(B.name)]!") - playsound(get_turf(user),'sound/vore/pred/stomachmove.ogg',50,0,-5,0,ignore_walls = FALSE) - selected.transfer_contents(tgt, B) + to_chat(tgt,"You're squished from [user]'s [lowertext(selected.name)] to their [lowertext(choice.name)]!") + selected.transfer_contents(tgt, choice) + for(var/mob/M in get_hearers_in_view(5, get_turf(user))) + if(M.client && M.client.prefs.toggles & EATING_NOISES) + playsound(get_turf(user),'sound/vore/pred/stomachmove.ogg',50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED) if(href_list["newbelly"]) if(user.vore_organs.len >= BELLIES_MAX) - return TRUE + return 0 var/new_name = html_encode(input(usr,"New belly's name:","New Belly") as text|null) + var/failure_msg if(length(new_name) > BELLIES_NAME_MAX || length(new_name) < BELLIES_NAME_MIN) - to_chat(usr, "Entered belly name is too long.") - return FALSE - if(new_name in user.vore_organs) - to_chat(usr, "No duplicate belly names, please.") - return FALSE + failure_msg = "Entered belly name length invalid (must be longer than [BELLIES_NAME_MIN], no more than than [BELLIES_NAME_MAX])." + // else if(whatever) //Next test here. + else + for(var/belly in user.vore_organs) + var/obj/belly/B = belly + if(lowertext(new_name) == lowertext(B.name)) + failure_msg = "No duplicate belly names, please." + break - var/datum/belly/NB = new(user) + if(failure_msg) //Something went wrong. + alert(user,failure_msg,"Error!") + return 0 + + var/obj/belly/NB = new(user) NB.name = new_name - NB.owner = user //might be the thing we all needed. - user.vore_organs[new_name] = NB selected = NB if(href_list["bellypick"]) selected = locate(href_list["bellypick"]) - user.vore_selected = selected.name + user.vore_selected = selected //// //Please keep these the same order they are on the panel UI for ease of coding @@ -384,41 +445,40 @@ if(href_list["b_name"]) var/new_name = html_encode(input(usr,"Belly's new name:","New Name") as text|null) + var/failure_msg if(length(new_name) > BELLIES_NAME_MAX || length(new_name) < BELLIES_NAME_MIN) - to_chat(usr, "Entered belly name length invalid (must be longer than 2, shorter than 12).") - return FALSE - if(new_name in user.vore_organs) - to_chat(usr, "No duplicate belly names, please.") - return FALSE + failure_msg = "Entered belly name length invalid (must be longer than [BELLIES_NAME_MIN], no more than than [BELLIES_NAME_MAX])." + // else if(whatever) //Next test here. + else + for(var/belly in user.vore_organs) + var/obj/belly/B = belly + if(lowertext(new_name) == lowertext(B.name)) + failure_msg = "No duplicate belly names, please." + break + + if(failure_msg) //Something went wrong. + alert(user,failure_msg,"Error!") + return 0 - user.vore_organs[new_name] = selected - user.vore_organs -= selected.name selected.name = new_name if(href_list["b_mode"]) var/list/menu_list = selected.digest_modes - if(selected.digest_modes.len == 1) // Don't do anything - return 1 - if(selected.digest_modes.len == 2) // Just toggle... there's probably a more elegant way to do this... - var/index = selected.digest_modes.Find(selected.digest_mode) - switch(index) - if(1) - selected.digest_mode = selected.digest_modes[2] - if(2) - selected.digest_mode = selected.digest_modes[1] - else - selected.digest_mode = input("Choose Mode (currently [selected.digest_mode])") in menu_list + var/new_mode = input("Choose Mode (currently [selected.digest_mode])") as null|anything in menu_list + if(!new_mode) + return 0 + selected.digest_mode = new_mode if(href_list["b_desc"]) - var/new_desc = html_encode(input(usr,"Belly Description (1024 char limit):","New Description",selected.inside_flavor) as message|null) + var/new_desc = html_encode(input(usr,"Belly Description ([BELLIES_DESC_MAX] char limit):","New Description",selected.desc) as message|null) + if(new_desc) new_desc = readd_quotes(new_desc) if(length(new_desc) > BELLIES_DESC_MAX) - to_chat(usr, "Entered belly desc too long. [BELLIES_DESC_MAX] character limit.") + alert("Entered belly desc too long. [BELLIES_DESC_MAX] character limit.","Error") return FALSE - - selected.inside_flavor = new_desc + selected.desc = new_desc else //Returned null return FALSE @@ -429,12 +489,11 @@ "Struggle Message (outside)", "Struggle Message (inside)", "Examine Message (when full)", - "Reset All To Default", - "Cancel - No Changes" + "Reset All To Default" ) alert(user,"Setting abusive or deceptive messages will result in a ban. Consider this your warning. Max 150 characters per message, max 10 messages per topic.","Really, don't.") - var/choice = input(user,"Select a type to modify. Messages from each topic are pulled at random when needed.","Pick Type") in messages + var/choice = input(user,"Select a type to modify. Messages from each topic are pulled at random when needed.","Pick Type") as null|anything in messages var/help = " Press enter twice to separate messages. '%pred' will be replaced with your name. '%prey' will be replaced with the prey's name. '%belly' will be replaced with your belly's name." switch(choice) @@ -459,7 +518,7 @@ selected.set_messages(new_message,"smi") if("Examine Message (when full)") - var/new_message = input(user,"These are sent to people who examine you when this belly has contents. Write them in 3rd person ('Their %belly is bulging'). "+help,"Examine Message (when full)",selected.get_messages("em")) as message + var/new_message = input(user,"These are sent to people who examine you when this belly has contents. Write them in 3rd person ('Their %belly is bulging')."+help,"Examine Message (when full)",selected.get_messages("em")) as message if(new_message) selected.set_messages(new_message,"em") @@ -471,40 +530,57 @@ selected.struggle_messages_outside = initial(selected.struggle_messages_outside) selected.struggle_messages_inside = initial(selected.struggle_messages_inside) - if("Cancel - No Changes") - return - if(href_list["b_verb"]) var/new_verb = html_encode(input(usr,"New verb when eating (infinitive tense, e.g. nom or swallow):","New Verb") as text|null) if(length(new_verb) > BELLIES_NAME_MAX || length(new_verb) < BELLIES_NAME_MIN) - to_chat(usr, "Entered verb length invalid (must be longer than [BELLIES_NAME_MIN], no longer than [BELLIES_NAME_MAX]).") - return FALSE + alert("Entered verb length invalid (must be longer than [BELLIES_NAME_MIN], no longer than [BELLIES_NAME_MAX]).","Error") + return 0 selected.vore_verb = new_verb - if(href_list["b_sound"]) - var/choice = input(user,"Currently set to [selected.vore_sound]","Select Sound") in GLOB.pred_vore_sounds + "Cancel - No Changes" + if(href_list["b_release"]) + var/choice = input(user,"Currently set to [selected.release_sound]","Select Sound") as null|anything in GLOB.release_sound - if(choice == "Cancel") + if(!choice) + return + + selected.release_sound = GLOB.release_sound[choice] + + if(href_list["b_releasesoundtest"]) + var/soundfile = GLOB.release_sound[selected.release_sound] + if(soundfile) + user << soundfile + + if(href_list["b_sound"]) + var/choice = input(user,"Currently set to [selected.vore_sound]","Select Sound") as null|anything in GLOB.pred_vore_sounds + + if(!choice) return selected.vore_sound = GLOB.pred_vore_sounds[choice] if(href_list["b_soundtest"]) - user << selected.vore_sound -/* - if(href_list["silenced"]) - if(selected.silenced == FALSE) - selected.silenced = TRUE - to_chat(usr,"The [selected.name] is now silenced, it will not play the internal loop to prey within it.") - else if(selected.silenced == TRUE) - selected.silenced = FALSE - to_chat(usr,"The [selected.name] will play the internal loop to prey within it.") -*/ + var/soundfile = GLOB.pred_vore_sounds[selected.vore_sound] + if(soundfile) + user << soundfile + if(href_list["b_tastes"]) selected.can_taste = !selected.can_taste + if(href_list["b_bulge_size"]) + var/new_bulge = input(user, "Choose the required size prey must be to show up on examine, ranging from 25% to 200% Set this to 0 for no text on examine.", "Set Belly Examine Size.") as num|null + if(new_bulge == null) + return + if(new_bulge == 0) //Disable. + selected.bulge_size = 0 + to_chat(user,"Your stomach will not be seen on examine.") + else if (!IsInRange(new_bulge,25,200)) + selected.bulge_size = 0.25 //Set it to the default. + to_chat(user,"Invalid size.") + else if(new_bulge) + selected.bulge_size = (new_bulge/100) + if(href_list["b_escapable"]) if(selected.escapable == FALSE) //Possibly escapable and special interactions. selected.escapable = TRUE @@ -515,7 +591,7 @@ show_interacts = FALSE //Force the hiding of the panel else to_chat(usr,"Something went wrong. Your stomach will now not have special interactions. Press the button enable them again and tell a dev.") //If they somehow have a varable that's not 0 or 1 - selected.escapable = FALSE + selected.escapable = TRUE show_interacts = FALSE //Force the hiding of the panel if(href_list["b_escapechance"]) @@ -537,68 +613,73 @@ var/choice = input("Where do you want your [selected.name] to lead if prey resists?","Select Belly") as null|anything in (user.vore_organs + "None - Remove" - selected.name) if(!choice) //They cancelled, no changes - return + return FALSE else if(choice == "None - Remove") selected.transferlocation = null else selected.transferlocation = user.vore_organs[choice] + if(href_list["b_absorbchance"]) + var/absorb_chance_input = input(user, "Set belly absorb mode chance on resist (as %)", "Prey Absorb Chance") as num|null + if(!isnull(absorb_chance_input)) + selected.absorbchance = sanitize_integer(absorb_chance_input, 0, 100, initial(selected.absorbchance)) + if(href_list["b_digestchance"]) var/digest_chance_input = input(user, "Set belly digest mode chance on resist (as %)", "Prey Digest Chance") as num|null if(!isnull(digest_chance_input)) selected.digestchance = sanitize_integer(digest_chance_input, 0, 100, initial(selected.digestchance)) + if(href_list["b_silent"]) + selected.silent = !selected.silent + if(href_list["b_del"]) - var/dest_for = FALSE //Check to see if it's the destination of another vore organ. - for(var/I in user.vore_organs) - var/datum/belly/B = user.vore_organs[I] + var/alert = alert("Are you sure you want to delete your [lowertext(selected.name)]?","Confirmation","Delete","Cancel") + if(!alert == "Delete") + return FALSE + + var/failure_msg = "" + + var/dest_for //Check to see if it's the destination of another vore organ. + for(var/belly in user.vore_organs) + var/obj/belly/B = belly if(B.transferlocation == selected) dest_for = B.name + failure_msg += "This is the destiantion for at least '[dest_for]' belly transfers. Remove it as the destination from any bellies before deleting it. " break - if(dest_for) - alert("This is the destiantion for at least '[dest_for]' belly transfers. Remove it as the destination from any bellies before deleting it.","Error") - return TRUE - else if(selected.internal_contents.len) - alert("Can't delete bellies with contents!","Error") - return TRUE - if(selected.internal_contents.len) - to_chat(usr, "Can't delete bellies with contents!") - return - else if(selected.immutable) - to_chat(usr, "This belly is marked as undeletable.") - return - else if(user.vore_organs.len == 1) - to_chat(usr, "You must have at least one belly.") - return - else - var/alert = alert("Are you sure you want to delete [selected]?","Confirmation","Delete","Cancel") - if(alert == "Delete" && !selected.internal_contents.len) - user.vore_organs -= selected.name - user.vore_organs.Remove(selected) - selected = user.vore_organs[1] - user.vore_selected = user.vore_organs[1] - to_chat(usr,"Note: If you had this organ selected as a transfer location, please remove the transfer location by selecting Cancel - None - Remove on this stomach.") + if(selected.contents.len) + failure_msg += "You cannot delete bellies with contents! " //These end with spaces, to be nice looking. Make sure you do the same. + if(selected.immutable) + failure_msg += "This belly is marked as undeletable. " + if(user.vore_organs.len == 1) + failure_msg += "You must have at least one belly. " + + if(failure_msg) + alert(user,failure_msg,"Error!") + return FALSE + + qdel(selected) + selected = user.vore_organs[1] + user.vore_selected = user.vore_organs[1] if(href_list["saveprefs"]) - if(user.save_vore_prefs()) - to_chat(user, "Belly Preferences saved!") + if(!user.save_vore_prefs()) + to_chat(user, "Belly Preferences not saved!") else - to_chat(user, "ERROR: Belly Preferences were not saved!") + to_chat(user, "Belly Preferences were saved!") log_admin("Could not save vore prefs on USER: [user].") if(href_list["setflavor"]) var/new_flavor = html_encode(input(usr,"What your character tastes like (40ch limit). This text will be printed to the pred after 'X tastes of...' so just put something like 'strawberries and cream':","Character Flavor",user.vore_taste) as text|null) + if(!new_flavor) + return 0 - if(new_flavor) - new_flavor = readd_quotes(new_flavor) - if(length(new_flavor) > FLAVOR_MAX) - alert("Entered flavor/taste text too long. [FLAVOR_MAX] character limit.","Error") - return FALSE - user.vore_taste = new_flavor - else //Returned null - return FALSE + new_flavor = readd_quotes(new_flavor) + if(length(new_flavor) > FLAVOR_MAX) + alert("Entered flavor/taste text too long. [FLAVOR_MAX] character limit.","Error!") + return 0 + user.vore_taste = new_flavor if(href_list["toggledg"]) var/choice = alert(user, "This button is for those who don't like being digested. It can make you undigestable to all mobs. Digesting you is currently: [user.digestable ? "Allowed" : "Prevented"]", "", "Allow Digestion", "Cancel", "Prevent Digestion") @@ -626,5 +707,15 @@ if(user.client.prefs_vr) user.client.prefs_vr.devourable = user.devourable + if(href_list["togglenoisy"]) + var/choice = alert(user, "Toggle audible hunger noises. Currently: [user.noisy ? "Enabled" : "Disabled"]", "", "Enable audible hunger", "Cancel", "Disable audible hunger") + switch(choice) + if("Cancel") + return 0 + if("Enable audible hunger") + user.noisy = TRUE + if("Disable audible hunger") + user.noisy = FALSE + //Refresh when interacted with, returning 1 makes vore_look.Topic update - return TRUE + return 1 \ No newline at end of file diff --git a/code/modules/vore/persistence.dm b/code/modules/vore/persistence.dm new file mode 100644 index 0000000000..078a3f48ee --- /dev/null +++ b/code/modules/vore/persistence.dm @@ -0,0 +1,90 @@ +/* +* Returns a byond list that can be passed to the "deserialize" proc +* to bring a new instance of this atom to its original state +* +* If we want to store this info, we can pass it to `json_encode` or some other +* interface that suits our fancy, to make it into an easily-handled string +*/ +/datum/proc/serialize() + var/data = list("type" = "[type]") + return data + +/* +* This is given the byond list from above, to bring this atom to the state +* described in the list. +* This will be called after `New` but before `initialize`, so linking and stuff +* would probably be handled in `initialize` +* +* Also, this should only be called by `list_to_object` in persistence.dm - at least +* with current plans - that way it can actually initialize the type from the list +*/ +/datum/proc/deserialize(var/list/data) + return + +/atom + // This var isn't actually used for anything, but is present so that + // DM's map reader doesn't forfeit on reading a JSON-serialized map + var/map_json_data + +// This is so specific atoms can override these, and ignore certain ones +/atom/proc/vars_to_save() + return list("color","dir","icon","icon_state","name","pixel_x","pixel_y") + +/atom/proc/map_important_vars() + // A list of important things to save in the map editor + return list("color","dir","icon","icon_state","layer","name","pixel_x","pixel_y") + +/area/map_important_vars() + // Keep the area default icons, to keep things nice and legible + return list("name") + +// No need to save any state of an area by default +/area/vars_to_save() + return list("name") + +/atom/serialize() + var/list/data = ..() + for(var/thing in vars_to_save()) + if(vars[thing] != initial(vars[thing])) + data[thing] = vars[thing] + return data + + +/atom/deserialize(var/list/data) + for(var/thing in vars_to_save()) + if(thing in data) + vars[thing] = data[thing] + ..() + + +/* +Whoops, forgot to put documentation here. +What this does, is take a JSON string produced by running +BYOND's native `json_encode` on a list from `serialize` above, and +turns that string into a new instance of that object. + +You can also easily get an instance of this string by calling "Serialize Marked Datum" +in the "Debug" tab. + +If you're clever, you can do neat things with SDQL and this, though be careful - +some objects, like humans, are dependent that certain extra things are defined +in their list +*/ +/proc/object_to_json(var/atom/movable/thing) + return json_encode(thing.serialize()) + +/proc/json_to_object(var/json_data, var/loc) + return list_to_object(json_decode(json_data), loc) + +/proc/list_to_object(var/list/data, var/loc) + if(!islist(data)) + throw EXCEPTION("You didn't give me a list, bucko") + if(!("type" in data)) + throw EXCEPTION("No 'type' field in the data") + var/path = text2path(data["type"]) + if(!path) + throw EXCEPTION("Path not found: [path]") + + var/atom/movable/thing = new path(loc) + thing.deserialize(data) + return thing \ No newline at end of file diff --git a/modular_citadel/code/modules/client/preferences_toggles.dm b/modular_citadel/code/modules/client/preferences_toggles.dm new file mode 100644 index 0000000000..4b92a1e9c3 --- /dev/null +++ b/modular_citadel/code/modules/client/preferences_toggles.dm @@ -0,0 +1,22 @@ +TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggleeatingnoise)() + set name = "Toggle Eating Noises" + set category = "Preferences" + set desc = "Hear Eating noises" + usr.client.prefs.toggles ^= EATING_NOISES + usr.client.prefs.save_preferences() + usr.stop_sound_channel(CHANNEL_PRED) + to_chat(usr, "You will [(usr.client.prefs.toggles & EATING_NOISES) ? "now" : "no longer"] hear eating noises.") +/datum/verbs/menu/Settings/Sound/toggleeatingnoise/Get_checked(client/C) + return !(C.prefs.toggles & EATING_NOISES) + + +TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggledigestionnoise)() + set name = "Toggle Digestion Noises" + set category = "Preferences" + set desc = "Hear digestive noises" + usr.client.prefs.toggles ^= DIGESTION_NOISES + usr.client.prefs.save_preferences() + usr.stop_sound_channel(CHANNEL_DIGEST) + to_chat(usr, "You will [(usr.client.prefs.toggles & DIGESTION_NOISES) ? "now" : "no longer"] hear digestion noises.") +/datum/verbs/menu/Settings/Sound/toggledigestionnoise/Get_checked(client/C) + return !(C.prefs.toggles & DIGESTION_NOISES) diff --git a/tgstation.dme b/tgstation.dme index 3a2b9afee0..2bc8d3ec24 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -284,6 +284,7 @@ #include "code\controllers\subsystem\timer.dm" #include "code\controllers\subsystem\title.dm" #include "code\controllers\subsystem\traumas.dm" +#include "code\controllers\subsystem\vore.dm" #include "code\controllers\subsystem\vote.dm" #include "code\controllers\subsystem\weather.dm" #include "code\controllers\subsystem\processing\circuit.dm" @@ -2587,9 +2588,12 @@ #include "code\modules\vehicles\vehicle_actions.dm" #include "code\modules\vehicles\vehicle_key.dm" #include "code\modules\vore\hook-defs_vr.dm" +#include "code\modules\vore\persistence.dm" #include "code\modules\vore\trycatch_vr.dm" -#include "code\modules\vore\eating\belly_vr.dm" +#include "code\modules\vore\eating\belly_dat_vr.dm" +#include "code\modules\vore\eating\belly_obj_vr.dm" #include "code\modules\vore\eating\bellymodes_vr.dm" +#include "code\modules\vore\eating\digest_act_vr.dm" #include "code\modules\vore\eating\living_vr.dm" #include "code\modules\vore\eating\simple_animal_vr.dm" #include "code\modules\vore\eating\vore_vr.dm" @@ -2659,6 +2663,7 @@ #include "modular_citadel\code\modules\client\client_procs.dm" #include "modular_citadel\code\modules\client\preferences.dm" #include "modular_citadel\code\modules\client\preferences_savefile.dm" +#include "modular_citadel\code\modules\client\preferences_toggles.dm" #include "modular_citadel\code\modules\client\loadout\__donator.dm" #include "modular_citadel\code\modules\client\loadout\_medical.dm" #include "modular_citadel\code\modules\client\loadout\_security.dm" From 811b1887421e8f4390b255aa2f8430611f48682f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 6 Mar 2018 03:59:33 -0600 Subject: [PATCH 36/45] Automatic changelog generation for PR #5789 [ci skip] --- html/changelogs/AutoChangeLog-pr-5789.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5789.yml diff --git a/html/changelogs/AutoChangeLog-pr-5789.yml b/html/changelogs/AutoChangeLog-pr-5789.yml new file mode 100644 index 0000000000..aef3f8ad01 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5789.yml @@ -0,0 +1,12 @@ +author: "Poojawa" +delete-after: True +changes: + - rscadd: "Added release sound effects for choosing. If having a non-belly, belly." + - rscadd: "Added a 'silent' modifier to bellies." + - rscadd: "Added a vore subsystem to handle belly processing, should be less clunky" + - balance: "rebalanced heal mode and dragon digestion." + - soundadd: "added client preference based sound toggles to both eating/release/struggle and digestion noises seperately." + - refactor: "vore prefs save to JSON now instead of .sav. much easier really. +refractor: dragon vore is working, though with this game who knows." + - server: "your prefs should automatically transfer, but it's likely you'll lose pre-loaded bellies, BACK UP EVERYTHING. (you should be doing this anyway too)" + - server: "Creating new characters will import the previous' bellies. but once you click 'save' they'll make the new JSON file will all the info. This is per slot, so if you change your character, you'll have to change belly stuff." From d95be2e26121166b60ab1fbf18c7dc73d0b8b738 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 6 Mar 2018 04:04:12 -0600 Subject: [PATCH 37/45] [MIRROR] Allows admins to spawn mob-like objects for shenanigans (#5825) * Allows admins to spawn mob-like objects for shenanigans (#36153) This is basically extracting the functionality of the animation spell into an admin verb. Please excuse the browser.dm code, this is more of a stepping stone towards the more complicated popup needed for custom ERTs. cl Naksu admin: Admins can now easily spawn mobs that look like objects. Googly eyes optional! /cl * Allows admins to spawn mob-like objects for shenanigans --- code/datums/browser.dm | 82 +++++++++++++++++++ code/modules/admin/admin_verbs.dm | 2 +- code/modules/admin/verbs/spawnobjasmob.dm | 70 ++++++++++++++++ .../mob/living/simple_animal/hostile/mimic.dm | 11 ++- tgstation.dme | 1 + 5 files changed, 162 insertions(+), 4 deletions(-) create mode 100644 code/modules/admin/verbs/spawnobjasmob.dm diff --git a/code/datums/browser.dm b/code/datums/browser.dm index d525b52ca5..9561515840 100644 --- a/code/datums/browser.dm +++ b/code/datums/browser.dm @@ -305,6 +305,88 @@ else return +/datum/browser/modal/preflikepicker + var/settings = list() + var/icon/preview_icon = null + +/datum/browser/modal/preflikepicker/New(User,Message,Title,Button1="Ok",Button2,Button3,StealFocus = 1, Timeout = FALSE,list/settings,inputtype="checkbox", width = 400, height, slidecolor) + if (!User) + return + src.settings = settings + + ..(User, ckey("[User]-[Message]-[Title]-[world.time]-[rand(1,10000)]"), Title, width, height, src, StealFocus, Timeout) + set_content(ShowChoices(User)) + +/datum/browser/modal/preflikepicker/proc/ShowChoices(mob/user) + var/dat = "" + + for (var/name in settings["mainsettings"]) + var/setting = settings["mainsettings"][name] + if (setting["type"] == "datum") + dat += "[setting["desc"]]: [setting["value"]]
    " + else + dat += "[setting["desc"]]: [setting["value"]]
    " + + if (preview_icon) + dat += "" + + dat += "
    " + + dat += "" + + dat += "" + + dat += "
    Ok " + + dat += "
    " + + return dat + +/datum/browser/modal/preflikepicker/Topic(href,href_list) + if (href_list["close"] || !user || !user.client) + opentime = 0 + return + if (href_list["task"] == "input") + var/setting = href_list["setting"] + switch (href_list["type"]) + if ("datum") + settings["mainsettings"][setting]["value"] = pick_closest_path(null, make_types_fancy(typesof(text2path(href_list["path"])))) + if ("string") + settings["mainsettings"][setting]["value"] = stripped_input(user, "Enter new value for [settings["mainsettings"][setting]["desc"]]", "Enter new value for [settings["mainsettings"][setting]["desc"]]") + if ("number") + settings["mainsettings"][setting]["value"] = input(user, "Enter new value for [settings["mainsettings"][setting]["desc"]]", "Enter new value for [settings["mainsettings"][setting]["desc"]]") as num + if ("boolean") + settings["mainsettings"][setting]["value"] = input(user, "[settings["mainsettings"][setting]["desc"]]?") in list("Yes","No") + if ("ckey") + settings["mainsettings"][setting]["value"] = input(user, "[settings["mainsettings"][setting]["desc"]]?") in list("none") + GLOB.directory + if (href_list["button"]) + var/button = text2num(href_list["button"]) + if (button <= 3 && button >= 1) + selectedbutton = button + if (selectedbutton != 1) + set_content(ShowChoices(user)) + open() + return + for (var/item in href_list) + switch(item) + if ("close", "button", "src") + continue + opentime = 0 + close() + +/proc/presentpreflikepicker(var/mob/User,Message, Title, Button1="Ok", Button2, Button3, StealFocus = 1,Timeout = 6000,list/settings, width, height, slidecolor) + if (!istype(User)) + if (istype(User, /client/)) + var/client/C = User + User = C.mob + else + return + var/datum/browser/modal/preflikepicker/A = new(User, Message, Title, Button1, Button2, Button3, StealFocus,Timeout, settings, width, height, slidecolor) + A.open() + A.wait() + if (A.selectedbutton) + return list("button" = A.selectedbutton, "settings" = A.settings) + // This will allow you to show an icon in the browse window // This is added to mob so that it can be used without a reference to the browser object // There is probably a better place for this... diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index f38bfdd84d..85811f693c 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -100,7 +100,7 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list( /client/proc/smite )) GLOBAL_PROTECT(admin_verbs_spawn) -GLOBAL_LIST_INIT(admin_verbs_spawn, list(/datum/admins/proc/spawn_atom, /datum/admins/proc/spawn_cargo, /client/proc/respawn_character)) +GLOBAL_LIST_INIT(admin_verbs_spawn, list(/datum/admins/proc/spawn_atom, /datum/admins/proc/spawn_cargo, /datum/admins/proc/spawn_objasmob, /client/proc/respawn_character)) GLOBAL_PROTECT(admin_verbs_server) GLOBAL_LIST_INIT(admin_verbs_server, world.AVerbsServer()) /world/proc/AVerbsServer() diff --git a/code/modules/admin/verbs/spawnobjasmob.dm b/code/modules/admin/verbs/spawnobjasmob.dm new file mode 100644 index 0000000000..f51f776d6f --- /dev/null +++ b/code/modules/admin/verbs/spawnobjasmob.dm @@ -0,0 +1,70 @@ +/datum/admins/proc/spawn_objasmob(object as text) + set category = "Debug" + set desc = "(obj path) Spawn object-mob" + set name = "Spawn object-mob" + + if(!check_rights(R_SPAWN)) + return + + var/chosen = pick_closest_path(object, make_types_fancy(subtypesof(/obj))) + + if (!chosen) + return + + var/mob/living/simple_animal/hostile/mimic/copy/basemob = /mob/living/simple_animal/hostile/mimic/copy + + var/obj/chosen_obj = text2path(chosen) + + var/list/settings = list( + "mainsettings" = list( + "name" = list("desc" = "Name", "type" = "string", "value" = "Bob"), + "maxhealth" = list("desc" = "Max. health", "type" = "number", "value" = 100), + "access" = list("desc" = "Access ID", "type" = "datum", "path" = "/obj/item/card/id", "value" = "Default"), + "objtype" = list("desc" = "Base obj type", "type" = "datum", "path" = "/obj", "value" = "[chosen]"), + "googlyeyes" = list("desc" = "Googly eyes", "type" = "boolean", "value" = "No"), + "disableai" = list("desc" = "Disable AI", "type" = "boolean", "value" = "Yes"), + "idledamage" = list("desc" = "Damaged while idle", "type" = "boolean", "value" = "No"), + "dropitem" = list("desc" = "Drop obj on death", "type" = "boolean", "value" = "Yes"), + "mobtype" = list("desc" = "Base mob type", "type" = "datum", "path" = "/mob/living/simple_animal/hostile/mimic/copy", "value" = "/mob/living/simple_animal/hostile/mimic/copy"), + "ckey" = list("desc" = "ckey", "type" = "ckey", "value" = "none"), + ) + ) + + var/list/prefreturn = presentpreflikepicker(usr,"Customize mob", "Customize mob", Button1="Ok", width = 450, StealFocus = 1,Timeout = 0, settings=settings) + if (prefreturn["button"] == 1) + settings = prefreturn["settings"] + var/mainsettings = settings["mainsettings"] + chosen_obj = text2path(mainsettings["objtype"]["value"]) + + basemob = text2path(mainsettings["mobtype"]["value"]) + if (!ispath(basemob, /mob/living/simple_animal/hostile/mimic/copy) || !ispath(chosen_obj, /obj)) + to_chat(usr, "Mob or object path invalid") + + basemob = new basemob(get_turf(usr), new chosen_obj(get_turf(usr)), usr, mainsettings["dropitem"]["value"] == "Yes" ? FALSE : TRUE, (mainsettings["googlyeyes"]["value"] == "Yes" ? FALSE : TRUE)) + + if (mainsettings["disableai"]["value"] == "Yes") + basemob.toggle_ai(AI_OFF) + + if (mainsettings["idledamage"]["value"] == "No") + basemob.idledamage = FALSE + + if (mainsettings["access"]) + var/newaccess = text2path(mainsettings["access"]["value"]) + if (ispath(newaccess)) + basemob.access_card = new newaccess + + if (mainsettings["maxhealth"]["value"]) + if (!isnum(mainsettings["maxhealth"]["value"])) + mainsettings["maxhealth"]["value"] = text2num(mainsettings["maxhealth"]["value"]) + if (mainsettings["maxhealth"]["value"] > 0) + basemob.maxHealth = basemob.maxHealth = mainsettings["maxhealth"]["value"] + + if (mainsettings["name"]["value"]) + basemob.name = basemob.real_name = html_decode(mainsettings["name"]["value"]) + + if (mainsettings["ckey"]["value"] != "none") + basemob.ckey = mainsettings["ckey"]["value"] + + + log_admin("[key_name(usr)] spawned a sentient object-mob [basemob] from [chosen_obj] at ([usr.x],[usr.y],[usr.z])") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Spawn object-mob") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index 670d571d4d..7259a730e5 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -101,15 +101,19 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca var/destroy_objects = 0 var/knockdown_people = 0 var/static/mutable_appearance/googly_eyes = mutable_appearance('icons/mob/mob.dmi', "googly_eyes") + var/overlay_googly_eyes = TRUE + var/idledamage = TRUE gold_core_spawnable = NO_SPAWN -/mob/living/simple_animal/hostile/mimic/copy/Initialize(mapload, obj/copy, mob/living/creator, destroy_original = 0) +/mob/living/simple_animal/hostile/mimic/copy/Initialize(mapload, obj/copy, mob/living/creator, destroy_original = 0, no_googlies = FALSE) . = ..() + if (no_googlies) + overlay_googly_eyes = FALSE CopyObject(copy, creator, destroy_original) /mob/living/simple_animal/hostile/mimic/copy/Life() ..() - if(!target && !ckey) //Objects eventually revert to normal if no one is around to terrorize + if(idledamage && !target && !ckey) //Objects eventually revert to normal if no one is around to terrorize adjustBruteLoss(1) for(var/mob/living/M in contents) //a fix for animated statues from the flesh to stone spell death() @@ -143,7 +147,8 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca icon_state = O.icon_state icon_living = icon_state copy_overlays(O) - add_overlay(googly_eyes) + if (overlay_googly_eyes) + add_overlay(googly_eyes) if(isstructure(O) || ismachinery(O)) health = (anchored * 50) + 50 destroy_objects = 1 diff --git a/tgstation.dme b/tgstation.dme index 2bc8d3ec24..0f159bed10 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -1095,6 +1095,7 @@ #include "code\modules\admin\verbs\pray.dm" #include "code\modules\admin\verbs\randomverbs.dm" #include "code\modules\admin\verbs\reestablish_db_connection.dm" +#include "code\modules\admin\verbs\spawnobjasmob.dm" #include "code\modules\admin\verbs\tripAI.dm" #include "code\modules\admin\verbs\SDQL2\SDQL_2.dm" #include "code\modules\admin\verbs\SDQL2\SDQL_2_parser.dm" From 846f792ac1b48979f0e6ae9e0a5dbc61f35145ea Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 6 Mar 2018 04:04:15 -0600 Subject: [PATCH 38/45] Automatic changelog generation for PR #5825 [ci skip] --- html/changelogs/AutoChangeLog-pr-5825.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5825.yml diff --git a/html/changelogs/AutoChangeLog-pr-5825.yml b/html/changelogs/AutoChangeLog-pr-5825.yml new file mode 100644 index 0000000000..d16ba7b816 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5825.yml @@ -0,0 +1,4 @@ +author: "Naksu" +delete-after: True +changes: + - admin: "Admins can now easily spawn mobs that look like objects. Googly eyes optional!" From a2f1727b4e17afd44607575bc73590b6b534355a Mon Sep 17 00:00:00 2001 From: Poojawa Date: Tue, 6 Mar 2018 05:49:05 -0600 Subject: [PATCH 39/45] ignore admin.txt locally --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index b1cb02811c..626ef179a5 100644 --- a/.gitignore +++ b/.gitignore @@ -198,3 +198,4 @@ tools/MapAtmosFixer/MapAtmosFixer/obj/x86/Debug/MapAtmosFixer.csproj.CoreCompile #GitHub Atom .atom-build.json +cfg/admin.txt From 9a2ea0eb69bb2cfb916be194fb4aa401ed2ef095 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 6 Mar 2018 07:08:16 -0600 Subject: [PATCH 40/45] [MIRROR] Pubbystation: tweaks and fixes round two (#5803) * Pubbystation: tweaks and fixes round two * pubby fixes --- .../PubbyStation/PubbyStation.dmm | 606 ++++++++++-------- _maps/map_files/PubbyStation/PubbyStation.dmm | 606 ++++++++++-------- 2 files changed, 686 insertions(+), 526 deletions(-) diff --git a/_maps/cit_map_files/PubbyStation/PubbyStation.dmm b/_maps/cit_map_files/PubbyStation/PubbyStation.dmm index 0f56742f49..3eebcbf5e1 100644 --- a/_maps/cit_map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/cit_map_files/PubbyStation/PubbyStation.dmm @@ -8933,16 +8933,6 @@ dir = 4 }, /area/bridge) -"axf" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/preopen{ - id = "bridgespace"; - name = "bridge external shutters" - }, -/turf/open/floor/plasteel/vault{ - dir = 8 - }, -/area/bridge) "axg" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel/dark, @@ -12234,11 +12224,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/hallway/primary/central) -"aEY" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "aEZ" = ( /obj/structure/sink{ dir = 8; @@ -12942,6 +12927,11 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) +"aGW" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "aGX" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -15026,6 +15016,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/cable{ + icon_state = "2-4" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aMq" = ( @@ -15033,6 +15026,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aMr" = ( @@ -15040,6 +15036,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aMs" = ( @@ -15049,6 +15048,9 @@ /obj/structure/sign/poster/official/random{ pixel_y = 32 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aMt" = ( @@ -15063,6 +15065,9 @@ c_tag = "Cargo Warehouse"; dir = 2 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aMu" = ( @@ -15070,6 +15075,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aMv" = ( @@ -15083,6 +15091,9 @@ pixel_x = 26 }, /obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-8" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aMw" = ( @@ -15649,6 +15660,9 @@ /obj/structure/sign/poster/official/random{ pixel_x = -32 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aNO" = ( @@ -16155,6 +16169,9 @@ "aOY" = ( /obj/effect/spawner/lootdrop/maintenance, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aOZ" = ( @@ -16542,6 +16559,9 @@ req_access_txt = "31" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aQd" = ( @@ -17040,6 +17060,14 @@ /area/quartermaster/sorting) "aRl" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/power/apc/highcap/fifteen_k{ + dir = 4; + name = "Delivery Office APC"; + pixel_x = 28 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, /turf/open/floor/plasteel, /area/quartermaster/sorting) "aRm" = ( @@ -17057,6 +17085,9 @@ }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/delivery, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/quartermaster/warehouse) "aRo" = ( @@ -17434,6 +17465,9 @@ "aSh" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plating, /area/quartermaster/sorting) "aSi" = ( @@ -17447,6 +17481,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/quartermaster/storage) "aSj" = ( @@ -17825,6 +17862,9 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-4" + }, /turf/open/floor/plasteel, /area/quartermaster/office) "aTi" = ( @@ -17839,6 +17879,9 @@ departmentType = 2; pixel_y = 32 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/quartermaster/storage) "aTj" = ( @@ -17851,6 +17894,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 }, +/obj/structure/cable{ + icon_state = "1-8" + }, /turf/open/floor/plasteel, /area/quartermaster/storage) "aTl" = ( @@ -22032,8 +22078,7 @@ }, /area/maintenance/department/cargo) "bdA" = ( -/obj/item/cigbutt, -/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/droneDispenser, /turf/open/floor/plating, /area/maintenance/department/cargo) "bdB" = ( @@ -28377,7 +28422,7 @@ /turf/open/floor/plasteel/white, /area/science/explab) "btj" = ( -/obj/machinery/droneDispenser, +/obj/structure/table, /turf/open/floor/plasteel/white, /area/science/explab) "btk" = ( @@ -32314,6 +32359,9 @@ /area/crew_quarters/heads/hor) "bBw" = ( /obj/machinery/computer/security, +/obj/machinery/light{ + dir = 8 + }, /turf/open/floor/plasteel/red/side{ dir = 8 }, @@ -36419,6 +36467,14 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/hallway/primary/aft) +"bKN" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor/preopen{ + id = "prison release"; + name = "prisoner processing blast door" + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) "bKO" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/poddoor/preopen{ @@ -38108,6 +38164,7 @@ }, /obj/item/stack/sheet/glass, /obj/item/stack/rods/fifty, +/obj/item/pipe_dispenser, /turf/open/floor/plasteel/yellow/side, /area/engine/atmos) "bOY" = ( @@ -40916,9 +40973,6 @@ /obj/structure/table/reinforced, /obj/item/clipboard, /obj/item/lighter, -/obj/item/clothing/glasses/meson{ - pixel_y = 4 - }, /obj/item/stamp/ce, /obj/item/stock_parts/cell/high/plus, /obj/machinery/keycard_auth{ @@ -40933,6 +40987,7 @@ /obj/structure/cable{ icon_state = "0-8" }, +/obj/item/clothing/glasses/meson/engine, /turf/open/floor/plasteel/yellow/side{ dir = 4 }, @@ -42850,10 +42905,7 @@ }, /obj/effect/turf_decal/stripes/line, /obj/item/airlock_painter, -/obj/item/clothing/glasses/meson{ - pixel_x = 3; - pixel_y = -4 - }, +/obj/item/clothing/glasses/meson/engine, /turf/open/floor/plasteel, /area/engine/engineering) "cap" = ( @@ -43188,11 +43240,11 @@ "cbe" = ( /obj/item/pen, /obj/item/storage/belt/utility, -/obj/item/clothing/glasses/meson, /obj/item/paper_bin{ layer = 2.9 }, /obj/structure/table/glass, +/obj/item/clothing/glasses/meson/engine, /turf/open/floor/plasteel, /area/engine/engineering) "cbf" = ( @@ -43279,7 +43331,7 @@ /obj/structure/table, /obj/item/clothing/gloves/color/yellow, /obj/item/storage/belt/utility, -/obj/item/clothing/glasses/meson, +/obj/item/clothing/glasses/meson/engine, /turf/open/floor/plasteel, /area/engine/engineering) "cbo" = ( @@ -43728,6 +43780,9 @@ /obj/item/stack/sheet/mineral/plasma{ amount = 30 }, +/obj/item/device/gps{ + gpstag = "ENG0" + }, /turf/open/floor/plating, /area/engine/engineering) "ccS" = ( @@ -49333,6 +49388,18 @@ dir = 1 }, /area/library/lounge) +"cyr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 29 + }, +/turf/open/floor/plasteel/red/side{ + dir = 1 + }, +/area/security/brig) "cyy" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 @@ -50057,18 +50124,25 @@ "cDa" = ( /turf/closed/wall, /area/quartermaster/warehouse) -"dse" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 +"dTw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-4" }, -/turf/open/floor/plasteel, -/area/quartermaster/sorting) -"dMB" = ( +/turf/open/floor/carpet, +/area/library) +"ecV" = ( /turf/open/floor/plasteel, /area/quartermaster/sorting) "eHp" = ( /turf/closed/wall, /area/crew_quarters/cryopod) +"eIE" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/library/lounge) "eJt" = ( /obj/machinery/computer/cryopod{ pixel_y = 24 @@ -50082,29 +50156,43 @@ }, /turf/open/floor/plasteel/darkpurple, /area/crew_quarters/cryopod) -"fwl" = ( +"fki" = ( /obj/structure/disposalpipe/segment{ - dir = 4 + dir = 6 }, /turf/open/floor/plasteel, /area/quartermaster/sorting) -"fWv" = ( -/obj/structure/bookcase/random/religion, -/turf/open/floor/plasteel/dark, -/area/library/lounge) -"ick" = ( +"frt" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /obj/structure/cable{ icon_state = "4-8" }, -/turf/open/floor/plasteel/dark, -/area/library) -"ijF" = ( +/turf/open/floor/plasteel, +/area/quartermaster/office) +"fyh" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable{ icon_state = "1-2" }, /turf/open/floor/carpet, /area/library) +"fID" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"izp" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "Engineering"; + name = "engineering security door" + }, +/turf/open/floor/plating, +/area/security/checkpoint/engineering) "izB" = ( /obj/machinery/door/airlock/external{ name = "Escape Pod" @@ -50114,7 +50202,7 @@ }, /turf/open/floor/plating, /area/crew_quarters/dorms) -"iKb" = ( +"iCc" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/quartermaster/sorting) @@ -50141,31 +50229,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/library) -"jvi" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -26 - }, -/turf/open/floor/plasteel/darkred/side{ - dir = 1 - }, -/area/crew_quarters/heads/hos) -"jFO" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/carpet, -/area/library/lounge) -"jXh" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/library/lounge) "jZg" = ( /obj/machinery/cryopod, /turf/open/floor/plasteel/darkpurple, @@ -50197,6 +50260,24 @@ }, /turf/open/floor/plating, /area/ai_monitored/turret_protected/AIsatextAP) +"kqj" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"krG" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/library) +"let" = ( +/turf/closed/wall/r_wall, +/area/space) "lqy" = ( /obj/machinery/door/airlock/centcom{ name = "Library" @@ -50206,37 +50287,64 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/library/lounge) -"lAs" = ( -/turf/closed/wall, -/area/quartermaster/sorting) -"lQQ" = ( -/obj/machinery/door/poddoor/preopen{ - id = "bridgespace"; - name = "bridge external shutters" - }, -/turf/open/floor/plasteel/vault{ - dir = 8 - }, -/area/bridge) -"mdL" = ( -/obj/structure/table, -/obj/item/stock_parts/matter_bin, -/obj/item/stock_parts/matter_bin, -/obj/item/stock_parts/micro_laser, -/obj/item/stock_parts/micro_laser, -/obj/item/stack/cable_coil, -/obj/item/stack/cable_coil, -/turf/open/floor/plasteel/whitepurple/side, -/area/science/lab) -"mCe" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/preopen{ - id = "Engineering"; - name = "engineering security door" - }, +"lvl" = ( +/obj/effect/spawner/lootdrop/maintenance, +/obj/item/cigbutt, /turf/open/floor/plating, -/area/security/checkpoint/engineering) -"mKc" = ( +/area/maintenance/department/cargo) +"mHo" = ( +/obj/structure/table, +/obj/machinery/microwave{ + pixel_x = -3; + pixel_y = 6 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 27 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"mLe" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/turf/open/floor/plasteel/darkred/side{ + dir = 1 + }, +/area/crew_quarters/heads/hos) +"nuB" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/carpet, +/area/library/lounge) +"nJY" = ( +/obj/structure/rack, +/obj/item/stack/sheet/glass/fifty{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/stack/sheet/metal/fifty, +/turf/open/floor/plating, +/area/maintenance/department/cargo) +"opC" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/power/apc{ + dir = 4; + name = "Library APC"; + pixel_x = 24 + }, +/obj/structure/cable, +/turf/open/floor/plasteel/dark, +/area/library) +"oJF" = ( /obj/structure/bookcase/random/nonfiction, /turf/open/floor/plasteel/dark, /area/library/lounge) @@ -50263,16 +50371,6 @@ "pps" = ( /turf/closed/wall, /area/engine/break_room) -"pXc" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/carpet, -/area/library) -"qOE" = ( -/turf/open/floor/plasteel/dark, -/area/library/lounge) "qWK" = ( /obj/structure/cable{ icon_state = "4-8" @@ -50285,30 +50383,10 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"rxV" = ( -/obj/structure/table, -/obj/machinery/microwave{ - pixel_x = -3; - pixel_y = 6 - }, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = 27 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/kitchen) -"sBA" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = 29 - }, -/turf/open/floor/plasteel/red/side{ - dir = 1 - }, -/area/security/brig) +"sHK" = ( +/obj/structure/bookcase/random/religion, +/turf/open/floor/plasteel/dark, +/area/library/lounge) "sQt" = ( /obj/machinery/door/airlock/external{ name = "Supply Dock Airlock"; @@ -50331,6 +50409,10 @@ }, /turf/open/floor/plasteel/darkpurple, /area/crew_quarters/cryopod) +"tez" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/carpet, +/area/library/lounge) "tjW" = ( /obj/machinery/light{ dir = 8 @@ -50342,6 +50424,15 @@ }, /turf/open/floor/plasteel/dark, /area/security/prison) +"ufi" = ( +/turf/open/floor/plasteel/dark, +/area/library/lounge) +"urZ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/library) "uyt" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -50351,16 +50442,9 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"uTf" = ( -/turf/closed/wall/r_wall, -/area/space) "vpU" = ( /turf/open/floor/plasteel/darkpurple, /area/crew_quarters/cryopod) -"vyc" = ( -/obj/structure/lattice, -/turf/open/space/basic, -/area/space) "vzz" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -50385,36 +50469,32 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/library) -"wxJ" = ( -/obj/effect/turf_decal/delivery, +"vTA" = ( /obj/machinery/door/poddoor/preopen{ - id = "prison release"; - name = "prisoner processing blast door" + id = "bridgespace"; + name = "bridge external shutters" }, -/turf/open/floor/plasteel/dark, -/area/security/brig) -"xhj" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/carpet, -/area/library/lounge) -"xja" = ( -/obj/machinery/light/small{ - dir = 4 +/turf/open/floor/plasteel/vault{ + dir = 8 }, -/obj/machinery/power/apc{ - dir = 4; - name = "Library APC"; - pixel_x = 24 - }, -/obj/structure/cable, -/turf/open/floor/plasteel/dark, -/area/library) -"xjc" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel/dark, -/area/library) +/area/bridge) +"xzr" = ( +/turf/closed/wall, +/area/quartermaster/sorting) +"yhZ" = ( +/obj/structure/table, +/obj/item/stock_parts/matter_bin, +/obj/item/stock_parts/matter_bin, +/obj/item/stock_parts/micro_laser, +/obj/item/stock_parts/micro_laser, +/obj/item/stack/cable_coil, +/obj/item/stack/cable_coil, +/turf/open/floor/plasteel/whitepurple/side, +/area/science/lab) +"yia" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) (1,1,1) = {" aaa @@ -68080,13 +68160,13 @@ cgG cfn ckE ckT -xhj -xhj +tez +tez cwK -xhj -xhj +tez +tez cxn -xhj +tez lqy cxC cxK @@ -68338,12 +68418,12 @@ cvw cvK cwg cjR -jFO +nuB ckF -jFO +nuB cxe -jFO -jFO +nuB +nuB cxz cxD cxL @@ -68351,8 +68431,8 @@ cxY cym cyA vOw -ijF -pXc +fyh +dTw ckm ckm ckm @@ -68598,7 +68678,7 @@ cwr clm ckG cwU -jXh +eIE ckU cwe cwe @@ -68609,7 +68689,7 @@ cxM cyB cjp cyR -ick +urZ ckH ckH ckH @@ -68852,10 +68932,10 @@ cvy cvL cwe cwe -fWv -qOE +sHK +ufi ckV -qOE +ufi cln cwe cfN @@ -68866,7 +68946,7 @@ aaa aaa cjp cyS -ick +urZ cyZ ckH czo @@ -69109,10 +69189,10 @@ cvc cvM cfm cwe -fWv -qOE -mKc -qOE +sHK +ufi +oJF +ufi cln cwe caS @@ -69123,7 +69203,7 @@ aht aht cjp cko -ick +urZ ckH ckH clp @@ -69380,7 +69460,7 @@ aaa aaa cjp cyT -ick +urZ cyZ ckH czp @@ -69637,8 +69717,8 @@ aht aht cjp cjp -xjc -xja +krG +opC ckH czq czw @@ -70544,7 +70624,7 @@ aok aoO apF apE -wxJ +bKN apE bBW ajM @@ -73884,7 +73964,7 @@ anJ amX aoY apN -sBA +cyr arp asB atB @@ -74671,7 +74751,7 @@ aDv aBh aBh aGd -aEY +aGW aHG aIM aJG @@ -77221,7 +77301,7 @@ akW alK amw ani -jvi +mLe aiR aph ajM @@ -79131,7 +79211,7 @@ bXk bXk bXk bXk -uTf +let aaa aaa aaa @@ -79388,7 +79468,7 @@ cjT ckq ckq bXk -uTf +let aaa aaa aaa @@ -79645,7 +79725,7 @@ cgS cfV cfV bXk -uTf +let aaa aaa aaa @@ -79828,7 +79908,7 @@ aRN aWa aRN aRN -rxV +mHo aYS cpn bch @@ -79902,7 +79982,7 @@ cgT cfV ckr bXk -uTf +let aaa aaa aaa @@ -80159,7 +80239,7 @@ cfV cfV cfV bXk -uTf +let aaa aaa aaa @@ -80416,7 +80496,7 @@ cfV cfV cfV bXk -uTf +let aaa aaa aaa @@ -80673,7 +80753,7 @@ cgV cfV cfV bXk -uTf +let aaa aaa aaa @@ -80921,7 +81001,7 @@ cgv bBW bBW bBW -vyc +yia abI aaa bBW @@ -80930,7 +81010,7 @@ bBW cfV cfV bXk -uTf +let aaa aaa aaa @@ -81187,7 +81267,7 @@ bBW cfV cfV bXk -uTf +let aaa aaa aaa @@ -81439,12 +81519,12 @@ cii cis ciG aaa -vyc +yia cgV cfV cfV bXk -uTf +let aaa aaa aaa @@ -81701,7 +81781,7 @@ aht cfV cfV bXk -uTf +let aaa aaa aaa @@ -81947,7 +82027,7 @@ cfx cfa cgv cgV -vyc +yia aaa cik ciu @@ -81958,7 +82038,7 @@ aaa cfV cfV bXk -uTf +let aaa aaa aaa @@ -82215,7 +82295,7 @@ bBW cfV cfV bXk -uTf +let aaa aaa aaa @@ -82465,14 +82545,14 @@ bBW aaa aaa abI -vyc +yia aaa bBW bBW cfV cfV bXk -uTf +let aaa aaa aaa @@ -82703,7 +82783,7 @@ bUi bUV bVO bWA -mCe +izp bYj bYQ bZA @@ -82729,7 +82809,7 @@ cgV cfV cfV bXk -uTf +let aaa aaa aaa @@ -82960,7 +83040,7 @@ bUj bUW bVP bWB -mCe +izp bYk bYQ bZA @@ -82986,7 +83066,7 @@ cfV cfV cfV bXk -uTf +let abI abI aaa @@ -83142,9 +83222,9 @@ ahi atY auU atY -lQQ +vTA ayf -axf +vTA aAF aBz aCP @@ -83217,7 +83297,7 @@ bUk bUX bVQ bWC -mCe +izp bYl bYO bZC @@ -83243,7 +83323,7 @@ cfV cfV cfV bXk -uTf +let abI aaa aaa @@ -83500,7 +83580,7 @@ cgY cfV cks bXk -uTf +let aaa aaa aaa @@ -83757,7 +83837,7 @@ cgZ cfV cfV bXk -uTf +let abI aaa aaa @@ -84014,7 +84094,7 @@ cjU ckq ckq bXk -uTf +let aaa aaa aaa @@ -84271,7 +84351,7 @@ bXk bXk bXk ckJ -uTf +let aaa aaa aaa @@ -84991,7 +85071,7 @@ bsT bus bvz bxg -mdL +yhZ bAs bBu bCI @@ -85722,7 +85802,7 @@ aBI aES aBI aBI -aEY +aGW aHG aBI aJX @@ -85745,7 +85825,7 @@ aMb aSX aMb aBI -aEY +aGW bgA bhe aDZ @@ -87028,7 +87108,7 @@ aVu bat aLf bcy -aKq +lvl aEj aEj bgC @@ -87525,13 +87605,13 @@ eHp aHN aIU aJI -lAs -lAs +xzr +xzr aNG aOR -iKb -lAs -lAs +iCc +xzr +xzr aTb aOT aVp @@ -87542,7 +87622,7 @@ aPY bav aLf aFi -aFi +nJY beI bfv bgE @@ -87782,7 +87862,7 @@ aET aHN aIU aJI -lAs +xzr aMg aNH aOS @@ -88039,11 +88119,11 @@ aET aHN aJh bhe -lAs +xzr aMh aNI -fwl -dMB +fID +ecV aRi aSf aTd @@ -88296,13 +88376,13 @@ aHn aIi aJi aKe -lAs +xzr aMi aNJ -fwl +fID aPZ aRj -lAs +xzr aTe aUo aVs @@ -88553,13 +88633,13 @@ aET aHN aIU aJI -lAs +xzr aMj aNK -fwl -dMB -dMB -iKb +fID +ecV +ecV +iCc aTf aUp aVt @@ -88810,7 +88890,7 @@ aET aHN aIU aJI -lAs +xzr aMk aNL aOU @@ -89067,10 +89147,10 @@ cos coy aJj aJI -lAs +xzr aMl aNM -dse +fki aQb aRl aSh @@ -89324,14 +89404,14 @@ aDZ aDZ aJk aJH -lAs +xzr aMm -lAs +xzr aOW -lAs -lAs -lAs -aSY +xzr +xzr +xzr +frt aUs aLf aLf @@ -89574,18 +89654,18 @@ aAP avk aDg aEc -aEY +aGW cot aBI aBI aBI aJl aKf -lAs +xzr aMn -lAs +xzr aOX -lAs +xzr aRm aLg aTi @@ -89845,7 +89925,7 @@ cDa cDa cDa aLg -aTj +kqj aUu aVx aVx diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 0f56742f49..3eebcbf5e1 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -8933,16 +8933,6 @@ dir = 4 }, /area/bridge) -"axf" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/preopen{ - id = "bridgespace"; - name = "bridge external shutters" - }, -/turf/open/floor/plasteel/vault{ - dir = 8 - }, -/area/bridge) "axg" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel/dark, @@ -12234,11 +12224,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/hallway/primary/central) -"aEY" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "aEZ" = ( /obj/structure/sink{ dir = 8; @@ -12942,6 +12927,11 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) +"aGW" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "aGX" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -15026,6 +15016,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/cable{ + icon_state = "2-4" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aMq" = ( @@ -15033,6 +15026,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aMr" = ( @@ -15040,6 +15036,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aMs" = ( @@ -15049,6 +15048,9 @@ /obj/structure/sign/poster/official/random{ pixel_y = 32 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aMt" = ( @@ -15063,6 +15065,9 @@ c_tag = "Cargo Warehouse"; dir = 2 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aMu" = ( @@ -15070,6 +15075,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aMv" = ( @@ -15083,6 +15091,9 @@ pixel_x = 26 }, /obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-8" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aMw" = ( @@ -15649,6 +15660,9 @@ /obj/structure/sign/poster/official/random{ pixel_x = -32 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aNO" = ( @@ -16155,6 +16169,9 @@ "aOY" = ( /obj/effect/spawner/lootdrop/maintenance, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aOZ" = ( @@ -16542,6 +16559,9 @@ req_access_txt = "31" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aQd" = ( @@ -17040,6 +17060,14 @@ /area/quartermaster/sorting) "aRl" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/power/apc/highcap/fifteen_k{ + dir = 4; + name = "Delivery Office APC"; + pixel_x = 28 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, /turf/open/floor/plasteel, /area/quartermaster/sorting) "aRm" = ( @@ -17057,6 +17085,9 @@ }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/delivery, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/quartermaster/warehouse) "aRo" = ( @@ -17434,6 +17465,9 @@ "aSh" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plating, /area/quartermaster/sorting) "aSi" = ( @@ -17447,6 +17481,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/quartermaster/storage) "aSj" = ( @@ -17825,6 +17862,9 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-4" + }, /turf/open/floor/plasteel, /area/quartermaster/office) "aTi" = ( @@ -17839,6 +17879,9 @@ departmentType = 2; pixel_y = 32 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/quartermaster/storage) "aTj" = ( @@ -17851,6 +17894,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 }, +/obj/structure/cable{ + icon_state = "1-8" + }, /turf/open/floor/plasteel, /area/quartermaster/storage) "aTl" = ( @@ -22032,8 +22078,7 @@ }, /area/maintenance/department/cargo) "bdA" = ( -/obj/item/cigbutt, -/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/droneDispenser, /turf/open/floor/plating, /area/maintenance/department/cargo) "bdB" = ( @@ -28377,7 +28422,7 @@ /turf/open/floor/plasteel/white, /area/science/explab) "btj" = ( -/obj/machinery/droneDispenser, +/obj/structure/table, /turf/open/floor/plasteel/white, /area/science/explab) "btk" = ( @@ -32314,6 +32359,9 @@ /area/crew_quarters/heads/hor) "bBw" = ( /obj/machinery/computer/security, +/obj/machinery/light{ + dir = 8 + }, /turf/open/floor/plasteel/red/side{ dir = 8 }, @@ -36419,6 +36467,14 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/hallway/primary/aft) +"bKN" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor/preopen{ + id = "prison release"; + name = "prisoner processing blast door" + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) "bKO" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/poddoor/preopen{ @@ -38108,6 +38164,7 @@ }, /obj/item/stack/sheet/glass, /obj/item/stack/rods/fifty, +/obj/item/pipe_dispenser, /turf/open/floor/plasteel/yellow/side, /area/engine/atmos) "bOY" = ( @@ -40916,9 +40973,6 @@ /obj/structure/table/reinforced, /obj/item/clipboard, /obj/item/lighter, -/obj/item/clothing/glasses/meson{ - pixel_y = 4 - }, /obj/item/stamp/ce, /obj/item/stock_parts/cell/high/plus, /obj/machinery/keycard_auth{ @@ -40933,6 +40987,7 @@ /obj/structure/cable{ icon_state = "0-8" }, +/obj/item/clothing/glasses/meson/engine, /turf/open/floor/plasteel/yellow/side{ dir = 4 }, @@ -42850,10 +42905,7 @@ }, /obj/effect/turf_decal/stripes/line, /obj/item/airlock_painter, -/obj/item/clothing/glasses/meson{ - pixel_x = 3; - pixel_y = -4 - }, +/obj/item/clothing/glasses/meson/engine, /turf/open/floor/plasteel, /area/engine/engineering) "cap" = ( @@ -43188,11 +43240,11 @@ "cbe" = ( /obj/item/pen, /obj/item/storage/belt/utility, -/obj/item/clothing/glasses/meson, /obj/item/paper_bin{ layer = 2.9 }, /obj/structure/table/glass, +/obj/item/clothing/glasses/meson/engine, /turf/open/floor/plasteel, /area/engine/engineering) "cbf" = ( @@ -43279,7 +43331,7 @@ /obj/structure/table, /obj/item/clothing/gloves/color/yellow, /obj/item/storage/belt/utility, -/obj/item/clothing/glasses/meson, +/obj/item/clothing/glasses/meson/engine, /turf/open/floor/plasteel, /area/engine/engineering) "cbo" = ( @@ -43728,6 +43780,9 @@ /obj/item/stack/sheet/mineral/plasma{ amount = 30 }, +/obj/item/device/gps{ + gpstag = "ENG0" + }, /turf/open/floor/plating, /area/engine/engineering) "ccS" = ( @@ -49333,6 +49388,18 @@ dir = 1 }, /area/library/lounge) +"cyr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 29 + }, +/turf/open/floor/plasteel/red/side{ + dir = 1 + }, +/area/security/brig) "cyy" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 @@ -50057,18 +50124,25 @@ "cDa" = ( /turf/closed/wall, /area/quartermaster/warehouse) -"dse" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 +"dTw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-4" }, -/turf/open/floor/plasteel, -/area/quartermaster/sorting) -"dMB" = ( +/turf/open/floor/carpet, +/area/library) +"ecV" = ( /turf/open/floor/plasteel, /area/quartermaster/sorting) "eHp" = ( /turf/closed/wall, /area/crew_quarters/cryopod) +"eIE" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/library/lounge) "eJt" = ( /obj/machinery/computer/cryopod{ pixel_y = 24 @@ -50082,29 +50156,43 @@ }, /turf/open/floor/plasteel/darkpurple, /area/crew_quarters/cryopod) -"fwl" = ( +"fki" = ( /obj/structure/disposalpipe/segment{ - dir = 4 + dir = 6 }, /turf/open/floor/plasteel, /area/quartermaster/sorting) -"fWv" = ( -/obj/structure/bookcase/random/religion, -/turf/open/floor/plasteel/dark, -/area/library/lounge) -"ick" = ( +"frt" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /obj/structure/cable{ icon_state = "4-8" }, -/turf/open/floor/plasteel/dark, -/area/library) -"ijF" = ( +/turf/open/floor/plasteel, +/area/quartermaster/office) +"fyh" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable{ icon_state = "1-2" }, /turf/open/floor/carpet, /area/library) +"fID" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"izp" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "Engineering"; + name = "engineering security door" + }, +/turf/open/floor/plating, +/area/security/checkpoint/engineering) "izB" = ( /obj/machinery/door/airlock/external{ name = "Escape Pod" @@ -50114,7 +50202,7 @@ }, /turf/open/floor/plating, /area/crew_quarters/dorms) -"iKb" = ( +"iCc" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/quartermaster/sorting) @@ -50141,31 +50229,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/library) -"jvi" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -26 - }, -/turf/open/floor/plasteel/darkred/side{ - dir = 1 - }, -/area/crew_quarters/heads/hos) -"jFO" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/carpet, -/area/library/lounge) -"jXh" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/library/lounge) "jZg" = ( /obj/machinery/cryopod, /turf/open/floor/plasteel/darkpurple, @@ -50197,6 +50260,24 @@ }, /turf/open/floor/plating, /area/ai_monitored/turret_protected/AIsatextAP) +"kqj" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"krG" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/library) +"let" = ( +/turf/closed/wall/r_wall, +/area/space) "lqy" = ( /obj/machinery/door/airlock/centcom{ name = "Library" @@ -50206,37 +50287,64 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/library/lounge) -"lAs" = ( -/turf/closed/wall, -/area/quartermaster/sorting) -"lQQ" = ( -/obj/machinery/door/poddoor/preopen{ - id = "bridgespace"; - name = "bridge external shutters" - }, -/turf/open/floor/plasteel/vault{ - dir = 8 - }, -/area/bridge) -"mdL" = ( -/obj/structure/table, -/obj/item/stock_parts/matter_bin, -/obj/item/stock_parts/matter_bin, -/obj/item/stock_parts/micro_laser, -/obj/item/stock_parts/micro_laser, -/obj/item/stack/cable_coil, -/obj/item/stack/cable_coil, -/turf/open/floor/plasteel/whitepurple/side, -/area/science/lab) -"mCe" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/preopen{ - id = "Engineering"; - name = "engineering security door" - }, +"lvl" = ( +/obj/effect/spawner/lootdrop/maintenance, +/obj/item/cigbutt, /turf/open/floor/plating, -/area/security/checkpoint/engineering) -"mKc" = ( +/area/maintenance/department/cargo) +"mHo" = ( +/obj/structure/table, +/obj/machinery/microwave{ + pixel_x = -3; + pixel_y = 6 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 27 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"mLe" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/turf/open/floor/plasteel/darkred/side{ + dir = 1 + }, +/area/crew_quarters/heads/hos) +"nuB" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/carpet, +/area/library/lounge) +"nJY" = ( +/obj/structure/rack, +/obj/item/stack/sheet/glass/fifty{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/stack/sheet/metal/fifty, +/turf/open/floor/plating, +/area/maintenance/department/cargo) +"opC" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/power/apc{ + dir = 4; + name = "Library APC"; + pixel_x = 24 + }, +/obj/structure/cable, +/turf/open/floor/plasteel/dark, +/area/library) +"oJF" = ( /obj/structure/bookcase/random/nonfiction, /turf/open/floor/plasteel/dark, /area/library/lounge) @@ -50263,16 +50371,6 @@ "pps" = ( /turf/closed/wall, /area/engine/break_room) -"pXc" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/carpet, -/area/library) -"qOE" = ( -/turf/open/floor/plasteel/dark, -/area/library/lounge) "qWK" = ( /obj/structure/cable{ icon_state = "4-8" @@ -50285,30 +50383,10 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"rxV" = ( -/obj/structure/table, -/obj/machinery/microwave{ - pixel_x = -3; - pixel_y = 6 - }, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = 27 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/kitchen) -"sBA" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = 29 - }, -/turf/open/floor/plasteel/red/side{ - dir = 1 - }, -/area/security/brig) +"sHK" = ( +/obj/structure/bookcase/random/religion, +/turf/open/floor/plasteel/dark, +/area/library/lounge) "sQt" = ( /obj/machinery/door/airlock/external{ name = "Supply Dock Airlock"; @@ -50331,6 +50409,10 @@ }, /turf/open/floor/plasteel/darkpurple, /area/crew_quarters/cryopod) +"tez" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/carpet, +/area/library/lounge) "tjW" = ( /obj/machinery/light{ dir = 8 @@ -50342,6 +50424,15 @@ }, /turf/open/floor/plasteel/dark, /area/security/prison) +"ufi" = ( +/turf/open/floor/plasteel/dark, +/area/library/lounge) +"urZ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/library) "uyt" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -50351,16 +50442,9 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"uTf" = ( -/turf/closed/wall/r_wall, -/area/space) "vpU" = ( /turf/open/floor/plasteel/darkpurple, /area/crew_quarters/cryopod) -"vyc" = ( -/obj/structure/lattice, -/turf/open/space/basic, -/area/space) "vzz" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -50385,36 +50469,32 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/library) -"wxJ" = ( -/obj/effect/turf_decal/delivery, +"vTA" = ( /obj/machinery/door/poddoor/preopen{ - id = "prison release"; - name = "prisoner processing blast door" + id = "bridgespace"; + name = "bridge external shutters" }, -/turf/open/floor/plasteel/dark, -/area/security/brig) -"xhj" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/carpet, -/area/library/lounge) -"xja" = ( -/obj/machinery/light/small{ - dir = 4 +/turf/open/floor/plasteel/vault{ + dir = 8 }, -/obj/machinery/power/apc{ - dir = 4; - name = "Library APC"; - pixel_x = 24 - }, -/obj/structure/cable, -/turf/open/floor/plasteel/dark, -/area/library) -"xjc" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel/dark, -/area/library) +/area/bridge) +"xzr" = ( +/turf/closed/wall, +/area/quartermaster/sorting) +"yhZ" = ( +/obj/structure/table, +/obj/item/stock_parts/matter_bin, +/obj/item/stock_parts/matter_bin, +/obj/item/stock_parts/micro_laser, +/obj/item/stock_parts/micro_laser, +/obj/item/stack/cable_coil, +/obj/item/stack/cable_coil, +/turf/open/floor/plasteel/whitepurple/side, +/area/science/lab) +"yia" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) (1,1,1) = {" aaa @@ -68080,13 +68160,13 @@ cgG cfn ckE ckT -xhj -xhj +tez +tez cwK -xhj -xhj +tez +tez cxn -xhj +tez lqy cxC cxK @@ -68338,12 +68418,12 @@ cvw cvK cwg cjR -jFO +nuB ckF -jFO +nuB cxe -jFO -jFO +nuB +nuB cxz cxD cxL @@ -68351,8 +68431,8 @@ cxY cym cyA vOw -ijF -pXc +fyh +dTw ckm ckm ckm @@ -68598,7 +68678,7 @@ cwr clm ckG cwU -jXh +eIE ckU cwe cwe @@ -68609,7 +68689,7 @@ cxM cyB cjp cyR -ick +urZ ckH ckH ckH @@ -68852,10 +68932,10 @@ cvy cvL cwe cwe -fWv -qOE +sHK +ufi ckV -qOE +ufi cln cwe cfN @@ -68866,7 +68946,7 @@ aaa aaa cjp cyS -ick +urZ cyZ ckH czo @@ -69109,10 +69189,10 @@ cvc cvM cfm cwe -fWv -qOE -mKc -qOE +sHK +ufi +oJF +ufi cln cwe caS @@ -69123,7 +69203,7 @@ aht aht cjp cko -ick +urZ ckH ckH clp @@ -69380,7 +69460,7 @@ aaa aaa cjp cyT -ick +urZ cyZ ckH czp @@ -69637,8 +69717,8 @@ aht aht cjp cjp -xjc -xja +krG +opC ckH czq czw @@ -70544,7 +70624,7 @@ aok aoO apF apE -wxJ +bKN apE bBW ajM @@ -73884,7 +73964,7 @@ anJ amX aoY apN -sBA +cyr arp asB atB @@ -74671,7 +74751,7 @@ aDv aBh aBh aGd -aEY +aGW aHG aIM aJG @@ -77221,7 +77301,7 @@ akW alK amw ani -jvi +mLe aiR aph ajM @@ -79131,7 +79211,7 @@ bXk bXk bXk bXk -uTf +let aaa aaa aaa @@ -79388,7 +79468,7 @@ cjT ckq ckq bXk -uTf +let aaa aaa aaa @@ -79645,7 +79725,7 @@ cgS cfV cfV bXk -uTf +let aaa aaa aaa @@ -79828,7 +79908,7 @@ aRN aWa aRN aRN -rxV +mHo aYS cpn bch @@ -79902,7 +79982,7 @@ cgT cfV ckr bXk -uTf +let aaa aaa aaa @@ -80159,7 +80239,7 @@ cfV cfV cfV bXk -uTf +let aaa aaa aaa @@ -80416,7 +80496,7 @@ cfV cfV cfV bXk -uTf +let aaa aaa aaa @@ -80673,7 +80753,7 @@ cgV cfV cfV bXk -uTf +let aaa aaa aaa @@ -80921,7 +81001,7 @@ cgv bBW bBW bBW -vyc +yia abI aaa bBW @@ -80930,7 +81010,7 @@ bBW cfV cfV bXk -uTf +let aaa aaa aaa @@ -81187,7 +81267,7 @@ bBW cfV cfV bXk -uTf +let aaa aaa aaa @@ -81439,12 +81519,12 @@ cii cis ciG aaa -vyc +yia cgV cfV cfV bXk -uTf +let aaa aaa aaa @@ -81701,7 +81781,7 @@ aht cfV cfV bXk -uTf +let aaa aaa aaa @@ -81947,7 +82027,7 @@ cfx cfa cgv cgV -vyc +yia aaa cik ciu @@ -81958,7 +82038,7 @@ aaa cfV cfV bXk -uTf +let aaa aaa aaa @@ -82215,7 +82295,7 @@ bBW cfV cfV bXk -uTf +let aaa aaa aaa @@ -82465,14 +82545,14 @@ bBW aaa aaa abI -vyc +yia aaa bBW bBW cfV cfV bXk -uTf +let aaa aaa aaa @@ -82703,7 +82783,7 @@ bUi bUV bVO bWA -mCe +izp bYj bYQ bZA @@ -82729,7 +82809,7 @@ cgV cfV cfV bXk -uTf +let aaa aaa aaa @@ -82960,7 +83040,7 @@ bUj bUW bVP bWB -mCe +izp bYk bYQ bZA @@ -82986,7 +83066,7 @@ cfV cfV cfV bXk -uTf +let abI abI aaa @@ -83142,9 +83222,9 @@ ahi atY auU atY -lQQ +vTA ayf -axf +vTA aAF aBz aCP @@ -83217,7 +83297,7 @@ bUk bUX bVQ bWC -mCe +izp bYl bYO bZC @@ -83243,7 +83323,7 @@ cfV cfV cfV bXk -uTf +let abI aaa aaa @@ -83500,7 +83580,7 @@ cgY cfV cks bXk -uTf +let aaa aaa aaa @@ -83757,7 +83837,7 @@ cgZ cfV cfV bXk -uTf +let abI aaa aaa @@ -84014,7 +84094,7 @@ cjU ckq ckq bXk -uTf +let aaa aaa aaa @@ -84271,7 +84351,7 @@ bXk bXk bXk ckJ -uTf +let aaa aaa aaa @@ -84991,7 +85071,7 @@ bsT bus bvz bxg -mdL +yhZ bAs bBu bCI @@ -85722,7 +85802,7 @@ aBI aES aBI aBI -aEY +aGW aHG aBI aJX @@ -85745,7 +85825,7 @@ aMb aSX aMb aBI -aEY +aGW bgA bhe aDZ @@ -87028,7 +87108,7 @@ aVu bat aLf bcy -aKq +lvl aEj aEj bgC @@ -87525,13 +87605,13 @@ eHp aHN aIU aJI -lAs -lAs +xzr +xzr aNG aOR -iKb -lAs -lAs +iCc +xzr +xzr aTb aOT aVp @@ -87542,7 +87622,7 @@ aPY bav aLf aFi -aFi +nJY beI bfv bgE @@ -87782,7 +87862,7 @@ aET aHN aIU aJI -lAs +xzr aMg aNH aOS @@ -88039,11 +88119,11 @@ aET aHN aJh bhe -lAs +xzr aMh aNI -fwl -dMB +fID +ecV aRi aSf aTd @@ -88296,13 +88376,13 @@ aHn aIi aJi aKe -lAs +xzr aMi aNJ -fwl +fID aPZ aRj -lAs +xzr aTe aUo aVs @@ -88553,13 +88633,13 @@ aET aHN aIU aJI -lAs +xzr aMj aNK -fwl -dMB -dMB -iKb +fID +ecV +ecV +iCc aTf aUp aVt @@ -88810,7 +88890,7 @@ aET aHN aIU aJI -lAs +xzr aMk aNL aOU @@ -89067,10 +89147,10 @@ cos coy aJj aJI -lAs +xzr aMl aNM -dse +fki aQb aRl aSh @@ -89324,14 +89404,14 @@ aDZ aDZ aJk aJH -lAs +xzr aMm -lAs +xzr aOW -lAs -lAs -lAs -aSY +xzr +xzr +xzr +frt aUs aLf aLf @@ -89574,18 +89654,18 @@ aAP avk aDg aEc -aEY +aGW cot aBI aBI aBI aJl aKf -lAs +xzr aMn -lAs +xzr aOX -lAs +xzr aRm aLg aTi @@ -89845,7 +89925,7 @@ cDa cDa cDa aLg -aTj +kqj aUu aVx aVx From 33b87cedbe7e970da5f861848721fd3cd6e7fd6f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 6 Mar 2018 07:08:19 -0600 Subject: [PATCH 41/45] Automatic changelog generation for PR #5803 [ci skip] --- html/changelogs/AutoChangeLog-pr-5803.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5803.yml diff --git a/html/changelogs/AutoChangeLog-pr-5803.yml b/html/changelogs/AutoChangeLog-pr-5803.yml new file mode 100644 index 0000000000..39ecfb7c9d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5803.yml @@ -0,0 +1,6 @@ +author: "Denton" +delete-after: True +changes: + - bugfix: "Pubbystation: Added a missing APC to the cargo sorting room, a light fixture to the RnD security checkpoint and removed an overlooked firelock east of the bridge." + - rscadd: "Pubbystation: Added a spare RPD to the Atmospherics department. Replaced Engineering's outdated meson goggles with modern engineering scanners. Added a GPS device to the secure storage crate." + - tweak: "Moved Pubbystation's drone shell dispenser from the experimentation lab to Robotics maint." From 534c4fcc18b24a4810f3150f4533ccf795a5d7b6 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 6 Mar 2018 12:28:22 -0600 Subject: [PATCH 42/45] [MIRROR] Space Parallax Tweak (#5806) * Space Parallax Tweak (#36137) * Tweaked contrasts Upped the contrast on layer 1. Tweaked the saturation to layer 2. * more saturation and contrast * tweak * . * Revert "." This reverts commit 9590c657bac2c3afed007c82a7d05d36fd4249a6. * Revert "Revert "."" This reverts commit 6b9adf4d3fc13d6d3d934cc3eb9ea464c432c414. * polish * DO YOU SEE? * Space Parallax Tweak --- icons/effects/parallax.dmi | Bin 367617 -> 147569 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/effects/parallax.dmi b/icons/effects/parallax.dmi index a518b2d2fc164fc43925751e5ff3fdc61470df63..181b76007d45e346591ef0ca43efabbeee6efe93 100755 GIT binary patch literal 147569 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

    ca?|l>7`Wtj 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%0DWJb!S^%8g3brw65ZOow+=t@L%&G5UBGUV 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

    !*IP*(+2Fug{d){M`+^)02Y1X&<+?-^9e8B*sw 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

    2yNhb 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 From a1416622d28f9bf82ed517a707d3280b4532946a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 6 Mar 2018 12:28:25 -0600 Subject: [PATCH 43/45] Automatic changelog generation for PR #5806 [ci skip] --- html/changelogs/AutoChangeLog-pr-5806.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5806.yml diff --git a/html/changelogs/AutoChangeLog-pr-5806.yml b/html/changelogs/AutoChangeLog-pr-5806.yml new file mode 100644 index 0000000000..c21932b1cb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5806.yml @@ -0,0 +1,4 @@ +author: "Jittai / ChuckTheSheep" +delete-after: True +changes: + - tweak: "Adjusted the space parallax's contrast to be less vibrant." From 86b11050b6981b35dba9c61704937b60962576b1 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Tue, 6 Mar 2018 17:40:48 -0600 Subject: [PATCH 44/45] Citadel's folder's end (#5828) * ERP, miscreants, clothing * github pls * guns, dogborg, areas, vendor * finishes moving around the last of the stuffs * cleaned up shit. italics on subtle messages vore code to modular_citadel too * updates codeowners and recompiles tgui because it's a healthy thing to do * reee, I had that spawner set byond * cleans up a bad pipe does the thing I've been meaning to do for a while now as well. * bumps up xenobio console requirements inb4 reee * snowflake commenting --- .github/CODEOWNERS | 6 +- _maps/cit_map_files/BoxStation/BoxStation.dmm | 517 +++---- .../Deltastation/DeltaStation2.dmm | 366 +++-- .../cit_map_files/MetaStation/MetaStation.dmm | 262 ++-- .../PubbyStation/PubbyStation.dmm | 41 +- _maps/map_files/BoxStation/BoxStation.dmm | 447 +++--- .../map_files/Deltastation/DeltaStation2.dmm | 127 +- _maps/map_files/MetaStation/MetaStation.dmm | 172 +-- _maps/map_files/PubbyStation/PubbyStation.dmm | 41 +- cfg/admin.txt | 2 +- code/{citadel => __HELPERS}/_cit_helpers.dm | 0 code/_globalvars/tooltips.dm | 1 - code/_onclick/god.dm | 8 - code/_onclick/hud/other_mobs.dm | 13 - code/citadel/cit_guns.dm | 1249 ----------------- code/citadel/cit_uniforms.dm | 40 - code/citadel/cit_vendors.dm | 102 -- code/citadel/discordbot.dm | 13 - code/controllers/configuration.dm | 287 ---- code/controllers/hooks-defs.dm | 87 -- code/controllers/subsystem/explosion.dm | 510 ------- code/controllers/subsystem/ping.dm | 42 - code/datums/antagonists/abductor.dm | 182 --- code/datums/antagonists/antag_datum.dm | 246 ---- code/datums/antagonists/blob.dm | 67 - code/datums/antagonists/brother.dm | 154 -- code/datums/antagonists/changeling.dm | 545 ------- code/datums/antagonists/clockcult.dm | 219 --- code/datums/antagonists/cult.dm | 329 ----- code/datums/antagonists/datum_iaa.dm | 11 - code/datums/antagonists/datum_traitor.dm | 352 ----- code/datums/antagonists/devil.dm | 582 -------- code/datums/antagonists/internal_affairs.dm | 302 ---- code/datums/antagonists/monkey.dm | 214 --- code/datums/antagonists/ninja.dm | 155 -- code/datums/antagonists/nukeop.dm | 379 ----- code/datums/antagonists/pirate.dm | 132 -- code/datums/antagonists/revolution.dm | 368 ----- code/datums/antagonists/wizard.dm | 339 ----- code/datums/votablemap.dm | 10 - code/game/gamemodes/antag_spawner_cit.dm | 57 - code/game/gamemodes/cit_objectives.dm | 106 -- code/game/gamemodes/cult/blood_magic.dm | 769 ---------- .../objects/items/devices/dogborg_sleeper.dm} | 405 +----- code/game/skincmd.dm | 13 - .../atmospherics/machinery/other/zvent.dm | 36 - code/modules/client/verbs/sethotkeys.dm | 25 - code/modules/events/solar_flare.dm | 17 - code/modules/holodeck/computer_funcs.dm | 111 -- code/modules/mob/say_vr.dm | 2 +- code/modules/research/techweb/all_nodes.dm | 4 +- .../code/game/area}/areas.dmi | Bin .../code/game/area}/cit_areas.dm | 4 +- .../code/game/machinery/displaycases.dm | 0 .../code/game/machinery}/plasmacases.dm | 0 .../code/game/machinery/vending.dm | 105 +- .../game/objects/effects/spawner/spawners.dm | 0 .../game/objects/items/devices/genemods.dm | 0 .../antagonists}/cit_crewobjectives.dm | 0 .../modules/antagonists}/cit_miscreants.dm | 0 .../cit_crewobjectives_cargo.dm | 0 .../cit_crewobjectives_civilian.dm | 0 .../cit_crewobjectives_command.dm | 0 .../cit_crewobjectives_engineering.dm | 0 .../cit_crewobjectives_medical.dm | 0 .../cit_crewobjectives_science.dm | 0 .../cit_crewobjectives_security.dm | 0 .../code/modules/arousal/arousal.dm | 2 +- .../code/modules/arousal}/organs/breasts.dm | 2 +- .../code/modules/arousal}/organs/eggsack.dm | 2 +- .../code/modules/arousal}/organs/genitals.dm | 0 .../organs/genitals_sprite_accessories.dm | 14 +- .../modules/arousal}/organs/ovipositor.dm | 2 +- .../code/modules/arousal}/organs/penis.dm | 2 +- .../code/modules/arousal}/organs/testicles.dm | 2 +- .../code/modules/arousal}/organs/vagina.dm | 2 +- .../code/modules/arousal}/organs/womb.dm | 2 +- .../code/modules/arousal}/toys/dildos.dm | 2 +- .../code/modules/clothing/suits/suits.dm | 13 + .../code/modules/clothing/under.dm | 7 - .../code/modules/clothing/under/syndicate.dm | 2 - .../modules/clothing/under/turtlenecks.dm | 57 +- .../code/modules/clothing/under/under.dm | 9 +- .../modules}/custom_loadout/custom_items.dm | 0 .../modules}/custom_loadout/load_to_mob.dm | 0 .../modules}/custom_loadout/read_from_file.dm | 0 .../code/modules/mob}/cit_emotes.dm | 0 .../living/silicon/robot/dogborg archive.dm | 0 .../living/silicon/robot/dogborg_equipment.dm | 401 ++++++ .../mob/living/simple_animal}/pokemon.dm | 0 .../projectiles/guns/ballistic/flechette.dm | 117 ++ .../projectiles/guns/ballistic/handguns.dm | 424 ++++++ .../projectiles/guns/ballistic/magweapon.dm | 466 ++++++ .../projectiles/guns/ballistic/rifles.dm | 234 +++ .../projectiles/guns/ballistic/spinfusor.dm | 90 ++ .../projectiles/guns/energy/energy_gun.dm | 51 +- .../modules/projectiles/guns/energy/laser.dm | 31 +- .../reagents/reagent container}/cit_kegs.dm | 2 +- .../reagent container}/hypospraymkii.dm | 11 +- .../reagents/reagent container}/hypovial.dm | 31 +- .../reagents/reagents}/cit_reagents.dm | 6 +- .../code}/modules/vore/eating/belly_dat_vr.dm | 0 .../code}/modules/vore/eating/belly_obj_vr.dm | 0 .../modules/vore/eating/bellymodes_vr.dm | 0 .../modules/vore/eating/digest_act_vr.dm | 0 .../code}/modules/vore/eating/living_vr.dm | 0 .../modules/vore/eating/simple_animal_vr.dm | 0 .../code}/modules/vore/eating/vore_vr.dm | 0 .../code}/modules/vore/eating/voreitems.dm | 0 .../code}/modules/vore/eating/vorepanel_vr.dm | 0 .../code}/modules/vore/hook-defs_vr.dm | 0 .../code}/modules/vore/persistence.dm | 0 .../modules/vore/resizing/grav_pull_vr.dm | 0 .../modules/vore/resizing/holder_micro_vr.dm | 0 .../code}/modules/vore/resizing/resize_vr.dm | 0 .../modules/vore/resizing/sizechemicals.dm | 2 +- .../code}/modules/vore/resizing/sizegun_vr.dm | 0 .../code}/modules/vore/trycatch_vr.dm | 0 .../icons/misc}/misc.dmi | Bin .../icons/mob/legacy robo transforms.dmi | Bin .../icons/mob}/mobs.dmi | Bin .../icons/obj}/drinks.dmi | Bin .../icons/obj/genitals}/breasts.dmi | Bin .../icons/obj/genitals}/breasts_onmob.dmi | Bin .../icons/obj/genitals}/dildo.dmi | Bin .../icons/obj/genitals}/effects.dmi | Bin .../icons/obj/genitals}/hud.dmi | Bin .../icons/obj/genitals}/onahole.dmi | Bin .../icons/obj/genitals}/ovipositor.dmi | Bin .../icons/obj/genitals}/penis.dmi | Bin .../icons/obj/genitals}/penis_onmob.dmi | Bin .../icons/obj/genitals}/taur_penis_onmob.dmi | Bin .../icons/obj/genitals}/vagina.dmi | Bin .../icons/obj/genitals}/vagina_onmob.dmi | Bin modular_citadel/icons/obj/hypospraymkii.dmi | Bin 0 -> 1038 bytes .../icons/obj}/objects.dmi | Bin .../icons/obj}/structures.dmi | Bin modular_citadel/icons/obj/vial.dmi | Bin 0 -> 2148 bytes tgstation.dme | 105 +- tgui/assets/tgui.css | 2 +- 140 files changed, 2963 insertions(+), 9703 deletions(-) rename code/{citadel => __HELPERS}/_cit_helpers.dm (100%) delete mode 100755 code/_globalvars/tooltips.dm delete mode 100644 code/_onclick/god.dm delete mode 100644 code/_onclick/hud/other_mobs.dm delete mode 100644 code/citadel/cit_guns.dm delete mode 100644 code/citadel/cit_uniforms.dm delete mode 100644 code/citadel/cit_vendors.dm delete mode 100644 code/citadel/discordbot.dm delete mode 100644 code/controllers/configuration.dm delete mode 100644 code/controllers/hooks-defs.dm delete mode 100644 code/controllers/subsystem/explosion.dm delete mode 100644 code/controllers/subsystem/ping.dm delete mode 100644 code/datums/antagonists/abductor.dm delete mode 100644 code/datums/antagonists/antag_datum.dm delete mode 100644 code/datums/antagonists/blob.dm delete mode 100644 code/datums/antagonists/brother.dm delete mode 100644 code/datums/antagonists/changeling.dm delete mode 100644 code/datums/antagonists/clockcult.dm delete mode 100644 code/datums/antagonists/cult.dm delete mode 100644 code/datums/antagonists/datum_iaa.dm delete mode 100644 code/datums/antagonists/datum_traitor.dm delete mode 100644 code/datums/antagonists/devil.dm delete mode 100644 code/datums/antagonists/internal_affairs.dm delete mode 100644 code/datums/antagonists/monkey.dm delete mode 100644 code/datums/antagonists/ninja.dm delete mode 100644 code/datums/antagonists/nukeop.dm delete mode 100644 code/datums/antagonists/pirate.dm delete mode 100644 code/datums/antagonists/revolution.dm delete mode 100644 code/datums/antagonists/wizard.dm delete mode 100644 code/datums/votablemap.dm delete mode 100644 code/game/gamemodes/antag_spawner_cit.dm delete mode 100644 code/game/gamemodes/cit_objectives.dm delete mode 100644 code/game/gamemodes/cult/blood_magic.dm rename code/{citadel/dogborgstuff.dm => game/objects/items/devices/dogborg_sleeper.dm} (57%) delete mode 100644 code/game/skincmd.dm delete mode 100644 code/modules/atmospherics/machinery/other/zvent.dm delete mode 100644 code/modules/client/verbs/sethotkeys.dm delete mode 100644 code/modules/events/solar_flare.dm delete mode 100644 code/modules/holodeck/computer_funcs.dm rename {code/citadel/icons => modular_citadel/code/game/area}/areas.dmi (100%) rename {code/citadel => modular_citadel/code/game/area}/cit_areas.dm (70%) rename code/citadel/cit_displaycases.dm => modular_citadel/code/game/machinery/displaycases.dm (100%) rename {code/citadel => modular_citadel/code/game/machinery}/plasmacases.dm (100%) rename code/citadel/cit_spawners.dm => modular_citadel/code/game/objects/effects/spawner/spawners.dm (100%) rename code/citadel/cit_genemods.dm => modular_citadel/code/game/objects/items/devices/genemods.dm (100%) rename {code/citadel => modular_citadel/code/modules/antagonists}/cit_crewobjectives.dm (100%) rename {code/citadel => modular_citadel/code/modules/antagonists}/cit_miscreants.dm (100%) rename {code/citadel => modular_citadel/code/modules/antagonists}/crew_objectives/cit_crewobjectives_cargo.dm (100%) rename {code/citadel => modular_citadel/code/modules/antagonists}/crew_objectives/cit_crewobjectives_civilian.dm (100%) rename {code/citadel => modular_citadel/code/modules/antagonists}/crew_objectives/cit_crewobjectives_command.dm (100%) rename {code/citadel => modular_citadel/code/modules/antagonists}/crew_objectives/cit_crewobjectives_engineering.dm (100%) rename {code/citadel => modular_citadel/code/modules/antagonists}/crew_objectives/cit_crewobjectives_medical.dm (100%) rename {code/citadel => modular_citadel/code/modules/antagonists}/crew_objectives/cit_crewobjectives_science.dm (100%) rename {code/citadel => modular_citadel/code/modules/antagonists}/crew_objectives/cit_crewobjectives_security.dm (100%) rename code/citadel/cit_arousal.dm => modular_citadel/code/modules/arousal/arousal.dm (99%) rename {code/citadel => modular_citadel/code/modules/arousal}/organs/breasts.dm (96%) rename {code/citadel => modular_citadel/code/modules/arousal}/organs/eggsack.dm (87%) rename {code/citadel => modular_citadel/code/modules/arousal}/organs/genitals.dm (100%) rename {code/citadel => modular_citadel/code/modules/arousal}/organs/genitals_sprite_accessories.dm (83%) rename {code/citadel => modular_citadel/code/modules/arousal}/organs/ovipositor.dm (88%) rename {code/citadel => modular_citadel/code/modules/arousal}/organs/penis.dm (97%) rename {code/citadel => modular_citadel/code/modules/arousal}/organs/testicles.dm (96%) rename {code/citadel => modular_citadel/code/modules/arousal}/organs/vagina.dm (97%) rename {code/citadel => modular_citadel/code/modules/arousal}/organs/womb.dm (94%) rename {code/citadel => modular_citadel/code/modules/arousal}/toys/dildos.dm (98%) create mode 100644 modular_citadel/code/modules/clothing/suits/suits.dm delete mode 100644 modular_citadel/code/modules/clothing/under.dm delete mode 100644 modular_citadel/code/modules/clothing/under/syndicate.dm rename code/citadel/cit_clothes.dm => modular_citadel/code/modules/clothing/under/under.dm (72%) rename {code/citadel => modular_citadel/code/modules}/custom_loadout/custom_items.dm (100%) rename {code/citadel => modular_citadel/code/modules}/custom_loadout/load_to_mob.dm (100%) rename {code/citadel => modular_citadel/code/modules}/custom_loadout/read_from_file.dm (100%) rename {code/citadel => modular_citadel/code/modules/mob}/cit_emotes.dm (100%) rename code/citadel/dogborgs.dm => modular_citadel/code/modules/mob/living/silicon/robot/dogborg archive.dm (100%) create mode 100644 modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm rename {code/citadel => modular_citadel/code/modules/mob/living/simple_animal}/pokemon.dm (100%) create mode 100644 modular_citadel/code/modules/projectiles/guns/ballistic/flechette.dm create mode 100644 modular_citadel/code/modules/projectiles/guns/ballistic/handguns.dm create mode 100644 modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm create mode 100644 modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm create mode 100644 modular_citadel/code/modules/projectiles/guns/ballistic/spinfusor.dm rename {code/citadel => modular_citadel/code/modules/reagents/reagent container}/cit_kegs.dm (93%) rename {code/citadel => modular_citadel/code/modules/reagents/reagent container}/hypospraymkii.dm (95%) rename {code/citadel => modular_citadel/code/modules/reagents/reagent container}/hypovial.dm (78%) rename {code/citadel => modular_citadel/code/modules/reagents/reagents}/cit_reagents.dm (98%) rename {code => modular_citadel/code}/modules/vore/eating/belly_dat_vr.dm (100%) rename {code => modular_citadel/code}/modules/vore/eating/belly_obj_vr.dm (100%) rename {code => modular_citadel/code}/modules/vore/eating/bellymodes_vr.dm (100%) rename {code => modular_citadel/code}/modules/vore/eating/digest_act_vr.dm (100%) rename {code => modular_citadel/code}/modules/vore/eating/living_vr.dm (100%) rename {code => modular_citadel/code}/modules/vore/eating/simple_animal_vr.dm (100%) rename {code => modular_citadel/code}/modules/vore/eating/vore_vr.dm (100%) rename {code => modular_citadel/code}/modules/vore/eating/voreitems.dm (100%) rename {code => modular_citadel/code}/modules/vore/eating/vorepanel_vr.dm (100%) rename {code => modular_citadel/code}/modules/vore/hook-defs_vr.dm (100%) rename {code => modular_citadel/code}/modules/vore/persistence.dm (100%) rename {code => modular_citadel/code}/modules/vore/resizing/grav_pull_vr.dm (100%) rename {code => modular_citadel/code}/modules/vore/resizing/holder_micro_vr.dm (100%) rename {code => modular_citadel/code}/modules/vore/resizing/resize_vr.dm (100%) rename {code => modular_citadel/code}/modules/vore/resizing/sizechemicals.dm (98%) rename {code => modular_citadel/code}/modules/vore/resizing/sizegun_vr.dm (100%) rename {code => modular_citadel/code}/modules/vore/trycatch_vr.dm (100%) rename {code/citadel/icons => modular_citadel/icons/misc}/misc.dmi (100%) rename code/citadel/icons/robot_transformations.dmi => modular_citadel/icons/mob/legacy robo transforms.dmi (100%) rename {code/citadel/icons => modular_citadel/icons/mob}/mobs.dmi (100%) rename {code/citadel/icons => modular_citadel/icons/obj}/drinks.dmi (100%) rename {code/citadel/icons => modular_citadel/icons/obj/genitals}/breasts.dmi (100%) rename {code/citadel/icons => modular_citadel/icons/obj/genitals}/breasts_onmob.dmi (100%) rename {code/citadel/icons => modular_citadel/icons/obj/genitals}/dildo.dmi (100%) rename {code/citadel/icons => modular_citadel/icons/obj/genitals}/effects.dmi (100%) rename {code/citadel/icons => modular_citadel/icons/obj/genitals}/hud.dmi (100%) rename {code/citadel/icons => modular_citadel/icons/obj/genitals}/onahole.dmi (100%) rename {code/citadel/icons => modular_citadel/icons/obj/genitals}/ovipositor.dmi (100%) rename {code/citadel/icons => modular_citadel/icons/obj/genitals}/penis.dmi (100%) rename {code/citadel/icons => modular_citadel/icons/obj/genitals}/penis_onmob.dmi (100%) rename {code/citadel/icons => modular_citadel/icons/obj/genitals}/taur_penis_onmob.dmi (100%) rename {code/citadel/icons => modular_citadel/icons/obj/genitals}/vagina.dmi (100%) rename {code/citadel/icons => modular_citadel/icons/obj/genitals}/vagina_onmob.dmi (100%) create mode 100644 modular_citadel/icons/obj/hypospraymkii.dmi rename {code/citadel/icons => modular_citadel/icons/obj}/objects.dmi (100%) rename {code/citadel/icons => modular_citadel/icons/obj}/structures.dmi (100%) create mode 100644 modular_citadel/icons/obj/vial.dmi diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 882acf789d..fc3f2852fc 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -6,15 +6,15 @@ #deathride58 /modular_citadel/ @deathride58 -/code/citadel/ @deathride58 #LetterJay /modular_citadel/code/modules/client/loadout/__donator.dm @LetterJay #Poojawa -/code/modules/vore @Poojawa -/code/citadel/dogborgstuff.dmm @Poojawa +/modular_citadel/code/modules/vore @Poojawa +/code/game/objects/items/devices/dogborg_sleeper.dm @Poojawa +/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm @Poojawa /tgui/ @Poojawa /modular_citadel/code/modules/clothing/spacesuits/flightsuit.dm @Poojawa /modular_citadel/code/game/objects/ids.dm @Poojawa diff --git a/_maps/cit_map_files/BoxStation/BoxStation.dmm b/_maps/cit_map_files/BoxStation/BoxStation.dmm index a0d27ff1da..279f479f10 100644 --- a/_maps/cit_map_files/BoxStation/BoxStation.dmm +++ b/_maps/cit_map_files/BoxStation/BoxStation.dmm @@ -932,7 +932,6 @@ pixel_x = 3; pixel_y = -3 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/effect/turf_decal/bot{ dir = 2 }, @@ -4573,15 +4572,13 @@ /area/engine/atmos) "aln" = ( /obj/machinery/door/airlock/external{ - cyclelinkeddir = 4; name = "Labor Camp Shuttle Airlock"; - req_access_txt = "2"; - shuttledocked = 1 + req_access_txt = "2" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/turf/open/floor/plating, +/turf/open/floor/plasteel/dark, /area/security/processing) "alp" = ( /turf/open/floor/plating, @@ -5349,7 +5346,7 @@ /area/maintenance/fore/secondary) "anE" = ( /obj/machinery/door/airlock/external{ - cyclelinkeddir = 4; + cyclelinkeddir = 0; req_access_txt = "13" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -5388,17 +5385,6 @@ /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/port/fore) -"anN" = ( -/obj/machinery/door/airlock/external{ - cyclelinkeddir = 4; - name = "Labor Camp Shuttle Airlock"; - shuttledocked = 1 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating, -/area/security/processing) "anO" = ( /obj/docking_port/stationary{ dir = 8; @@ -34457,13 +34443,6 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plasteel/white, /area/science/xenobiology) -"bIP" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/chair/comfy/black, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "bIQ" = ( /obj/structure/cable{ icon_state = "1-2" @@ -37312,7 +37291,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/structure/chair/comfy/black, /turf/open/floor/plasteel/white, /area/science/xenobiology) "bPz" = ( @@ -37339,15 +37317,13 @@ /turf/open/floor/plasteel, /area/science/xenobiology) "bPA" = ( -/obj/machinery/computer/camera_advanced/xenobio{ - dir = 1 - }, /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/structure/table/glass, /turf/open/floor/plasteel, /area/science/xenobiology) "bPB" = ( @@ -37437,10 +37413,10 @@ /turf/open/floor/plasteel, /area/science/xenobiology) "bPI" = ( -/obj/structure/reagent_dispensers/watertank, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/structure/reagent_dispensers/watertank/high, /turf/open/floor/plasteel, /area/science/xenobiology) "bPJ" = ( @@ -38378,6 +38354,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 10 }, +/obj/machinery/light{ + dir = 1 + }, /turf/open/floor/plasteel, /area/science/xenobiology) "bRZ" = ( @@ -40083,6 +40062,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 10 }, +/obj/machinery/light{ + dir = 1 + }, /turf/open/floor/plasteel, /area/science/xenobiology) "bWn" = ( @@ -41554,6 +41536,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 10 }, +/obj/machinery/light{ + dir = 1 + }, /turf/open/floor/plasteel, /area/science/xenobiology) "bZX" = ( @@ -42796,14 +42781,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"ccP" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"ccQ" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/science/xenobiology) "ccR" = ( /obj/machinery/portable_atmospherics/pump, /obj/effect/turf_decal/bot{ @@ -43709,20 +43686,6 @@ /obj/item/caution, /turf/open/floor/plating, /area/maintenance/aft) -"cfr" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 2; - external_pressure_bound = 140; - pressure_checks = 0; - name = "killroom vent" - }, -/obj/machinery/camera{ - c_tag = "Xenobiology Kill Room"; - dir = 4; - network = list("ss13","rd") - }, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) "cfs" = ( /obj/machinery/door/airlock/maintenance/abandoned{ name = "Air Supply Maintenance"; @@ -43760,15 +43723,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating/airless, /area/maintenance/solars/port/aft) -"cfy" = ( -/obj/structure/rack, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) "cfz" = ( /obj/structure/cable{ icon_state = "4-8" @@ -44004,9 +43958,6 @@ }, /turf/open/floor/plating, /area/maintenance/aft) -"cgi" = ( -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) "cgj" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/barricade/wooden, @@ -44015,18 +43966,19 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"cgk" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/biohazard, -/turf/open/floor/plating, -/area/science/xenobiology) "cgl" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ - dir = 2; - external_pressure_bound = 120; - name = "killroom vent" +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/circuit/killroom, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio0"; + name = "containment blast door" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/engine, /area/science/xenobiology) "cgm" = ( /obj/structure/cable{ @@ -44037,17 +43989,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"cgn" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - target_temperature = 80; - dir = 2; - on = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) "cgo" = ( /obj/structure/cable{ icon_state = "4-8" @@ -44425,13 +44366,6 @@ }, /turf/open/floor/plasteel/floorgrime, /area/maintenance/disposal/incinerator) -"cho" = ( -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 - }, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) "chp" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -44441,43 +44375,22 @@ }, /turf/closed/wall, /area/maintenance/starboard/aft) -"chq" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) -"chr" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/research{ - name = "Kill Chamber"; +"chs" = ( +/obj/machinery/door/window/northleft{ + base_state = "right"; + dir = 8; + icon_state = "right"; + name = "Containment Pen"; req_access_txt = "55" }, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/open/floor/plating, -/area/science/xenobiology) -"chs" = ( -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/manifold/general/visible, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) -"cht" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 +/obj/machinery/door/poddoor/preopen{ + id = "xenobio0"; + name = "containment blast door" }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"chu" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel/white, +/turf/open/floor/engine, /area/science/xenobiology) "chv" = ( /obj/structure/cable{ @@ -45267,18 +45180,6 @@ /obj/item/cigbutt/roach, /turf/open/floor/plating, /area/maintenance/aft) -"cjB" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 9 - }, -/obj/structure/table, -/obj/item/folder/white, -/obj/item/pen, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) "cjC" = ( /obj/structure/grille, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -45388,7 +45289,7 @@ req_access = null; req_access_txt = "10;13" }, -/turf/open/floor/plasteel, +/turf/open/floor/plating, /area/engine/engineering) "cjS" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -45555,11 +45456,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/aft) -"ckn" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/science/xenobiology) "cko" = ( /obj/structure/disposalpipe/segment, /turf/closed/wall, @@ -48100,8 +47996,8 @@ /area/space/nearstation) "csk" = ( /obj/structure/disposalpipe/segment, -/turf/open/floor/plating/airless, -/area/space/nearstation) +/turf/closed/wall/r_wall, +/area/science/xenobiology) "csl" = ( /obj/structure/transit_tube/curved{ dir = 4 @@ -49949,7 +49845,7 @@ /area/shuttle/pod_1) "cxG" = ( /obj/machinery/door/airlock/external{ - cyclelinkeddir = 4; + cyclelinkeddir = 0; name = "Escape Pod Three"; req_access_txt = "0" }, @@ -49959,15 +49855,21 @@ /turf/open/floor/plating, /area/security/main) "cxJ" = ( -/obj/machinery/door/airlock/external{ - cyclelinkeddir = 8; +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ name = "Labor Camp Shuttle Airlock"; req_access_txt = "2" }, +/obj/machinery/button/door{ + id = "prison release"; + name = "Labor Camp Shuttle Lockdown"; + pixel_y = -25; + req_access_txt = "2" + }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/turf/open/floor/plating, +/turf/open/floor/plasteel/dark, /area/security/processing) "cxN" = ( /obj/structure/cable{ @@ -49983,16 +49885,6 @@ }, /turf/open/floor/plating, /area/maintenance/solars/starboard/fore) -"cxP" = ( -/obj/machinery/door/airlock/external{ - cyclelinkeddir = 8; - name = "Labor Camp Shuttle Airlock" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/security/processing) "cxR" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/spawner/structure/window/reinforced, @@ -50331,11 +50223,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel/bar, /area/crew_quarters/bar) -"czQ" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "czR" = ( /obj/structure/cable{ icon_state = "1-2" @@ -52439,18 +52326,6 @@ }, /turf/open/floor/plating, /area/science/xenobiology) -"cTY" = ( -/obj/structure/sign/poster/official/safety_internals{ - pixel_x = -32 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"cTZ" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "cVb" = ( /turf/closed/wall, /area/hallway/secondary/service) @@ -52644,6 +52519,11 @@ }, /turf/open/floor/plasteel, /area/quartermaster/miningdock) +"fdi" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/space/basic, +/area/space) "fgi" = ( /turf/closed/wall, /area/crew_quarters/cryopod) @@ -52659,6 +52539,26 @@ /obj/machinery/bookbinder, /turf/open/floor/plasteel/white, /area/science/circuit) +"fmO" = ( +/obj/structure/window/reinforced, +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + id = "xenobio7"; + name = "Containment Blast Doors"; + pixel_y = 4; + req_access_txt = "55" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) "fmW" = ( /obj/effect/turf_decal/loading_area/white, /obj/effect/turf_decal/stripes/white/corner{ @@ -52882,7 +52782,7 @@ /obj/effect/turf_decal/bot{ dir = 2 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating, /area/engine/engineering) "hCi" = ( /obj/structure/lattice, @@ -53142,7 +53042,7 @@ /area/hallway/secondary/service) "khB" = ( /obj/machinery/door/airlock/external{ - cyclelinkeddir = 4; + cyclelinkeddir = 0; req_access_txt = "13" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -53190,9 +53090,6 @@ /obj/structure/table/wood, /turf/open/floor/wood, /area/maintenance/bar) -"kAr" = ( -/turf/open/floor/plating/airless, -/area/space) "kDA" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -53410,6 +53307,18 @@ /obj/structure/falsewall, /turf/open/floor/plating, /area/maintenance/bar) +"mHe" = ( +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio0"; + name = "containment blast door" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/engine, +/area/science/xenobiology) "mLm" = ( /obj/structure/cable{ icon_state = "1-8" @@ -53453,6 +53362,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, /area/maintenance/fore/secondary) +"mWO" = ( +/turf/open/floor/plating/airless, +/area/space) "mXj" = ( /turf/open/floor/plasteel/showroomfloor, /area/space) @@ -53470,6 +53382,26 @@ dir = 8 }, /area/security/brig) +"nvr" = ( +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + id = "xenobio0"; + name = "Containment Blast Doors"; + pixel_y = 4; + req_access_txt = "55" + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) "nwx" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, @@ -53557,10 +53489,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"nXy" = ( -/obj/structure/lattice, -/turf/open/space, -/area/space) "nYI" = ( /obj/effect/spawner/lootdrop/maintenance{ lootcount = 2; @@ -54000,7 +53928,7 @@ /obj/effect/turf_decal/bot{ dir = 2 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating, /area/engine/engineering) "srd" = ( /turf/open/floor/plasteel/red/corner{ @@ -54024,6 +53952,25 @@ /obj/item/shovel/spade, /turf/open/floor/plasteel/hydrofloor, /area/hallway/secondary/service) +"syV" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/item/extinguisher, +/obj/item/extinguisher{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/extinguisher{ + pixel_x = 5; + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) "sAz" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -54132,11 +54079,6 @@ }, /turf/open/floor/plating, /area/maintenance/fore/secondary) -"tfw" = ( -/obj/structure/lattice, -/obj/structure/grille, -/turf/open/space/basic, -/area/space) "thu" = ( /obj/structure/cable{ icon_state = "1-2" @@ -54691,6 +54633,10 @@ /obj/effect/landmark/start/atmospheric_technician, /turf/open/floor/plasteel, /area/engine/atmos) +"yck" = ( +/obj/structure/lattice, +/turf/open/space, +/area/space) "ycu" = ( /obj/structure/cable{ icon_state = "2-4" @@ -54715,6 +54661,9 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/plasteel/dark, /area/security/armory) +"ymd" = ( +/turf/open/floor/plasteel/dark, +/area/security/processing) (1,1,1) = {" aaa @@ -77939,7 +77888,7 @@ aln aiU aaa aiU -anN +aln aiU aaa aaa @@ -78192,11 +78141,11 @@ aaf aaf aaf aiU -alp +ymd aiU aaa aiU -alp +ymd aiU aaf aaf @@ -78453,7 +78402,7 @@ cxJ aiU aiT aiU -cxP +cxJ aiU aiV aiT @@ -81393,7 +81342,7 @@ mzz mzz ccw uvy -nXy +yck aaa aaa aaa @@ -81907,7 +81856,7 @@ gre iqO ccw uvy -tfw +fdi aaa aaa aaa @@ -82408,15 +82357,15 @@ csP gre gre cAq -kAr +mWO cSH -kAr +mWO cSH -kAr +mWO cSH -kAr +mWO cSH -kAr +mWO gre gre ccw @@ -82674,7 +82623,7 @@ aaa aoV aoV cFK -kAr +mWO gre ccw uvy @@ -82931,7 +82880,7 @@ aaa aoV aoV aoV -kAr +mWO gre ccw uvy @@ -83188,7 +83137,7 @@ aaa aaa aoV aoV -kAr +mWO gre ccw uvy @@ -83445,7 +83394,7 @@ sWi aaa hCi cFK -kAr +mWO gre ccw uvy @@ -83702,7 +83651,7 @@ tHc aaf aaf gXs -kAr +mWO gre ccw uvy @@ -83959,7 +83908,7 @@ ieW aaa aaa aaa -kAr +mWO gre ccw uvy @@ -84216,7 +84165,7 @@ aaa aaa aoV aoV -kAr +mWO gre ccw uvy @@ -84473,7 +84422,7 @@ hCi aaa aoV aoV -kAr +mWO gre ccw uvy @@ -84730,7 +84679,7 @@ cFK aoV aoV cFK -kAr +mWO gre ccw uvy @@ -84978,15 +84927,15 @@ csP gre gre cAq -kAr +mWO cSK -kAr +mWO cSK -kAr +mWO cSK -kAr +mWO cSK -kAr +mWO gre gre ccw @@ -86019,7 +85968,7 @@ mzz mzz ccw uvy -nXy +yck aaf aaa aaa @@ -86532,7 +86481,7 @@ uvy uvy uvy aaa -nXy +yck hCi aaa aaa @@ -96780,7 +96729,7 @@ bDb bDb bDb bDb -cNW +bDb cNW cQB czY @@ -97033,11 +96982,11 @@ bJN bRT bEm bEm +bJN +bRT +bEm +bEm bDb -cfr -cho -bDb -aaa cNW cQB czY @@ -97276,7 +97225,7 @@ bJJ bKY bMi bNo -bIP +bOx bPA bJN bRU @@ -97290,12 +97239,12 @@ bJN bRU bEm bEm +bJN +bRU +bEm +bEm bDb -cgi -chq -ccQ -aaa -cOT +cNW cQB czY cOT @@ -97547,12 +97496,12 @@ bJN bRU bEm cBz +bJN +bRU +bEm +cBz bDb -cgi -chq -ccQ -aaa -cOT +cNW cQB czY cOT @@ -97791,7 +97740,7 @@ bLa bMi bNo bPy -bPA +syV bJN bRW bTb @@ -97804,11 +97753,11 @@ bJN bZV caV cbS -bDb +bJN cgl chs +mHe bDb -aaa cNW cQB czY @@ -98061,11 +98010,11 @@ bVi bRV bTa cbR +bVi +bRV +bTa +nvr bDb -cgk -chr -bDb -aaa cNW cBN czY @@ -98318,12 +98267,12 @@ bZa bMi bMi bRZ -cTY -cTZ -chu -ccQ -aaf -cOT +bZa +bMi +bMi +bRZ +bDb +cNW cQB cAa cOT @@ -98574,13 +98523,13 @@ bUf bTc bRX bTc +bUf +bTc +bRX +bTc cbT -ccP -ccP -cht -ckn csk -czQ +cko czU czZ cOT @@ -98832,12 +98781,12 @@ bZb bRZ bMi bMi -cfy -cgn -cjB -ccQ -aaf -cOT +bZb +bRZ +bMi +bMi +bDb +cNW cgm czY cOT @@ -99089,11 +99038,11 @@ bVi bZW bTd bUg +bVi +fmO +bTd +bUg bDb -bDb -bDb -bDb -aaa cNW cgm czY @@ -99346,11 +99295,11 @@ bJN bZX caW cbU +bJN +bWn +bXg +bYh bDb -aaf -aaf -aaa -aaa cNW cgm czY @@ -99603,12 +99552,12 @@ bJN bEm bEm bRU +bJN +bEm +bEm +bRU bDb -aaf -aaa -aaa -aaa -cOT +cNW cgm czY cOT @@ -99860,12 +99809,12 @@ bJN bEm bEm bRU +bJN +bEm +bEm +bRU bDb -aaf -aaa -aaa -aaa -cOT +cNW cgm czY cOT @@ -100117,12 +100066,12 @@ bJN bEm bEm bUi +bJN +bEm +bEm +bUi bDb -aaf -aaf -aaa -aaa -cOT +cNW cgm czY cOT @@ -100375,10 +100324,10 @@ bDb bDb bDb bDb -cNW -cNW -cNW -cNW +bDb +bDb +bDb +bDb cNW czX cAc diff --git a/_maps/cit_map_files/Deltastation/DeltaStation2.dmm b/_maps/cit_map_files/Deltastation/DeltaStation2.dmm index 4493d6b2dd..70f7862e09 100644 --- a/_maps/cit_map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/cit_map_files/Deltastation/DeltaStation2.dmm @@ -67532,9 +67532,6 @@ dir = 5 }, /area/science/xenobiology) -"cNh" = ( -/turf/open/floor/plasteel/vault/killroom, -/area/science/xenobiology) "cNi" = ( /obj/machinery/light/small{ dir = 1 @@ -67545,7 +67542,9 @@ name = "xenobiology camera"; network = list("ss13","xeno","rd") }, -/turf/open/floor/plasteel/vault/killroom, +/turf/open/floor/plasteel/vault{ + dir = 5 + }, /area/science/xenobiology) "cNj" = ( /obj/structure/closet/crate{ @@ -68261,26 +68260,6 @@ "cON" = ( /turf/open/floor/circuit/green, /area/science/xenobiology) -"cOO" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 2; - external_pressure_bound = 140; - name = "killroom vent"; - pressure_checks = 0 - }, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) -"cOP" = ( -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) -"cOQ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ - dir = 2; - external_pressure_bound = 120; - name = "server vent" - }, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) "cOR" = ( /turf/closed/wall/r_wall, /area/science/research) @@ -69036,24 +69015,6 @@ dir = 1 }, /area/science/xenobiology) -"cQw" = ( -/obj/machinery/atmospherics/pipe/manifold/general/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel/vault/killroom, -/area/science/xenobiology) -"cQx" = ( -/obj/machinery/atmospherics/pipe/simple/general/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/vault/killroom, -/area/science/xenobiology) -"cQy" = ( -/obj/machinery/atmospherics/pipe/simple/general/hidden{ - dir = 9 - }, -/turf/open/floor/plasteel/vault/killroom, -/area/science/xenobiology) "cQz" = ( /obj/structure/closet/wardrobe/science_white, /obj/machinery/light/small{ @@ -69757,7 +69718,6 @@ icon_state = "0-4" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/general/hidden, /turf/open/floor/plating, /area/science/xenobiology) "cSg" = ( @@ -69768,7 +69728,7 @@ icon_state = "2-8" }, /obj/machinery/door/airlock/research/glass{ - name = "Xenobiology Kill Room"; + name = "Xenobiology Isolation Pin"; req_access_txt = "47" }, /obj/effect/turf_decal/stripes/line{ @@ -70558,13 +70518,19 @@ /turf/open/floor/plasteel, /area/science/xenobiology) "cTR" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 1; - min_temperature = 80; - on = 1; - target_temperature = 80 +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/item/extinguisher, +/obj/item/extinguisher{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/extinguisher{ + pixel_x = 5; + pixel_y = 5 }, -/obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/science/xenobiology) "cTS" = ( @@ -72260,9 +72226,6 @@ /turf/open/floor/plasteel, /area/science/xenobiology) "cXm" = ( -/obj/machinery/computer/camera_advanced/xenobio{ - dir = 8 - }, /obj/machinery/status_display{ pixel_x = 32 }, @@ -72450,13 +72413,6 @@ dir = 8 }, /area/medical/medbay/central) -"cXG" = ( -/obj/structure/table, -/obj/item/folder/white, -/turf/open/floor/plasteel/whiteblue/corner{ - dir = 8 - }, -/area/medical/medbay/central) "cXH" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -73261,12 +73217,11 @@ id = "chemisttop"; name = "Chemistry Lobby Shutters" }, -/obj/machinery/door/window/southleft{ +/obj/item/folder/yellow, +/obj/machinery/door/window/northleft{ name = "Chemistry Desk"; req_access_txt = "5; 33" }, -/obj/item/folder/yellow, -/obj/machinery/door/window/northleft, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/medical/medbay/central) @@ -100778,6 +100733,25 @@ dir = 4 }, /area/science/misc_lab) +"fzH" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/item/extinguisher, +/obj/item/extinguisher{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/extinguisher{ + pixel_x = 5; + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) "fGq" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall/r_wall, @@ -100792,17 +100766,13 @@ }, /turf/open/floor/plating, /area/maintenance/port) -"giB" = ( -/obj/structure/particle_accelerator/end_cap{ - icon_state = "end_cap"; - dir = 8 - }, -/turf/open/floor/plating, -/area/engine/engineering) "gmj" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, /area/science/circuit) +"gsR" = ( +/turf/open/space, +/area/space) "gKr" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 @@ -100841,12 +100811,6 @@ dir = 10 }, /area/science/circuit) -"hiz" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) "hrP" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -100899,6 +100863,9 @@ dir = 9 }, /area/science/circuit) +"hRG" = ( +/turf/open/space/basic, +/area/space/nearstation) "iQh" = ( /obj/structure/bodycontainer/morgue{ dir = 1 @@ -100957,6 +100924,9 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/neutral, /area/medical/morgue) +"jKb" = ( +/turf/open/space, +/area/space/nearstation) "kwx" = ( /obj/effect/turf_decal/loading_area, /turf/open/floor/plasteel/whitepurple/corner, @@ -100982,6 +100952,9 @@ dir = 5 }, /area/crew_quarters/locker) +"lkn" = ( +/turf/open/floor/plating/airless, +/area/space/nearstation) "loI" = ( /obj/machinery/autolathe, /obj/machinery/door/window/southleft{ @@ -100997,6 +100970,10 @@ dir = 4 }, /area/science/lab) +"lxv" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "lEl" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -101041,6 +101018,13 @@ dir = 1 }, /area/science/circuit) +"mqk" = ( +/obj/structure/particle_accelerator/end_cap{ + icon_state = "end_cap"; + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/engineering) "mvm" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ @@ -101052,14 +101036,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/circuit/green, /area/science/research/abandoned) -"mId" = ( +"nJG" = ( +/obj/structure/lattice, /turf/open/space/basic, -/area/space/nearstation) -"mRo" = ( -/turf/open/floor/plating/airless, -/area/space/nearstation) -"nBz" = ( -/turf/open/floor/plating/airless, /area/space) "oZC" = ( /obj/machinery/door/firedoor, @@ -101074,6 +101053,13 @@ }, /turf/open/floor/wood, /area/bridge/showroom/corporate) +"pfd" = ( +/obj/structure/particle_accelerator/particle_emitter/center{ + icon_state = "emitter_center"; + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/engineering) "pmQ" = ( /obj/structure/table/reinforced, /obj/machinery/newscaster{ @@ -101134,27 +101120,15 @@ dir = 6 }, /area/science/circuit) -"rQf" = ( -/obj/structure/particle_accelerator/particle_emitter/center{ - icon_state = "emitter_center"; - dir = 8 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"sar" = ( -/obj/structure/lattice, -/turf/open/space/basic, -/area/space) "saw" = ( /turf/closed/wall, /area/science/circuit) -"taK" = ( -/obj/structure/particle_accelerator/power_box{ - icon_state = "power_box"; - dir = 8 +"tdp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 2 }, -/turf/open/floor/plating, -/area/engine/engineering) +/turf/open/floor/plating/airless, +/area/space/nearstation) "tmi" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -101169,9 +101143,6 @@ dir = 10 }, /area/science/misc_lab) -"tTq" = ( -/turf/open/space, -/area/space/nearstation) "upk" = ( /obj/machinery/door/airlock/public/glass{ name = "Holodeck Access" @@ -101196,6 +101167,9 @@ /obj/structure/reagent_dispensers/water_cooler, /turf/open/floor/plasteel/whitepurple/side, /area/science/misc_lab) +"uDN" = ( +/turf/open/floor/plating/airless, +/area/space) "uYS" = ( /obj/machinery/door/airlock/atmos/glass{ heat_proof = 1; @@ -101217,9 +101191,13 @@ dir = 5 }, /area/medical/morgue) -"vYn" = ( -/turf/open/space, -/area/space) +"vyI" = ( +/obj/machinery/status_display{ + pixel_x = 32 + }, +/obj/structure/reagent_dispensers/watertank/high, +/turf/open/floor/circuit/green, +/area/science/xenobiology) "wei" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, @@ -101256,6 +101234,13 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) +"xwB" = ( +/obj/structure/particle_accelerator/power_box{ + icon_state = "power_box"; + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/engineering) "xwK" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -101281,6 +101266,13 @@ }, /turf/open/floor/plasteel, /area/science/research/abandoned) +"xJl" = ( +/obj/structure/table, +/obj/item/folder/white, +/turf/open/floor/plasteel/whiteblue/corner{ + dir = 8 + }, +/area/medical/medbay/central) "xMn" = ( /obj/structure/disposalpipe/trunk, /obj/machinery/disposal/bin, @@ -101289,10 +101281,6 @@ }, /turf/open/floor/plasteel/white/side, /area/science/circuit) -"xSx" = ( -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) "yjc" = ( /obj/machinery/power/apc{ areastring = "/area/science/research/abandoned"; @@ -121745,13 +121733,13 @@ aaa cja ckw clS -tTq -tTq +jKb +jKb clS -sar -mId -tTq -tTq +nJG +hRG +jKb +jKb clS ctn cja @@ -122001,15 +121989,15 @@ cfA aad cjb cky -tTq -vYn -vYn -xSx +jKb +gsR +gsR +lxv aad -mId -vYn -vYn -tTq +hRG +gsR +gsR +jKb czq cAI aad @@ -122258,15 +122246,15 @@ cfA aaa cja ckw -tTq -vYn -mId -mId +jKb +gsR +hRG +hRG aad -mId -mId -vYn -tTq +hRG +hRG +gsR +jKb ctn cja aaa @@ -122515,14 +122503,14 @@ cfA abj cjb cky -mId -mId -mId +hRG +hRG +hRG cqo clR ctm -mId -xSx +hRG +lxv clS czq cAI @@ -122772,15 +122760,15 @@ cdC aad cja ckw -sar +nJG aad aad ckw crJ -hiz +tdp aad aad -sar +nJG ctn cja aad @@ -123030,14 +123018,14 @@ abj cjb cky clS -xSx -mId +lxv +hRG cqp crK cto -mId -mId -mId +hRG +hRG +hRG czq cAI abj @@ -123286,15 +123274,15 @@ cfA aaa cja ckw -tTq -vYn -mId -mId +jKb +gsR +hRG +hRG aad -mId -mId -vYn -tTq +hRG +hRG +gsR +jKb ctn cja aaa @@ -123543,15 +123531,15 @@ cfA aad cjb cky -tTq -vYn +jKb +gsR aaa -mId +hRG aad -xSx +lxv aaa -vYn -tTq +gsR +jKb czq cAI aad @@ -123801,13 +123789,13 @@ aaa cja ckw clS -tTq -mId -mId -sar +jKb +hRG +hRG +nJG clS -tTq -tTq +jKb +jKb clS ctn cja @@ -124311,8 +124299,8 @@ car cbT cdG cfB -nBz -mRo +uDN +lkn aaa aad cjd @@ -124324,8 +124312,8 @@ cjd cjd aad aaa -mRo -nBz +lkn +uDN cDV cFL cHg @@ -124832,7 +124820,7 @@ cje cjd cpa cqr -rQf +pfd ctp cuQ cjd @@ -125089,7 +125077,7 @@ chv cnC cpa cqs -taK +xwB ctq cuR cnC @@ -125603,7 +125591,7 @@ clX cnE cpc cqu -giB +mqk cts cuT cnE @@ -128456,7 +128444,7 @@ das dcd cMY deX -dgo +fzH dhR lKu tmi @@ -132556,9 +132544,9 @@ cHA cjp cKl cLI -cNh -cNh -cNh +cNd +cNd +cNd cNc cTQ cVI @@ -132813,9 +132801,9 @@ cHB cjp cKj cLI -cNh -cOO -cQw +cNd +cNd +cNd cSf cTR cVP @@ -133071,8 +133059,8 @@ caE cKm cLI cNi -cOP -cQx +cNd +cNd cSg cTS cVQ @@ -133327,9 +133315,9 @@ cHB cjp cKk cLI -cNh -cOQ -cQy +cNd +cNd +cNd cSh cTT cVR @@ -133584,9 +133572,9 @@ cHA ceb cKk cLI -cNh -cNh -cNh +cNd +cNd +cNd cNc cTU cVS @@ -133849,7 +133837,7 @@ cTV cVT cXm cZb -cXm +vyI dcu ddV cMY @@ -141300,7 +141288,7 @@ cQT cSE cUt cWj -cXG +xJl cZt dbc dcO diff --git a/_maps/cit_map_files/MetaStation/MetaStation.dmm b/_maps/cit_map_files/MetaStation/MetaStation.dmm index 0a66de578c..b158c0e3b4 100644 --- a/_maps/cit_map_files/MetaStation/MetaStation.dmm +++ b/_maps/cit_map_files/MetaStation/MetaStation.dmm @@ -35104,9 +35104,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, /turf/open/floor/plating, /area/maintenance/department/science/xenobiology) "bvU" = ( @@ -40977,11 +40974,8 @@ /turf/open/floor/plasteel/bar, /area/crew_quarters/bar) "bIv" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 10 - }, /turf/open/floor/plasteel/white, -/area/science/xenobiology) +/area/maintenance/department/science/xenobiology) "bIw" = ( /obj/machinery/light, /obj/machinery/camera{ @@ -67904,15 +67898,6 @@ /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/aft) -"cLE" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 1; - name = "euthanization chamber freezer"; - on = 1; - target_temperature = 80 - }, -/turf/open/floor/plating, -/area/science/xenobiology) "cLF" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -71590,7 +71575,7 @@ "cTT" = ( /obj/structure/disposalpipe/segment, /turf/closed/wall/r_wall, -/area/science/xenobiology) +/area/maintenance/department/science/xenobiology) "cUH" = ( /obj/structure/table/optable, /turf/open/floor/plasteel/white, @@ -72062,9 +72047,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"cZv" = ( -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) "cZR" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/yellow{ @@ -72210,9 +72192,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 6 - }, /obj/machinery/light/small{ dir = 1 }, @@ -72222,24 +72201,14 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, /turf/open/floor/plasteel/white, -/area/science/xenobiology) -"daR" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1; - external_pressure_bound = 140; - name = "server vent"; - pressure_checks = 0 - }, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) +/area/maintenance/department/science/xenobiology) "daS" = ( /obj/structure/disposalpipe/segment, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/maintenance/department/science/xenobiology) "daW" = ( /obj/machinery/button/door{ id = "engpa"; @@ -72374,17 +72343,10 @@ "dbv" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light/small, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) -"dbw" = ( -/obj/machinery/camera{ - c_tag = "Xenobiology Lab - Kill Chamber"; - dir = 1; - network = list("ss13","rd","xeno"); - start_active = 1 +/turf/open/floor/plating{ + icon_state = "platingdmg2" }, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) +/area/maintenance/department/science/xenobiology) "dbE" = ( /obj/machinery/plantgenes, /obj/effect/turf_decal/stripes/line{ @@ -72791,15 +72753,18 @@ /turf/open/floor/plasteel/white, /area/science/xenobiology) "dcm" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/computer/camera_advanced/xenobio, /obj/effect/turf_decal/stripes/line{ - dir = 9 + dir = 1 + }, +/obj/structure/table/glass, +/obj/item/extinguisher, +/obj/item/extinguisher{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/extinguisher{ + pixel_x = 5; + pixel_y = 5 }, /turf/open/floor/plasteel, /area/science/xenobiology) @@ -72823,7 +72788,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 }, -/obj/machinery/computer/camera_advanced/xenobio, /obj/structure/cable/yellow{ icon_state = "4-8" }, @@ -72893,9 +72857,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, -/obj/structure/chair/comfy/black{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 10 }, @@ -72910,9 +72871,6 @@ /area/science/xenobiology) "dcx" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/chair/comfy/black{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 6 }, @@ -72990,18 +72948,13 @@ /turf/open/floor/plasteel/white, /area/science/xenobiology) "dcJ" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/item/extinguisher{ - pixel_x = 4; - pixel_y = 3 - }, -/obj/item/extinguisher, /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/effect/turf_decal/stripes/corner{ dir = 1 }, +/obj/structure/reagent_dispensers/watertank/high, /turf/open/floor/plasteel/white, /area/science/xenobiology) "dcK" = ( @@ -73427,11 +73380,8 @@ }, /obj/structure/chair, /obj/item/cigbutt, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 1 - }, /turf/open/floor/plasteel/white, -/area/science/xenobiology) +/area/maintenance/department/science/xenobiology) "ddy" = ( /turf/open/floor/plating{ icon_state = "platingdmg1" @@ -73439,9 +73389,8 @@ /area/maintenance/department/science/xenobiology) "ddz" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/plating, -/area/science/xenobiology) +/turf/closed/wall/r_wall, +/area/maintenance/department/science/xenobiology) "ddA" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/firedoor, @@ -73451,23 +73400,15 @@ opacity = 0; req_access_txt = "55" }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"ddB" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ - dir = 1; - external_pressure_bound = 120; - name = "server vent" - }, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) +/turf/closed/wall/r_wall, +/area/maintenance/department/science/xenobiology) "ddC" = ( /obj/structure/disposalpipe/trunk{ dir = 1 }, /obj/structure/disposaloutlet, /turf/open/floor/plating/airless, -/area/science/xenobiology) +/area/maintenance/department/science/xenobiology) "ddE" = ( /obj/effect/landmark/start/cook, /obj/machinery/holopad, @@ -73781,6 +73722,12 @@ /obj/item/clothing/glasses/meson/engine, /turf/open/floor/plasteel, /area/engine/engineering) +"dgA" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) "dgI" = ( /turf/closed/wall/mineral/plastitanium, /area/space/nearstation) @@ -74884,9 +74831,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, /obj/machinery/door/airlock/research{ glass = 1; name = "Slime Euthanization Chamber"; @@ -74897,7 +74841,7 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/science/xenobiology) +/area/maintenance/department/science/xenobiology) "dmr" = ( /obj/machinery/door/airlock/research{ glass = 1; @@ -74909,7 +74853,7 @@ dir = 8 }, /turf/open/floor/plasteel/white, -/area/science/xenobiology) +/area/maintenance/department/science/xenobiology) "dmD" = ( /obj/structure/displaycase/trophy, /turf/open/floor/wood, @@ -76182,6 +76126,13 @@ }, /turf/open/floor/plating/airless, /area/engine/engineering) +"dPp" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/engine/engineering) "dYu" = ( /obj/machinery/door/airlock/external{ name = "Auxiliary Airlock" @@ -76283,12 +76234,6 @@ }, /turf/open/floor/plasteel/dark, /area/chapel/office) -"eHX" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "eXy" = ( /obj/machinery/airalarm{ pixel_y = 32 @@ -76496,6 +76441,10 @@ dir = 4 }, /area/engine/engineering) +"iYY" = ( +/obj/machinery/light/small, +/turf/open/floor/plating, +/area/engine/engineering) "jjF" = ( /obj/structure/cable/white{ icon_state = "2-8" @@ -76536,6 +76485,10 @@ }, /turf/open/floor/plating, /area/maintenance/solars/port/aft) +"jzw" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/department/science/xenobiology) "jFx" = ( /obj/machinery/door/airlock/external{ req_access_txt = "13" @@ -76560,6 +76513,12 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"jYQ" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/engine/engineering) "kfu" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/white, @@ -76914,14 +76873,6 @@ /obj/item/pen, /turf/open/floor/plasteel/white, /area/science/circuit) -"oWo" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, -/area/maintenance/starboard/fore) "pvA" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -76977,13 +76928,6 @@ }, /turf/open/floor/plating/airless, /area/engine/engineering) -"pYA" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/machinery/light, -/turf/open/floor/plasteel, -/area/engine/engineering) "qnJ" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -76998,12 +76942,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/plating, /area/science/circuit) -"qoX" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plating, -/area/engine/engineering) "qqg" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 @@ -77055,6 +76993,12 @@ }, /turf/open/floor/plating, /area/engine/engineering) +"rFx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/engine/engineering) "rQK" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -77107,10 +77051,6 @@ /obj/structure/grille, /turf/open/floor/plating/airless, /area/space/nearstation) -"swQ" = ( -/obj/machinery/light/small, -/turf/open/floor/plating, -/area/engine/engineering) "sGh" = ( /obj/structure/cable{ icon_state = "1-2" @@ -77144,12 +77084,14 @@ "sSU" = ( /turf/closed/wall/r_wall, /area/space) -"sZQ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +"tdB" = ( +/obj/machinery/light/small{ + dir = 8 }, -/turf/closed/wall, -/area/engine/engineering) +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/maintenance/starboard/fore) "tjH" = ( /obj/structure/table/reinforced, /obj/machinery/computer/libraryconsole/bookmanagement, @@ -77271,7 +77213,7 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/space) -"vHD" = ( +"vAk" = ( /obj/machinery/light/small{ dir = 1 }, @@ -110317,7 +110259,7 @@ cRi cRi cRi daP -cLE +cTA dlV aaa aaa @@ -110574,10 +110516,10 @@ daF daJ cRi bvT -cRi -cRi -cRi -cRi +dlV +dlV +dlV +dlV aaa aai aaa @@ -110831,10 +110773,10 @@ cSn cSn cRi dmq -cRi -cZv -cZv -cRi +dlV +ddj +ddj +dlV aaf aag aaa @@ -111089,9 +111031,9 @@ cSn cRi ddx ddz -daR -cZv -cRe +ddj +ddj +jzw aaa aaa aaa @@ -111603,9 +111545,9 @@ daK cRi bIv ddz -ddB -cZv -cRe +ddj +ddj +jzw aaa aaf aaa @@ -111859,10 +111801,10 @@ cSn daN cRi dmr -cRi -cZv -dbw -cRi +dlV +ddj +ddj +dlV aaa aag aaa @@ -112116,10 +112058,10 @@ daI daM cRi cTA -cRi -cRi -cRi -cRi +dlV +dlV +dlV +dlV aaf aag aaa @@ -117899,7 +117841,7 @@ arJ arI dnh dqu -oWo +tdB axO axY aAo @@ -118945,8 +118887,8 @@ dfh aBO aBO aBK -pYA -sZQ +dPp +rFx axY aYu aYu @@ -119959,7 +119901,7 @@ axY axY ayW bTq -eHX +dgA aBO aBO aFC @@ -119972,7 +119914,7 @@ aNu axY dfp aBO -eHX +dgA dfP dfY axY @@ -120470,7 +120412,7 @@ ati ajb avB axY -qoX +jYQ bUw aJu axY @@ -120489,7 +120431,7 @@ axY axY aJu bUw -swQ +iYY axY alq alq @@ -121495,7 +121437,7 @@ apn aqy arT apm -vHD +vAk avB axY goZ diff --git a/_maps/cit_map_files/PubbyStation/PubbyStation.dmm b/_maps/cit_map_files/PubbyStation/PubbyStation.dmm index 3eebcbf5e1..6bf52ab60a 100644 --- a/_maps/cit_map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/cit_map_files/PubbyStation/PubbyStation.dmm @@ -26613,12 +26613,6 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) -"bpp" = ( -/obj/machinery/computer/camera_advanced/xenobio{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "bpq" = ( /obj/structure/sign/warning/electricshock, /turf/closed/wall/r_wall, @@ -27817,9 +27811,6 @@ /turf/open/floor/plasteel/white, /area/science/xenobiology) "brQ" = ( -/obj/machinery/computer/camera_advanced/xenobio{ - dir = 8 - }, /obj/machinery/camera{ c_tag = "Xenobiology Port"; dir = 8; @@ -28611,11 +28602,11 @@ /turf/open/floor/plating, /area/science/xenobiology) "btD" = ( -/turf/open/floor/plating/airless, +/turf/open/floor/plating, /area/science/xenobiology) "btE" = ( /obj/effect/decal/remains/xeno, -/turf/open/floor/plating/airless, +/turf/open/floor/plating, /area/science/xenobiology) "btF" = ( /obj/structure/chair{ @@ -29236,12 +29227,7 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/machinery/camera{ - c_tag = "Xenobiology Kill Room"; - dir = 8; - network = list("ss13","rd") - }, -/turf/open/floor/plating/airless, +/turf/open/floor/plating, /area/science/xenobiology) "bva" = ( /turf/closed/wall, @@ -31308,16 +31294,22 @@ /turf/open/floor/plasteel/whitepurple/side, /area/science/xenobiology) "bzi" = ( -/obj/item/extinguisher{ - pixel_x = 4; - pixel_y = 3 +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/item/extinguisher, /obj/structure/table/glass, -/turf/open/floor/plasteel/whitepurple/side, +/obj/item/extinguisher, +/obj/item/extinguisher{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/extinguisher{ + pixel_x = 5; + pixel_y = 5 + }, +/turf/open/floor/plasteel, /area/science/xenobiology) "bzj" = ( -/obj/structure/reagent_dispensers/watertank, /obj/machinery/requests_console{ department = "Science"; departmentType = 2; @@ -31325,6 +31317,7 @@ pixel_x = 32; receive_ore_updates = 1 }, +/obj/structure/reagent_dispensers/watertank/high, /turf/open/floor/plasteel/whitepurple/side, /area/science/xenobiology) "bzk" = ( @@ -93288,7 +93281,7 @@ bkE aht bnd boh -bpp +bpn bqx brQ btr diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index eb44fb01e6..fd936f5205 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -932,7 +932,6 @@ pixel_x = 3; pixel_y = -3 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/effect/turf_decal/bot{ dir = 2 }, @@ -4573,15 +4572,13 @@ /area/engine/atmos) "aln" = ( /obj/machinery/door/airlock/external{ - cyclelinkeddir = 4; name = "Labor Camp Shuttle Airlock"; - req_access_txt = "2"; - shuttledocked = 1 + req_access_txt = "2" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/turf/open/floor/plating, +/turf/open/floor/plasteel/dark, /area/security/processing) "alp" = ( /turf/open/floor/plating, @@ -5349,7 +5346,7 @@ /area/maintenance/fore/secondary) "anE" = ( /obj/machinery/door/airlock/external{ - cyclelinkeddir = 4; + cyclelinkeddir = 0; req_access_txt = "13" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -5388,17 +5385,6 @@ /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/port/fore) -"anN" = ( -/obj/machinery/door/airlock/external{ - cyclelinkeddir = 4; - name = "Labor Camp Shuttle Airlock"; - shuttledocked = 1 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating, -/area/security/processing) "anO" = ( /obj/docking_port/stationary{ dir = 8; @@ -34457,13 +34443,6 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plasteel/white, /area/science/xenobiology) -"bIP" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/chair/comfy/black, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "bIQ" = ( /obj/structure/cable{ icon_state = "1-2" @@ -37312,7 +37291,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/structure/chair/comfy/black, /turf/open/floor/plasteel/white, /area/science/xenobiology) "bPz" = ( @@ -37339,15 +37317,13 @@ /turf/open/floor/plasteel, /area/science/xenobiology) "bPA" = ( -/obj/machinery/computer/camera_advanced/xenobio{ - dir = 1 - }, /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/structure/table/glass, /turf/open/floor/plasteel, /area/science/xenobiology) "bPB" = ( @@ -37437,10 +37413,10 @@ /turf/open/floor/plasteel, /area/science/xenobiology) "bPI" = ( -/obj/structure/reagent_dispensers/watertank, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/structure/reagent_dispensers/watertank/high, /turf/open/floor/plasteel, /area/science/xenobiology) "bPJ" = ( @@ -38378,6 +38354,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 10 }, +/obj/machinery/light{ + dir = 1 + }, /turf/open/floor/plasteel, /area/science/xenobiology) "bRZ" = ( @@ -40083,6 +40062,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 10 }, +/obj/machinery/light{ + dir = 1 + }, /turf/open/floor/plasteel, /area/science/xenobiology) "bWn" = ( @@ -41554,6 +41536,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 10 }, +/obj/machinery/light{ + dir = 1 + }, /turf/open/floor/plasteel, /area/science/xenobiology) "bZX" = ( @@ -42796,14 +42781,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"ccP" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"ccQ" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/science/xenobiology) "ccR" = ( /obj/machinery/portable_atmospherics/pump, /obj/effect/turf_decal/bot{ @@ -43709,20 +43686,6 @@ /obj/item/caution, /turf/open/floor/plating, /area/maintenance/aft) -"cfr" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 2; - external_pressure_bound = 140; - pressure_checks = 0; - name = "killroom vent" - }, -/obj/machinery/camera{ - c_tag = "Xenobiology Kill Room"; - dir = 4; - network = list("ss13","rd") - }, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) "cfs" = ( /obj/machinery/door/airlock/maintenance/abandoned{ name = "Air Supply Maintenance"; @@ -43760,15 +43723,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating/airless, /area/maintenance/solars/port/aft) -"cfy" = ( -/obj/structure/rack, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) "cfz" = ( /obj/structure/cable{ icon_state = "4-8" @@ -44004,9 +43958,6 @@ }, /turf/open/floor/plating, /area/maintenance/aft) -"cgi" = ( -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) "cgj" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/barricade/wooden, @@ -44015,18 +43966,19 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"cgk" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/biohazard, -/turf/open/floor/plating, -/area/science/xenobiology) "cgl" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ - dir = 2; - external_pressure_bound = 120; - name = "killroom vent" +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/circuit/killroom, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio0"; + name = "containment blast door" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/engine, /area/science/xenobiology) "cgm" = ( /obj/structure/cable{ @@ -44037,17 +43989,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"cgn" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - target_temperature = 80; - dir = 2; - on = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) "cgo" = ( /obj/structure/cable{ icon_state = "4-8" @@ -44425,13 +44366,6 @@ }, /turf/open/floor/plasteel/floorgrime, /area/maintenance/disposal/incinerator) -"cho" = ( -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 - }, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) "chp" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -44441,43 +44375,22 @@ }, /turf/closed/wall, /area/maintenance/starboard/aft) -"chq" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) -"chr" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/research{ - name = "Kill Chamber"; +"chs" = ( +/obj/machinery/door/window/northleft{ + base_state = "right"; + dir = 8; + icon_state = "right"; + name = "Containment Pen"; req_access_txt = "55" }, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/open/floor/plating, -/area/science/xenobiology) -"chs" = ( -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/manifold/general/visible, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) -"cht" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 +/obj/machinery/door/poddoor/preopen{ + id = "xenobio0"; + name = "containment blast door" }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"chu" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel/white, +/turf/open/floor/engine, /area/science/xenobiology) "chv" = ( /obj/structure/cable{ @@ -45267,18 +45180,6 @@ /obj/item/cigbutt/roach, /turf/open/floor/plating, /area/maintenance/aft) -"cjB" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 9 - }, -/obj/structure/table, -/obj/item/folder/white, -/obj/item/pen, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) "cjC" = ( /obj/structure/grille, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -45388,7 +45289,7 @@ req_access = null; req_access_txt = "10;13" }, -/turf/open/floor/plasteel, +/turf/open/floor/plating, /area/engine/engineering) "cjS" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -45555,11 +45456,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/aft) -"ckn" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/science/xenobiology) "cko" = ( /obj/structure/disposalpipe/segment, /turf/closed/wall, @@ -48100,8 +47996,8 @@ /area/space/nearstation) "csk" = ( /obj/structure/disposalpipe/segment, -/turf/open/floor/plating/airless, -/area/space/nearstation) +/turf/closed/wall/r_wall, +/area/science/xenobiology) "csl" = ( /obj/structure/transit_tube/curved{ dir = 4 @@ -49949,7 +49845,7 @@ /area/shuttle/pod_1) "cxG" = ( /obj/machinery/door/airlock/external{ - cyclelinkeddir = 4; + cyclelinkeddir = 0; name = "Escape Pod Three"; req_access_txt = "0" }, @@ -49959,15 +49855,21 @@ /turf/open/floor/plating, /area/security/main) "cxJ" = ( -/obj/machinery/door/airlock/external{ - cyclelinkeddir = 8; +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ name = "Labor Camp Shuttle Airlock"; req_access_txt = "2" }, +/obj/machinery/button/door{ + id = "prison release"; + name = "Labor Camp Shuttle Lockdown"; + pixel_y = -25; + req_access_txt = "2" + }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/turf/open/floor/plating, +/turf/open/floor/plasteel/dark, /area/security/processing) "cxN" = ( /obj/structure/cable{ @@ -49983,16 +49885,6 @@ }, /turf/open/floor/plating, /area/maintenance/solars/starboard/fore) -"cxP" = ( -/obj/machinery/door/airlock/external{ - cyclelinkeddir = 8; - name = "Labor Camp Shuttle Airlock" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/security/processing) "cxR" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/spawner/structure/window/reinforced, @@ -50331,11 +50223,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel/bar, /area/crew_quarters/bar) -"czQ" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "czR" = ( /obj/structure/cable{ icon_state = "1-2" @@ -52439,18 +52326,6 @@ }, /turf/open/floor/plating, /area/science/xenobiology) -"cTY" = ( -/obj/structure/sign/poster/official/safety_internals{ - pixel_x = -32 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"cTZ" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "cVb" = ( /turf/closed/wall, /area/hallway/secondary/service) @@ -52511,6 +52386,37 @@ dir = 6 }, /area/security/brig) +"dnf" = ( +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio0"; + name = "containment blast door" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/engine, +/area/science/xenobiology) +"dos" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/item/extinguisher, +/obj/item/extinguisher{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/extinguisher{ + pixel_x = 5; + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) "dAS" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -52518,6 +52424,9 @@ /obj/structure/disposalpipe/segment, /turf/closed/wall, /area/maintenance/fore/secondary) +"dBk" = ( +/turf/open/floor/plasteel/dark, +/area/security/processing) "dLQ" = ( /turf/open/floor/plasteel/red/corner{ dir = 1 @@ -52610,6 +52519,26 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/miningdock) +"ezw" = ( +/obj/structure/window/reinforced, +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + id = "xenobio7"; + name = "Containment Blast Doors"; + pixel_y = 4; + req_access_txt = "55" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) "eBn" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 1 @@ -52887,7 +52816,7 @@ /obj/effect/turf_decal/bot{ dir = 2 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating, /area/engine/engineering) "hCi" = ( /obj/structure/lattice, @@ -53147,7 +53076,7 @@ /area/hallway/secondary/service) "khB" = ( /obj/machinery/door/airlock/external{ - cyclelinkeddir = 4; + cyclelinkeddir = 0; req_access_txt = "13" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -54001,7 +53930,7 @@ /obj/effect/turf_decal/bot{ dir = 2 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating, /area/engine/engineering) "srd" = ( /turf/open/floor/plasteel/red/corner{ @@ -54409,6 +54338,26 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel/white, /area/science/circuit) +"vDd" = ( +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + id = "xenobio0"; + name = "Containment Blast Doors"; + pixel_y = 4; + req_access_txt = "55" + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) "vHQ" = ( /obj/structure/cable{ icon_state = "1-2" @@ -77939,7 +77888,7 @@ aln aiU aaa aiU -anN +aln aiU aaa aaa @@ -78192,11 +78141,11 @@ aaf aaf aaf aiU -alp +dBk aiU aaa aiU -alp +dBk aiU aaf aaf @@ -78453,7 +78402,7 @@ cxJ aiU aiT aiU -cxP +cxJ aiU aiV aiT @@ -96780,7 +96729,7 @@ bDb bDb bDb bDb -cNW +bDb cNW cQB czY @@ -97033,11 +96982,11 @@ bJN bRT bEm bEm +bJN +bRT +bEm +bEm bDb -cfr -cho -bDb -aaa cNW cQB czY @@ -97276,7 +97225,7 @@ bJJ bKY bMi bNo -bIP +bOx bPA bJN bRU @@ -97290,12 +97239,12 @@ bJN bRU bEm bEm +bJN +bRU +bEm +bEm bDb -cgi -chq -ccQ -aaa -cOT +cNW cQB czY cOT @@ -97547,12 +97496,12 @@ bJN bRU bEm cBz +bJN +bRU +bEm +cBz bDb -cgi -chq -ccQ -aaa -cOT +cNW cQB czY cOT @@ -97791,7 +97740,7 @@ bLa bMi bNo bPy -bPA +dos bJN bRW bTb @@ -97804,11 +97753,11 @@ bJN bZV caV cbS -bDb +bJN cgl chs +dnf bDb -aaa cNW cQB czY @@ -98061,11 +98010,11 @@ bVi bRV bTa cbR +bVi +bRV +bTa +vDd bDb -cgk -chr -bDb -aaa cNW cBN czY @@ -98318,12 +98267,12 @@ bZa bMi bMi bRZ -cTY -cTZ -chu -ccQ -aaf -cOT +bZa +bMi +bMi +bRZ +bDb +cNW cQB cAa cOT @@ -98574,13 +98523,13 @@ bUf bTc bRX bTc +bUf +bTc +bRX +bTc cbT -ccP -ccP -cht -ckn csk -czQ +cko czU czZ cOT @@ -98832,12 +98781,12 @@ bZb bRZ bMi bMi -cfy -cgn -cjB -ccQ -aaf -cOT +bZb +bRZ +bMi +bMi +bDb +cNW cgm czY cOT @@ -99089,11 +99038,11 @@ bVi bZW bTd bUg +bVi +ezw +bTd +bUg bDb -bDb -bDb -bDb -aaa cNW cgm czY @@ -99346,11 +99295,11 @@ bJN bZX caW cbU +bJN +bWn +bXg +bYh bDb -aaf -aaf -aaa -aaa cNW cgm czY @@ -99603,12 +99552,12 @@ bJN bEm bEm bRU +bJN +bEm +bEm +bRU bDb -aaf -aaa -aaa -aaa -cOT +cNW cgm czY cOT @@ -99860,12 +99809,12 @@ bJN bEm bEm bRU +bJN +bEm +bEm +bRU bDb -aaf -aaa -aaa -aaa -cOT +cNW cgm czY cOT @@ -100117,12 +100066,12 @@ bJN bEm bEm bUi +bJN +bEm +bEm +bUi bDb -aaf -aaf -aaa -aaa -cOT +cNW cgm czY cOT @@ -100375,10 +100324,10 @@ bDb bDb bDb bDb -cNW -cNW -cNW -cNW +bDb +bDb +bDb +bDb cNW czX cAc diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 4777dc3e29..b1b3f234f9 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -67532,9 +67532,6 @@ dir = 5 }, /area/science/xenobiology) -"cNh" = ( -/turf/open/floor/plasteel/vault/killroom, -/area/science/xenobiology) "cNi" = ( /obj/machinery/light/small{ dir = 1 @@ -67545,7 +67542,9 @@ name = "xenobiology camera"; network = list("ss13","xeno","rd") }, -/turf/open/floor/plasteel/vault/killroom, +/turf/open/floor/plasteel/vault{ + dir = 5 + }, /area/science/xenobiology) "cNj" = ( /obj/structure/closet/crate{ @@ -68261,26 +68260,6 @@ "cON" = ( /turf/open/floor/circuit/green, /area/science/xenobiology) -"cOO" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 2; - external_pressure_bound = 140; - name = "killroom vent"; - pressure_checks = 0 - }, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) -"cOP" = ( -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) -"cOQ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ - dir = 2; - external_pressure_bound = 120; - name = "server vent" - }, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) "cOR" = ( /turf/closed/wall/r_wall, /area/science/research) @@ -69036,24 +69015,6 @@ dir = 1 }, /area/science/xenobiology) -"cQw" = ( -/obj/machinery/atmospherics/pipe/manifold/general/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel/vault/killroom, -/area/science/xenobiology) -"cQx" = ( -/obj/machinery/atmospherics/pipe/simple/general/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/vault/killroom, -/area/science/xenobiology) -"cQy" = ( -/obj/machinery/atmospherics/pipe/simple/general/hidden{ - dir = 9 - }, -/turf/open/floor/plasteel/vault/killroom, -/area/science/xenobiology) "cQz" = ( /obj/structure/closet/wardrobe/science_white, /obj/machinery/light/small{ @@ -69757,7 +69718,6 @@ icon_state = "0-4" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/general/hidden, /turf/open/floor/plating, /area/science/xenobiology) "cSg" = ( @@ -69768,7 +69728,7 @@ icon_state = "2-8" }, /obj/machinery/door/airlock/research/glass{ - name = "Xenobiology Kill Room"; + name = "Xenobiology Isolation Pin"; req_access_txt = "47" }, /obj/effect/turf_decal/stripes/line{ @@ -70558,13 +70518,19 @@ /turf/open/floor/plasteel, /area/science/xenobiology) "cTR" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 1; - min_temperature = 80; - on = 1; - target_temperature = 80 +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/item/extinguisher, +/obj/item/extinguisher{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/extinguisher{ + pixel_x = 5; + pixel_y = 5 }, -/obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/science/xenobiology) "cTS" = ( @@ -72260,9 +72226,6 @@ /turf/open/floor/plasteel, /area/science/xenobiology) "cXm" = ( -/obj/machinery/computer/camera_advanced/xenobio{ - dir = 8 - }, /obj/machinery/status_display{ pixel_x = 32 }, @@ -100850,6 +100813,25 @@ }, /turf/open/floor/plasteel, /area/maintenance/port/aft) +"htt" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/item/extinguisher, +/obj/item/extinguisher{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/extinguisher{ + pixel_x = 5; + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) "hGT" = ( /obj/machinery/door/firedoor, /obj/structure/cable/white{ @@ -101141,6 +101123,13 @@ "saw" = ( /turf/closed/wall, /area/science/circuit) +"shc" = ( +/obj/machinery/status_display{ + pixel_x = 32 + }, +/obj/structure/reagent_dispensers/watertank/high, +/turf/open/floor/circuit/green, +/area/science/xenobiology) "tdp" = ( /obj/effect/turf_decal/stripes/line{ dir = 2 @@ -128455,7 +128444,7 @@ das dcd cMY deX -dgo +htt dhR lKu tmi @@ -132555,9 +132544,9 @@ cHA cjp cKl cLI -cNh -cNh -cNh +cNd +cNd +cNd cNc cTQ cVI @@ -132812,9 +132801,9 @@ cHB cjp cKj cLI -cNh -cOO -cQw +cNd +cNd +cNd cSf cTR cVP @@ -133070,8 +133059,8 @@ caE cKm cLI cNi -cOP -cQx +cNd +cNd cSg cTS cVQ @@ -133326,9 +133315,9 @@ cHB cjp cKk cLI -cNh -cOQ -cQy +cNd +cNd +cNd cSh cTT cVR @@ -133583,9 +133572,9 @@ cHA ceb cKk cLI -cNh -cNh -cNh +cNd +cNd +cNd cNc cTU cVS @@ -133848,7 +133837,7 @@ cTV cVT cXm cZb -cXm +shc dcu ddV cMY diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 016b1dd128..e32792718e 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -35104,9 +35104,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, /turf/open/floor/plating, /area/maintenance/department/science/xenobiology) "bvU" = ( @@ -40977,11 +40974,8 @@ /turf/open/floor/plasteel/bar, /area/crew_quarters/bar) "bIv" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 10 - }, /turf/open/floor/plasteel/white, -/area/science/xenobiology) +/area/maintenance/department/science/xenobiology) "bIw" = ( /obj/machinery/light, /obj/machinery/camera{ @@ -67904,15 +67898,6 @@ /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/aft) -"cLE" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 1; - name = "euthanization chamber freezer"; - on = 1; - target_temperature = 80 - }, -/turf/open/floor/plating, -/area/science/xenobiology) "cLF" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -71590,7 +71575,7 @@ "cTT" = ( /obj/structure/disposalpipe/segment, /turf/closed/wall/r_wall, -/area/science/xenobiology) +/area/maintenance/department/science/xenobiology) "cUH" = ( /obj/structure/table/optable, /turf/open/floor/plasteel/white, @@ -72062,9 +72047,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"cZv" = ( -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) "cZR" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/yellow{ @@ -72210,9 +72192,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 6 - }, /obj/machinery/light/small{ dir = 1 }, @@ -72222,24 +72201,14 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, /turf/open/floor/plasteel/white, -/area/science/xenobiology) -"daR" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1; - external_pressure_bound = 140; - name = "server vent"; - pressure_checks = 0 - }, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) +/area/maintenance/department/science/xenobiology) "daS" = ( /obj/structure/disposalpipe/segment, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/maintenance/department/science/xenobiology) "daW" = ( /obj/machinery/button/door{ id = "engpa"; @@ -72374,17 +72343,10 @@ "dbv" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light/small, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) -"dbw" = ( -/obj/machinery/camera{ - c_tag = "Xenobiology Lab - Kill Chamber"; - dir = 1; - network = list("ss13","rd","xeno"); - start_active = 1 +/turf/open/floor/plating{ + icon_state = "platingdmg2" }, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) +/area/maintenance/department/science/xenobiology) "dbE" = ( /obj/machinery/plantgenes, /obj/effect/turf_decal/stripes/line{ @@ -72791,15 +72753,18 @@ /turf/open/floor/plasteel/white, /area/science/xenobiology) "dcm" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/computer/camera_advanced/xenobio, /obj/effect/turf_decal/stripes/line{ - dir = 9 + dir = 1 + }, +/obj/structure/table/glass, +/obj/item/extinguisher, +/obj/item/extinguisher{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/extinguisher{ + pixel_x = 5; + pixel_y = 5 }, /turf/open/floor/plasteel, /area/science/xenobiology) @@ -72823,7 +72788,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 }, -/obj/machinery/computer/camera_advanced/xenobio, /obj/structure/cable/yellow{ icon_state = "4-8" }, @@ -72893,9 +72857,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, -/obj/structure/chair/comfy/black{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 10 }, @@ -72910,9 +72871,6 @@ /area/science/xenobiology) "dcx" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/chair/comfy/black{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 6 }, @@ -72990,18 +72948,13 @@ /turf/open/floor/plasteel/white, /area/science/xenobiology) "dcJ" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/item/extinguisher{ - pixel_x = 4; - pixel_y = 3 - }, -/obj/item/extinguisher, /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/effect/turf_decal/stripes/corner{ dir = 1 }, +/obj/structure/reagent_dispensers/watertank/high, /turf/open/floor/plasteel/white, /area/science/xenobiology) "dcK" = ( @@ -73427,11 +73380,8 @@ }, /obj/structure/chair, /obj/item/cigbutt, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 1 - }, /turf/open/floor/plasteel/white, -/area/science/xenobiology) +/area/maintenance/department/science/xenobiology) "ddy" = ( /turf/open/floor/plating{ icon_state = "platingdmg1" @@ -73439,9 +73389,8 @@ /area/maintenance/department/science/xenobiology) "ddz" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/plating, -/area/science/xenobiology) +/turf/closed/wall/r_wall, +/area/maintenance/department/science/xenobiology) "ddA" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/firedoor, @@ -73451,23 +73400,15 @@ opacity = 0; req_access_txt = "55" }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"ddB" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ - dir = 1; - external_pressure_bound = 120; - name = "server vent" - }, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) +/turf/closed/wall/r_wall, +/area/maintenance/department/science/xenobiology) "ddC" = ( /obj/structure/disposalpipe/trunk{ dir = 1 }, /obj/structure/disposaloutlet, /turf/open/floor/plating/airless, -/area/science/xenobiology) +/area/maintenance/department/science/xenobiology) "ddE" = ( /obj/effect/landmark/start/cook, /obj/machinery/holopad, @@ -74890,9 +74831,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, /obj/machinery/door/airlock/research{ glass = 1; name = "Slime Euthanization Chamber"; @@ -74903,7 +74841,7 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/science/xenobiology) +/area/maintenance/department/science/xenobiology) "dmr" = ( /obj/machinery/door/airlock/research{ glass = 1; @@ -74915,7 +74853,7 @@ dir = 8 }, /turf/open/floor/plasteel/white, -/area/science/xenobiology) +/area/maintenance/department/science/xenobiology) "dmD" = ( /obj/structure/displaycase/trophy, /turf/open/floor/wood, @@ -76517,6 +76455,10 @@ }, /turf/open/floor/plating/airless, /area/engine/engineering) +"jot" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/department/science/xenobiology) "jwW" = ( /turf/closed/wall/mineral/plastitanium, /area/crew_quarters/fitness/recreation) @@ -110317,7 +110259,7 @@ cRi cRi cRi daP -cLE +cTA dlV aaa aaa @@ -110574,10 +110516,10 @@ daF daJ cRi bvT -cRi -cRi -cRi -cRi +dlV +dlV +dlV +dlV aaa aai aaa @@ -110831,10 +110773,10 @@ cSn cSn cRi dmq -cRi -cZv -cZv -cRi +dlV +ddj +ddj +dlV aaf aag aaa @@ -111089,9 +111031,9 @@ cSn cRi ddx ddz -daR -cZv -cRe +ddj +ddj +jot aaa aaa aaa @@ -111603,9 +111545,9 @@ daK cRi bIv ddz -ddB -cZv -cRe +ddj +ddj +jot aaa aaf aaa @@ -111859,10 +111801,10 @@ cSn daN cRi dmr -cRi -cZv -dbw -cRi +dlV +ddj +ddj +dlV aaa aag aaa @@ -112116,10 +112058,10 @@ daI daM cRi cTA -cRi -cRi -cRi -cRi +dlV +dlV +dlV +dlV aaf aag aaa diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 3eebcbf5e1..6bf52ab60a 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -26613,12 +26613,6 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) -"bpp" = ( -/obj/machinery/computer/camera_advanced/xenobio{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "bpq" = ( /obj/structure/sign/warning/electricshock, /turf/closed/wall/r_wall, @@ -27817,9 +27811,6 @@ /turf/open/floor/plasteel/white, /area/science/xenobiology) "brQ" = ( -/obj/machinery/computer/camera_advanced/xenobio{ - dir = 8 - }, /obj/machinery/camera{ c_tag = "Xenobiology Port"; dir = 8; @@ -28611,11 +28602,11 @@ /turf/open/floor/plating, /area/science/xenobiology) "btD" = ( -/turf/open/floor/plating/airless, +/turf/open/floor/plating, /area/science/xenobiology) "btE" = ( /obj/effect/decal/remains/xeno, -/turf/open/floor/plating/airless, +/turf/open/floor/plating, /area/science/xenobiology) "btF" = ( /obj/structure/chair{ @@ -29236,12 +29227,7 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/machinery/camera{ - c_tag = "Xenobiology Kill Room"; - dir = 8; - network = list("ss13","rd") - }, -/turf/open/floor/plating/airless, +/turf/open/floor/plating, /area/science/xenobiology) "bva" = ( /turf/closed/wall, @@ -31308,16 +31294,22 @@ /turf/open/floor/plasteel/whitepurple/side, /area/science/xenobiology) "bzi" = ( -/obj/item/extinguisher{ - pixel_x = 4; - pixel_y = 3 +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/item/extinguisher, /obj/structure/table/glass, -/turf/open/floor/plasteel/whitepurple/side, +/obj/item/extinguisher, +/obj/item/extinguisher{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/extinguisher{ + pixel_x = 5; + pixel_y = 5 + }, +/turf/open/floor/plasteel, /area/science/xenobiology) "bzj" = ( -/obj/structure/reagent_dispensers/watertank, /obj/machinery/requests_console{ department = "Science"; departmentType = 2; @@ -31325,6 +31317,7 @@ pixel_x = 32; receive_ore_updates = 1 }, +/obj/structure/reagent_dispensers/watertank/high, /turf/open/floor/plasteel/whitepurple/side, /area/science/xenobiology) "bzk" = ( @@ -93288,7 +93281,7 @@ bkE aht bnd boh -bpp +bpn bqx brQ btr diff --git a/cfg/admin.txt b/cfg/admin.txt index 8b13789179..fcc587124a 100644 --- a/cfg/admin.txt +++ b/cfg/admin.txt @@ -1 +1 @@ - +poojawa role=admin diff --git a/code/citadel/_cit_helpers.dm b/code/__HELPERS/_cit_helpers.dm similarity index 100% rename from code/citadel/_cit_helpers.dm rename to code/__HELPERS/_cit_helpers.dm diff --git a/code/_globalvars/tooltips.dm b/code/_globalvars/tooltips.dm deleted file mode 100755 index 58bb6bcea5..0000000000 --- a/code/_globalvars/tooltips.dm +++ /dev/null @@ -1 +0,0 @@ -GLOBAL_VAR_INIT(enable_examine_tips, TRUE) \ No newline at end of file diff --git a/code/_onclick/god.dm b/code/_onclick/god.dm deleted file mode 100644 index 24629a0635..0000000000 --- a/code/_onclick/god.dm +++ /dev/null @@ -1,8 +0,0 @@ -/mob/camera/god/UnarmedAttack(atom/A) - A.attack_god(src) - -/mob/camera/god/RangedAttack(atom/A) - A.attack_god(src) - -/atom/proc/attack_god(mob/user) - return diff --git a/code/_onclick/hud/other_mobs.dm b/code/_onclick/hud/other_mobs.dm deleted file mode 100644 index fa2a4ebf31..0000000000 --- a/code/_onclick/hud/other_mobs.dm +++ /dev/null @@ -1,13 +0,0 @@ - -/datum/hud/brain/show_hud(version = 0) - if(!ismob(mymob)) - return 0 - if(!mymob.client) - return 0 - mymob.client.screen = list() - mymob.client.screen += mymob.client.void - -/mob/living/brain/create_mob_hud() - if(client && !hud_used) - hud_used = new /datum/hud/brain(src) - diff --git a/code/citadel/cit_guns.dm b/code/citadel/cit_guns.dm deleted file mode 100644 index 3b0f86dae4..0000000000 --- a/code/citadel/cit_guns.dm +++ /dev/null @@ -1,1249 +0,0 @@ -/obj/item/gun/energy/laser/carbine - name = "laser carbine" - desc = "A ruggedized laser carbine featuring much higher capacity and improved handling when compared to a normal laser gun." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "lasernew" - item_state = "laser" - force = 10 - throwforce = 10 - ammo_type = list(/obj/item/ammo_casing/energy/lasergun) - cell_type = /obj/item/stock_parts/cell/lascarbine - resistance_flags = FIRE_PROOF | ACID_PROOF - -/obj/item/gun/energy/laser/carbine/nopin - pin = null - -/obj/item/stock_parts/cell/lascarbine - name = "laser carbine power supply" - maxcharge = 2500 - -/datum/design/lasercarbine - name = "Laser Carbine" - desc = "Beefed up version of a standard laser gun." - id = "lasercarbine" - build_type = PROTOLATHE - materials = list(MAT_GOLD = 2500, MAT_METAL = 5000, MAT_GLASS = 5000) - build_path = /obj/item/gun/energy/laser/carbine/nopin - category = list("Weapons") - -////////////Anti Tank Pistol//////////// - -/obj/item/gun/ballistic/automatic/pistol/antitank - name = "Anti Tank Pistol" - desc = "A massively impractical and silly monstrosity of a pistol that fires .50 calliber rounds. The recoil is likely to dislocate your wrist." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "atp" - item_state = "pistol" - recoil = 4 - mag_type = /obj/item/ammo_box/magazine/sniper_rounds - fire_delay = 50 - burst_size = 1 - can_suppress = 0 - w_class = WEIGHT_CLASS_NORMAL - actions_types = list() - fire_sound = 'sound/weapons/blastcannon.ogg' - spread = 20 //damn thing has no rifling. - -/obj/item/gun/ballistic/automatic/pistol/antitank/update_icon() - ..() - if(magazine) - cut_overlays() - add_overlay("atp-mag") - else - cut_overlays() - icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" - -/obj/item/gun/ballistic/automatic/pistol/antitank/syndicate - name = "Syndicate Anti Tank Pistol" - desc = "A massively impractical and silly monstrosity of a pistol that fires .50 calliber rounds. The recoil is likely to dislocate a variety of joints without proper bracing." - pin = /obj/item/device/firing_pin/implant/pindicate - -/////////////spinfusor stuff//////////////// - -/obj/item/projectile/bullet/spinfusor - name ="spinfusor disk" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state= "spinner" - damage = 30 - dismemberment = 25 - -/obj/item/projectile/bullet/spinfusor/on_hit(atom/target, blocked = FALSE) //explosion to emulate the spinfusor's AOE - ..() - explosion(target, -1, -1, 2, 0, -1) - return 1 - -/obj/item/ammo_casing/caseless/spinfusor - name = "spinfusor disk" - desc = "A magnetic disk designed specifically for the Stormhammer magnetic cannon. Warning: extremely volatile!" - projectile_type = /obj/item/projectile/bullet/spinfusor - caliber = "spinfusor" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "disk" - throwforce = 15 //still deadly when thrown - throw_speed = 3 - -/obj/item/ammo_casing/caseless/spinfusor/throw_impact(atom/target) //disks detonate when thrown - if(!..()) // not caught in mid-air - visible_message("[src] detonates!") - playsound(src.loc, "sparks", 50, 1) - explosion(target, -1, -1, 1, 1, -1) - qdel(src) - return 1 - -/obj/item/ammo_box/magazine/internal/spinfusor - name = "spinfusor internal magazine" - ammo_type = /obj/item/ammo_casing/caseless/spinfusor - caliber = "spinfusor" - max_ammo = 1 - -/obj/item/gun/ballistic/automatic/spinfusor - name = "Stormhammer Magnetic Cannon" - desc = "An innovative weapon utilizing mag-lev technology to spin up a magnetic fusor and launch it at extreme velocities." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "spinfusor" - item_state = "spinfusor" - mag_type = /obj/item/ammo_box/magazine/internal/spinfusor - fire_sound = 'sound/weapons/rocketlaunch.ogg' - w_class = WEIGHT_CLASS_BULKY - can_suppress = 0 - burst_size = 1 - fire_delay = 40 - select = 0 - actions_types = list() - casing_ejector = 0 - -/obj/item/gun/ballistic/automatic/spinfusor/attackby(obj/item/A, mob/user, params) - var/num_loaded = magazine.attackby(A, user, params, 1) - if(num_loaded) - to_chat(user, "You load [num_loaded] disk\s into \the [src].") - update_icon() - chamber_round() - -/obj/item/gun/ballistic/automatic/spinfusor/attack_self(mob/living/user) - return //caseless rounds are too glitchy to unload properly. Best to make it so that you cannot remove disks from the spinfusor - -/obj/item/gun/ballistic/automatic/spinfusor/update_icon() - ..() - icon_state = "spinfusor[magazine ? "-[get_ammo(1)]" : ""]" - -/obj/item/ammo_box/aspinfusor - name = "ammo box (spinfusor disks)" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "spinfusorbox" - ammo_type = /obj/item/ammo_casing/caseless/spinfusor - max_ammo = 8 - -/datum/supply_pack/security/armory/spinfusor - name = "Stormhammer Spinfusor Crate" - cost = 14000 - contains = list(/obj/item/gun/ballistic/automatic/spinfusor, - /obj/item/gun/ballistic/automatic/spinfusor) - crate_name = "spinfusor crate" - -/datum/supply_pack/security/armory/spinfusorammo - name = "Spinfusor Disk Crate" - cost = 7000 - contains = list(/obj/item/ammo_box/aspinfusor, - /obj/item/ammo_box/aspinfusor, - /obj/item/ammo_box/aspinfusor, - /obj/item/ammo_box/aspinfusor) - crate_name = "spinfusor disk crate" - -///////XCOM X9 AR/////// - -/obj/item/gun/ballistic/automatic/x9 //will be adminspawn only so ERT or something can use them - name = "\improper X9 Assault Rifle" - desc = "A rather old design of a cheap, reliable assault rifle made for combat against unknown enemies. Uses 5.56mm ammo." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "x9" - item_state = "arg" - slot_flags = 0 - mag_type = /obj/item/ammo_box/magazine/m556 //Uses the m90gl's magazine, just like the NT-ARG - fire_sound = 'sound/weapons/gunshot_smg.ogg' - can_suppress = 0 - burst_size = 6 //in line with XCOMEU stats. This can fire 5 bursts from a full magazine. - fire_delay = 1 - spread = 30 //should be 40 for XCOM memes, but since its adminspawn only, might as well make it useable - recoil = 1 - -///toy memes/// - -/obj/item/ammo_box/magazine/toy/x9 - name = "foam force X9 magazine" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "toy9magazine" - max_ammo = 30 - multiple_sprites = 2 - materials = list(MAT_METAL = 200) - -/obj/item/gun/ballistic/automatic/x9/toy - name = "\improper Foam Force X9" - desc = "An old but reliable assault rifle made for combat against unknown enemies. Appears to be hastily converted. Ages 8 and up." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "toy9" - can_suppress = 0 - obj_flags = 0 - mag_type = /obj/item/ammo_box/magazine/toy/x9 - casing_ejector = 0 - spread = 90 //MAXIMUM XCOM MEMES (actually that'd be 180 spread) - w_class = WEIGHT_CLASS_BULKY - weapon_weight = WEAPON_HEAVY - -////////XCOM2 Magpistol///////// - -//////projectiles////// - -/obj/item/projectile/bullet/mags - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "magjectile" - damage = 15 - armour_penetration = 10 - light_range = 2 - speed = 0.6 - range = 25 - light_color = LIGHT_COLOR_RED - -/obj/item/projectile/bullet/nlmags //non-lethal boolets - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "magjectile-nl" - damage = 0 - knockdown = 0 - stamina = 25 - armour_penetration = -10 - light_range = 2 - speed = 0.7 - range = 25 - light_color = LIGHT_COLOR_BLUE - - -/////actual ammo///// - -/obj/item/ammo_casing/caseless/amags - desc = "A ferromagnetic slug intended to be launched out of a compatible weapon." - caliber = "mags" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "mag-casing-live" - projectile_type = /obj/item/projectile/bullet/mags - -/obj/item/ammo_casing/caseless/anlmags - desc = "A specialized ferromagnetic slug designed with a less-than-lethal payload." - caliber = "mags" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "mag-casing-live" - projectile_type = /obj/item/projectile/bullet/nlmags - -//////magazines///// - -/obj/item/ammo_box/magazine/mmag/small - name = "magpistol magazine (non-lethal disabler)" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "nlmagmag" - ammo_type = /obj/item/ammo_casing/caseless/anlmags - caliber = "mags" - max_ammo = 15 - multiple_sprites = 2 - -/obj/item/ammo_box/magazine/mmag/small/lethal - name = "magpistol magazine (lethal)" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "smallmagmag" - ammo_type = /obj/item/ammo_casing/caseless/amags - -//////the gun itself////// - -/obj/item/gun/ballistic/automatic/pistol/mag - name = "magpistol" - desc = "A handgun utilizing maglev technologies to propel a ferromagnetic slug to extreme velocities." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "magpistol" - force = 10 - fire_sound = 'sound/weapons/magpistol.ogg' - mag_type = /obj/item/ammo_box/magazine/mmag/small - can_suppress = 0 - casing_ejector = 0 - fire_delay = 2 - recoil = 0.2 - -/obj/item/gun/ballistic/automatic/pistol/mag/update_icon() - ..() - if(magazine) - cut_overlays() - add_overlay("magpistol-magazine") - else - cut_overlays() - icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" - -///research memes/// - -/obj/item/gun/ballistic/automatic/pistol/mag/nopin - pin = null - spawnwithmagazine = FALSE - -/datum/design/magpistol - name = "Magpistol" - desc = "A weapon which fires ferromagnetic slugs." - id = "magpisol" - build_type = PROTOLATHE - materials = list(MAT_METAL = 7500, MAT_GLASS = 1000, MAT_URANIUM = 1000, MAT_TITANIUM = 5000, MAT_SILVER = 2000) - build_path = /obj/item/gun/ballistic/automatic/pistol/mag/nopin - category = list("Weapons") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/mag_magpistol - name = "Magpistol Magazine" - desc = "A 14 round magazine for the Magpistol." - id = "mag_magpistol" - build_type = PROTOLATHE - materials = list(MAT_METAL = 4000, MAT_SILVER = 500) - build_path = /obj/item/ammo_box/magazine/mmag/small/lethal - category = list("Ammo") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/mag_magpistol/nl - name = "Magpistol Magazine (Non-Lethal)" - desc = "A 14 round non-lethal magazine for the Magpistol." - id = "mag_magpistol_nl" - materials = list(MAT_METAL = 3000, MAT_SILVER = 250, MAT_TITANIUM = 250) - build_path = /obj/item/ammo_box/magazine/mmag/small - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -//////toy memes///// - -/obj/item/projectile/bullet/reusable/foam_dart/mag - name = "magfoam dart" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "magjectile-toy" - ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag - light_range = 2 - light_color = LIGHT_COLOR_YELLOW - -/obj/item/ammo_casing/caseless/foam_dart/mag - name = "magfoam dart" - desc = "A foam dart with fun light-up projectiles powered by magnets!" - projectile_type = /obj/item/projectile/bullet/reusable/foam_dart/mag - -/obj/item/ammo_box/magazine/internal/shot/toy/mag - ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag - max_ammo = 14 - -/obj/item/gun/ballistic/shotgun/toy/mag - name = "foam force magpistol" - desc = "A fancy toy sold alongside light-up foam force darts. Ages 8 and up." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "toymag" - item_state = "gun" - mag_type = /obj/item/ammo_box/magazine/internal/shot/toy/mag - fire_sound = 'sound/weapons/magpistol.ogg' - slot_flags = SLOT_BELT - w_class = WEIGHT_CLASS_SMALL - -/obj/item/ammo_box/foambox/mag - name = "ammo box (Magnetic Foam Darts)" - icon = 'icons/obj/guns/toy.dmi' - icon_state = "foambox" - ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag - max_ammo = 42 - -//////Magrifle////// - -///projectiles/// - -/obj/item/projectile/bullet/magrifle - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "magjectile-large" - damage = 20 - armour_penetration = 25 - light_range = 3 - speed = 0.7 - range = 35 - light_color = LIGHT_COLOR_RED - -/obj/item/projectile/bullet/nlmagrifle //non-lethal boolets - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "magjectile-large-nl" - damage = 0 - knockdown = 0 - stamina = 25 - armour_penetration = -10 - light_range = 3 - speed = 0.65 - range = 35 - light_color = LIGHT_COLOR_BLUE - -///ammo casings/// - -/obj/item/ammo_casing/caseless/amagm - desc = "A large ferromagnetic slug intended to be launched out of a compatible weapon." - caliber = "magm" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "mag-casing-live" - projectile_type = /obj/item/projectile/bullet/magrifle - -/obj/item/ammo_casing/caseless/anlmagm - desc = "A large, specialized ferromagnetic slug designed with a less-than-lethal payload." - caliber = "magm" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "mag-casing-live" - projectile_type = /obj/item/projectile/bullet/nlmagrifle - -///magazines/// - -/obj/item/ammo_box/magazine/mmag/ - name = "magrifle magazine (non-lethal disabler)" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "mediummagmag" - ammo_type = /obj/item/ammo_casing/caseless/anlmagm - caliber = "magm" - max_ammo = 24 - multiple_sprites = 2 - -/obj/item/ammo_box/magazine/mmag/lethal - name = "magrifle magazine (lethal)" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "mediummagmag" - ammo_type = /obj/item/ammo_casing/caseless/amagm - max_ammo = 24 - -///the gun itself/// - -/obj/item/gun/ballistic/automatic/magrifle - name = "\improper Magnetic Rifle" - desc = "A simple upscalling of the technologies used in the magpistol, the magrifle is capable of firing slightly larger slugs in bursts. Compatible with the magpistol's slugs." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "magrifle" - item_state = "arg" - slot_flags = 0 - mag_type = /obj/item/ammo_box/magazine/mmag - fire_sound = 'sound/weapons/magrifle.ogg' - can_suppress = 0 - burst_size = 3 - fire_delay = 2 - spread = 5 - recoil = 0.15 - casing_ejector = 0 - -///research/// - -/obj/item/gun/ballistic/automatic/magrifle/nopin - pin = null - spawnwithmagazine = FALSE - -/datum/design/magrifle - name = "Magrifle" - desc = "An upscaled Magpistol in rifle form." - id = "magrifle" - build_type = PROTOLATHE - materials = list(MAT_METAL = 10000, MAT_GLASS = 2000, MAT_URANIUM = 2000, MAT_TITANIUM = 10000, MAT_SILVER = 4000, MAT_GOLD = 2000) - build_path = /obj/item/gun/ballistic/automatic/magrifle/nopin - category = list("Weapons") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/mag_magrifle - name = "Magrifle Magazine (Lethal)" - desc = "A 24-round magazine for the Magrifle." - id = "mag_magrifle" - build_type = PROTOLATHE - materials = list(MAT_METAL = 8000, MAT_SILVER = 1000) - build_path = /obj/item/ammo_box/magazine/mmag/lethal - category = list("Ammo") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/mag_magrifle/nl - name = "Magrifle Magazine (Non-Lethal)" - desc = "A 24- round non-lethal magazine for the Magrifle." - id = "mag_magrifle_nl" - materials = list(MAT_METAL = 6000, MAT_SILVER = 500, MAT_TITANIUM = 500) - build_path = /obj/item/ammo_box/magazine/mmag - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -///foamagrifle/// - -/obj/item/ammo_box/magazine/toy/foamag - name = "foam force magrifle magazine" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "foamagmag" - max_ammo = 24 - multiple_sprites = 2 - ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag - materials = list(MAT_METAL = 200) - -/obj/item/gun/ballistic/automatic/magrifle/toy - name = "foamag rifle" - desc = "A foam launching magnetic rifle. Ages 8 and up." - icon_state = "foamagrifle" - obj_flags = 0 - mag_type = /obj/item/ammo_box/magazine/toy/foamag - casing_ejector = FALSE - spread = 60 - w_class = WEIGHT_CLASS_BULKY - weapon_weight = WEAPON_HEAVY - -/* -// TECHWEBS IMPLEMENTATION -*/ - -/datum/techweb_node/magnetic_weapons - id = "magnetic_weapons" - display_name = "Magnetic Weapons" - description = "Weapons using magnetic technology" - prereq_ids = list("weaponry", "adv_weaponry", "emp_adv") - design_ids = list("magrifle", "magpisol", "mag_magrifle", "mag_magrifle_nl", "mag_magpistol", "mag_magpistol_nl") - research_cost = 2500 - export_price = 5000 - - -//////Hyper-Burst Rifle////// - -///projectiles/// - -/obj/item/projectile/bullet/mags/hyper - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "magjectile" - damage = 10 - armour_penetration = 10 - stamina = 10 - forcedodge = TRUE - range = 6 - light_range = 1 - light_color = LIGHT_COLOR_RED - -/obj/item/projectile/bullet/mags/hyper/inferno - icon_state = "magjectile-large" - stamina = 0 - forcedodge = FALSE - range = 25 - light_range = 4 - -/obj/item/projectile/bullet/mags/hyper/inferno/on_hit(atom/target, blocked = FALSE) - ..() - explosion(target, -1, 1, 2, 4, 5) - return 1 - -///ammo casings/// - -/obj/item/ammo_casing/caseless/ahyper - desc = "A large block of speciallized ferromagnetic material designed to be fired out of the experimental Hyper-Burst Rifle." - caliber = "hypermag" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "hyper-casing-live" - projectile_type = /obj/item/projectile/bullet/mags/hyper - pellets = 12 - variance = 40 - -/obj/item/ammo_casing/caseless/ahyper/inferno - projectile_type = /obj/item/projectile/bullet/mags/hyper/inferno - pellets = 1 - variance = 0 - -///magazines/// - -/obj/item/ammo_box/magazine/mhyper - name = "hyper-burst rifle magazine" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "hypermag-4" - ammo_type = /obj/item/ammo_casing/caseless/ahyper - caliber = "hypermag" - desc = "A magazine for the Hyper-Burst Rifle. Loaded with a special slug that fragments into 12 smaller shards which can absolutely puncture anything, but has rather short effective range." - max_ammo = 4 - -/obj/item/ammo_box/magazine/mhyper/update_icon() - ..() - icon_state = "hypermag-[ammo_count() ? "4" : "0"]" - -/obj/item/ammo_box/magazine/mhyper/inferno - name = "hyper-burst rifle magazine (inferno)" - ammo_type = /obj/item/ammo_casing/caseless/ahyper/inferno - desc = "A magazine for the Hyper-Burst Rifle. Loaded with a special slug that violently reacts with whatever surface it strikes, generating a massive amount of heat and light." - -///gun itself/// - -/obj/item/gun/ballistic/automatic/hyperburst - name = "\improper Hyper-Burst Rifle" - desc = "An extremely beefed up version of a stolen Nanotrasen weapon prototype, this 'rifle' is more like a cannon, with an extremely large bore barrel capable of generating several smaller magnetic 'barrels' to simultaneously launch multiple projectiles at once." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "hyperburst" - item_state = "arg" - slot_flags = 0 - mag_type = /obj/item/ammo_box/magazine/mhyper - fire_sound = 'sound/weapons/magburst.ogg' - can_suppress = 0 - burst_size = 1 - fire_delay = 40 - recoil = 2 - casing_ejector = 0 - weapon_weight = WEAPON_HEAVY - -/obj/item/gun/ballistic/automatic/hyperburst/update_icon() - ..() - icon_state = "hyperburst[magazine ? "-[get_ammo()]" : ""][chambered ? "" : "-e"]" - -///toy memes/// - -/obj/item/projectile/beam/lasertag/mag //the projectile, compatible with regular laser tag armor - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "magjectile-toy" - name = "lasertag magbolt" - forcedodge = TRUE //for penetration memes - range = 5 //so it isn't super annoying - light_range = 2 - light_color = LIGHT_COLOR_YELLOW - eyeblur = 0 - -/obj/item/ammo_casing/energy/laser/magtag - projectile_type = /obj/item/projectile/beam/lasertag/mag - select_name = "magtag" - pellets = 3 - variance = 30 - e_cost = 1000 - fire_sound = 'sound/weapons/magburst.ogg' - -/obj/item/gun/energy/laser/practice/hyperburst - name = "toy hyper-burst launcher" - desc = "A toy laser with a unique beam shaping lens that projects harmless bolts capable of going through objects. Compatible with existing laser tag systems." - ammo_type = list(/obj/item/ammo_casing/energy/laser/magtag) - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "toyburst" - clumsy_check = FALSE - obj_flags = 0 - fire_delay = 40 - weapon_weight = WEAPON_HEAVY - selfcharge = TRUE - charge_delay = 2 - recoil = 2 - cell_type = /obj/item/stock_parts/cell/toymagburst - -/obj/item/stock_parts/cell/toymagburst - name = "toy mag burst rifle power supply" - maxcharge = 4000 - -/* made redundant by reskinnable stetchkins -//////Stealth Pistol////// - -/obj/item/gun/ballistic/automatic/pistol/stealth - name = "stealth pistol" - desc = "A unique bullpup pistol with a compact frame. Has an integrated surpressor." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "stealthpistol" - w_class = WEIGHT_CLASS_SMALL - mag_type = /obj/item/ammo_box/magazine/m10mm - can_suppress = 0 - fire_sound = 'sound/weapons/gunshot_silenced.ogg' - suppressed = 1 - burst_size = 1 - -/obj/item/gun/ballistic/automatic/pistol/stealth/update_icon() - ..() - if(magazine) - cut_overlays() - add_overlay("stealthpistol-magazine") - else - cut_overlays() - icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" - -*/ - -///foam stealth pistol/// - -/obj/item/gun/ballistic/automatic/toy/pistol/stealth - name = "foam force stealth pistol" - desc = "A small, easily concealable toy bullpup handgun. Ages 8 and up." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "foamsp" - w_class = WEIGHT_CLASS_SMALL - mag_type = /obj/item/ammo_box/magazine/toy/pistol - can_suppress = FALSE - fire_sound = 'sound/weapons/gunshot_silenced.ogg' - suppressed = TRUE - burst_size = 1 - fire_delay = 0 - spread = 20 - actions_types = list() - -/obj/item/gun/ballistic/automatic/toy/pistol/stealth/update_icon() - ..() - if(magazine) - cut_overlays() - add_overlay("foamsp-magazine") - else - cut_overlays() - icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" - -//////10mm soporific bullets////// - -obj/item/projectile/bullet/c10mm/soporific - name ="10mm soporific bullet" - armour_penetration = 0 - nodamage = TRUE - dismemberment = 0 - knockdown = 0 - -/obj/item/projectile/bullet/c10mm/soporific/on_hit(atom/target, blocked = FALSE) - if((blocked != 100) && isliving(target)) - var/mob/living/L = target - L.blur_eyes(6) - if(L.getStaminaLoss() >= 60) - L.Sleeping(300) - else - L.adjustStaminaLoss(25) - return 1 - -/obj/item/ammo_casing/c10mm/soporific - name = ".10mm soporific bullet casing" - desc = "A 10mm soporific bullet casing." - projectile_type = /obj/item/projectile/bullet/c10mm/soporific - -/obj/item/ammo_box/magazine/m10mm/soporific - name = "pistol magazine (10mm soporific)" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "9x19pS" - desc = "A gun magazine. Loaded with rounds which inject the target with a variety of illegal substances to induce sleep in the target." - ammo_type = /obj/item/ammo_casing/c10mm/soporific - -/obj/item/ammo_box/c10mm/soporific - name = "ammo box (10mm soporific)" - ammo_type = /obj/item/ammo_casing/c10mm/soporific - max_ammo = 24 - -//////Flechette Launcher////// - -///projectiles/// - -/obj/item/projectile/bullet/cflechetteap //shreds armor - name = "flechette (armor piercing)" - damage = 8 - armour_penetration = 80 - -/obj/item/projectile/bullet/cflechettes //shreds flesh and forces bleeding - name = "flechette (serrated)" - damage = 15 - dismemberment = 10 - armour_penetration = -80 - -/obj/item/projectile/bullet/cflechettes/on_hit(atom/target, blocked = FALSE) - if((blocked != 100) && iscarbon(target)) - var/mob/living/carbon/C = target - C.bleed(10) - return ..() - -///ammo casings (CASELESS AMMO CASINGS WOOOOOOOO)/// - -/obj/item/ammo_casing/caseless/flechetteap - name = "flechette (armor piercing)" - desc = "A flechette made with a tungsten alloy." - projectile_type = /obj/item/projectile/bullet/cflechetteap - caliber = "flechette" - throwforce = 1 - throw_speed = 3 - -/obj/item/ammo_casing/caseless/flechettes - name = "flechette (serrated)" - desc = "A serrated flechette made of a special alloy intended to deform drastically upon penetration of human flesh." - projectile_type = /obj/item/projectile/bullet/cflechettes - caliber = "flechette" - throwforce = 2 - throw_speed = 3 - embedding = list("embedded_pain_multiplier" = 0, "embed_chance" = 40, "embedded_fall_chance" = 10) - -///magazine/// - -/obj/item/ammo_box/magazine/flechette - name = "flechette magazine (armor piercing)" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "flechettemag" - ammo_type = /obj/item/ammo_casing/caseless/flechetteap - caliber = "flechette" - max_ammo = 40 - multiple_sprites = 2 - -/obj/item/ammo_box/magazine/flechette/s - name = "flechette magazine (serrated)" - ammo_type = /obj/item/ammo_casing/caseless/flechettes - -///the gun itself/// - -/obj/item/gun/ballistic/automatic/flechette - name = "\improper CX Flechette Launcher" - desc = "A flechette launching machine pistol with an unconventional bullpup frame." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "flechettegun" - item_state = "gun" - w_class = WEIGHT_CLASS_NORMAL - slot_flags = 0 - /obj/item/device/firing_pin/implant/pindicate - mag_type = /obj/item/ammo_box/magazine/flechette/ - fire_sound = 'sound/weapons/gunshot_smg.ogg' - can_suppress = 0 - burst_size = 5 - fire_delay = 1 - casing_ejector = 0 - spread = 10 - recoil = 0.05 - -/obj/item/gun/ballistic/automatic/flechette/update_icon() - ..() - if(magazine) - cut_overlays() - add_overlay("flechettegun-magazine") - else - cut_overlays() - icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" - -///unique variant/// - -/obj/item/projectile/bullet/cflechetteshredder - name = "flechette (shredder)" - damage = 5 - dismemberment = 40 - -/obj/item/ammo_casing/caseless/flechetteshredder - name = "flechette (shredder)" - desc = "A serrated flechette made of a special alloy that forms a monofilament edge." - projectile_type = /obj/item/projectile/bullet/cflechettes - -/obj/item/ammo_box/magazine/flechette/shredder - name = "flechette magazine (shredder)" - icon_state = "shreddermag" - ammo_type = /obj/item/ammo_casing/caseless/flechetteshredder - -/obj/item/gun/ballistic/automatic/flechette/shredder - name = "\improper CX Shredder" - desc = "A flechette launching machine pistol made of ultra-light CFRP optimized for firing serrated monofillament flechettes." - w_class = WEIGHT_CLASS_SMALL - mag_type = /obj/item/ammo_box/magazine/flechette/shredder - spread = 15 - recoil = 0.1 - -/obj/item/gun/ballistic/automatic/flechette/shredder/update_icon() - ..() - if(magazine) - cut_overlays() - add_overlay("shreddergun-magazine") - else - cut_overlays() - icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" - -//////modular pistol////// (reskinnable stetchkins) - -/obj/item/gun/ballistic/automatic/pistol/modular - name = "modular pistol" - desc = "A small, easily concealable 10mm handgun. Has a threaded barrel for suppressors." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "cde" - can_unsuppress = TRUE - obj_flags = UNIQUE_RENAME - unique_reskin = list("Default" = "cde", - "NT-99" = "n99", - "Stealth" = "stealthpistol", - "HKVP-78" = "vp78", - "Luger" = "p08b", - "Mk.58" = "secguncomp", - "PX4 Storm" = "px4" - ) - -/obj/item/gun/ballistic/automatic/pistol/modular/update_icon() - ..() - if(current_skin) - icon_state = "[unique_reskin[current_skin]][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]" - else - icon_state = "[initial(icon_state)][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]" - if(magazine && suppressed) - cut_overlays() - add_overlay("[unique_reskin[current_skin]]-magazine-sup") //Yes, this means the default iconstate can't have a magazine overlay - else if (magazine) - cut_overlays() - add_overlay("[unique_reskin[current_skin]]-magazine") - else - cut_overlays() - -/////////RAYGUN MEMES///////// - -/obj/item/projectile/beam/lasertag/ray //the projectile, compatible with regular laser tag armor - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "ray" - name = "ray bolt" - eyeblur = 0 - -/obj/item/ammo_casing/energy/laser/raytag - projectile_type = /obj/item/projectile/beam/lasertag/ray - select_name = "raytag" - fire_sound = 'sound/weapons/raygun.ogg' - -/obj/item/gun/energy/laser/practice/raygun - name = "toy ray gun" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "raygun" - desc = "A toy laser with a classic, retro feel and look. Compatible with existing laser tag systems." - ammo_type = list(/obj/item/ammo_casing/energy/laser/raytag) - selfcharge = TRUE - -/*///////////////////////////////////////////////////////////////////////////////////////////// - The Recolourable Gun -*////////////////////////////////////////////////////////////////////////////////////////////// - -/obj/item/gun/ballistic/automatic/pistol/p37 - name = "\improper CX Mk.37P" - desc = "A modern reimagining of an old legendary gun, the Mk.37 is a handgun with a toggle-locking mechanism manufactured by CX Armories. \ - This model is coated with a special polychromic material. \ - Has a small warning on the receiver that boldly states 'WARNING: WILL DETONATE UPON UNAUTHORIZED USE'. \ - Uses 9mm bullets loaded into proprietary magazines." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "p37" - w_class = WEIGHT_CLASS_NORMAL - spawnwithmagazine = FALSE - mag_type = /obj/item/ammo_box/magazine/m9mm/p37 - can_suppress = FALSE - pin = /obj/item/device/firing_pin/dna/dredd //goes boom if whoever isn't DNA locked to it tries to use it - actions_types = list(/datum/action/item_action/pick_color) - - var/frame_color = "#808080" //RGB - var/receiver_color = "#808080" - var/body_color = "#0098FF" - var/barrel_color = "#808080" - var/tip_color = "#808080" - var/arm_color = "#808080" - var/grip_color = "#00FFCB" //Does not actually colour the grip, just the lights surrounding it - var/energy_color = "#00FFCB" - -///Defining all the colourable bits and displaying them/// - -/obj/item/gun/ballistic/automatic/pistol/p37/update_icon() - var/mutable_appearance/frame_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_frame") - var/mutable_appearance/receiver_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_receiver") - var/mutable_appearance/body_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_body") - var/mutable_appearance/barrel_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_barrel") - var/mutable_appearance/tip_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_tip") - var/mutable_appearance/grip_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_grip") - var/mutable_appearance/energy_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_light") - var/mutable_appearance/arm_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_arm") - var/mutable_appearance/arm_overlay_e = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_arm-e") - - if(frame_color) - frame_overlay.color = frame_color - if(receiver_color) - receiver_overlay.color = receiver_color - if(body_color) - body_overlay.color = body_color - if(barrel_color) - barrel_overlay.color = barrel_color - if(tip_color) - tip_overlay.color = tip_color - if(grip_color) - grip_overlay.color = grip_color - if(energy_color) - energy_overlay.color = energy_color - if(arm_color) - arm_overlay.color = arm_color - if(arm_color) - arm_overlay_e.color = arm_color - - cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other - - add_overlay(frame_overlay) - add_overlay(receiver_overlay) - add_overlay(body_overlay) - add_overlay(barrel_overlay) - add_overlay(tip_overlay) - add_overlay(grip_overlay) - add_overlay(energy_overlay) - - if(magazine) //does not need a cut_overlays proc call here because it's already called further up - add_overlay("p37_mag") - - if(chambered) - cut_overlay(arm_overlay_e) - add_overlay(arm_overlay) - else - cut_overlay(arm_overlay) - add_overlay(arm_overlay_e) - -///letting you actually recolor things/// - -/obj/item/gun/ballistic/automatic/pistol/p37/ui_action_click(mob/user, var/datum/action/A) - if(istype(A, /datum/action/item_action/pick_color)) - - var/choice = input(user,"Mk.37P polychrome options", "Gun Recolor") in list("Frame Color","Receiver Color","Body Color", - "Barrel Color", "Barrel Tip Color", "Grip Light Color", - "Light Color", "Arm Color", "*CANCEL*") - - switch(choice) - - if("Frame Color") - var/frame_color_input = input(usr,"","Choose Frame Color",frame_color) as color|null - if(frame_color_input) - frame_color = sanitize_hexcolor(frame_color_input, desired_format=6, include_crunch=1) - update_icon() - - if("Receiver Color") - var/receiver_color_input = input(usr,"","Choose Receiver Color",receiver_color) as color|null - if(receiver_color_input) - receiver_color = sanitize_hexcolor(receiver_color_input, desired_format=6, include_crunch=1) - update_icon() - - if("Body Color") - var/body_color_input = input(usr,"","Choose Body Color",body_color) as color|null - if(body_color_input) - body_color = sanitize_hexcolor(body_color_input, desired_format=6, include_crunch=1) - update_icon() - - if("Barrel Color") - var/barrel_color_input = input(usr,"","Choose Barrel Color",barrel_color) as color|null - if(barrel_color_input) - barrel_color = sanitize_hexcolor(barrel_color_input, desired_format=6, include_crunch=1) - update_icon() - - if("Barrel Tip Color") - var/tip_color_input = input(usr,"","Choose Barrel Tip Color",tip_color) as color|null - if(tip_color_input) - tip_color = sanitize_hexcolor(tip_color_input, desired_format=6, include_crunch=1) - update_icon() - - if("Grip Light Color") - var/grip_color_input = input(usr,"","Choose Grip Light Color",grip_color) as color|null - if(grip_color_input) - grip_color = sanitize_hexcolor(grip_color_input, desired_format=6, include_crunch=1) - update_icon() - - if("Light Color") - var/energy_color_input = input(usr,"","Choose Light Color",energy_color) as color|null - if(energy_color_input) - energy_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1) - update_icon() - - if("Arm Color") - var/arm_color_input = input(usr,"","Choose Arm Color",arm_color) as color|null - if(arm_color_input) - arm_color = sanitize_hexcolor(arm_color_input, desired_format=6, include_crunch=1) - update_icon() - A.UpdateButtonIcon() - - else - ..() - -///boolets/// - -/obj/item/projectile/bullet/c9mm/frangible - name = "9mm frangible bullet" - damage = 15 - stamina = 0 - speed = 1.0 - range = 20 - armour_penetration = -25 - -/obj/item/projectile/bullet/c9mm/rubber - name = "9mm rubber bullet" - damage = 5 - stamina = 30 - speed = 1.2 - range = 14 - knockdown = 0 - -/obj/item/ammo_casing/c9mm/frangible - name = "9mm frangible bullet casing" - desc = "A 9mm frangible bullet casing." - projectile_type = /obj/item/projectile/bullet/c9mm/frangible - -/obj/item/ammo_casing/c9mm/rubber - name = "9mm rubber bullet casing" - desc = "A 9mm rubber bullet casing." - projectile_type = /obj/item/projectile/bullet/c9mm/rubber - -/obj/item/ammo_box/magazine/m9mm/p37 - name = "\improper P37 magazine (9mm frangible)" - desc = "A gun magazine. Loaded with plastic composite rounds which fragment upon impact to minimize collateral damage." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "11mm" //topkek - ammo_type = /obj/item/ammo_casing/c9mm/frangible - caliber = "9mm" - max_ammo = 11 - multiple_sprites = 1 - -/obj/item/ammo_box/magazine/m9mm/p37/fmj - name = "\improper P37 magazine (9mm)" - ammo_type = /obj/item/ammo_casing/c9mm - desc = "A gun magazine. Loaded with conventional full metal jacket rounds." - -/obj/item/ammo_box/magazine/m9mm/p37/rubber - name = "\improper P37 magazine (9mm Non-Lethal Rubbershot)" - ammo_type = /obj/item/ammo_casing/c9mm/rubber - desc = "A gun magazine. Loaded with less-than-lethal rubber bullets." - -/obj/item/ammo_box/c9mm/frangible - name = "ammo box (9mm frangible)" - ammo_type = /obj/item/ammo_casing/c9mm/frangible - -/obj/item/ammo_box/c9mm/rubber - name = "ammo box (9mm non-lethal rubbershot)" - ammo_type = /obj/item/ammo_casing/c9mm/rubber - -/datum/design/c9mmfrag - name = "Box of 9mm Frangible Bullets" - id = "9mm_frag" - build_type = AUTOLATHE - materials = list(MAT_METAL = 25000) - build_path = /obj/item/ammo_box/c9mm/frangible - category = list("hacked", "Security") - -/datum/design/c9mmrubber - name = "Box of 9mm Rubber Bullets" - id = "9mm_rubber" - build_type = AUTOLATHE - materials = list(MAT_METAL = 30000) - build_path = /obj/item/ammo_box/c9mm/rubber - category = list("initial", "Security") - - -///Security Variant/// - -/obj/item/gun/ballistic/automatic/pistol/p37/sec - name = "\improper CX Mk.37S" - desc = "A modern reimagining of an old legendary gun, the Mk.37 is a handgun with a toggle-locking mechanism manufactured by CX Armories. Uses 9mm bullets loaded into proprietary magazines." - spawnwithmagazine = FALSE - pin = /obj/item/device/firing_pin/implant/mindshield - actions_types = list() //so you can't recolor it - - frame_color = "#808080" //RGB - receiver_color = "#808080" - body_color = "#282828" - barrel_color = "#808080" - tip_color = "#808080" - arm_color = "#800000" - grip_color = "#FFFF00" //Does not actually colour the grip, just the lights surrounding it - energy_color = "#FFFF00" - -///Foam Variant because WE NEED MEMES/// - -/obj/item/gun/ballistic/automatic/pistol/p37/foam - name = "\improper Foam Force Mk.37F" - desc = "A licensed foam-firing reproduction of a handgun with a toggle-locking mechanism manufactured by CX Armories. This model is coated with a special polychromic material. Uses standard foam pistol magazines." - icon_state = "p37_foam" - pin = /obj/item/device/firing_pin - spawnwithmagazine = TRUE - obj_flags = 0 - casing_ejector = FALSE - mag_type = /obj/item/ammo_box/magazine/toy/pistol - can_suppress = FALSE - actions_types = list(/datum/action/item_action/pick_color) - -/*///////////////////////////////////////////////////////////////////////////////////////////// - The Recolourable Energy Gun -*////////////////////////////////////////////////////////////////////////////////////////////// - -obj/item/gun/energy/e_gun/cx - name = "\improper CX Model D Energy Gun" - desc = "An overpriced hybrid energy gun with two settings: disable, and kill. Manufactured by CX Armories. Has a polychromic coating." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "cxe" - lefthand_file = 'icons/mob/citadel/guns_lefthand.dmi' - righthand_file = 'icons/mob/citadel/guns_righthand.dmi' - ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser) - flight_x_offset = 15 - flight_y_offset = 10 - var/body_color = "#252528" - -obj/item/gun/energy/e_gun/cx/update_icon() - ..() - var/mutable_appearance/body_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "cxegun_body") - if(body_color) - body_overlay.color = body_color - add_overlay(body_overlay) - - if(ismob(loc)) - var/mob/M = loc - M.update_inv_hands() - -obj/item/gun/energy/e_gun/cx/AltClick(mob/living/user) - if(!in_range(src, user)) //Basic checks to prevent abuse - return - if(user.incapacitated() || !istype(user)) - to_chat(user, "You can't do that right now!") - return - if(alert("Are you sure you want to repaint your gun?", "Confirm Repaint", "Yes", "No") == "Yes") - var/body_color_input = input(usr,"","Choose Body Color",body_color) as color|null - if(body_color_input) - body_color = sanitize_hexcolor(body_color_input, desired_format=6, include_crunch=1) - update_icon() - -obj/item/gun/energy/e_gun/cx/worn_overlays(isinhands, icon_file) - . = ..() - if(isinhands) - var/mutable_appearance/body_inhand = mutable_appearance(icon_file, "cxe_body") - body_inhand.color = body_color - . += body_inhand - -/obj/item/ammo_box/magazine/toy/pistol //forcing this might be a bad idea, but it'll fix the foam gun infinite material exploit - materials = list(MAT_METAL = 200) - -/*///////////////////////////////////////////////////////////// -//////////////////////// Zero's Meme ////////////////////////// -*////////////////////////////////////////////////////////////// -/obj/item/ammo_box/magazine/toy/AM4B - name = "foam force AM4-B magazine" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "AM4MAG-60" - max_ammo = 60 - multiple_sprites = 0 - materials = list(MAT_METAL = 200) - -/obj/item/gun/ballistic/automatic/AM4B - name = "AM4-B" - desc = "A Relic from a bygone age. Nobody quite knows why it's here. Has a polychromic coating." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "AM4" - item_state = "arg" - mag_type = /obj/item/ammo_box/magazine/toy/AM4B - can_suppress = 0 - item_flags = NEEDS_PERMIT - casing_ejector = 0 - spread = 30 //Assault Rifleeeeeee - w_class = WEIGHT_CLASS_NORMAL - burst_size = 4 //Shh. - fire_delay = 1 - var/body_color = "#3333aa" - -/obj/item/gun/ballistic/automatic/AM4B/update_icon() - ..() - var/mutable_appearance/body_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "AM4-Body") - if(body_color) - body_overlay.color = body_color - cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other - add_overlay(body_overlay) - if(ismob(loc)) - var/mob/M = loc - M.update_inv_hands() -/obj/item/gun/ballistic/automatic/AM4B/AltClick(mob/living/user) - if(!in_range(src, user)) //Basic checks to prevent abuse - return - if(user.incapacitated() || !istype(user)) - to_chat(user, "You can't do that right now!") - return - if(alert("Are you sure you want to recolor your gun?", "Confirm Repaint", "Yes", "No") == "Yes") - var/body_color_input = input(usr,"","Choose Shroud Color",body_color) as color|null - if(body_color_input) - body_color = sanitize_hexcolor(body_color_input, desired_format=6, include_crunch=1) - update_icon() -/obj/item/gun/ballistic/automatic/AM4B/examine(mob/user) - ..() - to_chat(user, "Alt-click to recolor it.") - -/obj/item/ammo_box/magazine/toy/AM4C - name = "foam force AM4-C magazine" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "AM4MAG-32" - max_ammo = 32 - multiple_sprites = 0 - materials = list(MAT_METAL = 200) - -/obj/item/gun/ballistic/automatic/AM4C - name = "AM4-C" - desc = "A Relic from a bygone age. This one seems newer, yet less effective." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "AM4C" - item_state = "arg" - mag_type = /obj/item/ammo_box/magazine/toy/AM4C - can_suppress = 0 - item_flags = NEEDS_PERMIT - casing_ejector = 0 - spread = 45 //Assault Rifleeeeeee - w_class = WEIGHT_CLASS_NORMAL - burst_size = 4 //Shh. - fire_delay = 1 diff --git a/code/citadel/cit_uniforms.dm b/code/citadel/cit_uniforms.dm deleted file mode 100644 index fc7e03a676..0000000000 --- a/code/citadel/cit_uniforms.dm +++ /dev/null @@ -1,40 +0,0 @@ -/obj/item/clothing/under/bb_sweater - name = "cream sweater" - desc = "Why trade style for comfort? Now you can go commando down south and still be cozy up north." - icon_state = "bb_turtle" - item_state = "w_suit" - item_color = "bb_turtle" - body_parts_covered = CHEST|ARMS - can_adjust = 1 - icon = 'icons/obj/clothing/turtlenecks.dmi' - icon_override = 'icons/mob/citadel/uniforms.dmi' - -/obj/item/clothing/under/bb_sweater/black - name = "black sweater" - icon_state = "bb_turtleblk" - item_state = "bl_suit" - item_color = "bb_turtleblk" - -/obj/item/clothing/under/bb_sweater/purple - name = "purple sweater" - icon_state = "bb_turtlepur" - item_state = "p_suit" - item_color = "bb_turtlepur" - -/obj/item/clothing/under/bb_sweater/green - name = "green sweater" - icon_state = "bb_turtlegrn" - item_state = "g_suit" - item_color = "bb_turtlegrn" - -/obj/item/clothing/under/bb_sweater/red - name = "red sweater" - icon_state = "bb_turtlered" - item_state = "r_suit" - item_color = "bb_turtlered" - -/obj/item/clothing/under/bb_sweater/blue - name = "blue sweater" - icon_state = "bb_turtleblu" - item_state = "b_suit" - item_color = "bb_turtleblu" diff --git a/code/citadel/cit_vendors.dm b/code/citadel/cit_vendors.dm deleted file mode 100644 index c8ae48c251..0000000000 --- a/code/citadel/cit_vendors.dm +++ /dev/null @@ -1,102 +0,0 @@ -#define STANDARD_CHARGE 1 -#define CONTRABAND_CHARGE 2 -#define COIN_CHARGE 3 - -/obj/machinery/vending/kink - name = "KinkMate" - desc = "A vending machine for all your unmentionable desires." - icon = 'icons/obj/citvending.dmi' - icon_state = "kink" - product_slogans = "Kinky!;Sexy!;Check me out, big boy!" - vend_reply = "Have fun, you shameless pervert!" - products = list( - /obj/item/clothing/under/maid = 5, - /obj/item/clothing/under/stripper_pink = 5, - /obj/item/clothing/under/stripper_green = 5, - /obj/item/dildo/custom = 5 - ) - contraband = list(/obj/item/restraints/handcuffs/fake/kinky = 5, - /obj/item/clothing/neck/petcollar = 5, - /obj/item/clothing/under/mankini = 1, - /obj/item/dildo/flared/huge = 1 - ) - premium = list(/obj/item/device/electropack/shockcollar = 1) - refill_canister = /obj/item/vending_refill/kink -/* -/obj/machinery/vending/nazivend - name = "Nazivend" - desc = "A vending machine containing Nazi German supplies. A label reads: \"Remember the gorrilions lost.\"" - icon = 'icons/obj/citvending.dmi' - icon_state = "nazi" - vend_reply = "SIEG HEIL!" - product_slogans = "Das Vierte Reich wird zuruckkehren!;ENTFERNEN JUDEN!;Billiger als die Juden jemals geben!;Rader auf dem adminbus geht rund und rund.;Warten Sie, warum wir wieder hassen Juden?- *BZZT*" - products = list( - /obj/item/clothing/head/stalhelm = 20, - /obj/item/clothing/head/panzer = 20, - /obj/item/clothing/suit/soldiercoat = 20, - // /obj/item/clothing/under/soldieruniform = 20, - /obj/item/clothing/shoes/jackboots = 20 - ) - contraband = list( - /obj/item/clothing/head/naziofficer = 10, - // /obj/item/clothing/suit/officercoat = 10, - // /obj/item/clothing/under/officeruniform = 10, - /obj/item/clothing/suit/space/hardsuit/nazi = 3, - /obj/item/gun/energy/plasma/MP40k = 4 - ) - premium = list() - - refill_canister = /obj/item/vending_refill/nazi -*/ -/obj/machinery/vending/sovietvend - name = "KomradeVendtink" - desc = "Rodina-mat' zovyot!" - icon = 'icons/obj/citvending.dmi' - icon_state = "soviet" - vend_reply = "The fascist and capitalist svin'ya shall fall, komrade!" - product_slogans = "Quality worth waiting in line for!; Get Hammer and Sickled!; Sosvietsky soyuz above all!; With capitalist pigsky, you would have paid a fortunetink! ; Craftink in Motherland herself!" - products = list( - /obj/item/clothing/under/soviet = 20, - /obj/item/clothing/head/ushanka = 20, - /obj/item/clothing/shoes/jackboots = 20, - /obj/item/clothing/head/squatter_hat = 20, - /obj/item/clothing/under/squatter_outfit = 20, - /obj/item/clothing/under/russobluecamooutfit = 20, - /obj/item/clothing/head/russobluecamohat = 20 - ) - contraband = list( - /obj/item/clothing/under/syndicate/tacticool = 4, - /obj/item/clothing/mask/balaclava = 4, - /obj/item/clothing/suit/russofurcoat = 4, - /obj/item/clothing/head/russofurhat = 4, - /obj/item/clothing/suit/space/hardsuit/soviet = 3, - /obj/item/gun/energy/laser/LaserAK = 4 - ) - premium = list() - - refill_canister = /obj/item/vending_refill/soviet - - -#undef STANDARD_CHARGE -#undef CONTRABAND_CHARGE -#undef COIN_CHARGE - - -/obj/item/vending_refill/kink - machine_name = "KinkMate" - icon = 'modular_citadel/icons/vending_restock.dmi' - icon_state = "refill_kink" - charges = list(8, 5, 0)// of 20 standard, 12 contraband, 0 premium - init_charges = list(8, 5, 0) - -/obj/item/vending_refill/nazi - machine_name = "nazivend" - icon_state = "refill_nazi" - charges = list(33, 13, 0) - init_charges = list(33, 13, 0) - -/obj/item/vending_refill/soviet - machine_name = "sovietvend" - icon_state = "refill_soviet" - charges = list(47, 7, 0) - init_charges = list(47, 7, 0) diff --git a/code/citadel/discordbot.dm b/code/citadel/discordbot.dm deleted file mode 100644 index 41c0f21b49..0000000000 --- a/code/citadel/discordbot.dm +++ /dev/null @@ -1,13 +0,0 @@ -/proc/send2maindiscord(var/msg) - send2discord(msg, FALSE) - -/proc/send2admindiscord(var/msg, var/ping = FALSE) - send2discord(msg, TRUE, ping) - -/proc/send2discord(var/msg, var/admin = FALSE, var/ping = FALSE) -// if (!config.discord_url || !config.discord_password) -// return - -// var/url = "[config.discord_url]?pass=[url_encode(config.discord_password)]&admin=[admin ? "true" : "false"]&content=[url_encode(msg)]&ping=[ping ? "true" : "false"]" -// world.Export(url) - return \ No newline at end of file diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm deleted file mode 100644 index 1e4a574e13..0000000000 --- a/code/controllers/configuration.dm +++ /dev/null @@ -1,287 +0,0 @@ -GLOBAL_VAR_INIT(config_dir, "config/") -GLOBAL_PROTECT(config_dir) - -/datum/controller/configuration - name = "Configuration" - - var/hiding_entries_by_type = TRUE //Set for readability, admins can set this to FALSE if they want to debug it - var/list/entries - var/list/entries_by_type - - var/list/maplist - var/datum/map_config/defaultmap - - var/list/modes // allowed modes - var/list/gamemode_cache - var/list/votable_modes // votable modes - var/list/mode_names - var/list/mode_reports - var/list/mode_false_report_weight - -/datum/controller/configuration/New() - config = src - var/list/config_files = InitEntries() - LoadModes() - for(var/I in config_files) - LoadEntries(I) - if(Get(/datum/config_entry/flag/maprotation)) - loadmaplist(CONFIG_MAPS_FILE) - -/datum/controller/configuration/Destroy() - entries_by_type.Cut() - QDEL_LIST_ASSOC_VAL(entries) - QDEL_LIST_ASSOC_VAL(maplist) - QDEL_NULL(defaultmap) - - config = null - - return ..() - -/datum/controller/configuration/proc/InitEntries() - var/list/_entries = list() - entries = _entries - var/list/_entries_by_type = list() - entries_by_type = _entries_by_type - - . = list() - - for(var/I in typesof(/datum/config_entry)) //typesof is faster in this case - var/datum/config_entry/E = I - if(initial(E.abstract_type) == I) - continue - E = new I - _entries_by_type[I] = E - var/esname = E.name - var/datum/config_entry/test = _entries[esname] - if(test) - log_config("Error: [test.type] has the same name as [E.type]: [esname]! Not initializing [E.type]!") - qdel(E) - continue - _entries[esname] = E - .[E.resident_file] = TRUE - -/datum/controller/configuration/proc/RemoveEntry(datum/config_entry/CE) - entries -= CE.name - entries_by_type -= CE.type - -/datum/controller/configuration/proc/LoadEntries(filename) - log_config("Loading config file [filename]...") - var/list/lines = world.file2list("[GLOB.config_dir][filename]") - var/list/_entries = entries - for(var/L in lines) - if(!L) - continue - - if(copytext(L, 1, 2) == "#") - continue - - var/pos = findtext(L, " ") - var/entry = null - var/value = null - - if(pos) - entry = lowertext(copytext(L, 1, pos)) - value = copytext(L, pos + 1) - else - entry = lowertext(L) - - if(!entry) - continue - - var/datum/config_entry/E = _entries[entry] - if(!E) - log_config("Unknown setting in configuration: '[entry]'") - continue - - if(filename != E.resident_file) - log_config("Found [entry] in [filename] when it should have been in [E.resident_file]! Ignoring.") - continue - - var/validated = E.ValidateAndSet(value) - if(!validated) - log_config("Failed to validate setting \"[value]\" for [entry]") - else if(E.modified && !E.dupes_allowed) - log_config("Duplicate setting for [entry] ([value]) detected! Using latest.") - - if(validated) - E.modified = TRUE - -/datum/controller/configuration/can_vv_get(var_name) - return (var_name != "entries_by_type" || !hiding_entries_by_type) && ..() - -/datum/controller/configuration/vv_edit_var(var_name, var_value) - return !(var_name in list("entries_by_type", "entries")) && ..() - -/datum/controller/configuration/stat_entry() - if(!statclick) - statclick = new/obj/effect/statclick/debug(null, "Edit", src) - stat("[name]:", statclick) - -/datum/controller/configuration/proc/Get(entry_type) - if(IsAdminAdvancedProcCall() && GLOB.LastAdminCalledProc == "Get" && GLOB.LastAdminCalledTargetRef == "\ref[src]") - log_admin_private("Config access of [entry_type] attempted by [key_name(usr)]") - return - var/datum/config_entry/E = entry_type - var/entry_is_abstract = initial(E.abstract_type) == entry_type - if(entry_is_abstract) - CRASH("Tried to retrieve an abstract config_entry: [entry_type]") - E = entries_by_type[entry_type] - if(!E) - CRASH("Missing config entry for [entry_type]!") - return E.value - -/datum/controller/configuration/proc/Set(entry_type, new_val) - if(IsAdminAdvancedProcCall() && GLOB.LastAdminCalledProc == "Set" && GLOB.LastAdminCalledTargetRef == "\ref[src]") - log_admin_private("Config rewrite of [entry_type] to [new_val] attempted by [key_name(usr)]") - return - var/datum/config_entry/E = entry_type - var/entry_is_abstract = initial(E.abstract_type) == entry_type - if(entry_is_abstract) - CRASH("Tried to retrieve an abstract config_entry: [entry_type]") - E = entries_by_type[entry_type] - if(!E) - CRASH("Missing config entry for [entry_type]!") - return E.ValidateAndSet(new_val) - -/datum/controller/configuration/proc/LoadModes() - gamemode_cache = typecacheof(/datum/game_mode, TRUE) - modes = list() - mode_names = list() - mode_reports = list() - mode_false_report_weight = list() - votable_modes = list() - var/list/probabilities = Get(/datum/config_entry/keyed_number_list/probability) - for(var/T in gamemode_cache) - // I wish I didn't have to instance the game modes in order to look up - // their information, but it is the only way (at least that I know of). - var/datum/game_mode/M = new T() - - if(M.config_tag) - if(!(M.config_tag in modes)) // ensure each mode is added only once - modes += M.config_tag - mode_names[M.config_tag] = M.name - probabilities[M.config_tag] = M.probability - mode_reports[M.config_tag] = M.generate_report() - mode_false_report_weight[M.config_tag] = M.false_report_weight - if(M.votable) - votable_modes += M.config_tag - qdel(M) - votable_modes += "secret" - -/datum/controller/configuration/proc/loadmaplist(filename) - filename = "[GLOB.config_dir][filename]" - var/list/Lines = world.file2list(filename) - - var/datum/map_config/currentmap = null - for(var/t in Lines) - if(!t) - continue - - t = trim(t) - if(length(t) == 0) - continue - else if(copytext(t, 1, 2) == "#") - continue - - var/pos = findtext(t, " ") - var/command = null - var/data = null - - if(pos) - command = lowertext(copytext(t, 1, pos)) - data = copytext(t, pos + 1) - else - command = lowertext(t) - - if(!command) - continue - - if (!currentmap && command != "map") - continue - - switch (command) - if ("map") - currentmap = new ("_maps/[data].json") - if(currentmap.defaulted) - log_config("Failed to load map config for [data]!") - if ("minplayers","minplayer") - currentmap.config_min_users = text2num(data) - if ("maxplayers","maxplayer") - currentmap.config_max_users = text2num(data) - if ("weight","voteweight") - currentmap.voteweight = text2num(data) - if ("default","defaultmap") - defaultmap = currentmap - if ("endmap") - LAZYINITLIST(maplist) - maplist[currentmap.map_name] = currentmap - currentmap = null - if ("disabled") - currentmap = null - else - WRITE_FILE(GLOB.config_error_log, "Unknown command in map vote config: '[command]'") - - -/datum/controller/configuration/proc/pick_mode(mode_name) - // I wish I didn't have to instance the game modes in order to look up - // their information, but it is the only way (at least that I know of). - // ^ This guy didn't try hard enough - for(var/T in gamemode_cache) - var/datum/game_mode/M = T - var/ct = initial(M.config_tag) - if(ct && ct == mode_name) - return new T - return new /datum/game_mode/extended() - -/datum/controller/configuration/proc/get_runnable_modes() - var/list/datum/game_mode/runnable_modes = new - var/list/probabilities = Get(/datum/config_entry/keyed_number_list/probability) - var/list/min_pop = Get(/datum/config_entry/keyed_number_list/min_pop) - var/list/max_pop = Get(/datum/config_entry/keyed_number_list/max_pop) - var/list/repeated_mode_adjust = Get(/datum/config_entry/number_list/repeated_mode_adjust) - for(var/T in gamemode_cache) - var/datum/game_mode/M = new T() - if(!(M.config_tag in modes)) - qdel(M) - continue - if(probabilities[M.config_tag]<=0) - qdel(M) - continue - if(min_pop[M.config_tag]) - M.required_players = min_pop[M.config_tag] - if(max_pop[M.config_tag]) - M.maximum_players = max_pop[M.config_tag] - if(M.can_start()) - var/final_weight = probabilities[M.config_tag] - if(SSpersistence.saved_modes.len == 3 && repeated_mode_adjust.len == 3) - var/recent_round = min(SSpersistence.saved_modes.Find(M.config_tag),3) - var/adjustment = 0 - while(recent_round) - adjustment += repeated_mode_adjust[recent_round] - recent_round = SSpersistence.saved_modes.Find(M.config_tag,recent_round+1,0) - final_weight *= ((100-adjustment)/100) - runnable_modes[M] = final_weight - return runnable_modes - -/datum/controller/configuration/proc/get_runnable_midround_modes(crew) - var/list/datum/game_mode/runnable_modes = new - var/list/probabilities = Get(/datum/config_entry/keyed_number_list/probability) - var/list/min_pop = Get(/datum/config_entry/keyed_number_list/min_pop) - var/list/max_pop = Get(/datum/config_entry/keyed_number_list/max_pop) - for(var/T in (gamemode_cache - SSticker.mode.type)) - var/datum/game_mode/M = new T() - if(!(M.config_tag in modes)) - qdel(M) - continue - if(probabilities[M.config_tag]<=0) - qdel(M) - continue - if(min_pop[M.config_tag]) - M.required_players = min_pop[M.config_tag] - if(max_pop[M.config_tag]) - M.maximum_players = max_pop[M.config_tag] - if(M.required_players <= crew) - if(M.maximum_players >= 0 && M.maximum_players < crew) - continue - runnable_modes[M] = probabilities[M.config_tag] - return runnable_modes diff --git a/code/controllers/hooks-defs.dm b/code/controllers/hooks-defs.dm deleted file mode 100644 index 42212e266c..0000000000 --- a/code/controllers/hooks-defs.dm +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Startup hook. - * Called in world.dm when the server starts. - */ -/hook/startup - -/** - * Roundstart hook. - * Called in gameticker.dm when a round starts. - */ -/hook/roundstart - -/** - * Roundend hook. - * Called in gameticker.dm when a round ends. - */ -/hook/roundend - -/** - * Death hook. - * Called in death.dm when someone dies. - * Parameters: var/mob/living/carbon/human, var/gibbed - */ -/hook/death - -/** - * Cloning hook. - * Called in cloning.dm when someone is brought back by the wonders of modern science. - * Parameters: var/mob/living/carbon/human - */ -/hook/clone - -/** - * Debrained hook. - * Called in brain_item.dm when someone gets debrained. - * Parameters: var/obj/item/organ/brain - */ -/hook/debrain - -/** - * Borged hook. - * Called in robot_parts.dm when someone gets turned into a cyborg. - * Parameters: var/mob/living/silicon/robot - */ -/hook/borgify - -/** - * Podman hook. - * Called in podmen.dm when someone is brought back as a Diona. - * Parameters: var/mob/living/carbon/alien/diona - */ -/hook/harvest_podman - -/** - * Payroll revoked hook. - * Called in Accounts_DB.dm when someone's payroll is stolen at the Accounts terminal. - * Parameters: var/datum/money_account - */ -/hook/revoke_payroll - -/** - * Account suspension hook. - * Called in Accounts_DB.dm when someone's account is suspended or unsuspended at the Accounts terminal. - * Parameters: var/datum/money_account - */ -/hook/change_account_status - -/** - * Employee reassignment hook. - * Called in card.dm when someone's card is reassigned at the HoP's desk. - * Parameters: var/obj/item/card/id - */ -/hook/reassign_employee - -/** - * Employee terminated hook. - * Called in card.dm when someone's card is terminated at the HoP's desk. - * Parameters: var/obj/item/card/id - */ -/hook/terminate_employee - -/** - * Crate sold hook. - * Called in supplyshuttle.dm when a crate is sold on the shuttle. - * Parameters: var/obj/structure/closet/crate/sold, var/area/shuttle - */ -/hook/sell_crate diff --git a/code/controllers/subsystem/explosion.dm b/code/controllers/subsystem/explosion.dm deleted file mode 100644 index 1e3a6f8a6e..0000000000 --- a/code/controllers/subsystem/explosion.dm +++ /dev/null @@ -1,510 +0,0 @@ -SUBSYSTEM_DEF(explosion) - priority = 99 - wait = 1 - flags = SS_TICKER|SS_NO_INIT - - var/list/explosions - - var/rebuild_tick_split_count = FALSE - var/tick_portions_required = 0 - - var/list/logs - - var/list/zlevels_that_ignore_bombcap - var/list/doppler_arrays - - //legacy caps, set by config - var/devastation_cap = 3 - var/heavy_cap = 7 - var/light_cap = 14 - var/flash_cap = 14 - var/flame_cap = 14 - var/dyn_ex_scale = 0.5 - - var/id_counter = 0 - -/datum/controller/subsystem/explosion/PreInit() - doppler_arrays = list() - logs = list() - explosions = list() - zlevels_that_ignore_bombcap = list("[ZLEVEL_MINING]") - -/datum/controller/subsystem/explosion/Shutdown() - QDEL_LIST(explosions) - QDEL_LIST(logs) - zlevels_that_ignore_bombcap.Cut() - -/datum/controller/subsystem/explosion/Recover() - explosions = SSexplosion.explosions - logs = SSexplosion.logs - id_counter = SSexplosion.id_counter - rebuild_tick_split_count = TRUE - zlevels_that_ignore_bombcap = SSexplosion.zlevels_that_ignore_bombcap - doppler_arrays = SSexplosion.doppler_arrays - - devastation_cap = SSexplosion.devastation_cap - heavy_cap = SSexplosion.heavy_cap - light_cap = SSexplosion.light_cap - flash_cap = SSexplosion.flash_cap - flame_cap = SSexplosion.flame_cap - dyn_ex_scale = SSexplosion.dyn_ex_scale - -/datum/controller/subsystem/explosion/fire() - var/list/cached_explosions = explosions - var/num_explosions = cached_explosions.len - if(!num_explosions) - return - - //figure exactly how many tick splits are required - var/num_splits - if(rebuild_tick_split_count) - var/reactionary = config.reactionary_explosions - num_splits = num_explosions - for(var/I in cached_explosions) - var/datum/explosion/E = I - if(!E.turfs_processed) - ++num_splits - if(reactionary && !E.densities_processed) - ++num_splits - tick_portions_required = num_splits - else - num_splits = tick_portions_required - - MC_SPLIT_TICK_INIT(num_splits) - - for(var/I in cached_explosions) - var/datum/explosion/E = I - - var/etp = E.turfs_processed - if(!etp) - if(GatherTurfs(E)) - --tick_portions_required - etp = TRUE - MC_SPLIT_TICK - - var/edp = E.densities_processed - if(!edp) - if(DensityCalculate(E, etp)) - --tick_portions_required - edp = TRUE - MC_SPLIT_TICK - - if(ProcessExplosion(E, edp)) //splits the tick - --tick_portions_required - explosions -= E - logs += E - NotifyDopplers(E) - MC_SPLIT_TICK - -/datum/controller/subsystem/explosion/proc/NotifyDopplers(datum/explosion/E) - for(var/array in doppler_arrays) - var/obj/machinery/doppler_array/A = array - A.sense_explosion(E.epicenter, E.devastation, E.heavy, E.light, E.finished_at - E.started_at, E.orig_dev_range, E.orig_heavy_range, E.orig_light_range) - -/datum/controller/subsystem/explosion/proc/Create(atom/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = TRUE, ignorecap = FALSE, flame_range = 0 , silent = FALSE, smoke = FALSE) - epicenter = get_turf(epicenter) - if(!epicenter) - return - - if(adminlog) - message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area: [get_area(epicenter)] [ADMIN_COORDJMP(epicenter)]") - log_game("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z])") - - var/datum/explosion/E = new(++id_counter, epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, flame_range, silent, smoke, ignorecap) - - if(heavy_impact_range > 1) - var/datum/effect_system/explosion/Eff - if(smoke) - Eff = new /datum/effect_system/explosion/smoke - else - Eff = new - Eff.set_up(epicenter) - Eff.start() - - //flash mobs - if(flash_range) - for(var/mob/living/L in viewers(flash_range, epicenter)) - L.flash_act() - - if(!silent) - ExplosionSound(epicenter, devastation_range, heavy_impact_range, E.extent) - - //add to SS - if(E.extent) - tick_portions_required += 2 + (config.reactionary_explosions ? 1 : 0) - explosions += E - else - logs += E //Already done processing - -/datum/controller/subsystem/explosion/proc/CreateDynamic(atom/epicenter, power, flash_range, adminlog = TRUE, ignorecap = TRUE, flame_range = 0 , silent = FALSE, smoke = TRUE) - if(!power) - return - var/range = round((2 * power) ** dyn_ex_scale) - Create(epicenter, round(range * 0.25), round(range * 0.5), round(range), flash_range*range, adminlog, ignorecap, flame_range*range, silent, smoke) - -// Using default dyn_ex scale: -// 100 explosion power is a (5, 10, 20) explosion. -// 75 explosion power is a (4, 8, 17) explosion. -// 50 explosion power is a (3, 7, 14) explosion. -// 25 explosion power is a (2, 5, 10) explosion. -// 10 explosion power is a (1, 3, 6) explosion. -// 5 explosion power is a (0, 1, 3) explosion. -// 1 explosion power is a (0, 0, 1) explosion. - -/datum/explosion - var/explosion_id - var/turf/epicenter - - var/started_at - var/finished_at - var/tick_started - var/tick_finished - - var/turfs_processed = FALSE - var/densities_processed = FALSE - - var/orig_dev_range - var/orig_heavy_range - var/orig_light_range - var/orig_flash_range - var/orig_flame_range - - var/devastation - var/heavy - var/light - var/extent - - var/flash - var/flame - - var/gather_dist = 0 - - var/list/gathered_turfs - var/list/calculated_turfs - - var/list/unsafe_turfs - -/datum/explosion/New(id, turf/epi, devastation_range, heavy_impact_range, light_impact_range, flash_range, flame_range, silent, smoke, ignorecap) - explosion_id = id - epicenter = epi - - densities_processed = !config.reactionary_explosions - - orig_dev_range = devastation_range - orig_heavy_range = heavy_impact_range - orig_light_range = light_impact_range - orig_flash_range = flash_range - orig_flame_range = flame_range - - if(!ignorecap && !("[epicenter.z]" in SSexplosion.zlevels_that_ignore_bombcap)) - //Clamp all values - devastation_range = min(SSexplosion.devastation_cap, devastation_range) - heavy_impact_range = min(SSexplosion.heavy_cap, heavy_impact_range) - light_impact_range = min(SSexplosion.light_cap, light_impact_range) - flash_range = min(SSexplosion.flash_cap, flash_range) - flame_range = min(SSexplosion.flame_cap, flame_range) - - //store this - devastation = devastation_range - heavy = heavy_impact_range - light = light_impact_range - - extent = max(devastation_range, heavy_impact_range, light_impact_range, flame_range) - - flash = flash_range - flame = flame_range - - started_at = REALTIMEOFDAY - tick_started = world.time - - gathered_turfs = list() - calculated_turfs = list() - unsafe_turfs = list() - -// Play sounds; we want sounds to be different depending on distance so we will manually do it ourselves. -// Stereo users will also hear the direction of the explosion! - -// Calculate far explosion sound range. Only allow the sound effect for heavy/devastating explosions. -// 3/7/14 will calculate to 80 + 35 -/proc/ExplosionSound(turf/epicenter, devastation_range, heavy_impact_range, extent) - var/far_dist = 0 - far_dist += heavy_impact_range * 5 - far_dist += devastation_range * 20 - - var/z0 = epicenter.z - - var/frequency = get_rand_frequency() - var/ex_sound = get_sfx("explosion") - for(var/mob/M in GLOB.player_list) - // Double check for client - var/turf/M_turf = get_turf(M) - if(M_turf && M_turf.z == z0) - var/dist = get_dist(M_turf, epicenter) - // If inside the blast radius + world.view - 2 - if(dist <= round(extent + world.view - 2, 1)) - M.playsound_local(epicenter, ex_sound, 100, 1, frequency, falloff = 5) - // You hear a far explosion if you're outside the blast radius. Small bombs shouldn't be heard all over the station. - else if(dist <= far_dist) - var/far_volume = Clamp(far_dist, 30, 50) // Volume is based on explosion size and dist - far_volume += (dist <= far_dist * 0.5 ? 50 : 0) // add 50 volume if the mob is pretty close to the explosion - M.playsound_local(epicenter, 'sound/effects/explosionfar.ogg', far_volume, 1, frequency, falloff = 5) - -/datum/explosion/Destroy() - SSexplosion.explosions -= src - SSexplosion.logs -= src - LAZYCLEARLIST(gathered_turfs) - LAZYCLEARLIST(calculated_turfs) - LAZYCLEARLIST(unsafe_turfs) - return ..() - -/datum/controller/subsystem/explosion/proc/GatherTurfs(datum/explosion/E) - var/turf/epicenter = E.epicenter - - var/x0 = epicenter.x - var/y0 = epicenter.y - var/z0 = epicenter.z - - var/c_dist = E.gather_dist - var/dist = E.extent - - var/list/L = E.gathered_turfs - - if(!c_dist) - L += epicenter - ++c_dist - - while( c_dist <= dist ) - var/y = y0 + c_dist - var/x = x0 - c_dist + 1 - for(x in x to x0 + c_dist) - var/turf/T = locate(x, y, z0) - if(T) - L += T - - y = y0 + c_dist - 1 - x = x0 + c_dist - for(y in y0 - c_dist to y) - var/turf/T = locate(x, y, z0) - if(T) - L += T - - y = y0 - c_dist - x = x0 + c_dist - 1 - for(x in x0 - c_dist to x) - var/turf/T = locate(x, y, z0) - if(T) - L += T - - y = y0 - c_dist + 1 - x = x0 - c_dist - for(y in y to y0 + c_dist) - var/turf/T = locate(x, y, z0) - if(T) - L += T - ++c_dist - - if(MC_TICK_CHECK) - break - - if(c_dist > dist) - E.turfs_processed = TRUE - return TRUE - else - E.gather_dist = c_dist - return FALSE - -/datum/controller/subsystem/explosion/proc/DensityCalculate(datum/explosion/E, done_gathering_turfs) - var/list/L = E.calculated_turfs - var/cut_to = 1 - for(var/I in E.gathered_turfs) // we cache the explosion block rating of every turf in the explosion area - var/turf/T = I - ++cut_to - - var/current_exp_block = T.density ? T.explosion_block : 0 - - for(var/obj/machinery/door/D in T) - if(D.density) - current_exp_block += D.explosion_block - - for(var/obj/structure/window/W in T) - if(W.reinf && W.fulltile) - current_exp_block += W.explosion_block - - for(var/obj/structure/blob/B in T) - current_exp_block += B.explosion_block - - L[T] = current_exp_block - - if(MC_TICK_CHECK) - E.gathered_turfs.Cut(1, cut_to) - return FALSE - - E.gathered_turfs.Cut() - return done_gathering_turfs - -/datum/controller/subsystem/explosion/proc/ProcessExplosion(datum/explosion/E, done_calculating_turfs) - //cache shit for speed - var/id = E.explosion_id - - var/list/cached_unsafe = E.unsafe_turfs - var/list/cached_exp_block = E.calculated_turfs - var/list/affected_turfs = cached_exp_block ? cached_exp_block : E.gathered_turfs - - var/devastation_range = E.devastation - var/heavy_impact_range = E.heavy - var/light_impact_range = E.light - - var/flame_range = E.flame - var/throw_range_max = E.extent - - var/turf/epi = E.epicenter - - var/x0 = epi.x - var/y0 = epi.y - - var/cut_to = 1 - for(var/TI in affected_turfs) - var/turf/T = TI - ++cut_to - - var/init_dist = cheap_hypotenuse(T.x, T.y, x0, y0) - var/dist = init_dist - - if(cached_exp_block) - var/turf/Trajectory = T - while(Trajectory != epi) - Trajectory = get_step_towards(Trajectory, epi) - dist += cached_exp_block[Trajectory] - - var/flame_dist = dist < flame_range - var/throw_dist = dist - - if(dist < devastation_range) - dist = 1 - else if(dist < heavy_impact_range) - dist = 2 - else if(dist < light_impact_range) - dist = 3 - else - dist = 0 - - //------- EX_ACT AND TURF FIRES ------- - - if(flame_dist && prob(40) && !isspaceturf(T) && !T.density) - new /obj/effect/hotspot(T) //Mostly for ambience! - - if(dist > 0) - T.explosion_level = max(T.explosion_level, dist) //let the bigger one have it - T.explosion_id = id - T.ex_act(dist) - cached_unsafe += T - - //--- THROW ITEMS AROUND --- - - var/throw_dir = get_dir(epi, T) - for(var/obj/item/I in T) - if(!I.anchored) - var/throw_range = rand(throw_dist, throw_range_max) - var/turf/throw_at = get_ranged_target_turf(I, throw_dir, throw_range) - I.throw_speed = 4 //Temporarily change their throw_speed for embedding purposes (Resets when it finishes throwing, regardless of hitting anything) - I.throw_at(throw_at, throw_range, 4) - - if(MC_TICK_CHECK) - var/circumference = (PI * (init_dist + 4) * 2) //+4 to radius to prevent shit gaps - if(cached_unsafe.len > circumference) //only do this every revolution - for(var/Unexplode in cached_unsafe) - var/turf/UnexplodeT = Unexplode - UnexplodeT.explosion_level = 0 - cached_unsafe.Cut() - done_calculating_turfs = FALSE - break - - affected_turfs.Cut(1, cut_to) - - if(!done_calculating_turfs) - return FALSE - - //unfuck the shit - for(var/Unexplode in cached_unsafe) - var/turf/UnexplodeT = Unexplode - UnexplodeT.explosion_level = 0 - cached_unsafe.Cut() - - E.finished_at = REALTIMEOFDAY - E.tick_finished = world.time - - return TRUE - -/client/proc/check_bomb_impacts() - set name = "Check Bomb Impact" - set category = "Debug" - - var/newmode = alert("Use reactionary explosions?","Check Bomb Impact", "Yes", "No") - var/turf/epicenter = get_turf(mob) - if(!epicenter) - return - - var/x0 = epicenter.x - var/y0 = epicenter.y - - var/dev = 0 - var/heavy = 0 - var/light = 0 - var/list/choices = list("Small Bomb","Medium Bomb","Big Bomb","Custom Bomb") - var/choice = input("Bomb Size?") in choices - switch(choice) - if(null) - return 0 - if("Small Bomb") - dev = 1 - heavy = 2 - light = 3 - if("Medium Bomb") - dev = 2 - heavy = 3 - light = 4 - if("Big Bomb") - dev = 3 - heavy = 5 - light = 7 - if("Custom Bomb") - dev = input("Devestation range (Tiles):") as num - heavy = input("Heavy impact range (Tiles):") as num - light = input("Light impact range (Tiles):") as num - else - return - - var/datum/explosion/E = new(null, epicenter, dev, heavy, light, ignorecap = TRUE) - - while(!SSexplosion.GatherTurfs(E)) - stoplag() - var/list/turfs - if(newmode) - while(!SSexplosion.DensityCalculate(E, TRUE)) - stoplag() - turfs = E.calculated_turfs.Copy() - else - turfs = E.gathered_turfs.Copy() - - qdel(E) - - for(var/I in turfs) - var/turf/T = I - var/dist = cheap_hypotenuse(T.x, T.y, x0, y0) + turfs[T] - - if(dist < dev) - T.color = "red" - T.maptext = "Dev" - else if (dist < heavy) - T.color = "yellow" - T.maptext = "Heavy" - else if (dist < light) - T.color = "blue" - T.maptext = "Light" - CHECK_TICK - - sleep(100) - for(var/I in turfs) - var/turf/T = I - T.color = null - T.maptext = null diff --git a/code/controllers/subsystem/ping.dm b/code/controllers/subsystem/ping.dm deleted file mode 100644 index a6b444c4e7..0000000000 --- a/code/controllers/subsystem/ping.dm +++ /dev/null @@ -1,42 +0,0 @@ -#define PING_BUFFER_TIME 25 - -SUBSYSTEM_DEF(ping) - name = "Ping" - wait = 6 - flags = SS_POST_FIRE_TIMING|SS_FIRE_IN_LOBBY - priority = 10 - var/list/currentrun - -/datum/controller/subsystem/ping/Initialize() - if (config.hub) - world.visibility = 1 - ..() - -/datum/controller/subsystem/ping/fire(resumed = FALSE) - if (!resumed) - src.currentrun = GLOB.clients.Copy() - - var/round_started = Master.round_started - var/list/currentrun = src.currentrun - while (length(currentrun)) - var/client/C = currentrun[currentrun.len] - currentrun.len-- - if (!C || world.time - C.connection_time < PING_BUFFER_TIME || C.inactivity >= (wait-1)) - if (MC_TICK_CHECK) - return - continue - - if(round_started && C.is_afk(INACTIVITY_KICK)) - if(!istype(C.mob, /mob/dead)) - log_access("AFK: [key_name(C)]") - to_chat(C, "You have been inactive for more than 10 minutes and have been disconnected.") - qdel(C) - - winset(C, null, "command=.update_ping+[world.time+world.tick_lag*world.tick_usage/100]") - - if (MC_TICK_CHECK) //one day, when ss13 has 1000 people per server, you guys are gonna be glad I added this tick check - return - - currentrun = null - -#undef PING_BUFFER_TIME diff --git a/code/datums/antagonists/abductor.dm b/code/datums/antagonists/abductor.dm deleted file mode 100644 index fde8d0059b..0000000000 --- a/code/datums/antagonists/abductor.dm +++ /dev/null @@ -1,182 +0,0 @@ -#define ABDUCTOR_MAX_TEAMS 4 - -/datum/antagonist/abductor - name = "Abductor" - roundend_category = "abductors" - antagpanel_category = "Abductor" - job_rank = ROLE_ABDUCTOR - show_in_antagpanel = FALSE //should only show subtypes - var/datum/team/abductor_team/team - var/sub_role - var/outfit - var/landmark_type - var/greet_text - - -/datum/antagonist/abductor/agent - name = "Abductor Agent" - sub_role = "Agent" - outfit = /datum/outfit/abductor/agent - landmark_type = /obj/effect/landmark/abductor/agent - greet_text = "Use your stealth technology and equipment to incapacitate humans for your scientist to retrieve." - show_in_antagpanel = TRUE - -/datum/antagonist/abductor/scientist - name = "Abductor Scientist" - sub_role = "Scientist" - outfit = /datum/outfit/abductor/scientist - landmark_type = /obj/effect/landmark/abductor/scientist - greet_text = "Use your stealth technology and equipment to incapacitate humans for your scientist to retrieve." - show_in_antagpanel = TRUE - -/datum/antagonist/abductor/create_team(datum/team/abductor_team/new_team) - if(!new_team) - return - if(!istype(new_team)) - stack_trace("Wrong team type passed to [type] initialization.") - team = new_team - -/datum/antagonist/abductor/get_team() - return team - -/datum/antagonist/abductor/on_gain() - SSticker.mode.abductors += owner - owner.special_role = "[name] [sub_role]" - owner.assigned_role = "[name] [sub_role]" - owner.objectives += team.objectives - finalize_abductor() - return ..() - -/datum/antagonist/abductor/on_removal() - SSticker.mode.abductors -= owner - owner.objectives -= team.objectives - if(owner.current) - to_chat(owner.current,"You are no longer the [owner.special_role]!") - owner.special_role = null - return ..() - -/datum/antagonist/abductor/greet() - to_chat(owner.current, "You are the [owner.special_role]!") - to_chat(owner.current, "With the help of your teammate, kidnap and experiment on station crew members!") - to_chat(owner.current, "[greet_text]") - owner.announce_objectives() - -/datum/antagonist/abductor/proc/finalize_abductor() - //Equip - var/mob/living/carbon/human/H = owner.current - H.set_species(/datum/species/abductor) - H.real_name = "[team.name] [sub_role]" - H.equipOutfit(outfit) - - //Teleport to ship - for(var/obj/effect/landmark/abductor/LM in GLOB.landmarks_list) - if(istype(LM, landmark_type) && LM.team_number == team.team_number) - H.forceMove(LM.loc) - break - - SSticker.mode.update_abductor_icons_added(owner) - -/datum/antagonist/abductor/scientist/finalize_abductor() - ..() - var/mob/living/carbon/human/H = owner.current - var/datum/species/abductor/A = H.dna.species - A.scientist = TRUE - -/datum/antagonist/abductor/admin_add(datum/mind/new_owner,mob/admin) - var/list/current_teams = list() - for(var/datum/team/abductor_team/T in get_all_teams(/datum/team/abductor_team)) - current_teams[T.name] = T - var/choice = input(admin,"Add to which team ?") as null|anything in (current_teams + "new team") - if (choice == "new team") - team = new - else if(choice in current_teams) - team = current_teams[choice] - else - return - new_owner.add_antag_datum(src) - log_admin("[key_name(usr)] made [key_name(new_owner.current)] [name] on [choice]!") - message_admins("[key_name_admin(usr)] made [key_name_admin(new_owner.current)] [name] on [choice] !") - -/datum/antagonist/abductor/get_admin_commands() - . = ..() - .["Equip"] = CALLBACK(src,.proc/admin_equip) - -/datum/antagonist/abductor/proc/admin_equip(mob/admin) - if(!ishuman(owner.current)) - to_chat(admin, "This only works on humans!") - return - var/mob/living/carbon/human/H = owner.current - var/gear = alert(admin,"Agent or Scientist Gear","Gear","Agent","Scientist") - if(gear) - if(gear=="Agent") - H.equipOutfit(/datum/outfit/abductor/agent) - else - H.equipOutfit(/datum/outfit/abductor/scientist) - -/datum/team/abductor_team - member_name = "abductor" - var/team_number - var/list/datum/mind/abductees = list() - var/static/team_count = 1 - -/datum/team/abductor_team/New() - ..() - team_number = team_count++ - name = "Mothership [pick(GLOB.possible_changeling_IDs)]" //TODO Ensure unique and actual alieny names - add_objective(new/datum/objective/experiment) - -/datum/team/abductor_team/is_solo() - return FALSE - -/datum/team/abductor_team/proc/add_objective(datum/objective/O) - O.team = src - O.update_explanation_text() - objectives += O - -/datum/team/abductor_team/roundend_report() - var/list/result = list() - - var/won = TRUE - for(var/datum/objective/O in objectives) - if(!O.check_completion()) - won = FALSE - if(won) - result += "[name] team fulfilled its mission!" - else - result += "[name] team failed its mission." - - result += "The abductors of [name] were:" - for(var/datum/mind/abductor_mind in members) - result += printplayer(abductor_mind) - result += printobjectives(abductor_mind) - - return result.Join("
    ") - -/datum/antagonist/abductee - name = "Abductee" - roundend_category = "abductees" - antagpanel_category = "Abductee" - -/datum/antagonist/abductee/on_gain() - give_objective() - . = ..() - -/datum/antagonist/abductee/greet() - to_chat(owner, "Your mind snaps!") - to_chat(owner, "You can't remember how you got here...") - owner.announce_objectives() - -/datum/antagonist/abductee/proc/give_objective() - var/mob/living/carbon/human/H = owner.current - if(istype(H)) - H.gain_trauma_type(BRAIN_TRAUMA_MILD) - var/objtype = (prob(75) ? /datum/objective/abductee/random : pick(subtypesof(/datum/objective/abductee/) - /datum/objective/abductee/random)) - var/datum/objective/abductee/O = new objtype() - objectives += O - owner.objectives += objectives - -/datum/antagonist/abductee/apply_innate_effects(mob/living/mob_override) - SSticker.mode.update_abductor_icons_added(mob_override ? mob_override.mind : owner) - -/datum/antagonist/abductee/remove_innate_effects(mob/living/mob_override) - SSticker.mode.update_abductor_icons_removed(mob_override ? mob_override.mind : owner) \ No newline at end of file diff --git a/code/datums/antagonists/antag_datum.dm b/code/datums/antagonists/antag_datum.dm deleted file mode 100644 index 5f12d02398..0000000000 --- a/code/datums/antagonists/antag_datum.dm +++ /dev/null @@ -1,246 +0,0 @@ -GLOBAL_LIST_EMPTY(antagonists) - -/datum/antagonist - var/name = "Antagonist" - var/roundend_category = "other antagonists" //Section of roundend report, datums with same category will be displayed together, also default header for the section - var/show_in_roundend = TRUE //Set to false to hide the antagonists from roundend report - var/datum/mind/owner //Mind that owns this datum - var/silent = FALSE //Silent will prevent the gain/lose texts to show - var/can_coexist_with_others = TRUE //Whether or not the person will be able to have more than one datum - var/list/typecache_datum_blacklist = list() //List of datums this type can't coexist with - var/delete_on_mind_deletion = TRUE - var/job_rank - var/replace_banned = TRUE //Should replace jobbaned player with ghosts if granted. - var/list/objectives = list() - var/antag_memory = ""//These will be removed with antag datum - - //Antag panel properties - var/show_in_antagpanel = TRUE //This will hide adding this antag type in antag panel, use only for internal subtypes that shouldn't be added directly but still show if possessed by mind - var/antagpanel_category = "Uncategorized" //Antagpanel will display these together, REQUIRED - -/datum/antagonist/New() - GLOB.antagonists += src - typecache_datum_blacklist = typecacheof(typecache_datum_blacklist) - -/datum/antagonist/Destroy() - GLOB.antagonists -= src - if(owner) - LAZYREMOVE(owner.antag_datums, src) - owner = null - return ..() - -/datum/antagonist/proc/can_be_owned(datum/mind/new_owner) - . = TRUE - var/datum/mind/tested = new_owner || owner - if(tested.has_antag_datum(type)) - return FALSE - for(var/i in tested.antag_datums) - var/datum/antagonist/A = i - if(is_type_in_typecache(src, A.typecache_datum_blacklist)) - return FALSE - -//This will be called in add_antag_datum before owner assignment. -//Should return antag datum without owner. -/datum/antagonist/proc/specialization(datum/mind/new_owner) - return src - -/datum/antagonist/proc/on_body_transfer(mob/living/old_body, mob/living/new_body) - remove_innate_effects(old_body) - apply_innate_effects(new_body) - -//This handles the application of antag huds/special abilities -/datum/antagonist/proc/apply_innate_effects(mob/living/mob_override) - return - -//This handles the removal of antag huds/special abilities -/datum/antagonist/proc/remove_innate_effects(mob/living/mob_override) - return - -//Assign default team and creates one for one of a kind team antagonists -/datum/antagonist/proc/create_team(datum/team/team) - return - -//Proc called when the datum is given to a mind. -/datum/antagonist/proc/on_gain() - if(owner && owner.current) - if(!silent) - greet() - apply_innate_effects() - if(is_banned(owner.current) && replace_banned) - replace_banned_player() - -/datum/antagonist/proc/is_banned(mob/M) - if(!M) - return FALSE - . = (jobban_isbanned(M, ROLE_SYNDICATE) || (job_rank && jobban_isbanned(M,job_rank))) - -/datum/antagonist/proc/replace_banned_player() - set waitfor = FALSE - - var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as a [name]?", "[name]", null, job_rank, 50, owner.current) - if(LAZYLEN(candidates)) - var/client/C = pick(candidates) - to_chat(owner, "Your mob has been taken over by a ghost! Appeal your job ban if you want to avoid this in the future!") - message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(owner.current)]) to replace a jobbaned player.") - owner.current.ghostize(0) - owner.current.key = C.key - -/datum/antagonist/proc/on_removal() - remove_innate_effects() - if(owner) - LAZYREMOVE(owner.antag_datums, src) - if(!silent && owner.current) - farewell() - var/datum/team/team = get_team() - if(team) - team.remove_member(owner) - qdel(src) - -/datum/antagonist/proc/greet() - return - -/datum/antagonist/proc/farewell() - return - -//Returns the team antagonist belongs to if any. -/datum/antagonist/proc/get_team() - return - -//Individual roundend report -/datum/antagonist/proc/roundend_report() - var/list/report = list() - - if(!owner) - CRASH("antagonist datum without owner") - - report += printplayer(owner) - - var/objectives_complete = TRUE - if(owner.objectives.len) - report += printobjectives(owner) - for(var/datum/objective/objective in owner.objectives) - if(!objective.check_completion()) - objectives_complete = FALSE - break - - if(owner.objectives.len == 0 || objectives_complete) - report += "The [name] was successful!" - else - report += "The [name] has failed!" - - return report.Join("
    ") - -//Displayed at the start of roundend_category section, default to roundend_category header -/datum/antagonist/proc/roundend_report_header() - return "The [roundend_category] were:
    " - -//Displayed at the end of roundend_category section -/datum/antagonist/proc/roundend_report_footer() - return - - -//ADMIN TOOLS - -//Called when using admin tools to give antag status -/datum/antagonist/proc/admin_add(datum/mind/new_owner,mob/admin) - message_admins("[key_name_admin(admin)] made [new_owner.current] into [name].") - log_admin("[key_name(admin)] made [new_owner.current] into [name].") - new_owner.add_antag_datum(src) - -//Called when removing antagonist using admin tools -/datum/antagonist/proc/admin_remove(mob/user) - if(!user) - return - message_admins("[key_name_admin(user)] has removed [name] antagonist status from [owner.current].") - log_admin("[key_name(user)] has removed [name] antagonist status from [owner.current].") - on_removal() - -//gamemode/proc/is_mode_antag(antagonist/A) => TRUE/FALSE - -//Additional data to display in antagonist panel section -//nuke disk code, genome count, etc -/datum/antagonist/proc/antag_panel_data() - return "" - -/datum/antagonist/proc/enabled_in_preferences(datum/mind/M) - if(job_rank) - if(M.current && M.current.client && (job_rank in M.current.client.prefs.be_special)) - return TRUE - else - return FALSE - return TRUE - -// List if ["Command"] = CALLBACK(), user will be appeneded to callback arguments on execution -/datum/antagonist/proc/get_admin_commands() - . = list() - -/datum/antagonist/Topic(href,href_list) - if(!check_rights(R_ADMIN)) - return - //Antag memory edit - if (href_list["memory_edit"]) - edit_memory(usr) - owner.traitor_panel() - return - - //Some commands might delete/modify this datum clearing or changing owner - var/datum/mind/persistent_owner = owner - - var/commands = get_admin_commands() - for(var/admin_command in commands) - if(href_list["command"] == admin_command) - var/datum/callback/C = commands[admin_command] - C.Invoke(usr) - persistent_owner.traitor_panel() - return - -/datum/antagonist/proc/edit_memory(mob/user) - var/new_memo = copytext(trim(input(user,"Write new memory", "Memory", antag_memory) as null|message),1,MAX_MESSAGE_LEN) - if (isnull(new_memo)) - return - antag_memory = new_memo - -//Should probably be on ticker or job ss ? -/proc/get_antagonists(antag_type,specific = FALSE) - . = list() - for(var/datum/antagonist/A in GLOB.antagonists) - if(!A.owner) - continue - if(!antag_type || !specific && istype(A,antag_type) || specific && A.type == antag_type) - . += A.owner - -//This datum will autofill the name with special_role -//Used as placeholder for minor antagonists, please create proper datums for these -/datum/antagonist/auto_custom - show_in_antagpanel = FALSE - antagpanel_category = "Other" - -/datum/antagonist/auto_custom/on_gain() - ..() - name = owner.special_role - //Add all objectives not already owned by other datums to this one. - var/list/already_registered_objectives = list() - for(var/datum/antagonist/A in owner.antag_datums) - if(A == src) - continue - else - already_registered_objectives |= A.objectives - objectives = owner.objectives - already_registered_objectives - -/datum/antagonist/auto_custom/antag_listing_name() - return ..() + "([name])" - -//This one is created by admin tools for custom objectives -/datum/antagonist/custom - antagpanel_category = "Custom" - -/datum/antagonist/custom/admin_add(datum/mind/new_owner,mob/admin) - var/custom_name = stripped_input(admin, "Custom antagonist name:", "Custom antag", "Antagonist") - if(custom_name) - name = custom_name - else - return - ..() - -/datum/antagonist/custom/antag_listing_name() - return ..() + "([name])" \ No newline at end of file diff --git a/code/datums/antagonists/blob.dm b/code/datums/antagonists/blob.dm deleted file mode 100644 index 964bc99311..0000000000 --- a/code/datums/antagonists/blob.dm +++ /dev/null @@ -1,67 +0,0 @@ -/datum/antagonist/blob - name = "Blob" - roundend_category = "blobs" - antagpanel_category = "Blob" - job_rank = ROLE_BLOB - - var/datum/action/innate/blobpop/pop_action - var/starting_points_human_blob = 60 - var/point_rate_human_blob = 2 - -/datum/antagonist/blob/roundend_report() - var/basic_report = ..() - //Display max blobpoints for blebs that lost - if(isovermind(owner.current)) //embarrasing if not - var/mob/camera/blob/overmind = owner.current - if(!overmind.victory_in_progress) //if it won this doesn't really matter - var/point_report = "
    [owner.name] took over [overmind.max_count] tiles at the height of its growth." - return basic_report+point_report - return basic_report - -/datum/antagonist/blob/greet() - if(!isovermind(owner.current)) - to_chat(owner,"You feel bloated.") - -/datum/antagonist/blob/on_gain() - create_objectives() - . = ..() - -/datum/antagonist/blob/proc/create_objectives() - var/datum/objective/blob_takeover/main = new - main.owner = owner - objectives += main - owner.objectives |= objectives - -/datum/antagonist/blob/apply_innate_effects(mob/living/mob_override) - if(!isovermind(owner.current)) - if(!pop_action) - pop_action = new - pop_action.Grant(owner.current) - -/datum/objective/blob_takeover - explanation_text = "Reach critical mass!" - -//Non-overminds get this on blob antag assignment -/datum/action/innate/blobpop - name = "Pop" - desc = "Unleash the blob" - icon_icon = 'icons/mob/blob.dmi' - button_icon_state = "blob" - -/datum/action/innate/blobpop/Activate() - var/mob/old_body = owner - var/datum/antagonist/blob/blobtag = owner.mind.has_antag_datum(/datum/antagonist/blob) - if(!blobtag) - Remove() - return - var/mob/camera/blob/B = new /mob/camera/blob(get_turf(old_body), blobtag.starting_points_human_blob) - owner.mind.transfer_to(B) - old_body.gib() - B.place_blob_core(blobtag.point_rate_human_blob, pop_override = TRUE) - -/datum/antagonist/blob/antag_listing_status() - . = ..() - if(owner && owner.current) - var/mob/camera/blob/B = owner.current - if(istype(B)) - . += "(Progress: [B.blobs_legit.len]/[B.blobwincount])" \ No newline at end of file diff --git a/code/datums/antagonists/brother.dm b/code/datums/antagonists/brother.dm deleted file mode 100644 index d8371d3751..0000000000 --- a/code/datums/antagonists/brother.dm +++ /dev/null @@ -1,154 +0,0 @@ -/datum/antagonist/brother - name = "Brother" - antagpanel_category = "Brother" - job_rank = ROLE_BROTHER - var/special_role = ROLE_BROTHER - var/datum/team/brother_team/team - -/datum/antagonist/brother/create_team(datum/team/brother_team/new_team) - if(!new_team) - return - if(!istype(new_team)) - stack_trace("Wrong team type passed to [type] initialization.") - team = new_team - -/datum/antagonist/brother/get_team() - return team - -/datum/antagonist/brother/on_gain() - SSticker.mode.brothers += owner - objectives += team.objectives - owner.objectives += objectives - owner.special_role = special_role - finalize_brother() - return ..() - -/datum/antagonist/brother/on_removal() - SSticker.mode.brothers -= owner - owner.objectives -= objectives - if(owner.current) - to_chat(owner.current,"You are no longer the [special_role]!") - owner.special_role = null - return ..() - -/datum/antagonist/brother/proc/give_meeting_area() - if(!owner.current || !team || !team.meeting_area) - return - to_chat(owner.current, "Your designated meeting area: [team.meeting_area]") - antag_memory += "Meeting Area: [team.meeting_area]
    " - -/datum/antagonist/brother/greet() - var/brother_text = "" - var/list/brothers = team.members - owner - for(var/i = 1 to brothers.len) - var/datum/mind/M = brothers[i] - brother_text += M.name - if(i == brothers.len - 1) - brother_text += " and " - else if(i != brothers.len) - brother_text += ", " - to_chat(owner.current, "You are the [owner.special_role] of [brother_text].") - to_chat(owner.current, "The Syndicate only accepts those that have proven themself. Prove yourself and prove your [team.member_name]s by completing your objectives together!") - owner.announce_objectives() - give_meeting_area() - -/datum/antagonist/brother/proc/finalize_brother() - SSticker.mode.update_brother_icons_added(owner) - -/datum/antagonist/brother/admin_add(datum/mind/new_owner,mob/admin) - //show list of possible brothers - var/list/candidates = list() - for(var/mob/living/L in GLOB.alive_mob_list) - if(!L.mind || L.mind == new_owner || !can_be_owned(L.mind)) - continue - candidates[L.mind.name] = L.mind - - var/choice = input(admin,"Choose the blood brother.", "Brother") as null|anything in candidates - if(!choice) - return - var/datum/mind/bro = candidates[choice] - var/datum/team/brother_team/T = new - T.add_member(new_owner) - T.add_member(bro) - T.pick_meeting_area() - T.forge_brother_objectives() - new_owner.add_antag_datum(/datum/antagonist/brother,T) - bro.add_antag_datum(/datum/antagonist/brother, T) - T.update_name() - message_admins("[key_name_admin(admin)] made [new_owner.current] and [bro.current] into blood brothers.") - log_admin("[key_name(admin)] made [new_owner.current] and [bro.current] into blood brothers.") - -/datum/team/brother_team - name = "brotherhood" - member_name = "blood brother" - var/meeting_area - var/static/meeting_areas = list("The Bar", "Dorms", "Escape Dock", "Arrivals", "Holodeck", "Primary Tool Storage", "Recreation Area", "Chapel", "Library") - -/datum/team/brother_team/is_solo() - return FALSE - -/datum/team/brother_team/proc/pick_meeting_area() - meeting_area = pick(meeting_areas) - meeting_areas -= meeting_area - -/datum/team/brother_team/proc/update_name() - var/list/last_names = list() - for(var/datum/mind/M in members) - var/list/split_name = splittext(M.name," ") - last_names += split_name[split_name.len] - - name = last_names.Join(" & ") - -/datum/team/brother_team/roundend_report() - var/list/parts = list() - - parts += "The blood brothers of [name] were:" - for(var/datum/mind/M in members) - parts += printplayer(M) - var/win = TRUE - var/objective_count = 1 - for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - parts += "Objective #[objective_count]: [objective.explanation_text] Success!" - else - parts += "Objective #[objective_count]: [objective.explanation_text] Fail." - win = FALSE - objective_count++ - if(win) - parts += "The blood brothers were successful!" - else - parts += "The blood brothers have failed!" - - return "
    [parts.Join("
    ")]
    " - -/datum/team/brother_team/proc/add_objective(datum/objective/O, needs_target = FALSE) - O.team = src - if(needs_target) - O.find_target() - O.update_explanation_text() - objectives += O - -/datum/team/brother_team/proc/forge_brother_objectives() - objectives = list() - var/is_hijacker = prob(10) - for(var/i = 1 to max(1, CONFIG_GET(number/brother_objectives_amount) + (members.len > 2) - is_hijacker)) - forge_single_objective() - if(is_hijacker) - if(!locate(/datum/objective/hijack) in objectives) - add_objective(new/datum/objective/hijack) - else if(!locate(/datum/objective/escape) in objectives) - add_objective(new/datum/objective/escape) - -/datum/team/brother_team/proc/forge_single_objective() - if(prob(50)) - if(LAZYLEN(active_ais()) && prob(100/GLOB.joined_player_list.len)) - add_objective(new/datum/objective/destroy, TRUE) - else if(prob(30)) - add_objective(new/datum/objective/maroon, TRUE) - else - add_objective(new/datum/objective/assassinate, TRUE) - else - add_objective(new/datum/objective/steal, TRUE) - -/datum/team/brother_team/antag_listing_name() - return "[name] blood brothers" \ No newline at end of file diff --git a/code/datums/antagonists/changeling.dm b/code/datums/antagonists/changeling.dm deleted file mode 100644 index 2bc4900ac5..0000000000 --- a/code/datums/antagonists/changeling.dm +++ /dev/null @@ -1,545 +0,0 @@ -#define LING_FAKEDEATH_TIME 400 //40 seconds -#define LING_DEAD_GENETICDAMAGE_HEAL_CAP 50 //The lowest value of geneticdamage handle_changeling() can take it to while dead. -#define LING_ABSORB_RECENT_SPEECH 8 //The amount of recent spoken lines to gain on absorbing a mob - -/datum/antagonist/changeling - name = "Changeling" - roundend_category = "changelings" - antagpanel_category = "Changeling" - job_rank = ROLE_CHANGELING - - var/you_are_greet = TRUE - var/give_objectives = TRUE - var/team_mode = FALSE //Should assign team objectives ? - - //Changeling Stuff - - var/list/stored_profiles = list() //list of datum/changelingprofile - var/datum/changelingprofile/first_prof = null - var/dna_max = 6 //How many extra DNA strands the changeling can store for transformation. - var/absorbedcount = 0 - var/chem_charges = 20 - var/chem_storage = 75 - var/chem_recharge_rate = 1 - var/chem_recharge_slowdown = 0 - var/sting_range = 2 - var/changelingID = "Changeling" - var/geneticdamage = 0 - var/isabsorbing = 0 - var/islinking = 0 - var/geneticpoints = 10 - var/purchasedpowers = list() - var/mimicing = "" - var/canrespec = 0 - var/changeling_speak = 0 - var/datum/dna/chosen_dna - var/obj/effect/proc_holder/changeling/sting/chosen_sting - var/datum/cellular_emporium/cellular_emporium - var/datum/action/innate/cellular_emporium/emporium_action - - // wip stuff - var/static/list/all_powers = typecacheof(/obj/effect/proc_holder/changeling,TRUE) - - -/datum/antagonist/changeling/Destroy() - QDEL_NULL(cellular_emporium) - QDEL_NULL(emporium_action) - . = ..() - -/datum/antagonist/changeling/proc/generate_name() - var/honorific - if(owner.current.gender == FEMALE) - honorific = "Ms." - else - honorific = "Mr." - if(GLOB.possible_changeling_IDs.len) - changelingID = pick(GLOB.possible_changeling_IDs) - GLOB.possible_changeling_IDs -= changelingID - changelingID = "[honorific] [changelingID]" - else - changelingID = "[honorific] [rand(1,999)]" - -/datum/antagonist/changeling/proc/create_actions() - cellular_emporium = new(src) - emporium_action = new(cellular_emporium) - -/datum/antagonist/changeling/on_gain() - generate_name() - create_actions() - reset_powers() - create_initial_profile() - if(give_objectives) - if(team_mode) - forge_team_objectives() - forge_objectives() - remove_clownmut() - . = ..() - -/datum/antagonist/changeling/on_removal() - //We'll be using this from now on - var/mob/living/carbon/C = owner.current - if(istype(C)) - var/obj/item/organ/brain/B = C.getorganslot(ORGAN_SLOT_BRAIN) - if(B && (B.decoy_override != initial(B.decoy_override))) - B.vital = TRUE - B.decoy_override = FALSE - remove_changeling_powers() - owner.objectives -= objectives - . = ..() - -/datum/antagonist/changeling/proc/remove_clownmut() - if (owner) - var/mob/living/carbon/human/H = owner.current - if(istype(H) && owner.assigned_role == "Clown") - to_chat(H, "You have evolved beyond your clownish nature, allowing you to wield weapons without harming yourself.") - H.dna.remove_mutation(CLOWNMUT) - -/datum/antagonist/changeling/proc/reset_properties() - changeling_speak = 0 - chosen_sting = null - geneticpoints = initial(geneticpoints) - sting_range = initial(sting_range) - chem_storage = initial(chem_storage) - chem_recharge_rate = initial(chem_recharge_rate) - chem_charges = min(chem_charges, chem_storage) - chem_recharge_slowdown = initial(chem_recharge_slowdown) - mimicing = "" - -/datum/antagonist/changeling/proc/remove_changeling_powers() - if(ishuman(owner.current) || ismonkey(owner.current)) - reset_properties() - for(var/obj/effect/proc_holder/changeling/p in purchasedpowers) - if(p.always_keep) - continue - purchasedpowers -= p - p.on_refund(owner.current) - - //MOVE THIS - if(owner.current.hud_used) - owner.current.hud_used.lingstingdisplay.icon_state = null - owner.current.hud_used.lingstingdisplay.invisibility = INVISIBILITY_ABSTRACT - -/datum/antagonist/changeling/proc/reset_powers() - if(purchasedpowers) - remove_changeling_powers() - //Repurchase free powers. - for(var/path in all_powers) - var/obj/effect/proc_holder/changeling/S = new path() - if(!S.dna_cost) - if(!has_sting(S)) - purchasedpowers += S - S.on_purchase(owner.current,TRUE) - -/datum/antagonist/changeling/proc/has_sting(obj/effect/proc_holder/changeling/power) - for(var/obj/effect/proc_holder/changeling/P in purchasedpowers) - if(initial(power.name) == P.name) - return TRUE - return FALSE - - -/datum/antagonist/changeling/proc/purchase_power(sting_name) - var/obj/effect/proc_holder/changeling/thepower = null - - for(var/path in all_powers) - var/obj/effect/proc_holder/changeling/S = path - if(initial(S.name) == sting_name) - thepower = new path() - break - - if(!thepower) - to_chat(owner.current, "This is awkward. Changeling power purchase failed, please report this bug to a coder!") - return - - if(absorbedcount < thepower.req_dna) - to_chat(owner.current, "We lack the energy to evolve this ability!") - return - - if(has_sting(thepower)) - to_chat(owner.current, "We have already evolved this ability!") - return - - if(thepower.dna_cost < 0) - to_chat(owner.current, "We cannot evolve this ability.") - return - - if(geneticpoints < thepower.dna_cost) - to_chat(owner.current, "We have reached our capacity for abilities.") - return - - if(owner.current.status_flags & FAKEDEATH)//To avoid potential exploits by buying new powers while in stasis, which clears your verblist. - to_chat(owner.current, "We lack the energy to evolve new abilities right now.") - return - - geneticpoints -= thepower.dna_cost - purchasedpowers += thepower - thepower.on_purchase(owner.current) - -/datum/antagonist/changeling/proc/readapt() - if(!ishuman(owner.current)) - to_chat(owner.current, "We can't remove our evolutions in this form!") - return - if(canrespec) - to_chat(owner.current, "We have removed our evolutions from this form, and are now ready to readapt.") - reset_powers() - canrespec = 0 - SSblackbox.record_feedback("tally", "changeling_power_purchase", 1, "Readapt") - return 1 - else - to_chat(owner.current, "You lack the power to readapt your evolutions!") - return 0 - -//Called in life() -/datum/antagonist/changeling/proc/regenerate() - var/mob/living/carbon/the_ling = owner.current - if(istype(the_ling)) - emporium_action.Grant(the_ling) - if(the_ling.stat == DEAD) - chem_charges = min(max(0, chem_charges + chem_recharge_rate - chem_recharge_slowdown), (chem_storage*0.5)) - geneticdamage = max(LING_DEAD_GENETICDAMAGE_HEAL_CAP,geneticdamage-1) - else //not dead? no chem/geneticdamage caps. - chem_charges = min(max(0, chem_charges + chem_recharge_rate - chem_recharge_slowdown), chem_storage) - geneticdamage = max(0, geneticdamage-1) - - -/datum/antagonist/changeling/proc/get_dna(dna_owner) - for(var/datum/changelingprofile/prof in stored_profiles) - if(dna_owner == prof.name) - return prof - -/datum/antagonist/changeling/proc/has_dna(datum/dna/tDNA) - for(var/datum/changelingprofile/prof in stored_profiles) - if(tDNA.is_same_as(prof.dna)) - return TRUE - return FALSE - -/datum/antagonist/changeling/proc/can_absorb_dna(mob/living/carbon/human/target, var/verbose=1) - var/mob/living/carbon/user = owner.current - if(!istype(user)) - return - if(stored_profiles.len) - var/datum/changelingprofile/prof = stored_profiles[1] - if(prof.dna == user.dna && stored_profiles.len >= dna_max)//If our current DNA is the stalest, we gotta ditch it. - if(verbose) - to_chat(user, "We have reached our capacity to store genetic information! We must transform before absorbing more.") - return - if(!target) - return - if(NO_DNA_COPY in target.dna.species.species_traits) - if(verbose) - to_chat(user, "[target] is not compatible with our biology.") - return - if((target.has_disability(DISABILITY_NOCLONE)) || (target.has_disability(DISABILITY_NOCLONE))) - if(verbose) - to_chat(user, "DNA of [target] is ruined beyond usability!") - return - if(!ishuman(target))//Absorbing monkeys is entirely possible, but it can cause issues with transforming. That's what lesser form is for anyway! - if(verbose) - to_chat(user, "We could gain no benefit from absorbing a lesser creature.") - return - if(has_dna(target.dna)) - if(verbose) - to_chat(user, "We already have this DNA in storage!") - return - if(!target.has_dna()) - if(verbose) - to_chat(user, "[target] is not compatible with our biology.") - return - return 1 - - -/datum/antagonist/changeling/proc/create_profile(mob/living/carbon/human/H, protect = 0) - var/datum/changelingprofile/prof = new - - H.dna.real_name = H.real_name //Set this again, just to be sure that it's properly set. - var/datum/dna/new_dna = new H.dna.type - H.dna.copy_dna(new_dna) - prof.dna = new_dna - prof.name = H.real_name - prof.protected = protect - - prof.underwear = H.underwear - prof.undershirt = H.undershirt - prof.socks = H.socks - - var/list/slots = list("head", "wear_mask", "back", "wear_suit", "w_uniform", "shoes", "belt", "gloves", "glasses", "ears", "wear_id", "s_store") - for(var/slot in slots) - if(slot in H.vars) - var/obj/item/I = H.vars[slot] - if(!I) - continue - prof.name_list[slot] = I.name - prof.appearance_list[slot] = I.appearance - prof.flags_cover_list[slot] = I.flags_cover - prof.item_color_list[slot] = I.item_color - prof.item_state_list[slot] = I.item_state - prof.exists_list[slot] = 1 - else - continue - - return prof - -/datum/antagonist/changeling/proc/add_profile(datum/changelingprofile/prof) - if(stored_profiles.len > dna_max) - if(!push_out_profile()) - return - - if(!first_prof) - first_prof = prof - - stored_profiles += prof - absorbedcount++ - -/datum/antagonist/changeling/proc/add_new_profile(mob/living/carbon/human/H, protect = 0) - var/datum/changelingprofile/prof = create_profile(H, protect) - add_profile(prof) - return prof - -/datum/antagonist/changeling/proc/remove_profile(mob/living/carbon/human/H, force = 0) - for(var/datum/changelingprofile/prof in stored_profiles) - if(H.real_name == prof.name) - if(prof.protected && !force) - continue - stored_profiles -= prof - qdel(prof) - -/datum/antagonist/changeling/proc/get_profile_to_remove() - for(var/datum/changelingprofile/prof in stored_profiles) - if(!prof.protected) - return prof - -/datum/antagonist/changeling/proc/push_out_profile() - var/datum/changelingprofile/removeprofile = get_profile_to_remove() - if(removeprofile) - stored_profiles -= removeprofile - return 1 - return 0 - - -/datum/antagonist/changeling/proc/create_initial_profile() - var/mob/living/carbon/C = owner.current //only carbons have dna now, so we have to typecaste - if(ishuman(C)) - add_new_profile(C) - -/datum/antagonist/changeling/apply_innate_effects() - //Brains optional. - var/mob/living/carbon/C = owner.current - if(istype(C)) - var/obj/item/organ/brain/B = C.getorganslot(ORGAN_SLOT_BRAIN) - if(B) - B.vital = FALSE - B.decoy_override = TRUE - update_changeling_icons_added() - return - -/datum/antagonist/changeling/remove_innate_effects() - update_changeling_icons_removed() - return - - -/datum/antagonist/changeling/greet() - if (you_are_greet) - to_chat(owner.current, "You are [changelingID], a changeling! You have absorbed and taken the form of a human.") - to_chat(owner.current, "Use say \":g message\" to communicate with your fellow changelings.") - to_chat(owner.current, "You must complete the following tasks:") - owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ling_aler.ogg', 100, FALSE, pressure_affected = FALSE) - - owner.announce_objectives() - -/datum/antagonist/changeling/farewell() - to_chat(owner.current, "You grow weak and lose your powers! You are no longer a changeling and are stuck in your current form!") - -/datum/antagonist/changeling/proc/forge_team_objectives() - if(GLOB.changeling_team_objective_type) - var/datum/objective/changeling_team_objective/team_objective = new GLOB.changeling_team_objective_type - team_objective.owner = owner - objectives += team_objective - return - -/datum/antagonist/changeling/proc/forge_objectives() - //OBJECTIVES - random traitor objectives. Unique objectives "steal brain" and "identity theft". - //No escape alone because changelings aren't suited for it and it'd probably just lead to rampant robusting - //If it seems like they'd be able to do it in play, add a 10% chance to have to escape alone - - var/escape_objective_possible = TRUE - - //if there's a team objective, check if it's compatible with escape objectives - for(var/datum/objective/changeling_team_objective/CTO in objectives) - if(!CTO.escape_objective_compatible) - escape_objective_possible = FALSE - break - - var/datum/objective/absorb/absorb_objective = new - absorb_objective.owner = owner - absorb_objective.gen_amount_goal(6, 8) - objectives += absorb_objective - - if(prob(60)) - if(prob(85)) - var/datum/objective/steal/steal_objective = new - steal_objective.owner = owner - steal_objective.find_target() - objectives += steal_objective - else - var/datum/objective/download/download_objective = new - download_objective.owner = owner - download_objective.gen_amount_goal() - objectives += download_objective - - var/list/active_ais = active_ais() - if(active_ais.len && prob(100/GLOB.joined_player_list.len)) - var/datum/objective/destroy/destroy_objective = new - destroy_objective.owner = owner - destroy_objective.find_target() - objectives += destroy_objective - else - if(prob(70)) - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = owner - if(team_mode) //No backstabbing while in a team - kill_objective.find_target_by_role(role = ROLE_CHANGELING, role_type = 1, invert = 1) - else - kill_objective.find_target() - objectives += kill_objective - else - var/datum/objective/maroon/maroon_objective = new - maroon_objective.owner = owner - if(team_mode) - maroon_objective.find_target_by_role(role = ROLE_CHANGELING, role_type = 1, invert = 1) - else - maroon_objective.find_target() - objectives += maroon_objective - - if (!(locate(/datum/objective/escape) in objectives) && escape_objective_possible) - var/datum/objective/escape/escape_with_identity/identity_theft = new - identity_theft.owner = owner - identity_theft.target = maroon_objective.target - identity_theft.update_explanation_text() - objectives += identity_theft - escape_objective_possible = FALSE - - if (!(locate(/datum/objective/escape) in objectives) && escape_objective_possible) - if(prob(50)) - var/datum/objective/escape/escape_objective = new - escape_objective.owner = owner - objectives += escape_objective - else - var/datum/objective/escape/escape_with_identity/identity_theft = new - identity_theft.owner = owner - if(team_mode) - identity_theft.find_target_by_role(role = ROLE_CHANGELING, role_type = 1, invert = 1) - else - identity_theft.find_target() - objectives += identity_theft - escape_objective_possible = FALSE - - owner.objectives |= objectives - -/datum/antagonist/changeling/proc/update_changeling_icons_added() - var/datum/atom_hud/antag/hud = GLOB.huds[ANTAG_HUD_CHANGELING] - hud.join_hud(owner.current) - set_antag_hud(owner.current, "changling") - -/datum/antagonist/changeling/proc/update_changeling_icons_removed() - var/datum/atom_hud/antag/hud = GLOB.huds[ANTAG_HUD_CHANGELING] - hud.leave_hud(owner.current) - set_antag_hud(owner.current, null) - -/datum/antagonist/changeling/admin_add(datum/mind/new_owner,mob/admin) - . = ..() - to_chat(new_owner.current, "Our powers have awoken. A flash of memory returns to us...we are [changelingID], a changeling!") - -/datum/antagonist/changeling/get_admin_commands() - . = ..() - if(stored_profiles.len && (owner.current.real_name != first_prof.name)) - .["Transform to initial appearance."] = CALLBACK(src,.proc/admin_restore_appearance) - -/datum/antagonist/changeling/proc/admin_restore_appearance(mob/admin) - if(!stored_profiles.len || !iscarbon(owner.current)) - to_chat(admin, "Resetting DNA failed!") - else - var/mob/living/carbon/C = owner.current - first_prof.dna.transfer_identity(C, transfer_SE=1) - C.real_name = first_prof.name - C.updateappearance(mutcolor_update=1) - C.domutcheck() - -// Profile - -/datum/changelingprofile - var/name = "a bug" - - var/protected = 0 - - var/datum/dna/dna = null - var/list/name_list = list() //associative list of slotname = itemname - var/list/appearance_list = list() - var/list/flags_cover_list = list() - var/list/exists_list = list() - var/list/item_color_list = list() - var/list/item_state_list = list() - - var/underwear - var/undershirt - var/socks - -/datum/changelingprofile/Destroy() - qdel(dna) - . = ..() - -/datum/changelingprofile/proc/copy_profile(datum/changelingprofile/newprofile) - newprofile.name = name - newprofile.protected = protected - newprofile.dna = new dna.type - dna.copy_dna(newprofile.dna) - newprofile.name_list = name_list.Copy() - newprofile.appearance_list = appearance_list.Copy() - newprofile.flags_cover_list = flags_cover_list.Copy() - newprofile.exists_list = exists_list.Copy() - newprofile.item_color_list = item_color_list.Copy() - newprofile.item_state_list = item_state_list.Copy() - newprofile.underwear = underwear - newprofile.undershirt = undershirt - newprofile.socks = socks - - -/datum/antagonist/changeling/xenobio - name = "Xenobio Changeling" - give_objectives = FALSE - show_in_roundend = FALSE //These are here for admin tracking purposes only - you_are_greet = FALSE - -/datum/antagonist/changeling/roundend_report() - var/list/parts = list() - - var/changelingwin = 1 - if(!owner.current) - changelingwin = 0 - - parts += printplayer(owner) - - //Removed sanity if(changeling) because we -want- a runtime to inform us that the changelings list is incorrect and needs to be fixed. - parts += "Changeling ID: [changelingID]." - parts += "Genomes Extracted: [absorbedcount]" - parts += " " - if(objectives.len) - var/count = 1 - for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - parts += "Objective #[count]: [objective.explanation_text] Success!
    " - else - parts += "Objective #[count]: [objective.explanation_text] Fail." - changelingwin = 0 - count++ - - if(changelingwin) - parts += "The changeling was successful!" - else - parts += "The changeling has failed." - - return parts.Join("
    ") - -/datum/antagonist/changeling/antag_listing_name() - return ..() + "([changelingID])" - -/datum/antagonist/changeling/xenobio/antag_listing_name() - return ..() + "(Xenobio)" \ No newline at end of file diff --git a/code/datums/antagonists/clockcult.dm b/code/datums/antagonists/clockcult.dm deleted file mode 100644 index 067801677b..0000000000 --- a/code/datums/antagonists/clockcult.dm +++ /dev/null @@ -1,219 +0,0 @@ -//CLOCKCULT PROOF OF CONCEPT -/datum/antagonist/clockcult - name = "Clock Cultist" - roundend_category = "clock cultists" - antagpanel_category = "Clockcult" - job_rank = ROLE_SERVANT_OF_RATVAR - var/datum/action/innate/hierophant/hierophant_network = new() - var/datum/team/clockcult/clock_team - var/make_team = TRUE //This should be only false for tutorial scarabs - -/datum/antagonist/clockcult/silent - silent = TRUE - show_in_antagpanel = FALSE //internal - -/datum/antagonist/clockcult/Destroy() - qdel(hierophant_network) - return ..() - -/datum/antagonist/clockcult/get_team() - return clock_team - -/datum/antagonist/clockcult/create_team(datum/team/clockcult/new_team) - if(!new_team && make_team) - //TODO blah blah same as the others, allow multiple - for(var/datum/antagonist/clockcult/H in GLOB.antagonists) - if(!H.owner) - continue - if(H.clock_team) - clock_team = H.clock_team - return - clock_team = new /datum/team/clockcult - return - if(make_team && !istype(new_team)) - stack_trace("Wrong team type passed to [type] initialization.") - clock_team = new_team - -/datum/antagonist/clockcult/can_be_owned(datum/mind/new_owner) - . = ..() - if(.) - . = is_eligible_servant(new_owner.current) - -/datum/antagonist/clockcult/greet() - if(!owner.current || silent) - return - owner.current.visible_message("[owner.current]'s eyes glow a blazing yellow!", null, null, 7, owner.current) //don't show the owner this message - to_chat(owner.current, "Assist your new companions in their righteous efforts. Your goal is theirs, and theirs yours. You serve the Clockwork \ - Justiciar above all else. Perform his every whim without hesitation.") - owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/clockcultalr.ogg', 70, FALSE, pressure_affected = FALSE) - -/datum/antagonist/clockcult/on_gain() - var/mob/living/current = owner.current - SSticker.mode.servants_of_ratvar += owner - SSticker.mode.update_servant_icons_added(owner) - owner.special_role = ROLE_SERVANT_OF_RATVAR - owner.current.log_message("Has been converted to the cult of Ratvar!", INDIVIDUAL_ATTACK_LOG) - if(issilicon(current)) - if(iscyborg(current) && !silent) - var/mob/living/silicon/robot/R = current - if(R.connected_ai && !is_servant_of_ratvar(R.connected_ai)) - to_chat(R, "You have been desynced from your master AI.
    \ - In addition, your onboard camera is no longer active and you have gained additional equipment, including a limited clockwork slab.
    ") - else - to_chat(R, "Your onboard camera is no longer active and you have gained additional equipment, including a limited clockwork slab.") - if(isAI(current)) - to_chat(current, "You are now able to use your cameras to listen in on conversations, but can no longer speak in anything but Ratvarian.") - to_chat(current, "You can communicate with other servants by using the Hierophant Network action button in the upper left.") - else if(isbrain(current) || isclockmob(current)) - to_chat(current, "You can communicate with other servants by using the Hierophant Network action button in the upper left.") - ..() - to_chat(current, "This is Ratvar's will: [CLOCKCULT_OBJECTIVE]") - antag_memory += "Ratvar's will: [CLOCKCULT_OBJECTIVE]
    " //Memorize the objectives - -/datum/antagonist/clockcult/apply_innate_effects(mob/living/mob_override) - . = ..() - var/mob/living/current = owner.current - if(istype(mob_override)) - current = mob_override - GLOB.all_clockwork_mobs += current - current.faction |= "ratvar" - current.grant_language(/datum/language/ratvar) - current.update_action_buttons_icon() //because a few clockcult things are action buttons and we may be wearing/holding them for whatever reason, we need to update buttons - if(issilicon(current)) - var/mob/living/silicon/S = current - if(iscyborg(S)) - var/mob/living/silicon/robot/R = S - if(!R.shell) - R.UnlinkSelf() - R.module.rebuild_modules() - else if(isAI(S)) - var/mob/living/silicon/ai/A = S - A.can_be_carded = FALSE - A.requires_power = POWER_REQ_CLOCKCULT - var/list/AI_frame = list(mutable_appearance('icons/mob/clockwork_mobs.dmi', "aiframe")) //make the AI's cool frame - for(var/d in GLOB.cardinals) - AI_frame += image('icons/mob/clockwork_mobs.dmi', A, "eye[rand(1, 10)]", dir = d) //the eyes are randomly fast or slow - A.add_overlay(AI_frame) - if(!A.lacks_power()) - A.ai_restore_power() - if(A.eyeobj) - A.eyeobj.relay_speech = TRUE - for(var/mob/living/silicon/robot/R in A.connected_robots) - if(R.connected_ai == A) - add_servant_of_ratvar(R) - S.laws = new/datum/ai_laws/ratvar - S.laws.associate(S) - S.update_icons() - S.show_laws() - hierophant_network.title = "Silicon" - hierophant_network.span_for_name = "nezbere" - hierophant_network.span_for_message = "brass" - else if(isbrain(current)) - hierophant_network.title = "Vessel" - hierophant_network.span_for_name = "nezbere" - hierophant_network.span_for_message = "alloy" - else if(isclockmob(current)) - hierophant_network.title = "Construct" - hierophant_network.span_for_name = "nezbere" - hierophant_network.span_for_message = "brass" - hierophant_network.Grant(current) - current.throw_alert("clockinfo", /obj/screen/alert/clockwork/infodump) - var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = GLOB.ark_of_the_clockwork_justiciar - if(G.active && ishuman(current)) - current.add_overlay(mutable_appearance('icons/effects/genetics.dmi', "servitude", -MUTATIONS_LAYER)) - -/datum/antagonist/clockcult/remove_innate_effects(mob/living/mob_override) - var/mob/living/current = owner.current - if(istype(mob_override)) - current = mob_override - GLOB.all_clockwork_mobs -= current - current.faction -= "ratvar" - current.remove_language(/datum/language/ratvar) - current.clear_alert("clockinfo") - for(var/datum/action/innate/clockwork_armaments/C in owner.current.actions) //Removes any bound clockwork armor - qdel(C) - for(var/datum/action/innate/call_weapon/W in owner.current.actions) //and weapons too - qdel(W) - if(issilicon(current)) - var/mob/living/silicon/S = current - if(isAI(S)) - var/mob/living/silicon/ai/A = S - A.can_be_carded = initial(A.can_be_carded) - A.requires_power = initial(A.requires_power) - A.cut_overlays() - S.make_laws() - S.update_icons() - S.show_laws() - var/mob/living/temp_owner = current - ..() - if(iscyborg(temp_owner)) - var/mob/living/silicon/robot/R = temp_owner - R.module.rebuild_modules() - if(temp_owner) - temp_owner.update_action_buttons_icon() //because a few clockcult things are action buttons and we may be wearing/holding them, we need to update buttons - temp_owner.cut_overlays() - temp_owner.regenerate_icons() - -/datum/antagonist/clockcult/on_removal() - SSticker.mode.servants_of_ratvar -= owner - SSticker.mode.update_servant_icons_removed(owner) - if(!silent) - owner.current.visible_message("[owner] seems to have remembered their true allegiance!", null, null, null, owner.current) - to_chat(owner, "A cold, cold darkness flows through your mind, extinguishing the Justiciar's light and all of your memories as his servant.") - owner.current.log_message("Has renounced the cult of Ratvar!", INDIVIDUAL_ATTACK_LOG) - owner.special_role = null - if(iscyborg(owner.current)) - to_chat(owner.current, "Despite your freedom from Ratvar's influence, you are still irreparably damaged and no longer possess certain functions such as AI linking.") - . = ..() - - -/datum/antagonist/clockcult/admin_add(datum/mind/new_owner,mob/admin) - add_servant_of_ratvar(new_owner.current, TRUE) - message_admins("[key_name_admin(admin)] has made [new_owner.current] into a servant of Ratvar.") - log_admin("[key_name(admin)] has made [new_owner.current] into a servant of Ratvar.") - -/datum/antagonist/clockcult/admin_remove(mob/user) - remove_servant_of_ratvar(owner.current, TRUE) - message_admins("[key_name_admin(user)] has removed clockwork servant status from [owner.current].") - log_admin("[key_name(user)] has removed clockwork servant status from [owner.current].") - -/datum/antagonist/clockcult/get_admin_commands() - . = ..() - .["Give slab"] = CALLBACK(src,.proc/admin_give_slab) - -/datum/antagonist/clockcult/proc/admin_give_slab(mob/admin) - if(!SSticker.mode.equip_servant(owner.current)) - to_chat(admin, "Failed to outfit [owner.current]!") - else - to_chat(admin, "Successfully gave [owner.current] servant equipment!") - -/datum/team/clockcult - name = "Clockcult" - var/list/objective - var/datum/mind/eminence - -/datum/team/clockcult/proc/check_clockwork_victory() - if(GLOB.clockwork_gateway_activated) - return TRUE - return FALSE - -/datum/team/clockcult/roundend_report() - var/list/parts = list() - - if(check_clockwork_victory()) - parts += "Ratvar's servants defended the Ark until its activation!" - else - parts += "The Ark was destroyed! Ratvar will rust away for all eternity!" - parts += " " - parts += "The servants' objective was: [CLOCKCULT_OBJECTIVE]." - parts += "Construction Value(CV) was: [GLOB.clockwork_construction_value]" - for(var/i in SSticker.scripture_states) - if(i != SCRIPTURE_DRIVER) - parts += "[i] scripture was: [SSticker.scripture_states[i] ? "UN":""]LOCKED" - if(eminence) - parts += "The Eminence was: [printplayer(eminence)]" - if(members.len) - parts += "Ratvar's servants were:" - parts += printplayerlist(members - eminence) - - return "
    [parts.Join("
    ")]
    " \ No newline at end of file diff --git a/code/datums/antagonists/cult.dm b/code/datums/antagonists/cult.dm deleted file mode 100644 index 3b9fa7b8c4..0000000000 --- a/code/datums/antagonists/cult.dm +++ /dev/null @@ -1,329 +0,0 @@ -#define SUMMON_POSSIBILITIES 3 - -/datum/antagonist/cult - name = "Cultist" - roundend_category = "cultists" - antagpanel_category = "Cult" - var/datum/action/innate/cult/comm/communion = new - var/datum/action/innate/cult/mastervote/vote = new - job_rank = ROLE_CULTIST - var/ignore_implant = FALSE - var/give_equipment = FALSE - - var/datum/team/cult/cult_team - -/datum/antagonist/cult/get_team() - return cult_team - -/datum/antagonist/cult/create_team(datum/team/cult/new_team) - if(!new_team) - //todo remove this and allow admin buttons to create more than one cult - for(var/datum/antagonist/cult/H in GLOB.antagonists) - if(!H.owner) - continue - if(H.cult_team) - cult_team = H.cult_team - return - cult_team = new /datum/team/cult - cult_team.setup_objectives() - return - if(!istype(new_team)) - stack_trace("Wrong team type passed to [type] initialization.") - cult_team = new_team - -/datum/antagonist/cult/proc/add_objectives() - objectives |= cult_team.objectives - owner.objectives |= objectives - -/datum/antagonist/cult/proc/remove_objectives() - owner.objectives -= objectives - -/datum/antagonist/cult/Destroy() - QDEL_NULL(communion) - QDEL_NULL(vote) - return ..() - -/datum/antagonist/cult/can_be_owned(datum/mind/new_owner) - . = ..() - if(. && !ignore_implant) - . = is_convertable_to_cult(new_owner.current,cult_team) - -/datum/antagonist/cult/greet() - to_chat(owner, "You are a member of the cult!") - owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/bloodcult.ogg', 100, FALSE, pressure_affected = FALSE)//subject to change - owner.announce_objectives() - -/datum/antagonist/cult/on_gain() - . = ..() - var/mob/living/current = owner.current - add_objectives() - if(give_equipment) - equip_cultist() - SSticker.mode.cult += owner // Only add after they've been given objectives - SSticker.mode.update_cult_icons_added(owner) - current.log_message("Has been converted to the cult of Nar'Sie!", INDIVIDUAL_ATTACK_LOG) - - if(cult_team.blood_target && cult_team.blood_target_image && current.client) - current.client.images += cult_team.blood_target_image - - -/datum/antagonist/cult/proc/equip_cultist(tome=FALSE) - var/mob/living/carbon/H = owner.current - if(!istype(H)) - return - if (owner.assigned_role == "Clown") - to_chat(owner, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") - H.dna.remove_mutation(CLOWNMUT) - - if(tome) - . += cult_give_item(/obj/item/tome, H) - else - . += cult_give_item(/obj/item/paper/talisman/supply, H) - to_chat(owner, "These will help you start the cult on this station. Use them well, and remember - you are not the only one.") - - -/datum/antagonist/cult/proc/cult_give_item(obj/item/item_path, mob/living/carbon/human/mob) - var/list/slots = list( - "backpack" = slot_in_backpack, - "left pocket" = slot_l_store, - "right pocket" = slot_r_store - ) - - var/T = new item_path(mob) - var/item_name = initial(item_path.name) - var/where = mob.equip_in_one_of_slots(T, slots) - if(!where) - to_chat(mob, "Unfortunately, you weren't able to get a [item_name]. This is very bad and you should adminhelp immediately (press F1).") - return 0 - else - to_chat(mob, "You have a [item_name] in your [where].") - if(where == "backpack") - var/obj/item/storage/B = mob.back - B.orient2hud(mob) - B.show_to(mob) - return 1 - -/datum/antagonist/cult/apply_innate_effects(mob/living/mob_override) - . = ..() - var/mob/living/current = owner.current - if(mob_override) - current = mob_override - current.faction |= "cult" - current.grant_language(/datum/language/narsie) - current.verbs += /mob/living/proc/cult_help - if(!cult_team.cult_mastered) - vote.Grant(current) - communion.Grant(current) - current.throw_alert("bloodsense", /obj/screen/alert/bloodsense) - -/datum/antagonist/cult/remove_innate_effects(mob/living/mob_override) - . = ..() - var/mob/living/current = owner.current - if(mob_override) - current = mob_override - current.faction -= "cult" - current.remove_language(/datum/language/narsie) - current.verbs -= /mob/living/proc/cult_help - vote.Remove(current) - communion.Remove(current) - current.clear_alert("bloodsense") - -/datum/antagonist/cult/on_removal() - remove_objectives() - SSticker.mode.cult -= owner - SSticker.mode.update_cult_icons_removed(owner) - if(!silent) - owner.current.visible_message("[owner.current] looks like [owner.current.p_they()] just reverted to their old faith!", null, null, null, owner.current) - to_chat(owner.current, "An unfamiliar white light flashes through your mind, cleansing the taint of the Geometer and all your memories as her servant.") - owner.current.log_message("Has renounced the cult of Nar'Sie!", INDIVIDUAL_ATTACK_LOG) - if(cult_team.blood_target && cult_team.blood_target_image && owner.current.client) - owner.current.client.images -= cult_team.blood_target_image - . = ..() - -/datum/antagonist/cult/admin_add(datum/mind/new_owner,mob/admin) - give_equipment = FALSE - new_owner.add_antag_datum(src) - message_admins("[key_name_admin(admin)] has cult'ed [new_owner.current].") - log_admin("[key_name(admin)] has cult'ed [new_owner.current].") - -/datum/antagonist/cult/admin_remove(mob/user) - message_admins("[key_name_admin(user)] has decult'ed [owner.current].") - log_admin("[key_name(user)] has decult'ed [owner.current].") - SSticker.mode.remove_cultist(owner,silent=TRUE) //disgusting - -/datum/antagonist/cult/get_admin_commands() - . = ..() - .["Tome"] = CALLBACK(src,.proc/admin_give_tome) - .["Amulet"] = CALLBACK(src,.proc/admin_give_amulet) - -/datum/antagonist/cult/proc/admin_give_tome(mob/admin) - if(equip_cultist(owner.current,1)) - to_chat(admin, "Spawning tome failed!") - -/datum/antagonist/cult/proc/admin_give_amulet(mob/admin) - if (equip_cultist(owner.current)) - to_chat(admin, "Spawning amulet failed!") - -/datum/antagonist/cult/master - ignore_implant = TRUE - show_in_antagpanel = FALSE //Feel free to add this later - var/datum/action/innate/cult/master/finalreck/reckoning = new - var/datum/action/innate/cult/master/cultmark/bloodmark = new - var/datum/action/innate/cult/master/pulse/throwing = new - -/datum/antagonist/cult/master/Destroy() - QDEL_NULL(reckoning) - QDEL_NULL(bloodmark) - QDEL_NULL(throwing) - return ..() - -/datum/antagonist/cult/master/on_gain() - . = ..() - var/mob/living/current = owner.current - set_antag_hud(current, "cultmaster") - -/datum/antagonist/cult/master/greet() - to_chat(owner.current, "You are the cult's Master. As the cult's Master, you have a unique title and loud voice when communicating, are capable of marking \ - targets, such as a location or a noncultist, to direct the cult to them, and, finally, you are capable of summoning the entire living cult to your location once.") - to_chat(owner.current, "Use these abilities to direct the cult to victory at any cost.") - -/datum/antagonist/cult/master/apply_innate_effects(mob/living/mob_override) - . = ..() - var/mob/living/current = owner.current - if(mob_override) - current = mob_override - if(!cult_team.reckoning_complete) - reckoning.Grant(current) - bloodmark.Grant(current) - throwing.Grant(current) - current.update_action_buttons_icon() - current.apply_status_effect(/datum/status_effect/cult_master) - -/datum/antagonist/cult/master/remove_innate_effects(mob/living/mob_override) - . = ..() - var/mob/living/current = owner.current - if(mob_override) - current = mob_override - reckoning.Remove(current) - bloodmark.Remove(current) - throwing.Remove(current) - current.update_action_buttons_icon() - current.remove_status_effect(/datum/status_effect/cult_master) - -/datum/team/cult - name = "Cult" - - var/blood_target - var/image/blood_target_image - var/blood_target_reset_timer - - var/cult_vote_called = FALSE - var/cult_mastered = FALSE - var/reckoning_complete = FALSE - - -/datum/team/cult/proc/setup_objectives() - //SAC OBJECTIVE , todo: move this to objective internals - var/list/target_candidates = list() - var/datum/objective/sacrifice/sac_objective = new - sac_objective.team = src - - for(var/mob/living/carbon/human/player in GLOB.player_list) - if(player.mind && !player.mind.has_antag_datum(/datum/antagonist/cult) && !is_convertable_to_cult(player) && player.stat != DEAD) - target_candidates += player.mind - - if(target_candidates.len == 0) - message_admins("Cult Sacrifice: Could not find unconvertable target, checking for convertable target.") - for(var/mob/living/carbon/human/player in GLOB.player_list) - if(player.mind && !player.mind.has_antag_datum(/datum/antagonist/cult) && player.stat != DEAD) - target_candidates += player.mind - listclearnulls(target_candidates) - if(LAZYLEN(target_candidates)) - sac_objective.target = pick(target_candidates) - sac_objective.update_explanation_text() - - var/datum/job/sacjob = SSjob.GetJob(sac_objective.target.assigned_role) - var/datum/preferences/sacface = sac_objective.target.current.client.prefs - var/icon/reshape = get_flat_human_icon(null, sacjob, sacface) - reshape.Shift(SOUTH, 4) - reshape.Shift(EAST, 1) - reshape.Crop(7,4,26,31) - reshape.Crop(-5,-3,26,30) - sac_objective.sac_image = reshape - - objectives += sac_objective - else - message_admins("Cult Sacrifice: Could not find unconvertable or convertable target. WELP!") - - - //SUMMON OBJECTIVE - - var/datum/objective/eldergod/summon_objective = new() - summon_objective.team = src - objectives += summon_objective - -/datum/objective/sacrifice - var/sacced = FALSE - var/sac_image - -/datum/objective/sacrifice/check_completion() - return sacced || completed - -/datum/objective/sacrifice/update_explanation_text() - if(target) - explanation_text = "Sacrifice [target], the [target.assigned_role] via invoking a Sacrifice rune with them on it and three acolytes around it." - else - explanation_text = "The veil has already been weakened here, proceed to the final objective." - -/datum/objective/eldergod - var/summoned = FALSE - var/list/summon_spots = list() - -/datum/objective/eldergod/New() - ..() - var/sanity = 0 - while(summon_spots.len < SUMMON_POSSIBILITIES && sanity < 100) - var/area/summon = pick(GLOB.sortedAreas - summon_spots) - if(summon && is_station_level(summon.z) && summon.valid_territory) - summon_spots += summon - sanity++ - update_explanation_text() - -/datum/objective/eldergod/update_explanation_text() - explanation_text = "Summon Nar-Sie by invoking the rune 'Summon Nar-Sie'. The summoning can only be accomplished in [english_list(summon_spots)] - where the veil is weak enough for the ritual to begin." - -/datum/objective/eldergod/check_completion() - return summoned || completed - -/datum/team/cult/proc/check_cult_victory() - for(var/datum/objective/O in objectives) - if(!O.check_completion()) - return FALSE - return TRUE - -/datum/team/cult/roundend_report() - var/list/parts = list() - - if(check_cult_victory()) - parts += "The cult has succeeded! Nar-sie has snuffed out another torch in the void!" - else - parts += "The staff managed to stop the cult! Dark words and heresy are no match for Nanotrasen's finest!" - - if(objectives.len) - parts += "The cultists' objectives were:" - var/count = 1 - for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - parts += "Objective #[count]: [objective.explanation_text] Success!" - else - parts += "Objective #[count]: [objective.explanation_text] Fail." - count++ - - if(members.len) - parts += "The cultists were:" - parts += printplayerlist(members) - - return "
    [parts.Join("
    ")]
    " - -/datum/team/cult/is_gamemode_hero() - return SSticker.mode.name == "cult" \ No newline at end of file diff --git a/code/datums/antagonists/datum_iaa.dm b/code/datums/antagonists/datum_iaa.dm deleted file mode 100644 index fd2c4e89a0..0000000000 --- a/code/datums/antagonists/datum_iaa.dm +++ /dev/null @@ -1,11 +0,0 @@ -/datum/antagonist/iaa - -/datum/antagonist/iaa/apply_innate_effects() - .=..() //in case the base is used in future - if(owner&&owner.current) - give_pinpointer(owner.current) - -/datum/antagonist/iaa/remove_innate_effects() - .=..() - if(owner&&owner.current) - owner.current.remove_status_effect(/datum/status_effect/agent_pinpointer) \ No newline at end of file diff --git a/code/datums/antagonists/datum_traitor.dm b/code/datums/antagonists/datum_traitor.dm deleted file mode 100644 index da34debf95..0000000000 --- a/code/datums/antagonists/datum_traitor.dm +++ /dev/null @@ -1,352 +0,0 @@ -/datum/antagonist/traitor - name = "Traitor" - roundend_category = "traitors" - antagpanel_category = "Traitor" - job_rank = ROLE_TRAITOR - var/should_specialise = TRUE //do we split into AI and human, set to true on inital assignment only - var/ai_datum = /datum/antagonist/traitor/AI - var/human_datum = /datum/antagonist/traitor/human - var/special_role = ROLE_TRAITOR - var/employer = "The Syndicate" - var/give_objectives = TRUE - var/should_give_codewords = TRUE - - - -/datum/antagonist/traitor/human - show_in_antagpanel = FALSE - should_specialise = FALSE - var/should_equip = TRUE - - -/datum/antagonist/traitor/AI - show_in_antagpanel = FALSE - should_specialise = FALSE - -/datum/antagonist/traitor/specialization(datum/mind/new_owner) - if(should_specialise) - if(new_owner.current && isAI(new_owner.current)) - return new ai_datum() - else - return new human_datum() - else - return ..() - -/datum/antagonist/traitor/on_gain() - SSticker.mode.traitors += owner - owner.special_role = special_role - if(give_objectives) - forge_traitor_objectives() - finalize_traitor() - ..() - -/datum/antagonist/traitor/apply_innate_effects() - if(owner.assigned_role == "Clown") - var/mob/living/carbon/human/traitor_mob = owner.current - if(traitor_mob && istype(traitor_mob)) - if(!silent) - to_chat(traitor_mob, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") - traitor_mob.dna.remove_mutation(CLOWNMUT) - -/datum/antagonist/traitor/remove_innate_effects() - if(owner.assigned_role == "Clown") - var/mob/living/carbon/human/traitor_mob = owner.current - if(traitor_mob && istype(traitor_mob)) - traitor_mob.dna.add_mutation(CLOWNMUT) - -/datum/antagonist/traitor/on_removal() - SSticker.mode.traitors -= owner - for(var/O in objectives) - owner.objectives -= O - objectives = list() - if(!silent && owner.current) - to_chat(owner.current," You are no longer the [special_role]! ") - owner.special_role = null - ..() - -/datum/antagonist/traitor/AI/on_removal() - if(owner.current && isAI(owner.current)) - var/mob/living/silicon/ai/A = owner.current - A.set_zeroth_law("") - A.verbs -= /mob/living/silicon/ai/proc/choose_modules - A.malf_picker.remove_malf_verbs(A) - qdel(A.malf_picker) - ..() - -/datum/antagonist/traitor/proc/add_objective(var/datum/objective/O) - owner.objectives += O - objectives += O - -/datum/antagonist/traitor/proc/remove_objective(var/datum/objective/O) - owner.objectives -= O - objectives -= O - -/datum/antagonist/traitor/proc/forge_traitor_objectives() - return - -/datum/antagonist/traitor/human/forge_traitor_objectives() - var/is_hijacker = FALSE - if (GLOB.joined_player_list.len >= 30) // Less murderboning on lowpop thanks - is_hijacker = prob(10) - var/martyr_chance = prob(20) - var/objective_count = is_hijacker //Hijacking counts towards number of objectives - if(!SSticker.mode.exchange_blue && SSticker.mode.traitors.len >= 8) //Set up an exchange if there are enough traitors - if(!SSticker.mode.exchange_red) - SSticker.mode.exchange_red = owner - else - SSticker.mode.exchange_blue = owner - assign_exchange_role(SSticker.mode.exchange_red) - assign_exchange_role(SSticker.mode.exchange_blue) - objective_count += 1 //Exchange counts towards number of objectives - var/toa = CONFIG_GET(number/traitor_objectives_amount) - for(var/i = objective_count, i < toa, i++) - forge_single_objective() - - if(is_hijacker && objective_count <= toa) //Don't assign hijack if it would exceed the number of objectives set in config.traitor_objectives_amount - if (!(locate(/datum/objective/hijack) in owner.objectives)) - var/datum/objective/hijack/hijack_objective = new - hijack_objective.owner = owner - add_objective(hijack_objective) - return - - - var/martyr_compatibility = 1 //You can't succeed in stealing if you're dead. - for(var/datum/objective/O in owner.objectives) - if(!O.martyr_compatible) - martyr_compatibility = 0 - break - - if(martyr_compatibility && martyr_chance) - var/datum/objective/martyr/martyr_objective = new - martyr_objective.owner = owner - add_objective(martyr_objective) - return - - else - if(!(locate(/datum/objective/escape) in owner.objectives)) - var/datum/objective/escape/escape_objective = new - escape_objective.owner = owner - add_objective(escape_objective) - return - -/datum/antagonist/traitor/AI/forge_traitor_objectives() - var/objective_count = 0 - - if(prob(30)) - objective_count += forge_single_objective() - - for(var/i = objective_count, i < CONFIG_GET(number/traitor_objectives_amount), i++) - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = owner - kill_objective.find_target() - add_objective(kill_objective) - - var/datum/objective/survive/exist/exist_objective = new - exist_objective.owner = owner - add_objective(exist_objective) -/datum/antagonist/traitor/proc/forge_single_objective() - return 0 -/datum/antagonist/traitor/human/forge_single_objective() //Returns how many objectives are added - .=1 - if(prob(50)) - var/list/active_ais = active_ais() - if(active_ais.len && prob(100/GLOB.joined_player_list.len)) - var/datum/objective/destroy/destroy_objective = new - destroy_objective.owner = owner - destroy_objective.find_target() - add_objective(destroy_objective) - else if(prob(30)) - var/datum/objective/maroon/maroon_objective = new - maroon_objective.owner = owner - maroon_objective.find_target() - add_objective(maroon_objective) - else - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = owner - kill_objective.find_target() - add_objective(kill_objective) - else - if(prob(15) && !(locate(/datum/objective/download in owner.objectives))) - var/datum/objective/download/download_objective = new - download_objective.owner = owner - download_objective.gen_amount_goal() - add_objective(download_objective) - else - var/datum/objective/steal/steal_objective = new - steal_objective.owner = owner - steal_objective.find_target() - add_objective(steal_objective) - -/datum/antagonist/traitor/AI/forge_single_objective() - .=1 - var/special_pick = rand(1,4) - switch(special_pick) - if(1) - var/datum/objective/block/block_objective = new - block_objective.owner = owner - add_objective(block_objective) - if(2) - var/datum/objective/purge/purge_objective = new - purge_objective.owner = owner - add_objective(purge_objective) - if(3) - var/datum/objective/robot_army/robot_objective = new - robot_objective.owner = owner - add_objective(robot_objective) - if(4) //Protect and strand a target - var/datum/objective/protect/yandere_one = new - yandere_one.owner = owner - add_objective(yandere_one) - yandere_one.find_target() - var/datum/objective/maroon/yandere_two = new - yandere_two.owner = owner - yandere_two.target = yandere_one.target - yandere_two.update_explanation_text() // normally called in find_target() - add_objective(yandere_two) - .=2 - -/datum/antagonist/traitor/greet() - to_chat(owner.current, "You are the [owner.special_role].") - owner.announce_objectives() - if(should_give_codewords) - give_codewords() - -/datum/antagonist/traitor/proc/finalize_traitor() - SSticker.mode.update_traitor_icons_added(owner) - return - -/datum/antagonist/traitor/AI/finalize_traitor() - ..() - add_law_zero() - owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/malf.ogg', 100, FALSE, pressure_affected = FALSE) - owner.current.grant_language(/datum/language/codespeak) - -/datum/antagonist/traitor/human/finalize_traitor() - ..() - if(should_equip) - equip(silent) - owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/tatoralert.ogg', 100, FALSE, pressure_affected = FALSE) - -/datum/antagonist/traitor/proc/give_codewords() - if(!owner.current) - return - var/mob/traitor_mob=owner.current - - to_chat(traitor_mob, "The Syndicate provided you with the following information on how to identify their agents:") - to_chat(traitor_mob, "Code Phrase: [GLOB.syndicate_code_phrase]") - to_chat(traitor_mob, "Code Response: [GLOB.syndicate_code_response]") - - antag_memory += "Code Phrase: [GLOB.syndicate_code_phrase]
    " - antag_memory += "Code Response: [GLOB.syndicate_code_response]
    " - - to_chat(traitor_mob, "Use the code words in the order provided, during regular conversation, to identify other agents. Proceed with caution, however, as everyone is a potential foe.") - -/datum/antagonist/traitor/AI/proc/add_law_zero() - var/mob/living/silicon/ai/killer = owner.current - if(!killer || !istype(killer)) - return - var/law = "Accomplish your objectives at all costs." - var/law_borg = "Accomplish your AI's objectives at all costs." - killer.set_zeroth_law(law, law_borg) - killer.set_syndie_radio() - to_chat(killer, "Your radio has been upgraded! Use :t to speak on an encrypted channel with Syndicate Agents!") - killer.add_malf_picker() - -/datum/antagonist/traitor/proc/equip(var/silent = FALSE) - return - -/datum/antagonist/traitor/human/equip(var/silent = FALSE) - owner.equip_traitor(employer, silent, src) - -/datum/antagonist/traitor/human/proc/assign_exchange_role() - //set faction - var/faction = "red" - if(owner == SSticker.mode.exchange_blue) - faction = "blue" - - //Assign objectives - var/datum/objective/steal/exchange/exchange_objective = new - exchange_objective.set_faction(faction,((faction == "red") ? SSticker.mode.exchange_blue : SSticker.mode.exchange_red)) - exchange_objective.owner = owner - add_objective(exchange_objective) - - if(prob(20)) - var/datum/objective/steal/exchange/backstab/backstab_objective = new - backstab_objective.set_faction(faction) - backstab_objective.owner = owner - add_objective(backstab_objective) - - //Spawn and equip documents - var/mob/living/carbon/human/mob = owner.current - - var/obj/item/folder/syndicate/folder - if(owner == SSticker.mode.exchange_red) - folder = new/obj/item/folder/syndicate/red(mob.loc) - else - folder = new/obj/item/folder/syndicate/blue(mob.loc) - - var/list/slots = list ( - "backpack" = slot_in_backpack, - "left pocket" = slot_l_store, - "right pocket" = slot_r_store - ) - - var/where = "At your feet" - var/equipped_slot = mob.equip_in_one_of_slots(folder, slots) - if (equipped_slot) - where = "In your [equipped_slot]" - to_chat(mob, "

    [where] is a folder containing secret documents that another Syndicate group wants. We have set up a meeting with one of their agents on station to make an exchange. Exercise extreme caution as they cannot be trusted and may be hostile.
    ") - -//TODO Collate -/datum/antagonist/traitor/roundend_report() - var/list/result = list() - - var/traitorwin = TRUE - - result += printplayer(owner) - - var/TC_uses = 0 - var/uplink_true = FALSE - var/purchases = "" - var/datum/uplink_purchase_log/H = GLOB.uplink_purchase_logs_by_key[owner.key] - if(H) - TC_uses = H.total_spent - uplink_true = TRUE - purchases += H.generate_render(FALSE) - - var/objectives_text = "" - if(objectives.len)//If the traitor had no objectives, don't need to process this. - var/count = 1 - for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - objectives_text += "
    Objective #[count]: [objective.explanation_text] Success!" - else - objectives_text += "
    Objective #[count]: [objective.explanation_text] Fail." - traitorwin = FALSE - count++ - - if(uplink_true) - var/uplink_text = "(used [TC_uses] TC) [purchases]" - if(TC_uses==0 && traitorwin) - var/static/icon/badass = icon('icons/badass.dmi', "badass") - uplink_text += "[icon2html(badass, world)]" - result += uplink_text - - result += objectives_text - - var/special_role_text = lowertext(name) - - if(traitorwin) - result += "The [special_role_text] was successful!" - else - result += "The [special_role_text] has failed!" - SEND_SOUND(owner.current, 'sound/ambience/ambifailure.ogg') - - return result.Join("
    ") - -/datum/antagonist/traitor/roundend_report_footer() - return "
    The code phrases were: [GLOB.syndicate_code_phrase]
    \ - The code responses were: [GLOB.syndicate_code_response]
    " - -/datum/antagonist/traitor/is_gamemode_hero() - return SSticker.mode.name == "traitor" \ No newline at end of file diff --git a/code/datums/antagonists/devil.dm b/code/datums/antagonists/devil.dm deleted file mode 100644 index 858b2d1ef1..0000000000 --- a/code/datums/antagonists/devil.dm +++ /dev/null @@ -1,582 +0,0 @@ -#define BLOOD_THRESHOLD 3 //How many souls are needed per stage. -#define TRUE_THRESHOLD 7 -#define ARCH_THRESHOLD 12 - -#define BASIC_DEVIL 0 -#define BLOOD_LIZARD 1 -#define TRUE_DEVIL 2 -#define ARCH_DEVIL 3 - -#define LOSS_PER_DEATH 2 - -#define SOULVALUE soulsOwned.len-reviveNumber - -#define DEVILRESURRECTTIME 600 - -GLOBAL_LIST_EMPTY(allDevils) -GLOBAL_LIST_INIT(lawlorify, list ( - LORE = list( - OBLIGATION_FOOD = "This devil seems to always offer its victims food before slaughtering them.", - OBLIGATION_FIDDLE = "This devil will never turn down a musical challenge.", - OBLIGATION_DANCEOFF = "This devil will never turn down a dance off.", - OBLIGATION_GREET = "This devil seems to only be able to converse with people it knows the name of.", - OBLIGATION_PRESENCEKNOWN = "This devil seems to be unable to attack from stealth.", - OBLIGATION_SAYNAME = "He will always chant his name upon killing someone.", - OBLIGATION_ANNOUNCEKILL = "This devil always loudly announces his kills for the world to hear.", - OBLIGATION_ANSWERTONAME = "This devil always responds to his truename.", - BANE_SILVER = "Silver seems to gravely injure this devil.", - BANE_SALT = "Throwing salt at this devil will hinder his ability to use infernal powers temporarily.", - BANE_LIGHT = "Bright flashes will disorient the devil, likely causing him to flee.", - BANE_IRON = "Cold iron will slowly injure him, until he can purge it from his system.", - BANE_WHITECLOTHES = "Wearing clean white clothing will help ward off this devil.", - BANE_HARVEST = "Presenting the labors of a harvest will disrupt the devil.", - BANE_TOOLBOX = "That which holds the means of creation also holds the means of the devil's undoing.", - BAN_HURTWOMAN = "This devil seems to prefer hunting men.", - BAN_CHAPEL = "This devil avoids holy ground.", - BAN_HURTPRIEST = "The annointed clergy appear to be immune to his powers.", - BAN_AVOIDWATER = "The devil seems to have some sort of aversion to water, though it does not appear to harm him.", - BAN_STRIKEUNCONSCIOUS = "This devil only shows interest in those who are awake.", - BAN_HURTLIZARD = "This devil will not strike a lizardman first.", - BAN_HURTANIMAL = "This devil avoids hurting animals.", - BANISH_WATER = "To banish the devil, you must infuse its body with holy water.", - BANISH_COFFIN = "This devil will return to life if its remains are not placed within a coffin.", - BANISH_FORMALDYHIDE = "To banish the devil, you must inject its lifeless body with embalming fluid.", - BANISH_RUNES = "This devil will resurrect after death, unless its remains are within a rune.", - BANISH_CANDLES = "A large number of nearby lit candles will prevent it from resurrecting.", - BANISH_DESTRUCTION = "Its corpse must be utterly destroyed to prevent resurrection.", - BANISH_FUNERAL_GARB = "If clad in funeral garments, this devil will be unable to resurrect. Should the clothes not fit, lay them gently on top of the devil's corpse." - ), - LAW = list( - OBLIGATION_FOOD = "When not acting in self defense, you must always offer your victim food before harming them.", - OBLIGATION_FIDDLE = "When not in immediate danger, if you are challenged to a musical duel, you must accept it. You are not obligated to duel the same person twice.", - OBLIGATION_DANCEOFF = "When not in immediate danger, if you are challenged to a dance off, you must accept it. You are not obligated to face off with the same person twice.", - OBLIGATION_GREET = "You must always greet other people by their last name before talking with them.", - OBLIGATION_PRESENCEKNOWN = "You must always make your presence known before attacking.", - OBLIGATION_SAYNAME = "You must always say your true name after you kill someone.", - OBLIGATION_ANNOUNCEKILL = "Upon killing someone, you must make your deed known to all within earshot, over comms if reasonably possible.", - OBLIGATION_ANSWERTONAME = "If you are not under attack, you must always respond to your true name.", - BAN_HURTWOMAN = "You must never harm a female outside of self defense.", - BAN_CHAPEL = "You must never attempt to enter the chapel.", - BAN_HURTPRIEST = "You must never attack a priest.", - BAN_AVOIDWATER = "You must never willingly touch a wet surface.", - BAN_STRIKEUNCONSCIOUS = "You must never strike an unconscious person.", - BAN_HURTLIZARD = "You must never harm a lizardman outside of self defense.", - BAN_HURTANIMAL = "You must never harm a non-sentient creature or robot outside of self defense.", - BANE_SILVER = "Silver, in all of its forms shall be your downfall.", - BANE_SALT = "Salt will disrupt your magical abilities.", - BANE_LIGHT = "Blinding lights will prevent you from using offensive powers for a time.", - BANE_IRON = "Cold wrought iron shall act as poison to you.", - BANE_WHITECLOTHES = "Those clad in pristine white garments will strike you true.", - BANE_HARVEST = "The fruits of the harvest shall be your downfall.", - BANE_TOOLBOX = "Toolboxes are bad news for you, for some reason.", - BANISH_WATER = "If your corpse is filled with holy water, you will be unable to resurrect.", - BANISH_COFFIN = "If your corpse is in a coffin, you will be unable to resurrect.", - BANISH_FORMALDYHIDE = "If your corpse is embalmed, you will be unable to resurrect.", - BANISH_RUNES = "If your corpse is placed within a rune, you will be unable to resurrect.", - BANISH_CANDLES = "If your corpse is near lit candles, you will be unable to resurrect.", - BANISH_DESTRUCTION = "If your corpse is destroyed, you will be unable to resurrect.", - BANISH_FUNERAL_GARB = "If your corpse is clad in funeral garments, you will be unable to resurrect." - ) - )) - -//These are also used in the codex gigas, so let's declare them globally. -GLOBAL_LIST_INIT(devil_pre_title, list("Dark ", "Hellish ", "Fallen ", "Fiery ", "Sinful ", "Blood ", "Fluffy ")) -GLOBAL_LIST_INIT(devil_title, list("Lord ", "Prelate ", "Count ", "Viscount ", "Vizier ", "Elder ", "Adept ")) -GLOBAL_LIST_INIT(devil_syllable, list("hal", "ve", "odr", "neit", "ci", "quon", "mya", "folth", "wren", "geyr", "hil", "niet", "twou", "phi", "coa")) -GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", ", the Lord of all things", ", Jr.")) -/datum/antagonist/devil - name = "Devil" - roundend_category = "devils" - antagpanel_category = "Devil" - job_rank = ROLE_DEVIL - //Don't delete upon mind destruction, otherwise soul re-selling will break. - delete_on_mind_deletion = FALSE - var/obligation - var/ban - var/bane - var/banish - var/truename - var/list/datum/mind/soulsOwned = new - var/reviveNumber = 0 - var/form = BASIC_DEVIL - var/static/list/devil_spells = typecacheof(list( - /obj/effect/proc_holder/spell/aimed/fireball/hellish, - /obj/effect/proc_holder/spell/targeted/conjure_item/summon_pitchfork, - /obj/effect/proc_holder/spell/targeted/conjure_item/summon_pitchfork/greater, - /obj/effect/proc_holder/spell/targeted/conjure_item/summon_pitchfork/ascended, - /obj/effect/proc_holder/spell/targeted/infernal_jaunt, - /obj/effect/proc_holder/spell/targeted/sintouch, - /obj/effect/proc_holder/spell/targeted/sintouch/ascended, - /obj/effect/proc_holder/spell/targeted/summon_contract, - /obj/effect/proc_holder/spell/targeted/conjure_item/violin, - /obj/effect/proc_holder/spell/targeted/summon_dancefloor)) - var/ascendable = FALSE - -/datum/antagonist/devil/can_be_owned(datum/mind/new_owner) - . = ..() - return . && (ishuman(new_owner.current) || iscyborg(new_owner.current)) - -/datum/antagonist/devil/get_admin_commands() - . = ..() - .["Toggle ascendable"] = CALLBACK(src,.proc/admin_toggle_ascendable) - - -/datum/antagonist/devil/proc/admin_toggle_ascendable(mob/admin) - ascendable = !ascendable - message_admins("[key_name_admin(admin)] set [owner.current] devil ascendable to [ascendable]") - log_admin("[key_name_admin(admin)] set [owner.current] devil ascendable to [ascendable])") - -/datum/antagonist/devil/admin_add(datum/mind/new_owner,mob/admin) - switch(alert(admin,"Should the devil be able to ascend",,"Yes","No","Cancel")) - if("Yes") - ascendable = TRUE - if("No") - ascendable = FALSE - else - return - new_owner.add_antag_datum(src) - message_admins("[key_name_admin(admin)] has devil'ed [new_owner.current]. [ascendable ? "(Ascendable)":""]") - log_admin("[key_name(admin)] has devil'ed [new_owner.current]. [ascendable ? "(Ascendable)":""]") - -/datum/antagonist/devil/antag_listing_name() - return ..() + "([truename])" - -/proc/devilInfo(name) - if(GLOB.allDevils[lowertext(name)]) - return GLOB.allDevils[lowertext(name)] - else - var/datum/fakeDevil/devil = new /datum/fakeDevil(name) - GLOB.allDevils[lowertext(name)] = devil - return devil - -/proc/randomDevilName() - var/name = "" - if(prob(65)) - if(prob(35)) - name = pick(GLOB.devil_pre_title) - name += pick(GLOB.devil_title) - var/probability = 100 - name += pick(GLOB.devil_syllable) - while(prob(probability)) - name += pick(GLOB.devil_syllable) - probability -= 20 - if(prob(40)) - name += pick(GLOB.devil_suffix) - return name - -/proc/randomdevilobligation() - return pick(OBLIGATION_FOOD, OBLIGATION_FIDDLE, OBLIGATION_DANCEOFF, OBLIGATION_GREET, OBLIGATION_PRESENCEKNOWN, OBLIGATION_SAYNAME, OBLIGATION_ANNOUNCEKILL, OBLIGATION_ANSWERTONAME) - -/proc/randomdevilban() - return pick(BAN_HURTWOMAN, BAN_CHAPEL, BAN_HURTPRIEST, BAN_AVOIDWATER, BAN_STRIKEUNCONSCIOUS, BAN_HURTLIZARD, BAN_HURTANIMAL) - -/proc/randomdevilbane() - return pick(BANE_SALT, BANE_LIGHT, BANE_IRON, BANE_WHITECLOTHES, BANE_SILVER, BANE_HARVEST, BANE_TOOLBOX) - -/proc/randomdevilbanish() - return pick(BANISH_WATER, BANISH_COFFIN, BANISH_FORMALDYHIDE, BANISH_RUNES, BANISH_CANDLES, BANISH_DESTRUCTION, BANISH_FUNERAL_GARB) - -/datum/antagonist/devil/proc/add_soul(datum/mind/soul) - if(soulsOwned.Find(soul)) - return - soulsOwned += soul - owner.current.nutrition = NUTRITION_LEVEL_FULL - to_chat(owner.current, "You feel satiated as you received a new soul.") - update_hud() - switch(SOULVALUE) - if(0) - to_chat(owner.current, "Your hellish powers have been restored.") - give_appropriate_spells() - if(BLOOD_THRESHOLD) - increase_blood_lizard() - if(TRUE_THRESHOLD) - increase_true_devil() - if(ARCH_THRESHOLD) - increase_arch_devil() - -/datum/antagonist/devil/proc/remove_soul(datum/mind/soul) - if(soulsOwned.Remove(soul)) - check_regression() - to_chat(owner.current, "You feel as though a soul has slipped from your grasp.") - update_hud() - -/datum/antagonist/devil/proc/check_regression() - if(form == ARCH_DEVIL) - return //arch devil can't regress - //Yes, fallthrough behavior is intended, so I can't use a switch statement. - if(form == TRUE_DEVIL && SOULVALUE < TRUE_THRESHOLD) - regress_blood_lizard() - if(form == BLOOD_LIZARD && SOULVALUE < BLOOD_THRESHOLD) - regress_humanoid() - if(SOULVALUE < 0) - give_appropriate_spells() - to_chat(owner.current, "As punishment for your failures, all of your powers except contract creation have been revoked.") - -/datum/antagonist/devil/proc/regress_humanoid() - to_chat(owner.current, "Your powers weaken, have more contracts be signed to regain power.") - if(ishuman(owner.current)) - var/mob/living/carbon/human/H = owner.current - H.set_species(/datum/species/human, 1) - H.regenerate_icons() - give_appropriate_spells() - if(istype(owner.current.loc, /obj/effect/dummy/slaughter/)) - owner.current.forceMove(get_turf(owner.current))//Fixes dying while jaunted leaving you permajaunted. - form = BASIC_DEVIL - -/datum/antagonist/devil/proc/regress_blood_lizard() - var/mob/living/carbon/true_devil/D = owner.current - to_chat(D, "Your powers weaken, have more contracts be signed to regain power.") - D.oldform.forceMove(D.drop_location()) - owner.transfer_to(D.oldform) - give_appropriate_spells() - qdel(D) - form = BLOOD_LIZARD - update_hud() - - -/datum/antagonist/devil/proc/increase_blood_lizard() - to_chat(owner.current, "You feel as though your humanoid form is about to shed. You will soon turn into a blood lizard.") - sleep(50) - if(ishuman(owner.current)) - var/mob/living/carbon/human/H = owner.current - H.set_species(/datum/species/lizard, 1) - H.underwear = "Nude" - H.undershirt = "Nude" - H.socks = "Nude" - H.dna.features["mcolor"] = "511" //A deep red - H.regenerate_icons() - else //Did the devil get hit by a staff of transmutation? - owner.current.color = "#501010" - give_appropriate_spells() - form = BLOOD_LIZARD - - - -/datum/antagonist/devil/proc/increase_true_devil() - to_chat(owner.current, "You feel as though your current form is about to shed. You will soon turn into a true devil.") - sleep(50) - var/mob/living/carbon/true_devil/A = new /mob/living/carbon/true_devil(owner.current.loc) - A.faction |= "hell" - owner.current.forceMove(A) - A.oldform = owner.current - owner.transfer_to(A) - A.set_name() - give_appropriate_spells() - form = TRUE_DEVIL - update_hud() - -/datum/antagonist/devil/proc/increase_arch_devil() - if(!ascendable) - return - var/mob/living/carbon/true_devil/D = owner.current - to_chat(D, "You feel as though your form is about to ascend.") - sleep(50) - if(!D) - return - D.visible_message("[D]'s skin begins to erupt with spikes.", \ - "Your flesh begins creating a shield around yourself.") - sleep(100) - if(!D) - return - D.visible_message("The horns on [D]'s head slowly grow and elongate.", \ - "Your body continues to mutate. Your telepathic abilities grow.") - sleep(90) - if(!D) - return - D.visible_message("[D]'s body begins to violently stretch and contort.", \ - "You begin to rend apart the final barriers to ultimate power.") - sleep(40) - if(!D) - return - to_chat(D, "Yes!") - sleep(10) - if(!D) - return - to_chat(D, "YES!!") - sleep(10) - if(!D) - return - to_chat(D, "YE--") - sleep(1) - if(!D) - return - to_chat(world, "\"SLOTH, WRATH, GLUTTONY, ACEDIA, ENVY, GREED, PRIDE! FIRES OF HELL AWAKEN!!\"") - SEND_SOUND(world, sound('sound/hallucinations/veryfar_noise.ogg')) - give_appropriate_spells() - D.convert_to_archdevil() - if(istype(D.loc, /obj/effect/dummy/slaughter/)) - D.forceMove(get_turf(D))//Fixes dying while jaunted leaving you permajaunted. - var/area/A = get_area(owner.current) - if(A) - notify_ghosts("An arch devil has ascended in \the [A.name]. Reach out to the devil to be given a new shell for your soul.", source = owner.current, action=NOTIFY_ATTACK) - sleep(50) - if(!SSticker.mode.devil_ascended) - SSshuttle.emergency.request(null, set_coefficient = 0.3) - SSticker.mode.devil_ascended++ - form = ARCH_DEVIL - -/datum/antagonist/devil/proc/remove_spells() - for(var/X in owner.spell_list) - var/obj/effect/proc_holder/spell/S = X - if(is_type_in_typecache(S, devil_spells)) - owner.RemoveSpell(S) - -/datum/antagonist/devil/proc/give_summon_contract() - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/summon_contract(null)) - if(obligation == OBLIGATION_FIDDLE) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/conjure_item/violin(null)) - else if(obligation == OBLIGATION_DANCEOFF) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/summon_dancefloor(null)) - -/datum/antagonist/devil/proc/give_appropriate_spells() - remove_spells() - give_summon_contract() - if(SOULVALUE >= ARCH_THRESHOLD && ascendable) - give_arch_spells() - else if(SOULVALUE >= TRUE_THRESHOLD) - give_true_spells() - else if(SOULVALUE >= BLOOD_THRESHOLD) - give_blood_spells() - else if(SOULVALUE >= 0) - give_base_spells() - -/datum/antagonist/devil/proc/give_base_spells() - owner.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball/hellish(null)) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/conjure_item/summon_pitchfork(null)) - -/datum/antagonist/devil/proc/give_blood_spells() - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/conjure_item/summon_pitchfork(null)) - owner.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball/hellish(null)) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/infernal_jaunt(null)) - -/datum/antagonist/devil/proc/give_true_spells() - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/conjure_item/summon_pitchfork/greater(null)) - owner.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball/hellish(null)) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/infernal_jaunt(null)) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/sintouch(null)) - -/datum/antagonist/devil/proc/give_arch_spells() - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/conjure_item/summon_pitchfork/ascended(null)) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/sintouch/ascended(null)) - -/datum/antagonist/devil/proc/beginResurrectionCheck(mob/living/body) - if(SOULVALUE>0) - to_chat(owner.current, "Your body has been damaged to the point that you may no longer use it. At the cost of some of your power, you will return to life soon. Remain in your body.") - sleep(DEVILRESURRECTTIME) - if (!body || body.stat == DEAD) - if(SOULVALUE>0) - if(check_banishment(body)) - to_chat(owner.current, "Unfortunately, the mortals have finished a ritual that prevents your resurrection.") - return -1 - else - to_chat(owner.current, "WE LIVE AGAIN!") - return hellish_resurrection(body) - else - to_chat(owner.current, "Unfortunately, the power that stemmed from your contracts has been extinguished. You no longer have enough power to resurrect.") - return -1 - else - to_chat(owner.current, " You seem to have resurrected without your hellish powers.") - else - to_chat(owner.current, "Your hellish powers are too weak to resurrect yourself.") - -/datum/antagonist/devil/proc/check_banishment(mob/living/body) - switch(banish) - if(BANISH_WATER) - if(iscarbon(body)) - var/mob/living/carbon/H = body - return H.reagents.has_reagent("holy water") - return 0 - if(BANISH_COFFIN) - return (body && istype(body.loc, /obj/structure/closet/coffin)) - if(BANISH_FORMALDYHIDE) - if(iscarbon(body)) - var/mob/living/carbon/H = body - return H.reagents.has_reagent("formaldehyde") - return 0 - if(BANISH_RUNES) - if(body) - for(var/obj/effect/decal/cleanable/crayon/R in range(0,body)) - if (R.name == "rune") - return 1 - return 0 - if(BANISH_CANDLES) - if(body) - var/count = 0 - for(var/obj/item/candle/C in range(1,body)) - count += C.lit - if(count>=4) - return 1 - return 0 - if(BANISH_DESTRUCTION) - if(body) - return 0 - return 1 - if(BANISH_FUNERAL_GARB) - if(ishuman(body)) - var/mob/living/carbon/human/H = body - if(H.w_uniform && istype(H.w_uniform, /obj/item/clothing/under/burial)) - return 1 - return 0 - else - for(var/obj/item/clothing/under/burial/B in range(0,body)) - if(B.loc == get_turf(B)) //Make sure it's not in someone's inventory or something. - return 1 - return 0 - -/datum/antagonist/devil/proc/hellish_resurrection(mob/living/body) - message_admins("[owner.name] (true name is: [truename]) is resurrecting using hellish energy.
    ") - if(SOULVALUE < ARCH_THRESHOLD || !ascendable) // once ascended, arch devils do not go down in power by any means. - reviveNumber += LOSS_PER_DEATH - update_hud() - if(body) - body.revive(TRUE, TRUE) //Adminrevive also recovers organs, preventing someone from resurrecting without a heart. - if(istype(body.loc, /obj/effect/dummy/slaughter/)) - body.forceMove(get_turf(body))//Fixes dying while jaunted leaving you permajaunted. - if(istype(body, /mob/living/carbon/true_devil)) - var/mob/living/carbon/true_devil/D = body - if(D.oldform) - D.oldform.revive(1,0) // Heal the old body too, so the devil doesn't resurrect, then immediately regress into a dead body. - if(body.stat == DEAD) - create_new_body() - else - create_new_body() - check_regression() - -/datum/antagonist/devil/proc/create_new_body() - if(GLOB.blobstart.len > 0) - var/turf/targetturf = get_turf(pick(GLOB.blobstart)) - var/mob/currentMob = owner.current - if(!currentMob) - currentMob = owner.get_ghost() - if(!currentMob) - message_admins("[owner.name]'s devil resurrection failed due to client logoff. Aborting.") - return -1 - if(currentMob.mind != owner) - message_admins("[owner.name]'s devil resurrection failed due to becoming a new mob. Aborting.") - return -1 - currentMob.change_mob_type( /mob/living/carbon/human, targetturf, null, 1) - var/mob/living/carbon/human/H = owner.current - H.equip_to_slot_or_del(new /obj/item/clothing/under/lawyer/black(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes) - H.equip_to_slot_or_del(new /obj/item/storage/briefcase(H), slot_hands) - H.equip_to_slot_or_del(new /obj/item/pen(H), slot_l_store) - if(SOULVALUE >= BLOOD_THRESHOLD) - H.set_species(/datum/species/lizard, 1) - H.underwear = "Nude" - H.undershirt = "Nude" - H.socks = "Nude" - H.dna.features["mcolor"] = "511" - H.regenerate_icons() - if(SOULVALUE >= TRUE_THRESHOLD) //Yes, BOTH this and the above if statement are to run if soulpower is high enough. - var/mob/living/carbon/true_devil/A = new /mob/living/carbon/true_devil(targetturf) - A.faction |= "hell" - H.forceMove(A) - A.oldform = H - owner.transfer_to(A, TRUE) - A.set_name() - if(SOULVALUE >= ARCH_THRESHOLD && ascendable) - A.convert_to_archdevil() - else - throw EXCEPTION("Unable to find a blobstart landmark for hellish resurrection") - - -/datum/antagonist/devil/proc/update_hud() - if(iscarbon(owner.current)) - var/mob/living/C = owner.current - if(C.hud_used && C.hud_used.devilsouldisplay) - C.hud_used.devilsouldisplay.update_counter(SOULVALUE) - -/datum/antagonist/devil/greet() - to_chat(owner.current, "You remember your link to the infernal. You are [truename], an agent of hell, a devil. And you were sent to the plane of creation for a reason. A greater purpose. Convince the crew to sin, and embroiden Hell's grasp.") - to_chat(owner.current, "However, your infernal form is not without weaknesses.") - to_chat(owner.current, "You may not use violence to coerce someone into selling their soul.") - to_chat(owner.current, "You may not directly and knowingly physically harm a devil, other than yourself.") - to_chat(owner.current, GLOB.lawlorify[LAW][bane]) - to_chat(owner.current, GLOB.lawlorify[LAW][ban]) - to_chat(owner.current, GLOB.lawlorify[LAW][obligation]) - to_chat(owner.current, GLOB.lawlorify[LAW][banish]) - to_chat(owner.current, "Remember, the crew can research your weaknesses if they find out your devil name.
    ") - .=..() - -/datum/antagonist/devil/on_gain() - truename = randomDevilName() - ban = randomdevilban() - bane = randomdevilbane() - obligation = randomdevilobligation() - banish = randomdevilbanish() - GLOB.allDevils[lowertext(truename)] = src - - antag_memory += "Your devilic true name is [truename]
    [GLOB.lawlorify[LAW][ban]]
    You may not use violence to coerce someone into selling their soul.
    You may not directly and knowingly physically harm a devil, other than yourself.
    [GLOB.lawlorify[LAW][bane]]
    [GLOB.lawlorify[LAW][obligation]]
    [GLOB.lawlorify[LAW][banish]]
    " - if(issilicon(owner.current)) - var/mob/living/silicon/robot_devil = owner.current - var/laws = list("You may not use violence to coerce someone into selling their soul.", "You may not directly and knowingly physically harm a devil, other than yourself.", GLOB.lawlorify[LAW][ban], GLOB.lawlorify[LAW][obligation], "Accomplish your objectives at all costs.") - robot_devil.set_law_sixsixsix(laws) - sleep(10) - if(owner.assigned_role == "Clown" && ishuman(owner.current)) - var/mob/living/carbon/human/S = owner.current - to_chat(S, "Your infernal nature has allowed you to overcome your clownishness.") - S.dna.remove_mutation(CLOWNMUT) - .=..() - -/datum/antagonist/devil/on_removal() - to_chat(owner.current, "Your infernal link has been severed! You are no longer a devil!") - .=..() - -/datum/antagonist/devil/apply_innate_effects(mob/living/mob_override) - give_appropriate_spells() - owner.current.grant_all_languages(TRUE) - update_hud() - .=..() - -/datum/antagonist/devil/remove_innate_effects(mob/living/mob_override) - for(var/X in owner.spell_list) - var/obj/effect/proc_holder/spell/S = X - if(is_type_in_typecache(S, devil_spells)) - owner.RemoveSpell(S) - .=..() - -/datum/antagonist/devil/proc/printdevilinfo() - var/list/parts = list() - parts += "The devil's true name is: [truename]" - parts += "The devil's bans were:" - parts += "[GLOB.TAB][GLOB.lawlorify[LORE][ban]]" - parts += "[GLOB.TAB][GLOB.lawlorify[LORE][bane]]" - parts += "[GLOB.TAB][GLOB.lawlorify[LORE][obligation]]" - parts += "[GLOB.TAB][GLOB.lawlorify[LORE][banish]]" - return parts.Join("
    ") - -/datum/antagonist/devil/roundend_report() - var/list/parts = list() - parts += printplayer(owner) - parts += printdevilinfo() - parts += printobjectives(owner) - return parts.Join("
    ") - -/datum/antagonist/devil/roundend_report_footer() - //sintouched go here for now as a hack , TODO proper antag datum for these - var/list/parts = list() - if(SSticker.mode.sintouched.len) - parts += "The sintouched were:" - var/list/sintouchedUnique = uniqueList(SSticker.mode.sintouched) - for(var/S in sintouchedUnique) - var/datum/mind/sintouched_mind = S - parts += printplayer(sintouched_mind) - parts += printobjectives(sintouched_mind) - return parts.Join("
    ") - -//A simple super light weight datum for the codex gigas. -/datum/fakeDevil - var/truename - var/bane - var/obligation - var/ban - var/banish - var/ascendable - -/datum/fakeDevil/New(name = randomDevilName()) - truename = name - bane = randomdevilbane() - obligation = randomdevilobligation() - ban = randomdevilban() - banish = randomdevilbanish() - ascendable = prob(25) diff --git a/code/datums/antagonists/internal_affairs.dm b/code/datums/antagonists/internal_affairs.dm deleted file mode 100644 index 9077b84dcd..0000000000 --- a/code/datums/antagonists/internal_affairs.dm +++ /dev/null @@ -1,302 +0,0 @@ -#define PINPOINTER_MINIMUM_RANGE 15 -#define PINPOINTER_EXTRA_RANDOM_RANGE 10 -#define PINPOINTER_PING_TIME 40 -#define PROB_ACTUAL_TRAITOR 20 -#define TRAITOR_AGENT_ROLE "Syndicate External Affairs Agent" - -/datum/antagonist/traitor/internal_affairs - name = "Internal Affairs Agent" - human_datum = /datum/antagonist/traitor/human/internal_affairs - ai_datum = /datum/antagonist/traitor/AI/internal_affairs - antagpanel_category = "IAA" - -/datum/antagonist/traitor/AI/internal_affairs - name = "Internal Affairs Agent" - employer = "Nanotrasen" - special_role = "internal affairs agent" - antagpanel_category = "IAA" - var/syndicate = FALSE - var/last_man_standing = FALSE - var/list/datum/mind/targets_stolen - - -/datum/antagonist/traitor/human/internal_affairs - name = "Internal Affairs Agent" - employer = "Nanotrasen" - special_role = "internal affairs agent" - antagpanel_category = "IAA" - var/syndicate = FALSE - var/last_man_standing = FALSE - var/list/datum/mind/targets_stolen - - -/datum/antagonist/traitor/human/internal_affairs/proc/give_pinpointer() - if(owner && owner.current) - owner.current.apply_status_effect(/datum/status_effect/agent_pinpointer) - -/datum/antagonist/traitor/human/internal_affairs/apply_innate_effects() - .=..() //in case the base is used in future - if(owner && owner.current) - give_pinpointer(owner.current) - -/datum/antagonist/traitor/human/internal_affairs/remove_innate_effects() - .=..() - if(owner && owner.current) - owner.current.remove_status_effect(/datum/status_effect/agent_pinpointer) - -/datum/antagonist/traitor/human/internal_affairs/on_gain() - START_PROCESSING(SSprocessing, src) - .=..() -/datum/antagonist/traitor/human/internal_affairs/on_removal() - STOP_PROCESSING(SSprocessing,src) - .=..() -/datum/antagonist/traitor/human/internal_affairs/process() - iaa_process() - -/datum/antagonist/traitor/AI/internal_affairs/on_gain() - START_PROCESSING(SSprocessing, src) - .=..() -/datum/antagonist/traitor/AI/internal_affairs/on_removal() - STOP_PROCESSING(SSprocessing,src) - .=..() -/datum/antagonist/traitor/AI/internal_affairs/process() - iaa_process() - -/datum/status_effect/agent_pinpointer - id = "agent_pinpointer" - duration = -1 - tick_interval = PINPOINTER_PING_TIME - alert_type = /obj/screen/alert/status_effect/agent_pinpointer - var/minimum_range = PINPOINTER_MINIMUM_RANGE - var/mob/scan_target = null - -/obj/screen/alert/status_effect/agent_pinpointer - name = "Internal Affairs Integrated Pinpointer" - desc = "Even stealthier than a normal implant." - icon = 'icons/obj/device.dmi' - icon_state = "pinon" - -/datum/status_effect/agent_pinpointer/proc/point_to_target() //If we found what we're looking for, show the distance and direction - if(!scan_target) - linked_alert.icon_state = "pinonnull" - return - var/turf/here = get_turf(owner) - var/turf/there = get_turf(scan_target) - if(here.z != there.z) - linked_alert.icon_state = "pinonnull" - return - if(get_dist_euclidian(here,there)<=minimum_range + rand(0, PINPOINTER_EXTRA_RANDOM_RANGE)) - linked_alert.icon_state = "pinondirect" - else - linked_alert.setDir(get_dir(here, there)) - switch(get_dist(here, there)) - if(1 to 8) - linked_alert.icon_state = "pinonclose" - if(9 to 16) - linked_alert.icon_state = "pinonmedium" - if(16 to INFINITY) - linked_alert.icon_state = "pinonfar" - -/datum/status_effect/agent_pinpointer/proc/scan_for_target() - scan_target = null - if(owner) - if(owner.mind) - if(owner.mind.objectives) - for(var/datum/objective/objective_ in owner.mind.objectives) - if(!is_internal_objective(objective_)) - continue - var/datum/objective/assassinate/internal/objective = objective_ - var/mob/current = objective.target.current - if(current&¤t.stat!=DEAD) - scan_target = current - break - -/datum/status_effect/agent_pinpointer/tick() - if(!owner) - qdel(src) - return - scan_for_target() - point_to_target() - - -/proc/is_internal_objective(datum/objective/O) - return (istype(O, /datum/objective/assassinate/internal)||istype(O, /datum/objective/destroy/internal)) - -/datum/antagonist/traitor/proc/replace_escape_objective() - if(!owner||!owner.objectives) - return - for (var/objective_ in owner.objectives) - if(!(istype(objective_, /datum/objective/escape)||istype(objective_, /datum/objective/survive))) - continue - remove_objective(objective_) - - var/datum/objective/martyr/martyr_objective = new - martyr_objective.owner = owner - add_objective(martyr_objective) - -/datum/antagonist/traitor/proc/reinstate_escape_objective() - if(!owner||!owner.objectives) - return - for (var/objective_ in owner.objectives) - if(!istype(objective_, /datum/objective/martyr)) - continue - remove_objective(objective_) - -/datum/antagonist/traitor/human/internal_affairs/reinstate_escape_objective() - ..() - var/datum/objective/escape/escape_objective = new - escape_objective.owner = owner - add_objective(escape_objective) - -/datum/antagonist/traitor/AI/internal_affairs/reinstate_escape_objective() - ..() - var/datum/objective/survive/survive_objective = new - survive_objective.owner = owner - add_objective(survive_objective) - -/datum/antagonist/traitor/proc/steal_targets(datum/mind/victim) - var/datum/antagonist/traitor/human/internal_affairs/this = src //Should only use this if IAA - - if(!owner.current||owner.current.stat==DEAD) - return - to_chat(owner.current, " Target eliminated: [victim.name]") - for(var/objective_ in victim.objectives) - if(istype(objective_, /datum/objective/assassinate/internal)) - var/datum/objective/assassinate/internal/objective = objective_ - if(objective.target==owner) - continue - else if(this.targets_stolen.Find(objective.target) == 0) - var/datum/objective/assassinate/internal/new_objective = new - new_objective.owner = owner - new_objective.target = objective.target - new_objective.update_explanation_text() - add_objective(new_objective) - this.targets_stolen += objective.target - var/status_text = objective.check_completion() ? "neutralised" : "active" - to_chat(owner.current, " New target added to database: [objective.target.name] ([status_text]) ") - else if(istype(objective_, /datum/objective/destroy/internal)) - var/datum/objective/destroy/internal/objective = objective_ - var/datum/objective/destroy/internal/new_objective = new - if(objective.target==owner) - continue - else if(this.targets_stolen.Find(objective.target) == 0) - new_objective.owner = owner - new_objective.target = objective.target - new_objective.update_explanation_text() - add_objective(new_objective) - this.targets_stolen += objective.target - var/status_text = objective.check_completion() ? "neutralised" : "active" - to_chat(owner.current, " New target added to database: [objective.target.name] ([status_text]) ") - this.last_man_standing = TRUE - for(var/objective_ in owner.objectives) - if(!is_internal_objective(objective_)) - continue - var/datum/objective/assassinate/internal/objective = objective_ - if(!objective.check_completion()) - this.last_man_standing = FALSE - return - if(this.last_man_standing) - if(this.syndicate) - to_chat(owner.current," All the loyalist agents are dead, and no more is required of you. Die a glorious death, agent. ") - else - to_chat(owner.current," All the other agents are dead, and you're the last loose end. Stage a Syndicate terrorist attack to cover up for today's events. You no longer have any limits on collateral damage.") - replace_escape_objective(owner) - -/datum/antagonist/traitor/proc/iaa_process() - var/datum/antagonist/traitor/human/internal_affairs/this = src //Should only use this if IAA - if(owner&&owner.current&&owner.current.stat!=DEAD) - for(var/objective_ in owner.objectives) - if(!is_internal_objective(objective_)) - continue - var/datum/objective/assassinate/internal/objective = objective_ - if(!objective.target) - continue - if(objective.check_completion()) - if(objective.stolen) - continue - else - steal_targets(objective.target) - objective.stolen = TRUE - else - if(objective.stolen) - var/fail_msg = "Your sensors tell you that [objective.target.current.real_name], one of the targets you were meant to have killed, pulled one over on you, and is still alive - do the job properly this time! " - if(this.last_man_standing) - if(this.syndicate) - fail_msg += " You no longer have permission to die. " - else - fail_msg += " The truth could still slip out!
    Cease any terrorist actions as soon as possible, unneeded property damage or loss of employee life will lead to your contract being terminated." - reinstate_escape_objective(owner) - this.last_man_standing = FALSE - to_chat(owner.current, fail_msg) - objective.stolen = FALSE - -/datum/antagonist/traitor/proc/forge_iaa_objectives() - var/datum/antagonist/traitor/human/internal_affairs/this = src //Should only use this if IAA - if(SSticker.mode.target_list.len && SSticker.mode.target_list[owner]) // Is a double agent - - // Assassinate - var/datum/mind/target_mind = SSticker.mode.target_list[owner] - if(issilicon(target_mind.current)) - var/datum/objective/destroy/internal/destroy_objective = new - destroy_objective.owner = owner - destroy_objective.target = target_mind - destroy_objective.update_explanation_text() - else - var/datum/objective/assassinate/internal/kill_objective = new - kill_objective.owner = owner - kill_objective.target = target_mind - kill_objective.update_explanation_text() - add_objective(kill_objective) - - //Optional traitor objective - if(prob(PROB_ACTUAL_TRAITOR)) - employer = "The Syndicate" - owner.special_role = TRAITOR_AGENT_ROLE - special_role = TRAITOR_AGENT_ROLE - this.syndicate = TRUE - forge_single_objective() - - else - ..() // Give them standard objectives. - return - -/datum/antagonist/traitor/human/internal_affairs/forge_traitor_objectives() - forge_iaa_objectives() - var/datum/objective/escape/escape_objective = new - escape_objective.owner = owner - add_objective(escape_objective) - -/datum/antagonist/traitor/AI/internal_affairs/forge_traitor_objectives() - forge_iaa_objectives() - var/datum/objective/survive/survive_objective = new - survive_objective.owner = owner - add_objective(survive_objective) - -/datum/antagonist/traitor/proc/greet_iaa() - var/datum/antagonist/traitor/human/internal_affairs/this = src //Should only use this if IAA - var/crime = pick("distribution of contraband" , "unauthorized erotic action on duty", "embezzlement", "piloting under the influence", "dereliction of duty", "syndicate collaboration", "mutiny", "multiple homicides", "corporate espionage", "recieving bribes", "malpractice", "worship of prohbited life forms", "possession of profane texts", "murder", "arson", "insulting their manager", "grand theft", "conspiracy", "attempting to unionize", "vandalism", "gross incompetence") - - to_chat(owner.current, "You are the [special_role].") - if(this.syndicate) - to_chat(owner.current, "Your target has been framed for [crime], and you have been tasked with eliminating them to prevent them defending themselves in court.") - to_chat(owner.current, "Any damage you cause will be a further embarrassment to Nanotrasen, so you have no limits on collateral damage.") - to_chat(owner.current, " You have been provided with a standard uplink to accomplish your task. ") - else - to_chat(owner.current, "Your target is suspected of [crime], and you have been tasked with eliminating them by any means necessary to avoid a costly and embarrassing public trial.") - to_chat(owner.current, "While you have a license to kill, unneeded property damage or loss of employee life will lead to your contract being terminated.") - to_chat(owner.current, "For the sake of plausible deniability, you have been equipped with an array of captured Syndicate weaponry available via uplink.") - - to_chat(owner.current, "Finally, watch your back. Your target has friends in high places, and intel suggests someone may have taken out a contract of their own to protect them.") - owner.announce_objectives() - -/datum/antagonist/traitor/AI/internal_affairs/greet() - greet_iaa() - -/datum/antagonist/traitor/human/internal_affairs/greet() - greet_iaa() - - -#undef PROB_ACTUAL_TRAITOR -#undef PINPOINTER_EXTRA_RANDOM_RANGE -#undef PINPOINTER_MINIMUM_RANGE -#undef PINPOINTER_PING_TIME diff --git a/code/datums/antagonists/monkey.dm b/code/datums/antagonists/monkey.dm deleted file mode 100644 index 25e80f6afb..0000000000 --- a/code/datums/antagonists/monkey.dm +++ /dev/null @@ -1,214 +0,0 @@ -#define MONKEYS_ESCAPED 1 -#define MONKEYS_LIVED 2 -#define MONKEYS_DIED 3 -#define DISEASE_LIVED 4 - -/datum/antagonist/monkey - name = "Monkey" - job_rank = ROLE_MONKEY - roundend_category = "monkeys" - antagpanel_category = "Monkey" - var/datum/team/monkey/monkey_team - var/monkey_only = TRUE - -/datum/antagonist/monkey/can_be_owned(datum/mind/new_owner) - return ..() && (!monkey_only || ismonkey(new_owner.current)) - -/datum/antagonist/monkey/get_team() - return monkey_team - -/datum/antagonist/monkey/on_gain() - . = ..() - SSticker.mode.ape_infectees += owner - owner.special_role = "Infected Monkey" - - var/datum/disease/D = new /datum/disease/transformation/jungle_fever/monkeymode - if(!owner.current.HasDisease(D)) - owner.current.ForceContractDisease(D) - else - QDEL_NULL(D) - -/datum/antagonist/monkey/greet() - to_chat(owner, "You are a monkey now!") - to_chat(owner, "Bite humans to infect them, follow the orders of the monkey leaders, and help fellow monkeys!") - to_chat(owner, "Ensure at least one infected monkey escapes on the Emergency Shuttle!") - to_chat(owner, "As an intelligent monkey, you know how to use technology and how to ventcrawl while wearing things.") - to_chat(owner, "You can use :k to talk to fellow monkeys!") - SEND_SOUND(owner.current, sound('sound/ambience/antag/monkey.ogg')) - -/datum/antagonist/monkey/on_removal() - owner.special_role = null - SSticker.mode.ape_infectees -= owner - - var/datum/disease/transformation/jungle_fever/D = locate() in owner.current.viruses - if(D) - D.remove_virus() - qdel(D) - - . = ..() - -/datum/antagonist/monkey/create_team(datum/team/monkey/new_team) - if(!new_team) - for(var/datum/antagonist/monkey/H in GLOB.antagonists) - if(!H.owner) - continue - if(H.monkey_team) - monkey_team = H.monkey_team - return - monkey_team = new /datum/team/monkey - monkey_team.update_objectives() - return - if(!istype(new_team)) - stack_trace("Wrong team type passed to [type] initialization.") - monkey_team = new_team - -/datum/antagonist/monkey/proc/forge_objectives() - objectives |= monkey_team.objectives - owner.objectives |= objectives - -/datum/antagonist/monkey/admin_remove(mob/admin) - var/mob/living/carbon/monkey/M = owner.current - if(istype(M)) - switch(alert(admin, "Humanize?", "Humanize", "Yes", "No")) - if("Yes") - if(admin == M) - admin = M.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_DEFAULTMSG) - else - M.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_DEFAULTMSG) - if("No") - //nothing - else - return - . = ..() - -/datum/antagonist/monkey/leader - name = "Monkey Leader" - monkey_only = FALSE - -/datum/antagonist/monkey/leader/admin_add(datum/mind/new_owner,mob/admin) - var/mob/living/carbon/human/H = new_owner.current - if(istype(H)) - switch(alert(admin, "Monkeyize?", "Monkeyize", "Yes", "No")) - if("Yes") - if(admin == H) - admin = H.monkeyize() - else - H.monkeyize() - if("No") - //nothing - else - return - new_owner.add_antag_datum(src) - log_admin("[key_name(admin)] made [key_name(new_owner.current)] a monkey leader!") - message_admins("[key_name_admin(admin)] made [key_name_admin(new_owner.current)] a monkey leader!") - -/datum/antagonist/monkey/leader/on_gain() - . = ..() - var/obj/item/organ/heart/freedom/F = new - F.Insert(owner.current, drop_if_replaced = FALSE) - SSticker.mode.ape_leaders += owner - owner.special_role = "Monkey Leader" - -/datum/antagonist/monkey/leader/on_removal() - SSticker.mode.ape_leaders -= owner - var/obj/item/organ/heart/H = new - H.Insert(owner.current, drop_if_replaced = FALSE) //replace freedom heart with normal heart - - . = ..() - -/datum/antagonist/monkey/leader/greet() - to_chat(owner, "You are the Jungle Fever patient zero!!") - to_chat(owner, "You have been planted onto this station by the Animal Rights Consortium.") - to_chat(owner, "Soon the disease will transform you into an ape. Afterwards, you will be able spread the infection to others with a bite.") - to_chat(owner, "While your infection strain is undetectable by scanners, any other infectees will show up on medical equipment.") - to_chat(owner, "Your mission will be deemed a success if any of the live infected monkeys reach CentCom.") - to_chat(owner, "As an initial infectee, you will be considered a 'leader' by your fellow monkeys.") - to_chat(owner, "You can use :k to talk to fellow monkeys!") - SEND_SOUND(owner.current, sound('sound/ambience/antag/monkey.ogg')) - -/datum/objective/monkey - explanation_text = "Ensure that infected monkeys escape on the emergency shuttle!" - martyr_compatible = TRUE - var/monkeys_to_win = 1 - var/escaped_monkeys = 0 - -/datum/objective/monkey/check_completion() - var/datum/disease/D = new /datum/disease/transformation/jungle_fever() - for(var/mob/living/carbon/monkey/M in GLOB.alive_mob_list) - if (M.HasDisease(D) && (M.onCentCom() || M.onSyndieBase())) - escaped_monkeys++ - if(escaped_monkeys >= monkeys_to_win) - return TRUE - return FALSE - -/datum/team/monkey - name = "Monkeys" - -/datum/team/monkey/proc/update_objectives() - objectives = list() - var/datum/objective/monkey/O = new() - O.team = src - objectives += O - -/datum/team/monkey/proc/infected_monkeys_alive() - var/datum/disease/D = new /datum/disease/transformation/jungle_fever() - for(var/mob/living/carbon/monkey/M in GLOB.alive_mob_list) - if(M.HasDisease(D)) - return TRUE - return FALSE - -/datum/team/monkey/proc/infected_monkeys_escaped() - var/datum/disease/D = new /datum/disease/transformation/jungle_fever() - for(var/mob/living/carbon/monkey/M in GLOB.alive_mob_list) - if(M.HasDisease(D) && (M.onCentCom() || M.onSyndieBase())) - return TRUE - return FALSE - -/datum/team/monkey/proc/infected_humans_escaped() - var/datum/disease/D = new /datum/disease/transformation/jungle_fever() - for(var/mob/living/carbon/human/M in GLOB.alive_mob_list) - if(M.HasDisease(D) && (M.onCentCom() || M.onSyndieBase())) - return TRUE - return FALSE - -/datum/team/monkey/proc/infected_humans_alive() - var/datum/disease/D = new /datum/disease/transformation/jungle_fever() - for(var/mob/living/carbon/human/M in GLOB.alive_mob_list) - if(M.HasDisease(D)) - return TRUE - return FALSE - -/datum/team/monkey/proc/get_result() - if(infected_monkeys_escaped()) - return MONKEYS_ESCAPED - if(infected_monkeys_alive()) - return MONKEYS_LIVED - if(infected_humans_alive() || infected_humans_escaped()) - return DISEASE_LIVED - return MONKEYS_DIED - -/datum/team/monkey/roundend_report() - var/list/parts = list() - switch(get_result()) - if(MONKEYS_ESCAPED) - parts += "Monkey Major Victory!" - parts += "Central Command and [station_name()] were taken over by the monkeys! Ook ook!" - if(MONKEYS_LIVED) - parts += "Monkey Minor Victory!" - parts += "[station_name()] was taken over by the monkeys! Ook ook!" - if(DISEASE_LIVED) - parts += "Monkey Minor Defeat!" - parts += "All the monkeys died, but the disease lives on! The future is uncertain." - if(MONKEYS_DIED) - parts += "Monkey Major Defeat!" - parts += "All the monkeys died, and Jungle Fever was wiped out!" - var/list/leaders = get_antagonists(/datum/antagonist/monkey/leader, TRUE) - var/list/monkeys = get_antagonists(/datum/antagonist/monkey, TRUE) - - if(LAZYLEN(leaders)) - parts += "The monkey leaders were:" - parts += printplayerlist(SSticker.mode.ape_leaders) - if(LAZYLEN(monkeys)) - parts += "The monkeys were:" - parts += printplayerlist(SSticker.mode.ape_infectees) - return "
    [parts.Join("
    ")]
    " diff --git a/code/datums/antagonists/ninja.dm b/code/datums/antagonists/ninja.dm deleted file mode 100644 index e8a1c140ea..0000000000 --- a/code/datums/antagonists/ninja.dm +++ /dev/null @@ -1,155 +0,0 @@ -/datum/antagonist/ninja - name = "Ninja" - antagpanel_category = "Ninja" - job_rank = ROLE_NINJA - var/helping_station = FALSE - var/give_objectives = TRUE - var/give_equipment = TRUE - - -/datum/antagonist/ninja/apply_innate_effects(mob/living/mob_override) - var/mob/living/M = mob_override || owner.current - update_ninja_icons_added(M) - -/datum/antagonist/ninja/remove_innate_effects(mob/living/mob_override) - var/mob/living/M = mob_override || owner.current - update_ninja_icons_removed(M) - -/datum/antagonist/ninja/proc/equip_space_ninja(mob/living/carbon/human/H = owner.current) - return H.equipOutfit(/datum/outfit/ninja) - -/datum/antagonist/ninja/proc/addMemories() - antag_memory += "I am an elite mercenary assassin of the mighty Spider Clan. A SPACE NINJA!
    " - antag_memory += "Surprise is my weapon. Shadows are my armor. Without them, I am nothing. (//initialize your suit by right clicking on it, to use abilities like stealth)!
    " - antag_memory += "Officially, [helping_station?"Nanotrasen":"The Syndicate"] are my employer.
    " - -/datum/antagonist/ninja/proc/addObjectives(quantity = 6) - var/list/possible_targets = list() - for(var/datum/mind/M in SSticker.minds) - if(M.current && M.current.stat != DEAD) - if(ishuman(M.current)) - if(M.special_role) - possible_targets[M] = 0 //bad-guy - else if(M.assigned_role in GLOB.command_positions) - possible_targets[M] = 1 //good-guy - - var/list/possible_objectives = list(1,2,3,4) - - while(objectives.len < quantity) - switch(pick_n_take(possible_objectives)) - if(1) //research - var/datum/objective/download/O = new /datum/objective/download() - O.owner = owner - O.gen_amount_goal() - objectives += O - - if(2) //steal - var/datum/objective/steal/special/O = new /datum/objective/steal/special() - O.owner = owner - objectives += O - - if(3) //protect/kill - if(!possible_targets.len) continue - var/index = rand(1,possible_targets.len) - var/datum/mind/M = possible_targets[index] - var/is_bad_guy = possible_targets[M] - possible_targets.Cut(index,index+1) - - if(is_bad_guy ^ helping_station) //kill (good-ninja + bad-guy or bad-ninja + good-guy) - var/datum/objective/assassinate/O = new /datum/objective/assassinate() - O.owner = owner - O.target = M - O.explanation_text = "Slay \the [M.current.real_name], the [M.assigned_role]." - objectives += O - else //protect - var/datum/objective/protect/O = new /datum/objective/protect() - O.owner = owner - O.target = M - O.explanation_text = "Protect \the [M.current.real_name], the [M.assigned_role], from harm." - objectives += O - if(4) //debrain/capture - if(!possible_targets.len) continue - var/selected = rand(1,possible_targets.len) - var/datum/mind/M = possible_targets[selected] - var/is_bad_guy = possible_targets[M] - possible_targets.Cut(selected,selected+1) - - if(is_bad_guy ^ helping_station) //debrain (good-ninja + bad-guy or bad-ninja + good-guy) - var/datum/objective/debrain/O = new /datum/objective/debrain() - O.owner = owner - O.target = M - O.explanation_text = "Steal the brain of [M.current.real_name]." - objectives += O - else //capture - var/datum/objective/capture/O = new /datum/objective/capture() - O.owner = owner - O.gen_amount_goal() - objectives += O - else - break - var/datum/objective/O = new /datum/objective/survive() - O.owner = owner - owner.objectives |= objectives - - -/proc/remove_ninja(mob/living/L) - if(!L || !L.mind) - return FALSE - var/datum/antagonist/datum = L.mind.has_antag_datum(/datum/antagonist/ninja) - datum.on_removal() - return TRUE - -/proc/is_ninja(mob/living/M) - return M && M.mind && M.mind.has_antag_datum(/datum/antagonist/ninja) - - -/datum/antagonist/ninja/greet() - SEND_SOUND(owner.current, sound('sound/effects/ninja_greeting.ogg')) - to_chat(owner.current, "I am an elite mercenary assassin of the mighty Spider Clan. A SPACE NINJA!") - to_chat(owner.current, "Surprise is my weapon. Shadows are my armor. Without them, I am nothing. (//initialize your suit by right clicking on it, to use abilities like stealth)!") - to_chat(owner.current, "Officially, [helping_station?"Nanotrasen":"The Syndicate"] are my employer.") - return - -/datum/antagonist/ninja/on_gain() - if(give_objectives) - addObjectives() - addMemories() - if(give_equipment) - equip_space_ninja(owner.current) - . = ..() - -/datum/antagonist/ninja/admin_add(datum/mind/new_owner,mob/admin) - var/adj - switch(input("What kind of ninja?", "Ninja") as null|anything in list("Random","Syndicate","Nanotrasen","No objectives")) - if("Random") - helping_station = pick(TRUE,FALSE) - adj = "" - if("Syndicate") - helping_station = FALSE - adj = "syndie" - if("Nanotrasen") - helping_station = TRUE - adj = "friendly" - if("No objectives") - give_objectives = FALSE - adj = "objectiveless" - else - return - new_owner.assigned_role = ROLE_NINJA - new_owner.special_role = ROLE_NINJA - new_owner.add_antag_datum(src) - message_admins("[key_name_admin(admin)] has [adj] ninja'ed [new_owner.current].") - log_admin("[key_name(admin)] has [adj] ninja'ed [new_owner.current].") - -/datum/antagonist/ninja/antag_listing_name() - return ..() + "(Ninja)" - -/datum/antagonist/ninja/proc/update_ninja_icons_added(var/mob/living/carbon/human/ninja) - var/datum/atom_hud/antag/ninjahud = GLOB.huds[ANTAG_HUD_NINJA] - ninjahud.join_hud(ninja) - set_antag_hud(ninja, "ninja") - -/datum/antagonist/ninja/proc/update_ninja_icons_removed(var/mob/living/carbon/human/ninja) - var/datum/atom_hud/antag/ninjahud = GLOB.huds[ANTAG_HUD_NINJA] - ninjahud.leave_hud(ninja) - set_antag_hud(ninja, null) \ No newline at end of file diff --git a/code/datums/antagonists/nukeop.dm b/code/datums/antagonists/nukeop.dm deleted file mode 100644 index 1ec2e77f64..0000000000 --- a/code/datums/antagonists/nukeop.dm +++ /dev/null @@ -1,379 +0,0 @@ -#define NUKE_RESULT_FLUKE 0 -#define NUKE_RESULT_NUKE_WIN 1 -#define NUKE_RESULT_CREW_WIN 2 -#define NUKE_RESULT_CREW_WIN_SYNDIES_DEAD 3 -#define NUKE_RESULT_DISK_LOST 4 -#define NUKE_RESULT_DISK_STOLEN 5 -#define NUKE_RESULT_NOSURVIVORS 6 -#define NUKE_RESULT_WRONG_STATION 7 -#define NUKE_RESULT_WRONG_STATION_DEAD 8 - -/datum/antagonist/nukeop - name = "Nuclear Operative" - roundend_category = "syndicate operatives" //just in case - antagpanel_category = "NukeOp" - job_rank = ROLE_OPERATIVE - var/datum/team/nuclear/nuke_team - var/always_new_team = FALSE //If not assigned a team by default ops will try to join existing ones, set this to TRUE to always create new team. - var/send_to_spawnpoint = TRUE //Should the user be moved to default spawnpoint. - var/nukeop_outfit = /datum/outfit/syndicate - -/datum/antagonist/nukeop/proc/update_synd_icons_added(mob/living/M) - var/datum/atom_hud/antag/opshud = GLOB.huds[ANTAG_HUD_OPS] - opshud.join_hud(M) - set_antag_hud(M, "synd") - -/datum/antagonist/nukeop/proc/update_synd_icons_removed(mob/living/M) - var/datum/atom_hud/antag/opshud = GLOB.huds[ANTAG_HUD_OPS] - opshud.leave_hud(M) - set_antag_hud(M, null) - -/datum/antagonist/nukeop/apply_innate_effects(mob/living/mob_override) - var/mob/living/M = mob_override || owner.current - update_synd_icons_added(M) - -/datum/antagonist/nukeop/remove_innate_effects(mob/living/mob_override) - var/mob/living/M = mob_override || owner.current - update_synd_icons_removed(M) - -/datum/antagonist/nukeop/proc/equip_op() - if(!ishuman(owner.current)) - return - var/mob/living/carbon/human/H = owner.current - - H.set_species(/datum/species/human) //Plasamen burn up otherwise, and lizards are vulnerable to asimov AIs - - H.equipOutfit(nukeop_outfit) - return TRUE - -/datum/antagonist/nukeop/greet() - owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ops.ogg',100,0) - to_chat(owner, "You are a [nuke_team ? nuke_team.syndicate_name : "syndicate"] agent!") - owner.announce_objectives() - return - -/datum/antagonist/nukeop/on_gain() - give_alias() - forge_objectives() - . = ..() - equip_op() - memorize_code() - if(send_to_spawnpoint) - move_to_spawnpoint() - -/datum/antagonist/nukeop/get_team() - return nuke_team - -/datum/antagonist/nukeop/proc/assign_nuke() - if(nuke_team && !nuke_team.tracked_nuke) - nuke_team.memorized_code = random_nukecode() - var/obj/machinery/nuclearbomb/syndicate/nuke = locate() in GLOB.nuke_list - if(nuke) - nuke_team.tracked_nuke = nuke - if(nuke.r_code == "ADMIN") - nuke.r_code = nuke_team.memorized_code - else //Already set by admins/something else? - nuke_team.memorized_code = nuke.r_code - else - stack_trace("Syndicate nuke not found during nuke team creation.") - nuke_team.memorized_code = null - -/datum/antagonist/nukeop/proc/give_alias() - if(nuke_team && nuke_team.syndicate_name) - var/number = 1 - number = nuke_team.members.Find(owner) - owner.current.real_name = "[nuke_team.syndicate_name] Operative #[number]" - -/datum/antagonist/nukeop/proc/memorize_code() - if(nuke_team && nuke_team.tracked_nuke && nuke_team.memorized_code) - antag_memory += "[nuke_team.tracked_nuke] Code: [nuke_team.memorized_code]
    " - to_chat(owner, "The nuclear authorization code is: [nuke_team.memorized_code]") - else - to_chat(owner, "Unfortunately the syndicate was unable to provide you with nuclear authorization code.") - -/datum/antagonist/nukeop/proc/forge_objectives() - if(nuke_team) - owner.objectives |= nuke_team.objectives - -/datum/antagonist/nukeop/proc/move_to_spawnpoint() - var/team_number = 1 - if(nuke_team) - team_number = nuke_team.members.Find(owner) - owner.current.forceMove(GLOB.nukeop_start[((team_number - 1) % GLOB.nukeop_start.len) + 1]) - -/datum/antagonist/nukeop/leader/move_to_spawnpoint() - owner.current.forceMove(pick(GLOB.nukeop_leader_start)) - -/datum/antagonist/nukeop/create_team(datum/team/nuclear/new_team) - if(!new_team) - if(!always_new_team) - for(var/datum/antagonist/nukeop/N in GLOB.antagonists) - if(!N.owner) - continue - if(N.nuke_team) - nuke_team = N.nuke_team - return - nuke_team = new /datum/team/nuclear - nuke_team.update_objectives() - assign_nuke() //This is bit ugly - return - if(!istype(new_team)) - stack_trace("Wrong team type passed to [type] initialization.") - nuke_team = new_team - -/datum/antagonist/nukeop/admin_add(datum/mind/new_owner,mob/admin) - new_owner.assigned_role = ROLE_SYNDICATE - new_owner.add_antag_datum(src) - message_admins("[key_name_admin(admin)] has nuke op'ed [new_owner.current].") - log_admin("[key_name(admin)] has nuke op'ed [new_owner.current].") - -/datum/antagonist/nukeop/get_admin_commands() - . = ..() - .["Send to base"] = CALLBACK(src,.proc/admin_send_to_base) - .["Tell code"] = CALLBACK(src,.proc/admin_tell_code) - -/datum/antagonist/nukeop/proc/admin_send_to_base(mob/admin) - owner.current.forceMove(pick(GLOB.nukeop_start)) - -/datum/antagonist/nukeop/proc/admin_tell_code(mob/admin) - var/code - for (var/obj/machinery/nuclearbomb/bombue in GLOB.machines) - if (length(bombue.r_code) <= 5 && bombue.r_code != initial(bombue.r_code)) - code = bombue.r_code - break - if (code) - antag_memory += "Syndicate Nuclear Bomb Code: [code]
    " - to_chat(owner.current, "The nuclear authorization code is: [code]") - else - to_chat(admin, "No valid nuke found!") - -/datum/antagonist/nukeop/leader - name = "Nuclear Operative Leader" - nukeop_outfit = /datum/outfit/syndicate/leader - always_new_team = TRUE - var/title - -/datum/antagonist/nukeop/leader/memorize_code() - ..() - if(nuke_team && nuke_team.memorized_code) - var/obj/item/paper/P = new - P.info = "The nuclear authorization code is: [nuke_team.memorized_code]" - P.name = "nuclear bomb code" - var/mob/living/carbon/human/H = owner.current - if(!istype(H)) - P.forceMove(get_turf(H)) - else - H.put_in_hands(P, TRUE) - H.update_icons() - -/datum/antagonist/nukeop/leader/give_alias() - title = pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord") - if(nuke_team && nuke_team.syndicate_name) - owner.current.real_name = "[nuke_team.syndicate_name] [title]" - else - owner.current.real_name = "Syndicate [title]" - -/datum/antagonist/nukeop/leader/greet() - owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ops.ogg',100,0) - to_chat(owner, "You are the Syndicate [title] for this mission. You are responsible for the distribution of telecrystals and your ID is the only one who can open the launch bay doors.") - to_chat(owner, "If you feel you are not up to this task, give your ID to another operative.") - to_chat(owner, "In your hand you will find a special item capable of triggering a greater challenge for your team. Examine it carefully and consult with your fellow operatives before activating it.") - owner.announce_objectives() - addtimer(CALLBACK(src, .proc/nuketeam_name_assign), 1) - - -/datum/antagonist/nukeop/leader/proc/nuketeam_name_assign() - if(!nuke_team) - return - nuke_team.rename_team(ask_name()) - -/datum/team/nuclear/proc/rename_team(new_name) - syndicate_name = new_name - name = "[syndicate_name] Team" - for(var/I in members) - var/datum/mind/synd_mind = I - var/mob/living/carbon/human/H = synd_mind.current - if(!istype(H)) - continue - var/chosen_name = H.dna.species.random_name(H.gender,0,syndicate_name) - H.fully_replace_character_name(H.real_name,chosen_name) - -/datum/antagonist/nukeop/leader/proc/ask_name() - var/randomname = pick(GLOB.last_names) - var/newname = stripped_input(owner.current,"You are the nuke operative [title]. Please choose a last name for your family.", "Name change",randomname) - if (!newname) - newname = randomname - else - newname = reject_bad_name(newname) - if(!newname) - newname = randomname - - return capitalize(newname) - -/datum/antagonist/nukeop/lone - name = "Lone Operative" - always_new_team = TRUE - send_to_spawnpoint = FALSE //Handled by event - nukeop_outfit = /datum/outfit/syndicate/full - -/datum/antagonist/nukeop/lone/assign_nuke() - if(nuke_team && !nuke_team.tracked_nuke) - nuke_team.memorized_code = random_nukecode() - var/obj/machinery/nuclearbomb/selfdestruct/nuke = locate() in GLOB.nuke_list - if(nuke) - nuke_team.tracked_nuke = nuke - if(nuke.r_code == "ADMIN") - nuke.r_code = nuke_team.memorized_code - else //Already set by admins/something else? - nuke_team.memorized_code = nuke.r_code - else - stack_trace("Station self destruct ot found during lone op team creation.") - nuke_team.memorized_code = null - -/datum/antagonist/nukeop/reinforcement - send_to_spawnpoint = FALSE - nukeop_outfit = /datum/outfit/syndicate/no_crystals - -/datum/team/nuclear - var/syndicate_name - var/obj/machinery/nuclearbomb/tracked_nuke - var/core_objective = /datum/objective/nuclear - var/memorized_code - -/datum/team/nuclear/New() - ..() - syndicate_name = syndicate_name() - -/datum/team/nuclear/proc/update_objectives() - if(core_objective) - var/datum/objective/O = new core_objective - O.team = src - objectives += O - -/datum/team/nuclear/proc/disk_rescued() - for(var/obj/item/disk/nuclear/D in GLOB.poi_list) - if(!D.onCentCom()) - return FALSE - return TRUE - -/datum/team/nuclear/proc/operatives_dead() - for(var/I in members) - var/datum/mind/operative_mind = I - if(ishuman(operative_mind.current) && (operative_mind.current.stat != DEAD)) - return FALSE - return TRUE - -/datum/team/nuclear/proc/syndies_escaped() - var/obj/docking_port/mobile/S = SSshuttle.getShuttle("syndicate") - return S && (is_centcom_level(S.z) || is_transit_level(S.z)) - -/datum/team/nuclear/proc/get_result() - var/evacuation = SSshuttle.emergency.mode == SHUTTLE_ENDGAME - var/disk_rescued = disk_rescued() - var/syndies_didnt_escape = !syndies_escaped() - var/station_was_nuked = SSticker.mode.station_was_nuked - var/nuke_off_station = SSticker.mode.nuke_off_station - - if(nuke_off_station == NUKE_SYNDICATE_BASE) - return NUKE_RESULT_FLUKE - else if(!disk_rescued && station_was_nuked && !syndies_didnt_escape) - return NUKE_RESULT_NUKE_WIN - else if (!disk_rescued && station_was_nuked && syndies_didnt_escape) - return NUKE_RESULT_NOSURVIVORS - else if (!disk_rescued && !station_was_nuked && nuke_off_station && !syndies_didnt_escape) - return NUKE_RESULT_WRONG_STATION - else if (!disk_rescued && !station_was_nuked && nuke_off_station && syndies_didnt_escape) - return NUKE_RESULT_WRONG_STATION_DEAD - else if ((disk_rescued || evacuation) && operatives_dead()) - return NUKE_RESULT_CREW_WIN_SYNDIES_DEAD - else if (disk_rescued) - return NUKE_RESULT_CREW_WIN - else if (!disk_rescued && operatives_dead()) - return NUKE_RESULT_DISK_LOST - else if (!disk_rescued && evacuation) - return NUKE_RESULT_DISK_STOLEN - else - return //Undefined result - -/datum/team/nuclear/roundend_report() - var/list/parts = list() - parts += "[syndicate_name] Operatives:" - - switch(get_result()) - if(NUKE_RESULT_FLUKE) - parts += "Humiliating Syndicate Defeat" - parts += "The crew of [station_name()] gave [syndicate_name] operatives back their bomb! The syndicate base was destroyed! Next time, don't lose the nuke!" - if(NUKE_RESULT_NUKE_WIN) - parts += "Syndicate Major Victory!" - parts += "[syndicate_name] operatives have destroyed [station_name()]!" - if(NUKE_RESULT_NOSURVIVORS) - parts += "Total Annihilation" - parts += "[syndicate_name] operatives destroyed [station_name()] but did not leave the area in time and got caught in the explosion. Next time, don't lose the disk!" - if(NUKE_RESULT_WRONG_STATION) - parts += "Crew Minor Victory" - parts += "[syndicate_name] operatives secured the authentication disk but blew up something that wasn't [station_name()]. Next time, don't do that!" - if(NUKE_RESULT_WRONG_STATION_DEAD) - parts += "[syndicate_name] operatives have earned Darwin Award!" - parts += "[syndicate_name] operatives blew up something that wasn't [station_name()] and got caught in the explosion. Next time, don't do that!" - if(NUKE_RESULT_CREW_WIN_SYNDIES_DEAD) - parts += "Crew Major Victory!" - parts += "The Research Staff has saved the disk and killed the [syndicate_name] Operatives" - if(NUKE_RESULT_CREW_WIN) - parts += "Crew Major Victory" - parts += "The Research Staff has saved the disk and stopped the [syndicate_name] Operatives!" - if(NUKE_RESULT_DISK_LOST) - parts += "Neutral Victory!" - parts += "The Research Staff failed to secure the authentication disk but did manage to kill most of the [syndicate_name] Operatives!" - if(NUKE_RESULT_DISK_STOLEN) - parts += "Syndicate Minor Victory!" - parts += "[syndicate_name] operatives survived the assault but did not achieve the destruction of [station_name()]. Next time, don't lose the disk!" - else - parts += "Neutral Victory" - parts += "Mission aborted!" - - var/text = "
    The syndicate operatives were:" - var/purchases = "" - var/TC_uses = 0 - for(var/I in members) - var/datum/mind/syndicate = I - var/datum/uplink_purchase_log/H = GLOB.uplink_purchase_logs_by_key[syndicate.key] - if(H) - TC_uses += H.total_spent - purchases += H.generate_render(show_key = FALSE) - text += printplayerlist(members) - text += "
    " - text += "(Syndicates used [TC_uses] TC) [purchases]" - if(TC_uses == 0 && SSticker.mode.station_was_nuked && !operatives_dead()) - text += "[icon2html('icons/badass.dmi', world, "badass")]" - - parts += text - - return "
    [parts.Join("
    ")]
    " - -/datum/team/nuclear/antag_listing_name() - if(syndicate_name) - return "[syndicate_name] Syndicates" - else - return "Syndicates" - -/datum/team/nuclear/antag_listing_entry() - var/disk_report = "Nuclear Disk(s)
    " - disk_report += "" - for(var/obj/item/disk/nuclear/N in GLOB.poi_list) - disk_report += "" - disk_report += "
    [N.name], " - var/atom/disk_loc = N.loc - while(!isturf(disk_loc)) - if(ismob(disk_loc)) - var/mob/M = disk_loc - disk_report += "carried by [M.real_name] " - if(isobj(disk_loc)) - var/obj/O = disk_loc - disk_report += "in \a [O.name] " - disk_loc = disk_loc.loc - disk_report += "in [disk_loc.loc] at ([disk_loc.x], [disk_loc.y], [disk_loc.z])FLW
    " - var/common_part = ..() - return common_part + disk_report - -/datum/team/nuclear/is_gamemode_hero() - return SSticker.mode.name == "nuclear emergency" \ No newline at end of file diff --git a/code/datums/antagonists/pirate.dm b/code/datums/antagonists/pirate.dm deleted file mode 100644 index cdd871ff35..0000000000 --- a/code/datums/antagonists/pirate.dm +++ /dev/null @@ -1,132 +0,0 @@ -/datum/antagonist/pirate - name = "Space Pirate" - job_rank = ROLE_TRAITOR - roundend_category = "space pirates" - antagpanel_category = "Pirate" - var/datum/team/pirate/crew - -/datum/antagonist/pirate/greet() - to_chat(owner, "You are a Space Pirate!") - to_chat(owner, "The station refused to pay for your protection, protect the ship, siphon the credits from the station and raid it for even more loot.") - owner.announce_objectives() - -/datum/antagonist/pirate/get_team() - return crew - -/datum/antagonist/pirate/create_team(datum/team/pirate/new_team) - if(!new_team) - for(var/datum/antagonist/pirate/P in GLOB.antagonists) - if(!P.owner) - continue - if(P.crew) - crew = P.crew - return - if(!new_team) - crew = new /datum/team/pirate - crew.forge_objectives() - return - if(!istype(new_team)) - stack_trace("Wrong team type passed to [type] initialization.") - crew = new_team - -/datum/antagonist/pirate/on_gain() - if(crew) - owner.objectives |= crew.objectives - . = ..() - -/datum/antagonist/pirate/on_removal() - if(crew) - owner.objectives -= crew.objectives - . = ..() - -/datum/team/pirate - name = "Pirate crew" - -/datum/team/pirate/proc/forge_objectives() - var/datum/objective/loot/getbooty = new() - getbooty.team = src - getbooty.storage_area = locate(/area/shuttle/pirate/vault) in GLOB.sortedAreas - getbooty.update_initial_value() - getbooty.update_explanation_text() - objectives += getbooty - for(var/datum/mind/M in members) - M.objectives |= objectives - - -GLOBAL_LIST_INIT(pirate_loot_cache, typecacheof(list( - /obj/structure/reagent_dispensers/beerkeg, - /mob/living/simple_animal/parrot, - /obj/item/stack/sheet/mineral/gold, - /obj/item/stack/sheet/mineral/diamond, - /obj/item/stack/spacecash, - /obj/item/melee/sabre,))) - -/datum/objective/loot - var/area/storage_area //Place where we we will look for the loot. - explanation_text = "Acquire valuable loot and store it in designated area." - var/target_value = 50000 - var/initial_value = 0 //Things in the vault at spawn time do not count - -/datum/objective/loot/update_explanation_text() - if(storage_area) - explanation_text = "Acquire loot and store [target_value] of credits worth in [storage_area.name]." - -/datum/objective/loot/proc/loot_listing() - //Lists notable loot. - if(!storage_area) - return "Nothing" - var/list/loot_table = list() - for(var/atom/movable/AM in storage_area.GetAllContents()) - if(is_type_in_typecache(AM,GLOB.pirate_loot_cache)) - var/lootname = AM.name - var/count = 1 - if(istype(AM,/obj/item/stack)) //Ugh. - var/obj/item/stack/S = AM - lootname = S.singular_name - count = S.amount - if(!loot_table[lootname]) - loot_table[lootname] = count - else - loot_table[lootname] += count - var/list/loot_texts = list() - for(var/key in loot_table) - var/amount = loot_table[key] - loot_texts += "[amount] [key][amount > 1 ? "s":""]" - return loot_texts.Join(", ") - -/datum/objective/loot/proc/get_loot_value() - if(!storage_area) - return 0 - var/value = 0 - for(var/turf/T in storage_area.contents) - value += export_item_and_contents(T,TRUE, TRUE, dry_run = TRUE) - return value - initial_value - -/datum/objective/loot/proc/update_initial_value() - initial_value = get_loot_value() - -/datum/objective/loot/check_completion() - return ..() || get_loot_value() >= target_value - -/datum/team/pirate/roundend_report() - var/list/parts = list() - - parts += "Space Pirates were:" - - var/all_dead = TRUE - for(var/datum/mind/M in members) - if(considered_alive(M)) - all_dead = FALSE - parts += printplayerlist(members) - - parts += "Loot stolen: " - var/datum/objective/loot/L = locate() in objectives - parts += L.loot_listing() - parts += "Total loot value : [L.get_loot_value()]/[L.target_value] credits" - - if(L.check_completion() && !all_dead) - parts += "The pirate crew was successful!" - else - parts += "The pirate crew has failed." - - return "
    [parts.Join("
    ")]
    " \ No newline at end of file diff --git a/code/datums/antagonists/revolution.dm b/code/datums/antagonists/revolution.dm deleted file mode 100644 index 5ac3bfe2aa..0000000000 --- a/code/datums/antagonists/revolution.dm +++ /dev/null @@ -1,368 +0,0 @@ -//How often to check for promotion possibility -#define HEAD_UPDATE_PERIOD 300 - -/datum/antagonist/rev - name = "Revolutionary" - roundend_category = "revolutionaries" // if by some miracle revolutionaries without revolution happen - antagpanel_category = "Revolution" - job_rank = ROLE_REV - var/hud_type = "rev" - var/datum/team/revolution/rev_team - -/datum/antagonist/rev/can_be_owned(datum/mind/new_owner) - . = ..() - if(.) - if(new_owner.assigned_role in GLOB.command_positions) - return FALSE - if(new_owner.unconvertable) - return FALSE - if(new_owner.current && new_owner.current.isloyal()) - return FALSE - -/datum/antagonist/rev/apply_innate_effects(mob/living/mob_override) - var/mob/living/M = mob_override || owner.current - update_rev_icons_added(M) - -/datum/antagonist/rev/remove_innate_effects(mob/living/mob_override) - var/mob/living/M = mob_override || owner.current - update_rev_icons_removed(M) - -/datum/antagonist/rev/proc/equip_rev() - return - -/datum/antagonist/rev/on_gain() - . = ..() - create_objectives() - equip_rev() - owner.current.log_message("Has been converted to the revolution!", INDIVIDUAL_ATTACK_LOG) - -/datum/antagonist/rev/on_removal() - remove_objectives() - . = ..() - -/datum/antagonist/rev/greet() - to_chat(owner, "You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!") - owner.announce_objectives() - -/datum/antagonist/rev/create_team(datum/team/revolution/new_team) - if(!new_team) - //For now only one revolution at a time - for(var/datum/antagonist/rev/head/H in GLOB.antagonists) - if(!H.owner) - continue - if(H.rev_team) - rev_team = H.rev_team - return - rev_team = new /datum/team/revolution - rev_team.update_objectives() - rev_team.update_heads() - return - if(!istype(new_team)) - stack_trace("Wrong team type passed to [type] initialization.") - rev_team = new_team - -/datum/antagonist/rev/get_team() - return rev_team - -/datum/antagonist/rev/proc/create_objectives() - owner.objectives |= rev_team.objectives - -/datum/antagonist/rev/proc/remove_objectives() - owner.objectives -= rev_team.objectives - -//Bump up to head_rev -/datum/antagonist/rev/proc/promote() - var/old_team = rev_team - var/datum/mind/old_owner = owner - silent = TRUE - owner.remove_antag_datum(/datum/antagonist/rev) - var/datum/antagonist/rev/head/new_revhead = new() - new_revhead.silent = TRUE - old_owner.add_antag_datum(new_revhead,old_team) - new_revhead.silent = FALSE - to_chat(old_owner, "You have proved your devotion to revolution! You are a head revolutionary now!") - -/datum/antagonist/rev/get_admin_commands() - . = ..() - .["Promote"] = CALLBACK(src,.proc/admin_promote) - -/datum/antagonist/rev/proc/admin_promote(mob/admin) - var/datum/mind/O = owner - promote() - message_admins("[key_name_admin(admin)] has head-rev'ed [O].") - log_admin("[key_name(admin)] has head-rev'ed [O].") - -/datum/antagonist/rev/head/admin_add(datum/mind/new_owner,mob/admin) - give_flash = TRUE - give_hud = TRUE - remove_clumsy = TRUE - new_owner.add_antag_datum(src) - message_admins("[key_name_admin(admin)] has head-rev'ed [new_owner.current].") - log_admin("[key_name(admin)] has head-rev'ed [new_owner.current].") - to_chat(new_owner.current, "You are a member of the revolutionaries' leadership now!") - -/datum/antagonist/rev/head/get_admin_commands() - . = ..() - . -= "Promote" - .["Take flash"] = CALLBACK(src,.proc/admin_take_flash) - .["Give flash"] = CALLBACK(src,.proc/admin_give_flash) - .["Repair flash"] = CALLBACK(src,.proc/admin_repair_flash) - .["Demote"] = CALLBACK(src,.proc/admin_demote) - -/datum/antagonist/rev/head/proc/admin_take_flash(mob/admin) - var/list/L = owner.current.get_contents() - var/obj/item/device/assembly/flash/flash = locate() in L - if (!flash) - to_chat(admin, "Deleting flash failed!") - return - qdel(flash) - -/datum/antagonist/rev/head/proc/admin_give_flash(mob/admin) - //This is probably overkill but making these impact state annoys me - var/old_give_flash = give_flash - var/old_give_hud = give_hud - var/old_remove_clumsy = remove_clumsy - give_flash = TRUE - give_hud = FALSE - remove_clumsy = FALSE - equip_rev() - give_flash = old_give_flash - give_hud = old_give_hud - remove_clumsy = old_remove_clumsy - -/datum/antagonist/rev/head/proc/admin_repair_flash(mob/admin) - var/list/L = owner.current.get_contents() - var/obj/item/device/assembly/flash/flash = locate() in L - if (!flash) - to_chat(admin, "Repairing flash failed!") - else - flash.crit_fail = 0 - flash.update_icon() - -/datum/antagonist/rev/head/proc/admin_demote(datum/mind/target,mob/user) - message_admins("[key_name_admin(user)] has demoted [owner.current] from head revolutionary.") - log_admin("[key_name(user)] has demoted [owner.current] from head revolutionary.") - demote() - -/datum/antagonist/rev/head - name = "Head Revolutionary" - hud_type = "rev_head" - var/remove_clumsy = FALSE - var/give_flash = FALSE - var/give_hud = TRUE - -/datum/antagonist/rev/head/antag_listing_name() - return ..() + "(Leader)" - -/datum/antagonist/rev/proc/update_rev_icons_added(mob/living/M) - var/datum/atom_hud/antag/revhud = GLOB.huds[ANTAG_HUD_REV] - revhud.join_hud(M) - set_antag_hud(M,hud_type) - -/datum/antagonist/rev/proc/update_rev_icons_removed(mob/living/M) - var/datum/atom_hud/antag/revhud = GLOB.huds[ANTAG_HUD_REV] - revhud.leave_hud(M) - set_antag_hud(M, null) - -/datum/antagonist/rev/proc/can_be_converted(mob/living/candidate) - if(!candidate.mind) - return FALSE - if(!can_be_owned(candidate.mind)) - return FALSE - var/mob/living/carbon/C = candidate //Check to see if the potential rev is implanted - if(!istype(C)) //Can't convert simple animals - return FALSE - return TRUE - -/datum/antagonist/rev/proc/add_revolutionary(datum/mind/rev_mind,stun = TRUE) - if(!can_be_converted(rev_mind.current)) - return FALSE - if(stun) - if(iscarbon(rev_mind.current)) - var/mob/living/carbon/carbon_mob = rev_mind.current - carbon_mob.silent = max(carbon_mob.silent, 5) - carbon_mob.flash_act(1, 1) - rev_mind.current.Stun(100) - rev_mind.add_antag_datum(/datum/antagonist/rev,rev_team) - rev_mind.special_role = ROLE_REV - return TRUE - -/datum/antagonist/rev/head/proc/demote() - var/datum/mind/old_owner = owner - var/old_team = rev_team - silent = TRUE - owner.remove_antag_datum(/datum/antagonist/rev/head) - var/datum/antagonist/rev/new_rev = new /datum/antagonist/rev() - new_rev.silent = TRUE - old_owner.add_antag_datum(new_rev,old_team) - new_rev.silent = FALSE - to_chat(old_owner, "Revolution has been disappointed of your leader traits! You are a regular revolutionary now!") - -/datum/antagonist/rev/farewell() - if(ishuman(owner.current)) - owner.current.visible_message("[owner.current] looks like they just remembered their real allegiance!", null, null, null, owner.current) - to_chat(owner, "You are no longer a brainwashed revolutionary! Your memory is hazy from the time you were a rebel...the only thing you remember is the name of the one who brainwashed you...") - else if(issilicon(owner.current)) - owner.current.visible_message("The frame beeps contentedly, purging the hostile memory engram from the MMI before initalizing it.", null, null, null, owner.current) - to_chat(owner, "The frame's firmware detects and deletes your neural reprogramming! You remember nothing but the name of the one who flashed you.") - -/datum/antagonist/rev/proc/remove_revolutionary(borged, deconverter) - log_attack("[owner.current] (Key: [key_name(owner.current)]) has been deconverted from the revolution by [deconverter] (Key: [key_name(deconverter)])!") - if(borged) - message_admins("[ADMIN_LOOKUPFLW(owner.current)] has been borged while being a [name]") - owner.special_role = null - if(iscarbon(owner.current)) - var/mob/living/carbon/C = owner.current - C.Unconscious(100) - owner.remove_antag_datum(type) - -/datum/antagonist/rev/head/remove_revolutionary(borged,deconverter) - if(!borged) - return - . = ..() - -/datum/antagonist/rev/head/equip_rev() - var/mob/living/carbon/human/H = owner.current - if(!istype(H)) - return - - if(remove_clumsy && owner.assigned_role == "Clown") - to_chat(owner, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") - H.dna.remove_mutation(CLOWNMUT) - - if(give_flash) - var/obj/item/device/assembly/flash/T = new(H) - var/list/slots = list ( - "backpack" = slot_in_backpack, - "left pocket" = slot_l_store, - "right pocket" = slot_r_store - ) - var/where = H.equip_in_one_of_slots(T, slots) - if (!where) - to_chat(H, "The Syndicate were unfortunately unable to get you a flash.") - else - to_chat(H, "The flash in your [where] will help you to persuade the crew to join your cause.") - - if(give_hud) - var/obj/item/organ/cyberimp/eyes/hud/security/syndicate/S = new(H) - S.Insert(H, special = FALSE, drop_if_replaced = FALSE) - to_chat(H, "Your eyes have been implanted with a cybernetic security HUD which will help you keep track of who is mindshield-implanted, and therefore unable to be recruited.") - -/datum/team/revolution - name = "Revolution" - var/max_headrevs = 3 - -/datum/team/revolution/proc/update_objectives(initial = FALSE) - var/untracked_heads = SSjob.get_all_heads() - for(var/datum/objective/mutiny/O in objectives) - untracked_heads -= O.target - for(var/datum/mind/M in untracked_heads) - var/datum/objective/mutiny/new_target = new() - new_target.team = src - new_target.target = M - new_target.update_explanation_text() - objectives += new_target - for(var/datum/mind/M in members) - M.objectives |= objectives - - addtimer(CALLBACK(src,.proc/update_objectives),HEAD_UPDATE_PERIOD,TIMER_UNIQUE) - -/datum/team/revolution/proc/head_revolutionaries() - . = list() - for(var/datum/mind/M in members) - if(M.has_antag_datum(/datum/antagonist/rev/head)) - . += M - -/datum/team/revolution/proc/update_heads() - if(SSticker.HasRoundStarted()) - var/list/datum/mind/head_revolutionaries = head_revolutionaries() - var/list/datum/mind/heads = SSjob.get_all_heads() - var/list/sec = SSjob.get_all_sec() - - if(head_revolutionaries.len < max_headrevs && head_revolutionaries.len < round(heads.len - ((8 - sec.len) / 3))) - var/list/datum/mind/non_heads = members - head_revolutionaries - var/list/datum/mind/promotable = list() - for(var/datum/mind/khrushchev in non_heads) - if(khrushchev.current && !khrushchev.current.incapacitated() && !khrushchev.current.restrained() && khrushchev.current.client && khrushchev.current.stat != DEAD) - if(ROLE_REV in khrushchev.current.client.prefs.be_special) - promotable += khrushchev - if(promotable.len) - var/datum/mind/new_leader = pick(promotable) - var/datum/antagonist/rev/rev = new_leader.has_antag_datum(/datum/antagonist/rev) - rev.promote() - - addtimer(CALLBACK(src,.proc/update_heads),HEAD_UPDATE_PERIOD,TIMER_UNIQUE) - - -/datum/team/revolution/roundend_report() - if(!members.len) - return - - var/list/result = list() - - result += "
    " - - var/num_revs = 0 - var/num_survivors = 0 - for(var/mob/living/carbon/survivor in GLOB.alive_mob_list) - if(survivor.ckey) - num_survivors++ - if(survivor.mind) - if(is_revolutionary(survivor)) - num_revs++ - if(num_survivors) - result += "Command's Approval Rating: [100 - round((num_revs/num_survivors)*100, 0.1)]%
    " - - - var/list/targets = list() - var/list/datum/mind/headrevs = get_antagonists(/datum/antagonist/rev/head) - var/list/datum/mind/revs = get_antagonists(/datum/antagonist/rev,TRUE) - if(headrevs.len) - var/list/headrev_part = list() - headrev_part += "The head revolutionaries were:" - headrev_part += printplayerlist(headrevs,TRUE) - result += headrev_part.Join("
    ") - - if(revs.len) - var/list/rev_part = list() - rev_part += "The revolutionaries were:" - rev_part += printplayerlist(revs,TRUE) - result += rev_part.Join("
    ") - - var/list/heads = SSjob.get_all_heads() - if(heads.len) - var/head_text = "The heads of staff were:" - head_text += "
      " - for(var/datum/mind/head in heads) - var/target = (head in targets) - head_text += "
    • " - if(target) - head_text += "Target" - head_text += "[printplayer(head, 1)]
    • " - head_text += "

    " - result += head_text - - result += "
    " - - return result.Join() - -/datum/team/revolution/antag_listing_entry() - var/common_part = ..() - var/heads_report = "Heads of Staff
    " - heads_report += "" - for(var/datum/mind/N in SSjob.get_living_heads()) - var/mob/M = N.current - if(M) - heads_report += "" - heads_report += "" - heads_report += "" - var/turf/mob_loc = get_turf(M) - heads_report += "" - else - heads_report += "" - heads_report += "" - heads_report += "
    [M.real_name][M.client ? "" : " (No Client)"][M.stat == DEAD ? " (DEAD)" : ""]PMFLW[mob_loc.loc]
    [N.name]([N.key])Head body destroyed!PM
    " - return common_part + heads_report - -/datum/team/revolution/is_gamemode_hero() - return SSticker.mode.name == "revolution" \ No newline at end of file diff --git a/code/datums/antagonists/wizard.dm b/code/datums/antagonists/wizard.dm deleted file mode 100644 index 8aba74f70a..0000000000 --- a/code/datums/antagonists/wizard.dm +++ /dev/null @@ -1,339 +0,0 @@ -#define APPRENTICE_DESTRUCTION "destruction" -#define APPRENTICE_BLUESPACE "bluespace" -#define APPRENTICE_ROBELESS "robeless" -#define APPRENTICE_HEALING "healing" - -/datum/antagonist/wizard - name = "Space Wizard" - roundend_category = "wizards/witches" - antagpanel_category = "Wizard" - job_rank = ROLE_WIZARD - var/give_objectives = TRUE - var/strip = TRUE //strip before equipping - var/allow_rename = TRUE - var/hud_version = "wizard" - var/datum/team/wizard/wiz_team //Only created if wizard summons apprentices - var/move_to_lair = TRUE - var/outfit_type = /datum/outfit/wizard - var/wiz_age = WIZARD_AGE_MIN /* Wizards by nature cannot be too young. */ - -/datum/antagonist/wizard/on_gain() - register() - if(give_objectives) - create_objectives() - equip_wizard() - if(move_to_lair) - send_to_lair() - . = ..() - if(allow_rename) - rename_wizard() - -/datum/antagonist/wizard/proc/register() - SSticker.mode.wizards |= owner - -/datum/antagonist/wizard/proc/unregister() - SSticker.mode.wizards -= src - -/datum/antagonist/wizard/create_team(datum/team/wizard/new_team) - if(!new_team) - return - if(!istype(new_team)) - stack_trace("Wrong team type passed to [type] initialization.") - wiz_team = new_team - -/datum/antagonist/wizard/get_team() - return wiz_team - -/datum/team/wizard - name = "wizard team" - var/datum/antagonist/wizard/master_wizard - -/datum/antagonist/wizard/proc/create_wiz_team() - wiz_team = new(owner) - wiz_team.name = "[owner.current.real_name] team" - wiz_team.master_wizard = src - update_wiz_icons_added(owner.current) - -/datum/antagonist/wizard/proc/send_to_lair() - if(!owner || !owner.current) - return - if(!GLOB.wizardstart.len) - SSjob.SendToLateJoin(owner.current) - to_chat(owner, "HOT INSERTION, GO GO GO") - owner.current.forceMove(pick(GLOB.wizardstart)) - -/datum/antagonist/wizard/proc/create_objectives() - switch(rand(1,100)) - if(1 to 30) - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = owner - kill_objective.find_target() - objectives += kill_objective - - if (!(locate(/datum/objective/escape) in owner.objectives)) - var/datum/objective/escape/escape_objective = new - escape_objective.owner = owner - objectives += escape_objective - - if(31 to 60) - var/datum/objective/steal/steal_objective = new - steal_objective.owner = owner - steal_objective.find_target() - objectives += steal_objective - - if (!(locate(/datum/objective/escape) in owner.objectives)) - var/datum/objective/escape/escape_objective = new - escape_objective.owner = owner - objectives += escape_objective - - if(61 to 85) - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = owner - kill_objective.find_target() - objectives += kill_objective - - var/datum/objective/steal/steal_objective = new - steal_objective.owner = owner - steal_objective.find_target() - objectives += steal_objective - - if (!(locate(/datum/objective/survive) in owner.objectives)) - var/datum/objective/survive/survive_objective = new - survive_objective.owner = owner - objectives += survive_objective - - else - if (!(locate(/datum/objective/hijack) in owner.objectives)) - var/datum/objective/hijack/hijack_objective = new - hijack_objective.owner = owner - objectives += hijack_objective - - for(var/datum/objective/O in objectives) - owner.objectives += O - -/datum/antagonist/wizard/on_removal() - unregister() - for(var/objective in objectives) - owner.objectives -= objective - owner.RemoveAllSpells() // TODO keep track which spells are wizard spells which innate stuff - return ..() - -/datum/antagonist/wizard/proc/equip_wizard() - if(!owner) - return - var/mob/living/carbon/human/H = owner.current - if(!istype(H)) - return - if(strip) - H.delete_equipment() - //Wizards are human by default. Use the mirror if you want something else. - H.set_species(/datum/species/human) - if(H.age < wiz_age) - H.age = wiz_age - H.equipOutfit(outfit_type) - -/datum/antagonist/wizard/greet() - to_chat(owner, "You are the Space Wizard!") - to_chat(owner, "The Space Wizards Federation has given you the following tasks:") - owner.announce_objectives() - to_chat(owner, "You will find a list of available spells in your spell book. Choose your magic arsenal carefully.") - to_chat(owner, "The spellbook is bound to you, and others cannot use it.") - to_chat(owner, "In your pockets you will find a teleport scroll. Use it as needed.") - to_chat(owner,"Remember: do not forget to prepare your spells.") - -/datum/antagonist/wizard/farewell() - to_chat(owner, "You have been brainwashed! You are no longer a wizard!") - -/datum/antagonist/wizard/proc/rename_wizard() - set waitfor = FALSE - - var/wizard_name_first = pick(GLOB.wizard_first) - var/wizard_name_second = pick(GLOB.wizard_second) - var/randomname = "[wizard_name_first] [wizard_name_second]" - var/mob/living/wiz_mob = owner.current - var/newname = copytext(sanitize(input(wiz_mob, "You are the [name]. Would you like to change your name to something else?", "Name change", randomname) as null|text),1,MAX_NAME_LEN) - - if (!newname) - newname = randomname - - wiz_mob.fully_replace_character_name(wiz_mob.real_name, newname) - -/datum/antagonist/wizard/apply_innate_effects(mob/living/mob_override) - var/mob/living/M = mob_override || owner.current - update_wiz_icons_added(M, wiz_team ? TRUE : FALSE) //Don't bother showing the icon if you're solo wizard - M.faction |= ROLE_WIZARD - -/datum/antagonist/wizard/remove_innate_effects(mob/living/mob_override) - var/mob/living/M = mob_override || owner.current - update_wiz_icons_removed(M) - M.faction -= ROLE_WIZARD - - -/datum/antagonist/wizard/get_admin_commands() - . = ..() - .["Send to Lair"] = CALLBACK(src,.proc/admin_send_to_lair) - -/datum/antagonist/wizard/proc/admin_send_to_lair(mob/admin) - owner.current.forceMove(pick(GLOB.wizardstart)) - -/datum/antagonist/wizard/apprentice - name = "Wizard Apprentice" - hud_version = "apprentice" - var/datum/mind/master - var/school = APPRENTICE_DESTRUCTION - outfit_type = /datum/outfit/wizard/apprentice - wiz_age = APPRENTICE_AGE_MIN - -/datum/antagonist/wizard/apprentice/greet() - to_chat(owner, "You are [master.current.real_name]'s apprentice! You are bound by magic contract to follow their orders and help them in accomplishing their goals.") - owner.announce_objectives() - -/datum/antagonist/wizard/apprentice/register() - SSticker.mode.apprentices |= owner - -/datum/antagonist/wizard/apprentice/unregister() - SSticker.mode.apprentices -= owner - -/datum/antagonist/wizard/apprentice/equip_wizard() - . = ..() - if(!owner) - return - var/mob/living/carbon/human/H = owner.current - if(!istype(H)) - return - switch(school) - if(APPRENTICE_DESTRUCTION) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(null)) - owner.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball(null)) - to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned powerful, destructive spells. You are able to cast magic missile and fireball.") - if(APPRENTICE_BLUESPACE) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null)) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null)) - to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned reality bending mobility spells. You are able to cast teleport and ethereal jaunt.") - if(APPRENTICE_HEALING) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/charge(null)) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/forcewall(null)) - H.put_in_hands(new /obj/item/gun/magic/staff/healing(H)) - to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned livesaving survival spells. You are able to cast charge and forcewall.") - if(APPRENTICE_ROBELESS) - owner.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null)) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/mind_transfer(null)) - to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned stealthy, robeless spells. You are able to cast knock and mindswap.") - -/datum/antagonist/wizard/apprentice/create_objectives() - var/datum/objective/protect/new_objective = new /datum/objective/protect - new_objective.owner = owner - new_objective.target = master - new_objective.explanation_text = "Protect [master.current.real_name], the wizard." - owner.objectives += new_objective - objectives += new_objective - -//Random event wizard -/datum/antagonist/wizard/apprentice/imposter - name = "Wizard Imposter" - allow_rename = FALSE - move_to_lair = FALSE - -/datum/antagonist/wizard/apprentice/imposter/greet() - to_chat(owner, "You are an imposter! Trick and confuse the crew to misdirect malice from your handsome original!") - owner.announce_objectives() - -/datum/antagonist/wizard/apprentice/imposter/equip_wizard() - var/mob/living/carbon/human/master_mob = master.current - var/mob/living/carbon/human/H = owner.current - if(!istype(master_mob) || !istype(H)) - return - if(master_mob.ears) - H.equip_to_slot_or_del(new master_mob.ears.type, slot_ears) - if(master_mob.w_uniform) - H.equip_to_slot_or_del(new master_mob.w_uniform.type, slot_w_uniform) - if(master_mob.shoes) - H.equip_to_slot_or_del(new master_mob.shoes.type, slot_shoes) - if(master_mob.wear_suit) - H.equip_to_slot_or_del(new master_mob.wear_suit.type, slot_wear_suit) - if(master_mob.head) - H.equip_to_slot_or_del(new master_mob.head.type, slot_head) - if(master_mob.back) - H.equip_to_slot_or_del(new master_mob.back.type, slot_back) - - //Operation: Fuck off and scare people - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null)) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/turf_teleport/blink(null)) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null)) - -/datum/antagonist/wizard/proc/update_wiz_icons_added(mob/living/wiz,join = TRUE) - var/datum/atom_hud/antag/wizhud = GLOB.huds[ANTAG_HUD_WIZ] - wizhud.join_hud(wiz) - set_antag_hud(wiz, hud_version) - -/datum/antagonist/wizard/proc/update_wiz_icons_removed(mob/living/wiz) - var/datum/atom_hud/antag/wizhud = GLOB.huds[ANTAG_HUD_WIZ] - wizhud.leave_hud(wiz) - set_antag_hud(wiz, null) - - -/datum/antagonist/wizard/academy - name = "Academy Teacher" - outfit_type = /datum/outfit/wizard/academy - -/datum/antagonist/wizard/academy/equip_wizard() - . = ..() - - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile) - owner.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball) - - var/mob/living/M = owner.current - if(!istype(M)) - return - - var/obj/item/implant/exile/Implant = new/obj/item/implant/exile(M) - Implant.implant(M) - -/datum/antagonist/wizard/academy/create_objectives() - var/datum/objective/new_objective = new("Protect Wizard Academy from the intruders") - new_objective.owner = owner - owner.objectives += new_objective - objectives += new_objective - -//Solo wizard report -/datum/antagonist/wizard/roundend_report() - var/list/parts = list() - - parts += printplayer(owner) - - var/count = 1 - var/wizardwin = 1 - for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - parts += "Objective #[count]: [objective.explanation_text] Success!" - else - parts += "Objective #[count]: [objective.explanation_text] Fail." - wizardwin = 0 - count++ - - if(wizardwin) - parts += "The wizard was successful!" - else - parts += "The wizard has failed!" - - if(owner.spell_list.len>0) - parts += "[owner.name] used the following spells: " - var/list/spell_names = list() - for(var/obj/effect/proc_holder/spell/S in owner.spell_list) - spell_names += S.name - parts += spell_names.Join(", ") - - return parts.Join("
    ") - -//Wizard with apprentices report -/datum/team/wizard/roundend_report() - var/list/parts = list() - - parts += "Wizards/witches of [master_wizard.owner.name] team were:" - parts += master_wizard.roundend_report() - parts += " " - parts += "[master_wizard.owner.name] apprentices were:" - parts += printplayerlist(members - master_wizard.owner) - - return "
    [parts.Join("
    ")]
    " \ No newline at end of file diff --git a/code/datums/votablemap.dm b/code/datums/votablemap.dm deleted file mode 100644 index c1c0c7d818..0000000000 --- a/code/datums/votablemap.dm +++ /dev/null @@ -1,10 +0,0 @@ -/datum/votablemap - var/name = "" - var/friendlyname = "" - var/minusers = 0 - var/maxusers = 0 - var/voteweight = 1 - -/datum/votablemap/New(name) - src.name = name - src.friendlyname = name \ No newline at end of file diff --git a/code/game/gamemodes/antag_spawner_cit.dm b/code/game/gamemodes/antag_spawner_cit.dm deleted file mode 100644 index 4cdc096072..0000000000 --- a/code/game/gamemodes/antag_spawner_cit.dm +++ /dev/null @@ -1,57 +0,0 @@ -////////////Syndicate Cortical Borer -obj/item/antag_spawner/syndi_borer - name = "syndicate brain-slug container" - desc = "Releases a modified cortical borer to assist the user." - icon = 'icons/obj/device.dmi' //Temporary? Doesn't really look like a container for xenofauna... but IDK what else could work. - icon_state = "locator" - var/polling = FALSE - -obj/item/antag_spawner/syndi_borer/spawn_antag(client/C, turf/T, mob/owner) - var/mob/living/simple_animal/borer/syndi_borer/B = new /mob/living/simple_animal/borer/syndi_borer(T) - - B.key = C.key - if (owner) - B.owner = owner - B.faction = B.faction | owner.faction.Copy() - - B.mind.assigned_role = B.name - B.mind.special_role = B.name - var/datum/objective/syndi_borer/new_objective - new_objective = new /datum/objective/syndi_borer - new_objective.owner = B.mind - new_objective.target = owner.mind - new_objective.explanation_text = "You are a modified cortical borer. You obey [owner.real_name] and must assist them in completing their objectives." - B.mind.objectives += new_objective - - to_chat(B, "You are awake at last! Seek out whoever released you and aid them as best you can!") - if(new_objective) - to_chat(B, "Objective #[1]: [new_objective.explanation_text]") - -/obj/item/antag_spawner/syndi_borer/proc/check_usability(mob/user) - if(used) - to_chat(user, "[src] appears to be empty!") - return 0 - if(polling == TRUE) - to_chat(user, "[src] is busy activating!") - return 0 - return 1 - -/obj/item/antag_spawner/syndi_borer/attack_self(mob/user) - if(!(check_usability(user))) - return - polling = TRUE - var/list/borer_candidates = pollCandidatesForMob("Do you want to play as a syndicate cortical borer?", ROLE_BORER, null, ROLE_BORER, 150, src) - if(borer_candidates.len) - polling = FALSE - if(!(check_usability(user))) - return - used = 1 - var/mob/dead/observer/theghost = pick(borer_candidates) - spawn_antag(theghost.client, get_turf(src), user) - var/datum/effect_system/spark_spread/S = new /datum/effect_system/spark_spread - S.set_up(4, 1, src) - S.start() - qdel(src) - else - polling = FALSE - to_chat(user, "Unable to connect to release specimen. Please wait and try again later or use the container on your uplink to get your points refunded.") \ No newline at end of file diff --git a/code/game/gamemodes/cit_objectives.dm b/code/game/gamemodes/cit_objectives.dm deleted file mode 100644 index fbcfc675e3..0000000000 --- a/code/game/gamemodes/cit_objectives.dm +++ /dev/null @@ -1,106 +0,0 @@ -#define MIN_LATE_TARGET_TIME 600 //lower bound of re-rolled timer, 1 min -#define MAX_LATE_TARGET_TIME 6000 //upper bound of re-rolled timer, 10 min -#define LATE_TARGET_HIT_CHANCE 70 //How often would the find_target succeed, otherwise it re-rolls later and tries again. -//Hit chance is here to avoid people checking github and then hovering around new arrivals within the max minute range every round. - -/datum/objective/assassinate/late - martyr_compatible = FALSE - - -/datum/objective/assassinate/late/find_target() - var/list/possible_targets = list() - for(var/mob/M in GLOB.latejoiners) - var/datum/mind/possible_target = M.mind - if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != 2) && is_unique_objective(possible_target)) - possible_targets += possible_target - if(possible_targets.len > 0 && prob(LATE_TARGET_HIT_CHANCE)) - target = pick(possible_targets) - martyr_compatible = TRUE //Might never matter, but I guess if an admin gives another random objective, this should now be compatible - update_explanation_text() - - message_admins("[target] has been selected as the assassination target of [owner].") - log_game("[target] has been selected as the assassination target of [owner].") - - to_chat(owner, "You hear a crackling noise in your ears, as a one-way syndicate message plays:") - to_chat(owner, "You target has been located. To succeed, find and eliminate [target], the [!target_role_type ? target.assigned_role : target.special_role].") - return target - else - update_explanation_text() - addtimer(CALLBACK(src, .proc/find_target),rand(MIN_LATE_TARGET_TIME, MAX_LATE_TARGET_TIME)) - return null - -/datum/objective/assassinate/late/find_target_by_role(role, role_type=0, invert=0) - var/list/possible_targets = list() - for(var/mob/M in GLOB.latejoiners) - var/datum/mind/possible_target = M.mind - if((possible_target != owner) && ishuman(possible_target.current)) - var/is_role = 0 - if(role_type) - if(possible_target.special_role == role) - is_role++ - else - if(possible_target.assigned_role == role) - is_role++ - - if(invert) - if(is_role) - continue - possible_targets += possible_target - //break - else if(is_role) - possible_targets += possible_target - //break - if(possible_targets && prob(LATE_TARGET_HIT_CHANCE)) - target = pick(possible_targets) - update_explanation_text() - - message_admins("[target] has been selected as the assassination target of [owner].") - log_game("[target] has been selected as the assassination target of [owner].") - - to_chat(owner, "You hear a crackling noise in your ears, as a one-way syndicate message plays:") - to_chat(owner, "You target has been located. To succeed, find and eliminate [target], the [!target_role_type ? target.assigned_role : target.special_role].") - else - update_explanation_text() - addtimer(CALLBACK(src, .proc/find_target_by_role, role, role_type, invert),rand(MIN_LATE_TARGET_TIME, MAX_LATE_TARGET_TIME)) - - - -/datum/objective/assassinate/late/check_completion() - if(target && target.current) //If target WAS assigned - if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current) || target.current.z > 6 || !target.current.ckey) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite - return TRUE - return FALSE - else //If no target was ever given - if(!owner.current || owner.current.stat == DEAD || isbrain(owner.current)) - return FALSE - if(!is_special_character(owner.current)) - return FALSE - return TRUE - -/datum/objective/assassinate/late/update_explanation_text() - //..() - if(target && target.current) - explanation_text = "Assassinate [target.name], the [!target_role_type ? target.assigned_role : target.special_role]." - else - explanation_text = "Stay alive until your target arrives on the station, you will be notified when the target has been identified." - - - -//BORER STUFF -//Because borers didn't use to have objectives -/datum/objective/normal_borer //Default objective, should technically never be used unmodified but CAN work unmodified. - explanation_text = "You must escape with at least one borer with host on the shuttle." - target_amount = 1 - martyr_compatible = 0 - -/datum/objective/normal_borer/check_completion() - var/total_borer_hosts = 0 - for(var/mob/living/carbon/C in GLOB.mob_list) - var/mob/living/simple_animal/borer/D = C.has_brain_worms() - var/turf/location = get_turf(C) - if(is_centcom_level(location.z) && D && D.stat != DEAD) - total_borer_hosts++ - if(target_amount <= total_borer_hosts) - return TRUE - else - return FALSE diff --git a/code/game/gamemodes/cult/blood_magic.dm b/code/game/gamemodes/cult/blood_magic.dm deleted file mode 100644 index dd66edcfb1..0000000000 --- a/code/game/gamemodes/cult/blood_magic.dm +++ /dev/null @@ -1,769 +0,0 @@ -/datum/action/innate/cult/blood_magic //Blood magic handles the creation of blood spells (formerly talismans) - name = "Prepare Blood Magic" - button_icon_state = "carve" - desc = "Prepare blood magic by carving runes into your flesh. This rite is most effective with an empowering rune" - var/list/spells = list() - var/channeling = FALSE - -/datum/action/innate/cult/blood_magic/Grant() - ..() - button.screen_loc = "6:-29,4:-2" - button.moved = "6:-29,4:-2" - button.locked = TRUE - -/datum/action/innate/cult/blood_magic/Remove() - for(var/X in spells) - qdel(X) - ..() - -/datum/action/innate/cult/blood_magic/IsAvailable() - if(!iscultist(owner)) - return FALSE - return ..() - -/datum/action/innate/cult/blood_magic/proc/Positioning() - for(var/datum/action/innate/cult/blood_spell/B in spells) - var/pos = -29+spells.Find(B)*31 - B.button.screen_loc = "6:[pos],4:-2" - B.button.moved = B.button.screen_loc - B.button.locked = TRUE - -/datum/action/innate/cult/blood_magic/Activate() - var/rune = FALSE - var/limit = RUNELESS_MAX_BLOODCHARGE - for(var/obj/effect/rune/empower/R in range(1, owner)) - rune = TRUE - break - if(rune) - limit = MAX_BLOODCHARGE - if(spells.len >= limit) - if(rune) - to_chat(owner, "Your body has reached its limit, you cannot store more than [MAX_BLOODCHARGE] spells at once. Pick a spell to nullify.") - else - to_chat(owner, "Your body has reached its limit, you cannot have more than [RUNELESS_MAX_BLOODCHARGE] spells at once without an empowering rune! Pick a spell to nullify.") - var/nullify_spell = input(owner, "Choose a spell to remove.", "Current Spells") as null|anything in spells - if(nullify_spell) - qdel(nullify_spell) - return - var/entered_spell_name - var/datum/action/innate/cult/blood_spell/BS - var/list/possible_spells = list() - for(var/I in subtypesof(/datum/action/innate/cult/blood_spell)) - var/datum/action/innate/cult/blood_spell/J = I - var/cult_name = initial(J.name) - possible_spells[cult_name] = J - possible_spells += "(REMOVE SPELL)" - entered_spell_name = input(owner, "Pick a blood spell to prepare...", "Spell Choices") as null|anything in possible_spells - if(entered_spell_name == "(REMOVE SPELL)") - var/nullify_spell = input(owner, "Choose a spell to remove.", "Current Spells") as null|anything in spells - if(nullify_spell) - qdel(nullify_spell) - return - BS = possible_spells[entered_spell_name] - if(QDELETED(src) || owner.incapacitated() || !BS) - return - to_chat(owner,"You begin to carve unnatural symbols into your flesh!") - SEND_SOUND(owner, sound('sound/weapons/slice.ogg',0,1,10)) - if(!channeling) - channeling = TRUE - else - to_chat(owner, "You are already invoking blood magic!") - return - if(do_after(owner, 100 - rune*65, target = owner)) - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.bleed(30 - rune*25) - var/datum/action/innate/cult/blood_spell/new_spell = new BS(owner) - new_spell.Grant(owner, src) - spells += new_spell - Positioning() - to_chat(owner, "Your wounds glows with power, you have prepared a [new_spell.name] invocation!") - channeling = FALSE - -/datum/action/innate/cult/blood_spell //The next generation of talismans - name = "Blood Magic" - button_icon_state = "telerune" - desc = "Fear the Old Blood." - var/charges = 1 - var/magic_path = null - var/obj/item/melee/blood_magic/hand_magic - var/datum/action/innate/cult/blood_magic/all_magic - var/base_desc //To allow for updating tooltips - var/invocation - var/health_cost = 0 - -/datum/action/innate/cult/blood_spell/Grant(mob/living/owner, datum/action/innate/cult/blood_magic/BM) - if(health_cost) - desc += "
    Deals [health_cost] damage to your arm per use." - base_desc = desc - desc += "
    Has [charges] use\s remaining." - all_magic = BM - ..() - -/datum/action/innate/cult/blood_spell/Remove() - if(all_magic) - all_magic.spells -= src - if(hand_magic) - qdel(hand_magic) - hand_magic = null - ..() - -/datum/action/innate/cult/blood_spell/IsAvailable() - if(!iscultist(owner) || owner.incapacitated() || !charges) - return FALSE - return ..() - -/datum/action/innate/cult/blood_spell/Activate() - if(magic_path) //If this spell flows from the hand - if(!hand_magic) - hand_magic = new magic_path(owner, src) - if(!owner.put_in_hands(hand_magic)) - qdel(hand_magic) - hand_magic = null - to_chat(owner, "You have no empty hand for invoking blood magic!") - return - to_chat(owner, "Your old wounds glow again as you invoke the [name].") - return - if(hand_magic) - qdel(hand_magic) - hand_magic = null - to_chat(owner, "You snuff out the spell with your hand, saving its power for another time.") - - -//Cult Blood Spells -/datum/action/innate/cult/blood_spell/stun - name = "Stun" - desc = "A potent spell that will stun and mute victims upon contact." - button_icon_state = "hand" - magic_path = "/obj/item/melee/blood_magic/stun" - health_cost = 10 - -/datum/action/innate/cult/blood_spell/teleport - name = "Teleport" - desc = "A useful spell that teleport cultists to a chosen destination on contact." - button_icon_state = "tele" - magic_path = "/obj/item/melee/blood_magic/teleport" - health_cost = 7 - -/datum/action/innate/cult/blood_spell/emp - name = "Electromagnetic Pulse" - desc = "A large spell that immediately disables all electronics in the area." - button_icon_state = "emp" - health_cost = 10 - invocation = "Ta'gh fara'qha fel d'amar det!" - -/datum/action/innate/cult/blood_spell/emp/Activate() - owner.visible_message("[owner]'s hand flashes a bright blue!", \ - "You speak the cursed words, emitting an EMP blast from your hand.") - empulse(owner, 3, 6) - owner.whisper(invocation, language = /datum/language/common) - charges-- - if(charges<=0) - qdel(src) - -/datum/action/innate/cult/blood_spell/shackles - name = "Shadow Shackles" - desc = "A stealthy spell that will handcuff and temporarily silence your victim." - button_icon_state = "cuff" - charges = 4 - magic_path = "/obj/item/melee/blood_magic/shackles" - -/datum/action/innate/cult/blood_spell/construction - name = "Twisted Construction" - desc = "A sinister spell used to convert:
    Plasteel into runed metal
    25 metal into a construct shell
    Cyborgs directly into constructs
    Cyborg shells into construct shells
    Airlocks into runed airlocks (harm intent)" - button_icon_state = "transmute" - magic_path = "/obj/item/melee/blood_magic/construction" - -/datum/action/innate/cult/blood_spell/equipment - name = "Summon Equipment" - desc = "A crucial spell that enables you to summon either a ritual dagger or combat gear including armored robes, the nar'sien bola, and an eldritch longsword." - button_icon_state = "equip" - magic_path = "/obj/item/melee/blood_magic/armor" - -/datum/action/innate/cult/blood_spell/equipment/Activate() - var/choice = alert(owner,"Choose your equipment type",,"Combat Equipment","Ritual Dagger","Cancel") - if(choice == "Ritual Dagger") - var/turf/T = get_turf(owner) - owner.visible_message("[owner]'s hand glows red for a moment.", \ - "Red light begins to shimmer and take form within your hand!") - var/obj/O = new /obj/item/melee/cultblade/dagger(T) - if(owner.put_in_hands(O)) - to_chat(owner, "A ritual dagger appears in your hand!") - else - owner.visible_message("A ritual dagger appears at [owner]'s feet!", \ - "A ritual dagger materializes at your feet.") - SEND_SOUND(owner, sound('sound/effects/magic.ogg',0,1,25)) - charges-- - desc = base_desc - desc += "
    Has [charges] use\s remaining." - if(charges<=0) - qdel(src) - else if(choice == "Combat Equipment") - ..() - -/datum/action/innate/cult/blood_spell/horror - name = "Hallucinations" - desc = "A ranged yet stealthy spell that will break the mind of the victim with nightmarish hallucinations." - button_icon_state = "horror" - var/obj/effect/proc_holder/horror/PH - charges = 4 - -/datum/action/innate/cult/blood_spell/horror/New() - PH = new() - PH.attached_action = src - ..() - -/datum/action/innate/cult/blood_spell/horror/Destroy() - var/obj/effect/proc_holder/horror/destroy = PH - . = ..() - if(destroy && !QDELETED(destroy)) - QDEL_NULL(destroy) - -/datum/action/innate/cult/blood_spell/horror/Activate() - PH.toggle(owner) //the important bit - return TRUE - -/obj/effect/proc_holder/horror - active = FALSE - ranged_mousepointer = 'icons/effects/cult_target.dmi' - var/datum/action/innate/cult/blood_spell/attached_action - -/obj/effect/proc_holder/horror/Destroy() - var/datum/action/innate/cult/blood_spell/AA = attached_action - . = ..() - if(AA && !QDELETED(AA)) - QDEL_NULL(AA) - -/obj/effect/proc_holder/horror/proc/toggle(mob/user) - if(active) - remove_ranged_ability("You dispel the magic...") - else - add_ranged_ability(user, "You prepare to horrify a target...") - -/obj/effect/proc_holder/horror/InterceptClickOn(mob/living/caller, params, atom/target) - if(..()) - return - if(ranged_ability_user.incapacitated() || !iscultist(caller)) - remove_ranged_ability() - return - var/turf/T = get_turf(ranged_ability_user) - if(!isturf(T)) - return FALSE - if(target in view(7, get_turf(ranged_ability_user))) - if(!ishuman(target) || iscultist(target)) - return - var/mob/living/carbon/human/H = target - H.hallucination = max(H.hallucination, 240) - SEND_SOUND(ranged_ability_user, sound('sound/effects/ghost.ogg',0,1,50)) - var/image/C = image('icons/effects/cult_effects.dmi',H,"bloodsparkles", ABOVE_MOB_LAYER) - add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/cult, "cult_apoc", C, FALSE) - addtimer(CALLBACK(H,/atom/.proc/remove_alt_appearance,"cult_apoc",TRUE), 2400, TIMER_OVERRIDE|TIMER_UNIQUE) - to_chat(ranged_ability_user,"[H] has been cursed with living nightmares!") - attached_action.charges-- - attached_action.desc = attached_action.base_desc - attached_action.desc += "
    Has [attached_action.charges] use\s remaining." - attached_action.UpdateButtonIcon() - if(attached_action.charges <= 0) - remove_mousepointer(ranged_ability_user.client) - remove_ranged_ability("You have exhausted the spell's power!") - qdel(src) - -/datum/action/innate/cult/blood_spell/veiling - name = "Conceal Presence" - desc = "A multi-function spell that alternates between hiding and revealing nearby cult runes, structures, turf, and airlocks." - invocation = "Kla'atu barada nikt'o!" - button_icon_state = "gone" - charges = 10 - var/revealing = FALSE //if it reveals or not - -/datum/action/innate/cult/blood_spell/veiling/Activate() - if(!revealing) - owner.visible_message("Thin grey dust falls from [owner]'s hand!", \ - "You invoke the veiling spell, hiding nearby runes.") - charges-- - SEND_SOUND(owner, sound('sound/magic/smoke.ogg',0,1,25)) - owner.whisper(invocation, language = /datum/language/common) - for(var/obj/effect/rune/R in range(5,owner)) - R.conceal() - for(var/obj/structure/destructible/cult/S in range(5,owner)) - S.conceal() - for(var/turf/open/floor/engine/cult/T in range(5,owner)) - T.realappearance.alpha = 0 - for(var/obj/machinery/door/airlock/cult/AL in range(5, owner)) - AL.conceal() - revealing = TRUE - name = "Reveal Runes" - button_icon_state = "back" - else - owner.visible_message("A flash of light shines from [owner]'s hand!", \ - "You invoke the counterspell, revealing nearby runes.") - charges-- - owner.whisper(invocation, language = /datum/language/common) - SEND_SOUND(owner, sound('sound/magic/enter_blood.ogg',0,1,25)) - for(var/obj/effect/rune/R in range(7,owner)) //More range in case you weren't standing in exactly the same spot - R.reveal() - for(var/obj/structure/destructible/cult/S in range(6,owner)) - S.reveal() - for(var/turf/open/floor/engine/cult/T in range(6,owner)) - T.realappearance.alpha = initial(T.realappearance.alpha) - for(var/obj/machinery/door/airlock/cult/AL in range(6, owner)) - AL.reveal() - revealing = FALSE - name = "Conceal Runes" - button_icon_state = "gone" - if(charges<= 0) - qdel(src) - desc = base_desc - desc += "
    Has [charges] use\s remaining." - UpdateButtonIcon() - -/datum/action/innate/cult/blood_spell/manipulation - name = "Blood Rites" - desc = "A complex spell that allows you to gather blood and use it for healing or other powerful spells." - invocation = "Fel'th Dol Ab'orod!" - button_icon_state = "manip" - charges = 5 - magic_path = "/obj/item/melee/blood_magic/manipulator" - - -// The "magic hand" items -/obj/item/melee/blood_magic - name = "\improper magical aura" - desc = "Sinister looking aura that distorts the flow of reality around it." - icon = 'icons/obj/items_and_weapons.dmi' - icon_state = "disintegrate" - item_state = null - flags_1 = ABSTRACT_1 | NODROP_1 | DROPDEL_1 - w_class = WEIGHT_CLASS_HUGE - throwforce = 0 - throw_range = 0 - throw_speed = 0 - var/invocation - var/uses = 1 - var/health_cost = 0 //The amount of health taken from the user when invoking the spell - var/datum/action/innate/cult/blood_spell/source - -/obj/item/melee/blood_magic/New(loc, spell) - source = spell - uses = source.charges - health_cost = source.health_cost - ..() - -/obj/item/melee/blood_magic/Destroy() - if(!QDELETED(source)) - if(uses <= 0) - source.hand_magic = null - qdel(source) - source = null - else - source.hand_magic = null - source.charges = uses - source.desc = source.base_desc - source.desc += "
    Has [uses] use\s remaining." - source.UpdateButtonIcon() - ..() - -/obj/item/melee/blood_magic/attack_self(mob/living/user) - afterattack(user, user, TRUE) - -/obj/item/melee/blood_magic/attack(mob/living/M, mob/living/carbon/user) - if(!iscarbon(user) || !iscultist(user)) - uses = 0 - qdel(src) - return - add_logs(user, M, "used a cult spell on", source.name, "") - M.lastattacker = user.real_name - M.lastattackerckey = user.ckey - -/obj/item/melee/blood_magic/afterattack(atom/target, mob/living/carbon/user, proximity) - if(invocation) - user.whisper(invocation, language = /datum/language/common) - if(health_cost) - if(user.active_hand_index == 1) - user.apply_damage(health_cost, BRUTE, "l_arm") - else - user.apply_damage(health_cost, BRUTE, "r_arm") - if(uses <= 0) - qdel(src) - else if(source) - source.desc = source.base_desc - source.desc += "
    Has [uses] use\s remaining." - source.UpdateButtonIcon() - -//Stun -/obj/item/melee/blood_magic/stun - color = "#ff0000" // red - invocation = "Fuu ma'jin!" - -/obj/item/melee/blood_magic/stun/afterattack(atom/target, mob/living/carbon/user, proximity) - if(!isliving(target) || !proximity) - return - var/mob/living/L = target - if(iscultist(target)) - return - if(iscultist(user)) - user.visible_message("[user] holds up their hand, which explodes in a flash of red light!", \ - "You stun [L] with the spell!") - var/obj/item/nullrod/N = locate() in L - if(N) - target.visible_message("[L]'s holy weapon absorbs the light!", \ - "Your holy weapon absorbs the blinding light!") - else - L.Knockdown(180) - L.flash_act(1,1) - if(issilicon(target)) - var/mob/living/silicon/S = L - S.emp_act(EMP_HEAVY) - else if(iscarbon(target)) - var/mob/living/carbon/C = L - C.silent += 6 - C.stuttering += 15 - C.cultslurring += 15 - C.Jitter(15) - if(is_servant_of_ratvar(L)) - L.adjustBruteLoss(15) - uses-- - ..() - -//Teleportation -/obj/item/melee/blood_magic/teleport - color = RUNE_COLOR_TELEPORT - desc = "A potent spell that teleport cultists on contact." - invocation = "Sas'so c'arta forbici!" - -/obj/item/melee/blood_magic/teleport/afterattack(atom/target, mob/living/carbon/user, proximity) - if(!iscultist(target) || !proximity) - to_chat(user, "You can only teleport adjacent cultists with this spell!") - return - if(iscultist(user)) - var/list/potential_runes = list() - var/list/teleportnames = list() - for(var/R in GLOB.teleport_runes) - var/obj/effect/rune/teleport/T = R - potential_runes[avoid_assoc_duplicate_keys(T.listkey, teleportnames)] = T - - if(!potential_runes.len) - to_chat(user, "There are no valid runes to teleport to!") - log_game("Teleport talisman failed - no other teleport runes") - return - - var/turf/T = get_turf(src) - if(is_away_level(T.z)) - to_chat(user, "You are not in the right dimension!") - log_game("Teleport spell failed - user in away mission") - return - - var/input_rune_key = input(user, "Choose a rune to teleport to.", "Rune to Teleport to") as null|anything in potential_runes //we know what key they picked - var/obj/effect/rune/teleport/actual_selected_rune = potential_runes[input_rune_key] //what rune does that key correspond to? - if(QDELETED(src) || !user || !user.is_holding(src) || user.incapacitated() || !actual_selected_rune || !proximity) - return - var/turf/dest = get_turf(actual_selected_rune) - if(is_blocked_turf(dest, TRUE)) - to_chat(user, "The target rune is blocked. Attempting to teleport to it would be massively unwise.") - return - uses-- - user.visible_message("Dust flows from [user]'s hand, and [user.p_they()] disappear[user.p_s()] with a sharp crack!", \ - "You speak the words of the talisman and find yourself somewhere else!", "You hear a sharp crack.") - var/mob/living/L = target - L.forceMove(dest) - dest.visible_message("There is a boom of outrushing air as something appears above the rune!", null, "You hear a boom.") - ..() - -//Shackles -/obj/item/melee/blood_magic/shackles - name = "Shadow Shackles" - desc = "Allows you to bind a victim and temporarily silence them." - invocation = "In'totum Lig'abis!" - color = "#000000" // black - -/obj/item/melee/blood_magic/shackles/afterattack(atom/target, mob/living/carbon/user, proximity) - if(iscultist(user) && iscarbon(target) && proximity) - var/mob/living/carbon/C = target - if(C.get_num_arms() >= 2 || C.get_arm_ignore()) - CuffAttack(C, user) - else - user.visible_message("This victim doesn't have enough arms to complete the restraint!") - return - ..() - -/obj/item/melee/blood_magic/shackles/proc/CuffAttack(mob/living/carbon/C, mob/living/user) - if(!C.handcuffed) - playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2) - C.visible_message("[user] begins restraining [C] with dark magic!", \ - "[user] begins shaping a dark magic around your wrists!") - if(do_mob(user, C, 30)) - if(!C.handcuffed) - C.handcuffed = new /obj/item/restraints/handcuffs/energy/cult/used(C) - C.update_handcuffed() - C.silent += 5 - to_chat(user, "You shackle [C].") - add_logs(user, C, "shackled") - uses-- - else - to_chat(user, "[C] is already bound.") - else - to_chat(user, "You fail to shackle [C].") - else - to_chat(user, "[C] is already bound.") - - -/obj/item/restraints/handcuffs/energy/cult //For the shackling spell - name = "shadow shackles" - desc = "Shackles that bind the wrists with sinister magic." - trashtype = /obj/item/restraints/handcuffs/energy/used - flags_1 = DROPDEL_1 - -/obj/item/restraints/handcuffs/energy/cult/used/dropped(mob/user) - user.visible_message("[user]'s shackles shatter in a discharge of dark magic!", \ - "Your [src] shatters in a discharge of dark magic!") - . = ..() - - -//Construction: Creates a construct shell out of 25 metal sheets, or converts plasteel into runed metal -/obj/item/melee/blood_magic/construction - name = "Twisted Construction" - desc = "Corrupts metal and plasteel into more sinister forms." - invocation = "Ethra p'ni dedol!" - color = "#000000" // black - -/obj/item/melee/blood_magic/construction/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - if(proximity_flag && iscultist(user)) - var/turf/T = get_turf(target) - if(istype(target, /obj/item/stack/sheet/metal)) - var/obj/item/stack/sheet/candidate = target - if(candidate.use(50)) - uses-- - to_chat(user, "A dark cloud eminates from your hand and swirls around the metal, twisting it into a construct shell!") - new /obj/structure/constructshell(T) - SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) - else - to_chat(user, "You need 50 metal to produce a construct shell!") - else if(istype(target, /obj/item/stack/sheet/plasteel)) - var/obj/item/stack/sheet/plasteel/candidate = target - var/quantity = min(candidate.amount, uses) - uses -= quantity - new /obj/item/stack/sheet/runed_metal(T,quantity) - candidate.use(quantity) - to_chat(user, "A dark cloud eminates from you hand and swirls around the plasteel, transforming it into runed metal!") - SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) - else if(istype(target,/mob/living/silicon/robot)) - var/mob/living/silicon/robot/candidate = target - if(candidate.mmi) - user.visible_message("A dark cloud eminates from [user]'s hand and swirls around [candidate]!") - playsound(T, 'sound/machines/airlock_alien_prying.ogg', 80, 1) - var/prev_color = candidate.color - candidate.color = "black" - if(do_after(user, 90, target = candidate)) - candidate.emp_act(EMP_HEAVY) - var/construct_class = alert(user, "Please choose which type of construct you wish to create.",,"Juggernaut","Wraith","Artificer") - user.visible_message("The dark cloud receedes from what was formerly [candidate], revealing a\n [construct_class]!") - switch(construct_class) - if("Juggernaut") - makeNewConstruct(/mob/living/simple_animal/hostile/construct/armored, candidate, user, 0, T) - if("Wraith") - makeNewConstruct(/mob/living/simple_animal/hostile/construct/wraith, candidate, user, 0, T) - if("Artificer") - makeNewConstruct(/mob/living/simple_animal/hostile/construct/builder, candidate, user, 0, T) - SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) - uses-- - candidate.mmi = null - qdel(candidate) - else - candidate.color = prev_color - else - uses-- - to_chat(user, "A dark cloud eminates from you hand and swirls around [candidate] - twisting it into a construct shell!") - new /obj/structure/constructshell(T) - SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) - else if(istype(target,/obj/machinery/door/airlock)) - target.narsie_act() - uses-- - user.visible_message("Black ribbons suddenly eminate from [user]'s hand and cling to the airlock - twisting and corrupting it!") - SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) - else - to_chat(user, "The spell will not work on [target]!") - ..() - -//Armor: Gives the target a basic cultist combat loadout -/obj/item/melee/blood_magic/armor - name = "Sinister Armaments" - desc = "A spell that will equip the target with cultist equipment if there is a slot to equip it to." - color = "#33cc33" // green - -/obj/item/melee/blood_magic/armor/afterattack(atom/target, mob/living/carbon/user, proximity) - if(iscarbon(target) && proximity) - uses-- - var/mob/living/carbon/C = target - C.visible_message("Otherworldly armor suddenly appears on [C]!") - C.equip_to_slot_or_del(new /obj/item/clothing/under/color/black,slot_w_uniform) - C.equip_to_slot_or_del(new /obj/item/clothing/head/culthood/alt(user), slot_head) - C.equip_to_slot_or_del(new /obj/item/clothing/suit/cultrobes/alt(user), slot_wear_suit) - C.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult/alt(user), slot_shoes) - C.equip_to_slot_or_del(new /obj/item/storage/backpack/cultpack(user), slot_back) - if(C == user) - qdel(src) //Clears the hands - C.put_in_hands(new /obj/item/melee/cultblade(user)) - C.put_in_hands(new /obj/item/restraints/legcuffs/bola/cult(user)) - ..() - -/obj/item/melee/blood_magic/manipulator - name = "Blood Rite" - desc = "A spell that will absorb blood from anything you touch.
    Touching cultists and constructs can heal them.
    Clicking the hand will potentially let you focus the spell into something stronger." - color = "#7D1717" - -/obj/item/melee/blood_magic/manipulator/afterattack(atom/target, mob/living/carbon/human/user, proximity) - if(proximity) - if(ishuman(target)) - var/mob/living/carbon/human/H = target - if(NOBLOOD in H.dna.species.species_traits) - to_chat(user,"Blood rites do not work on species with no blood!") - return - if(iscultist(H)) - if(H.stat == DEAD) - to_chat(user,"Only a revive rune can bring back the dead!") - return - if(H.blood_volume < BLOOD_VOLUME_SAFE) - var/restore_blood = BLOOD_VOLUME_SAFE - H.blood_volume - if(uses*2 < restore_blood) - H.blood_volume += uses*2 - to_chat(user,"You use the last of your blood rites to restore what blood you could!") - uses = 0 - return ..() - else - H.blood_volume = BLOOD_VOLUME_SAFE - uses -= round(restore_blood/2) - to_chat(user,"Your blood rites have restored [H == user ? "your" : "their"] blood to safe levels!") - var/overall_damage = H.getBruteLoss() + H.getFireLoss() + H.getToxLoss() + H.getOxyLoss() - if(overall_damage == 0) - to_chat(user,"That cultist doesn't require healing!") - else - var/ratio = uses/overall_damage - if(H == user) - to_chat(user,"Your blood healing is far less efficient when used on yourself!") - ratio *= 0.35 // Healing is half as effective if you can't perform a full heal - uses -= round(overall_damage) // Healing is 65% more "expensive" even if you can still perform the full heal - if(ratio>1) - ratio = 1 - uses -= round(overall_damage) - H.visible_message("[H] is fully healed by [H==user ? "their":"[H]'s"]'s blood magic!") - else - H.visible_message("[H] is partially healed by [H==user ? "their":"[H]'s"] blood magic.") - uses = 0 - ratio *= -1 - H.adjustOxyLoss((overall_damage*ratio) * (H.getOxyLoss() / overall_damage), 0) - H.adjustToxLoss((overall_damage*ratio) * (H.getToxLoss() / overall_damage), 0) - H.adjustFireLoss((overall_damage*ratio) * (H.getFireLoss() / overall_damage), 0) - H.adjustBruteLoss((overall_damage*ratio) * (H.getBruteLoss() / overall_damage), 0) - H.updatehealth() - playsound(get_turf(H), 'sound/magic/staff_healing.ogg', 25) - new /obj/effect/temp_visual/cult/sparks(get_turf(H)) - user.Beam(H,icon_state="sendbeam",time=15) - else - if(H.stat == DEAD) - to_chat(user,"Their blood has stopped flowing, you'll have to find another way to extract it.") - return - if(H.cultslurring) - to_chat(user,"Their blood has been tainted by an even stronger form of blood magic, it's no use to us like this!") - return - if(H.blood_volume > BLOOD_VOLUME_SAFE) - H.blood_volume -= 100 - uses += 50 - user.Beam(H,icon_state="drainbeam",time=10) - playsound(get_turf(H), 'sound/magic/enter_blood.ogg', 50) - H.visible_message("[user] has drained some of [H]'s blood!") - to_chat(user,"Your blood rite gains 50 charges from draining [H]'s blood.") - new /obj/effect/temp_visual/cult/sparks(get_turf(H)) - else - to_chat(user,"They're missing too much blood - you cannot drain them further!") - return - if(isconstruct(target)) - var/mob/living/simple_animal/M = target - var/missing = M.maxHealth - M.health - if(missing) - if(uses > missing) - M.adjustHealth(-missing) - M.visible_message("[M] is fully-healed by [user]'s blood magic!") - uses -= missing - else - M.adjustHealth(-uses) - M.visible_message("[M] is healed by [user]'sblood magic!") - uses = 0 - playsound(get_turf(M), 'sound/magic/staff_healing.ogg', 25) - user.Beam(M,icon_state="sendbeam",time=10) - if(istype(target, /obj/effect/decal/cleanable/blood)) - blood_draw(target, user) - ..() - -/obj/item/melee/blood_magic/manipulator/proc/blood_draw(atom/target, mob/living/carbon/human/user) - var/temp = 0 - var/turf/T = get_turf(target) - if(T) - for(var/obj/effect/decal/cleanable/blood/B in view(T, 2)) - if(B.blood_state == "blood") - if(B.bloodiness == 100) //Bonus for "pristine" bloodpools, also to prevent cheese with footprint spam - temp += 30 - else - temp += max((B.bloodiness**2)/800,1) - new /obj/effect/temp_visual/cult/turf/floor(get_turf(B)) - qdel(B) - for(var/obj/effect/decal/cleanable/trail_holder/TH in view(T, 2)) - qdel(TH) - var/obj/item/clothing/shoes/shoecheck = user.shoes - if(shoecheck && shoecheck.bloody_shoes["blood"]) - temp += shoecheck.bloody_shoes["blood"]/20 - shoecheck.bloody_shoes["blood"] = 0 - if(temp) - user.Beam(T,icon_state="drainbeam",time=15) - new /obj/effect/temp_visual/cult/sparks(get_turf(user)) - playsound(T, 'sound/magic/enter_blood.ogg', 50) - to_chat(user, "Your blood rite has gained [round(temp)] charge\s from blood sources around you!") - uses += round(temp) - -/obj/item/melee/blood_magic/manipulator/attack_self(mob/living/user) - if(iscultist(user)) - var/list/options = list("Blood Spear (200)", "Blood Bolt Barrage (400)", "Blood Beam (600)") - var/choice = input(user, "Choose a greater blood rite...", "Greater Blood Rites") as null|anything in options - if(!choice) - to_chat(user, "You decide against conducting a greater blood rite.") - return - switch(choice) - if("Blood Spear (200)") - if(uses < 200) - to_chat(user, "You need 200 charges to perform this rite.") - else - uses -= 200 - var/turf/T = get_turf(user) - qdel(src) - var/datum/action/innate/cult/spear/S = new(user) - var/obj/item/twohanded/cult_spear/rite = new(T) - S.Grant(user, rite) - rite.spear_act = S - if(user.put_in_hands(rite)) - to_chat(user, "A [rite.name] appears in your hand!") - else - user.visible_message("A [rite.name] appears at [user]'s feet!", \ - "A [rite.name] materializes at your feet.") - if("Blood Bolt Barrage (400)") - if(uses < 400) - to_chat(user, "You need 400 charges to perform this rite.") - else - var/obj/rite = new /obj/item/gun/ballistic/shotgun/boltaction/enchanted/arcane_barrage/blood() - uses -= 400 - qdel(src) - if(user.put_in_hands(rite)) - to_chat(user, "Your hands glow with power!") - else - to_chat(user, "You need a free hand for this rite!") - qdel(rite) - if("Blood Beam (600)") - if(uses < 600) - to_chat(user, "You need 600 charges to perform this rite.") - else - var/obj/rite = new /obj/item/blood_beam() - uses -= 600 - qdel(src) - if(user.put_in_hands(rite)) - to_chat(user, "Your hands glow with POWER OVERWHELMING!!!") - else - to_chat(user, "You need a free hand for this rite!") - qdel(rite) diff --git a/code/citadel/dogborgstuff.dm b/code/game/objects/items/devices/dogborg_sleeper.dm similarity index 57% rename from code/citadel/dogborgstuff.dm rename to code/game/objects/items/devices/dogborg_sleeper.dm index fcefdcc3e3..217786f142 100644 --- a/code/citadel/dogborgstuff.dm +++ b/code/game/objects/items/devices/dogborg_sleeper.dm @@ -1,306 +1,4 @@ -/obj/item/dogborg/jaws/big - name = "combat jaws" - icon = 'icons/mob/dogborg.dmi' - icon_state = "jaws" - desc = "The jaws of the law." - flags_1 = CONDUCT_1 - force = 12 - throwforce = 0 - hitsound = 'sound/weapons/bite.ogg' - attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced") - w_class = 3 - sharpness = IS_SHARP - -/obj/item/dogborg/jaws/small - name = "puppy jaws" - icon = 'icons/mob/dogborg.dmi' - icon_state = "smalljaws" - desc = "The jaws of a small dog." - flags_1 = CONDUCT_1 - force = 6 - throwforce = 0 - hitsound = 'sound/weapons/bite.ogg' - attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed") - w_class = 3 - sharpness = IS_SHARP - -/obj/item/dogborg/jaws/attack(atom/A, mob/living/silicon/robot/user) - ..() - user.do_attack_animation(A, ATTACK_EFFECT_BITE) - -/obj/item/dogborg/jaws/small/attack_self(mob/user) - var/mob/living/silicon/robot.R = user - if(R.emagged) - name = "combat jaws" - icon = 'icons/mob/dogborg.dmi' - icon_state = "jaws" - desc = "The jaws of the law." - flags_1 = CONDUCT_1 - force = 12 - throwforce = 0 - hitsound = 'sound/weapons/bite.ogg' - attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced") - w_class = 3 - sharpness = IS_SHARP - else - name = "puppy jaws" - icon = 'icons/mob/dogborg.dmi' - icon_state = "smalljaws" - desc = "The jaws of a small dog." - flags_1 = CONDUCT_1 - force = 5 - throwforce = 0 - hitsound = 'sound/weapons/bite.ogg' - attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed") - w_class = 3 - sharpness = IS_SHARP - update_icon() - - -//Cuffs - -/obj/item/restraints/handcuffs/cable/zipties/cyborg/dog/attack(mob/living/carbon/C, mob/user) - if(!C.handcuffed) - playsound(loc, 'sound/weapons/cablecuff.ogg', 60, 1, -2) - C.visible_message("[user] is trying to put zipties on [C]!", \ - "[user] is trying to put zipties on [C]!") - if(do_mob(user, C, 60)) - if(!C.handcuffed) - C.handcuffed = new /obj/item/restraints/handcuffs/cable/zipties/used(C) - C.update_inv_handcuffed(0) - to_chat(user,"You handcuff [C].") - playsound(loc, pick('sound/voice/bgod.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/bsecureday.ogg', 'sound/voice/bradio.ogg', 'sound/voice/binsult.ogg', 'sound/voice/bcreep.ogg'), 50, 0) - add_logs(user, C, "handcuffed") - else - to_chat(user,"You fail to handcuff [C]!") - - -//Boop - -/obj/item/device/analyzer/nose - name = "boop module" - icon = 'icons/mob/dogborg.dmi' - icon_state = "nose" - desc = "The BOOP module" - flags_1 = CONDUCT_1 - force = 0 - throwforce = 0 - attack_verb = list("nuzzled", "nosed", "booped") - w_class = 1 - -/obj/item/device/analyzer/nose/attack_self(mob/user) - user.visible_message("[user] sniffs around the air.", "You sniff the air for gas traces.") - - var/turf/location = user.loc - if(!istype(location)) - return - - var/datum/gas_mixture/environment = location.return_air() - - var/pressure = environment.return_pressure() - var/total_moles = environment.total_moles() - - to_chat(user, "Results:") - if(abs(pressure - ONE_ATMOSPHERE) < 10) - to_chat(user, "Pressure: [round(pressure,0.1)] kPa") - else - to_chat(user, "Pressure: [round(pressure,0.1)] kPa") - if(total_moles) - var/list/env_gases = environment.gases - - environment.assert_gases(arglist(GLOB.hardcoded_gases)) - var/o2_concentration = env_gases[/datum/gas/oxygen][MOLES]/total_moles - var/n2_concentration = env_gases[/datum/gas/nitrogen][MOLES]/total_moles - var/co2_concentration = env_gases[/datum/gas/carbon_dioxide][MOLES]/total_moles - var/plasma_concentration = env_gases[/datum/gas/plasma][MOLES]/total_moles - environment.garbage_collect() - - if(abs(n2_concentration - N2STANDARD) < 20) - to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] %") - else - to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] %") - - if(abs(o2_concentration - O2STANDARD) < 2) - to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] %") - else - to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] %") - - if(co2_concentration > 0.01) - to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] %") - else - to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] %") - - if(plasma_concentration > 0.005) - to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] %") - else - to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] %") - - - for(var/id in env_gases) - if(id in GLOB.hardcoded_gases) - continue - var/gas_concentration = env_gases[id][MOLES]/total_moles - to_chat(user, "[env_gases[id][GAS_META][META_GAS_NAME]]: [round(gas_concentration*100, 0.01)] %") - to_chat(user, "Temperature: [round(environment.temperature-T0C)] °C") - -/obj/item/device/analyzer/nose/AltClick(mob/user) //Barometer output for measuring when the next storm happens - . = ..() - -//Delivery - -/obj/item/storage/bag/borgdelivery - name = "fetching storage" - desc = "Fetch the thing!" - icon = 'icons/mob/dogborg.dmi' - icon_state = "dbag" - //Can hold one big item at a time. Drops contents on unequip.(see inventory.dm) - w_class = 5 - max_w_class = 2 - max_combined_w_class = 2 - storage_slots = 1 - collection_mode = 0 - can_hold = list() // any - cant_hold = list(/obj/item/disk/nuclear) - - -//Tongue stuff - -/obj/item/soap/tongue - name = "synthetic tongue" - desc = "Useful for slurping mess off the floor before affectionally licking the crew members in the face." - icon = 'icons/mob/dogborg.dmi' - icon_state = "synthtongue" - hitsound = 'sound/effects/attackblob.ogg' - cleanspeed = 80 - -/obj/item/soap/tongue/scrubpup - cleanspeed = 25 //slightly faster than a mop. - -/obj/item/soap/tongue/New() - ..() - flags_1 |= NOBLUDGEON_1 //No more attack messages - -/obj/item/trash/rkibble - name = "robo kibble" - desc = "A novelty bowl of assorted mech fabricator byproducts. Mockingly feed this to the sec-dog to help it recharge." - icon = 'icons/mob/dogborg.dmi' - icon_state= "kibble" - -/obj/item/soap/tongue/attack_self(mob/user) - var/mob/living/silicon/robot.R = user - if(R.emagged) - name = "hacked tongue of doom" - desc = "Your tongue has been upgraded successfully. Congratulations." - icon = 'icons/mob/dogborg.dmi' - icon_state = "syndietongue" - cleanspeed = 10 //(nerf'd)tator soap stat - else - name = "synthetic tongue" - desc = "Useful for slurping mess off the floor before affectionally licking the crew members in the face." - icon = 'icons/mob/dogborg.dmi' - icon_state = "synthtongue" - cleanspeed = initial(cleanspeed) - update_icon() - -/obj/item/soap/tongue/afterattack(atom/target, mob/user, proximity) - var/mob/living/silicon/robot.R = user - if(!proximity || !check_allowed_items(target)) - return - if(R.client && (target in R.client.screen)) - to_chat(R, "You need to take that [target.name] off before cleaning it!") - else if(is_cleanable(target)) - R.visible_message("[R] begins to lick off \the [target.name].", "You begin to lick off \the [target.name]...") - if(do_after(R, src.cleanspeed, target = target)) - if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. - return //If they moved away, you can't eat them. - to_chat(R, "You finish licking off \the [target.name].") - qdel(target) - R.cell.give(50) - else if(isobj(target)) //hoo boy. danger zone man - if(istype(target,/obj/item/trash)) - R.visible_message("[R] nibbles away at \the [target.name].", "You begin to nibble away at \the [target.name]...") - if(do_after(R, src.cleanspeed, target = target)) - if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. - return //If they moved away, you can't eat them. - to_chat(R, "You finish off \the [target.name].") - qdel(target) - R.cell.give(250) - return - if(istype(target,/obj/item/stock_parts/cell)) - R.visible_message("[R] begins cramming \the [target.name] down its throat.", "You begin cramming \the [target.name] down your throat...") - if(do_after(R, 50, target = target)) - if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. - return //If they moved away, you can't eat them. - to_chat(R, "You finish off \the [target.name].") - var/obj/item/stock_parts/cell.C = target - R.cell.charge = R.cell.charge + (C.charge / 3) //Instant full cell upgrades op idgaf - qdel(target) - return - var/obj/item/I = target //HAHA FUCK IT, NOT LIKE WE ALREADY HAVE A SHITTON OF WAYS TO REMOVE SHIT - if(!I.anchored && R.emagged) - R.visible_message("[R] begins chewing up \the [target.name]. Looks like it's trying to loophole around its diet restriction!", "You begin chewing up \the [target.name]...") - if(do_after(R, 100, target = I)) //Nerf dat time yo - if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. Even emags don't make you magically eat things at range. - return //If they moved away, you can't eat them. - visible_message("[R] chews up \the [target.name] and cleans off the debris!") - to_chat(R, "You finish off \the [target.name].") - qdel(I) - R.cell.give(500) - return - R.visible_message("[R] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean...") - if(do_after(R, src.cleanspeed, target = target)) - if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. - return //If they moved away, you can't clean them. - to_chat(R,"You clean \the [target.name].") - var/obj/effect/decal/cleanable/C = locate() in target - qdel(C) - SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - else if(ishuman(target)) - if(R.emagged) - var/mob/living/L = target - if(R.cell.charge <= 666) - return - L.Stun(4) // normal stunbaton is force 7 gimme a break good sir! - L.Knockdown(80) - L.apply_effect(STUTTER, 4) - L.visible_message("[R] has shocked [L] with its tongue!", \ - "[R] has shocked you with its tongue! You can feel the betrayal.") - playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) - R.cell.use(666) - else - R.visible_message("\the [R] affectionally licks \the [target]'s face!", "You affectionally lick \the [target]'s face!") - playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1) - return - else if(istype(target, /obj/structure/window)) - R.visible_message("[R] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean...") - if(do_after(R, src.cleanspeed, target = target)) - if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. - return //If they moved away, you can't clean them. - to_chat(R, "You clean \the [target.name].") - target.color = initial(target.color) - else - R.visible_message("[R] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean...") - if(do_after(R, src.cleanspeed, target = target)) - if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. - return //If they moved away, you can't clean them. - to_chat(R, "You clean \the [target.name].") - var/obj/effect/decal/cleanable/C = locate() in target - qdel(C) - SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - return - - - -//Defibs - -/obj/item/twohanded/shockpaddles/cyborg/hound - name = "defibrillator paws" - desc = "MediHound specific shock paws." - icon = 'icons/mob/dogborg.dmi' - icon_state = "defibpaddles0" - item_state = "defibpaddles0" - -//Sleeper +// Dogborg Sleeper units /obj/item/device/dogborg/sleeper name = "hound sleeper" @@ -363,7 +61,7 @@ return if(!(target.client && target.client.prefs && target.client.prefs.toggles && (target.client.prefs.toggles & MEDIHOUND_SLEEPER))) to_chat(user, "This person is incompatible with our equipment.") - return + return if(target.buckled) to_chat(user, "The user is buckled and can not be put into your [src.name].") return @@ -799,101 +497,4 @@ user.visible_message("[hound.name]'s garbage processor groans lightly as [trashman] slips inside.", "Your garbage compactor groans lightly as [trashman] slips inside.") playsound(hound, 'sound/effects/bin_close.ogg', 80, 1) return - return - - -// Pounce stuff for K-9 - -/obj/item/dogborg/pounce - name = "pounce" - icon = 'icons/mob/dogborg.dmi' - icon_state = "pounce" - desc = "Leap at your target to momentarily stun them." - force = 0 - throwforce = 0 - -/obj/item/dogborg/pounce/New() - ..() - flags_1 |= NOBLUDGEON_1 - -/mob/living/silicon/robot - var/leaping = 0 - var/pounce_cooldown = 0 - var/pounce_cooldown_time = 50 //Nearly doubled, u happy? - var/pounce_spoolup = 3 - var/leap_at - var/disabler - var/laser - var/sleeper_g - var/sleeper_r - -#define MAX_K9_LEAP_DIST 4 //because something's definitely borked the pounce functioning from a distance. - -/obj/item/dogborg/pounce/afterattack(atom/A, mob/user) - var/mob/living/silicon/robot/R = user - if(R && !R.pounce_cooldown) - R.pounce_cooldown = !R.pounce_cooldown - to_chat(R, "Your targeting systems lock on to [A]...") - addtimer(CALLBACK(R, /mob/living/silicon/robot.proc/leap_at, A), R.pounce_spoolup) - spawn(R.pounce_cooldown_time) - R.pounce_cooldown = !R.pounce_cooldown - else if(R && R.pounce_cooldown) - to_chat(R, "Your leg actuators are still recharging!") - -/mob/living/silicon/robot/proc/leap_at(atom/A) - if(leaping || stat || buckled || lying) - return - - if(!has_gravity(src) || !has_gravity(A)) - to_chat(src,"It is unsafe to leap without gravity!") - //It's also extremely buggy visually, so it's balance+bugfix - return - - if(cell.charge <= 500) - to_chat(src,"Insufficent reserves for jump actuators!") - return - - else - leaping = 1 - weather_immunities += "lava" - pixel_y = 10 - update_icons() - throw_at(A, MAX_K9_LEAP_DIST, 1, spin=0, diagonals_first = 1) - cell.use(500) //Doubled the energy consumption - weather_immunities -= "lava" - -/mob/living/silicon/robot/throw_impact(atom/A) - - if(!leaping) - return ..() - - if(A) - if(isliving(A)) - var/mob/living/L = A - var/blocked = 0 - if(ishuman(A)) - var/mob/living/carbon/human/H = A - if(H.check_shields(0, "the [name]", src, attack_type = LEAP_ATTACK)) - blocked = 1 - if(!blocked) - L.visible_message("[src] pounces on [L]!", "[src] pounces on you!") - L.Knockdown(45) - playsound(src, 'sound/weapons/Egloves.ogg', 50, 1) - sleep(2)//Runtime prevention (infinite bump() calls on hulks) - step_towards(src,L) - else - Knockdown(45, 1, 1) - - pounce_cooldown = !pounce_cooldown - spawn(pounce_cooldown_time) //3s by default - pounce_cooldown = !pounce_cooldown - else if(A.density && !A.CanPass(src)) - visible_message("[src] smashes into [A]!", "You smash into [A]!") - playsound(src, 'sound/items/trayhit1.ogg', 50, 1) - Knockdown(45, 1, 1) - - if(leaping) - leaping = 0 - pixel_y = initial(pixel_y) - update_icons() - update_canmove() + return \ No newline at end of file diff --git a/code/game/skincmd.dm b/code/game/skincmd.dm deleted file mode 100644 index ad2f97f55a..0000000000 --- a/code/game/skincmd.dm +++ /dev/null @@ -1,13 +0,0 @@ -/mob/var/skincmds = list() -/obj/proc/SkinCmd(mob/user as mob, var/data as text) - -/proc/SkinCmdRegister(mob/user, name as text, obj/O) - user.skincmds[name] = O - -/mob/verb/skincmd(data as text) - set hidden = 1 - - var/ref = copytext(data, 1, findtext(data, ";")) - if (src.skincmds[ref] != null) - var/obj/a = src.skincmds[ref] - a.SkinCmd(src, copytext(data, findtext(data, ";") + 1)) \ No newline at end of file diff --git a/code/modules/atmospherics/machinery/other/zvent.dm b/code/modules/atmospherics/machinery/other/zvent.dm deleted file mode 100644 index d12c6196ec..0000000000 --- a/code/modules/atmospherics/machinery/other/zvent.dm +++ /dev/null @@ -1,36 +0,0 @@ -/obj/machinery/zvent - name = "interfloor air transfer system" - - icon = 'icons/obj/atmospherics/components/unary_devices.dmi' - icon_state = "vent_map" - density = FALSE - anchored=1 - desc = "This may be needed some day." - - var/on = FALSE - var/volume_rate = 800 - -/obj/machinery/zvent/New() - ..() - SSair.atmos_machinery += src - -/obj/machinery/zvent/Destroy() - SSair.atmos_machinery -= src - return ..() - -/obj/machinery/zvent/process_atmos() - - //all this object does, is make its turf share air with the ones above and below it, if they have a vent too. - if(isturf(loc)) //if we're not on a valid turf, forget it - for (var/new_z in list(-1,1)) //change this list if a fancier system of z-levels gets implemented - var/turf/open/zturf_conn = locate(x,y,z+new_z) - if (istype(zturf_conn)) - var/obj/machinery/zvent/zvent_conn= locate(/obj/machinery/zvent) in zturf_conn - if (istype(zvent_conn)) - //both floors have simulated turfs, share() - var/turf/open/myturf = loc - var/datum/gas_mixture/conn_air = zturf_conn.air //TODO: pop culture reference - var/datum/gas_mixture/my_air = myturf.air - if (istype(conn_air) && istype(my_air)) - my_air.share(conn_air) - air_update_turf() diff --git a/code/modules/client/verbs/sethotkeys.dm b/code/modules/client/verbs/sethotkeys.dm deleted file mode 100644 index ee14787011..0000000000 --- a/code/modules/client/verbs/sethotkeys.dm +++ /dev/null @@ -1,25 +0,0 @@ -/client/verb/sethotkeys(from_pref = 0 as num) - set name = "Set Hotkeys" - set hidden = TRUE - set waitfor = FALSE - set desc = "Used to set mob-specific hotkeys or load hoykey mode from preferences" - - var/hotkey_default = "default" - var/hotkey_macro = "hotkeys" - var/current_setting - - var/list/default_macros = list("default", "robot-default") - - if(from_pref) - current_setting = (prefs.hotkeys ? hotkey_macro : hotkey_default) - else - current_setting = winget(src, "mainwindow", "macro") - - if(mob) - hotkey_macro = mob.macro_hotkeys - hotkey_default = mob.macro_default - - if(current_setting in default_macros) - winset(src, null, "mainwindow.macro=[hotkey_default] input.focus=true input.background-color=#d3b5b5") - else - winset(src, null, "mainwindow.macro=[hotkey_macro] mapwindow.map.focus=true input.background-color=#e0e0e0") diff --git a/code/modules/events/solar_flare.dm b/code/modules/events/solar_flare.dm deleted file mode 100644 index 5f64570c7d..0000000000 --- a/code/modules/events/solar_flare.dm +++ /dev/null @@ -1,17 +0,0 @@ -/datum/round_event_control/solar_flare - name = "Solar Flare" - typepath = /datum/round_event/solar_flare - max_occurrences = 1 - -/datum/round_event/solar_flare - -/datum/round_event/solar_flare/setup() - startWhen = 3 - endWhen = startWhen + 1 - announceWhen = 1 - -/datum/round_event/solar_flare/announce() - priority_announce("Incoming solar flare detected near the station. Expect power outages in all exposed areas for a short duration.", "Anomaly Alert", 'sound/effects/alert.ogg') - -/datum/round_event/solar_flare/start() - SSweather.run_weather("solar flare",1) diff --git a/code/modules/holodeck/computer_funcs.dm b/code/modules/holodeck/computer_funcs.dm deleted file mode 100644 index 65741eafea..0000000000 --- a/code/modules/holodeck/computer_funcs.dm +++ /dev/null @@ -1,111 +0,0 @@ -/obj/machinery/computer/holodeck/attack_hand(var/mob/user as mob) - user.set_machine(src) - - var/dat = "

    Current Loaded Programs

    " - dat += "Power Off
    " - for(var/area/A in program_cache) - dat += "[A.name]
    " - if(emagged && emag_programs.len) - dat += "SUPERVISOR ACCESS - SAFETY PROTOCOLS DISABLED - CAUTION: EMITTER ANOMALY
    " - for(var/area/A in emag_programs) - dat += "[A.name]
    " - - var/datum/browser/popup = new(user, "computer", name, 400, 500) - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() - return - -/obj/machinery/computer/holodeck/attack_ai(var/mob/user as mob) - var/dat = "

    Current Loaded Programs

    " - - dat += "Power Off
    " - for(var/area/A in program_cache) - dat += "[A.name]
    " - - if(emag_programs.len) - dat += "
    " - if(emagged) - dat += "Safety protocol: Offline Engage
    " - for(var/area/A in emag_programs) - dat += "[A.name]
    " - else - dat += "Safety protocol: Online Disengage
    " - - var/datum/browser/popup = new(user, "computer", name, 400, 500) - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() - - -/obj/machinery/computer/holodeck/proc/load_program(var/area/A, var/force = 0, var/delay = 0) - if(stat) - A = offline_program - force = 1 - delay = 0 - if(program == A) - return - if(world.time < (last_change + 25 + (damaged?500:0)) && !force) - if(delay) - sleep(25) - else - if(world.time < (last_change + 15))//To prevent super-spam clicking, reduced process size and annoyance -Sieve - return - if(get_dist(usr,src) <= 3) - to_chat(usr, "ERROR. Recalibrating projection apparatus.") - return - - last_change = world.time - active = (A != offline_program) - use_power = active ? ACTIVE_POWER_USE : IDLE_POWER_USE - - for(var/obj/effect/holodeck_effect/HE in effects) - HE.deactivate(src) - - for(var/item in spawned) - derez(item, forced=force) - - program = A - // note nerfing does not yet work on guns, should - // should also remove/limit/filter reagents? - // this is an exercise left to others I'm afraid. -Sayu - spawned = A.copy_contents_to(linked, 1, nerf_weapons = !emagged) - for(var/obj/machinery/M in spawned) - M.flags_1 |= NODECONSTRUCT_1 - for(var/obj/structure/S in spawned) - S.flags_1 |= NODECONSTRUCT_1 - effects = list() - - spawn(30) - var/list/added = list() - for(var/obj/effect/holodeck_effect/HE in spawned) - effects += HE - spawned -= HE - var/atom/x = HE.activate(src) - if(istype(x) || islist(x)) - spawned += x // holocarp are not forever - added += x - for(var/obj/machinery/M in added) - M.flags_1 |= NODECONSTRUCT_1 - for(var/obj/structure/S in added) - S.flags_1 |= NODECONSTRUCT_1 - -/obj/machinery/computer/holodeck/proc/derez(var/obj/obj, var/silent = 1, var/forced = 0) - // Emagging a machine creates an anomaly in the derez systems. - if(obj && src.emagged && !src.stat && !forced) - if((ismob(obj) || istype(obj.loc,/mob)) && prob(50)) - spawn(50) .(obj,silent) // may last a disturbingly long time - return - spawned.Remove(obj) - - if(!obj) - return - var/turf/T = get_turf(obj) - for(var/atom/movable/AM in obj.contents) // these should be derezed if they were generated - AM.loc = T - if(ismob(AM)) - silent = FALSE // otherwise make sure they are dropped - - if(!silent) - visible_message("The [obj.name] fades away!") - qdel(obj) diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm index a4d234ded7..39a0bba701 100644 --- a/code/modules/mob/say_vr.dm +++ b/code/modules/mob/say_vr.dm @@ -98,7 +98,7 @@ proc/get_top_level_mob(var/mob/S) return FALSE user.log_message(message, INDIVIDUAL_EMOTE_LOG) - message = "[user] " + message + message = "[user] " + "[message]" for(var/mob/M in GLOB.dead_mob_list) if(!M.client || isnewplayer(M)) diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 019508778b..2fc41e1638 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -129,7 +129,7 @@ display_name = "Basic Bluespace Theory" description = "Basic studies into the mysterious alternate dimension known as bluespace." prereq_ids = list("base") - design_ids = list("beacon", "xenobioconsole") + design_ids = list("beacon") //CIT CHANGE removed xenobioconsole from here. research_cost = 2500 export_price = 5000 @@ -148,7 +148,7 @@ display_name = "Applied Bluespace Research" description = "Using bluespace to make things faster and better." prereq_ids = list("bluespace_basic", "engineering") - design_ids = list("bs_rped","minerbag_holding", "telesci_gps", "bluespacebeaker", "bluespacesyringe", "bluespacebodybag", "phasic_scanning", "roastingstick") + design_ids = list("bs_rped","minerbag_holding", "telesci_gps", "bluespacebeaker", "bluespacesyringe", "bluespacebodybag", "phasic_scanning", "roastingstick", "xenobioconsole") //CIT CHANGE added xenobioconsole here research_cost = 5000 export_price = 5000 diff --git a/code/citadel/icons/areas.dmi b/modular_citadel/code/game/area/areas.dmi similarity index 100% rename from code/citadel/icons/areas.dmi rename to modular_citadel/code/game/area/areas.dmi diff --git a/code/citadel/cit_areas.dm b/modular_citadel/code/game/area/cit_areas.dm similarity index 70% rename from code/citadel/cit_areas.dm rename to modular_citadel/code/game/area/cit_areas.dm index 42879b7408..ae36ed6df5 100644 --- a/code/citadel/cit_areas.dm +++ b/modular_citadel/code/game/area/cit_areas.dm @@ -1,6 +1,6 @@ /area/maintenance/bar name = "Maintenance Bar" - icon = 'code/citadel/icons/areas.dmi' + icon = 'modular_citadel/code/game/area/areas.dmi' icon_state = "maintbar" /area/maintenance/bar/cafe @@ -14,5 +14,5 @@ /area/crew_quarters/cryopod name = "Cryogenics" - icon = 'code/citadel/icons/areas.dmi' + icon = 'modular_citadel/code/game/area/areas.dmi' icon_state = "cryo" \ No newline at end of file diff --git a/code/citadel/cit_displaycases.dm b/modular_citadel/code/game/machinery/displaycases.dm similarity index 100% rename from code/citadel/cit_displaycases.dm rename to modular_citadel/code/game/machinery/displaycases.dm diff --git a/code/citadel/plasmacases.dm b/modular_citadel/code/game/machinery/plasmacases.dm similarity index 100% rename from code/citadel/plasmacases.dm rename to modular_citadel/code/game/machinery/plasmacases.dm diff --git a/modular_citadel/code/game/machinery/vending.dm b/modular_citadel/code/game/machinery/vending.dm index 130c93d854..6905efd88d 100644 --- a/modular_citadel/code/game/machinery/vending.dm +++ b/modular_citadel/code/game/machinery/vending.dm @@ -1,3 +1,106 @@ /obj/machinery/vending/security contraband = list(/obj/item/clothing/glasses/sunglasses = 2, /obj/item/storage/fancy/donut_box = 2, /obj/item/device/ssword_kit = 1) - premium = list(/obj/item/coin/antagtoken = 1, /obj/item/device/ssword_kit = 1) \ No newline at end of file + premium = list(/obj/item/coin/antagtoken = 1, /obj/item/device/ssword_kit = 1) + +#define STANDARD_CHARGE 1 +#define CONTRABAND_CHARGE 2 +#define COIN_CHARGE 3 + +/obj/machinery/vending/kink + name = "KinkMate" + desc = "A vending machine for all your unmentionable desires." + icon = 'icons/obj/citvending.dmi' + icon_state = "kink" + product_slogans = "Kinky!;Sexy!;Check me out, big boy!" + vend_reply = "Have fun, you shameless pervert!" + products = list( + /obj/item/clothing/under/maid = 5, + /obj/item/clothing/under/stripper_pink = 5, + /obj/item/clothing/under/stripper_green = 5, + /obj/item/dildo/custom = 5 + ) + contraband = list(/obj/item/restraints/handcuffs/fake/kinky = 5, + /obj/item/clothing/neck/petcollar = 5, + /obj/item/clothing/under/mankini = 1, + /obj/item/dildo/flared/huge = 1 + ) + premium = list(/obj/item/device/electropack/shockcollar = 1) + refill_canister = /obj/item/vending_refill/kink +/* +/obj/machinery/vending/nazivend + name = "Nazivend" + desc = "A vending machine containing Nazi German supplies. A label reads: \"Remember the gorrilions lost.\"" + icon = 'icons/obj/citvending.dmi' + icon_state = "nazi" + vend_reply = "SIEG HEIL!" + product_slogans = "Das Vierte Reich wird zuruckkehren!;ENTFERNEN JUDEN!;Billiger als die Juden jemals geben!;Rader auf dem adminbus geht rund und rund.;Warten Sie, warum wir wieder hassen Juden?- *BZZT*" + products = list( + /obj/item/clothing/head/stalhelm = 20, + /obj/item/clothing/head/panzer = 20, + /obj/item/clothing/suit/soldiercoat = 20, + // /obj/item/clothing/under/soldieruniform = 20, + /obj/item/clothing/shoes/jackboots = 20 + ) + contraband = list( + /obj/item/clothing/head/naziofficer = 10, + // /obj/item/clothing/suit/officercoat = 10, + // /obj/item/clothing/under/officeruniform = 10, + /obj/item/clothing/suit/space/hardsuit/nazi = 3, + /obj/item/gun/energy/plasma/MP40k = 4 + ) + premium = list() + + refill_canister = /obj/item/vending_refill/nazi +*/ +/obj/machinery/vending/sovietvend + name = "KomradeVendtink" + desc = "Rodina-mat' zovyot!" + icon = 'icons/obj/citvending.dmi' + icon_state = "soviet" + vend_reply = "The fascist and capitalist svin'ya shall fall, komrade!" + product_slogans = "Quality worth waiting in line for!; Get Hammer and Sickled!; Sosvietsky soyuz above all!; With capitalist pigsky, you would have paid a fortunetink! ; Craftink in Motherland herself!" + products = list( + /obj/item/clothing/under/soviet = 20, + /obj/item/clothing/head/ushanka = 20, + /obj/item/clothing/shoes/jackboots = 20, + /obj/item/clothing/head/squatter_hat = 20, + /obj/item/clothing/under/squatter_outfit = 20, + /obj/item/clothing/under/russobluecamooutfit = 20, + /obj/item/clothing/head/russobluecamohat = 20 + ) + contraband = list( + /obj/item/clothing/under/syndicate/tacticool = 4, + /obj/item/clothing/mask/balaclava = 4, + /obj/item/clothing/suit/russofurcoat = 4, + /obj/item/clothing/head/russofurhat = 4, + /obj/item/clothing/suit/space/hardsuit/soviet = 3, + /obj/item/gun/energy/laser/LaserAK = 4 + ) + premium = list() + + refill_canister = /obj/item/vending_refill/soviet + + +#undef STANDARD_CHARGE +#undef CONTRABAND_CHARGE +#undef COIN_CHARGE + + +/obj/item/vending_refill/kink + machine_name = "KinkMate" + icon = 'modular_citadel/icons/vending_restock.dmi' + icon_state = "refill_kink" + charges = list(8, 5, 0)// of 20 standard, 12 contraband, 0 premium + init_charges = list(8, 5, 0) + +/obj/item/vending_refill/nazi + machine_name = "nazivend" + icon_state = "refill_nazi" + charges = list(33, 13, 0) + init_charges = list(33, 13, 0) + +/obj/item/vending_refill/soviet + machine_name = "sovietvend" + icon_state = "refill_soviet" + charges = list(47, 7, 0) + init_charges = list(47, 7, 0) diff --git a/code/citadel/cit_spawners.dm b/modular_citadel/code/game/objects/effects/spawner/spawners.dm similarity index 100% rename from code/citadel/cit_spawners.dm rename to modular_citadel/code/game/objects/effects/spawner/spawners.dm diff --git a/code/citadel/cit_genemods.dm b/modular_citadel/code/game/objects/items/devices/genemods.dm similarity index 100% rename from code/citadel/cit_genemods.dm rename to modular_citadel/code/game/objects/items/devices/genemods.dm diff --git a/code/citadel/cit_crewobjectives.dm b/modular_citadel/code/modules/antagonists/cit_crewobjectives.dm similarity index 100% rename from code/citadel/cit_crewobjectives.dm rename to modular_citadel/code/modules/antagonists/cit_crewobjectives.dm diff --git a/code/citadel/cit_miscreants.dm b/modular_citadel/code/modules/antagonists/cit_miscreants.dm similarity index 100% rename from code/citadel/cit_miscreants.dm rename to modular_citadel/code/modules/antagonists/cit_miscreants.dm diff --git a/code/citadel/crew_objectives/cit_crewobjectives_cargo.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_cargo.dm similarity index 100% rename from code/citadel/crew_objectives/cit_crewobjectives_cargo.dm rename to modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_cargo.dm diff --git a/code/citadel/crew_objectives/cit_crewobjectives_civilian.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_civilian.dm similarity index 100% rename from code/citadel/crew_objectives/cit_crewobjectives_civilian.dm rename to modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_civilian.dm diff --git a/code/citadel/crew_objectives/cit_crewobjectives_command.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_command.dm similarity index 100% rename from code/citadel/crew_objectives/cit_crewobjectives_command.dm rename to modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_command.dm diff --git a/code/citadel/crew_objectives/cit_crewobjectives_engineering.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_engineering.dm similarity index 100% rename from code/citadel/crew_objectives/cit_crewobjectives_engineering.dm rename to modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_engineering.dm diff --git a/code/citadel/crew_objectives/cit_crewobjectives_medical.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_medical.dm similarity index 100% rename from code/citadel/crew_objectives/cit_crewobjectives_medical.dm rename to modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_medical.dm diff --git a/code/citadel/crew_objectives/cit_crewobjectives_science.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_science.dm similarity index 100% rename from code/citadel/crew_objectives/cit_crewobjectives_science.dm rename to modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_science.dm diff --git a/code/citadel/crew_objectives/cit_crewobjectives_security.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_security.dm similarity index 100% rename from code/citadel/crew_objectives/cit_crewobjectives_security.dm rename to modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_security.dm diff --git a/code/citadel/cit_arousal.dm b/modular_citadel/code/modules/arousal/arousal.dm similarity index 99% rename from code/citadel/cit_arousal.dm rename to modular_citadel/code/modules/arousal/arousal.dm index 077824fe9e..584acc6eb6 100644 --- a/code/citadel/cit_arousal.dm +++ b/modular_citadel/code/modules/arousal/arousal.dm @@ -142,7 +142,7 @@ /obj/screen/arousal name = "arousal" icon_state = "arousal0" - icon = 'code/citadel/icons/hud.dmi' + icon = 'modular_citadel/icons/obj/genitals/hud.dmi' screen_loc = ui_arousal /obj/screen/arousal/Click() diff --git a/code/citadel/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm similarity index 96% rename from code/citadel/organs/breasts.dm rename to modular_citadel/code/modules/arousal/organs/breasts.dm index 901c546212..ea44c6d671 100644 --- a/code/citadel/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -2,7 +2,7 @@ name = "breasts" desc = "Female milk producing organs." icon_state = "breasts" - icon = 'code/citadel/icons/breasts.dmi' + icon = 'modular_citadel/icons/obj/genitals/breasts.dmi' zone = "chest" slot = "breasts" w_class = 3 diff --git a/code/citadel/organs/eggsack.dm b/modular_citadel/code/modules/arousal/organs/eggsack.dm similarity index 87% rename from code/citadel/organs/eggsack.dm rename to modular_citadel/code/modules/arousal/organs/eggsack.dm index 1486310d61..27104cd36a 100644 --- a/code/citadel/organs/eggsack.dm +++ b/modular_citadel/code/modules/arousal/organs/eggsack.dm @@ -2,7 +2,7 @@ name = "Egg sack" desc = "An egg producing reproductive organ." icon_state = "egg_sack" - icon = 'code/citadel/icons/ovipositor.dmi' + icon = 'modular_citadel/icons/obj/genitals/ovipositor.dmi' zone = "groin" slot = "testicles" color = null //don't use the /genital color since it already is colored diff --git a/code/citadel/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm similarity index 100% rename from code/citadel/organs/genitals.dm rename to modular_citadel/code/modules/arousal/organs/genitals.dm diff --git a/code/citadel/organs/genitals_sprite_accessories.dm b/modular_citadel/code/modules/arousal/organs/genitals_sprite_accessories.dm similarity index 83% rename from code/citadel/organs/genitals_sprite_accessories.dm rename to modular_citadel/code/modules/arousal/organs/genitals_sprite_accessories.dm index 710bab787c..7c02b1c3a5 100644 --- a/code/citadel/organs/genitals_sprite_accessories.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals_sprite_accessories.dm @@ -4,7 +4,7 @@ //DICKS,COCKS,PENISES,WHATEVER YOU WANT TO CALL THEM /datum/sprite_accessory/penis - icon = 'code/citadel/icons/penis_onmob.dmi' + icon = 'modular_citadel/icons/obj/genitals/penis_onmob.dmi' icon_state = null name = "penis" //the preview name of the accessory gender_specific = 0 //Might be needed somewhere down the list. @@ -35,21 +35,21 @@ // Taur cocks go here // //////////////////////// /datum/sprite_accessory/penis/taur_flared - icon = 'code/citadel/icons/taur_penis_onmob.dmi' //Needed larger width + icon = 'modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi' //Needed larger width icon_state = "flared" name = "Taur, Flared" center = TRUE //Center the image 'cause 2-tile wide. dimension_x = 64 /datum/sprite_accessory/penis/taur_knotted - icon = 'code/citadel/icons/taur_penis_onmob.dmi' //Needed larger width + icon = 'modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi' //Needed larger width icon_state = "knotted" name = "Taur, Knotted" center = TRUE //Center the image 'cause 2-tile wide. dimension_x = 64 /datum/sprite_accessory/penis/taur_tapered - icon = 'code/citadel/icons/taur_penis_onmob.dmi' //Needed larger width + icon = 'modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi' //Needed larger width icon_state = "tapered" name = "Taur, Tapered" center = TRUE //Center the image 'cause 2-tile wide. @@ -60,7 +60,7 @@ //Vaginas /datum/sprite_accessory/vagina - icon = 'code/citadel/icons/vagina_onmob.dmi' + icon = 'modular_citadel/icons/obj/genitals/vagina_onmob.dmi' icon_state = null name = "vagina" gender_specific = 0 @@ -90,7 +90,7 @@ //BREASTS BE HERE /datum/sprite_accessory/breasts - icon = 'code/citadel/icons/breasts_onmob.dmi' + icon = 'modular_citadel/icons/obj/genitals/breasts_onmob.dmi' icon_state = null name = "breasts" gender_specific = 0 @@ -104,7 +104,7 @@ //OVIPOSITORS BE HERE /datum/sprite_accessory/ovipositor - icon = 'code/citadel/icons/penis_onmob.dmi' + icon = 'modular_citadel/icons/obj/genitals/penis_onmob.dmi' icon_state = null name = "Ovipositor" //the preview name of the accessory gender_specific = 0 //Might be needed somewhere down the list. diff --git a/code/citadel/organs/ovipositor.dm b/modular_citadel/code/modules/arousal/organs/ovipositor.dm similarity index 88% rename from code/citadel/organs/ovipositor.dm rename to modular_citadel/code/modules/arousal/organs/ovipositor.dm index 3d684ee387..76bf60d93c 100644 --- a/code/citadel/organs/ovipositor.dm +++ b/modular_citadel/code/modules/arousal/organs/ovipositor.dm @@ -2,7 +2,7 @@ name = "Ovipositor" desc = "An egg laying reproductive organ." icon_state = "ovi_knotted_2" - icon = 'code/citadel/icons/ovipositor.dmi' + icon = 'modular_citadel/icons/obj/genitals/ovipositor.dmi' zone = "groin" slot = "penis" w_class = 3 diff --git a/code/citadel/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm similarity index 97% rename from code/citadel/organs/penis.dm rename to modular_citadel/code/modules/arousal/organs/penis.dm index 509ed72ef4..ae58aabf51 100644 --- a/code/citadel/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -2,7 +2,7 @@ name = "penis" desc = "A male reproductive organ." icon_state = "penis" - icon = 'code/citadel/icons/penis.dmi' + icon = 'modular_citadel/icons/obj/genitals/penis.dmi' zone = "groin" slot = "penis" w_class = 3 diff --git a/code/citadel/organs/testicles.dm b/modular_citadel/code/modules/arousal/organs/testicles.dm similarity index 96% rename from code/citadel/organs/testicles.dm rename to modular_citadel/code/modules/arousal/organs/testicles.dm index bb3ade6048..815d8034e7 100644 --- a/code/citadel/organs/testicles.dm +++ b/modular_citadel/code/modules/arousal/organs/testicles.dm @@ -2,7 +2,7 @@ name = "testicles" desc = "A male reproductive organ." icon_state = "testicles" - icon = 'code/citadel/icons/penis.dmi' + icon = 'modular_citadel/icons/obj/genitals/penis.dmi' zone = "groin" slot = "testicles" w_class = 3 diff --git a/code/citadel/organs/vagina.dm b/modular_citadel/code/modules/arousal/organs/vagina.dm similarity index 97% rename from code/citadel/organs/vagina.dm rename to modular_citadel/code/modules/arousal/organs/vagina.dm index 1f19dc7e64..4d9eedb1cf 100644 --- a/code/citadel/organs/vagina.dm +++ b/modular_citadel/code/modules/arousal/organs/vagina.dm @@ -1,7 +1,7 @@ /obj/item/organ/genital/vagina name = "vagina" desc = "A female reproductive organ." - icon = 'code/citadel/icons/vagina.dmi' + icon = 'modular_citadel/icons/obj/genitals/vagina.dmi' icon_state = "vagina" zone = "groin" slot = "vagina" diff --git a/code/citadel/organs/womb.dm b/modular_citadel/code/modules/arousal/organs/womb.dm similarity index 94% rename from code/citadel/organs/womb.dm rename to modular_citadel/code/modules/arousal/organs/womb.dm index 433f005623..c59d74e629 100644 --- a/code/citadel/organs/womb.dm +++ b/modular_citadel/code/modules/arousal/organs/womb.dm @@ -1,7 +1,7 @@ /obj/item/organ/genital/womb name = "womb" desc = "A female reproductive organ." - icon = 'code/citadel/icons/vagina.dmi' + icon = 'modular_citadel/icons/obj/genitals/vagina.dmi' icon_state = "womb" zone = "groin" slot = "womb" diff --git a/code/citadel/toys/dildos.dm b/modular_citadel/code/modules/arousal/toys/dildos.dm similarity index 98% rename from code/citadel/toys/dildos.dm rename to modular_citadel/code/modules/arousal/toys/dildos.dm index d216ed86ba..45f4f5a64a 100644 --- a/code/citadel/toys/dildos.dm +++ b/modular_citadel/code/modules/arousal/toys/dildos.dm @@ -4,7 +4,7 @@ obj/item/dildo name = "dildo" desc = "Floppy!" - icon = 'code/citadel/icons/dildo.dmi' + icon = 'modular_citadel/icons/obj/genitals/dildo.dmi' damtype = BRUTE force = 0 throwforce = 0 diff --git a/modular_citadel/code/modules/clothing/suits/suits.dm b/modular_citadel/code/modules/clothing/suits/suits.dm new file mode 100644 index 0000000000..776da896bd --- /dev/null +++ b/modular_citadel/code/modules/clothing/suits/suits.dm @@ -0,0 +1,13 @@ +/*///////////////////////////////////////////////////////////////////////////////// +/////// /////// +/////// Cit's exclusive suits, armor, etc. go here /////// +/////// /////// +*////////////////////////////////////////////////////////////////////////////////// + + +/obj/item/clothing/suit/armor/hos/trenchcoat/cloak + name = "armored trenchcloak" + desc = "A trenchcoat enchanced with a special lightweight kevlar. This one appears to be designed to be draped over one's shoulders rather than worn normally.." + alternate_worn_icon = 'icons/mob/citadel/suit.dmi' + icon_state = "hostrench" + item_state = "hostrench" \ No newline at end of file diff --git a/modular_citadel/code/modules/clothing/under.dm b/modular_citadel/code/modules/clothing/under.dm deleted file mode 100644 index bf77704122..0000000000 --- a/modular_citadel/code/modules/clothing/under.dm +++ /dev/null @@ -1,7 +0,0 @@ -/obj/item/clothing/under/syndicate/cosmetic - name = "tactitool turtleneck" - desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-." - icon_state = "tactifool" - item_state = "bl_suit" - item_color = "tactifool" - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0) \ No newline at end of file diff --git a/modular_citadel/code/modules/clothing/under/syndicate.dm b/modular_citadel/code/modules/clothing/under/syndicate.dm deleted file mode 100644 index 5364d4a0fb..0000000000 --- a/modular_citadel/code/modules/clothing/under/syndicate.dm +++ /dev/null @@ -1,2 +0,0 @@ -/obj/item/clothing/under/syndicate/tacticool - has_sensor = TRUE diff --git a/modular_citadel/code/modules/clothing/under/turtlenecks.dm b/modular_citadel/code/modules/clothing/under/turtlenecks.dm index 47432d87f7..2f40a08dc3 100644 --- a/modular_citadel/code/modules/clothing/under/turtlenecks.dm +++ b/modular_citadel/code/modules/clothing/under/turtlenecks.dm @@ -19,4 +19,59 @@ /obj/structure/closet/secure_closet/CMO/PopulateContents() //This is placed here because it's a very specific addition for a very specific niche ..() - new /obj/item/clothing/under/rank/chief_medical_officer/turtleneck(src) \ No newline at end of file + new /obj/item/clothing/under/rank/chief_medical_officer/turtleneck(src) + +/obj/item/clothing/under/syndicate/cosmetic + name = "tactitool turtleneck" + desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-." + icon_state = "tactifool" + item_state = "bl_suit" + item_color = "tactifool" + has_sensor = TRUE + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0) + +/obj/item/clothing/under/syndicate/tacticool + has_sensor = TRUE + +// Sweaters are good enough for this category too. + +/obj/item/clothing/under/bb_sweater + name = "cream sweater" + desc = "Why trade style for comfort? Now you can go commando down south and still be cozy up north." + icon_state = "bb_turtle" + item_state = "w_suit" + item_color = "bb_turtle" + body_parts_covered = CHEST|ARMS + can_adjust = 1 + icon = 'icons/obj/clothing/turtlenecks.dmi' + icon_override = 'icons/mob/citadel/uniforms.dmi' + +/obj/item/clothing/under/bb_sweater/black + name = "black sweater" + icon_state = "bb_turtleblk" + item_state = "bl_suit" + item_color = "bb_turtleblk" + +/obj/item/clothing/under/bb_sweater/purple + name = "purple sweater" + icon_state = "bb_turtlepur" + item_state = "p_suit" + item_color = "bb_turtlepur" + +/obj/item/clothing/under/bb_sweater/green + name = "green sweater" + icon_state = "bb_turtlegrn" + item_state = "g_suit" + item_color = "bb_turtlegrn" + +/obj/item/clothing/under/bb_sweater/red + name = "red sweater" + icon_state = "bb_turtlered" + item_state = "r_suit" + item_color = "bb_turtlered" + +/obj/item/clothing/under/bb_sweater/blue + name = "blue sweater" + icon_state = "bb_turtleblu" + item_state = "b_suit" + item_color = "bb_turtleblu" diff --git a/code/citadel/cit_clothes.dm b/modular_citadel/code/modules/clothing/under/under.dm similarity index 72% rename from code/citadel/cit_clothes.dm rename to modular_citadel/code/modules/clothing/under/under.dm index dd83c6b769..042273ac6a 100644 --- a/code/citadel/cit_clothes.dm +++ b/modular_citadel/code/modules/clothing/under/under.dm @@ -21,11 +21,4 @@ icon_state = "hosskirt" icon_override = 'icons/mob/citadel/uniforms.dmi' item_state = "gy_suit" - item_color = "hosskirt" - -/obj/item/clothing/suit/armor/hos/trenchcoat/cloak - name = "armored trenchcloak" - desc = "A trenchcoat enchanced with a special lightweight kevlar. This one appears to be designed to be draped over one's shoulders rather than worn normally.." - alternate_worn_icon = 'icons/mob/citadel/suit.dmi' - icon_state = "hostrench" - item_state = "hostrench" \ No newline at end of file + item_color = "hosskirt" \ No newline at end of file diff --git a/code/citadel/custom_loadout/custom_items.dm b/modular_citadel/code/modules/custom_loadout/custom_items.dm similarity index 100% rename from code/citadel/custom_loadout/custom_items.dm rename to modular_citadel/code/modules/custom_loadout/custom_items.dm diff --git a/code/citadel/custom_loadout/load_to_mob.dm b/modular_citadel/code/modules/custom_loadout/load_to_mob.dm similarity index 100% rename from code/citadel/custom_loadout/load_to_mob.dm rename to modular_citadel/code/modules/custom_loadout/load_to_mob.dm diff --git a/code/citadel/custom_loadout/read_from_file.dm b/modular_citadel/code/modules/custom_loadout/read_from_file.dm similarity index 100% rename from code/citadel/custom_loadout/read_from_file.dm rename to modular_citadel/code/modules/custom_loadout/read_from_file.dm diff --git a/code/citadel/cit_emotes.dm b/modular_citadel/code/modules/mob/cit_emotes.dm similarity index 100% rename from code/citadel/cit_emotes.dm rename to modular_citadel/code/modules/mob/cit_emotes.dm diff --git a/code/citadel/dogborgs.dm b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg archive.dm similarity index 100% rename from code/citadel/dogborgs.dm rename to modular_citadel/code/modules/mob/living/silicon/robot/dogborg archive.dm diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm new file mode 100644 index 0000000000..dceaf9d1c5 --- /dev/null +++ b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm @@ -0,0 +1,401 @@ +/* +DOG BORG EQUIPMENT HERE +SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm ! +*/ + +/obj/item/dogborg/jaws/big + name = "combat jaws" + icon = 'icons/mob/dogborg.dmi' + icon_state = "jaws" + desc = "The jaws of the law." + flags_1 = CONDUCT_1 + force = 12 + throwforce = 0 + hitsound = 'sound/weapons/bite.ogg' + attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced") + w_class = 3 + sharpness = IS_SHARP + +/obj/item/dogborg/jaws/small + name = "puppy jaws" + icon = 'icons/mob/dogborg.dmi' + icon_state = "smalljaws" + desc = "The jaws of a small dog." + flags_1 = CONDUCT_1 + force = 6 + throwforce = 0 + hitsound = 'sound/weapons/bite.ogg' + attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed") + w_class = 3 + sharpness = IS_SHARP + +/obj/item/dogborg/jaws/attack(atom/A, mob/living/silicon/robot/user) + ..() + user.do_attack_animation(A, ATTACK_EFFECT_BITE) + +/obj/item/dogborg/jaws/small/attack_self(mob/user) + var/mob/living/silicon/robot.R = user + if(R.emagged) + name = "combat jaws" + icon = 'icons/mob/dogborg.dmi' + icon_state = "jaws" + desc = "The jaws of the law." + flags_1 = CONDUCT_1 + force = 12 + throwforce = 0 + hitsound = 'sound/weapons/bite.ogg' + attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced") + w_class = 3 + sharpness = IS_SHARP + else + name = "puppy jaws" + icon = 'icons/mob/dogborg.dmi' + icon_state = "smalljaws" + desc = "The jaws of a small dog." + flags_1 = CONDUCT_1 + force = 5 + throwforce = 0 + hitsound = 'sound/weapons/bite.ogg' + attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed") + w_class = 3 + sharpness = IS_SHARP + update_icon() + + +//Cuffs + +/obj/item/restraints/handcuffs/cable/zipties/cyborg/dog/attack(mob/living/carbon/C, mob/user) + if(!C.handcuffed) + playsound(loc, 'sound/weapons/cablecuff.ogg', 60, 1, -2) + C.visible_message("[user] is trying to put zipties on [C]!", \ + "[user] is trying to put zipties on [C]!") + if(do_mob(user, C, 60)) + if(!C.handcuffed) + C.handcuffed = new /obj/item/restraints/handcuffs/cable/zipties/used(C) + C.update_inv_handcuffed(0) + to_chat(user,"You handcuff [C].") + playsound(loc, pick('sound/voice/bgod.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/bsecureday.ogg', 'sound/voice/bradio.ogg', 'sound/voice/binsult.ogg', 'sound/voice/bcreep.ogg'), 50, 0) + add_logs(user, C, "handcuffed") + else + to_chat(user,"You fail to handcuff [C]!") + + +//Boop + +/obj/item/device/analyzer/nose + name = "boop module" + icon = 'icons/mob/dogborg.dmi' + icon_state = "nose" + desc = "The BOOP module" + flags_1 = CONDUCT_1 + force = 0 + throwforce = 0 + attack_verb = list("nuzzled", "nosed", "booped") + w_class = 1 + +/obj/item/device/analyzer/nose/attack_self(mob/user) + user.visible_message("[user] sniffs around the air.", "You sniff the air for gas traces.") + + var/turf/location = user.loc + if(!istype(location)) + return + + var/datum/gas_mixture/environment = location.return_air() + + var/pressure = environment.return_pressure() + var/total_moles = environment.total_moles() + + to_chat(user, "Results:") + if(abs(pressure - ONE_ATMOSPHERE) < 10) + to_chat(user, "Pressure: [round(pressure,0.1)] kPa") + else + to_chat(user, "Pressure: [round(pressure,0.1)] kPa") + if(total_moles) + var/list/env_gases = environment.gases + + environment.assert_gases(arglist(GLOB.hardcoded_gases)) + var/o2_concentration = env_gases[/datum/gas/oxygen][MOLES]/total_moles + var/n2_concentration = env_gases[/datum/gas/nitrogen][MOLES]/total_moles + var/co2_concentration = env_gases[/datum/gas/carbon_dioxide][MOLES]/total_moles + var/plasma_concentration = env_gases[/datum/gas/plasma][MOLES]/total_moles + environment.garbage_collect() + + if(abs(n2_concentration - N2STANDARD) < 20) + to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] %") + else + to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] %") + + if(abs(o2_concentration - O2STANDARD) < 2) + to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] %") + else + to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] %") + + if(co2_concentration > 0.01) + to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] %") + else + to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] %") + + if(plasma_concentration > 0.005) + to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] %") + else + to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] %") + + + for(var/id in env_gases) + if(id in GLOB.hardcoded_gases) + continue + var/gas_concentration = env_gases[id][MOLES]/total_moles + to_chat(user, "[env_gases[id][GAS_META][META_GAS_NAME]]: [round(gas_concentration*100, 0.01)] %") + to_chat(user, "Temperature: [round(environment.temperature-T0C)] °C") + +/obj/item/device/analyzer/nose/AltClick(mob/user) //Barometer output for measuring when the next storm happens + . = ..() + +//Delivery + +/obj/item/storage/bag/borgdelivery + name = "fetching storage" + desc = "Fetch the thing!" + icon = 'icons/mob/dogborg.dmi' + icon_state = "dbag" + //Can hold one big item at a time. Drops contents on unequip.(see inventory.dm) + w_class = 5 + max_w_class = 2 + max_combined_w_class = 2 + storage_slots = 1 + collection_mode = 0 + can_hold = list() // any + cant_hold = list(/obj/item/disk/nuclear) + + +//Tongue stuff + +/obj/item/soap/tongue + name = "synthetic tongue" + desc = "Useful for slurping mess off the floor before affectionally licking the crew members in the face." + icon = 'icons/mob/dogborg.dmi' + icon_state = "synthtongue" + hitsound = 'sound/effects/attackblob.ogg' + cleanspeed = 80 + +/obj/item/soap/tongue/scrubpup + cleanspeed = 25 //slightly faster than a mop. + +/obj/item/soap/tongue/New() + ..() + flags_1 |= NOBLUDGEON_1 //No more attack messages + +/obj/item/trash/rkibble + name = "robo kibble" + desc = "A novelty bowl of assorted mech fabricator byproducts. Mockingly feed this to the sec-dog to help it recharge." + icon = 'icons/mob/dogborg.dmi' + icon_state= "kibble" + +/obj/item/soap/tongue/attack_self(mob/user) + var/mob/living/silicon/robot.R = user + if(R.emagged) + name = "hacked tongue of doom" + desc = "Your tongue has been upgraded successfully. Congratulations." + icon = 'icons/mob/dogborg.dmi' + icon_state = "syndietongue" + cleanspeed = 10 //(nerf'd)tator soap stat + else + name = "synthetic tongue" + desc = "Useful for slurping mess off the floor before affectionally licking the crew members in the face." + icon = 'icons/mob/dogborg.dmi' + icon_state = "synthtongue" + cleanspeed = initial(cleanspeed) + update_icon() + +/obj/item/soap/tongue/afterattack(atom/target, mob/user, proximity) + var/mob/living/silicon/robot.R = user + if(!proximity || !check_allowed_items(target)) + return + if(R.client && (target in R.client.screen)) + to_chat(R, "You need to take that [target.name] off before cleaning it!") + else if(is_cleanable(target)) + R.visible_message("[R] begins to lick off \the [target.name].", "You begin to lick off \the [target.name]...") + if(do_after(R, src.cleanspeed, target = target)) + if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. + return //If they moved away, you can't eat them. + to_chat(R, "You finish licking off \the [target.name].") + qdel(target) + R.cell.give(50) + else if(isobj(target)) //hoo boy. danger zone man + if(istype(target,/obj/item/trash)) + R.visible_message("[R] nibbles away at \the [target.name].", "You begin to nibble away at \the [target.name]...") + if(do_after(R, src.cleanspeed, target = target)) + if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. + return //If they moved away, you can't eat them. + to_chat(R, "You finish off \the [target.name].") + qdel(target) + R.cell.give(250) + return + if(istype(target,/obj/item/stock_parts/cell)) + R.visible_message("[R] begins cramming \the [target.name] down its throat.", "You begin cramming \the [target.name] down your throat...") + if(do_after(R, 50, target = target)) + if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. + return //If they moved away, you can't eat them. + to_chat(R, "You finish off \the [target.name].") + var/obj/item/stock_parts/cell.C = target + R.cell.charge = R.cell.charge + (C.charge / 3) //Instant full cell upgrades op idgaf + qdel(target) + return + var/obj/item/I = target //HAHA FUCK IT, NOT LIKE WE ALREADY HAVE A SHITTON OF WAYS TO REMOVE SHIT + if(!I.anchored && R.emagged) + R.visible_message("[R] begins chewing up \the [target.name]. Looks like it's trying to loophole around its diet restriction!", "You begin chewing up \the [target.name]...") + if(do_after(R, 100, target = I)) //Nerf dat time yo + if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. Even emags don't make you magically eat things at range. + return //If they moved away, you can't eat them. + visible_message("[R] chews up \the [target.name] and cleans off the debris!") + to_chat(R, "You finish off \the [target.name].") + qdel(I) + R.cell.give(500) + return + R.visible_message("[R] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean...") + if(do_after(R, src.cleanspeed, target = target)) + if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. + return //If they moved away, you can't clean them. + to_chat(R,"You clean \the [target.name].") + var/obj/effect/decal/cleanable/C = locate() in target + qdel(C) + SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + else if(ishuman(target)) + if(R.emagged) + var/mob/living/L = target + if(R.cell.charge <= 666) + return + L.Stun(4) // normal stunbaton is force 7 gimme a break good sir! + L.Knockdown(80) + L.apply_effect(STUTTER, 4) + L.visible_message("[R] has shocked [L] with its tongue!", \ + "[R] has shocked you with its tongue! You can feel the betrayal.") + playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) + R.cell.use(666) + else + R.visible_message("\the [R] affectionally licks \the [target]'s face!", "You affectionally lick \the [target]'s face!") + playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1) + return + else if(istype(target, /obj/structure/window)) + R.visible_message("[R] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean...") + if(do_after(R, src.cleanspeed, target = target)) + if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. + return //If they moved away, you can't clean them. + to_chat(R, "You clean \the [target.name].") + target.color = initial(target.color) + else + R.visible_message("[R] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean...") + if(do_after(R, src.cleanspeed, target = target)) + if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. + return //If they moved away, you can't clean them. + to_chat(R, "You clean \the [target.name].") + var/obj/effect/decal/cleanable/C = locate() in target + qdel(C) + SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + return + + +//Defibs + +/obj/item/twohanded/shockpaddles/cyborg/hound + name = "Paws of Life" + desc = "MediHound specific shock paws." + icon = 'icons/mob/dogborg.dmi' + icon_state = "defibpaddles0" + item_state = "defibpaddles0" + +// Pounce stuff for K-9 + +/obj/item/dogborg/pounce + name = "pounce" + icon = 'icons/mob/dogborg.dmi' + icon_state = "pounce" + desc = "Leap at your target to momentarily stun them." + force = 0 + throwforce = 0 + +/obj/item/dogborg/pounce/New() + ..() + flags_1 |= NOBLUDGEON_1 + +/mob/living/silicon/robot + var/leaping = 0 + var/pounce_cooldown = 0 + var/pounce_cooldown_time = 50 //Nearly doubled, u happy? + var/pounce_spoolup = 3 + var/leap_at + var/disabler + var/laser + var/sleeper_g + var/sleeper_r + +#define MAX_K9_LEAP_DIST 4 //because something's definitely borked the pounce functioning from a distance. + +/obj/item/dogborg/pounce/afterattack(atom/A, mob/user) + var/mob/living/silicon/robot/R = user + if(R && !R.pounce_cooldown) + R.pounce_cooldown = !R.pounce_cooldown + to_chat(R, "Your targeting systems lock on to [A]...") + addtimer(CALLBACK(R, /mob/living/silicon/robot.proc/leap_at, A), R.pounce_spoolup) + spawn(R.pounce_cooldown_time) + R.pounce_cooldown = !R.pounce_cooldown + else if(R && R.pounce_cooldown) + to_chat(R, "Your leg actuators are still recharging!") + +/mob/living/silicon/robot/proc/leap_at(atom/A) + if(leaping || stat || buckled || lying) + return + + if(!has_gravity(src) || !has_gravity(A)) + to_chat(src,"It is unsafe to leap without gravity!") + //It's also extremely buggy visually, so it's balance+bugfix + return + + if(cell.charge <= 500) + to_chat(src,"Insufficent reserves for jump actuators!") + return + + else + leaping = 1 + weather_immunities += "lava" + pixel_y = 10 + update_icons() + throw_at(A, MAX_K9_LEAP_DIST, 1, spin=0, diagonals_first = 1) + cell.use(500) //Doubled the energy consumption + weather_immunities -= "lava" + +/mob/living/silicon/robot/throw_impact(atom/A) + + if(!leaping) + return ..() + + if(A) + if(isliving(A)) + var/mob/living/L = A + var/blocked = 0 + if(ishuman(A)) + var/mob/living/carbon/human/H = A + if(H.check_shields(0, "the [name]", src, attack_type = LEAP_ATTACK)) + blocked = 1 + if(!blocked) + L.visible_message("[src] pounces on [L]!", "[src] pounces on you!") + L.Knockdown(45) + playsound(src, 'sound/weapons/Egloves.ogg', 50, 1) + sleep(2)//Runtime prevention (infinite bump() calls on hulks) + step_towards(src,L) + else + Knockdown(45, 1, 1) + + pounce_cooldown = !pounce_cooldown + spawn(pounce_cooldown_time) //3s by default + pounce_cooldown = !pounce_cooldown + else if(A.density && !A.CanPass(src)) + visible_message("[src] smashes into [A]!", "You smash into [A]!") + playsound(src, 'sound/items/trayhit1.ogg', 50, 1) + Knockdown(45, 1, 1) + + if(leaping) + leaping = 0 + pixel_y = initial(pixel_y) + update_icons() + update_canmove() diff --git a/code/citadel/pokemon.dm b/modular_citadel/code/modules/mob/living/simple_animal/pokemon.dm similarity index 100% rename from code/citadel/pokemon.dm rename to modular_citadel/code/modules/mob/living/simple_animal/pokemon.dm diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/flechette.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/flechette.dm new file mode 100644 index 0000000000..28dfeb89d6 --- /dev/null +++ b/modular_citadel/code/modules/projectiles/guns/ballistic/flechette.dm @@ -0,0 +1,117 @@ +//////Flechette Launcher////// + +///projectiles/// + +/obj/item/projectile/bullet/cflechetteap //shreds armor + name = "flechette (armor piercing)" + damage = 8 + armour_penetration = 80 + +/obj/item/projectile/bullet/cflechettes //shreds flesh and forces bleeding + name = "flechette (serrated)" + damage = 15 + dismemberment = 10 + armour_penetration = -80 + +/obj/item/projectile/bullet/cflechettes/on_hit(atom/target, blocked = FALSE) + if((blocked != 100) && iscarbon(target)) + var/mob/living/carbon/C = target + C.bleed(10) + return ..() + +///ammo casings (CASELESS AMMO CASINGS WOOOOOOOO)/// + +/obj/item/ammo_casing/caseless/flechetteap + name = "flechette (armor piercing)" + desc = "A flechette made with a tungsten alloy." + projectile_type = /obj/item/projectile/bullet/cflechetteap + caliber = "flechette" + throwforce = 1 + throw_speed = 3 + +/obj/item/ammo_casing/caseless/flechettes + name = "flechette (serrated)" + desc = "A serrated flechette made of a special alloy intended to deform drastically upon penetration of human flesh." + projectile_type = /obj/item/projectile/bullet/cflechettes + caliber = "flechette" + throwforce = 2 + throw_speed = 3 + embedding = list("embedded_pain_multiplier" = 0, "embed_chance" = 40, "embedded_fall_chance" = 10) + +///magazine/// + +/obj/item/ammo_box/magazine/flechette + name = "flechette magazine (armor piercing)" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "flechettemag" + ammo_type = /obj/item/ammo_casing/caseless/flechetteap + caliber = "flechette" + max_ammo = 40 + multiple_sprites = 2 + +/obj/item/ammo_box/magazine/flechette/s + name = "flechette magazine (serrated)" + ammo_type = /obj/item/ammo_casing/caseless/flechettes + +///the gun itself/// + +/obj/item/gun/ballistic/automatic/flechette + name = "\improper CX Flechette Launcher" + desc = "A flechette launching machine pistol with an unconventional bullpup frame." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "flechettegun" + item_state = "gun" + w_class = WEIGHT_CLASS_NORMAL + slot_flags = 0 + /obj/item/device/firing_pin/implant/pindicate + mag_type = /obj/item/ammo_box/magazine/flechette/ + fire_sound = 'sound/weapons/gunshot_smg.ogg' + can_suppress = 0 + burst_size = 5 + fire_delay = 1 + casing_ejector = 0 + spread = 10 + recoil = 0.05 + +/obj/item/gun/ballistic/automatic/flechette/update_icon() + ..() + if(magazine) + cut_overlays() + add_overlay("flechettegun-magazine") + else + cut_overlays() + icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" + +///unique variant/// + +/obj/item/projectile/bullet/cflechetteshredder + name = "flechette (shredder)" + damage = 5 + dismemberment = 40 + +/obj/item/ammo_casing/caseless/flechetteshredder + name = "flechette (shredder)" + desc = "A serrated flechette made of a special alloy that forms a monofilament edge." + projectile_type = /obj/item/projectile/bullet/cflechettes + +/obj/item/ammo_box/magazine/flechette/shredder + name = "flechette magazine (shredder)" + icon_state = "shreddermag" + ammo_type = /obj/item/ammo_casing/caseless/flechetteshredder + +/obj/item/gun/ballistic/automatic/flechette/shredder + name = "\improper CX Shredder" + desc = "A flechette launching machine pistol made of ultra-light CFRP optimized for firing serrated monofillament flechettes." + w_class = WEIGHT_CLASS_SMALL + mag_type = /obj/item/ammo_box/magazine/flechette/shredder + spread = 15 + recoil = 0.1 + +/obj/item/gun/ballistic/automatic/flechette/shredder/update_icon() + ..() + if(magazine) + cut_overlays() + add_overlay("shreddergun-magazine") + else + cut_overlays() + icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/handguns.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/handguns.dm new file mode 100644 index 0000000000..487d5111fc --- /dev/null +++ b/modular_citadel/code/modules/projectiles/guns/ballistic/handguns.dm @@ -0,0 +1,424 @@ +////////////Anti Tank Pistol//////////// + +/obj/item/gun/ballistic/automatic/pistol/antitank + name = "Anti Tank Pistol" + desc = "A massively impractical and silly monstrosity of a pistol that fires .50 calliber rounds. The recoil is likely to dislocate your wrist." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "atp" + item_state = "pistol" + recoil = 4 + mag_type = /obj/item/ammo_box/magazine/sniper_rounds + fire_delay = 50 + burst_size = 1 + can_suppress = 0 + w_class = WEIGHT_CLASS_NORMAL + actions_types = list() + fire_sound = 'sound/weapons/blastcannon.ogg' + spread = 20 //damn thing has no rifling. + +/obj/item/gun/ballistic/automatic/pistol/antitank/update_icon() + ..() + if(magazine) + cut_overlays() + add_overlay("atp-mag") + else + cut_overlays() + icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" + +/obj/item/gun/ballistic/automatic/pistol/antitank/syndicate + name = "Syndicate Anti Tank Pistol" + desc = "A massively impractical and silly monstrosity of a pistol that fires .50 calliber rounds. The recoil is likely to dislocate a variety of joints without proper bracing." + pin = /obj/item/device/firing_pin/implant/pindicate + +/* made redundant by reskinnable stetchkins +//////Stealth Pistol////// + +/obj/item/gun/ballistic/automatic/pistol/stealth + name = "stealth pistol" + desc = "A unique bullpup pistol with a compact frame. Has an integrated surpressor." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "stealthpistol" + w_class = WEIGHT_CLASS_SMALL + mag_type = /obj/item/ammo_box/magazine/m10mm + can_suppress = 0 + fire_sound = 'sound/weapons/gunshot_silenced.ogg' + suppressed = 1 + burst_size = 1 + +/obj/item/gun/ballistic/automatic/pistol/stealth/update_icon() + ..() + if(magazine) + cut_overlays() + add_overlay("stealthpistol-magazine") + else + cut_overlays() + icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" + +*/ + +///foam stealth pistol/// + +/obj/item/gun/ballistic/automatic/toy/pistol/stealth + name = "foam force stealth pistol" + desc = "A small, easily concealable toy bullpup handgun. Ages 8 and up." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "foamsp" + w_class = WEIGHT_CLASS_SMALL + mag_type = /obj/item/ammo_box/magazine/toy/pistol + can_suppress = FALSE + fire_sound = 'sound/weapons/gunshot_silenced.ogg' + suppressed = TRUE + burst_size = 1 + fire_delay = 0 + spread = 20 + actions_types = list() + +/obj/item/gun/ballistic/automatic/toy/pistol/stealth/update_icon() + ..() + if(magazine) + cut_overlays() + add_overlay("foamsp-magazine") + else + cut_overlays() + icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" + +//////10mm soporific bullets////// + +obj/item/projectile/bullet/c10mm/soporific + name ="10mm soporific bullet" + armour_penetration = 0 + nodamage = TRUE + dismemberment = 0 + knockdown = 0 + +/obj/item/projectile/bullet/c10mm/soporific/on_hit(atom/target, blocked = FALSE) + if((blocked != 100) && isliving(target)) + var/mob/living/L = target + L.blur_eyes(6) + if(L.getStaminaLoss() >= 60) + L.Sleeping(300) + else + L.adjustStaminaLoss(25) + return 1 + +/obj/item/ammo_casing/c10mm/soporific + name = ".10mm soporific bullet casing" + desc = "A 10mm soporific bullet casing." + projectile_type = /obj/item/projectile/bullet/c10mm/soporific + +/obj/item/ammo_box/magazine/m10mm/soporific + name = "pistol magazine (10mm soporific)" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "9x19pS" + desc = "A gun magazine. Loaded with rounds which inject the target with a variety of illegal substances to induce sleep in the target." + ammo_type = /obj/item/ammo_casing/c10mm/soporific + +/obj/item/ammo_box/c10mm/soporific + name = "ammo box (10mm soporific)" + ammo_type = /obj/item/ammo_casing/c10mm/soporific + max_ammo = 24 + +//////modular pistol////// (reskinnable stetchkins) + +/obj/item/gun/ballistic/automatic/pistol/modular + name = "modular pistol" + desc = "A small, easily concealable 10mm handgun. Has a threaded barrel for suppressors." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "cde" + can_unsuppress = TRUE + obj_flags = UNIQUE_RENAME + unique_reskin = list("Default" = "cde", + "NT-99" = "n99", + "Stealth" = "stealthpistol", + "HKVP-78" = "vp78", + "Luger" = "p08b", + "Mk.58" = "secguncomp", + "PX4 Storm" = "px4" + ) + +/obj/item/gun/ballistic/automatic/pistol/modular/update_icon() + ..() + if(current_skin) + icon_state = "[unique_reskin[current_skin]][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]" + else + icon_state = "[initial(icon_state)][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]" + if(magazine && suppressed) + cut_overlays() + add_overlay("[unique_reskin[current_skin]]-magazine-sup") //Yes, this means the default iconstate can't have a magazine overlay + else if (magazine) + cut_overlays() + add_overlay("[unique_reskin[current_skin]]-magazine") + else + cut_overlays() + +/////////RAYGUN MEMES///////// + +/obj/item/projectile/beam/lasertag/ray //the projectile, compatible with regular laser tag armor + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "ray" + name = "ray bolt" + eyeblur = 0 + +/obj/item/ammo_casing/energy/laser/raytag + projectile_type = /obj/item/projectile/beam/lasertag/ray + select_name = "raytag" + fire_sound = 'sound/weapons/raygun.ogg' + +/obj/item/gun/energy/laser/practice/raygun + name = "toy ray gun" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "raygun" + desc = "A toy laser with a classic, retro feel and look. Compatible with existing laser tag systems." + ammo_type = list(/obj/item/ammo_casing/energy/laser/raytag) + selfcharge = TRUE + +/*///////////////////////////////////////////////////////////////////////////////////////////// + The Recolourable Gun +*////////////////////////////////////////////////////////////////////////////////////////////// + +/obj/item/gun/ballistic/automatic/pistol/p37 + name = "\improper CX Mk.37P" + desc = "A modern reimagining of an old legendary gun, the Mk.37 is a handgun with a toggle-locking mechanism manufactured by CX Armories. \ + This model is coated with a special polychromic material. \ + Has a small warning on the receiver that boldly states 'WARNING: WILL DETONATE UPON UNAUTHORIZED USE'. \ + Uses 9mm bullets loaded into proprietary magazines." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "p37" + w_class = WEIGHT_CLASS_NORMAL + spawnwithmagazine = FALSE + mag_type = /obj/item/ammo_box/magazine/m9mm/p37 + can_suppress = FALSE + pin = /obj/item/device/firing_pin/dna/dredd //goes boom if whoever isn't DNA locked to it tries to use it + actions_types = list(/datum/action/item_action/pick_color) + + var/frame_color = "#808080" //RGB + var/receiver_color = "#808080" + var/body_color = "#0098FF" + var/barrel_color = "#808080" + var/tip_color = "#808080" + var/arm_color = "#808080" + var/grip_color = "#00FFCB" //Does not actually colour the grip, just the lights surrounding it + var/energy_color = "#00FFCB" + +///Defining all the colourable bits and displaying them/// + +/obj/item/gun/ballistic/automatic/pistol/p37/update_icon() + var/mutable_appearance/frame_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_frame") + var/mutable_appearance/receiver_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_receiver") + var/mutable_appearance/body_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_body") + var/mutable_appearance/barrel_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_barrel") + var/mutable_appearance/tip_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_tip") + var/mutable_appearance/grip_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_grip") + var/mutable_appearance/energy_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_light") + var/mutable_appearance/arm_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_arm") + var/mutable_appearance/arm_overlay_e = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_arm-e") + + if(frame_color) + frame_overlay.color = frame_color + if(receiver_color) + receiver_overlay.color = receiver_color + if(body_color) + body_overlay.color = body_color + if(barrel_color) + barrel_overlay.color = barrel_color + if(tip_color) + tip_overlay.color = tip_color + if(grip_color) + grip_overlay.color = grip_color + if(energy_color) + energy_overlay.color = energy_color + if(arm_color) + arm_overlay.color = arm_color + if(arm_color) + arm_overlay_e.color = arm_color + + cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other + + add_overlay(frame_overlay) + add_overlay(receiver_overlay) + add_overlay(body_overlay) + add_overlay(barrel_overlay) + add_overlay(tip_overlay) + add_overlay(grip_overlay) + add_overlay(energy_overlay) + + if(magazine) //does not need a cut_overlays proc call here because it's already called further up + add_overlay("p37_mag") + + if(chambered) + cut_overlay(arm_overlay_e) + add_overlay(arm_overlay) + else + cut_overlay(arm_overlay) + add_overlay(arm_overlay_e) + +///letting you actually recolor things/// + +/obj/item/gun/ballistic/automatic/pistol/p37/ui_action_click(mob/user, var/datum/action/A) + if(istype(A, /datum/action/item_action/pick_color)) + + var/choice = input(user,"Mk.37P polychrome options", "Gun Recolor") in list("Frame Color","Receiver Color","Body Color", + "Barrel Color", "Barrel Tip Color", "Grip Light Color", + "Light Color", "Arm Color", "*CANCEL*") + + switch(choice) + + if("Frame Color") + var/frame_color_input = input(usr,"","Choose Frame Color",frame_color) as color|null + if(frame_color_input) + frame_color = sanitize_hexcolor(frame_color_input, desired_format=6, include_crunch=1) + update_icon() + + if("Receiver Color") + var/receiver_color_input = input(usr,"","Choose Receiver Color",receiver_color) as color|null + if(receiver_color_input) + receiver_color = sanitize_hexcolor(receiver_color_input, desired_format=6, include_crunch=1) + update_icon() + + if("Body Color") + var/body_color_input = input(usr,"","Choose Body Color",body_color) as color|null + if(body_color_input) + body_color = sanitize_hexcolor(body_color_input, desired_format=6, include_crunch=1) + update_icon() + + if("Barrel Color") + var/barrel_color_input = input(usr,"","Choose Barrel Color",barrel_color) as color|null + if(barrel_color_input) + barrel_color = sanitize_hexcolor(barrel_color_input, desired_format=6, include_crunch=1) + update_icon() + + if("Barrel Tip Color") + var/tip_color_input = input(usr,"","Choose Barrel Tip Color",tip_color) as color|null + if(tip_color_input) + tip_color = sanitize_hexcolor(tip_color_input, desired_format=6, include_crunch=1) + update_icon() + + if("Grip Light Color") + var/grip_color_input = input(usr,"","Choose Grip Light Color",grip_color) as color|null + if(grip_color_input) + grip_color = sanitize_hexcolor(grip_color_input, desired_format=6, include_crunch=1) + update_icon() + + if("Light Color") + var/energy_color_input = input(usr,"","Choose Light Color",energy_color) as color|null + if(energy_color_input) + energy_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1) + update_icon() + + if("Arm Color") + var/arm_color_input = input(usr,"","Choose Arm Color",arm_color) as color|null + if(arm_color_input) + arm_color = sanitize_hexcolor(arm_color_input, desired_format=6, include_crunch=1) + update_icon() + A.UpdateButtonIcon() + + else + ..() + +///boolets/// + +/obj/item/projectile/bullet/c9mm/frangible + name = "9mm frangible bullet" + damage = 15 + stamina = 0 + speed = 1.0 + range = 20 + armour_penetration = -25 + +/obj/item/projectile/bullet/c9mm/rubber + name = "9mm rubber bullet" + damage = 5 + stamina = 30 + speed = 1.2 + range = 14 + knockdown = 0 + +/obj/item/ammo_casing/c9mm/frangible + name = "9mm frangible bullet casing" + desc = "A 9mm frangible bullet casing." + projectile_type = /obj/item/projectile/bullet/c9mm/frangible + +/obj/item/ammo_casing/c9mm/rubber + name = "9mm rubber bullet casing" + desc = "A 9mm rubber bullet casing." + projectile_type = /obj/item/projectile/bullet/c9mm/rubber + +/obj/item/ammo_box/magazine/m9mm/p37 + name = "\improper P37 magazine (9mm frangible)" + desc = "A gun magazine. Loaded with plastic composite rounds which fragment upon impact to minimize collateral damage." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "11mm" //topkek + ammo_type = /obj/item/ammo_casing/c9mm/frangible + caliber = "9mm" + max_ammo = 11 + multiple_sprites = 1 + +/obj/item/ammo_box/magazine/m9mm/p37/fmj + name = "\improper P37 magazine (9mm)" + ammo_type = /obj/item/ammo_casing/c9mm + desc = "A gun magazine. Loaded with conventional full metal jacket rounds." + +/obj/item/ammo_box/magazine/m9mm/p37/rubber + name = "\improper P37 magazine (9mm Non-Lethal Rubbershot)" + ammo_type = /obj/item/ammo_casing/c9mm/rubber + desc = "A gun magazine. Loaded with less-than-lethal rubber bullets." + +/obj/item/ammo_box/c9mm/frangible + name = "ammo box (9mm frangible)" + ammo_type = /obj/item/ammo_casing/c9mm/frangible + +/obj/item/ammo_box/c9mm/rubber + name = "ammo box (9mm non-lethal rubbershot)" + ammo_type = /obj/item/ammo_casing/c9mm/rubber + +/datum/design/c9mmfrag + name = "Box of 9mm Frangible Bullets" + id = "9mm_frag" + build_type = AUTOLATHE + materials = list(MAT_METAL = 25000) + build_path = /obj/item/ammo_box/c9mm/frangible + category = list("hacked", "Security") + +/datum/design/c9mmrubber + name = "Box of 9mm Rubber Bullets" + id = "9mm_rubber" + build_type = AUTOLATHE + materials = list(MAT_METAL = 30000) + build_path = /obj/item/ammo_box/c9mm/rubber + category = list("initial", "Security") + + +///Security Variant/// + +/obj/item/gun/ballistic/automatic/pistol/p37/sec + name = "\improper CX Mk.37S" + desc = "A modern reimagining of an old legendary gun, the Mk.37 is a handgun with a toggle-locking mechanism manufactured by CX Armories. Uses 9mm bullets loaded into proprietary magazines." + spawnwithmagazine = FALSE + pin = /obj/item/device/firing_pin/implant/mindshield + actions_types = list() //so you can't recolor it + + frame_color = "#808080" //RGB + receiver_color = "#808080" + body_color = "#282828" + barrel_color = "#808080" + tip_color = "#808080" + arm_color = "#800000" + grip_color = "#FFFF00" //Does not actually colour the grip, just the lights surrounding it + energy_color = "#FFFF00" + +///Foam Variant because WE NEED MEMES/// + +/obj/item/gun/ballistic/automatic/pistol/p37/foam + name = "\improper Foam Force Mk.37F" + desc = "A licensed foam-firing reproduction of a handgun with a toggle-locking mechanism manufactured by CX Armories. This model is coated with a special polychromic material. Uses standard foam pistol magazines." + icon_state = "p37_foam" + pin = /obj/item/device/firing_pin + spawnwithmagazine = TRUE + obj_flags = 0 + casing_ejector = FALSE + mag_type = /obj/item/ammo_box/magazine/toy/pistol + can_suppress = FALSE + actions_types = list(/datum/action/item_action/pick_color) + +/obj/item/ammo_box/magazine/toy/pistol //forcing this might be a bad idea, but it'll fix the foam gun infinite material exploit + materials = list(MAT_METAL = 200) diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm new file mode 100644 index 0000000000..cd4ec113de --- /dev/null +++ b/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm @@ -0,0 +1,466 @@ +///////XCOM X9 AR/////// + +/obj/item/gun/ballistic/automatic/x9 //will be adminspawn only so ERT or something can use them + name = "\improper X9 Assault Rifle" + desc = "A rather old design of a cheap, reliable assault rifle made for combat against unknown enemies. Uses 5.56mm ammo." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "x9" + item_state = "arg" + slot_flags = 0 + mag_type = /obj/item/ammo_box/magazine/m556 //Uses the m90gl's magazine, just like the NT-ARG + fire_sound = 'sound/weapons/gunshot_smg.ogg' + can_suppress = 0 + burst_size = 6 //in line with XCOMEU stats. This can fire 5 bursts from a full magazine. + fire_delay = 1 + spread = 30 //should be 40 for XCOM memes, but since its adminspawn only, might as well make it useable + recoil = 1 + +///toy memes/// + +/obj/item/ammo_box/magazine/toy/x9 + name = "foam force X9 magazine" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "toy9magazine" + max_ammo = 30 + multiple_sprites = 2 + materials = list(MAT_METAL = 200) + +/obj/item/gun/ballistic/automatic/x9/toy + name = "\improper Foam Force X9" + desc = "An old but reliable assault rifle made for combat against unknown enemies. Appears to be hastily converted. Ages 8 and up." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "toy9" + can_suppress = 0 + obj_flags = 0 + mag_type = /obj/item/ammo_box/magazine/toy/x9 + casing_ejector = 0 + spread = 90 //MAXIMUM XCOM MEMES (actually that'd be 180 spread) + w_class = WEIGHT_CLASS_BULKY + weapon_weight = WEAPON_HEAVY + +////////XCOM2 Magpistol///////// + +//////projectiles////// + +/obj/item/projectile/bullet/mags + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "magjectile" + damage = 15 + armour_penetration = 10 + light_range = 2 + speed = 0.6 + range = 25 + light_color = LIGHT_COLOR_RED + +/obj/item/projectile/bullet/nlmags //non-lethal boolets + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "magjectile-nl" + damage = 0 + knockdown = 0 + stamina = 25 + armour_penetration = -10 + light_range = 2 + speed = 0.7 + range = 25 + light_color = LIGHT_COLOR_BLUE + + +/////actual ammo///// + +/obj/item/ammo_casing/caseless/amags + desc = "A ferromagnetic slug intended to be launched out of a compatible weapon." + caliber = "mags" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "mag-casing-live" + projectile_type = /obj/item/projectile/bullet/mags + +/obj/item/ammo_casing/caseless/anlmags + desc = "A specialized ferromagnetic slug designed with a less-than-lethal payload." + caliber = "mags" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "mag-casing-live" + projectile_type = /obj/item/projectile/bullet/nlmags + +//////magazines///// + +/obj/item/ammo_box/magazine/mmag/small + name = "magpistol magazine (non-lethal disabler)" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "nlmagmag" + ammo_type = /obj/item/ammo_casing/caseless/anlmags + caliber = "mags" + max_ammo = 15 + multiple_sprites = 2 + +/obj/item/ammo_box/magazine/mmag/small/lethal + name = "magpistol magazine (lethal)" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "smallmagmag" + ammo_type = /obj/item/ammo_casing/caseless/amags + +//////the gun itself////// + +/obj/item/gun/ballistic/automatic/pistol/mag + name = "magpistol" + desc = "A handgun utilizing maglev technologies to propel a ferromagnetic slug to extreme velocities." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "magpistol" + force = 10 + fire_sound = 'sound/weapons/magpistol.ogg' + mag_type = /obj/item/ammo_box/magazine/mmag/small + can_suppress = 0 + casing_ejector = 0 + fire_delay = 2 + recoil = 0.2 + +/obj/item/gun/ballistic/automatic/pistol/mag/update_icon() + ..() + if(magazine) + cut_overlays() + add_overlay("magpistol-magazine") + else + cut_overlays() + icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" + +///research memes/// + +/obj/item/gun/ballistic/automatic/pistol/mag/nopin + pin = null + spawnwithmagazine = FALSE + +/datum/design/magpistol + name = "Magpistol" + desc = "A weapon which fires ferromagnetic slugs." + id = "magpisol" + build_type = PROTOLATHE + materials = list(MAT_METAL = 7500, MAT_GLASS = 1000, MAT_URANIUM = 1000, MAT_TITANIUM = 5000, MAT_SILVER = 2000) + build_path = /obj/item/gun/ballistic/automatic/pistol/mag/nopin + category = list("Weapons") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/mag_magpistol + name = "Magpistol Magazine" + desc = "A 14 round magazine for the Magpistol." + id = "mag_magpistol" + build_type = PROTOLATHE + materials = list(MAT_METAL = 4000, MAT_SILVER = 500) + build_path = /obj/item/ammo_box/magazine/mmag/small/lethal + category = list("Ammo") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/mag_magpistol/nl + name = "Magpistol Magazine (Non-Lethal)" + desc = "A 14 round non-lethal magazine for the Magpistol." + id = "mag_magpistol_nl" + materials = list(MAT_METAL = 3000, MAT_SILVER = 250, MAT_TITANIUM = 250) + build_path = /obj/item/ammo_box/magazine/mmag/small + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +//////toy memes///// + +/obj/item/projectile/bullet/reusable/foam_dart/mag + name = "magfoam dart" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "magjectile-toy" + ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag + light_range = 2 + light_color = LIGHT_COLOR_YELLOW + +/obj/item/ammo_casing/caseless/foam_dart/mag + name = "magfoam dart" + desc = "A foam dart with fun light-up projectiles powered by magnets!" + projectile_type = /obj/item/projectile/bullet/reusable/foam_dart/mag + +/obj/item/ammo_box/magazine/internal/shot/toy/mag + ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag + max_ammo = 14 + +/obj/item/gun/ballistic/shotgun/toy/mag + name = "foam force magpistol" + desc = "A fancy toy sold alongside light-up foam force darts. Ages 8 and up." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "toymag" + item_state = "gun" + mag_type = /obj/item/ammo_box/magazine/internal/shot/toy/mag + fire_sound = 'sound/weapons/magpistol.ogg' + slot_flags = SLOT_BELT + w_class = WEIGHT_CLASS_SMALL + +/obj/item/ammo_box/foambox/mag + name = "ammo box (Magnetic Foam Darts)" + icon = 'icons/obj/guns/toy.dmi' + icon_state = "foambox" + ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag + max_ammo = 42 + +//////Magrifle////// + +///projectiles/// + +/obj/item/projectile/bullet/magrifle + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "magjectile-large" + damage = 20 + armour_penetration = 25 + light_range = 3 + speed = 0.7 + range = 35 + light_color = LIGHT_COLOR_RED + +/obj/item/projectile/bullet/nlmagrifle //non-lethal boolets + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "magjectile-large-nl" + damage = 0 + knockdown = 0 + stamina = 25 + armour_penetration = -10 + light_range = 3 + speed = 0.65 + range = 35 + light_color = LIGHT_COLOR_BLUE + +///ammo casings/// + +/obj/item/ammo_casing/caseless/amagm + desc = "A large ferromagnetic slug intended to be launched out of a compatible weapon." + caliber = "magm" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "mag-casing-live" + projectile_type = /obj/item/projectile/bullet/magrifle + +/obj/item/ammo_casing/caseless/anlmagm + desc = "A large, specialized ferromagnetic slug designed with a less-than-lethal payload." + caliber = "magm" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "mag-casing-live" + projectile_type = /obj/item/projectile/bullet/nlmagrifle + +///magazines/// + +/obj/item/ammo_box/magazine/mmag/ + name = "magrifle magazine (non-lethal disabler)" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "mediummagmag" + ammo_type = /obj/item/ammo_casing/caseless/anlmagm + caliber = "magm" + max_ammo = 24 + multiple_sprites = 2 + +/obj/item/ammo_box/magazine/mmag/lethal + name = "magrifle magazine (lethal)" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "mediummagmag" + ammo_type = /obj/item/ammo_casing/caseless/amagm + max_ammo = 24 + +///the gun itself/// + +/obj/item/gun/ballistic/automatic/magrifle + name = "\improper Magnetic Rifle" + desc = "A simple upscalling of the technologies used in the magpistol, the magrifle is capable of firing slightly larger slugs in bursts. Compatible with the magpistol's slugs." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "magrifle" + item_state = "arg" + slot_flags = 0 + mag_type = /obj/item/ammo_box/magazine/mmag + fire_sound = 'sound/weapons/magrifle.ogg' + can_suppress = 0 + burst_size = 3 + fire_delay = 2 + spread = 5 + recoil = 0.15 + casing_ejector = 0 + +///research/// + +/obj/item/gun/ballistic/automatic/magrifle/nopin + pin = null + spawnwithmagazine = FALSE + +/datum/design/magrifle + name = "Magrifle" + desc = "An upscaled Magpistol in rifle form." + id = "magrifle" + build_type = PROTOLATHE + materials = list(MAT_METAL = 10000, MAT_GLASS = 2000, MAT_URANIUM = 2000, MAT_TITANIUM = 10000, MAT_SILVER = 4000, MAT_GOLD = 2000) + build_path = /obj/item/gun/ballistic/automatic/magrifle/nopin + category = list("Weapons") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/mag_magrifle + name = "Magrifle Magazine (Lethal)" + desc = "A 24-round magazine for the Magrifle." + id = "mag_magrifle" + build_type = PROTOLATHE + materials = list(MAT_METAL = 8000, MAT_SILVER = 1000) + build_path = /obj/item/ammo_box/magazine/mmag/lethal + category = list("Ammo") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/mag_magrifle/nl + name = "Magrifle Magazine (Non-Lethal)" + desc = "A 24- round non-lethal magazine for the Magrifle." + id = "mag_magrifle_nl" + materials = list(MAT_METAL = 6000, MAT_SILVER = 500, MAT_TITANIUM = 500) + build_path = /obj/item/ammo_box/magazine/mmag + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +///foamagrifle/// + +/obj/item/ammo_box/magazine/toy/foamag + name = "foam force magrifle magazine" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "foamagmag" + max_ammo = 24 + multiple_sprites = 2 + ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag + materials = list(MAT_METAL = 200) + +/obj/item/gun/ballistic/automatic/magrifle/toy + name = "foamag rifle" + desc = "A foam launching magnetic rifle. Ages 8 and up." + icon_state = "foamagrifle" + obj_flags = 0 + mag_type = /obj/item/ammo_box/magazine/toy/foamag + casing_ejector = FALSE + spread = 60 + w_class = WEIGHT_CLASS_BULKY + weapon_weight = WEAPON_HEAVY + +/* +// TECHWEBS IMPLEMENTATION +*/ + +/datum/techweb_node/magnetic_weapons + id = "magnetic_weapons" + display_name = "Magnetic Weapons" + description = "Weapons using magnetic technology" + prereq_ids = list("weaponry", "adv_weaponry", "emp_adv") + design_ids = list("magrifle", "magpisol", "mag_magrifle", "mag_magrifle_nl", "mag_magpistol", "mag_magpistol_nl") + research_cost = 2500 + export_price = 5000 + + +//////Hyper-Burst Rifle////// + +///projectiles/// + +/obj/item/projectile/bullet/mags/hyper + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "magjectile" + damage = 10 + armour_penetration = 10 + stamina = 10 + forcedodge = TRUE + range = 6 + light_range = 1 + light_color = LIGHT_COLOR_RED + +/obj/item/projectile/bullet/mags/hyper/inferno + icon_state = "magjectile-large" + stamina = 0 + forcedodge = FALSE + range = 25 + light_range = 4 + +/obj/item/projectile/bullet/mags/hyper/inferno/on_hit(atom/target, blocked = FALSE) + ..() + explosion(target, -1, 1, 2, 4, 5) + return 1 + +///ammo casings/// + +/obj/item/ammo_casing/caseless/ahyper + desc = "A large block of speciallized ferromagnetic material designed to be fired out of the experimental Hyper-Burst Rifle." + caliber = "hypermag" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "hyper-casing-live" + projectile_type = /obj/item/projectile/bullet/mags/hyper + pellets = 12 + variance = 40 + +/obj/item/ammo_casing/caseless/ahyper/inferno + projectile_type = /obj/item/projectile/bullet/mags/hyper/inferno + pellets = 1 + variance = 0 + +///magazines/// + +/obj/item/ammo_box/magazine/mhyper + name = "hyper-burst rifle magazine" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "hypermag-4" + ammo_type = /obj/item/ammo_casing/caseless/ahyper + caliber = "hypermag" + desc = "A magazine for the Hyper-Burst Rifle. Loaded with a special slug that fragments into 12 smaller shards which can absolutely puncture anything, but has rather short effective range." + max_ammo = 4 + +/obj/item/ammo_box/magazine/mhyper/update_icon() + ..() + icon_state = "hypermag-[ammo_count() ? "4" : "0"]" + +/obj/item/ammo_box/magazine/mhyper/inferno + name = "hyper-burst rifle magazine (inferno)" + ammo_type = /obj/item/ammo_casing/caseless/ahyper/inferno + desc = "A magazine for the Hyper-Burst Rifle. Loaded with a special slug that violently reacts with whatever surface it strikes, generating a massive amount of heat and light." + +///gun itself/// + +/obj/item/gun/ballistic/automatic/hyperburst + name = "\improper Hyper-Burst Rifle" + desc = "An extremely beefed up version of a stolen Nanotrasen weapon prototype, this 'rifle' is more like a cannon, with an extremely large bore barrel capable of generating several smaller magnetic 'barrels' to simultaneously launch multiple projectiles at once." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "hyperburst" + item_state = "arg" + slot_flags = 0 + mag_type = /obj/item/ammo_box/magazine/mhyper + fire_sound = 'sound/weapons/magburst.ogg' + can_suppress = 0 + burst_size = 1 + fire_delay = 40 + recoil = 2 + casing_ejector = 0 + weapon_weight = WEAPON_HEAVY + +/obj/item/gun/ballistic/automatic/hyperburst/update_icon() + ..() + icon_state = "hyperburst[magazine ? "-[get_ammo()]" : ""][chambered ? "" : "-e"]" + +///toy memes/// + +/obj/item/projectile/beam/lasertag/mag //the projectile, compatible with regular laser tag armor + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "magjectile-toy" + name = "lasertag magbolt" + forcedodge = TRUE //for penetration memes + range = 5 //so it isn't super annoying + light_range = 2 + light_color = LIGHT_COLOR_YELLOW + eyeblur = 0 + +/obj/item/ammo_casing/energy/laser/magtag + projectile_type = /obj/item/projectile/beam/lasertag/mag + select_name = "magtag" + pellets = 3 + variance = 30 + e_cost = 1000 + fire_sound = 'sound/weapons/magburst.ogg' + +/obj/item/gun/energy/laser/practice/hyperburst + name = "toy hyper-burst launcher" + desc = "A toy laser with a unique beam shaping lens that projects harmless bolts capable of going through objects. Compatible with existing laser tag systems." + ammo_type = list(/obj/item/ammo_casing/energy/laser/magtag) + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "toyburst" + clumsy_check = FALSE + obj_flags = 0 + fire_delay = 40 + weapon_weight = WEAPON_HEAVY + selfcharge = TRUE + charge_delay = 2 + recoil = 2 + cell_type = /obj/item/stock_parts/cell/toymagburst + +/obj/item/stock_parts/cell/toymagburst + name = "toy mag burst rifle power supply" + maxcharge = 4000 \ No newline at end of file diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm new file mode 100644 index 0000000000..a9824c7d33 --- /dev/null +++ b/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm @@ -0,0 +1,234 @@ + +///////XCOM X9 AR/////// + +/obj/item/gun/ballistic/automatic/x9 //will be adminspawn only so ERT or something can use them + name = "\improper X9 Assault Rifle" + desc = "A rather old design of a cheap, reliable assault rifle made for combat against unknown enemies. Uses 5.56mm ammo." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "x9" + item_state = "arg" + slot_flags = 0 + mag_type = /obj/item/ammo_box/magazine/m556 //Uses the m90gl's magazine, just like the NT-ARG + fire_sound = 'sound/weapons/gunshot_smg.ogg' + can_suppress = 0 + burst_size = 6 //in line with XCOMEU stats. This can fire 5 bursts from a full magazine. + fire_delay = 1 + spread = 30 //should be 40 for XCOM memes, but since its adminspawn only, might as well make it useable + recoil = 1 + +///toy memes/// + +/obj/item/ammo_box/magazine/toy/x9 + name = "foam force X9 magazine" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "toy9magazine" + max_ammo = 30 + multiple_sprites = 2 + materials = list(MAT_METAL = 200) + +/obj/item/gun/ballistic/automatic/x9/toy + name = "\improper Foam Force X9" + desc = "An old but reliable assault rifle made for combat against unknown enemies. Appears to be hastily converted. Ages 8 and up." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "toy9" + can_suppress = 0 + obj_flags = 0 + mag_type = /obj/item/ammo_box/magazine/toy/x9 + casing_ejector = 0 + spread = 90 //MAXIMUM XCOM MEMES (actually that'd be 180 spread) + w_class = WEIGHT_CLASS_BULKY + weapon_weight = WEAPON_HEAVY + + +//////Flechette Launcher////// + +///projectiles/// + +/obj/item/projectile/bullet/cflechetteap //shreds armor + name = "flechette (armor piercing)" + damage = 8 + armour_penetration = 80 + +/obj/item/projectile/bullet/cflechettes //shreds flesh and forces bleeding + name = "flechette (serrated)" + damage = 15 + dismemberment = 10 + armour_penetration = -80 + +/obj/item/projectile/bullet/cflechettes/on_hit(atom/target, blocked = FALSE) + if((blocked != 100) && iscarbon(target)) + var/mob/living/carbon/C = target + C.bleed(10) + return ..() + +///ammo casings (CASELESS AMMO CASINGS WOOOOOOOO)/// + +/obj/item/ammo_casing/caseless/flechetteap + name = "flechette (armor piercing)" + desc = "A flechette made with a tungsten alloy." + projectile_type = /obj/item/projectile/bullet/cflechetteap + caliber = "flechette" + throwforce = 1 + throw_speed = 3 + +/obj/item/ammo_casing/caseless/flechettes + name = "flechette (serrated)" + desc = "A serrated flechette made of a special alloy intended to deform drastically upon penetration of human flesh." + projectile_type = /obj/item/projectile/bullet/cflechettes + caliber = "flechette" + throwforce = 2 + throw_speed = 3 + embedding = list("embedded_pain_multiplier" = 0, "embed_chance" = 40, "embedded_fall_chance" = 10) + +///magazine/// + +/obj/item/ammo_box/magazine/flechette + name = "flechette magazine (armor piercing)" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "flechettemag" + ammo_type = /obj/item/ammo_casing/caseless/flechetteap + caliber = "flechette" + max_ammo = 40 + multiple_sprites = 2 + +/obj/item/ammo_box/magazine/flechette/s + name = "flechette magazine (serrated)" + ammo_type = /obj/item/ammo_casing/caseless/flechettes + +///the gun itself/// + +/obj/item/gun/ballistic/automatic/flechette + name = "\improper CX Flechette Launcher" + desc = "A flechette launching machine pistol with an unconventional bullpup frame." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "flechettegun" + item_state = "gun" + w_class = WEIGHT_CLASS_NORMAL + slot_flags = 0 + /obj/item/device/firing_pin/implant/pindicate + mag_type = /obj/item/ammo_box/magazine/flechette/ + fire_sound = 'sound/weapons/gunshot_smg.ogg' + can_suppress = 0 + burst_size = 5 + fire_delay = 1 + casing_ejector = 0 + spread = 10 + recoil = 0.05 + +/obj/item/gun/ballistic/automatic/flechette/update_icon() + ..() + if(magazine) + cut_overlays() + add_overlay("flechettegun-magazine") + else + cut_overlays() + icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" + +///unique variant/// + +/obj/item/projectile/bullet/cflechetteshredder + name = "flechette (shredder)" + damage = 5 + dismemberment = 40 + +/obj/item/ammo_casing/caseless/flechetteshredder + name = "flechette (shredder)" + desc = "A serrated flechette made of a special alloy that forms a monofilament edge." + projectile_type = /obj/item/projectile/bullet/cflechettes + +/obj/item/ammo_box/magazine/flechette/shredder + name = "flechette magazine (shredder)" + icon_state = "shreddermag" + ammo_type = /obj/item/ammo_casing/caseless/flechetteshredder + +/obj/item/gun/ballistic/automatic/flechette/shredder + name = "\improper CX Shredder" + desc = "A flechette launching machine pistol made of ultra-light CFRP optimized for firing serrated monofillament flechettes." + w_class = WEIGHT_CLASS_SMALL + mag_type = /obj/item/ammo_box/magazine/flechette/shredder + spread = 15 + recoil = 0.1 + +/obj/item/gun/ballistic/automatic/flechette/shredder/update_icon() + ..() + if(magazine) + cut_overlays() + add_overlay("shreddergun-magazine") + else + cut_overlays() + icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" + +/*///////////////////////////////////////////////////////////// +//////////////////////// Zero's Meme ////////////////////////// +*////////////////////////////////////////////////////////////// +/obj/item/ammo_box/magazine/toy/AM4B + name = "foam force AM4-B magazine" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "AM4MAG-60" + max_ammo = 60 + multiple_sprites = 0 + materials = list(MAT_METAL = 200) + +/obj/item/gun/ballistic/automatic/AM4B + name = "AM4-B" + desc = "A Relic from a bygone age. Nobody quite knows why it's here. Has a polychromic coating." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "AM4" + item_state = "arg" + mag_type = /obj/item/ammo_box/magazine/toy/AM4B + can_suppress = 0 + item_flags = NEEDS_PERMIT + casing_ejector = 0 + spread = 30 //Assault Rifleeeeeee + w_class = WEIGHT_CLASS_NORMAL + burst_size = 4 //Shh. + fire_delay = 1 + var/body_color = "#3333aa" + +/obj/item/gun/ballistic/automatic/AM4B/update_icon() + ..() + var/mutable_appearance/body_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "AM4-Body") + if(body_color) + body_overlay.color = body_color + cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other + add_overlay(body_overlay) + if(ismob(loc)) + var/mob/M = loc + M.update_inv_hands() +/obj/item/gun/ballistic/automatic/AM4B/AltClick(mob/living/user) + if(!in_range(src, user)) //Basic checks to prevent abuse + return + if(user.incapacitated() || !istype(user)) + to_chat(user, "You can't do that right now!") + return + if(alert("Are you sure you want to recolor your gun?", "Confirm Repaint", "Yes", "No") == "Yes") + var/body_color_input = input(usr,"","Choose Shroud Color",body_color) as color|null + if(body_color_input) + body_color = sanitize_hexcolor(body_color_input, desired_format=6, include_crunch=1) + update_icon() +/obj/item/gun/ballistic/automatic/AM4B/examine(mob/user) + ..() + to_chat(user, "Alt-click to recolor it.") + +/obj/item/ammo_box/magazine/toy/AM4C + name = "foam force AM4-C magazine" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "AM4MAG-32" + max_ammo = 32 + multiple_sprites = 0 + materials = list(MAT_METAL = 200) + +/obj/item/gun/ballistic/automatic/AM4C + name = "AM4-C" + desc = "A Relic from a bygone age. This one seems newer, yet less effective." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "AM4C" + item_state = "arg" + mag_type = /obj/item/ammo_box/magazine/toy/AM4C + can_suppress = 0 + item_flags = NEEDS_PERMIT + casing_ejector = 0 + spread = 45 //Assault Rifleeeeeee + w_class = WEIGHT_CLASS_NORMAL + burst_size = 4 //Shh. + fire_delay = 1 diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/spinfusor.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/spinfusor.dm new file mode 100644 index 0000000000..5b42f9686a --- /dev/null +++ b/modular_citadel/code/modules/projectiles/guns/ballistic/spinfusor.dm @@ -0,0 +1,90 @@ +/////////////spinfusor stuff//////////////// + +/obj/item/projectile/bullet/spinfusor + name ="spinfusor disk" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state= "spinner" + damage = 30 + dismemberment = 25 + +/obj/item/projectile/bullet/spinfusor/on_hit(atom/target, blocked = FALSE) //explosion to emulate the spinfusor's AOE + ..() + explosion(target, -1, -1, 2, 0, -1) + return 1 + +/obj/item/ammo_casing/caseless/spinfusor + name = "spinfusor disk" + desc = "A magnetic disk designed specifically for the Stormhammer magnetic cannon. Warning: extremely volatile!" + projectile_type = /obj/item/projectile/bullet/spinfusor + caliber = "spinfusor" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "disk" + throwforce = 15 //still deadly when thrown + throw_speed = 3 + +/obj/item/ammo_casing/caseless/spinfusor/throw_impact(atom/target) //disks detonate when thrown + if(!..()) // not caught in mid-air + visible_message("[src] detonates!") + playsound(src.loc, "sparks", 50, 1) + explosion(target, -1, -1, 1, 1, -1) + qdel(src) + return 1 + +/obj/item/ammo_box/magazine/internal/spinfusor + name = "spinfusor internal magazine" + ammo_type = /obj/item/ammo_casing/caseless/spinfusor + caliber = "spinfusor" + max_ammo = 1 + +/obj/item/gun/ballistic/automatic/spinfusor + name = "Stormhammer Magnetic Cannon" + desc = "An innovative weapon utilizing mag-lev technology to spin up a magnetic fusor and launch it at extreme velocities." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "spinfusor" + item_state = "spinfusor" + mag_type = /obj/item/ammo_box/magazine/internal/spinfusor + fire_sound = 'sound/weapons/rocketlaunch.ogg' + w_class = WEIGHT_CLASS_BULKY + can_suppress = 0 + burst_size = 1 + fire_delay = 40 + select = 0 + actions_types = list() + casing_ejector = 0 + +/obj/item/gun/ballistic/automatic/spinfusor/attackby(obj/item/A, mob/user, params) + var/num_loaded = magazine.attackby(A, user, params, 1) + if(num_loaded) + to_chat(user, "You load [num_loaded] disk\s into \the [src].") + update_icon() + chamber_round() + +/obj/item/gun/ballistic/automatic/spinfusor/attack_self(mob/living/user) + return //caseless rounds are too glitchy to unload properly. Best to make it so that you cannot remove disks from the spinfusor + +/obj/item/gun/ballistic/automatic/spinfusor/update_icon() + ..() + icon_state = "spinfusor[magazine ? "-[get_ammo(1)]" : ""]" + +/obj/item/ammo_box/aspinfusor + name = "ammo box (spinfusor disks)" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "spinfusorbox" + ammo_type = /obj/item/ammo_casing/caseless/spinfusor + max_ammo = 8 + +/datum/supply_pack/security/armory/spinfusor + name = "Stormhammer Spinfusor Crate" + cost = 14000 + contains = list(/obj/item/gun/ballistic/automatic/spinfusor, + /obj/item/gun/ballistic/automatic/spinfusor) + crate_name = "spinfusor crate" + +/datum/supply_pack/security/armory/spinfusorammo + name = "Spinfusor Disk Crate" + cost = 7000 + contains = list(/obj/item/ammo_box/aspinfusor, + /obj/item/ammo_box/aspinfusor, + /obj/item/ammo_box/aspinfusor, + /obj/item/ammo_box/aspinfusor) + crate_name = "spinfusor disk crate" \ No newline at end of file diff --git a/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm b/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm index e054e65ac5..fb488fcca4 100644 --- a/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm @@ -1,7 +1,56 @@ /obj/item/gun/energy/e_gun + name = "blaster carbine" + desc = "A high powered particle blaster carbine with varitable setting for stunning or lethal applications." icon = 'modular_citadel/icons/obj/guns/OVERRIDE_energy.dmi' lefthand_file = 'modular_citadel/icons/mob/inhands/OVERRIDE_guns_lefthand.dmi' righthand_file = 'modular_citadel/icons/mob/inhands/OVERRIDE_guns_righthand.dmi' ammo_x_offset = 2 flight_x_offset = 17 - flight_y_offset = 11 \ No newline at end of file + flight_y_offset = 11 + + +/*///////////////////////////////////////////////////////////////////////////////////////////// + The Recolourable Energy Gun +*////////////////////////////////////////////////////////////////////////////////////////////// + +obj/item/gun/energy/e_gun/cx + name = "\improper CX Model D Energy Gun" + desc = "An overpriced hybrid energy gun with two settings: disable, and kill. Manufactured by CX Armories. Has a polychromic coating." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "cxe" + lefthand_file = 'icons/mob/citadel/guns_lefthand.dmi' + righthand_file = 'icons/mob/citadel/guns_righthand.dmi' + ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser) + flight_x_offset = 15 + flight_y_offset = 10 + var/body_color = "#252528" + +obj/item/gun/energy/e_gun/cx/update_icon() + ..() + var/mutable_appearance/body_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "cxegun_body") + if(body_color) + body_overlay.color = body_color + add_overlay(body_overlay) + + if(ismob(loc)) + var/mob/M = loc + M.update_inv_hands() + +obj/item/gun/energy/e_gun/cx/AltClick(mob/living/user) + if(!in_range(src, user)) //Basic checks to prevent abuse + return + if(user.incapacitated() || !istype(user)) + to_chat(user, "You can't do that right now!") + return + if(alert("Are you sure you want to repaint your gun?", "Confirm Repaint", "Yes", "No") == "Yes") + var/body_color_input = input(usr,"","Choose Body Color",body_color) as color|null + if(body_color_input) + body_color = sanitize_hexcolor(body_color_input, desired_format=6, include_crunch=1) + update_icon() + +obj/item/gun/energy/e_gun/cx/worn_overlays(isinhands, icon_file) + . = ..() + if(isinhands) + var/mutable_appearance/body_inhand = mutable_appearance(icon_file, "cxe_body") + body_inhand.color = body_color + . += body_inhand diff --git a/modular_citadel/code/modules/projectiles/guns/energy/laser.dm b/modular_citadel/code/modules/projectiles/guns/energy/laser.dm index 316c976f6a..25ae98e72a 100644 --- a/modular_citadel/code/modules/projectiles/guns/energy/laser.dm +++ b/modular_citadel/code/modules/projectiles/guns/energy/laser.dm @@ -1,4 +1,6 @@ /obj/item/gun/energy/laser + name = "blaster rifle" + desc = "a high energy particle blaster, efficient and deadly." icon = 'modular_citadel/icons/obj/guns/OVERRIDE_energy.dmi' ammo_x_offset = 1 shaded_charge = 1 @@ -14,4 +16,31 @@ /obj/item/gun/energy/laser/redtag lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' \ No newline at end of file + righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + +/obj/item/gun/energy/laser/carbine + name = "VGS blaster carbine" + desc = "A ruggedized laser carbine featuring much higher capacity and improved handling when compared to a normal blaster carbine." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "lasernew" + item_state = "laser" + force = 10 + throwforce = 10 + ammo_type = list(/obj/item/ammo_casing/energy/lasergun) + cell_type = /obj/item/stock_parts/cell/lascarbine + +/obj/item/gun/energy/laser/carbine/nopin + pin = null + +/obj/item/stock_parts/cell/lascarbine + name = "laser carbine power supply" + maxcharge = 2500 + +/datum/design/lasercarbine + name = "VGS Blaster Carbine" + desc = "Beefed up version of a normal blaster carbine." + id = "lasercarbine" + build_type = PROTOLATHE + materials = list(MAT_GOLD = 2500, MAT_METAL = 5000, MAT_GLASS = 5000) + build_path = /obj/item/gun/energy/laser/carbine/nopin + category = list("Weapons") \ No newline at end of file diff --git a/code/citadel/cit_kegs.dm b/modular_citadel/code/modules/reagents/reagent container/cit_kegs.dm similarity index 93% rename from code/citadel/cit_kegs.dm rename to modular_citadel/code/modules/reagents/reagent container/cit_kegs.dm index d7e4ac03b9..d40dba8a3f 100644 --- a/code/citadel/cit_kegs.dm +++ b/modular_citadel/code/modules/reagents/reagent container/cit_kegs.dm @@ -1,7 +1,7 @@ /obj/structure/reagent_dispensers/keg name = "keg" desc = "A keg." - icon = 'code/citadel/icons/objects.dmi' + icon = 'modular_citadel/icons/obj/objects.dmi' icon_state = "keg" reagent_id = "water" diff --git a/code/citadel/hypospraymkii.dm b/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm similarity index 95% rename from code/citadel/hypospraymkii.dm rename to modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm index 587a980cd5..e89068c95f 100644 --- a/code/citadel/hypospraymkii.dm +++ b/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm @@ -4,7 +4,7 @@ //A vial-loaded hypospray. Cartridge-based! /obj/item/reagent_containers/hypospray/mkii name = "hypospray mk.II" - icon = 'icons/obj/citadel/hypospray.dmi' + icon = 'modular_citadel/icons/obj/hypospraymkii.dmi' icon_state = "hypo2" var/list/allowed_containers = list(/obj/item/reagent_containers/glass/bottle/vial/small) desc = "A new development from DeForest Medical, this new hypospray takes 30-unit vials as the drug supply for easy swapping." @@ -111,6 +111,15 @@ to_chat(user, "[target] is full.") return + if(ishuman(L)) + var/obj/item/bodypart/affecting = L.get_bodypart(check_zone(user.zone_selected)) + if(!affecting) + to_chat(user, "The limb is missing!") + return + if(affecting.status != BODYPART_ORGANIC) + to_chat(user, "Medicine won't work on a robotic limb!") + return + var/contained = reagents.log_list() add_logs(user, L, "attemped to inject", src, addition="which had [contained]") //Always log attemped injections for admins diff --git a/code/citadel/hypovial.dm b/modular_citadel/code/modules/reagents/reagent container/hypovial.dm similarity index 78% rename from code/citadel/hypovial.dm rename to modular_citadel/code/modules/reagents/reagent container/hypovial.dm index 61c61ed6c3..e3e82e22a7 100644 --- a/code/citadel/hypovial.dm +++ b/modular_citadel/code/modules/reagents/reagent container/hypovial.dm @@ -1,20 +1,28 @@ /obj/item/reagent_containers/glass/bottle/vial name = "hypospray vial" desc = "This is a vial suitable for loading into mk II hyposprays." - icon = 'icons/obj/citadel/vial.dmi' + icon = 'modular_citadel/icons/obj/vial.dmi' icon_state = "hypovial" - w_class = WEIGHT_CLASS_SMALL //Why would it be the same size as a beaker? - container_type = OPENCONTAINER spillable = FALSE - resistance_flags = ACID_PROOF var/comes_with = list() //Easy way of doing this. volume = 10 + obj_flags = UNIQUE_RENAME + unique_reskin = list("Hypospray vial" = "hypovial", + "Red hypospray vial" = "hypovial-b", + "Blue hypospray vial" = "hypovial-d", + "Green hypospray vial" = "hypovial-a", + "Orange hypospray vial" = "hypovial-k", + "Purple hypospray vial" = "hypovial-p", + "Black hypospray vial" = "hypovial-t" + ) /obj/item/reagent_containers/glass/bottle/vial/Initialize() . = ..() if(!icon_state) icon_state = "hypovial" update_icon() + for(var/R in comes_with) + reagents.add_reagent(R,comes_with[R]) /obj/item/reagent_containers/glass/bottle/vial/on_reagent_change() update_icon() @@ -22,7 +30,7 @@ /obj/item/reagent_containers/glass/bottle/vial/update_icon() cut_overlays() if(reagents.total_volume) - var/mutable_appearance/filling = mutable_appearance('icons/obj/citadel/vial.dmi', "[icon_state]10") + var/mutable_appearance/filling = mutable_appearance('modular_citadel/icons/obj/vial.dmi', "[icon_state]10") var/percent = round((reagents.total_volume / volume) * 100) switch(percent) @@ -48,11 +56,14 @@ desc = "This is a vial suitable for loading into the Chief Medical Officer's Hypospray mk II." icon_state = "hypoviallarge" volume = 60 - -/obj/item/reagent_containers/glass/bottle/vial/New() - ..() - for(var/R in comes_with) - reagents.add_reagent(R,comes_with[R]) + unique_reskin = list("Large hypospray vial" = "hypoviallarge", + "Red hypospray vial" = "hypoviallarge-b", + "Blue hypospray vial" = "hypoviallarge-d", + "Green hypospray vial" = "hypoviallarge-a", + "Orange hypospray vial" = "hypoviallarge-k", + "Purple hypospray vial" = "hypoviallarge-p", + "Black hypospray vial" = "hypoviallarge-t" + ) /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/bicaridine name = "vial (bicaridine)" diff --git a/code/citadel/cit_reagents.dm b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm similarity index 98% rename from code/citadel/cit_reagents.dm rename to modular_citadel/code/modules/reagents/reagents/cit_reagents.dm index df4af10faa..01c5e005a3 100644 --- a/code/citadel/cit_reagents.dm +++ b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm @@ -29,7 +29,7 @@ gender = PLURAL density = 0 layer = ABOVE_NORMAL_TURF_LAYER - icon = 'code/citadel/icons/effects.dmi' + icon = 'modular_citadel/icons/obj/genitals/effects.dmi' icon_state = "semen1" random_icon_states = list("semen1", "semen2", "semen3", "semen4") @@ -59,7 +59,7 @@ gender = PLURAL density = 0 layer = ABOVE_NORMAL_TURF_LAYER - icon = 'code/citadel/icons/effects.dmi' + icon = 'modular_citadel/icons/obj/genitals/effects.dmi' icon_state = "fem1" random_icon_states = list("fem1", "fem2", "fem3", "fem4") blood_state = null @@ -260,7 +260,7 @@ /obj/item/reagent_containers/food/drinks/bottle/sake name = "Traditional Sake" desc = "Sweet as can be, and burns like foxfire going down." - icon = 'code/citadel/icons/drinks.dmi' + icon = 'modular_citadel/icons/obj/drinks.dmi' icon_state = "sakebottle" list_reagents = list("sake" = 100) diff --git a/code/modules/vore/eating/belly_dat_vr.dm b/modular_citadel/code/modules/vore/eating/belly_dat_vr.dm similarity index 100% rename from code/modules/vore/eating/belly_dat_vr.dm rename to modular_citadel/code/modules/vore/eating/belly_dat_vr.dm diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm similarity index 100% rename from code/modules/vore/eating/belly_obj_vr.dm rename to modular_citadel/code/modules/vore/eating/belly_obj_vr.dm diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/modular_citadel/code/modules/vore/eating/bellymodes_vr.dm similarity index 100% rename from code/modules/vore/eating/bellymodes_vr.dm rename to modular_citadel/code/modules/vore/eating/bellymodes_vr.dm diff --git a/code/modules/vore/eating/digest_act_vr.dm b/modular_citadel/code/modules/vore/eating/digest_act_vr.dm similarity index 100% rename from code/modules/vore/eating/digest_act_vr.dm rename to modular_citadel/code/modules/vore/eating/digest_act_vr.dm diff --git a/code/modules/vore/eating/living_vr.dm b/modular_citadel/code/modules/vore/eating/living_vr.dm similarity index 100% rename from code/modules/vore/eating/living_vr.dm rename to modular_citadel/code/modules/vore/eating/living_vr.dm diff --git a/code/modules/vore/eating/simple_animal_vr.dm b/modular_citadel/code/modules/vore/eating/simple_animal_vr.dm similarity index 100% rename from code/modules/vore/eating/simple_animal_vr.dm rename to modular_citadel/code/modules/vore/eating/simple_animal_vr.dm diff --git a/code/modules/vore/eating/vore_vr.dm b/modular_citadel/code/modules/vore/eating/vore_vr.dm similarity index 100% rename from code/modules/vore/eating/vore_vr.dm rename to modular_citadel/code/modules/vore/eating/vore_vr.dm diff --git a/code/modules/vore/eating/voreitems.dm b/modular_citadel/code/modules/vore/eating/voreitems.dm similarity index 100% rename from code/modules/vore/eating/voreitems.dm rename to modular_citadel/code/modules/vore/eating/voreitems.dm diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm similarity index 100% rename from code/modules/vore/eating/vorepanel_vr.dm rename to modular_citadel/code/modules/vore/eating/vorepanel_vr.dm diff --git a/code/modules/vore/hook-defs_vr.dm b/modular_citadel/code/modules/vore/hook-defs_vr.dm similarity index 100% rename from code/modules/vore/hook-defs_vr.dm rename to modular_citadel/code/modules/vore/hook-defs_vr.dm diff --git a/code/modules/vore/persistence.dm b/modular_citadel/code/modules/vore/persistence.dm similarity index 100% rename from code/modules/vore/persistence.dm rename to modular_citadel/code/modules/vore/persistence.dm diff --git a/code/modules/vore/resizing/grav_pull_vr.dm b/modular_citadel/code/modules/vore/resizing/grav_pull_vr.dm similarity index 100% rename from code/modules/vore/resizing/grav_pull_vr.dm rename to modular_citadel/code/modules/vore/resizing/grav_pull_vr.dm diff --git a/code/modules/vore/resizing/holder_micro_vr.dm b/modular_citadel/code/modules/vore/resizing/holder_micro_vr.dm similarity index 100% rename from code/modules/vore/resizing/holder_micro_vr.dm rename to modular_citadel/code/modules/vore/resizing/holder_micro_vr.dm diff --git a/code/modules/vore/resizing/resize_vr.dm b/modular_citadel/code/modules/vore/resizing/resize_vr.dm similarity index 100% rename from code/modules/vore/resizing/resize_vr.dm rename to modular_citadel/code/modules/vore/resizing/resize_vr.dm diff --git a/code/modules/vore/resizing/sizechemicals.dm b/modular_citadel/code/modules/vore/resizing/sizechemicals.dm similarity index 98% rename from code/modules/vore/resizing/sizechemicals.dm rename to modular_citadel/code/modules/vore/resizing/sizechemicals.dm index 78b4bd71ca..1164bf65d6 100644 --- a/code/modules/vore/resizing/sizechemicals.dm +++ b/modular_citadel/code/modules/vore/resizing/sizechemicals.dm @@ -110,6 +110,6 @@ for(var/atom/movable/A in B.internal_contents) if(prob(55)) playsound(M, 'sound/effects/splat.ogg', 50, 1) - B.release_specific_contents(A) + B.release_vore_contents(A) ..() . = 1 \ No newline at end of file diff --git a/code/modules/vore/resizing/sizegun_vr.dm b/modular_citadel/code/modules/vore/resizing/sizegun_vr.dm similarity index 100% rename from code/modules/vore/resizing/sizegun_vr.dm rename to modular_citadel/code/modules/vore/resizing/sizegun_vr.dm diff --git a/code/modules/vore/trycatch_vr.dm b/modular_citadel/code/modules/vore/trycatch_vr.dm similarity index 100% rename from code/modules/vore/trycatch_vr.dm rename to modular_citadel/code/modules/vore/trycatch_vr.dm diff --git a/code/citadel/icons/misc.dmi b/modular_citadel/icons/misc/misc.dmi similarity index 100% rename from code/citadel/icons/misc.dmi rename to modular_citadel/icons/misc/misc.dmi diff --git a/code/citadel/icons/robot_transformations.dmi b/modular_citadel/icons/mob/legacy robo transforms.dmi similarity index 100% rename from code/citadel/icons/robot_transformations.dmi rename to modular_citadel/icons/mob/legacy robo transforms.dmi diff --git a/code/citadel/icons/mobs.dmi b/modular_citadel/icons/mob/mobs.dmi similarity index 100% rename from code/citadel/icons/mobs.dmi rename to modular_citadel/icons/mob/mobs.dmi diff --git a/code/citadel/icons/drinks.dmi b/modular_citadel/icons/obj/drinks.dmi similarity index 100% rename from code/citadel/icons/drinks.dmi rename to modular_citadel/icons/obj/drinks.dmi diff --git a/code/citadel/icons/breasts.dmi b/modular_citadel/icons/obj/genitals/breasts.dmi similarity index 100% rename from code/citadel/icons/breasts.dmi rename to modular_citadel/icons/obj/genitals/breasts.dmi diff --git a/code/citadel/icons/breasts_onmob.dmi b/modular_citadel/icons/obj/genitals/breasts_onmob.dmi similarity index 100% rename from code/citadel/icons/breasts_onmob.dmi rename to modular_citadel/icons/obj/genitals/breasts_onmob.dmi diff --git a/code/citadel/icons/dildo.dmi b/modular_citadel/icons/obj/genitals/dildo.dmi similarity index 100% rename from code/citadel/icons/dildo.dmi rename to modular_citadel/icons/obj/genitals/dildo.dmi diff --git a/code/citadel/icons/effects.dmi b/modular_citadel/icons/obj/genitals/effects.dmi similarity index 100% rename from code/citadel/icons/effects.dmi rename to modular_citadel/icons/obj/genitals/effects.dmi diff --git a/code/citadel/icons/hud.dmi b/modular_citadel/icons/obj/genitals/hud.dmi similarity index 100% rename from code/citadel/icons/hud.dmi rename to modular_citadel/icons/obj/genitals/hud.dmi diff --git a/code/citadel/icons/onahole.dmi b/modular_citadel/icons/obj/genitals/onahole.dmi similarity index 100% rename from code/citadel/icons/onahole.dmi rename to modular_citadel/icons/obj/genitals/onahole.dmi diff --git a/code/citadel/icons/ovipositor.dmi b/modular_citadel/icons/obj/genitals/ovipositor.dmi similarity index 100% rename from code/citadel/icons/ovipositor.dmi rename to modular_citadel/icons/obj/genitals/ovipositor.dmi diff --git a/code/citadel/icons/penis.dmi b/modular_citadel/icons/obj/genitals/penis.dmi similarity index 100% rename from code/citadel/icons/penis.dmi rename to modular_citadel/icons/obj/genitals/penis.dmi diff --git a/code/citadel/icons/penis_onmob.dmi b/modular_citadel/icons/obj/genitals/penis_onmob.dmi similarity index 100% rename from code/citadel/icons/penis_onmob.dmi rename to modular_citadel/icons/obj/genitals/penis_onmob.dmi diff --git a/code/citadel/icons/taur_penis_onmob.dmi b/modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi similarity index 100% rename from code/citadel/icons/taur_penis_onmob.dmi rename to modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi diff --git a/code/citadel/icons/vagina.dmi b/modular_citadel/icons/obj/genitals/vagina.dmi similarity index 100% rename from code/citadel/icons/vagina.dmi rename to modular_citadel/icons/obj/genitals/vagina.dmi diff --git a/code/citadel/icons/vagina_onmob.dmi b/modular_citadel/icons/obj/genitals/vagina_onmob.dmi similarity index 100% rename from code/citadel/icons/vagina_onmob.dmi rename to modular_citadel/icons/obj/genitals/vagina_onmob.dmi diff --git a/modular_citadel/icons/obj/hypospraymkii.dmi b/modular_citadel/icons/obj/hypospraymkii.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f5e89227c77d936dc67045deefaedb0bbb704c5f GIT binary patch literal 1038 zcmV+p1o8WcP)V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex7wuvIWN;^NFm z%}mcIfpCgT5=&AQY!#G}bMuXKQJp@xj55`5_3}_Y!qb#6=hTw5UUEe zmC6dPel7|wzMfnFo>e)|=yNGa0009`NklPZepP0))PqaKZ+q=jHbgIq9>XYIj|f)Fb7 z&|vaBkQQ1R&CZ+dmh^oIX}hrd8-}+t?9SK%fdGnG`&1jCT9yM;8=zYI%}gHl`Hj?j z&7q;IyVGXgB)NRD1BQKm!&T)A}+Um#fMJt@!{> z{Jw1be+6^mNE+kDGC6iBf zz@O%;i7jBy#iJU3tX3FzwXw8fTUa5|l^m)K!1 zu_Lw=la>Ox`Q$VhUyE=5B@~E@PjbNE*)X)`S!_nPGS2Ek5{sryQNt%WpnuGb9_K}T z{}BZM1VdlYTT8S+G2bS79De)iozZyai}3Wv8`X6?-5tCnx}K@J zfC_mUJROm5GaWg`N$c%72LvaBFN2f8oZs`dw+OGd=e7X1iarfm4p41?YFQ3YZGdW7 z{Q+j+p2ix~yXyb|L-$6c_XlwB$^8MI#u~J>wxFWC3>D>N()$Cr_@w@T6nuQ;kmz*N z;^vdKK)t&T55wyK)-k68-pWK~eLl}sB2GRz3wSFN8Lxoc{s1mMsXt&U{0RWy05G+< zJua(1fRj%;3=RAI#^~b*SpKyF0O;)-K=1Xd(o!HNpPU9q9zDVQ{7>q1)8gWr>kl}t zxIch_Z}kUI`U3`TUfDH%>-K$V{Q;bO>o6obL67Ko|6wfWxD0Xg$yp$^{{Z0F(IeDl z$l~H#TYx&Tt#$hfdgiPAG8q@Y=$`<~0jdp9t)h1TIS8rbH)A^-pY literal 0 HcmV?d00001 diff --git a/code/citadel/icons/objects.dmi b/modular_citadel/icons/obj/objects.dmi similarity index 100% rename from code/citadel/icons/objects.dmi rename to modular_citadel/icons/obj/objects.dmi diff --git a/code/citadel/icons/structures.dmi b/modular_citadel/icons/obj/structures.dmi similarity index 100% rename from code/citadel/icons/structures.dmi rename to modular_citadel/icons/obj/structures.dmi diff --git a/modular_citadel/icons/obj/vial.dmi b/modular_citadel/icons/obj/vial.dmi new file mode 100644 index 0000000000000000000000000000000000000000..694cc1741b31609b9b7fc1e193818f61d43eeec3 GIT binary patch literal 2148 zcmb7Gc{Cf?8V?@P(scTmNUNdsrqhMcp@OKT!J}1MXe}e?BGkSFsV!PXMMYH`V-QNG zmRLtdgou49O4Jgylxm4usuH18;zj4Z_gDYvIlp_q`+fI(=iKw%-|xFO+1A?p!2Toq z0RX^(ix#FRkJDQg0Qy&0{{SA&XZTwpu1;(hf8vK8h_v5n`D#}8u7v0JIO8JJ;RyIYQE-p zX-(6f#cF1fkQsJ}_LPGV=_B3iQD}I4?HR4pKfgPF&h}z(gs%PhUDkH@b93RS9NzZ| zm;L9p;JKk>n{*rH=z8ug5Bn5rJ0uXCTW}AehA`V_=7c5u^Uu#hqqRHd(3A5WCyAfh z2xNE1^_}(tP6XJ%sCHo&oN1y{%K|m-0A!AXVyv7i2-_N$1)^Pg@XD9Dp&~;UCucmLPqUgbNXiiagnE-1Ham?mVFoTb zfg0{j8;O+d7ZR(Sm3ynn*J_48!y@>VKk>jkgLExRsHGmIiGN8`nKv>p*QaDwJOGw0 z=@!eWGYAed?`8Hs>1tm|rpz&_y!4uUy*f!XxvFWrhHwm7P}x%iA0@p2Idggn;iL1l zu>qDpN2yHExy3L2gI#uS23U4l-_&5A&d^(l}B}CSK>^>`C8vf@;~@R2qicz&r)LOnHg z{CAKp+y_2WA)&6VA#%o+%cxmdXdkz8cpzg~Z6QuMPmhE5X$b=!b>&@-r+(_S4lu6@KB)&SBeqr$64^W6*b@Bih))OlT3yZC>WquVG0?rr)Un8XFt8Iy*Z@ z!k*ezrKcbA;;q>#`L#SGFeKTXOgiFm?l#s_KxBsxF4u5fM?%L&Ke=E+LPF3n4vL7c zY*z_v!3EzYJ7SLp!n0EqqL}i3$3;R=X_AV5q#sMI#C%>@94BUS2;`x*4&d6x#s)QT zg~~+fxyP57fjnZ^5i%x5WqCH70K_nP3Kq`8^X>dqfI+vGE$rQ2ep(hK|90Rpr-0nG z+<2H5(TsdLQ=!{~F@XlXX@YC9p{&&>Q(^r+fzM&KsatUmXVoF7fBf(ri2lXk8UM!H z9oGl+zt? z_j33^jYvOgz#BJaEX*OM*2AJ&GU;4!)U3~9uZAHkwrur!#K2R+Xk}_l##&kjFZ36c z)t!pmEK_3v&uyY(z=W)U0&HD{^d!I_D8H5~^MCVK6(Ko`oMODAyw(+W@{}^143M}( zYngz}t^2@X8b|*Dbv1tF8MyEQTVA6vC;?OKP#puJsdVzF1p`?qOb8c9C=4Vqs>2d_sKj zpwi`MUrfkpfW+Z?+Fu`peYpkD{IEdZ4*i)|V~1oGxbUAYHkXGkRl=Y4U6l~j1|8&_SBz2@d_lvo9786xK@qj%M|din1;3^Q=*h3(f=m9 zIv?b8N*N&v2DqJPH*E&YIf%gQ1s*zvvl9%Jd1A*q&}YB#WCnYC#J(&O%b00q196#xJL literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index 0f159bed10..b1787c6712 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -92,6 +92,7 @@ #include "code\__DEFINES\vv.dm" #include "code\__DEFINES\wall_dents.dm" #include "code\__DEFINES\wires.dm" +#include "code\__HELPERS\_cit_helpers.dm" #include "code\__HELPERS\_lists.dm" #include "code\__HELPERS\_logging.dm" #include "code\__HELPERS\_string_lists.dm" @@ -182,44 +183,6 @@ #include "code\_onclick\hud\robot.dm" #include "code\_onclick\hud\screen_objects.dm" #include "code\_onclick\hud\swarmer.dm" -#include "code\citadel\_cit_helpers.dm" -#include "code\citadel\cit_areas.dm" -#include "code\citadel\cit_arousal.dm" -#include "code\citadel\cit_clothes.dm" -#include "code\citadel\cit_crewobjectives.dm" -#include "code\citadel\cit_displaycases.dm" -#include "code\citadel\cit_emotes.dm" -#include "code\citadel\cit_guns.dm" -#include "code\citadel\cit_kegs.dm" -#include "code\citadel\cit_miscreants.dm" -#include "code\citadel\cit_reagents.dm" -#include "code\citadel\cit_spawners.dm" -#include "code\citadel\cit_uniforms.dm" -#include "code\citadel\cit_vendors.dm" -#include "code\citadel\dogborgstuff.dm" -#include "code\citadel\hypospraymkii.dm" -#include "code\citadel\hypovial.dm" -#include "code\citadel\plasmacases.dm" -#include "code\citadel\crew_objectives\cit_crewobjectives_cargo.dm" -#include "code\citadel\crew_objectives\cit_crewobjectives_civilian.dm" -#include "code\citadel\crew_objectives\cit_crewobjectives_command.dm" -#include "code\citadel\crew_objectives\cit_crewobjectives_engineering.dm" -#include "code\citadel\crew_objectives\cit_crewobjectives_medical.dm" -#include "code\citadel\crew_objectives\cit_crewobjectives_science.dm" -#include "code\citadel\crew_objectives\cit_crewobjectives_security.dm" -#include "code\citadel\custom_loadout\custom_items.dm" -#include "code\citadel\custom_loadout\load_to_mob.dm" -#include "code\citadel\custom_loadout\read_from_file.dm" -#include "code\citadel\organs\breasts.dm" -#include "code\citadel\organs\eggsack.dm" -#include "code\citadel\organs\genitals.dm" -#include "code\citadel\organs\genitals_sprite_accessories.dm" -#include "code\citadel\organs\ovipositor.dm" -#include "code\citadel\organs\penis.dm" -#include "code\citadel\organs\testicles.dm" -#include "code\citadel\organs\vagina.dm" -#include "code\citadel\organs\womb.dm" -#include "code\citadel\toys\dildos.dm" #include "code\controllers\admin.dm" #include "code\controllers\configuration_citadel.dm" #include "code\controllers\controller.dm" @@ -807,6 +770,7 @@ #include "code\game\objects\items\devices\aicard.dm" #include "code\game\objects\items\devices\camera_bug.dm" #include "code\game\objects\items\devices\chameleonproj.dm" +#include "code\game\objects\items\devices\dogborg_sleeper.dm" #include "code\game\objects\items\devices\doorCharge.dm" #include "code\game\objects\items\devices\electroadaptive_pseudocircuit.dm" #include "code\game\objects\items\devices\flashlight.dm" @@ -2588,18 +2552,6 @@ #include "code\modules\vehicles\speedbike.dm" #include "code\modules\vehicles\vehicle_actions.dm" #include "code\modules\vehicles\vehicle_key.dm" -#include "code\modules\vore\hook-defs_vr.dm" -#include "code\modules\vore\persistence.dm" -#include "code\modules\vore\trycatch_vr.dm" -#include "code\modules\vore\eating\belly_dat_vr.dm" -#include "code\modules\vore\eating\belly_obj_vr.dm" -#include "code\modules\vore\eating\bellymodes_vr.dm" -#include "code\modules\vore\eating\digest_act_vr.dm" -#include "code\modules\vore\eating\living_vr.dm" -#include "code\modules\vore\eating\simple_animal_vr.dm" -#include "code\modules\vore\eating\vore_vr.dm" -#include "code\modules\vore\eating\voreitems.dm" -#include "code\modules\vore\eating\vorepanel_vr.dm" #include "code\modules\VR\vr_human.dm" #include "code\modules\VR\vr_sleeper.dm" #include "code\modules\zombie\items.dm" @@ -2627,15 +2579,18 @@ #include "modular_citadel\code\datums\mutations\hulk.dm" #include "modular_citadel\code\datums\wires\airlock.dm" #include "modular_citadel\code\datums\wires\autoylathe.dm" +#include "modular_citadel\code\game\area\cit_areas.dm" #include "modular_citadel\code\game\gamemodes\miniantags\bot_swarm\swarmer_event.dm" #include "modular_citadel\code\game\gamemodes\revolution\revolution.dm" #include "modular_citadel\code\game\machinery\cryopod.dm" +#include "modular_citadel\code\game\machinery\displaycases.dm" #include "modular_citadel\code\game\machinery\Sleeper.dm" #include "modular_citadel\code\game\machinery\toylathe.dm" #include "modular_citadel\code\game\machinery\vending.dm" #include "modular_citadel\code\game\machinery\computer\card.dm" #include "modular_citadel\code\game\objects\ids.dm" #include "modular_citadel\code\game\objects\tools.dm" +#include "modular_citadel\code\game\objects\effects\spawner\spawners.dm" #include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\impact.dm" #include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\muzzle.dm" #include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\tracer.dm" @@ -2658,6 +2613,26 @@ #include "modular_citadel\code\modules\admin\holder2.dm" #include "modular_citadel\code\modules\admin\secrets.dm" #include "modular_citadel\code\modules\admin\topic.dm" +#include "modular_citadel\code\modules\antagonists\cit_crewobjectives.dm" +#include "modular_citadel\code\modules\antagonists\cit_miscreants.dm" +#include "modular_citadel\code\modules\antagonists\crew_objectives\cit_crewobjectives_cargo.dm" +#include "modular_citadel\code\modules\antagonists\crew_objectives\cit_crewobjectives_civilian.dm" +#include "modular_citadel\code\modules\antagonists\crew_objectives\cit_crewobjectives_command.dm" +#include "modular_citadel\code\modules\antagonists\crew_objectives\cit_crewobjectives_engineering.dm" +#include "modular_citadel\code\modules\antagonists\crew_objectives\cit_crewobjectives_medical.dm" +#include "modular_citadel\code\modules\antagonists\crew_objectives\cit_crewobjectives_science.dm" +#include "modular_citadel\code\modules\antagonists\crew_objectives\cit_crewobjectives_security.dm" +#include "modular_citadel\code\modules\arousal\arousal.dm" +#include "modular_citadel\code\modules\arousal\organs\breasts.dm" +#include "modular_citadel\code\modules\arousal\organs\eggsack.dm" +#include "modular_citadel\code\modules\arousal\organs\genitals.dm" +#include "modular_citadel\code\modules\arousal\organs\genitals_sprite_accessories.dm" +#include "modular_citadel\code\modules\arousal\organs\ovipositor.dm" +#include "modular_citadel\code\modules\arousal\organs\penis.dm" +#include "modular_citadel\code\modules\arousal\organs\testicles.dm" +#include "modular_citadel\code\modules\arousal\organs\vagina.dm" +#include "modular_citadel\code\modules\arousal\organs\womb.dm" +#include "modular_citadel\code\modules\arousal\toys\dildos.dm" #include "modular_citadel\code\modules\cargo\console.dm" #include "modular_citadel\code\modules\cargo\packs.dm" #include "modular_citadel\code\modules\client\client_defines.dm" @@ -2681,12 +2656,15 @@ #include "modular_citadel\code\modules\client\loadout\suit.dm" #include "modular_citadel\code\modules\client\loadout\uniform.dm" #include "modular_citadel\code\modules\client\verbs\who.dm" -#include "modular_citadel\code\modules\clothing\under.dm" #include "modular_citadel\code\modules\clothing\spacesuits\flightsuit.dm" +#include "modular_citadel\code\modules\clothing\suits\suits.dm" #include "modular_citadel\code\modules\clothing\under\polychromic_clothes.dm" -#include "modular_citadel\code\modules\clothing\under\syndicate.dm" #include "modular_citadel\code\modules\clothing\under\turtlenecks.dm" +#include "modular_citadel\code\modules\clothing\under\under.dm" #include "modular_citadel\code\modules\crafting\recipes.dm" +#include "modular_citadel\code\modules\custom_loadout\custom_items.dm" +#include "modular_citadel\code\modules\custom_loadout\load_to_mob.dm" +#include "modular_citadel\code\modules\custom_loadout\read_from_file.dm" #include "modular_citadel\code\modules\events\blob.dm" #include "modular_citadel\code\modules\jobs\jobs.dm" #include "modular_citadel\code\modules\jobs\job_types\captain.dm" @@ -2701,9 +2679,11 @@ #include "modular_citadel\code\modules\mentor\mentorpm.dm" #include "modular_citadel\code\modules\mentor\mentorsay.dm" #include "modular_citadel\code\modules\mining\mine_items.dm" +#include "modular_citadel\code\modules\mob\cit_emotes.dm" #include "modular_citadel\code\modules\mob\living\carbon\human\human_defense.dm" #include "modular_citadel\code\modules\mob\living\carbon\human\life.dm" #include "modular_citadel\code\modules\mob\living\carbon\human\species_types\jellypeople.dm" +#include "modular_citadel\code\modules\mob\living\silicon\robot\dogborg_equipment.dm" #include "modular_citadel\code\modules\mob\living\silicon\robot\robot.dm" #include "modular_citadel\code\modules\mob\living\silicon\robot\robot_modules.dm" #include "modular_citadel\code\modules\mob\living\simple_animal\banana_spider.dm" @@ -2711,13 +2691,34 @@ #include "modular_citadel\code\modules\power\lighting.dm" #include "modular_citadel\code\modules\projectiles\guns\pumpenergy.dm" #include "modular_citadel\code\modules\projectiles\guns\toys.dm" +#include "modular_citadel\code\modules\projectiles\guns\ballistic\flechette.dm" +#include "modular_citadel\code\modules\projectiles\guns\ballistic\handguns.dm" +#include "modular_citadel\code\modules\projectiles\guns\ballistic\magweapon.dm" #include "modular_citadel\code\modules\projectiles\guns\ballistic\revolver.dm" +#include "modular_citadel\code\modules\projectiles\guns\ballistic\rifles.dm" +#include "modular_citadel\code\modules\projectiles\guns\ballistic\spinfusor.dm" #include "modular_citadel\code\modules\projectiles\guns\energy\energy_gun.dm" #include "modular_citadel\code\modules\projectiles\guns\energy\laser.dm" +#include "modular_citadel\code\modules\reagents\reagent container\cit_kegs.dm" +#include "modular_citadel\code\modules\reagents\reagent container\hypospraymkii.dm" +#include "modular_citadel\code\modules\reagents\reagent container\hypovial.dm" +#include "modular_citadel\code\modules\reagents\reagents\cit_reagents.dm" #include "modular_citadel\code\modules\research\designs\autoylathe_designs.dm" #include "modular_citadel\code\modules\research\designs\machine_designs.dm" #include "modular_citadel\code\modules\research\techweb\_techweb.dm" #include "modular_citadel\code\modules\research\techweb\all_nodes.dm" #include "modular_citadel\code\modules\uplink\uplink_items.dm" +#include "modular_citadel\code\modules\vore\hook-defs_vr.dm" +#include "modular_citadel\code\modules\vore\persistence.dm" +#include "modular_citadel\code\modules\vore\trycatch_vr.dm" +#include "modular_citadel\code\modules\vore\eating\belly_dat_vr.dm" +#include "modular_citadel\code\modules\vore\eating\belly_obj_vr.dm" +#include "modular_citadel\code\modules\vore\eating\bellymodes_vr.dm" +#include "modular_citadel\code\modules\vore\eating\digest_act_vr.dm" +#include "modular_citadel\code\modules\vore\eating\living_vr.dm" +#include "modular_citadel\code\modules\vore\eating\simple_animal_vr.dm" +#include "modular_citadel\code\modules\vore\eating\vore_vr.dm" +#include "modular_citadel\code\modules\vore\eating\voreitems.dm" +#include "modular_citadel\code\modules\vore\eating\vorepanel_vr.dm" #include "modular_citadel\interface\skin.dmf" // END_INCLUDE diff --git a/tgui/assets/tgui.css b/tgui/assets/tgui.css index ffe61666b9..256b53c106 100644 --- a/tgui/assets/tgui.css +++ b/tgui/assets/tgui.css @@ -1 +1 @@ -@charset "utf-8";body,html{box-sizing:border-box;height:100%;margin:0}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff;background-color:#2a2a2a;background-image:linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff2a2a2a",endColorstr="#ff202020",GradientType=0)}*,:after,:before{box-sizing:inherit}h1,h2,h3,h4{display:inline-block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}body.clockwork{background:linear-gradient(180deg,#b18b25 0,#5f380e);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffb18b25",endColorstr="#ff5f380e",GradientType=0)}body.clockwork .normal{color:#b18b25}body.clockwork .good{color:#cfba47}body.clockwork .average{color:#896b19}body.clockwork .bad{color:#5f380e}body.clockwork .highlight{color:#b18b25}body.clockwork main{display:block;margin-top:32px;padding:2px 6px 0}body.clockwork hr{height:2px;background-color:#b18b25;border:none}body.clockwork .hidden{display:none}body.clockwork .bar .barText,body.clockwork span.button{color:#b18b25;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.clockwork .bold{font-weight:700}body.clockwork .italic{font-style:italic}body.clockwork [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.clockwork div[data-tooltip],body.clockwork span[data-tooltip]{position:relative}body.clockwork div[data-tooltip]:after,body.clockwork span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #170800;background-color:#2d1400}body.clockwork div[data-tooltip]:hover:after,body.clockwork span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.clockwork div[data-tooltip].tooltip-top:after,body.clockwork span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-top:hover:after,body.clockwork span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:after,body.clockwork span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:hover:after,body.clockwork span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-left:after,body.clockwork span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-left:hover:after,body.clockwork span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:after,body.clockwork span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:hover:after,body.clockwork span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #170800;background:#2d1400}body.clockwork .bar .barText{position:absolute;top:0;right:3px}body.clockwork .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#b18b25}body.clockwork .bar .barFill.good{background-color:#cfba47}body.clockwork .bar .barFill.average{background-color:#896b19}body.clockwork .bar .barFill.bad{background-color:#5f380e}body.clockwork span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #170800}body.clockwork span.button .fa{padding-right:2px}body.clockwork span.button.normal{transition:background-color .5s;background-color:#5f380e}body.clockwork span.button.normal.active:focus,body.clockwork span.button.normal.active:hover{transition:background-color .25s;background-color:#704211;outline:0}body.clockwork span.button.disabled{transition:background-color .5s;background-color:#2d1400}body.clockwork span.button.disabled.active:focus,body.clockwork span.button.disabled.active:hover{transition:background-color .25s;background-color:#441e00;outline:0}body.clockwork span.button.selected{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.selected.active:focus,body.clockwork span.button.selected.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.toggle{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.toggle.active:focus,body.clockwork span.button.toggle.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.caution{transition:background-color .5s;background-color:#be6209}body.clockwork span.button.caution.active:focus,body.clockwork span.button.caution.active:hover{transition:background-color .25s;background-color:#cd6a0a;outline:0}body.clockwork span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.clockwork span.button.danger.active:focus,body.clockwork span.button.danger.active:hover{transition:background-color .25s;background-color:#abaf00;outline:0}body.clockwork span.button.gridable{width:125px;margin:2px 0}body.clockwork span.button.gridable.center{text-align:center;width:75px}body.clockwork span.button+span:not(.button),body.clockwork span:not(.button)+span.button{margin-left:5px}body.clockwork div.display{width:100%;padding:4px;margin:6px 0;background-color:#2d1400;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400);background-color:rgba(45,20,0,.9);box-shadow:inset 0 0 5px rgba(0,0,0,.3)}body.clockwork div.display.tabular{padding:0;margin:0}body.clockwork div.display header,body.clockwork div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#cfba47;border-bottom:2px solid #b18b25}body.clockwork div.display header .buttonRight,body.clockwork div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.clockwork div.display article,body.clockwork div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.clockwork input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#b18b25;background-color:#cfba47;border:1px solid #272727}body.clockwork input.number{width:35px}body.clockwork input::-webkit-input-placeholder{color:#999}body.clockwork input:-ms-input-placeholder{color:#999}body.clockwork input::placeholder{color:#999}body.clockwork input::-ms-clear{display:none}body.clockwork svg.linegraph{overflow:hidden}body.clockwork div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#2d1400;font-weight:700;font-style:italic;background-color:#000;background-image:repeating-linear-gradient(-45deg,#000,#000 10px,#170800 0,#170800 20px)}body.clockwork div.notice .label{color:#2d1400}body.clockwork div.notice .content:only-of-type{padding:0}body.clockwork div.notice hr{background-color:#896b19}body.clockwork div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #5f380e;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.clockwork section .cell,body.clockwork section .content,body.clockwork section .label,body.clockwork section .line,body.nanotrasen section .cell,body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .cell,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.clockwork section{display:table-row;width:100%}body.clockwork section:not(:first-child){padding-top:4px}body.clockwork section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.clockwork section .label{width:1%;padding-right:32px;white-space:nowrap;color:#b18b25}body.clockwork section .content:not(:last-child){padding-right:16px}body.clockwork section .line{width:100%}body.clockwork section .cell:not(:first-child){text-align:center;padding-top:0}body.clockwork section .cell span.button{width:75px}body.clockwork section:not(:last-child){padding-right:4px}body.clockwork div.subdisplay{width:100%;margin:0}body.clockwork header.titlebar .close,body.clockwork header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#cfba47}body.clockwork header.titlebar .close:hover,body.clockwork header.titlebar .minimize:hover{color:#d1bd50}body.clockwork header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#5f380e;border-bottom:1px solid #170800;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.clockwork header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.clockwork header.titlebar .title{position:absolute;top:6px;left:46px;color:#cfba47;font-size:16px;white-space:nowrap}body.clockwork header.titlebar .minimize{position:absolute;top:6px;right:46px}body.clockwork header.titlebar .close{position:absolute;top:4px;right:12px}body.nanotrasen{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgNDI1IDIwMCIgb3BhY2l0eT0iLjMzIj4NCiAgPHBhdGggZD0ibSAxNzguMDAzOTksMC4wMzg2OSAtNzEuMjAzOTMsMCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTYuNzYxMzQsNi4wMjU1NSBsIDAsMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM0LDYuMDI1NTQgbCA1My4xMDcyLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xMDEuNTQ0MDE4IDcyLjIxNjI4LDEwNC42OTkzOTggYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDUuNzYwMTUsMi44NzAxNiBsIDczLjU1NDg3LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xODcuODcxNDcgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM1LC02LjAyNTU1IGwgLTU0LjcxNjQ0LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTMzLDYuMDI1NTUgbCAwLDEwMi42MTkzNSBMIDE4My43NjQxMywyLjkwODg2IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNS43NjAxNCwtMi44NzAxNyB6IiAvPg0KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPg0KICA8cGF0aCBkPSJtIDQyMC4xNTUzNSwxNzcuODkxMTkgYSAxMy40MTIwMzgsMTIuNTAxODQyIDAgMCAxIC04LjYzMjk1LDIyLjA2OTUxIGwgLTY2LjExODMyLDAgYSA1LjM2NDgxNTIsNS4wMDA3MzcgMCAwIDEgLTUuMzY0ODIsLTUuMDAwNzQgbCAwLC03OS44NzkzMSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff2a2a2a",endColorstr="#ff202020",GradientType=0)}body.nanotrasen .normal{color:#40628a}body.nanotrasen .good{color:#537d29}body.nanotrasen .average{color:#be6209}body.nanotrasen .bad{color:#b00e0e}body.nanotrasen .highlight{color:#8ba5c4}body.nanotrasen main{display:block;margin-top:32px;padding:2px 6px 0}body.nanotrasen hr{height:2px;background-color:#40628a;border:none}body.nanotrasen .hidden{display:none}body.nanotrasen .bar .barText,body.nanotrasen span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.nanotrasen .bold{font-weight:700}body.nanotrasen .italic{font-style:italic}body.nanotrasen [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.nanotrasen div[data-tooltip],body.nanotrasen span[data-tooltip]{position:relative}body.nanotrasen div[data-tooltip]:after,body.nanotrasen span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.nanotrasen div[data-tooltip]:hover:after,body.nanotrasen span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.nanotrasen div[data-tooltip].tooltip-top:after,body.nanotrasen span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-top:hover:after,body.nanotrasen span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-left:after,body.nanotrasen span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-left:hover:after,body.nanotrasen span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #40628a;background:#272727}body.nanotrasen .bar .barText{position:absolute;top:0;right:3px}body.nanotrasen .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#40628a}body.nanotrasen .bar .barFill.good{background-color:#537d29}body.nanotrasen .bar .barFill.average{background-color:#be6209}body.nanotrasen .bar .barFill.bad{background-color:#b00e0e}body.nanotrasen span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.nanotrasen span.button .fa{padding-right:2px}body.nanotrasen span.button.normal{transition:background-color .5s;background-color:#40628a}body.nanotrasen span.button.normal.active:focus,body.nanotrasen span.button.normal.active:hover{transition:background-color .25s;background-color:#4f78aa;outline:0}body.nanotrasen span.button.disabled{transition:background-color .5s;background-color:#999}body.nanotrasen span.button.disabled.active:focus,body.nanotrasen span.button.disabled.active:hover{transition:background-color .25s;background-color:#a8a8a8;outline:0}body.nanotrasen span.button.selected{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.selected.active:focus,body.nanotrasen span.button.selected.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.toggle{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.toggle.active:focus,body.nanotrasen span.button.toggle.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.caution{transition:background-color .5s;background-color:#9a9d00}body.nanotrasen span.button.caution.active:focus,body.nanotrasen span.button.caution.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.nanotrasen span.button.danger{transition:background-color .5s;background-color:#9d0808}body.nanotrasen span.button.danger.active:focus,body.nanotrasen span.button.danger.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.nanotrasen span.button.gridable{width:125px;margin:2px 0}body.nanotrasen span.button.gridable.center{text-align:center;width:75px}body.nanotrasen span.button+span:not(.button),body.nanotrasen span:not(.button)+span.button{margin-left:5px}body.nanotrasen div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000);background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}body.nanotrasen div.display.tabular{padding:0;margin:0}body.nanotrasen div.display header,body.nanotrasen div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}body.nanotrasen div.display header .buttonRight,body.nanotrasen div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.nanotrasen div.display article,body.nanotrasen div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.nanotrasen input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#000;background-color:#fff;border:1px solid #272727}body.nanotrasen input.number{width:35px}body.nanotrasen input::-webkit-input-placeholder{color:#999}body.nanotrasen input:-ms-input-placeholder{color:#999}body.nanotrasen input::placeholder{color:#999}body.nanotrasen input::-ms-clear{display:none}body.nanotrasen svg.linegraph{overflow:hidden}body.nanotrasen div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px)}body.nanotrasen div.notice .label{color:#000}body.nanotrasen div.notice .content:only-of-type{padding:0}body.nanotrasen div.notice hr{background-color:#272727}body.nanotrasen div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.nanotrasen section .cell,body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .cell,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.nanotrasen section{display:table-row;width:100%}body.nanotrasen section:not(:first-child){padding-top:4px}body.nanotrasen section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.nanotrasen section .label{width:1%;padding-right:32px;white-space:nowrap;color:#8ba5c4}body.nanotrasen section .content:not(:last-child){padding-right:16px}body.nanotrasen section .line{width:100%}body.nanotrasen section .cell:not(:first-child){text-align:center;padding-top:0}body.nanotrasen section .cell span.button{width:75px}body.nanotrasen section:not(:last-child){padding-right:4px}body.nanotrasen div.subdisplay{width:100%;margin:0}body.nanotrasen header.titlebar .close,body.nanotrasen header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#8ba5c4}body.nanotrasen header.titlebar .close:hover,body.nanotrasen header.titlebar .minimize:hover{color:#9cb2cd}body.nanotrasen header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.nanotrasen header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.nanotrasen header.titlebar .title{position:absolute;top:6px;left:46px;color:#8ba5c4;font-size:16px;white-space:nowrap}body.nanotrasen header.titlebar .minimize{position:absolute;top:6px;right:46px}body.nanotrasen header.titlebar .close{position:absolute;top:4px;right:12px}body.syndicate{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgMjAwIDI4OS43NDIiIG9wYWNpdHk9Ii4zMyI+DQogIDxwYXRoIGQ9Im0gOTMuNTM3Njc3LDAgYyAtMTguMTEzMTI1LDAgLTM0LjIyMDEzMywzLjExMTY0IC00OC4zMjM0ODQsOS4zMzQzNyAtMTMuOTY1MDkyLDYuMjIxNjcgLTI0LjYxMjQ0MiwxNS4wNzExNCAtMzEuOTQwNjUxLDI2LjU0NzEgLTcuMTg5OTM5OCwxMS4zMzc4OSAtMTAuMzAxMjI2NiwyNC43NDkxMSAtMTAuMzAxMjI2Niw0MC4yMzQ3OCAwLDEwLjY0NjYyIDIuNzI1MDAyNiwyMC40NjQ2NSA4LjE3NTExMTYsMjkuNDUyNTggNS42MTUyNzcsOC45ODY4NiAxNC4wMzgyNzcsMTcuMzUyMDQgMjUuMjY4ODIxLDI1LjA5NDM2IDExLjIzMDU0NCw3LjYwNTMxIDI2LjUwNzQyMSwxNS40MTgzNSA0NS44MzA1MTQsMjMuNDM3ODIgMTkuOTgzNzQ4LDguMjk1NTcgMzQuODQ4ODQ4LDE1LjU1NDcxIDQ0LjU5Mjk5OCwyMS43NzYzOCA5Ljc0NDE0LDYuMjIyNzMgMTYuNzYxNywxMi44NTg1IDIxLjA1NTcyLDE5LjkwOTUxIDQuMjk0MDQsNy4wNTIwOCA2LjQ0MTkzLDE1Ljc2NDA4IDYuNDQxOTMsMjYuMTM0NTkgMCwxNi4xNzcwMiAtNS4yMDE5NiwyOC40ODIyMiAtMTUuNjA2NzMsMzYuOTE2ODIgLTEwLjIzOTYsOC40MzQ3IC0yNS4wMjIwMywxMi42NTIzIC00NC4zNDUxNjksMTIuNjUyMyAtMTQuMDM4MTcxLDAgLTI1LjUxNTI0NywtMS42NTk0IC0zNC40MzM2MTgsLTQuOTc3NyAtOC45MTgzNywtMy40NTY2IC0xNi4xODU1NzIsLTguNzExMyAtMjEuODAwODM5LC0xNS43NjMzIC01LjYxNTI3NywtNy4wNTIxIC0xMC4wNzQ3OTUsLTE2LjY2MDg4IC0xMy4zNzc4OTksLTI4LjgyODEyIGwgLTI0Ljc3MzE2MjYyOTM5NDUsMCAwLDU2LjgyNjMyIEMgMzMuODU2NzY5LDI4Ni4wNzYwMSA2My43NDkwNCwyODkuNzQyMDEgODkuNjc4MzgzLDI4OS43NDIwMSBjIDE2LjAyMDAyNywwIDMwLjcxOTc4NywtMS4zODI3IDQ0LjA5NzMzNywtNC4xNDc5IDEzLjU0MjcyLC0yLjkwNDMgMjUuMTA0MSwtNy40Njc2IDM0LjY4MzA5LC0xMy42ODkzIDkuNzQ0MTMsLTYuMzU5NyAxNy4zNDA0MiwtMTQuNTE5NSAyMi43OTA1MiwtMjQuNDc0OCA1LjQ1MDEsLTEwLjA5MzMyIDguMTc1MTEsLTIyLjM5OTU5IDguMTc1MTEsLTM2LjkxNjgyIDAsLTEyLjk5NzY0IC0zLjMwMjEsLTI0LjMzNTM5IC05LjkwODI5LC0zNC4wMTQ2IC02LjQ0MTA1LC05LjgxNzI1IC0xNS41MjU0NSwtMTguNTI3MDcgLTI3LjI1MTQ2LC0yNi4xMzEzMyAtMTEuNTYwODUsLTcuNjA0MjcgLTI3LjkxMDgzLC0xNS44MzE0MiAtNDkuMDUwNjYsLTI0LjY4MDIyIC0xNy41MDY0NCwtNy4xOTAxMiAtMzAuNzE5NjY4LC0xMy42ODk0OCAtMzkuNjM4MDM4LC0xOS40OTcwMSAtOC45MTgzNzEsLTUuODA3NTIgLTE4LjYwNzQ3NCwtMTIuNDM0MDkgLTI0LjA5NjUyNCwtMTguODc0MTcgLTUuNDI2MDQzLC02LjM2NjE2IC05LjY1ODgyNiwtMTUuMDcwMDMgLTkuNjU4ODI2LC0yNC44ODcyOSAwLC05LjI2NDAxIDIuMDc1NDE0LC0xNy4yMTM0NSA2LjIyMzQ1NCwtMjMuODUwMzMgMTEuMDk4Mjk4LC0xNC4zOTc0OCA0MS4yODY2MzgsLTEuNzk1MDcgNDUuMDc1NjA5LDI0LjM0NzYyIDQuODM5MzkyLDYuNzc0OTEgOC44NDkzNSwxNi4yNDcyOSAxMi4wMjk1MTUsMjguNDE1NiBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNC40NzgyNSwtNS45MjQ0OCAtOS45NTQ4OCwtMTAuNjMyMjIgLTE1LjkwODM3LC0xNC4zNzQxMSAxLjY0MDU1LDAuNDc5MDUgMy4xOTAzOSwxLjAyMzc2IDQuNjM4NjUsMS42NDAyNCA2LjQ5ODYxLDIuNjI2MDcgMTIuMTY3OTMsNy4zMjc0NyAxNy4wMDczLDE0LjEwMzQ1IDQuODM5MzksNi43NzQ5MSA4Ljg0OTM1LDE2LjI0NTY3IDEyLjAyOTUyLDI4LjQxMzk3IDAsMCA4LjQ4MTI4LC0wLjEyODk0IDguNDg5NzgsLTAuMDAyIDAuNDE3NzYsNi40MTQ5NCAtMS43NTMzOSw5LjQ1Mjg2IC00LjEyMzQyLDEyLjU2MTA0IC0yLjQxNzQsMy4xNjk3OCAtNS4xNDQ4Niw2Ljc4OTczIC00LjAwMjc4LDEzLjAwMjkgMS41MDc4Niw4LjIwMzE4IDEwLjE4MzU0LDEwLjU5NjQyIDE0LjYyMTk0LDkuMzExNTQgLTMuMzE4NDIsLTAuNDk5MTEgLTUuMzE4NTUsLTEuNzQ5NDggLTUuMzE4NTUsLTEuNzQ5NDggMCwwIDEuODc2NDYsMC45OTg2OCA1LjY1MTE3LC0xLjM1OTgxIC0zLjI3Njk1LDAuOTU1NzEgLTEwLjcwNTI5LC0wLjc5NzM4IC0xMS44MDEyNSwtNi43NjMxMyAtMC45NTc1MiwtNS4yMDg2MSAwLjk0NjU0LC03LjI5NTE0IDMuNDAxMTMsLTEwLjUxNDgyIDIuNDU0NjIsLTMuMjE5NjggNS4yODQyNiwtNi45NTgzMSA0LjY4NDMsLTE0LjQ4ODI0IGwgMC4wMDMsMC4wMDIgOC45MjY3NiwwIDAsLTU1Ljk5OTY3IGMgLTE1LjA3MTI1LC0zLjg3MTY4IC0yNy42NTMxNCwtNi4zNjA0MiAtMzcuNzQ2NzEsLTcuNDY1ODYgLTkuOTU1MzEsLTEuMTA3NTUgLTIwLjE4ODIzLC0xLjY1OTgxIC0zMC42OTY2MTMsLTEuNjU5ODEgeiBtIDcwLjMyMTYwMywxNy4zMDg5MyAwLjIzODA1LDQwLjMwNDkgYyAxLjMxODA4LDEuMjI2NjYgMi40Mzk2NSwyLjI3ODE1IDMuMzQwODEsMy4xMDYwMiA0LjgzOTM5LDYuNzc0OTEgOC44NDkzNCwxNi4yNDU2NiAxMi4wMjk1MSwyOC40MTM5NyBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNi42NzczMSwtNC41OTM4MSAtMTkuODM2NDMsLTEwLjQ3MzA5IC0zNi4xNDA3MSwtMTUuODI1MjIgeiBtIC0yOC4xMjA0OSw1LjYwNTUxIDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzcsLTYuNDY2OTcgLTEzLjg0Njc4LC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk3MDUsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IG0gMTUuMjIxOTUsMjQuMDA4NDggOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzOCwtNi40NjY5NyAtMTMuODQ2NzksLTkuNzE3MjYgLTguNTY0NzksLTE3LjcxNjU1IHogbSAyMi43OTcwNCwwIGMgMi43NzE1LDcuOTk5MjkgMS43ODc0MSwxMS4yNDk1OCAtNC40OTM1NCwxNy43MTY1NSBsIDQuNDkzNTQsLTE3LjcxNjU1IHogbSAtOTkuMTEzODQsMi4yMDc2NCA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM4MiwtNi40NjY5NyAtMTMuODQ2NzgyLC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk1NDIsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#750000 0,#340404);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff750000",endColorstr="#ff340404",GradientType=0)}body.syndicate .normal{color:#40628a}body.syndicate .good{color:#73e573}body.syndicate .average{color:#be6209}body.syndicate .bad{color:#b00e0e}body.syndicate .highlight{color:#000}body.syndicate main{display:block;margin-top:32px;padding:2px 6px 0}body.syndicate hr{height:2px;background-color:#272727;border:none}body.syndicate .hidden{display:none}body.syndicate .bar .barText,body.syndicate span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.syndicate .bold{font-weight:700}body.syndicate .italic{font-style:italic}body.syndicate [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.syndicate div[data-tooltip],body.syndicate span[data-tooltip]{position:relative}body.syndicate div[data-tooltip]:after,body.syndicate span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.syndicate div[data-tooltip]:hover:after,body.syndicate span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.syndicate div[data-tooltip].tooltip-top:after,body.syndicate span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-top:hover:after,body.syndicate span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-left:after,body.syndicate span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-left:hover:after,body.syndicate span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:hover:after,body.syndicate span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #000;background:#272727}body.syndicate .bar .barText{position:absolute;top:0;right:3px}body.syndicate .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#000}body.syndicate .bar .barFill.good{background-color:#73e573}body.syndicate .bar .barFill.average{background-color:#be6209}body.syndicate .bar .barFill.bad{background-color:#b00e0e}body.syndicate span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.syndicate span.button .fa{padding-right:2px}body.syndicate span.button.normal{transition:background-color .5s;background-color:#397439}body.syndicate span.button.normal.active:focus,body.syndicate span.button.normal.active:hover{transition:background-color .25s;background-color:#4a964a;outline:0}body.syndicate span.button.disabled{transition:background-color .5s;background-color:#363636}body.syndicate span.button.disabled.active:focus,body.syndicate span.button.disabled.active:hover{transition:background-color .25s;background-color:#545454;outline:0}body.syndicate span.button.selected{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.selected.active:focus,body.syndicate span.button.selected.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.toggle{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.toggle.active:focus,body.syndicate span.button.toggle.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.caution{transition:background-color .5s;background-color:#be6209}body.syndicate span.button.caution.active:focus,body.syndicate span.button.caution.active:hover{transition:background-color .25s;background-color:#eb790b;outline:0}body.syndicate span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.syndicate span.button.danger.active:focus,body.syndicate span.button.danger.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.syndicate span.button.gridable{width:125px;margin:2px 0}body.syndicate span.button.gridable.center{text-align:center;width:75px}body.syndicate span.button+span:not(.button),body.syndicate span:not(.button)+span.button{margin-left:5px}body.syndicate div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background-color:rgba(0,0,0,.5);box-shadow:inset 0 0 5px rgba(0,0,0,.75)}body.syndicate div.display.tabular{padding:0;margin:0}body.syndicate div.display header,body.syndicate div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #272727}body.syndicate div.display header .buttonRight,body.syndicate div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.syndicate div.display article,body.syndicate div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.syndicate input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#fff;background-color:#9d0808;border:1px solid #272727}body.syndicate input.number{width:35px}body.syndicate input::-webkit-input-placeholder{color:#999}body.syndicate input:-ms-input-placeholder{color:#999}body.syndicate input::placeholder{color:#999}body.syndicate input::-ms-clear{display:none}body.syndicate svg.linegraph{overflow:hidden}body.syndicate div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#750000;background-image:repeating-linear-gradient(-45deg,#750000,#750000 10px,#910101 0,#910101 20px)}body.syndicate div.notice .label{color:#000}body.syndicate div.notice .content:only-of-type{padding:0}body.syndicate div.notice hr{background-color:#272727}body.syndicate div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.syndicate section .cell,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.syndicate section{display:table-row;width:100%}body.syndicate section:not(:first-child){padding-top:4px}body.syndicate section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.syndicate section .label{width:1%;padding-right:32px;white-space:nowrap;color:#fff}body.syndicate section .content:not(:last-child){padding-right:16px}body.syndicate section .line{width:100%}body.syndicate section .cell:not(:first-child){text-align:center;padding-top:0}body.syndicate section .cell span.button{width:75px}body.syndicate section:not(:last-child){padding-right:4px}body.syndicate div.subdisplay{width:100%;margin:0}body.syndicate header.titlebar .close,body.syndicate header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#e74242}body.syndicate header.titlebar .close:hover,body.syndicate header.titlebar .minimize:hover{color:#eb5e5e}body.syndicate header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.syndicate header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.syndicate header.titlebar .title{position:absolute;top:6px;left:46px;color:#e74242;font-size:16px;white-space:nowrap}body.syndicate header.titlebar .minimize{position:absolute;top:6px;right:46px}body.syndicate header.titlebar .close{position:absolute;top:4px;right:12px}.no-icons header.titlebar .statusicon{font-size:20px}.no-icons header.titlebar .statusicon:after{content:"O"}.no-icons header.titlebar .minimize{top:-2px;font-size:20px}.no-icons header.titlebar .minimize:after{content:"—"}.no-icons header.titlebar .close{font-size:20px}.no-icons header.titlebar .close:after{content:"X"} \ No newline at end of file +@charset "utf-8";body,html{box-sizing:border-box;height:100%;margin:0}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff;background-color:#2a2a2a;background-image:linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff2a2a2a",endColorstr="#ff202020",GradientType=0)}*,:after,:before{box-sizing:inherit}h1,h2,h3,h4{display:inline-block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}body.clockwork{background:linear-gradient(180deg,#b18b25 0,#5f380e);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffb18b25",endColorstr="#ff5f380e",GradientType=0)}body.clockwork .normal{color:#b18b25}body.clockwork .good{color:#cfba47}body.clockwork .average{color:#896b19}body.clockwork .bad{color:#5f380e}body.clockwork .highlight{color:#b18b25}body.clockwork main{display:block;margin-top:32px;padding:2px 6px 0}body.clockwork hr{height:2px;background-color:#b18b25;border:none}body.clockwork .hidden{display:none}body.clockwork .bar .barText,body.clockwork span.button{color:#b18b25;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.clockwork .bold{font-weight:700}body.clockwork .italic{font-style:italic}body.clockwork [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.clockwork div[data-tooltip],body.clockwork span[data-tooltip]{position:relative}body.clockwork div[data-tooltip]:after,body.clockwork span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #170800;background-color:#2d1400}body.clockwork div[data-tooltip]:hover:after,body.clockwork span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.clockwork div[data-tooltip].tooltip-top:after,body.clockwork span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-top:hover:after,body.clockwork span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:after,body.clockwork span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:hover:after,body.clockwork span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-left:after,body.clockwork span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-left:hover:after,body.clockwork span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:after,body.clockwork span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:hover:after,body.clockwork span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #170800;background:#2d1400}body.clockwork .bar .barText{position:absolute;top:0;right:3px}body.clockwork .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#b18b25}body.clockwork .bar .barFill.good{background-color:#cfba47}body.clockwork .bar .barFill.average{background-color:#896b19}body.clockwork .bar .barFill.bad{background-color:#5f380e}body.clockwork span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #170800}body.clockwork span.button .fa{padding-right:2px}body.clockwork span.button.normal{transition:background-color .5s;background-color:#5f380e}body.clockwork span.button.normal.active:focus,body.clockwork span.button.normal.active:hover{transition:background-color .25s;background-color:#704211;outline:0}body.clockwork span.button.disabled{transition:background-color .5s;background-color:#2d1400}body.clockwork span.button.disabled.active:focus,body.clockwork span.button.disabled.active:hover{transition:background-color .25s;background-color:#441e00;outline:0}body.clockwork span.button.selected{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.selected.active:focus,body.clockwork span.button.selected.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.toggle{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.toggle.active:focus,body.clockwork span.button.toggle.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.caution{transition:background-color .5s;background-color:#be6209}body.clockwork span.button.caution.active:focus,body.clockwork span.button.caution.active:hover{transition:background-color .25s;background-color:#cd6a0a;outline:0}body.clockwork span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.clockwork span.button.danger.active:focus,body.clockwork span.button.danger.active:hover{transition:background-color .25s;background-color:#abaf00;outline:0}body.clockwork span.button.gridable{width:125px;margin:2px 0}body.clockwork span.button.gridable.center{text-align:center;width:75px}body.clockwork span.button+span:not(.button),body.clockwork span:not(.button)+span.button{margin-left:5px}body.clockwork div.display{width:100%;padding:4px;margin:6px 0;background-color:#2d1400;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400);background-color:rgba(45,20,0,.9);box-shadow:inset 0 0 5px rgba(0,0,0,.3)}body.clockwork div.display.tabular{padding:0;margin:0}body.clockwork div.display header,body.clockwork div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#cfba47;border-bottom:2px solid #b18b25}body.clockwork div.display header .buttonRight,body.clockwork div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.clockwork div.display article,body.clockwork div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.clockwork input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#b18b25;background-color:#cfba47;border:1px solid #272727}body.clockwork input.number{width:35px}body.clockwork input:-ms-input-placeholder{color:#999}body.clockwork input::placeholder{color:#999}body.clockwork input::-ms-clear{display:none}body.clockwork svg.linegraph{overflow:hidden}body.clockwork div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#2d1400;font-weight:700;font-style:italic;background-color:#000;background-image:repeating-linear-gradient(-45deg,#000,#000 10px,#170800 0,#170800 20px)}body.clockwork div.notice .label{color:#2d1400}body.clockwork div.notice .content:only-of-type{padding:0}body.clockwork div.notice hr{background-color:#896b19}body.clockwork div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #5f380e;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.clockwork section .cell,body.clockwork section .content,body.clockwork section .label,body.clockwork section .line,body.nanotrasen section .cell,body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .cell,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.clockwork section{display:table-row;width:100%}body.clockwork section:not(:first-child){padding-top:4px}body.clockwork section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.clockwork section .label{width:1%;padding-right:32px;white-space:nowrap;color:#b18b25}body.clockwork section .content:not(:last-child){padding-right:16px}body.clockwork section .line{width:100%}body.clockwork section .cell:not(:first-child){text-align:center;padding-top:0}body.clockwork section .cell span.button{width:75px}body.clockwork section:not(:last-child){padding-right:4px}body.clockwork div.subdisplay{width:100%;margin:0}body.clockwork header.titlebar .close,body.clockwork header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#cfba47}body.clockwork header.titlebar .close:hover,body.clockwork header.titlebar .minimize:hover{color:#d1bd50}body.clockwork header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#5f380e;border-bottom:1px solid #170800;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.clockwork header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.clockwork header.titlebar .title{position:absolute;top:6px;left:46px;color:#cfba47;font-size:16px;white-space:nowrap}body.clockwork header.titlebar .minimize{position:absolute;top:6px;right:46px}body.clockwork header.titlebar .close{position:absolute;top:4px;right:12px}body.nanotrasen{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgNDI1IDIwMCIgb3BhY2l0eT0iLjMzIj4NCiAgPHBhdGggZD0ibSAxNzguMDAzOTksMC4wMzg2OSAtNzEuMjAzOTMsMCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTYuNzYxMzQsNi4wMjU1NSBsIDAsMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM0LDYuMDI1NTQgbCA1My4xMDcyLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xMDEuNTQ0MDE4IDcyLjIxNjI4LDEwNC42OTkzOTggYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDUuNzYwMTUsMi44NzAxNiBsIDczLjU1NDg3LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xODcuODcxNDcgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM1LC02LjAyNTU1IGwgLTU0LjcxNjQ0LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTMzLDYuMDI1NTUgbCAwLDEwMi42MTkzNSBMIDE4My43NjQxMywyLjkwODg2IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNS43NjAxNCwtMi44NzAxNyB6IiAvPg0KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPg0KICA8cGF0aCBkPSJtIDQyMC4xNTUzNSwxNzcuODkxMTkgYSAxMy40MTIwMzgsMTIuNTAxODQyIDAgMCAxIC04LjYzMjk1LDIyLjA2OTUxIGwgLTY2LjExODMyLDAgYSA1LjM2NDgxNTIsNS4wMDA3MzcgMCAwIDEgLTUuMzY0ODIsLTUuMDAwNzQgbCAwLC03OS44NzkzMSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff2a2a2a",endColorstr="#ff202020",GradientType=0)}body.nanotrasen .normal{color:#40628a}body.nanotrasen .good{color:#537d29}body.nanotrasen .average{color:#be6209}body.nanotrasen .bad{color:#b00e0e}body.nanotrasen .highlight{color:#8ba5c4}body.nanotrasen main{display:block;margin-top:32px;padding:2px 6px 0}body.nanotrasen hr{height:2px;background-color:#40628a;border:none}body.nanotrasen .hidden{display:none}body.nanotrasen .bar .barText,body.nanotrasen span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.nanotrasen .bold{font-weight:700}body.nanotrasen .italic{font-style:italic}body.nanotrasen [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.nanotrasen div[data-tooltip],body.nanotrasen span[data-tooltip]{position:relative}body.nanotrasen div[data-tooltip]:after,body.nanotrasen span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.nanotrasen div[data-tooltip]:hover:after,body.nanotrasen span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.nanotrasen div[data-tooltip].tooltip-top:after,body.nanotrasen span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-top:hover:after,body.nanotrasen span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-left:after,body.nanotrasen span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-left:hover:after,body.nanotrasen span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #40628a;background:#272727}body.nanotrasen .bar .barText{position:absolute;top:0;right:3px}body.nanotrasen .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#40628a}body.nanotrasen .bar .barFill.good{background-color:#537d29}body.nanotrasen .bar .barFill.average{background-color:#be6209}body.nanotrasen .bar .barFill.bad{background-color:#b00e0e}body.nanotrasen span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.nanotrasen span.button .fa{padding-right:2px}body.nanotrasen span.button.normal{transition:background-color .5s;background-color:#40628a}body.nanotrasen span.button.normal.active:focus,body.nanotrasen span.button.normal.active:hover{transition:background-color .25s;background-color:#4f78aa;outline:0}body.nanotrasen span.button.disabled{transition:background-color .5s;background-color:#999}body.nanotrasen span.button.disabled.active:focus,body.nanotrasen span.button.disabled.active:hover{transition:background-color .25s;background-color:#a8a8a8;outline:0}body.nanotrasen span.button.selected{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.selected.active:focus,body.nanotrasen span.button.selected.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.toggle{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.toggle.active:focus,body.nanotrasen span.button.toggle.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.caution{transition:background-color .5s;background-color:#9a9d00}body.nanotrasen span.button.caution.active:focus,body.nanotrasen span.button.caution.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.nanotrasen span.button.danger{transition:background-color .5s;background-color:#9d0808}body.nanotrasen span.button.danger.active:focus,body.nanotrasen span.button.danger.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.nanotrasen span.button.gridable{width:125px;margin:2px 0}body.nanotrasen span.button.gridable.center{text-align:center;width:75px}body.nanotrasen span.button+span:not(.button),body.nanotrasen span:not(.button)+span.button{margin-left:5px}body.nanotrasen div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000);background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}body.nanotrasen div.display.tabular{padding:0;margin:0}body.nanotrasen div.display header,body.nanotrasen div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}body.nanotrasen div.display header .buttonRight,body.nanotrasen div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.nanotrasen div.display article,body.nanotrasen div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.nanotrasen input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#000;background-color:#fff;border:1px solid #272727}body.nanotrasen input.number{width:35px}body.nanotrasen input:-ms-input-placeholder{color:#999}body.nanotrasen input::placeholder{color:#999}body.nanotrasen input::-ms-clear{display:none}body.nanotrasen svg.linegraph{overflow:hidden}body.nanotrasen div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px)}body.nanotrasen div.notice .label{color:#000}body.nanotrasen div.notice .content:only-of-type{padding:0}body.nanotrasen div.notice hr{background-color:#272727}body.nanotrasen div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.nanotrasen section .cell,body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .cell,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.nanotrasen section{display:table-row;width:100%}body.nanotrasen section:not(:first-child){padding-top:4px}body.nanotrasen section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.nanotrasen section .label{width:1%;padding-right:32px;white-space:nowrap;color:#8ba5c4}body.nanotrasen section .content:not(:last-child){padding-right:16px}body.nanotrasen section .line{width:100%}body.nanotrasen section .cell:not(:first-child){text-align:center;padding-top:0}body.nanotrasen section .cell span.button{width:75px}body.nanotrasen section:not(:last-child){padding-right:4px}body.nanotrasen div.subdisplay{width:100%;margin:0}body.nanotrasen header.titlebar .close,body.nanotrasen header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#8ba5c4}body.nanotrasen header.titlebar .close:hover,body.nanotrasen header.titlebar .minimize:hover{color:#9cb2cd}body.nanotrasen header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.nanotrasen header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.nanotrasen header.titlebar .title{position:absolute;top:6px;left:46px;color:#8ba5c4;font-size:16px;white-space:nowrap}body.nanotrasen header.titlebar .minimize{position:absolute;top:6px;right:46px}body.nanotrasen header.titlebar .close{position:absolute;top:4px;right:12px}body.syndicate{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgMjAwIDI4OS43NDIiIG9wYWNpdHk9Ii4zMyI+DQogIDxwYXRoIGQ9Im0gOTMuNTM3Njc3LDAgYyAtMTguMTEzMTI1LDAgLTM0LjIyMDEzMywzLjExMTY0IC00OC4zMjM0ODQsOS4zMzQzNyAtMTMuOTY1MDkyLDYuMjIxNjcgLTI0LjYxMjQ0MiwxNS4wNzExNCAtMzEuOTQwNjUxLDI2LjU0NzEgLTcuMTg5OTM5OCwxMS4zMzc4OSAtMTAuMzAxMjI2NiwyNC43NDkxMSAtMTAuMzAxMjI2Niw0MC4yMzQ3OCAwLDEwLjY0NjYyIDIuNzI1MDAyNiwyMC40NjQ2NSA4LjE3NTExMTYsMjkuNDUyNTggNS42MTUyNzcsOC45ODY4NiAxNC4wMzgyNzcsMTcuMzUyMDQgMjUuMjY4ODIxLDI1LjA5NDM2IDExLjIzMDU0NCw3LjYwNTMxIDI2LjUwNzQyMSwxNS40MTgzNSA0NS44MzA1MTQsMjMuNDM3ODIgMTkuOTgzNzQ4LDguMjk1NTcgMzQuODQ4ODQ4LDE1LjU1NDcxIDQ0LjU5Mjk5OCwyMS43NzYzOCA5Ljc0NDE0LDYuMjIyNzMgMTYuNzYxNywxMi44NTg1IDIxLjA1NTcyLDE5LjkwOTUxIDQuMjk0MDQsNy4wNTIwOCA2LjQ0MTkzLDE1Ljc2NDA4IDYuNDQxOTMsMjYuMTM0NTkgMCwxNi4xNzcwMiAtNS4yMDE5NiwyOC40ODIyMiAtMTUuNjA2NzMsMzYuOTE2ODIgLTEwLjIzOTYsOC40MzQ3IC0yNS4wMjIwMywxMi42NTIzIC00NC4zNDUxNjksMTIuNjUyMyAtMTQuMDM4MTcxLDAgLTI1LjUxNTI0NywtMS42NTk0IC0zNC40MzM2MTgsLTQuOTc3NyAtOC45MTgzNywtMy40NTY2IC0xNi4xODU1NzIsLTguNzExMyAtMjEuODAwODM5LC0xNS43NjMzIC01LjYxNTI3NywtNy4wNTIxIC0xMC4wNzQ3OTUsLTE2LjY2MDg4IC0xMy4zNzc4OTksLTI4LjgyODEyIGwgLTI0Ljc3MzE2MjYyOTM5NDUsMCAwLDU2LjgyNjMyIEMgMzMuODU2NzY5LDI4Ni4wNzYwMSA2My43NDkwNCwyODkuNzQyMDEgODkuNjc4MzgzLDI4OS43NDIwMSBjIDE2LjAyMDAyNywwIDMwLjcxOTc4NywtMS4zODI3IDQ0LjA5NzMzNywtNC4xNDc5IDEzLjU0MjcyLC0yLjkwNDMgMjUuMTA0MSwtNy40Njc2IDM0LjY4MzA5LC0xMy42ODkzIDkuNzQ0MTMsLTYuMzU5NyAxNy4zNDA0MiwtMTQuNTE5NSAyMi43OTA1MiwtMjQuNDc0OCA1LjQ1MDEsLTEwLjA5MzMyIDguMTc1MTEsLTIyLjM5OTU5IDguMTc1MTEsLTM2LjkxNjgyIDAsLTEyLjk5NzY0IC0zLjMwMjEsLTI0LjMzNTM5IC05LjkwODI5LC0zNC4wMTQ2IC02LjQ0MTA1LC05LjgxNzI1IC0xNS41MjU0NSwtMTguNTI3MDcgLTI3LjI1MTQ2LC0yNi4xMzEzMyAtMTEuNTYwODUsLTcuNjA0MjcgLTI3LjkxMDgzLC0xNS44MzE0MiAtNDkuMDUwNjYsLTI0LjY4MDIyIC0xNy41MDY0NCwtNy4xOTAxMiAtMzAuNzE5NjY4LC0xMy42ODk0OCAtMzkuNjM4MDM4LC0xOS40OTcwMSAtOC45MTgzNzEsLTUuODA3NTIgLTE4LjYwNzQ3NCwtMTIuNDM0MDkgLTI0LjA5NjUyNCwtMTguODc0MTcgLTUuNDI2MDQzLC02LjM2NjE2IC05LjY1ODgyNiwtMTUuMDcwMDMgLTkuNjU4ODI2LC0yNC44ODcyOSAwLC05LjI2NDAxIDIuMDc1NDE0LC0xNy4yMTM0NSA2LjIyMzQ1NCwtMjMuODUwMzMgMTEuMDk4Mjk4LC0xNC4zOTc0OCA0MS4yODY2MzgsLTEuNzk1MDcgNDUuMDc1NjA5LDI0LjM0NzYyIDQuODM5MzkyLDYuNzc0OTEgOC44NDkzNSwxNi4yNDcyOSAxMi4wMjk1MTUsMjguNDE1NiBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNC40NzgyNSwtNS45MjQ0OCAtOS45NTQ4OCwtMTAuNjMyMjIgLTE1LjkwODM3LC0xNC4zNzQxMSAxLjY0MDU1LDAuNDc5MDUgMy4xOTAzOSwxLjAyMzc2IDQuNjM4NjUsMS42NDAyNCA2LjQ5ODYxLDIuNjI2MDcgMTIuMTY3OTMsNy4zMjc0NyAxNy4wMDczLDE0LjEwMzQ1IDQuODM5MzksNi43NzQ5MSA4Ljg0OTM1LDE2LjI0NTY3IDEyLjAyOTUyLDI4LjQxMzk3IDAsMCA4LjQ4MTI4LC0wLjEyODk0IDguNDg5NzgsLTAuMDAyIDAuNDE3NzYsNi40MTQ5NCAtMS43NTMzOSw5LjQ1Mjg2IC00LjEyMzQyLDEyLjU2MTA0IC0yLjQxNzQsMy4xNjk3OCAtNS4xNDQ4Niw2Ljc4OTczIC00LjAwMjc4LDEzLjAwMjkgMS41MDc4Niw4LjIwMzE4IDEwLjE4MzU0LDEwLjU5NjQyIDE0LjYyMTk0LDkuMzExNTQgLTMuMzE4NDIsLTAuNDk5MTEgLTUuMzE4NTUsLTEuNzQ5NDggLTUuMzE4NTUsLTEuNzQ5NDggMCwwIDEuODc2NDYsMC45OTg2OCA1LjY1MTE3LC0xLjM1OTgxIC0zLjI3Njk1LDAuOTU1NzEgLTEwLjcwNTI5LC0wLjc5NzM4IC0xMS44MDEyNSwtNi43NjMxMyAtMC45NTc1MiwtNS4yMDg2MSAwLjk0NjU0LC03LjI5NTE0IDMuNDAxMTMsLTEwLjUxNDgyIDIuNDU0NjIsLTMuMjE5NjggNS4yODQyNiwtNi45NTgzMSA0LjY4NDMsLTE0LjQ4ODI0IGwgMC4wMDMsMC4wMDIgOC45MjY3NiwwIDAsLTU1Ljk5OTY3IGMgLTE1LjA3MTI1LC0zLjg3MTY4IC0yNy42NTMxNCwtNi4zNjA0MiAtMzcuNzQ2NzEsLTcuNDY1ODYgLTkuOTU1MzEsLTEuMTA3NTUgLTIwLjE4ODIzLC0xLjY1OTgxIC0zMC42OTY2MTMsLTEuNjU5ODEgeiBtIDcwLjMyMTYwMywxNy4zMDg5MyAwLjIzODA1LDQwLjMwNDkgYyAxLjMxODA4LDEuMjI2NjYgMi40Mzk2NSwyLjI3ODE1IDMuMzQwODEsMy4xMDYwMiA0LjgzOTM5LDYuNzc0OTEgOC44NDkzNCwxNi4yNDU2NiAxMi4wMjk1MSwyOC40MTM5NyBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNi42NzczMSwtNC41OTM4MSAtMTkuODM2NDMsLTEwLjQ3MzA5IC0zNi4xNDA3MSwtMTUuODI1MjIgeiBtIC0yOC4xMjA0OSw1LjYwNTUxIDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzcsLTYuNDY2OTcgLTEzLjg0Njc4LC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk3MDUsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IG0gMTUuMjIxOTUsMjQuMDA4NDggOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzOCwtNi40NjY5NyAtMTMuODQ2NzksLTkuNzE3MjYgLTguNTY0NzksLTE3LjcxNjU1IHogbSAyMi43OTcwNCwwIGMgMi43NzE1LDcuOTk5MjkgMS43ODc0MSwxMS4yNDk1OCAtNC40OTM1NCwxNy43MTY1NSBsIDQuNDkzNTQsLTE3LjcxNjU1IHogbSAtOTkuMTEzODQsMi4yMDc2NCA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM4MiwtNi40NjY5NyAtMTMuODQ2NzgyLC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk1NDIsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#750000 0,#340404);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff750000",endColorstr="#ff340404",GradientType=0)}body.syndicate .normal{color:#40628a}body.syndicate .good{color:#73e573}body.syndicate .average{color:#be6209}body.syndicate .bad{color:#b00e0e}body.syndicate .highlight{color:#000}body.syndicate main{display:block;margin-top:32px;padding:2px 6px 0}body.syndicate hr{height:2px;background-color:#272727;border:none}body.syndicate .hidden{display:none}body.syndicate .bar .barText,body.syndicate span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.syndicate .bold{font-weight:700}body.syndicate .italic{font-style:italic}body.syndicate [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.syndicate div[data-tooltip],body.syndicate span[data-tooltip]{position:relative}body.syndicate div[data-tooltip]:after,body.syndicate span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.syndicate div[data-tooltip]:hover:after,body.syndicate span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.syndicate div[data-tooltip].tooltip-top:after,body.syndicate span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-top:hover:after,body.syndicate span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-left:after,body.syndicate span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-left:hover:after,body.syndicate span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:hover:after,body.syndicate span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #000;background:#272727}body.syndicate .bar .barText{position:absolute;top:0;right:3px}body.syndicate .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#000}body.syndicate .bar .barFill.good{background-color:#73e573}body.syndicate .bar .barFill.average{background-color:#be6209}body.syndicate .bar .barFill.bad{background-color:#b00e0e}body.syndicate span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.syndicate span.button .fa{padding-right:2px}body.syndicate span.button.normal{transition:background-color .5s;background-color:#397439}body.syndicate span.button.normal.active:focus,body.syndicate span.button.normal.active:hover{transition:background-color .25s;background-color:#4a964a;outline:0}body.syndicate span.button.disabled{transition:background-color .5s;background-color:#363636}body.syndicate span.button.disabled.active:focus,body.syndicate span.button.disabled.active:hover{transition:background-color .25s;background-color:#545454;outline:0}body.syndicate span.button.selected{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.selected.active:focus,body.syndicate span.button.selected.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.toggle{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.toggle.active:focus,body.syndicate span.button.toggle.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.caution{transition:background-color .5s;background-color:#be6209}body.syndicate span.button.caution.active:focus,body.syndicate span.button.caution.active:hover{transition:background-color .25s;background-color:#eb790b;outline:0}body.syndicate span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.syndicate span.button.danger.active:focus,body.syndicate span.button.danger.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.syndicate span.button.gridable{width:125px;margin:2px 0}body.syndicate span.button.gridable.center{text-align:center;width:75px}body.syndicate span.button+span:not(.button),body.syndicate span:not(.button)+span.button{margin-left:5px}body.syndicate div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background-color:rgba(0,0,0,.5);box-shadow:inset 0 0 5px rgba(0,0,0,.75)}body.syndicate div.display.tabular{padding:0;margin:0}body.syndicate div.display header,body.syndicate div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #272727}body.syndicate div.display header .buttonRight,body.syndicate div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.syndicate div.display article,body.syndicate div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.syndicate input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#fff;background-color:#9d0808;border:1px solid #272727}body.syndicate input.number{width:35px}body.syndicate input:-ms-input-placeholder{color:#999}body.syndicate input::placeholder{color:#999}body.syndicate input::-ms-clear{display:none}body.syndicate svg.linegraph{overflow:hidden}body.syndicate div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#750000;background-image:repeating-linear-gradient(-45deg,#750000,#750000 10px,#910101 0,#910101 20px)}body.syndicate div.notice .label{color:#000}body.syndicate div.notice .content:only-of-type{padding:0}body.syndicate div.notice hr{background-color:#272727}body.syndicate div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.syndicate section .cell,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.syndicate section{display:table-row;width:100%}body.syndicate section:not(:first-child){padding-top:4px}body.syndicate section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.syndicate section .label{width:1%;padding-right:32px;white-space:nowrap;color:#fff}body.syndicate section .content:not(:last-child){padding-right:16px}body.syndicate section .line{width:100%}body.syndicate section .cell:not(:first-child){text-align:center;padding-top:0}body.syndicate section .cell span.button{width:75px}body.syndicate section:not(:last-child){padding-right:4px}body.syndicate div.subdisplay{width:100%;margin:0}body.syndicate header.titlebar .close,body.syndicate header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#e74242}body.syndicate header.titlebar .close:hover,body.syndicate header.titlebar .minimize:hover{color:#eb5e5e}body.syndicate header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.syndicate header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.syndicate header.titlebar .title{position:absolute;top:6px;left:46px;color:#e74242;font-size:16px;white-space:nowrap}body.syndicate header.titlebar .minimize{position:absolute;top:6px;right:46px}body.syndicate header.titlebar .close{position:absolute;top:4px;right:12px}.no-icons header.titlebar .statusicon{font-size:20px}.no-icons header.titlebar .statusicon:after{content:"O"}.no-icons header.titlebar .minimize{top:-2px;font-size:20px}.no-icons header.titlebar .minimize:after{content:"—"}.no-icons header.titlebar .close{font-size:20px}.no-icons header.titlebar .close:after{content:"X"} \ No newline at end of file From 4d0b7133c8c1b2f9027bedc4368dd8f4852022d3 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 6 Mar 2018 17:40:52 -0600 Subject: [PATCH 45/45] Automatic changelog generation for PR #5828 [ci skip] --- html/changelogs/AutoChangeLog-pr-5828.yml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5828.yml diff --git a/html/changelogs/AutoChangeLog-pr-5828.yml b/html/changelogs/AutoChangeLog-pr-5828.yml new file mode 100644 index 0000000000..121f22e488 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5828.yml @@ -0,0 +1,8 @@ +author: "Poojawa" +delete-after: True +changes: + - rscdel: "Removed old things in .dms we weren't using anymore" + - tweak: "subtle messages are now italic'd, so there's better context on whispering" + - tweak: "broke apart the cit_gun.dm file, they're decently spaced out now" + - tweak: "dogborg_sleeper is now standalone from dogborg_equipment because too lazy to debug why it was breaking backpacks." + - tweak: "does that thing I've been meaning to do with Xenobio. additional tools have been provided."