From 9bf37f4eabfe3c13544d654400dde87c7b8de25e Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Tue, 3 Oct 2023 11:27:34 +0200 Subject: [PATCH 01/49] A thorough audit of damage procs and specifically their use in on_mob_life() (with unit tests!) [MDB IGNORE] (#24087) * A thorough audit of damage procs and specifically their use in on_mob_life() (with unit tests!) * Modular changes--bonus, removes a bunch of completely unused code signals code that was taking up resources needlessly --------- Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> --- code/__DEFINES/combat.dm | 10 +- code/__DEFINES/mobs.dm | 3 - code/__DEFINES/reagents.dm | 3 + code/__DEFINES/~skyrat_defines/signals.dm | 14 - code/_onclick/hud/fullscreen.dm | 2 +- code/datums/components/damage_aura.dm | 14 +- code/datums/components/tackle.dm | 11 +- code/datums/diseases/advance/symptoms/heal.dm | 31 +- .../diseases/advance/symptoms/oxygen.dm | 2 +- code/datums/diseases/chronic_illness.dm | 14 +- code/datums/diseases/rhumba_beat.dm | 2 +- code/datums/diseases/tuberculosis.dm | 14 +- .../quirks/positive_quirks/drunk_healing.dm | 15 +- code/datums/status_effects/buffs.dm | 55 +- code/datums/status_effects/debuffs/debuffs.dm | 31 +- code/datums/status_effects/neutral.dm | 13 +- .../weather/weather_types/void_storm.dm | 7 +- code/game/machinery/computer/aifixer.dm | 10 +- code/game/objects/items/defib.dm | 14 +- code/game/objects/items/religion.dm | 32 +- code/game/turfs/open/lava.dm | 7 +- .../abductor/equipment/glands/chem.dm | 2 +- .../abductor/equipment/glands/heal.dm | 2 +- .../blob/blobstrains/cryogenic_poison.dm | 12 +- .../blob/blobstrains/regenerative_materia.dm | 6 +- code/modules/antagonists/cult/blood_magic.dm | 12 +- .../heretic/knowledge/cosmic_lore.dm | 21 +- .../heretic/knowledge/rust_lore.dm | 26 +- .../sacrifice_knowledge/sacrifice_buff.dm | 17 +- .../heretic/magic/nightwatcher_rebirth.dm | 13 +- .../antagonists/heretic/magic/star_touch.dm | 10 +- .../antagonists/revenant/revenant_blight.dm | 11 +- .../bitrunning/components/netpod_healing.dm | 12 +- code/modules/bitrunning/server/util.dm | 8 +- code/modules/library/bibles.dm | 2 +- .../mob/living/basic/health_adjustment.dm | 12 +- .../regal_rat/regal_rat_actions.dm | 28 +- code/modules/mob/living/brain/brain_item.dm | 2 +- .../mob/living/carbon/alien/damage_procs.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 7 +- .../mob/living/carbon/carbon_defense.dm | 6 +- .../modules/mob/living/carbon/damage_procs.dm | 105 ++- .../mob/living/carbon/human/_species.dm | 2 +- .../carbon/human/species_types/podpeople.dm | 33 +- .../carbon/human/species_types/vampire.dm | 11 +- .../carbon/human/species_types/zombies.dm | 19 +- code/modules/mob/living/carbon/life.dm | 17 +- code/modules/mob/living/damage_procs.dm | 167 ++-- code/modules/mob/living/living.dm | 24 +- .../mob/living/silicon/damage_procs.dm | 10 +- .../mob/living/simple_animal/damage_procs.dm | 2 +- .../simple_animal/guardian/types/support.dm | 11 +- .../simple_animal/hostile/jungle/leaper.dm | 5 +- .../mob/living/simple_animal/slime/life.dm | 7 +- code/modules/mob/mob_helpers.dm | 2 +- code/modules/mob/status_procs.dm | 1 + .../projectiles/guns/special/medbeam.dm | 11 +- .../projectiles/guns/special/syringe_gun.dm | 2 +- code/modules/reagents/chemistry/holder.dm | 2 +- code/modules/reagents/chemistry/reagents.dm | 54 +- .../chemistry/reagents/atmos_gas_reagents.dm | 55 +- .../reagents/cat2_medicine_reagents.dm | 256 ++++--- .../reagents/drinks/alcohol_reagents.dm | 383 +++++----- .../reagents/drinks/drink_reagents.dm | 260 ++++--- .../chemistry/reagents/drug_reagents.dm | 239 +++--- .../chemistry/reagents/food_reagents.dm | 277 +++---- .../chemistry/reagents/impure_reagents.dm | 35 +- .../impure_medicine_reagents.dm | 231 +++--- .../impure_reagents/impure_toxin_reagents.dm | 16 +- .../chemistry/reagents/medicine_reagents.dm | 715 ++++++++++-------- .../chemistry/reagents/other_reagents.dm | 268 ++++--- .../reagents/pyrotechnic_reagents.dm | 36 +- .../chemistry/reagents/toxin_reagents.dm | 387 +++++----- .../chemistry/reagents/unique/eigenstasium.dm | 8 +- code/modules/religion/religion_sects.dm | 4 +- .../crossbreeding/_status_effects.dm | 21 +- .../xenobiology/crossbreeding/consuming.dm | 15 +- .../spells/spell_types/self/basic_heal.dm | 7 +- code/modules/surgery/bodyparts/_bodyparts.dm | 23 +- code/modules/surgery/organs/_organ.dm | 15 +- .../organs/internal/appendix/_appendix.dm | 4 +- .../internal/cyberimp/augments_chest.dm | 11 +- .../surgery/organs/internal/eyes/_eyes.dm | 2 +- .../organs/internal/liver/liver_skeleton.dm | 4 +- .../surgery/organs/internal/tongue/_tongue.dm | 2 +- code/modules/unit_tests/_unit_tests.dm | 1 + code/modules/unit_tests/mob_damage.dm | 539 +++++++++++++ code/modules/unit_tests/organs.dm | 9 +- code/modules/zombie/items.dm | 15 +- 89 files changed, 2916 insertions(+), 1922 deletions(-) create mode 100644 code/modules/unit_tests/mob_damage.dm diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 92e7749860b..caff9c319e2 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -56,10 +56,12 @@ #define BRUTELOSS (1<<0) #define FIRELOSS (1<<1) #define TOXLOSS (1<<2) -#define OXYLOSS (1<<3) -#define SHAME (1<<4) -#define MANUAL_SUICIDE (1<<5) //suicide_act will do the actual killing. -#define MANUAL_SUICIDE_NONLETHAL (1<<6) //when the suicide is conditionally lethal +#define CLONELOSS (1<<3) +#define OXYLOSS (1<<4) +#define STAMINALOSS (1<<5) +#define SHAME (1<<6) +#define MANUAL_SUICIDE (1<<7) //suicide_act will do the actual killing. +#define MANUAL_SUICIDE_NONLETHAL (1<<8) //when the suicide is conditionally lethal #define EFFECT_STUN "stun" #define EFFECT_KNOCKDOWN "knockdown" diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index f3ae254e6b8..34c301a2171 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -493,9 +493,6 @@ #define AI_CAMERA_LUMINOSITY 5 #define AI_VOX // Comment out if you don't want VOX to be enabled and have players download the voice sounds. -// /obj/item/bodypart on_mob_life() retval flag -#define BODYPART_LIFE_UPDATE_HEALTH (1<<0) - #define MAX_REVIVE_FIRE_DAMAGE 180 #define MAX_REVIVE_BRUTE_DAMAGE 180 diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm index a6ba5c0ed38..dda31ee2adc 100644 --- a/code/__DEFINES/reagents.dm +++ b/code/__DEFINES/reagents.dm @@ -34,6 +34,9 @@ /// Used for direct injection of reagents. #define INJECT (1<<4) +/// When returned by on_mob_life(), on_mob_dead(), overdose_start() or overdose_processed(), will cause the mob to updatehealth() afterwards +#define UPDATE_MOB_HEALTH 1 + // How long do mime drinks silence the drinker (if they are a mime)? #define MIMEDRINK_SILENCE_DURATION (1 MINUTES) ///Health threshold for synthflesh and rezadone to unhusk someone diff --git a/code/__DEFINES/~skyrat_defines/signals.dm b/code/__DEFINES/~skyrat_defines/signals.dm index 095a5ff8b42..7ccaad2e592 100644 --- a/code/__DEFINES/~skyrat_defines/signals.dm +++ b/code/__DEFINES/~skyrat_defines/signals.dm @@ -43,20 +43,6 @@ // Health signals /// /mob/living/proc/updatehealth() #define COMSIG_MOB_RUN_ARMOR "mob_run_armor" -/// /mob/living/proc/adjustBruteLoss (amount) -#define COMSIG_MOB_LOSS_BRUTE "mob_loss_brute" -/// /mob/living/proc/adjustBurnLoss (amount) -#define COMSIG_MOB_LOSS_FIRE "mob_loss_fire" -/// /mob/living/proc/adjustCloneLoss (amount) -#define COMSIG_MOB_LOSS_CLONE "mob_loss_clone" -/// /mob/living/proc/adjustToxLoss (amount) -#define COMSIG_MOB_LOSS_TOX "mob_loss_tox" -////mob/living/proc/adjustOyxLoss (amount) -#define COMSIG_MOB_LOSS_OXY "mob_loss_oxy" -////mob/living/proc/adjustStaminaLoss (amount) -#define COMSIG_MOB_LOSS_STAMINA "mob_loss_stamina" -/// /mob/living/proc/adjustOrganLoss (slot, amount) -#define COMSIG_MOB_LOSS_ORGAN "mob_loss_organ" ///from base of /turf/handle_fall(): (mob/faller) #define COMSIG_TURF_MOB_FALL "turf_mob_fall" ///from base of /obj/effect/abstract/liquid_turf/Initialize() (/obj/effect/abstract/liquid_turf/liquids) diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index ef184e18b1d..79f857e8cbe 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -26,7 +26,7 @@ screens -= category - if(animated) + if(!QDELETED(src) && animated) animate(screen, alpha = 0, time = animated) addtimer(CALLBACK(src, PROC_REF(clear_fullscreen_after_animate), screen), animated, TIMER_CLIENT_TIME) else diff --git a/code/datums/components/damage_aura.dm b/code/datums/components/damage_aura.dm index 2438eca8d79..6eec1903eef 100644 --- a/code/datums/components/damage_aura.dm +++ b/code/datums/components/damage_aura.dm @@ -91,14 +91,16 @@ /// What effect the damage aura has if it has an owner. /datum/component/damage_aura/proc/owner_effect(mob/living/owner_mob, seconds_per_tick) - owner_mob.adjustStaminaLoss(-20 * seconds_per_tick, updating_stamina = FALSE) - owner_mob.adjustBruteLoss(-1 * seconds_per_tick, updating_health = FALSE) - owner_mob.adjustFireLoss(-1 * seconds_per_tick, updating_health = FALSE) - owner_mob.adjustToxLoss(-1 * seconds_per_tick, updating_health = FALSE, forced = TRUE) - owner_mob.adjustOxyLoss(-1 * seconds_per_tick, updating_health = FALSE) + var/need_mob_update = FALSE + need_mob_update += owner_mob.adjustStaminaLoss(-20 * seconds_per_tick, updating_stamina = FALSE) + need_mob_update += owner_mob.adjustBruteLoss(-1 * seconds_per_tick, updating_health = FALSE) + need_mob_update += owner_mob.adjustFireLoss(-1 * seconds_per_tick, updating_health = FALSE) + need_mob_update += owner_mob.adjustToxLoss(-1 * seconds_per_tick, updating_health = FALSE, forced = TRUE) + need_mob_update += owner_mob.adjustOxyLoss(-1 * seconds_per_tick, updating_health = FALSE) if (owner_mob.blood_volume < BLOOD_VOLUME_NORMAL) owner_mob.blood_volume += 2 * seconds_per_tick - owner_mob.updatehealth() + if(need_mob_update) + owner_mob.updatehealth() /datum/component/damage_aura/process(seconds_per_tick) var/should_show_effect = COOLDOWN_FINISHED(src, last_damage_effect_time) diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm index 4ae3a973d7e..a5b5606bf72 100644 --- a/code/datums/components/tackle.dm +++ b/code/datums/components/tackle.dm @@ -445,7 +445,7 @@ if(86 to 92) user.visible_message(span_danger("[user] slams head-first into [hit], suffering major cranial trauma!"), span_userdanger("You slam head-first into [hit], and the world explodes around you!")) - user.adjustStaminaLoss(30, updating_stamina=FALSE) + user.adjustStaminaLoss(30, updating_stamina = FALSE) user.adjustBruteLoss(30) user.adjust_confusion(15 SECONDS) if(prob(80)) @@ -457,7 +457,7 @@ if(68 to 85) user.visible_message(span_danger("[user] slams hard into [hit], knocking [user.p_them()] senseless!"), span_userdanger("You slam hard into [hit], knocking yourself senseless!")) - user.adjustStaminaLoss(30, updating_stamina=FALSE) + user.adjustStaminaLoss(30, updating_stamina = FALSE) user.adjustBruteLoss(10) user.adjust_confusion(10 SECONDS) user.Knockdown(3 SECONDS) @@ -465,7 +465,7 @@ if(1 to 67) user.visible_message(span_danger("[user] slams into [hit]!"), span_userdanger("You slam into [hit]!")) - user.adjustStaminaLoss(20, updating_stamina=FALSE) + user.adjustStaminaLoss(20, updating_stamina = FALSE) user.adjustBruteLoss(10) user.Knockdown(2 SECONDS) shake_camera(user, 2, 2) @@ -545,10 +545,11 @@ HOW_big_of_a_miss_did_we_just_make = ", making a ginormous mess!" // an extra exclamation point!! for emphasis!!! owner.visible_message(span_danger("[owner] trips over [kevved] and slams into it face-first[HOW_big_of_a_miss_did_we_just_make]!"), span_userdanger("You trip over [kevved] and slam into it face-first[HOW_big_of_a_miss_did_we_just_make]!")) - owner.adjustStaminaLoss(15 + messes.len * 2, FALSE) - owner.adjustBruteLoss(8 + messes.len) + owner.adjustStaminaLoss(15 + messes.len * 2, updating_stamina = FALSE) + owner.adjustBruteLoss(8 + messes.len, updating_health = FALSE) owner.Paralyze(0.4 SECONDS * messes.len) // .4 seconds of paralyze for each thing you knock around owner.Knockdown(2 SECONDS + 0.4 SECONDS * messes.len) // 2 seconds of knockdown after the paralyze + owner.updatehealth() for(var/obj/item/I in messes) var/dist = rand(1, 3) diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index 8754eb3b71d..55e2cdd6c65 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -161,8 +161,8 @@ if(!parts.len) return - for(var/obj/item/bodypart/L in parts) - if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len, BODYTYPE_ORGANIC)) + for(var/obj/item/bodypart/bodypart in parts) + if(bodypart.heal_damage(heal_amt/parts.len, heal_amt/parts.len, required_bodytype = BODYTYPE_ORGANIC)) M.update_damage_overlays() return 1 @@ -303,8 +303,8 @@ if(prob(5)) to_chat(M, span_notice("The darkness soothes and mends your wounds.")) - for(var/obj/item/bodypart/L in parts) - if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len * 0.5, BODYTYPE_ORGANIC)) //more effective on brute + for(var/obj/item/bodypart/bodypart in parts) + if(bodypart.heal_damage(heal_amt/parts.len, heal_amt/parts.len * 0.5, required_bodytype = BODYTYPE_ORGANIC)) //more effective on brute M.update_damage_overlays() return 1 @@ -405,8 +405,8 @@ if(!parts.len) return - for(var/obj/item/bodypart/L in parts) - if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len, BODYTYPE_ORGANIC)) + for(var/obj/item/bodypart/bodypart in parts) + if(bodypart.heal_damage(heal_amt/parts.len, heal_amt/parts.len, required_bodytype = BODYTYPE_ORGANIC)) M.update_damage_overlays() if(active_coma && M.getBruteLoss() + M.getFireLoss() == 0) @@ -469,8 +469,8 @@ if(prob(5)) to_chat(M, span_notice("You feel yourself absorbing the water around you to soothe your damaged skin.")) - for(var/obj/item/bodypart/L in parts) - if(L.heal_damage(heal_amt/parts.len * 0.5, heal_amt/parts.len, BODYTYPE_ORGANIC)) + for(var/obj/item/bodypart/bodypart in parts) + if(bodypart.heal_damage(heal_amt/parts.len * 0.5, heal_amt/parts.len, required_bodytype = BODYTYPE_ORGANIC)) M.update_damage_overlays() return 1 @@ -592,8 +592,8 @@ return if(prob(5)) to_chat(M, span_notice("The pain from your wounds fades rapidly.")) - for(var/obj/item/bodypart/L in parts) - if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len, BODYTYPE_ORGANIC)) + for(var/obj/item/bodypart/bodypart in parts) + if(bodypart.heal_damage(heal_amt/parts.len, heal_amt/parts.len, required_bodytype = BODYTYPE_ORGANIC)) M.update_damage_overlays() return 1 @@ -637,10 +637,13 @@ /datum/symptom/heal/radiation/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power) var/heal_amt = actual_power + var/need_mob_update = FALSE if(cellular_damage) - M.adjustCloneLoss(-heal_amt * 0.5) + need_mob_update += M.adjustCloneLoss(-heal_amt * 0.5, updating_health = FALSE) - M.adjustToxLoss(-(2 * heal_amt)) + need_mob_update += M.adjustToxLoss(-(2 * heal_amt), updating_health = FALSE) + if(need_mob_update) + M.updatehealth() var/list/parts = M.get_damaged_bodyparts(1,1, BODYTYPE_ORGANIC) @@ -650,8 +653,8 @@ if(prob(4)) to_chat(M, span_notice("Your skin glows faintly, and you feel your wounds mending themselves.")) - for(var/obj/item/bodypart/L in parts) - if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len, BODYTYPE_ORGANIC)) + for(var/obj/item/bodypart/bodypart in parts) + if(bodypart.heal_damage(heal_amt/parts.len, heal_amt/parts.len, required_bodytype = BODYTYPE_ORGANIC)) M.update_damage_overlays() return 1 diff --git a/code/datums/diseases/advance/symptoms/oxygen.dm b/code/datums/diseases/advance/symptoms/oxygen.dm index 89da211b06b..fad70aff23f 100644 --- a/code/datums/diseases/advance/symptoms/oxygen.dm +++ b/code/datums/diseases/advance/symptoms/oxygen.dm @@ -38,8 +38,8 @@ var/mob/living/carbon/infected_mob = advanced_disease.affected_mob switch(advanced_disease.stage) if(4, 5) - infected_mob.adjustOxyLoss(-7, 0) infected_mob.losebreath = max(0, infected_mob.losebreath - 4) + infected_mob.adjustOxyLoss(-7) if(regenerate_blood && infected_mob.blood_volume < BLOOD_VOLUME_NORMAL) infected_mob.blood_volume += 1 else diff --git a/code/datums/diseases/chronic_illness.dm b/code/datums/diseases/chronic_illness.dm index 77c162d6d85..129883c17b5 100644 --- a/code/datums/diseases/chronic_illness.dm +++ b/code/datums/diseases/chronic_illness.dm @@ -31,19 +31,23 @@ to_chat(affected_mob, span_notice("You look at your hand. Your vision blurs.")) affected_mob.set_eye_blur_if_lower(10 SECONDS) if(3) + var/need_mob_update = FALSE if(SPT_PROB(0.5, seconds_per_tick)) to_chat(affected_mob, span_danger("You feel a very sharp pain in your chest!")) if(prob(45)) affected_mob.vomit(VOMIT_CATEGORY_BLOOD, lost_nutrition = 20) if(SPT_PROB(0.5, seconds_per_tick)) to_chat(affected_mob, span_userdanger("[pick("You feel your heart slowing...", "You relax and slow your heartbeat.")]")) - affected_mob.adjustStaminaLoss(70, FALSE) + need_mob_update += affected_mob.adjustStaminaLoss(70, updating_stamina = FALSE) if(SPT_PROB(1, seconds_per_tick)) to_chat(affected_mob, span_danger("You feel a buzzing in your brain.")) SEND_SOUND(affected_mob, sound('sound/weapons/flash_ring.ogg')) if(SPT_PROB(0.5, seconds_per_tick)) - affected_mob.adjustBruteLoss(1) + need_mob_update += affected_mob.adjustBruteLoss(1, updating_health = FALSE) + if(need_mob_update) + affected_mob.updatehealth() if(4) + var/need_mob_update = FALSE if(prob(30)) affected_mob.playsound_local(affected_mob, 'sound/effects/singlebeat.ogg', 100, FALSE, use_reverb = FALSE) if(SPT_PROB(1, seconds_per_tick)) @@ -51,7 +55,7 @@ if(prob(75)) affected_mob.vomit(VOMIT_CATEGORY_BLOOD, lost_nutrition = 45) if(SPT_PROB(1, seconds_per_tick)) - affected_mob.adjustStaminaLoss(100, FALSE) + need_mob_update += affected_mob.adjustStaminaLoss(100, updating_stamina = FALSE) affected_mob.visible_message(span_warning("[affected_mob] collapses!")) if(prob(30)) to_chat(affected_mob, span_danger("Your vision blurs as you faint!")) @@ -59,7 +63,9 @@ if(SPT_PROB(0.5, seconds_per_tick)) to_chat(affected_mob, span_danger("[pick("You feel as though your atoms are accelerating in place.", "You feel like you're being torn apart!")]")) affected_mob.emote("scream") - affected_mob.adjustBruteLoss(10) + need_mob_update += affected_mob.adjustBruteLoss(10, updating_health = FALSE) + if(need_mob_update) + affected_mob.updatehealth() if(5) switch(rand(1,2)) if(1) diff --git a/code/datums/diseases/rhumba_beat.dm b/code/datums/diseases/rhumba_beat.dm index 01188137915..e64002ab528 100644 --- a/code/datums/diseases/rhumba_beat.dm +++ b/code/datums/diseases/rhumba_beat.dm @@ -18,7 +18,7 @@ switch(stage) if(2) if(SPT_PROB(26, seconds_per_tick)) - affected_mob.adjustFireLoss(5, FALSE) + affected_mob.adjustFireLoss(5) if(SPT_PROB(0.5, seconds_per_tick)) to_chat(affected_mob, span_danger("You feel strange...")) if(3) diff --git a/code/datums/diseases/tuberculosis.dm b/code/datums/diseases/tuberculosis.dm index dd75ea7cc62..de87cab6f3f 100644 --- a/code/datums/diseases/tuberculosis.dm +++ b/code/datums/diseases/tuberculosis.dm @@ -28,23 +28,27 @@ if(SPT_PROB(2.5, seconds_per_tick)) to_chat(affected_mob, span_danger("You feel a cold sweat form.")) if(4) + var/need_mob_update = FALSE if(SPT_PROB(1, seconds_per_tick)) to_chat(affected_mob, span_userdanger("You see four of everything!")) affected_mob.set_dizzy_if_lower(10 SECONDS) if(SPT_PROB(1, seconds_per_tick)) to_chat(affected_mob, span_danger("You feel a sharp pain from your lower chest!")) - affected_mob.adjustOxyLoss(5, FALSE) + need_mob_update += affected_mob.adjustOxyLoss(5, updating_health = FALSE) affected_mob.emote("gasp") if(SPT_PROB(5, seconds_per_tick)) to_chat(affected_mob, span_danger("You feel air escape from your lungs painfully.")) - affected_mob.adjustOxyLoss(25, FALSE) + need_mob_update += affected_mob.adjustOxyLoss(25, updating_health = FALSE) affected_mob.emote("gasp") + if(need_mob_update) + affected_mob.updatehealth() if(5) + var/need_mob_update = FALSE if(SPT_PROB(1, seconds_per_tick)) to_chat(affected_mob, span_userdanger("[pick("You feel your heart slowing...", "You relax and slow your heartbeat.")]")) - affected_mob.adjustStaminaLoss(70, FALSE) + need_mob_update += affected_mob.adjustStaminaLoss(70, updating_stamina = FALSE) if(SPT_PROB(5, seconds_per_tick)) - affected_mob.adjustStaminaLoss(100, FALSE) + need_mob_update += affected_mob.adjustStaminaLoss(100, updating_stamina = FALSE) affected_mob.visible_message(span_warning("[affected_mob] faints!"), span_userdanger("You surrender yourself and feel at peace...")) affected_mob.AdjustSleeping(100) if(SPT_PROB(1, seconds_per_tick)) @@ -59,3 +63,5 @@ if(SPT_PROB(7.5, seconds_per_tick)) to_chat(affected_mob, span_danger("[pick("You feel uncomfortably hot...", "You feel like unzipping your jumpsuit...", "You feel like taking off some clothes...")]")) affected_mob.adjust_bodytemperature(40) + if(need_mob_update) + affected_mob.updatehealth() diff --git a/code/datums/quirks/positive_quirks/drunk_healing.dm b/code/datums/quirks/positive_quirks/drunk_healing.dm index fbab2503b4e..e1c4ba91125 100644 --- a/code/datums/quirks/positive_quirks/drunk_healing.dm +++ b/code/datums/quirks/positive_quirks/drunk_healing.dm @@ -10,13 +10,16 @@ mail_goodies = list(/obj/effect/spawner/random/food_or_drink/booze) /datum/quirk/drunkhealing/process(seconds_per_tick) + var/need_mob_update = FALSE switch(quirk_holder.get_drunk_amount()) if (6 to 40) - quirk_holder.adjustBruteLoss(-0.1 * seconds_per_tick, FALSE, required_bodytype = BODYTYPE_ORGANIC) - quirk_holder.adjustFireLoss(-0.05 * seconds_per_tick, required_bodytype = BODYTYPE_ORGANIC) + need_mob_update += quirk_holder.adjustBruteLoss(-0.1 * seconds_per_tick, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) + need_mob_update += quirk_holder.adjustFireLoss(-0.05 * seconds_per_tick, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) if (41 to 60) - quirk_holder.adjustBruteLoss(-0.4 * seconds_per_tick, FALSE, required_bodytype = BODYTYPE_ORGANIC) - quirk_holder.adjustFireLoss(-0.2 * seconds_per_tick, required_bodytype = BODYTYPE_ORGANIC) + need_mob_update += quirk_holder.adjustBruteLoss(-0.4 * seconds_per_tick, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) + need_mob_update += quirk_holder.adjustFireLoss(-0.2 * seconds_per_tick, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) if (61 to INFINITY) - quirk_holder.adjustBruteLoss(-0.8 * seconds_per_tick, FALSE, required_bodytype = BODYTYPE_ORGANIC) - quirk_holder.adjustFireLoss(-0.4 * seconds_per_tick, required_bodytype = BODYTYPE_ORGANIC) + need_mob_update += quirk_holder.adjustBruteLoss(-0.8 * seconds_per_tick, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) + need_mob_update += quirk_holder.adjustFireLoss(-0.4 * seconds_per_tick, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) + if(need_mob_update) + quirk_holder.updatehealth() diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index cb0b55be059..fd9e3d9aee5 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -44,13 +44,15 @@ owner.apply_status_effect(/datum/status_effect/his_wrath) qdel(src) return - var/grace_heal = bloodlust * 0.05 - owner.adjustBruteLoss(-grace_heal) - owner.adjustFireLoss(-grace_heal) - owner.adjustToxLoss(-grace_heal, TRUE, TRUE) - owner.adjustOxyLoss(-(grace_heal * 2)) - owner.adjustCloneLoss(-grace_heal) - + var/grace_heal = bloodlust * 0.02 + var/need_mob_update = FALSE + need_mob_update += owner.adjustBruteLoss(-grace_heal * seconds_between_ticks, updating_health = FALSE, forced = TRUE) + need_mob_update += owner.adjustFireLoss(-grace_heal * seconds_between_ticks, updating_health = FALSE, forced = TRUE) + need_mob_update += owner.adjustToxLoss(-grace_heal * seconds_between_ticks, forced = TRUE) + need_mob_update += owner.adjustOxyLoss(-(grace_heal * 2) * seconds_between_ticks, updating_health = FALSE, forced = TRUE) + need_mob_update += owner.adjustCloneLoss(-grace_heal * seconds_between_ticks, updating_health = FALSE, forced = TRUE) + if(need_mob_update) + owner.updatehealth() /datum/status_effect/wish_granters_gift //Fully revives after ten seconds. id = "wish_granters_gift" @@ -61,7 +63,6 @@ to_chat(owner, span_notice("Death is not your end! The Wish Granter's energy suffuses you, and you begin to rise...")) return ..() - /datum/status_effect/wish_granters_gift/on_remove() owner.revive(ADMIN_HEAL_ALL) owner.visible_message(span_warning("[owner] appears to wake from the dead, having healed all wounds!"), span_notice("You have regenerated.")) @@ -140,9 +141,12 @@ if(owner.on_fire) return - owner.adjustBruteLoss(-10, FALSE) - owner.adjustFireLoss(-5, FALSE) - owner.adjustOxyLoss(-10) + var/need_mob_update = FALSE + need_mob_update += owner.adjustBruteLoss(-4 * seconds_between_ticks, updating_health = FALSE) + need_mob_update += owner.adjustFireLoss(-2 * seconds_between_ticks, updating_health = FALSE) + need_mob_update += owner.adjustOxyLoss(-4 * seconds_between_ticks, updating_health = FALSE) + if(need_mob_update) + owner.updatehealth() /datum/status_effect/fleshmend/proc/on_ignited(datum/source) SIGNAL_HANDLER @@ -254,13 +258,16 @@ //Because a servant of medicines stops at nothing to help others, lets keep them on their toes and give them an additional boost. if(itemUser.health < itemUser.maxHealth) new /obj/effect/temp_visual/heal(get_turf(itemUser), "#375637") - itemUser.adjustBruteLoss(-1.5) - itemUser.adjustFireLoss(-1.5) - itemUser.adjustToxLoss(-1.5, forced = TRUE) //Because Slime People are people too - itemUser.adjustOxyLoss(-1.5, forced = TRUE) - itemUser.adjustStaminaLoss(-1.5) - itemUser.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1.5) - itemUser.adjustCloneLoss(-0.5) //Becasue apparently clone damage is the bastion of all health + var/need_mob_update = FALSE + need_mob_update += itemUser.adjustBruteLoss(-0.6 * seconds_between_ticks, updating_health = FALSE, forced = TRUE) + need_mob_update += itemUser.adjustFireLoss(-0.6 * seconds_between_ticks, updating_health = FALSE, forced = TRUE) + need_mob_update += itemUser.adjustToxLoss(-0.6 * seconds_between_ticks, updating_health = FALSE, forced = TRUE) //Because Slime People are people too + need_mob_update += itemUser.adjustOxyLoss(-0.6 * seconds_between_ticks, updating_health = FALSE, forced = TRUE) + need_mob_update += itemUser.adjustStaminaLoss(-0.6 * seconds_between_ticks, updating_stamina = FALSE, forced = TRUE) + need_mob_update += itemUser.adjustOrganLoss(ORGAN_SLOT_BRAIN, -0.6 * seconds_between_ticks) + need_mob_update += itemUser.adjustCloneLoss(-0.2 * seconds_between_ticks, updating_health = FALSE, forced = TRUE) //Because apparently clone damage is the bastion of all health + if(need_mob_update) + itemUser.updatehealth() /datum/status_effect/hippocratic_oath/proc/consume_owner() owner.visible_message(span_notice("[owner]'s soul is absorbed into the rod, relieving the previous snake of its duty.")) @@ -274,7 +281,6 @@ owner.investigate_log("has been consumed by the Rod of Asclepius.", INVESTIGATE_DEATHS) qdel(owner) - /datum/status_effect/good_music id = "Good Music" alert_type = null @@ -444,10 +450,13 @@ qdel(src) return - owner.adjustBruteLoss(-2 * seconds_between_ticks, updating_health = FALSE) - owner.adjustFireLoss(-2 * seconds_between_ticks, updating_health = FALSE) - owner.adjustOxyLoss(-4 * seconds_between_ticks, updating_health = FALSE) - owner.adjustStaminaLoss(-4 * seconds_between_ticks, updating_stamina = FALSE) + var/need_mob_update = FALSE + need_mob_update += owner.adjustBruteLoss(-2 * seconds_between_ticks, updating_health = FALSE) + need_mob_update += owner.adjustFireLoss(-2 * seconds_between_ticks, updating_health = FALSE) + need_mob_update += owner.adjustOxyLoss(-4 * seconds_between_ticks, updating_health = FALSE) + need_mob_update += owner.adjustStaminaLoss(-4 * seconds_between_ticks, updating_stamina = FALSE) + if(need_mob_update) + owner.updatehealth() owner.adjust_bodytemperature(BODYTEMP_NORMAL, 0, BODYTEMP_NORMAL) //Won't save you from the void of space, but it will stop you from freezing or suffocating in low pressure diff --git a/code/datums/status_effects/debuffs/debuffs.dm b/code/datums/status_effects/debuffs/debuffs.dm index 8c8f910fd57..378fa4ebf29 100644 --- a/code/datums/status_effects/debuffs/debuffs.dm +++ b/code/datums/status_effects/debuffs/debuffs.dm @@ -206,6 +206,7 @@ if(locate(/obj/item/pillow) in owner.loc) healing += 0.1 + var/need_mob_update = FALSE if(healing > 0) if(iscarbon(owner)) var/mob/living/carbon/carbon_owner = owner @@ -219,10 +220,12 @@ target_organ.apply_organ_damage(-healing_bonus * target_organ.maxHealth) if(health_ratio > 0.8) // only heals minor physical damage - owner.adjustBruteLoss(-1 * healing, required_bodytype = BODYTYPE_ORGANIC) - owner.adjustFireLoss(-1 * healing, required_bodytype = BODYTYPE_ORGANIC) - owner.adjustToxLoss(-1 * healing * 0.5, TRUE, TRUE, required_biotype = MOB_ORGANIC) - owner.adjustStaminaLoss(min(-1 * healing, -1 * HEALING_SLEEP_DEFAULT)) + need_mob_update += owner.adjustBruteLoss(-0.4 * healing * seconds_between_ticks, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) + need_mob_update += owner.adjustFireLoss(-0.4 * healing * seconds_between_ticks, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) + need_mob_update += owner.adjustToxLoss(-0.2 * healing * seconds_between_ticks, updating_health = FALSE, forced = TRUE, required_biotype = MOB_ORGANIC) + need_mob_update += owner.adjustStaminaLoss(min(-0.4 * healing * seconds_between_ticks, -0.4 * HEALING_SLEEP_DEFAULT * seconds_between_ticks), updating_stamina = FALSE) + if(need_mob_update) + owner.updatehealth() // Drunkenness gets reduced by 0.3% per tick (6% per 2 seconds) owner.set_drunk_effect(owner.get_drunk_amount() * 0.997) @@ -311,9 +314,12 @@ for(var/obj/item/his_grace/HG in owner.held_items) qdel(src) return - owner.adjustBruteLoss(0.1) - owner.adjustFireLoss(0.1) - owner.adjustToxLoss(0.2, TRUE, TRUE) + var/need_mob_update + need_mob_update = owner.adjustBruteLoss(0.04 * seconds_between_ticks, updating_health = FALSE) + need_mob_update += owner.adjustFireLoss(0.04 * seconds_between_ticks, updating_health = FALSE) + need_mob_update += owner.adjustToxLoss(0.08 * seconds_between_ticks, updating_health = FALSE, forced = TRUE) + if(need_mob_update) + owner.updatehealth() /datum/status_effect/cultghost //is a cult ghost and can't use manifest runes id = "cult_ghost" @@ -821,7 +827,8 @@ /datum/status_effect/ants/tick(seconds_between_ticks) var/mob/living/carbon/human/victim = owner - victim.adjustBruteLoss(max(0.1, round((ants_remaining * 0.004),0.1))) //Scales with # of ants (lowers with time). Roughly 10 brute over 50 seconds. + var/need_mob_update + need_mob_update = victim.adjustBruteLoss(max(0.1, round((ants_remaining * 0.0016) * seconds_between_ticks,0.1)), updating_health = FALSE) //Scales with # of ants (lowers with time). Roughly 10 brute over 50 seconds. if(victim.stat <= SOFT_CRIT) //Makes sure people don't scratch at themselves while they're in a critical condition if(prob(15)) switch(rand(1,2)) @@ -834,20 +841,22 @@ if (1 to 8) //16% Chance var/obj/item/bodypart/head/hed = victim.get_bodypart(BODY_ZONE_HEAD) to_chat(victim, span_danger("You scratch at the ants on your scalp!.")) - hed.receive_damage(1,0) + need_mob_update += hed.receive_damage(brute = 0.4 * seconds_between_ticks, burn = 0, updating_health = FALSE) if (9 to 29) //40% chance var/obj/item/bodypart/arm = victim.get_bodypart(pick(BODY_ZONE_L_ARM,BODY_ZONE_R_ARM)) to_chat(victim, span_danger("You scratch at the ants on your arms!")) - arm.receive_damage(3,0) + need_mob_update += arm.receive_damage(brute = 1.2 * seconds_between_ticks, burn = 0, updating_health = FALSE) if (30 to 49) //38% chance var/obj/item/bodypart/leg = victim.get_bodypart(pick(BODY_ZONE_L_LEG,BODY_ZONE_R_LEG)) to_chat(victim, span_danger("You scratch at the ants on your leg!")) - leg.receive_damage(3,0) + need_mob_update += leg.receive_damage(brute = 1.2 * seconds_between_ticks, burn = 0, updating_health = FALSE) if(50) // 2% chance to_chat(victim, span_danger("You rub some ants away from your eyes!")) victim.set_eye_blur_if_lower(6 SECONDS) ants_remaining -= 5 // To balance out the blindness, it'll be a little shorter. ants_remaining-- + if(need_mob_update) + victim.updatehealth() if(ants_remaining <= 0 || victim.stat >= HARD_CRIT) victim.remove_status_effect(/datum/status_effect/ants) //If this person has no more ants on them or are dead, they are no longer affected. diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm index 7161946c9ff..a2aa81ebb69 100644 --- a/code/datums/status_effects/neutral.dm +++ b/code/datums/status_effects/neutral.dm @@ -109,11 +109,14 @@ for(var/datum/action/cooldown/spell/spell in rewarded.actions) spell.reset_spell_cooldown() - rewarded.adjustBruteLoss(-25) - rewarded.adjustFireLoss(-25) - rewarded.adjustToxLoss(-25) - rewarded.adjustOxyLoss(-25) - rewarded.adjustCloneLoss(-25) + var/need_mob_update = FALSE + need_mob_update += rewarded.adjustBruteLoss(-25, updating_health = FALSE) + need_mob_update += rewarded.adjustFireLoss(-25, updating_health = FALSE) + need_mob_update += rewarded.adjustToxLoss(-25, updating_health = FALSE) + need_mob_update += rewarded.adjustOxyLoss(-25, updating_health = FALSE) + need_mob_update += rewarded.adjustCloneLoss(-25, updating_health = FALSE) + if(need_mob_update) + rewarded.updatehealth() // heldup is for the person being aimed at /datum/status_effect/grouped/heldup diff --git a/code/datums/weather/weather_types/void_storm.dm b/code/datums/weather/weather_types/void_storm.dm index becfa9859a8..4d3638c5827 100644 --- a/code/datums/weather/weather_types/void_storm.dm +++ b/code/datums/weather/weather_types/void_storm.dm @@ -33,8 +33,11 @@ return FALSE /datum/weather/void_storm/weather_act(mob/living/victim) - victim.adjustFireLoss(1) - victim.adjustOxyLoss(rand(1, 3)) + var/need_mob_update = FALSE + victim.adjustFireLoss(1, updating_health = FALSE) + victim.adjustOxyLoss(rand(1, 3), updating_health = FALSE) + if(need_mob_update) + victim.updatehealth() victim.adjust_eye_blur(rand(0 SECONDS, 2 SECONDS)) victim.adjust_bodytemperature(-30 * TEMPERATURE_DAMAGE_COEFFICIENT) diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index 87e53ebb368..2bc13e156d4 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -65,10 +65,12 @@ /obj/machinery/computer/aifixer/proc/Fix() use_power(1000) - occupier.adjustOxyLoss(-5, FALSE) - occupier.adjustFireLoss(-5, FALSE) - occupier.adjustBruteLoss(-5, FALSE) - occupier.updatehealth() + var/need_mob_update = FALSE + need_mob_update += occupier.adjustOxyLoss(-5, updating_health = FALSE) + need_mob_update += occupier.adjustFireLoss(-5, updating_health = FALSE) + need_mob_update += occupier.adjustBruteLoss(-5, updating_health = FALSE) + if(need_mob_update) + occupier.updatehealth() if(occupier.health >= 0 && occupier.stat == DEAD) occupier.revive() if(!occupier.radio_enabled) diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 279f8101007..f86850fbf6f 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -636,17 +636,19 @@ var/total_brute = H.getBruteLoss() var/total_burn = H.getFireLoss() + var/need_mob_update = FALSE //If the body has been fixed so that they would not be in crit when defibbed, give them oxyloss to put them back into crit if (H.health > HALFWAYCRITDEATH) - H.adjustOxyLoss(H.health - HALFWAYCRITDEATH, 0) + need_mob_update += H.adjustOxyLoss(H.health - HALFWAYCRITDEATH, updating_health = FALSE) else var/overall_damage = total_brute + total_burn + H.getToxLoss() + H.getOxyLoss() var/mobhealth = H.health - H.adjustOxyLoss((mobhealth - HALFWAYCRITDEATH) * (H.getOxyLoss() / overall_damage), 0) - H.adjustToxLoss((mobhealth - HALFWAYCRITDEATH) * (H.getToxLoss() / overall_damage), 0, TRUE) // force tox heal for toxin lovers too - H.adjustFireLoss((mobhealth - HALFWAYCRITDEATH) * (total_burn / overall_damage), 0) - H.adjustBruteLoss((mobhealth - HALFWAYCRITDEATH) * (total_brute / overall_damage), 0) - H.updatehealth() // Previous "adjust" procs don't update health, so we do it manually. + need_mob_update += H.adjustOxyLoss((mobhealth - HALFWAYCRITDEATH) * (H.getOxyLoss() / overall_damage), updating_health = FALSE) + need_mob_update += H.adjustToxLoss((mobhealth - HALFWAYCRITDEATH) * (H.getToxLoss() / overall_damage), updating_health = FALSE, forced = TRUE) // force tox heal for toxin lovers too + need_mob_update += H.adjustFireLoss((mobhealth - HALFWAYCRITDEATH) * (total_burn / overall_damage), updating_health = FALSE) + need_mob_update += H.adjustBruteLoss((mobhealth - HALFWAYCRITDEATH) * (total_brute / overall_damage), updating_health = FALSE) + if(need_mob_update) + H.updatehealth() // Previous "adjust" procs don't update health, so we do it manually. user.visible_message(span_notice("[req_defib ? "[defib]" : "[src]"] pings: Resuscitation successful.")) playsound(src, 'sound/machines/defib_success.ogg', 50, FALSE) H.set_heartattack(FALSE) diff --git a/code/game/objects/items/religion.dm b/code/game/objects/items/religion.dm index f58d3ad93cf..e68a1b8c883 100644 --- a/code/game/objects/items/religion.dm +++ b/code/game/objects/items/religion.dm @@ -64,15 +64,18 @@ /obj/item/banner/proc/check_inspiration(mob/living/carbon/human/H) //Banner-specific conditions for being eligible return -/obj/item/banner/proc/inspiration(mob/living/carbon/human/H) - H.adjustBruteLoss(-15) - H.adjustFireLoss(-15) - H.AdjustStun(-40) - H.AdjustKnockdown(-40) - H.AdjustImmobilized(-40) - H.AdjustParalyzed(-40) - H.AdjustUnconscious(-40) - playsound(H, 'sound/magic/staff_healing.ogg', 25, FALSE) +/obj/item/banner/proc/inspiration(mob/living/carbon/human/inspired_human) + var/need_mob_update = FALSE + need_mob_update += inspired_human.adjustBruteLoss(-15, updating_health = FALSE) + need_mob_update += inspired_human.adjustFireLoss(-15, updating_health = FALSE) + if(need_mob_update) + inspired_human.updatehealth() + inspired_human.AdjustStun(-40) + inspired_human.AdjustKnockdown(-40) + inspired_human.AdjustImmobilized(-40) + inspired_human.AdjustParalyzed(-40) + inspired_human.AdjustUnconscious(-40) + playsound(inspired_human, 'sound/magic/staff_healing.ogg', 25, FALSE) /obj/item/banner/proc/special_inspiration(mob/living/carbon/human/H) //Any banner-specific inspiration effects go here return @@ -128,10 +131,13 @@ /obj/item/clothing/under/rank/medical/doctor = 1) category = CAT_MISC -/obj/item/banner/medical/special_inspiration(mob/living/carbon/human/H) - H.adjustToxLoss(-15) - H.setOxyLoss(0) - H.reagents.add_reagent(/datum/reagent/medicine/inaprovaline, 5) +/obj/item/banner/medical/special_inspiration(mob/living/carbon/human/inspired_human) + var/need_mob_update = FALSE + need_mob_update += inspired_human.adjustToxLoss(-15, updating_health = FALSE) + need_mob_update += inspired_human.setOxyLoss(0, updating_health = FALSE) + if(need_mob_update) + inspired_human.updatehealth() + inspired_human.reagents.add_reagent(/datum/reagent/medicine/inaprovaline, 5) /obj/item/banner/science name = "sciencia banner" diff --git a/code/game/turfs/open/lava.dm b/code/game/turfs/open/lava.dm index 24c690498a6..b8e04949662 100644 --- a/code/game/turfs/open/lava.dm +++ b/code/game/turfs/open/lava.dm @@ -392,8 +392,11 @@ if(IS_ROBOTIC_LIMB(burn_limb)) robo_parts += burn_limb - burn_human.adjustToxLoss(15, required_biotype = MOB_ORGANIC) // This is from plasma, so it should obey plasma biotype requirements - burn_human.adjustFireLoss(25) + var/need_mob_update + need_mob_update += burn_human.adjustToxLoss(15, updating_health = FALSE, required_biotype = MOB_ORGANIC) // This is from plasma, so it should obey plasma biotype requirements + need_mob_update += burn_human.adjustFireLoss(25, updating_health = FALSE) + if(need_mob_update) + burn_human.updatehealth() if(plasma_parts.len) var/obj/item/bodypart/burn_limb = pick(plasma_parts) //using the above-mentioned list to get a choice of limbs burn_human.emote("scream") diff --git a/code/modules/antagonists/abductor/equipment/glands/chem.dm b/code/modules/antagonists/abductor/equipment/glands/chem.dm index 47868841c85..965d8f2fc20 100644 --- a/code/modules/antagonists/abductor/equipment/glands/chem.dm +++ b/code/modules/antagonists/abductor/equipment/glands/chem.dm @@ -16,5 +16,5 @@ /obj/item/organ/internal/heart/gland/chem/activate() var/chem_to_add = pick(possible_reagents) owner.reagents.add_reagent(chem_to_add, 2) - owner.adjustToxLoss(-5, TRUE, TRUE) + owner.adjustToxLoss(-5, forced = TRUE) ..() diff --git a/code/modules/antagonists/abductor/equipment/glands/heal.dm b/code/modules/antagonists/abductor/equipment/glands/heal.dm index 2fa677cba0e..683cb33fc9a 100644 --- a/code/modules/antagonists/abductor/equipment/glands/heal.dm +++ b/code/modules/antagonists/abductor/equipment/glands/heal.dm @@ -194,7 +194,7 @@ var/keep_going = FALSE owner.vomit(vomit_flags = (MOB_VOMIT_BLOOD | MOB_VOMIT_FORCE), lost_nutrition = 0, distance = 3) owner.Stun(15) - owner.adjustToxLoss(-15, TRUE, TRUE) + owner.adjustToxLoss(-15, forced = TRUE) owner.blood_volume = min(BLOOD_VOLUME_NORMAL, owner.blood_volume + 20) if(owner.blood_volume < BLOOD_VOLUME_NORMAL) diff --git a/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm b/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm index a20ddf89805..a18d802ff7d 100644 --- a/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm +++ b/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm @@ -26,8 +26,10 @@ exposed_mob.apply_damage(0.2*reac_volume, BRUTE, wound_bonus=CANT_WOUND) /datum/reagent/blob/cryogenic_poison/on_mob_life(mob/living/carbon/exposed_mob, seconds_per_tick, times_fired) - exposed_mob.adjustBruteLoss(0.5 * REM * seconds_per_tick, FALSE) - exposed_mob.adjustFireLoss(0.5 * REM * seconds_per_tick, FALSE) - exposed_mob.adjustToxLoss(0.5 * REM * seconds_per_tick, FALSE) - . = 1 - ..() + . = ..() + var/need_mob_update + need_mob_update = exposed_mob.adjustBruteLoss(0.5 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += exposed_mob.adjustFireLoss(0.5 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += exposed_mob.adjustToxLoss(0.5 * REM * seconds_per_tick, updating_health = FALSE) + if(need_mob_update) + . = UPDATE_MOB_HEALTH diff --git a/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm b/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm index 78b67dae650..0b70cc9c741 100644 --- a/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm +++ b/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm @@ -25,9 +25,9 @@ exposed_mob.apply_damage(0.7*reac_volume, TOX) /datum/reagent/blob/regenerative_materia/on_mob_life(mob/living/carbon/metabolizer, seconds_per_tick, times_fired) - metabolizer.adjustToxLoss(1 * REM * seconds_per_tick) - ..() - return TRUE + . = ..() + if(metabolizer.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE)) + return UPDATE_MOB_HEALTH /datum/reagent/blob/regenerative_materia/on_mob_metabolize(mob/living/metabolizer) . = ..() diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index dd5e9a9c661..27a87bee6c2 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -720,11 +720,13 @@ human_bloodbag.visible_message(span_warning("[human_bloodbag] is partially healed by [human_bloodbag == user ? "[human_bloodbag.p_their()]":"[human_bloodbag]'s"] blood magic.")) uses = 0 ratio *= -1 - human_bloodbag.adjustOxyLoss((overall_damage*ratio) * (human_bloodbag.getOxyLoss() / overall_damage), 0) - human_bloodbag.adjustToxLoss((overall_damage*ratio) * (human_bloodbag.getToxLoss() / overall_damage), 0) - human_bloodbag.adjustFireLoss((overall_damage*ratio) * (human_bloodbag.getFireLoss() / overall_damage), 0) - human_bloodbag.adjustBruteLoss((overall_damage*ratio) * (human_bloodbag.getBruteLoss() / overall_damage), 0) - human_bloodbag.updatehealth() + var/need_mob_update = FALSE + need_mob_update += human_bloodbag.adjustOxyLoss((overall_damage*ratio) * (human_bloodbag.getOxyLoss() / overall_damage), updating_health = FALSE) + need_mob_update += human_bloodbag.adjustToxLoss((overall_damage*ratio) * (human_bloodbag.getToxLoss() / overall_damage), updating_health = FALSE) + need_mob_update += human_bloodbag.adjustFireLoss((overall_damage*ratio) * (human_bloodbag.getFireLoss() / overall_damage), updating_health = FALSE) + need_mob_update += human_bloodbag.adjustBruteLoss((overall_damage*ratio) * (human_bloodbag.getBruteLoss() / overall_damage), updating_health = FALSE) + if(need_mob_update) + human_bloodbag.updatehealth() playsound(get_turf(human_bloodbag), 'sound/magic/staff_healing.ogg', 25) new /obj/effect/temp_visual/cult/sparks(get_turf(human_bloodbag)) user.Beam(human_bloodbag, icon_state="sendbeam", time = 15) diff --git a/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm b/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm index 75ee0cd5916..4607d78ff5c 100644 --- a/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm @@ -161,8 +161,11 @@ combo_timer = addtimer(CALLBACK(src, PROC_REF(reset_combo), source), combo_duration, TIMER_STOPPABLE) var/mob/living/second_target_resolved = second_target?.resolve() var/mob/living/third_target_resolved = third_target?.resolve() - target.adjustFireLoss(4) - target.adjustCloneLoss(2) + var/need_mob_update = FALSE + need_mob_update += target.adjustFireLoss(4, updating_health = FALSE) + need_mob_update += target.adjustCloneLoss(2, updating_health = FALSE) + if(need_mob_update) + target.updatehealth() if(target == second_target_resolved || target == third_target_resolved) reset_combo(source) return @@ -171,13 +174,19 @@ if(second_target_resolved) new /obj/effect/temp_visual/cosmic_explosion(get_turf(second_target_resolved)) playsound(get_turf(second_target_resolved), 'sound/magic/cosmic_energy.ogg', 25, FALSE) - second_target_resolved.adjustFireLoss(10) - second_target_resolved.adjustCloneLoss(6) + need_mob_update = FALSE + need_mob_update += second_target_resolved.adjustFireLoss(10, updating_health = FALSE) + need_mob_update += second_target_resolved.adjustCloneLoss(6, updating_health = FALSE) + if(need_mob_update) + target.updatehealth() if(third_target_resolved) new /obj/effect/temp_visual/cosmic_domain(get_turf(third_target_resolved)) playsound(get_turf(third_target_resolved), 'sound/magic/cosmic_energy.ogg', 50, FALSE) - third_target_resolved.adjustFireLoss(20) - third_target_resolved.adjustCloneLoss(12) + need_mob_update = FALSE + need_mob_update += third_target_resolved.adjustFireLoss(20, updating_health = FALSE) + need_mob_update += third_target_resolved.adjustCloneLoss(12, updating_health = FALSE) + if(need_mob_update) + target.updatehealth() if(combo_counter > 3) target.apply_status_effect(/datum/status_effect/star_mark, source) if(target.mind && target.stat != DEAD) diff --git a/code/modules/antagonists/heretic/knowledge/rust_lore.dm b/code/modules/antagonists/heretic/knowledge/rust_lore.dm index 1eeaab69bdb..966134710b4 100644 --- a/code/modules/antagonists/heretic/knowledge/rust_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/rust_lore.dm @@ -126,11 +126,14 @@ return // Heals all damage + Stamina - source.adjustBruteLoss(-2, FALSE) - source.adjustFireLoss(-2, FALSE) - source.adjustToxLoss(-2, FALSE, forced = TRUE) // Slimes are people to - source.adjustOxyLoss(-0.5, FALSE) - source.adjustStaminaLoss(-2) + var/need_mob_update = FALSE + need_mob_update += source.adjustBruteLoss(-2, updating_health = FALSE) + need_mob_update += source.adjustFireLoss(-2, updating_health = FALSE) + need_mob_update += source.adjustToxLoss(-2, updating_health = FALSE, forced = TRUE) // Slimes are people too + need_mob_update += source.adjustOxyLoss(-0.5, updating_health = FALSE) + need_mob_update += source.adjustStaminaLoss(-2, updating_stamina = FALSE) + if(need_mob_update) + source.updatehealth() // Reduces duration of stuns/etc source.AdjustAllImmobility(-0.5 SECONDS) // Heals blood loss @@ -297,11 +300,14 @@ if(!HAS_TRAIT(our_turf, TRAIT_RUSTY)) return - source.adjustBruteLoss(-4, FALSE) - source.adjustFireLoss(-4, FALSE) - source.adjustToxLoss(-4, FALSE, forced = TRUE) - source.adjustOxyLoss(-4, FALSE) - source.adjustStaminaLoss(-20) + var/need_mob_update = FALSE + need_mob_update += source.adjustBruteLoss(-4, updating_health = FALSE) + need_mob_update += source.adjustFireLoss(-4, updating_health = FALSE) + need_mob_update += source.adjustToxLoss(-4, updating_health = FALSE, forced = TRUE) + need_mob_update += source.adjustOxyLoss(-4, updating_health = FALSE) + need_mob_update += source.adjustStaminaLoss(-20, updating_stamina = FALSE) + if(need_mob_update) + source.updatehealth() /** * #Rust spread datum diff --git a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_buff.dm b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_buff.dm index 0d2b67daae8..50aaad96cd8 100644 --- a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_buff.dm +++ b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_buff.dm @@ -27,7 +27,7 @@ /datum/status_effect/unholy_determination/tick(seconds_between_ticks) // The amount we heal of each damage type per tick. If we're missing legs we heal better because we can't dodge. - var/healing_amount = 1 + (2 - owner.usable_legs) + var/healing_amount = (0.4 + (0.8 - owner.usable_legs)) // In softcrit you're, strong enough to stay up. if(owner.health <= owner.crit_threshold && owner.health >= owner.hardcrit_threshold) @@ -48,22 +48,25 @@ if(prob(2)) playsound(owner, pick(GLOB.creepy_ambience), 50, TRUE) - adjust_all_damages(healing_amount) + adjust_all_damages(healing_amount, seconds_between_ticks) adjust_temperature() adjust_bleed_wounds() /* * Heals up all the owner a bit, fire stacks and losebreath included. */ -/datum/status_effect/unholy_determination/proc/adjust_all_damages(amount) +/datum/status_effect/unholy_determination/proc/adjust_all_damages(amount, seconds_between_ticks) owner.adjust_fire_stacks(-1) owner.losebreath = max(owner.losebreath - 0.5, 0) - owner.adjustToxLoss(-amount, FALSE, TRUE) - owner.adjustOxyLoss(-amount, FALSE) - owner.adjustBruteLoss(-amount, FALSE) - owner.adjustFireLoss(-amount) + var/need_mob_update = FALSE + need_mob_update += owner.adjustToxLoss(-amount * seconds_between_ticks, updating_health = FALSE, forced = TRUE) + need_mob_update += owner.adjustOxyLoss(-amount * seconds_between_ticks, updating_health = FALSE) + need_mob_update += owner.adjustBruteLoss(-amount * seconds_between_ticks, updating_health = FALSE) + need_mob_update += owner.adjustFireLoss(-amount * seconds_between_ticks, updating_health = FALSE) + if(need_mob_update) + owner.updatehealth() /* * Adjust the owner's temperature up or down to standard body temperatures. diff --git a/code/modules/antagonists/heretic/magic/nightwatcher_rebirth.dm b/code/modules/antagonists/heretic/magic/nightwatcher_rebirth.dm index 1e65ef88951..64638d7103b 100644 --- a/code/modules/antagonists/heretic/magic/nightwatcher_rebirth.dm +++ b/code/modules/antagonists/heretic/magic/nightwatcher_rebirth.dm @@ -46,11 +46,14 @@ victim.apply_damage(20, BURN) // Heal the caster for every victim damaged - caster.adjustBruteLoss(-10, FALSE) - caster.adjustFireLoss(-10, FALSE) - caster.adjustToxLoss(-10, FALSE) - caster.adjustOxyLoss(-10, FALSE) - caster.adjustStaminaLoss(-10) + var/need_mob_update = FALSE + need_mob_update += caster.adjustBruteLoss(-10, updating_health = FALSE) + need_mob_update += caster.adjustFireLoss(-10, updating_health = FALSE) + need_mob_update += caster.adjustToxLoss(-10, updating_health = FALSE) + need_mob_update += caster.adjustOxyLoss(-10, updating_health = FALSE) + need_mob_update += caster.adjustStaminaLoss(-10, updating_stamina = FALSE) + if(need_mob_update) + caster.updatehealth() /obj/effect/temp_visual/eldritch_smoke icon = 'icons/effects/eldritch.dmi' diff --git a/code/modules/antagonists/heretic/magic/star_touch.dm b/code/modules/antagonists/heretic/magic/star_touch.dm index ba8c2a56391..f2f2c935bbf 100644 --- a/code/modules/antagonists/heretic/magic/star_touch.dm +++ b/code/modules/antagonists/heretic/magic/star_touch.dm @@ -233,16 +233,16 @@ /datum/status_effect/cosmic_beam/proc/on_beam_hit(mob/living/target) if(!istype(target, /mob/living/basic/heretic_summon/star_gazer)) target.AddElement(/datum/element/effect_trail, /obj/effect/forcefield/cosmic_field/fast) - return /// What to process when the beam is connected to a target /datum/status_effect/cosmic_beam/proc/on_beam_tick(mob/living/target) - target.adjustFireLoss(3) - target.adjustCloneLoss(1) - return + var/need_mob_update + need_mob_update = target.adjustFireLoss(3, updating_health = FALSE) + need_mob_update += target.adjustCloneLoss(1, updating_health = FALSE) + if(need_mob_update) + target.updatehealth() /// What to remove when the beam disconnects from a target /datum/status_effect/cosmic_beam/proc/on_beam_release(mob/living/target) if(!istype(target, /mob/living/basic/heretic_summon/star_gazer)) target.RemoveElement(/datum/element/effect_trail, /obj/effect/forcefield/cosmic_field/fast) - return diff --git a/code/modules/antagonists/revenant/revenant_blight.dm b/code/modules/antagonists/revenant/revenant_blight.dm index 64bd6ce03bb..c56df7bd4ea 100644 --- a/code/modules/antagonists/revenant/revenant_blight.dm +++ b/code/modules/antagonists/revenant/revenant_blight.dm @@ -31,20 +31,23 @@ return if(!finalstage) + var/need_mob_update = FALSE if(affected_mob.body_position == LYING_DOWN && SPT_PROB(3 * stage, seconds_per_tick)) cure() return FALSE if(SPT_PROB(1.5 * stage, seconds_per_tick)) to_chat(affected_mob, span_revennotice("You suddenly feel [pick("sick and tired", "disoriented", "tired and confused", "nauseated", "faint", "dizzy")]...")) affected_mob.adjust_confusion(8 SECONDS) - affected_mob.adjustStaminaLoss(20, FALSE) + need_mob_update += affected_mob.adjustStaminaLoss(20, updating_stamina = FALSE) new /obj/effect/temp_visual/revenant(affected_mob.loc) if(stagedamage < stage) stagedamage++ - affected_mob.adjustToxLoss(1 * stage * seconds_per_tick, FALSE) //should, normally, do about 30 toxin damage. + need_mob_update += affected_mob.adjustToxLoss(1 * stage * seconds_per_tick, updating_health = FALSE) //should, normally, do about 30 toxin damage. new /obj/effect/temp_visual/revenant(affected_mob.loc) if(SPT_PROB(25, seconds_per_tick)) - affected_mob.adjustStaminaLoss(stage, FALSE) + need_mob_update += affected_mob.adjustStaminaLoss(stage, updating_stamina = FALSE) + if(need_mob_update) + affected_mob.updatehealth() switch(stage) if(2) @@ -60,7 +63,7 @@ if(!finalstage) finalstage = TRUE to_chat(affected_mob, span_revenbignotice("You feel like [pick("nothing's worth it anymore", "nobody ever needed your help", "nothing you did mattered", "everything you tried to do was worthless")].")) - affected_mob.adjustStaminaLoss(22.5 * seconds_per_tick, FALSE) + affected_mob.adjustStaminaLoss(22.5 * seconds_per_tick, updating_stamina = FALSE) new /obj/effect/temp_visual/revenant(affected_mob.loc) if(affected_mob.dna && affected_mob.dna.species) affected_mob.dna.species.handle_mutant_bodyparts(affected_mob,"#1d2953") diff --git a/code/modules/bitrunning/components/netpod_healing.dm b/code/modules/bitrunning/components/netpod_healing.dm index fc7de89bcf3..2e61b737af5 100644 --- a/code/modules/bitrunning/components/netpod_healing.dm +++ b/code/modules/bitrunning/components/netpod_healing.dm @@ -45,15 +45,17 @@ qdel(src) return - owner.adjustBruteLoss(-brute_heal * seconds_per_tick, updating_health = FALSE) - owner.adjustFireLoss(-burn_heal * seconds_per_tick, updating_health = FALSE) - owner.adjustToxLoss(-toxin_heal * seconds_per_tick, updating_health = FALSE, forced = TRUE) - owner.adjustCloneLoss(-clone_heal * seconds_per_tick, updating_health = FALSE) + var/need_mob_update = FALSE + need_mob_update += owner.adjustBruteLoss(-brute_heal * seconds_per_tick, updating_health = FALSE) + need_mob_update += owner.adjustFireLoss(-burn_heal * seconds_per_tick, updating_health = FALSE) + need_mob_update += owner.adjustToxLoss(-toxin_heal * seconds_per_tick, updating_health = FALSE, forced = TRUE) + need_mob_update += owner.adjustCloneLoss(-clone_heal * seconds_per_tick, updating_health = FALSE) if(owner.blood_volume < BLOOD_VOLUME_NORMAL) owner.blood_volume += blood_heal * seconds_per_tick - owner.updatehealth() + if(need_mob_update) + owner.updatehealth() /datum/status_effect/embryonic id = "embryonic" diff --git a/code/modules/bitrunning/server/util.dm b/code/modules/bitrunning/server/util.dm index 1d35e86de50..c4f1319cd12 100644 --- a/code/modules/bitrunning/server/util.dm +++ b/code/modules/bitrunning/server/util.dm @@ -58,10 +58,10 @@ "health" = creature.health, "name" = creature.name, "pilot" = pilot, - "brute" = creature.get_damage_amount(BRUTE), - "burn" = creature.get_damage_amount(BURN), - "tox" = creature.get_damage_amount(TOX), - "oxy" = creature.get_damage_amount(OXY), + "brute" = creature.get_current_damage_of_type(BRUTE), + "burn" = creature.get_current_damage_of_type(BURN), + "tox" = creature.get_current_damage_of_type(TOX), + "oxy" = creature.get_current_damage_of_type(OXY), )) return hosted_avatars diff --git a/code/modules/library/bibles.dm b/code/modules/library/bibles.dm index 7a69fa27957..3cfc9c8b76b 100644 --- a/code/modules/library/bibles.dm +++ b/code/modules/library/bibles.dm @@ -223,7 +223,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list( var/list/hurt_limbs = built_in_his_image.get_damaged_bodyparts(1, 1, BODYTYPE_ORGANIC) if(length(hurt_limbs)) for(var/obj/item/bodypart/affecting as anything in hurt_limbs) - if(affecting.heal_damage(heal_amt, heal_amt, BODYTYPE_ORGANIC)) + if(affecting.heal_damage(heal_amt, heal_amt, required_bodytype = BODYTYPE_ORGANIC)) built_in_his_image.update_damage_overlays() built_in_his_image.visible_message(span_notice("[user] heals [built_in_his_image] with the power of [deity_name]!")) to_chat(built_in_his_image, span_boldnotice("May the power of [deity_name] compel you to be healed!")) diff --git a/code/modules/mob/living/basic/health_adjustment.dm b/code/modules/mob/living/basic/health_adjustment.dm index 6355f809cf4..e453bf7306e 100644 --- a/code/modules/mob/living/basic/health_adjustment.dm +++ b/code/modules/mob/living/basic/health_adjustment.dm @@ -5,18 +5,16 @@ * * amount The amount that will be used to adjust the mob's health * * updating_health If the mob's health should be immediately updated to the new value * * forced If we should force update the adjustment of the mob's health no matter the restrictions, like GODMODE + * returns the net change in bruteloss after applying the damage amount */ /mob/living/basic/proc/adjust_health(amount, updating_health = TRUE, forced = FALSE) . = FALSE if(forced || !(status_flags & GODMODE)) + . = bruteloss // bruteloss value before applying damage bruteloss = round(clamp(bruteloss + amount, 0, maxHealth * 2), DAMAGE_PRECISION) if(updating_health) updatehealth() - . = amount - if(ckey || stat) - return - //if(AIStatus == AI_IDLE) - // toggle_ai(AI_ON) + . -= bruteloss /mob/living/basic/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) if(forced) @@ -42,16 +40,18 @@ else if(damage_coeff[TOX]) . = adjust_health(amount * damage_coeff[TOX] * CONFIG_GET(number/damage_multiplier), updating_health, forced) -/mob/living/basic/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE) +/mob/living/basic/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype) if(forced) . = adjust_health(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced) else if(damage_coeff[CLONE]) . = adjust_health(amount * damage_coeff[CLONE] * CONFIG_GET(number/damage_multiplier), updating_health, forced) /mob/living/basic/adjustStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype) + . = staminaloss if(forced) staminaloss = max(0, min(BASIC_MOB_MAX_STAMINALOSS, staminaloss + amount)) else staminaloss = max(0, min(BASIC_MOB_MAX_STAMINALOSS, staminaloss + (amount * damage_coeff[STAMINA]))) if(updating_stamina) update_stamina() + . -= staminaloss diff --git a/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat_actions.dm b/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat_actions.dm index 7a30f88b4c2..e617ae0a670 100644 --- a/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat_actions.dm +++ b/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat_actions.dm @@ -221,31 +221,31 @@ taste_description = "something funny" overdose_threshold = 20 -/datum/reagent/rat_spit/on_mob_metabolize(mob/living/L) - ..() - if(HAS_TRAIT(L, TRAIT_AGEUSIA)) +/datum/reagent/rat_spit/on_mob_metabolize(mob/living/affected_mob) + . = ..() + if(HAS_TRAIT(affected_mob, TRAIT_AGEUSIA)) return - to_chat(L, span_notice("This food has a funny taste!")) + to_chat(affected_mob, span_notice("This food has a funny taste!")) -/datum/reagent/rat_spit/overdose_start(mob/living/M) - ..() - var/mob/living/carbon/victim = M +/datum/reagent/rat_spit/overdose_start(mob/living/affected_mob) + . = ..() + var/mob/living/carbon/victim = affected_mob if (istype(victim) && !(FACTION_RAT in victim.faction)) to_chat(victim, span_userdanger("With this last sip, you feel your body convulsing horribly from the contents you've ingested. As you contemplate your actions, you sense an awakened kinship with rat-kind and their newly risen leader!")) victim.faction |= FACTION_RAT victim.vomit(VOMIT_CATEGORY_DEFAULT) metabolization_rate = 10 * REAGENTS_METABOLISM -/datum/reagent/rat_spit/on_mob_life(mob/living/carbon/C) +/datum/reagent/rat_spit/on_mob_life(mob/living/carbon/affected_mob) + . = ..() if(prob(15)) - to_chat(C, span_notice("You feel queasy!")) - C.adjust_disgust(3) + to_chat(affected_mob, span_notice("You feel queasy!")) + affected_mob.adjust_disgust(3) else if(prob(10)) - to_chat(C, span_warning("That food does not sit up well!")) - C.adjust_disgust(5) + to_chat(affected_mob, span_warning("That food does not sit up well!")) + affected_mob.adjust_disgust(5) else if(prob(5)) - C.vomit(VOMIT_CATEGORY_DEFAULT) - return ..() + affected_mob.vomit(VOMIT_CATEGORY_DEFAULT) /datum/pet_command/protect_owner/glockroach protect_behavior = /datum/ai_behavior/basic_ranged_attack/glockroach diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index 10cff8c19ac..9918a21b4f6 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -552,7 +552,7 @@ /obj/item/organ/internal/brain/apply_organ_damage(damage_amount, maximum = maxHealth, required_organ_flag = NONE) . = ..() if(!owner) - return + return FALSE if(damage >= 60) owner.add_mood_event("brain_damage", /datum/mood_event/brain_damage) else diff --git a/code/modules/mob/living/carbon/alien/damage_procs.dm b/code/modules/mob/living/carbon/alien/damage_procs.dm index 8861a55d993..5dbffda9673 100644 --- a/code/modules/mob/living/carbon/alien/damage_procs.dm +++ b/code/modules/mob/living/carbon/alien/damage_procs.dm @@ -11,5 +11,5 @@ return FALSE ///aliens are immune to stamina damage. -/mob/living/carbon/alien/setStaminaLoss(amount, updating_stamina = 1) +/mob/living/carbon/alien/setStaminaLoss(amount, updating_stamina = 1, forced = FALSE, required_biotype) return FALSE diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index de77200f940..ebb7a70183f 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -467,17 +467,18 @@ playsound(get_turf(src), 'sound/effects/splat.ogg', 50, TRUE) + var/need_mob_update = FALSE var/turf/location = get_turf(src) if(!blood) adjust_nutrition(-lost_nutrition) - adjustToxLoss(-3) + need_mob_update += adjustToxLoss(-3, updating_health = FALSE) for(var/i = 0 to distance) if(blood) if(location) add_splatter_floor(location) if(vomit_flags & MOB_VOMIT_HARM) - adjustBruteLoss(3) + need_mob_update += adjustBruteLoss(3, updating_health = FALSE) else if(location) location.add_vomit_floor(src, vomit_type, vomit_flags, purge_ratio) // call purge when doing detoxicfication to pump more chems out of the stomach. @@ -485,6 +486,8 @@ location = get_step(location, starting_dir) if (location?.is_blocked_turf()) break + if(need_mob_update) // so we only have to call updatehealth() once as opposed to n times + updatehealth() return TRUE diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 789a459b492..8cb32613da8 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -768,7 +768,7 @@ amount = min(amount, 0) //Prevents oxy damage but not healing . = ..() - check_passout(.) + check_passout() /mob/living/carbon/proc/get_interaction_efficiency(zone) var/obj/item/bodypart/limb = get_bodypart(zone) @@ -777,12 +777,12 @@ /mob/living/carbon/setOxyLoss(amount, updating_health = TRUE, forced, required_biotype, required_respiration_type) . = ..() - check_passout(.) + check_passout() /** * Check to see if we should be passed out from oyxloss */ -/mob/living/carbon/proc/check_passout(oxyloss) +/mob/living/carbon/proc/check_passout() if(!isnum(oxyloss)) return if(oxyloss <= 50) diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index 6e0c7cef867..963f064286b 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -59,37 +59,41 @@ if(!forced && (status_flags & GODMODE)) return FALSE if(amount > 0) - take_overall_damage(brute = amount, updating_health = updating_health, required_bodytype = required_bodytype) + . = take_overall_damage(brute = amount, updating_health = updating_health, forced = forced, required_bodytype = required_bodytype) else - heal_overall_damage(brute = abs(amount), required_bodytype = required_bodytype, updating_health = updating_health) - return amount + . = heal_overall_damage(brute = abs(amount), required_bodytype = required_bodytype, updating_health = updating_health, forced = forced) /mob/living/carbon/setBruteLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) + if(!forced && (status_flags & GODMODE)) + return FALSE var/current = getBruteLoss() var/diff = amount - current if(!diff) - return - adjustBruteLoss(diff, updating_health, forced, required_bodytype) + return FALSE + return adjustBruteLoss(diff, updating_health, forced, required_bodytype) /mob/living/carbon/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) if(!forced && (status_flags & GODMODE)) return FALSE if(amount > 0) - take_overall_damage(burn = amount, updating_health = updating_health, required_bodytype = required_bodytype) + . = take_overall_damage(burn = amount, updating_health = updating_health, forced = forced, required_bodytype = required_bodytype) else - heal_overall_damage(burn = abs(amount), required_bodytype = required_bodytype, updating_health = updating_health) - return amount + . = heal_overall_damage(burn = abs(amount), required_bodytype = required_bodytype, updating_health = updating_health, forced = forced) /mob/living/carbon/setFireLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) + if(!forced && (status_flags & GODMODE)) + return FALSE var/current = getFireLoss() var/diff = amount - current if(!diff) - return - adjustFireLoss(diff, updating_health, forced, required_bodytype) + return FALSE + return adjustFireLoss(diff, updating_health, forced, required_bodytype) -/mob/living/carbon/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype = MOB_ORGANIC) +/mob/living/carbon/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL) + if(!forced && (status_flags & GODMODE)) + return FALSE if(!forced && !(mob_biotypes & required_biotype)) - return + return FALSE if(!forced && HAS_TRAIT(src, TRAIT_TOXINLOVER)) //damage becomes healing and healing becomes damage amount = -amount if(HAS_TRAIT(src, TRAIT_TOXIMMUNE)) //Prevents toxin damage, but not healing @@ -98,11 +102,11 @@ blood_volume = max(blood_volume - (5*amount), 0) else blood_volume = max(blood_volume - amount, 0) - else if(HAS_TRAIT(src, TRAIT_TOXIMMUNE)) //Prevents toxin damage, but not healing + else if(!forced && HAS_TRAIT(src, TRAIT_TOXIMMUNE)) //Prevents toxin damage, but not healing amount = min(amount, 0) return ..() -/mob/living/carbon/adjustStaminaLoss(amount, updating_stamina, forced, required_biotype) +/mob/living/carbon/adjustStaminaLoss(amount, updating_stamina, forced, required_biotype = ALL) . = ..() if(amount > 0) stam_regen_start_time = world.time + STAMINA_REGEN_BLOCK_TIME @@ -115,14 +119,16 @@ * * amount - damage to be done * * maximum - currently an arbitrarily large number, can be set so as to limit damage * * required_organ_flag - targets only a specific organ type if set to ORGAN_ORGANIC or ORGAN_ROBOTIC + * + * Returns: The net change in damage from apply_organ_damage() */ /mob/living/carbon/adjustOrganLoss(slot, amount, maximum, required_organ_flag = NONE) var/obj/item/organ/affected_organ = get_organ_slot(slot) if(!affected_organ || (status_flags & GODMODE)) - return + return FALSE if(required_organ_flag && !(affected_organ.organ_flags & required_organ_flag)) - return - affected_organ.apply_organ_damage(amount, maximum) + return FALSE + return affected_organ.apply_organ_damage(amount, maximum) /** * If an organ exists in the slot requested, and we are capable of taking damage (we don't have [GODMODE] on), call the set damage proc on that organ, which can @@ -132,16 +138,18 @@ * * slot - organ slot, like [ORGAN_SLOT_HEART] * * amount - damage to be set to * * required_organ_flag - targets only a specific organ type if set to ORGAN_ORGANIC or ORGAN_ROBOTIC + * + * Returns: The net change in damage from set_organ_damage() */ /mob/living/carbon/setOrganLoss(slot, amount, required_organ_flag = NONE) var/obj/item/organ/affected_organ = get_organ_slot(slot) if(!affected_organ || (status_flags & GODMODE)) - return + return FALSE if(required_organ_flag && !(affected_organ.organ_flags & required_organ_flag)) - return + return FALSE if(affected_organ.damage == amount) - return - affected_organ.set_organ_damage(amount) + return FALSE + return affected_organ.set_organ_damage(amount) /** * If an organ exists in the slot requested, return the amount of damage that organ has @@ -200,14 +208,16 @@ * It automatically updates health status */ /mob/living/carbon/heal_bodypart_damage(brute = 0, burn = 0, updating_health = TRUE, required_bodytype = NONE, target_zone = null) + . = FALSE var/list/obj/item/bodypart/parts = get_damaged_bodyparts(brute, burn, required_bodytype, target_zone) if(!parts.len) return + var/obj/item/bodypart/picked = pick(parts) - var/damage_calculator = picked.get_damage(TRUE) //heal_damage returns update status T/F instead of amount healed so we dance gracefully around this - if(picked.heal_damage(brute, burn, required_bodytype)) + var/damage_calculator = picked.get_damage() //heal_damage returns update status T/F instead of amount healed so we dance gracefully around this + if(picked.heal_damage(abs(brute), abs(burn), required_bodytype = required_bodytype)) update_damage_overlays() - return max(damage_calculator - picked.get_damage(TRUE), 0) + return (damage_calculator - picked.get_damage()) /** @@ -218,15 +228,25 @@ * It automatically updates health status */ /mob/living/carbon/take_bodypart_damage(brute = 0, burn = 0, updating_health = TRUE, required_bodytype, check_armor = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = NONE) + . = FALSE + if(status_flags & GODMODE) + return var/list/obj/item/bodypart/parts = get_damageable_bodyparts(required_bodytype) if(!parts.len) return + var/obj/item/bodypart/picked = pick(parts) - if(picked.receive_damage(brute, burn, check_armor ? run_armor_check(picked, (brute ? MELEE : burn ? FIRE : null)) : FALSE, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness)) + var/damage_calculator = picked.get_damage() + if(picked.receive_damage(abs(brute), abs(burn), check_armor ? run_armor_check(picked, (brute ? MELEE : burn ? FIRE : null)) : FALSE, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness)) update_damage_overlays() + return (damage_calculator - picked.get_damage()) + +/mob/living/carbon/heal_overall_damage(brute = 0, burn = 0, stamina = 0, required_bodytype, updating_health = TRUE, forced = FALSE) + . = FALSE + // treat negative args as positive + brute = abs(brute) + burn = abs(burn) -///Heal MANY bodyparts, in random order -/mob/living/carbon/heal_overall_damage(brute = 0, burn = 0, stamina = 0, required_bodytype, updating_health = TRUE) var/list/obj/item/bodypart/parts = get_damaged_bodyparts(brute, burn, required_bodytype) var/update = NONE @@ -235,25 +255,35 @@ var/brute_was = picked.brute_dam var/burn_was = picked.burn_dam + . += picked.get_damage() + + update |= picked.heal_damage(brute, burn, updating_health = FALSE, forced = forced, required_bodytype = required_bodytype) - update |= picked.heal_damage(brute, burn, required_bodytype, FALSE) + . -= picked.get_damage() // return the net amount of damage healed brute = round(brute - (brute_was - picked.brute_dam), DAMAGE_PRECISION) burn = round(burn - (burn_was - picked.burn_dam), DAMAGE_PRECISION) parts -= picked + + if(!.) // no change? no need to update anything + return + if(updating_health) updatehealth() if(update) update_damage_overlays() -/// damage MANY bodyparts, in random order -/mob/living/carbon/take_overall_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE, required_bodytype) - if(status_flags & GODMODE) - return //godmode +/mob/living/carbon/take_overall_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE, forced = FALSE, required_bodytype) + . = FALSE + if(!forced && (status_flags & GODMODE)) + return + // treat negative args as positive + brute = abs(brute) + burn = abs(burn) var/list/obj/item/bodypart/parts = get_damageable_bodyparts(required_bodytype) - var/update = 0 + var/update = NONE while(parts.len && (brute > 0 || burn > 0)) var/obj/item/bodypart/picked = pick(parts) var/brute_per_part = round(brute/parts.len, DAMAGE_PRECISION) @@ -261,14 +291,21 @@ var/brute_was = picked.brute_dam var/burn_was = picked.burn_dam + . += picked.get_damage() + // disabling wounds from these for now cuz your entire body snapping cause your heart stopped would suck + update |= picked.receive_damage(brute_per_part, burn_per_part, blocked = FALSE, updating_health = FALSE, forced = forced, required_bodytype = required_bodytype, wound_bonus = CANT_WOUND) - update |= picked.receive_damage(brute_per_part, burn_per_part, FALSE, updating_health, required_bodytype, wound_bonus = CANT_WOUND) // disabling wounds from these for now cuz your entire body snapping cause your heart stopped would suck + . -= picked.get_damage() // return the net amount of damage healed brute = round(brute - (picked.brute_dam - brute_was), DAMAGE_PRECISION) burn = round(burn - (picked.burn_dam - burn_was), DAMAGE_PRECISION) parts -= picked + + if(!.) // no change? no need to update anything + return + if(updating_health) updatehealth() if(update) diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index 6a8fc967cb5..4fbd3062351 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -1456,7 +1456,7 @@ GLOBAL_LIST_EMPTY(features_by_species) var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.brain_mod H.adjustOrganLoss(ORGAN_SLOT_BRAIN, damage_amount) SEND_SIGNAL(H, COMSIG_MOB_AFTER_APPLY_DAMAGE, damage, damagetype, def_zone, blocked, wound_bonus, bare_wound_bonus, sharpness, attack_direction, attacking_item) - return 1 + return TRUE /datum/species/proc/on_hit(obj/projectile/P, mob/living/carbon/human/H) // called when hit by a projectile diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index 3703f2527ac..bab1bae6e36 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -43,26 +43,29 @@ ) return ..() -/datum/species/pod/spec_life(mob/living/carbon/human/H, seconds_per_tick, times_fired) +/datum/species/pod/spec_life(mob/living/carbon/human/podperson, seconds_per_tick, times_fired) . = ..() - if(H.stat == DEAD) + if(podperson.stat == DEAD) return var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing - if(isturf(H.loc)) //else, there's considered to be no light - var/turf/T = H.loc - light_amount = min(1, T.get_lumcount()) - 0.5 - H.adjust_nutrition(5 * light_amount * seconds_per_tick) + if(isturf(podperson.loc)) //else, there's considered to be no light + var/turf/turf_loc = podperson.loc + light_amount = min(1, turf_loc.get_lumcount()) - 0.5 + podperson.adjust_nutrition(5 * light_amount * seconds_per_tick) if(light_amount > 0.2) //if there's enough light, heal - H.heal_overall_damage(brute = 0.5 * seconds_per_tick, burn = 0.5 * seconds_per_tick, required_bodytype = BODYTYPE_ORGANIC) - H.adjustToxLoss(-0.5 * seconds_per_tick) - H.adjustOxyLoss(-0.5 * seconds_per_tick) - - if(H.nutrition > NUTRITION_LEVEL_ALMOST_FULL) //don't make podpeople fat because they stood in the sun for too long - H.set_nutrition(NUTRITION_LEVEL_ALMOST_FULL) - - if(H.nutrition < NUTRITION_LEVEL_STARVING + 50) - H.take_overall_damage(brute = 1 * seconds_per_tick, required_bodytype = BODYTYPE_ORGANIC) + var/need_mob_update = FALSE + need_mob_update += podperson.heal_overall_damage(brute = 0.5 * seconds_per_tick, burn = 0.5 * seconds_per_tick, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) + need_mob_update += podperson.adjustToxLoss(-0.5 * seconds_per_tick, updating_health = FALSE) + need_mob_update += podperson.adjustOxyLoss(-0.5 * seconds_per_tick, updating_health = FALSE) + if(need_mob_update) + podperson.updatehealth() + + if(podperson.nutrition > NUTRITION_LEVEL_ALMOST_FULL) //don't make podpeople fat because they stood in the sun for too long + podperson.set_nutrition(NUTRITION_LEVEL_ALMOST_FULL) + + if(podperson.nutrition < NUTRITION_LEVEL_STARVING + 50) + podperson.take_overall_damage(brute = 1 * seconds_per_tick, required_bodytype = BODYTYPE_ORGANIC) /datum/species/pod/handle_chemical(datum/reagent/chem, mob/living/carbon/human/affected, seconds_per_tick, times_fired) . = ..() 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 d24e5f3d272..46d507e4999 100644 --- a/code/modules/mob/living/carbon/human/species_types/vampire.dm +++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm @@ -44,10 +44,13 @@ /datum/species/vampire/spec_life(mob/living/carbon/human/vampire, seconds_per_tick, times_fired) . = ..() if(istype(vampire.loc, /obj/structure/closet/crate/coffin)) - vampire.heal_overall_damage(brute = 2 * seconds_per_tick, burn = 2 * seconds_per_tick, required_bodytype = BODYTYPE_ORGANIC) - vampire.adjustToxLoss(-2 * seconds_per_tick) - vampire.adjustOxyLoss(-2 * seconds_per_tick) - vampire.adjustCloneLoss(-2 * seconds_per_tick) + var/need_mob_update = FALSE + need_mob_update += vampire.heal_overall_damage(brute = 2 * seconds_per_tick, burn = 2 * seconds_per_tick, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) + need_mob_update += vampire.adjustToxLoss(-2 * seconds_per_tick, updating_health = FALSE,) + need_mob_update += vampire.adjustOxyLoss(-2 * seconds_per_tick, updating_health = FALSE,) + need_mob_update += vampire.adjustCloneLoss(-2 * seconds_per_tick, updating_health = FALSE,) + if(need_mob_update) + vampire.updatehealth() return vampire.blood_volume -= 0.125 * seconds_per_tick if(vampire.blood_volume <= BLOOD_VOLUME_SURVIVE) 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 d8b2125aa64..273d7c83422 100644 --- a/code/modules/mob/living/carbon/human/species_types/zombies.dm +++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm @@ -151,24 +151,27 @@ if(.) COOLDOWN_START(src, regen_cooldown, REGENERATION_DELAY) -/datum/species/zombie/infectious/spec_life(mob/living/carbon/C, seconds_per_tick, times_fired) +/datum/species/zombie/infectious/spec_life(mob/living/carbon/carbon_mob, seconds_per_tick, times_fired) . = ..() - C.set_combat_mode(TRUE) // THE SUFFERING MUST FLOW + carbon_mob.set_combat_mode(TRUE) // THE SUFFERING MUST FLOW //Zombies never actually die, they just fall down until they regenerate enough to rise back up. //They must be restrained, beheaded or gibbed to stop being a threat. if(COOLDOWN_FINISHED(src, regen_cooldown)) var/heal_amt = heal_rate - if(HAS_TRAIT(C, TRAIT_CRITICAL_CONDITION)) + if(HAS_TRAIT(carbon_mob, TRAIT_CRITICAL_CONDITION)) heal_amt *= 2 - C.heal_overall_damage(heal_amt * seconds_per_tick, heal_amt * seconds_per_tick) - C.adjustToxLoss(-heal_amt * seconds_per_tick) - for(var/i in C.all_wounds) + var/need_mob_update = FALSE + need_mob_update += carbon_mob.heal_overall_damage(heal_amt * seconds_per_tick, heal_amt * seconds_per_tick, updating_health = FALSE) + need_mob_update += carbon_mob.adjustToxLoss(-heal_amt * seconds_per_tick, updating_health = FALSE) + if(need_mob_update) + carbon_mob.updatehealth() + for(var/i in carbon_mob.all_wounds) var/datum/wound/iter_wound = i if(SPT_PROB(2-(iter_wound.severity/2), seconds_per_tick)) iter_wound.remove_wound() - if(!HAS_TRAIT(C, TRAIT_CRITICAL_CONDITION) && SPT_PROB(2, seconds_per_tick)) - playsound(C, pick(spooks), 50, TRUE, 10) + if(!HAS_TRAIT(carbon_mob, TRAIT_CRITICAL_CONDITION) && SPT_PROB(2, seconds_per_tick)) + playsound(carbon_mob, pick(spooks), 50, TRUE, 10) //Congrats you somehow died so hard you stopped being a zombie /datum/species/zombie/infectious/spec_death(gibbed, mob/living/carbon/C) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 990f27f0707..44ffab1196e 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -37,9 +37,8 @@ if(getStaminaLoss() > 0 && stam_regen_start_time <= world.time) adjustStaminaLoss(-INFINITY) - var/bprv = handle_bodyparts(seconds_per_tick, times_fired) - if(bprv & BODYPART_LIFE_UPDATE_HEALTH) - updatehealth() + + handle_bodyparts(seconds_per_tick, times_fired) if(. && mind) //. == not dead for(var/key in mind.addiction_points) @@ -410,10 +409,13 @@ //-- NITRIUM --// if(nitrium_pp) + var/need_mob_update = FALSE if(nitrium_pp > 0.5) - adjustFireLoss(nitrium_pp * 0.15) + need_mob_update += adjustFireLoss(nitrium_pp * 0.15, updating_health = FALSE) if(nitrium_pp > 5) - adjustToxLoss(nitrium_pp * 0.05) + need_mob_update += adjustToxLoss(nitrium_pp * 0.05, updating_health = FALSE) + if(need_mob_update) + updatehealth() // Handle chemical euphoria mood event, caused by N2O. if (n2o_euphoria == EUPHORIA_ACTIVE) @@ -757,7 +759,7 @@ if(HAS_TRAIT(src, TRAIT_STABLELIVER) || HAS_TRAIT(src, TRAIT_LIVERLESS_METABOLISM)) return - adjustToxLoss(0.6 * seconds_per_tick, TRUE, TRUE) + adjustToxLoss(0.6 * seconds_per_tick, forced = TRUE) adjustOrganLoss(pick(ORGAN_SLOT_HEART, ORGAN_SLOT_LUNGS, ORGAN_SLOT_STOMACH, ORGAN_SLOT_EYES, ORGAN_SLOT_EARS), 0.5* seconds_per_tick) /mob/living/carbon/proc/undergoing_liver_failure() @@ -814,6 +816,7 @@ var/obj/item/organ/internal/heart/heart = get_organ_slot(ORGAN_SLOT_HEART) if(!istype(heart)) - return + return FALSE heart.beating = !status + return TRUE diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index dfae5d2baf1..9daab06a5a6 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -53,7 +53,7 @@ return adjustStaminaLoss(damage) /// return the damage amount for the type given -/mob/living/proc/get_damage_amount(damagetype = BRUTE) +/mob/living/proc/get_current_damage_of_type(damagetype = BRUTE) switch(damagetype) if(BRUTE) return getBruteLoss() @@ -163,132 +163,157 @@ /mob/living/proc/getBruteLoss() return bruteloss -/mob/living/proc/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) - SEND_SIGNAL(src, COMSIG_MOB_LOSS_BRUTE, amount) //SKYRAT EDIT ADDITION +/mob/living/proc/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL) if(!forced && (status_flags & GODMODE)) return FALSE + . = bruteloss bruteloss = clamp((bruteloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) + . -= bruteloss + if(!.) // no change, no need to update + return FALSE if(updating_health) updatehealth() - return amount -/mob/living/proc/setBruteLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) + +/mob/living/proc/setBruteLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL) if(!forced && (status_flags & GODMODE)) - return + return FALSE . = bruteloss bruteloss = amount + + if(!.) // no change, no need to update + return FALSE if(updating_health) updatehealth() + . -= bruteloss /mob/living/proc/getOxyLoss() return oxyloss -/mob/living/proc/adjustOxyLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype, required_respiration_type = ALL) - - SEND_SIGNAL(src, COMSIG_MOB_LOSS_OXY, amount) //SKYRAT EDIT ADDITION +/mob/living/proc/adjustOxyLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL, required_respiration_type = ALL) if(!forced) if(status_flags & GODMODE) - return + return FALSE var/obj/item/organ/internal/lungs/affected_lungs = get_organ_slot(ORGAN_SLOT_LUNGS) if(isnull(affected_lungs)) if(!(mob_respiration_type & required_respiration_type)) // if the mob has no lungs, use mob_respiration_type - return + return FALSE else if(!(affected_lungs.respiration_type & required_respiration_type)) // otherwise use the lungs' respiration_type - return - + return FALSE . = oxyloss oxyloss = clamp((oxyloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) + . -= oxyloss + if(!.) // no change, no need to update + return FALSE if(updating_health) updatehealth() - -/mob/living/proc/setOxyLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype, required_respiration_type = ALL) +/mob/living/proc/setOxyLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL, required_respiration_type = ALL) if(!forced) if(status_flags & GODMODE) - return + return FALSE var/obj/item/organ/internal/lungs/affected_lungs = get_organ_slot(ORGAN_SLOT_LUNGS) if(isnull(affected_lungs)) if(!(mob_respiration_type & required_respiration_type)) - return + return FALSE else if(!(affected_lungs.respiration_type & required_respiration_type)) - return - + return FALSE . = oxyloss oxyloss = amount + . -= oxyloss + if(!.) // no change, no need to update + return FALSE if(updating_health) updatehealth() - /mob/living/proc/getToxLoss() return toxloss -/mob/living/proc/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype) - SEND_SIGNAL(src, COMSIG_MOB_LOSS_TOX, amount) //SKYRAT EDIT ADDITION +/mob/living/proc/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL) if(!forced && (status_flags & GODMODE)) return FALSE if(!forced && !(mob_biotypes & required_biotype)) - return + return FALSE + . = toxloss toxloss = clamp((toxloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) + . -= toxloss + if(!.) // no change, no need to update + return FALSE if(updating_health) updatehealth() - return amount -/mob/living/proc/setToxLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype) +/mob/living/proc/setToxLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL) if(!forced && (status_flags & GODMODE)) return FALSE if(!forced && !(mob_biotypes & required_biotype)) - return + return FALSE + . = toxloss toxloss = amount + . -= toxloss + if(!.) // no change, no need to update + return FALSE if(updating_health) updatehealth() - return amount /mob/living/proc/getFireLoss() return fireloss -/mob/living/proc/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) - SEND_SIGNAL(src, COMSIG_MOB_LOSS_FIRE, amount) //SKYRAT EDIT ADDITION +/mob/living/proc/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL) if(!forced && (status_flags & GODMODE)) return FALSE + . = fireloss fireloss = clamp((fireloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) + . -= fireloss + if(!.) // no change, no need to update + return FALSE if(updating_health) updatehealth() - return amount -/mob/living/proc/setFireLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) +/mob/living/proc/setFireLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL) if(!forced && (status_flags & GODMODE)) - return + return FALSE . = fireloss fireloss = amount + . -= fireloss + if(!.) // no change, no need to update + return FALSE if(updating_health) updatehealth() /mob/living/proc/getCloneLoss() return cloneloss -/mob/living/proc/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype) - SEND_SIGNAL(src, COMSIG_MOB_LOSS_CLONE, amount) //SKYRAT EDIT ADDITION +/mob/living/proc/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL) if(!forced && ( (status_flags & GODMODE) || HAS_TRAIT(src, TRAIT_NOCLONELOSS)) ) return FALSE + if(!forced && !(mob_biotypes & required_biotype)) + return FALSE + . = cloneloss cloneloss = clamp((cloneloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) + . -= cloneloss + if(!.) // no change, no need to update + return FALSE if(updating_health) updatehealth() - return amount -/mob/living/proc/setCloneLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype) +/mob/living/proc/setCloneLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL) if(!forced && ( (status_flags & GODMODE) || HAS_TRAIT(src, TRAIT_NOCLONELOSS)) ) return FALSE + if(!forced && !(mob_biotypes & required_biotype)) + return FALSE + . = cloneloss cloneloss = amount + . -= cloneloss + if(!.) // no change, no need to update + return FALSE if(updating_health) updatehealth() - return amount /mob/living/proc/adjustOrganLoss(slot, amount, maximum, required_organ_flag) - SEND_SIGNAL(src, COMSIG_MOB_LOSS_ORGAN, slot, amount) //SKYRAT EDIT ADDITION return /mob/living/proc/setOrganLoss(slot, amount, maximum, required_organ_flag) @@ -300,65 +325,79 @@ /mob/living/proc/getStaminaLoss() return staminaloss -/mob/living/proc/adjustStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype) +/mob/living/proc/adjustStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype = ALL) if(!forced && (status_flags & GODMODE)) return FALSE - if(required_biotype && !(mob_biotypes & required_biotype)) - return + if(!forced && !(mob_biotypes & required_biotype)) + return FALSE + . = staminaloss staminaloss = clamp((staminaloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, max_stamina) + . -= staminaloss + if(!.) // no change, no need to update + return FALSE if(updating_stamina) updatehealth() - SEND_SIGNAL(src, COMSIG_MOB_LOSS_STAMINA, amount) //SKYRAT EDIT ADDITION - return -/mob/living/proc/setStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype) - if(!forced && ( (status_flags & GODMODE) || HAS_TRAIT(src, TRAIT_NOCLONELOSS)) ) +/mob/living/proc/setStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype = ALL) + if(!forced && (status_flags & GODMODE)) + return FALSE + if(!forced && !(mob_biotypes & required_biotype)) return FALSE + . = staminaloss staminaloss = amount + . -= staminaloss + if(!.) // no change, no need to update + return FALSE if(updating_stamina) updatehealth() /** * heal ONE external organ, organ gets randomly selected from damaged ones. * - * needs to return amount healed in order to calculate things like tend wounds xp gain + * returns the net change in damage */ /mob/living/proc/heal_bodypart_damage(brute = 0, burn = 0, updating_health = TRUE, required_bodytype = NONE, target_zone = null) - . = (adjustBruteLoss(-brute, FALSE) + adjustFireLoss(-burn, FALSE)) //zero as argument for no instant health update + . = (adjustBruteLoss(-abs(brute), updating_health = FALSE) + adjustFireLoss(-abs(burn), updating_health = FALSE)) + if(!.) // no change, no need to update + return FALSE if(updating_health) updatehealth() /// damage ONE external organ, organ gets randomly selected from damaged ones. /mob/living/proc/take_bodypart_damage(brute = 0, burn = 0, updating_health = TRUE, required_bodytype, check_armor = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = NONE) - adjustBruteLoss(brute, FALSE) //zero as argument for no instant health update - adjustFireLoss(burn, FALSE) + . = (adjustBruteLoss(abs(brute), updating_health = FALSE) + adjustFireLoss(abs(burn), updating_health = FALSE)) + if(!.) // no change, no need to update + return FALSE if(updating_health) updatehealth() -/// heal MANY bodyparts, in random order -/mob/living/proc/heal_overall_damage(brute = 0, burn = 0, stamina = 0, required_bodytype, updating_health = TRUE) - adjustBruteLoss(-brute, FALSE) //zero as argument for no instant health update - adjustFireLoss(-burn, FALSE) - adjustStaminaLoss(-stamina, FALSE) +/// heal MANY bodyparts, in random order. note: stamina arg nonfunctional for carbon mobs +/mob/living/proc/heal_overall_damage(brute = 0, burn = 0, stamina = 0, required_bodytype, updating_health = TRUE, forced = FALSE) + . = (adjustBruteLoss(-abs(brute), updating_health = FALSE, forced = forced) + \ + adjustFireLoss(-abs(burn), updating_health = FALSE, forced = forced) + \ + adjustStaminaLoss(-abs(stamina), updating_stamina = FALSE, forced = forced)) + if(!.) // no change, no need to update + return FALSE if(updating_health) updatehealth() -/// damage MANY bodyparts, in random order -/mob/living/proc/take_overall_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE, required_bodytype) - adjustBruteLoss(brute, FALSE) //zero as argument for no instant health update - adjustFireLoss(burn, FALSE) - adjustStaminaLoss(stamina, FALSE) +/// damage MANY bodyparts, in random order. note: stamina arg nonfunctional for carbon mobs +/mob/living/proc/take_overall_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE, forced = FALSE, required_bodytype) + . = (adjustBruteLoss(abs(brute), updating_health = FALSE, forced = forced) + \ + adjustFireLoss(abs(burn), updating_health = FALSE, forced = forced) + \ + adjustStaminaLoss(abs(stamina), updating_stamina = FALSE, forced = forced)) + if(!.) // no change, no need to update + return FALSE if(updating_health) updatehealth() ///heal up to amount damage, in a given order /mob/living/proc/heal_ordered_damage(amount, list/damage_types) - . = amount //we'll return the amount of damage healed - for(var/i in damage_types) - var/amount_to_heal = min(amount, get_damage_amount(i)) //heal only up to the amount of damage we have + . = FALSE //we'll return the amount of damage healed + for(var/damagetype in damage_types) + var/amount_to_heal = min(abs(amount), get_current_damage_of_type(damagetype)) //heal only up to the amount of damage we have if(amount_to_heal) - apply_damage_type(-amount_to_heal, i) + . += apply_damage_type(-amount_to_heal, damagetype) amount -= amount_to_heal //remove what we healed from our current amount if(!amount) break - . -= amount //if there's leftover healing, remove it from what we return diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index fa96e7c2181..8e51a6a8149 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -807,8 +807,8 @@ */ /mob/living/proc/revive(full_heal_flags = NONE, excess_healing = 0, force_grab_ghost = FALSE) if(excess_healing) - adjustOxyLoss(-excess_healing, FALSE) - adjustToxLoss(-excess_healing, FALSE, TRUE) //slime friendly + adjustOxyLoss(-excess_healing, updating_health = FALSE) + adjustToxLoss(-excess_healing, updating_health = FALSE, forced = TRUE) //slime friendly updatehealth() grab_ghost(force_grab_ghost) @@ -857,13 +857,13 @@ var/oxy_to_heal = heal_to - getOxyLoss() var/tox_to_heal = heal_to - getToxLoss() if(brute_to_heal < 0) - adjustBruteLoss(brute_to_heal, FALSE) + adjustBruteLoss(brute_to_heal, updating_health = FALSE) if(burn_to_heal < 0) - adjustFireLoss(burn_to_heal, FALSE) + adjustFireLoss(burn_to_heal, updating_health = FALSE) if(oxy_to_heal < 0) - adjustOxyLoss(oxy_to_heal, FALSE) + adjustOxyLoss(oxy_to_heal, updating_health = FALSE) if(tox_to_heal < 0) - adjustToxLoss(tox_to_heal, FALSE, TRUE) + adjustToxLoss(tox_to_heal, updating_health = FALSE, forced = TRUE) // Run updatehealth once to set health for the revival check updatehealth() @@ -894,17 +894,17 @@ SHOULD_CALL_PARENT(TRUE) if(heal_flags & HEAL_TOX) - setToxLoss(0, FALSE, TRUE) + setToxLoss(0, updating_health = FALSE, forced = TRUE) if(heal_flags & HEAL_OXY) - setOxyLoss(0, FALSE, TRUE) + setOxyLoss(0, updating_health = FALSE, forced = TRUE) if(heal_flags & HEAL_CLONE) - setCloneLoss(0, FALSE, TRUE) + setCloneLoss(0, updating_health = FALSE, forced = TRUE) if(heal_flags & HEAL_BRUTE) - setBruteLoss(0, FALSE, TRUE) + setBruteLoss(0, updating_health = FALSE, forced = TRUE) if(heal_flags & HEAL_BURN) - setFireLoss(0, FALSE, TRUE) + setFireLoss(0, updating_health = FALSE, forced = TRUE) if(heal_flags & HEAL_STAM) - setStaminaLoss(0, FALSE, TRUE) + setStaminaLoss(0, updating_stamina = FALSE, forced = TRUE) // I don't really care to keep this under a flag set_nutrition(NUTRITION_LEVEL_FED + 50) diff --git a/code/modules/mob/living/silicon/damage_procs.dm b/code/modules/mob/living/silicon/damage_procs.dm index 8ee146508a4..4fe6e688632 100644 --- a/code/modules/mob/living/silicon/damage_procs.dm +++ b/code/modules/mob/living/silicon/damage_procs.dm @@ -18,19 +18,19 @@ /mob/living/silicon/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype) //immune to tox damage return FALSE -/mob/living/silicon/setToxLoss(amount, updating_health = TRUE, forced = FALSE) +/mob/living/silicon/setToxLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype) return FALSE -/mob/living/silicon/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE) //immune to clone damage +/mob/living/silicon/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype) //immune to clone damage return FALSE -/mob/living/silicon/setCloneLoss(amount, updating_health = TRUE, forced = FALSE) +/mob/living/silicon/setCloneLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype) return FALSE /mob/living/silicon/adjustStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype) //immune to stamina damage. return FALSE -/mob/living/silicon/setStaminaLoss(amount, updating_health = TRUE) +/mob/living/silicon/setStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype) return FALSE /mob/living/silicon/adjustOrganLoss(slot, amount, maximum = 500, required_organ_flag) //immune to organ damage (no organs, duh) @@ -45,7 +45,7 @@ return FALSE -/mob/living/silicon/setOxyLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype) +/mob/living/silicon/setOxyLoss(amount, updating_health = TRUE, forced = FALSE, forced = FALSE, required_biotype) if(isAI(src)) //ditto return ..() diff --git a/code/modules/mob/living/simple_animal/damage_procs.dm b/code/modules/mob/living/simple_animal/damage_procs.dm index 6345320d9d9..1f7638325ce 100644 --- a/code/modules/mob/living/simple_animal/damage_procs.dm +++ b/code/modules/mob/living/simple_animal/damage_procs.dm @@ -42,7 +42,7 @@ else if(damage_coeff[TOX]) . = adjustHealth(amount * damage_coeff[TOX] * CONFIG_GET(number/damage_multiplier), updating_health, forced) -/mob/living/simple_animal/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE) +/mob/living/simple_animal/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype) if(forced) . = adjustHealth(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced) else if(damage_coeff[CLONE]) diff --git a/code/modules/mob/living/simple_animal/guardian/types/support.dm b/code/modules/mob/living/simple_animal/guardian/types/support.dm index 5347f049e13..9afdf231ce7 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/support.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/support.dm @@ -47,10 +47,13 @@ span_userdanger("[src] heals you!"), null, COMBAT_MESSAGE_RANGE, src) to_chat(src, span_notice("You heal [target]!")) playsound(target, attack_sound, 50, TRUE, TRUE, frequency = -1) //play punch in REVERSE - target.adjustBruteLoss(-healing_amount) - target.adjustFireLoss(-healing_amount) - target.adjustOxyLoss(-healing_amount) - target.adjustToxLoss(-healing_amount, forced = TRUE) + var/need_mob_update + need_mob_update = target.adjustBruteLoss(-healing_amount, updating_health = FALSE) + need_mob_update += target.adjustFireLoss(-healing_amount, updating_health = FALSE) + need_mob_update += target.adjustOxyLoss(-healing_amount, updating_health = FALSE) + need_mob_update += target.adjustToxLoss(-healing_amount, updating_health = FALSE, forced = TRUE) + if(need_mob_update) + target.updatehealth() var/obj/effect/temp_visual/heal/heal_effect = new /obj/effect/temp_visual/heal(get_turf(target)) heal_effect.color = guardian_color diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm index 5ef5987942e..04bb2f94cc9 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm @@ -132,9 +132,10 @@ taste_mult = 1.3 /datum/reagent/toxin/leaper_venom/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) + . = ..() if(volume >= 10) - M.adjustToxLoss(5 * REM * seconds_per_tick, 0) - ..() + if(M.adjustToxLoss(5 * REM * seconds_per_tick, updating_health = FALSE)) + . = UPDATE_MOB_HEALTH /obj/effect/temp_visual/leaper_crush name = "grim tidings" diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm index a103a55b996..3c34a68d6a2 100644 --- a/code/modules/mob/living/simple_animal/slime/life.dm +++ b/code/modules/mob/living/simple_animal/slime/life.dm @@ -199,8 +199,11 @@ var/mob/living/animal_victim = prey var/totaldamage = 0 //total damage done to this unfortunate animal - totaldamage += animal_victim.adjustBruteLoss(rand(2, 4) * 0.5 * seconds_per_tick) - totaldamage += animal_victim.adjustToxLoss(rand(1, 2) * 0.5 * seconds_per_tick) + var/need_mob_update + need_mob_update = totaldamage += animal_victim.adjustBruteLoss(rand(2, 4) * 0.5 * seconds_per_tick, updating_health = FALSE) + need_mob_update += totaldamage += animal_victim.adjustToxLoss(rand(1, 2) * 0.5 * seconds_per_tick, updating_health = FALSE) + if(need_mob_update) + animal_victim.updatehealth() if(totaldamage <= 0) //if we did no(or negative!) damage to it, stop Feedstop(0, 0) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 7df256d1873..8b8a8cff943 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -323,7 +323,7 @@ return FALSE var/brute_damage = brute_heal > burn_heal //changes repair text based on how much brute/burn was supplied if((brute_heal > 0 && affecting.brute_dam > 0) || (burn_heal > 0 && affecting.burn_dam > 0)) - if(affecting.heal_damage(brute_heal, burn_heal, BODYTYPE_ROBOTIC)) + if(affecting.heal_damage(brute_heal, burn_heal, required_bodytype = BODYTYPE_ROBOTIC)) human.update_damage_overlays() user.visible_message(span_notice("[user] fixes some of the [brute_damage ? "dents on" : "burnt wires in"] [human]'s [affecting.name]."), \ span_notice("You fix some of the [brute_damage ? "dents on" : "burnt wires in"] [human == user ? "your" : "[human]'s"] [affecting.name].")) diff --git a/code/modules/mob/status_procs.dm b/code/modules/mob/status_procs.dm index 1dde25c7802..fccd64ab705 100644 --- a/code/modules/mob/status_procs.dm +++ b/code/modules/mob/status_procs.dm @@ -12,6 +12,7 @@ /mob/proc/adjust_bodytemperature(amount,min_temp=0,max_temp=INFINITY) if(bodytemperature >= min_temp && bodytemperature <= max_temp) bodytemperature = clamp(bodytemperature + amount,min_temp,max_temp) + return TRUE /// Sight here is the mob.sight var, which tells byond what to actually show to our client /// See [code\__DEFINES\sight.dm] for more details diff --git a/code/modules/projectiles/guns/special/medbeam.dm b/code/modules/projectiles/guns/special/medbeam.dm index d3ee77ef3b3..267470f1701 100644 --- a/code/modules/projectiles/guns/special/medbeam.dm +++ b/code/modules/projectiles/guns/special/medbeam.dm @@ -144,10 +144,13 @@ /obj/item/gun/medbeam/proc/on_beam_tick(mob/living/target) if(target.health != target.maxHealth) new /obj/effect/temp_visual/heal(get_turf(target), COLOR_HEALING_CYAN) - target.adjustBruteLoss(-4) - target.adjustFireLoss(-4) - target.adjustToxLoss(-1, forced = TRUE) - target.adjustOxyLoss(-1, forced = TRUE) + var/need_mob_update + need_mob_update = target.adjustBruteLoss(-4, updating_health = FALSE, forced = TRUE) + need_mob_update += target.adjustFireLoss(-4, updating_health = FALSE, forced = TRUE) + need_mob_update += target.adjustToxLoss(-1, updating_health = FALSE, forced = TRUE) + need_mob_update += target.adjustOxyLoss(-1, updating_health = FALSE, forced = TRUE) + if(need_mob_update) + target.updatehealth() return /obj/item/gun/medbeam/proc/on_beam_release(mob/living/target) diff --git a/code/modules/projectiles/guns/special/syringe_gun.dm b/code/modules/projectiles/guns/special/syringe_gun.dm index 270bb8744cc..805378c1ffc 100644 --- a/code/modules/projectiles/guns/special/syringe_gun.dm +++ b/code/modules/projectiles/guns/special/syringe_gun.dm @@ -206,6 +206,6 @@ /obj/item/gun/syringe/blowgun/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) visible_message(span_danger("[user] shoots the blowgun!")) - user.adjustStaminaLoss(20) + user.adjustStaminaLoss(20, updating_stamina = FALSE) user.adjustOxyLoss(20) return ..() diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 503560aa224..b03a736e3f8 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -470,7 +470,7 @@ * Check if this holder contains this reagent. * Reagent takes a PATH to a reagent. * Amount checks for having a specific amount of that chemical. - * Needs matabolizing takes into consideration if the chemical is matabolizing when it's checked. + * Needs matabolizing takes into consideration if the chemical is metabolizing when it's checked. * Check subtypes controls whether it should it should also include subtypes: ispath(type, reagent) versus type == reagent. */ /datum/reagents/proc/has_reagent(reagent, amount = -1, needs_metabolizing = FALSE, check_subtypes = FALSE) diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 110107d103f..46ac1eda360 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -50,8 +50,6 @@ GLOBAL_LIST_INIT(blacklisted_metalgen_types, typecacheof(list( var/color = "#000000" // rgb: 0, 0, 0 ///how fast the reagent is metabolized by the mob var/metabolization_rate = REAGENTS_METABOLISM - /// appears unused - var/overrides_metab = 0 /// above this overdoses happen var/overdose_threshold = 0 /// You fucked up and this is now triggering its overdose effects, purge that shit quick. @@ -159,12 +157,27 @@ GLOBAL_LIST_INIT(blacklisted_metalgen_types, typecacheof(list( /datum/reagent/proc/burn(datum/reagents/holder) return -/// Called from [/datum/reagents/proc/metabolize] -/datum/reagent/proc/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) +/** + * Ticks on mob Life() for as long as the reagent remains in the mob's reagents. + * + * Usage: Parent should be called first using . = ..() + * + * Exceptions: If the holder var needs to be accessed, call the parent afterward that as it can become null if the reagent is fully removed. + * + * Returns: UPDATE_MOB_HEALTH only if you need to update the health of a mob (this is only needed when damage is dealt to the mob) + * + * Arguments + * * mob/living/carbon/affected_mob - the mob which the reagent currently is inside of + * * seconds_per_tick - the time in server seconds between proc calls (when performing normally it will be 2) + * * times_fired - the number of times the owner's Life() tick has been called aka The number of times SSmobs has fired + * + */ +/datum/reagent/proc/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) current_cycle++ if(length(reagent_removal_skip_list)) return - holder.remove_reagent(type, metabolization_rate * M.metabolism_efficiency * seconds_per_tick) //By default it slowly disappears. + if(holder) + holder.remove_reagent(type, metabolization_rate * affected_mob.metabolism_efficiency * seconds_per_tick) //By default it slowly disappears. /// Called in burns.dm *if* the reagent has the REAGENT_AFFECTS_WOUNDS process flag /datum/reagent/proc/on_burn_wound_processing(datum/wound/burn/flesh/burn_wound) @@ -182,34 +195,35 @@ Primarily used in reagents/reaction_agents return /// Called when this reagent is first added to a mob -/datum/reagent/proc/on_mob_add(mob/living/L, amount) +/datum/reagent/proc/on_mob_add(mob/living/affected_mob, amount) overdose_threshold /= max(normalise_creation_purity(), 1) //Maybe??? Seems like it would help pure chems be even better but, if I normalised this to 1, then everything would take a 25% reduction return /// Called when this reagent is removed while inside a mob -/datum/reagent/proc/on_mob_delete(mob/living/L) - L.clear_mood_event("[type]_overdose") +/datum/reagent/proc/on_mob_delete(mob/living/affected_mob) + affected_mob.clear_mood_event("[type]_overdose") return /// Called when this reagent first starts being metabolized by a liver -/datum/reagent/proc/on_mob_metabolize(mob/living/L) +/datum/reagent/proc/on_mob_metabolize(mob/living/affected_mob) return /// Called when this reagent stops being metabolized by a liver -/datum/reagent/proc/on_mob_end_metabolize(mob/living/L) +/datum/reagent/proc/on_mob_end_metabolize(mob/living/affected_mob) return -/// Called when a reagent is inside of a mob when they are dead -/datum/reagent/proc/on_mob_dead(mob/living/carbon/C, seconds_per_tick) +/// Called when a reagent is inside of a mob when they are dead. Returning UPDATE_MOB_HEALTH will cause updatehealth() to be called on the holder mob by /datum/reagents/proc/metabolize. +/datum/reagent/proc/on_mob_dead(mob/living/carbon/affected_mob, seconds_per_tick) if(!(chemical_flags & REAGENT_DEAD_PROCESS)) return current_cycle++ if(length(reagent_removal_skip_list)) return - holder.remove_reagent(type, metabolization_rate * C.metabolism_efficiency * seconds_per_tick) + if(holder) + holder.remove_reagent(type, metabolization_rate * affected_mob.metabolism_efficiency * seconds_per_tick) /// Called by [/datum/reagents/proc/conditional_update_move] -/datum/reagent/proc/on_move(mob/M) +/datum/reagent/proc/on_move(mob/affected_mob) return /// Called after add_reagents creates a new reagent. @@ -225,14 +239,14 @@ Primarily used in reagents/reaction_agents /datum/reagent/proc/on_update(atom/A) return -/// Called if the reagent has passed the overdose threshold and is set to be triggering overdose effects -/datum/reagent/proc/overdose_process(mob/living/M, seconds_per_tick, times_fired) +/// Called if the reagent has passed the overdose threshold and is set to be triggering overdose effects. Returning UPDATE_MOB_HEALTH will cause updatehealth() to be called on the holder mob by /datum/reagents/proc/metabolize. +/datum/reagent/proc/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) return -/// Called when an overdose starts -/datum/reagent/proc/overdose_start(mob/living/M) - to_chat(M, span_userdanger("You feel like you took too much of [name]!")) - M.add_mood_event("[type]_overdose", /datum/mood_event/overdose, name) +/// Called when an overdose starts. Returning UPDATE_MOB_HEALTH will cause updatehealth() to be called on the holder mob by /datum/reagents/proc/metabolize. +/datum/reagent/proc/overdose_start(mob/living/affected_mob) + to_chat(affected_mob, span_userdanger("You feel like you took too much of [name]!")) + affected_mob.add_mood_event("[type]_overdose", /datum/mood_event/overdose, name) return /** diff --git a/code/modules/reagents/chemistry/reagents/atmos_gas_reagents.dm b/code/modules/reagents/chemistry/reagents/atmos_gas_reagents.dm index 817e5ed98bf..4550edbdfdf 100644 --- a/code/modules/reagents/chemistry/reagents/atmos_gas_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/atmos_gas_reagents.dm @@ -12,8 +12,8 @@ breather.add_movespeed_modifier(/datum/movespeed_modifier/reagent/freon) /datum/reagent/freon/on_mob_end_metabolize(mob/living/breather) + . = ..() breather.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/freon) - return ..() /datum/reagent/halon name = "Halon" @@ -30,9 +30,9 @@ ADD_TRAIT(breather, TRAIT_RESISTHEAT, type) /datum/reagent/halon/on_mob_end_metabolize(mob/living/breather) + . = ..() breather.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/halon) REMOVE_TRAIT(breather, TRAIT_RESISTHEAT, type) - return ..() /datum/reagent/healium name = "Healium" @@ -44,16 +44,18 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/healium/on_mob_end_metabolize(mob/living/breather) + . = ..() breather.SetSleeping(1 SECONDS) - return ..() /datum/reagent/healium/on_mob_life(mob/living/breather, seconds_per_tick, times_fired) - breather.SetSleeping(30 SECONDS) - breather.adjustFireLoss(-2 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - breather.adjustToxLoss(-5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - breather.adjustBruteLoss(-2 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) . = ..() - return TRUE + breather.SetSleeping(30 SECONDS) + var/need_mob_update + need_mob_update = breather.adjustFireLoss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += breather.adjustToxLoss(-5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += breather.adjustBruteLoss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/hypernoblium name = "Hyper-Noblium" @@ -65,9 +67,9 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/hypernoblium/on_mob_life(mob/living/carbon/breather, seconds_per_tick, times_fired) + . = ..() if(isplasmaman(breather)) breather.set_timed_status_effect(10 SECONDS * REM * seconds_per_tick, /datum/status_effect/hypernob_protection) - ..() /datum/reagent/nitrium_high_metabolization name = "Nitrosyl plasmide" @@ -85,14 +87,16 @@ ADD_TRAIT(breather, TRAIT_SLEEPIMMUNE, type) /datum/reagent/nitrium_high_metabolization/on_mob_end_metabolize(mob/living/breather) + . = ..() REMOVE_TRAIT(breather, TRAIT_SLEEPIMMUNE, type) - return ..() /datum/reagent/nitrium_high_metabolization/on_mob_life(mob/living/carbon/breather, seconds_per_tick, times_fired) - breather.adjustStaminaLoss(-2 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - breather.adjustToxLoss(0.1 * current_cycle * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) // 1 toxin damage per cycle at cycle 10 . = ..() - return TRUE + var/need_mob_update + need_mob_update = breather.adjustStaminaLoss(-2 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + need_mob_update += breather.adjustToxLoss(0.1 * (current_cycle-1) * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) // 1 toxin damage per cycle at cycle 10 + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/nitrium_low_metabolization name = "Nitrium" @@ -109,8 +113,8 @@ breather.add_movespeed_modifier(/datum/movespeed_modifier/reagent/nitrium) /datum/reagent/nitrium_low_metabolization/on_mob_end_metabolize(mob/living/breather) + . = ..() breather.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/nitrium) - return ..() /datum/reagent/pluoxium name = "Pluoxium" @@ -122,18 +126,17 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/pluoxium/on_mob_life(mob/living/carbon/breather, seconds_per_tick, times_fired) + . = ..() if(!HAS_TRAIT(breather, TRAIT_KNOCKEDOUT)) - return ..() + return . = ..() for(var/obj/item/organ/organ_being_healed as anything in breather.organs) if(!organ_being_healed.damage) continue - organ_being_healed.apply_organ_damage(-0.5 * REM * seconds_per_tick, required_organ_flag = ORGAN_ORGANIC) - . = TRUE - - return . + if(organ_being_healed.apply_organ_damage(-0.5 * REM * seconds_per_tick, required_organ_flag = ORGAN_ORGANIC)) + return UPDATE_MOB_HEALTH /datum/reagent/zauker name = "Zauker" @@ -147,9 +150,11 @@ affected_respiration_type = ALL /datum/reagent/zauker/on_mob_life(mob/living/breather, seconds_per_tick, times_fired) - breather.adjustBruteLoss(6 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - breather.adjustOxyLoss(1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - breather.adjustFireLoss(2 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - breather.adjustToxLoss(2 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - ..() - return TRUE + . = ..() + var/need_mob_update + need_mob_update = breather.adjustBruteLoss(6 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += breather.adjustOxyLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += breather.adjustFireLoss(2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += breather.adjustToxLoss(2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + if(need_mob_update) + return UPDATE_MOB_HEALTH diff --git a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm index 693404431fa..53558cbd820 100644 --- a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm @@ -27,21 +27,23 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/c2/helbital/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - . = TRUE var/death_is_coming = (affected_mob.getToxLoss() + affected_mob.getOxyLoss() + affected_mob.getFireLoss() + affected_mob.getBruteLoss())*normalise_creation_purity() var/thou_shall_heal = 0 var/good_kind_of_healing = FALSE + var/need_mob_update = FALSE switch(affected_mob.stat) if(CONSCIOUS) //bad thou_shall_heal = death_is_coming/50 - affected_mob.adjustOxyLoss(2 * REM * seconds_per_tick, TRUE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjustOxyLoss(2 * REM * seconds_per_tick, TRUE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) if(SOFT_CRIT) //meh convert thou_shall_heal = round(death_is_coming/47,0.1) - affected_mob.adjustOxyLoss(1 * REM * seconds_per_tick, TRUE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjustOxyLoss(1 * REM * seconds_per_tick, TRUE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) else //no convert thou_shall_heal = round(death_is_coming/45, 0.1) good_kind_of_healing = TRUE - affected_mob.adjustBruteLoss(-thou_shall_heal * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustBruteLoss(-thou_shall_heal * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) + if(need_mob_update) + . = UPDATE_MOB_HEALTH if(good_kind_of_healing && !reaping && SPT_PROB(0.00005, seconds_per_tick)) //janken with the grim reaper! notify_ghosts("[affected_mob] has entered a game of rock-paper-scissors with death!", source = affected_mob, action = NOTIFY_ORBIT, header = "Who Will Win?") @@ -73,21 +75,18 @@ affected_mob.revive(HEAL_ALL) holder.del_reagent(type) return - - ..() - return + return ..() || . /datum/reagent/medicine/c2/helbital/overdose_process(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(!helbent) affected_mob.apply_necropolis_curse(CURSE_WASTING | CURSE_BLINDING) helbent = TRUE - ..() - return TRUE -/datum/reagent/medicine/c2/helbital/on_mob_delete(mob/living/L) +/datum/reagent/medicine/c2/helbital/on_mob_delete(mob/living/affected_mob) + . = ..() if(helbent) - L.remove_status_effect(/datum/status_effect/necropolis_curse) - ..() + affected_mob.remove_status_effect(/datum/status_effect/necropolis_curse) /datum/reagent/medicine/c2/libital //messes with your liber name = "Libital" @@ -99,10 +98,12 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/c2/libital/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.3 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) - affected_mob.adjustBruteLoss(-3 * REM * normalise_creation_purity() * seconds_per_tick, required_bodytype = affected_bodytype) - ..() - return TRUE + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.3 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + need_mob_update += affected_mob.adjustBruteLoss(-3 * REM * normalise_creation_purity() * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/c2/probital name = "Probital" @@ -116,7 +117,9 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/c2/probital/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustBruteLoss(-2.25 * REM * normalise_creation_purity() * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustBruteLoss(-2.25 * REM * normalise_creation_purity() * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) var/ooo_youaregettingsleepy = 3.5 switch(round(affected_mob.getStaminaLoss())) if(10 to 40) @@ -125,20 +128,22 @@ ooo_youaregettingsleepy = 2.5 if(61 to 200) //you really can only go to 120 ooo_youaregettingsleepy = 2 - affected_mob.adjustStaminaLoss(ooo_youaregettingsleepy * REM * seconds_per_tick) - ..() - . = TRUE + need_mob_update += affected_mob.adjustStaminaLoss(ooo_youaregettingsleepy * REM * seconds_per_tick, updating_stamina = FALSE) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/c2/probital/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustStaminaLoss(3 * REM * seconds_per_tick, updating_stamina = FALSE) + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustStaminaLoss(3 * REM * seconds_per_tick, updating_stamina = FALSE) if(affected_mob.getStaminaLoss() >= 80) affected_mob.adjust_drowsiness(2 SECONDS * REM * seconds_per_tick) if(affected_mob.getStaminaLoss() >= 100) to_chat(affected_mob,span_warning("You feel more tired than you usually do, perhaps if you rest your eyes for a bit...")) - affected_mob.adjustStaminaLoss(-100, updating_stamina = TRUE) // Don't add the biotype parameter here as it results in infinite sleep and chat spam. + need_mob_update += affected_mob.adjustStaminaLoss(-100, updating_stamina = FALSE) // Don't add the biotype parameter here as it results in infinite sleep and chat spam. affected_mob.Sleeping(10 SECONDS) - ..() - . = TRUE + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/c2/probital/on_transfer(atom/A, methods=INGEST, trans_volume) if(!(methods & INGEST) || (!iscarbon(A) && !istype(A, /obj/item/organ/internal/stomach)) ) @@ -162,10 +167,12 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/c2/lenturi/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustFireLoss(-3 * REM * normalise_creation_purity() * seconds_per_tick, required_bodytype = affected_bodytype) - affected_mob.adjustOrganLoss(ORGAN_SLOT_STOMACH, 0.4 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) - ..() - return TRUE + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustFireLoss(-3 * REM * normalise_creation_purity() * seconds_per_tick, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_STOMACH, 0.4 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/c2/aiuri name = "Aiuri" @@ -178,10 +185,12 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/c2/aiuri/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustFireLoss(-2 * REM * normalise_creation_purity() * seconds_per_tick, required_bodytype = affected_bodytype) - affected_mob.adjustOrganLoss(ORGAN_SLOT_EYES, 0.25 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) - ..() - return TRUE + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustFireLoss(-2 * REM * normalise_creation_purity() * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_EYES, 0.25 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/c2/hercuri name = "Hercuri" @@ -196,18 +205,20 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/c2/hercuri/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + var/need_mob_update if(affected_mob.getFireLoss() > 50) - affected_mob.adjustFireLoss(-2 * REM * seconds_per_tick * normalise_creation_purity(), FALSE, required_bodytype = affected_bodytype) + need_mob_update = affected_mob.adjustFireLoss(-2 * REM * seconds_per_tick * normalise_creation_purity(), updating_health = FALSE, required_bodytype = affected_bodytype) else - affected_mob.adjustFireLoss(-1.25 * REM * seconds_per_tick * normalise_creation_purity(), FALSE, required_bodytype = affected_bodytype) + need_mob_update = affected_mob.adjustFireLoss(-1.25 * REM * seconds_per_tick * normalise_creation_purity(), updating_health = FALSE, required_bodytype = affected_bodytype) affected_mob.adjust_bodytemperature(rand(-25,-5) * TEMPERATURE_DAMAGE_COEFFICIENT * REM * seconds_per_tick, 50) if(ishuman(affected_mob)) var/mob/living/carbon/human/humi = affected_mob humi.adjust_coretemperature(rand(-25,-5) * TEMPERATURE_DAMAGE_COEFFICIENT * REM * seconds_per_tick, 50) affected_mob.reagents?.chem_temp += (-10 * REM * seconds_per_tick) affected_mob.adjust_fire_stacks(-1 * REM * seconds_per_tick) - ..() - . = TRUE + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/c2/hercuri/expose_mob(mob/living/carbon/exposed_mob, methods=VAPOR, reac_volume) . = ..() @@ -220,11 +231,11 @@ exposed_mob.extinguish_mob() /datum/reagent/medicine/c2/hercuri/overdose_process(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_bodytemperature(-10 * TEMPERATURE_DAMAGE_COEFFICIENT * REM * seconds_per_tick, 50) //chilly chilly if(ishuman(affected_mob)) var/mob/living/carbon/human/humi = affected_mob humi.adjust_coretemperature(-10 * TEMPERATURE_DAMAGE_COEFFICIENT * REM * seconds_per_tick, 50) - ..() /******OXY******/ @@ -243,20 +254,22 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/c2/convermol/on_mob_life(mob/living/carbon/human/affected_mob, seconds_per_tick, times_fired) - var/oxycalc = 2.5 * REM * current_cycle + . = ..() + var/oxycalc = 2.5 * REM * (current_cycle-1) if(!overdosed) oxycalc = min(oxycalc, affected_mob.getOxyLoss() + 0.5) //if NOT overdosing, we lower our toxdamage to only the damage we actually healed with a minimum of 0.1*current_cycle. IE if we only heal 10 oxygen damage but we COULD have healed 20, we will only take toxdamage for the 10. We would take the toxdamage for the extra 10 if we were overdosing. - affected_mob.adjustOxyLoss(-oxycalc * seconds_per_tick * normalise_creation_purity(), FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - affected_mob.adjustToxLoss(oxycalc * seconds_per_tick / CONVERMOL_RATIO, FALSE, required_biotype = affected_biotype) - if(SPT_PROB(current_cycle / 2, seconds_per_tick) && affected_mob.losebreath) + var/need_mob_update + need_mob_update = affected_mob.adjustOxyLoss(-oxycalc * seconds_per_tick * normalise_creation_purity(), FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjustToxLoss(oxycalc * seconds_per_tick / CONVERMOL_RATIO, updating_health = FALSE, required_biotype = affected_biotype) + if(SPT_PROB((current_cycle-1) / 2, seconds_per_tick) && affected_mob.losebreath) affected_mob.losebreath-- - ..() - return TRUE + need_mob_update = TRUE + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/c2/convermol/overdose_process(mob/living/carbon/human/affected_mob, seconds_per_tick, times_fired) + . = ..() metabolization_rate += 2.5 * REAGENTS_METABOLISM - ..() - return TRUE #undef CONVERMOL_RATIO @@ -273,20 +286,22 @@ COOLDOWN_DECLARE(drowsycd) /datum/reagent/medicine/c2/tirimol/on_mob_life(mob/living/carbon/human/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustOxyLoss(-3 * REM * seconds_per_tick * normalise_creation_purity(), required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - affected_mob.adjustStaminaLoss(2 * REM * seconds_per_tick, required_biotype = affected_biotype) + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustOxyLoss(-3 * REM * seconds_per_tick * normalise_creation_purity(), updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjustStaminaLoss(2 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) if(drowsycd && COOLDOWN_FINISHED(src, drowsycd)) affected_mob.adjust_drowsiness(20 SECONDS) COOLDOWN_START(src, drowsycd, 45 SECONDS) else if(!drowsycd) COOLDOWN_START(src, drowsycd, 15 SECONDS) - ..() - return TRUE + if(need_mob_update) + return UPDATE_MOB_HEALTH -/datum/reagent/medicine/c2/tirimol/on_mob_end_metabolize(mob/living/L) - if(current_cycle > 20) - L.Sleeping(10 SECONDS) - ..() +/datum/reagent/medicine/c2/tirimol/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() + if(current_cycle > 21) + affected_mob.Sleeping(10 SECONDS) /******TOXIN******/ /*Suffix: -iver*/ @@ -307,14 +322,16 @@ rads_heal_threshold = rand(rads_heal_threshold - 50, rads_heal_threshold + 50) // Basically this means 50K and below will always give the radiation heal, and upto 150K could. Calculated once. /datum/reagent/medicine/c2/seiver/on_mob_life(mob/living/carbon/human/affected_mob, seconds_per_tick, times_fired) + . = ..() var/chemtemp = min(holder.chem_temp, 1000) chemtemp = chemtemp ? chemtemp : T0C //why do you have null sweaty var/healypoints = 0 //5 healypoints = 1 heart damage; 5 rads = 1 tox damage healed for the purpose of healypoints //you're hot var/toxcalc = min(round(5 + ((chemtemp-1000)/175), 0.1), 5) * REM * seconds_per_tick * normalise_creation_purity() //max 2.5 tox healing per second + var/need_mob_update if(toxcalc > 0) - affected_mob.adjustToxLoss(-toxcalc, required_biotype = affected_biotype) + need_mob_update = affected_mob.adjustToxLoss(-toxcalc, updating_health = FALSE, required_biotype = affected_biotype) healypoints += toxcalc //and you're cold @@ -323,16 +340,16 @@ radcalc *= normalise_creation_purity() // extra rad healing if you are SUPER cold if(chemtemp < rads_heal_threshold*0.1) - affected_mob.adjustToxLoss(-radcalc * 0.9, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustToxLoss(-radcalc * 0.9, updating_health = FALSE, required_biotype = affected_biotype) else if(chemtemp < rads_heal_threshold) - affected_mob.adjustToxLoss(-radcalc * 0.75, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustToxLoss(-radcalc * 0.75, updating_health = FALSE, required_biotype = affected_biotype) healypoints += (radcalc / 5) //you're yes and... oh no! healypoints = round(healypoints, 0.1) affected_mob.adjustOrganLoss(ORGAN_SLOT_HEART, healypoints / 5, required_organ_flag = affected_organ_flags) - ..() - return TRUE + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/c2/multiver //enhanced with MULTIple medicines name = "Multiver" @@ -343,6 +360,7 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/c2/multiver/on_mob_life(mob/living/carbon/human/affected_mob, seconds_per_tick, times_fired) + . = ..() var/medibonus = 0 //it will always have itself which makes it REALLY start @ 1 for(var/r in affected_mob.reagents.reagent_list) var/datum/reagent/the_reagent = r @@ -350,8 +368,9 @@ medibonus += 1 if(creation_purity >= 1) //Perfectly pure multivers gives a bonus of 2! medibonus += 1 - affected_mob.adjustToxLoss(-0.5 * min(medibonus, 3 * normalise_creation_purity()) * REM * seconds_per_tick, required_biotype = affected_biotype) //not great at healing but if you have nothing else it will work - affected_mob.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) //kills at 40u + var/need_mob_update + need_mob_update = affected_mob.adjustToxLoss(-0.5 * min(medibonus, 3 * normalise_creation_purity()) * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) //not great at healing but if you have nothing else it will work + need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) //kills at 40u for(var/r2 in affected_mob.reagents.reagent_list) var/datum/reagent/the_reagent2 = r2 if(the_reagent2 == src) @@ -360,8 +379,8 @@ if(medibonus >= 3 && istype(the_reagent2, /datum/reagent/medicine)) //3 unique meds (2+multiver) | (1 + pure multiver) will make it not purge medicines continue affected_mob.reagents.remove_reagent(the_reagent2.type, amount2purge * REM * seconds_per_tick) - ..() - return TRUE + if(need_mob_update) + return UPDATE_MOB_HEALTH // Antitoxin binds plants pretty well. So the tox goes significantly down /datum/reagent/medicine/c2/multiver/on_hydroponics_apply(obj/machinery/hydroponics/mytray, mob/user) @@ -385,7 +404,7 @@ return var/mob/living/carbon/C = A if(trans_volume >= 0.6) //prevents cheesing with ultralow doses. - C.adjustToxLoss((-1.5 * min(2, trans_volume) * REM) * normalise_creation_purity(), FALSE, required_biotype = affected_biotype) //This is to promote iv pole use for that chemotherapy feel. + C.adjustToxLoss((-1.5 * min(2, trans_volume) * REM) * normalise_creation_purity(), required_biotype = affected_biotype) //This is to promote iv pole use for that chemotherapy feel. var/obj/item/organ/internal/liver/L = C.organs_slot[ORGAN_SLOT_LIVER] if(!L || L.organ_flags & ORGAN_FAILING) return @@ -395,22 +414,24 @@ ..() /datum/reagent/medicine/c2/syriniver/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.8 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) - affected_mob.adjustToxLoss(-1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.8 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + need_mob_update += affected_mob.adjustToxLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) for(var/datum/reagent/R in affected_mob.reagents.reagent_list) if(issyrinormusc(R)) continue affected_mob.reagents.remove_reagent(R.type, 0.4 * REM * seconds_per_tick) - ..() - . = TRUE + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/c2/syriniver/overdose_process(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + . = ..() + if(affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + . = UPDATE_MOB_HEALTH affected_mob.adjust_disgust(3 * REM * seconds_per_tick) affected_mob.reagents.add_reagent(/datum/reagent/medicine/c2/musiver, 0.225 * REM * seconds_per_tick) - ..() - . = TRUE /datum/reagent/medicine/c2/musiver //MUScles name = "Musiver" @@ -424,30 +445,32 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/c2/musiver/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.1 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) - affected_mob.adjustToxLoss(-1 * REM * seconds_per_tick * normalise_creation_purity(), FALSE, required_biotype = affected_biotype) + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.1 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + need_mob_update += affected_mob.adjustToxLoss(-1 * REM * seconds_per_tick * normalise_creation_purity(), updating_health = FALSE, required_biotype = affected_biotype) for(var/datum/reagent/R in affected_mob.reagents.reagent_list) if(issyrinormusc(R)) continue affected_mob.reagents.remove_reagent(R.type, 0.2 * REM * seconds_per_tick) - ..() - . = TRUE + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/c2/musiver/overdose_start(mob/living/carbon/affected_mob) + . = ..() trauma = new() affected_mob.gain_trauma(trauma, TRAUMA_RESILIENCE_ABSOLUTE) - ..() -/datum/reagent/medicine/c2/musiver/on_mob_delete(mob/living/carbon/affected_mob) +/datum/reagent/medicine/c2/musiver/on_mob_delete(mob/living/affected_mob) + . = ..() if(trauma) QDEL_NULL(trauma) - return ..() /datum/reagent/medicine/c2/musiver/overdose_process(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + . = ..() + if(affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + . = UPDATE_MOB_HEALTH affected_mob.adjust_disgust(3 * REM * seconds_per_tick) - ..() - . = TRUE #undef issyrinormusc /******COMBOS******/ @@ -469,14 +492,19 @@ show_message = 0 if(!(methods & (PATCH|TOUCH|VAPOR))) return - var/harmies = min(carbies.getBruteLoss(), carbies.adjustBruteLoss(-1.25 * reac_volume, required_bodytype = affected_bodytype)*-1) - var/burnies = min(carbies.getFireLoss(), carbies.adjustFireLoss(-1.25 * reac_volume, required_bodytype = affected_bodytype)*-1) + var/harmies = min(carbies.getBruteLoss(), carbies.adjustBruteLoss(-1.25 * reac_volume, updating_health = FALSE, required_bodytype = affected_bodytype)*-1) + var/burnies = min(carbies.getFireLoss(), carbies.adjustFireLoss(-1.25 * reac_volume, updating_health = FALSE, required_bodytype = affected_bodytype)*-1) for(var/i in carbies.all_wounds) var/datum/wound/iter_wound = i iter_wound.on_synthflesh(reac_volume) - carbies.adjustToxLoss((harmies+burnies)*(0.5 + (0.25*(1-creation_purity))), required_biotype = affected_biotype) //0.5 - 0.75 + var/need_mob_update = harmies + burnies + need_mob_update += carbies.adjustToxLoss((harmies+burnies)*(0.5 + (0.25*(1-creation_purity))), updating_health = FALSE, required_biotype = affected_biotype) //0.5 - 0.75 + + if(need_mob_update) + carbies.updatehealth() if(show_message) to_chat(carbies, span_danger("You feel your burns and bruises healing! It stings like hell!")) + carbies.add_mood_event("painful_medicine", /datum/mood_event/painful_medicine) if(HAS_TRAIT_FROM(exposed_mob, TRAIT_HUSK, BURN) && carbies.getFireLoss() < UNHUSK_DAMAGE_THRESHOLD && (carbies.reagents.get_reagent_amount(/datum/reagent/medicine/c2/synthflesh) + reac_volume >= SYNTHFLESH_UNHUSK_AMOUNT)) carbies.cure_husk(BURN) @@ -526,45 +554,51 @@ user.throw_alert("penthrite", /atom/movable/screen/alert/penthrite) user.add_traits(subject_traits, type) -/datum/reagent/medicine/c2/penthrite/on_mob_life(mob/living/carbon/human/H, seconds_per_tick, times_fired) - H.adjustStaminaLoss(-25 * REM) //SKYRAT EDIT ADDITION - COMBAT - makes your heart beat faster, fills you with energy. For miners - H.adjustOrganLoss(ORGAN_SLOT_STOMACH, 0.25 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) - if(H.health <= HEALTH_THRESHOLD_CRIT && H.health > (H.crit_threshold + HEALTH_THRESHOLD_FULLCRIT * (2 * normalise_creation_purity()))) //we cannot save someone below our lowered crit threshold. +/datum/reagent/medicine/c2/penthrite/on_mob_life(mob/living/carbon/human/affected_mob, seconds_per_tick, times_fired) + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustStaminaLoss(-12.5 * REM * seconds_per_tick, updating_stamina = FALSE) //SKYRAT EDIT ADDITION - COMBAT - makes your heart beat faster, fills you with energy. For miners + need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_STOMACH, 0.25 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + if(affected_mob.health <= HEALTH_THRESHOLD_CRIT && affected_mob.health > (affected_mob.crit_threshold + HEALTH_THRESHOLD_FULLCRIT * (2 * normalise_creation_purity()))) //we cannot save someone below our lowered crit threshold. - H.adjustToxLoss(-2 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - H.adjustBruteLoss(-2 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - H.adjustFireLoss(-2 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - H.adjustOxyLoss(-6 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjustToxLoss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustBruteLoss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustFireLoss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustOxyLoss(-6 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - H.losebreath = 0 + affected_mob.losebreath = 0 - H.adjustOrganLoss(ORGAN_SLOT_HEART, max(volume/10, 1) * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) // your heart is barely keeping up! + need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_HEART, max(volume/10, 1) * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) // your heart is barely keeping up! - H.set_jitter_if_lower(rand(0 SECONDS, 4 SECONDS) * REM * seconds_per_tick) - H.set_dizzy_if_lower(rand(0 SECONDS, 4 SECONDS) * REM * seconds_per_tick) + affected_mob.set_jitter_if_lower(rand(0 SECONDS, 4 SECONDS) * REM * seconds_per_tick) + affected_mob.set_dizzy_if_lower(rand(0 SECONDS, 4 SECONDS) * REM * seconds_per_tick) if(SPT_PROB(18, seconds_per_tick)) - to_chat(H,span_danger("Your body is trying to give up, but your heart is still beating!")) + to_chat(affected_mob,span_danger("Your body is trying to give up, but your heart is still beating!")) - if(H.health <= (H.crit_threshold + HEALTH_THRESHOLD_FULLCRIT*(2*normalise_creation_purity()))) //certain death below this threshold - REMOVE_TRAIT(H, TRAIT_STABLEHEART, type) //we have to remove the stable heart trait before we give them a heart attack - to_chat(H,span_danger("You feel something rupturing inside your chest!")) - H.emote("scream") - H.set_heartattack(TRUE) + if(affected_mob.health <= (affected_mob.crit_threshold + HEALTH_THRESHOLD_FULLCRIT*(2*normalise_creation_purity()))) //certain death below this threshold + REMOVE_TRAIT(affected_mob, TRAIT_STABLEHEART, type) //we have to remove the stable heart trait before we give them a heart attack + to_chat(affected_mob,span_danger("You feel something rupturing inside your chest!")) + affected_mob.emote("scream") + affected_mob.set_heartattack(TRUE) volume = 0 - . = ..() - return TRUE + if(need_mob_update) + return UPDATE_MOB_HEALTH -/datum/reagent/medicine/c2/penthrite/on_mob_end_metabolize(mob/living/user) - user.clear_alert("penthrite") - user.remove_traits(subject_traits, type) +/datum/reagent/medicine/c2/penthrite/on_mob_end_metabolize(mob/living/affected_mob) . = ..() + affected_mob.clear_alert("penthrite") + affected_mob.remove_traits(subject_traits, type) -/datum/reagent/medicine/c2/penthrite/overdose_process(mob/living/carbon/human/H, seconds_per_tick, times_fired) - REMOVE_TRAIT(H, TRAIT_STABLEHEART, type) - H.adjustStaminaLoss(10 * REM * seconds_per_tick, required_biotype = affected_biotype) - H.adjustOrganLoss(ORGAN_SLOT_HEART, 10 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) - H.set_heartattack(TRUE) +/datum/reagent/medicine/c2/penthrite/overdose_process(mob/living/carbon/human/affected_mob, seconds_per_tick, times_fired) + . = ..() + REMOVE_TRAIT(affected_mob, TRAIT_STABLEHEART, type) + var/need_mob_update + need_mob_update = affected_mob.adjustStaminaLoss(10 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_HEART, 10 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + need_mob_update += affected_mob.set_heartattack(TRUE) + if(need_mob_update) + return UPDATE_MOB_HEALTH /******NICHE******/ diff --git a/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm index b81e1600bbf..07335fe728f 100644 --- a/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm @@ -51,9 +51,10 @@ return ..() /datum/reagent/consumable/ethanol/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() if(drinker.get_drunk_amount() < volume * boozepwr * ALCOHOL_THRESHOLD_MODIFIER || boozepwr < 0) var/booze_power = boozepwr - if(HAS_TRAIT(drinker, TRAIT_ALCOHOL_TOLERANCE)) //we're an accomplished drinker + if(HAS_TRAIT(drinker, TRAIT_ALCOHOL_TOLERANCE)) // we're an accomplished drinker booze_power *= 0.7 if(HAS_TRAIT(drinker, TRAIT_LIGHT_DRINKER)) booze_power *= 2 @@ -77,8 +78,8 @@ var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) var/heavy_drinker_multiplier = (HAS_TRAIT(drinker, TRAIT_HEAVY_DRINKER) ? 0.5 : 1) if (istype(liver)) - liver.apply_organ_damage(((max(sqrt(volume) * (boozepwr ** ALCOHOL_EXPONENT) * liver.alcohol_tolerance * heavy_drinker_multiplier * seconds_per_tick, 0))/300)) // SKYRAT EDIT CHANGE - Alcohol Tolerance - Original: (((max(sqrt(volume) * (boozepwr ** ALCOHOL_EXPONENT) * liver.alcohol_tolerance * heavy_drinker_multiplier * seconds_per_tick, 0))/150)) - return ..() + if(liver.apply_organ_damage(((max(sqrt(volume) * (boozepwr ** ALCOHOL_EXPONENT) * liver.alcohol_tolerance * heavy_drinker_multiplier * seconds_per_tick, 0))/300))) // SKYRAT EDIT CHANGE - Alcohol Tolerance - Original: if((((max(sqrt(volume) * (boozepwr ** ALCOHOL_EXPONENT) * liver.alcohol_tolerance * heavy_drinker_multiplier * seconds_per_tick, 0))/150))) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/ethanol/expose_obj(obj/exposed_obj, reac_volume) if(istype(exposed_obj, /obj/item/paper)) @@ -151,9 +152,9 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/beer/green/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() if(drinker.color != color) drinker.add_atom_colour(color, TEMPORARY_COLOUR_PRIORITY) - return ..() /datum/reagent/consumable/ethanol/beer/green/on_mob_end_metabolize(mob/living/drinker) drinker.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, color) @@ -167,13 +168,12 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/kahlua/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() drinker.set_dizzy_if_lower(10 SECONDS * REM * seconds_per_tick) drinker.adjust_drowsiness(-6 SECONDS * REM * seconds_per_tick) drinker.AdjustSleeping(-40 * REM * seconds_per_tick) if(!HAS_TRAIT(drinker, TRAIT_ALCOHOL_TOLERANCE)) drinker.set_jitter_if_lower(10 SECONDS) - ..() - . = TRUE /datum/reagent/consumable/ethanol/whiskey name = "Whiskey" @@ -200,9 +200,9 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/whiskey/candycorn/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(5, seconds_per_tick)) drinker.adjust_hallucinations(4 SECONDS * REM * seconds_per_tick) - ..() /datum/reagent/consumable/ethanol/thirteenloko name = "Thirteen Loko" @@ -216,20 +216,21 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/thirteenloko/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() drinker.adjust_drowsiness(-14 SECONDS * REM * seconds_per_tick) drinker.AdjustSleeping(-40 * REM * seconds_per_tick) drinker.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, drinker.get_body_temp_normal()) if(!HAS_TRAIT(drinker, TRAIT_ALCOHOL_TOLERANCE)) drinker.set_jitter_if_lower(10 SECONDS) - ..() - return TRUE /datum/reagent/consumable/ethanol/thirteenloko/overdose_start(mob/living/drinker) + . = ..() to_chat(drinker, span_userdanger("Your entire body violently jitters as you start to feel queasy. You really shouldn't have drank all of that [name]!")) drinker.set_jitter_if_lower(40 SECONDS) drinker.Stun(1.5 SECONDS) /datum/reagent/consumable/ethanol/thirteenloko/overdose_process(mob/living/drinker, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(3.5, seconds_per_tick) && iscarbon(drinker)) var/obj/item/held_item = drinker.get_active_held_item() if(held_item) @@ -248,15 +249,18 @@ eyes.forceMove(get_turf(drinker)) to_chat(drinker, span_userdanger("You double over in pain as you feel your eyeballs liquify in your head!")) drinker.emote("scream") - drinker.adjustBruteLoss(15, required_bodytype = affected_bodytype) + if(drinker.adjustBruteLoss(15 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype)) + . = UPDATE_MOB_HEALTH else to_chat(drinker, span_userdanger("You scream in terror as you go blind!")) - eyes.apply_organ_damage(eyes.maxHealth) + if(eyes.apply_organ_damage(eyes.maxHealth)) + . = UPDATE_MOB_HEALTH drinker.emote("scream") if(SPT_PROB(1.5, seconds_per_tick) && iscarbon(drinker)) drinker.visible_message(span_danger("[drinker] starts having a seizure!"), span_userdanger("You have a seizure!")) - drinker.Unconscious(10 SECONDS) + if(drinker.Unconscious(10 SECONDS)) + . = UPDATE_MOB_HEALTH drinker.set_jitter_if_lower(700 SECONDS) if(SPT_PROB(0.5, seconds_per_tick) && iscarbon(drinker)) @@ -285,10 +289,10 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/bilk/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() if(drinker.getBruteLoss() && SPT_PROB(5, seconds_per_tick)) - drinker.heal_bodypart_damage(brute = 1) - . = TRUE - return ..() || . + if(drinker.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, updating_health = FALSE)) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/ethanol/threemileisland name = "Three Mile Island Iced Tea" @@ -301,8 +305,8 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/threemileisland/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() drinker.set_drugginess(100 SECONDS * REM * seconds_per_tick) - return ..() /datum/reagent/consumable/ethanol/gin name = "Gin" @@ -415,9 +419,9 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/absinthe/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(5, seconds_per_tick) && !HAS_TRAIT(drinker, TRAIT_ALCOHOL_TOLERANCE)) - drinker.adjust_hallucinations(8 SECONDS) - ..() + drinker.adjust_hallucinations(8 SECONDS * REM * seconds_per_tick) /datum/reagent/consumable/ethanol/hooch name = "Hooch" @@ -513,13 +517,15 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/cuba_libre/on_mob_life(mob/living/carbon/cubano, seconds_per_tick, times_fired) + . = ..() + var/need_mob_update if(cubano.mind && cubano.mind.has_antag_datum(/datum/antagonist/rev)) //Cuba Libre, the traditional drink of revolutions! Heals revolutionaries. - cubano.adjustBruteLoss(-1 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - cubano.adjustFireLoss(-1 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - cubano.adjustToxLoss(-1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - cubano.adjustOxyLoss(-5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - . = TRUE - return ..() || . + need_mob_update = cubano.adjustBruteLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += cubano.adjustFireLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += cubano.adjustToxLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += cubano.adjustOxyLoss(-5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/ethanol/whiskey_cola name = "Whiskey Cola" @@ -602,17 +608,17 @@ )) /datum/reagent/consumable/ethanol/screwdrivercocktail/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) if(HAS_TRAIT(liver, TRAIT_ENGINEER_METABOLISM)) ADD_TRAIT(drinker, TRAIT_HALT_RADIATION_EFFECTS, "[type]") if (HAS_TRAIT(drinker, TRAIT_IRRADIATED)) - drinker.adjustToxLoss(-2 * REM * seconds_per_tick, required_biotype = affected_biotype) - - return ..() + if(drinker.adjustToxLoss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/ethanol/screwdrivercocktail/on_mob_end_metabolize(mob/living/drinker) + . = ..() REMOVE_TRAIT(drinker, TRAIT_HALT_RADIATION_EFFECTS, "[type]") - return ..() /datum/reagent/consumable/ethanol/booger name = "Booger" @@ -648,6 +654,7 @@ var/tough_text /datum/reagent/consumable/ethanol/brave_bull/on_mob_metabolize(mob/living/drinker) + . = ..() tough_text = pick("brawny", "tenacious", "tough", "hardy", "sturdy") //Tuff stuff to_chat(drinker, span_notice("You feel [tough_text]!")) drinker.maxHealth += 10 //Brave Bull makes you sturdier, and thus capable of withstanding a tiny bit more punishment. @@ -655,6 +662,7 @@ ADD_TRAIT(drinker, TRAIT_FEARLESS, type) /datum/reagent/consumable/ethanol/brave_bull/on_mob_end_metabolize(mob/living/drinker) + . = ..() to_chat(drinker, span_notice("You no longer feel [tough_text].")) drinker.maxHealth -= 10 drinker.health = min(drinker.health - 10, drinker.maxHealth) //This can indeed crit you if you're alive solely based on alchol ingestion @@ -672,6 +680,7 @@ var/obj/effect/light_holder /datum/reagent/consumable/ethanol/tequila_sunrise/on_mob_metabolize(mob/living/drinker) + . = ..() to_chat(drinker, span_notice("You feel gentle warmth spread through your body!")) light_holder = new(drinker) light_holder.set_light(3, 0.7, "#FFCC00") //Tequila Sunrise makes you radiate dim light, like a sunrise! @@ -684,6 +693,7 @@ return ..() /datum/reagent/consumable/ethanol/tequila_sunrise/on_mob_end_metabolize(mob/living/drinker) + . = ..() to_chat(drinker, span_notice("The warmth in your body fades.")) QDEL_NULL(light_holder) @@ -697,8 +707,8 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/toxins_special/on_mob_life(mob/living/drinker, seconds_per_tick, times_fired) + . = ..() drinker.adjust_bodytemperature(15 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, drinker.get_body_temp_normal() + 20) //310.15 is the normal bodytemp. - return ..() /datum/reagent/consumable/ethanol/beepsky_smash name = "Beepsky Smash" @@ -714,6 +724,7 @@ var/datum/brain_trauma/special/beepsky/beepsky_hallucination /datum/reagent/consumable/ethanol/beepsky_smash/on_mob_metabolize(mob/living/carbon/drinker) + . = ..() if(HAS_TRAIT(drinker, TRAIT_ALCOHOL_TOLERANCE)) metabolization_rate = 0.8 // if you don't have a liver, or your liver isn't an officer's liver @@ -721,28 +732,27 @@ if(!liver || !HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM)) beepsky_hallucination = new() drinker.gain_trauma(beepsky_hallucination, TRAUMA_RESILIENCE_ABSOLUTE) - ..() /datum/reagent/consumable/ethanol/beepsky_smash/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() drinker.set_jitter_if_lower(4 SECONDS) var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) // if you have a liver and that liver is an officer's liver if(liver && HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM)) - . = TRUE - drinker.adjustStaminaLoss(-10 * REM * seconds_per_tick, required_biotype = affected_biotype) + if(drinker.adjustStaminaLoss(-10 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype)) + . = UPDATE_MOB_HEALTH if(SPT_PROB(10, seconds_per_tick)) drinker.cause_hallucination(get_random_valid_hallucination_subtype(/datum/hallucination/nearby_fake_item), name) if(SPT_PROB(5, seconds_per_tick)) drinker.cause_hallucination(/datum/hallucination/stray_bullet, name) - ..() - /datum/reagent/consumable/ethanol/beepsky_smash/on_mob_end_metabolize(mob/living/carbon/drinker) + . = ..() if(beepsky_hallucination) QDEL_NULL(beepsky_hallucination) - return ..() /datum/reagent/consumable/ethanol/beepsky_smash/overdose_start(mob/living/carbon/drinker) + . = ..() var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) // if you don't have a liver, or your liver isn't an officer's liver if(!liver || !HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM)) @@ -768,6 +778,7 @@ var/dorf_mode = FALSE /datum/reagent/consumable/ethanol/manly_dorf/on_mob_metabolize(mob/living/drinker) + . = ..() if(ishuman(drinker)) var/mob/living/carbon/human/potential_dwarf = drinker if(HAS_TRAIT(potential_dwarf, TRAIT_DWARF)) @@ -776,10 +787,13 @@ dorf_mode = TRUE /datum/reagent/consumable/ethanol/manly_dorf/on_mob_life(mob/living/carbon/dwarf, seconds_per_tick, times_fired) + . = ..() if(dorf_mode) - dwarf.adjustBruteLoss(-2 * REM * seconds_per_tick, required_bodytype = affected_bodytype) - dwarf.adjustFireLoss(-2 * REM * seconds_per_tick, required_bodytype = affected_bodytype) - return ..() + var/need_mob_update + need_mob_update = dwarf.adjustBruteLoss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += dwarf.adjustFireLoss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/ethanol/longislandicedtea name = "Long Island Iced Tea" @@ -809,6 +823,7 @@ glass_price = DRINK_PRICE_EASY /datum/reagent/consumable/ethanol/b52/on_mob_metabolize(mob/living/drinker) + . = ..() playsound(drinker, 'sound/effects/explosion_distant.ogg', 100, FALSE) /datum/reagent/consumable/ethanol/irishcoffee @@ -859,8 +874,8 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/manhattan_proj/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() drinker.set_drugginess(1 MINUTES * REM * seconds_per_tick) - return ..() /datum/reagent/consumable/ethanol/whiskeysoda name = "Whiskey Soda" @@ -881,8 +896,8 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/antifreeze/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() drinker.adjust_bodytemperature(20 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, drinker.get_body_temp_normal() + 20) //310.15 is the normal bodytemp. - return ..() /datum/reagent/consumable/ethanol/barefoot name = "Barefoot" @@ -894,12 +909,12 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/barefoot/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() if(ishuman(drinker)) //Barefoot causes the imbiber to quickly regenerate brute trauma if they're not wearing shoes. var/mob/living/carbon/human/unshoed = drinker if(!unshoed.shoes) - unshoed.adjustBruteLoss(-3 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - . = TRUE - return ..() || . + if(unshoed.adjustBruteLoss(-3 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype)) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/ethanol/snowwhite name = "Snow White" @@ -1028,13 +1043,16 @@ var/static/list/ray_filter = list(type = "rays", size = 40, density = 15, color = SUPERMATTER_SINGULARITY_RAYS_COLOUR, factor = 15) /datum/reagent/consumable/ethanol/singulo/on_mob_metabolize(mob/living/drinker) + . = ..() ADD_TRAIT(drinker, TRAIT_MADNESS_IMMUNE, type) /datum/reagent/consumable/ethanol/singulo/on_mob_end_metabolize(mob/living/drinker) + . = ..() REMOVE_TRAIT(drinker, TRAIT_MADNESS_IMMUNE, type) drinker.remove_filter("singulo_rays") /datum/reagent/consumable/ethanol/singulo/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(2.5, seconds_per_tick)) // 20u = 1x1, 45u = 2x2, 80u = 3x3 var/volume_to_radius = FLOOR(sqrt(volume/5), 1) - 1 @@ -1050,7 +1068,6 @@ animate(drinker.get_filter("singulo_rays"), offset = 10, time = 1.5 SECONDS, loop = -1) addtimer(CALLBACK(drinker, TYPE_PROC_REF(/datum, remove_filter), "singulo_rays"), 1.5 SECONDS) drinker.emote("burp") - return ..() /datum/reagent/consumable/ethanol/sbiten name = "Sbiten" @@ -1062,8 +1079,8 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/sbiten/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() drinker.adjust_bodytemperature(50 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, BODYTEMP_HEAT_DAMAGE_LIMIT) //310.15 is the normal bodytemp. - return ..() /datum/reagent/consumable/ethanol/red_mead name = "Red Mead" @@ -1093,8 +1110,8 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/iced_beer/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() drinker.adjust_bodytemperature(-20 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, T0C) //310.15 is the normal bodytemp. - return ..() /datum/reagent/consumable/ethanol/grog name = "Grog" @@ -1162,9 +1179,9 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/changelingsting/on_mob_life(mob/living/carbon/target, seconds_per_tick, times_fired) + . = ..() var/datum/antagonist/changeling/changeling = target.mind?.has_antag_datum(/datum/antagonist/changeling) changeling?.adjust_chemicals(metabolization_rate * REM * seconds_per_tick) - return ..() /datum/reagent/consumable/ethanol/irishcarbomb name = "Irish Car Bomb" @@ -1185,9 +1202,9 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/syndicatebomb/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(2.5, seconds_per_tick)) playsound(get_turf(drinker), 'sound/effects/explosionfar.ogg', 100, TRUE) - return ..() /datum/reagent/consumable/ethanol/hiveminderaser name = "Hivemind Eraser" @@ -1228,11 +1245,11 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/bananahonk/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) if((liver && HAS_TRAIT(liver, TRAIT_COMEDY_METABOLISM)) || ismonkey(drinker)) - drinker.heal_bodypart_damage(1 * REM * seconds_per_tick, 1 * REM * seconds_per_tick) - . = TRUE - return ..() || . + if(drinker.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 1 * REM * seconds_per_tick, updating_health = FALSE)) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/ethanol/silencer name = "Silencer" @@ -1245,11 +1262,11 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/silencer/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() if(ishuman(drinker) && HAS_MIND_TRAIT(drinker, TRAIT_MIMING)) drinker.set_silence_if_lower(MIMEDRINK_SILENCE_DURATION) - drinker.heal_bodypart_damage(1 * REM * seconds_per_tick, 1 * REM * seconds_per_tick) - . = TRUE - return ..() || . + if(drinker.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 1 * REM * seconds_per_tick, updating_health = FALSE)) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/ethanol/drunkenblumpkin name = "Drunken Blumpkin" @@ -1289,9 +1306,9 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/fetching_fizz/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() for(var/obj/item/stack/ore/O in orange(3, drinker)) step_towards(O, get_turf(drinker)) - return ..() //Another reference. Heals those in critical condition extremely quickly. /datum/reagent/consumable/ethanol/hearty_punch @@ -1305,14 +1322,16 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/hearty_punch/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() if(drinker.health <= 0) - drinker.adjustBruteLoss(-3 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - drinker.adjustFireLoss(-3 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - drinker.adjustCloneLoss(-5 * REM * seconds_per_tick, 0) - drinker.adjustOxyLoss(-4 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - drinker.adjustToxLoss(-3 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - . = TRUE - return ..() || . + var/need_mob_update + need_mob_update = drinker.adjustBruteLoss(-3 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += drinker.adjustFireLoss(-3 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += drinker.adjustCloneLoss(-5 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += drinker.adjustOxyLoss(-4 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += drinker.adjustToxLoss(-3 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/ethanol/bacchus_blessing //An EXTREMELY powerful drink. Smashed in seconds, dead in minutes. name = "Bacchus' Blessing" @@ -1333,20 +1352,19 @@ glass_price = DRINK_PRICE_HIGH /datum/reagent/consumable/ethanol/atomicbomb/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() drinker.set_drugginess(100 SECONDS * REM * seconds_per_tick) if(!HAS_TRAIT(drinker, TRAIT_ALCOHOL_TOLERANCE)) drinker.adjust_confusion(2 SECONDS * REM * seconds_per_tick) drinker.set_dizzy_if_lower(20 SECONDS * REM * seconds_per_tick) drinker.adjust_slurring(6 SECONDS * REM * seconds_per_tick) switch(current_cycle) - if(51 to 200) + if(52 to 201) drinker.Sleeping(100 * REM * seconds_per_tick) - . = TRUE - if(201 to INFINITY) + if(202 to INFINITY) drinker.AdjustSleeping(40 * REM * seconds_per_tick) - drinker.adjustToxLoss(2 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - . = TRUE - ..() + if(drinker.adjustToxLoss(2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/ethanol/gargle_blaster name = "Pan-Galactic Gargle Blaster" @@ -1358,20 +1376,19 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/gargle_blaster/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() drinker.adjust_dizzy(3 SECONDS * REM * seconds_per_tick) switch(current_cycle) - if(15 to 45) + if(16 to 46) drinker.adjust_slurring(3 SECONDS * REM * seconds_per_tick) - - if(45 to 55) + if(46 to 56) if(SPT_PROB(30, seconds_per_tick)) drinker.adjust_confusion(3 SECONDS * REM * seconds_per_tick) - if(55 to 200) + if(56 to 201) drinker.set_drugginess(110 SECONDS * REM * seconds_per_tick) - if(200 to INFINITY) - drinker.adjustToxLoss(2 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - . = TRUE - ..() + if(201 to INFINITY) + if(drinker.adjustToxLoss(2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/ethanol/neurotoxin name = "Neurotoxin" @@ -1387,35 +1404,37 @@ return (pick(TRAIT_PARALYSIS_L_ARM,TRAIT_PARALYSIS_R_ARM,TRAIT_PARALYSIS_R_LEG,TRAIT_PARALYSIS_L_LEG)) /datum/reagent/consumable/ethanol/neurotoxin/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() drinker.set_drugginess(100 SECONDS * REM * seconds_per_tick) drinker.adjust_dizzy(4 SECONDS * REM * seconds_per_tick) - drinker.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1 * REM * seconds_per_tick, 150, required_organ_flag = affected_organ_flags) + var/need_mob_update + need_mob_update = drinker.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1 * REM * seconds_per_tick, 150, required_organ_flag = affected_organ_flags) if(SPT_PROB(10, seconds_per_tick)) - drinker.adjustStaminaLoss(10, required_biotype = affected_biotype) + need_mob_update += drinker.adjustStaminaLoss(10 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) drinker.drop_all_held_items() to_chat(drinker, span_notice("You cant feel your hands!")) - if(current_cycle > 5) + if(current_cycle > 6) if(SPT_PROB(10, seconds_per_tick)) var/paralyzed_limb = pick_paralyzed_limb() ADD_TRAIT(drinker, paralyzed_limb, type) - drinker.adjustStaminaLoss(10, required_biotype = affected_biotype) - if(current_cycle > 30) - drinker.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) - if(current_cycle > 50 && SPT_PROB(7.5, seconds_per_tick)) + need_mob_update += drinker.adjustStaminaLoss(10 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + if(current_cycle > 31) + need_mob_update += drinker.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + if(current_cycle > 51 && SPT_PROB(7.5, seconds_per_tick)) if(!drinker.undergoing_cardiac_arrest() && drinker.can_heartattack()) drinker.set_heartattack(TRUE) if(drinker.stat == CONSCIOUS) drinker.visible_message(span_userdanger("[drinker] clutches at [drinker.p_their()] chest as if [drinker.p_their()] heart stopped!")) - . = TRUE - ..() + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/ethanol/neurotoxin/on_mob_end_metabolize(mob/living/carbon/drinker) + . = ..() REMOVE_TRAIT(drinker, TRAIT_PARALYSIS_L_ARM, type) REMOVE_TRAIT(drinker, TRAIT_PARALYSIS_R_ARM, type) REMOVE_TRAIT(drinker, TRAIT_PARALYSIS_R_LEG, type) REMOVE_TRAIT(drinker, TRAIT_PARALYSIS_L_LEG, type) drinker.adjustStaminaLoss(10, required_biotype = affected_biotype) - ..() /datum/reagent/consumable/ethanol/hippies_delight name = "Hippie's Delight" @@ -1429,36 +1448,36 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/hippies_delight/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() drinker.set_slurring_if_lower(1 SECONDS * REM * seconds_per_tick) switch(current_cycle) - if(1 to 5) + if(2 to 6) drinker.set_dizzy_if_lower(20 SECONDS * REM * seconds_per_tick) drinker.set_drugginess(1 MINUTES * REM * seconds_per_tick) if(SPT_PROB(5, seconds_per_tick)) drinker.emote(pick("twitch","giggle")) - if(5 to 10) + if(6 to 11) drinker.set_jitter_if_lower(40 SECONDS * REM * seconds_per_tick) drinker.set_dizzy_if_lower(40 SECONDS * REM * seconds_per_tick) drinker.set_drugginess(1.5 MINUTES * REM * seconds_per_tick) if(SPT_PROB(10, seconds_per_tick)) drinker.emote(pick("twitch","giggle")) - if (10 to 200) + if (11 to 201) drinker.set_jitter_if_lower(80 SECONDS * REM * seconds_per_tick) drinker.set_dizzy_if_lower(80 SECONDS * REM * seconds_per_tick) drinker.set_drugginess(2 MINUTES * REM * seconds_per_tick) if(SPT_PROB(16, seconds_per_tick)) drinker.emote(pick("twitch","giggle")) - if(200 to INFINITY) + if(201 to INFINITY) drinker.set_jitter_if_lower(120 SECONDS * REM * seconds_per_tick) drinker.set_dizzy_if_lower(120 SECONDS * REM * seconds_per_tick) drinker.set_drugginess(2.5 MINUTES * REM * seconds_per_tick) if(SPT_PROB(23, seconds_per_tick)) drinker.emote(pick("twitch","giggle")) if(SPT_PROB(16, seconds_per_tick)) - drinker.adjustToxLoss(2, FALSE, required_biotype = affected_biotype) - . = TRUE - ..() + if(drinker.adjustToxLoss(2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/ethanol/eggnog name = "Eggnog" @@ -1490,9 +1509,9 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/narsour/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() drinker.adjust_timed_status_effect(6 SECONDS * REM * seconds_per_tick, /datum/status_effect/speech/slurring/cult, max_duration = 6 SECONDS) drinker.adjust_stutter_up_to(6 SECONDS * REM * seconds_per_tick, 6 SECONDS) - return ..() /datum/reagent/consumable/ethanol/triple_sec name = "Triple Sec" @@ -1536,12 +1555,12 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/quadruple_sec/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() //Securidrink in line with the Screwdriver for engineers or Nothing for mimes var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) if(liver && HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM)) - drinker.heal_bodypart_damage(1 * REM * seconds_per_tick, 1 * REM * seconds_per_tick) - . = TRUE - return ..() + if(drinker.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 1 * REM * seconds_per_tick, updating_health = FALSE)) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/ethanol/quintuple_sec name = "Quintuple Sec" @@ -1553,13 +1572,15 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/quintuple_sec/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() //Securidrink in line with the Screwdriver for engineers or Nothing for mimes but STRONG.. var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) if(liver && HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM)) - drinker.heal_bodypart_damage(2 * REM * seconds_per_tick, 2 * REM * seconds_per_tick) - drinker.adjustStaminaLoss(-2 * REM * seconds_per_tick, required_biotype = affected_biotype) - . = TRUE - return ..() + var/need_mob_update + need_mob_update = drinker.heal_bodypart_damage(2 * REM * seconds_per_tick, 2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += drinker.adjustStaminaLoss(-2 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/ethanol/grasshopper name = "Grasshopper" @@ -1592,28 +1613,34 @@ glass_price = DRINK_PRICE_HIGH /datum/reagent/consumable/ethanol/bastion_bourbon/on_mob_metabolize(mob/living/drinker) + . = ..() var/heal_points = 10 if(drinker.health <= 0) heal_points = 20 //heal more if we're in softcrit - for(var/counter in 1 to min(volume, heal_points)) //only heals 1 point of damage per unit on add, for balance reasons - drinker.adjustBruteLoss(-1, required_bodytype = affected_bodytype) - drinker.adjustFireLoss(-1, required_bodytype = affected_bodytype) - drinker.adjustToxLoss(-1, required_biotype = affected_biotype) - drinker.adjustOxyLoss(-1, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - drinker.adjustStaminaLoss(-1, required_biotype = affected_biotype) + var/need_mob_update + var/heal_amt = min(volume, heal_points) //only heals 1 point of damage per unit on add, for balance reasons + need_mob_update = drinker.adjustBruteLoss(-heal_amt, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += drinker.adjustFireLoss(-heal_amt, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += drinker.adjustToxLoss(-heal_amt, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += drinker.adjustOxyLoss(-heal_amt, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += drinker.adjustStaminaLoss(-heal_amt, updating_stamina = FALSE, required_biotype = affected_biotype) + if(need_mob_update) + drinker.updatehealth() drinker.visible_message(span_warning("[drinker] shivers with renewed vigor!"), span_notice("One taste of [lowertext(name)] fills you with energy!")) if(!drinker.stat && heal_points == 20) //brought us out of softcrit drinker.visible_message(span_danger("[drinker] lurches to [drinker.p_their()] feet!"), span_boldnotice("Up and at 'em, kid.")) /datum/reagent/consumable/ethanol/bastion_bourbon/on_mob_life(mob/living/drinker, seconds_per_tick, times_fired) + . = ..() if(drinker.health > 0) - drinker.adjustBruteLoss(-1 * REM * seconds_per_tick, required_bodytype = affected_bodytype) - drinker.adjustFireLoss(-1 * REM * seconds_per_tick, required_bodytype = affected_bodytype) - drinker.adjustToxLoss(-0.5 * REM * seconds_per_tick, required_biotype = affected_biotype) - drinker.adjustOxyLoss(-3 * REM * seconds_per_tick, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - drinker.adjustStaminaLoss(-5 * REM * seconds_per_tick, required_biotype = affected_biotype) - . = TRUE - ..() + var/need_mob_update + need_mob_update = drinker.adjustBruteLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += drinker.adjustFireLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += drinker.adjustToxLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += drinker.adjustOxyLoss(-3 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += drinker.adjustStaminaLoss(-5 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/ethanol/squirt_cider name = "Squirt Cider" @@ -1625,9 +1652,8 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/squirt_cider/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() drinker.satiety += 5 * REM * seconds_per_tick //for context, vitamins give 15 satiety per second - ..() - . = TRUE /datum/reagent/consumable/ethanol/fringe_weaver name = "Fringe Weaver" @@ -1649,9 +1675,8 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/sugar_rush/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() drinker.satiety -= 10 * REM * seconds_per_tick //junky as hell! a whole glass will keep you from being able to eat junk food - ..() - . = TRUE /datum/reagent/consumable/ethanol/crevice_spike name = "Crevice Spike" @@ -1663,6 +1688,7 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/crevice_spike/on_mob_metabolize(mob/living/drinker) //damage only applies when drink first enters system and won't again until drink metabolizes out + . = ..() drinker.adjustBruteLoss(3 * min(5,volume), required_bodytype = affected_bodytype) //minimum 3 brute damage on ingestion to limit non-drink means of injury - a full 5 unit gulp of the drink trucks you for the full 15 /datum/reagent/consumable/ethanol/sake @@ -1684,9 +1710,9 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/peppermint_patty/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() drinker.apply_status_effect(/datum/status_effect/throat_soothed) drinker.adjust_bodytemperature(5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, drinker.get_body_temp_normal()) - ..() /datum/reagent/consumable/ethanol/alexander name = "Alexander" @@ -1699,24 +1725,24 @@ var/obj/item/shield/mighty_shield /datum/reagent/consumable/ethanol/alexander/on_mob_metabolize(mob/living/drinker) + . = ..() if(ishuman(drinker)) var/mob/living/carbon/human/the_human = drinker for(var/obj/item/shield/the_shield in the_human.contents) mighty_shield = the_shield mighty_shield.block_chance += 10 to_chat(the_human, span_notice("[the_shield] appears polished, although you don't recall polishing it.")) - return TRUE /datum/reagent/consumable/ethanol/alexander/on_mob_life(mob/living/drinker, seconds_per_tick, times_fired) - ..() if(mighty_shield && !(mighty_shield in drinker.contents)) //If you had a shield and lose it, you lose the reagent as well. Otherwise this is just a normal drink. holder.remove_reagent(type, volume) + return ..() /datum/reagent/consumable/ethanol/alexander/on_mob_end_metabolize(mob/living/drinker) + . = ..() if(mighty_shield) mighty_shield.block_chance -= 10 to_chat(drinker,span_notice("You notice [mighty_shield] looks worn again. Weird.")) - ..() /datum/reagent/consumable/ethanol/amaretto_alexander name = "Amaretto Alexander" @@ -1748,7 +1774,7 @@ glass_price = DRINK_PRICE_MEDIUM /datum/reagent/consumable/ethanol/between_the_sheets/on_mob_life(mob/living/drinker, seconds_per_tick, times_fired) - ..() + . = ..() var/is_between_the_sheets = FALSE for(var/obj/item/bedsheet/bedsheet in range(drinker.loc, 0)) if(bedsheet.loc != drinker.loc) // bedsheets in your backpack/neck don't count @@ -1759,15 +1785,18 @@ if(!drinker.IsSleeping() || !is_between_the_sheets) return + var/need_mob_update if(drinker.getBruteLoss() && drinker.getFireLoss()) //If you are damaged by both types, slightly increased healing but it only heals one. The more the merrier wink wink. if(prob(50)) - drinker.adjustBruteLoss(-0.25 * REM * seconds_per_tick, required_bodytype = affected_bodytype) + need_mob_update = drinker.adjustBruteLoss(-0.25 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) else - drinker.adjustFireLoss(-0.25 * REM * seconds_per_tick, required_bodytype = affected_bodytype) + need_mob_update = drinker.adjustFireLoss(-0.25 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) else if(drinker.getBruteLoss()) //If you have only one, it still heals but not as well. - drinker.adjustBruteLoss(-0.2 * REM * seconds_per_tick, required_bodytype = affected_bodytype) + need_mob_update = drinker.adjustBruteLoss(-0.2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) else if(drinker.getFireLoss()) - drinker.adjustFireLoss(-0.2 * REM * seconds_per_tick, required_bodytype = affected_bodytype) + need_mob_update = drinker.adjustFireLoss(-0.2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/ethanol/kamikaze name = "Kamikaze" @@ -1806,11 +1835,12 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/fernet/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() if(drinker.nutrition <= NUTRITION_LEVEL_STARVING) - drinker.adjustToxLoss(1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) + if(drinker.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + . = UPDATE_MOB_HEALTH drinker.adjust_nutrition(-5 * REM * seconds_per_tick) drinker.overeatduration = 0 - return ..() /datum/reagent/consumable/ethanol/fernet_cola name = "Fernet Cola" @@ -1822,11 +1852,12 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/fernet_cola/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() if(drinker.nutrition <= NUTRITION_LEVEL_STARVING) - drinker.adjustToxLoss(0.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) + if(drinker.adjustToxLoss(0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + . = UPDATE_MOB_HEALTH drinker.adjust_nutrition(-3 * REM * seconds_per_tick) drinker.overeatduration = 0 - return ..() /datum/reagent/consumable/ethanol/fanciulli name = "Fanciulli" @@ -1839,15 +1870,14 @@ glass_price = DRINK_PRICE_HIGH /datum/reagent/consumable/ethanol/fanciulli/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() drinker.adjust_nutrition(-5 * REM * seconds_per_tick) drinker.overeatduration = 0 - return ..() /datum/reagent/consumable/ethanol/fanciulli/on_mob_metabolize(mob/living/drinker) + . = ..() if(drinker.health > 0) drinker.adjustStaminaLoss(20, required_biotype = affected_biotype) - . = TRUE - ..() /datum/reagent/consumable/ethanol/branca_menta name = "Branca Menta" @@ -1860,14 +1890,13 @@ glass_price = DRINK_PRICE_MEDIUM /datum/reagent/consumable/ethanol/branca_menta/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() drinker.adjust_bodytemperature(-20 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, T0C) - return ..() /datum/reagent/consumable/ethanol/branca_menta/on_mob_metabolize(mob/living/drinker) + . = ..() if(drinker.health > 0) drinker.adjustStaminaLoss(35, required_biotype = affected_biotype) - . = TRUE - ..() /datum/reagent/consumable/ethanol/blank_paper name = "Blank Paper" @@ -1880,11 +1909,11 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/blank_paper/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() if(ishuman(drinker) && HAS_MIND_TRAIT(drinker, TRAIT_MIMING)) drinker.set_silence_if_lower(MIMEDRINK_SILENCE_DURATION) - drinker.heal_bodypart_damage(1 * REM * seconds_per_tick, 1 * REM * seconds_per_tick) - . = TRUE - return ..() + if(drinker.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 1 * REM * seconds_per_tick, updating_health = FALSE)) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/ethanol/fruit_wine name = "Fruit Wine" @@ -2011,13 +2040,16 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/wizz_fizz/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() //A healing drink similar to Quadruple Sec, Ling Stings, and Screwdrivers for the Wizznerds; the check is consistent with the changeling sting if(drinker?.mind?.has_antag_datum(/datum/antagonist/wizard)) - drinker.heal_bodypart_damage(1 * REM * seconds_per_tick, 1 * REM * seconds_per_tick) - drinker.adjustOxyLoss(-1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - drinker.adjustToxLoss(-1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - drinker.adjustStaminaLoss(-1 * REM * seconds_per_tick, required_biotype = affected_biotype) - return ..() + var/need_mob_update + need_mob_update = drinker.heal_bodypart_damage(1 * REM * seconds_per_tick, 1 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += drinker.adjustOxyLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += drinker.adjustToxLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += drinker.adjustStaminaLoss(-1 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/ethanol/bug_spray name = "Bug Spray" @@ -2027,19 +2059,20 @@ quality = DRINK_GOOD taste_description = "the pain of ten thousand slain mosquitos" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + affected_biotype = MOB_BUG /datum/reagent/consumable/ethanol/bug_spray/on_new(data) . = ..() AddElement(/datum/element/bugkiller_reagent) /datum/reagent/consumable/ethanol/bug_spray/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() // Does some damage to bug biotypes - var/did_damage = drinker.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = MOB_BUG) - // Random chance of causing a screm if we did some damage - if(did_damage && SPT_PROB(2, seconds_per_tick)) - drinker.emote("scream") - - return ..() || did_damage + if(drinker.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + . = UPDATE_MOB_HEALTH + // Random chance of causing a screm if we did some damage + if(SPT_PROB(2, seconds_per_tick)) + drinker.emote("scream") /datum/reagent/consumable/ethanol/applejack name = "Applejack" @@ -2068,10 +2101,11 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/turbo/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(2, seconds_per_tick)) to_chat(drinker, span_notice("[pick("You feel disregard for the rule of law.", "You feel pumped!", "Your head is pounding.", "Your thoughts are racing..")]")) - drinker.adjustStaminaLoss(-0.25 * drinker.get_drunk_amount() * REM * seconds_per_tick, required_biotype = affected_biotype) - return ..() + if(drinker.adjustStaminaLoss(-0.25 * drinker.get_drunk_amount() * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/ethanol/old_timer name = "Old Timer" @@ -2083,6 +2117,7 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/old_timer/on_mob_life(mob/living/carbon/human/metabolizer, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(10, seconds_per_tick) && istype(metabolizer)) metabolizer.age += 1 if(metabolizer.age > 70) @@ -2097,8 +2132,6 @@ metabolizer.visible_message(span_notice("[metabolizer] becomes older than any man should be.. and crumbles into dust!")) metabolizer.dust(just_ash = FALSE, drop_items = TRUE, force = FALSE) - return ..() - /datum/reagent/consumable/ethanol/rubberneck name = "Rubberneck" description = "A quality rubberneck should not contain any gross natural ingredients." @@ -2135,11 +2168,12 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/trappist/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() if(drinker.mind?.holy_role) - drinker.adjustFireLoss(-2.5 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) + if(drinker.adjustFireLoss(-2.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype)) + . = UPDATE_MOB_HEALTH drinker.adjust_jitter(-2 SECONDS * REM * seconds_per_tick) drinker.adjust_stutter(-2 SECONDS * REM * seconds_per_tick) - return ..() /datum/reagent/consumable/ethanol/blazaam name = "Blazaam" @@ -2150,6 +2184,7 @@ var/stored_teleports = 0 /datum/reagent/consumable/ethanol/blazaam/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() if(drinker.get_drunk_amount() > 40) if(stored_teleports) do_teleport(drinker, get_turf(drinker), rand(1,3), channel = TELEPORT_CHANNEL_WORMHOLE) @@ -2159,7 +2194,6 @@ stored_teleports += rand(2, 6) if(prob(70)) drinker.vomit(vomit_flags = VOMIT_CATEGORY_DEFAULT, vomit_type = /obj/effect/decal/cleanable/vomit/purple) - return ..() /datum/reagent/consumable/ethanol/planet_cracker name = "Planet Cracker" @@ -2181,9 +2215,8 @@ // Heats the user up while the reagent is in the body. Occasionally makes you burst into flames. drinker.adjust_bodytemperature(25 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick) if (SPT_PROB(2.5, seconds_per_tick)) - drinker.adjust_fire_stacks(1) + drinker.adjust_fire_stacks(1 * REM * seconds_per_tick) drinker.ignite_mob() - ..() /datum/reagent/consumable/ethanol/painkiller name = "Painkiller" @@ -2211,6 +2244,7 @@ taste_description = "a horrible emulsion of pineapple and olive oil" /datum/reagent/consumable/ethanol/pina_olivada/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(8, seconds_per_tick)) drinker.manual_emote(pick("coughs up some oil", "swallows the lump in [drinker.p_their()] throat", "gags", "chokes up a bit")) if(SPT_PROB(3, seconds_per_tick)) @@ -2222,7 +2256,6 @@ "Your throat feels horrible.", ) to_chat(drinker, span_notice(pick(messages))) - return ..() /datum/reagent/consumable/ethanol/pruno // pruno mix is in drink_reagents name = "Pruno" @@ -2233,8 +2266,8 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/pruno/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() drinker.adjust_disgust(5 * REM * seconds_per_tick) - ..() /datum/reagent/consumable/ethanol/ginger_amaretto name = "Ginger Amaretto" @@ -2274,9 +2307,10 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/kortara/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() if(drinker.getBruteLoss() && SPT_PROB(10, seconds_per_tick)) - drinker.heal_bodypart_damage(1,0) - . = TRUE + if(drinker.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 0, updating_health = FALSE)) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/ethanol/sea_breeze name = "Sea Breeze" @@ -2288,8 +2322,8 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/sea_breeze/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() drinker.apply_status_effect(/datum/status_effect/throat_soothed) - ..() /datum/reagent/consumable/ethanol/white_tiziran name = "White Tiziran" @@ -2310,8 +2344,8 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/drunken_espatier/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() drinker.add_mood_event("numb", /datum/mood_event/narcotic_medium, name) //comfortably numb - ..() /datum/reagent/consumable/ethanol/drunken_espatier/on_mob_metabolize(mob/living/drinker) . = ..() @@ -2332,12 +2366,12 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/protein_blend/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() drinker.adjust_nutrition(2 * REM * seconds_per_tick) if(!islizard(drinker)) drinker.adjust_disgust(5 * REM * seconds_per_tick) else drinker.adjust_disgust(2 * REM * seconds_per_tick) - ..() /datum/reagent/consumable/ethanol/mushi_kombucha name = "Mushi Kombucha" @@ -2358,9 +2392,9 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/triumphal_arch/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() if(islizard(drinker)) drinker.add_mood_event("triumph", /datum/mood_event/memories_of_home, name) - ..() /datum/reagent/consumable/ethanol/the_juice name = "The Juice" @@ -2378,9 +2412,9 @@ drinker.gain_trauma(prophet_trauma, TRAUMA_RESILIENCE_ABSOLUTE) /datum/reagent/consumable/ethanol/the_juice/on_mob_end_metabolize(mob/living/carbon/drinker) + . = ..() if(prophet_trauma) QDEL_NULL(prophet_trauma) - return ..() //a jacked up absinthe that causes hallucinations to the game master controller basically, used in smuggling objectives /datum/reagent/consumable/ethanol/ritual_wine @@ -2517,11 +2551,10 @@ var/hal_cap = 24 /datum/reagent/consumable/ethanol/helianthus/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(5, seconds_per_tick)) drinker.adjust_hallucinations_up_to(4 SECONDS * REM * seconds_per_tick, 48 SECONDS) - ..() - /datum/reagent/consumable/ethanol/plumwine name = "Plum wine" description = "Plums turned into wine." @@ -2552,8 +2585,8 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/gin_garden/on_mob_life(mob/living/carbon/doll, seconds_per_tick, times_fired) + . = ..() doll.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, doll.get_body_temp_normal()) - ..() /datum/reagent/consumable/ethanol/wine_voltaic name = "Voltaic Yellow Wine" @@ -2587,8 +2620,8 @@ ADD_TRAIT(affected_mob, TRAIT_SHOCKIMMUNE, type) /datum/reagent/consumable/ethanol/telepole/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() REMOVE_TRAIT(affected_mob, TRAIT_SHOCKIMMUNE, type) - return ..() /datum/reagent/consumable/ethanol/telepole/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) //can't be on life because of the way blood works. . = ..() @@ -2610,11 +2643,11 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/pod_tesla/on_mob_metabolize(mob/living/affected_mob) - ..() + . = ..() affected_mob.add_traits(list(TRAIT_SHOCKIMMUNE,TRAIT_TESLA_SHOCKIMMUNE,TRAIT_FEARLESS), type) - /datum/reagent/consumable/ethanol/pod_tesla/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() affected_mob.remove_traits(list(TRAIT_SHOCKIMMUNE,TRAIT_TESLA_SHOCKIMMUNE,TRAIT_FEARLESS), type) /datum/reagent/consumable/ethanol/pod_tesla/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) //can't be on life because of the way blood works. diff --git a/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm index 36444d6229b..8270b42f502 100644 --- a/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm @@ -8,10 +8,10 @@ default_container = /obj/item/reagent_containers/cup/glass/bottle/juice/orangejuice /datum/reagent/consumable/orangejuice/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(affected_mob.getOxyLoss() && SPT_PROB(16, seconds_per_tick)) - affected_mob.adjustOxyLoss(-1, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - . = TRUE - ..() + if(affected_mob.adjustOxyLoss(-1 * REM * seconds_per_tick, FALSE, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type)) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/tomatojuice name = "Tomato Juice" @@ -22,10 +22,10 @@ default_container = /obj/item/reagent_containers/cup/glass/bottle/juice/tomatojuice /datum/reagent/consumable/tomatojuice/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(affected_mob.getFireLoss() && SPT_PROB(10, seconds_per_tick)) - affected_mob.heal_bodypart_damage(0, 1) - . = TRUE - ..() + if(affected_mob.heal_bodypart_damage(brute = 0, burn = 1 * REM * seconds_per_tick, updating_health = FALSE)) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/limejuice name = "Lime Juice" @@ -37,10 +37,10 @@ default_container = /obj/item/reagent_containers/cup/glass/bottle/juice/limejuice /datum/reagent/consumable/limejuice/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(affected_mob.getToxLoss() && SPT_PROB(10, seconds_per_tick)) - affected_mob.adjustToxLoss(-1, FALSE, required_biotype = affected_biotype) - . = TRUE - ..() + if(affected_mob.adjustToxLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/carrotjuice name = "Carrot Juice" @@ -50,17 +50,20 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/carrotjuice/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_eye_blur(-2 SECONDS * REM * seconds_per_tick) affected_mob.adjust_temp_blindness(-2 SECONDS * REM * seconds_per_tick) + var/need_mob_update switch(current_cycle) if(1 to 20) //nothing if(21 to 110) if(SPT_PROB(100 * (1 - (sqrt(110 - current_cycle) / 10)), seconds_per_tick)) - affected_mob.adjustOrganLoss(ORGAN_SLOT_EYES, -2) + need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_EYES, -2 * REM * seconds_per_tick) if(110 to INFINITY) - affected_mob.adjustOrganLoss(ORGAN_SLOT_EYES, -2) - return ..() + need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_EYES, -2 * REM * seconds_per_tick) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/berryjuice name = "Berry Juice" @@ -84,9 +87,9 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/poisonberryjuice/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - . = TRUE - ..() + . = ..() + if(affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/watermelonjuice name = "Watermelon Juice" @@ -111,11 +114,11 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/banana/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) if((liver && HAS_TRAIT(liver, TRAIT_COMEDY_METABOLISM)) || ismonkey(affected_mob)) - affected_mob.heal_bodypart_damage(1 * REM * seconds_per_tick, 1 * REM * seconds_per_tick) - . = TRUE - ..() + if(affected_mob.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 1 * REM * seconds_per_tick, updating_health = FALSE)) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/nothing name = "Nothing" @@ -128,11 +131,11 @@ icon_state = "shotglass" /datum/reagent/consumable/nothing/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() if(ishuman(drinker) && HAS_MIND_TRAIT(drinker, TRAIT_MIMING)) drinker.set_silence_if_lower(MIMEDRINK_SILENCE_DURATION) - drinker.heal_bodypart_damage(1 * REM * seconds_per_tick, 1 * REM * seconds_per_tick) - . = TRUE - ..() + if(drinker.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 1 * REM * seconds_per_tick, updating_health = FALSE)) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/laughter name = "Laughter" @@ -143,9 +146,9 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/laughter/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.emote("laugh") affected_mob.add_mood_event("chemical_laughter", /datum/mood_event/chemical_laughter) - ..() /datum/reagent/consumable/superlaughter name = "Super Laughter" @@ -156,11 +159,11 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/superlaughter/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(16, seconds_per_tick)) affected_mob.visible_message(span_danger("[affected_mob] bursts out into a fit of uncontrollable laughter!"), span_userdanger("You burst out in a fit of uncontrollable laughter!")) affected_mob.Stun(5) affected_mob.add_mood_event("chemical_laughter", /datum/mood_event/chemical_superlaughter) - ..() /datum/reagent/consumable/potato_juice name = "Potato Juice" @@ -179,11 +182,11 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/pickle/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) if((liver && HAS_TRAIT(liver, TRAIT_CORONER_METABOLISM))) - affected_mob.adjustToxLoss(-1, FALSE, required_biotype = affected_biotype) - . = TRUE - ..() + if(affected_mob.adjustToxLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/grapejuice name = "Grape Juice" @@ -219,11 +222,11 @@ /datum/reagent/consumable/milk/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) if(affected_mob.getBruteLoss() && SPT_PROB(10, seconds_per_tick)) - affected_mob.heal_bodypart_damage(1,0) - . = TRUE + if(affected_mob.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 0, updating_health = FALSE)) + . = UPDATE_MOB_HEALTH if(holder.has_reagent(/datum/reagent/consumable/capsaicin)) holder.remove_reagent(/datum/reagent/consumable/capsaicin, 1 * seconds_per_tick) - ..() + return ..() || . /datum/reagent/consumable/soymilk name = "Soy Milk" @@ -234,10 +237,10 @@ default_container = /obj/item/reagent_containers/condiment/soymilk /datum/reagent/consumable/soymilk/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(affected_mob.getBruteLoss() && SPT_PROB(10, seconds_per_tick)) - affected_mob.heal_bodypart_damage(1, 0) - . = TRUE - ..() + if(affected_mob.heal_bodypart_damage(1, 0)) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/cream name = "Cream" @@ -265,8 +268,8 @@ /datum/reagent/consumable/coffee/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.set_jitter_if_lower(10 SECONDS * REM * seconds_per_tick) - ..() /datum/reagent/consumable/coffee/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) affected_mob.adjust_dizzy(-10 SECONDS * REM * seconds_per_tick) @@ -276,8 +279,7 @@ affected_mob.adjust_bodytemperature(25 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, affected_mob.get_body_temp_normal()) if(holder.has_reagent(/datum/reagent/consumable/frostoil)) holder.remove_reagent(/datum/reagent/consumable/frostoil, 5 * REM * seconds_per_tick) - ..() - . = TRUE + return ..() || . /datum/reagent/consumable/tea name = "Tea" @@ -290,12 +292,16 @@ default_container = /obj/item/reagent_containers/cup/glass/mug/tea /datum/reagent/consumable/tea/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_dizzy(-4 SECONDS * REM * seconds_per_tick) affected_mob.adjust_drowsiness(-2 SECONDS * REM * seconds_per_tick) affected_mob.adjust_jitter(-6 SECONDS * REM * seconds_per_tick) affected_mob.AdjustSleeping(-20 * REM * seconds_per_tick) if(affected_mob.getToxLoss() && SPT_PROB(10, seconds_per_tick)) - affected_mob.adjustToxLoss(-1, FALSE, required_biotype = affected_biotype) + if(affected_mob.adjustToxLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + . = UPDATE_MOB_HEALTH + affected_mob.adjust_bodytemperature(20 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, affected_mob.get_body_temp_normal()) + var/to_chatted = FALSE for(var/datum/wound/iter_wound as anything in affected_mob.all_wounds) if(SPT_PROB(10, seconds_per_tick)) @@ -303,9 +309,6 @@ if(!to_chatted && helped) to_chat(affected_mob, span_notice("A calm, relaxed feeling suffuses you. Your wounds feel a little healthier.")) to_chatted = TRUE - affected_mob.adjust_bodytemperature(20 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, affected_mob.get_body_temp_normal()) - ..() - . = TRUE // Different handling, different name. // Returns FALSE by default so broken bones and 'loss' wounds don't give a false message @@ -348,10 +351,9 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/tea/arnold_palmer/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(2.5, seconds_per_tick)) to_chat(affected_mob, span_notice("[pick("You remember to square your shoulders.","You remember to keep your head down.","You can't decide between squaring your shoulders and keeping your head down.","You remember to relax.","You think about how someday you'll get two strokes off your golf game.")]")) - ..() - . = TRUE /datum/reagent/consumable/icecoffee name = "Iced Coffee" @@ -362,13 +364,12 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/icecoffee/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_dizzy(-10 SECONDS * REM * seconds_per_tick) affected_mob.adjust_drowsiness(-6 SECONDS * REM * seconds_per_tick) affected_mob.AdjustSleeping(-40 * REM * seconds_per_tick) affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) affected_mob.set_jitter_if_lower(10 SECONDS * REM * seconds_per_tick) - ..() - . = TRUE /datum/reagent/consumable/hot_ice_coffee name = "Hot Ice Coffee" @@ -379,14 +380,14 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/hot_ice_coffee/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_dizzy(-10 SECONDS * REM * seconds_per_tick) affected_mob.adjust_drowsiness(-6 SECONDS * REM * seconds_per_tick) affected_mob.AdjustSleeping(-60 * REM * seconds_per_tick) affected_mob.adjust_bodytemperature(-7 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) affected_mob.set_jitter_if_lower(10 SECONDS * REM * seconds_per_tick) - affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - ..() - . = TRUE + if(affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/icetea name = "Iced Tea" @@ -397,14 +398,14 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/icetea/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_dizzy(-4 SECONDS * REM * seconds_per_tick) affected_mob.adjust_drowsiness(-2 SECONDS * REM * seconds_per_tick) affected_mob.AdjustSleeping(-40 * REM * seconds_per_tick) if(affected_mob.getToxLoss() && SPT_PROB(10, seconds_per_tick)) - affected_mob.adjustToxLoss(-1, FALSE, required_biotype = affected_biotype) + if(affected_mob.adjustToxLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + . = UPDATE_MOB_HEALTH affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) - ..() - . = TRUE /datum/reagent/consumable/space_cola name = "Cola" @@ -414,9 +415,9 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/space_cola/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_drowsiness(-10 SECONDS * REM * seconds_per_tick) affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) - ..() /datum/reagent/consumable/roy_rogers name = "Roy Rogers" @@ -441,22 +442,21 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/nuka_cola/on_mob_metabolize(mob/living/affected_mob) - ..() + . = ..() affected_mob.add_movespeed_modifier(/datum/movespeed_modifier/reagent/nuka_cola) /datum/reagent/consumable/nuka_cola/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() affected_mob.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/nuka_cola) - ..() /datum/reagent/consumable/nuka_cola/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.set_jitter_if_lower(40 SECONDS * REM * seconds_per_tick) affected_mob.set_drugginess(1 MINUTES * REM * seconds_per_tick) affected_mob.adjust_dizzy(3 SECONDS * REM * seconds_per_tick) affected_mob.remove_status_effect(/datum/status_effect/drowsiness) affected_mob.AdjustSleeping(-40 * REM * seconds_per_tick) affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) - ..() - . = TRUE /datum/reagent/consumable/rootbeer name = "root beer" @@ -471,15 +471,16 @@ var/effect_enabled = FALSE /datum/reagent/consumable/rootbeer/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() REMOVE_TRAIT(affected_mob, TRAIT_DOUBLE_TAP, type) if(current_cycle > 10) to_chat(affected_mob, span_warning("You feel kinda tired as your sugar rush wears off...")) affected_mob.adjustStaminaLoss(min(80, current_cycle * 3), required_biotype = affected_biotype) - affected_mob.adjust_drowsiness(current_cycle * 2 SECONDS) - ..() + affected_mob.adjust_drowsiness((current_cycle-1) * 2 SECONDS) /datum/reagent/consumable/rootbeer/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - if(current_cycle >= 3 && !effect_enabled) // takes a few seconds for the bonus to kick in to prevent microdosing + . = ..() + if(current_cycle > 3 && !effect_enabled) // takes a few seconds for the bonus to kick in to prevent microdosing to_chat(affected_mob, span_notice("You feel your trigger finger getting itchy...")) ADD_TRAIT(affected_mob, TRAIT_DOUBLE_TAP, type) effect_enabled = TRUE @@ -490,9 +491,6 @@ if(current_cycle > 10) affected_mob.adjust_dizzy(3 SECONDS * REM * seconds_per_tick) - ..() - . = TRUE - /datum/reagent/consumable/grey_bull name = "Grey Bull" description = "Grey Bull, it gives you gloves!" @@ -502,7 +500,7 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/grey_bull/on_mob_metabolize(mob/living/carbon/affected_atom) - ..() + . = ..() ADD_TRAIT(affected_atom, TRAIT_SHOCKIMMUNE, type) var/obj/item/organ/internal/liver/liver = affected_atom.get_organ_slot(ORGAN_SLOT_LIVER) if(HAS_TRAIT(liver, TRAIT_MAINTENANCE_METABOLISM)) @@ -510,16 +508,16 @@ metabolization_rate *= 0.8 /datum/reagent/consumable/grey_bull/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() REMOVE_TRAIT(affected_mob, TRAIT_SHOCKIMMUNE, type) - ..() /datum/reagent/consumable/grey_bull/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.set_jitter_if_lower(40 SECONDS * REM * seconds_per_tick) affected_mob.adjust_dizzy(2 SECONDS * REM * seconds_per_tick) affected_mob.remove_status_effect(/datum/status_effect/drowsiness) affected_mob.AdjustSleeping(-40 * REM * seconds_per_tick) affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) - ..() /datum/reagent/consumable/spacemountainwind name = "SM Wind" @@ -529,12 +527,11 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/spacemountainwind/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_drowsiness(-14 SECONDS * REM * seconds_per_tick) affected_mob.AdjustSleeping(-20 * REM * seconds_per_tick) affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) affected_mob.set_jitter_if_lower(10 SECONDS * REM * seconds_per_tick) - ..() - . = TRUE /datum/reagent/consumable/dr_gibb name = "Dr. Gibb" @@ -544,9 +541,9 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/dr_gibb/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_drowsiness(-12 SECONDS * REM * seconds_per_tick) affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) - ..() /datum/reagent/consumable/space_up name = "Space-Up" @@ -556,8 +553,8 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/space_up/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_bodytemperature(-8 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) - ..() /datum/reagent/consumable/lemon_lime name = "Lemon Lime" @@ -567,8 +564,8 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/lemon_lime/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_bodytemperature(-8 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) - ..() /datum/reagent/consumable/pwr_game name = "Pwr Game" @@ -585,10 +582,10 @@ You feel as though a great secret of the universe has been made known to you...") /datum/reagent/consumable/pwr_game/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_bodytemperature(-8 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) if(SPT_PROB(5, seconds_per_tick)) affected_mob.mind?.adjust_experience(/datum/skill/gaming, 5) - ..() /datum/reagent/consumable/shamblers name = "Shambler's Juice" @@ -598,8 +595,8 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/shamblers/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_bodytemperature(-8 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) - ..() /datum/reagent/consumable/sodawater name = "Soda Water" @@ -615,10 +612,10 @@ mytray.adjust_plant_health(round(volume * 0.1)) /datum/reagent/consumable/sodawater/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_dizzy(-10 SECONDS * REM * seconds_per_tick) affected_mob.adjust_drowsiness(-6 SECONDS * REM * seconds_per_tick) affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) - ..() /datum/reagent/consumable/tonic name = "Tonic Water" @@ -628,12 +625,11 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/tonic/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_dizzy(-10 SECONDS * REM * seconds_per_tick) affected_mob.adjust_drowsiness(-6 SECONDS * REM * seconds_per_tick) affected_mob.AdjustSleeping(-40 * REM * seconds_per_tick) affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) - ..() - . = TRUE /datum/reagent/consumable/wellcheers name = "Wellcheers" @@ -643,15 +639,18 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/wellcheers/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_drowsiness(3 SECONDS * REM * seconds_per_tick) + var/need_mob_update switch(affected_mob.mob_mood.sanity_level) if (SANITY_INSANE to SANITY_CRAZY) - affected_mob.adjustStaminaLoss(3 * REM * seconds_per_tick, 0) + need_mob_update = affected_mob.adjustStaminaLoss(3 * REM * seconds_per_tick, updating_stamina = FALSE) if (SANITY_UNSTABLE to SANITY_DISTURBED) affected_mob.add_mood_event("wellcheers", /datum/mood_event/wellcheers) if (SANITY_NEUTRAL to SANITY_GREAT) - affected_mob.adjustBruteLoss(-1.5 * REM * seconds_per_tick, 0) - return ..() + need_mob_update = affected_mob.adjustBruteLoss(-1.5 * REM * seconds_per_tick, updating_health = FALSE) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/monkey_energy name = "Monkey Energy" @@ -662,26 +661,26 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/monkey_energy/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.set_jitter_if_lower(80 SECONDS * REM * seconds_per_tick) affected_mob.adjust_dizzy(2 SECONDS * REM * seconds_per_tick) affected_mob.remove_status_effect(/datum/status_effect/drowsiness) affected_mob.AdjustSleeping(-40 * REM * seconds_per_tick) affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) - ..() /datum/reagent/consumable/monkey_energy/on_mob_metabolize(mob/living/affected_mob) - ..() + . = ..() if(ismonkey(affected_mob)) affected_mob.add_movespeed_modifier(/datum/movespeed_modifier/reagent/monkey_energy) /datum/reagent/consumable/monkey_energy/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() affected_mob.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/monkey_energy) - ..() /datum/reagent/consumable/monkey_energy/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(7.5, seconds_per_tick)) affected_mob.say(pick_list_replacements(BOOMER_FILE, "boomer"), forced = /datum/reagent/consumable/monkey_energy) - ..() /datum/reagent/consumable/ice name = "Ice" @@ -693,8 +692,9 @@ default_container = /obj/item/reagent_containers/cup/glass/ice /datum/reagent/consumable/ice/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) - ..() + . = ..() + if(affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, FALSE, affected_mob.get_body_temp_normal())) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/soy_latte name = "Soy Latte" @@ -706,15 +706,17 @@ glass_price = DRINK_PRICE_EASY /datum/reagent/consumable/soy_latte/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_dizzy(-10 SECONDS * REM * seconds_per_tick) affected_mob.adjust_drowsiness(-6 SECONDS * REM * seconds_per_tick) - affected_mob.SetSleeping(0) + var/need_mob_update + need_mob_update = affected_mob.SetSleeping(0) affected_mob.adjust_bodytemperature(5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, affected_mob.get_body_temp_normal()) affected_mob.set_jitter_if_lower(10 SECONDS * REM * seconds_per_tick) if(affected_mob.getBruteLoss() && SPT_PROB(10, seconds_per_tick)) - affected_mob.heal_bodypart_damage(1,0) - ..() - . = TRUE + need_mob_update += affected_mob.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 0, updating_health = FALSE) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/cafe_latte name = "Cafe Latte" @@ -726,15 +728,17 @@ glass_price = DRINK_PRICE_EASY /datum/reagent/consumable/cafe_latte/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_dizzy(-10 SECONDS * REM * seconds_per_tick) affected_mob.adjust_drowsiness(-12 SECONDS * REM * seconds_per_tick) - affected_mob.SetSleeping(0) + var/need_mob_update + need_mob_update = affected_mob.SetSleeping(0) affected_mob.adjust_bodytemperature(5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, affected_mob.get_body_temp_normal()) affected_mob.set_jitter_if_lower(10 SECONDS * REM * seconds_per_tick) if(affected_mob.getBruteLoss() && SPT_PROB(10, seconds_per_tick)) - affected_mob.heal_bodypart_damage(1, 0) - ..() - . = TRUE + need_mob_update += affected_mob.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 0, updating_health = FALSE) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/doctor_delight name = "The Doctor's Delight" @@ -745,17 +749,19 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/doctor_delight/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustBruteLoss(-0.5 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustFireLoss(-0.5 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustToxLoss(-0.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - affected_mob.adjustOxyLoss(-0.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustBruteLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustFireLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustToxLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustOxyLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) if(affected_mob.nutrition && (affected_mob.nutrition - 2 > 0)) var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) if(!(HAS_TRAIT(liver, TRAIT_MEDICAL_METABOLISM))) // Drains the nutrition of the holder. Not medical doctors though, since it's the Doctor's Delight! affected_mob.adjust_nutrition(-2 * REM * seconds_per_tick) - ..() - . = TRUE + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/cinderella name = "Cinderella" @@ -766,8 +772,8 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/cinderella/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_disgust(-5 * REM * seconds_per_tick) - return ..() /datum/reagent/consumable/cherryshake name = "Cherry Shake" @@ -886,8 +892,8 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/grape_soda/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) - ..() /datum/reagent/consumable/milk/chocolate_milk name = "Chocolate Milk" @@ -908,11 +914,11 @@ /datum/reagent/consumable/hot_coco/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) affected_mob.adjust_bodytemperature(5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, affected_mob.get_body_temp_normal()) if(affected_mob.getBruteLoss() && SPT_PROB(10, seconds_per_tick)) - affected_mob.heal_bodypart_damage(1, 0) - . = TRUE + if(affected_mob.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 0, updating_health = FALSE)) + . = UPDATE_MOB_HEALTH if(holder.has_reagent(/datum/reagent/consumable/capsaicin)) holder.remove_reagent(/datum/reagent/consumable/capsaicin, 2 * REM * seconds_per_tick) - ..() + return ..() || . /datum/reagent/consumable/italian_coco name = "Italian Hot Chocolate" @@ -924,8 +930,8 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/italian_coco/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_bodytemperature(5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, affected_mob.get_body_temp_normal()) - return ..() /datum/reagent/consumable/menthol name = "Menthol" @@ -936,8 +942,8 @@ default_container = /obj/item/reagent_containers/cup/glass/bottle/juice/menthol /datum/reagent/consumable/menthol/on_mob_life(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.apply_status_effect(/datum/status_effect/throat_soothed) - ..() /datum/reagent/consumable/grenadine name = "Grenadine" @@ -977,8 +983,8 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/cream_soda/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) - ..() /datum/reagent/consumable/sol_dry name = "Sol Dry" @@ -989,8 +995,8 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/sol_dry/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_disgust(-5 * REM * seconds_per_tick) - ..() /datum/reagent/consumable/shirley_temple name = "Shirley Temple" @@ -1014,8 +1020,9 @@ var/current_size = RESIZE_DEFAULT_SIZE /datum/reagent/consumable/red_queen/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(50, seconds_per_tick)) - return ..() + return var/newsize = pick(0.5, 0.75, 1, 1.50, 2) newsize *= RESIZE_DEFAULT_SIZE @@ -1023,12 +1030,11 @@ current_size = newsize if(SPT_PROB(23, seconds_per_tick)) affected_mob.emote("sneeze") - ..() /datum/reagent/consumable/red_queen/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() affected_mob.update_transform(RESIZE_DEFAULT_SIZE/current_size) current_size = RESIZE_DEFAULT_SIZE - ..() /datum/reagent/consumable/bungojuice name = "Bungo Juice" @@ -1052,10 +1058,10 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/aloejuice/on_mob_life(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() if(affected_mob.getToxLoss() && SPT_PROB(16, seconds_per_tick)) - affected_mob.adjustToxLoss(-1, FALSE, required_biotype = affected_biotype) - ..() - . = TRUE + if(affected_mob.adjustToxLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/agua_fresca name = "Agua Fresca" @@ -1066,10 +1072,11 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/agua_fresca/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_bodytemperature(-8 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) if(affected_mob.getToxLoss() && SPT_PROB(10, seconds_per_tick)) - affected_mob.adjustToxLoss(-0.5, FALSE, required_biotype = affected_biotype) - return ..() + if(affected_mob.adjustToxLoss(-0.5, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/mushroom_tea name = "Mushroom Tea" @@ -1080,10 +1087,10 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/mushroom_tea/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(islizard(affected_mob)) - affected_mob.adjustOxyLoss(-0.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - ..() - . = TRUE + if(affected_mob.adjustOxyLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type)) + return UPDATE_MOB_HEALTH //Moth Stuff /datum/reagent/consumable/toechtauese_juice @@ -1166,10 +1173,11 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/cucumberlemonade/on_mob_life(mob/living/carbon/doll, seconds_per_tick, times_fired) + . = ..() doll.adjust_bodytemperature(-8 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, doll.get_body_temp_normal()) if(doll.getToxLoss() && SPT_PROB(10, seconds_per_tick)) - doll.adjustToxLoss(-0.5, FALSE, required_biotype = affected_biotype) - return ..() + if(doll.adjustToxLoss(-0.5, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/mississippi_queen name = "Mississippi Queen" @@ -1179,17 +1187,16 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/mississippi_queen/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() switch(current_cycle) - if(10 to 20) + if(11 to 21) drinker.adjust_dizzy(4 SECONDS * REM * seconds_per_tick) - if(20 to 30) + if(21 to 31) if(SPT_PROB(15, seconds_per_tick)) drinker.adjust_confusion(4 SECONDS * REM * seconds_per_tick) - if(30 to 200) + if(31 to 201) drinker.adjust_hallucinations(60 SECONDS * REM * seconds_per_tick) - return ..() - /datum/reagent/consumable/t_letter name = "T" description = "You expected to find this in a soup, but this is fine too." @@ -1198,14 +1205,15 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/t_letter/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(!HAS_MIND_TRAIT(affected_mob, TRAIT_MIMING)) - return ..() + return affected_mob.set_silence_if_lower(MIMEDRINK_SILENCE_DURATION) affected_mob.adjust_drowsiness(-6 SECONDS * REM * seconds_per_tick) affected_mob.AdjustSleeping(-40 * REM * seconds_per_tick) if(affected_mob.getToxLoss() && SPT_PROB(25, seconds_per_tick)) - affected_mob.adjustToxLoss(-2, FALSE, required_biotype = affected_biotype) - return ..() + if(affected_mob.adjustToxLoss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/hakka_mate name = "Hakka-Mate" diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 23d6010f1a9..56552fccf63 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -18,22 +18,23 @@ addiction_types = list(/datum/addiction/hallucinogens = 10) //4 per 2 seconds /datum/reagent/drug/space_drugs/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.set_drugginess(30 SECONDS * REM * seconds_per_tick) if(isturf(affected_mob.loc) && !isspaceturf(affected_mob.loc) && !HAS_TRAIT(affected_mob, TRAIT_IMMOBILIZED) && SPT_PROB(5, seconds_per_tick)) step(affected_mob, pick(GLOB.cardinals)) if(SPT_PROB(3.5, seconds_per_tick)) affected_mob.emote(pick("twitch","drool","moan","giggle")) - ..() /datum/reagent/drug/space_drugs/overdose_start(mob/living/affected_mob) + . = ..() to_chat(affected_mob, span_userdanger("You start tripping hard!")) affected_mob.add_mood_event("[type]_overdose", /datum/mood_event/overdose, name) /datum/reagent/drug/space_drugs/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() var/hallucination_duration_in_seconds = (affected_mob.get_timed_status_effect_duration(/datum/status_effect/hallucination) / 10) if(hallucination_duration_in_seconds < volume && SPT_PROB(10, seconds_per_tick)) affected_mob.adjust_hallucinations(10 SECONDS) - ..() /datum/reagent/drug/cannabis name = "Cannabis" @@ -45,6 +46,7 @@ metabolization_rate = 0.125 * REAGENTS_METABOLISM /datum/reagent/drug/cannabis/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.apply_status_effect(/datum/status_effect/stoned) if(SPT_PROB(1, seconds_per_tick)) var/smoke_message = pick("You feel relaxed.","You feel calmed.","Your mouth feels dry.","You could use some water.","Your heart beats quickly.","You feel clumsy.","You crave junk food.","You notice you've been moving more slowly.") @@ -58,7 +60,6 @@ if(SPT_PROB(4, seconds_per_tick) && affected_mob.buckled && affected_mob.body_position != LYING_DOWN && !affected_mob.IsParalyzed()) //chance to be couchlocked if sitting to_chat(affected_mob, "It's too comfy to move...") affected_mob.Paralyze(10 SECONDS) - return ..() /datum/reagent/drug/nicotine name = "Nicotine" @@ -79,6 +80,7 @@ mytray.adjust_pestlevel(-rand(1, 2)) /datum/reagent/drug/nicotine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(0.5, seconds_per_tick)) var/smoke_message = pick("You feel relaxed.", "You feel calmed.","You feel alert.","You feel rugged.") to_chat(affected_mob, span_notice("[smoke_message]")) @@ -89,14 +91,15 @@ affected_mob.AdjustUnconscious(-50 * REM * seconds_per_tick) affected_mob.AdjustParalyzed(-50 * REM * seconds_per_tick) affected_mob.AdjustImmobilized(-50 * REM * seconds_per_tick) - ..() - . = TRUE + return UPDATE_MOB_HEALTH /datum/reagent/drug/nicotine/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustToxLoss(0.1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - affected_mob.adjustOxyLoss(1.1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - ..() - . = TRUE + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustToxLoss(0.1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustOxyLoss(1.1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/drug/krokodil name = "Krokodil" @@ -110,28 +113,28 @@ /datum/reagent/drug/krokodil/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() var/high_message = pick("You feel calm.", "You feel collected.", "You feel like you need to relax.") if(SPT_PROB(2.5, seconds_per_tick)) to_chat(affected_mob, span_notice("[high_message]")) affected_mob.add_mood_event("smacked out", /datum/mood_event/narcotic_heavy, name) - if(current_cycle == 35 && creation_purity <= 0.6) + if(current_cycle == 36 && creation_purity <= 0.6) if(!istype(affected_mob.dna.species, /datum/species/human/krokodil_addict)) to_chat(affected_mob, span_userdanger("Your skin falls off easily!")) var/mob/living/carbon/human/affected_human = affected_mob affected_human.set_facial_hairstyle("Shaved", update = FALSE) affected_human.set_hairstyle("Bald", update = FALSE) affected_mob.set_species(/datum/species/human/krokodil_addict) - affected_mob.adjustBruteLoss(50 * REM, FALSE, required_bodytype = affected_bodytype) // holy shit your skin just FELL THE FUCK OFF - . = TRUE - ..() + if(affected_mob.adjustBruteLoss(50 * REM, updating_health = FALSE, required_bodytype = affected_bodytype)) // holy shit your skin just FELL THE FUCK OFF + return UPDATE_MOB_HEALTH /datum/reagent/drug/krokodil/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.25 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) - affected_mob.adjustToxLoss(0.25 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - ..() - . = TRUE - - + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.25 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + need_mob_update = affected_mob.adjustToxLoss(0.25 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/drug/methamphetamine name = "Methamphetamine" @@ -159,15 +162,16 @@ var/effective_impurity = min(1, (1 - creation_purity)/0.5) color = BlendRGB(initial(color), "#FAFAFA", effective_impurity) -/datum/reagent/drug/methamphetamine/on_mob_metabolize(mob/living/L) - ..() - L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/methamphetamine) +/datum/reagent/drug/methamphetamine/on_mob_metabolize(mob/living/affected_mob) + . = ..() + affected_mob.add_movespeed_modifier(/datum/movespeed_modifier/reagent/methamphetamine) -/datum/reagent/drug/methamphetamine/on_mob_end_metabolize(mob/living/L) - L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/methamphetamine) - ..() +/datum/reagent/drug/methamphetamine/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() + affected_mob.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/methamphetamine) /datum/reagent/drug/methamphetamine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() var/high_message = pick("You feel hyper.", "You feel like you need to go faster.", "You feel like you can run the world.") if(SPT_PROB(2.5, seconds_per_tick)) to_chat(affected_mob, span_notice("[high_message]")) @@ -177,15 +181,17 @@ affected_mob.AdjustUnconscious(-40 * REM * seconds_per_tick) affected_mob.AdjustParalyzed(-40 * REM * seconds_per_tick) affected_mob.AdjustImmobilized(-40 * REM * seconds_per_tick) - affected_mob.adjustStaminaLoss(-2 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) + var/need_mob_update + need_mob_update = affected_mob.adjustStaminaLoss(-2 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) affected_mob.set_jitter_if_lower(4 SECONDS * REM * seconds_per_tick) - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, rand(1, 4) * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, rand(1, 4) * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + if(need_mob_update) + . = UPDATE_MOB_HEALTH if(SPT_PROB(2.5, seconds_per_tick)) affected_mob.emote(pick("twitch", "shiver")) - ..() - . = TRUE /datum/reagent/drug/methamphetamine/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() if(!HAS_TRAIT(affected_mob, TRAIT_IMMOBILIZED) && !ismovable(affected_mob.loc)) for(var/i in 1 to round(4 * REM * seconds_per_tick, 1)) step(affected_mob, pick(GLOB.cardinals)) @@ -194,10 +200,11 @@ if(SPT_PROB(18, seconds_per_tick)) affected_mob.visible_message(span_danger("[affected_mob]'s hands flip out and flail everywhere!")) affected_mob.drop_all_held_items() - ..() - affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, (rand(5, 10) / 10) * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) - . = TRUE + var/need_mob_update + need_mob_update = affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, (rand(5, 10) / 10) * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/drug/bath_salts name = "Bath Salts" @@ -211,35 +218,38 @@ ph = 8.2 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/drug/bath_salts/on_mob_metabolize(mob/living/L) - ..() - L.add_traits(list(TRAIT_STUNIMMUNE, TRAIT_SLEEPIMMUNE), type) - if(iscarbon(L)) - var/mob/living/carbon/C = L +/datum/reagent/drug/bath_salts/on_mob_metabolize(mob/living/affected_mob) + . = ..() + affected_mob.add_traits(list(TRAIT_STUNIMMUNE, TRAIT_SLEEPIMMUNE), type) + if(iscarbon(affected_mob)) + var/mob/living/carbon/carbon_mob = affected_mob rage = new() - C.gain_trauma(rage, TRAUMA_RESILIENCE_ABSOLUTE) + carbon_mob.gain_trauma(rage, TRAUMA_RESILIENCE_ABSOLUTE) -/datum/reagent/drug/bath_salts/on_mob_end_metabolize(mob/living/L) - L.remove_traits(list(TRAIT_STUNIMMUNE, TRAIT_SLEEPIMMUNE), type) +/datum/reagent/drug/bath_salts/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() + affected_mob.remove_traits(list(TRAIT_STUNIMMUNE, TRAIT_SLEEPIMMUNE), type) if(rage) QDEL_NULL(rage) - ..() /datum/reagent/drug/bath_salts/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() var/high_message = pick("You feel amped up.", "You feel ready.", "You feel like you can push it to the limit.") if(SPT_PROB(2.5, seconds_per_tick)) to_chat(affected_mob, span_notice("[high_message]")) affected_mob.add_mood_event("salted", /datum/mood_event/stimulant_heavy, name) - affected_mob.adjustStaminaLoss(-5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 4 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + var/need_mob_update + need_mob_update = affected_mob.adjustStaminaLoss(-5 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 4 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) affected_mob.adjust_hallucinations(10 SECONDS * REM * seconds_per_tick) + if(need_mob_update) + . = UPDATE_MOB_HEALTH if(!HAS_TRAIT(affected_mob, TRAIT_IMMOBILIZED) && !ismovable(affected_mob.loc)) step(affected_mob, pick(GLOB.cardinals)) step(affected_mob, pick(GLOB.cardinals)) - ..() - . = TRUE /datum/reagent/drug/bath_salts/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_hallucinations(10 SECONDS * REM * seconds_per_tick) if(!HAS_TRAIT(affected_mob, TRAIT_IMMOBILIZED) && !ismovable(affected_mob.loc)) for(var/i in 1 to round(8 * REM * seconds_per_tick, 1)) @@ -248,7 +258,6 @@ affected_mob.emote(pick("twitch","drool","moan")) if(SPT_PROB(28, seconds_per_tick)) affected_mob.drop_all_held_items() - ..() /datum/reagent/drug/aranesp name = "Aranesp" @@ -259,16 +268,18 @@ addiction_types = list(/datum/addiction/stimulants = 8) /datum/reagent/drug/aranesp/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() var/high_message = pick("You feel amped up.", "You feel ready.", "You feel like you can push it to the limit.") if(SPT_PROB(2.5, seconds_per_tick)) to_chat(affected_mob, span_notice("[high_message]")) - affected_mob.adjustStaminaLoss(-18 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - affected_mob.adjustToxLoss(0.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) + var/need_mob_update + need_mob_update = affected_mob.adjustStaminaLoss(-18 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustToxLoss(0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) if(SPT_PROB(30, seconds_per_tick)) affected_mob.losebreath++ - affected_mob.adjustOxyLoss(1, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - ..() - . = TRUE + need_mob_update += affected_mob.adjustOxyLoss(1, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/drug/happiness name = "Happiness" @@ -280,25 +291,26 @@ taste_description = "paint thinner" addiction_types = list(/datum/addiction/hallucinogens = 18) -/datum/reagent/drug/happiness/on_mob_metabolize(mob/living/L) - ..() - ADD_TRAIT(L, TRAIT_FEARLESS, type) - L.add_mood_event("happiness_drug", /datum/mood_event/happiness_drug) +/datum/reagent/drug/happiness/on_mob_metabolize(mob/living/affected_mob) + . = ..() + ADD_TRAIT(affected_mob, TRAIT_FEARLESS, type) + affected_mob.add_mood_event("happiness_drug", /datum/mood_event/happiness_drug) -/datum/reagent/drug/happiness/on_mob_delete(mob/living/L) - REMOVE_TRAIT(L, TRAIT_FEARLESS, type) - L.clear_mood_event("happiness_drug") - ..() +/datum/reagent/drug/happiness/on_mob_delete(mob/living/affected_mob) + . = ..() + REMOVE_TRAIT(affected_mob, TRAIT_FEARLESS, type) + affected_mob.clear_mood_event("happiness_drug") /datum/reagent/drug/happiness/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.remove_status_effect(/datum/status_effect/jitter) affected_mob.remove_status_effect(/datum/status_effect/confusion) affected_mob.disgust = 0 - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.2 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) - ..() - . = TRUE + if(affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.2 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + return UPDATE_MOB_HEALTH /datum/reagent/drug/happiness/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(16, seconds_per_tick)) var/reaction = rand(1,3) switch(reaction) @@ -311,9 +323,8 @@ if(3) affected_mob.emote("frown") affected_mob.add_mood_event("happiness_drug", /datum/mood_event/happiness_drug_bad_od) - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) - ..() - . = TRUE + if(affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + return UPDATE_MOB_HEALTH /datum/reagent/drug/pumpup name = "Pump-Up" @@ -334,45 +345,54 @@ metabolization_rate *= 0.8 /datum/reagent/drug/pumpup/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() REMOVE_TRAIT(affected_mob, TRAIT_BATON_RESISTANCE, type) - return ..() /datum/reagent/drug/pumpup/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.set_jitter_if_lower(10 SECONDS * REM * seconds_per_tick) if(SPT_PROB(2.5, seconds_per_tick)) to_chat(affected_mob, span_notice("[pick("Go! Go! GO!", "You feel ready...", "You feel invincible...")]")) if(SPT_PROB(7.5, seconds_per_tick)) affected_mob.losebreath++ - affected_mob.adjustToxLoss(2, FALSE, required_biotype = affected_biotype) - . = TRUE - ..() - + affected_mob.adjustToxLoss(2, updating_health = FALSE, required_biotype = affected_biotype) + return UPDATE_MOB_HEALTH /datum/reagent/drug/pumpup/overdose_start(mob/living/affected_mob) + . = ..() to_chat(affected_mob, span_userdanger("You can't stop shaking, your heart beats faster and faster...")) /datum/reagent/drug/pumpup/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.set_jitter_if_lower(10 SECONDS * REM * seconds_per_tick) + var/need_mob_update if(SPT_PROB(2.5, seconds_per_tick)) affected_mob.drop_all_held_items() if(SPT_PROB(7.5, seconds_per_tick)) affected_mob.emote(pick("twitch","drool")) if(SPT_PROB(10, seconds_per_tick)) affected_mob.losebreath++ - affected_mob.adjustStaminaLoss(4, FALSE, required_biotype = affected_biotype) + affected_mob.adjustStaminaLoss(4, updating_stamina = FALSE, required_biotype = affected_biotype) + need_mob_update = TRUE if(SPT_PROB(7.5, seconds_per_tick)) - affected_mob.adjustToxLoss(2, FALSE, required_biotype = affected_biotype) - ..() + need_mob_update += affected_mob.adjustToxLoss(2, updating_health = FALSE, required_biotype = affected_biotype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/drug/maint name = "Maintenance Drugs" chemical_flags = NONE -/datum/reagent/drug/maint/on_mob_metabolize(mob/living/carbon/L) - var/obj/item/organ/internal/liver/liver = L.get_organ_slot(ORGAN_SLOT_LIVER) +/datum/reagent/drug/maint/on_mob_metabolize(mob/living/affected_mob) + . = ..() + if(!iscarbon(affected_mob)) + return + + var/mob/living/carbon/carbon_mob = affected_mob + var/obj/item/organ/internal/liver/liver = carbon_mob.get_organ_slot(ORGAN_SLOT_LIVER) if(HAS_TRAIT(liver, TRAIT_MAINTENANCE_METABOLISM)) - L.add_mood_event("maintenance_fun", /datum/mood_event/maintenance_high) + carbon_mob.add_mood_event("maintenance_fun", /datum/mood_event/maintenance_high) metabolization_rate *= 0.8 /datum/reagent/drug/maint/powder @@ -400,7 +420,8 @@ /datum/reagent/drug/maint/powder/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) . = ..() - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 6 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + if(affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 6 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + return UPDATE_MOB_HEALTH /datum/reagent/drug/maint/sludge name = "Maintenance Sludge" @@ -412,15 +433,14 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED addiction_types = list(/datum/addiction/maintenance_drugs = 8) -/datum/reagent/drug/maint/sludge/on_mob_metabolize(mob/living/L) - +/datum/reagent/drug/maint/sludge/on_mob_metabolize(mob/living/affected_mob) . = ..() - ADD_TRAIT(L,TRAIT_HARDLY_WOUNDED,type) + ADD_TRAIT(affected_mob,TRAIT_HARDLY_WOUNDED,type) /datum/reagent/drug/maint/sludge/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - affected_mob.adjustToxLoss(0.5 * REM * seconds_per_tick, required_biotype = affected_biotype) - return TRUE + if(affected_mob.adjustToxLoss(0.5 * REM * seconds_per_tick, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/drug/maint/sludge/on_mob_end_metabolize(mob/living/affected_mob) . = ..() @@ -432,10 +452,13 @@ return var/mob/living/carbon/carbie = affected_mob //You will be vomiting so the damage is really for a few ticks before you flush it out of your system - carbie.adjustToxLoss(1 * REM * seconds_per_tick, required_biotype = affected_biotype) + var/need_mob_update + need_mob_update = carbie.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) if(SPT_PROB(5, seconds_per_tick)) - carbie.adjustToxLoss(5, required_biotype = affected_biotype) + need_mob_update += carbie.adjustToxLoss(5, required_biotype = affected_biotype, updating_health = FALSE) carbie.vomit(VOMIT_CATEGORY_DEFAULT) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/drug/maint/tar name = "Maintenance Tar" @@ -454,13 +477,15 @@ affected_mob.AdjustParalyzed(-10 * REM * seconds_per_tick) affected_mob.AdjustImmobilized(-10 * REM * seconds_per_tick) affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) - return TRUE + return UPDATE_MOB_HEALTH /datum/reagent/drug/maint/tar/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) . = ..() - - affected_mob.adjustToxLoss(5 * REM * seconds_per_tick, required_biotype = affected_biotype) - affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 3 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + var/need_update + need_update = affected_mob.adjustToxLoss(5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 3 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + if(need_update) + return UPDATE_MOB_HEALTH /datum/reagent/drug/mushroomhallucinogen name = "Mushroom Hallucinogen" @@ -474,21 +499,21 @@ addiction_types = list(/datum/addiction/hallucinogens = 12) /datum/reagent/drug/mushroomhallucinogen/on_mob_life(mob/living/carbon/psychonaut, seconds_per_tick, times_fired) + . = ..() psychonaut.set_slurring_if_lower(1 SECONDS * REM * seconds_per_tick) switch(current_cycle) - if(1 to 5) + if(2 to 6) if(SPT_PROB(5, seconds_per_tick)) psychonaut.emote(pick("twitch","giggle")) - if(5 to 10) + if(6 to 11) psychonaut.set_jitter_if_lower(20 SECONDS * REM * seconds_per_tick) if(SPT_PROB(10, seconds_per_tick)) psychonaut.emote(pick("twitch","giggle")) - if (10 to INFINITY) + if (11 to INFINITY) psychonaut.set_jitter_if_lower(40 SECONDS * REM * seconds_per_tick) if(SPT_PROB(16, seconds_per_tick)) psychonaut.emote(pick("twitch","giggle")) - ..() /datum/reagent/drug/mushroomhallucinogen/on_mob_metabolize(mob/living/psychonaut) . = ..() @@ -601,16 +626,17 @@ /datum/reagent/drug/blastoff/on_mob_life(mob/living/carbon/dancer, seconds_per_tick, times_fired) . = ..() - dancer.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.3 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + if(dancer.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.3 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + . = UPDATE_MOB_HEALTH dancer.AdjustKnockdown(-20) if(SPT_PROB(BLASTOFF_DANCE_MOVE_CHANCE_PER_UNIT * volume, seconds_per_tick)) dancer.emote("flip") - return TRUE /datum/reagent/drug/blastoff/overdose_process(mob/living/dancer, seconds_per_tick, times_fired) . = ..() - dancer.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.3 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + if(dancer.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.3 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + . = UPDATE_MOB_HEALTH if(SPT_PROB(BLASTOFF_DANCE_MOVE_CHANCE_PER_UNIT * volume, seconds_per_tick)) dancer.emote("spin") @@ -673,8 +699,8 @@ /datum/reagent/drug/saturnx/on_mob_life(mob/living/carbon/invisible_man, seconds_per_tick, times_fired) . = ..() - invisible_man.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.3 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) - return TRUE + if(invisible_man.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.3 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + return UPDATE_MOB_HEALTH /datum/reagent/drug/saturnx/on_mob_metabolize(mob/living/invisible_man) . = ..() @@ -750,7 +776,8 @@ invisible_man.emote("giggle") if(SPT_PROB(5, seconds_per_tick)) invisible_man.emote("laugh") - invisible_man.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.4 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + if(invisible_man.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.4 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + return UPDATE_MOB_HEALTH /datum/reagent/drug/saturnx/stable name = "Stabilized Saturn-X" @@ -772,27 +799,29 @@ addiction_types = list(/datum/addiction/stimulants = 20) /datum/reagent/drug/kronkaine/on_mob_metabolize(mob/living/kronkaine_fiend) - ..() + . = ..() kronkaine_fiend.add_actionspeed_modifier(/datum/actionspeed_modifier/kronkaine) kronkaine_fiend.sound_environment_override = SOUND_ENVIRONMENT_HANGAR /datum/reagent/drug/kronkaine/on_mob_end_metabolize(mob/living/kronkaine_fiend) + . = ..() kronkaine_fiend.remove_actionspeed_modifier(/datum/actionspeed_modifier/kronkaine) kronkaine_fiend.sound_environment_override = NONE - . = ..() /datum/reagent/drug/kronkaine/on_transfer(atom/kronkaine_receptacle, methods, trans_volume) . = ..() if(!iscarbon(kronkaine_receptacle)) return var/mob/living/carbon/druggo = kronkaine_receptacle - druggo.adjustStaminaLoss(-4 * trans_volume, 0) + if(druggo.adjustStaminaLoss(-4 * trans_volume, updating_stamina = FALSE)) + return UPDATE_MOB_HEALTH //I wish i could give it some kind of bonus when smoked, but we don't have an INHALE method. /datum/reagent/drug/kronkaine/on_mob_life(mob/living/carbon/kronkaine_fiend, seconds_per_tick, times_fired) . = ..() || TRUE kronkaine_fiend.add_mood_event("tweaking", /datum/mood_event/stimulant_medium, name) - kronkaine_fiend.adjustOrganLoss(ORGAN_SLOT_HEART, 0.4 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + if(kronkaine_fiend.adjustOrganLoss(ORGAN_SLOT_HEART, 0.4 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + . = UPDATE_MOB_HEALTH kronkaine_fiend.set_jitter_if_lower(20 SECONDS * REM * seconds_per_tick) kronkaine_fiend.AdjustSleeping(-20 * REM * seconds_per_tick) kronkaine_fiend.adjust_drowsiness(-10 SECONDS * REM * seconds_per_tick) @@ -805,7 +834,8 @@ /datum/reagent/drug/kronkaine/overdose_process(mob/living/kronkaine_fiend, seconds_per_tick, times_fired) . = ..() - kronkaine_fiend.adjustOrganLoss(ORGAN_SLOT_HEART, 1 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + if(kronkaine_fiend.adjustOrganLoss(ORGAN_SLOT_HEART, 1 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + . = UPDATE_MOB_HEALTH kronkaine_fiend.set_jitter_if_lower(20 SECONDS * REM * seconds_per_tick) if(SPT_PROB(10, seconds_per_tick)) to_chat(kronkaine_fiend, span_danger(pick("You feel like your heart is going to explode!", "Your ears are ringing!", "You sweat like a pig!", "You clench your jaw and grind your teeth.", "You feel prickles of pain in your chest."))) @@ -819,6 +849,7 @@ chemical_flags = NONE /datum/reagent/drug/kronkaine/gore/overdose_start(mob/living/gored) + . = ..() gored.visible_message( span_danger("[gored] explodes in a shower of gore!"), span_userdanger("GORE! GORE! GORE! YOU'RE GORE! TOO MUCH GORE! YOU'RE GORE! GORE! IT'S OVER! GORE! GORE! YOU'RE GORE! TOO MUCH G-"), diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 17867389c3d..e64716296b0 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -19,15 +19,16 @@ /// affects mood, typically higher for mixed drinks with more complex recipes' var/quality = 0 -/datum/reagent/consumable/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) +/datum/reagent/consumable/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) current_cycle++ - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(!HAS_TRAIT(H, TRAIT_NOHUNGER)) - H.adjust_nutrition(get_nutriment_factor() * REM * seconds_per_tick) + if(ishuman(affected_mob)) + var/mob/living/carbon/human/affected_human = affected_mob + if(!HAS_TRAIT(affected_human, TRAIT_NOHUNGER)) + affected_human.adjust_nutrition(get_nutriment_factor() * REM * seconds_per_tick) if(length(reagent_removal_skip_list)) return - holder.remove_reagent(type, metabolization_rate * seconds_per_tick) + if(holder) + holder.remove_reagent(type, metabolization_rate * seconds_per_tick) /datum/reagent/consumable/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) . = ..() @@ -73,11 +74,11 @@ /datum/reagent/consumable/nutriment/on_hydroponics_apply(obj/machinery/hydroponics/mytray, mob/user) mytray.adjust_plant_health(round(volume * 0.2)) -/datum/reagent/consumable/nutriment/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) +/datum/reagent/consumable/nutriment/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(30, seconds_per_tick)) - M.heal_bodypart_damage(brute = brute_heal, burn = burn_heal, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) - . = TRUE - ..() + if(affected_mob.heal_bodypart_damage(brute = brute_heal * REM * seconds_per_tick, burn = burn_heal * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC)) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/nutriment/on_new(list/supplied_data) . = ..() @@ -128,10 +129,10 @@ brute_heal = 1 burn_heal = 1 -/datum/reagent/consumable/nutriment/vitamin/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) - if(M.satiety < MAX_SATIETY) - M.satiety += 30 * REM * seconds_per_tick +/datum/reagent/consumable/nutriment/vitamin/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() + if(affected_mob.satiety < MAX_SATIETY) + affected_mob.satiety += 30 * REM * seconds_per_tick /// The basic resource of vat growing. /datum/reagent/consumable/nutriment/protein @@ -238,15 +239,19 @@ ///Amount of satiety that will be drained when the cloth_fibers is fully metabolized var/delayed_satiety_drain = 2 * CLOTHING_NUTRITION_GAIN -/datum/reagent/consumable/nutriment/cloth_fibers/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) - if(M.satiety < MAX_SATIETY) - M.adjust_nutrition(CLOTHING_NUTRITION_GAIN) +/datum/reagent/consumable/nutriment/cloth_fibers/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + if(affected_mob.satiety < MAX_SATIETY) + affected_mob.adjust_nutrition(CLOTHING_NUTRITION_GAIN) delayed_satiety_drain += CLOTHING_NUTRITION_GAIN - return ..() -/datum/reagent/consumable/nutriment/cloth_fibers/on_mob_delete(mob/living/carbon/M) - M.adjust_nutrition(-delayed_satiety_drain) - return ..() +/datum/reagent/consumable/nutriment/cloth_fibers/on_mob_delete(mob/living/carbon/affected_mob) + . = ..() + if(!iscarbon(affected_mob)) + return + + var/mob/living/carbon/carbon_mob = affected_mob + carbon_mob.adjust_nutrition(-delayed_satiety_drain) /datum/reagent/consumable/nutriment/mineral name = "Mineral Slurry" @@ -256,14 +261,15 @@ brute_heal = 0 burn_heal = 0 -/datum/reagent/consumable/nutriment/mineral/on_mob_life(mob/living/carbon/eater, delta_time, times_fired) - current_cycle++ - if (HAS_TRAIT(eater, TRAIT_ROCK_EATER) && !HAS_TRAIT(eater, TRAIT_NOHUNGER) && ishuman(eater)) - var/mob/living/carbon/human/golem_eater = eater - golem_eater.adjust_nutrition(get_nutriment_factor() * REM * delta_time) - if(length(reagent_removal_skip_list)) - return - holder.remove_reagent(type, metabolization_rate * delta_time) +/datum/reagent/consumable/nutriment/mineral/on_mob_life(mob/living/carbon/eater, seconds_per_tick, times_fired) + if(HAS_TRAIT(eater, TRAIT_ROCK_EATER)) // allow mobs who can eat rocks to do so + return ..() + else // otherwise just let them pass through the system + current_cycle++ + if(length(reagent_removal_skip_list)) + return + if(holder) + holder.remove_reagent(type, metabolization_rate * seconds_per_tick) /datum/reagent/consumable/sugar name = "Sugar" @@ -284,15 +290,14 @@ mytray.adjust_weedlevel(rand(1, 2)) mytray.adjust_pestlevel(rand(1, 2)) -/datum/reagent/consumable/sugar/overdose_start(mob/living/M) - to_chat(M, span_userdanger("You go into hyperglycaemic shock! Lay off the twinkies!")) - M.AdjustSleeping(20 SECONDS) - . = TRUE +/datum/reagent/consumable/sugar/overdose_start(mob/living/affected_mob) + . = ..() + to_chat(affected_mob, span_userdanger("You go into hyperglycemic shock! Lay off the twinkies!")) + affected_mob.AdjustSleeping(20 SECONDS) -/datum/reagent/consumable/sugar/overdose_process(mob/living/M, seconds_per_tick, times_fired) - M.adjust_drowsiness_up_to((5 SECONDS * REM * seconds_per_tick), 60 SECONDS) - ..() - . = TRUE +/datum/reagent/consumable/sugar/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.adjust_drowsiness_up_to((5 SECONDS * REM * seconds_per_tick), 60 SECONDS) /datum/reagent/consumable/virus_food name = "Virus Food" @@ -332,29 +337,29 @@ taste_mult = 1.5 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/capsaicin/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) +/datum/reagent/consumable/capsaicin/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) var/heating = 0 switch(current_cycle) if(1 to 15) heating = 5 if(holder.has_reagent(/datum/reagent/cryostylane)) holder.remove_reagent(/datum/reagent/cryostylane, 5 * REM * seconds_per_tick) - if(isslime(M)) + if(isslime(affected_mob)) heating = rand(5, 20) if(15 to 25) heating = 10 - if(isslime(M)) + if(isslime(affected_mob)) heating = rand(10, 20) if(25 to 35) heating = 15 - if(isslime(M)) + if(isslime(affected_mob)) heating = rand(15, 20) if(35 to INFINITY) heating = 20 - if(isslime(M)) + if(isslime(affected_mob)) heating = rand(20, 25) - M.adjust_bodytemperature(heating * TEMPERATURE_DAMAGE_COEFFICIENT * REM * seconds_per_tick) - ..() + affected_mob.adjust_bodytemperature(heating * TEMPERATURE_DAMAGE_COEFFICIENT * REM * seconds_per_tick) + return ..() /datum/reagent/consumable/frostoil name = "Frost Oil" @@ -367,33 +372,33 @@ specific_heat = 40 default_container = /obj/item/reagent_containers/cup/bottle/frostoil -/datum/reagent/consumable/frostoil/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) +/datum/reagent/consumable/frostoil/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) var/cooling = 0 switch(current_cycle) if(1 to 15) cooling = -10 if(holder.has_reagent(/datum/reagent/consumable/capsaicin)) holder.remove_reagent(/datum/reagent/consumable/capsaicin, 5 * REM * seconds_per_tick) - if(isslime(M)) + if(isslime(affected_mob)) cooling = -rand(5, 20) if(15 to 25) cooling = -20 - if(isslime(M)) + if(isslime(affected_mob)) cooling = -rand(10, 20) if(25 to 35) cooling = -30 if(prob(1)) - M.emote("shiver") - if(isslime(M)) + affected_mob.emote("shiver") + if(isslime(affected_mob)) cooling = -rand(15, 20) if(35 to INFINITY) cooling = -40 if(prob(5)) - M.emote("shiver") - if(isslime(M)) + affected_mob.emote("shiver") + if(isslime(affected_mob)) cooling = -rand(20, 25) - M.adjust_bodytemperature(cooling * TEMPERATURE_DAMAGE_COEFFICIENT * REM * seconds_per_tick, 50) - ..() + affected_mob.adjust_bodytemperature(cooling * TEMPERATURE_DAMAGE_COEFFICIENT * REM * seconds_per_tick, 50) + return ..() /datum/reagent/consumable/frostoil/expose_turf(turf/exposed_turf, reac_volume) . = ..() @@ -421,7 +426,6 @@ default_container = /obj/item/reagent_containers/cup/bottle/capsaicin /datum/reagent/consumable/condensedcapsaicin/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) - . = ..() if(!ishuman(exposed_mob)) return @@ -450,12 +454,13 @@ victim.set_dizzy_if_lower(2 SECONDS) if(prob(5)) victim.vomit(VOMIT_CATEGORY_DEFAULT) + return ..() -/datum/reagent/consumable/condensedcapsaicin/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) +/datum/reagent/consumable/condensedcapsaicin/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) if(!holder.has_reagent(/datum/reagent/consumable/milk)) if(SPT_PROB(5, seconds_per_tick)) - M.visible_message(span_warning("[M] [pick("dry heaves!","coughs!","splutters!")]")) - ..() + affected_mob.visible_message(span_warning("[affected_mob] [pick("dry heaves!","coughs!","splutters!")]")) + return ..() /datum/reagent/consumable/salt name = "Table Salt" @@ -506,7 +511,6 @@ flesh_healing -= max(VALUE_PER(5, 30) * reac_volume, 0) to_chat(victim, span_notice("The salt bits seep in and stick to [lowertext(src)], painfully irritating the skin! After a few moments, it feels marginally better.")) - /datum/reagent/consumable/blackpepper name = "Black Pepper" description = "A powder ground from peppercorns. *AAAACHOOO*" @@ -533,27 +537,27 @@ metabolization_rate = 0.15 * REAGENTS_METABOLISM chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/garlic/on_mob_add(mob/living/L, amount) +/datum/reagent/consumable/garlic/on_mob_add(mob/living/affected_mob, amount) + . = ..() + ADD_TRAIT(affected_mob, TRAIT_GARLIC_BREATH, type) + +/datum/reagent/consumable/garlic/on_mob_delete(mob/living/affected_mob) . = ..() - ADD_TRAIT(L, TRAIT_GARLIC_BREATH, type) + REMOVE_TRAIT(affected_mob, TRAIT_GARLIC_BREATH, type) -/datum/reagent/consumable/garlic/on_mob_delete(mob/living/L) +/datum/reagent/consumable/garlic/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - REMOVE_TRAIT(L, TRAIT_GARLIC_BREATH, type) - -/datum/reagent/consumable/garlic/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) - if(isvampire(M)) //incapacitating but not lethal. Unfortunately, vampires cannot vomit. - if(SPT_PROB(min(current_cycle/2, 12.5), seconds_per_tick)) - to_chat(M, span_danger("You can't get the scent of garlic out of your nose! You can barely think...")) - M.Paralyze(10) - M.set_jitter_if_lower(20 SECONDS) + if(isvampire(affected_mob)) //incapacitating but not lethal. Unfortunately, vampires cannot vomit. + if(SPT_PROB(min((current_cycle-1)/2, 12.5), seconds_per_tick)) + to_chat(affected_mob, span_danger("You can't get the scent of garlic out of your nose! You can barely think...")) + affected_mob.Paralyze(10) + affected_mob.set_jitter_if_lower(20 SECONDS) else - var/obj/item/organ/internal/liver/liver = M.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) if(liver && HAS_TRAIT(liver, TRAIT_CULINARY_METABOLISM)) if(SPT_PROB(10, seconds_per_tick)) //stays in the system much longer than sprinkles/banana juice, so heals slower to partially compensate - M.heal_bodypart_damage(brute = 1, burn = 1) - . = TRUE - ..() + if(affected_mob.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 1 * REM * seconds_per_tick, updating_health = FALSE)) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/tearjuice name = "Tear Juice" @@ -582,12 +586,12 @@ taste_description = "childhood whimsy" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/sprinkles/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) - var/obj/item/organ/internal/liver/liver = M.get_organ_slot(ORGAN_SLOT_LIVER) +/datum/reagent/consumable/sprinkles/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) if(liver && HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM)) - M.heal_bodypart_damage(1 * REM * seconds_per_tick, 1 * REM * seconds_per_tick, 0) - . = TRUE - ..() + if(affected_mob.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 1 * REM * seconds_per_tick, updating_health = FALSE)) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/enzyme name = "Universal Enzyme" @@ -623,9 +627,9 @@ taste_description = "your imprisonment" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/hot_ramen/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) - M.adjust_bodytemperature(10 * TEMPERATURE_DAMAGE_COEFFICIENT * REM * seconds_per_tick, 0, M.get_body_temp_normal()) - ..() +/datum/reagent/consumable/hot_ramen/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.adjust_bodytemperature(10 * TEMPERATURE_DAMAGE_COEFFICIENT * REM * seconds_per_tick, 0, affected_mob.get_body_temp_normal()) /datum/reagent/consumable/hell_ramen name = "Hell Ramen" @@ -635,9 +639,9 @@ taste_description = "wet and cheap noodles on fire" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/hell_ramen/on_mob_life(mob/living/carbon/target_mob, seconds_per_tick, times_fired) - target_mob.adjust_bodytemperature(10 * TEMPERATURE_DAMAGE_COEFFICIENT * REM * seconds_per_tick) - ..() +/datum/reagent/consumable/hell_ramen/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.adjust_bodytemperature(10 * TEMPERATURE_DAMAGE_COEFFICIENT * REM * seconds_per_tick) /datum/reagent/consumable/flour name = "Flour" @@ -718,7 +722,7 @@ color = "#FFFFFF" // rgb: 0, 0, 0 taste_description = "chalky wheat with rice" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - + /datum/reagent/consumable/vanilla name = "Vanilla Powder" description = "A fatty, bitter paste made from vanilla pods." @@ -789,9 +793,9 @@ taste_description = "sweet slime" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/corn_syrup/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) +/datum/reagent/consumable/corn_syrup/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) holder.add_reagent(/datum/reagent/consumable/sugar, 3 * REM * seconds_per_tick) - ..() + return ..() /datum/reagent/consumable/honey name = "Honey" @@ -812,15 +816,17 @@ mytray.adjust_weedlevel(rand(1, 2)) mytray.adjust_pestlevel(rand(1, 2)) -/datum/reagent/consumable/honey/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) +/datum/reagent/consumable/honey/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) holder.add_reagent(/datum/reagent/consumable/sugar, 3 * REM * seconds_per_tick) + . = ..() + var/need_mob_update if(SPT_PROB(33, seconds_per_tick)) - M.adjustBruteLoss(-1, FALSE, required_bodytype = affected_bodytype) - M.adjustFireLoss(-1, FALSE, required_bodytype = affected_bodytype) - M.adjustOxyLoss(-1, FALSE, required_biotype = affected_biotype) - M.adjustToxLoss(-1, FALSE, required_biotype = affected_biotype) - . = TRUE - ..() + need_mob_update = affected_mob.adjustBruteLoss(-1, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustFireLoss(-1, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustOxyLoss(-1, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustToxLoss(-1, updating_health = FALSE, required_biotype = affected_biotype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/honey/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) . = ..() @@ -861,10 +867,10 @@ color = "#664330" // rgb: 102, 67, 48 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/nutriment/stabilized/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) - if(M.nutrition > NUTRITION_LEVEL_FULL - 25) - M.adjust_nutrition(-3 * REM * get_nutriment_factor() * seconds_per_tick) - ..() +/datum/reagent/consumable/nutriment/stabilized/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + if(affected_mob.nutrition > NUTRITION_LEVEL_FULL - 25) + affected_mob.adjust_nutrition(-3 * REM * get_nutriment_factor() * seconds_per_tick) ////Lavaland Flora Reagents//// @@ -877,19 +883,20 @@ ph = 12 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/entpoly/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) - if(current_cycle >= 10) - M.Unconscious(40 * REM * seconds_per_tick, FALSE) - . = TRUE +/datum/reagent/consumable/entpoly/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + var/need_mob_update + if(current_cycle > 10) + affected_mob.Unconscious(40 * REM * seconds_per_tick, FALSE) if(SPT_PROB(10, seconds_per_tick)) - M.losebreath += 4 - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2*REM, 150, affected_biotype) - M.adjustToxLoss(3*REM, FALSE, required_biotype = affected_biotype) - M.adjustStaminaLoss(10*REM, FALSE, required_biotype = affected_biotype) - M.set_eye_blur_if_lower(10 SECONDS) - . = TRUE - ..() - + affected_mob.losebreath += 4 + affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2*REM, 150, affected_biotype) + affected_mob.adjustToxLoss(3*REM, updating_health = FALSE, required_biotype = affected_biotype) + affected_mob.adjustStaminaLoss(10*REM, updating_stamina = FALSE, required_biotype = affected_biotype) + affected_mob.set_eye_blur_if_lower(10 SECONDS) + need_mob_update = TRUE + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/tinlux name = "Tinea Luxor" @@ -925,12 +932,14 @@ ph = 10.4 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/vitfro/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) +/datum/reagent/consumable/vitfro/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + var/need_mob_update if(SPT_PROB(55, seconds_per_tick)) - M.adjustBruteLoss(-1, FALSE, required_bodytype = affected_bodytype) - M.adjustFireLoss(-1, FALSE, required_bodytype = affected_bodytype) - . = TRUE - ..() + need_mob_update = affected_mob.adjustBruteLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustFireLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/liquidelectricity name = "Liquid Electricity" @@ -953,13 +962,13 @@ if(istype(stomach)) stomach.adjust_charge(reac_volume * 30) -/datum/reagent/consumable/liquidelectricity/enriched/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) - if(isethereal(M)) - M.blood_volume += 1 * seconds_per_tick +/datum/reagent/consumable/liquidelectricity/enriched/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + if(isethereal(affected_mob)) + affected_mob.blood_volume += 1 * seconds_per_tick else if(SPT_PROB(10, seconds_per_tick)) //lmao at the newbs who eat energy bars - M.electrocute_act(rand(5,10), "Liquid Electricity in their body", 1, SHOCK_NOGLOVES) //the shock is coming from inside the house - playsound(M, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - return ..() + affected_mob.electrocute_act(rand(5,10), "Liquid Electricity in their body", 1, SHOCK_NOGLOVES) //the shock is coming from inside the house + playsound(affected_mob, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) /datum/reagent/consumable/astrotame name = "Astrotame" @@ -973,11 +982,10 @@ overdose_threshold = 17 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/astrotame/overdose_process(mob/living/carbon/M, seconds_per_tick, times_fired) - if(M.disgust < 80) - M.adjust_disgust(10 * REM * seconds_per_tick) - ..() - . = TRUE +/datum/reagent/consumable/astrotame/overdose_process(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + if(affected_mob.disgust < 80) + affected_mob.adjust_disgust(10 * REM * seconds_per_tick) /datum/reagent/consumable/secretsauce name = "Secret Sauce" @@ -1022,11 +1030,10 @@ overdose_threshold = 15 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/char/overdose_process(mob/living/M, seconds_per_tick, times_fired) +/datum/reagent/consumable/char/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(13, seconds_per_tick)) - M.say(pick_list_replacements(BOOMER_FILE, "boomer"), forced = /datum/reagent/consumable/char) - ..() - return + affected_mob.say(pick_list_replacements(BOOMER_FILE, "boomer"), forced = /datum/reagent/consumable/char) /datum/reagent/consumable/bbqsauce name = "BBQ Sauce" @@ -1136,11 +1143,11 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED default_container = /obj/item/reagent_containers/condiment/peanut_butter -/datum/reagent/consumable/peanut_butter/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) //ET loves peanut butter - if(isabductor(M)) - M.add_mood_event("ET_pieces", /datum/mood_event/et_pieces, name) - M.set_drugginess(30 SECONDS * REM * seconds_per_tick) - ..() +/datum/reagent/consumable/peanut_butter/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) //ET loves peanut butter + . = ..() + if(isabductor(affected_mob)) + affected_mob.add_mood_event("ET_pieces", /datum/mood_event/et_pieces, name) + affected_mob.set_drugginess(30 SECONDS * REM * seconds_per_tick) /datum/reagent/consumable/vinegar name = "Vinegar" @@ -1198,10 +1205,10 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/mintextract/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(HAS_TRAIT(affected_mob, TRAIT_FAT)) affected_mob.investigate_log("has been gibbed by consuming [src] while fat.", INVESTIGATE_DEATHS) affected_mob.inflate_gib() - return ..() /datum/reagent/consumable/worcestershire name = "Worcestershire Sauce" diff --git a/code/modules/reagents/chemistry/reagents/impure_reagents.dm b/code/modules/reagents/chemistry/reagents/impure_reagents.dm index f7eaba3c211..1a06ae11cd9 100644 --- a/code/modules/reagents/chemistry/reagents/impure_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/impure_reagents.dm @@ -17,10 +17,15 @@ /datum/reagent/impurity/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) - if(isnull(liver)) //Though, lets be safe - return affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) //Incase of no liver! - affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, liver_damage * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) - return TRUE + var/need_mob_update + + if(liver)//Though, lets be safe + need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, liver_damage * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + else + need_mob_update = affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)//Incase of no liver! + + if(need_mob_update) + return UPDATE_MOB_HEALTH //Basically just so people don't forget to adjust metabolization_rate /datum/reagent/inverse @@ -36,7 +41,8 @@ /datum/reagent/inverse/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - return affected_mob.adjustToxLoss(tox_damage * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) + if(affected_mob.adjustToxLoss(tox_damage * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH //Failed chems - generally use inverse if you want to use a impure subtype for it //technically not a impure chem, but it's here because it can only be made with a failed impure reaction @@ -96,6 +102,7 @@ var/atom/movable/screen/alert/status_effect/freon/cryostylane_alert /datum/reagent/inverse/cryostylane/on_mob_add(mob/living/carbon/affected_mob, amount) + . = ..() cube = new /obj/structure/ice_stasis(get_turf(affected_mob)) cube.color = COLOR_CYAN cube.set_anchored(TRUE) @@ -103,17 +110,21 @@ affected_mob.apply_status_effect(/datum/status_effect/grouped/stasis, STASIS_CHEMICAL_EFFECT) cryostylane_alert = affected_mob.throw_alert("cryostylane_alert", /atom/movable/screen/alert/status_effect/freon/cryostylane) cryostylane_alert.attached_effect = src //so the alert can reference us, if it needs to - ..() /datum/reagent/inverse/cryostylane/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + if(current_cycle >= 60) + holder.remove_reagent(type, volume) // remove it all if we're past 60 cycles + return ..() if(!cube || affected_mob.loc != cube) - affected_mob.reagents.remove_reagent(type, volume) //remove it all if we're past 60s - if(current_cycle > 60) metabolization_rate += 0.01 - ..() + return ..() /datum/reagent/inverse/cryostylane/on_mob_delete(mob/living/carbon/affected_mob, amount) + . = ..() QDEL_NULL(cube) - affected_mob.remove_status_effect(/datum/status_effect/grouped/stasis, STASIS_CHEMICAL_EFFECT) - affected_mob.clear_alert("cryostylane_alert") - ..() + if(!iscarbon(affected_mob)) + return + + var/mob/living/carbon/carbon_mob = affected_mob + carbon_mob.remove_status_effect(/datum/status_effect/grouped/stasis, STASIS_CHEMICAL_EFFECT) + carbon_mob.clear_alert("cryostylane_alert") diff --git a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm index db98ed9d622..7abe44893a1 100644 --- a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm @@ -35,19 +35,21 @@ affected_respiration_type = ALL //Random healing of the 4 main groups -/datum/reagent/impurity/healing/medicine_failure/on_mob_life(mob/living/carbon/owner, seconds_per_tick, times_fired) +/datum/reagent/impurity/healing/medicine_failure/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + var/need_mob_update var/pick = pick("brute", "burn", "tox", "oxy") switch(pick) if("brute") - owner.adjustBruteLoss(-0.5, required_bodytype = affected_bodytype) + need_mob_update = affected_mob.adjustBruteLoss(-0.5, updating_health = FALSE, required_bodytype = affected_bodytype) if("burn") - owner.adjustFireLoss(-0.5, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustFireLoss(-0.5, updating_health = FALSE, required_bodytype = affected_bodytype) if("tox") - owner.adjustToxLoss(-0.5, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustToxLoss(-0.5, updating_health = FALSE, required_biotype = affected_biotype) if("oxy") - owner.adjustOxyLoss(-0.5, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - ..() - return TRUE + need_mob_update += affected_mob.adjustOxyLoss(-0.5, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + if(need_mob_update) + return UPDATE_MOB_HEALTH // C2 medications // Helbital @@ -64,10 +66,10 @@ var/list/timer_ids //Warns you about the impenting hands -/datum/reagent/inverse/helgrasp/on_mob_add(mob/living/L, amount) - to_chat(L, span_hierophant("You hear laughter as malevolent hands apparate before you, eager to drag you down to hell...! Look out!")) - playsound(L.loc, 'sound/chemistry/ahaha.ogg', 80, TRUE, -1) //Very obvious tell so people can be ready +/datum/reagent/inverse/helgrasp/on_mob_add(mob/living/affected_mob, amount) . = ..() + to_chat(affected_mob, span_hierophant("You hear laughter as malevolent hands apparate before you, eager to drag you down to hell...! Look out!")) + playsound(affected_mob.loc, 'sound/chemistry/ahaha.ogg', 80, TRUE, -1) //Very obvious tell so people can be ready //Sends hands after you for your hubris /* @@ -81,8 +83,9 @@ Then I attempt to calculate the how many hands to created based off the current I take the 2s interval period and divide it by the number of hands I want to make (i.e. the current seconds_per_tick) and I keep track of how many hands I'm creating (since I always create one on a tick, then I start at 1 hand). For each hand I then use this time value multiplied by the number of hands. Since we're spawning one now, and it checks to see if hands is less than, but not less than or equal to, seconds_per_tick, no hands will be created on the next expected tick. Basically, we fill the time between now and 2s from now with hands based off the current lag. */ -/datum/reagent/inverse/helgrasp/on_mob_life(mob/living/carbon/owner, seconds_per_tick, times_fired) - spawn_hands(owner) +/datum/reagent/inverse/helgrasp/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + spawn_hands(affected_mob) lag_remainder += seconds_per_tick - FLOOR(seconds_per_tick, 1) seconds_per_tick = FLOOR(seconds_per_tick, 1) if(lag_remainder >= 1) @@ -91,36 +94,35 @@ Basically, we fill the time between now and 2s from now with hands based off the var/hands = 1 var/time = 2 / seconds_per_tick while(hands < seconds_per_tick) //we already made a hand now so start from 1 - LAZYADD(timer_ids, addtimer(CALLBACK(src, PROC_REF(spawn_hands), owner), (time*hands) SECONDS, TIMER_STOPPABLE)) //keep track of all the timers we set up + LAZYADD(timer_ids, addtimer(CALLBACK(src, PROC_REF(spawn_hands), affected_mob), (time*hands) SECONDS, TIMER_STOPPABLE)) //keep track of all the timers we set up hands += time - return ..() -/datum/reagent/inverse/helgrasp/proc/spawn_hands(mob/living/carbon/owner) - if(!owner && iscarbon(holder.my_atom))//Catch timer - owner = holder.my_atom +/datum/reagent/inverse/helgrasp/proc/spawn_hands(mob/living/carbon/affected_mob) + if(!affected_mob && iscarbon(holder.my_atom))//Catch timer + affected_mob = holder.my_atom //Adapted from the end of the curse - but lasts a short time - var/grab_dir = turn(owner.dir, pick(-90, 90, 180, 180)) //grab them from a random direction other than the one faced, favoring grabbing from behind - var/turf/spawn_turf = get_ranged_target_turf(owner, grab_dir, 8)//Larger range so you have more time to dodge + var/grab_dir = turn(affected_mob.dir, pick(-90, 90, 180, 180)) //grab them from a random direction other than the one faced, favoring grabbing from behind + var/turf/spawn_turf = get_ranged_target_turf(affected_mob, grab_dir, 8)//Larger range so you have more time to dodge if(!spawn_turf) return - new/obj/effect/temp_visual/dir_setting/curse/grasp_portal(spawn_turf, owner.dir) + new/obj/effect/temp_visual/dir_setting/curse/grasp_portal(spawn_turf, affected_mob.dir) playsound(spawn_turf, 'sound/effects/curse2.ogg', 80, TRUE, -1) var/obj/projectile/curse_hand/hel/hand = new (spawn_turf) - hand.preparePixelProjectile(owner, spawn_turf) + hand.preparePixelProjectile(affected_mob, spawn_turf) if(QDELETED(hand)) //safety check if above fails - above has a stack trace if it does fail return hand.fire() //At the end, we clear up any loose hanging timers just in case and spawn any remaining lag_remaining hands all at once. -/datum/reagent/inverse/helgrasp/on_mob_delete(mob/living/owner) +/datum/reagent/inverse/helgrasp/on_mob_delete(mob/living/affected_mob) + . = ..() var/hands = 0 while(lag_remainder > hands) - spawn_hands(owner) + spawn_hands(affected_mob) hands++ for(var/id in timer_ids) // So that we can be certain that all timers are deleted at the end. deltimer(id) timer_ids.Cut() - return ..() /datum/reagent/inverse/helgrasp/heretic name = "Grasp of the Mansus" @@ -139,9 +141,9 @@ Basically, we fill the time between now and 2s from now with hands based off the liver_damage = 0.1 addiction_types = list(/datum/addiction/medicine = 4) -/datum/reagent/impurity/libitoil/on_mob_add(mob/living/L, amount) +/datum/reagent/impurity/libitoil/on_mob_add(mob/living/affected_mob, amount) . = ..() - var/mob/living/carbon/consumer = L + var/mob/living/carbon/consumer = affected_mob if(!consumer) return RegisterSignal(consumer, COMSIG_CARBON_GAIN_ORGAN, PROC_REF(on_gained_organ)) @@ -163,9 +165,9 @@ Basically, we fill the time between now and 2s from now with hands based off the var/obj/item/organ/internal/liver/this_liver = organ this_liver.alcohol_tolerance /= 2 -/datum/reagent/impurity/libitoil/on_mob_delete(mob/living/L) +/datum/reagent/impurity/libitoil/on_mob_delete(mob/living/affected_mob) . = ..() - var/mob/living/carbon/consumer = L + var/mob/living/carbon/consumer = affected_mob UnregisterSignal(consumer, COMSIG_CARBON_LOSE_ORGAN) UnregisterSignal(consumer, COMSIG_CARBON_GAIN_ORGAN) var/obj/item/organ/internal/liver/this_liver = consumer.get_organ_slot(ORGAN_SLOT_LIVER) @@ -187,8 +189,8 @@ Basically, we fill the time between now and 2s from now with hands based off the liver_damage = 0 /datum/reagent/impurity/probital_failed/overdose_start(mob/living/carbon/M) + . = ..() metabolization_rate = 4 * REAGENTS_METABOLISM - ..() /datum/reagent/peptides_failed name = "Prion Peptides" @@ -196,11 +198,11 @@ Basically, we fill the time between now and 2s from now with hands based off the description = "These inhibitory peptides drains nutrition and causes brain damage in the patient!" ph = 2.1 -/datum/reagent/peptides_failed/on_mob_life(mob/living/carbon/owner, seconds_per_tick, times_fired) - owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.25 * seconds_per_tick, 170) - owner.adjust_nutrition(-5 * REAGENTS_METABOLISM * seconds_per_tick) - ..() - return TRUE +/datum/reagent/peptides_failed/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + if(affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.25 * seconds_per_tick, 170)) + . = UPDATE_MOB_HEALTH + affected_mob.adjust_nutrition(-5 * REAGENTS_METABOLISM * seconds_per_tick) //Lenturi //impure @@ -210,13 +212,13 @@ Basically, we fill the time between now and 2s from now with hands based off the addiction_types = list(/datum/addiction/medicine = 8) liver_damage = 0 -/datum/reagent/impurity/lentslurri/on_mob_metabolize(mob/living/carbon/owner) - owner.add_movespeed_modifier(/datum/movespeed_modifier/reagent/lenturi) - return ..() +/datum/reagent/impurity/lentslurri/on_mob_metabolize(mob/living/carbon/affected_mob) + . = ..() + affected_mob.add_movespeed_modifier(/datum/movespeed_modifier/reagent/lenturi) -/datum/reagent/impurity/lentslurri/on_mob_end_metabolize(mob/living/carbon/owner) - owner.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/lenturi) - return ..() +/datum/reagent/impurity/lentslurri/on_mob_end_metabolize(mob/living/carbon/affected_mob) + . = ..() + affected_mob.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/lenturi) //failed /datum/reagent/inverse/ichiyuri @@ -233,19 +235,19 @@ Basically, we fill the time between now and 2s from now with hands based off the var/spammer = 0 //Just the removed itching mechanism - omage to it's origins. -/datum/reagent/inverse/ichiyuri/on_mob_life(mob/living/carbon/owner, seconds_per_tick, times_fired) - if(prob(resetting_probability) && !(HAS_TRAIT(owner, TRAIT_RESTRAINED) || owner.incapacitated())) +/datum/reagent/inverse/ichiyuri/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + if(prob(resetting_probability) && !(HAS_TRAIT(affected_mob, TRAIT_RESTRAINED) || affected_mob.incapacitated())) . = TRUE if(spammer < world.time) - to_chat(owner,span_warning("You can't help but itch yourself.")) + to_chat(affected_mob,span_warning("You can't help but itch yourself.")) spammer = world.time + (10 SECONDS) var/scab = rand(1,7) - owner.adjustBruteLoss(scab*REM) - owner.bleed(scab) + if(affected_mob.adjustBruteLoss(scab*REM, updating_health = FALSE)) + . = UPDATE_MOB_HEALTH + affected_mob.bleed(scab) resetting_probability = 0 - resetting_probability += (5*(current_cycle/10) * seconds_per_tick) // 10 iterations = >51% to itch - ..() - return . + resetting_probability += (5*((current_cycle-1)/10) * seconds_per_tick) // 10 iterations = >51% to itch //Aiuri //impure @@ -258,14 +260,14 @@ Basically, we fill the time between now and 2s from now with hands based off the /// blurriness at the start of taking the med var/amount_of_blur_applied = 0 SECONDS -/datum/reagent/impurity/aiuri/on_mob_add(mob/living/owner, amount) +/datum/reagent/impurity/aiuri/on_mob_add(mob/living/affected_mob, amount) . = ..() amount_of_blur_applied = creation_purity * (volume / metabolization_rate) * 2 SECONDS - owner.adjust_eye_blur(amount_of_blur_applied) + affected_mob.adjust_eye_blur(amount_of_blur_applied) -/datum/reagent/impurity/aiuri/on_mob_delete(mob/living/owner, amount) +/datum/reagent/impurity/aiuri/on_mob_delete(mob/living/affected_mob, amount) . = ..() - owner.adjust_eye_blur(-amount_of_blur_applied) + affected_mob.adjust_eye_blur(-amount_of_blur_applied) //Hercuri //inverse @@ -280,14 +282,14 @@ Basically, we fill the time between now and 2s from now with hands based off the taste_description = "heat! Ouch!" addiction_types = list(/datum/addiction/medicine = 2.5) -/datum/reagent/inverse/hercuri/on_mob_life(mob/living/carbon/owner, seconds_per_tick, times_fired) +/datum/reagent/inverse/hercuri/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() var/heating = rand(5, 25) * creation_purity * REM * seconds_per_tick - owner.reagents?.chem_temp += heating - owner.adjust_bodytemperature(heating * TEMPERATURE_DAMAGE_COEFFICIENT) - if(!ishuman(owner)) + affected_mob.reagents?.chem_temp += heating + affected_mob.adjust_bodytemperature(heating * TEMPERATURE_DAMAGE_COEFFICIENT) + if(!ishuman(affected_mob)) return - var/mob/living/carbon/human/human = owner + var/mob/living/carbon/human/human = affected_mob human.adjust_coretemperature(heating * TEMPERATURE_DAMAGE_COEFFICIENT) /datum/reagent/inverse/hercuri/expose_mob(mob/living/carbon/exposed_mob, methods=VAPOR, reac_volume) @@ -298,13 +300,14 @@ Basically, we fill the time between now and 2s from now with hands based off the exposed_mob.adjust_bodytemperature(reac_volume * TEMPERATURE_DAMAGE_COEFFICIENT) exposed_mob.adjust_fire_stacks(reac_volume / 2) -/datum/reagent/inverse/hercuri/overdose_process(mob/living/carbon/owner, seconds_per_tick, times_fired) +/datum/reagent/inverse/hercuri/overdose_process(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - owner.adjustOrganLoss(ORGAN_SLOT_LIVER, 2 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) //Makes it so you can't abuse it with pyroxadone very easily (liver dies from 25u unless it's fully upgraded) + if(affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 2 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) //Makes it so you can't abuse it with pyroxadone very easily (liver dies from 25u unless it's fully upgraded) + . = UPDATE_MOB_HEALTH var/heating = 10 * creation_purity * REM * seconds_per_tick * TEMPERATURE_DAMAGE_COEFFICIENT - owner.adjust_bodytemperature(heating) //hot hot - if(ishuman(owner)) - var/mob/living/carbon/human/human = owner + affected_mob.adjust_bodytemperature(heating) //hot hot + if(ishuman(affected_mob)) + var/mob/living/carbon/human/human = affected_mob human.adjust_coretemperature(heating) /datum/reagent/inverse/healing/tirimol @@ -317,16 +320,17 @@ Basically, we fill the time between now and 2s from now with hands based off the addiction_types = list(/datum/addiction/medicine = 5) //Makes patients fall asleep, then boosts the purirty of their medicine reagents if they're asleep -/datum/reagent/inverse/healing/tirimol/on_mob_life(mob/living/carbon/owner, seconds_per_tick, times_fired) +/datum/reagent/inverse/healing/tirimol/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() switch(current_cycle) - if(1 to 10)//same delay as chloral hydrate + if(2 to 11)//same delay as chloral hydrate if(prob(50)) - owner.emote("yawn") - if(10 to INFINITY) - owner.Sleeping(40) + affected_mob.emote("yawn") + if(11 to INFINITY) + affected_mob.Sleeping(40) . = 1 - if(owner.IsSleeping()) - for(var/datum/reagent/reagent as anything in owner.reagents.reagent_list) + if(affected_mob.IsSleeping()) + for(var/datum/reagent/reagent as anything in affected_mob.reagents.reagent_list) if(reagent in cached_reagent_list) continue if(!istype(reagent, /datum/reagent/medicine)) @@ -334,23 +338,22 @@ Basically, we fill the time between now and 2s from now with hands based off the reagent.creation_purity *= 1.25 cached_reagent_list += reagent - else if(!owner.IsSleeping() && length(cached_reagent_list)) + else if(!affected_mob.IsSleeping() && length(cached_reagent_list)) for(var/datum/reagent/reagent as anything in cached_reagent_list) if(!reagent) continue reagent.creation_purity *= 0.8 cached_reagent_list = list() - ..() -/datum/reagent/inverse/healing/tirimol/on_mob_delete(mob/living/owner) - if(owner.IsSleeping()) - owner.visible_message(span_notice("[icon2html(owner, viewers(DEFAULT_MESSAGE_RANGE, src))] [owner] lets out a hearty snore!"))//small way of letting people know the supersnooze is ended +/datum/reagent/inverse/healing/tirimol/on_mob_delete(mob/living/affected_mob) + . = ..() + if(affected_mob.IsSleeping()) + affected_mob.visible_message(span_notice("[icon2html(affected_mob, viewers(DEFAULT_MESSAGE_RANGE, src))] [affected_mob] lets out a hearty snore!"))//small way of letting people know the supersnooze is ended for(var/datum/reagent/reagent as anything in cached_reagent_list) if(!reagent) continue reagent.creation_purity *= 0.8 cached_reagent_list = list() - ..() //convermol //inverse @@ -369,11 +372,11 @@ Basically, we fill the time between now and 2s from now with hands based off the var/cached_cold_level_2 var/cached_cold_level_3 -/datum/reagent/inverse/healing/convermol/on_mob_add(mob/living/owner, amount) +/datum/reagent/inverse/healing/convermol/on_mob_add(mob/living/affected_mob, amount) . = ..() - RegisterSignal(owner, COMSIG_CARBON_GAIN_ORGAN, PROC_REF(on_gained_organ)) - RegisterSignal(owner, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(on_removed_organ)) - var/obj/item/organ/internal/lungs/lungs = owner.get_organ_slot(ORGAN_SLOT_LUNGS) + RegisterSignal(affected_mob, COMSIG_CARBON_GAIN_ORGAN, PROC_REF(on_gained_organ)) + RegisterSignal(affected_mob, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(on_removed_organ)) + var/obj/item/organ/internal/lungs/lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS) if(!lungs) return apply_lung_levels(lungs) @@ -416,11 +419,11 @@ Basically, we fill the time between now and 2s from now with hands based off the lungs.cold_level_2_threshold = cached_cold_level_2 lungs.cold_level_3_threshold = cached_cold_level_3 -/datum/reagent/inverse/healing/convermol/on_mob_delete(mob/living/owner) +/datum/reagent/inverse/healing/convermol/on_mob_delete(mob/living/affected_mob) . = ..() - UnregisterSignal(owner, COMSIG_CARBON_LOSE_ORGAN) - UnregisterSignal(owner, COMSIG_CARBON_GAIN_ORGAN) - var/obj/item/organ/internal/lungs/lungs = owner.get_organ_slot(ORGAN_SLOT_LUNGS) + UnregisterSignal(affected_mob, COMSIG_CARBON_LOSE_ORGAN) + UnregisterSignal(affected_mob, COMSIG_CARBON_GAIN_ORGAN) + var/obj/item/organ/internal/lungs/lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS) if(!lungs) return restore_lung_levels(lungs) @@ -439,13 +442,13 @@ Basically, we fill the time between now and 2s from now with hands based off the var/poison_interval = (9 SECONDS) -/datum/reagent/inverse/technetium/on_mob_life(mob/living/carbon/owner, seconds_per_tick, times_fired) +/datum/reagent/inverse/technetium/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() time_until_next_poison -= seconds_per_tick * (1 SECONDS) if (time_until_next_poison <= 0) time_until_next_poison = poison_interval - owner.adjustToxLoss(creation_purity * 1, required_biotype = affected_biotype) - . = TRUE - ..() + if(affected_mob.adjustToxLoss(creation_purity * 1, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH //Kind of a healing effect, Presumably you're using syrinver to purge so this helps that /datum/reagent/inverse/healing/syriniver @@ -457,7 +460,7 @@ Basically, we fill the time between now and 2s from now with hands based off the var/cached_reagent_list = list() addiction_types = list(/datum/addiction/medicine = 1.75) -/datum/reagent/inverse/healing/syriniver/on_mob_add(mob/living/affected_mob) +/datum/reagent/inverse/healing/syriniver/on_mob_add(mob/living/affected_mob, amount) if(!(iscarbon(affected_mob))) return ..() var/mob/living/carbon/affected_carbon = affected_mob @@ -493,12 +496,13 @@ Basically, we fill the time between now and 2s from now with hands based off the //Heals toxins if it's the only thing present - kinda the oposite of multiver! Maybe that's why it's inverse! /datum/reagent/inverse/healing/monover/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + var/need_mob_update if(length(affected_mob.reagents.reagent_list) > 1) - affected_mob.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.5 * seconds_per_tick, required_organ_flag = affected_organ_flags) //Hey! It's everyone's favourite drawback from multiver! - return ..() - affected_mob.adjustToxLoss(-2 * REM * creation_purity * seconds_per_tick, FALSE, required_biotype = affected_biotype) - ..() - return TRUE + need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.5 * seconds_per_tick, required_organ_flag = affected_organ_flags) //Hey! It's everyone's favourite drawback from multiver! + else + need_mob_update = affected_mob.adjustToxLoss(-2 * REM * creation_purity * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + if(need_mob_update) + return UPDATE_MOB_HEALTH ///Can bring a corpse back to life temporarily (if heart is intact) ///Makes wounds bleed more, if it brought someone back, they take additional brute and heart damage @@ -527,9 +531,10 @@ Basically, we fill the time between now and 2s from now with hands based off the ) /datum/reagent/inverse/penthrite/on_mob_dead(mob/living/carbon/affected_mob, seconds_per_tick) + . = ..() var/obj/item/organ/internal/heart/heart = affected_mob.get_organ_slot(ORGAN_SLOT_HEART) if(!heart || heart.organ_flags & ORGAN_FAILING) - return ..() + return metabolization_rate = 0.2 * REM affected_mob.add_traits(trait_buffs, type) affected_mob.set_stat(CONSCIOUS) //This doesn't touch knocked out @@ -544,18 +549,19 @@ Basically, we fill the time between now and 2s from now with hands based off the back_from_the_dead = TRUE affected_mob.emote("gasp") affected_mob.playsound_local(affected_mob, 'sound/health/fastbeat.ogg', 65) - ..() /datum/reagent/inverse/penthrite/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(!back_from_the_dead) - return ..() + return //Following is for those brought back from the dead only REMOVE_TRAIT(affected_mob, TRAIT_KNOCKEDOUT, CRIT_HEALTH_TRAIT) REMOVE_TRAIT(affected_mob, TRAIT_KNOCKEDOUT, OXYLOSS_TRAIT) for(var/datum/wound/iter_wound as anything in affected_mob.all_wounds) iter_wound.adjust_blood_flow(1-creation_purity) - affected_mob.adjustBruteLoss(5 * (1-creation_purity) * seconds_per_tick, required_bodytype = affected_bodytype) - affected_mob.adjustOrganLoss(ORGAN_SLOT_HEART, (1 + (1-creation_purity)) * seconds_per_tick, required_organ_flag = affected_organ_flags) + var/need_mob_update + need_mob_update = affected_mob.adjustBruteLoss(5 * (1-creation_purity) * seconds_per_tick, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_HEART, (1 + (1-creation_purity)) * seconds_per_tick, required_organ_flag = affected_organ_flags) if(affected_mob.health < HEALTH_THRESHOLD_CRIT) affected_mob.add_movespeed_modifier(/datum/movespeed_modifier/reagent/nooartrium) if(affected_mob.health < HEALTH_THRESHOLD_FULLCRIT) @@ -563,19 +569,20 @@ Basically, we fill the time between now and 2s from now with hands based off the var/obj/item/organ/internal/heart/heart = affected_mob.get_organ_slot(ORGAN_SLOT_HEART) if(!heart || heart.organ_flags & ORGAN_FAILING) remove_buffs(affected_mob) - ..() - return TRUE - + if(need_mob_update) + return UPDATE_MOB_HEALTH + /datum/reagent/inverse/penthrite/on_mob_delete(mob/living/carbon/affected_mob) + . = ..() remove_buffs(affected_mob) var/obj/item/organ/internal/heart/heart = affected_mob.get_organ_slot(ORGAN_SLOT_HEART) if(affected_mob.health < -500 || heart.organ_flags & ORGAN_FAILING)//Honestly commendable if you get -500 explosion(affected_mob, light_impact_range = 1, explosion_cause = src) qdel(heart) affected_mob.visible_message(span_boldwarning("[affected_mob]'s heart explodes!")) - return ..() /datum/reagent/inverse/penthrite/overdose_start(mob/living/carbon/affected_mob) + . = ..() if(!back_from_the_dead) return ..() var/obj/item/organ/internal/heart/heart = affected_mob.get_organ_slot(ORGAN_SLOT_HEART) @@ -650,7 +657,7 @@ Basically, we fill the time between now and 2s from now with hands based off the var/datum/brain_trauma/temp_trauma /datum/reagent/inverse/neurine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - .=..() + . = ..() if(temp_trauma) return if(!(SPT_PROB(creation_purity*10, seconds_per_tick))) @@ -658,7 +665,7 @@ Basically, we fill the time between now and 2s from now with hands based off the var/traumalist = subtypesof(/datum/brain_trauma) var/list/forbiddentraumas = list( /datum/brain_trauma/severe/split_personality, // Split personality uses a ghost, I don't want to use a ghost for a temp thing - /datum/brain_trauma/special/obsessed, // Obsessed sets the owner as an antag - I presume this will lead to problems, so we'll remove it + /datum/brain_trauma/special/obsessed, // Obsessed sets the affected_mob as an antag - I presume this will lead to problems, so we'll remove it /datum/brain_trauma/hypnosis, // Hypnosis, same reason as obsessed, plus a bug makes it remain even after the neurowhine purges and then turn into "nothing" on the med reading upon a second application /datum/brain_trauma/special/honorbound, // Designed to be chaplain exclusive ) @@ -672,7 +679,7 @@ Basically, we fill the time between now and 2s from now with hands based off the return /datum/reagent/inverse/neurine/on_mob_delete(mob/living/carbon/affected_mob) - .=..() + . = ..() if(!temp_trauma) return if(istype(temp_trauma, /datum/brain_trauma/special/imaginary_friend))//Good friends stay by you, no matter what @@ -696,6 +703,7 @@ Basically, we fill the time between now and 2s from now with hands based off the ///Creates a new cursed heart and puts the old inside of it, then replaces the position of the old /datum/reagent/inverse/corazargh/on_mob_metabolize(mob/living/affected_mob) + . = ..() if(!iscarbon(affected_mob)) return var/mob/living/carbon/carbon_mob = affected_mob @@ -714,7 +722,6 @@ Basically, we fill the time between now and 2s from now with hands based off the RegisterSignal(carbon_mob, COMSIG_CARBON_GAIN_ORGAN, PROC_REF(on_gained_organ)) RegisterSignal(carbon_mob, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(on_removed_organ)) to_chat(affected_mob, span_userdanger("You feel your heart suddenly stop beating on it's own - you'll have to manually beat it!")) - ..() ///Intercepts the new heart and creates a new cursed heart - putting the old inside of it /datum/reagent/inverse/corazargh/proc/on_gained_organ(mob/affected_mob, obj/item/organ/organ) @@ -753,6 +760,7 @@ Basically, we fill the time between now and 2s from now with hands based off the ///We're done - remove the curse and restore the old one /datum/reagent/inverse/corazargh/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() //Do these first so Insert doesn't call them UnregisterSignal(affected_mob, COMSIG_CARBON_LOSE_ORGAN) UnregisterSignal(affected_mob, COMSIG_CARBON_GAIN_ORGAN) @@ -765,7 +773,6 @@ Basically, we fill the time between now and 2s from now with hands based off the original_heart.Insert(affected_carbon, special = TRUE) QDEL_NULL(manual_heart_ref) to_chat(affected_mob, span_userdanger("You feel your heart start beating normally again!")) - ..() /datum/reagent/inverse/antihol name = "Prohol" @@ -778,9 +785,9 @@ Basically, we fill the time between now and 2s from now with hands based off the tox_damage = 0 /datum/reagent/inverse/antihol/on_mob_life(mob/living/carbon/C, seconds_per_tick, times_fired) + . = ..() for(var/datum/reagent/consumable/ethanol/alcohol in C.reagents.reagent_list) alcohol.boozepwr += seconds_per_tick - ..() /datum/reagent/inverse/oculine name = "Oculater" @@ -797,19 +804,19 @@ Basically, we fill the time between now and 2s from now with hands based off the var/headache = FALSE /datum/reagent/inverse/oculine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(headache) return ..() if(SPT_PROB(100 * creation_purity, seconds_per_tick)) affected_mob.become_blind(IMPURE_OCULINE) to_chat(affected_mob, span_danger("You suddenly develop a pounding headache as your vision fluxuates.")) headache = TRUE - ..() /datum/reagent/inverse/oculine/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() affected_mob.cure_blind(IMPURE_OCULINE) if(headache) to_chat(affected_mob, span_notice("Your headache clears up!")) - ..() /datum/reagent/impurity/inacusiate name = "Tinacusiate" @@ -825,15 +832,15 @@ Basically, we fill the time between now and 2s from now with hands based off the var/randomSpan /datum/reagent/impurity/inacusiate/on_mob_metabolize(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() randomSpan = pick(list("clown", "small", "big", "hypnophrase", "alien", "cult", "alert", "danger", "emote", "yell", "brass", "sans", "papyrus", "robot", "his_grace", "phobia")) RegisterSignal(affected_mob, COMSIG_MOVABLE_HEAR, PROC_REF(owner_hear)) to_chat(affected_mob, span_warning("Your hearing seems to be a bit off!")) - ..() /datum/reagent/impurity/inacusiate/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() UnregisterSignal(affected_mob, COMSIG_MOVABLE_HEAR) to_chat(affected_mob, span_notice("You start hearing things normally again.")) - ..() /datum/reagent/impurity/inacusiate/proc/owner_hear(mob/living/owner, list/hearing_args) SIGNAL_HANDLER diff --git a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/impure_reagents/impure_toxin_reagents.dm index 947c83c3166..0872fa66588 100644 --- a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/impure_reagents/impure_toxin_reagents.dm @@ -18,7 +18,6 @@ owner.adjust_disgust(50) ..() - //Formaldehyde - Impure Version /datum/reagent/impurity/methanol name = "Methanol" @@ -29,9 +28,10 @@ liver_damage = 0 /datum/reagent/impurity/methanol/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() var/obj/item/organ/internal/eyes/eyes = affected_mob.get_organ_slot(ORGAN_SLOT_EYES) - eyes?.apply_organ_damage(0.5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) - return ..() + if(eyes?.apply_organ_damage(0.5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + return UPDATE_MOB_HEALTH //Chloral Hydrate - Impure Version /datum/reagent/impurity/chloralax @@ -43,9 +43,9 @@ liver_damage = 0 /datum/reagent/impurity/chloralax/on_mob_life(mob/living/carbon/owner, seconds_per_tick) - owner.adjustToxLoss(1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - ..() - + . = ..() + if(owner.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH //Mindbreaker Toxin - Impure Version /datum/reagent/impurity/rosenol @@ -58,12 +58,12 @@ metabolization_rate = 0.5 * REAGENTS_METABOLISM /datum/reagent/impurity/rosenol/on_mob_life(mob/living/carbon/owner, seconds_per_tick) + . = ..() var/obj/item/organ/internal/tongue/tongue = owner.get_organ_slot(ORGAN_SLOT_TONGUE) if(!tongue) - return ..() + return if(SPT_PROB(4.0, seconds_per_tick)) owner.manual_emote("clicks with [owner.p_their()] tongue.") owner.say("Noice.", forced = /datum/reagent/impurity/rosenol) if(SPT_PROB(2.0, seconds_per_tick)) owner.say(pick("Ah! That was a mistake!", "Horrible.", "Watch out everybody, the potato is really hot.", "When I was six I ate a bag of plums.", "And if there is one thing I can't stand it's tomatoes.", "And if there is one thing I love it's tomatoes.", "We had a captain who was so strict, you weren't allowed to breathe in their station.", "The unrobust ones just used to keel over and die, you'd hear them going down behind you."), forced = /datum/reagent/impurity/rosenol) - ..() diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 30fae4db9c7..ff1671852c1 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -13,7 +13,8 @@ current_cycle++ if(length(reagent_removal_skip_list)) return - holder.remove_reagent(type, metabolization_rate * seconds_per_tick / affected_mob.metabolism_efficiency) //medicine reagents stay longer if you have a better metabolism + if(holder) + holder.remove_reagent(type, metabolization_rate * seconds_per_tick / affected_mob.metabolism_efficiency) //medicine reagents stay longer if you have a better metabolism /datum/reagent/medicine/leporazine name = "Leporazine" @@ -23,6 +24,7 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/leporazine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() var/target_temp = affected_mob.get_body_temp_normal(apply_change = FALSE) if(affected_mob.bodytemperature > target_temp) affected_mob.adjust_bodytemperature(-40 * TEMPERATURE_DAMAGE_COEFFICIENT * REM * seconds_per_tick, target_temp) @@ -34,7 +36,6 @@ affected_human.adjust_coretemperature(-40 * TEMPERATURE_DAMAGE_COEFFICIENT * REM * seconds_per_tick, target_temp) else if(affected_human.coretemperature < (target_temp + 1)) affected_human.adjust_coretemperature(40 * TEMPERATURE_DAMAGE_COEFFICIENT * REM * seconds_per_tick, 0, target_temp) - ..() /datum/reagent/medicine/adminordrazine //An OP chemical for admins name = "Adminordrazine" @@ -66,12 +67,11 @@ mytray.visible_message(span_warning("Nothing happens...")) /datum/reagent/medicine/adminordrazine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.heal_bodypart_damage(5 * REM * seconds_per_tick, 5 * REM * seconds_per_tick, 0, FALSE, affected_bodytype) - affected_mob.adjustToxLoss(-5 * REM * seconds_per_tick, FALSE, TRUE, affected_biotype) + . = ..() + affected_mob.heal_bodypart_damage(brute = 5 * REM * seconds_per_tick, burn = 5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + affected_mob.adjustToxLoss(-5 * REM * seconds_per_tick, updating_health = FALSE, forced = TRUE, required_biotype = affected_biotype) // Heal everything! That we want to. But really don't heal reagents. Otherwise we'll lose ... us. - affected_mob.fully_heal(full_heal_flags & ~HEAL_ALL_REAGENTS) - ..() - return TRUE + affected_mob.fully_heal(full_heal_flags & ~HEAL_ALL_REAGENTS) // there is no need to return UPDATE_MOB_HEALTH because this proc calls updatehealth() /datum/reagent/medicine/adminordrazine/quantum_heal name = "Quantum Medicine" @@ -95,11 +95,11 @@ affected_mob.AdjustParalyzed(-20 * REM * seconds_per_tick) if(holder.has_reagent(/datum/reagent/toxin/mindbreaker)) holder.remove_reagent(/datum/reagent/toxin/mindbreaker, 5 * REM * seconds_per_tick) + . = ..() affected_mob.adjust_hallucinations(-20 SECONDS * REM * seconds_per_tick) if(SPT_PROB(16, seconds_per_tick)) - affected_mob.adjustToxLoss(1, FALSE, required_biotype = affected_biotype) - . = TRUE - ..() + if(affected_mob.adjustToxLoss(1, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/synaphydramine name = "Diphen-Synaptizine" @@ -114,11 +114,11 @@ holder.remove_reagent(/datum/reagent/toxin/mindbreaker, 5 * REM * seconds_per_tick) if(holder.has_reagent(/datum/reagent/toxin/histamine)) holder.remove_reagent(/datum/reagent/toxin/histamine, 5 * REM * seconds_per_tick) + . = ..() affected_mob.adjust_hallucinations(-20 SECONDS * REM * seconds_per_tick) if(SPT_PROB(16, seconds_per_tick)) - affected_mob.adjustToxLoss(1, FALSE, required_biotype = affected_biotype) - . = TRUE - ..() + if(affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/sansufentanyl name = "Sansufentanyl" @@ -128,16 +128,16 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/sansufentanyl/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_confusion_up_to(3 SECONDS * REM * seconds_per_tick, 5 SECONDS) affected_mob.adjust_dizzy_up_to(6 SECONDS * REM * seconds_per_tick, 12 SECONDS) - affected_mob.adjustStaminaLoss(1 * REM * seconds_per_tick) + if(affected_mob.adjustStaminaLoss(1 * REM * seconds_per_tick, updating_stamina = FALSE)) + . = UPDATE_MOB_HEALTH if(SPT_PROB(10, seconds_per_tick)) to_chat(affected_mob, "You feel confused and disoriented.") if(prob(30)) SEND_SOUND(affected_mob, sound('sound/weapons/flash_ring.ogg')) - ..() - return TRUE /datum/reagent/medicine/cryoxadone name = "Cryoxadone" @@ -150,22 +150,23 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/cryoxadone/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() metabolization_rate = REAGENTS_METABOLISM * (0.00001 * (affected_mob.bodytemperature ** 2) + 0.5) if(affected_mob.bodytemperature >= T0C || !HAS_TRAIT(affected_mob, TRAIT_KNOCKEDOUT)) - ..() return var/power = -0.00003 * (affected_mob.bodytemperature ** 2) + 3 - affected_mob.adjustOxyLoss(-3 * power * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - affected_mob.adjustBruteLoss(-power * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustFireLoss(-power * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustToxLoss(-power * REM * seconds_per_tick, FALSE, TRUE, affected_biotype) //heals TOXINLOVERs - affected_mob.adjustCloneLoss(-power * REM * seconds_per_tick, FALSE, affected_biotype) + var/need_mob_update + need_mob_update = affected_mob.adjustOxyLoss(-3 * power * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjustBruteLoss(-power * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustFireLoss(-power * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustToxLoss(-power * REM * seconds_per_tick, updating_health = FALSE, forced = TRUE, required_biotype = affected_biotype) //heals TOXINLOVERs + need_mob_update += affected_mob.adjustCloneLoss(-power * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) for(var/i in affected_mob.all_wounds) var/datum/wound/iter_wound = i iter_wound.on_xadone(power * REM * seconds_per_tick) REMOVE_TRAIT(affected_mob, TRAIT_DISFIGURED, TRAIT_GENERIC) //fixes common causes for disfiguration - ..() - return TRUE + if(need_mob_update) + return UPDATE_MOB_HEALTH // Healing /datum/reagent/medicine/cryoxadone/on_hydroponics_apply(obj/machinery/hydroponics/mytray, mob/user) @@ -181,12 +182,12 @@ metabolization_rate = 1.5 * REAGENTS_METABOLISM /datum/reagent/medicine/clonexadone/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(affected_mob.bodytemperature < T0C) - affected_mob.adjustCloneLoss((0.00006 * (affected_mob.bodytemperature ** 2) - 6) * REM * seconds_per_tick, FALSE) + if(affected_mob.adjustCloneLoss((0.00006 * (affected_mob.bodytemperature ** 2) - 6) * REM * seconds_per_tick, updating_health = FALSE)) + . = UPDATE_MOB_HEALTH REMOVE_TRAIT(affected_mob, TRAIT_DISFIGURED, TRAIT_GENERIC) - . = TRUE metabolization_rate = REAGENTS_METABOLISM * (0.000015 * (affected_mob.bodytemperature ** 2) + 0.75) - ..() /datum/reagent/medicine/pyroxadone name = "Pyroxadone" @@ -197,6 +198,7 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/pyroxadone/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(affected_mob.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT) var/power = 0 switch(affected_mob.bodytemperature) @@ -209,17 +211,18 @@ if(affected_mob.on_fire) power *= 2 - affected_mob.adjustOxyLoss(-2 * power * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - affected_mob.adjustBruteLoss(-power * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustFireLoss(-1.5 * power * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustToxLoss(-power * REM * seconds_per_tick, FALSE, TRUE, affected_biotype) - affected_mob.adjustCloneLoss(-power * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) + var/need_mob_update + need_mob_update = affected_mob.adjustOxyLoss(-2 * power * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjustBruteLoss(-power * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustFireLoss(-1.5 * power * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustToxLoss(-power * REM * seconds_per_tick, updating_health = FALSE, forced = TRUE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustCloneLoss(-power * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + if(need_mob_update) + . = UPDATE_MOB_HEALTH for(var/i in affected_mob.all_wounds) var/datum/wound/iter_wound = i iter_wound.on_xadone(power * REM * seconds_per_tick) REMOVE_TRAIT(affected_mob, TRAIT_DISFIGURED, TRAIT_GENERIC) - . = TRUE - ..() /datum/reagent/medicine/rezadone name = "Rezadone" @@ -232,18 +235,20 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/rezadone/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.setCloneLoss(0) //Rezadone is almost never used in favor of cryoxadone. Hopefully this will change that. // No such luck so far - affected_mob.heal_bodypart_damage(1 * REM * seconds_per_tick, 1 * REM * seconds_per_tick) + . = ..() + var/need_mob_update + need_mob_update = affected_mob.setCloneLoss(0) //Rezadone is almost never used in favor of cryoxadone. Hopefully this will change that. // No such luck so far + need_mob_update += affected_mob.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 1 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_biotype) + if(need_mob_update) + . = UPDATE_MOB_HEALTH REMOVE_TRAIT(affected_mob, TRAIT_DISFIGURED, TRAIT_GENERIC) - ..() - . = TRUE /datum/reagent/medicine/rezadone/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) + . = ..() + if(affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + . = UPDATE_MOB_HEALTH affected_mob.set_dizzy_if_lower(10 SECONDS * REM * seconds_per_tick) affected_mob.set_jitter_if_lower(10 SECONDS * REM * seconds_per_tick) - ..() - . = TRUE /datum/reagent/medicine/rezadone/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) . = ..() @@ -263,13 +268,13 @@ ph = 8.1 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/medicine/spaceacillin/on_mob_add(mob/living/L) +/datum/reagent/medicine/spaceacillin/on_mob_add(mob/living/affected_mob) . = ..() - ADD_TRAIT(L, TRAIT_VIRUS_RESISTANCE, type) + ADD_TRAIT(affected_mob, TRAIT_VIRUS_RESISTANCE, type) -/datum/reagent/medicine/spaceacillin/on_mob_delete(mob/living/L) +/datum/reagent/medicine/spaceacillin/on_mob_delete(mob/living/affected_mob) . = ..() - REMOVE_TRAIT(L, TRAIT_VIRUS_RESISTANCE, type) + REMOVE_TRAIT(affected_mob, TRAIT_VIRUS_RESISTANCE, type) //Goon Chems. Ported mainly from Goonstation. Easily mixable (or not so easily) and provide a variety of effects. @@ -284,18 +289,20 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/oxandrolone/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + var/need_mob_update if(affected_mob.getFireLoss() > 25) - affected_mob.adjustFireLoss(-4 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) //Twice as effective as AIURI for severe burns + need_mob_update = affected_mob.adjustFireLoss(-4 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) //Twice as effective as AIURI for severe burns else - affected_mob.adjustFireLoss(-0.5 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) //But only a quarter as effective for more minor ones - ..() - . = TRUE + need_mob_update = affected_mob.adjustFireLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) //But only a quarter as effective for more minor ones + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/oxandrolone/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() if(affected_mob.getFireLoss()) //It only makes existing burns worse - affected_mob.adjustFireLoss(4.5 * REM * seconds_per_tick, FALSE, FALSE, BODYTYPE_ORGANIC) // it's going to be healing either 4 or 0.5 - . = TRUE - ..() + if(affected_mob.adjustFireLoss(4.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_biotype)) // it's going to be healing either 4 or 0.5 + return UPDATE_MOB_HEALTH /datum/reagent/medicine/salglu_solution name = "Saline-Glucose Solution" @@ -312,6 +319,8 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/salglu_solution/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + var/need_mob_update if(last_added) affected_mob.blood_volume -= last_added last_added = 0 @@ -321,25 +330,29 @@ last_added = new_blood_level - affected_mob.blood_volume affected_mob.blood_volume = new_blood_level + (extra_regen * REM * seconds_per_tick) if(SPT_PROB(18, seconds_per_tick)) - affected_mob.adjustBruteLoss(-0.5, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustFireLoss(-0.5, FALSE, required_bodytype = affected_bodytype) - . = TRUE - ..() + need_mob_update = affected_mob.adjustBruteLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_biotype) + need_mob_update += affected_mob.adjustFireLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_biotype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/salglu_solution/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() + var/need_mob_update if(SPT_PROB(1.5, seconds_per_tick)) - to_chat(affected_mob, span_warning("You feel salty.")) - holder.add_reagent(/datum/reagent/consumable/salt, 1) - holder.remove_reagent(/datum/reagent/medicine/salglu_solution, 0.5) + if(holder) + to_chat(affected_mob, span_warning("You feel salty.")) + holder.add_reagent(/datum/reagent/consumable/salt, 1) + holder.remove_reagent(/datum/reagent/medicine/salglu_solution, 0.5) else if(SPT_PROB(1.5, seconds_per_tick)) - to_chat(affected_mob, span_warning("You feel sweet.")) - holder.add_reagent(/datum/reagent/consumable/sugar, 1) - holder.remove_reagent(/datum/reagent/medicine/salglu_solution, 0.5) + if(holder) + to_chat(affected_mob, span_warning("You feel sweet.")) + holder.add_reagent(/datum/reagent/consumable/sugar, 1) + holder.remove_reagent(/datum/reagent/medicine/salglu_solution, 0.5) if(SPT_PROB(18, seconds_per_tick)) - affected_mob.adjustBruteLoss(0.5, FALSE, FALSE, BODYTYPE_ORGANIC) - affected_mob.adjustFireLoss(0.5, FALSE, FALSE, BODYTYPE_ORGANIC) - . = TRUE - ..() + need_mob_update = affected_mob.adjustBruteLoss(0.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_biotype) + need_mob_update += affected_mob.adjustFireLoss(0.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_biotype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/mine_salve name = "Miner's Salve" @@ -351,10 +364,12 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_AFFECTS_WOUNDS /datum/reagent/medicine/mine_salve/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustBruteLoss(-0.25 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustFireLoss(-0.25 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - ..() - return TRUE + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustBruteLoss(-0.25 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustFireLoss(-0.25 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/mine_salve/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message = TRUE) . = ..() @@ -374,13 +389,13 @@ if(show_message) to_chat(exposed_carbon, span_danger("You feel your injuries fade away to nothing!") ) -/datum/reagent/medicine/mine_salve/on_mob_metabolize(mob/living/metabolizer) +/datum/reagent/medicine/mine_salve/on_mob_metabolize(mob/living/affected_mob) . = ..() - metabolizer.apply_status_effect(/datum/status_effect/grouped/screwy_hud/fake_healthy, type) + affected_mob.apply_status_effect(/datum/status_effect/grouped/screwy_hud/fake_healthy, type) -/datum/reagent/medicine/mine_salve/on_mob_end_metabolize(mob/living/metabolizer) +/datum/reagent/medicine/mine_salve/on_mob_end_metabolize(mob/living/affected_mob) . = ..() - metabolizer.remove_status_effect(/datum/status_effect/grouped/screwy_hud/fake_healthy, type) + affected_mob.remove_status_effect(/datum/status_effect/grouped/screwy_hud/fake_healthy, type) /datum/reagent/medicine/mine_salve/on_burn_wound_processing(datum/wound/burn/flesh/burn_wound) burn_wound.sanitization += 0.3 @@ -398,20 +413,24 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/omnizine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustToxLoss(-healing * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - affected_mob.adjustOxyLoss(-healing * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - affected_mob.adjustBruteLoss(-healing * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustFireLoss(-healing * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - ..() - . = TRUE + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustToxLoss(-healing * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustOxyLoss(-healing * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjustBruteLoss(-healing * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustFireLoss(-healing * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/omnizine/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustToxLoss(1.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - affected_mob.adjustOxyLoss(1.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - affected_mob.adjustBruteLoss(1.5 * REM * seconds_per_tick, FALSE, FALSE, BODYTYPE_ORGANIC) - affected_mob.adjustFireLoss(1.5 * REM * seconds_per_tick, FALSE, FALSE, BODYTYPE_ORGANIC) - ..() - . = TRUE + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustToxLoss(1.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustOxyLoss(1.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjustBruteLoss(1.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustFireLoss(1.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/omnizine/protozine name = "Protozine" @@ -433,21 +452,21 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/calomel/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() for(var/datum/reagent/target_reagent in affected_mob.reagents.reagent_list) if(istype(target_reagent, /datum/reagent/medicine/calomel)) continue affected_mob.reagents.remove_reagent(target_reagent.type, 3 * REM * seconds_per_tick) var/toxin_amount = round(affected_mob.health / 40, 0.1) - affected_mob.adjustToxLoss(toxin_amount * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - ..() - return TRUE + if(affected_mob.adjustToxLoss(toxin_amount * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/calomel/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() for(var/datum/reagent/medicine/calomel/target_reagent in affected_mob.reagents.reagent_list) affected_mob.reagents.remove_reagent(target_reagent.type, 2 * REM * seconds_per_tick) - affected_mob.adjustToxLoss(2.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - ..() - return TRUE + if(affected_mob.adjustToxLoss(2.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/ammoniated_mercury name = "Ammoniated Mercury" @@ -463,22 +482,22 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/ammoniated_mercury/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() var/toxin_chem_amount = 0 for(var/datum/reagent/toxin/target_reagent in affected_mob.reagents.reagent_list) toxin_chem_amount += 1 affected_mob.reagents.remove_reagent(target_reagent.type, 5 * REM * seconds_per_tick) var/toxin_amount = round(affected_mob.getBruteLoss() / 15, 0.1) + round(affected_mob.getFireLoss() / 30, 0.1) - 3 - affected_mob.adjustToxLoss(toxin_amount * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) + if(affected_mob.adjustToxLoss(toxin_amount * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + . = UPDATE_MOB_HEALTH if(toxin_chem_amount == 0) for(var/datum/reagent/medicine/ammoniated_mercury/target_reagent in affected_mob.reagents.reagent_list) affected_mob.reagents.remove_reagent(target_reagent.type, 1 * REM * seconds_per_tick) - ..() - return TRUE /datum/reagent/medicine/ammoniated_mercury/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustToxLoss(3 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - ..() - return TRUE + . = ..() + if(affected_mob.adjustToxLoss(3 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/potass_iodide name = "Potassium Iodide" @@ -494,15 +513,14 @@ ADD_TRAIT(affected_mob, TRAIT_HALT_RADIATION_EFFECTS, "[type]") /datum/reagent/medicine/potass_iodide/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() REMOVE_TRAIT(affected_mob, TRAIT_HALT_RADIATION_EFFECTS, "[type]") - return ..() /datum/reagent/medicine/potass_iodide/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - if (HAS_TRAIT(affected_mob, TRAIT_IRRADIATED)) - affected_mob.adjustToxLoss(-1 * REM * seconds_per_tick, required_biotype = affected_biotype) - - ..() - return TRUE + . = ..() + if(HAS_TRAIT(affected_mob, TRAIT_IRRADIATED)) + if(affected_mob.adjustToxLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/pen_acid name = "Pentetic Acid" @@ -518,16 +536,16 @@ ADD_TRAIT(affected_mob, TRAIT_HALT_RADIATION_EFFECTS, "[type]") /datum/reagent/medicine/pen_acid/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() REMOVE_TRAIT(affected_mob, TRAIT_HALT_RADIATION_EFFECTS, "[type]") - return ..() /datum/reagent/medicine/pen_acid/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustToxLoss(-2 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) + . = ..() + if(affected_mob.adjustToxLoss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + . = UPDATE_MOB_HEALTH for(var/datum/reagent/R in affected_mob.reagents.reagent_list) if(R != src) affected_mob.reagents.remove_reagent(R.type, 2 * REM * seconds_per_tick) - ..() - . = TRUE /datum/reagent/medicine/sal_acid name = "Salicylic Acid" @@ -540,18 +558,20 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/sal_acid/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + var/need_mob_update if(affected_mob.getBruteLoss() > 25) - affected_mob.adjustBruteLoss(-4 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) + need_mob_update = affected_mob.adjustBruteLoss(-4 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) else - affected_mob.adjustBruteLoss(-0.5 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - ..() - . = TRUE + need_mob_update = affected_mob.adjustBruteLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/sal_acid/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() if(affected_mob.getBruteLoss()) //It only makes existing bruises worse - affected_mob.adjustBruteLoss(4.5 * REM * seconds_per_tick, FALSE, FALSE, BODYTYPE_ORGANIC) // it's going to be healing either 4 or 0.5 - . = TRUE - ..() + if(affected_mob.adjustBruteLoss(4.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC)) // it's going to be healing either 4 or 0.5 + return UPDATE_MOB_HEALTH /datum/reagent/medicine/salbutamol name = "Salbutamol" @@ -563,14 +583,17 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/salbutamol/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustOxyLoss(-3 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustOxyLoss(-3 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) if(affected_mob.losebreath >= 4) var/obj/item/organ/internal/lungs/affected_lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS) var/our_respiration_type = affected_lungs ? affected_lungs.respiration_type : affected_mob.mob_respiration_type // use lungs' respiration type or mob_respiration_type if no lungs if(our_respiration_type & affected_respiration_type) affected_mob.losebreath -= 2 * REM * seconds_per_tick - ..() - . = TRUE + need_mob_update = TRUE + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/ephedrine name = "Ephedrine" @@ -587,16 +610,17 @@ inverse_chem_val = 0.4 /datum/reagent/medicine/ephedrine/on_mob_metabolize(mob/living/affected_mob) - ..() + . = ..() affected_mob.add_movespeed_modifier(/datum/movespeed_modifier/reagent/ephedrine) ADD_TRAIT(affected_mob, TRAIT_BATON_RESISTANCE, type) /datum/reagent/medicine/ephedrine/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() affected_mob.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/ephedrine) REMOVE_TRAIT(affected_mob, TRAIT_BATON_RESISTANCE, type) - ..() /datum/reagent/medicine/ephedrine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(10 * (1.5-creation_purity), seconds_per_tick) && iscarbon(affected_mob)) var/obj/item/I = affected_mob.get_active_held_item() if(I && affected_mob.dropItemToGround(I)) @@ -604,11 +628,11 @@ affected_mob.set_jitter_if_lower(20 SECONDS) affected_mob.AdjustAllImmobility(-20 * REM * seconds_per_tick * normalise_creation_purity()) - affected_mob.adjustStaminaLoss(-1 * REM * seconds_per_tick * normalise_creation_purity(), FALSE) - ..() - return TRUE + affected_mob.adjustStaminaLoss(-1 * REM * seconds_per_tick * normalise_creation_purity(), updating_stamina = FALSE) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/ephedrine/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(1 * (1 + (1-normalise_creation_purity())), seconds_per_tick) && iscarbon(affected_mob)) var/datum/disease/D = new /datum/disease/heart_failure affected_mob.ForceContractDisease(D) @@ -619,10 +643,9 @@ to_chat(affected_mob, span_notice("[pick("Your head pounds.", "You feel a tight pain in your chest.", "You find it hard to stay still.", "You feel your heart practically beating out of your chest.")]")) if(SPT_PROB(18 * (1 + (1-normalise_creation_purity())), seconds_per_tick)) - affected_mob.adjustToxLoss(1, FALSE, required_biotype = affected_biotype) + affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) affected_mob.losebreath++ - . = TRUE - return TRUE + return UPDATE_MOB_HEALTH /datum/reagent/medicine/diphenhydramine name = "Diphenhydramine" @@ -638,7 +661,7 @@ affected_mob.adjust_drowsiness(2 SECONDS) affected_mob.adjust_jitter(-2 SECONDS * REM * seconds_per_tick) holder.remove_reagent(/datum/reagent/toxin/histamine, 3 * REM * seconds_per_tick) - ..() + return ..() /datum/reagent/medicine/morphine name = "Morphine" @@ -652,32 +675,31 @@ addiction_types = list(/datum/addiction/opioids = 10) /datum/reagent/medicine/morphine/on_mob_metabolize(mob/living/affected_mob) - ..() + . = ..() affected_mob.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) /datum/reagent/medicine/morphine/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() affected_mob.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) - ..() /datum/reagent/medicine/morphine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - if(current_cycle >= 5) + . = ..() + if(current_cycle > 5) affected_mob.add_mood_event("numb", /datum/mood_event/narcotic_medium, name) switch(current_cycle) - if(11) + if(12) to_chat(affected_mob, span_warning("You start to feel tired...") ) - if(12 to 24) + if(13 to 25) affected_mob.adjust_drowsiness(2 SECONDS * REM * seconds_per_tick) - if(24 to INFINITY) + if(25 to INFINITY) affected_mob.Sleeping(40 * REM * seconds_per_tick) - . = TRUE - ..() /datum/reagent/medicine/morphine/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(18, seconds_per_tick)) affected_mob.drop_all_held_items() affected_mob.set_dizzy_if_lower(4 SECONDS) affected_mob.set_jitter_if_lower(4 SECONDS) - ..() /datum/reagent/medicine/oculine @@ -729,33 +751,31 @@ restore_eyesight(prev_affected_mob, eyes) /datum/reagent/medicine/oculine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() var/normalized_purity = normalise_creation_purity() affected_mob.adjust_temp_blindness(-4 SECONDS * REM * seconds_per_tick * normalized_purity) affected_mob.adjust_eye_blur(-4 SECONDS * REM * seconds_per_tick * normalized_purity) var/obj/item/organ/internal/eyes/eyes = affected_mob.get_organ_slot(ORGAN_SLOT_EYES) - if(isnull(eyes)) - return ..() - - // Healing eye damage will cure nearsightedness and blindness from ... eye damage - eyes.apply_organ_damage(-2 * REM * seconds_per_tick * normalise_creation_purity(), required_organ_flag = affected_organ_flags) - // If our eyes are seriously damaged, we have a probability of causing eye blur while healing depending on purity - if(eyes.damaged && IS_ORGANIC_ORGAN(eyes) && SPT_PROB(16 - min(normalized_purity * 6, 12), seconds_per_tick)) - // While healing, gives some eye blur - if(affected_mob.is_blind_from(EYE_DAMAGE)) - to_chat(affected_mob, span_warning("Your vision slowly returns...")) - affected_mob.adjust_eye_blur(20 SECONDS) - else if(affected_mob.is_nearsighted_from(EYE_DAMAGE)) - to_chat(affected_mob, span_warning("The blackness in your peripheral vision begins to fade.")) - affected_mob.adjust_eye_blur(5 SECONDS) - - return ..() || TRUE + if(eyes) + // Healing eye damage will cure nearsightedness and blindness from ... eye damage + if(eyes.apply_organ_damage(-2 * REM * seconds_per_tick * normalise_creation_purity(), required_organ_flag = affected_organ_flags)) + . = UPDATE_MOB_HEALTH + // If our eyes are seriously damaged, we have a probability of causing eye blur while healing depending on purity + if(eyes.damaged && IS_ORGANIC_ORGAN(eyes) && SPT_PROB(16 - min(normalized_purity * 6, 12), seconds_per_tick)) + // While healing, gives some eye blur + if(affected_mob.is_blind_from(EYE_DAMAGE)) + to_chat(affected_mob, span_warning("Your vision slowly returns...")) + affected_mob.adjust_eye_blur(20 SECONDS) + else if(affected_mob.is_nearsighted_from(EYE_DAMAGE)) + to_chat(affected_mob, span_warning("The blackness in your peripheral vision begins to fade.")) + affected_mob.adjust_eye_blur(5 SECONDS) /datum/reagent/medicine/oculine/on_mob_delete(mob/living/affected_mob) + . = ..() var/obj/item/organ/internal/eyes/eyes = affected_mob.get_organ_slot(ORGAN_SLOT_EYES) if(!eyes) return restore_eyesight(affected_mob, eyes) - ..() /datum/reagent/medicine/inacusiate name = "Inacusiate" @@ -783,12 +803,12 @@ message = composer.compose_message(affected_mob, message_language, message, null, spans, message_mods) /datum/reagent/medicine/inacusiate/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() var/obj/item/organ/internal/ears/ears = affected_mob.get_organ_slot(ORGAN_SLOT_EARS) if(!ears) - return ..() + return ears.adjustEarDamage(-4 * REM * seconds_per_tick * normalise_creation_purity(), -4 * REM * seconds_per_tick * normalise_creation_purity()) - ..() - return TRUE + return UPDATE_MOB_HEALTH /datum/reagent/medicine/inacusiate/on_mob_delete(mob/living/affected_mob) . = ..() @@ -809,16 +829,19 @@ ADD_TRAIT(affected_mob, TRAIT_PREVENT_IMPLANT_AUTO_EXPLOSION, "[type]") /datum/reagent/medicine/atropine/on_mob_delete(mob/living/affected_mob) + . = ..() REMOVE_TRAIT(affected_mob, TRAIT_PREVENT_IMPLANT_AUTO_EXPLOSION, "[type]") - return ..() /datum/reagent/medicine/atropine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(affected_mob.health <= affected_mob.crit_threshold) - affected_mob.adjustToxLoss(-2 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - affected_mob.adjustBruteLoss(-2* REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustFireLoss(-2 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustOxyLoss(-5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - . = TRUE + var/need_mob_update + need_mob_update = affected_mob.adjustToxLoss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustBruteLoss(-2* REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustFireLoss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustOxyLoss(-5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + if(need_mob_update) + . = UPDATE_MOB_HEALTH var/obj/item/organ/internal/lungs/affected_lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS) var/our_respiration_type = affected_lungs ? affected_lungs.respiration_type : affected_mob.mob_respiration_type if(our_respiration_type & affected_respiration_type) @@ -826,14 +849,13 @@ if(SPT_PROB(10, seconds_per_tick)) affected_mob.set_dizzy_if_lower(10 SECONDS) affected_mob.set_jitter_if_lower(10 SECONDS) - ..() /datum/reagent/medicine/atropine/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustToxLoss(0.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - . = TRUE + . = ..() + if(affected_mob.adjustToxLoss(0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + . = UPDATE_MOB_HEALTH affected_mob.set_dizzy_if_lower(2 SECONDS * REM * seconds_per_tick) affected_mob.set_jitter_if_lower(2 SECONDS * REM * seconds_per_tick) - ..() /datum/reagent/medicine/epinephrine name = "Epinephrine" @@ -845,13 +867,13 @@ ph = 10.2 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/medicine/epinephrine/on_mob_metabolize(mob/living/carbon/affected_mob) - ..() +/datum/reagent/medicine/epinephrine/on_mob_metabolize(mob/living/affected_mob) + . = ..() ADD_TRAIT(affected_mob, TRAIT_NOCRITDAMAGE, type) -/datum/reagent/medicine/epinephrine/on_mob_end_metabolize(mob/living/carbon/affected_mob) +/datum/reagent/medicine/epinephrine/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() REMOVE_TRAIT(affected_mob, TRAIT_NOCRITDAMAGE, type) - ..() /datum/reagent/medicine/epinephrine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) if(holder.has_reagent(/datum/reagent/toxin/lexorin)) @@ -859,36 +881,45 @@ holder.remove_reagent(/datum/reagent/medicine/epinephrine, 1 * REM * seconds_per_tick) if(SPT_PROB(10, seconds_per_tick)) holder.add_reagent(/datum/reagent/toxin/histamine, 4) - ..() - return FALSE + return ..() + + . = ..() + + var/need_mob_update if(affected_mob.health <= affected_mob.crit_threshold) - affected_mob.adjustToxLoss(-0.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - affected_mob.adjustBruteLoss(-0.5 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustFireLoss(-0.5 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustOxyLoss(-0.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update = affected_mob.adjustToxLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustBruteLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustFireLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustOxyLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) if(affected_mob.losebreath >= 4) var/obj/item/organ/internal/lungs/affected_lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS) var/our_respiration_type = affected_lungs ? affected_lungs.respiration_type : affected_mob.mob_respiration_type if(our_respiration_type & affected_respiration_type) affected_mob.losebreath -= 2 * REM * seconds_per_tick + need_mob_update = TRUE if(affected_mob.losebreath < 0) affected_mob.losebreath = 0 - affected_mob.adjustStaminaLoss(-0.5 * REM * seconds_per_tick, 0) + need_mob_update = TRUE + need_mob_update += affected_mob.adjustStaminaLoss(-0.5 * REM * seconds_per_tick, updating_stamina = FALSE) if(SPT_PROB(10, seconds_per_tick)) affected_mob.AdjustAllImmobility(-20) - ..() - return TRUE + need_mob_update = TRUE + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/epinephrine/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(18, REM * seconds_per_tick)) - affected_mob.adjustStaminaLoss(2.5, 0) - affected_mob.adjustToxLoss(1, FALSE, required_biotype = affected_biotype) + var/need_mob_update + need_mob_update = affected_mob.adjustStaminaLoss(2.5 * REM * seconds_per_tick, updating_stamina = FALSE) + need_mob_update += affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) var/obj/item/organ/internal/lungs/affected_lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS) var/our_respiration_type = affected_lungs ? affected_lungs.respiration_type : affected_mob.mob_respiration_type if(our_respiration_type & affected_respiration_type) affected_mob.losebreath++ - . = TRUE - ..() + need_mob_update = TRUE + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/strange_reagent name = "Strange Reagent" @@ -990,11 +1021,13 @@ return ..() /datum/reagent/medicine/strange_reagent/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() var/damage_at_random = rand(0, 250)/100 //0 to 2.5 - affected_mob.adjustBruteLoss(damage_at_random * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustFireLoss(damage_at_random * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - ..() - return TRUE + var/need_mob_update + need_mob_update = affected_mob.adjustBruteLoss(damage_at_random * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustFireLoss(damage_at_random * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/mannitol name = "Mannitol" @@ -1009,9 +1042,9 @@ inverse_chem_val = 0.45 /datum/reagent/medicine/mannitol/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, -2 * REM * seconds_per_tick * normalise_creation_purity(), required_organ_flag = affected_organ_flags) - ..() - return TRUE + . = ..() + if(affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, -2 * REM * seconds_per_tick * normalise_creation_purity(), required_organ_flag = affected_organ_flags)) + return UPDATE_MOB_HEALTH //Having mannitol in you will pause the brain damage from brain tumor (so it heals an even 2 brain damage instead of 1.8) /datum/reagent/medicine/mannitol/on_mob_metabolize(mob/living/carbon/affected_mob) @@ -1019,13 +1052,15 @@ ADD_TRAIT(affected_mob, TRAIT_TUMOR_SUPPRESSED, TRAIT_GENERIC) /datum/reagent/medicine/mannitol/on_mob_end_metabolize(mob/living/carbon/affected_mob) - REMOVE_TRAIT(affected_mob, TRAIT_TUMOR_SUPPRESSED, TRAIT_GENERIC) . = ..() + REMOVE_TRAIT(affected_mob, TRAIT_TUMOR_SUPPRESSED, TRAIT_GENERIC) /datum/reagent/medicine/mannitol/overdose_start(mob/living/affected_mob) + . = ..() to_chat(affected_mob, span_notice("You suddenly feel E N L I G H T E N E D!")) /datum/reagent/medicine/mannitol/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(65, seconds_per_tick)) return var/list/tips @@ -1037,7 +1072,6 @@ tips = world.file2list("strings/chemistrytips.txt") var/message = pick(tips) send_tip_of_the_round(affected_mob, message) - return ..() /datum/reagent/medicine/neurine name = "Neurine" @@ -1073,11 +1107,12 @@ holder.remove_reagent(/datum/reagent/consumable/ethanol/neurotoxin, 5 * REM * seconds_per_tick * normalise_creation_purity()) if(SPT_PROB(8 * normalise_creation_purity(), seconds_per_tick)) affected_mob.cure_trauma_type(resilience = TRAUMA_RESILIENCE_BASIC) - ..() + return ..() /datum/reagent/medicine/neurine/on_mob_dead(mob/living/carbon/affected_mob, seconds_per_tick) - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1 * REM * seconds_per_tick * normalise_creation_purity(), required_organ_flag = affected_organ_flags) - ..() + . = ..() + if(affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1 * REM * seconds_per_tick * normalise_creation_purity(), required_organ_flag = affected_organ_flags)) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/mutadone name = "Mutadone" @@ -1088,11 +1123,10 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/mutadone/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.remove_status_effect(/datum/status_effect/jitter) if(affected_mob.has_dna()) affected_mob.dna.remove_all_mutations(list(MUT_NORMAL, MUT_EXTRA), TRUE) - if(!QDELETED(affected_mob)) //We were a monkey, now a human - ..() /datum/reagent/medicine/antihol name = "Antihol" @@ -1114,13 +1148,13 @@ ) /datum/reagent/medicine/antihol/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() for(var/effect in status_effects_to_clear) affected_mob.remove_status_effect(effect) affected_mob.reagents.remove_all_type(/datum/reagent/consumable/ethanol, 3 * REM * seconds_per_tick * normalise_creation_purity(), FALSE, TRUE) - affected_mob.adjustToxLoss(-0.2 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) + if(affected_mob.adjustToxLoss(-0.2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + . = UPDATE_MOB_HEALTH affected_mob.adjust_drunk_effect(-10 * REM * seconds_per_tick * normalise_creation_purity()) - ..() - . = TRUE /datum/reagent/medicine/antihol/expose_mob(mob/living/carbon/exposed_carbon, methods=TOUCH, reac_volume) . = ..() @@ -1141,33 +1175,35 @@ addiction_types = list(/datum/addiction/stimulants = 4) //0.8 per 2 seconds /datum/reagent/medicine/stimulants/on_mob_metabolize(mob/living/affected_mob) - ..() + . = ..() affected_mob.add_movespeed_modifier(/datum/movespeed_modifier/reagent/stimulants) ADD_TRAIT(affected_mob, TRAIT_BATON_RESISTANCE, type) /datum/reagent/medicine/stimulants/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() affected_mob.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/stimulants) REMOVE_TRAIT(affected_mob, TRAIT_BATON_RESISTANCE, type) - ..() /datum/reagent/medicine/stimulants/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(affected_mob.health < 50 && affected_mob.health > 0) - affected_mob.adjustOxyLoss(-1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - affected_mob.adjustToxLoss(-1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - affected_mob.adjustBruteLoss(-1 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustFireLoss(-1 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) + var/need_mob_update + need_mob_update += affected_mob.adjustOxyLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjustToxLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustBruteLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustFireLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + if(need_mob_update) + . = UPDATE_MOB_HEALTH affected_mob.AdjustAllImmobility(-60 * REM * seconds_per_tick) - affected_mob.adjustStaminaLoss(-5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - ..() - . = TRUE + affected_mob.adjustStaminaLoss(-5 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) /datum/reagent/medicine/stimulants/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(18, seconds_per_tick)) - affected_mob.adjustStaminaLoss(2.5, FALSE, required_biotype = affected_biotype) - affected_mob.adjustToxLoss(1, FALSE, required_biotype = affected_biotype) + affected_mob.adjustStaminaLoss(2.5, updating_stamina = FALSE, required_biotype = affected_biotype) + affected_mob.adjustToxLoss(1, updating_health = FALSE, required_biotype = affected_biotype) affected_mob.losebreath++ - . = TRUE - ..() + return UPDATE_MOB_HEALTH /datum/reagent/medicine/insulin name = "Insulin" @@ -1179,10 +1215,9 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/insulin/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - if(affected_mob.AdjustSleeping(-20 * REM * seconds_per_tick)) - . = TRUE + affected_mob.AdjustSleeping(-20 * REM * seconds_per_tick) holder.remove_reagent(/datum/reagent/consumable/sugar, 3 * REM * seconds_per_tick) - ..() + return ..() //Trek Chems, used primarily by medibots. Only heals a specific damage type, but is very efficient. @@ -1195,9 +1230,10 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/medicine/inaprovaline/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(affected_mob.losebreath >= 5) affected_mob.losebreath -= 5 * REM * seconds_per_tick - ..() + return UPDATE_MOB_HEALTH /datum/reagent/medicine/regen_jelly name = "Regenerative Jelly" @@ -1219,12 +1255,14 @@ exposed_human.set_haircolor(color, update = TRUE) /datum/reagent/medicine/regen_jelly/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustBruteLoss(-1.5 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustFireLoss(-1.5 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustOxyLoss(-1.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - affected_mob.adjustToxLoss(-1.5 * REM * seconds_per_tick, FALSE, TRUE, affected_biotype) //heals TOXINLOVERs - ..() - . = TRUE + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustBruteLoss(-1.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustFireLoss(-1.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustOxyLoss(-1.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjustToxLoss(-1.5 * REM * seconds_per_tick, updating_health = FALSE, forced = TRUE, required_biotype = affected_biotype) //heals TOXINLOVERs + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/syndicate_nanites //Used exclusively by Syndicate medical cyborgs name = "Restorative Nanites" @@ -1236,21 +1274,22 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/medicine/syndicate_nanites/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustBruteLoss(-5 * REM * seconds_per_tick, FALSE) //A ton of healing - this is a 50 telecrystal investment. - affected_mob.adjustFireLoss(-5 * REM * seconds_per_tick, FALSE) - affected_mob.adjustOxyLoss(-15 * REM * seconds_per_tick, FALSE) - affected_mob.adjustToxLoss(-5 * REM * seconds_per_tick, FALSE) - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, -15 * REM * seconds_per_tick) - affected_mob.adjustCloneLoss(-3 * REM * seconds_per_tick, FALSE) - ..() - . = TRUE + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustBruteLoss(-5 * REM * seconds_per_tick, updating_health = FALSE) //A ton of healing - this is a 50 telecrystal investment. + need_mob_update += affected_mob.adjustFireLoss(-5 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjustOxyLoss(-15 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjustToxLoss(-5 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, -15 * REM * seconds_per_tick) + need_mob_update += affected_mob.adjustCloneLoss(-3 * REM * seconds_per_tick, updating_health = FALSE) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/syndicate_nanites/overdose_process(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) //wtb flavortext messages that hint that you're vomitting up robots + . = ..() if(SPT_PROB(13, seconds_per_tick)) affected_mob.reagents.remove_reagent(type, metabolization_rate*15) // ~5 units at a rate of 0.4 but i wanted a nice number in code affected_mob.vomit(vomit_flags = VOMIT_CATEGORY_DEFAULT, vomit_type = /obj/effect/decal/cleanable/vomit/nanites, lost_nutrition = 20) // nanite safety protocols make your body expel them to prevent harmies - ..() - . = TRUE /datum/reagent/medicine/earthsblood //Created by ambrosia gaia plants name = "Earthsblood" @@ -1263,48 +1302,53 @@ addiction_types = list(/datum/addiction/hallucinogens = 14) /datum/reagent/medicine/earthsblood/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - if(current_cycle <= 25) //10u has to be processed before u get into THE FUN ZONE - affected_mob.adjustBruteLoss(-1 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustFireLoss(-1 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustOxyLoss(-0.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - affected_mob.adjustToxLoss(-0.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - affected_mob.adjustCloneLoss(-0.1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - affected_mob.adjustStaminaLoss(-0.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1 * REM * seconds_per_tick, 150, affected_organ_flags) //This does, after all, come from ambrosia, and the most powerful ambrosia in existence, at that! + . = ..() + var/need_mob_update + if(current_cycle < 25) //10u has to be processed before u get into THE FUN ZONE + need_mob_update = affected_mob.adjustBruteLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustFireLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustOxyLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjustToxLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustCloneLoss(-0.1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustStaminaLoss(-0.5 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1 * REM * seconds_per_tick, 150, affected_organ_flags) //This does, after all, come from ambrosia, and the most powerful ambrosia in existence, at that! else - affected_mob.adjustBruteLoss(-5 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) //slow to start, but very quick healing once it gets going - affected_mob.adjustFireLoss(-5 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustOxyLoss(-3 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - affected_mob.adjustToxLoss(-3 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - affected_mob.adjustCloneLoss(-1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - affected_mob.adjustStaminaLoss(-3 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) + need_mob_update = affected_mob.adjustBruteLoss(-5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) //slow to start, but very quick healing once it gets going + need_mob_update += affected_mob.adjustFireLoss(-5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustOxyLoss(-3 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjustToxLoss(-3 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustCloneLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustStaminaLoss(-3 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2 * REM * seconds_per_tick, 150, affected_organ_flags) affected_mob.adjust_jitter_up_to(6 SECONDS * REM * seconds_per_tick, 1 MINUTES) - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2 * REM * seconds_per_tick, 150, affected_organ_flags) if(SPT_PROB(5, seconds_per_tick)) affected_mob.say(return_hippie_line(), forced = /datum/reagent/medicine/earthsblood) affected_mob.adjust_drugginess_up_to(20 SECONDS * REM * seconds_per_tick, 30 SECONDS * REM * seconds_per_tick) - ..() - . = TRUE + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/earthsblood/on_mob_metabolize(mob/living/affected_mob) - ..() + . = ..() ADD_TRAIT(affected_mob, TRAIT_PACIFISM, type) /datum/reagent/medicine/earthsblood/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() REMOVE_TRAIT(affected_mob, TRAIT_PACIFISM, type) - ..() /datum/reagent/medicine/earthsblood/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_hallucinations_up_to(10 SECONDS * REM * seconds_per_tick, 120 SECONDS) - if(current_cycle > 25) - affected_mob.adjustToxLoss(4 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - if(current_cycle > 100) //podpeople get out reeeeeeeeeeeeeeeeeeeee - affected_mob.adjustToxLoss(6 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) + var/need_mob_update + if(current_cycle > 26) + need_mob_update = affected_mob.adjustToxLoss(4 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + if(current_cycle > 101) //podpeople get out reeeeeeeeeeeeeeeeeeeee + need_mob_update += affected_mob.adjustToxLoss(6 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) if(iscarbon(affected_mob)) var/mob/living/carbon/hippie = affected_mob hippie.gain_trauma(/datum/brain_trauma/severe/pacifism) - ..() - . = TRUE + + if(need_mob_update) + return UPDATE_MOB_HEALTH /// Returns a hippie-esque string for the person affected by the reagent to say. /datum/reagent/medicine/earthsblood/proc/return_hippie_line() @@ -1330,6 +1374,7 @@ harmful = TRUE /datum/reagent/medicine/haloperidol/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() for(var/datum/reagent/drug/R in affected_mob.reagents.reagent_list) affected_mob.reagents.remove_reagent(R.type, 5 * REM * seconds_per_tick) affected_mob.adjust_drowsiness(4 SECONDS * REM * seconds_per_tick) @@ -1340,11 +1385,12 @@ if (affected_mob.get_timed_status_effect_duration(/datum/status_effect/hallucination) >= 10 SECONDS) affected_mob.adjust_hallucinations(-10 SECONDS * REM * seconds_per_tick) + var/need_mob_update = FALSE if(SPT_PROB(10, seconds_per_tick)) - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1, 50, affected_organ_flags) - affected_mob.adjustStaminaLoss(2.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - ..() - return TRUE + need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1, 50, affected_organ_flags) + need_mob_update += affected_mob.adjustStaminaLoss(2.5 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + if(need_mob_update) + return UPDATE_MOB_HEALTH //used for changeling's adrenaline power /datum/reagent/medicine/changelingadrenaline @@ -1355,29 +1401,29 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/medicine/changelingadrenaline/on_mob_life(mob/living/carbon/metabolizer, seconds_per_tick, times_fired) - ..() + . = ..() metabolizer.AdjustAllImmobility(-20 * REM * seconds_per_tick) - metabolizer.adjustStaminaLoss(-10 * REM * seconds_per_tick, 0) + if(metabolizer.adjustStaminaLoss(-10 * REM * seconds_per_tick, updating_stamina = FALSE)) + . = UPDATE_MOB_HEALTH metabolizer.set_jitter_if_lower(20 SECONDS * REM * seconds_per_tick) metabolizer.set_dizzy_if_lower(20 SECONDS * REM * seconds_per_tick) - return TRUE /datum/reagent/medicine/changelingadrenaline/on_mob_metabolize(mob/living/affected_mob) - ..() + . = ..() affected_mob.add_traits(list(TRAIT_SLEEPIMMUNE, TRAIT_BATON_RESISTANCE), type) affected_mob.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) /datum/reagent/medicine/changelingadrenaline/on_mob_end_metabolize(mob/living/affected_mob) - ..() + . = ..() affected_mob.remove_traits(list(TRAIT_SLEEPIMMUNE, TRAIT_BATON_RESISTANCE), type) affected_mob.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) affected_mob.remove_status_effect(/datum/status_effect/dizziness) affected_mob.remove_status_effect(/datum/status_effect/jitter) /datum/reagent/medicine/changelingadrenaline/overdose_process(mob/living/metabolizer, seconds_per_tick, times_fired) - metabolizer.adjustToxLoss(1 * REM * seconds_per_tick, FALSE) - ..() - return TRUE + . = ..() + if(metabolizer.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE)) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/changelinghaste name = "Changeling Haste" @@ -1387,17 +1433,17 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/medicine/changelinghaste/on_mob_metabolize(mob/living/affected_mob) - ..() + . = ..() affected_mob.add_movespeed_modifier(/datum/movespeed_modifier/reagent/changelinghaste) /datum/reagent/medicine/changelinghaste/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() affected_mob.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/changelinghaste) - ..() /datum/reagent/medicine/changelinghaste/on_mob_life(mob/living/carbon/metabolizer, seconds_per_tick, times_fired) - metabolizer.adjustToxLoss(2 * REM * seconds_per_tick, FALSE) - ..() - return TRUE + . = ..() + if(metabolizer.adjustToxLoss(2 * REM * seconds_per_tick, updating_health = FALSE)) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/higadrite name = "Higadrite" @@ -1411,7 +1457,7 @@ ADD_TRAIT(affected_mob, TRAIT_STABLELIVER, type) /datum/reagent/medicine/higadrite/on_mob_end_metabolize(mob/living/affected_mob) - ..() + . = ..() REMOVE_TRAIT(affected_mob, TRAIT_STABLELIVER, type) /datum/reagent/medicine/cordiolis_hepatico @@ -1422,11 +1468,11 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/medicine/cordiolis_hepatico/on_mob_add(mob/living/affected_mob) - ..() + . = ..() affected_mob.add_traits(list(TRAIT_STABLELIVER, TRAIT_STABLEHEART), type) /datum/reagent/medicine/cordiolis_hepatico/on_mob_end_metabolize(mob/living/affected_mob) - ..() + . = ..() affected_mob.remove_traits(list(TRAIT_STABLELIVER, TRAIT_STABLEHEART), type) /datum/reagent/medicine/muscle_stimulant @@ -1455,29 +1501,32 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/modafinil/on_mob_metabolize(mob/living/affected_mob) + . = ..() ADD_TRAIT(affected_mob, TRAIT_SLEEPIMMUNE, type) - ..() /datum/reagent/medicine/modafinil/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() REMOVE_TRAIT(affected_mob, TRAIT_SLEEPIMMUNE, type) - ..() /datum/reagent/medicine/modafinil/on_mob_life(mob/living/carbon/metabolizer, seconds_per_tick, times_fired) + . = ..() if(!overdosed) // We do not want any effects on OD overdose_threshold = overdose_threshold + ((rand(-10, 10) / 10) * REM * seconds_per_tick) // for extra fun metabolizer.AdjustAllImmobility(-5 * REM * seconds_per_tick) - metabolizer.adjustStaminaLoss(-0.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) + metabolizer.adjustStaminaLoss(-0.5 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) metabolizer.set_jitter_if_lower(1 SECONDS * REM * seconds_per_tick) metabolization_rate = 0.005 * REAGENTS_METABOLISM * rand(5, 20) // randomizes metabolism between 0.02 and 0.08 per second - . = TRUE - ..() + return UPDATE_MOB_HEALTH /datum/reagent/medicine/modafinil/overdose_start(mob/living/affected_mob) + . = ..() to_chat(affected_mob, span_userdanger("You feel awfully out of breath and jittery!")) metabolization_rate = 0.025 * REAGENTS_METABOLISM // sets metabolism to 0.005 per second on overdose /datum/reagent/medicine/modafinil/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() overdose_progress++ + var/need_mob_update switch(overdose_progress) if(1 to 40) affected_mob.adjust_jitter_up_to(2 SECONDS * REM * seconds_per_tick, 20 SECONDS) @@ -1485,29 +1534,31 @@ affected_mob.set_dizzy_if_lower(10 SECONDS * REM * seconds_per_tick) if(SPT_PROB(30, seconds_per_tick)) affected_mob.losebreath++ + need_mob_update = TRUE if(41 to 80) - affected_mob.adjustOxyLoss(0.1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - affected_mob.adjustStaminaLoss(0.1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) + need_mob_update = affected_mob.adjustOxyLoss(0.1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjustStaminaLoss(0.1 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) affected_mob.adjust_jitter_up_to(2 SECONDS * REM * seconds_per_tick, 40 SECONDS) affected_mob.adjust_stutter_up_to(2 SECONDS * REM * seconds_per_tick, 40 SECONDS) affected_mob.set_dizzy_if_lower(20 SECONDS * REM * seconds_per_tick) if(SPT_PROB(30, seconds_per_tick)) affected_mob.losebreath++ + need_mob_update = TRUE if(SPT_PROB(10, seconds_per_tick)) to_chat(affected_mob, span_userdanger("You have a sudden fit!")) affected_mob.emote("moan") affected_mob.Paralyze(20) // you should be in a bad spot at this point unless epipen has been used if(81) to_chat(affected_mob, span_userdanger("You feel too exhausted to continue!")) // at this point you will eventually die unless you get charcoal - affected_mob.adjustOxyLoss(0.1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - affected_mob.adjustStaminaLoss(0.1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) + need_mob_update = affected_mob.adjustOxyLoss(0.1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjustStaminaLoss(0.1 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) if(82 to INFINITY) REMOVE_TRAIT(affected_mob, TRAIT_SLEEPIMMUNE, type) affected_mob.Sleeping(100 * REM * seconds_per_tick) - affected_mob.adjustOxyLoss(1.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - affected_mob.adjustStaminaLoss(1.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - ..() - return TRUE + need_mob_update += affected_mob.adjustOxyLoss(1.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjustStaminaLoss(1.5 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/psicodine name = "Psicodine" @@ -1520,28 +1571,27 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/psicodine/on_mob_metabolize(mob/living/affected_mob) - ..() + . = ..() ADD_TRAIT(affected_mob, TRAIT_FEARLESS, type) /datum/reagent/medicine/psicodine/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() REMOVE_TRAIT(affected_mob, TRAIT_FEARLESS, type) - ..() /datum/reagent/medicine/psicodine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_jitter(-12 SECONDS * REM * seconds_per_tick) affected_mob.adjust_dizzy(-12 SECONDS * REM * seconds_per_tick) affected_mob.adjust_confusion(-6 SECONDS * REM * seconds_per_tick) affected_mob.disgust = max(affected_mob.disgust - (6 * REM * seconds_per_tick), 0) if(affected_mob.mob_mood != null && affected_mob.mob_mood.sanity <= SANITY_NEUTRAL) // only take effect if in negative sanity and then... affected_mob.mob_mood.set_sanity(min(affected_mob.mob_mood.sanity + (5 * REM * seconds_per_tick), SANITY_NEUTRAL)) // set minimum to prevent unwanted spiking over neutral - ..() - . = TRUE /datum/reagent/medicine/psicodine/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_hallucinations_up_to(10 SECONDS * REM * seconds_per_tick, 120 SECONDS) - affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - ..() - . = TRUE + if(affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/metafactor name = "Mitogen Metabolism Factor" @@ -1555,12 +1605,13 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/metafactor/overdose_start(mob/living/carbon/affected_mob) + . = ..() metabolization_rate = 2 * REAGENTS_METABOLISM /datum/reagent/medicine/metafactor/overdose_process(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(13, seconds_per_tick)) affected_mob.vomit(VOMIT_CATEGORY_DEFAULT) - ..() /datum/reagent/medicine/silibinin name = "Silibinin" @@ -1571,9 +1622,8 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/silibinin/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, -2 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)//Add a chance to cure liver trauma once implemented. - ..() - . = TRUE + if(affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, -2 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) // Add a chance to cure liver trauma once implemented. + return UPDATE_MOB_HEALTH /datum/reagent/medicine/polypyr //This is intended to be an ingredient in advanced chems. name = "Polypyrylium Oligomers" @@ -1587,9 +1637,11 @@ /datum/reagent/medicine/polypyr/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) //I wanted a collection of small positive effects, this is as hard to obtain as coniine after all. . = ..() - affected_mob.adjustOrganLoss(ORGAN_SLOT_LUNGS, -0.25 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) - affected_mob.adjustBruteLoss(-0.35 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - return TRUE + var/need_mob_update + need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_LUNGS, -0.25 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + need_mob_update += affected_mob.adjustBruteLoss(-0.35 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/polypyr/expose_mob(mob/living/carbon/human/exposed_human, methods=TOUCH, reac_volume) . = ..() @@ -1600,9 +1652,9 @@ exposed_human.update_body_parts() /datum/reagent/medicine/polypyr/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) - ..() - . = TRUE + . = ..() + if(affected_mob.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/granibitaluri name = "Granibitaluri" //achieve "GRANular" amounts of C2 @@ -1615,16 +1667,19 @@ /datum/reagent/medicine/granibitaluri/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) var/healamount = max(0.5 - round(0.01 * (affected_mob.getBruteLoss() + affected_mob.getFireLoss()), 0.1), 0) //base of 0.5 healing per cycle and loses 0.1 healing for every 10 combined brute/burn damage you have - affected_mob.adjustBruteLoss(-healamount * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - affected_mob.adjustFireLoss(-healamount * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - ..() - . = TRUE + var/need_mob_update + need_mob_update = affected_mob.adjustBruteLoss(-healamount * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustFireLoss(-healamount * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/granibitaluri/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) - . = TRUE - affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.2 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) - affected_mob.adjustToxLoss(0.2 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) //Only really deadly if you eat over 100u - ..() + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.2 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + need_mob_update += affected_mob.adjustToxLoss(0.2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) //Only really deadly if you eat over 100u + if(need_mob_update) + return UPDATE_MOB_HEALTH // helps bleeding wounds clot faster /datum/reagent/medicine/coagulant @@ -1643,15 +1698,15 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/medicine/coagulant/on_mob_metabolize(mob/living/affected_mob) + . = ..() ADD_TRAIT(affected_mob, TRAIT_COAGULATING, /datum/reagent/medicine/coagulant) if(ishuman(affected_mob)) var/mob/living/carbon/human/blood_boy = affected_mob blood_boy.physiology?.bleed_mod *= passive_bleed_modifier - return ..() - /datum/reagent/medicine/coagulant/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() REMOVE_TRAIT(affected_mob, TRAIT_COAGULATING, /datum/reagent/medicine/coagulant) if(was_working) @@ -1660,8 +1715,6 @@ var/mob/living/carbon/human/blood_boy = affected_mob blood_boy.physiology?.bleed_mod /= passive_bleed_modifier - return ..() - /datum/reagent/medicine/coagulant/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() if(!affected_mob.blood_volume || !affected_mob.all_wounds) @@ -1690,19 +1743,21 @@ if(SPT_PROB(7.5, seconds_per_tick)) affected_mob.losebreath += rand(2, 4) - affected_mob.adjustOxyLoss(rand(1, 3), required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + affected_mob.adjustOxyLoss(rand(1, 3), updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) if(prob(30)) to_chat(affected_mob, span_danger("You can feel your blood clotting up in your veins!")) else if(prob(10)) to_chat(affected_mob, span_userdanger("You feel like your blood has stopped moving!")) - affected_mob.adjustOxyLoss(rand(3, 4), required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + affected_mob.adjustOxyLoss(rand(3, 4) * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) if(prob(50)) var/obj/item/organ/internal/lungs/our_lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS) - our_lungs.apply_organ_damage(1) + our_lungs.apply_organ_damage(1 * REM * seconds_per_tick) else var/obj/item/organ/internal/heart/our_heart = affected_mob.get_organ_slot(ORGAN_SLOT_HEART) - our_heart.apply_organ_damage(1) + our_heart.apply_organ_damage(1 * REM * seconds_per_tick) + + return UPDATE_MOB_HEALTH // i googled "natural coagulant" and a couple of results came up for banana peels, so after precisely 30 more seconds of research, i now dub grinding banana peels good for your blood /datum/reagent/medicine/coagulant/banana_peel @@ -1745,11 +1800,11 @@ ph = 10.6 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/medicine/ondansetron/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) +/datum/reagent/medicine/ondansetron/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() if(SPT_PROB(8, seconds_per_tick)) - M.adjust_drowsiness(2 SECONDS * REM * seconds_per_tick) - if(SPT_PROB(15, seconds_per_tick) && !M.getStaminaLoss()) - M.adjustStaminaLoss(10) - . = TRUE - M.adjust_disgust(-10 * REM * seconds_per_tick) + affected_mob.adjust_drowsiness(2 SECONDS * REM * seconds_per_tick) + if(SPT_PROB(15, seconds_per_tick) && !affected_mob.getStaminaLoss()) + if(affected_mob.adjustStaminaLoss(10 * REM * seconds_per_tick, updating_stamina = FALSE)) + . = UPDATE_MOB_HEALTH + affected_mob.adjust_disgust(-10 * REM * seconds_per_tick) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index dddf966be72..75780f65fc7 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -369,7 +369,7 @@ mytray.myseed?.adjust_instability(round(volume * 0.15)) /datum/reagent/water/holywater/on_mob_metabolize(mob/living/affected_mob) - ..() + . = ..() ADD_TRAIT(affected_mob, TRAIT_HOLY, type) /datum/reagent/water/holywater/on_mob_add(mob/living/affected_mob, amount) @@ -378,8 +378,8 @@ data["misc"] = 0 /datum/reagent/water/holywater/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() REMOVE_TRAIT(affected_mob, TRAIT_HOLY, type) - ..() /datum/reagent/water/holywater/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) . = ..() @@ -387,8 +387,7 @@ to_chat(exposed_mob, span_userdanger("A vile holiness begins to spread its shining tendrils through your mind, purging the Geometer of Blood's influence!")) /datum/reagent/water/holywater/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - if(affected_mob.blood_volume) - affected_mob.blood_volume += 0.1 * REM * seconds_per_tick // water is good for you! + . = ..() if(!data) data = list("misc" = 0) @@ -415,9 +414,11 @@ affected_mob.Unconscious(100) affected_mob.remove_status_effect(/datum/status_effect/jitter) affected_mob.remove_status_effect(/datum/status_effect/speech/stutter) - holder.remove_reagent(type, volume) // maybe this is a little too perfect and a max() cap on the statuses would be better?? + if(holder) + holder.remove_reagent(type, volume) // maybe this is a little too perfect and a max() cap on the statuses would be better?? return - holder.remove_reagent(type, 1 * REAGENTS_METABOLISM * seconds_per_tick) //fixed consumption to prevent balancing going out of whack + if(holder) + holder.remove_reagent(type, 1 * REAGENTS_METABOLISM * seconds_per_tick) //fixed consumption to prevent balancing going out of whack /datum/reagent/water/holywater/expose_turf(turf/exposed_turf, reac_volume) . = ..() @@ -484,24 +485,27 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/fuel/unholywater/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + var/need_mob_update = FALSE if(IS_CULTIST(affected_mob)) affected_mob.adjust_drowsiness(-10 SECONDS * REM * seconds_per_tick) affected_mob.AdjustAllImmobility(-40 * REM * seconds_per_tick) - affected_mob.adjustStaminaLoss(-10 * REM * seconds_per_tick, 0) - affected_mob.adjustToxLoss(-2 * REM * seconds_per_tick, 0) - affected_mob.adjustOxyLoss(-2 * REM * seconds_per_tick, 0) - affected_mob.adjustBruteLoss(-2 * REM * seconds_per_tick, 0) - affected_mob.adjustFireLoss(-2 * REM * seconds_per_tick, 0) + need_mob_update += affected_mob.adjustStaminaLoss(-10 * REM * seconds_per_tick, updating_stamina = FALSE) + need_mob_update += affected_mob.adjustToxLoss(-2 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjustOxyLoss(-2 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjustBruteLoss(-2 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjustFireLoss(-2 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update = TRUE if(ishuman(affected_mob) && affected_mob.blood_volume < BLOOD_VOLUME_NORMAL) affected_mob.blood_volume += 3 * REM * seconds_per_tick else // Will deal about 90 damage when 50 units are thrown - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3 * REM * seconds_per_tick, 150) - affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, 0) - affected_mob.adjustFireLoss(1 * REM * seconds_per_tick, 0) - affected_mob.adjustOxyLoss(1 * REM * seconds_per_tick, 0) - affected_mob.adjustBruteLoss(1 * REM * seconds_per_tick, 0) - ..() - return TRUE + need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3 * REM * seconds_per_tick, 150) + need_mob_update += affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjustFireLoss(1 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjustOxyLoss(1 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjustBruteLoss(1 * REM * seconds_per_tick, updating_health = FALSE) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/hellwater //if someone has this in their system they've really pissed off an eldrich god name = "Hell Water" @@ -511,13 +515,17 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/hellwater/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.set_fire_stacks(min(affected_mob.fire_stacks + (1.5 * seconds_per_tick), 5)) affected_mob.ignite_mob() //Only problem with igniting people is currently the commonly available fire suits make you immune to being on fire - affected_mob.adjustToxLoss(0.5*seconds_per_tick, 0) - affected_mob.adjustFireLoss(0.5*seconds_per_tick, 0) //Hence the other damages... ain't I a bastard? + var/need_mob_update + need_mob_update = affected_mob.adjustToxLoss(0.5*seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjustFireLoss(0.5*seconds_per_tick, updating_health = FALSE) //Hence the other damages... ain't I a bastard? affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2.5*seconds_per_tick, 150) - holder.remove_reagent(type, 0.5*seconds_per_tick) - return TRUE + if(holder) + holder.remove_reagent(type, 0.5*seconds_per_tick) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/omnizine/godblood name = "Godblood" @@ -629,8 +637,8 @@ if((methods & INGEST) && show_message) to_chat(exposed_mob, span_notice("That tasted horrible.")) - /datum/reagent/spraytan/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() metabolization_rate = 1 * REAGENTS_METABOLISM if(ishuman(affected_mob)) @@ -656,13 +664,18 @@ affected_mob.visible_message("[affected_mob] flexes [affected_mob.p_their()] arms.") if(SPT_PROB(5, seconds_per_tick)) affected_mob.say(pick("Shit was SO cash.", "You are everything bad in the world.", "What sports do you play, other than 'jack off to naked drawn Japanese people?'", "Don???t be a stranger. Just hit me with your best shot.", "My name is John and I hate every single one of you."), forced = /datum/reagent/spraytan) - ..() - return #define MUT_MSG_IMMEDIATE 1 #define MUT_MSG_EXTENDED 2 #define MUT_MSG_ABOUT2TURN 3 +/// the current_cycle threshold / iterations needed before one can transform +#define CYCLES_TO_TURN 20 +/// the cycle at which 'immediate' mutation text begins displaying +#define CYCLES_MSG_IMMEDIATE 6 +/// the cycle at which 'extended' mutation text begins displaying +#define CYCLES_MSG_EXTENDED 16 + /datum/reagent/mutationtoxin name = "Stable Mutation Toxin" description = "A humanizing toxin." @@ -675,21 +688,20 @@ "Your limbs begin to take on a different shape." = MUT_MSG_EXTENDED, "Your appendages begin morphing." = MUT_MSG_EXTENDED, "You feel as though you're about to change at any moment!" = MUT_MSG_ABOUT2TURN) - var/cycles_to_turn = 20 //the current_cycle threshold / iterations needed before one can transform /datum/reagent/mutationtoxin/on_mob_life(mob/living/carbon/human/affected_mob, seconds_per_tick, times_fired) - . = TRUE + . = ..() if(!istype(affected_mob)) return - if(!(affected_mob.dna?.species) || !(affected_mob.mob_biotypes & MOB_ORGANIC)) + if(!(affected_mob.dna?.species) || !(affected_mob.mob_biotypes & affected_biotype)) return if(SPT_PROB(5, seconds_per_tick)) var/list/pick_ur_fav = list() var/filter = NONE - if(current_cycle <= (cycles_to_turn*0.3)) + if(current_cycle <= CYCLES_MSG_IMMEDIATE) filter = MUT_MSG_IMMEDIATE - else if(current_cycle <= (cycles_to_turn*0.8)) + else if(current_cycle <= CYCLES_MSG_EXTENDED) filter = MUT_MSG_EXTENDED else filter = MUT_MSG_ABOUT2TURN @@ -699,14 +711,15 @@ pick_ur_fav += i to_chat(affected_mob, span_warning("[pick(pick_ur_fav)]")) - if(current_cycle >= cycles_to_turn) + if(current_cycle >= CYCLES_TO_TURN) var/datum/species/species_type = race //affected_mob.set_species(species_type) //ORIGINAL affected_mob.set_species(species_type, TRUE, FALSE, null, null, null, null, TRUE) //SKYRAT EDIT CHANGE - CUSTOMIZATION holder.del_reagent(type) to_chat(affected_mob, span_warning("You've become \a [lowertext(initial(species_type.name))]!")) return - ..() + + return ..() /datum/reagent/mutationtoxin/classic //The one from plasma on green slimes name = "Mutation Toxin" @@ -769,14 +782,14 @@ //affected_mob.set_species(species_type) //ORIGINAL affected_mob.set_species(species_type, TRUE, FALSE, null, null, null, null, TRUE, TRUE) //SKYRAT EDIT CHANGE - CUSTOMIZATION holder.del_reagent(type) - return TRUE - if(current_cycle >= cycles_to_turn) //overwrite since we want subtypes of jelly + return UPDATE_MOB_HEALTH + if(current_cycle >= CYCLES_TO_TURN) //overwrite since we want subtypes of jelly var/datum/species/species_type = pick(subtypesof(race)) //affected_mob.set_species(species_type) //ORIGINAL affected_mob.set_species(species_type, TRUE, FALSE, null, null, null, null, TRUE, TRUE) //SKYRAT EDIT CHANGE - CUSTOMIZATION holder.del_reagent(type) to_chat(affected_mob, span_warning("You've become \a [initial(species_type.name)]!")) - return TRUE + return UPDATE_MOB_HEALTH return ..() /datum/reagent/mutationtoxin/golem @@ -849,6 +862,10 @@ #undef MUT_MSG_EXTENDED #undef MUT_MSG_ABOUT2TURN +#undef CYCLES_TO_TURN +#undef CYCLES_MSG_IMMEDIATE +#undef CYCLES_MSG_EXTENDED + /datum/reagent/mulligan name = "Mulligan Toxin" description = "This toxin will rapidly change the DNA of humanoid beings. Commonly used by Syndicate spies and assassins in need of an emergency ID change." @@ -858,7 +875,7 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/mulligan/on_mob_life(mob/living/carbon/human/affected_mob, seconds_per_tick, times_fired) - ..() + . = ..() if (!istype(affected_mob)) return to_chat(affected_mob, span_warning("You grit your teeth in pain as your body rapidly mutates!")) @@ -900,10 +917,10 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/serotrotium/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(ishuman(affected_mob)) if(SPT_PROB(3.5, seconds_per_tick)) affected_mob.emote(pick("twitch","drool","moan","gasp")) - ..() /datum/reagent/oxygen name = "Oxygen" @@ -978,13 +995,13 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/mercury/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(!HAS_TRAIT(src, TRAIT_IMMOBILIZED) && !isspaceturf(affected_mob.loc)) step(affected_mob, pick(GLOB.cardinals)) if(SPT_PROB(3.5, seconds_per_tick)) affected_mob.emote(pick("twitch","drool","moan")) - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.5*seconds_per_tick) - ..() - return TRUE + if(affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.5*seconds_per_tick)) + return UPDATE_MOB_HEALTH /datum/reagent/sulfur name = "Sulfur" @@ -1052,9 +1069,9 @@ mytray.adjust_weedlevel(-rand(1, 4)) /datum/reagent/fluorine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustToxLoss(0.5*REM*seconds_per_tick, 0) - . = TRUE - ..() + . = ..() + if(affected_mob.adjustToxLoss(0.5*REM*seconds_per_tick, updating_health = FALSE)) + . = TRUE /datum/reagent/sodium name = "Sodium" @@ -1090,11 +1107,11 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/lithium/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(!HAS_TRAIT(affected_mob, TRAIT_IMMOBILIZED) && !isspaceturf(affected_mob.loc) && isturf(affected_mob.loc)) step(affected_mob, pick(GLOB.cardinals)) if(SPT_PROB(2.5, seconds_per_tick)) affected_mob.emote(pick("twitch","drool","moan")) - ..() /datum/reagent/glycerol name = "Glycerol" @@ -1134,9 +1151,9 @@ ph = 6 /datum/reagent/iron/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(affected_mob.blood_volume < BLOOD_VOLUME_NORMAL) affected_mob.blood_volume += 0.25 * seconds_per_tick - ..() /datum/reagent/gold name = "Gold" @@ -1170,9 +1187,9 @@ var/tox_damage = 0.5 /datum/reagent/uranium/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustToxLoss(tox_damage * seconds_per_tick * REM) - ..() - return TRUE + . = ..() + if(affected_mob.adjustToxLoss(tox_damage * seconds_per_tick * REM, updating_health = FALSE)) + return UPDATE_MOB_HEALTH /datum/reagent/uranium/expose_turf(turf/exposed_turf, reac_volume) . = ..() @@ -1216,12 +1233,12 @@ do_teleport(exposed_mob, get_turf(exposed_mob), (reac_volume / 5), asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) //4 tiles per crystal /datum/reagent/bluespace/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(current_cycle > 10 && SPT_PROB(7.5, seconds_per_tick)) to_chat(affected_mob, span_warning("You feel unstable...")) affected_mob.set_jitter_if_lower(2 SECONDS) current_cycle = 1 addtimer(CALLBACK(affected_mob, TYPE_PROC_REF(/mob/living, bluespace_shuffle)), 30) - ..() /mob/living/proc/bluespace_shuffle() do_teleport(src, get_turf(src), 5, asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) @@ -1268,9 +1285,9 @@ exposed_mob.adjust_fire_stacks(reac_volume / 10) /datum/reagent/fuel/on_mob_life(mob/living/carbon/victim, seconds_per_tick, times_fired) - victim.adjustToxLoss(0.5 * seconds_per_tick, FALSE, required_biotype = affected_biotype) - ..() - return TRUE + . = ..() + if(victim.adjustToxLoss(0.5 * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/fuel/expose_turf(turf/exposed_turf, reac_volume) . = ..() @@ -1337,11 +1354,13 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/space_cleaner/ez_clean/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustBruteLoss(1.665*seconds_per_tick) - affected_mob.adjustFireLoss(1.665*seconds_per_tick) - affected_mob.adjustToxLoss(1.665*seconds_per_tick) - ..() - return TRUE + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustBruteLoss(1.665*seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjustFireLoss(1.665*seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjustToxLoss(1.665*seconds_per_tick, updating_health = FALSE) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/space_cleaner/ez_clean/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) . = ..() @@ -1359,6 +1378,7 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/cryptobiolin/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.set_dizzy_if_lower(2 SECONDS) // Cryptobiolin adjusts the mob's confusion down to 20 seconds if it's higher, @@ -1370,8 +1390,6 @@ else if(confusion_left > 20 SECONDS) affected_mob.set_confusion(20 SECONDS) - ..() - /datum/reagent/impedrezene name = "Impedrezene" description = "Impedrezene is a narcotic that impedes one's ability by slowing down the higher brain cell functions." @@ -1382,6 +1400,7 @@ addiction_types = list(/datum/addiction/opioids = 10) /datum/reagent/impedrezene/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_jitter(-5 SECONDS * seconds_per_tick) . = FALSE if(SPT_PROB(55, seconds_per_tick)) @@ -1391,7 +1410,6 @@ affected_mob.adjust_drowsiness(6 SECONDS) if(SPT_PROB(5, seconds_per_tick)) affected_mob.emote("drool") - ..() /datum/reagent/cyborg_mutation_nanomachines name = "Nanomachines" @@ -1542,13 +1560,13 @@ exposed_mob.adjust_drowsiness(drowsiness_to_apply) /datum/reagent/nitrous_oxide/on_mob_metabolize(mob/living/affected_mob) + . = ..() if(!HAS_TRAIT(affected_mob, TRAIT_COAGULATING)) //IF the mob does not have a coagulant in them, we add the blood mess trait to make the bleed quicker ADD_TRAIT(affected_mob, TRAIT_BLOODY_MESS, type) - return ..() /datum/reagent/nitrous_oxide/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() REMOVE_TRAIT(affected_mob, TRAIT_BLOODY_MESS, type) - return ..() /datum/reagent/nitrous_oxide/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) affected_mob.adjust_drowsiness(4 SECONDS * REM * seconds_per_tick) @@ -1706,10 +1724,10 @@ ph = 3 /datum/reagent/plantnutriment/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(tox_prob, seconds_per_tick)) - affected_mob.adjustToxLoss(1, FALSE, required_biotype = affected_biotype) - . = TRUE - ..() + if(affected_mob.adjustToxLoss(1, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/plantnutriment/eznutriment name = "E-Z Nutrient" @@ -2214,7 +2232,7 @@ /datum/reagent/concentrated_barbers_aid/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - if(current_cycle > 20 / creation_purity) + if(current_cycle > 21 / creation_purity) if(!ishuman(affected_mob)) return var/mob/living/carbon/human/human_mob = affected_mob @@ -2362,9 +2380,9 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/royal_bee_jelly/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(1, seconds_per_tick)) affected_mob.say(pick("Bzzz...","BZZ BZZ","Bzzzzzzzzzzz..."), forced = "royal bee jelly") - ..() //Misc reagents @@ -2396,8 +2414,8 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/magillitis/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - ..() - if((ishuman(affected_mob)) && current_cycle >= 10) + . = ..() + if((ishuman(affected_mob)) && current_cycle > 10) affected_mob.gorillize() /datum/reagent/growthserum @@ -2409,6 +2427,7 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/growthserum/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() var/newsize = current_size switch(volume) if(0 to 19) @@ -2424,12 +2443,11 @@ affected_mob.update_transform(newsize/current_size) current_size = newsize - ..() /datum/reagent/growthserum/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() affected_mob.update_transform(RESIZE_DEFAULT_SIZE/current_size) current_size = RESIZE_DEFAULT_SIZE - ..() /datum/reagent/plastic_polymers name = "Plastic Polymers" @@ -2491,12 +2509,12 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/pax/on_mob_metabolize(mob/living/affected_mob) - ..() + . = ..() ADD_TRAIT(affected_mob, TRAIT_PACIFISM, type) /datum/reagent/pax/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() REMOVE_TRAIT(affected_mob, TRAIT_PACIFISM, type) - ..() /datum/reagent/bz_metabolites name = "BZ Metabolites" @@ -2507,19 +2525,19 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/bz_metabolites/on_mob_metabolize(mob/living/ling) - ..() + . = ..() ADD_TRAIT(ling, CHANGELING_HIVEMIND_MUTE, type) /datum/reagent/bz_metabolites/on_mob_end_metabolize(mob/living/ling) - ..() + . = ..() REMOVE_TRAIT(ling, CHANGELING_HIVEMIND_MUTE, type) /datum/reagent/bz_metabolites/on_mob_life(mob/living/carbon/target, seconds_per_tick, times_fired) + . = ..() if(target.mind) var/datum/antagonist/changeling/changeling = target.mind.has_antag_datum(/datum/antagonist/changeling) if(changeling) - changeling.adjust_chemicals(-4 * REM * seconds_per_tick) //SKYRAT EDIT - BZ-BUFF-VS-LING - ORIGINAL: changeling.adjust_chemicals(-2 * REM * delta_time) - return ..() + changeling.adjust_chemicals(-4 * REM * seconds_per_tick) //SKYRAT EDIT - BZ-BUFF-VS-LING - ORIGINAL: changeling.adjust_chemicals(-2 * REM * seconds_per_tick) /datum/reagent/pax/peaceborg name = "Synthpax" @@ -2550,14 +2568,14 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/peaceborg/tire/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() var/healthcomp = (100 - affected_mob.health) //DOES NOT ACCOUNT FOR ADMINBUS THINGS THAT MAKE YOU HAVE MORE THAN 200/210 HEALTH, OR SOMETHING OTHER THAN A HUMAN PROCESSING THIS. . = FALSE if(affected_mob.getStaminaLoss() < (45 - healthcomp)) //At 50 health you would have 200 - 150 health meaning 50 compensation. 60 - 50 = 10, so would only do 10-19 stamina.) - affected_mob.adjustStaminaLoss(10 * REM * seconds_per_tick) - . = TRUE + if(affected_mob.adjustStaminaLoss(10 * REM * seconds_per_tick, updating_stamina = FALSE)) + . = UPDATE_MOB_HEALTH if(SPT_PROB(16, seconds_per_tick)) to_chat(affected_mob, "You should sit down and take a rest...") - ..() /datum/reagent/gondola_mutation_toxin name = "Tranquility" @@ -2595,13 +2613,14 @@ desc = "It smells like a carcass, and doesn't look much better." /datum/reagent/yuck/on_mob_add(mob/living/affected_mob) - . = ..() if(HAS_TRAIT(affected_mob, TRAIT_NOHUNGER)) //they can't puke holder.del_reagent(type) + return ..() #define YUCK_PUKE_CYCLES 3 // every X cycle is a puke #define YUCK_PUKES_TO_STUN 3 // hit this amount of pukes in a row to start stunning /datum/reagent/yuck/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(!yuck_cycle) if(SPT_PROB(4, seconds_per_tick)) var/dread = pick("Something is moving in your stomach...", \ @@ -2613,19 +2632,19 @@ var/yuck_cycles = current_cycle - yuck_cycle if(yuck_cycles % YUCK_PUKE_CYCLES == 0) if(yuck_cycles >= YUCK_PUKE_CYCLES * YUCK_PUKES_TO_STUN) - holder.remove_reagent(type, 5) + if(holder) + holder.remove_reagent(type, 5) var/passable_flags = (MOB_VOMIT_MESSAGE | MOB_VOMIT_HARM) if(yuck_cycles >= (YUCK_PUKE_CYCLES * YUCK_PUKES_TO_STUN)) passable_flags |= MOB_VOMIT_STUN affected_mob.vomit(vomit_flags = passable_flags, lost_nutrition = rand(14, 26)) - if(holder) - return ..() + #undef YUCK_PUKE_CYCLES #undef YUCK_PUKES_TO_STUN /datum/reagent/yuck/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() yuck_cycle = 0 // reset vomiting - return ..() /datum/reagent/yuck/on_transfer(atom/A, methods=TOUCH, trans_volume) if((methods & INGEST) || !iscarbon(A)) @@ -2724,10 +2743,11 @@ addtimer(CALLBACK(exposed_obj, PROC_REF(_RemoveElement), list(/datum/element/forced_gravity, 0)), volume * time_multiplier, TIMER_UNIQUE|TIMER_OVERRIDE) /datum/reagent/gravitum/on_mob_metabolize(mob/living/affected_mob) + . = ..() affected_mob.AddElement(/datum/element/forced_gravity, 0) //0 is the gravity, and in this case weightless - return ..() /datum/reagent/gravitum/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() affected_mob.RemoveElement(/datum/element/forced_gravity, 0) /datum/reagent/cellulose @@ -2751,6 +2771,7 @@ var/significant = FALSE /datum/reagent/determination/on_mob_end_metabolize(mob/living/carbon/affected_mob) + . = ..() if(significant) var/stam_crash = 0 for(var/thing in affected_mob.all_wounds) @@ -2758,9 +2779,9 @@ stam_crash += (W.severity + 1) * 3 // spike of 3 stam damage per wound severity (moderate = 6, severe = 9, critical = 12) when the determination wears off if it was a combat rush affected_mob.adjustStaminaLoss(stam_crash) affected_mob.remove_status_effect(/datum/status_effect/determined) - ..() /datum/reagent/determination/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(!significant && volume >= WOUND_DETERMINATION_SEVERE) significant = TRUE affected_mob.apply_status_effect(/datum/status_effect/determined) // in addition to the slight healing, limping cooldowns are divided by 4 during the combat high @@ -2772,8 +2793,8 @@ var/obj/item/bodypart/wounded_part = W.limb if(wounded_part) wounded_part.heal_damage(0.25 * REM * seconds_per_tick, 0.25 * REM * seconds_per_tick) - affected_mob.adjustStaminaLoss(-0.25 * REM * seconds_per_tick) // the more wounds, the more stamina regen - ..() + if(affected_mob.adjustStaminaLoss(-0.25 * REM * seconds_per_tick, updating_stamina = FALSE)) // the more wounds, the more stamina regen + return UPDATE_MOB_HEALTH // unholy water, but for heretics. // why couldn't they have both just used the same reagent? @@ -2791,24 +2812,26 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/eldritch/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() + var/need_mob_update = FALSE if(IS_HERETIC(drinker)) drinker.adjust_drowsiness(-10 * REM * seconds_per_tick) drinker.AdjustAllImmobility(-40 * REM * seconds_per_tick) - drinker.adjustStaminaLoss(-10 * REM * seconds_per_tick, FALSE) - drinker.adjustToxLoss(-2 * REM * seconds_per_tick, FALSE, forced = TRUE) - drinker.adjustOxyLoss(-2 * REM * seconds_per_tick, FALSE) - drinker.adjustBruteLoss(-2 * REM * seconds_per_tick, FALSE) - drinker.adjustFireLoss(-2 * REM * seconds_per_tick, FALSE) + need_mob_update += drinker.adjustStaminaLoss(-10 * REM * seconds_per_tick, updating_stamina = FALSE) + need_mob_update += drinker.adjustToxLoss(-2 * REM * seconds_per_tick, updating_health = FALSE, forced = TRUE) + need_mob_update += drinker.adjustOxyLoss(-2 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += drinker.adjustBruteLoss(-2 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += drinker.adjustFireLoss(-2 * REM * seconds_per_tick, updating_health = FALSE) if(drinker.blood_volume < BLOOD_VOLUME_NORMAL) drinker.blood_volume += 3 * REM * seconds_per_tick else - drinker.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3 * REM * seconds_per_tick, 150) - drinker.adjustToxLoss(2 * REM * seconds_per_tick, FALSE) - drinker.adjustFireLoss(2 * REM * seconds_per_tick, FALSE) - drinker.adjustOxyLoss(2 * REM * seconds_per_tick, FALSE) - drinker.adjustBruteLoss(2 * REM * seconds_per_tick, FALSE) - ..() - return TRUE + need_mob_update = drinker.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3 * REM * seconds_per_tick, 150) + need_mob_update += drinker.adjustToxLoss(2 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += drinker.adjustFireLoss(2 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += drinker.adjustOxyLoss(2 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += drinker.adjustBruteLoss(2 * REM * seconds_per_tick, updating_health = FALSE) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/universal_indicator name = "Universal Indicator" @@ -2854,10 +2877,11 @@ desc = "Bottoms up...?" /datum/reagent/ants/on_mob_life(mob/living/carbon/victim, seconds_per_tick) + . = ..() victim.adjustBruteLoss(max(0.1, round((ant_damage * 0.025),0.1))) //Scales with time. Roughly 32 brute with 100u. ant_damage++ if(ant_damage < 5) // Makes ant food a little more appetizing, since you won't be screaming as much. - return ..() + return if(SPT_PROB(5, seconds_per_tick)) if(SPT_PROB(5, seconds_per_tick)) //Super rare statement victim.say("AUGH NO NOT THE ANTS! NOT THE ANTS! AAAAUUGH THEY'RE IN MY EYES! MY EYES! AUUGH!!", forced = /datum/reagent/ants) @@ -2866,14 +2890,12 @@ if(SPT_PROB(15, seconds_per_tick)) victim.emote("scream") if(SPT_PROB(2, seconds_per_tick)) // Stuns, but purges ants. - victim.vomit(rand(5,10), FALSE, TRUE, 1, TRUE, FALSE, purge_ratio = 1) - ..() - return TRUE + victim.vomit(VOMIT_CATEGORY_DEFAULT, lost_nutrition = rand(5,10), purge_ratio = 1) /datum/reagent/ants/on_mob_end_metabolize(mob/living/living_anthill) + . = ..() ant_damage = 0 to_chat(living_anthill, "You feel like the last of the ants are out of your system.") - return ..() /datum/reagent/ants/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) . = ..() @@ -2918,9 +2940,9 @@ metabolization_rate = 0.4 * REAGENTS_METABOLISM /datum/reagent/lead/on_mob_life(mob/living/carbon/victim) - victim.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.5) - ..() - return TRUE + . = ..() + if(victim.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.5)) + return UPDATE_MOB_HEALTH //The main feedstock for kronkaine production, also a shitty stamina healer. /datum/reagent/kronkus_extract @@ -2932,10 +2954,12 @@ addiction_types = list(/datum/addiction/stimulants = 5) /datum/reagent/kronkus_extract/on_mob_life(mob/living/carbon/kronkus_enjoyer) - ..() - kronkus_enjoyer.adjustOrganLoss(ORGAN_SLOT_HEART, 0.1) - kronkus_enjoyer.adjustStaminaLoss(-2, FALSE) - return TRUE + . = ..() + var/need_mob_update + need_mob_update = kronkus_enjoyer.adjustOrganLoss(ORGAN_SLOT_HEART, 0.1) + need_mob_update += kronkus_enjoyer.adjustStaminaLoss(-2, updating_stamina = FALSE) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/brimdust name = "Brimdust" @@ -2947,7 +2971,8 @@ /datum/reagent/brimdust/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - return affected_mob.adjustFireLoss((ispodperson(affected_mob) ? -1 : 1) * seconds_per_tick) + if(affected_mob.adjustFireLoss((ispodperson(affected_mob) ? -1 : 1 * seconds_per_tick), updating_health = FALSE)) + return UPDATE_MOB_HEALTH /datum/reagent/brimdust/on_hydroponics_apply(obj/machinery/hydroponics/mytray, mob/user) mytray.adjust_weedlevel(-1) @@ -2975,14 +3000,15 @@ . = ..() metabolizer.add_mood_event(name, /datum/mood_event/love_reagent) -/datum/reagent/love/on_mob_delete(mob/living/deleted_from) +/datum/reagent/love/on_mob_delete(mob/living/affected_mob) . = ..() // When we exit the system we'll leave the moodlet based on the amount we had var/duration_of_moodlet = current_cycle * 20 SECONDS - deleted_from.clear_mood_event(name) - deleted_from.add_mood_event(name, /datum/mood_event/love_reagent, duration_of_moodlet) + affected_mob.clear_mood_event(name) + affected_mob.add_mood_event(name, /datum/mood_event/love_reagent, duration_of_moodlet) /datum/reagent/love/overdose_process(mob/living/metabolizer, seconds_per_tick, times_fired) + . = ..() var/mob/living/carbon/carbon_metabolizer = metabolizer if(!istype(carbon_metabolizer) || !carbon_metabolizer.can_heartattack() || carbon_metabolizer.undergoing_cardiac_arrest()) metabolizer.reagents.del_reagent(type) @@ -3016,6 +3042,8 @@ affected_mob.add_mood_event("hauntium_spirits", /datum/mood_event/hauntium_spirits, name) //8 minutes of mood debuff /datum/reagent/hauntium/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + if(affected_mob.mob_biotypes & MOB_UNDEAD || HAS_MIND_TRAIT(affected_mob, TRAIT_MORBID)) //if morbid or undead,acts like an addiction-less drug affected_mob.remove_status_effect(/datum/status_effect/jitter) affected_mob.AdjustStun(-50 * REM * seconds_per_tick) @@ -3023,10 +3051,8 @@ affected_mob.AdjustUnconscious(-50 * REM * seconds_per_tick) affected_mob.AdjustParalyzed(-50 * REM * seconds_per_tick) affected_mob.AdjustImmobilized(-50 * REM * seconds_per_tick) - ..() else - affected_mob.adjustOrganLoss(ORGAN_SLOT_HEART, REM * seconds_per_tick) //1 heart damage per tick + if(affected_mob.adjustOrganLoss(ORGAN_SLOT_HEART, REM * seconds_per_tick)) //1 heart damage per tick + . = UPDATE_MOB_HEALTH if(SPT_PROB(10, seconds_per_tick)) affected_mob.emote(pick("twitch","choke","shiver","gag")) - ..() - return TRUE diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm index 6f99273ad4e..2db3682ef21 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm @@ -13,9 +13,9 @@ exposed_turf.AddComponent(/datum/component/thermite, reac_volume) /datum/reagent/thermite/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustFireLoss(1 * REM * seconds_per_tick, 0) - ..() - return TRUE + . = ..() + if(affected_mob.adjustFireLoss(1 * REM * seconds_per_tick, updating_health = FALSE)) + return UPDATE_MOB_HEALTH /datum/reagent/nitroglycerin name = "Nitroglycerin" @@ -47,10 +47,10 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/clf3/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_fire_stacks(2 * REM * seconds_per_tick) - affected_mob.adjustFireLoss(0.3 * max(affected_mob.fire_stacks, 1) * REM * seconds_per_tick, 0) - ..() - return TRUE + if(affected_mob.adjustFireLoss(0.3 * max(affected_mob.fire_stacks, 1) * REM * seconds_per_tick, updating_health = FALSE)) + return UPDATE_MOB_HEALTH /datum/reagent/clf3/expose_turf(turf/exposed_turf, reac_volume) . = ..() @@ -177,10 +177,10 @@ exposed_mob.ignite_mob() /datum/reagent/phlogiston/on_mob_life(mob/living/carbon/metabolizer, seconds_per_tick, times_fired) + . = ..() metabolizer.adjust_fire_stacks(1 * REM * seconds_per_tick) - metabolizer.adjustFireLoss(0.3 * max(metabolizer.fire_stacks, 0.15) * REM * seconds_per_tick, 0) - ..() - return TRUE + if(metabolizer.adjustFireLoss(0.3 * max(metabolizer.fire_stacks, 0.15) * REM * seconds_per_tick, updating_health = FALSE)) + return UPDATE_MOB_HEALTH /datum/reagent/napalm name = "Napalm" @@ -201,9 +201,8 @@ mytray.adjust_weedlevel(-rand(5,9)) //At least give them a small reward if they bother. /datum/reagent/napalm/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_fire_stacks(1 * REM * seconds_per_tick) - ..() - return TRUE /datum/reagent/napalm/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) . = ..() @@ -249,6 +248,7 @@ metabolization_rate = 0.05 * REM //slower consumption when dead /datum/reagent/cryostylane/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() metabolization_rate = 0.25 * REM//faster consumption when alive if(affected_mob.reagents.has_reagent(/datum/reagent/oxygen)) affected_mob.reagents.remove_reagent(/datum/reagent/oxygen, 0.5 * REM * seconds_per_tick) @@ -256,7 +256,6 @@ if(ishuman(affected_mob)) var/mob/living/carbon/human/humi = affected_mob humi.adjust_coretemperature(-15 * REM * seconds_per_tick) - ..() /datum/reagent/cryostylane/expose_turf(turf/exposed_turf, reac_volume) . = ..() @@ -284,9 +283,9 @@ holder.remove_reagent(/datum/reagent/oxygen, 0.5 * REM * seconds_per_tick) affected_mob.adjust_bodytemperature(15 * REM * seconds_per_tick) if(ishuman(affected_mob)) - var/mob/living/carbon/human/humi = affected_mob - humi.adjust_coretemperature(15 * REM * seconds_per_tick) - ..() + var/mob/living/carbon/human/affected_human = affected_mob + affected_human.adjust_coretemperature(15 * REM * seconds_per_tick) + return ..() /datum/reagent/pyrosium/burn(datum/reagents/holder) if(holder.has_reagent(/datum/reagent/oxygen)) @@ -306,12 +305,12 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/teslium/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() shock_timer++ if(shock_timer >= rand(5, 30)) //Random shocks are wildly unpredictable shock_timer = 0 affected_mob.electrocute_act(rand(5, 20), "Teslium in their body", 1, SHOCK_NOGLOVES) //SHOCK_NOGLOVES because it's caused from INSIDE of you playsound(affected_mob, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - ..() /datum/reagent/teslium/on_mob_metabolize(mob/living/carbon/human/affected_mob) . = ..() @@ -334,15 +333,16 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/teslium/energized_jelly/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(isjellyperson(affected_mob)) shock_timer = 0 //immune to shocks affected_mob.AdjustAllImmobility(-40 *REM * seconds_per_tick) - affected_mob.adjustStaminaLoss(-2 * REM * seconds_per_tick, 0) + if(affected_mob.adjustStaminaLoss(-2 * REM * seconds_per_tick, updating_stamina = FALSE)) + . = UPDATE_MOB_HEALTH if(is_species(affected_mob, /datum/species/jelly/luminescent)) var/mob/living/carbon/human/affected_human = affected_mob var/datum/species/jelly/luminescent/slime_species = affected_human.dna.species slime_species.extract_cooldown = max(slime_species.extract_cooldown - (2 SECONDS * REM * seconds_per_tick), 0) - ..() /datum/reagent/firefighting_foam name = "Firefighting Foam" diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index d655698646c..7f4acabef6e 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -23,10 +23,10 @@ mytray.adjust_toxic(round(volume * 2)) /datum/reagent/toxin/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(toxpwr && affected_mob.health > health_required) - affected_mob.adjustToxLoss(toxpwr * REM * normalise_creation_purity() * seconds_per_tick, FALSE, required_biotype = affected_biotype) - . = TRUE - ..() + if(affected_mob.adjustToxLoss(toxpwr * REM * normalise_creation_purity() * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/toxin/amatoxin name = "Amatoxin" @@ -64,8 +64,9 @@ exposed_mob.domutcheck() /datum/reagent/toxin/mutagen/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - . = affected_mob.adjustToxLoss(0.5 * seconds_per_tick * REM, required_biotype = affected_biotype) - return ..() || . + . = ..() + if(affected_mob.adjustToxLoss(0.5 * seconds_per_tick * REM, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/toxin/mutagen/on_hydroponics_apply(obj/machinery/hydroponics/mytray, mob/user) mytray.mutation_roll(user) @@ -100,14 +101,16 @@ /datum/reagent/toxin/plasma/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) if(holder.has_reagent(/datum/reagent/medicine/epinephrine)) holder.remove_reagent(/datum/reagent/medicine/epinephrine, 2 * REM * seconds_per_tick) + . = ..() affected_mob.adjustPlasma(20 * REM * seconds_per_tick) - return ..() /datum/reagent/toxin/plasma/on_mob_metabolize(mob/living/carbon/affected_mob) + . = ..() if(HAS_TRAIT(affected_mob, TRAIT_PLASMA_LOVER_METABOLISM)) // sometimes mobs can temporarily metabolize plasma (e.g. plasma fixation disease symptom) toxpwr = 0 /datum/reagent/toxin/plasma/on_mob_end_metabolize(mob/living/carbon/affected_mob) + . = ..() toxpwr = initial(toxpwr) /// Handles plasma boiling. @@ -154,18 +157,20 @@ /datum/reagent/toxin/hot_ice/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) if(holder.has_reagent(/datum/reagent/medicine/epinephrine)) holder.remove_reagent(/datum/reagent/medicine/epinephrine, 2 * REM * seconds_per_tick) + . = ..() affected_mob.adjustPlasma(20 * REM * seconds_per_tick) affected_mob.adjust_bodytemperature(-7 * TEMPERATURE_DAMAGE_COEFFICIENT * REM * seconds_per_tick, affected_mob.get_body_temp_normal()) if(ishuman(affected_mob)) var/mob/living/carbon/human/humi = affected_mob humi.adjust_coretemperature(-7 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) - return ..() /datum/reagent/toxin/hot_ice/on_mob_metabolize(mob/living/carbon/affected_mob) + . = ..() if(HAS_TRAIT(affected_mob, TRAIT_PLASMA_LOVER_METABOLISM)) toxpwr = 0 /datum/reagent/toxin/hot_ice/on_mob_end_metabolize(mob/living/carbon/affected_mob) + . = ..() toxpwr = initial(toxpwr) /datum/reagent/toxin/lexorin @@ -180,22 +185,20 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/lexorin/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - . = TRUE - - if(HAS_TRAIT(affected_mob, TRAIT_NOBREATH)) - . = FALSE - - if(.) + . = ..() + if(!HAS_TRAIT(affected_mob, TRAIT_NOBREATH)) affected_mob.adjustOxyLoss(5 * REM * normalise_creation_purity() * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) affected_mob.losebreath += 2 * REM * normalise_creation_purity() * seconds_per_tick + . = UPDATE_MOB_HEALTH if(SPT_PROB(10, seconds_per_tick)) affected_mob.emote("gasp") - ..() /datum/reagent/toxin/lexorin/on_mob_metabolize(mob/living/affected_mob) + . = ..() RegisterSignal(affected_mob, COMSIG_CARBON_ATTEMPT_BREATHE, PROC_REF(block_breath)) /datum/reagent/toxin/lexorin/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() UnregisterSignal(affected_mob, COMSIG_CARBON_ATTEMPT_BREATHE, PROC_REF(block_breath)) /datum/reagent/toxin/lexorin/proc/block_breath(mob/living/source) @@ -213,14 +216,14 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/slimejelly/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(5, seconds_per_tick)) to_chat(affected_mob, span_danger("Your insides are burning!")) - affected_mob.adjustToxLoss(rand(20, 60), FALSE, required_biotype = affected_biotype) - . = TRUE + if(affected_mob.adjustToxLoss(rand(20, 60), updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH else if(SPT_PROB(23, seconds_per_tick)) - affected_mob.heal_bodypart_damage(5) - . = TRUE - ..() + if(affected_mob.heal_bodypart_damage(5)) + return UPDATE_MOB_HEALTH /datum/reagent/toxin/carpotoxin name = "Carpotoxin" @@ -252,9 +255,9 @@ if((data?["method"] & INGEST) && holder_mob.stat != DEAD) holder_mob.fakedeath(type) -/datum/reagent/toxin/zombiepowder/on_mob_end_metabolize(mob/living/holder_mob) - holder_mob.cure_fakedeath(type) - return ..() +/datum/reagent/toxin/zombiepowder/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() + affected_mob.cure_fakedeath(type) /datum/reagent/toxin/zombiepowder/on_transfer(atom/target_atom, methods, trans_volume) . = ..() @@ -265,21 +268,22 @@ zombiepowder.data["method"] |= INGEST /datum/reagent/toxin/zombiepowder/on_mob_life(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() if(HAS_TRAIT(affected_mob, TRAIT_FAKEDEATH) && HAS_TRAIT(affected_mob, TRAIT_DEATHCOMA)) - ..() - return TRUE + return + var/need_mob_update switch(current_cycle) - if(1 to 5) + if(2 to 6) affected_mob.adjust_confusion(1 SECONDS * REM * seconds_per_tick) affected_mob.adjust_drowsiness(2 SECONDS * REM * seconds_per_tick) affected_mob.adjust_slurring(6 SECONDS * REM * seconds_per_tick) - if(5 to 8) - affected_mob.adjustStaminaLoss(40 * REM * seconds_per_tick, 0) - if(9 to INFINITY) + if(6 to 9) + need_mob_update = affected_mob.adjustStaminaLoss(40 * REM * seconds_per_tick, updating_stamina = FALSE) + if(10 to INFINITY) if(affected_mob.stat != DEAD) affected_mob.fakedeath(type) - ..() - return TRUE + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/toxin/ghoulpowder name = "Ghoul Powder" @@ -294,17 +298,17 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/ghoulpowder/on_mob_metabolize(mob/living/affected_mob) - ..() + . = ..() ADD_TRAIT(affected_mob, TRAIT_FAKEDEATH, type) /datum/reagent/toxin/ghoulpowder/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() REMOVE_TRAIT(affected_mob, TRAIT_FAKEDEATH, type) - ..() /datum/reagent/toxin/ghoulpowder/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustOxyLoss(1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - ..() - . = TRUE + . = ..() + if(affected_mob.adjustOxyLoss(1 * REM * seconds_per_tick, FALSE, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type)) + return UPDATE_MOB_HEALTH /datum/reagent/toxin/mindbreaker name = "Mindbreaker Toxin" @@ -319,25 +323,23 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED addiction_types = list(/datum/addiction/hallucinogens = 18) //7.2 per 2 seconds - -/datum/reagent/toxin/mindbreaker/on_mob_metabolize(mob/living/metabolizer) +/datum/reagent/toxin/mindbreaker/on_mob_metabolize(mob/living/affected_mob) . = ..() - ADD_TRAIT(metabolizer, TRAIT_RDS_SUPPRESSED, type) + ADD_TRAIT(affected_mob, TRAIT_RDS_SUPPRESSED, type) -/datum/reagent/toxin/mindbreaker/on_mob_end_metabolize(mob/living/metabolizer) +/datum/reagent/toxin/mindbreaker/on_mob_end_metabolize(mob/living/affected_mob) . = ..() - REMOVE_TRAIT(metabolizer, TRAIT_RDS_SUPPRESSED, type) + REMOVE_TRAIT(affected_mob, TRAIT_RDS_SUPPRESSED, type) -/datum/reagent/toxin/mindbreaker/on_mob_life(mob/living/carbon/metabolizer, seconds_per_tick, times_fired) +/datum/reagent/toxin/mindbreaker/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() // mindbreaker toxin assuages hallucinations in those plagued with it, mentally - if(metabolizer.has_trauma_type(/datum/brain_trauma/mild/hallucinations)) - metabolizer.remove_status_effect(/datum/status_effect/hallucination) + if(affected_mob.has_trauma_type(/datum/brain_trauma/mild/hallucinations)) + affected_mob.remove_status_effect(/datum/status_effect/hallucination) // otherwise it creates hallucinations. truly a miracle medicine. else - metabolizer.adjust_hallucinations(10 SECONDS * REM * seconds_per_tick) - - return ..() + affected_mob.adjust_hallucinations(10 SECONDS * REM * seconds_per_tick) /datum/reagent/toxin/plantbgone name = "Plant-B-Gone" @@ -374,8 +376,8 @@ var/damage = min(round(0.4 * reac_volume, 0.1), 10) if(exposed_mob.mob_biotypes & MOB_PLANT) // spray bottle emits 5u so it's dealing ~15 dmg per spray - exposed_mob.adjustToxLoss(damage * 20, required_biotype = affected_biotype) - return + if(exposed_mob.adjustToxLoss(damage * 20, required_biotype = affected_biotype)) + return if(!(methods & VAPOR) || !iscarbon(exposed_mob)) return @@ -409,8 +411,9 @@ AddElement(/datum/element/bugkiller_reagent) /datum/reagent/toxin/pestkiller/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - . = affected_mob.adjustToxLoss(2 * toxpwr * REM * seconds_per_tick, updating_health = FALSE, required_biotype = MOB_BUG) - return ..() || . + . = ..() + if(affected_mob.adjustToxLoss(2 * toxpwr * REM * seconds_per_tick, updating_health = FALSE, required_biotype = MOB_BUG)) + return UPDATE_MOB_HEALTH //Pest Spray /datum/reagent/toxin/pestkiller/on_hydroponics_apply(obj/machinery/hydroponics/mytray, mob/user) @@ -438,10 +441,10 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/toxin/spore/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.damageoverlaytemp = 60 affected_mob.update_damage_hud() affected_mob.set_eye_blur_if_lower(6 SECONDS * REM * seconds_per_tick) - return ..() /datum/reagent/toxin/spore_burning name = "Burning Spore Toxin" @@ -453,9 +456,9 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/toxin/spore_burning/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_fire_stacks(2 * REM * seconds_per_tick) affected_mob.ignite_mob() - return ..() /datum/reagent/toxin/chloralhydrate name = "Chloral Hydrate" @@ -472,18 +475,17 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/chloralhydrate/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() switch(current_cycle) - if(1 to 10) + if(2 to 11) affected_mob.adjust_confusion(2 SECONDS * REM * normalise_creation_purity() * seconds_per_tick) affected_mob.adjust_drowsiness(4 SECONDS * REM * normalise_creation_purity() * seconds_per_tick) - if(10 to 50) + if(11 to 51) affected_mob.Sleeping(40 * REM * normalise_creation_purity() * seconds_per_tick) - . = TRUE - if(51 to INFINITY) + if(52 to INFINITY) affected_mob.Sleeping(40 * REM * normalise_creation_purity() * seconds_per_tick) - affected_mob.adjustToxLoss(1 * (current_cycle - 50) * REM * normalise_creation_purity() * seconds_per_tick, FALSE, required_biotype = affected_biotype) - . = TRUE - ..() + if(affected_mob.adjustToxLoss(1 * (current_cycle - 51) * REM * normalise_creation_purity() * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/toxin/fakebeer //disguised as normal beer for use by emagged brobots name = "B33r" @@ -507,14 +509,14 @@ icon_state = initial(copy_from.icon_state) /datum/reagent/toxin/fakebeer/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() switch(current_cycle) - if(1 to 50) + if(2 to 51) affected_mob.Sleeping(40 * REM * seconds_per_tick) - if(51 to INFINITY) + if(52 to INFINITY) affected_mob.Sleeping(40 * REM * seconds_per_tick) - affected_mob.adjustToxLoss(1 * (current_cycle - 50) * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - . = TRUE - return ..() || . + if(affected_mob.adjustToxLoss(1 * (current_cycle - 50) * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/toxin/coffeepowder name = "Coffee Grounds" @@ -558,9 +560,9 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/mutetoxin/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() // Gain approximately 12 seconds * creation purity seconds of silence every metabolism tick. affected_mob.set_silence_if_lower(6 SECONDS * REM * normalise_creation_purity() * seconds_per_tick) - return ..() /datum/reagent/toxin/staminatoxin name = "Tirizene" @@ -572,10 +574,10 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/staminatoxin/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustStaminaLoss(data * REM * seconds_per_tick, 0) + . = ..() + if(affected_mob.adjustStaminaLoss(data * REM * seconds_per_tick, updating_stamina = FALSE)) + . = UPDATE_MOB_HEALTH data = max(data - 1, 3) - ..() - . = TRUE /datum/reagent/toxin/polonium name = "Polonium" @@ -587,12 +589,12 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/toxin/polonium/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if (!HAS_TRAIT(affected_mob, TRAIT_IRRADIATED) && SSradiation.can_irradiate_basic(affected_mob)) affected_mob.AddComponent(/datum/component/irradiated) else - affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, required_biotype = affected_biotype) - . = TRUE - return ..() || . + if(affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + return UPDATE_MOB_HEALTH /datum/reagent/toxin/histamine name = "Histamine" @@ -606,6 +608,7 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/toxin/histamine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(30, seconds_per_tick)) switch(pick(1, 2, 3, 4)) if(1) @@ -618,16 +621,17 @@ if(4) if(prob(75)) to_chat(affected_mob, span_danger("You scratch at an itch.")) - affected_mob.adjustBruteLoss(2*REM, FALSE, required_bodytype = affected_bodytype) - . = TRUE - ..() + if(affected_mob.adjustBruteLoss(2* REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype)) + return UPDATE_MOB_HEALTH /datum/reagent/toxin/histamine/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustOxyLoss(2 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - affected_mob.adjustBruteLoss(2 * REM * seconds_per_tick, FALSE, FALSE, BODYTYPE_ORGANIC) - affected_mob.adjustToxLoss(2 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - ..() - . = TRUE + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustOxyLoss(2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjustBruteLoss(2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjustToxLoss(2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/toxin/formaldehyde name = "Formaldehyde" @@ -646,14 +650,13 @@ /datum/reagent/toxin/formaldehyde/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) if(liver && HAS_TRAIT(liver, TRAIT_CORONER_METABOLISM)) //mmmm, the forbidden pickle juice - affected_mob.adjustToxLoss(-1, FALSE, required_biotype = affected_biotype) //it counteracts its own toxin damage. - . = TRUE - return ..() + if(affected_mob.adjustToxLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) //it counteracts its own toxin damage. + return UPDATE_MOB_HEALTH + return else if(SPT_PROB(2.5, seconds_per_tick)) holder.add_reagent(/datum/reagent/toxin/histamine, pick(5,15)) holder.remove_reagent(/datum/reagent/toxin/formaldehyde, 1.2) - else - return ..() + return ..() /datum/reagent/toxin/venom name = "Venom" @@ -670,20 +673,23 @@ var/newsize = 1.1 * RESIZE_DEFAULT_SIZE affected_mob.update_transform(newsize/current_size) current_size = newsize - toxpwr = 0.1 * volume - affected_mob.adjustBruteLoss((0.3 * volume) * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - . = TRUE + + if(affected_mob.adjustBruteLoss((0.3 * volume) * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype)) + . = UPDATE_MOB_HEALTH + + // chance to either decay into histamine or go the normal route of toxin metabolization if(SPT_PROB(8, seconds_per_tick)) + current_cycle++ holder.add_reagent(/datum/reagent/toxin/histamine, pick(5, 10)) holder.remove_reagent(/datum/reagent/toxin/venom, 1.1) else - ..() + return ..() || . /datum/reagent/toxin/venom/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() affected_mob.update_transform(RESIZE_DEFAULT_SIZE/current_size) current_size = RESIZE_DEFAULT_SIZE - ..() /datum/reagent/toxin/fentanyl name = "Fentanyl" @@ -699,15 +705,17 @@ addiction_types = list(/datum/addiction/opioids = 25) /datum/reagent/toxin/fentanyl/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3 * REM * normalise_creation_purity() * seconds_per_tick, 150) + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3 * REM * normalise_creation_purity() * seconds_per_tick, 150) if(affected_mob.toxloss <= 60) - affected_mob.adjustToxLoss(1 * REM * normalise_creation_purity() * seconds_per_tick, FALSE, required_biotype = affected_biotype) - if(current_cycle >= 4) + need_mob_update += affected_mob.adjustToxLoss(1 * REM * normalise_creation_purity() * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + if(current_cycle > 4) affected_mob.add_mood_event("smacked out", /datum/mood_event/narcotic_heavy, name) - if(current_cycle >= 18) + if(current_cycle > 18) affected_mob.Sleeping(40 * REM * normalise_creation_purity() * seconds_per_tick) - ..() - return TRUE + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/toxin/cyanide name = "Cyanide" @@ -722,13 +730,17 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/cyanide/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + var/need_mob_update = FALSE if(SPT_PROB(2.5, seconds_per_tick)) affected_mob.losebreath += 1 + need_mob_update = TRUE if(SPT_PROB(4, seconds_per_tick)) to_chat(affected_mob, span_danger("You feel horrendously weak!")) affected_mob.Stun(40) - affected_mob.adjustToxLoss(2*REM * normalise_creation_purity(), FALSE, required_biotype = affected_biotype) - return ..() + need_mob_update += affected_mob.adjustToxLoss(2*REM * normalise_creation_purity(), updating_health = FALSE, required_biotype = affected_biotype) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/toxin/bad_food name = "Bad Food" @@ -755,23 +767,26 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/itching_powder/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + var/need_mob_update = FALSE if(SPT_PROB(8, seconds_per_tick)) to_chat(affected_mob, span_danger("You scratch at your head.")) - affected_mob.adjustBruteLoss(0.2*REM, FALSE, required_bodytype = affected_bodytype) - . = TRUE + need_mob_update += affected_mob.adjustBruteLoss(0.2*REM, FALSE, required_bodytype = affected_bodytype) if(SPT_PROB(8, seconds_per_tick)) to_chat(affected_mob, span_danger("You scratch at your leg.")) - affected_mob.adjustBruteLoss(0.2*REM, FALSE, required_bodytype = affected_bodytype) - . = TRUE + need_mob_update += affected_mob.adjustBruteLoss(0.2*REM, FALSE, required_bodytype = affected_bodytype) if(SPT_PROB(8, seconds_per_tick)) to_chat(affected_mob, span_danger("You scratch at your arm.")) - affected_mob.adjustBruteLoss(0.2*REM, FALSE, required_bodytype = affected_bodytype) - . = TRUE + need_mob_update += affected_mob.adjustBruteLoss(0.2*REM, FALSE, required_bodytype = affected_bodytype) + + if(need_mob_update) + . = UPDATE_MOB_HEALTH + if(SPT_PROB(1.5, seconds_per_tick)) holder.add_reagent(/datum/reagent/toxin/histamine,rand(1,3)) holder.remove_reagent(/datum/reagent/toxin/itching_powder,1.2) return - ..() + else + return ..() || . /datum/reagent/toxin/initropidril name = "Initropidril" @@ -784,16 +799,17 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/toxin/initropidril/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(13, seconds_per_tick)) var/picked_option = rand(1,3) + var/need_mob_update switch(picked_option) if(1) affected_mob.Paralyze(60) - . = TRUE if(2) affected_mob.losebreath += 10 - affected_mob.adjustOxyLoss(rand(5,25), FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - . = TRUE + affected_mob.adjustOxyLoss(rand(5,25), updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update = TRUE if(3) if(!affected_mob.undergoing_cardiac_arrest() && affected_mob.can_heartattack()) affected_mob.set_heartattack(TRUE) @@ -801,9 +817,9 @@ affected_mob.visible_message(span_userdanger("[affected_mob] clutches at [affected_mob.p_their()] chest as if [affected_mob.p_their()] heart stopped!")) else affected_mob.losebreath += 10 - affected_mob.adjustOxyLoss(rand(5,25), FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - . = TRUE - return ..() || . + need_mob_update = affected_mob.adjustOxyLoss(rand(5,25), updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/toxin/pancuronium name = "Pancuronium" @@ -817,12 +833,12 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/toxin/pancuronium/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - if(current_cycle >= 10) + . = ..() + if(current_cycle > 10) affected_mob.Stun(40 * REM * seconds_per_tick) - . = TRUE if(SPT_PROB(10, seconds_per_tick)) affected_mob.losebreath += 4 - ..() + return UPDATE_MOB_HEALTH /datum/reagent/toxin/sodium_thiopental name = "Sodium Thiopental" @@ -843,11 +859,11 @@ REMOVE_TRAIT(affected_mob, TRAIT_ANTICONVULSANT, name) /datum/reagent/toxin/sodium_thiopental/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - if(current_cycle >= 10) + . = ..() + if(current_cycle > 10) affected_mob.Sleeping(40 * REM * seconds_per_tick) - affected_mob.adjustStaminaLoss(10 * REM * seconds_per_tick, 0) - ..() - return TRUE + if(affected_mob.adjustStaminaLoss(10 * REM * seconds_per_tick, updating_stamina = FALSE)) + return UPDATE_MOB_HEALTH /datum/reagent/toxin/sulfonal name = "Sulfonal" @@ -863,9 +879,9 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/sulfonal/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - if(current_cycle >= 22) + . = ..() + if(current_cycle > 22) affected_mob.Sleeping(40 * REM * normalise_creation_purity() * seconds_per_tick) - return ..() /datum/reagent/toxin/amanitin name = "Amanitin" @@ -879,13 +895,13 @@ var/delayed_toxin_damage = 0 /datum/reagent/toxin/amanitin/on_mob_life(mob/living/affected_mob, seconds_per_tick, times_fired) - delayed_toxin_damage += (seconds_per_tick * 3) . = ..() + delayed_toxin_damage += (seconds_per_tick * 3) /datum/reagent/toxin/amanitin/on_mob_delete(mob/living/affected_mob) + . = ..() affected_mob.log_message("has taken [delayed_toxin_damage] toxin damage from amanitin toxin", LOG_ATTACK) affected_mob.adjustToxLoss(delayed_toxin_damage, required_biotype = affected_biotype) - . = ..() /datum/reagent/toxin/lipolicide name = "Lipolicide" @@ -903,12 +919,12 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/lipolicide/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(affected_mob.nutrition <= NUTRITION_LEVEL_STARVING) - affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - . = TRUE + if(affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + . = UPDATE_MOB_HEALTH affected_mob.adjust_nutrition(-3 * REM * normalise_creation_purity() * seconds_per_tick) // making the chef more valuable, one meme trap at a time affected_mob.overeatduration = 0 - return ..() || . /datum/reagent/toxin/coniine name = "Coniine" @@ -920,9 +936,10 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/coniine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(affected_mob.losebreath < 5) affected_mob.losebreath = min(affected_mob.losebreath + 5 * REM * seconds_per_tick, 5) - return ..() + return UPDATE_MOB_HEALTH /datum/reagent/toxin/spewium name = "Spewium" @@ -936,8 +953,9 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/toxin/spewium/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - .=..() - if(current_cycle >= 11 && SPT_PROB(min(30, current_cycle), seconds_per_tick)) + . = ..() + if(current_cycle > 11 && SPT_PROB(min(31, current_cycle), seconds_per_tick)) + affected_mob.vomit(10, prob(10), prob(50), rand(0,4), TRUE) var/constructed_flags = (MOB_VOMIT_MESSAGE | MOB_VOMIT_HARM) if(prob(10)) constructed_flags |= MOB_VOMIT_BLOOD @@ -950,7 +968,7 @@ /datum/reagent/toxin/spewium/overdose_process(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - if(current_cycle >= 33 && SPT_PROB(7.5, seconds_per_tick)) + if(current_cycle > 33 && SPT_PROB(7.5, seconds_per_tick)) affected_mob.spew_organ() affected_mob.vomit(VOMIT_CATEGORY_BLOOD, lost_nutrition = 0, distance = 4) to_chat(affected_mob, span_userdanger("You feel something lumpy come up as you vomit.")) @@ -965,11 +983,11 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/toxin/curare/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - if(current_cycle >= 11) + . = ..() + if(current_cycle > 11) affected_mob.Paralyze(60 * REM * seconds_per_tick) - affected_mob.adjustOxyLoss(0.5*REM*seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - . = TRUE - ..() + if(affected_mob.adjustOxyLoss(0.5*REM*seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type)) + return UPDATE_MOB_HEALTH /datum/reagent/toxin/heparin //Based on a real-life anticoagulant. I'm not a doctor, so this won't be realistic. name = "Heparin" @@ -990,12 +1008,12 @@ return ..() /datum/reagent/toxin/heparin/on_mob_metabolize(mob/living/affected_mob) + . = ..() ADD_TRAIT(affected_mob, TRAIT_BLOODY_MESS, /datum/reagent/toxin/heparin) - return ..() /datum/reagent/toxin/heparin/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() REMOVE_TRAIT(affected_mob, TRAIT_BLOODY_MESS, /datum/reagent/toxin/heparin) - return ..() /datum/reagent/toxin/rotatium //Rotatium. Fucks up your rotation and is hilarious name = "Rotatium" @@ -1012,6 +1030,7 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/rotatium/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(affected_mob.hud_used) if(current_cycle >= 20 && (current_cycle % 20) == 0) var/atom/movable/plane_master_controller/pm_controller = affected_mob.hud_used.plane_master_controllers[PLANE_MASTERS_GAME] @@ -1020,14 +1039,13 @@ for(var/atom/movable/screen/plane_master/plane as anything in pm_controller.get_planes()) animate(plane, transform = matrix(rotation, MATRIX_ROTATE), time = 5, easing = QUAD_EASING, loop = -1) animate(transform = matrix(-rotation, MATRIX_ROTATE), time = 5, easing = QUAD_EASING) - return ..() /datum/reagent/toxin/rotatium/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() if(affected_mob?.hud_used) var/atom/movable/plane_master_controller/pm_controller = affected_mob.hud_used.plane_master_controllers[PLANE_MASTERS_GAME] for(var/atom/movable/screen/plane_master/plane as anything in pm_controller.get_planes()) animate(plane, transform = matrix(), time = 5, easing = QUAD_EASING) - ..() /datum/reagent/toxin/anacea name = "Anacea" @@ -1045,13 +1063,12 @@ var/remove_amt = 5 if(holder.has_reagent(/datum/reagent/medicine/calomel) || holder.has_reagent(/datum/reagent/medicine/pen_acid)) remove_amt = 0.5 + . = ..() for(var/datum/reagent/medicine/R in affected_mob.reagents.reagent_list) affected_mob.reagents.remove_reagent(R.type, remove_amt * REM * normalise_creation_purity() * seconds_per_tick) - return ..() //ACID - /datum/reagent/toxin/acid name = "Sulfuric Acid" description = "A strong mineral acid with the molecular formula H2SO4." @@ -1115,9 +1132,9 @@ mytray.adjust_weedlevel(-rand(1,4)) /datum/reagent/toxin/acid/fluacid/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustFireLoss((current_cycle/15) * REM * normalise_creation_purity() * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) - . = TRUE - ..() + . = ..() + if(affected_mob.adjustFireLoss(((current_cycle-1)/15) * REM * normalise_creation_purity() * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype)) + return UPDATE_MOB_HEALTH /datum/reagent/toxin/acid/nitracid name = "Nitric Acid" @@ -1131,9 +1148,9 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/acid/nitracid/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustFireLoss((volume/10) * REM * normalise_creation_purity() * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) //here you go nervar - . = TRUE - ..() + . = ..() + if(affected_mob.adjustFireLoss((volume/10) * REM * normalise_creation_purity() * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype)) //here you go nervar + return UPDATE_MOB_HEALTH /datum/reagent/toxin/delayed name = "Toxin Microcapsules" @@ -1143,17 +1160,18 @@ var/actual_metaboliztion_rate = REAGENTS_METABOLISM toxpwr = 0 var/actual_toxpwr = 5 - var/delay = 30 + var/delay = 31 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE /datum/reagent/toxin/delayed/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(current_cycle > delay) - holder.remove_reagent(type, actual_metaboliztion_rate * affected_mob.metabolism_efficiency * seconds_per_tick) - affected_mob.adjustToxLoss(actual_toxpwr * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) + if(holder) + holder.remove_reagent(type, actual_metaboliztion_rate * affected_mob.metabolism_efficiency * seconds_per_tick) + if(affected_mob.adjustToxLoss(actual_toxpwr * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + . = UPDATE_MOB_HEALTH if(SPT_PROB(5, seconds_per_tick)) affected_mob.Paralyze(20) - . = TRUE - ..() /datum/reagent/toxin/mimesbane name = "Mime's Bane" @@ -1168,9 +1186,11 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/mimesbane/on_mob_metabolize(mob/living/affected_mob) + . = ..() ADD_TRAIT(affected_mob, TRAIT_EMOTEMUTE, type) /datum/reagent/toxin/mimesbane/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() REMOVE_TRAIT(affected_mob, TRAIT_EMOTEMUTE, type) /datum/reagent/toxin/bonehurtingjuice //oof ouch @@ -1187,11 +1207,13 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/bonehurtingjuice/on_mob_add(mob/living/carbon/affected_mob) + . = ..() affected_mob.say("oof ouch my bones", forced = /datum/reagent/toxin/bonehurtingjuice) - return ..() /datum/reagent/toxin/bonehurtingjuice/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustStaminaLoss(7.5 * REM * seconds_per_tick, 0) + . = ..() + if(affected_mob.adjustStaminaLoss(7.5 * REM * seconds_per_tick, updating_stamina = FALSE)) + . = UPDATE_MOB_HEALTH if(SPT_PROB(10, seconds_per_tick)) switch(rand(1, 3)) if(1) @@ -1200,9 +1222,9 @@ affected_mob.manual_emote(pick("oofs silently.", "looks like [affected_mob.p_their()] bones hurt.", "grimaces, as though [affected_mob.p_their()] bones hurt.")) if(3) to_chat(affected_mob, span_warning("Your bones hurt!")) - return ..() || TRUE /datum/reagent/toxin/bonehurtingjuice/overdose_process(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(SPT_PROB(2, seconds_per_tick) && iscarbon(affected_mob)) //big oof var/selected_part = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) //God help you if the same limb gets picked twice quickly. var/obj/item/bodypart/BP = affected_mob.get_bodypart(selected_part) @@ -1210,11 +1232,11 @@ playsound(affected_mob, get_sfx(SFX_DESECRATION), 50, TRUE, -1) affected_mob.visible_message(span_warning("[affected_mob]'s bones hurt too much!!"), span_danger("Your bones hurt too much!!")) affected_mob.say("OOF!!", forced = /datum/reagent/toxin/bonehurtingjuice) - BP.receive_damage(20, 0, 200, wound_bonus = rand(30, 130)) + if(BP.receive_damage(brute = 20 * REM * seconds_per_tick, burn = 0, blocked = 200, updating_health = FALSE, wound_bonus = rand(30, 130))) + . = UPDATE_MOB_HEALTH else //SUCH A LUST FOR REVENGE!!! to_chat(affected_mob, span_warning("A phantom limb hurts!")) affected_mob.say("Why are we still here, just to suffer?", forced = /datum/reagent/toxin/bonehurtingjuice) - return ..() /datum/reagent/toxin/bungotoxin name = "Bungotoxin" @@ -1227,7 +1249,9 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/bungotoxin/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustOrganLoss(ORGAN_SLOT_HEART, 3 * REM * seconds_per_tick) + . = ..() + if(affected_mob.adjustOrganLoss(ORGAN_SLOT_HEART, 3 * REM * seconds_per_tick)) + . = UPDATE_MOB_HEALTH // If our mob's currently dizzy from anything else, we will also gain confusion var/mob_dizziness = affected_mob.get_timed_status_effect_duration(/datum/status_effect/confusion) @@ -1235,11 +1259,9 @@ // Gain confusion equal to about half the duration of our current dizziness affected_mob.set_confusion(mob_dizziness / 2) - if(current_cycle >= 12 && SPT_PROB(4, seconds_per_tick)) + if(current_cycle >= 13 && SPT_PROB(4, seconds_per_tick)) var/tox_message = pick("You feel your heart spasm in your chest.", "You feel faint.","You feel you need to catch your breath.","You feel a prickle of pain in your chest.") to_chat(affected_mob, span_notice("[tox_message]")) - . = TRUE - ..() /datum/reagent/toxin/leadacetate name = "Lead Acetate" @@ -1252,13 +1274,16 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/leadacetate/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - affected_mob.adjustOrganLoss(ORGAN_SLOT_EARS, 1 * REM * seconds_per_tick) - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1 * REM * seconds_per_tick) - . = TRUE + . = ..() + var/need_mob_update + need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_EARS, 1 * REM * seconds_per_tick) + need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1 * REM * seconds_per_tick) + if(need_mob_update) + . = UPDATE_MOB_HEALTH if(SPT_PROB(0.5, seconds_per_tick)) to_chat(affected_mob, span_notice("Ah, what was that? You thought you heard something...")) affected_mob.adjust_confusion(5 SECONDS) - return ..() || . + /datum/reagent/toxin/hunterspider name = "Spider Toxin" description = "A toxic chemical produced by spiders to weaken prey." @@ -1273,8 +1298,8 @@ liver_damage_multiplier = 0 /datum/reagent/toxin/viperspider/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() affected_mob.adjust_hallucinations(10 SECONDS * REM * seconds_per_tick) - return ..() /datum/reagent/toxin/tetrodotoxin name = "Tetrodotoxin" @@ -1294,10 +1319,12 @@ ) /datum/reagent/toxin/tetrodotoxin/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() //be ready for a cocktail of symptoms, including: //numbness, nausea, vomit, breath loss, weakness, paralysis and nerve damage/impairment and eventually a heart attack if enough time passes. + var/need_mob_update switch(current_cycle) - if(6 to 12) + if(7 to 13) if(SPT_PROB(20, seconds_per_tick)) affected_mob.set_jitter_if_lower(rand(2 SECONDS, 3 SECONDS) * REM * seconds_per_tick) if(SPT_PROB(5, seconds_per_tick)) @@ -1306,51 +1333,57 @@ to_chat(affected_mob, span_warning("your [tongue.name] feels numb...")) affected_mob.set_slurring_if_lower(5 SECONDS * REM * seconds_per_tick) affected_mob.adjust_disgust(3.5 * REM * seconds_per_tick) - if(12 to 20) + if(13 to 21) silent_toxin = FALSE toxpwr = 0.5 - affected_mob.adjustStaminaLoss(2.5 * REM * seconds_per_tick, 0) + need_mob_update = affected_mob.adjustStaminaLoss(2.5 * REM * seconds_per_tick, updating_stamina = FALSE) if(SPT_PROB(20, seconds_per_tick)) affected_mob.losebreath += 1 * REM * seconds_per_tick + need_mob_update = TRUE if(SPT_PROB(40, seconds_per_tick)) affected_mob.set_jitter_if_lower(rand(2 SECONDS, 3 SECONDS) * REM * seconds_per_tick) affected_mob.adjust_disgust(3 * REM * seconds_per_tick) affected_mob.set_slurring_if_lower(1 SECONDS * REM * seconds_per_tick) - affected_mob.adjustStaminaLoss(2 * REM * seconds_per_tick, 0) + affected_mob.adjustStaminaLoss(2 * REM * seconds_per_tick, updating_stamina = FALSE) if(SPT_PROB(4, seconds_per_tick)) paralyze_limb(affected_mob) + need_mob_update = TRUE if(SPT_PROB(10, seconds_per_tick)) affected_mob.adjust_confusion(rand(6 SECONDS, 8 SECONDS)) - if(20 to 28) + if(21 to 29) toxpwr = 1 - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.5) + need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.5) if(SPT_PROB(40, seconds_per_tick)) affected_mob.losebreath += 2 * REM * seconds_per_tick + need_mob_update = TRUE affected_mob.adjust_disgust(3 * REM * seconds_per_tick) affected_mob.set_slurring_if_lower(3 SECONDS * REM * seconds_per_tick) if(SPT_PROB(5, seconds_per_tick)) to_chat(affected_mob, span_danger("you feel horribly weak.")) - affected_mob.adjustStaminaLoss(5 * REM * seconds_per_tick, 0) + need_mob_update += affected_mob.adjustStaminaLoss(5 * REM * seconds_per_tick, updating_stamina = FALSE) if(SPT_PROB(8, seconds_per_tick)) paralyze_limb(affected_mob) + need_mob_update = TRUE if(SPT_PROB(10, seconds_per_tick)) affected_mob.adjust_confusion(rand(6 SECONDS, 8 SECONDS)) - if(28 to INFINITY) + if(29 to INFINITY) toxpwr = 1.5 - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1, BRAIN_DAMAGE_DEATH) + need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1, BRAIN_DAMAGE_DEATH) affected_mob.set_silence_if_lower(3 SECONDS * REM * seconds_per_tick) - affected_mob.adjustStaminaLoss(5 * REM * seconds_per_tick, 0) + need_mob_update += affected_mob.adjustStaminaLoss(5 * REM * seconds_per_tick, updating_stamina = FALSE) affected_mob.adjust_disgust(2 * REM * seconds_per_tick) if(SPT_PROB(15, seconds_per_tick)) paralyze_limb(affected_mob) + need_mob_update = TRUE if(SPT_PROB(10, seconds_per_tick)) affected_mob.adjust_confusion(rand(6 SECONDS, 8 SECONDS)) - if(current_cycle >= 38 && !length(traits_not_applied) && SPT_PROB(5, seconds_per_tick) && !affected_mob.undergoing_cardiac_arrest()) + if(current_cycle > 38 && !length(traits_not_applied) && SPT_PROB(5, seconds_per_tick) && !affected_mob.undergoing_cardiac_arrest()) affected_mob.set_heartattack(TRUE) to_chat(affected_mob, span_danger("you feel a burning pain spread throughout your chest, oh no...")) - return ..() + if(need_mob_update) + return UPDATE_MOB_HEALTH /datum/reagent/toxin/tetrodotoxin/proc/paralyze_limb(mob/living/affected_mob) if(!length(traits_not_applied)) @@ -1360,9 +1393,11 @@ traits_not_applied -= added_trait /datum/reagent/toxin/tetrodotoxin/on_mob_metabolize(mob/living/affected_mob) + . = ..() RegisterSignal(affected_mob, COMSIG_CARBON_ATTEMPT_BREATHE, PROC_REF(block_breath)) /datum/reagent/toxin/tetrodotoxin/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() UnregisterSignal(affected_mob, COMSIG_CARBON_ATTEMPT_BREATHE, PROC_REF(block_breath)) // the initial() proc doesn't work for lists. var/list/initial_list = list( @@ -1376,5 +1411,5 @@ /datum/reagent/toxin/tetrodotoxin/proc/block_breath(mob/living/source) SIGNAL_HANDLER - if(current_cycle >= 28) + if(current_cycle > 28) return COMSIG_CARBON_BLOCK_BREATH diff --git a/code/modules/reagents/chemistry/reagents/unique/eigenstasium.dm b/code/modules/reagents/chemistry/reagents/unique/eigenstasium.dm index 70db3446060..73dcf8aa60b 100644 --- a/code/modules/reagents/chemistry/reagents/unique/eigenstasium.dm +++ b/code/modules/reagents/chemistry/reagents/unique/eigenstasium.dm @@ -77,21 +77,21 @@ return ..() /datum/reagent/eigenstate/on_mob_life(mob/living/carbon/living_mob) + . = ..() if(prob(20)) do_sparks(5,FALSE,living_mob) - return ..() - /datum/reagent/eigenstate/on_mob_delete(mob/living/living_mob) //returns back to original location + . = ..() do_sparks(5,FALSE,living_mob) to_chat(living_mob, span_userdanger("You feel strangely whole again.")) if(!living_mob.reagents.has_reagent(/datum/reagent/stabilizing_agent)) do_teleport(living_mob, location_return, 0, asoundin = 'sound/effects/phasein.ogg') //Teleports home do_sparks(5,FALSE,living_mob) qdel(eigenstate) - return ..() /datum/reagent/eigenstate/overdose_start(mob/living/living_mob) //Overdose, makes you teleport randomly + . = ..() to_chat(living_mob, span_userdanger("You feel like your perspective is being ripped apart as you begin flitting in and out of reality!")) living_mob.set_jitter_if_lower(40 SECONDS) metabolization_rate += 0.5 //So you're not stuck forever teleporting. @@ -101,10 +101,10 @@ return ..() /datum/reagent/eigenstate/overdose_process(mob/living/living_mob) //Overdose, makes you teleport randomly + . = ..() do_sparks(5, FALSE, living_mob) do_teleport(living_mob, get_turf(living_mob), 10, asoundin = 'sound/effects/phasein.ogg') do_sparks(5, FALSE, living_mob) - return ..() //FOR ADDICTION-LIKE EFFECTS, SEE datum/status_effect/eigenstasium diff --git a/code/modules/religion/religion_sects.dm b/code/modules/religion/religion_sects.dm index 9075a656ae9..ebd90388fda 100644 --- a/code/modules/religion/religion_sects.dm +++ b/code/modules/religion/religion_sects.dm @@ -115,7 +115,7 @@ if(hurt_limbs.len) for(var/X in hurt_limbs) var/obj/item/bodypart/affecting = X - if(affecting.heal_damage(heal_amt, heal_amt, BODYTYPE_ORGANIC)) + if(affecting.heal_damage(heal_amt, heal_amt, required_bodytype = BODYTYPE_ORGANIC)) blessed.update_damage_overlays() blessed.visible_message(span_notice("[chap] heals [blessed] with the power of [GLOB.deity]!")) to_chat(blessed, span_boldnotice("May the power of [GLOB.deity] compel you to be healed!")) @@ -272,7 +272,7 @@ var/list/hurt_limbs = blessed.get_damaged_bodyparts(1, 1, BODYTYPE_ORGANIC) if(hurt_limbs.len) for(var/obj/item/bodypart/affecting as anything in hurt_limbs) - if(affecting.heal_damage(heal_amt, heal_amt, BODYTYPE_ORGANIC)) + if(affecting.heal_damage(heal_amt, heal_amt, required_bodytype = BODYTYPE_ORGANIC)) blessed.update_damage_overlays() blessed.visible_message(span_notice("[chap] barters a heal for [blessed] from [GLOB.deity]!")) to_chat(blessed, span_boldnotice("May the power of [GLOB.deity] compel you to be healed! Thank you for choosing [GLOB.deity]!")) diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm index 5c6ff3c811a..6d4d6a7b272 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -173,10 +173,13 @@ alert_type = /atom/movable/screen/alert/status_effect/clone_decay /datum/status_effect/slime_clone_decay/tick(seconds_between_ticks) - owner.adjustToxLoss(1, 0) - owner.adjustOxyLoss(1, 0) - owner.adjustBruteLoss(1, 0) - owner.adjustFireLoss(1, 0) + var/need_mob_update + need_mob_update = owner.adjustToxLoss(1, updating_health = FALSE) + need_mob_update += owner.adjustOxyLoss(1, updating_health = FALSE) + need_mob_update += owner.adjustBruteLoss(1, updating_health = FALSE) + need_mob_update += owner.adjustFireLoss(1, updating_health = FALSE) + if(need_mob_update) + owner.updatehealth() owner.color = "#007BA7" /atom/movable/screen/alert/status_effect/bloodchill @@ -505,20 +508,24 @@ /datum/status_effect/stabilized/purple/tick(seconds_between_ticks) healed_last_tick = FALSE + var/need_mob_update = FALSE if(owner.getBruteLoss() > 0) - owner.adjustBruteLoss(-0.2) + need_mob_update += owner.adjustBruteLoss(-0.2, updating_health = FALSE) healed_last_tick = TRUE if(owner.getFireLoss() > 0) - owner.adjustFireLoss(-0.2) + need_mob_update += owner.adjustFireLoss(-0.2, updating_health = FALSE) healed_last_tick = TRUE if(owner.getToxLoss() > 0) // Forced, so slimepeople are healed as well. - owner.adjustToxLoss(-0.2, forced = TRUE) + need_mob_update += owner.adjustToxLoss(-0.2, updating_health = FALSE, forced = TRUE) healed_last_tick = TRUE + if(need_mob_update) + owner.updatehealth() + // Technically, "healed this tick" by now. if(healed_last_tick) new /obj/effect/temp_visual/heal(get_turf(owner), "#FF0000") diff --git a/code/modules/research/xenobiology/crossbreeding/consuming.dm b/code/modules/research/xenobiology/crossbreeding/consuming.dm index 007bacf8bb7..ec90edd6550 100644 --- a/code/modules/research/xenobiology/crossbreeding/consuming.dm +++ b/code/modules/research/xenobiology/crossbreeding/consuming.dm @@ -120,12 +120,15 @@ Consuming extracts: taste = "fruit jam and cough medicine" /obj/item/slime_cookie/purple/do_effect(mob/living/M, mob/user) - M.adjustBruteLoss(-5) - M.adjustFireLoss(-5) - M.adjustToxLoss(-5, forced=1) //To heal slimepeople. - M.adjustOxyLoss(-5) - M.adjustCloneLoss(-5) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -5) + var/need_mob_update = FALSE + need_mob_update += M.adjustBruteLoss(-5, updating_health = FALSE) + need_mob_update += M.adjustFireLoss(-5, updating_health = FALSE) + need_mob_update += M.adjustToxLoss(-5, updating_health = FALSE, forced = TRUE) //To heal slimepeople. + need_mob_update += M.adjustOxyLoss(-5, updating_health = FALSE) + need_mob_update += M.adjustCloneLoss(-5, updating_health = FALSE) + need_mob_update += M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -5) + if(need_mob_update) + M.updatehealth() /obj/item/slimecross/consuming/blue colour = SLIME_TYPE_BLUE diff --git a/code/modules/spells/spell_types/self/basic_heal.dm b/code/modules/spells/spell_types/self/basic_heal.dm index 135b8094206..f68403ddeeb 100644 --- a/code/modules/spells/spell_types/self/basic_heal.dm +++ b/code/modules/spells/spell_types/self/basic_heal.dm @@ -26,5 +26,8 @@ span_warning("A wreath of gentle light passes over [cast_on]!"), span_notice("You wreath yourself in healing light!"), ) - cast_on.adjustBruteLoss(-brute_to_heal, FALSE) - cast_on.adjustFireLoss(-burn_to_heal) + var/need_mob_update = FALSE + need_mob_update += cast_on.adjustBruteLoss(-brute_to_heal, updating_health = FALSE) + need_mob_update += cast_on.adjustFireLoss(-burn_to_heal, updating_health = FALSE) + if(need_mob_update) + cast_on.updatehealth() diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index c6d0f25cb4c..61a23a81a41 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -215,7 +215,6 @@ wound_resistance = reset_fantasy_variable("wound_resistance", wound_resistance) return ..() - /obj/item/bodypart/Initialize(mapload) . = ..() if(can_be_disabled) @@ -349,7 +348,6 @@ var/stuck_word = embedded_thing.isEmbedHarmless() ? "stuck" : "embedded" check_list += "\t There is \a [embedded_thing] [stuck_word] in your [name]!" - /obj/item/bodypart/blob_act() receive_damage(max_damage, wound_bonus = CANT_WOUND) @@ -456,15 +454,15 @@ * attack_direction - The direction the bodypart is attacked from, used to send blood flying in the opposite direction. * damage_source - The source of damage, typically a weapon. */ -/obj/item/bodypart/proc/receive_damage(brute = 0, burn = 0, blocked = 0, updating_health = TRUE, required_bodytype = null, wound_bonus = 0, bare_wound_bonus = 0, sharpness = NONE, attack_direction = null, damage_source) +/obj/item/bodypart/proc/receive_damage(brute = 0, burn = 0, blocked = 0, updating_health = TRUE, forced = FALSE, required_bodytype = null, wound_bonus = 0, bare_wound_bonus = 0, sharpness = NONE, attack_direction = null, damage_source) SHOULD_CALL_PARENT(TRUE) var/hit_percent = (100-blocked)/100 if((!brute && !burn) || hit_percent <= 0) return FALSE - if(owner && (owner.status_flags & GODMODE)) + if(!forced && owner && (owner.status_flags & GODMODE)) return FALSE //godmode - if(required_bodytype && !(bodytype & required_bodytype)) + if(!forced && required_bodytype && !(bodytype & required_bodytype)) return FALSE var/dmg_multi = CONFIG_GET(number/damage_multiplier) * hit_percent @@ -649,10 +647,10 @@ //Heals brute and burn damage for the organ. Returns 1 if the damage-icon states changed at all. //Damage cannot go below zero. //Cannot remove negative damage (i.e. apply damage) -/obj/item/bodypart/proc/heal_damage(brute, burn, required_bodytype, updating_health = TRUE) +/obj/item/bodypart/proc/heal_damage(brute, burn, updating_health = TRUE, forced = FALSE, required_bodytype) SHOULD_CALL_PARENT(TRUE) - if(required_bodytype && !(bodytype & required_bodytype)) //So we can only heal certain kinds of limbs, ie robotic vs organic. + if(!forced && required_bodytype && !(bodytype & required_bodytype)) //So we can only heal certain kinds of limbs, ie robotic vs organic. return if(brute) @@ -674,7 +672,6 @@ cremation_progress = min(0, cremation_progress - ((brute_dam + burn_dam)*(100/max_damage))) return update_bodypart_damage_state() - ///Sets the damage of a bodypart when it is created. /obj/item/bodypart/proc/set_initial_damage(brute_damage, burn_damage) set_brute_dam(brute_damage) @@ -689,7 +686,6 @@ . = brute_dam brute_dam = new_value - ///Proc to hook behavior associated to the change of the burn_dam variable's value. /obj/item/bodypart/proc/set_burn_dam(new_value) PROTECTED_PROC(TRUE) @@ -701,8 +697,7 @@ //Returns total damage. /obj/item/bodypart/proc/get_damage() - var/total = brute_dam + burn_dam - return total + return brute_dam + burn_dam //Checks disabled status thresholds /obj/item/bodypart/proc/update_disabled() @@ -745,7 +740,6 @@ last_maxed = FALSE set_disabled(FALSE) - ///Proc to change the value of the `disabled` variable and react to the event of its change. /obj/item/bodypart/proc/set_disabled(new_disabled) SHOULD_CALL_PARENT(TRUE) @@ -761,7 +755,6 @@ owner.update_health_hud() //update the healthdoll owner.update_body() - ///Proc to change the value of the `owner` variable and react to the event of its change. /obj/item/bodypart/proc/set_owner(new_owner) SHOULD_CALL_PARENT(TRUE) @@ -855,7 +848,6 @@ )) set_disabled(FALSE) - ///Called when TRAIT_PARALYSIS is added to the limb. /obj/item/bodypart/proc/on_paralysis_trait_gain(obj/item/bodypart/source) PROTECTED_PROC(TRUE) @@ -864,7 +856,6 @@ if(can_be_disabled) set_disabled(TRUE) - ///Called when TRAIT_PARALYSIS is removed from the limb. /obj/item/bodypart/proc/on_paralysis_trait_loss(obj/item/bodypart/source) PROTECTED_PROC(TRUE) @@ -873,7 +864,6 @@ if(can_be_disabled) update_disabled() - ///Called when TRAIT_NOLIMBDISABLE is added to the owner. /obj/item/bodypart/proc/on_owner_nolimbdisable_trait_gain(mob/living/carbon/source) PROTECTED_PROC(TRUE) @@ -881,7 +871,6 @@ set_can_be_disabled(FALSE) - ///Called when TRAIT_NOLIMBDISABLE is removed from the owner. /obj/item/bodypart/proc/on_owner_nolimbdisable_trait_loss(mob/living/carbon/source) PROTECTED_PROC(TRUE) diff --git a/code/modules/surgery/organs/_organ.dm b/code/modules/surgery/organs/_organ.dm index 632e4c8b511..0c4b72ff551 100644 --- a/code/modules/surgery/organs/_organ.dm +++ b/code/modules/surgery/organs/_organ.dm @@ -267,17 +267,18 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) /obj/item/organ/item_action_slot_check(slot,mob/user) return //so we don't grant the organ's action to mobs who pick up the organ. -///Adjusts an organ's damage by the amount "damage_amount", up to a maximum amount, which is by default max damage +///Adjusts an organ's damage by the amount "damage_amount", up to a maximum amount, which is by default max damage. Returns the net change in organ damage. /obj/item/organ/proc/apply_organ_damage(damage_amount, maximum = maxHealth, required_organ_flag = NONE) //use for damaging effects if(!damage_amount) //Micro-optimization. - return + return FALSE maximum = clamp(maximum, 0, maxHealth) // the logical max is, our max if(maximum < damage) - return + return FALSE if(required_organ_flag && !(organ_flags & required_organ_flag)) - return + return FALSE damage = clamp(damage + damage_amount, 0, maximum) - var/mess = check_damage_thresholds(owner) + . = (prev_damage - damage) // return net damage + var/message = check_damage_thresholds(owner) prev_damage = damage if(damage >= maxHealth) @@ -285,8 +286,8 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) else organ_flags &= ~ORGAN_FAILING - if(mess && owner && owner.stat <= SOFT_CRIT) - to_chat(owner, mess) + if(message && owner && owner.stat <= SOFT_CRIT) + to_chat(owner, message) ///SETS an organ's damage to the amount "damage_amount", and in doing so clears or sets the failing flag, good for when you have an effect that should fix an organ if broken /obj/item/organ/proc/set_organ_damage(damage_amount, required_organ_flag = NONE) //use mostly for admin heals diff --git a/code/modules/surgery/organs/internal/appendix/_appendix.dm b/code/modules/surgery/organs/internal/appendix/_appendix.dm index a52479c10a7..bb02c8b9ef9 100644 --- a/code/modules/surgery/organs/internal/appendix/_appendix.dm +++ b/code/modules/surgery/organs/internal/appendix/_appendix.dm @@ -34,7 +34,7 @@ if(organ_flags & ORGAN_FAILING) // forced to ensure people don't use it to gain tox as slime person - owner.adjustToxLoss(2 * seconds_per_tick, updating_health = TRUE, forced = TRUE) + owner.adjustToxLoss(2 * seconds_per_tick, forced = TRUE) else if(inflamation_stage) inflamation(seconds_per_tick) else if(SPT_PROB(APPENDICITIS_PROB, seconds_per_tick)) @@ -62,7 +62,7 @@ to_chat(organ_owner, span_warning("You feel a stabbing pain in your abdomen!")) organ_owner.adjustOrganLoss(ORGAN_SLOT_APPENDIX, 5) organ_owner.Stun(rand(40, 60)) - organ_owner.adjustToxLoss(1, updating_health = TRUE, forced = TRUE) + organ_owner.adjustToxLoss(1, forced = TRUE) if(3) if(SPT_PROB(0.5, seconds_per_tick)) organ_owner.vomit(VOMIT_CATEGORY_DEFAULT, lost_nutrition = 95) diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_chest.dm b/code/modules/surgery/organs/internal/cyberimp/augments_chest.dm index 60322a7f8d6..86dacdd98ff 100644 --- a/code/modules/surgery/organs/internal/cyberimp/augments_chest.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_chest.dm @@ -77,18 +77,21 @@ /obj/item/organ/internal/cyberimp/chest/reviver/proc/heal() + var/need_mob_update = FALSE if(owner.getOxyLoss()) - owner.adjustOxyLoss(-5) + need_mob_update += owner.adjustOxyLoss(-5, updating_health = FALSE) revive_cost += 5 if(owner.getBruteLoss()) - owner.adjustBruteLoss(-2) + need_mob_update += owner.adjustBruteLoss(-2, updating_health = FALSE) revive_cost += 40 if(owner.getFireLoss()) - owner.adjustFireLoss(-2) + need_mob_update += owner.adjustFireLoss(-2, updating_health = FALSE) revive_cost += 40 if(owner.getToxLoss()) - owner.adjustToxLoss(-1) + need_mob_update += owner.adjustToxLoss(-1, updating_health = FALSE) revive_cost += 40 + if(need_mob_update) + owner.updatehealth() /obj/item/organ/internal/cyberimp/chest/reviver/emp_act(severity) . = ..() diff --git a/code/modules/surgery/organs/internal/eyes/_eyes.dm b/code/modules/surgery/organs/internal/eyes/_eyes.dm index aca812a6186..05f532ae444 100644 --- a/code/modules/surgery/organs/internal/eyes/_eyes.dm +++ b/code/modules/surgery/organs/internal/eyes/_eyes.dm @@ -187,7 +187,7 @@ /obj/item/organ/internal/eyes/apply_organ_damage(damage_amount, maximum = maxHealth, required_organ_flag) . = ..() if(!owner) - return + return FALSE apply_damaged_eye_effects() /// Applies effects to our owner based on how damaged our eyes are diff --git a/code/modules/surgery/organs/internal/liver/liver_skeleton.dm b/code/modules/surgery/organs/internal/liver/liver_skeleton.dm index f9b41741b4a..b57afd245f5 100644 --- a/code/modules/surgery/organs/internal/liver/liver_skeleton.dm +++ b/code/modules/surgery/organs/internal/liver/liver_skeleton.dm @@ -19,8 +19,8 @@ if((. & COMSIG_MOB_STOP_REAGENT_CHECK) || (organ_flags & ORGAN_FAILING)) return if(istype(chem, /datum/reagent/toxin/bonehurtingjuice)) - organ_owner.adjustStaminaLoss(7.5 * REM * seconds_per_tick, 0) - organ_owner.adjustBruteLoss(0.5 * REM * seconds_per_tick, 0) + organ_owner.adjustStaminaLoss(7.5 * REM * seconds_per_tick, updating_stamina = FALSE) + organ_owner.adjustBruteLoss(0.5 * REM * seconds_per_tick, updating_health = FALSE) if(SPT_PROB(10, seconds_per_tick)) switch(rand(1, 3)) if(1) diff --git a/code/modules/surgery/organs/internal/tongue/_tongue.dm b/code/modules/surgery/organs/internal/tongue/_tongue.dm index 08ee3d20faf..03b223b4298 100644 --- a/code/modules/surgery/organs/internal/tongue/_tongue.dm +++ b/code/modules/surgery/organs/internal/tongue/_tongue.dm @@ -154,7 +154,7 @@ /obj/item/organ/internal/tongue/apply_organ_damage(damage_amount, maximum = maxHealth, required_organ_flag) . = ..() if(!owner) - return + return FALSE apply_tongue_effects() /// Applies effects to our owner based on how damaged our tongue is diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index 20ca34d5259..e05c2516045 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -175,6 +175,7 @@ #include "metabolizing.dm" #include "mindbound_actions.dm" #include "missing_icons.dm" +#include "mob_damage.dm" #include "mob_faction.dm" #include "mob_spawn.dm" #include "modify_fantasy_variable.dm" diff --git a/code/modules/unit_tests/mob_damage.dm b/code/modules/unit_tests/mob_damage.dm new file mode 100644 index 00000000000..3d257e0f775 --- /dev/null +++ b/code/modules/unit_tests/mob_damage.dm @@ -0,0 +1,539 @@ +/// Tests to make sure mob damage procs are working correctly +/datum/unit_test/mob_damage + priority = TEST_LONGER + +/datum/unit_test/mob_damage/Destroy() + SSmobs.ignite() + return ..() + +/datum/unit_test/mob_damage/Run() + SSmobs.pause() + var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent) + dummy.maxHealth = 200 // tank mode + + /* The sanity tests: here we make sure that: + 1) That damage procs are returning the expected values. They should be returning the actual amount of damage taken/healed. + (Negative values mean damage was taken, positive mean healing) + 2) Verifying that the damage has been accurately applied to the mob afterwards. */ + + test_sanity_simple(dummy) + test_sanity_complex(dummy) + + // Testing if biotypes are working as intended + test_biotypes(dummy) + + // Testing whether or not TRAIT_NOBREATH is working as intended + test_nobreath(dummy) + + // Testing whether or not TRAIT_TOXINLOVER and TRAIT_TOXIMMUNE are working as intended + test_toxintraits(dummy) + + // Testing whether or not TRAIT_NOCLONELOSS is working as intended + test_nocloneloss(dummy) + + // Testing the proc ordered_healing() + test_ordered_healing(dummy) + + // testing with godmode enabled + test_godmode(dummy) + +/** + * Check that the mob has a specific amount of damage + * + * By default this checks that the mob has of every type of damage. + * Arguments: + * * testing_mob - the mob to check the damage of + * * amount - the amount of damage to verify that the mob has + * * included_types - Bitflag of damage types to check. + */ +/datum/unit_test/mob_damage/proc/verify_damage(mob/living/testing_mob, amount, included_types = ALL) + if(included_types & TOXLOSS) + TEST_ASSERT_EQUAL(testing_mob.getToxLoss(), amount, \ + "[testing_mob] should have [amount] toxin damage, instead they have [testing_mob.getToxLoss()]!") + if(included_types & CLONELOSS) + TEST_ASSERT_EQUAL(testing_mob.getCloneLoss(), amount, \ + "[testing_mob] should have [amount] clone damage, instead they have [testing_mob.getCloneLoss()]!") + if(included_types & BRUTELOSS) + TEST_ASSERT_EQUAL(round(testing_mob.getBruteLoss(), 1), amount, \ + "[testing_mob] should have [amount] brute damage, instead they have [testing_mob.getBruteLoss()]!") + if(included_types & FIRELOSS) + TEST_ASSERT_EQUAL(round(testing_mob.getFireLoss(), 1), amount, \ + "[testing_mob] should have [amount] burn damage, instead they have [testing_mob.getFireLoss()]!") + if(included_types & OXYLOSS) + TEST_ASSERT_EQUAL(testing_mob.getOxyLoss(), amount, \ + "[testing_mob] should have [amount] oxy damage, instead they have [testing_mob.getOxyLoss()]!") + if(included_types & STAMINALOSS) + TEST_ASSERT_EQUAL(testing_mob.getStaminaLoss(), amount, \ + "[testing_mob] should have [amount] stamina damage, instead they have [testing_mob.getStaminaLoss()]!") + +/** + * Apply a specific amount of damage to the mob using adjustBruteLoss(), adjustToxLoss(), etc. + * + * By default this applies damage of every type to the mob, and checks that the damage procs return the value + * Arguments: + * * testing_mob - the mob to apply the damage to + * * amount - the amount of damage to apply to the mob + * * expected - what the expected return value of the damage proc is + * * included_types - Bitflag of damage types to apply + * * biotypes - the biotypes of damage to apply + * * bodytypes - the bodytypes of damage to apply + * * forced - whether or not this is forced damage + */ +/datum/unit_test/mob_damage/proc/apply_damage(mob/living/testing_mob, amount, expected = -amount, included_types = ALL, biotypes = ALL, bodytypes = ALL, forced = FALSE) + var/damage_returned + if(included_types & TOXLOSS) + damage_returned = testing_mob.adjustToxLoss(amount, updating_health = FALSE, forced = forced, required_biotype = biotypes) + TEST_ASSERT_EQUAL(damage_returned, expected, \ + "adjustToxLoss() should have returned [expected], but returned [damage_returned] instead!") + if(included_types & CLONELOSS) + damage_returned = testing_mob.adjustCloneLoss(amount, updating_health = FALSE, forced = forced, required_biotype = biotypes) + TEST_ASSERT_EQUAL(damage_returned, expected, \ + "adjustCloneLoss() should have returned [expected], but returned [damage_returned] instead!") + if(included_types & BRUTELOSS) + damage_returned = round(testing_mob.adjustBruteLoss(amount, updating_health = FALSE, forced = forced, required_bodytype = bodytypes), 1) + TEST_ASSERT_EQUAL(damage_returned, expected, \ + "adjustBruteLoss() should have returned [expected], but returned [damage_returned] instead!") + if(included_types & FIRELOSS) + damage_returned = round(testing_mob.adjustFireLoss(amount, updating_health = FALSE, forced = forced, required_bodytype = bodytypes), 1) + TEST_ASSERT_EQUAL(damage_returned, expected, \ + "adjustFireLoss() should have returned [expected], but returned [damage_returned] instead!") + if(included_types & OXYLOSS) + damage_returned = testing_mob.adjustOxyLoss(amount, updating_health = FALSE, forced = forced, required_biotype = biotypes) + TEST_ASSERT_EQUAL(damage_returned, expected, \ + "adjustOxyLoss() should have returned [expected], but returned [damage_returned] instead!") + if(included_types & STAMINALOSS) + damage_returned = testing_mob.adjustStaminaLoss(amount, updating_stamina = FALSE, forced = forced, required_biotype = biotypes) + TEST_ASSERT_EQUAL(damage_returned, expected, \ + "adjustStaminaLoss() should have returned [expected], but returned [damage_returned] instead!") + +/** + * Set a specific amount of damage for the mob using setBruteLoss(), setToxLoss(), etc. + * + * By default this sets every type of damage to for the mob, and checks that the damage procs return the value + * Arguments: + * * testing_mob - the mob to apply the damage to + * * amount - the amount of damage to apply to the mob + * * expected - what the expected return value of the damage proc is + * * included_types - Bitflag of damage types to apply + * * biotypes - the biotypes of damage to apply + * * bodytypes - the bodytypes of damage to apply + * * forced - whether or not this is forced damage + */ +/datum/unit_test/mob_damage/proc/set_damage(mob/living/testing_mob, amount, expected = -amount, included_types = ALL, biotypes = ALL, bodytypes = ALL, forced = FALSE) + var/damage_returned + if(included_types & TOXLOSS) + damage_returned = testing_mob.setToxLoss(amount, updating_health = FALSE, forced = forced, required_biotype = biotypes) + TEST_ASSERT_EQUAL(damage_returned, expected, \ + "setToxLoss() should have returned [expected], but returned [damage_returned] instead!") + if(included_types & CLONELOSS) + damage_returned = testing_mob.setCloneLoss(amount, updating_health = FALSE, forced = forced, required_biotype = biotypes) + TEST_ASSERT_EQUAL(damage_returned, expected, \ + "setCloneLoss() should have returned [expected], but returned [damage_returned] instead!") + if(included_types & BRUTELOSS) + damage_returned = round(testing_mob.setBruteLoss(amount, updating_health = FALSE, forced = forced), 1) + TEST_ASSERT_EQUAL(damage_returned, expected, \ + "setBruteLoss() should have returned [expected], but returned [damage_returned] instead!") + if(included_types & FIRELOSS) + damage_returned = round(testing_mob.setFireLoss(amount, updating_health = FALSE, forced = forced), 1) + TEST_ASSERT_EQUAL(damage_returned, expected, \ + "setFireLoss() should have returned [expected], but returned [damage_returned] instead!") + if(included_types & OXYLOSS) + damage_returned = testing_mob.setOxyLoss(amount, updating_health = FALSE, forced = forced, required_biotype = biotypes) + TEST_ASSERT_EQUAL(damage_returned, expected, \ + "setOxyLoss() should have returned [expected], but returned [damage_returned] instead!") + if(included_types & STAMINALOSS) + damage_returned = testing_mob.setStaminaLoss(amount, updating_stamina = FALSE, forced = forced, required_biotype = biotypes) + TEST_ASSERT_EQUAL(damage_returned, expected, \ + "setStaminaLoss() should have returned [expected], but returned [damage_returned] instead!") + +/// Sanity tests damage and healing using adjustToxLoss, adjustBruteLoss, etc +/datum/unit_test/mob_damage/proc/test_sanity_simple(mob/living/carbon/human/consistent/dummy) + + // Apply 5 damage and then heal it + apply_damage(dummy, 5) + verify_damage(dummy, 5) + + apply_damage(dummy, -5) + verify_damage(dummy, 0) + + // Apply 15 damage and heal 3 + apply_damage(dummy, 15) + verify_damage(dummy, 15) + + apply_damage(dummy, -3) + verify_damage(dummy, 12) + + // Now overheal by 666. It should heal for 12. + + apply_damage(dummy, -666, expected = 12) + verify_damage(dummy, 0) + + // Now test the damage setter procs + + // set all types of damage to 5 + set_damage(dummy, 5, expected = -5) + verify_damage(dummy, 5) + // now try healing 5 + set_damage(dummy, 0, expected = 5) + verify_damage(dummy, 0) + +/// Sanity tests damage and healing using the more complex procs like take_overall_damage(), heal_overall_damage(), etc +/datum/unit_test/mob_damage/proc/test_sanity_complex(mob/living/carbon/human/consistent/dummy) + var/damage_returned + // take 5 brute, 2 burn + damage_returned = round(dummy.take_bodypart_damage(5, 2, updating_health = FALSE), 1) + TEST_ASSERT_EQUAL(damage_returned, -7, \ + "take_bodypart_damage() should have returned -7, but returned [damage_returned] instead!") + + TEST_ASSERT_EQUAL(round(dummy.getBruteLoss(), 1), 5, \ + "Dummy should have 5 brute damage, instead they have [dummy.getBruteLoss()]!") + TEST_ASSERT_EQUAL(round(dummy.getFireLoss(), 1), 2, \ + "Dummy should have 2 burn damage, instead they have [dummy.getFireLoss()]!") + + // heal 4 brute, 1 burn + damage_returned = round(dummy.heal_bodypart_damage(4, 1, updating_health = FALSE), 1) + TEST_ASSERT_EQUAL(damage_returned, 5, \ + "heal_bodypart_damage() should have returned 5, but returned [damage_returned] instead!") + + verify_damage(dummy, 1, included_types = BRUTELOSS|FIRELOSS) + + // heal 1 brute, 1 burn + damage_returned = round(dummy.heal_overall_damage(1, 1, updating_health = FALSE), 1) + TEST_ASSERT_EQUAL(damage_returned, 2, \ + "heal_overall_damage() should have returned 2, but returned [damage_returned] instead!") + + verify_damage(dummy, 0, included_types = BRUTELOSS|FIRELOSS) + + // take 50 brute, 50 burn + damage_returned = round(dummy.take_overall_damage(50, 50, updating_health = FALSE), 1) + TEST_ASSERT_EQUAL(damage_returned, -100, \ + "take_overall_damage() should have returned -100, but returned [damage_returned] instead!") + + verify_damage(dummy, 50, included_types = BRUTELOSS|FIRELOSS) + + // testing negative damage amount args with the overall damage procs - the sign should be ignored for these procs + + damage_returned = round(dummy.take_bodypart_damage(-5, -5, updating_health = FALSE), 1) + TEST_ASSERT_EQUAL(damage_returned, -10, \ + "take_bodypart_damage() should have returned -10, but returned [damage_returned] instead!") + + damage_returned = round(dummy.heal_bodypart_damage(-5, -5, updating_health = FALSE), 1) + TEST_ASSERT_EQUAL(damage_returned, 10, \ + "heal_bodypart_damage() should have returned 10, but returned [damage_returned] instead!") + + damage_returned = round(dummy.take_overall_damage(-5, -5, updating_health = FALSE), 1) + TEST_ASSERT_EQUAL(damage_returned, -10, \ + "take_overall_damage() should have returned -10, but returned [damage_returned] instead!") + + damage_returned = round(dummy.heal_overall_damage(-5, -5, updating_health = FALSE), 1) + TEST_ASSERT_EQUAL(damage_returned, 10, \ + "heal_overall_damage() should have returned 10, but returned [damage_returned] instead!") + + verify_damage(dummy, 50, included_types = BRUTELOSS|FIRELOSS) + + // testing overhealing + + damage_returned = round(dummy.heal_overall_damage(75, 99, updating_health = FALSE), 1) + TEST_ASSERT_EQUAL(damage_returned, 100, \ + "heal_overall_damage() should have returned 100, but returned [damage_returned] instead!") + + verify_damage(dummy, 0, included_types = BRUTELOSS|FIRELOSS) + +/// Tests damage procs with godmode on +/datum/unit_test/mob_damage/proc/test_godmode(mob/living/carbon/human/consistent/dummy) + // flip godmode bit to 1 + dummy.status_flags ^= GODMODE + + // Apply 9 damage and then heal it + apply_damage(dummy, 9, expected = 0) + verify_damage(dummy, 0) + + apply_damage(dummy, -9, expected = 0) + verify_damage(dummy, 0) + + // Apply 11 damage and then heal it, this time with forced enabled. The damage should go through regardless of godmode. + apply_damage(dummy, 11, forced = TRUE) + verify_damage(dummy, 11) + + apply_damage(dummy, -11, forced = TRUE) + verify_damage(dummy, 0) + + // flip godmode bit back to 0 + dummy.status_flags ^= GODMODE + +/// Testing biotypes +/datum/unit_test/mob_damage/proc/test_biotypes(mob/living/carbon/human/consistent/dummy) + // Testing biotypes using a plasmaman, who is MOB_MINERAL and MOB_HUMANOID + dummy.set_species(/datum/species/plasmaman) + + // argumentless default: should default to required_biotype = ALL. The damage should be applied in that case. + apply_damage(dummy, 1, included_types = TOXLOSS|CLONELOSS|STAMINALOSS) + verify_damage(dummy, 1, included_types = TOXLOSS|CLONELOSS|STAMINALOSS) + + // If we specify MOB_ORGANIC, the damage should not get applied because plasmamen lack that biotype. + apply_damage(dummy, 1, expected = 0, included_types = TOXLOSS|CLONELOSS|STAMINALOSS, biotypes = MOB_ORGANIC) + verify_damage(dummy, 1, included_types = TOXLOSS|CLONELOSS|STAMINALOSS) + + // Now if we specify MOB_MINERAL the damage should get applied. + apply_damage(dummy, 1, included_types = TOXLOSS|CLONELOSS|STAMINALOSS, biotypes = MOB_MINERAL) + verify_damage(dummy, 2, included_types = TOXLOSS|CLONELOSS|STAMINALOSS) + + // Transform back to human + dummy.set_species(/datum/species/human) + + // We have 2 damage presently. + // Try to heal it; let's specify MOB_MINERAL, which should no longer work because we have changed back to a human. + apply_damage(dummy, -2, expected = 0, included_types = TOXLOSS|CLONELOSS|STAMINALOSS, biotypes = MOB_MINERAL) + verify_damage(dummy, 2, included_types = TOXLOSS|CLONELOSS|STAMINALOSS) + + // Force heal some of the damage. When forced = TRUE the damage/healing gets applied no matter what. + apply_damage(dummy, -1, included_types = TOXLOSS|CLONELOSS|STAMINALOSS, biotypes = MOB_MINERAL, forced = TRUE) + verify_damage(dummy, 1, included_types = TOXLOSS|CLONELOSS|STAMINALOSS) + + // Now heal the rest of it with the correct biotype. Make sure that this works. We should have 0 damage afterwards. + apply_damage(dummy, -1, included_types = TOXLOSS|CLONELOSS|STAMINALOSS, biotypes = MOB_ORGANIC) + verify_damage(dummy, 0, included_types = TOXLOSS|CLONELOSS|STAMINALOSS) + +/// Testing oxyloss with the TRAIT_NOBREATH +/datum/unit_test/mob_damage/proc/test_nobreath(mob/living/carbon/human/consistent/dummy) + // TRAIT_NOBREATH is supposed to prevent oxyloss damage (but not healing). Let's make sure that's the case. + ADD_TRAIT(dummy, TRAIT_NOBREATH, TRAIT_SOURCE_UNIT_TESTS) + // force some oxyloss here + dummy.setOxyLoss(2, updating_health = FALSE, forced = TRUE) + + // Try to take more oxyloss damage with TRAIT_NOBREATH. It should not work. + apply_damage(dummy, 2, expected = 0, included_types = OXYLOSS) + verify_damage(dummy, 2, included_types = OXYLOSS) + + // Make sure we are still be able to heal the oxyloss. This should work. + apply_damage(dummy, -2, included_types = OXYLOSS) + verify_damage(dummy, 0, included_types = OXYLOSS) + + REMOVE_TRAIT(dummy, TRAIT_NOBREATH, TRAIT_SOURCE_UNIT_TESTS) + +/// Testing toxloss with TRAIT_TOXINLOVER and TRAIT_TOXIMMUNE +/datum/unit_test/mob_damage/proc/test_toxintraits(mob/living/carbon/human/consistent/dummy) + // TRAIT_TOXINLOVER is supposed to invert toxin damage and healing. Things that would normally cause toxloss now heal it, and vice versa. + ADD_TRAIT(dummy, TRAIT_TOXINLOVER, TRAIT_SOURCE_UNIT_TESTS) + // force some toxloss here + dummy.setToxLoss(2, updating_health = FALSE, forced = TRUE) + + // Try to take more toxloss damage with TRAIT_TOXINLOVER. It should heal instead. + apply_damage(dummy, 2, expected = 2, included_types = TOXLOSS) + verify_damage(dummy, 0, included_types = TOXLOSS) + + // If we try to heal the toxloss we should take damage instead + apply_damage(dummy, -2, expected = -2, included_types = TOXLOSS) + verify_damage(dummy, 2, included_types = TOXLOSS) + + // TOXIMMUNE trait should prevent the damage you get from being healed by toxins medicines while having TRAIT_TOXINLOVER + ADD_TRAIT(dummy, TRAIT_TOXIMMUNE, TRAIT_SOURCE_UNIT_TESTS) + + // need to force apply some toxin damage since the TOXIMUNNE trait sets toxloss to 0 upon being added + apply_damage(dummy, 2, included_types = TOXLOSS, forced = TRUE) + + // try to 'heal' again - this time it should just do nothing because we should be immune to any sort of toxin damage - including from inverted healing + apply_damage(dummy, -2, expected = 0, included_types = TOXLOSS) + verify_damage(dummy, 2, included_types = TOXLOSS) + + // ok, let's try taking 'damage'. The inverted damage should still heal mobs with the TOXIMMUNE trait. + apply_damage(dummy, 2, expected = 2, included_types = TOXLOSS) + verify_damage(dummy, 0, included_types = TOXLOSS) + + REMOVE_TRAIT(dummy, TRAIT_TOXINLOVER, TRAIT_SOURCE_UNIT_TESTS) + REMOVE_TRAIT(dummy, TRAIT_TOXIMMUNE, TRAIT_SOURCE_UNIT_TESTS) + +/// Testing cloneloss with TRAIT_NOCLONELOSS +/datum/unit_test/mob_damage/proc/test_nocloneloss(mob/living/carbon/human/consistent/dummy) + // TRAIT_NOBREATH is supposed to prevent cloneloss damage and healing. Let's make sure that's the case. + ADD_TRAIT(dummy, TRAIT_NOCLONELOSS, TRAIT_SOURCE_UNIT_TESTS) + // force some cloneloss here + dummy.setCloneLoss(2, updating_health = FALSE, forced = TRUE) + + // Try to take more cloneloss damage with TRAIT_NOCLONELOSS. It should not work. + apply_damage(dummy, 2, expected = 0, included_types = CLONELOSS) + verify_damage(dummy, 2, included_types = CLONELOSS) + + // Healing the cloneloss should not work either, unless we force it + apply_damage(dummy, -2, expected = 0, included_types = CLONELOSS) + verify_damage(dummy, 2, included_types = CLONELOSS) + // so let's force it + apply_damage(dummy, -2, expected = 2, included_types = CLONELOSS, forced = TRUE) + verify_damage(dummy, 0, included_types = CLONELOSS) + + REMOVE_TRAIT(dummy, TRAIT_NOCLONELOSS, TRAIT_SOURCE_UNIT_TESTS) + +/// Testing heal_ordered_damage() +/datum/unit_test/mob_damage/proc/test_ordered_healing(mob/living/carbon/human/consistent/dummy) + var/damage_returned + + // We apply 20 brute, 20 burn, and 20 toxin damage. 60 damage total + apply_damage(dummy, 20, included_types = TOXLOSS|BRUTELOSS|FIRELOSS) + + // Heal 30 damage of that, starting from brute + damage_returned = round(dummy.heal_ordered_damage(30, list(BRUTE, BURN, TOX)), 1) + TEST_ASSERT_EQUAL(damage_returned, 30, \ + "heal_ordered_damage() should have returned 30, but returned [damage_returned] instead!") + + // Should have 10 burn damage and 20 toxins damage remaining, let's check + TEST_ASSERT_EQUAL(dummy.getBruteLoss(), 0, \ + "[src] should have 0 brute damage, but has [dummy.getBruteLoss()] instead!") + TEST_ASSERT_EQUAL(dummy.getFireLoss(), 10, \ + "[src] should have 10 burn damage, but has [dummy.getFireLoss()] instead!") + TEST_ASSERT_EQUAL(dummy.getToxLoss(), 20, \ + "[src] should have 2 toxin damage, but has [dummy.getToxLoss()] instead!") + + // Now heal the remaining 30, overhealing by 5. + damage_returned = round(dummy.heal_ordered_damage(35, list(BRUTE, BURN, TOX)), 1) + TEST_ASSERT_EQUAL(damage_returned, 30, \ + "heal_ordered_damage() should have returned 0, but returned [damage_returned] instead!") + + // Should have no damage remaining + TEST_ASSERT_EQUAL(dummy.getBruteLoss(), 0, \ + "[src] should have 0 brute damage, but has [dummy.getBruteLoss()] instead!") + TEST_ASSERT_EQUAL(dummy.getFireLoss(), 0, \ + "[src] should have 0 burn damage, but has [dummy.getFireLoss()] instead!") + TEST_ASSERT_EQUAL(dummy.getToxLoss(), 0, \ + "[src] should have 0 toxin damage, but has [dummy.getToxLoss()] instead!") + +/// Tests that mob damage procs are working as intended for basic mobs +/datum/unit_test/mob_damage/basic + +/datum/unit_test/mob_damage/basic/Run() + SSmobs.pause() + var/mob/living/basic/mouse/gray/gusgus = allocate(/mob/living/basic/mouse/gray) + // give gusgus a damage_coeff of 1 for this test + gusgus.damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 1, OXY = 1) + // tank mouse + gusgus.maxHealth = 200 + + test_sanity_simple(gusgus) + test_sanity_complex(gusgus) + +/** + * Check that the mob has a specific amount of damage. Note: basic mobs have all incoming damage types besides stam converted into brute damage. + * + * By default this checks that the mob has of every type of damage. + * Arguments: + * * testing_mob - the mob to check the damage of + * * amount - the amount of damage to verify that the mob has + * * expected - the expected return value of the damage procs, if it differs from the default of (amount * 5) + * * included_types - Bitflag of damage types to check. + */ +/datum/unit_test/mob_damage/basic/verify_damage(mob/living/testing_mob, amount, expected, included_types = ALL) + if(included_types & TOXLOSS) + TEST_ASSERT_EQUAL(testing_mob.getToxLoss(), 0, \ + "[testing_mob] should have [0] toxin damage, instead they have [testing_mob.getToxLoss()]!") + if(included_types & CLONELOSS) + TEST_ASSERT_EQUAL(testing_mob.getCloneLoss(), 0, \ + "[testing_mob] should have [0] clone damage, instead they have [testing_mob.getCloneLoss()]!") + if(included_types & BRUTELOSS) + TEST_ASSERT_EQUAL(round(testing_mob.getBruteLoss(), 1), expected || amount * 5, \ + "[testing_mob] should have [expected || amount * 5] brute damage, instead they have [testing_mob.getBruteLoss()]!") + if(included_types & FIRELOSS) + TEST_ASSERT_EQUAL(round(testing_mob.getFireLoss(), 1), 0, \ + "[testing_mob] should have [0] burn damage, instead they have [testing_mob.getFireLoss()]!") + if(included_types & OXYLOSS) + TEST_ASSERT_EQUAL(testing_mob.getOxyLoss(), 0, \ + "[testing_mob] should have [0] oxy damage, instead they have [testing_mob.getOxyLoss()]!") + if(included_types & STAMINALOSS) + TEST_ASSERT_EQUAL(testing_mob.getStaminaLoss(), amount, \ + "[testing_mob] should have [amount] stamina damage, instead they have [testing_mob.getStaminaLoss()]!") + +/datum/unit_test/mob_damage/basic/test_sanity_simple(mob/living/basic/mouse/gray/gusgus) + // check to see if basic mob damage works + + // Simple damage and healing + // Take 1 damage, heal for 1 + apply_damage(gusgus, 1) + verify_damage(gusgus, 1) + + apply_damage(gusgus, -1) + verify_damage(gusgus, 0) + + // Give 2 damage of every time (translates to 10 brute, 2 staminaloss) + apply_damage(gusgus, 2) + verify_damage(gusgus, 2) + + // underhealing: heal 1 damage of every type (translates to 5 brute, 1 staminaloss) + apply_damage(gusgus, -1) + verify_damage(gusgus, 1) + + // overhealing + + // heal 11 points of toxloss (should take care of all 5 brute damage remaining) + apply_damage(gusgus, -11, expected = 5, included_types = TOXLOSS) + // heal the remaining point of staminaloss + apply_damage(gusgus, -11, expected = 1, included_types = STAMINALOSS) + // heal 35 points of each type, we should already be at full health so nothing should happen + apply_damage(gusgus, -35, expected = 0) + verify_damage(gusgus, 0) + +/datum/unit_test/mob_damage/basic/test_sanity_complex(mob/living/basic/mouse/gray/gusgus) + var/damage_returned + // overall damage procs + + // take 5 brute, 2 burn + damage_returned = gusgus.take_bodypart_damage(5, 2, updating_health = FALSE) + TEST_ASSERT_EQUAL(damage_returned, -7, \ + "take_bodypart_damage() should have returned -7, but returned [damage_returned] instead!") + + TEST_ASSERT_EQUAL(gusgus.bruteloss, 7, \ + "Mouse should have 7 brute damage, instead they have [gusgus.bruteloss]!") + TEST_ASSERT_EQUAL(gusgus.fireloss, 0, \ + "Mouse should have 0 burn damage, instead they have [gusgus.fireloss]!") + + // heal 4 brute, 1 burn + damage_returned = gusgus.heal_bodypart_damage(4, 1, updating_health = FALSE) + TEST_ASSERT_EQUAL(damage_returned, 5, \ + "heal_bodypart_damage() should have returned 5, but returned [damage_returned] instead!") + + TEST_ASSERT_EQUAL(gusgus.bruteloss, 2, \ + "Mouse should have 2 brute damage, instead they have [gusgus.bruteloss]!") + TEST_ASSERT_EQUAL(gusgus.fireloss, 0, \ + "Mouse should have 0 burn damage, instead they have [gusgus.fireloss]!") + + // heal 1 brute, 1 burn + damage_returned = gusgus.heal_overall_damage(1, 1, updating_health = FALSE) + TEST_ASSERT_EQUAL(damage_returned, 2, \ + "heal_overall_damage() should have returned 2, but returned [damage_returned] instead!") + + TEST_ASSERT_EQUAL(gusgus.bruteloss, 0, \ + "Mouse should have 0 brute damage, instead they have [gusgus.bruteloss]!") + TEST_ASSERT_EQUAL(gusgus.fireloss, 0, \ + "Mouse should have 0 burn damage, instead they have [gusgus.fireloss]!") + + // take 50 brute, 50 burn + damage_returned = gusgus.take_overall_damage(3, 3, updating_health = FALSE) + TEST_ASSERT_EQUAL(damage_returned, -6, \ + "take_overall_damage() should have returned -6, but returned [damage_returned] instead!") + + verify_damage(gusgus, 1, expected = 6, included_types = BRUTELOSS) + + // testing negative args with the overall damage procs + + damage_returned = gusgus.take_bodypart_damage(-1, -1, updating_health = FALSE) + TEST_ASSERT_EQUAL(damage_returned, -2, \ + "take_bodypart_damage() should have returned -2, but returned [damage_returned] instead!") + + damage_returned = gusgus.heal_bodypart_damage(-1, -1, updating_health = FALSE) + TEST_ASSERT_EQUAL(damage_returned, 2, \ + "heal_bodypart_damage() should have returned 2, but returned [damage_returned] instead!") + + damage_returned = gusgus.take_overall_damage(-1, -1, updating_health = FALSE) + TEST_ASSERT_EQUAL(damage_returned, -2, \ + "take_overall_damage() should have returned -2, but returned [damage_returned] instead!") + + damage_returned = gusgus.heal_overall_damage(-1, -1, updating_health = FALSE) + TEST_ASSERT_EQUAL(damage_returned, 2, \ + "heal_overall_damage() should have returned 2, but returned [damage_returned] instead!") + + verify_damage(gusgus, 1, expected = 6, included_types = BRUTELOSS) + + // testing overhealing + + damage_returned = gusgus.heal_overall_damage(75, 99, updating_health = FALSE) + TEST_ASSERT_EQUAL(damage_returned, 6, \ + "heal_overall_damage() should have returned 6, but returned [damage_returned] instead!") + + verify_damage(gusgus, 0, included_types = BRUTELOSS) diff --git a/code/modules/unit_tests/organs.dm b/code/modules/unit_tests/organs.dm index 4c99bfaa339..4ba51e0870c 100644 --- a/code/modules/unit_tests/organs.dm +++ b/code/modules/unit_tests/organs.dm @@ -96,19 +96,22 @@ var/slot_to_use = test_organ.slot // Tests [mob/living/proc/adjustOrganLoss] - dummy.adjustOrganLoss(slot_to_use, test_organ.maxHealth * 10) + TEST_ASSERT_EQUAL(dummy.adjustOrganLoss(slot_to_use, test_organ.maxHealth * 10), -test_organ.maxHealth, \ + "Mob level \"apply organ damage\" returned the wrong value for [slot_to_use] organ with default arguments.") TEST_ASSERT_EQUAL(dummy.get_organ_loss(slot_to_use), test_organ.maxHealth, \ "Mob level \"apply organ damage\" can exceed the [slot_to_use] organ's damage cap with default arguments.") dummy.fully_heal(HEAL_ORGANS) // Tests [mob/living/proc/set_organ_damage] - dummy.setOrganLoss(slot_to_use, test_organ.maxHealth * 10) + TEST_ASSERT_EQUAL(dummy.setOrganLoss(slot_to_use, test_organ.maxHealth * 10), -test_organ.maxHealth, \ + "Mob level \"set organ damage\" returned the wrong value for [slot_to_use] organ with default arguments.") TEST_ASSERT_EQUAL(dummy.get_organ_loss(slot_to_use), test_organ.maxHealth, \ "Mob level \"set organ damage\" can exceed the [slot_to_use] organ's damage cap with default arguments.") dummy.fully_heal(HEAL_ORGANS) // Tests [mob/living/proc/adjustOrganLoss] with a large max supplied - dummy.adjustOrganLoss(slot_to_use, test_organ.maxHealth * 10, INFINITY) + TEST_ASSERT_EQUAL(dummy.adjustOrganLoss(slot_to_use, test_organ.maxHealth * 10, INFINITY), -test_organ.maxHealth, \ + "Mob level \"apply organ damage\" returned the wrong value for [slot_to_use] organ with a large maximum supplied.") TEST_ASSERT_EQUAL(dummy.get_organ_loss(slot_to_use), test_organ.maxHealth, \ "Mob level \"apply organ damage\" can exceed the [slot_to_use] organ's damage cap with a large maximum supplied.") dummy.fully_heal(HEAL_ORGANS) diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm index 4258dc5a304..65716c0dbfa 100644 --- a/code/modules/zombie/items.dm +++ b/code/modules/zombie/items.dm @@ -75,11 +75,12 @@ var/hp_gained = target.maxHealth target.investigate_log("has been devoured by a zombie.", INVESTIGATE_DEATHS) target.gib() - // zero as argument for no instant health update - user.adjustBruteLoss(-hp_gained, 0) - user.adjustToxLoss(-hp_gained, 0) - user.adjustFireLoss(-hp_gained, 0) - user.adjustCloneLoss(-hp_gained, 0) - user.updatehealth() - user.adjustOrganLoss(ORGAN_SLOT_BRAIN, -hp_gained) // Zom Bee gibbers "BRAAAAISNSs!1!" + var/need_mob_update + need_mob_update = user.adjustBruteLoss(-hp_gained, updating_health = FALSE) + need_mob_update += user.adjustToxLoss(-hp_gained, updating_health = FALSE) + need_mob_update += user.adjustFireLoss(-hp_gained, updating_health = FALSE) + need_mob_update += user.adjustCloneLoss(-hp_gained, updating_health = FALSE) + need_mob_update += user.adjustOrganLoss(ORGAN_SLOT_BRAIN, -hp_gained) // Zom Bee gibbers "BRAAAAISNSs!1!" user.set_nutrition(min(user.nutrition + hp_gained, NUTRITION_LEVEL_FULL)) + if(need_mob_update) + user.updatehealth() From c9ffca799799b33246cb923f6c3b815c3370d41e Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Tue, 3 Oct 2023 11:29:50 +0200 Subject: [PATCH 02/49] Fixed spritesheet images for sprite accessories with no icon_state [MDB IGNORE] (#24085) * Fixed spritesheet images for sprite accessories with no icon_state (#78710) ## About The Pull Request Some sprite accessories (such as bald and shaved) do not have icon states, and these are stored as nulls in the GLOB lists. When generating sprite sheets, nulls were simply returning the basic head icon without scaling it in the same manner as the other sprites were scaled. Old: ![Before](https://github.com/tgstation/tgstation/assets/16478175/e095dd8b-2fc2-4f7b-a176-7f0684629428) New: ![after](https://github.com/tgstation/tgstation/assets/16478175/ea5b4583-58c5-42de-b5ea-367661ebb9e9) ## Why It's Good For The Game Having some hairstyles be scaled differently in the spritesheets looks bad. ## Changelog :cl: fix: Some icons for selecting character preferences are no longer scaled incorrectly. /:cl: Co-authored-by: Cruix * Fixed spritesheet images for sprite accessories with no icon_state --------- Co-authored-by: Cruix Co-authored-by: Cruix --- .../client/preferences/species_features/basic.dm | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/code/modules/client/preferences/species_features/basic.dm b/code/modules/client/preferences/species_features/basic.dm index faa86cc07e2..6e34a234e7d 100644 --- a/code/modules/client/preferences/species_features/basic.dm +++ b/code/modules/client/preferences/species_features/basic.dm @@ -4,16 +4,13 @@ head_icon = icon('icons/mob/human/bodyparts_greyscale.dmi', "human_head_m") head_icon.Blend(skintone2hex("caucasian1"), ICON_MULTIPLY) - if (isnull(sprite_accessory)) - return head_icon - - ASSERT(istype(sprite_accessory)) - var/icon/final_icon = new(head_icon) + if (!isnull(sprite_accessory)) + ASSERT(istype(sprite_accessory)) - var/icon/head_accessory_icon = icon(sprite_accessory.icon, sprite_accessory.icon_state) - head_accessory_icon.Blend(COLOR_DARK_BROWN, ICON_MULTIPLY) - final_icon.Blend(head_accessory_icon, ICON_OVERLAY) + var/icon/head_accessory_icon = icon(sprite_accessory.icon, sprite_accessory.icon_state) + head_accessory_icon.Blend(COLOR_DARK_BROWN, ICON_MULTIPLY) + final_icon.Blend(head_accessory_icon, ICON_OVERLAY) final_icon.Crop(10, 19, 22, 31) final_icon.Scale(32, 32) From 054a342efb0c7ac58c7a1154b2022488511ee8c6 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Tue, 3 Oct 2023 11:30:09 +0200 Subject: [PATCH 03/49] Paper bins behave properly when dumping their contents. [MDB IGNORE] (#24086) * Paper bins behave properly when dumping their contents. (#78702) ## About The Pull Request Fixes #78696 `dump_contents()` for paper bins was never updated to match the refactor in #69586. This meant that it didn't work at all, dumping only initialized sheets of paper and not removing references to them from the bin itself. Most tangibly, this means that cutting open a natural bundle of paper deletes all of the paper along with the object. The paper bundle problem is now fixed. I don't know if there's actually any way for a regular paper bin to dump its contents, but it works properly regardless. ## Why It's Good For The Game Dumping the contents out of something should dump the contents out of that thing. ## Changelog :cl: fix: Cutting open a hand-pressed paper bundle no longer deletes all of the paper. /:cl: * Paper bins behave properly when dumping their contents. --------- Co-authored-by: lizardqueenlexi <105025397+lizardqueenlexi@users.noreply.github.com> --- code/modules/paperwork/paperbin.dm | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 318fca21f57..9971c0da7f7 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -54,12 +54,26 @@ droppoint = drop_location() if(collapse) visible_message(span_warning("The stack of paper collapses!")) - for(var/atom/movable/movable_atom in contents) - movable_atom.forceMove(droppoint) - if(!movable_atom.pixel_y) - movable_atom.pixel_y = rand(-3,3) - if(!movable_atom.pixel_x) - movable_atom.pixel_x = rand(-3,3) + for(var/obj/item/paper/stacked_paper in paper_stack) //first, dump all of the paper that already exists + stacked_paper.forceMove(droppoint) + if(!stacked_paper.pixel_y) + stacked_paper.pixel_y = rand(-3,3) + if(!stacked_paper.pixel_x) + stacked_paper.pixel_x = rand(-3,3) + paper_stack -= stacked_paper + total_paper -= 1 + for(var/i in 1 to total_paper) //second, generate new paper for the remainder + var/obj/item/paper/new_paper = generate_paper() + new_paper.forceMove(droppoint) + if(!new_paper.pixel_y) + new_paper.pixel_y = rand(-3,3) + if(!new_paper.pixel_x) + new_paper.pixel_x = rand(-3,3) + if(bin_pen) + var/obj/item/pen/pen = bin_pen + pen.forceMove(droppoint) + bin_pen = null + total_paper = 0 update_appearance() /obj/item/paper_bin/fire_act(exposed_temperature, exposed_volume) @@ -212,6 +226,8 @@ /obj/item/paper_bin/bundlenatural/dump_contents(atom/droppoint) . = ..() + binding_cable.forceMove(droppoint) + binding_cable = null qdel(src) /obj/item/paper_bin/bundlenatural/update_overlays() @@ -225,7 +241,7 @@ deconstruct(FALSE) /obj/item/paper_bin/bundlenatural/deconstruct(disassembled) - dump_contents() + dump_contents(drop_location()) return ..() /obj/item/paper_bin/bundlenatural/fire_act(exposed_temperature, exposed_volume) From 3de62f2e0b8b56ef9c99c3dc2e5dfe119074f8f6 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Tue, 3 Oct 2023 11:32:40 +0200 Subject: [PATCH 04/49] Revamps the Beach away mission [MDB IGNORE] (#24082) * Revamps the Beach away mission (#78568) ## About The Pull Request The beach has been revamped - it is no longer ancient and looks and feels much, much better. ![image](https://github.com/tgstation/tgstation/assets/84548101/556dd804-55a7-40ea-8955-c094ea63ccfd) ![image](https://github.com/tgstation/tgstation/assets/84548101/2f4572da-9ebf-43d2-b449-8b92046b66b0) ![image](https://github.com/tgstation/tgstation/assets/84548101/bf609d1b-60d7-4d33-9812-18ef0492b6fd) ![image](https://github.com/tgstation/tgstation/assets/84548101/00e6f360-9a5c-45a6-a6e5-a3d11697c0a6) ![image](https://github.com/tgstation/tgstation/assets/84548101/02d906f1-a2f3-4f7c-bec3-c9f811b1d52d) ## Why It's Good For The Game The beach's map has been masssively improved - it no longer is just a few square rooms on a beach, having a lot more to do and interact with. - A fully new hotel area has been added for MRP purpouses, gimmicks and a medical area. - Fishing poles and fishing toolboxes can be found scattered around to catch some tropical fish - All Terrain Vehicles and a dressing room have also been added - The bar and kitchen area has been significantly expanded to fit with modern TG's cooking - An arcade and Space Cola quiosk have also been added - The place, in general, looks a lot better ## Changelog :cl: Fazzie add: A lot of new content has been added to the beach away mission qol: It also looks substantially better, too! /:cl: * Revamps the Beach away mission --------- Co-authored-by: Fazzie <84548101+EuSouAFazer@users.noreply.github.com> --- _maps/RandomZLevels/TheBeach.dmm | 83945 ++++++++++++++++++++++++----- 1 file changed, 68962 insertions(+), 14983 deletions(-) diff --git a/_maps/RandomZLevels/TheBeach.dmm b/_maps/RandomZLevels/TheBeach.dmm index 18d0a7fdc86..7b36dfb1471 100644 --- a/_maps/RandomZLevels/TheBeach.dmm +++ b/_maps/RandomZLevels/TheBeach.dmm @@ -1,401 +1,411 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/closed/indestructible/sandstone, +"ae" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/vending/clothing, +/turf/open/misc/beach/sand, /area/awaymission/beach) -"ab" = ( -/turf/open/indestructible/binary{ - density = 1; - desc = "I can't move through this."; - icon = 'icons/turf/beach.dmi'; - icon_state = "water"; - name = "deep ocean water" +"ah" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 8 }, +/turf/open/misc/beach/sand, /area/awaymission/beach) -"af" = ( -/turf/open/misc/beach/coast{ - dir = 9 +"ai" = ( +/obj/structure/table/wood, +/obj/item/knife/kitchen{ + pixel_y = 12; + pixel_x = -13 }, +/obj/item/clothing/head/utility/chefhat, +/turf/open/floor/wood/large, /area/awaymission/beach) -"ag" = ( -/turf/open/misc/beach/coast{ - dir = 1 - }, +"an" = ( +/obj/structure/rack, +/obj/item/mop, +/obj/item/extinguisher, +/turf/open/floor/wood/large, /area/awaymission/beach) -"ah" = ( -/turf/open/misc/beach/coast{ - dir = 5 +"at" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 }, +/obj/machinery/door/airlock/wood{ + name = "Room 7"; + id_tag = "beach_room_7" + }, +/turf/open/floor/wood, /area/awaymission/beach) -"aj" = ( -/turf/open/misc/beach/coast{ - dir = 8 +"aw" = ( +/obj/structure/table/glass, +/obj/machinery/coffeemaker/impressa{ + pixel_y = 13; + pixel_x = -1 + }, +/obj/item/reagent_containers/cup/glass/mug{ + pixel_x = -6; + pixel_y = 2 }, +/obj/item/reagent_containers/cup/glass/mug{ + pixel_x = 11; + pixel_y = -1 + }, +/turf/open/floor/iron/dark/diagonal, /area/awaymission/beach) -"ak" = ( -/turf/open/misc/beach/sand, +"aB" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, /area/awaymission/beach) -"al" = ( -/obj/structure/flora/tree/palm{ - desc = "How did you get here?"; - icon_state = "palm2"; - name = "\proper island palm tree" +"aC" = ( +/obj/structure/table/bronze, +/obj/item/reagent_containers/condiment/bbqsauce{ + pixel_y = 13; + pixel_x = 3 }, -/turf/open/misc/beach/sand, +/obj/item/reagent_containers/condiment/hotsauce{ + pixel_y = 9; + pixel_x = -3 + }, +/turf/open/floor/wood/large, /area/awaymission/beach) -"am" = ( -/turf/open/misc/beach/coast{ - dir = 4 +"aE" = ( +/obj/item/cigbutt{ + pixel_y = 21; + pixel_x = -13 }, +/turf/open/floor/wood/large, /area/awaymission/beach) -"an" = ( -/obj/structure/flora/coconuts{ - pixel_x = 17; - pixel_y = 7 +"aT" = ( +/obj/machinery/shower/directional/west, +/obj/effect/turf_decal/siding/wood{ + dir = 9 }, -/turf/open/misc/beach/sand, +/turf/open/floor/wood, /area/awaymission/beach) -"ao" = ( -/turf/open/misc/beach/coast{ - dir = 10 +"aU" = ( +/obj/machinery/door/airlock/wood{ + name = "Garage" }, +/turf/open/floor/iron/dark/herringbone, /area/awaymission/beach) -"ap" = ( -/turf/open/misc/beach/coast, +"aX" = ( +/obj/machinery/space_heater, +/obj/structure/sign/clock/directional/north, +/turf/open/floor/wood, /area/awaymission/beach) -"aq" = ( -/turf/open/misc/beach/coast{ - dir = 6 +"bg" = ( +/obj/structure/no_effect_signpost{ + pixel_y = 6; + desc = "Northwest: Hotel. South: Seaside Bar. East: Dressing Rooms." }, +/turf/open/misc/beach/sand, /area/awaymission/beach) -"as" = ( -/obj/structure/flora/rock/style_random{ - desc = "A volcanic rock."; - name = "coastal rock" - }, -/obj/structure/flora/bush/stalky/style_random{ - desc = "It can't be smoked."; - name = "sea weed" - }, -/turf/open/indestructible/binary{ - density = 1; - desc = "I can't move through this."; - icon = 'icons/turf/beach.dmi'; - icon_state = "water"; - name = "deep ocean water" +"bi" = ( +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach) +"bx" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/door/airlock/wood{ + name = "Bathroom"; + id_tag = "toiletfarbeach" }, +/turf/open/floor/iron/white, /area/awaymission/beach) -"at" = ( -/obj/structure/flora/rock/style_random{ - desc = "A volcanic rock."; - name = "coastal rock" - }, -/turf/open/indestructible/binary{ - density = 1; - desc = "I can't move through this."; - icon = 'icons/turf/beach.dmi'; - icon_state = "water"; - name = "deep ocean water" - }, -/area/awaymission/beach) -"au" = ( -/obj/structure/closet/crate/wooden{ - desc = "Now this is what island exploration is all about."; - name = "Treasure Chest" - }, -/obj/item/clothing/head/costume/pirate, -/obj/item/clothing/glasses/eyepatch, -/obj/item/clothing/suit/costume/pirate, -/obj/item/claymore/cutlass{ - desc = "A piratey, foam sword used by kids to train themselves in the business of \"negotiating\" the transfer of treasure."; - force = 0; - name = "foam cutlass"; - throwforce = 0 +"by" = ( +/obj/structure/table/bronze, +/obj/item/clothing/suit/costume/hawaiian{ + pixel_y = 2; + pixel_x = 5 }, -/obj/item/claymore/cutlass{ - desc = "A piratey, foam sword used by kids to train themselves in the business of \"negotiating\" the transfer of treasure."; - force = 0; - name = "foam cutlass"; - throwforce = 0 +/obj/item/clothing/suit/costume/hawaiian{ + pixel_y = 6; + pixel_x = -4 }, -/turf/open/misc/beach/sand, +/turf/open/floor/wood/parquet, /area/awaymission/beach) -"av" = ( -/turf/open/water/beach, +"bz" = ( +/obj/structure/table/bronze, +/obj/item/clothing/suit/costume/hawaiian{ + pixel_y = 7; + pixel_x = -3 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/wood/parquet, /area/awaymission/beach) -"ay" = ( -/turf/open/misc/beach/coast/corner{ +"bC" = ( +/obj/vehicle/ridden/atv{ dir = 4 }, +/turf/open/floor/iron/dark/herringbone, /area/awaymission/beach) -"az" = ( -/turf/open/misc/beach/coast/corner{ - dir = 8 +"bH" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/railing{ + dir = 1 }, +/turf/open/floor/wood/parquet, /area/awaymission/beach) -"aA" = ( -/obj/structure/flora/tree/palm, +"bY" = ( +/obj/structure/fluff/beach_umbrella/cap, /turf/open/misc/beach/sand, /area/awaymission/beach) -"aB" = ( -/mob/living/basic/crab/kreb, +"cj" = ( +/obj/effect/turf_decal/siding/dark_red{ + dir = 4 + }, +/obj/item/trash/can{ + pixel_y = -9; + pixel_x = 10 + }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"aC" = ( -/obj/item/flashlight/flare/torch, -/turf/open/misc/beach/sand, +"cn" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/under/costume/lobster, +/obj/item/clothing/head/costume/lobsterhat, +/turf/open/floor/wood, /area/awaymission/beach) -"aD" = ( -/obj/structure/flora/coconuts, -/turf/open/misc/beach/sand, +"cp" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/wood, /area/awaymission/beach) -"aE" = ( -/obj/structure/chair{ - dir = 4 +"cq" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/carpet/cyan, +/area/awaymission/beach) +"cv" = ( +/obj/structure/table/wood, +/obj/item/food/grown/watermelon{ + pixel_y = 8; + pixel_x = 6 }, +/obj/item/food/watermelonslice, /turf/open/misc/beach/sand, /area/awaymission/beach) -"aF" = ( -/obj/structure/bonfire/prelit, +"cw" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 24 + }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"aG" = ( -/obj/item/clothing/mask/gas/tiki_mask, +"cD" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 10 + }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"aH" = ( -/obj/item/reagent_containers/cup/soda_cans/space_mountain_wind{ - pixel_x = -17; - pixel_y = 17 +"cE" = ( +/obj/structure/chair{ + dir = 8 }, -/turf/open/misc/beach/sand, +/turf/open/floor/iron/dark/textured_large, /area/awaymission/beach) -"aI" = ( -/obj/item/melee/skateboard/hoverboard{ - pixel_x = -16; - pixel_y = 1 +"cG" = ( +/obj/item/toy/beach_ball, +/turf/open/misc/beach/coast/corner{ + dir = 4 }, -/turf/open/water/beach, /area/awaymission/beach) -"aK" = ( -/mob/living/basic/crab, -/turf/open/misc/beach/sand, +"cR" = ( +/turf/open/floor/iron/freezer, /area/awaymission/beach) -"aO" = ( -/obj/effect/baseturf_helper/beach/sand, +"cX" = ( +/obj/structure/closet/crate/hydroponics, +/obj/item/popsicle_stick, +/obj/item/popsicle_stick, +/obj/item/popsicle_stick, +/obj/item/reagent_containers/condiment/flour, +/obj/item/reagent_containers/condiment/flour, +/obj/item/reagent_containers/condiment/rice, +/obj/item/reagent_containers/condiment/rice, +/obj/item/food/grown/banana/bunch, /turf/open/misc/beach/sand, /area/awaymission/beach) -"aQ" = ( -/obj/machinery/gateway/away, -/obj/effect/turf_decal/sand, -/turf/open/misc/beach/sand, +"cZ" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 1"; + id_tag = "beach_room_1" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, /area/awaymission/beach) -"aS" = ( +"db" = ( /obj/item/reagent_containers/cup/soda_cans/lemon_lime{ pixel_x = -12; pixel_y = 14 }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"aT" = ( -/turf/open/misc/beach/coast/corner{ +"dc" = ( +/obj/effect/turf_decal/siding/wood/corner{ dir = 1 }, +/turf/open/floor/wood/large, /area/awaymission/beach) -"aX" = ( -/turf/closed/wall/mineral/sandstone, -/area/awaymission/beach) -"ba" = ( -/obj/effect/turf_decal/sand, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"bb" = ( -/obj/structure/dresser{ - density = 0; - pixel_y = 18 +"dg" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 }, -/turf/open/floor/wood, +/obj/machinery/vending/cigarette/beach, +/turf/open/floor/wood/large, /area/awaymission/beach) -"bc" = ( -/obj/structure/mirror/directional/north, -/turf/open/floor/wood, +"dh" = ( +/obj/machinery/vending/cola/pwr_game, +/turf/open/floor/eighties, /area/awaymission/beach) -"bd" = ( -/turf/open/floor/wood, +"di" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/water/beach, /area/awaymission/beach) -"be" = ( -/obj/machinery/computer/security/telescreen/entertainment/directional/north, -/turf/open/floor/wood, +"dk" = ( +/obj/item/cigbutt{ + pixel_y = -11; + pixel_x = -15 + }, +/turf/open/floor/iron/dark/diagonal, /area/awaymission/beach) -"bf" = ( +"dq" = ( /obj/effect/turf_decal/sand, -/obj/effect/turf_decal/stripes/asteroid/line{ +/obj/effect/turf_decal/siding/wood{ dir = 9 }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"bg" = ( -/obj/effect/turf_decal/sand, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/turf/open/misc/beach/sand, +"dr" = ( +/obj/structure/musician/piano, +/turf/open/floor/wood, /area/awaymission/beach) -"bh" = ( -/obj/effect/turf_decal/sand, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 5 +"dx" = ( +/obj/structure/sign/directions/dorms/directional/north{ + pixel_y = 35 }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"bi" = ( -/obj/machinery/button/door/directional/east{ - id = "changlinhut2"; - name = "changing room lock"; - normaldoorcontrol = 1; - specialfunctions = 4 +/obj/structure/sign/directions/medical/directional/north{ + pixel_y = 29 }, -/turf/open/floor/wood, +/obj/machinery/computer/slot_machine, +/turf/open/floor/wood/large, /area/awaymission/beach) -"bj" = ( -/obj/machinery/button/door/directional/west{ - id = "changlinhut1"; - name = "changing room lock"; - normaldoorcontrol = 1; - specialfunctions = 4 +"dL" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Locker Room" }, -/turf/open/floor/wood, +/turf/open/floor/wood/parquet, /area/awaymission/beach) -"bk" = ( -/obj/structure/closet/secure_closet/personal/cabinet, -/obj/item/clothing/glasses/heat, -/turf/open/floor/wood, +"dO" = ( +/obj/effect/baseturf_helper/beach/water, +/turf/open/misc/beach/sand, /area/awaymission/beach) -"bl" = ( -/obj/structure/bed, -/obj/item/bedsheet/dorms, -/obj/machinery/button/door/directional/east{ - id = "theloveshack1"; - name = "door lock"; - normaldoorcontrol = 1; - specialfunctions = 4 +"dR" = ( +/obj/machinery/door/airlock/wood{ + name = "Balcony"; + id_tag = "beach_room_x" }, -/turf/open/floor/wood, -/area/awaymission/beach) -"bm" = ( -/obj/structure/bed, -/obj/item/bedsheet/dorms, -/obj/machinery/button/door/directional/east{ - id = "theloveshack2"; - name = "door lock"; - normaldoorcontrol = 1; - specialfunctions = 4 +/obj/structure/railing/corner/end{ + dir = 8 }, /turf/open/floor/wood, /area/awaymission/beach) -"bn" = ( -/obj/structure/bed, -/obj/item/bedsheet/dorms, -/obj/machinery/button/door/directional/east{ - id = "theloveshack3"; - name = "door lock"; - normaldoorcontrol = 1; - specialfunctions = 4 +"dS" = ( +/obj/item/kirbyplants/organic/applebush{ + pixel_x = 7 }, -/turf/open/floor/wood, -/area/awaymission/beach) -"bo" = ( -/turf/open/misc/beach/coast/corner, -/area/awaymission/beach) -"bp" = ( -/obj/effect/turf_decal/sand, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 8 +/obj/item/kirbyplants/organic/plant17{ + pixel_y = 2; + pixel_x = -8 }, -/turf/open/misc/beach/sand, +/turf/open/floor/wood/large, /area/awaymission/beach) -"bq" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/telecomms/allinone, +"dV" = ( +/obj/effect/turf_decal/siding/blue, /turf/open/misc/beach/sand, /area/awaymission/beach) -"br" = ( -/obj/effect/turf_decal/sand, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 4 +"ea" = ( +/obj/structure/table/bronze, +/obj/structure/desk_bell{ + pixel_x = 7; + pixel_y = 8 }, -/turf/open/misc/beach/sand, +/turf/open/floor/wood/large, /area/awaymission/beach) -"bs" = ( -/obj/machinery/door/airlock/sandstone{ - id_tag = "changlinhut2"; - name = "Changing Room" +"eE" = ( +/obj/structure/table/glass, +/obj/machinery/microwave{ + pixel_y = 15 }, -/turf/open/floor/wood, +/obj/item/cigbutt{ + pixel_y = 2; + pixel_x = -12 + }, +/turf/open/floor/iron/dark/diagonal, /area/awaymission/beach) -"bt" = ( -/obj/machinery/door/airlock/sandstone{ - id_tag = "changlinhut1"; - name = "Changing Room" +"eH" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 }, -/turf/open/floor/wood, +/turf/open/misc/beach/sand, /area/awaymission/beach) -"bu" = ( +"eT" = ( /obj/structure/table/wood, -/obj/item/reagent_containers/cup/glass/bottle/whiskey{ - pixel_y = 3 +/obj/item/clothing/mask/cigarette/cigar{ + pixel_y = 16; + pixel_x = -2 }, -/turf/open/floor/wood, -/area/awaymission/beach) -"bx" = ( -/obj/effect/turf_decal/sand, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 10 +/obj/item/reagent_containers/cup/glass/coffee{ + pixel_x = 8; + pixel_y = 9 }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"by" = ( -/obj/effect/turf_decal/sand, -/obj/effect/turf_decal/stripes/asteroid/line, -/turf/open/misc/beach/sand, +/obj/machinery/cell_charger, +/turf/open/floor/iron/dark/diagonal, /area/awaymission/beach) -"bz" = ( -/obj/effect/turf_decal/sand, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 6 +"fa" = ( +/obj/structure/table/reinforced, +/obj/item/toy/plush/slimeplushie{ + pixel_y = 8; + pixel_x = 4 }, -/turf/open/misc/beach/sand, +/turf/open/floor/iron/white/textured_large, /area/awaymission/beach) -"bA" = ( -/obj/structure{ - desc = "Bar and beach south, dorms east."; - icon = 'icons/obj/fluff/general.dmi'; - icon_state = "signpost"; - name = "directions signpost" +"fd" = ( +/obj/structure/table/bronze, +/obj/structure/desk_bell{ + pixel_x = -11; + pixel_y = 9 }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"bB" = ( -/obj/machinery/door/airlock/sandstone{ - id_tag = "theloveshack1"; - name = "Beach Hut" +/obj/item/phone{ + pixel_y = 9; + pixel_x = 8 }, -/turf/open/floor/wood, +/turf/open/floor/carpet, /area/awaymission/beach) -"bC" = ( -/obj/machinery/door/airlock/sandstone{ - id_tag = "theloveshack2"; - name = "Beach Hut" +"fe" = ( +/obj/effect/turf_decal/siding/wood, +/obj/item/cigbutt{ + pixel_y = -9; + pixel_x = 13 }, -/turf/open/floor/wood, +/turf/open/water/beach, /area/awaymission/beach) -"bD" = ( -/obj/machinery/door/airlock/sandstone{ - id_tag = "theloveshack3"; - name = "Beach Hut" +"fi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plating, +/area/awaymission/beach) +"fj" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 3"; + id_tag = "beach_room_3" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, /turf/open/floor/wood, /area/awaymission/beach) -"bE" = ( +"fm" = ( /obj/structure/flora/tree/palm{ pixel_y = 25 }, @@ -405,401 +415,392 @@ }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"bF" = ( -/obj/structure/bedsheetbin, -/obj/effect/turf_decal/sand, +"fu" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/item/binoculars{ + pixel_y = 20 + }, +/obj/item/megaphone{ + pixel_y = 2; + pixel_x = 1 + }, /obj/structure/table/wood, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"bG" = ( -/obj/item/clothing/shoes/sandal, -/obj/item/clothing/shoes/sandal, -/obj/item/clothing/shoes/sandal, -/obj/structure/closet/crate, -/obj/effect/turf_decal/sand, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"bH" = ( -/obj/structure/closet/athletic_mixed, -/obj/effect/turf_decal/sand, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"bI" = ( -/obj/machinery/door/airlock/sandstone{ - id_tag = "loveshack"; - name = "Beach Hut" +/obj/effect/turf_decal/siding/wood{ + dir = 10 }, /turf/open/floor/wood, /area/awaymission/beach) -"bJ" = ( -/obj/machinery/door/airlock/sandstone{ - id_tag = "theloveshack4"; - name = "Beach Hut" +"fv" = ( +/obj/machinery/chem_master/condimaster{ + name = "CondiMaster Neo" }, -/turf/open/floor/wood, +/turf/open/floor/wood/large, /area/awaymission/beach) -"bK" = ( -/obj/machinery/door/airlock/sandstone{ - id_tag = "theloveshack5"; - name = "Beach Hut" +"fz" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/table/wood, +/obj/item/storage/medkit/o2{ + pixel_y = 4; + pixel_x = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 9 }, /turf/open/floor/wood, /area/awaymission/beach) -"bL" = ( -/obj/structure/toilet{ - pixel_y = 8 +"fI" = ( +/obj/structure/table/bronze, +/obj/item/clothing/suit/costume/hawaiian{ + pixel_y = 6; + pixel_x = 4 }, -/obj/effect/turf_decal/sand, -/turf/open/floor/iron/white, -/area/awaymission/beach) -"bM" = ( -/obj/structure/mirror/directional/east, -/obj/effect/turf_decal/sand, -/obj/structure/sink/directional/south, -/turf/open/floor/iron/white, -/area/awaymission/beach) -"bN" = ( -/obj/structure/mirror/directional/west, -/obj/effect/turf_decal/sand, -/obj/structure/sink/directional/south, -/turf/open/floor/iron/white, +/turf/open/floor/wood/parquet, /area/awaymission/beach) -"bO" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/cup/glass/bottle/tequila{ - pixel_y = 2 +"fM" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 4 }, -/turf/open/floor/wood, -/area/awaymission/beach) -"bP" = ( -/obj/item/trash/chips{ - pixel_x = -18; - pixel_y = 7 +/obj/structure/chair/plastic{ + dir = 4 }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"bQ" = ( -/obj/effect/turf_decal/sand, -/turf/open/floor/iron/white, -/area/awaymission/beach) -"bR" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/button/door/directional/east{ - id = "toilet1"; - name = "restroom lock"; - normaldoorcontrol = 1; - specialfunctions = 4 +"fU" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 14 }, -/turf/open/floor/iron/white, +/turf/open/misc/beach/sand, /area/awaymission/beach) -"bS" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/button/door/directional/west{ - id = "toilet2"; - name = "restroom lock"; - normaldoorcontrol = 1; - specialfunctions = 4 +"fV" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/siding/wood{ + dir = 8 }, -/turf/open/floor/iron/white, +/turf/open/floor/wood/large, /area/awaymission/beach) -"bT" = ( -/obj/structure/bed, -/obj/item/bedsheet/red, -/obj/machinery/button/door/directional/east{ - id = "loveshack"; - name = "love shack lock"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/wood, +"fX" = ( +/obj/structure/chair, +/turf/open/misc/beach/sand, /area/awaymission/beach) -"bU" = ( -/obj/structure/bed, -/obj/item/bedsheet/dorms, -/obj/machinery/button/door/directional/east{ - id = "theloveshack4"; - name = "door lock"; - normaldoorcontrol = 1; - specialfunctions = 4 +"gd" = ( +/obj/effect/spawner/random/entertainment/arcade{ + dir = 8 }, -/turf/open/floor/wood, +/turf/open/floor/eighties, /area/awaymission/beach) -"bV" = ( -/obj/structure/sign/poster/ripped/directional/east, +"gi" = ( +/obj/effect/turf_decal/siding/dark_red{ + dir = 4 + }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"bW" = ( -/obj/structure/bed, -/obj/item/bedsheet/dorms, -/obj/machinery/button/door/directional/east{ - id = "theloveshack5"; - name = "door lock"; - normaldoorcontrol = 1; - specialfunctions = 4 +"gj" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 8 }, -/turf/open/floor/wood, +/turf/open/misc/beach/sand, /area/awaymission/beach) -"bX" = ( -/obj/machinery/door/airlock/sandstone{ - id_tag = "toilet1"; - name = "Restroom Stall" +"gk" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 }, -/obj/effect/turf_decal/sand, -/turf/open/floor/iron/white, +/turf/closed/wall/mineral/wood, /area/awaymission/beach) -"bY" = ( -/obj/machinery/door/airlock/sandstone{ - id_tag = "toilet2"; - name = "Restroom Stall" +"gw" = ( +/obj/item/stack/sheet/mineral/sandstone{ + pixel_x = -8 }, -/obj/effect/turf_decal/sand, -/turf/open/floor/iron/white, -/area/awaymission/beach) -"bZ" = ( -/obj/structure/dresser{ - density = 0 +/obj/item/stack/sheet/mineral/sandstone{ + pixel_x = 5 }, -/turf/open/floor/wood, -/area/awaymission/beach) -"ca" = ( -/obj/machinery/computer/security/telescreen/entertainment/directional/south, -/turf/open/floor/wood, -/area/awaymission/beach) -"cb" = ( -/obj/structure/sign/poster/contraband/syndicate_recruitment/directional/west, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"cc" = ( -/obj/item/trash/can{ - pixel_x = 14; +/obj/item/stack/sheet/mineral/sandstone{ + pixel_x = 1; pixel_y = 7 }, +/obj/item/stack/sheet/mineral/sandstone{ + pixel_x = -12; + pixel_y = 6 + }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"cd" = ( -/obj/machinery/vending/cola/starkist, -/obj/effect/turf_decal/sand, -/turf/open/misc/beach/sand, +"gG" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/water/beach, /area/awaymission/beach) -"cf" = ( -/obj/structure/table/wood, -/turf/open/floor/wood, +"gI" = ( +/obj/structure/flora/tree/palm/style_2{ + pixel_y = 4 + }, +/turf/open/misc/beach/sand, /area/awaymission/beach) -"cg" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/vending/cola/space_up, +"gP" = ( +/obj/structure/chair/plastic, /turf/open/misc/beach/sand, /area/awaymission/beach) -"ch" = ( -/obj/structure/flora/tree/palm, -/obj/structure/flora/coconuts, +"gR" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"ci" = ( -/obj/structure/closet/gmcloset, -/turf/open/floor/wood, +"hf" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/water/beach, /area/awaymission/beach) -"cj" = ( -/obj/structure/closet/secure_closet/bar/all_access, -/obj/item/storage/box/drinkingglasses, -/obj/item/storage/box/drinkingglasses, -/obj/item/storage/box/drinkingglasses, -/obj/item/storage/box/drinkingglasses, -/obj/item/storage/box/drinkingglasses, -/obj/item/storage/box/drinkingglasses, -/turf/open/floor/wood, +"ho" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/door/poddoor/shutters{ + id = "BeachBoats" + }, +/turf/open/water/beach, /area/awaymission/beach) -"ck" = ( -/obj/effect/mob_spawn/corpse/human/bartender, +"hp" = ( +/obj/structure/table/bronze, +/obj/structure/sign/poster/random/directional/east, +/obj/machinery/button/door/directional/south{ + id = "beach_room_10" + }, +/obj/item/table_clock{ + pixel_y = 4 + }, /turf/open/floor/wood, /area/awaymission/beach) -"cl" = ( -/obj/machinery/processor, -/obj/structure/table/wood, +"hC" = ( +/obj/structure/railing{ + dir = 8 + }, /turf/open/floor/wood, /area/awaymission/beach) -"cn" = ( -/obj/machinery/vending/boozeomat/all_access{ - desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one. May not work for bartenders that don't have Nanotrasen bank accounts." +"hD" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/turf/open/floor/wood, +/obj/item/clothing/mask/breath/medical{ + pixel_y = 7; + pixel_x = -9 + }, +/obj/item/clothing/mask/breath/medical{ + pixel_y = 4; + pixel_x = 3 + }, +/obj/item/clothing/gloves/latex, +/obj/structure/table/glass, +/turf/open/floor/wood/large, /area/awaymission/beach) -"co" = ( -/obj/structure/table/wood, -/obj/machinery/chem_dispenser/drinks/fullupgrade, -/obj/structure/sign/picture_frame{ - pixel_y = 32 +"hL" = ( +/turf/open/misc/beach/coast/corner{ + dir = 1 }, -/turf/open/floor/wood, /area/awaymission/beach) -"cp" = ( -/obj/structure/table/wood, -/obj/machinery/chem_dispenser/drinks/beer/fullupgrade, -/turf/open/floor/wood, +"hQ" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/water/beach, /area/awaymission/beach) -"cq" = ( -/obj/structure/table/wood, -/obj/machinery/microwave, +"im" = ( +/obj/structure/table/bronze, +/obj/structure/sign/poster/random/directional/east, +/obj/item/table_clock{ + pixel_y = 4 + }, /turf/open/floor/wood, /area/awaymission/beach) -"cr" = ( -/obj/structure/closet/secure_closet/freezer/kitchen/all_access, -/obj/item/storage/fancy/egg_box, -/obj/item/reagent_containers/condiment/milk, -/obj/item/reagent_containers/condiment/milk, -/obj/item/reagent_containers/condiment/flour, -/obj/item/reagent_containers/condiment/flour, -/obj/item/reagent_containers/condiment/mayonnaise, -/obj/item/reagent_containers/condiment/sugar, -/obj/item/reagent_containers/condiment/sugar, -/obj/item/reagent_containers/condiment/enzyme, -/turf/open/floor/wood, +"io" = ( +/obj/effect/spawner/random/entertainment/arcade{ + dir = 4 + }, +/turf/open/floor/wood/large, /area/awaymission/beach) -"cs" = ( -/obj/effect/spawner/random/vending/snackvend, -/obj/effect/turf_decal/sand, -/turf/open/misc/beach/sand, +"iq" = ( +/obj/machinery/washing_machine, +/obj/machinery/light/directional/north, +/turf/open/floor/plastic, /area/awaymission/beach) -"ct" = ( -/obj/effect/turf_decal/stripes/white/corner, -/turf/open/misc/beach/sand, +"iw" = ( +/obj/structure/sign/poster/official/fruit_bowl/directional/north, +/turf/open/floor/carpet, /area/awaymission/beach) -"cu" = ( -/obj/effect/turf_decal/stripes/white/line, -/turf/open/misc/beach/sand, +"iy" = ( +/obj/structure/sign/poster/contraband/pwr_game/directional/west, +/turf/open/floor/eighties, /area/awaymission/beach) -"cv" = ( -/obj/effect/turf_decal/stripes/white/corner{ +"iA" = ( +/obj/effect/turf_decal/siding/wood{ dir = 8 }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"cw" = ( -/obj/structure/closet/secure_closet/freezer/meat/open, -/obj/item/food/meat/slab/goliath, -/obj/item/food/meat/slab/xeno, -/obj/item/food/meat/slab/spider, -/obj/item/food/meat/slab/killertomato, -/obj/item/food/meat/slab/bear, -/obj/item/food/meat/slab/rawcrab, -/obj/item/food/meat/slab/rawcrab, -/obj/item/food/meat/slab/rawcrab, -/obj/item/food/meat/slab/rawcrab, -/obj/item/food/meat/slab/rawcrab, -/turf/open/floor/wood, +/turf/open/water/beach, /area/awaymission/beach) -"cx" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 +"iF" = ( +/obj/item/trash/candy{ + pixel_y = 9; + pixel_x = -9 }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"cy" = ( -/obj/effect/turf_decal/stripes/white/full, -/turf/open/misc/beach/sand, +/turf/open/floor/wood/large, /area/awaymission/beach) -"cz" = ( -/obj/effect/turf_decal/stripes/white/line{ +"iI" = ( +/mob/living/basic/crab, +/obj/effect/turf_decal/stripes/red/line{ dir = 8 }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"cA" = ( -/obj/structure/mineral_door/wood{ - name = "bar" - }, -/turf/open/floor/wood, +"iJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/rack, +/obj/effect/spawner/random/maintenance/three, +/obj/effect/decal/cleanable/cobweb, +/obj/item/wheelchair, +/turf/open/floor/plating, /area/awaymission/beach) -"cC" = ( -/obj/structure/table/wood, -/obj/item/food/burger/crab{ +"iM" = ( +/obj/structure/table/glass, +/obj/item/storage/box/coffeepack{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/storage/box/donkpockets{ + pixel_y = 10; + pixel_x = 11 + }, +/obj/item/storage/fancy/donut_box{ + pixel_y = 18; pixel_x = -11 }, -/turf/open/floor/wood, +/obj/item/food/donut/berry{ + pixel_y = 5; + pixel_x = -6 + }, +/turf/open/floor/iron/dark/diagonal, /area/awaymission/beach) -"cD" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/cup/rag{ - pixel_y = 7 +"iN" = ( +/obj/structure/table/wood/poker, +/obj/item/stack/spacecash/c100{ + pixel_y = 5 }, -/obj/item/food/burger/crab{ - pixel_x = -14; - pixel_y = 9 +/obj/item/toy/cards/deck{ + pixel_y = 13; + pixel_x = -5 }, -/turf/open/floor/wood, -/area/awaymission/beach) -"cE" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/cup/soda_cans/dr_gibb, -/turf/open/floor/wood, +/turf/open/floor/wood/large, /area/awaymission/beach) -"cF" = ( +"iU" = ( /obj/structure/table/wood, -/obj/item/reagent_containers/cup/soda_cans/lemon_lime, -/turf/open/floor/wood, +/obj/machinery/chem_dispenser/drinks/fullupgrade{ + dir = 4 + }, +/turf/open/floor/wood/large, /area/awaymission/beach) -"cG" = ( -/obj/item/toy/beach_ball, +"iW" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"cH" = ( -/obj/effect/turf_decal/sand, -/obj/structure/chair/stool/directional/north, -/turf/open/misc/beach/sand, +"iY" = ( +/obj/structure/sign/departments/custodian/directional/north{ + pixel_x = -32 + }, +/turf/open/floor/wood/large, /area/awaymission/beach) -"cI" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/barsign/all_access/directional/north, -/turf/open/misc/beach/sand, +"jm" = ( +/obj/structure/table/reinforced, +/obj/machinery/cell_charger{ + pixel_y = 13; + pixel_x = 21 + }, +/obj/item/clothing/glasses/hud/health{ + pixel_y = 1; + pixel_x = 18 + }, +/obj/item/stack/medical/gauze{ + pixel_x = -15; + pixel_y = 10 + }, +/obj/item/storage/belt/medical{ + pixel_y = 3; + pixel_x = -3 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/white/textured_large, /area/awaymission/beach) -"cJ" = ( -/obj/effect/turf_decal/stripes/white/corner, -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 +"jF" = ( +/obj/machinery/vending/boozeomat/all_access{ + desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one. May not work for bartenders that don't have Nanotrasen bank accounts." }, -/turf/open/misc/beach/sand, +/turf/open/floor/wood/large, /area/awaymission/beach) -"cL" = ( -/obj/structure/table, -/obj/item/clothing/under/color/rainbow, -/obj/item/clothing/glasses/sunglasses, -/obj/item/clothing/head/collectable/petehat{ - pixel_y = 5 +"jH" = ( +/obj/item/storage/box/fishing_hooks{ + pixel_y = 14 + }, +/obj/item/storage/box/fishing_lines{ + pixel_y = 12; + pixel_x = 18 }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"cM" = ( -/obj/structure/table, -/obj/item/food/chips, -/turf/open/misc/beach/sand, +"jI" = ( +/obj/structure/railing{ + dir = 10 + }, +/obj/item/kirbyplants/organic/plant8{ + pixel_y = 9; + pixel_x = 6 + }, +/turf/open/floor/wood, /area/awaymission/beach) -"cN" = ( -/obj/structure/table, -/obj/item/reagent_containers/cup/soda_cans/sodawater, -/obj/item/reagent_containers/cup/soda_cans/shamblers, -/obj/item/reagent_containers/cup/soda_cans/pwr_game, -/obj/item/reagent_containers/cup/soda_cans/air, -/obj/item/reagent_containers/cup/soda_cans/canned_laughter, -/obj/item/reagent_containers/cup/soda_cans/tonic, +"jM" = ( +/obj/item/clothing/head/soft/black{ + pixel_x = -1; + pixel_y = -3 + }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"cO" = ( -/obj/structure/chair, -/turf/open/misc/beach/sand, +"jU" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/plating, /area/awaymission/beach) -"cP" = ( -/obj/item/reagent_containers/cup/soda_cans/lemon_lime{ - pixel_x = -12; - pixel_y = -7 +"jW" = ( +/turf/closed/wall/mineral/sandstone, +/area/awaymission/beach) +"jZ" = ( +/obj/structure/bed/double, +/obj/item/bedsheet/hop/double{ + desc = "A blue bedsheet. Likely from the beach hotel."; + name = "blue bedsheet" }, -/obj/item/reagent_containers/cup/soda_cans/dr_gibb{ - pixel_x = 13; - pixel_y = -7 +/turf/open/floor/carpet/cyan, +/area/awaymission/beach) +"ke" = ( +/obj/effect/turf_decal/sand/plating, +/obj/item/reagent_containers/cup/bucket/wooden{ + pixel_y = 17; + pixel_x = -6 }, -/obj/structure/fluff/beach_umbrella, /turf/open/misc/beach/sand, /area/awaymission/beach) -"cQ" = ( +"kh" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"kl" = ( /obj/item/reagent_containers/cup/soda_cans/starkist{ pixel_x = -12; pixel_y = -6 @@ -807,14786 +808,68764 @@ /obj/structure/fluff/beach_umbrella/cap, /turf/open/misc/beach/sand, /area/awaymission/beach) -"cR" = ( -/obj/item/reagent_containers/cup/soda_cans/cola{ - pixel_x = -8; - pixel_y = -4 +"ko" = ( +/obj/structure/closet/secure_closet/freezer/empty, +/obj/item/food/popsicle/creamsicle_berry, +/obj/item/food/popsicle/creamsicle_berry, +/obj/item/food/popsicle/creamsicle_orange, +/obj/item/food/popsicle/creamsicle_orange, +/obj/item/food/popsicle/jumbo, +/obj/item/food/popsicle/pineapple_pop, +/obj/item/food/popsicle/pineapple_pop, +/obj/item/food/fishmeat, +/obj/item/food/fishmeat, +/obj/item/food/fishmeat, +/obj/item/food/fishmeat, +/obj/item/food/fishmeat, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"kp" = ( +/obj/effect/decal/cleanable/oil, +/obj/machinery/button/door/directional/south{ + id = "BeachGarage" }, -/turf/open/misc/beach/sand, +/turf/open/floor/iron/dark/herringbone, /area/awaymission/beach) -"cS" = ( -/obj/item/reagent_containers/cup/soda_cans/dr_gibb{ - pixel_x = -9; - pixel_y = -9 +"kz" = ( +/obj/item/storage/medkit/regular{ + pixel_y = 15; + pixel_x = -2 }, -/obj/structure/fluff/beach_umbrella/engine, -/turf/open/misc/beach/sand, +/obj/structure/table/glass, +/obj/item/emergency_bed{ + pixel_y = 6 + }, +/turf/open/floor/iron/white/textured_large, /area/awaymission/beach) -"cT" = ( -/obj/item/reagent_containers/cup/soda_cans/space_mountain_wind, -/turf/open/misc/beach/sand, +"kB" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/wood/large, /area/awaymission/beach) -"cU" = ( -/obj/item/reagent_containers/cup/soda_cans/cola{ +"kC" = ( +/obj/structure/sign/chalkboard_menu{ + pixel_y = 32 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"kD" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/glasses/heat, +/obj/item/clothing/head/cowboy/brown, +/turf/open/floor/wood, +/area/awaymission/beach) +"kG" = ( +/obj/effect/baseturf_helper/beach/sand, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"kI" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/carpet, +/area/awaymission/beach) +"kR" = ( +/obj/machinery/button/door/directional/north{ + id = "beach_room_12" + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"kZ" = ( +/turf/open/floor/eighties, +/area/awaymission/beach) +"lb" = ( +/obj/structure/railing/corner/end/flip{ + dir = 4 + }, +/turf/open/floor/wood/parquet, +/area/awaymission/beach) +"lf" = ( +/obj/structure/chair/stool/directional/south, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/freezer, +/area/awaymission/beach) +"li" = ( +/obj/machinery/chem_dispenser/drinks/beer/fullupgrade{ + dir = 4 + }, +/obj/structure/table/wood, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"lk" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/effect/turf_decal/tile/dark/half{ + pixel_y = -1; + pixel_x = 5; + dir = 8 + }, +/turf/open/water/beach, +/area/awaymission/beach) +"ll" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 11"; + id_tag = "beach_room_11" + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/awaymission/beach) +"ls" = ( +/obj/structure/flora/coconuts, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"lz" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 10"; + id_tag = "beach_room_10" + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/awaymission/beach) +"lB" = ( +/obj/machinery/door/poddoor/shutters{ + id = "BeachBoats" + }, +/turf/open/water/beach, +/area/awaymission/beach) +"lP" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 16 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"lS" = ( +/obj/machinery/medical_kiosk, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"lY" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plating, +/area/awaymission/beach) +"mb" = ( +/obj/structure/chair/stool/bar/directional/west, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"mf" = ( +/obj/item/toy/seashell, +/turf/open/misc/beach/coast/corner{ + dir = 8 + }, +/area/awaymission/beach) +"mg" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/under/costume/pirate, +/turf/open/floor/wood, +/area/awaymission/beach) +"mi" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/water/beach, +/area/awaymission/beach) +"mk" = ( +/obj/machinery/door/airlock/wood{ + name = "Trash Disposal" + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"mp" = ( +/obj/item/radio/off{ + pixel_y = 16; + pixel_x = -5 + }, +/obj/item/storage/box/monkeycubes{ + pixel_y = 10; + pixel_x = 4 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_y = 2 + }, +/obj/structure/table/glass, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"mG" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark/half{ + pixel_y = -1; + pixel_x = 5; + dir = 8 + }, +/turf/open/water/beach, +/area/awaymission/beach) +"mJ" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"mN" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"mO" = ( +/obj/item/reagent_containers/cup/soda_cans/sol_dry{ + pixel_y = 18; + pixel_x = 9 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"mP" = ( +/obj/structure/table/wood, +/obj/item/tape{ + pixel_y = 7; + pixel_x = 11 + }, +/obj/item/reagent_containers/cup/glass/coffee{ + pixel_x = -7; + pixel_y = 12 + }, +/obj/effect/spawner/random/bureaucracy/pen{ + pixel_x = -3; + pixel_y = -2 + }, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"mT" = ( +/obj/machinery/vending/games, +/turf/open/floor/eighties, +/area/awaymission/beach) +"mU" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/under/costume/sailor, +/turf/open/floor/wood, +/area/awaymission/beach) +"ni" = ( +/turf/open/misc/beach/coast{ + dir = 10 + }, +/area/awaymission/beach) +"nq" = ( +/obj/effect/turf_decal/sand, +/mob/living/basic/crab, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"nr" = ( +/obj/structure/mineral_door/sandstone{ + name = "Sandcastle" + }, +/obj/effect/turf_decal/sand/plating, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"ns" = ( +/obj/item/retractor{ + pixel_y = 8; + pixel_x = -2 + }, +/obj/item/cautery{ + pixel_y = 10 + }, +/obj/item/hemostat{ + pixel_y = -11 + }, +/obj/item/bonesetter{ + pixel_y = -12 + }, +/obj/structure/table/glass, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"nC" = ( +/obj/effect/turf_decal/tile/dark_red/full, +/turf/open/floor/iron/smooth_large, +/area/awaymission/beach) +"nD" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/door/airlock/wood{ + name = "Room 1" + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"nK" = ( +/obj/machinery/medical_kiosk, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach) +"nO" = ( +/obj/item/kirbyplants/organic/plant8{ + pixel_y = 5 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"nV" = ( +/obj/structure/flora/tree/palm/style_2{ + pixel_y = 25 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"nW" = ( +/obj/machinery/door/airlock/wood/glass{ + name = "Beach Access" + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"oa" = ( +/obj/machinery/door/airlock/wood/glass{ + name = "Rooms" + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"ob" = ( +/obj/machinery/door/airlock/wood{ + name = "Employees' Only" + }, +/turf/open/floor/plastic, +/area/awaymission/beach) +"oi" = ( +/obj/effect/turf_decal/siding/wood, +/obj/machinery/shower/directional/south, +/obj/structure/sink/directional/east, +/turf/open/floor/wood/parquet, +/area/awaymission/beach) +"om" = ( +/obj/item/trash/can{ + pixel_y = -5; + pixel_x = 4 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"oq" = ( +/obj/structure/rack, +/obj/item/melee/skateboard/hoverboard{ + pixel_x = -7 + }, +/obj/item/melee/skateboard/hoverboard, +/obj/item/melee/skateboard/hoverboard{ + pixel_x = 7 + }, +/turf/open/misc/beach/coast/corner{ + dir = 4 + }, +/area/awaymission/beach) +"ot" = ( +/obj/structure/chair/plastic{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"ow" = ( +/obj/machinery/reagentgrinder{ + pixel_y = 15; + pixel_x = -1 + }, +/obj/structure/table/bronze, +/obj/structure/desk_bell{ + pixel_x = 12; + pixel_y = 3 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"oC" = ( +/obj/structure/closet/crate/bin, +/obj/item/flashlight/glowstick/yellow, +/obj/item/trash/candy, +/turf/open/floor/eighties, +/area/awaymission/beach) +"oX" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/machinery/button/door/directional/west{ + id = "beach_room_7" + }, +/obj/item/clothing/suit/apron/overalls, +/turf/open/floor/wood, +/area/awaymission/beach) +"pd" = ( +/obj/effect/turf_decal/siding/dark_red{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"pr" = ( +/obj/item/reagent_containers/cup/soda_cans/space_mountain_wind{ + pixel_x = -17; + pixel_y = 17 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"pt" = ( +/obj/structure/table/bronze, +/obj/item/book/manual/wiki/barman_recipes{ + pixel_x = 9; + pixel_y = 7; + name = "Tropical Mixing for Tropical Bartenders" + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_y = 10; + pixel_x = -12 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"pw" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"pC" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/button/door/directional/south{ + id = "BeachBoats" + }, +/turf/open/floor/wood/parquet, +/area/awaymission/beach) +"pD" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 19; + pixel_x = 10 + }, +/obj/machinery/hydroponics/constructable, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"pE" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Temporary Holding Cell" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/access/all/security/entrance, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/beach) +"pF" = ( +/obj/structure/flora/tree/palm/style_2{ + pixel_y = 3; + pixel_x = -4 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"pM" = ( +/obj/structure/marker_beacon/teal, +/turf/open/water/beach, +/area/awaymission/beach) +"pN" = ( +/obj/machinery/processor, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"pO" = ( +/obj/machinery/door/airlock/wood{ + name = "Docks" + }, +/turf/open/floor/wood/parquet, +/area/awaymission/beach) +"pT" = ( +/obj/item/flashlight/flare/torch{ + pixel_x = -11; + pixel_y = -6 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"pX" = ( +/obj/structure/sink/kitchen/directional/south, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"qf" = ( +/obj/structure/table/bronze, +/obj/item/pai_card{ + desc = "A real Nanotrasen success, these personal AIs provide all of the companionship of an AI without any law related red-tape."; + name = "\improper Nanotrasen-brand personal AI device exhibit"; + pixel_y = 2 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"qk" = ( +/obj/machinery/telecomms/allinone, +/obj/item/wirecutters{ + pixel_y = 9 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"ql" = ( +/obj/effect/turf_decal/siding/blue/corner{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"qt" = ( +/obj/structure/table/wood, +/obj/item/melee/baseball_bat{ + pixel_y = 3; + pixel_x = 6 + }, +/obj/item/clothing/glasses/blindfold/white{ + pixel_y = 7; + pixel_x = -5 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"qy" = ( +/obj/machinery/door/airlock/wood{ + name = "Arcade" + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"qC" = ( +/obj/machinery/button/door/directional/west{ + id = "beach_room_1" + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"qX" = ( +/obj/structure/chair/stool/bar/directional/east, +/obj/machinery/light/directional/west, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"rd" = ( +/obj/structure/closet/crate/trashcart/laundry, +/turf/open/floor/plastic, +/area/awaymission/beach) +"re" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/suit/jacket/letterman_red, +/turf/open/floor/wood, +/area/awaymission/beach) +"rq" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 19; + pixel_x = 8 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"ru" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/wood, +/area/awaymission/beach) +"rA" = ( +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_x = -8; + pixel_y = -6 + }, +/obj/item/reagent_containers/cup/soda_cans/space_mountain_wind{ + pixel_x = 15 + }, +/obj/structure/fluff/beach_umbrella/science, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"rE" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"rF" = ( +/obj/machinery/grill, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"rQ" = ( +/obj/structure/table/bronze, +/obj/item/paper_bin/carbon{ + pixel_y = 8 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"rR" = ( +/obj/effect/turf_decal/siding/dark_red/corner{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"sc" = ( +/obj/structure/fluff/beach_umbrella/syndi, +/obj/item/reagent_containers/cup/soda_cans/wellcheers{ + pixel_y = -10; + pixel_x = -6 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"sd" = ( +/obj/item/cigbutt{ + pixel_y = -4; + pixel_x = 2 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"sj" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/water/beach, +/area/awaymission/beach) +"sp" = ( +/obj/item/reagent_containers/cup/soda_cans/space_mountain_wind, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"sL" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"sM" = ( +/obj/machinery/shower/directional/west, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"sP" = ( +/obj/structure/table/wood, +/obj/item/stack/arcadeticket{ + pixel_y = 3; + pixel_x = -5 + }, +/obj/item/reagent_containers/cup/soda_cans/pwr_game{ + pixel_y = 12; + pixel_x = -8 + }, +/obj/item/paper_bin/carbon{ + pixel_y = 6; + pixel_x = 4 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"sS" = ( +/turf/open/floor/plastic, +/area/awaymission/beach) +"sU" = ( +/obj/item/toy/plush/moth{ + pixel_y = 5 + }, +/turf/open/floor/carpet/red, +/area/awaymission/beach) +"to" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/machinery/shower/directional/south, +/turf/open/floor/wood/parquet, +/area/awaymission/beach) +"tr" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 6 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"tx" = ( +/obj/machinery/button/door/directional/north{ + id = "beach_room_3" + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"tz" = ( +/obj/structure/tank_holder/extinguisher{ + pixel_y = 11 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"tD" = ( +/obj/structure/table/glass, +/obj/item/paper{ + pixel_y = 7; + pixel_x = 2 + }, +/obj/item/screwdriver{ + pixel_y = 13; + pixel_x = 3 + }, +/obj/item/paper_bin/carbon{ + pixel_y = 4; + pixel_x = -6 + }, +/obj/effect/spawner/random/bureaucracy/pen{ + pixel_x = 7 + }, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"tE" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 19; + pixel_x = 7 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"tJ" = ( +/turf/open/misc/beach/coast/corner{ + dir = 8 + }, +/area/awaymission/beach) +"tK" = ( +/obj/structure/table, +/obj/item/book/manual/wiki/engineering_guide{ + pixel_y = 7; + pixel_x = -6 + }, +/obj/item/pen{ + pixel_x = 7; + pixel_y = 6 + }, +/obj/item/clothing/head/utility/welding{ + pixel_x = -10; + pixel_y = -8 + }, +/turf/open/floor/wood/parquet, +/area/awaymission/beach) +"tP" = ( +/obj/structure/chair/plastic{ + dir = 8 + }, +/obj/item/reagent_containers/cup/soda_cans/starkist{ + pixel_y = 10; + pixel_x = -17 + }, +/obj/item/fishing_rod{ + pixel_x = -13; + pixel_y = 2 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"tU" = ( +/obj/structure/table/bronze, +/turf/open/floor/carpet, +/area/awaymission/beach) +"uc" = ( +/obj/item/stack/arcadeticket{ + pixel_y = 5; + pixel_x = 13 + }, +/turf/open/floor/eighties, +/area/awaymission/beach) +"ug" = ( +/obj/structure/chair/stool/directional/south, +/turf/open/floor/iron/freezer, +/area/awaymission/beach) +"um" = ( +/obj/structure/table/bronze, +/obj/machinery/button/door/directional/south{ + id = "beach_room_11" + }, +/obj/item/storage/toolbox/fishing{ + pixel_y = 2 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"un" = ( +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"uo" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"uq" = ( +/obj/machinery/door/airlock/wood/glass{ + name = "Hotel's Facilities" + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"us" = ( +/obj/structure/closet/crate/bin, +/obj/structure/sign/clock/directional/north, +/turf/open/floor/wood, +/area/awaymission/beach) +"uu" = ( +/obj/structure/table/bronze, +/obj/item/reagent_containers/condiment/ketchup{ + pixel_y = 14; + pixel_x = 1 + }, +/obj/item/reagent_containers/condiment/mayonnaise{ + pixel_y = 8; + pixel_x = 8 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"uv" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark/half{ + pixel_x = 5; + dir = 8 + }, +/turf/open/water/beach, +/area/awaymission/beach) +"uz" = ( +/turf/open/floor/carpet/red, +/area/awaymission/beach) +"uG" = ( +/turf/open/floor/carpet/green, +/area/awaymission/beach) +"uJ" = ( +/obj/structure/table/wood, +/obj/item/food/donut/plain{ + pixel_y = -2; + pixel_x = 14 + }, +/obj/item/assembly/signaler{ + pixel_x = -6; + pixel_y = -5 + }, +/obj/effect/spawner/random/bureaucracy/folder{ + pixel_y = 11; + pixel_x = 4 + }, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"uL" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"uN" = ( +/obj/structure/table, +/obj/item/storage/belt/utility, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_y = 14; + pixel_x = -8 + }, +/turf/open/floor/wood/parquet, +/area/awaymission/beach) +"uP" = ( +/obj/structure/chair/plastic{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"uT" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/awaymission/beach) +"uV" = ( +/obj/structure/closet/crate/trashcart/filled, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"uY" = ( +/obj/item/toy/seashell{ + pixel_x = 12; + pixel_y = 5 + }, +/turf/open/misc/beach/coast{ + dir = 4 + }, +/area/awaymission/beach) +"uZ" = ( +/obj/item/circular_saw{ + pixel_y = 4 + }, +/obj/item/scalpel{ + pixel_y = 15 + }, +/obj/structure/table/glass, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"vc" = ( +/obj/structure/dresser, +/turf/open/floor/wood, +/area/awaymission/beach) +"vf" = ( +/obj/vehicle/ridden/atv{ + dir = 4 + }, +/obj/effect/decal/cleanable/oil, +/turf/open/floor/iron/dark/herringbone, +/area/awaymission/beach) +"vq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/landmark/awaystart, +/turf/open/floor/plating, +/area/awaymission/beach) +"vx" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/effect/turf_decal/tile/dark/half{ + pixel_y = -1; + pixel_x = 5; + dir = 8 + }, +/turf/open/water/beach, +/area/awaymission/beach) +"vF" = ( +/obj/structure/table/bronze, +/obj/structure/sign/poster/random/directional/east, +/obj/machinery/button/door/directional/south{ + id = "beach_room_8" + }, +/obj/item/camera{ + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"vM" = ( +/obj/structure/bed/double, +/obj/item/bedsheet/hos/double{ + name = "bedsheet"; + desc = "A bedsheet from the beach hotel." + }, +/turf/open/floor/carpet, +/area/awaymission/beach) +"vR" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/wood, +/area/awaymission/beach) +"vX" = ( +/obj/structure/chair/stool/bamboo{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"wd" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"wt" = ( +/obj/machinery/vending/cigarette/beach, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"wv" = ( +/obj/structure/railing/corner/end/flip{ + dir = 4 + }, +/obj/item/wrench{ + pixel_y = -1; + pixel_x = 6 + }, +/obj/item/storage/toolbox/fishing{ + pixel_y = -8; + pixel_x = -3 + }, +/turf/open/floor/wood/parquet, +/area/awaymission/beach) +"wA" = ( +/obj/structure/flora/tree/palm, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"wC" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"wL" = ( +/obj/structure/table/bronze, +/obj/item/food/grown/banana/bunch{ + pixel_y = 10; + offset_at_init = 0 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"wX" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 9"; + id_tag = "beach_room_9" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"wY" = ( +/obj/effect/turf_decal/sand/plating, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"xi" = ( +/obj/effect/turf_decal/sand, +/turf/closed/wall/mineral/wood, +/area/awaymission/beach) +"xo" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/button/door/directional/east{ + id = "toilet3beach"; + name = "restroom lock"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/structure/toilet{ + pixel_y = 8 + }, +/obj/structure/sink/directional/west, +/obj/item/cigbutt{ + pixel_y = -7; + pixel_x = -13 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/white, +/area/awaymission/beach) +"xp" = ( +/obj/structure/sign/poster/official/tactical_game_cards/directional/west, +/turf/open/floor/eighties, +/area/awaymission/beach) +"xr" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/door/airlock/wood{ + name = "Tropical Kitchen" + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"xv" = ( +/turf/closed/wall/mineral/wood, +/area/awaymission/beach) +"xE" = ( +/obj/structure/table/wood, +/obj/item/storage/box/drinkingglasses{ + pixel_y = 18; + pixel_x = -5 + }, +/obj/item/reagent_containers/cup/glass/shaker{ + pixel_y = 12; + pixel_x = -7 + }, +/obj/item/clothing/head/hats/tophat{ + pixel_y = 2; + pixel_x = 3 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"xI" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"yc" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/eighties, +/area/awaymission/beach) +"yn" = ( +/obj/effect/turf_decal/siding/wood, +/obj/item/kirbyplants/organic/plant8{ + pixel_y = 6 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/eighties, +/area/awaymission/beach) +"yq" = ( +/obj/item/storage/toolbox/fishing{ + pixel_x = 2; + pixel_y = -13 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"yt" = ( +/obj/structure/table/bronze, +/obj/item/camera{ + pixel_y = 12; + pixel_x = 6 + }, +/obj/item/camera_film{ + pixel_y = 4; + pixel_x = -2 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"yE" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 8"; + id_tag = "beach_room_8" + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"yF" = ( +/obj/structure/chair/plastic, +/obj/item/fishing_rod{ + pixel_x = 11; + pixel_y = -8 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"yL" = ( +/obj/item/cigbutt{ + pixel_y = -7; + pixel_x = 14 + }, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"yO" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_y = 12; + pixel_x = 3 + }, +/obj/item/stock_parts/cell/emproof{ + pixel_x = -4; + pixel_y = 6 + }, +/obj/item/clothing/head/soft/mime{ + pixel_y = 3; + pixel_x = 5 + }, +/turf/open/floor/wood/parquet, +/area/awaymission/beach) +"yT" = ( +/obj/item/toy/seashell{ + pixel_y = -5 + }, +/turf/open/misc/beach/coast, +/area/awaymission/beach) +"yX" = ( +/obj/structure/table/wood/poker, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"yZ" = ( +/obj/machinery/space_heater, +/obj/machinery/button/door/directional/north{ + id = "beach_room_2" + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"zp" = ( +/obj/structure/table/wood, +/obj/item/clothing/suit/apron/chef{ + pixel_y = 5; + pixel_x = 2 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"zr" = ( +/obj/item/toy/dodgeball{ + name = "William"; + desc = "It's just not the same thing."; + pixel_y = -4; + pixel_x = 7 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"zs" = ( +/obj/effect/spawner/random/entertainment/arcade{ + dir = 4 + }, +/turf/open/floor/eighties, +/area/awaymission/beach) +"zA" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/item/cigbutt{ + pixel_y = -6; + pixel_x = -12 + }, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"zH" = ( +/obj/structure/table/wood/poker, +/obj/item/storage/dice{ + pixel_y = 3; + pixel_x = 5 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"zI" = ( +/obj/machinery/defibrillator_mount/directional/west, +/obj/structure/bed/pod{ + desc = "An old medical bed, just waiting for replacement with something up to date."; + dir = 4; + name = "medical bed" + }, +/obj/machinery/iv_drip{ + pixel_y = 21; + pixel_x = -4 + }, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach) +"zK" = ( +/obj/structure/table, +/obj/item/weldingtool{ + pixel_y = -7; + pixel_x = 4 + }, +/obj/item/trash/can{ + pixel_y = 10; + pixel_x = -5 + }, +/turf/open/floor/wood/parquet, +/area/awaymission/beach) +"zX" = ( +/obj/item/storage/toolbox/fishing{ + pixel_x = 10 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Aa" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/condiment/enzyme{ + layer = 5; + pixel_x = 9; + pixel_y = 5 + }, +/obj/item/food/seaweedsheet{ + pixel_y = 6; + pixel_x = -4 + }, +/obj/item/food/seaweedsheet{ + pixel_x = -15; + pixel_y = 2 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Ar" = ( +/turf/open/floor/carpet/blue, +/area/awaymission/beach) +"Av" = ( +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_x = -8; + pixel_y = -4 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"AB" = ( +/obj/structure/table/bronze, +/obj/item/pai_card{ + desc = "A real Nanotrasen success, these personal AIs provide all of the companionship of an AI without any law related red-tape."; + name = "\improper Nanotrasen-brand personal AI device exhibit"; + pixel_y = 4 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"AG" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/suit/jacket/letterman_nanotrasen, +/obj/item/clothing/glasses/salesman, +/turf/open/floor/wood, +/area/awaymission/beach) +"AH" = ( +/obj/item/reagent_containers/cup/bucket/wooden{ + pixel_y = -5; + pixel_x = -11 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"AP" = ( +/obj/machinery/door/airlock/wood{ + name = "Changing Room" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/iron/freezer, +/area/awaymission/beach) +"AU" = ( +/obj/structure/fluff/beach_umbrella/syndi, +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_x = -8; + pixel_y = -6 + }, +/obj/item/reagent_containers/cup/soda_cans/thirteenloko{ + pixel_x = 15; + pixel_y = -11 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"AW" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 2"; + id_tag = "beach_room_2" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/sign/poster/random/directional/east, +/turf/open/floor/wood, +/area/awaymission/beach) +"Bl" = ( +/obj/structure/statue/sandstone/venus{ + dir = 4; + pixel_y = 9; + anchored = 1 + }, +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/floor/grass, +/area/awaymission/beach) +"Bm" = ( +/obj/machinery/washing_machine, +/turf/open/floor/plastic, +/area/awaymission/beach) +"Bq" = ( +/obj/machinery/computer/operating{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Bv" = ( +/obj/machinery/door/poddoor/shutters{ + dir = 4; + id = "BeachGarage" + }, +/turf/open/floor/plating, +/area/awaymission/beach) +"BD" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/railing/corner/end{ + dir = 8 + }, +/turf/open/water/beach, +/area/awaymission/beach) +"BK" = ( +/turf/open/misc/beach/coast, +/area/awaymission/beach) +"BL" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"BN" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/machinery/vending/cola/red, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"BQ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Cb" = ( +/obj/structure/table/wood, +/obj/item/modular_computer/laptop{ + pixel_y = 5 + }, +/obj/item/multitool{ + pixel_x = -8; + pixel_y = -8 + }, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"Ce" = ( +/obj/structure/table, +/obj/item/wrench{ + pixel_y = 4 + }, +/obj/item/storage/toolbox/emergency, +/obj/effect/decal/cleanable/oil, +/turf/open/floor/iron/dark/herringbone, +/area/awaymission/beach) +"Cf" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/water/beach, +/area/awaymission/beach) +"Cg" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/button/door/directional/east{ + id = "toiletfarbeach"; + name = "restroom lock"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/structure/toilet{ + pixel_y = 8 + }, +/obj/structure/sink/directional/west, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/white, +/area/awaymission/beach) +"Cl" = ( +/obj/machinery/vending/dinnerware, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Cp" = ( +/obj/structure/fluff/beach_umbrella/syndi, +/turf/open/misc/beach/coast/corner{ + dir = 8 + }, +/area/awaymission/beach) +"Cv" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/obj/structure/chair/plastic{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Cy" = ( +/obj/structure/closet/crate/bin, +/obj/item/trash/candy, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"CF" = ( +/obj/structure/flora/tree/palm/style_2{ + pixel_y = 25 + }, +/obj/item/stack/sheet/mineral/sandstone/thirty{ + pixel_y = -10; + pixel_x = -5 + }, +/obj/item/stack/sheet/mineral/sandstone/thirty{ + pixel_y = -2; + pixel_x = 9 + }, +/obj/item/stack/sheet/mineral/sandstone/thirty{ + pixel_y = -4; + pixel_x = 1 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"CG" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/water/beach, +/area/awaymission/beach) +"CH" = ( +/obj/structure/railing{ + dir = 5 + }, +/obj/item/kirbyplants/organic/plant8{ + pixel_y = 3; + pixel_x = -2 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"CJ" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"CQ" = ( +/obj/machinery/space_heater, +/turf/open/floor/wood, +/area/awaymission/beach) +"CR" = ( +/obj/structure/table/bronze, +/obj/item/camera{ + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"CY" = ( +/obj/machinery/shower/directional/south, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/wood/parquet, +/area/awaymission/beach) +"Da" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Dj" = ( +/obj/item/kirbyplants/organic/plant8{ + pixel_y = 4; + pixel_x = 8 + }, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"Dv" = ( +/obj/item/storage/bag/tray, +/obj/item/food/grown/watermelon{ + pixel_y = 4; + pixel_x = -1 + }, +/obj/effect/turf_decal/stripes/red/box, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Dy" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/item/stack/arcadeticket{ + pixel_y = 12; + pixel_x = -16 + }, +/turf/open/floor/eighties, +/area/awaymission/beach) +"DD" = ( +/obj/structure/closet{ + name = "Holding Cell Storage" + }, +/obj/item/taperecorder, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"DF" = ( +/obj/item/toy/seashell{ + pixel_y = 3; + pixel_x = -6 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"DH" = ( +/obj/effect/turf_decal/siding/dark_red{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"DR" = ( +/obj/structure/table/bronze, +/obj/item/camera{ + pixel_y = 8; + pixel_x = -3 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"DU" = ( +/obj/structure/table/bronze, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"DV" = ( +/obj/structure/table/bronze, +/obj/machinery/button/door/directional/south{ + id = "beach_room_4" + }, +/obj/item/storage/toolbox/fishing{ + pixel_y = 2 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"DY" = ( +/obj/machinery/oven/range, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Ea" = ( +/obj/machinery/griddle, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Eb" = ( +/obj/structure/closet/crate/freezer, +/obj/item/food/meat/slab/rawcrab, +/obj/item/food/meat/slab/rawcrab, +/obj/item/food/meat/slab/rawcrab, +/obj/item/food/meat/slab/chicken, +/obj/item/food/meat/slab/chicken, +/obj/item/food/meat/slab/chicken, +/obj/item/food/meat/slab, +/obj/item/food/meat/slab, +/obj/item/food/meat/slab, +/obj/item/stack/sheet/mineral/coal/ten, +/obj/item/stack/sheet/mineral/coal/ten, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Ej" = ( +/obj/item/tank/internals/anesthetic{ + pixel_y = 4 + }, +/obj/item/stack/medical/bone_gel{ + pixel_y = 16; + pixel_x = -7 + }, +/obj/item/clothing/mask/breath/medical{ + pixel_y = 3; + pixel_x = 3 + }, +/obj/structure/table/bronze, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Em" = ( +/turf/open/floor/carpet/cyan, +/area/awaymission/beach) +"Er" = ( +/obj/item/toy/seashell{ + pixel_y = -15 + }, +/obj/item/toy/seashell{ + pixel_y = -3; + pixel_x = -18 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Es" = ( +/obj/structure/table/bronze, +/obj/item/table_clock{ + pixel_y = 13 + }, +/obj/structure/sign/poster/random/directional/east, +/turf/open/floor/wood, +/area/awaymission/beach) +"EB" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 16; + pixel_x = 12 + }, +/obj/structure/flora/coconuts, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"EC" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"EF" = ( +/obj/structure/railing/corner/end{ + dir = 8 + }, +/turf/open/water/beach, +/area/awaymission/beach) +"EG" = ( +/obj/machinery/recharge_station, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"EH" = ( +/obj/structure/mop_bucket/janitorialcart{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"EO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/box/lights/mixed{ + pixel_x = -4; + pixel_y = 18 + }, +/obj/item/storage/box/lights/mixed{ + pixel_x = 6; + pixel_y = 12 + }, +/obj/item/grenade/chem_grenade/cleaner{ + pixel_x = -7; + pixel_y = 12 + }, +/obj/structure/table, +/obj/item/reagent_containers/cup/bucket{ + pixel_x = 10; + pixel_y = 4 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"EP" = ( +/obj/machinery/door/airlock/wood{ + name = "Janitorial" + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"EU" = ( +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_x = -8; + pixel_y = 13 + }, +/turf/open/floor/carpet/blue, +/area/awaymission/beach) +"Fb" = ( +/turf/open/misc/beach/coast{ + dir = 4 + }, +/area/awaymission/beach) +"Fe" = ( +/obj/item/storage/box/gloves{ + pixel_y = 14; + pixel_x = 7 + }, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach) +"Ff" = ( +/obj/item/reagent_containers/cup/soda_cans/lemon_lime{ + pixel_x = -12 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Fg" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/suit/jacket/letterman_syndie, +/turf/open/floor/wood, +/area/awaymission/beach) +"Fk" = ( +/obj/item/toy/seashell, +/turf/open/misc/beach/coast, +/area/awaymission/beach) +"Ft" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/window/reinforced/spawner/directional/north{ + layer = 2.9 + }, +/obj/structure/chair/stool/directional/south, +/obj/item/clothing/glasses/sunglasses{ + pixel_y = -2; + pixel_x = 2 + }, +/obj/item/bikehorn/airhorn{ + pixel_y = -15; + pixel_x = -13 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"Fu" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 31 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"FB" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/button/door/directional/east{ + id = "toilet2beach"; + name = "restroom lock"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/structure/toilet{ + pixel_y = 8 + }, +/obj/structure/sink/directional/west, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/white, +/area/awaymission/beach) +"FD" = ( +/obj/item/toy/seashell{ + pixel_x = -7; + pixel_y = 5 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"FE" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/eighties, +/area/awaymission/beach) +"FF" = ( +/obj/machinery/gateway/away, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/awaymission/beach) +"FH" = ( +/obj/structure/table/wood, +/obj/item/food/grown/watermelon{ + pixel_y = 13; + pixel_x = 6 + }, +/obj/item/food/grown/watermelon{ + pixel_y = 8; + pixel_x = -4 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"FJ" = ( +/obj/item/instrument/guitar{ + pixel_y = 4; + pixel_x = -1 + }, +/turf/open/misc/beach/coast, +/area/awaymission/beach) +"FK" = ( +/obj/item/toy/seashell{ + pixel_x = 12; + pixel_y = -9 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"FL" = ( +/obj/effect/turf_decal/siding/blue/corner{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"FM" = ( +/obj/structure/railing{ + dir = 9 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"FP" = ( +/obj/item/kirbyplants/organic/plant24{ + pixel_x = 7; + pixel_y = 10 + }, +/obj/item/reagent_containers/cup/watering_can{ + pixel_x = -3; + pixel_y = 15 + }, +/obj/structure/table, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"FU" = ( +/obj/structure/railing/corner/end/flip{ + dir = 4 + }, +/obj/item/cigbutt{ + pixel_y = -6; + pixel_x = -12 + }, +/turf/open/floor/wood/parquet, +/area/awaymission/beach) +"FY" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Ge" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/awaymission/beach) +"Gf" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/carpet, +/area/awaymission/beach) +"Gh" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/water/beach, +/area/awaymission/beach) +"Gi" = ( +/obj/structure/closet/crate/bin, +/obj/item/reagent_containers/syringe{ + pixel_y = -4; + pixel_x = 3 + }, +/obj/effect/spawner/random/trash/food_packaging, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach) +"Gm" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/door/airlock/wood{ + name = "Bathroom"; + id_tag = "toilet1beach" + }, +/turf/open/floor/iron/white, +/area/awaymission/beach) +"Gn" = ( +/turf/open/floor/wood, +/area/awaymission/beach) +"Gq" = ( +/obj/structure/tank_holder/extinguisher{ + pixel_y = 11 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Gu" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"GC" = ( +/turf/open/floor/carpet, +/area/awaymission/beach) +"GG" = ( +/obj/item/toy/seashell, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"GI" = ( +/obj/structure/bonfire, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"GN" = ( +/obj/machinery/icecream_vat, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Ha" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/reagent_dispensers/fueltank/large, +/turf/open/floor/wood/parquet, +/area/awaymission/beach) +"Hg" = ( +/obj/item/stack/sheet/mineral/sandstone{ + pixel_x = -11; + pixel_y = -2 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Hn" = ( +/obj/structure/flora/tree/palm/style_2{ + pixel_y = 6 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Hq" = ( +/obj/structure/closet/secure_closet/personal, +/turf/open/floor/wood/parquet, +/area/awaymission/beach) +"Hv" = ( +/obj/structure/dresser, +/obj/machinery/light/directional/north, +/turf/open/floor/wood, +/area/awaymission/beach) +"HF" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/herringbone, +/area/awaymission/beach) +"HU" = ( +/obj/structure/table/bronze, +/obj/item/camera{ + pixel_y = 12; + pixel_x = -10 + }, +/obj/item/camera{ + pixel_y = 4; + pixel_x = 1 + }, +/obj/item/camera_film{ + pixel_y = -11; + pixel_x = -10 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"HV" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/water/beach, +/area/awaymission/beach) +"Ia" = ( +/obj/effect/turf_decal/siding/wood, +/turf/closed/wall/mineral/wood, +/area/awaymission/beach) +"Ic" = ( +/obj/structure/table/reinforced, +/obj/item/defibrillator/loaded{ + pixel_y = 7 + }, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach) +"Ih" = ( +/obj/structure/table/reinforced, +/obj/item/storage/medkit/brute{ + pixel_y = 9; + pixel_x = 2 + }, +/obj/item/storage/medkit/o2{ + pixel_y = 15; + pixel_x = 2 + }, +/obj/item/reagent_containers/cup/bottle/multiver{ + pixel_x = -9; + pixel_y = 3 + }, +/obj/item/reagent_containers/syringe{ + pixel_y = -4; + pixel_x = 3 + }, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach) +"Il" = ( +/obj/machinery/vending/autodrobe/all_access, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"It" = ( +/obj/item/clothing/head/soft/green, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Iw" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/awaymission/beach) +"IA" = ( +/obj/structure/fluff/beach_umbrella/science, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"IE" = ( +/obj/structure/table/bronze, +/obj/item/clothing/suit/costume/hawaiian{ + pixel_y = 1; + pixel_x = 7 + }, +/obj/item/clothing/suit/costume/hawaiian{ + pixel_x = -14 + }, +/turf/open/floor/wood/parquet, +/area/awaymission/beach) +"II" = ( +/obj/machinery/shower/directional/west, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"IP" = ( +/obj/machinery/computer/order_console/cook, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"IW" = ( +/obj/structure/closet/athletic_mixed, +/turf/open/floor/iron/freezer, +/area/awaymission/beach) +"IZ" = ( +/mob/living/basic/crab, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Ja" = ( +/obj/structure/table/bronze, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_y = 12 + }, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -5; + pixel_y = 9 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Ji" = ( +/obj/effect/turf_decal/stripes/white/full, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Jj" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/door/airlock/wood{ + name = "Room 6"; + id_tag = "beach_room_6" + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"Jo" = ( +/obj/item/reagent_containers/cup/glass/bottle/beer/light{ + pixel_x = -14; + pixel_y = 15 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Jr" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"JF" = ( +/obj/structure/marker_beacon/burgundy, +/turf/open/water/beach, +/area/awaymission/beach) +"JG" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 4"; + id_tag = "beach_room_4" + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/awaymission/beach) +"JO" = ( +/obj/machinery/vending/cigarette/beach, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"JQ" = ( +/turf/open/floor/iron/stairs, +/area/awaymission/beach) +"JR" = ( +/obj/structure/chair/stool/bamboo{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Ka" = ( +/obj/structure/bed/pod{ + desc = "An old medical bed, just waiting for replacement with something up to date."; + dir = 4; + name = "medical bed" + }, +/obj/machinery/defibrillator_mount/directional/east, +/obj/machinery/iv_drip{ + pixel_y = 21; + pixel_x = -4 + }, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach) +"Kh" = ( +/turf/open/misc/beach/coast/corner, +/area/awaymission/beach) +"Km" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 7; + pixel_x = 9 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Kn" = ( +/obj/structure/statue/sandstone/venus{ + dir = 4; + pixel_y = 9 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Kw" = ( +/obj/item/reagent_containers/cup/soda_cans/dr_gibb{ + pixel_x = -9; + pixel_y = -9 + }, +/obj/structure/fluff/beach_umbrella/engine, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Ky" = ( +/obj/structure/table/reinforced, +/obj/item/storage/medkit/o2{ + pixel_y = 17; + pixel_x = -1 + }, +/obj/item/storage/medkit/brute{ + pixel_y = 23; + pixel_x = -1 + }, +/obj/item/food/lollipop{ + pixel_y = 8; + pixel_x = 12 + }, +/obj/item/food/lollipop{ + pixel_y = 5; + pixel_x = 12 + }, +/obj/item/reagent_containers/cup/bottle/multiver{ + pixel_x = -9; + pixel_y = 9 + }, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach) +"KB" = ( +/obj/structure/dresser, +/obj/structure/sign/clock/directional/east, +/turf/open/floor/wood, +/area/awaymission/beach) +"KK" = ( +/obj/effect/turf_decal/siding/dark_red, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"KL" = ( +/obj/item/stack/sheet/mineral/sandstone{ + pixel_x = 11 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"KV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/plating, +/area/awaymission/beach) +"KW" = ( +/obj/structure/fluff/beach_umbrella/syndi, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"La" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/structure/crate_empty, +/obj/effect/spawner/random/maintenance/two, +/obj/item/storage/toolbox/fishing{ + pixel_y = 2 + }, +/turf/open/floor/plating, +/area/awaymission/beach) +"Ld" = ( +/obj/item/toy/seashell{ pixel_x = -8; + pixel_y = 9 + }, +/turf/open/misc/beach/coast/corner{ + dir = 1 + }, +/area/awaymission/beach) +"Le" = ( +/turf/open/misc/beach/coast{ + dir = 8 + }, +/area/awaymission/beach) +"Lg" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"Ll" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Lt" = ( +/obj/structure/rack, +/obj/effect/turf_decal/sand, +/obj/item/clothing/shoes/sandal{ + pixel_y = 4; + pixel_x = 8 + }, +/obj/item/clothing/shoes/sandal{ + pixel_x = 4 + }, +/obj/item/clothing/shoes/sandal{ + pixel_y = -4 + }, +/obj/item/clothing/shoes/sandal{ + pixel_y = -7; + pixel_x = -3 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"LC" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/water/beach, +/area/awaymission/beach) +"LJ" = ( +/obj/structure/railing/corner/end/flip{ + dir = 1 + }, +/obj/machinery/door/airlock/wood{ + name = "Balcony"; + id_tag = "beach_room_x" + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"LQ" = ( +/obj/effect/turf_decal/tile/dark_red/full, +/obj/machinery/vending/cola/red, +/turf/open/floor/iron/smooth_large, +/area/awaymission/beach) +"LS" = ( +/obj/machinery/space_heater, +/obj/machinery/light/directional/north, +/turf/open/floor/wood, +/area/awaymission/beach) +"Mm" = ( +/obj/structure/table/bronze, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Mn" = ( +/obj/structure/table/wood, +/obj/item/book/manual/chef_recipes{ + pixel_x = 2; + pixel_y = 6 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Mo" = ( +/obj/structure/statue/sandstone/venus{ + pixel_y = 9; + dir = 1; + anchored = 1 + }, +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/floor/grass, +/area/awaymission/beach) +"Mr" = ( +/obj/effect/turf_decal/siding/blue/corner{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"MD" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/entertainment/lighter, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"MF" = ( +/turf/open/misc/beach/coast/corner{ + dir = 4 + }, +/area/awaymission/beach) +"MG" = ( +/obj/structure/chair/stool/bamboo{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"MH" = ( +/obj/structure/closet, +/obj/item/key/atv{ + pixel_x = -4 + }, +/obj/item/key/atv{ + pixel_x = 5; + pixel_y = 3 + }, +/obj/item/key/atv{ + pixel_x = 1; + pixel_y = 1 + }, +/obj/item/clothing/head/soft/black, +/obj/item/clothing/head/soft/black, +/obj/item/clothing/head/soft/black, +/obj/effect/decal/cleanable/oil, +/obj/item/clothing/glasses/sunglasses, +/obj/item/clothing/glasses/heat, +/turf/open/floor/iron/dark/herringbone, +/area/awaymission/beach) +"MK" = ( +/turf/open/floor/iron/dark/herringbone, +/area/awaymission/beach) +"MN" = ( +/obj/item/stack/arcadeticket{ + pixel_y = -1; + pixel_x = -6 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"MO" = ( +/obj/item/trash/boritos/purple{ + pixel_y = -16; + pixel_x = -5 + }, +/turf/open/floor/eighties, +/area/awaymission/beach) +"MP" = ( +/obj/structure/table/bronze, +/obj/structure/sign/poster/random/directional/east, +/obj/item/camera{ + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"MT" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 5 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"MV" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay Clinic" + }, +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach) +"MX" = ( +/obj/structure/chair/plastic{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"MZ" = ( +/turf/open/misc/beach/coast{ + dir = 9 + }, +/area/awaymission/beach) +"Nb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/maintenance, +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating, +/area/awaymission/beach) +"Nd" = ( +/obj/machinery/button/door/directional/south{ + id = "beach_room_5" + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"Ne" = ( +/obj/structure/closet/crate/bin, +/obj/effect/spawner/random/trash/cigbutt, +/obj/effect/spawner/random/trash/food_packaging, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"Nf" = ( +/obj/structure/table/wood, +/obj/item/food/seaweedsheet, +/obj/item/kitchen/rollingpin{ + pixel_x = -12; + pixel_y = 3 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Nh" = ( +/obj/effect/turf_decal/sand, +/obj/structure/bedsheetbin{ + pixel_y = 3; + pixel_x = -1 + }, +/obj/structure/table, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Nk" = ( +/obj/machinery/door/airlock/wood{ + name = "Balcony"; + id_tag = "beach_room_x" + }, +/obj/structure/railing/corner/end/flip{ + dir = 1 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"Nl" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Nm" = ( +/obj/structure/flora/coconuts{ + pixel_x = -5; + pixel_y = 4 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"NF" = ( +/obj/item/toy/seashell{ + pixel_x = -10; + pixel_y = -4 + }, +/obj/structure/fluff/beach_umbrella, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"NH" = ( +/obj/machinery/door/airlock/wood/glass{ + name = "Cabin" + }, +/turf/open/floor/carpet, +/area/awaymission/beach) +"NS" = ( +/obj/structure/table/bronze, +/obj/item/storage/bag/tray, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"NU" = ( +/obj/machinery/vending/medical{ + req_access = "201" + }, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach) +"Og" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"On" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/beach) +"Ow" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/water/beach, +/area/awaymission/beach) +"OD" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"OE" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/machinery/button/door/directional/west{ + id = "beach_room_6" + }, +/obj/item/clothing/suit/jacket/leather/biker, +/turf/open/floor/wood, +/area/awaymission/beach) +"OG" = ( +/obj/effect/turf_decal/siding/dark_red/corner, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"OK" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark/half{ + pixel_y = -2; + pixel_x = 5; + dir = 8 + }, +/turf/open/water/beach, +/area/awaymission/beach) +"OT" = ( +/obj/item/reagent_containers/cup/soda_cans/lemon_lime{ + pixel_x = -12; + pixel_y = -7 + }, +/obj/item/reagent_containers/cup/soda_cans/dr_gibb{ + pixel_x = 13; + pixel_y = -7 + }, +/obj/structure/fluff/beach_umbrella, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"OU" = ( +/obj/structure/chair/plastic, +/obj/item/pai_card{ + desc = "A real Nanotrasen success, these personal AIs provide all of the companionship of an AI without any law related red-tape."; + name = "\improper Nanotrasen-brand personal AI device exhibit"; + pixel_y = 3; + pixel_x = -1 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Pe" = ( +/turf/open/misc/beach/coast{ + dir = 5 + }, +/area/awaymission/beach) +"Pk" = ( +/obj/structure/table/glass, +/obj/machinery/fax{ + fax_name = "Beach Hotel Fax"; + name = "Beach Hotel's Fax Machine"; + pixel_y = 8; + visible_to_network = 0 + }, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"Pn" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"Pt" = ( +/obj/machinery/door/airlock/command/glass{ + name = "Admin" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock_note_placer{ + note_info = "Dear IT: Please fix the fax machine" + }, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"Py" = ( +/obj/structure/tank_holder/extinguisher, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"PH" = ( +/obj/effect/turf_decal/siding/blue/corner, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"PN" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Qe" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/door/airlock/wood{ + name = "Bathroom"; + id_tag = "toilet3beach" + }, +/turf/open/floor/iron/white, +/area/awaymission/beach) +"Qf" = ( +/obj/structure/dresser, +/obj/structure/sign/calendar/directional/north, +/turf/open/floor/wood, +/area/awaymission/beach) +"Qg" = ( +/turf/open/floor/wood/parquet, +/area/awaymission/beach) +"Qk" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/suit/jacket/miljacket, +/turf/open/floor/wood, +/area/awaymission/beach) +"Qr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/food_cart, +/turf/open/floor/plating, +/area/awaymission/beach) +"Qt" = ( +/obj/item/kirbyplants/organic/plant8{ + pixel_y = 18; + pixel_x = -8 + }, +/obj/item/cigbutt{ + pixel_y = -4; + pixel_x = 2 + }, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/beach) +"QF" = ( +/obj/structure/sink/kitchen/directional/east, +/turf/open/floor/plastic, +/area/awaymission/beach) +"QG" = ( +/obj/structure/chair/plastic{ + dir = 8 + }, +/obj/item/reagent_containers/cup/soda_cans/melon_soda{ + pixel_y = 13; + pixel_x = -9 + }, +/obj/item/fishing_rod{ + pixel_x = 8; pixel_y = -6 }, -/obj/item/reagent_containers/cup/soda_cans/space_mountain_wind{ - pixel_x = 15 +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"QI" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 12"; + id_tag = "beach_room_12" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/awaymission/beach) +"QM" = ( +/obj/structure/table/wood, +/obj/item/stack/arcadeticket{ + pixel_y = 6; + pixel_x = -7 + }, +/obj/item/pen{ + pixel_y = 5; + pixel_x = 8 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"QN" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"QO" = ( +/obj/item/trash/can{ + pixel_y = -9; + pixel_x = 10 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"QR" = ( +/obj/item/kirbyplants/organic/plant21{ + pixel_y = 3; + pixel_x = -6 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Rj" = ( +/turf/open/misc/beach/coast{ + dir = 6 + }, +/area/awaymission/beach) +"Rn" = ( +/obj/effect/turf_decal/stripes/red/box, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Rr" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 10; + pixel_x = 7 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Rs" = ( +/obj/structure/flora/tree/palm/style_2{ + pixel_y = 25 + }, +/obj/structure/chair/plastic{ + dir = 4 }, -/obj/structure/fluff/beach_umbrella/science, /turf/open/misc/beach/sand, /area/awaymission/beach) -"cV" = ( -/obj/structure/flora/coconuts{ - pixel_x = -5; - pixel_y = 4 +"RA" = ( +/obj/item/kirbyplants/organic/plant8{ + pixel_y = 18; + pixel_x = -8 }, -/turf/open/misc/beach/coast, +/turf/open/floor/wood/large, /area/awaymission/beach) -"cW" = ( -/obj/item/reagent_containers/cup/soda_cans/lemon_lime{ - pixel_x = -12 +"RE" = ( +/obj/structure/chair/stool/bamboo{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"RI" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay Clinic" + }, +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach) +"RQ" = ( +/obj/structure/closet/crate, +/obj/item/clothing/suit/hooded/carp_costume, +/obj/item/clothing/head/hooded/carp_hood, +/obj/item/toy/plush/carpplushie, +/obj/item/toy/plush/shark, +/turf/open/floor/eighties, +/area/awaymission/beach) +"Sg" = ( +/obj/structure/table/bronze, +/obj/item/reagent_containers/cup/rag{ + pixel_y = 5 + }, +/obj/item/reagent_containers/condiment/coconut_milk{ + pixel_y = 14; + pixel_x = 5 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Sj" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"cX" = ( +"Sr" = ( +/obj/structure/table/wood/fancy, +/obj/effect/turf_decal/tile/dark_red/full, /obj/item/reagent_containers/cup/soda_cans/cola{ pixel_x = -5; - pixel_y = -5 + pixel_y = 14 }, -/obj/structure/fluff/beach_umbrella/security, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"cY" = ( -/obj/item/reagent_containers/cup/soda_cans/starkist{ - pixel_x = -6 +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_y = 13; + pixel_x = 6 }, -/turf/open/misc/beach/sand, +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_y = 10 + }, +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_y = 6; + pixel_x = 11 + }, +/turf/open/floor/iron/smooth_large, /area/awaymission/beach) -"cZ" = ( -/obj/item/clothing/head/collectable/paper{ - desc = "What looks like an ordinary paper hat is actually a rare and valuable collector's edition paper hat. Keep away from fire, Curators, and ocean waves." +"St" = ( +/turf/open/floor/iron/stairs/old, +/area/awaymission/beach) +"Sw" = ( +/obj/structure/chair/stool/directional/south{ + dir = 8 }, -/turf/open/water/beach, +/turf/open/floor/wood, +/area/awaymission/beach) +"SB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/awaystart, +/turf/open/floor/plating, /area/awaymission/beach) -"da" = ( -/mob/living/simple_animal/parrot, +"SI" = ( +/mob/living/basic/crab/kreb, /turf/open/misc/beach/sand, /area/awaymission/beach) -"db" = ( -/obj/structure/closet/secure_closet/personal/cabinet, -/obj/item/clothing/suit/jacket/letterman_nanotrasen, -/turf/open/floor/wood, +"Th" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/beaker/large{ + pixel_y = 7 + }, +/turf/open/floor/wood/large, /area/awaymission/beach) -"dc" = ( -/obj/structure/closet/secure_closet/personal/cabinet, -/obj/item/clothing/suit/jacket/letterman_syndie, -/turf/open/floor/wood, +"Tn" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/eighties, /area/awaymission/beach) -"dd" = ( -/obj/structure/closet/secure_closet/personal/cabinet, -/obj/item/clothing/suit/jacket/letterman_red, -/turf/open/floor/wood, +"Tr" = ( +/turf/open/floor/iron/dark/textured_large, /area/awaymission/beach) -"de" = ( +"Ts" = ( /obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/neck/necklace/dope, /obj/item/clothing/suit/jacket/letterman, /turf/open/floor/wood, /area/awaymission/beach) -"df" = ( -/obj/structure/closet/secure_closet/personal/cabinet, -/obj/item/clothing/neck/necklace/dope, -/turf/open/floor/wood, +"TC" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/turf/open/misc/beach/sand, /area/awaymission/beach) -"dg" = ( -/obj/item/clothing/glasses/heat, +"TG" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"TJ" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"hw" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/cup/glass/bottle/ale, -/turf/open/floor/wood, +"TK" = ( +/obj/item/storage/box/syringes{ + pixel_y = 14; + pixel_x = -5 + }, +/obj/item/clothing/neck/stethoscope{ + pixel_y = 3; + pixel_x = 4 + }, +/obj/structure/table/glass, +/turf/open/floor/iron/white/textured_large, /area/awaymission/beach) -"iy" = ( -/obj/item/toy/seashell, -/turf/open/misc/beach/coast, +"TO" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/wood/parquet, /area/awaymission/beach) -"kK" = ( -/obj/item/toy/seashell{ - pixel_x = 5; - pixel_y = 4 +"TX" = ( +/obj/structure/table/reinforced, +/obj/item/stack/medical/mesh{ + pixel_y = 1; + pixel_x = 1 }, -/turf/open/misc/beach/sand, +/obj/item/clothing/suit/toggle/labcoat{ + pixel_y = 9; + pixel_x = -8 + }, +/obj/item/storage/box/bodybags{ + pixel_y = 17; + pixel_x = 8 + }, +/turf/open/floor/iron/white/textured_large, /area/awaymission/beach) -"kS" = ( -/obj/item/toy/seashell{ +"Ug" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/box/mousetraps{ + pixel_x = -5; + pixel_y = 14 + }, +/obj/structure/table, +/obj/item/storage/box/mousetraps{ + pixel_x = 12; + pixel_y = 15 + }, +/obj/item/grenade/chem_grenade/cleaner{ pixel_x = -7; - pixel_y = 5 + pixel_y = 6 }, -/turf/open/misc/beach/sand, +/obj/item/grenade/chem_grenade/cleaner{ + pixel_x = -1; + pixel_y = 3 + }, +/turf/open/floor/wood/large, /area/awaymission/beach) -"lx" = ( -/obj/structure/table/wood, -/obj/item/clothing/glasses/sunglasses, -/obj/item/reagent_containers/cup/glass/shaker, +"Uq" = ( +/obj/item/kirbyplants/organic/plant8{ + pixel_y = 9; + pixel_x = 6 + }, +/obj/structure/railing{ + dir = 10 + }, /turf/open/floor/wood, /area/awaymission/beach) -"lA" = ( +"Ut" = ( /obj/structure/table/wood, -/obj/item/reagent_containers/cup/glass/bottle/maltliquor{ - pixel_y = 3 +/obj/item/pai_card{ + desc = "A real Nanotrasen success, these personal AIs provide all of the companionship of an AI without any law related red-tape."; + name = "\improper Nanotrasen-brand personal AI device exhibit"; + pixel_y = 3; + pixel_x = 10 }, -/turf/open/floor/wood, +/turf/open/floor/wood/large, /area/awaymission/beach) -"mF" = ( -/obj/structure/table/wood, -/obj/item/food/burger/crab{ - pixel_x = 9; - pixel_y = 8 +"UB" = ( +/obj/structure/bed, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/beach) +"UI" = ( +/obj/effect/turf_decal/siding/dark_red/corner{ + dir = 8 }, -/turf/open/floor/wood, +/turf/open/misc/beach/sand, /area/awaymission/beach) -"mV" = ( -/obj/item/reagent_containers/cup/glass/bottle/beer/light{ - pixel_x = -14; - pixel_y = 15 +"UK" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"UX" = ( +/obj/structure/flora/tree/palm/style_2{ + pixel_y = 12; + pixel_x = -7 }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"oE" = ( -/obj/structure/table/wood, -/obj/item/food/burger/crab, -/turf/open/floor/wood, +"Vc" = ( +/obj/structure/closet/gmcloset, +/turf/open/floor/plastic, +/area/awaymission/beach) +"Vd" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Vf" = ( +/turf/open/misc/beach/coast{ + dir = 1 + }, /area/awaymission/beach) -"sG" = ( +"Vo" = ( /obj/effect/turf_decal/sand, -/obj/structure/sign/poster/contraband/smoke/directional/south, -/obj/machinery/vending/cigarette/beach, -/turf/open/misc/beach/sand, +/obj/machinery/door/airlock/wood{ + name = "Bathroom"; + id_tag = "toilet2beach" + }, +/turf/open/floor/iron/white, /area/awaymission/beach) -"wr" = ( +"Vy" = ( /obj/item/toy/seashell{ - pixel_y = -5 + pixel_x = 5; + pixel_y = 4 }, -/turf/open/misc/beach/coast, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"VG" = ( +/obj/structure/tank_holder/extinguisher, +/turf/open/floor/wood/large, /area/awaymission/beach) -"wz" = ( +"VI" = ( /obj/item/toy/seashell{ - pixel_x = -8; - pixel_y = 9 + pixel_x = 12; + pixel_y = -5 }, -/turf/open/misc/beach/coast/corner{ +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"VP" = ( +/obj/structure/dresser, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/wood, +/area/awaymission/beach) +"VQ" = ( +/obj/effect/turf_decal/siding/wood{ dir = 1 }, +/obj/item/blood_filter{ + pixel_y = 8; + pixel_x = -6 + }, +/obj/item/surgical_drapes{ + pixel_x = -1; + pixel_y = 2 + }, +/obj/item/surgical_drapes{ + pixel_x = 13; + pixel_y = 2 + }, +/obj/structure/table/glass, +/turf/open/floor/wood/large, /area/awaymission/beach) -"xA" = ( -/obj/structure/table/wood, -/obj/item/camera, -/turf/open/floor/wood, +"VY" = ( +/turf/open/misc/beach/sand, /area/awaymission/beach) -"yp" = ( -/obj/item/flashlight/flare/torch{ - pixel_x = 15; - pixel_y = -7 +"Wa" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"Wb" = ( +/obj/item/toy/seashell{ + pixel_x = 8; + pixel_y = 14 }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"zc" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/cup/glass/bottle/sake{ - pixel_y = 4 +"Wd" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 5"; + id_tag = "beach_room_5" }, +/obj/effect/turf_decal/siding/wood, /turf/open/floor/wood, /area/awaymission/beach) -"ze" = ( -/obj/item/toy/seashell{ - pixel_x = 12; - pixel_y = -5 +"Wi" = ( +/obj/effect/turf_decal/sand{ + density = 1 + }, +/obj/effect/decal/fakelattice, +/turf/open/floor/pod/light{ + density = 1 }, +/area/awaymission/beach) +"Wk" = ( +/obj/structure/billboard/space_cola, +/obj/effect/turf_decal/siding/dark_red, /turf/open/misc/beach/sand, /area/awaymission/beach) -"zZ" = ( +"Wl" = ( /obj/effect/turf_decal/sand, -/obj/effect/baseturf_helper/beach/water, /turf/open/misc/beach/sand, /area/awaymission/beach) -"AR" = ( -/obj/item/toy/seashell{ - pixel_x = 8; - pixel_y = 14 +"Wv" = ( +/obj/item/reagent_containers/cup/soda_cans/starkist{ + pixel_y = 16; + pixel_x = 10 }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"Bd" = ( -/obj/item/toy/seashell{ - pixel_x = 12; - pixel_y = 5 +"Wx" = ( +/obj/item/reagent_containers/cup/glass/bottle/wine{ + pixel_y = 16; + pixel_x = -5 }, -/turf/open/misc/beach/coast{ - dir = 4 +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_y = 3; + pixel_x = -8 }, +/obj/structure/table/bronze, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_y = 10; + pixel_x = 6 + }, +/turf/open/floor/wood/large, /area/awaymission/beach) -"EG" = ( -/obj/item/flashlight/flare/torch{ - pixel_x = -2; - pixel_y = 8 +"WC" = ( +/obj/structure/table/bronze, +/obj/item/camera{ + pixel_y = 8; + pixel_x = 6 + }, +/obj/item/pen/blue{ + pixel_x = -11; + pixel_y = 2 }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"FG" = ( -/obj/structure/table/wood, -/obj/machinery/reagentgrinder, -/turf/open/floor/wood, +"WM" = ( +/obj/item/reagent_containers/cup/soda_cans/starkist{ + pixel_x = -6 + }, +/turf/open/misc/beach/sand, /area/awaymission/beach) -"He" = ( -/obj/structure/fluff/beach_umbrella/syndi, -/turf/open/misc/beach/coast/corner{ - dir = 8 +"WO" = ( +/obj/item/cigbutt{ + pixel_y = -6; + pixel_x = -12 }, +/obj/item/clothing/head/soft/black, +/turf/open/floor/wood/parquet, /area/awaymission/beach) -"HN" = ( -/obj/machinery/griddle, -/turf/open/floor/wood, +"Xd" = ( +/obj/structure/table/optable, +/turf/open/floor/wood/large, /area/awaymission/beach) -"Jr" = ( -/obj/machinery/oven/range, +"Xh" = ( +/obj/vehicle/ridden/atv{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"Xt" = ( +/obj/structure/table/wood/fancy, +/obj/effect/turf_decal/tile/dark_red/full, +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_x = -13; + pixel_y = 14 + }, +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_x = 7; + pixel_y = 8 + }, +/turf/open/floor/iron/smooth_large, +/area/awaymission/beach) +"XB" = ( +/turf/open/water/beach, +/area/awaymission/beach) +"XT" = ( +/obj/effect/turf_decal/siding/dark_red/corner{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach) +"XV" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/machinery/button/door/directional/north{ + id = "beach_room_9" + }, +/obj/item/claymore/cutlass{ + desc = "A piratey, foam sword used by kids to train themselves in the business of \"negotiating\" the transfer of treasure."; + force = 0; + name = "foam cutlass"; + throwforce = 0 + }, /turf/open/floor/wood, /area/awaymission/beach) -"Kg" = ( -/obj/item/flashlight/flare/torch{ - pixel_x = 12; +"XX" = ( +/obj/structure/table/wood, +/obj/machinery/recharger, +/obj/item/reagent_containers/cup/glass/mug{ + pixel_x = -12; pixel_y = 9 }, -/turf/open/misc/beach/sand, +/obj/effect/spawner/random/bureaucracy/stamp{ + pixel_y = 14; + pixel_x = 8 + }, +/turf/open/floor/iron/dark/diagonal, /area/awaymission/beach) -"MD" = ( -/obj/item/toy/seashell, +"Yl" = ( +/obj/effect/turf_decal/sand/plating, +/obj/item/shovel{ + pixel_y = 15; + pixel_x = -8 + }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"MP" = ( -/obj/item/flashlight/flare/torch{ - pixel_x = 7; - pixel_y = -5 +"Yq" = ( +/obj/item/reagent_containers/cup/watering_can{ + pixel_y = 19; + pixel_x = -6 + }, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"YB" = ( +/obj/machinery/vending/coffee, +/turf/open/floor/wood/large, +/area/awaymission/beach) +"YL" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/awaymission/beach) +"YM" = ( +/obj/item/toy/seashell{ + pixel_x = 12; + pixel_y = 5 }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"Nr" = ( -/obj/structure/table, -/obj/item/reagent_containers/cup/glass/bottle/beer, -/obj/item/reagent_containers/cup/glass/bottle/beer, -/obj/item/reagent_containers/cup/glass/bottle/beer, -/obj/item/reagent_containers/cup/glass/bottle/beer, -/obj/item/reagent_containers/cup/glass/bottle/beer, -/obj/item/reagent_containers/cup/glass/bottle/beer, +"YV" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 24; + pixel_x = -7 + }, +/obj/structure/flora/coconuts, /turf/open/misc/beach/sand, /area/awaymission/beach) -"QQ" = ( -/obj/item/reagent_containers/cup/glass/bottle/rum{ - pixel_y = 2 - }, -/obj/structure/table/wood, -/turf/open/floor/wood, +"Zj" = ( +/obj/machinery/recharge_station, +/obj/machinery/light/directional/east, +/turf/open/floor/carpet/cyan, /area/awaymission/beach) -"QU" = ( -/obj/structure/closet/crate/freezer, -/obj/item/food/meat/slab/rawcrab, -/obj/item/food/meat/slab/rawcrab, -/obj/item/food/meat/slab/rawcrab, -/obj/item/food/meat/slab/monkey, -/obj/item/food/meat/slab/monkey, -/obj/item/food/meat/slab/monkey, -/obj/item/food/meat/slab/gorilla, -/obj/item/food/meat/slab/gorilla, -/obj/item/food/meat/slab/gorilla, +"Zm" = ( +/obj/item/toy/beach_ball, /turf/open/misc/beach/sand, /area/awaymission/beach) -"Sg" = ( -/obj/structure/sink/kitchen/directional/south, -/turf/open/floor/wood, +"Zn" = ( +/obj/structure/bed/medical/emergency, +/turf/open/floor/iron/white/textured_large, /area/awaymission/beach) -"SR" = ( -/obj/machinery/food_cart, -/turf/open/misc/beach/sand, +"Zp" = ( +/turf/open/floor/wood/large, /area/awaymission/beach) -"Tr" = ( -/obj/structure/table/wood, -/obj/item/storage/photo_album, +"Zt" = ( +/obj/structure/table/bronze, +/obj/item/storage/toolbox/fishing{ + pixel_y = 2 + }, /turf/open/floor/wood, /area/awaymission/beach) -"Vn" = ( +"Zw" = ( +/obj/machinery/vending/snack, /obj/effect/turf_decal/sand, -/obj/structure/table/wood, /turf/open/misc/beach/sand, /area/awaymission/beach) -"Vx" = ( -/obj/item/reagent_containers/cup/glass/bottle/wine{ - pixel_y = 4 +"ZA" = ( +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_x = -5; + pixel_y = -5 }, -/obj/structure/table/wood, -/turf/open/floor/wood, +/obj/structure/fluff/beach_umbrella/syndi, +/turf/open/misc/beach/sand, /area/awaymission/beach) -"Ws" = ( -/obj/item/toy/seashell{ - pixel_x = -10; - pixel_y = -4 +"ZH" = ( +/obj/structure/table/bronze, +/obj/item/paper/paperslip{ + pixel_y = 6; + pixel_x = 10 }, -/turf/open/misc/beach/sand, +/obj/item/pen/fourcolor{ + pixel_y = 7; + pixel_x = 1 + }, +/turf/open/floor/carpet, /area/awaymission/beach) -"Za" = ( -/obj/item/flashlight/flare/torch{ - pixel_x = 10; +"ZR" = ( +/obj/structure/chair/plastic, +/obj/item/clothing/head/collectable/paper{ + desc = "What looks like an ordinary paper hat is actually a rare and valuable collector's edition paper hat. Keep away from fire, Curators, and ocean waves."; pixel_y = -4 }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"ZL" = ( -/obj/machinery/grill, -/turf/open/misc/beach/sand, +"ZU" = ( +/obj/item/toy/seashell{ + pixel_y = 11; + pixel_x = -7 + }, +/turf/open/misc/beach/coast, +/area/awaymission/beach) +"ZX" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/button/door/directional/east{ + id = "toilet1beach"; + name = "restroom lock"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/structure/toilet{ + pixel_y = 8 + }, +/obj/structure/sink/directional/west, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/white, +/area/awaymission/beach) +"ZZ" = ( +/obj/item/stack/arcadeticket{ + pixel_y = 6; + pixel_x = -7 + }, +/turf/open/floor/eighties, /area/awaymission/beach) (1,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (2,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (3,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (4,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (5,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (6,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (7,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (8,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (9,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (10,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (11,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (12,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (13,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +MZ +Le +Le +Le +ni +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (14,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +Vf +YV +VY +VY +hL +ni +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (15,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -at -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -as -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -at -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -at -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -at -ab -ab -ab -ab -ab -ab -ab -ab -as -ab -ab -ab -ab -ab -ab -ab -at -ab -ab -ab -ab -ab -ab -at -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +Vf +VY +VY +VY +Er +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (16,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +Vf +VY +VY +VY +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (17,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +Vf +IZ +VY +VY +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (18,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +Pe +Fb +tJ +zr +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +hf +CG +CG +CG +Gh +XB +hf +CG +CG +CG +hQ +CG +CG +CG +Gh +XB +hf +CG +CG +CG +Gh +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (19,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +Pe +Fb +Fb +Rj +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +di +FM +hC +jI +Cf +XB +di +FM +hC +jI +gG +FM +hC +jI +Cf +XB +di +FM +hC +Uq +Cf +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (20,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +dR +Iw +Iw +xv +XB +xv +dR +Iw +Iw +xv +dR +Iw +Iw +xv +XB +xv +dR +Iw +Iw +xv +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (21,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +vR +GC +CQ +xv +xv +xv +kR +Em +CQ +xv +Gn +GC +kD +xv +xv +xv +tx +Em +Ts +xv +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (22,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +mg +GC +Gn +ll +Zp +QI +Gn +Em +mU +xv +aX +GC +Gn +JG +Zp +fj +Gn +Em +ru +xv +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (23,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +Qf +vM +um +xv +Zp +xv +Qf +Zj +MP +xv +Hv +vM +DV +xv +Zp +xv +Es +jZ +vc +xv +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (24,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -as -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +xv +xv +xv +xv +Gu +xv +xv +xv +xv +xv +xv +xv +xv +xv +Zp +xv +xv +xv +xv +xv +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (25,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -as -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +FM +Nk +Gn +cq +CQ +xv +Zp +Zp +UK +Zp +Zp +Zp +Zp +UK +Zp +Zp +Zp +Zp +UK +VG +xv +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (26,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +pw +Iw +AG +Em +Gn +lz +Zp +xv +xv +xv +xv +xv +xv +xv +xv +xv +Zp +xv +xv +xv +xv +xv +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (27,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +CH +Iw +vc +jZ +hp +xv +Zp +xv +XV +GC +cp +xv +Qk +Em +Nd +xv +Gu +xv +yZ +GC +Fg +xv +XB +MZ +Le +Le +Le +ni +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (28,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +xv +gk +xv +xv +Zp +wX +Gn +GC +ru +xv +LS +Em +Gn +Wd +Zp +AW +Gn +GC +ru +xv +MZ +MF +Vy +VY +FD +hL +ni +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (29,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -at -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +FM +LJ +Gn +kI +cp +xv +Zp +xv +VP +vM +Zt +xv +Qf +jZ +im +xv +Zp +xv +VP +vM +Zt +xv +MF +Wb +It +VY +yq +VY +hL +ni +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (30,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +pw +Iw +cn +GC +Gn +yE +Zp +xv +xv +xv +xv +xv +xv +xv +xv +xv +Zp +xv +xv +xv +xv +xv +MT +VY +tP +NF +QG +VY +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (31,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +CH +Iw +KB +vM +vF +xv +Zp +Zp +UK +Zp +xv +VY +xv +Zp +Zp +Zp +Zp +UK +Zp +Zp +nW +Da +Wl +VY +VY +VY +VY +VY +ls +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (32,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +xv +xv +xv +xv +Zp +xv +xv +at +xv +xv +xv +Jj +xv +xv +Zp +xv +xv +xv +xv +xv +jH +ls +VY +VY +VY +MT +VY +hL +ni +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (33,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -af -aj -aj -aj -ao -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +xv +xv +Ug +Yq +an +xv +Zp +xv +oX +Em +CQ +xv +OE +GC +Gn +xv +Zp +cZ +qC +Em +re +xv +VY +VY +xv +nD +xv +xv +xv +tE +hL +Le +Le +Le +ni +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (34,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -af -ay -kK -ak -kS -aT -ao -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +EO +Zp +EH +xv +Gu +xv +Gn +Em +ru +xv +CQ +GC +ru +xv +Zp +xv +us +Em +ru +xv +ah +xv +xv +Zp +qX +Zp +xv +xv +tE +VY +VY +VY +hL +Le +ni +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (35,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -af -ay -AR -ak -ak -ak -ak -aT -ao -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +RA +Zp +Zp +xv +oa +xv +VP +jZ +AB +xv +Qf +vM +Zt +xv +oa +xv +vc +jZ +CR +xv +xv +xv +Gq +iN +yX +zH +io +xv +xv +wA +VY +VY +VY +VY +hL +Le +Le +Le +Le +ni +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (36,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -af -ay -ak -ak -ak -Ws -ak -ak -ak -aT -aj -aj -ao -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +OD +xv +EP +xv +Zp +xv +xv +xv +xv +xv +xv +xv +xv +xv +Zp +xv +xv +xv +xv +xv +dx +Zp +Zp +mb +mb +mb +Zp +QR +Iw +VY +GG +VY +VY +uz +VY +VY +VY +VY +VY +hL +Le +ni +XB +XB +XB +XB +MZ +Le +Le +Le +Le +Le +ni +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (37,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -af -ay -ak -ak -ak -aA -ak -ak -ak -ak -ak -ak -ak -aT -aj -aj -aj -aj -ao -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +hf +CG +xv +xv +xv +iY +Zp +Zp +Zp +Zp +Zp +Zp +Jr +Zp +Zp +Zp +Zp +Zp +Zp +Jr +Zp +uq +Zp +Zp +Og +uL +TG +Zp +Zp +Zp +dS +Iw +VY +VY +VY +sc +sU +VY +VY +VY +ls +VY +VY +VY +hL +ni +XB +XB +XB +Vf +GG +wA +VY +VY +VY +hL +ni +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (38,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -af -ay -ak -ak -ak -ak -ak -ak -aA -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aT -aj -ao -av -av -av -av -af -aj -aj -aj -aj -aj -ao -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +hf +sj +aE +Zp +mk +Zp +Zp +Zp +Zp +Zp +Zp +Zp +Zp +Zp +Zp +Zp +Zp +Zp +Zp +Zp +Zp +Zp +uq +Zp +Zp +Wa +Bl +BQ +Zp +Zp +FP +Iw +Iw +Wl +VY +VY +VY +VY +VY +VY +Ar +VY +VY +rq +VY +GG +hL +Le +Le +Le +MF +VY +VY +VY +VY +VY +GG +hL +ni +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (39,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -ak -ak -ak -aA -ak -aD -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aT -ao -av -av -av -ag -MD -aA -ak -ak -ak -aT -ao -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +di +iF +Zp +xv +xv +xv +aB +aB +xv +Pt +xv +xv +xv +xv +xv +Iw +RI +Iw +xv +xv +xv +xv +xv +xv +Gu +BL +Vd +dc +Zp +Zp +Iw +Iw +Wl +Wl +VY +VY +VY +VY +VY +IA +EU +VY +VY +VY +VY +VY +VY +VY +VY +VY +VY +VY +VY +VY +VY +IZ +VY +Zm +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (40,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -ak -ak -aA -ak -ak -ak -ak -ak -aD -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -MD -aT -aj -aj -aj -ay -ak -ak -ak -ak -ak -MD -aT -ao -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +di +Zp +Zp +xv +aw +Qt +un +un +dk +un +Py +xv +Ky +zI +Zn +Zn +bi +nK +NU +xv +rd +rd +xv +Wx +Zp +rQ +Zp +Zp +Zp +Zp +xv +gI +Wl +nq +Wl +VY +VY +VY +ls +VY +VY +VY +VY +xv +Iw +Iw +xv +VY +xv +Iw +Iw +xv +fU +VY +VY +bY +VY +VY +hL +ni +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (41,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -ak -ak -ak -ak -Kg -ak -ak -ak -aA -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aK -ak -cG -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +fe +sd +uV +xv +iM +un +Lg +mP +Lg +un +tD +xv +TX +bi +bi +bi +bi +bi +bi +ob +sS +sS +xv +iw +GC +ZH +GC +GC +GC +GC +NH +GC +Wl +Wl +Wl +VY +VY +wA +VY +VY +VY +VY +xv +xv +zs +zs +xv +Iw +xv +oC +RQ +xv +xv +ls +VY +Ar +Ar +VY +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (42,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -ak -ak -ak -Za -aF -EG -ak -ak -ak -ak -ak -ak -ak -aD -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aT -ao -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -at -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +HV +mi +uV +xv +eE +un +Cb +uJ +eT +un +Pk +xv +jm +bi +bi +TK +bi +bi +Gi +xv +Bm +sS +xv +GC +GC +tU +GC +GC +GC +Gf +xv +GC +GC +Wl +Wl +VY +VY +VY +VY +VY +VY +VY +xv +dh +kZ +MO +iy +kZ +xp +Dy +yc +MN +xv +VY +VY +VY +tr +VY +Kh +Rj +JF +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (43,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -ak -aA -ak -ak -aG -ak -aD -ak -ak -ak -ak -ak -aA -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +HV +iA +xv +Ne +un +zA +XX +Pn +dk +qk +xv +fa +Ka +bi +kz +Fe +bi +Ih +xv +Bm +sS +xv +iw +GC +fd +GC +GC +GC +GC +NH +GC +GC +GC +Wl +VY +VY +VY +VY +VY +VY +VY +xv +xv +mT +ZZ +kZ +uc +FE +Tn +QM +Zp +Iw +VY +VY +VY +ls +VY +BK +XB +XB +XB +XB +pM +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (44,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -ak -ak -ak -yp -aF -aC -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aA -ak -bo -aq -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +xv +un +un +un +yL +Dj +xv +xv +Iw +xv +bi +bi +bi +xv +xv +xv +iq +sS +xv +wL +Zp +qf +Zp +Zp +Zp +xv +xv +cD +GC +GC +GC +VY +VY +VY +ls +VY +VY +GG +VY +xv +Iw +xv +gd +gd +yn +Zp +Ut +Zp +xv +VY +VY +VY +VY +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (45,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -ak -ak -ak -ak -MP -ak -ak -aA -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aD -ak -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +un +mN +DD +mp +xv +xv +ns +uZ +xv +MV +xv +Ic +xv +Bm +QF +sS +sS +xv +xv +Zp +Og +uL +TG +Zp +Iw +cD +Lt +Wl +GC +GC +GC +VY +VY +VY +VY +VY +VY +wA +VY +Wl +xv +Iw +Iw +xv +Zp +sP +xv +xv +Hn +VY +VY +VY +VY +hL +ni +XB +XB +XB +XB +XB +XB +XB +JF +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (46,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -ak -ak -ak -aD -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ch -ak -ak -ak -ak -ak -ak -ak -ak -ak -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +pE +aB +aB +xv +xv +VQ +Zp +Zp +Zp +Zp +xv +Iw +xv +Bm +sS +sS +sS +sS +ob +Zp +Wa +Mo +BQ +Zp +Iw +Iw +Lt +Wl +Wl +GC +GC +GC +VY +VY +VY +VY +VY +VY +VY +VY +VY +VY +Wl +xv +qy +Iw +xv +tz +Wl +VY +VY +VY +IZ +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (47,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -ak -ak -aA -ak -ak -ak -ak -ak -aA -ak -ak -ak -ak -ak -ak -ak -ak -aA -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aT -ao -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +Tr +Tr +On +xv +XB +hD +Zp +Zp +Zp +Zp +Cf +XB +xv +xv +Vc +Vc +Vc +xv +xv +xv +BL +fV +dc +Zp +nO +Iw +Lt +Wl +Wl +VY +GC +GC +GC +VY +VY +VY +VY +VY +VY +VY +Wl +VY +VY +TJ +sL +Sj +Ll +VY +VY +VY +Wl +VY +VY +VY +Fk +XB +XB +XB +XB +XB +XB +XB +XB +XB +pM +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (48,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -ak -ak -ak -ak -ak -aA -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aK -ak -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +aB +UB +Tr +On +aB +XB +vx +Bq +Xd +Ej +lk +LC +XB +XB +xv +xv +xv +xv +xv +iJ +xv +jU +xv +Zp +Zp +EG +Iw +Nh +Wl +ls +VY +VY +GC +GC +GC +VY +VY +VY +ls +VY +Wl +Wl +Wl +VY +Wl +VY +Wl +VY +Wl +VY +VY +VY +VY +VY +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (49,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ba -ba -ba -ba -ba -ba -ba -ba -ba -ba -ak -ak -ak -ak -iy -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +xv +cE +xv +xv +XB +HV +OK +mG +uv +LC +XB +XB +XB +xv +fi +uT +uT +Nb +SB +SB +uT +xv +wt +YB +xv +xv +Wl +VY +VY +VY +VY +VY +GC +GC +GC +VY +VY +VY +Wl +Wl +Wl +VY +Wl +VY +Wl +Wl +VY +VY +VY +Wl +VY +VY +gP +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +JF +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (50,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ba -ba -aX -aX -aX -aX -cA -aX -ba -ba -ak -ak -ak -ak -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +xv +xv +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +uT +FF +Ge +SB +SB +Qr +KV +xv +xv +xv +xv +VY +VY +nV +VY +GG +VY +VY +bg +GC +GC +Wl +Wl +Wl +Wl +Wl +VY +VY +Wl +Wl +VY +VY +Wl +VY +VY +VY +VY +VY +OT +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (51,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -MD -ak -ak -ak -ak -ak -ak -ak -ak -aA -bf -bp -bx -ak -ak -aX -aX -aX -aX -ak -ba -ba -cd -aX -co -bd -bd -hw -cH -ba -ak -ak -cO -ak -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +Ge +uT +uT +vq +La +xv +xv +xv +ls +VY +VY +VY +VY +VY +VY +VY +VY +wA +VY +Wl +Wl +Wl +Wl +Wl +Wl +VY +Cy +xv +xv +Iw +Iw +xv +xv +Zw +VY +Wl +VY +VY +gP +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (52,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -at -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ah -az -ak -ak -ak -ak -ak -ak -ak -ak -ak -bg -bq -by -ak -ak -aX -bL -bQ -aX -ak -ba -ba -cs -aX -cn -ck -bd -hw -cH -ba -ak -ak -cP -ak -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +xv +xv +lY +YL +xv +xv +CF +VY +VY +VY +jW +jW +jW +VY +VY +VY +VY +VY +ls +Wl +Wl +Wl +VY +VY +Wl +Wl +cX +xv +jF +iU +li +xE +xv +BN +VY +VY +VY +VY +VY +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +pM +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (53,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -ak -ak -ak -ak -ak -ak -ak -ak -ak -bh -br -bz -ak -aA -aX -bM -bR -bX -ba -ba -ba -cg -aX -cp -bd -bd -cC -cH -ba -ak -ak -cO -ak -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +xv +xv +xv +xv +Fb +mf +VY +KL +jW +jW +wY +jW +jW +GG +VY +VY +VY +VY +Wl +Wl +Rr +VY +VY +VY +Wl +xv +xv +pX +Zp +Zp +Zp +ow +vX +wd +VY +VY +gP +VY +Kh +Rj +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (54,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ah -az -ak -ak -ak -ak -ak -ak -ak -ak -ak -ba -ak -ak -aD -aX -aX -aX -aX -ak -ba -ba -Vn -aX -cj -bd -bd -cD -cH -ba -ak -ak -ak -ak -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Pe +tJ +gw +jW +wY +Yl +wY +jW +GG +VY +aT +sM +II +Wl +Wl +VY +VY +VY +VY +Wl +xr +Zp +Zp +MD +fv +Zp +Mm +RE +Wa +VY +VY +kl +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (55,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -ak -ak -ak -ak -bf -bp -bx -ak -ak -ba -ak -ak -ak -ak -ak -ak -ak -ak -ba -ba -Vn -aX -ci -bd -bd -mF -cH -ba -ak -ak -cO -ak -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +Hg +jW +wY +wY +wY +nr +VY +VY +xi +xi +xv +Wl +Wl +VY +VY +VY +VY +pD +xv +kC +Th +Mn +zp +Zp +Mm +RE +Wa +VY +VY +gP +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +JF +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (56,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -ak -ak -ak -ak -bg -aQ -by -zZ -ba -ba -ba -ba -ba -ba -ba -ba -ba -ba -ba -ba -sG -aX -lx -bd -bd -cE -cH -ba -ak -ak -cQ -ak -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +AH +jW +ke +wY +wY +jW +GG +VY +xi +ZX +Gm +Wl +Wl +ls +VY +VY +VY +xv +xv +Gu +Nf +ai +Zp +Zp +pt +RE +Wa +VY +VY +Av +VY +hL +ni +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (57,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -ak -ak -ak -ak -bh -br -bz -ak -ak -ak -bA -ba -ba -ak -ak -ak -ak -ak -ba -ba -aX -aX -aX -bd -bd -cF -cH -ba -ak -ak -cO -ak -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +VY +jW +jW +wY +jW +jW +GG +VY +xi +xi +xv +Wl +Wl +VY +VY +VY +DF +xv +Cl +Zp +Aa +pN +Zp +kB +Sg +JR +kh +VY +VY +VY +gP +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (58,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ba -ba -aX -aX -aX -aX -ak -ba -ba -aX -cq -bd -bd -bd -oE -cH -ba -ak -ak -cR -ak -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -at -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +VY +VY +jW +jW +jW +VY +VY +VY +xi +FB +Vo +Wl +Wl +VY +VY +VY +VY +Iw +Ea +Zp +Zp +Zp +Zp +aC +xv +kh +VY +VY +VY +wA +Kw +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (59,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ba -ba -aX -bN -bS -bY -ba -ba -ba -aX -Jr -bd -FG -bd -Tr -cH -ba -ak -ak -cO -ak -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +VY +GG +VY +VY +VY +wA +VY +xv +xi +xi +xv +Wl +Wl +VY +VY +VY +VY +Iw +IP +Zp +Zp +Zp +NS +Mm +Wa +VY +VY +VY +VY +VY +gP +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (60,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ba -ba -aX -bL -bQ -aX -ak -ba -ba -aX -HN -bd -cf -bd -xA -cH -ba -ak -aA -cS -ak -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +VY +VY +ls +VY +VY +VY +VY +VY +xi +xo +Qe +Wl +Wl +VY +wA +VY +VY +Iw +DY +Zp +Zp +Ja +ea +MG +kh +VY +Hn +VY +VY +VY +sp +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +pM +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (61,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -ak -ak -ak -ak -ak -ak -aX -aX -aX -aX -ak -ba -ba -aX -aX -aX -aX -ak -ba -ba -aX -Sg -bd -bd -bd -cf -cH -ba -ak -ak -cO -ak -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Pe +tJ +wA +VY +VY +VY +VY +VY +VY +xv +xv +xv +Wl +Wl +VY +VY +ls +VY +xv +DY +Zp +ko +uu +MG +kh +VY +VY +VY +VY +VY +VY +VY +Kh +Rj +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (62,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -ak -ak -ak -ak -ak -ak -aX -bb -bd -aX -ak -ba -ba -ak -ak -ak -ak -ak -ba -ba -aX -cf -cr -cl -cw -aX -cI -ba -ak -ak -cT -ak -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +VY +VY +VY +dO +VY +VY +VY +xv +JO +Wl +Wl +Wl +VY +VY +VY +VY +xv +xv +Iw +Iw +xv +dg +VY +VY +VY +VY +VY +VY +VY +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (63,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ah -az -ak -ak -ak -ak -ak -aX -bc -bi -bs -ba -ba -ba -bF -ak -ak -ak -ak -ba -ba -aX -aX -aX -aX -aX -aX -ba -ba -ak -ak -ak -bo -aq -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +VY +VY +VY +kG +VY +VY +Hn +VY +lS +Wl +Wl +VY +VY +VY +VY +VY +VY +UX +VY +om +VY +ls +VY +VY +VY +VY +VY +rF +VY +Kh +Rj +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (64,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -ak -ak -ak -ak -ak -aX -aX -aX -aX -ak -ba -ba -bG -ak -ak -ak -ak -ba -ba -ba -ba -ba -ba -ba -ba -ba -ba -ak -ak -ak -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +ot +VY +VY +wA +VY +VY +VY +VY +VY +Wl +Wl +VY +VY +VY +VY +wA +VY +MT +VY +VY +Hn +VY +VY +VY +VY +VY +VY +Eb +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +JF +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (65,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ba -ba -bH -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -bo -aq -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -as -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +Fu +pr +VY +VY +ls +VY +VY +VY +VY +Wl +Wl +VY +VY +VY +VY +VY +VY +GG +VY +VY +VY +VY +VY +fz +fu +Wi +VY +VY +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (66,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -aE -ak -ak -aA -ak -ak -ak -ak -ak -ak -ba -ba -bG -ak -ak -aA -ak -ak -ak -ak -ak -ak -SR -ak -ak -ak -ak -Nr -cM -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Pe +tJ +VY +VY +VY +VY +VY +VY +VY +VY +Wl +Wl +Wl +OG +gi +cj +XT +VY +VY +VY +ls +VY +VY +VY +Ft +wC +St +VY +VY +VY +hL +ni +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (67,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -ak -aH -dg -ak -aD -ak -ak -ak -ak -ak -ba -ba -bH -ak -ak -ak -ak -ak -ak -ak -ak -ak -ZL -ak -ak -ak -ak -cL -cN -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -at -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +Rs +VY +VY +VY +VY +VY +VY +VY +Hn +Wl +Wl +Wk +LQ +nC +DH +VY +VY +VY +VY +VY +VY +VY +VY +VY +VY +VY +wA +VY +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (68,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ah -az -ak -ak -ak -ak -ak -ak -ak -ak -ak -ba -ba -bG -ak -ak -ak -ak -ak -ak -aD -ak -ak -QU -ak -cG -ak -ak -ak -ak -aT -ao -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +VY +Jo +ot +VY +KW +mO +VY +VY +VY +Wl +Wl +KK +Sr +nC +DH +VY +VY +VY +VY +VY +VY +VY +VY +VY +VY +VY +VY +ls +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +pM +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (69,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -aE -ak -ak -ak -aX -aX -aX -aX -ak -ba -ba -bH -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aA -ak -ak -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Pe +Fb +Cp +VY +db +Ar +Ar +VY +VY +VY +Wl +Wl +KK +Xt +nC +DH +VY +ls +VY +VY +wA +VY +VY +wA +VY +VY +IZ +VY +VY +zX +hL +ni +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (70,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -ak -mV -aE -ak -aX -bb -bj -bt -ba -ba -ba -bG -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aD -ak -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +JF +XB +XB +XB +Pe +Fb +tJ +VY +VY +VY +VY +VY +Wl +Wl +UI +pd +pd +rR +VY +VY +VY +VY +VY +VY +ot +ot +ot +ot +VY +VY +VY +yF +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (71,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ah -am -He -ak -aS -aX -bc -bd -aX -ak -ba -ba -bH -ak -ak -ak -aA -ak -ak -ak -aA -ak -ak -aA -ak -ak -aK -ak -ak -ak -aT -ao -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +VY +IA +Wv +VY +Wl +Wl +Wl +pF +VY +VY +VY +VY +QO +VY +VY +VY +PH +fM +fM +fM +fM +TC +Mr +VY +rA +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +JF +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (72,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ah -am -az -aX -aX -aX -aX -ak -ba -ba -bG -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -cO -ak -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +pM +XB +XB +XB +XB +XB +XB +Vf +VY +uG +uG +VY +Wl +Wl +VY +VY +VY +VY +VY +VY +VY +GG +OU +gP +dV +VY +VY +VY +VY +VY +EC +VY +gP +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (73,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -ak -ak -ak -ak -ak -ba -ba -bH -ak -ak -ak -ak -ak -ak -ak -ak -ct -cx -cx -cx -cx -cJ -ak -ak -cU -ak -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Pe +tJ +VY +VY +VY +Wl +Wl +VY +VY +VY +VY +VY +VY +EB +VY +gP +gP +dV +VY +VY +VY +VY +VY +EC +VY +VY +Kh +Rj +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (74,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -aA -ak -ak -ak -ak -ba -ba -bG -ak -ak -ak -ak -ak -MD -ak -ak -cu -ak -ak -ak -ak -cu -ak -ak -cO -ak -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +VY +VY +VY +Wl +Wl +VY +cw +VY +VY +VY +VY +VY +VY +gP +gP +dV +VY +VY +VY +VY +VY +EC +wA +Kh +Rj +XB +XB +XB +XB +XB +XB +XB +XB +XB +pM +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (75,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -ak -ak -ak -ak -ak -ba -ba -bH -ak -ak -ak -ak -ak -ch -ak -ak -cu -ak -ak -ak -ak -cu -ak -ak -ak -bo -aq -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +JF +XB +XB +XB +XB +XB +XB +XB +Vf +ls +VY +VY +Wl +Wl +VY +VY +VY +VY +ls +VY +Wl +VY +VY +VY +dV +VY +Zm +VY +VY +VY +EC +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (76,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -ak -ak -ak -ak -ak -ba -ba -ak -ak -ak -ak -ak -ak -ak -ak -ak -cu -ak -ak -ak -ak -cu -ak -aA -bo -aq -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +VY +VY +VY +Wl +Wl +Wl +Wl +Wl +VY +VY +VY +VY +VY +VY +fX +dV +VY +VY +VY +VY +VY +EC +IZ +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (77,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -aI -av -av -ag -ak -ak -ak -ak -ak -ba -ba -ak -ak -ak -ak -ak -ak -ak -ak -ak -cu -ak -ak -ak -ak -cu -ak -ak -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +wA +VY +VY +Wl +Wl +Wl +VY +Wl +Wl +VY +Wl +VY +VY +VY +AU +dV +Ji +Ji +Ji +Ji +Ji +EC +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +JF +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (78,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -at -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -aX -aX -aX -aX -aX -ba -ba -aX -aX -aX -aX -aX -ak -ak -ak -ak -cu -ak -ak -ak -ak -cu -ak -aK -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +pM +XB +XB +XB +XB +XB +XB +MZ +cG +VY +VY +ls +Wl +Wl +VY +DU +VY +VY +VY +VY +VY +VY +VY +fX +dV +VY +VY +VY +VY +VY +EC +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (79,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -aX -bb -de -lA -aX -ba -ba -aX -bO -db -bZ -aX -ak -ak -ak -ak -cu -cy -cy -cy -cy -cy -ak -ak -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -as -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +MZ +MF +VY +VY +GN +VY +Wl +Wl +VY +VY +VY +VY +Wl +VY +VY +wA +VY +VY +dV +VY +VY +VY +VY +VY +EC +VY +BK +XB +XB +XB +XB +XB +XB +pM +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (80,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -aX -bd -bd -bd -bB -ba -ba -bI -bd -bd -bd -aX -ak -ak -ak -ak -cu -ak -ak -ak -ak -cu -ak -ak -cV -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +JF +XB +XB +MZ +Le +oq +VY +VY +VY +VY +VY +Wl +Wl +Wl +VY +VY +VY +VY +VY +VY +ls +gP +gP +dV +VY +VY +VY +VY +VY +EC +Nm +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (81,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -af -ay -aX -be -bl -bd -aX -ba -ba -aX -bd -bT -ca -aX -ak -aA -ak -ak -cu -ak -ak -ak -ak -cu -ak -ak -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +MZ +MF +wA +VY +VY +xv +xv +xv +xv +ae +Wl +Wl +VY +VY +VY +VY +VY +Wl +VY +gP +gP +dV +VY +VY +VY +VY +VY +EC +VY +Ld +ni +XB +XB +JF +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (82,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -af -aj -ay -ak -aX -aX -aX -aX -aX -ba -ba -aX -aX -aX -aX -aX -ak -ak -aD -ak -cu -ak -ak -ak -ak -cu -ak -ak -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +VY +IZ +xv +xv +xv +Hq +Hq +xv +xv +xI +QN +VY +VY +DR +yt +VY +VY +VY +gP +gP +dV +VY +VY +VY +VY +VY +EC +VY +VY +hL +ni +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (83,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -af -ay -aA -ak -ak -ak -ak -ak -ak -ak -ba -ba -ak -ak -ak -ak -ak -ak -ak -ak -ak -cu -ak -ak -ak -ak -cu -ak -ak -wz -ao -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +MZ +MF +VY +xv +xv +Hq +TO +Qg +Qg +Qg +dL +Qg +PN +QN +VY +HU +WC +VY +VY +VY +VY +VY +FL +Cv +Cv +Cv +Cv +gj +ql +VY +ZR +VY +ZU +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (84,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -ak -aK -ak -ak -ak -ak -ak -ak -ak -ba -ba -ak -ak -ak -ak -ak -ak -ak -ak -ak -cu -ak -ak -ak -ak -cu -ak -ak -ak -aT -ao -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +MZ +MF +VY +VY +xv +Hq +Qg +Qg +Qg +Qg +Qg +dL +Qg +Qg +Da +VY +VY +VY +ls +VY +VY +VY +VY +wA +MX +MX +MX +MX +VY +VY +VY +Ff +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (85,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -af -ay -ak -ak -ak -ak -aX -aX -aX -aX -aX -ba -ba -aX -aX -aX -aX -aX -ak -ak -ak -ak -cv -cz -cz -cz -cz -cz -ak -ak -cO -ak -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +GG +VY +VY +xv +xv +AP +xv +xv +Hq +Qg +xv +Qg +Qg +Da +VY +VY +VY +VY +VY +VY +VY +VY +ls +VY +VY +VY +VY +VY +ls +VY +gP +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (86,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -af -ay -ak -ak -ak -ak -ak -aX -bb -df -QQ -aX -ba -ba -aX -bu -dc -bZ -aX -ak -ak -ak -ak -aA -ak -ak -ak -ak -ak -ak -ak -cW -ak -ap -av -av -av -av -cZ -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +MZ +MF +VY +GG +Wl +xv +IW +cR +IW +xv +Hq +Qg +bz +Qg +Qg +Da +VY +VY +wA +VY +VY +VY +VY +VY +VY +VY +VY +VY +wA +VY +VY +VY +ZA +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (87,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -MD -ak -ak -ak -ak -ak -aX -bd -bd -bd -bC -ba -ba -bJ -bd -bd -bd -aX -ak -ak -ak -ak -aD -ak -ak -ak -ak -ak -ak -ak -cO -ak -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +VY +VY +xv +aU +xv +xv +cR +cR +xv +xv +Qg +IE +Qg +Qg +Da +VY +VY +VY +ot +ot +ot +VY +ot +ot +VY +VY +VY +VY +VY +VY +VY +gP +VY +yT +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (88,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -af -ay -ak -MD -ak -ak -ak -ak -aX -be -bm -bd -aX -ba -ba -aX -bd -bU -ca -aX -ak -ak -ak -ak -ak -ak -ak -ak -aA -ak -ak -ak -cX -ak -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +VY +VY +xv +MK +Ce +xv +IW +cR +cR +xv +Qg +by +Qg +Qg +Da +VY +VY +VY +ot +ot +ot +VY +ot +ot +VY +VY +VY +VY +VY +gI +VY +WM +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (89,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -ak -ak -ak -ak -ak -ak -ak -aX -aX -aX -aX -aX -ba -ba -aX -aX -aX -aX -aX -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -cO -ak -wr -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +wA +VY +xv +HF +kp +xv +xv +lf +cR +xv +xv +fI +Qg +dq +FY +VY +VY +ls +VY +VY +VY +VY +VY +VY +VY +VY +VY +ot +VY +VY +VY +IZ +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (90,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -aA -aB -ak -ak -ak -ak -ak -aA -ak -ak -ak -ak -ba -ba -ak -ak -ak -cb -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -cY -ak -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +VY +VY +xv +MH +MK +vf +xv +ug +cR +IW +xv +Ia +sL +FY +VY +VY +VY +VY +VY +CJ +iW +iW +iW +mJ +VY +VY +gP +GI +uP +VY +VY +VY +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (91,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ch -ak -ba -ba -ak -bP -bV -cc -ak -ak -ak -ak -ak -aA -ak -ak -ak -ak -ak -ak -ak -aK -ak -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Pe +tJ +VY +xv +xv +MK +bC +xv +ug +cR +IW +xv +oi +VY +VY +VY +VY +wA +VY +CJ +gR +Gn +Gn +Gn +eH +mJ +IZ +pT +MX +VY +VY +VY +VI +Kh +Rj +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (92,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ah -az -ak -ak -ak -ak -aO -ak -aX -aX -aX -aX -aX -ba -ba -aX -aX -aX -aX -aX -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +GG +Xh +xv +Bv +Bv +xv +xv +IW +xv +xv +to +VY +VY +VY +VY +VY +VY +rE +dr +Gn +Gn +Gn +Gn +Nl +VY +VY +VY +VY +lP +ls +Kh +Rj +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (93,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -MD -ak -ak -ak -ak -ak -aX -bb -dd -Vx -aX -ba -ba -aX -zc -bk -bZ -aX -ak -ak -ak -ak -ak -ak -aK -ak -ak -ak -ak -ak -ze -bo -aq -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Pe +tJ +VY +VY +VY +VY +VY +xv +xv +xv +CY +VY +SI +VY +VY +VY +VY +VY +Km +Sw +Gn +Gn +Gn +Gn +JQ +VY +Zm +VY +VY +VY +VY +BK +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (94,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ah -az -ak -ak -ak -ak -ak -aX -bd -bd -bd -bD -ba -ba -bK -bd -bd -bd -aX -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aA -aD -bo -aq -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Pe +tJ +VY +VY +VY +VY +VY +VY +gI +VY +VY +VY +VY +VY +VY +VY +jM +xv +xv +xv +xv +xv +xv +xv +Il +VY +VY +VY +VY +Kh +Rj +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (95,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ah -az -ak -ak -ak -ak -aX -be -bn -bd -aX -ba -ba -aX -bd -bW -ca -aX -ak -ak -aA -ak -ak -ak -ak -cG -ak -ak -ak -bo -aq -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Pe +tJ +IZ +VY +VY +VY +VY +VY +VY +ot +ot +VY +ot +ot +CJ +xv +xv +tK +Qg +TO +zK +uN +xv +xv +VY +VY +Kh +Fb +Rj +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (96,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ah -az -aK -ak -ak -aX -aX -aX -aX -aX -ba -ba -aX -aX -aX -aX -aX -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -bo -aq -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +wA +VY +xi +xi +xv +VY +VY +VY +VY +VY +VY +VY +rE +pO +Qg +FU +lb +lb +FU +lb +wv +xv +xv +Fb +Rj +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (97,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -aA -ak -ak -ak -ak -ak -ak -ak -ak -bE -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -bo -aq -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Pe +tJ +VY +xi +Cg +bx +VY +VY +uo +uo +uo +uo +iI +TJ +xv +yO +Ow +Ow +Ow +Ow +Ow +bH +WO +xv +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (98,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ah -az -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -bo -am -am -am -am -am -am -am -aq -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Pe +tJ +xv +xv +xv +VY +FH +VY +VY +VY +VY +VY +VY +xv +xv +EF +EF +EF +EF +EF +BD +pC +xv +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (99,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ah -az -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -bo -am -aq -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Pe +tJ +YM +VY +VY +cv +Dv +VY +VY +VY +Rn +VY +FJ +xv +CG +Gh +XB +XB +XB +XB +Ha +xv +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (100,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ah -az -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -bo -aq -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Vf +VY +VY +IZ +VY +VY +VY +VY +qt +Kh +uY +Rj +xv +Kn +Cf +XB +XB +XB +XB +xv +xv +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (101,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ag -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ap -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Pe +tJ +fm +VY +VY +FK +Kh +Fb +Fb +Rj +XB +XB +xv +xv +lB +ho +ho +ho +xv +xv +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (102,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ah -az -ak -ak -ak -ak -bo -am -am -am -Bd -aq -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +Pe +Fb +Fb +Fb +Fb +Rj +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (103,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ah -am -am -am -am -aq -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (104,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (105,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -as -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (106,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -at -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (107,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (108,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -at -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (109,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (110,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (111,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (112,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (113,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (114,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (115,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (116,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (117,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -as -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (118,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (119,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (120,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (121,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -as -ab -ab -ab -ab -ab -ab -at -ab -ab -as -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -at -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -as -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -at -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -as -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (122,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (123,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (124,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (125,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (126,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (127,1,1) = {" -aa -aa -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (128,1,1) = {" -aa -aa -av -af -aj -aj -aj -ao -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (129,1,1) = {" -aa -aa -av -ag -ak -ak -da -ap -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (130,1,1) = {" -aa -aa -av -ag -au -an -ak -ap -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (131,1,1) = {" -aa -aa -av -ag -al -ak -MD -ap -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (132,1,1) = {" -aa -aa -av -ah -am -am -am -aq -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (133,1,1) = {" -aa -aa -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (134,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} (135,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(136,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(137,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(138,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(139,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(140,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(141,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(142,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(143,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(144,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(145,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(146,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(147,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(148,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(149,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(150,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(151,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(152,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(153,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(154,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(155,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(156,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(157,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(158,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(159,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(160,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(161,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(162,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(163,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(164,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(165,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(166,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(167,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(168,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(169,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(170,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(171,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(172,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(173,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(174,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(175,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(176,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(177,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(178,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(179,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(180,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(181,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(182,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(183,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(184,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(185,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(186,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(187,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(188,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(189,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(190,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(191,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(192,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(193,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(194,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(195,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(196,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(197,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(198,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(199,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(200,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(201,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(202,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(203,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(204,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(205,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(206,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(207,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(208,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(209,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(210,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(211,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(212,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(213,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(214,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(215,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(216,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(217,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(218,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(219,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(220,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(221,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(222,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(223,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(224,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(225,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(226,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(227,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(228,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(229,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(230,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(231,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(232,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(233,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(234,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(235,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(236,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(237,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(238,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(239,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(240,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(241,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(242,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(243,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(244,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(245,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(246,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(247,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(248,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(249,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(250,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(251,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(252,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(253,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(254,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +"} +(255,1,1) = {" +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB +XB "} From b237455ab287e5270dc1d9ac762ae9dbb735f799 Mon Sep 17 00:00:00 2001 From: Name Date: Tue, 3 Oct 2023 05:33:33 -0400 Subject: [PATCH 05/49] VoidRaptor gets a security biosuit (#24081) VR Sec Bio Suit --- _maps/map_files/VoidRaptor/VoidRaptor.dmm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/_maps/map_files/VoidRaptor/VoidRaptor.dmm b/_maps/map_files/VoidRaptor/VoidRaptor.dmm index 1cdd6f23178..26258795a63 100644 --- a/_maps/map_files/VoidRaptor/VoidRaptor.dmm +++ b/_maps/map_files/VoidRaptor/VoidRaptor.dmm @@ -47737,7 +47737,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/structure/table, +/obj/structure/closet/l3closet/security, +/obj/effect/turf_decal/bot, /turf/open/floor/iron/dark, /area/station/security/office) "nvc" = ( From 6af727d1d4e8151ae3cbe0a49d0ae4ad57241dc5 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Tue, 3 Oct 2023 11:33:51 +0200 Subject: [PATCH 06/49] Kudzu is destroyed by storms [MDB IGNORE] (#24077) * Kudzu is destroyed by storms (#78700) ## About The Pull Request Kudzu is destroyed if it's in a turf affected by an active ash, snow, or void storm. Additionally it won't attempt to spread onto open chasms or lava, just to save us some time on creating atoms which will be destroyed seconds later. _**Additionally**_ it won't attempt to spread over open space. This prevents orphaned "levitating" kudzu which is a really unecessary pain in the ass to deal with, especially over large gaps like the tram interstitial tunnels. If the Kudzu infestation gets too bad indoors, simply hire a trained shrub management technician (void heretic) to fumigate your entire station. ## Why It's Good For The Game Kudzu growing on lavaland can be a massive pain in the ass to remove, creates hundreds of processing structures, and doesn't really benefit the game at all. Now it is unlikely to survive there for extended periods of time. Same for the surface of Icebox. This doesn't do anything about kudzu on the lower levels of icebox, but you can't win them all. ## Changelog :cl: balance: Kudzu will now be destroyed by adverse weather. balance: Kudzu will no longer spread over holes. /:cl: * Kudzu is destroyed by storms --------- Co-authored-by: Jacquerel --- .../events/space_vines/vine_structure.dm | 42 ++++++++++++------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/code/modules/events/space_vines/vine_structure.dm b/code/modules/events/space_vines/vine_structure.dm index 47357d558ac..155a4c5c083 100644 --- a/code/modules/events/space_vines/vine_structure.dm +++ b/code/modules/events/space_vines/vine_structure.dm @@ -37,6 +37,7 @@ ) AddElement(/datum/element/connect_loc, loc_connections) AddElement(/datum/element/atmos_sensitive, mapload) + AddComponent(/datum/component/storm_hating) /obj/structure/spacevine/examine(mob/user) . = ..() @@ -147,7 +148,7 @@ break //only capture one mob at a time /obj/structure/spacevine/proc/entangle(mob/living/victim) - if(!victim || isvineimmune(victim)) + if(isnull(victim) || isvineimmune(victim)) return for(var/datum/spacevine_mutation/mutation in mutations) mutation.on_buckle(src, victim) @@ -157,7 +158,7 @@ /// Finds a target tile to spread to. If checks pass it will spread to it and also proc on_spread on target. /obj/structure/spacevine/proc/spread() - if(!master) //If we've lost our controller, something has gone terribly wrong. + if(isnull(master)) //If we've lost our controller, something has gone terribly wrong. return var/direction = pick(GLOB.cardinals) @@ -165,20 +166,29 @@ if(!istype(stepturf)) return - if(!isspaceturf(stepturf) && stepturf.Enter(src)) - var/obj/structure/spacevine/spot_taken = locate() in stepturf //Locates any vine on target turf. Calls that vine "spot_taken". - var/datum/spacevine_mutation/vine_eating/eating = locate() in mutations //Locates the vine eating trait in our own seed and calls it E. - if(!spot_taken || (eating && (spot_taken && !spot_taken.mutations?.Find(eating)))) //Proceed if there isn't a vine on the target turf, OR we have vine eater AND target vine is from our seed and doesn't. Vines from other seeds are eaten regardless. - for(var/datum/spacevine_mutation/mutation in mutations) - mutation.on_spread(src, stepturf) //Only do the on_spread proc if it actually spreads. - stepturf = get_step(src,direction) //in case turf changes, to make sure no runtimes happen - var/obj/structure/spacevine/spawning_vine = master.spawn_spacevine_piece(stepturf, src) //Let's do a cool little animate - if(NSCOMPONENT(direction)) - spawning_vine.pixel_y = direction == NORTH ? -32 : 32 - animate(spawning_vine, pixel_y = 0, time = 1 SECONDS) - else - spawning_vine.pixel_x = direction == EAST ? -32 : 32 - animate(spawning_vine, pixel_x = 0, time = 1 SECONDS) + if(isspaceturf(stepturf) || isopenspaceturf(stepturf) || !stepturf.Enter(src)) + return + if(ischasm(stepturf) && !HAS_TRAIT(stepturf, TRAIT_CHASM_STOPPED)) + return + if(islava(stepturf) && !HAS_TRAIT(stepturf, TRAIT_LAVA_STOPPED)) + return + var/obj/structure/spacevine/spot_taken = locate() in stepturf + var/datum/spacevine_mutation/vine_eating/eating = locate() in mutations + if(!isnull(spot_taken)) //Proceed if there isn't a vine on the target turf, OR we have vine eater AND target vine is from our seed and doesn't. + if (isnull(eating)) + return + if (spot_taken.mutations?.Find(eating)) + return + for(var/datum/spacevine_mutation/mutation in mutations) + mutation.on_spread(src, stepturf) + stepturf = get_step(src, direction) + var/obj/structure/spacevine/spawning_vine = master.spawn_spacevine_piece(stepturf, src) + if(NSCOMPONENT(direction)) + spawning_vine.pixel_y = direction == NORTH ? -32 : 32 + animate(spawning_vine, pixel_y = 0, time = 1 SECONDS) + else + spawning_vine.pixel_x = direction == EAST ? -32 : 32 + animate(spawning_vine, pixel_x = 0, time = 1 SECONDS) /// Destroying an explosive vine sets off a chain reaction /obj/structure/spacevine/ex_act(severity, target) From 449a8c423ff02a7b771eacb4872240f95e592614 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Tue, 3 Oct 2023 11:40:49 +0200 Subject: [PATCH 07/49] Adds some solars stuff to the derelict [MDB IGNORE] (#24078) * Adds some solars stuff to the derelict (#78680) ## About The Pull Request Makes the derelict a slightly less shitty place ## Why It's Good For The Game It is not as terrible anymore. Still mostly terrible, but at least there's more power. ## Changelog :cl: Fazzie add: Added a budget solar crate to the derelict teleporter room add: Added a solar panel control to the north derelict solar qol: The derelict's AI coridoor is now shorter and prettier /:cl: * Adds some solars stuff to the derelict --------- Co-authored-by: Fazzie <84548101+EuSouAFazer@users.noreply.github.com> --- .../SpaceRuins/russian_derelict.dmm | 391 ++++++++++-------- 1 file changed, 211 insertions(+), 180 deletions(-) diff --git a/_maps/RandomRuins/SpaceRuins/russian_derelict.dmm b/_maps/RandomRuins/SpaceRuins/russian_derelict.dmm index 5b7d0ba43da..953bde1f094 100644 --- a/_maps/RandomRuins/SpaceRuins/russian_derelict.dmm +++ b/_maps/RandomRuins/SpaceRuins/russian_derelict.dmm @@ -461,6 +461,10 @@ /obj/structure/cable, /turf/open/floor/plating/airless, /area/ruin/space/solars/ks13/sb_bow_solars) +"fe" = ( +/obj/item/circuitboard/computer/solar_control, +/turf/open/floor/iron, +/area/ruin/space/ks13/engineering/sb_bow_solars_control) "fg" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/airless, @@ -493,7 +497,7 @@ pixel_x = -6; pixel_y = 6 }, -/turf/open/floor/iron, +/turf/open/floor/circuit/red/off, /area/ruin/space/ks13/ai/corridor) "fL" = ( /obj/machinery/door/window/left/directional/west{ @@ -854,6 +858,9 @@ }, /turf/open/floor/iron, /area/ruin/space/ks13/ai/corridor) +"lq" = ( +/turf/open/floor/circuit/red/off, +/area/ruin/space/ks13/ai/corridor) "lw" = ( /obj/structure/lattice, /obj/item/chair, @@ -1181,7 +1188,7 @@ /obj/item/stack/sheet/glass/fifty, /obj/item/stack/sheet/glass/fifty, /obj/item/stack/sheet/glass/fifty, -/turf/open/floor/iron/airless, +/turf/open/floor/circuit/red/airless, /area/ruin/space/ks13/ai/vault) "pc" = ( /obj/effect/decal/cleanable/blood/splatter, @@ -1391,7 +1398,7 @@ pixel_y = 6 }, /obj/item/circuitboard/machine/cryo_tube, -/turf/open/floor/iron, +/turf/open/floor/circuit/red/off, /area/ruin/space/ks13/ai/corridor) "qh" = ( /obj/structure/fluff/oldturret, @@ -1660,10 +1667,6 @@ /area/ruin/space/ks13/hallway/aft) "rI" = ( /obj/structure/table_frame/wood, -/obj/item/clothing/head/helmet/chaplain{ - armor = null; - desc = "The Chaplains crusader helment. It seems old and dented." - }, /turf/open/floor/wood, /area/ruin/space/ks13/service/chapel_office) "rJ" = ( @@ -2487,6 +2490,11 @@ /obj/structure/cable, /turf/open/floor/iron/airless, /area/ruin/space/ks13/hallway/aft) +"wt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/clothing/head/chaplain/bishopmitre, +/turf/open/floor/iron/dark, +/area/ruin/space/ks13/service/chapel_office) "wu" = ( /obj/structure/rack, /obj/effect/decal/cleanable/dirt, @@ -2623,7 +2631,7 @@ /obj/item/stack/sheet/iron/fifty, /obj/item/stack/sheet/iron/fifty, /obj/item/stack/sheet/iron/fifty, -/turf/open/floor/iron/airless, +/turf/open/floor/circuit/red/airless, /area/ruin/space/ks13/ai/vault) "xb" = ( /obj/structure/frame/computer{ @@ -2769,7 +2777,7 @@ pixel_y = 6 }, /obj/item/circuitboard/machine/chem_dispenser/drinks/beer, -/turf/open/floor/iron, +/turf/open/floor/circuit/red/off, /area/ruin/space/ks13/ai/corridor) "xN" = ( /obj/structure/rack, @@ -3008,6 +3016,11 @@ /obj/effect/spawner/structure/window/hollow/reinforced/middle, /turf/open/floor/plating/airless, /area/ruin/space/ks13/engineering/aft_solars_control) +"yY" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/closet/crate/solarpanel_small, +/turf/open/floor/iron/airless, +/area/space/nearstation) "yZ" = ( /obj/structure/grille/broken, /obj/effect/decal/cleanable/glass, @@ -3153,6 +3166,13 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, /area/ruin/space/ks13/ai/vault) +"zJ" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate/solarpanel_small, +/turf/open/floor/iron/airless, +/area/ruin/space/ks13/hallway/central) "zK" = ( /obj/machinery/light/small/directional/east, /obj/effect/decal/cleanable/dirt, @@ -3474,7 +3494,7 @@ pixel_y = 6 }, /obj/item/circuitboard/machine/smes, -/turf/open/floor/iron, +/turf/open/floor/circuit/red/off, /area/ruin/space/ks13/ai/corridor) "Bv" = ( /obj/effect/decal/cleanable/glass, @@ -3869,7 +3889,7 @@ pixel_y = 6 }, /obj/item/ai_module/core/full/drone, -/turf/open/floor/iron, +/turf/open/floor/circuit/red/off, /area/ruin/space/ks13/ai/corridor) "DL" = ( /obj/structure/table, @@ -4575,7 +4595,7 @@ pixel_y = 6 }, /obj/item/circuitboard/machine/space_heater, -/turf/open/floor/iron, +/turf/open/floor/circuit/red/off, /area/ruin/space/ks13/ai/corridor) "Hh" = ( /obj/effect/decal/cleanable/dirt, @@ -4967,7 +4987,7 @@ pixel_x = -6; pixel_y = -6 }, -/turf/open/floor/iron, +/turf/open/floor/circuit/red/off, /area/ruin/space/ks13/ai/corridor) "Jz" = ( /obj/effect/mapping_helpers/burnt_floor, @@ -5361,12 +5381,12 @@ pixel_y = 6 }, /obj/item/circuitboard/machine/protolathe/offstation, -/turf/open/floor/iron, +/turf/open/floor/circuit/red/off, /area/ruin/space/ks13/ai/corridor) "LM" = ( /obj/machinery/light/small/directional/north, /obj/structure/cable, -/turf/open/floor/iron, +/turf/open/floor/circuit/red/off, /area/ruin/space/ks13/ai/corridor) "LN" = ( /turf/closed/wall, @@ -6037,7 +6057,7 @@ pixel_x = -6; pixel_y = -6 }, -/turf/open/floor/iron, +/turf/open/floor/circuit/red/off, /area/ruin/space/ks13/ai/corridor) "Pq" = ( /obj/effect/decal/cleanable/dirt, @@ -6407,7 +6427,7 @@ "Rm" = ( /obj/structure/rack, /obj/item/circuitboard/computer/crew, -/turf/open/floor/iron, +/turf/open/floor/circuit/red/off, /area/ruin/space/ks13/ai/corridor) "Ro" = ( /obj/structure/grille/broken, @@ -7530,7 +7550,7 @@ /obj/item/stack/sheet/mineral/silver{ amount = 15 }, -/turf/open/floor/iron/airless, +/turf/open/floor/circuit/red/airless, /area/ruin/space/ks13/ai/vault) "WO" = ( /obj/effect/spawner/random/maintenance, @@ -7609,7 +7629,7 @@ /obj/machinery/power/apc/auto_name/directional/north, /obj/effect/mapping_helpers/apc/no_charge, /obj/structure/cable, -/turf/open/floor/iron, +/turf/open/floor/circuit/red/off, /area/ruin/space/ks13/ai/corridor) "Xj" = ( /obj/effect/decal/cleanable/dirt, @@ -7675,6 +7695,10 @@ /obj/structure/cable, /turf/open/floor/iron/white/airless, /area/ruin/space/ks13/medical/medbay) +"XI" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/circuit/red/off, +/area/ruin/space/ks13/ai/corridor) "XJ" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/effect/mapping_helpers/apc/no_charge, @@ -7735,6 +7759,13 @@ }, /turf/open/floor/iron, /area/ruin/space/ks13/command/bridge) +"Yb" = ( +/obj/structure/cable, +/obj/structure/frame/computer{ + anchored = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/ks13/engineering/sb_bow_solars_control) "Yc" = ( /turf/closed/wall/r_wall, /area/ruin/space/ks13/ai/corridor) @@ -7835,7 +7866,7 @@ /area/ruin/space/ks13/hallway/aft) "YC" = ( /obj/structure/fluff/oldturret, -/turf/open/floor/iron, +/turf/open/floor/circuit/red/off, /area/ruin/space/ks13/ai/corridor) "YE" = ( /obj/structure/plaque/static_plaque/golden/commission/ks13, @@ -7980,7 +8011,7 @@ /obj/item/stack/sheet/mineral/plasma{ amount = 15 }, -/turf/open/floor/iron/airless, +/turf/open/floor/circuit/red/airless, /area/ruin/space/ks13/ai/vault) "Zq" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -8045,7 +8076,7 @@ /obj/item/stack/sheet/iron/fifty, /obj/item/stack/sheet/iron/fifty, /obj/item/stack/sheet/iron/fifty, -/turf/open/floor/iron/airless, +/turf/open/floor/circuit/red/airless, /area/ruin/space/ks13/ai/vault) "ZC" = ( /obj/structure/table/glass, @@ -8559,7 +8590,7 @@ xB vl NO uf -oU +yY zN qG aa @@ -8772,7 +8803,7 @@ aa aa rk MB -sh +wt Eu sh sh @@ -10761,13 +10792,13 @@ aa aa aa aa -rk aa aa aa -rk -rk -rk +aa +aa +aa +aa aa aa aa @@ -10873,16 +10904,16 @@ aa aa aa aa -rk aa -rk -rk -rk aa aa aa -rk -rk +aa +aa +aa +aa +aa +aa aa aa aa @@ -10986,16 +11017,16 @@ aa aa aa aa -rk -Yc -Yc -Yc -Yc -Yc -Yc -Yc aa -rk +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -11100,24 +11131,24 @@ aa aa aa aa -rk -Yc -Pw -fU -zA -fU -Yc aa -rk -rk -rk -rk -rk -rk -rk -rk -rk -rk +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -11212,32 +11243,32 @@ aa aa aa aa +aa rk -Yc -Yc -eA -Yc -Yc -fU -Yc -Jw -Jw -Jw -Jw -Jw -Jw -Jw -Jw -Jw -Jw -rk -rk +aa +aa +aa rk rk rk aa aa aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa rk rk rk @@ -11325,31 +11356,31 @@ aa aa aa aa +rk aa rk rk rk -Yc -AW -KO -Yc -Bw -Bw -Bw -Bw -Bw -Bw -IF -IF -RL aa aa +aa +rk rk aa aa aa aa aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa rk rk rk @@ -11438,22 +11469,15 @@ aa aa aa aa -aa -aa -aa rk Yc Yc -lk Yc -Jw -Jw -Jw -Jw -Jw -Jw -Jw -Jw +Yc +Yc +Yc +Yc +aa rk aa aa @@ -11464,6 +11488,13 @@ aa aa aa aa +aa +aa +aa +aa +aa +aa +aa rk Kb rk @@ -11552,24 +11583,24 @@ aa aa aa aa -aa -aa -aa rk Yc +Pw fU +zA fU -fU -fU -fU -fU -fU -fU -YC Yc +aa +rk +rk +rk +rk +rk +rk +rk +rk rk rk -aa aa aa aa @@ -11664,23 +11695,24 @@ aa aa aa aa -aa -aa -aa -aa -aa -Yc -Yc -Yc -Yc -Yc +rk Yc Yc +eA Yc -st Yc +fU Yc -aa +Jw +Jw +Jw +Jw +Jw +Jw +Jw +Jw +Jw +Jw rk aa aa @@ -11690,7 +11722,6 @@ aa aa aa aa -aa rk sU Wk @@ -11778,22 +11809,22 @@ aa aa aa aa -aa -aa -aa -aa -Yc -YC -fU -fU -fU -fU -fU -fU -fU +rk +rk +rk Yc +AW +KO Yc -aa +sg +Bw +Bw +Bw +Bw +Bw +IF +IF +RL aa aa aa @@ -11893,20 +11924,20 @@ aa aa aa aa -aa -aa -Yc -Yc -st -Yc -Yc -Yc -Yc -Yc +rk Yc Yc +lk Yc -aa +Jw +Jw +Jw +Jw +Jw +Jw +Jw +Jw +rk aa aa aa @@ -12007,8 +12038,7 @@ aa aa aa aa -aa -Yc +rk Yc fU fU @@ -12017,10 +12047,11 @@ fU fU fU fU +fU YC Yc -aa -aa +rk +rk aa aa uu @@ -12042,11 +12073,11 @@ bm PI zv PI +Jc xJ xJ xJ -xJ -xJ +Jc zv PI zv @@ -12133,9 +12164,9 @@ st Yc Yc aa -aa rk aa +aa uu NJ QJ @@ -12246,8 +12277,8 @@ fU Yc Yc aa -IF -rk +aa +aa aa yf bN @@ -12359,8 +12390,8 @@ Yc Yc Yc aa -Bw -Gf +aa +aa aa yf wQ @@ -12472,8 +12503,8 @@ fU YC Yc aa -Bw -Gf +aa +aa aa yf WF @@ -12494,12 +12525,12 @@ PI zv PI zv -xJ -xJ +Jc xJ xJ xJ PI +PI fg FI pi @@ -12586,7 +12617,7 @@ Yc Yc Yc Bw -Gf +Jw aa yf yf @@ -12803,15 +12834,15 @@ Yc Yc Yc Yc -fU +lq Bu Hg fJ -fU +lq YC Yc Yc -IF +Xa aa aa aa @@ -13030,11 +13061,11 @@ Yc Yc Yc Xi -fU +lq qf Rm -fU -fU +lq +lq Yc LL Yc @@ -13149,7 +13180,7 @@ fU fU fU PW -KO +XI Yc aa aa @@ -13259,7 +13290,7 @@ LM xL Po Jy -fU +lq YC Yc DK @@ -13638,7 +13669,7 @@ QR NG yl XC -Qz +zJ Mz QR yg @@ -15734,7 +15765,7 @@ aa aa xS pR -pR +fe xS VB cR @@ -15846,7 +15877,7 @@ bP aa aa xS -VB +Yb IK xS pR From 542d2f2d666c864c94083c2e82d0c11fea99ff3c Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Tue, 3 Oct 2023 11:41:05 +0200 Subject: [PATCH 08/49] Ashwalkers team stores players_spawned via ckeys rather than keys now [MDB IGNORE] (#24071) * Ashwalkers team stores players_spawned via ckeys rather than keys now * Update mining_roles.dm --------- Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> --- .../mapfluff/ruins/objects_and_mobs/ash_walker_den.dm | 8 ++++---- code/modules/mob_spawn/ghost_roles/mining_roles.dm | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/code/modules/mapfluff/ruins/objects_and_mobs/ash_walker_den.dm b/code/modules/mapfluff/ruins/objects_and_mobs/ash_walker_den.dm index 505b6cd5d79..480b26f5fab 100644 --- a/code/modules/mapfluff/ruins/objects_and_mobs/ash_walker_den.dm +++ b/code/modules/mapfluff/ruins/objects_and_mobs/ash_walker_den.dm @@ -57,10 +57,10 @@ visible_message(span_notice("Serrated tendrils eagerly pull [H] apart, but find nothing of interest.")) return - if(H.mind?.has_antag_datum(/datum/antagonist/ashwalker) && (H.key || H.get_ghost(FALSE, TRUE))) //special interactions for dead lava lizards with ghosts attached + if(H.mind?.has_antag_datum(/datum/antagonist/ashwalker) && (H.ckey || H.get_ghost(FALSE, TRUE))) //special interactions for dead lava lizards with ghosts attached visible_message(span_warning("Serrated tendrils carefully pull [H] to [src], absorbing the body and creating it anew.")) var/datum/mind/deadmind - if(H.key) + if(H.ckey) deadmind = H else deadmind = H.get_ghost(FALSE, TRUE) @@ -77,8 +77,8 @@ meat_counter++ visible_message(span_warning("Serrated tendrils eagerly pull [H] to [src], tearing the body apart as its blood seeps over the eggs.")) playsound(get_turf(src),'sound/magic/demon_consume.ogg', 100, TRUE) - var/deliverykey = H.fingerprintslast //key of whoever brought the body - var/mob/living/deliverymob = get_mob_by_key(deliverykey) //mob of said key + var/deliverykey = H.fingerprintslast //ckey of whoever brought the body + var/mob/living/deliverymob = get_mob_by_key(deliverykey) //mob of said ckey //there is a 40% chance that the Lava Lizard unlocks their respawn with each sacrifice if(deliverymob && (deliverymob.mind?.has_antag_datum(/datum/antagonist/ashwalker)) && (deliverykey in ashies.players_spawned) && (prob(40))) to_chat(deliverymob, span_warning("The Necropolis is pleased with your sacrifice. You feel confident your existence after death is secure.")) diff --git a/code/modules/mob_spawn/ghost_roles/mining_roles.dm b/code/modules/mob_spawn/ghost_roles/mining_roles.dm index 62861c6f303..4c34dc26699 100644 --- a/code/modules/mob_spawn/ghost_roles/mining_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/mining_roles.dm @@ -236,7 +236,7 @@ return ..() /obj/effect/mob_spawn/ghost_role/human/ash_walker/allow_spawn(mob/user, silent = FALSE) - if(!(user.ckey in team.players_spawned))//one per person unless you get a bonus spawn SKYRAT EDIT: Original: if(!(user.key in team.players_spawned)) + if(!(user.ckey in team.players_spawned))//one per person unless you get a bonus spawn return TRUE if(!silent) to_chat(user, span_warning("You have exhausted your usefulness to the Necropolis.")) @@ -254,7 +254,7 @@ spawned_human.mind.add_antag_datum(/datum/antagonist/ashwalker, team) spawned_human.remove_language(/datum/language/common) - team.players_spawned += (spawned_human.ckey) //SKYRAT EDIT: Original: team.players_spawned += (spawned_human.key) + team.players_spawned += (spawned_human.ckey) eggshell.egg = null QDEL_NULL(eggshell) From d5813979d2949c975d8303f4e57372e8460d77e5 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Tue, 3 Oct 2023 13:05:40 +0200 Subject: [PATCH 09/49] Fix organs having no DNA and become bloody when violently removed [MDB IGNORE] (#24069) * Fix organs having no DNA and become bloody when violently removed * Update surgery.dm --------- Co-authored-by: Tim Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> --- code/__DEFINES/surgery.dm | 4 ++- code/modules/forensics/_forensics.dm | 2 ++ code/modules/surgery/organs/_organ.dm | 26 ++++++++++++++++++- .../surgery/organs/internal/heart/_heart.dm | 2 +- 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/code/__DEFINES/surgery.dm b/code/__DEFINES/surgery.dm index 61aa305c27a..dcdd1394253 100644 --- a/code/__DEFINES/surgery.dm +++ b/code/__DEFINES/surgery.dm @@ -24,9 +24,11 @@ #define ORGAN_UNREMOVABLE (1<<8) /// Can't be seen by scanners, doesn't anger body purists #define ORGAN_HIDDEN (1<<9) +/// Has the organ already been inserted inside someone +#define ORGAN_VIRGIN (1<<10) // SKYRAT EDIT START - Customization /// Synthetic organ granted by a species (for use for organ replacements between species) -#define ORGAN_SYNTHETIC_FROM_SPECIES (1<<10) +#define ORGAN_SYNTHETIC_FROM_SPECIES (1<<11) // SKYRAT EDIT END /// Helper to figure out if a limb is organic diff --git a/code/modules/forensics/_forensics.dm b/code/modules/forensics/_forensics.dm index 76a051f1d72..5936ce4b5c4 100644 --- a/code/modules/forensics/_forensics.dm +++ b/code/modules/forensics/_forensics.dm @@ -232,6 +232,8 @@ /datum/forensics/proc/check_blood() if(!parent || !isitem(parent.resolve())) return + if(isorgan(parent.resolve())) // organs don't spawn with blood decals by default + return if(!length(blood_DNA)) return var/atom/parent_atom = parent.resolve() diff --git a/code/modules/surgery/organs/_organ.dm b/code/modules/surgery/organs/_organ.dm index 0c4b72ff551..5b78cb30796 100644 --- a/code/modules/surgery/organs/_organ.dm +++ b/code/modules/surgery/organs/_organ.dm @@ -6,6 +6,8 @@ throwforce = 0 /// The mob that owns this organ. var/mob/living/carbon/owner = null + /// The cached info about the blood this organ belongs to + var/list/blood_dna_info = list("Synthetic DNA" = "O+") // not every organ spawns inside a person /// The body zone this organ is supposed to inhabit. var/zone = BODY_ZONE_CHEST /** @@ -14,7 +16,7 @@ */ var/slot /// Random flags that describe this organ - var/organ_flags = ORGAN_ORGANIC | ORGAN_EDIBLE + var/organ_flags = ORGAN_ORGANIC | ORGAN_EDIBLE | ORGAN_VIRGIN /// Maximum damage the organ can take, ever. var/maxHealth = STANDARD_ORGAN_THRESHOLD /** @@ -75,6 +77,9 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) volume = reagent_vol,\ after_eat = CALLBACK(src, PROC_REF(OnEatFrom))) + if(!IS_ROBOTIC_ORGAN(src)) + add_blood_DNA(blood_dna_info) + /* * Insert the organ into the select mob. * @@ -100,6 +105,14 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) receiver.organs_slot[slot] = src owner = receiver + if(!IS_ROBOTIC_ORGAN(src) && (organ_flags & ORGAN_VIRGIN)) + blood_dna_info = receiver.get_blood_dna_list() + // need to remove the synethic blood DNA that is initialized + // wash also adds the blood dna again + wash(CLEAN_TYPE_BLOOD) + organ_flags &= ~ORGAN_VIRGIN + + // Apply unique side-effects. Return value does not matter. on_insert(receiver, special) @@ -168,6 +181,9 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) SEND_SIGNAL(src, COMSIG_ORGAN_REMOVED, organ_owner) SEND_SIGNAL(organ_owner, COMSIG_CARBON_LOSE_ORGAN, src, special) + if(!IS_ROBOTIC_ORGAN(src) && !(item_flags & NO_BLOOD_ON_ITEM) && !QDELING(src)) + AddElement(/datum/element/decal/blood) + var/list/diseases = organ_owner.get_static_viruses() if(!LAZYLEN(diseases)) return @@ -228,6 +244,14 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) /obj/item/organ/proc/on_surgical_removal(mob/living/user, mob/living/carbon/old_owner, target_zone, obj/item/tool) SHOULD_CALL_PARENT(TRUE) SEND_SIGNAL(src, COMSIG_ORGAN_SURGICALLY_REMOVED, user, old_owner, target_zone, tool) + RemoveElement(/datum/element/decal/blood) + +/obj/item/organ/wash(clean_types) + . = ..() + + // always add the original dna to the organ after it's washed + if(!IS_ROBOTIC_ORGAN(src) && (clean_types & CLEAN_TYPE_BLOOD)) + add_blood_DNA(blood_dna_info) /obj/item/organ/process(seconds_per_tick, times_fired) return diff --git a/code/modules/surgery/organs/internal/heart/_heart.dm b/code/modules/surgery/organs/internal/heart/_heart.dm index e553f8f1307..307d3e478a5 100644 --- a/code/modules/surgery/organs/internal/heart/_heart.dm +++ b/code/modules/surgery/organs/internal/heart/_heart.dm @@ -6,7 +6,7 @@ visual = FALSE zone = BODY_ZONE_CHEST slot = ORGAN_SLOT_HEART - + item_flags = NO_BLOOD_ON_ITEM healing_factor = STANDARD_ORGAN_HEALING decay_factor = 2.5 * STANDARD_ORGAN_DECAY //designed to fail around 6 minutes after death From 4ba799c64ec1b03be9196299bf41d63e59022820 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Tue, 3 Oct 2023 13:05:57 +0200 Subject: [PATCH 10/49] Fixes Lazy Templates fucking over cables, pipes , and shuttles at random [MDB IGNORE] (#24088) * Fixes Lazy Templates fucking over cables, pipes , and shuttles at random (#78622) ## About The Pull Request See title. ## Why It's Good For The Game If a lazy template is loaded AFTER roundstart it doesn't get included into the global init procs, because that work is offloaded into a subsystem LINDA runtimes are bad, null.archive() runtime be gone. ## Changelog :cl: fix: The Syndicate have fired their previous construction company after poor results in recent outposts. /:cl: * Fixes Lazy Templates fucking over cables, pipes , and shuttles at random --------- Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com> --- code/datums/lazy_template.dm | 22 ++++++++++++++++++---- code/game/turfs/change_turf.dm | 2 +- code/modules/mapping/map_template.dm | 1 - code/modules/shuttle/shuttle.dm | 3 +++ 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/code/datums/lazy_template.dm b/code/datums/lazy_template.dm index a5ae9e413f3..e3006e13056 100644 --- a/code/datums/lazy_template.dm +++ b/code/datums/lazy_template.dm @@ -64,12 +64,18 @@ if(!reservation) CRASH("Failed to reserve a block for lazy template: '[key]'") + // lists kept for overall loading var/list/loaded_atom_movables = list() var/list/loaded_turfs = list() var/list/loaded_areas = list() + + var/list/obj/structure/cable/loaded_cables = list() + var/list/obj/machinery/atmospherics/loaded_atmospherics = list() + for(var/z_idx in parsed_template.parsed_bounds[MAP_MAXZ] to 1 step -1) var/turf/bottom_left = reservation.bottom_left_turfs[z_idx] var/turf/top_right = reservation.top_right_turfs[z_idx] + load_map( file(load_path), bottom_left.x, @@ -81,12 +87,20 @@ for(var/turf/turf as anything in block(bottom_left, top_right)) loaded_turfs += turf loaded_areas |= get_area(turf) - for(var/thing in turf.get_all_contents()) - // atoms can actually be in the contents of two or more turfs based on its icon/bound size - // see https://www.byond.com/docs/ref/index.html#/atom/var/contents + + // atoms can actually be in the contents of two or more turfs based on its icon/bound size + // see https://www.byond.com/docs/ref/index.html#/atom/var/contents + for(var/thing in (turf.get_all_contents() - turf)) + if(istype(thing, /obj/structure/cable)) + loaded_cables += thing + else if(istype(thing, /obj/machinery/atmospherics)) + loaded_atmospherics += thing loaded_atom_movables |= thing - SSatoms.InitializeAtoms(loaded_atom_movables + loaded_turfs + loaded_areas) + SSatoms.InitializeAtoms(loaded_areas + loaded_atom_movables + loaded_turfs) + SSmachines.setup_template_powernets(loaded_cables) + SSair.setup_template_machinery(loaded_atmospherics) + SEND_SIGNAL(src, COMSIG_LAZY_TEMPLATE_LOADED, loaded_atom_movables, loaded_turfs, loaded_areas) reservations += reservation return reservation diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index f5b40238ed6..1253d156a2c 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -252,7 +252,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( //SKYRAT EDIT END if(excited || excited_group) SSair.remove_from_active(src) //Clean up wall excitement, and refresh excited groups - if(ispath(path,/turf/closed) || ispath(path,/turf/cordon)) + if(ispath(path, /turf/closed) || ispath(path, /turf/cordon)) flags |= CHANGETURF_RECALC_ADJACENT return ..() diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm index 237ae9f2d52..7917da4d542 100644 --- a/code/modules/mapping/map_template.dm +++ b/code/modules/mapping/map_template.dm @@ -109,7 +109,6 @@ // need these two below? SSmachines.setup_template_powernets(cables) SSair.setup_template_machinery(atmos_machines) - SSshuttle.setup_shuttles(ports) //calculate all turfs inside the border var/list/template_and_bordering_turfs = block( diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 4ae1c241d06..e11e6bf9156 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -239,6 +239,9 @@ for(var/turf/T in return_turfs()) T.turf_flags |= NO_RUINS + if(SSshuttle.initialized) + INVOKE_ASYNC(SSshuttle, TYPE_PROC_REF(/datum/controller/subsystem/shuttle, setup_shuttles), list(src)) + #ifdef DOCKING_PORT_HIGHLIGHT highlight("#f00") #endif From 8cd111f9499e9cfeef7766b7fe59f5de00747295 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Tue, 3 Oct 2023 15:10:02 +0200 Subject: [PATCH 11/49] Fix butchered and gibbed mobs to transfer reagents and diseases to meat [MDB IGNORE] (#24091) * Fix butchered and gibbed mobs to transfer reagents and diseases to meat (#78454) ## About The Pull Request Fixes #78386 Fixes #60352 Butchering monkey meat or gibbing mobs will now properly transfer all reagents and diseases to the byproducts. ## Why It's Good For The Game More realism is nice. ## Changelog :cl: fix: Fix butchered monkeys to transfer reagents and diseases to meat /:cl: --------- Co-authored-by: Jacquerel * Fix butchered and gibbed mobs to transfer reagents and diseases to meat --------- Co-authored-by: Tim Co-authored-by: Jacquerel --- code/datums/components/butchering.dm | 77 ++++++++++++------- .../food_and_drinks/machinery/gibber.dm | 15 +++- 2 files changed, 65 insertions(+), 27 deletions(-) diff --git a/code/datums/components/butchering.dm b/code/datums/components/butchering.dm index 0ed00e7dd94..97bb2a30ad5 100644 --- a/code/datums/components/butchering.dm +++ b/code/datums/components/butchering.dm @@ -99,50 +99,75 @@ * * Arguments: * - [butcher][/mob/living]: The mob doing the butchering - * - [meat][/mob/living]: The mob being butchered + * - [target][/mob/living]: The mob being butchered */ -/datum/component/butchering/proc/on_butchering(atom/butcher, mob/living/meat) +/datum/component/butchering/proc/on_butchering(atom/butcher, mob/living/target) var/list/results = list() - var/turf/T = meat.drop_location() - var/final_effectiveness = effectiveness - meat.butcher_difficulty + var/turf/location = target.drop_location() + var/final_effectiveness = effectiveness - target.butcher_difficulty var/bonus_chance = max(0, (final_effectiveness - 100) + bonus_modifier) //so 125 total effectiveness = 25% extra chance - for(var/V in meat.butcher_results) - var/obj/bones = V - var/amount = meat.butcher_results[bones] + + for(var/result_typepath in target.butcher_results) + var/obj/remains = result_typepath + var/amount = target.butcher_results[remains] for(var/_i in 1 to amount) if(!prob(final_effectiveness)) if(butcher) - to_chat(butcher, span_warning("You fail to harvest some of the [initial(bones.name)] from [meat].")) + to_chat(butcher, span_warning("You fail to harvest some of the [initial(remains.name)] from [target].")) continue if(prob(bonus_chance)) if(butcher) - to_chat(butcher, span_info("You harvest some extra [initial(bones.name)] from [meat]!")) - results += new bones (T) - results += new bones (T) + to_chat(butcher, span_info("You harvest some extra [initial(remains.name)] from [target]!")) + results += new remains (location) + results += new remains (location) - meat.butcher_results.Remove(bones) //in case you want to, say, have it drop its results on gib + target.butcher_results.Remove(remains) //in case you want to, say, have it drop its results on gib - for(var/V in meat.guaranteed_butcher_results) - var/obj/sinew = V - var/amount = meat.guaranteed_butcher_results[sinew] + for(var/guaranteed_result_typepath in target.guaranteed_butcher_results) + var/obj/guaranteed_remains = guaranteed_result_typepath + var/amount = target.guaranteed_butcher_results[guaranteed_remains] for(var/i in 1 to amount) - results += new sinew (T) - meat.guaranteed_butcher_results.Remove(sinew) + results += new guaranteed_remains (location) + target.guaranteed_butcher_results.Remove(guaranteed_remains) for(var/obj/item/carrion in results) var/list/meat_mats = carrion.has_material_type(/datum/material/meat) if(!length(meat_mats)) continue - carrion.set_custom_materials((carrion.custom_materials - meat_mats) + list(GET_MATERIAL_REF(/datum/material/meat/mob_meat, meat) = counterlist_sum(meat_mats))) + carrion.set_custom_materials((carrion.custom_materials - meat_mats) + list(GET_MATERIAL_REF(/datum/material/meat/mob_meat, target) = counterlist_sum(meat_mats))) + + // transfer delicious reagents to meat + if(target.reagents) + var/meat_produced = 0 + for(var/obj/item/food/meat/slab/target_meat in results) + meat_produced += 1 + for(var/obj/item/food/meat/slab/target_meat in results) + target.reagents.trans_to(target_meat, target.reagents.total_volume / meat_produced, remove_blacklisted = TRUE) + + // dont forget yummy diseases either! + if(iscarbon(target)) + var/mob/living/carbon/host_target = target + var/list/diseases = host_target.get_static_viruses() + if(LAZYLEN(diseases)) + var/list/datum/disease/diseases_to_add = list() + for(var/datum/disease/disease as anything in diseases) + // admin or special viruses that should not be reproduced + if(disease.spread_flags & (DISEASE_SPREAD_SPECIAL | DISEASE_SPREAD_NON_CONTAGIOUS)) + continue + + diseases_to_add += disease + if(LAZYLEN(diseases_to_add)) + for(var/obj/diseased_remains in results) + diseased_remains.AddComponent(/datum/component/infective, diseases_to_add) if(butcher) - butcher.visible_message(span_notice("[butcher] butchers [meat]."), \ - span_notice("You butcher [meat].")) - butcher_callback?.Invoke(butcher, meat) - meat.harvest(butcher) - meat.log_message("has been butchered by [key_name(butcher)]", LOG_ATTACK) - meat.gib(FALSE, FALSE, TRUE) + butcher.visible_message(span_notice("[butcher] butchers [target]."), \ + span_notice("You butcher [target].")) + butcher_callback?.Invoke(butcher, target) + target.harvest(butcher) + target.log_message("has been butchered by [key_name(butcher)]", LOG_ATTACK) + target.gib(FALSE, FALSE, TRUE) ///Enables the butchering mechanic for the mob who has equipped us. /datum/component/butchering/proc/enable_butchering(datum/source) @@ -207,9 +232,9 @@ )) ///When we are ready to drill through a mob -/datum/component/butchering/mecha/proc/on_drill(datum/source, obj/vehicle/sealed/mecha/chassis, mob/living/meat) +/datum/component/butchering/mecha/proc/on_drill(datum/source, obj/vehicle/sealed/mecha/chassis, mob/living/target) SIGNAL_HANDLER - INVOKE_ASYNC(src, PROC_REF(on_butchering), chassis, meat) + INVOKE_ASYNC(src, PROC_REF(on_butchering), chassis, target) /datum/component/butchering/wearable diff --git a/code/modules/food_and_drinks/machinery/gibber.dm b/code/modules/food_and_drinks/machinery/gibber.dm index ebb2b85e2b9..45e66f95ed2 100644 --- a/code/modules/food_and_drinks/machinery/gibber.dm +++ b/code/modules/food_and_drinks/machinery/gibber.dm @@ -198,6 +198,7 @@ occupant.reagents.trans_to(newmeat, occupant_volume / meat_produced, remove_blacklisted = TRUE) if(sourcejob) newmeat.subjectjob = sourcejob + allmeat[i] = newmeat if(typeofskin) @@ -221,12 +222,24 @@ skin.throw_at(pick(nearby_turfs),meat_produced,3) for (var/i=1 to meat_produced) var/obj/item/meatslab = allmeat[i] + + if(LAZYLEN(diseases)) + var/list/datum/disease/diseases_to_add = list() + for(var/datum/disease/disease as anything in diseases) + // admin or special viruses that should not be reproduced + if(disease.spread_flags & (DISEASE_SPREAD_SPECIAL | DISEASE_SPREAD_NON_CONTAGIOUS)) + continue + + diseases_to_add += disease + if(LAZYLEN(diseases_to_add)) + meatslab.AddComponent(/datum/component/infective, diseases_to_add) + meatslab.forceMove(loc) meatslab.throw_at(pick(nearby_turfs),i,3) for (var/turfs=1 to meat_produced) var/turf/gibturf = pick(nearby_turfs) if (!gibturf.density && (src in view(gibturf))) - new gibtype(gibturf,i,diseases) + new gibtype(gibturf, i, diseases) pixel_x = base_pixel_x //return to its spot after shaking operating = FALSE From 2481b3e3f2d20a53ad96f6a83843779690b6d2c2 Mon Sep 17 00:00:00 2001 From: Paxilmaniac <82386923+Paxilmaniac@users.noreply.github.com> Date: Tue, 3 Oct 2023 11:20:23 -0400 Subject: [PATCH 12/49] Armadyne Antitrust Act 2563 :: Disintegrates armadyne as a concept and replaces basically everything related (#23424) * oh yeah oh woag * maybe we can make uncommon into that * gunnenshooter * hard work work * just now realised i forgot inhands * inhands and worn * soundsmith tf2 * does the rifles * puts some of the pistol suppressor images in * awawawa * shotgun override apparently * pistola * grendae launcher * dont forget the evil one too * yeah lets fix that * oops * now lets see what kind of errors compiling gives us * should hopefully be all the compile errors * i understand morbius now * surely it will work now * fixes shrapnel grenades runtiming * also fixed grenade rangefinding * how'd I mess thta up * fixes various issues * granata!!! * haha surely this will gow ell * should fix the grendades for real * opening this pr then dropping dead * uhhh fixes some stuff i think? * armory stuff * random mapping things pt 2 * blehh :3 * fixes it forever and ever * whar?? * turns out that needs a tweak * curious * that'll work 4 sure now * fixes vr * come on over wont you sway with me * mhm yup * should hopefully be all that's it? * missing icons * makes the rifle more expensive * makes the smg a little less awful feeling * dollar store suppressors, just a week away * mmsmrmmrsgg * lets the shotguns actually be sawn off * the propaganda * hey thats important * sprite error (comical) * gives the casings custom materials for printing * i love code ordering * 'lets just be safe' ifies the weight classes of mags and ammo boxes * reworks the sol defense selection a bit * Update modular_skyrat/modules/ammo_workbench/code/design_disks.dm Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com> * act three * defines * undefine * restores the clothing * some stuff part 3 * fixes the outfit guns not existing * adjusts firerates and grenade launcher sprites * fixes .35 sol revolvers?? * slightly un-nerfs the rifle firing rates * makes the revolver jus tuse the normal sound * makes the pistol case the right path * its a machinegun! * slight little tiny tweaks * british weather service * puts the blueshield gun box in their locker * makes rifle less lethals a bit more normal * slightly changes the smg burst and firerate * the pepperball had raygun * pepperball caliber * forgot to push the include * i love testmerges * revolver sillies * makes the kiboko's examine_more not just the rifle's * smallens the eland and enlargens the cost of the kiboko * lets change the machinegun a bit too why not * gfl larp (real) * fixes modular armory templates * lets cases be ordered dont worry about the other stuff * makes the takbok say its from the right company * makes sawn off shotgun suppressors visibile * those aren't used at all * tweaks some of the rifle sprites * shortens the shotgun a bit * puts the pixel shifting out of initialize to make certain things work b * granata!!!1!!! * large number of weapon and ammo tweaks * windup autofire seems broken somehow? * fixes the inhands * outfit sanity * .40 armor piercing ammo box name correction * removes var that doesnt exist anymore * .40 armor piercing rework --------- Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com> Co-authored-by: GoldenAlpharex --- .../SpaceRuins/skyrat/cargodiselost.dmm | 2 +- .../SpaceRuins/skyrat/interdynefob.dmm | 56 +- .../SpaceRuins/skyrat/port_tarkon/defcon2.dmm | 12 +- .../SpaceRuins/skyrat/port_tarkon/defcon3.dmm | 12 +- .../SpaceRuins/skyrat/port_tarkon/defcon4.dmm | 12 +- .../SpaceRuins/skyrat/port_tarkon/defcon5.dmm | 12 +- _maps/RandomZLevels/blackmesa.dmm | 142 +- _maps/RandomZLevels/mothership_astrum.dmm | 16 +- _maps/map_files/VoidRaptor/VoidRaptor.dmm | 9 +- _maps/shuttles/skyrat/pirate_nri_raider.dmm | 8 +- _maps/shuttles/skyrat/prison_transport.dmm | 8 +- _maps/shuttles/skyrat/slaver_syndie.dmm | 19 +- .../templates/birdshot/birdshot_armory.dmm | 8 +- .../deltastation/deltastation_armory.dmm | 4 +- .../templates/icebox/icebox_armory_middle.dmm | 4 +- .../kilostation/kilostation_armory.dmm | 8 +- .../metastation/metastation_armory.dmm | 4 +- .../templates/northstar/northstar_armory.dmm | 4 +- .../tramstation/tramstation_armory.dmm | 4 +- .../~skyrat_defines/cargo_import_companies.dm | 4 +- .../~skyrat_defines/manufacturer_strings.dm | 5 +- code/__DEFINES/~skyrat_defines/projectiles.dm | 35 +- .../crates_lockers/closets/secure/security.dm | 3 +- code/modules/projectiles/guns/ballistic.dm | 2 +- .../code/datums/storage/subtypes/pockets.dm | 14 +- .../modules/clothing/under/jobs/centcom.dm | 6 - .../modules/aesthetics/guns/code/guns.dm | 49 - .../modules/aesthetics/guns/icons/guns.dmi | Bin 36434 -> 36173 bytes .../aesthetics/guns/icons/guns_back.dmi | Bin 1996 -> 2151 bytes .../aesthetics/guns/icons/guns_lefthand.dmi | Bin 73061 -> 67654 bytes .../aesthetics/guns/icons/guns_righthand.dmi | Bin 76735 -> 70254 bytes .../ammo_workbench/code/design_disks.dm | 6 +- .../code/armaments/_armament_primary.dm | 114 +- .../code/armaments/_armament_secondary.dm | 6 +- .../code/equipment_items/guns.dm | 246 ---- .../code/armaments/_armament_primary.dm | 4 +- .../code/armaments/_armaments_secondary.dm | 4 +- .../code/armaments/armament_miscellaneous.dm | 2 +- .../modules/black_mesa/code/drops.dm | 4 +- .../modules/black_mesa/code/ghost_spawners.dm | 6 +- .../black_mesa/code/mobs/human_mobs.dm | 2 +- .../modules/blueshield/code/blueshield.dm | 6 - .../modules/blueshield/code/closet.dm | 1 + .../modules/blueshield/code/weapons.dm | 92 -- .../bolt_nanotrasen_firearms.dm | 112 -- .../code/armament_datums/deforest_medical.dm | 18 - .../code/armament_datums/microstar_energy.dm | 2 +- .../code/armament_datums/sol_defense.dm | 115 ++ .../code/armament_datums/vitezstvi_ammo.dm | 85 +- .../company_imports/code/company_datums.dm | 4 +- .../code/objects/vitezstvi/ammo_boxes.dm | 19 - .../modules/encounters/code/nri_raiders.dm | 36 +- .../exp_corps/code/expeditionary_trooper.dm | 2 +- .../faction/code/mapping/mapping_helpers.dm | 8 +- .../modules/goofsec/code/department_guards.dm | 10 +- .../gun_safety/code/safety_additions.dm | 3 - .../lockers/cargodiselost/cargodiselockers.dm | 12 +- .../code/lockers/interdyne_fob/security.dm | 19 +- .../modules/mapping/code/shuttles.dm | 17 +- .../modules/microfusion/code/gun_types.dm | 1 - .../modular_ert/code/odst/odst_outfit.dm | 2 +- .../modules/modular_items/code/bags.dm | 2 +- .../modular_weapons/code/autolathe_designs.dm | 10 - .../modules/modular_weapons/code/automatic.dm | 121 -- .../carwo_defense_systems/advert.dm | 36 + .../carwo_defense_systems/ammo/grenade.dm | 260 ++++ .../carwo_defense_systems/ammo/pistol.dm | 134 ++ .../carwo_defense_systems/ammo/rifle.dm | 195 +++ .../carwo_defense_systems/grenade_launcher.dm | 93 ++ .../carwo_defense_systems/gunsets.dm | 82 ++ .../carwo_defense_systems/magazines.dm | 113 ++ .../carwo_defense_systems/rifle.dm | 160 +++ .../carwo_defense_systems/shotgun.dm | 61 + .../carwo_defense_systems/submachinegun.dm | 62 + .../trappiste_fabriek/advert.dm | 41 + .../trappiste_fabriek/ammo.dm | 91 ++ .../trappiste_fabriek/gunsets.dm | 34 + .../trappiste_fabriek/magazines.dm | 19 + .../trappiste_fabriek/pistol.dm | 100 ++ .../trappiste_fabriek/revolver.dm | 81 ++ .../modules/modular_weapons/code/energy.dm | 248 ---- .../modules/modular_weapons/code/gunsets.dm | 70 + .../code/modular_projectiles.dm | 146 --- .../code}/pepperball_gun.dm | 16 +- .../modules/modular_weapons/code/pistol.dm | 101 -- .../modules/modular_weapons/code/revolver.dm | 41 - .../modules/modular_weapons/code/rifle.dm | 52 - .../carwo_defense_systems/guns_lefthand.dmi | Bin 0 -> 4514 bytes .../carwo_defense_systems/guns_righthand.dmi | Bin 0 -> 4538 bytes .../carwo_defense_systems/guns_worn.dmi | Bin 0 -> 5277 bytes .../icons/mob/inhands/cases_lefthand.dmi | Bin 0 -> 479 bytes .../icons/mob/inhands/cases_righthand.dmi | Bin 0 -> 494 bytes .../mob/inhands/weapons/swords_righthand.dmi | Bin 383 -> 704 bytes .../modular_weapons/icons/mob/worn/cases.dmi | Bin 0 -> 1337 bytes .../carwo_defense_systems/ammo.dmi | Bin 0 -> 5959 bytes .../carwo_defense_systems/guns32x.dmi | Bin 0 -> 1537 bytes .../carwo_defense_systems/guns48x.dmi | Bin 0 -> 5766 bytes .../carwo_defense_systems/propaganda.dmi | Bin 0 -> 1096 bytes .../company_and_or_faction_based/cases.dmi | Bin 732 -> 729 bytes .../trappiste_fabriek/ammo.dmi | Bin 0 -> 1719 bytes .../trappiste_fabriek/guns32x.dmi | Bin 0 -> 2580 bytes .../trappiste_fabriek/propaganda.dmi | Bin 0 -> 827 bytes .../icons/obj/guns/projectile.dmi | Bin 5872 -> 0 bytes .../icons/obj/guns/projectile40x32.dmi | Bin 1838 -> 0 bytes .../modular_weapons/icons/obj/gunsets.dmi | Bin 3119 -> 1833 bytes .../icons/obj/pepperball}/ammoboxes.dmi | Bin .../icons/obj/pepperball}/pepperball.dmi | Bin .../icons/obj/pepperball}/projectiles.dmi | Bin .../modular_weapons/sounds/grenade_burst.ogg | Bin 0 -> 25247 bytes .../sounds/grenade_launcher.ogg | Bin 0 -> 90777 bytes .../modular_weapons/sounds/laser_fire.ogg | Bin 19653 -> 0 bytes .../modular_weapons/sounds/pistol_heavy.ogg | Bin 0 -> 16250 bytes .../modular_weapons/sounds/pistol_light.ogg | Bin 0 -> 13142 bytes .../modular_weapons/sounds/revolver_heavy.ogg | Bin 0 -> 48869 bytes .../modular_weapons/sounds/rifle_heavy.ogg | Bin 0 -> 52866 bytes .../modular_weapons/sounds/shotgun_heavy.ogg | Bin 0 -> 29800 bytes .../modular_weapons/sounds/smg_light.ogg | Bin 0 -> 18663 bytes .../sounds/suppressed_heavy.ogg | Bin 0 -> 15264 bytes .../sounds/suppressed_rifle.ogg | Bin 0 -> 15956 bytes .../nanotrasen_naval_command/code/outfits.dm | 40 +- .../modules/nanotrasen_rep/code/m45a5.dm | 45 - .../code/nanotrasen_consultant.dm | 17 +- .../novaya_ert/code/advanced_choice_beacon.dm | 2 +- .../modules/novaya_ert/code/automatic.dm | 9 +- .../modules/novaya_ert/code/belt.dm | 4 +- .../modules/novaya_ert/code/outfit.dm | 4 +- .../modules/novaya_ert/code/toolbox.dm | 14 +- .../opposing_force/code/equipment/ammo.dm | 158 +-- .../opposing_force/code/equipment/pistols.dm | 37 +- .../opposing_force/code/equipment/rifles.dm | 16 +- .../opposing_force/code/equipment/shotguns.dm | 5 +- .../code/equipment/submachineguns.dm | 21 +- .../projectiles/code/guns/misc/m6pdw.dm | 2 +- .../modules/sec_haul/code/guns/ammo.dm | 140 -- .../sec_haul/code/guns/armory_spawns.dm | 37 +- .../modules/sec_haul/code/guns/bullets.dm | 261 ---- .../modules/sec_haul/code/guns/cargo_stuff.dm | 12 +- .../modules/sec_haul/code/guns/cmg.dm | 138 -- .../modules/sec_haul/code/guns/guns.dm | 1162 ----------------- .../modules/sec_haul/code/guns/gunsets.dm | 483 ------- .../code/peacekeeper/armadyne_clothing.dm | 26 +- .../sec_haul/icons/guns/ammo_cartridges.dmi | Bin 1531 -> 0 bytes .../modules/sec_haul/icons/guns/automag.dmi | Bin 489 -> 0 bytes .../modules/sec_haul/icons/guns/croon.dmi | Bin 450 -> 0 bytes .../modules/sec_haul/icons/guns/dmr.dmi | Bin 2013 -> 0 bytes .../modules/sec_haul/icons/guns/dozer.dmi | Bin 527 -> 0 bytes .../sec_haul/icons/guns/energy/allstar.dmi | Bin 1028 -> 0 bytes .../modules/sec_haul/icons/guns/firefly.dmi | Bin 496 -> 0 bytes .../modules/sec_haul/icons/guns/g11.dmi | Bin 997 -> 0 bytes .../modules/sec_haul/icons/guns/glock.dmi | Bin 2059 -> 0 bytes .../modules/sec_haul/icons/guns/gunsets.dmi | Bin 13295 -> 0 bytes .../sec_haul/icons/guns/inhands/lefthand.dmi | Bin 5911 -> 0 bytes .../icons/guns/inhands/lefthand40x32.dmi | Bin 3577 -> 0 bytes .../sec_haul/icons/guns/inhands/righthand.dmi | Bin 5861 -> 0 bytes .../icons/guns/inhands/righthand40x32.dmi | Bin 3466 -> 0 bytes .../modules/sec_haul/icons/guns/ladon.dmi | Bin 2050 -> 0 bytes .../modules/sec_haul/icons/guns/mags.dmi | Bin 11855 -> 0 bytes .../modules/sec_haul/icons/guns/makarov.dmi | Bin 662 -> 0 bytes .../modules/sec_haul/icons/guns/mk58.dmi | Bin 594 -> 0 bytes .../modules/sec_haul/icons/guns/norwind.dmi | Bin 874 -> 0 bytes .../modules/sec_haul/icons/guns/ostwind.dmi | Bin 2045 -> 0 bytes .../modules/sec_haul/icons/guns/pcr.dmi | Bin 492 -> 0 bytes .../modules/sec_haul/icons/guns/pcr2.dmi | Bin 667 -> 0 bytes .../modules/sec_haul/icons/guns/pdh.dmi | Bin 4828 -> 0 bytes .../modules/sec_haul/icons/guns/pitbull.dmi | Bin 745 -> 0 bytes .../sec_haul/icons/guns/revolution.dmi | Bin 440 -> 0 bytes .../modules/sec_haul/icons/guns/sas14.dmi | Bin 405 -> 0 bytes .../modules/sec_haul/icons/guns/smartgun.dmi | Bin 2108 -> 0 bytes .../modules/sec_haul/icons/guns/spawner.dmi | Bin 981 -> 0 bytes .../modules/sec_haul/icons/guns/vintorez.dmi | Bin 500 -> 0 bytes .../modules/sec_haul/icons/guns/zeta.dmi | Bin 395 -> 0 bytes .../modules/time_clock/code/console_tgui.dm | 3 +- tgstation.dme | 32 +- 173 files changed, 2259 insertions(+), 4198 deletions(-) delete mode 100644 modular_skyrat/modules/assault_operatives/code/equipment_items/guns.dm delete mode 100644 modular_skyrat/modules/blueshield/code/weapons.dm delete mode 100644 modular_skyrat/modules/company_imports/code/armament_datums/bolt_nanotrasen_firearms.dm create mode 100644 modular_skyrat/modules/company_imports/code/armament_datums/sol_defense.dm delete mode 100644 modular_skyrat/modules/modular_weapons/code/automatic.dm create mode 100644 modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/advert.dm create mode 100644 modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/ammo/grenade.dm create mode 100644 modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/ammo/pistol.dm create mode 100644 modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/ammo/rifle.dm create mode 100644 modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/grenade_launcher.dm create mode 100644 modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/gunsets.dm create mode 100644 modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/magazines.dm create mode 100644 modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/rifle.dm create mode 100644 modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/shotgun.dm create mode 100644 modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/submachinegun.dm create mode 100644 modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/trappiste_fabriek/advert.dm create mode 100644 modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/trappiste_fabriek/ammo.dm create mode 100644 modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/trappiste_fabriek/gunsets.dm create mode 100644 modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/trappiste_fabriek/magazines.dm create mode 100644 modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/trappiste_fabriek/pistol.dm create mode 100644 modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/trappiste_fabriek/revolver.dm delete mode 100644 modular_skyrat/modules/modular_weapons/code/energy.dm create mode 100644 modular_skyrat/modules/modular_weapons/code/gunsets.dm rename modular_skyrat/modules/{sec_haul/code/guns => modular_weapons/code}/pepperball_gun.dm (81%) delete mode 100644 modular_skyrat/modules/modular_weapons/code/pistol.dm delete mode 100644 modular_skyrat/modules/modular_weapons/code/revolver.dm delete mode 100644 modular_skyrat/modules/modular_weapons/code/rifle.dm create mode 100644 modular_skyrat/modules/modular_weapons/icons/mob/company_and_or_faction_based/carwo_defense_systems/guns_lefthand.dmi create mode 100644 modular_skyrat/modules/modular_weapons/icons/mob/company_and_or_faction_based/carwo_defense_systems/guns_righthand.dmi create mode 100644 modular_skyrat/modules/modular_weapons/icons/mob/company_and_or_faction_based/carwo_defense_systems/guns_worn.dmi create mode 100644 modular_skyrat/modules/modular_weapons/icons/mob/inhands/cases_lefthand.dmi create mode 100644 modular_skyrat/modules/modular_weapons/icons/mob/inhands/cases_righthand.dmi create mode 100644 modular_skyrat/modules/modular_weapons/icons/mob/worn/cases.dmi create mode 100644 modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/carwo_defense_systems/ammo.dmi create mode 100644 modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/carwo_defense_systems/guns32x.dmi create mode 100644 modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/carwo_defense_systems/guns48x.dmi create mode 100644 modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/carwo_defense_systems/propaganda.dmi create mode 100644 modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/trappiste_fabriek/ammo.dmi create mode 100644 modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/trappiste_fabriek/guns32x.dmi create mode 100644 modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/trappiste_fabriek/propaganda.dmi delete mode 100644 modular_skyrat/modules/modular_weapons/icons/obj/guns/projectile.dmi delete mode 100644 modular_skyrat/modules/modular_weapons/icons/obj/guns/projectile40x32.dmi rename modular_skyrat/modules/{sec_haul/icons/guns => modular_weapons/icons/obj/pepperball}/ammoboxes.dmi (100%) rename modular_skyrat/modules/{sec_haul/icons/guns => modular_weapons/icons/obj/pepperball}/pepperball.dmi (100%) rename modular_skyrat/modules/{sec_haul/icons/guns => modular_weapons/icons/obj/pepperball}/projectiles.dmi (100%) create mode 100644 modular_skyrat/modules/modular_weapons/sounds/grenade_burst.ogg create mode 100644 modular_skyrat/modules/modular_weapons/sounds/grenade_launcher.ogg delete mode 100644 modular_skyrat/modules/modular_weapons/sounds/laser_fire.ogg create mode 100644 modular_skyrat/modules/modular_weapons/sounds/pistol_heavy.ogg create mode 100644 modular_skyrat/modules/modular_weapons/sounds/pistol_light.ogg create mode 100644 modular_skyrat/modules/modular_weapons/sounds/revolver_heavy.ogg create mode 100644 modular_skyrat/modules/modular_weapons/sounds/rifle_heavy.ogg create mode 100644 modular_skyrat/modules/modular_weapons/sounds/shotgun_heavy.ogg create mode 100644 modular_skyrat/modules/modular_weapons/sounds/smg_light.ogg create mode 100644 modular_skyrat/modules/modular_weapons/sounds/suppressed_heavy.ogg create mode 100644 modular_skyrat/modules/modular_weapons/sounds/suppressed_rifle.ogg delete mode 100644 modular_skyrat/modules/nanotrasen_rep/code/m45a5.dm delete mode 100644 modular_skyrat/modules/sec_haul/code/guns/cmg.dm delete mode 100644 modular_skyrat/modules/sec_haul/code/guns/guns.dm delete mode 100644 modular_skyrat/modules/sec_haul/code/guns/gunsets.dm delete mode 100644 modular_skyrat/modules/sec_haul/icons/guns/ammo_cartridges.dmi delete mode 100644 modular_skyrat/modules/sec_haul/icons/guns/automag.dmi delete mode 100644 modular_skyrat/modules/sec_haul/icons/guns/croon.dmi delete mode 100644 modular_skyrat/modules/sec_haul/icons/guns/dmr.dmi delete mode 100644 modular_skyrat/modules/sec_haul/icons/guns/dozer.dmi delete mode 100644 modular_skyrat/modules/sec_haul/icons/guns/energy/allstar.dmi delete mode 100644 modular_skyrat/modules/sec_haul/icons/guns/firefly.dmi delete mode 100644 modular_skyrat/modules/sec_haul/icons/guns/g11.dmi delete mode 100644 modular_skyrat/modules/sec_haul/icons/guns/glock.dmi delete mode 100644 modular_skyrat/modules/sec_haul/icons/guns/gunsets.dmi delete mode 100644 modular_skyrat/modules/sec_haul/icons/guns/inhands/lefthand.dmi delete mode 100644 modular_skyrat/modules/sec_haul/icons/guns/inhands/lefthand40x32.dmi delete mode 100644 modular_skyrat/modules/sec_haul/icons/guns/inhands/righthand.dmi delete mode 100644 modular_skyrat/modules/sec_haul/icons/guns/inhands/righthand40x32.dmi delete mode 100644 modular_skyrat/modules/sec_haul/icons/guns/ladon.dmi delete mode 100644 modular_skyrat/modules/sec_haul/icons/guns/mags.dmi delete mode 100644 modular_skyrat/modules/sec_haul/icons/guns/makarov.dmi delete mode 100644 modular_skyrat/modules/sec_haul/icons/guns/mk58.dmi delete mode 100644 modular_skyrat/modules/sec_haul/icons/guns/norwind.dmi delete mode 100644 modular_skyrat/modules/sec_haul/icons/guns/ostwind.dmi delete mode 100644 modular_skyrat/modules/sec_haul/icons/guns/pcr.dmi delete mode 100644 modular_skyrat/modules/sec_haul/icons/guns/pcr2.dmi delete mode 100644 modular_skyrat/modules/sec_haul/icons/guns/pdh.dmi delete mode 100644 modular_skyrat/modules/sec_haul/icons/guns/pitbull.dmi delete mode 100644 modular_skyrat/modules/sec_haul/icons/guns/revolution.dmi delete mode 100644 modular_skyrat/modules/sec_haul/icons/guns/sas14.dmi delete mode 100644 modular_skyrat/modules/sec_haul/icons/guns/smartgun.dmi delete mode 100644 modular_skyrat/modules/sec_haul/icons/guns/spawner.dmi delete mode 100644 modular_skyrat/modules/sec_haul/icons/guns/vintorez.dmi delete mode 100644 modular_skyrat/modules/sec_haul/icons/guns/zeta.dmi diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/cargodiselost.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/cargodiselost.dmm index 57d2cafa4df..577fcf2f3a9 100644 --- a/_maps/RandomRuins/SpaceRuins/skyrat/cargodiselost.dmm +++ b/_maps/RandomRuins/SpaceRuins/skyrat/cargodiselost.dmm @@ -850,7 +850,7 @@ /area/ruin/space/has_grav/cargodise_freighter/cargo) "nv" = ( /obj/structure/table/reinforced, -/obj/item/gun/ballistic/automatic/pistol/makarov, +/obj/item/gun/ballistic/automatic/pistol/sol, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/cargodise_freighter/vault) "nw" = ( diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/interdynefob.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/interdynefob.dmm index e12bdf68d11..464498600fd 100644 --- a/_maps/RandomRuins/SpaceRuins/skyrat/interdynefob.dmm +++ b/_maps/RandomRuins/SpaceRuins/skyrat/interdynefob.dmm @@ -1011,9 +1011,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, -/obj/structure/closet/secure_closet/personal{ - icon_state = "cabinet" - }, +/obj/structure/closet/secure_closet/personal, /obj/item/clothing/under/misc/syndicate_souvenir{ has_sensor = 0; pixel_y = -4 @@ -3392,7 +3390,7 @@ faction = list("Syndicate","neutral") }, /turf/closed/wall/r_wall/syndicate/nodiagonal, -/area/ruin/space/has_grav/skyrat/interdynefob/bridge/vault) +/area/ruin/space/has_grav/skyrat/interdynefob/security/armory) "oK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -3776,9 +3774,7 @@ has_sensor = 0; random_sensor = 0 }, -/obj/structure/closet/secure_closet/personal{ - icon_state = "cabinet" - }, +/obj/structure/closet/secure_closet/personal, /turf/open/floor/wood/tile, /area/ruin/space/has_grav/skyrat/interdynefob/service/dorms) "qt" = ( @@ -5167,8 +5163,7 @@ /area/ruin/space/has_grav/skyrat/interdynefob/cargo/hangar) "xk" = ( /obj/machinery/chem_dispenser/drinks/fullupgrade{ - dir = 8; - pixel_y = 0 + dir = 8 }, /obj/structure/table/wood, /turf/open/floor/wood/tile, @@ -5821,9 +5816,7 @@ dir = 4 }, /obj/item/clothing/under/syndicate/skyrat/baseball, -/obj/structure/closet/secure_closet/personal{ - icon_state = "cabinet" - }, +/obj/structure/closet/secure_closet/personal, /turf/open/floor/wood/tile, /area/ruin/space/has_grav/skyrat/interdynefob/service/dorms) "AC" = ( @@ -6608,7 +6601,6 @@ /turf/open/floor/iron/dark/textured_large, /area/ruin/space/has_grav/skyrat/interdynefob/engineering) "EC" = ( -/obj/structure/reagent_dispensers/wall/peppertank/directional/west, /obj/item/grenade/barrier{ pixel_y = 10 }, @@ -7192,13 +7184,14 @@ }, /obj/machinery/light/cold/directional/west, /obj/structure/rack/gunrack, -/obj/item/gun/ballistic/shotgun/riot/syndicate, -/obj/item/gun/ballistic/shotgun/riot/syndicate{ - pixel_x = -10 +/obj/item/gun/ballistic/automatic/sol_smg/evil{ + pixel_x = -8 }, -/obj/item/gun/ballistic/shotgun/riot/syndicate{ - pixel_x = -5; - pixel_y = -3 +/obj/item/gun/ballistic/shotgun/riot/sol/evil{ + pixel_x = 0 + }, +/obj/item/gun/ballistic/automatic/sol_rifle/evil{ + pixel_x = 8 }, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/skyrat/interdynefob/security/armory) @@ -9628,14 +9621,13 @@ }, /obj/machinery/firealarm/directional/west, /obj/structure/rack/gunrack, -/obj/item/gun/ballistic/automatic/pistol{ - pixel_x = -4; - pixel_y = 4 +/obj/item/gun/ballistic/automatic/pistol/sol/evil{ + pixel_x = -5 }, -/obj/item/gun/ballistic/automatic/pistol{ - pixel_x = -8 +/obj/item/gun/ballistic/automatic/pistol/sol/evil, +/obj/item/gun/ballistic/automatic/pistol/sol/evil{ + pixel_x = 5 }, -/obj/item/gun/ballistic/automatic/pistol, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/skyrat/interdynefob/security/armory) "Sq" = ( @@ -11181,6 +11173,14 @@ }, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/skyrat/interdynefob/research) +"YU" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/structure/closet/secure_closet/armory_kiboko_but_evil, +/obj/structure/reagent_dispensers/wall/peppertank/directional/west, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/skyrat/interdynefob/security/armory) "Zd" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/siding/thinplating/end{ @@ -11873,6 +11873,7 @@ PX PX PX PX +PX Vk Oi VP @@ -11882,7 +11883,6 @@ wg wg wg wg -wg "} (10,1,1) = {" wg @@ -11926,6 +11926,7 @@ Lv bS Hc Sp +YU EC PX Vk @@ -11937,7 +11938,6 @@ wg wg wg wg -wg "} (11,1,1) = {" wg @@ -11981,10 +11981,10 @@ mA uo uo uo +uo LY oG PX -PX NB NB xr diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon2.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon2.dmm index 1897f962201..877faaad71f 100644 --- a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon2.dmm +++ b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon2.dmm @@ -5057,7 +5057,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/light/dim/directional/east, /obj/effect/turf_decal/tile/red/anticorner, -/obj/item/ammo_box/magazine/multi_sprite/g17, +/obj/item/ammo_box/magazine/c35sol_pistol, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/secoff) @@ -5395,7 +5395,7 @@ "ED" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/ammo_box/magazine/multi_sprite/g17, +/obj/item/ammo_box/magazine/c35sol_pistol, /obj/effect/decal/cleanable/dirt, /turf/open/floor/cult, /area/ruin/space/has_grav/port_tarkon/secoff) @@ -5894,7 +5894,7 @@ /area/ruin/space/has_grav/port_tarkon/garden) "Hk" = ( /obj/structure/cable, -/obj/item/ammo_box/magazine/multi_sprite/g17, +/obj/item/ammo_box/magazine/c35sol_pistol, /obj/effect/decal/cleanable/dirt, /turf/open/floor/cult, /area/ruin/space/has_grav/port_tarkon/secoff) @@ -6228,7 +6228,7 @@ dir = 4 }, /obj/effect/decal/cleanable/blood, -/obj/item/ammo_box/magazine/multi_sprite/g17, +/obj/item/ammo_box/magazine/c35sol_pistol, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/centerhall) @@ -8511,7 +8511,7 @@ }, /obj/effect/turf_decal/delivery/blue, /obj/effect/turf_decal/tile/neutral/half, -/obj/item/ammo_box/magazine/multi_sprite/g17, +/obj/item/ammo_box/magazine/c35sol_pistol, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/centerhall) @@ -8972,7 +8972,7 @@ /obj/effect/turf_decal/tile/neutral/half{ dir = 1 }, -/obj/item/ammo_box/magazine/multi_sprite/g17, +/obj/item/ammo_box/magazine/c35sol_pistol, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/centerhall) diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon3.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon3.dmm index ae5484c9891..0589f45fba1 100644 --- a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon3.dmm +++ b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon3.dmm @@ -6829,12 +6829,12 @@ "NX" = ( /obj/structure/rack, /obj/effect/decal/cleanable/dirt, -/obj/item/ammo_box/magazine/multi_sprite/g17, -/obj/item/ammo_box/magazine/multi_sprite/g17, -/obj/item/ammo_box/magazine/multi_sprite/g17, -/obj/item/ammo_box/magazine/multi_sprite/g17, -/obj/item/ammo_box/magazine/multi_sprite/g17, -/obj/item/ammo_box/magazine/multi_sprite/g17, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, /obj/item/gun/ballistic/automatic/m6pdw, /obj/item/gun/ballistic/automatic/m6pdw, /obj/effect/turf_decal/tile/red/half{ diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon4.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon4.dmm index 6e42ed738cd..5514e997812 100644 --- a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon4.dmm +++ b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon4.dmm @@ -5983,12 +5983,12 @@ /area/ruin/space/has_grav/port_tarkon/secoff) "NX" = ( /obj/structure/rack, -/obj/item/ammo_box/magazine/multi_sprite/g17, -/obj/item/ammo_box/magazine/multi_sprite/g17, -/obj/item/ammo_box/magazine/multi_sprite/g17, -/obj/item/ammo_box/magazine/multi_sprite/g17, -/obj/item/ammo_box/magazine/multi_sprite/g17, -/obj/item/ammo_box/magazine/multi_sprite/g17, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, /obj/item/gun/ballistic/automatic/m6pdw, /obj/item/gun/ballistic/automatic/m6pdw, /obj/effect/turf_decal/tile/red/half{ diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon5.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon5.dmm index eef26fbf6d9..5ebeb664840 100644 --- a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon5.dmm +++ b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon5.dmm @@ -6559,12 +6559,12 @@ /area/ruin/space/has_grav/port_tarkon/afthall) "NX" = ( /obj/structure/rack, -/obj/item/ammo_box/magazine/multi_sprite/g17, -/obj/item/ammo_box/magazine/multi_sprite/g17, -/obj/item/ammo_box/magazine/multi_sprite/g17, -/obj/item/ammo_box/magazine/multi_sprite/g17, -/obj/item/ammo_box/magazine/multi_sprite/g17, -/obj/item/ammo_box/magazine/multi_sprite/g17, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, /obj/item/gun/ballistic/automatic/m6pdw, /obj/item/gun/ballistic/automatic/m6pdw, /obj/effect/turf_decal/tile/red/half{ diff --git a/_maps/RandomZLevels/blackmesa.dmm b/_maps/RandomZLevels/blackmesa.dmm index 892d7d76815..a4484e7711d 100644 --- a/_maps/RandomZLevels/blackmesa.dmm +++ b/_maps/RandomZLevels/blackmesa.dmm @@ -270,7 +270,7 @@ /obj/structure/table, /obj/item/pen, /obj/structure/alien/weeds/xen, -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/iron/dark, /area/awaymission/black_mesa/entrance_lobby) "adq" = ( @@ -523,7 +523,7 @@ }, /obj/structure/closet/crate/bin, /obj/structure/alien/weeds/xen, -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/iron/textured_large, /area/awaymission/black_mesa/entrance_hall) "agb" = ( @@ -663,7 +663,7 @@ /obj/item/stack/sheet/plasteel, /obj/machinery/light/broken/directional/west, /obj/structure/alien/weeds/xen, -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/iron/textured, /area/awaymission/black_mesa/to_cryo_room) "ahW" = ( @@ -1175,7 +1175,7 @@ "apk" = ( /obj/structure/table, /obj/machinery/recharger, -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/iron/textured, /area/awaymission/black_mesa/gas_emitter_chamber) "apm" = ( @@ -1436,8 +1436,8 @@ /area/awaymission/black_mesa/security_outpost) "asd" = ( /obj/structure/rack/gunrack, -/obj/item/gun/ballistic/automatic/pistol/g17/mesa, -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/gun/ballistic/automatic/pistol/sol, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/iron, /area/awaymission/black_mesa/security_outpost) "asl" = ( @@ -1623,7 +1623,7 @@ /area/awaymission/black_mesa/security_outpost) "avj" = ( /obj/structure/closet/crate/bin, -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/iron/smooth, /area/awaymission/black_mesa/gas_emitter_chamber) "avl" = ( @@ -1725,7 +1725,7 @@ /area/awaymission/black_mesa/hecu_zone_infirmary) "awC" = ( /obj/structure/closet/crate/bin, -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/iron/textured_large, /area/awaymission/black_mesa/cryo_hallway) "awH" = ( @@ -1872,7 +1872,7 @@ /turf/closed/indestructible/rock/xen, /area/awaymission/black_mesa/xen/freeman_hallway) "ayQ" = ( -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/iron, /area/awaymission/black_mesa/security_outpost) "ayU" = ( @@ -2031,7 +2031,7 @@ /obj/structure/chair/sofa/bench/right{ dir = 8 }, -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/mineral/titanium/white, /area/awaymission/black_mesa/tram_room) "aAx" = ( @@ -2286,7 +2286,7 @@ /area/awaymission/black_mesa/xen/vortigaunt_village_nihilanth) "aDf" = ( /obj/structure/table, -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/iron, /area/awaymission/black_mesa/security_outpost) "aDk" = ( @@ -2672,8 +2672,8 @@ /area/awaymission/black_mesa/entrance_lobby) "aHU" = ( /obj/structure/closet/secure_closet/security/black_mesa, -/obj/item/ammo_box/magazine/multi_sprite/ladon, -/obj/item/gun/ballistic/automatic/pistol/g17/mesa, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/gun/ballistic/automatic/pistol/sol, /turf/open/floor/iron, /area/awaymission/black_mesa/entrance_lobby) "aHX" = ( @@ -2803,7 +2803,7 @@ /area/awaymission/black_mesa/entrance_hall) "aKd" = ( /obj/effect/decal/cleanable/blood/footprints, -/obj/item/gun/ballistic/shotgun/m23, +/obj/item/gun/ballistic/shotgun/riot/sol, /turf/open/floor/iron/dark, /area/awaymission/black_mesa/security_outpost) "aKg" = ( @@ -2896,7 +2896,7 @@ /turf/open/floor/iron/dark, /area/awaymission/black_mesa/hecu_zone_camp) "aKR" = ( -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/iron/smooth_large, /area/awaymission/black_mesa/gas_emitter_chamber) "aKS" = ( @@ -2948,7 +2948,7 @@ /area/awaymission/black_mesa/security_outpost) "aLJ" = ( /obj/structure/closet/crate/bin, -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/iron/textured, /area/awaymission/black_mesa/to_cryo_room) "aLO" = ( @@ -3375,7 +3375,7 @@ /area/awaymission/black_mesa/entrance) "aRc" = ( /obj/structure/closet/crate/large, -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/iron/smooth, /area/awaymission/black_mesa/cryo_storage) "aRd" = ( @@ -3921,7 +3921,7 @@ "aYk" = ( /obj/structure/closet/crate/bin, /obj/machinery/light/cold, -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/iron/smooth_large, /area/awaymission/black_mesa/cryo_hallway) "aYr" = ( @@ -4020,7 +4020,7 @@ /area/awaymission/black_mesa/xen/freeman_hallway) "aYY" = ( /obj/effect/mob_spawn/corpse/human/scientist_zombie, -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/elevatorshaft, /area/awaymission/black_mesa/cryo_room) @@ -4371,8 +4371,8 @@ /area/awaymission/black_mesa/hecu_zone_infirmary) "bFy" = ( /obj/structure/closet/crate/bin, -/obj/item/ammo_box/magazine/multi_sprite/ladon, -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/iron/smooth_large, /area/awaymission/black_mesa/high_security_hallway) "bGe" = ( @@ -4915,9 +4915,9 @@ /area/awaymission/black_mesa/black_ops_downstairs_atrium) "cEy" = ( /obj/structure/rack/shelf, -/obj/item/ammo_box/magazine/cm68, -/obj/item/ammo_box/magazine/cm68, -/obj/item/ammo_box/magazine/cm68, +/obj/item/ammo_box/magazine/c40sol_rifle, +/obj/item/ammo_box/magazine/c40sol_rifle, +/obj/item/ammo_box/magazine/c40sol_rifle, /turf/open/floor/wood/parquet, /area/awaymission/black_mesa/employee_dorm_room) "cFH" = ( @@ -5530,8 +5530,8 @@ /area/awaymission/black_mesa/xen/acid_lake_building) "dJX" = ( /obj/structure/table, -/obj/item/ammo_box/magazine/multi_sprite/ladon, -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/wood/parquet, /area/awaymission/black_mesa/employee_dorm_room) "dLt" = ( @@ -5803,9 +5803,9 @@ /area/awaymission/black_mesa/lambda_hallway) "eif" = ( /obj/structure/rack/gunrack, -/obj/item/ammo_box/advanced/smartgun, -/obj/item/ammo_box/advanced/smartgun, -/obj/item/ammo_box/advanced/smartgun, +/obj/item/ammo_box/magazine/c980_grenade, +/obj/item/ammo_box/c980grenade/shrapnel, +/obj/item/ammo_casing/c980grenade/shrapnel/phosphor, /turf/open/floor/iron/dark, /area/awaymission/black_mesa/xen/acid_lake_building) "eij" = ( @@ -5839,8 +5839,8 @@ /obj/item/grenade/frag, /obj/item/grenade/frag, /obj/item/gun_maintenance_supplies, -/obj/item/ammo_box/magazine/multi_sprite/ladon, -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/iron/smooth_large, /area/awaymission/black_mesa/high_security_armory) "ems" = ( @@ -6201,7 +6201,7 @@ /area/awaymission/black_mesa/black_ops_armory) "fah" = ( /obj/structure/closet/crate/large, -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/plating, /area/awaymission/black_mesa/entrance_tunnel) "fao" = ( @@ -6414,10 +6414,10 @@ /area/awaymission/black_mesa/hecu_zone_camp) "fpy" = ( /obj/structure/rack/shelf, -/obj/item/gun/ballistic/automatic/pistol/g17/mesa, -/obj/item/ammo_box/magazine/multi_sprite/ladon, -/obj/item/ammo_box/magazine/multi_sprite/ladon, -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/gun/ballistic/automatic/pistol/sol, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/wood/parquet, /area/awaymission/black_mesa/employee_dorm_room) "fpS" = ( @@ -6826,9 +6826,9 @@ /obj/item/stock_parts/cell/high, /obj/structure/alien/weeds/xen, /obj/structure/closet/wardrobe, -/obj/item/ammo_box/magazine/multi_sprite/ladon, -/obj/item/ammo_box/magazine/multi_sprite/ladon, -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/iron/dark, /area/awaymission/black_mesa/equipment_room) "gov" = ( @@ -6968,7 +6968,7 @@ /area/awaymission/black_mesa/high_security_hallway) "gCt" = ( /obj/structure/rack/gunrack, -/obj/item/gun/ballistic/automatic/smartgun/scoped, +/obj/item/gun/ballistic/automatic/sol_grenade_launcher, /turf/open/floor/iron/dark, /area/awaymission/black_mesa/xen/acid_lake_building) "gCB" = ( @@ -7017,7 +7017,7 @@ /area/awaymission/black_mesa/xen/lost_camp) "gIf" = ( /obj/structure/table, -/obj/item/gun/ballistic/automatic/pistol/g17/mesa, +/obj/item/gun/ballistic/automatic/pistol/sol, /turf/open/floor/plating, /area/awaymission/black_mesa/equipment_room) "gIr" = ( @@ -7106,7 +7106,7 @@ /turf/open/floor/engine, /area/awaymission/black_mesa/xen/entering_zone) "gTe" = ( -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/misc/xen, /area/awaymission/black_mesa/xen/freeman_puzzle) "gTh" = ( @@ -7298,7 +7298,7 @@ /turf/open/floor/iron/dark, /area/awaymission/black_mesa/science_decon_room) "hiT" = ( -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/textured_large, /area/awaymission/black_mesa/employee_dorm_room) @@ -7371,7 +7371,7 @@ /area/awaymission/black_mesa/science_decon_room) "hok" = ( /obj/structure/closet/crate/bin, -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/iron/smooth_large, /area/awaymission/black_mesa/deep_sci_hall) "how" = ( @@ -7552,7 +7552,7 @@ /area/awaymission/black_mesa/resonant_chamber) "hGV" = ( /obj/structure/rack/shelf, -/obj/item/gun/ballistic/automatic/cfa_rifle, +/obj/item/gun/ballistic/automatic/sol_rifle, /turf/open/floor/wood/parquet, /area/awaymission/black_mesa/employee_dorm_room) "hHb" = ( @@ -8452,7 +8452,7 @@ "jts" = ( /obj/structure/table, /obj/item/extinguisher, -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/iron/textured_large, /area/awaymission/black_mesa/genetics) "jtA" = ( @@ -8693,7 +8693,7 @@ /area/awaymission/black_mesa/science_internal) "jOY" = ( /obj/structure/closet/crate/bin, -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/carpet/blue, /area/awaymission/black_mesa/high_security_hallway) "jPD" = ( @@ -9663,7 +9663,7 @@ /area/awaymission/black_mesa/hecu_zone_tunnel) "lEm" = ( /obj/structure/closet/crate/large, -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/plating, /area/awaymission/black_mesa/science_tunnel) "lEu" = ( @@ -10093,8 +10093,8 @@ /area/awaymission/black_mesa/deep_sci_medbay) "mzJ" = ( /obj/structure/closet/crate/bin, -/obj/item/ammo_box/magazine/multi_sprite/ladon, -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/carpet/blue, /area/awaymission/black_mesa/high_security_servers) "mzY" = ( @@ -10109,7 +10109,7 @@ "mEd" = ( /obj/structure/closet/crate, /obj/structure/alien/weeds/xen, -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/iron/textured_large, /area/awaymission/black_mesa/entrance_large_office) "mED" = ( @@ -10263,8 +10263,8 @@ "mVV" = ( /obj/machinery/light/broken/directional/north, /obj/structure/table, -/obj/item/ammo_box/magazine/multi_sprite/ladon, -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/plating, /area/awaymission/black_mesa/equipment_room) "mWj" = ( @@ -10283,7 +10283,7 @@ /area/awaymission/black_mesa/entrance_large_office) "mYd" = ( /obj/structure/closet/crate/large, -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/plating, /area/awaymission/black_mesa/dorm_tunnel) "mYF" = ( @@ -10371,7 +10371,7 @@ }, /obj/structure/closet/crate/bin, /obj/structure/alien/weeds/xen, -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/iron/textured_large, /area/awaymission/black_mesa/entrance_hall) "njp" = ( @@ -11088,7 +11088,7 @@ dir = 5 }, /obj/structure/lattice/catwalk, -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/plating, /area/awaymission/black_mesa/resonant_chamber) "oBI" = ( @@ -12705,7 +12705,7 @@ "rDg" = ( /obj/structure/table, /obj/item/grenade/gas_crystal/nitrous_oxide_crystal, -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/iron/textured_large, /area/awaymission/black_mesa/genetics_sec) "rDq" = ( @@ -13005,7 +13005,7 @@ dir = 1 }, /obj/structure/closet/crate/bin, -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/iron/smooth_large, /area/awaymission/black_mesa/entrance_internal_hall) "sja" = ( @@ -13947,7 +13947,7 @@ /turf/open/floor/iron/smooth, /area/awaymission/black_mesa/hecu_zone_infirmary) "ugU" = ( -/obj/item/gun/ballistic/automatic/pistol/g17/mesa, +/obj/item/gun/ballistic/automatic/pistol/sol, /turf/open/misc/xen, /area/awaymission/black_mesa/xen/freeman_puzzle) "ugW" = ( @@ -14088,7 +14088,7 @@ /turf/open/floor/iron, /area/awaymission/black_mesa/entrance_lobby) "usi" = ( -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/space/basic, /area/space) "usA" = ( @@ -15075,7 +15075,7 @@ "wgs" = ( /obj/structure/railing, /obj/structure/table, -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/iron/textured_large, /area/awaymission/black_mesa/equipment_room) "wjB" = ( @@ -15258,7 +15258,7 @@ /area/awaymission/black_mesa/equipment_room) "wFj" = ( /obj/structure/table, -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/wood/parquet, /area/awaymission/black_mesa/employee_dorm_room) "wGe" = ( @@ -15445,10 +15445,10 @@ "wVR" = ( /obj/structure/rack/shelf, /obj/machinery/light/warm, -/obj/item/gun/ballistic/automatic/pistol/g17/mesa, -/obj/item/ammo_box/magazine/multi_sprite/ladon, -/obj/item/ammo_box/magazine/multi_sprite/ladon, -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/gun/ballistic/automatic/pistol/sol, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/wood/parquet, /area/awaymission/black_mesa/employee_dorm_room) "wWc" = ( @@ -15631,9 +15631,9 @@ /area/awaymission/black_mesa/deep_sci_feesh) "xjK" = ( /obj/structure/closet/crate/secure/weapon, -/obj/item/ammo_box/magazine/multi_sprite/ladon, -/obj/item/ammo_box/magazine/multi_sprite/ladon, -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, /obj/item/gun_maintenance_supplies, /obj/item/gun_maintenance_supplies, /obj/item/gun_maintenance_supplies, @@ -15641,7 +15641,7 @@ /obj/item/ammo_box/magazine/mp5, /obj/item/ammo_box/magazine/m16, /obj/item/ammo_box/magazine/m16, -/obj/item/gun/ballistic/automatic/pistol/g17/mesa{ +/obj/item/gun/ballistic/automatic/pistol/sol{ burst_size = 3; desc = "A weapon from bygone times, and this is the exact 21st century version. In fact, even more reliable, but it also can run full automatic fire mode. Chambered in 9mm."; firing_burst = 1; @@ -15961,7 +15961,7 @@ /turf/open/floor/iron/textured_large, /area/awaymission/black_mesa/science_decon_room) "xTE" = ( -/obj/item/ammo_box/magazine/multi_sprite/ladon, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/iron/smooth_large, /area/awaymission/black_mesa/deep_sci_medbay) "xUH" = ( diff --git a/_maps/RandomZLevels/mothership_astrum.dmm b/_maps/RandomZLevels/mothership_astrum.dmm index 26bebe36e55..b55e6e40141 100644 --- a/_maps/RandomZLevels/mothership_astrum.dmm +++ b/_maps/RandomZLevels/mothership_astrum.dmm @@ -1219,7 +1219,7 @@ /area/awaymission/mothership_astrum/halls) "uA" = ( /obj/structure/closet/abductor, -/obj/item/ammo_box/magazine/multi_sprite/mk58, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/mineral/abductor, /area/awaymission/mothership_astrum/halls) "uH" = ( @@ -1357,8 +1357,8 @@ /area/awaymission/mothership_astrum/halls) "wt" = ( /obj/structure/table/abductor, -/obj/item/ammo_box/magazine/multi_sprite/mk58, -/obj/item/ammo_box/magazine/multi_sprite/mk58, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/mineral/abductor, /area/awaymission/mothership_astrum/halls) "wz" = ( @@ -1715,7 +1715,7 @@ /area/awaymission/mothership_astrum/halls) "Ci" = ( /obj/structure/table/abductor, -/obj/item/ammo_box/magazine/multi_sprite/mk58, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/plating/abductor2, /area/awaymission/mothership_astrum/halls) "Cm" = ( @@ -1851,7 +1851,7 @@ /area/awaymission/mothership_astrum/deck5) "DR" = ( /obj/structure/table, -/obj/item/ammo_box/magazine/multi_sprite/mk58, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/wood, /area/awaymission/mothership_astrum/deck2) "DU" = ( @@ -1921,7 +1921,7 @@ /area/awaymission/mothership_astrum/deck2) "EJ" = ( /obj/structure/table/abductor, -/obj/item/gun/ballistic/automatic/pistol/mk58, +/obj/item/gun/ballistic/automatic/pistol/sol, /turf/open/floor/mineral/abductor, /area/awaymission/mothership_astrum/halls) "EL" = ( @@ -2196,7 +2196,7 @@ "Hn" = ( /obj/structure/table/abductor, /obj/structure/window/reinforced/spawner/directional/west, -/obj/item/gun/ballistic/automatic/pistol/mk58, +/obj/item/gun/ballistic/automatic/pistol/sol, /turf/open/floor/mineral/abductor, /area/awaymission/mothership_astrum/halls) "Hp" = ( @@ -2827,7 +2827,7 @@ /turf/open/floor/wood, /area/awaymission/mothership_astrum/deck2) "OF" = ( -/obj/item/ammo_box/magazine/multi_sprite/mk58, +/obj/item/ammo_box/magazine/c35sol_pistol, /turf/open/floor/wood, /area/awaymission/mothership_astrum/deck3) "Pb" = ( diff --git a/_maps/map_files/VoidRaptor/VoidRaptor.dmm b/_maps/map_files/VoidRaptor/VoidRaptor.dmm index 26258795a63..143300c080a 100644 --- a/_maps/map_files/VoidRaptor/VoidRaptor.dmm +++ b/_maps/map_files/VoidRaptor/VoidRaptor.dmm @@ -15971,10 +15971,10 @@ /turf/open/floor/iron/smooth_large, /area/station/hallway/secondary/service) "eEi" = ( -/obj/structure/closet/secure_closet/smartgun, /obj/effect/turf_decal/tile/dark_red/anticorner, /obj/structure/sign/poster/official/twelve_gauge/directional/east, /obj/effect/turf_decal/bot, +/obj/structure/closet/secure_closet/armory_kiboko, /turf/open/floor/engine, /area/station/ai_monitored/security/armory) "eEp" = ( @@ -22823,12 +22823,12 @@ /area/station/ai_monitored/turret_protected/ai_upload) "gEO" = ( /obj/structure/rack/gunrack, -/obj/effect/spawner/armory_spawn/cmg, /obj/effect/turf_decal/tile/dark_red/anticorner{ dir = 4 }, /obj/structure/sign/poster/official/ion_rifle/directional/east, /obj/effect/turf_decal/delivery, +/obj/effect/spawner/armory_spawn/smg, /turf/open/floor/engine, /area/station/ai_monitored/security/armory) "gEV" = ( @@ -31418,7 +31418,6 @@ pixel_x = -4; pixel_y = 10 }, -/obj/item/storage/box/gunset, /obj/item/storage/medkit/tactical/blueshield, /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -58652,10 +58651,6 @@ pixel_x = 5; pixel_y = 2 }, -/obj/item/stock_parts/cell/blueshield{ - pixel_x = -5; - pixel_y = 10 - }, /obj/machinery/newscaster/directional/north, /obj/machinery/light_switch/directional/north{ pixel_x = 16 diff --git a/_maps/shuttles/skyrat/pirate_nri_raider.dmm b/_maps/shuttles/skyrat/pirate_nri_raider.dmm index 3008861bb1d..36fc58bbf66 100644 --- a/_maps/shuttles/skyrat/pirate_nri_raider.dmm +++ b/_maps/shuttles/skyrat/pirate_nri_raider.dmm @@ -17,9 +17,9 @@ /obj/item/storage/box/zipties{ pixel_x = 2 }, -/obj/item/gun/energy/e_gun/advtaser/assault_ops, -/obj/item/gun/energy/e_gun/advtaser/assault_ops, -/obj/item/gun/energy/e_gun/advtaser/assault_ops, +/obj/item/gun/energy/e_gun/advtaser, +/obj/item/gun/energy/e_gun/advtaser, +/obj/item/gun/energy/e_gun/advtaser, /obj/item/melee/baton, /obj/item/melee/baton, /obj/item/melee/baton, @@ -473,7 +473,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/item/gun/ballistic/shotgun/m23, +/obj/item/gun/ballistic/shotgun/riot, /obj/item/gun/ballistic/automatic/nri_smg, /turf/open/floor/pod, /area/shuttle/pirate/nri) diff --git a/_maps/shuttles/skyrat/prison_transport.dmm b/_maps/shuttles/skyrat/prison_transport.dmm index 08318a8535d..71d66097094 100644 --- a/_maps/shuttles/skyrat/prison_transport.dmm +++ b/_maps/shuttles/skyrat/prison_transport.dmm @@ -18,10 +18,10 @@ /area/shuttle/prison_transport) "aI" = ( /obj/machinery/light/cold/no_nightlight/directional/north, -/obj/item/gun/ballistic/automatic/cfa_wildcat/no_mag, -/obj/item/ammo_box/magazine/multi_sprite/cfa_wildcat/rubber, -/obj/item/ammo_box/magazine/multi_sprite/cfa_wildcat/rubber, -/obj/item/ammo_box/magazine/multi_sprite/cfa_wildcat/rubber, +/obj/item/gun/ballistic/automatic/sol_smg/no_mag, +/obj/item/ammo_box/magazine/c35sol_pistol/stendo, +/obj/item/ammo_box/magazine/c35sol_pistol/stendo, +/obj/item/ammo_box/magazine/c35sol_pistol/stendo, /obj/structure/rack/shelf, /obj/effect/turf_decal/tile/dark_blue/fourcorners, /turf/open/floor/iron/dark, diff --git a/_maps/shuttles/skyrat/slaver_syndie.dmm b/_maps/shuttles/skyrat/slaver_syndie.dmm index 6cd82b4a88c..8347cf4016a 100644 --- a/_maps/shuttles/skyrat/slaver_syndie.dmm +++ b/_maps/shuttles/skyrat/slaver_syndie.dmm @@ -259,8 +259,8 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, -/obj/item/ammo_box/magazine/multi_sprite/cfa_ruby/hp, -/obj/item/ammo_box/magazine/multi_sprite/cfa_ruby/incendiary, +/obj/item/ammo_box/magazine/c585trappiste_pistol, +/obj/item/ammo_box/magazine/c585trappiste_pistol, /obj/item/mod/control/pre_equipped/responsory, /obj/machinery/light/directional/west, /obj/structure/closet/secure_closet{ @@ -539,15 +539,15 @@ /area/shuttle/syndicate/slaver) "Aq" = ( /obj/effect/turf_decal/bot, -/obj/item/ammo_box/magazine/multi_sprite/cfa_wildcat/rubber, -/obj/item/ammo_box/magazine/multi_sprite/cfa_wildcat/rubber, -/obj/item/ammo_box/magazine/multi_sprite/cfa_wildcat/ap, -/obj/item/ammo_box/magazine/multi_sprite/cfa_wildcat/ap, -/obj/item/ammo_box/magazine/multi_sprite/cfa_wildcat/incendiary, -/obj/item/ammo_box/magazine/multi_sprite/cfa_wildcat, +/obj/item/ammo_box/magazine/c35sol_pistol/stendo, +/obj/item/ammo_box/magazine/c35sol_pistol/stendo, +/obj/item/ammo_box/magazine/c35sol_pistol/stendo, +/obj/item/ammo_box/magazine/c35sol_pistol/stendo, +/obj/item/ammo_box/magazine/c35sol_pistol/stendo, +/obj/item/ammo_box/magazine/c35sol_pistol/stendo, /obj/item/storage/box, /obj/item/storage/box/handcuffs, -/obj/item/gun/ballistic/automatic/cfa_wildcat/no_mag, +/obj/item/gun/ballistic/automatic/sol_smg/no_mag, /obj/structure/closet/secure_closet{ icon_state = "hos"; name = "Crew Locker"; @@ -960,7 +960,6 @@ /obj/effect/turf_decal/bot, /obj/item/storage/box, /obj/item/storage/box/handcuffs, -/obj/item/gun/energy/e_gun/cfa_phalanx, /obj/structure/extinguisher_cabinet/directional/east, /obj/structure/closet/secure_closet{ icon_state = "hos"; diff --git a/_maps/skyrat/automapper/templates/birdshot/birdshot_armory.dmm b/_maps/skyrat/automapper/templates/birdshot/birdshot_armory.dmm index ace5f4b93f2..eef058070d4 100644 --- a/_maps/skyrat/automapper/templates/birdshot/birdshot_armory.dmm +++ b/_maps/skyrat/automapper/templates/birdshot/birdshot_armory.dmm @@ -29,8 +29,8 @@ dir = 1 }, /obj/structure/rack/gunrack, -/obj/effect/spawner/armory_spawn/cmg, /obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/armory_spawn/smg, /turf/open/floor/iron/dark/small, /area/station/ai_monitored/security/armory) "A" = ( @@ -80,11 +80,7 @@ /turf/open/floor/iron/dark/small, /area/station/ai_monitored/security/armory) "Q" = ( -/obj/structure/closet/ammunitionlocker/useful, -/obj/item/storage/box/lethalshot, -/obj/item/storage/box/lethalshot, -/obj/item/storage/box/lethalshot, -/obj/item/storage/box/lethalshot, +/obj/structure/closet/secure_closet/armory_kiboko, /turf/open/floor/iron/dark/small, /area/station/ai_monitored/security/armory) "R" = ( diff --git a/_maps/skyrat/automapper/templates/deltastation/deltastation_armory.dmm b/_maps/skyrat/automapper/templates/deltastation/deltastation_armory.dmm index 2f343683e77..e8b78a69a9d 100644 --- a/_maps/skyrat/automapper/templates/deltastation/deltastation_armory.dmm +++ b/_maps/skyrat/automapper/templates/deltastation/deltastation_armory.dmm @@ -58,7 +58,7 @@ pixel_x = 3 }, /obj/structure/rack/gunrack, -/obj/effect/spawner/armory_spawn/cmg, +/obj/effect/spawner/armory_spawn/smg, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) "M" = ( @@ -108,7 +108,7 @@ pixel_x = 3 }, /obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/closet/secure_closet/smartgun, +/obj/structure/closet/secure_closet/armory_kiboko, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) "Y" = ( diff --git a/_maps/skyrat/automapper/templates/icebox/icebox_armory_middle.dmm b/_maps/skyrat/automapper/templates/icebox/icebox_armory_middle.dmm index 8d2359555ce..d6797c049ee 100644 --- a/_maps/skyrat/automapper/templates/icebox/icebox_armory_middle.dmm +++ b/_maps/skyrat/automapper/templates/icebox/icebox_armory_middle.dmm @@ -16,8 +16,8 @@ "e" = ( /obj/machinery/light/directional/north, /obj/structure/rack/gunrack, -/obj/effect/spawner/armory_spawn/cmg, /obj/effect/turf_decal/tile/red/half, +/obj/effect/spawner/armory_spawn/smg, /turf/open/floor/iron/dark/textured, /area/station/ai_monitored/security/armory) "g" = ( @@ -80,7 +80,7 @@ c_tag = "Armory - Internal - Lower" }, /obj/effect/turf_decal/tile/red/half, -/obj/structure/closet/secure_closet/smartgun, +/obj/structure/closet/secure_closet/armory_kiboko, /turf/open/floor/iron/dark/textured, /area/station/ai_monitored/security/armory) "M" = ( diff --git a/_maps/skyrat/automapper/templates/kilostation/kilostation_armory.dmm b/_maps/skyrat/automapper/templates/kilostation/kilostation_armory.dmm index 32394a0dd4e..229c3d31bd0 100644 --- a/_maps/skyrat/automapper/templates/kilostation/kilostation_armory.dmm +++ b/_maps/skyrat/automapper/templates/kilostation/kilostation_armory.dmm @@ -11,11 +11,7 @@ /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/window/reinforced/spawner/directional/east, /obj/effect/decal/cleanable/dirt, -/obj/structure/closet/ammunitionlocker/useful, -/obj/item/storage/box/lethalshot, -/obj/item/storage/box/lethalshot, -/obj/item/storage/box/lethalshot, -/obj/item/storage/box/lethalshot, +/obj/structure/closet/secure_closet/armory_kiboko, /turf/open/floor/iron/showroomfloor, /area/station/ai_monitored/security/armory) "q" = ( @@ -74,7 +70,7 @@ /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/rack/gunrack, -/obj/effect/spawner/armory_spawn/cmg, +/obj/effect/spawner/armory_spawn/smg, /turf/open/floor/iron/showroomfloor, /area/station/ai_monitored/security/armory) "G" = ( diff --git a/_maps/skyrat/automapper/templates/metastation/metastation_armory.dmm b/_maps/skyrat/automapper/templates/metastation/metastation_armory.dmm index d123d8de9bc..19dacb89944 100644 --- a/_maps/skyrat/automapper/templates/metastation/metastation_armory.dmm +++ b/_maps/skyrat/automapper/templates/metastation/metastation_armory.dmm @@ -23,8 +23,8 @@ /area/station/ai_monitored/security/armory) "g" = ( /obj/effect/turf_decal/bot_blue, -/obj/structure/closet/secure_closet/smartgun, /obj/machinery/firealarm/directional/east, +/obj/structure/closet/secure_closet/armory_kiboko, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) "h" = ( @@ -128,7 +128,7 @@ "C" = ( /obj/effect/turf_decal/delivery/red, /obj/structure/rack/gunrack, -/obj/effect/spawner/armory_spawn/cmg, +/obj/effect/spawner/armory_spawn/smg, /turf/open/floor/iron/smooth, /area/station/ai_monitored/security/armory) "D" = ( diff --git a/_maps/skyrat/automapper/templates/northstar/northstar_armory.dmm b/_maps/skyrat/automapper/templates/northstar/northstar_armory.dmm index f45792c6c38..3c8ea12baed 100644 --- a/_maps/skyrat/automapper/templates/northstar/northstar_armory.dmm +++ b/_maps/skyrat/automapper/templates/northstar/northstar_armory.dmm @@ -4,8 +4,8 @@ /area/template_noop) "y" = ( /obj/structure/rack/gunrack, -/obj/effect/spawner/armory_spawn/cmg, /obj/structure/window/reinforced/spawner/directional/west, +/obj/effect/spawner/armory_spawn/smg, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) "F" = ( @@ -15,7 +15,7 @@ /area/station/ai_monitored/security/armory) "I" = ( /obj/effect/turf_decal/tile/red/fourcorners, -/obj/structure/closet/secure_closet/smartgun, +/obj/structure/closet/secure_closet/armory_kiboko, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) "O" = ( diff --git a/_maps/skyrat/automapper/templates/tramstation/tramstation_armory.dmm b/_maps/skyrat/automapper/templates/tramstation/tramstation_armory.dmm index 80ba797d148..6b9b4479c1d 100644 --- a/_maps/skyrat/automapper/templates/tramstation/tramstation_armory.dmm +++ b/_maps/skyrat/automapper/templates/tramstation/tramstation_armory.dmm @@ -3,7 +3,7 @@ /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/rack/gunrack, -/obj/effect/spawner/armory_spawn/cmg, +/obj/effect/spawner/armory_spawn/smg, /turf/open/floor/iron, /area/station/ai_monitored/security/armory) "fc" = ( @@ -61,7 +61,7 @@ layer = 2.9 }, /obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/closet/secure_closet/smartgun, +/obj/structure/closet/secure_closet/armory_kiboko, /turf/open/floor/iron, /area/station/ai_monitored/security/armory) "SD" = ( diff --git a/code/__DEFINES/~skyrat_defines/cargo_import_companies.dm b/code/__DEFINES/~skyrat_defines/cargo_import_companies.dm index efb250aa231..d0e82f110b5 100644 --- a/code/__DEFINES/~skyrat_defines/cargo_import_companies.dm +++ b/code/__DEFINES/~skyrat_defines/cargo_import_companies.dm @@ -6,7 +6,7 @@ #define CARGO_COMPANY_DONK (1<<4) #define CARGO_COMPANY_KAHRAMAN (1<<5) #define CARGO_COMPANY_NAKAMURA_TOOLING (1<<6) -#define CARGO_COMPANY_BOLT_NANOTRASEN (1<<7) +#define CARGO_COMPANY_SOL_DEFENSE (1<<7) #define CARGO_COMPANY_MICROSTAR (1<<8) #define CARGO_COMPANY_VITEZSTVI_AMMO (1<<9) @@ -18,7 +18,7 @@ #define DONK_CO_NAME "Donk Corporation" #define KAHRAMAN_INDUSTRIES_NAME "Kahraman Heavy Industries" #define NAKAMURA_ENGINEERING_TOOLING_NAME "Nakamura Engineering Tooling Divison" -#define BOLT_NANOTRASEN_DEFENSE_NAME "Nanotrasen-Bolt Personal Defense Coalition" +#define SOL_DEFENSE_DEFENSE_NAME "Sol Defense Imports" #define MICROSTAR_ENERGY_NAME "MicroStar Energy Weapon Coalition" #define VITEZSTVI_AMMO_NAME "Vitezstvi Ammo & Weapon Accessories" diff --git a/code/__DEFINES/~skyrat_defines/manufacturer_strings.dm b/code/__DEFINES/~skyrat_defines/manufacturer_strings.dm index fd90be189d0..0f4b8de3348 100644 --- a/code/__DEFINES/~skyrat_defines/manufacturer_strings.dm +++ b/code/__DEFINES/~skyrat_defines/manufacturer_strings.dm @@ -1,12 +1,13 @@ // Text for what examine blurb will come up when used with /datum/element/manufacturer_examine // Very loosely grouped based on what company makes what mainly for your viewing pleasure -#define COMPANY_CANTALAN "It has [span_purple("Cantalan Federal Arms")] etched into it." #define COMPANY_DONK "It has a [span_green("Donk Corporation")] label visible on it." #define COMPANY_BOLT "It has [span_yellow("Bolt Fabrications")] stamped onto it." #define COMPANY_NANOTRASEN "It has [span_blue("Nanotrasen Armories")] etched into it." -#define COMPANY_ARMADYNE "It has [span_red("Armadyne Corporation")] etched into it." +#define COMPANY_CARWO "It has a small [span_cyan("four pointed star")] alongside [span_cyan("Carwo Defense Systems")] etched into it." +#define COMPANY_TRAPPISTE "It has a small [span_red("pattern of five squares")] alongside [span_red("Trappiste Fabriek")] etched into it." + #define COMPANY_SCARBOROUGH "It has [span_orange("Scarborough Arms")] stamped onto it." #define COMPANY_INTERDYNE "It has [span_cyan("Interdyne Pharmaceuticals")] stamped onto it." diff --git a/code/__DEFINES/~skyrat_defines/projectiles.dm b/code/__DEFINES/~skyrat_defines/projectiles.dm index dd08d26514e..158f3e12d1e 100644 --- a/code/__DEFINES/~skyrat_defines/projectiles.dm +++ b/code/__DEFINES/~skyrat_defines/projectiles.dm @@ -1,29 +1,22 @@ -#define CALIBER_PEPPERBALL "pepperball" - -#define CALIBER_12MM "12mm" -#define CALIBER_473MM "473mm" -#define CALIBER_6MM "6mm" - -/// The caliber used by the Automag. -#define CALIBER_44 ".44 AMP" - -/// The caliber used by the M45A5 -#define CALIBER_460 ".460 RM JHP" - -/// The caliber used by the CFA Lynx. -#define CALIBER_42X30MM "4.2x30mm" - -/// The caliber used by the Catanheim. -#define CALIBER_A68 "a68" - /// The caliber used by the AK-25 #define CALIBER_732x29 "a732x29" -/// The caliber used by the Ripper gen2 -#define CALIBER_B577 ".577 Snider" - /// The caliber used by the Oldarms 'Mk.11.4 rifle', designed to be worse .223. #define CALIBER_223S ".223 Stinger" /// Caliber used by the giant anti materiel rifle in guncargo #define CALIBER_60STRELA ".60 Strela" + +/// Standard Sol rifle caliber +#define CALIBER_SOL40LONG ".40 Sol Long" +/// Standard Sol pistol caliber +#define CALIBER_SOL35SHORT ".35 Sol Short" + +/// Basically 20mm grenades, I'd be concerned if a grenade launcher didn't use this +#define CALIBER_980TYDHOUER ".980 Tydhouer" + +/// Large caliber pistol round for Sol hand cannons +#define CALIBER_585TRAPPISTE ".585 Trappiste" + +/// Caliber used by the pepperball gun +#define CALIBER_PEPPERBALL "pepperball" diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 9700a3e80fa..ec46756140c 100755 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -17,7 +17,7 @@ new /obj/item/radio/headset/heads/captain/alt(src) new /obj/item/radio/headset/heads/captain(src) new /obj/item/storage/belt/sabre(src) - new /obj/item/storage/box/gunset/pdh(src) // SKYRAT EDIT CHANGE - ORIGINAL: new /obj/item/gun/energy/e_gun(src) + new /obj/item/gun/energy/e_gun(src) new /obj/item/door_remote/captain(src) new /obj/item/storage/photo_album/captain(src) @@ -25,7 +25,6 @@ name = "head of personnel's locker" icon_state = "hop" req_access = list(ACCESS_HOP) - storage_capacity = 40 //SKYRAT EDIT ADDITION /obj/structure/closet/secure_closet/hop/PopulateContents() ..() diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 576ba6395be..efff8c2fc61 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -723,7 +723,7 @@ GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list( /obj/item/suppressor name = "suppressor" - desc = "A Scarborough Arms small-arms suppressor for maximum espionage." //SKYRAT EDIT - ORIGINAL: desc = "A syndicate small-arms suppressor for maximum espionage." + desc = "A small-arms suppressor for maximum espionage." //SKYRAT EDIT - ORIGINAL: desc = "A syndicate small-arms suppressor for maximum espionage." icon = 'icons/obj/weapons/guns/ballistic.dmi' icon_state = "suppressor" w_class = WEIGHT_CLASS_TINY diff --git a/modular_skyrat/master_files/code/datums/storage/subtypes/pockets.dm b/modular_skyrat/master_files/code/datums/storage/subtypes/pockets.dm index 491eb74443a..75a2f01aa99 100644 --- a/modular_skyrat/master_files/code/datums/storage/subtypes/pockets.dm +++ b/modular_skyrat/master_files/code/datums/storage/subtypes/pockets.dm @@ -4,18 +4,8 @@ . = ..() add_holdable(list( - // Adds pistol magazines from guncargo companies in their respective order - /obj/item/ammo_box/magazine/multi_sprite/pdh, - /obj/item/ammo_box/magazine/multi_sprite/ladon, - /obj/item/ammo_box/magazine/multi_sprite/firefly, - /obj/item/ammo_box/magazine/multi_sprite/pdh_peacekeeper, - /obj/item/ammo_box/magazine/multi_sprite/mk58, - /obj/item/ammo_box/magazine/m45, - /obj/item/ammo_box/magazine/pepperball, // boot pepper - /obj/item/ammo_box/magazine/multi_sprite/g17, - /obj/item/ammo_box/magazine/multi_sprite/cfa_ruby, - /obj/item/ammo_box/magazine/multi_sprite/cfa_snub, - /obj/item/ammo_box/magazine/multi_sprite/makarov, + /obj/item/ammo_box/magazine/c35sol_pistol, + /obj/item/ammo_box/magazine/c585trappiste_pistol, /obj/item/ammo_box/magazine/m9mm_aps, /obj/item/ammo_box/magazine/toy/pistol, )) diff --git a/modular_skyrat/master_files/code/modules/clothing/under/jobs/centcom.dm b/modular_skyrat/master_files/code/modules/clothing/under/jobs/centcom.dm index 9c48b5a2736..05aa24276d8 100644 --- a/modular_skyrat/master_files/code/modules/clothing/under/jobs/centcom.dm +++ b/modular_skyrat/master_files/code/modules/clothing/under/jobs/centcom.dm @@ -13,12 +13,6 @@ */ //Check modular_skyrat\modules\nanotrasen_naval_command\code\clothing.dm for more of these! (Or, currently, ALL of these.) -/* -* ARMADYNE -*/ -//Check modular_skyrat\modules\sec_haul\code\peacekeeper\armadyne_clothing.dm for these (ORION TODO: debate moving them all into this one file - uniforms, at least) -//(TODO applies to NT as well) - /* * LOPLAND */ diff --git a/modular_skyrat/modules/aesthetics/guns/code/guns.dm b/modular_skyrat/modules/aesthetics/guns/code/guns.dm index 767ca1608c1..4bb8e23dbe2 100644 --- a/modular_skyrat/modules/aesthetics/guns/code/guns.dm +++ b/modular_skyrat/modules/aesthetics/guns/code/guns.dm @@ -75,33 +75,6 @@ lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' -/obj/item/gun/ballistic/shotgun/riot - name = "\improper Peacekeeper shotgun" - desc = "A Nanotrasen-made riot control shotgun fitted with an extended tube and a fixed tactical stock." - icon = 'modular_skyrat/modules/aesthetics/guns/icons/guns.dmi' - worn_icon = 'modular_skyrat/modules/aesthetics/guns/icons/guns_back.dmi' - lefthand_file = 'modular_skyrat/modules/aesthetics/guns/icons/guns_lefthand.dmi' - righthand_file = 'modular_skyrat/modules/aesthetics/guns/icons/guns_righthand.dmi' - inhand_icon_state = "riot_shotgun" - inhand_x_dimension = 32 - inhand_y_dimension = 32 - can_suppress = TRUE - suppressed_sound = 'modular_skyrat/modules/aesthetics/guns/sound/suppressed_shotgun.ogg' - suppressed_volume = 100 - vary_fire_sound = TRUE - fire_sound = 'modular_skyrat/modules/aesthetics/guns/sound/shotgun_light.ogg' - -/obj/item/gun/ballistic/shotgun/riot/syndicate - name = "\improper Peacebreaker shotgun" - desc = "A Scarborough riot control shotgun fitted with a crimson furnishing and a wooden tactical stock. You swear you've seen this model elsewhere before..." - icon_state = "riotshotgun_syndie" - inhand_icon_state = "riot_shotgun_syndie" - can_be_sawn_off = FALSE - can_suppress = FALSE - -/obj/item/gun/ballistic/shotgun/riot/syndicate/give_manufacturer_examine() - AddElement(/datum/element/manufacturer_examine, COMPANY_SCARBOROUGH) - /obj/item/gun/ballistic/shotgun/automatic/combat name = "\improper Peacekeeper combat shotgun" desc = "A semi-automatic Nanotrasen Peacekeeper shotgun with tactical furnishing and heavier internals meant for sustained fire. Lacks a threaded barrel." @@ -327,28 +300,6 @@ desc = "One of countless obsolete ballistic rifles that still sees use as a cheap deterrent. Uses 10mm ammo and its bulky frame prevents one-hand firing." icon = 'modular_skyrat/modules/aesthetics/guns/icons/guns.dmi' -/obj/item/gun/ballistic/automatic/ar/modular/model75 - name = "\improper NT ARG-75" - desc = "A contemporary rifle manufactured by NT chambered for .310 Strilka. It's equipped with a heavy duty integrally suppressed barrel, CQB scope and a topmounted laser sight." - icon_state = "arg75" - icon = 'modular_skyrat/modules/aesthetics/guns/icons/guns.dmi' - fire_sound = 'sound/weapons/gun/pistol/shot_suppressed.ogg' - fire_delay = 5 - fire_sound_volume = 90 - accepted_magazine_type = /obj/item/ammo_box/magazine/multi_sprite/ostwind/arg75 - -/obj/item/gun/ballistic/automatic/ar/modular/model75/give_manufacturer_examine() - AddElement(/datum/element/manufacturer_examine, COMPANY_NANOTRASEN) - -/obj/item/ammo_box/magazine/multi_sprite/ostwind/arg75 - name = "\improper ARG-75 magazine" - desc = "A twenty round double-stack magazine for the NT ARG-75 rifle. Chambered in .310 Strilka." - icon = 'modular_skyrat/modules/sec_haul/icons/guns/mags.dmi' - icon_state = "pcr" - ammo_type = /obj/item/ammo_casing/strilka310 - caliber = CALIBER_STRILKA310 - max_ammo = 20 - // GUBMAN3 - FULL BULLET RENAME // i loathe the above diff --git a/modular_skyrat/modules/aesthetics/guns/icons/guns.dmi b/modular_skyrat/modules/aesthetics/guns/icons/guns.dmi index 3933f89903873230d943b2414af69feb3277f524..deb9cd5931e23213faa26f6a9519cb0736f3f05d 100644 GIT binary patch literal 36173 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 Hv!MR~6?RWO literal 13608 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 CU;MQI diff --git a/tgstation.dme b/tgstation.dme index 17aaca8fb86..2db2a0deebc 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -2251,6 +2251,7 @@ #include "code\game\objects\items\taster.dm" #include "code\game\objects\items\teleportation.dm" #include "code\game\objects\items\theft_tools.dm" +#include "code\game\objects\items\tongs.dm" #include "code\game\objects\items\toy_mechs.dm" #include "code\game\objects\items\toys.dm" #include "code\game\objects\items\trash.dm" From e94cfaa186a0a59887b5d7aecf6eeda6a41b7ced Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 4 Oct 2023 06:58:18 +0200 Subject: [PATCH 17/49] Converts cursed heart effect into a component. [MDB IGNORE] (#24104) * Converts cursed heart effect into a component. (#78554) ## About The Pull Request Fixes #58401 Fixes #58799 Fixes #58800 Converts the manual heart-beating effect of the cursed heart into a component. Behavior has mostly been maintained, but polished a bit as compared to the original cursed heart. Most notably, the action for beating your heart is now a cooldown action - providing a visual indicator of when you can beat it again, rather than leaving you guessing. Some better checks have also been put in place for edge cases such as having your species changed. Implementation inspired by the existing "manual blinking" and "manual breathing" components. Currently only used by the cursed heart and the (now majorly simplified) effect of corazargh. My first component, so hopefully I didn't miss anything. ## Why It's Good For The Game The cursed heart was kind of unusably bad - which may have been part of the intent, but having to count in your head or spam-click the button is just annoying. With a visual indicator of when you should beat your heart, hopefully it will be slightly less awful for the cursed. The real motivation here was that corazargh's implementation was kind of a travesty - summoning a cursed heart inside of your body while it was in your system, then restoring your old heart afterward. This was error-prone as well as just being ridiculous. Making this effect a component gets rid of these problems, and leaves space open for new uses of manual heart beating if anyone feels like being cruel. ## Changelog :cl: fix: Your heart will no longer be deleted if an admin heals you while you have corazargh in your system. refactor: The cursed heart has been streamlined a bit, and now gives you a visual cooldown for when you can beat your heart again. /:cl: * Converts cursed heart effect into a component. --------- Co-authored-by: lizardqueenlexi <105025397+lizardqueenlexi@users.noreply.github.com> --- code/__DEFINES/dcs/signals/signals_action.dm | 5 +- code/datums/components/manual_heart.dm | 179 ++++++++++++++++++ .../antagonists/wizard/equipment/artefact.dm | 2 +- code/modules/client/client_colour.dm | 4 + .../impure_medicine_reagents.dm | 78 +------- .../surgery/organs/internal/heart/_heart.dm | 76 +------- tgstation.dme | 1 + 7 files changed, 201 insertions(+), 144 deletions(-) create mode 100644 code/datums/components/manual_heart.dm diff --git a/code/__DEFINES/dcs/signals/signals_action.dm b/code/__DEFINES/dcs/signals/signals_action.dm index 27206e483c5..6fbf5372acd 100644 --- a/code/__DEFINES/dcs/signals/signals_action.dm +++ b/code/__DEFINES/dcs/signals/signals_action.dm @@ -40,8 +40,11 @@ /// From base of /datum/action/cooldown/mob_cooldown/lava_swoop/proc/swoop_attack(): () #define COMSIG_LAVA_ARENA_FAILED "mob_lava_arena_failed" -///From /datum/action/vehicle/sealed/mecha/mech_toggle_safeties/proc/update_action_icon(): () +/// From /datum/action/vehicle/sealed/mecha/mech_toggle_safeties/proc/update_action_icon(): () #define COMSIG_MECH_SAFETIES_TOGGLE "mech_safeties_toggle" /// From /datum/action/cooldown/mob_cooldown/assume_form/proc/assume_appearances(), sent to the action owner: (atom/movable/target) #define COMSIG_ACTION_DISGUISED_APPEARANCE "mob_ability_disguise_appearance" + +/// From /datum/action/cooldown/manual_heart/Activate(): () +#define COMSIG_HEART_MANUAL_PULSE "heart_manual_pulse" diff --git a/code/datums/components/manual_heart.dm b/code/datums/components/manual_heart.dm new file mode 100644 index 00000000000..09448acfc67 --- /dev/null +++ b/code/datums/components/manual_heart.dm @@ -0,0 +1,179 @@ +/// If a beat is missed, how long to give before the next is missed +#define MANUAL_HEART_GRACE_PERIOD 2 SECONDS + +/** + * Manual heart pumping component. Requires the holder to pump their heart manually every + * so often or die. + * + * Mainly used by the cursed heart. + */ +/datum/component/manual_heart + /// The action for pumping your heart + var/datum/action/cooldown/manual_heart/pump_action + /// Cooldown before harm is caused to the owner + COOLDOWN_DECLARE(heart_timer) + /// If true, add a screen tint on the next process + var/add_colour = TRUE + /// How long between needed pumps; you can pump one second early + var/pump_delay = 3 SECONDS + /// How much blood volume you lose every missed pump, this is a flat amount not a percentage! + var/blood_loss = BLOOD_VOLUME_NORMAL * 0.2 // 20% of normal volume, missing five pumps is instant death + + //How much to heal per pump - negative numbers harm the owner instead + /// The amount of brute damage to heal per pump + var/heal_brute = 0 + /// The amount of burn damage to heal per pump + var/heal_burn = 0 + /// The amount of oxygen damage to heal per pump + var/heal_oxy = 0 + +/datum/component/manual_heart/Initialize(pump_delay = 3 SECONDS, blood_loss = BLOOD_VOLUME_NORMAL * 0.2, heal_brute = 0, heal_burn = 0, heal_oxy = 0) + //Non-Carbon mobs can't have hearts, and should never receive this component. + if (!iscarbon(parent)) + stack_trace("Manual Heart component added to [parent] ([parent?.type]) which is not a /mob/living/carbon subtype.") + return COMPONENT_INCOMPATIBLE + + src.pump_delay = pump_delay + src.blood_loss = blood_loss + src.heal_brute = heal_brute + src.heal_burn = heal_burn + src.heal_oxy = heal_oxy + + pump_action = new(src) + +/datum/component/manual_heart/Destroy() + QDEL_NULL(pump_action) + return ..() + +/datum/component/manual_heart/RegisterWithParent() + RegisterSignal(parent, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(check_removed_organ)) + RegisterSignal(parent, COMSIG_CARBON_GAIN_ORGAN, PROC_REF(check_added_organ)) + RegisterSignal(parent, COMSIG_HEART_MANUAL_PULSE, PROC_REF(on_pump)) + RegisterSignals(parent, list(COMSIG_LIVING_DEATH, SIGNAL_ADDTRAIT(TRAIT_NOBLOOD)), PROC_REF(pause)) + RegisterSignals(parent, list(COMSIG_LIVING_REVIVE, SIGNAL_REMOVETRAIT(TRAIT_NOBLOOD)), PROC_REF(restart)) + + pump_action.cooldown_time = pump_delay - (1 SECONDS) //you can pump up to a second early + pump_action.Grant(parent) + + var/mob/living/carbon/carbon_parent = parent + var/obj/item/organ/internal/heart/parent_heart = carbon_parent.get_organ_slot(ORGAN_SLOT_HEART) + if(parent_heart && !HAS_TRAIT(carbon_parent, TRAIT_NOBLOOD) && carbon_parent.stat != DEAD) + START_PROCESSING(SSdcs, src) + COOLDOWN_START(src, heart_timer, pump_delay) + + to_chat(parent, span_userdanger("Your heart no longer beats automatically! You have to pump it manually - otherwise you'll die!")) + +/datum/component/manual_heart/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_CARBON_GAIN_ORGAN, COMSIG_CARBON_LOSE_ORGAN, COMSIG_HEART_MANUAL_PULSE, COMSIG_LIVING_REVIVE, COMSIG_LIVING_DEATH, SIGNAL_ADDTRAIT(TRAIT_NOBLOOD), SIGNAL_REMOVETRAIT(TRAIT_NOBLOOD))) + + to_chat(parent, span_userdanger("You feel your heart start beating normally again!")) + var/mob/living/carbon/carbon_parent = parent + if(istype(carbon_parent)) + carbon_parent.remove_client_colour(/datum/client_colour/manual_heart_blood) + +/datum/component/manual_heart/proc/restart() + SIGNAL_HANDLER + + if(!check_valid()) + return + COOLDOWN_START(src, heart_timer, pump_delay) + pump_action.build_all_button_icons(UPDATE_BUTTON_STATUS) //make sure the action button always shows as available when it is + START_PROCESSING(SSdcs, src) + +/datum/component/manual_heart/proc/pause() + SIGNAL_HANDLER + pump_action.build_all_button_icons(UPDATE_BUTTON_STATUS) + var/mob/living/carbon/carbon_parent = parent + if(istype(carbon_parent)) + carbon_parent.remove_client_colour(/datum/client_colour/manual_heart_blood) //prevents red overlay from getting stuck + STOP_PROCESSING(SSdcs, src) + +/// Worker proc that checks logic for if a pump can happen, and applies effects from doing so +/datum/component/manual_heart/proc/on_pump(mob/owner) + COOLDOWN_START(src, heart_timer, pump_delay) + playsound(owner,'sound/effects/singlebeat.ogg', 40, TRUE) + + var/mob/living/carbon/carbon_owner = owner + + if(HAS_TRAIT(carbon_owner, TRAIT_NOBLOOD)) + return + carbon_owner.blood_volume = min(carbon_owner.blood_volume + (blood_loss * 0.5), BLOOD_VOLUME_MAXIMUM) + carbon_owner.remove_client_colour(/datum/client_colour/manual_heart_blood) + add_colour = TRUE + carbon_owner.adjustBruteLoss(-heal_brute) + carbon_owner.adjustFireLoss(-heal_burn) + carbon_owner.adjustOxyLoss(-heal_oxy) + +/datum/component/manual_heart/process() + var/mob/living/carbon/carbon_parent = parent + + //If they aren't connected, don't kill them. + if(!carbon_parent.client) + COOLDOWN_START(src, heart_timer, pump_delay) + return + + if(!COOLDOWN_FINISHED(src, heart_timer)) + return + + carbon_parent.blood_volume = max(carbon_parent.blood_volume - blood_loss, 0) + to_chat(carbon_parent, span_userdanger("You have to keep pumping your blood!")) + COOLDOWN_START(src, heart_timer, MANUAL_HEART_GRACE_PERIOD) //give two full seconds before losing more blood + if(add_colour) + carbon_parent.add_client_colour(/datum/client_colour/manual_heart_blood) + add_colour = FALSE + +///If a new heart is added, start processing. +/datum/component/manual_heart/proc/check_added_organ(mob/organ_owner, obj/item/organ/new_organ) + SIGNAL_HANDLER + + var/obj/item/organ/internal/heart/new_heart = new_organ + + if(!istype(new_heart) || !check_valid()) + return + COOLDOWN_START(src, heart_timer, pump_delay) + pump_action.build_all_button_icons(UPDATE_BUTTON_STATUS) + var/mob/living/carbon/carbon_parent = parent + if(istype(carbon_parent)) + carbon_parent.remove_client_colour(/datum/client_colour/manual_heart_blood) //prevents red overlay from getting stuck + START_PROCESSING(SSdcs, src) + +///If the heart is removed, stop processing. +/datum/component/manual_heart/proc/check_removed_organ(mob/organ_owner, obj/item/organ/removed_organ) + SIGNAL_HANDLER + + var/obj/item/organ/internal/heart/removed_heart = removed_organ + + if(istype(removed_heart)) + pump_action.build_all_button_icons(UPDATE_BUTTON_STATUS) + STOP_PROCESSING(SSdcs, src) + +///Helper proc to check if processing can be restarted. +/datum/component/manual_heart/proc/check_valid() + var/mob/living/carbon/carbon_parent = parent + var/obj/item/organ/internal/heart/parent_heart = carbon_parent.get_organ_slot(ORGAN_SLOT_HEART) + return !isnull(parent_heart) && !HAS_TRAIT(carbon_parent, TRAIT_NOBLOOD) && carbon_parent.stat != DEAD + +///Action to pump your heart. Cooldown will always be set to 1 second less than the pump delay. +/datum/action/cooldown/manual_heart + name = "Pump your blood" + cooldown_time = 2 SECONDS + check_flags = NONE + button_icon = 'icons/obj/medical/organs/organs.dmi' + button_icon_state = "cursedheart-off" + +/datum/action/cooldown/manual_heart/Activate(atom/atom_target) + . = ..() + + SEND_SIGNAL(owner, COMSIG_HEART_MANUAL_PULSE) + +///The action button is only available when you're a living carbon with blood and a heart. +/datum/action/cooldown/manual_heart/IsAvailable(feedback = FALSE) + var/mob/living/carbon/heart_haver = owner + if(!istype(heart_haver) || HAS_TRAIT(heart_haver, TRAIT_NOBLOOD) || heart_haver.stat == DEAD) + return FALSE + var/obj/item/organ/internal/heart/heart_havers_heart = heart_haver.get_organ_slot(ORGAN_SLOT_HEART) + if(isnull(heart_havers_heart)) + return FALSE + return ..() + +#undef MANUAL_HEART_GRACE_PERIOD diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index 3e4cf0766f5..4783daffb8b 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -311,7 +311,7 @@ //Provides a decent heal, need to pump every 6 seconds /obj/item/organ/internal/heart/cursed/wizard - pump_delay = 60 + pump_delay = 6 SECONDS heal_brute = 25 heal_burn = 25 heal_oxy = 25 diff --git a/code/modules/client/client_colour.dm b/code/modules/client/client_colour.dm index 444b4d7ec12..707267e7143 100644 --- a/code/modules/client/client_colour.dm +++ b/code/modules/client/client_colour.dm @@ -221,6 +221,10 @@ override = TRUE colour = list(0.8,0,0,0, 0,0,0,0, 0,0,1,0, 0,0,0,1, 0,0,0,0) +/datum/client_colour/manual_heart_blood + priority = PRIORITY_ABSOLUTE + colour = COLOR_RED + #undef PRIORITY_ABSOLUTE #undef PRIORITY_HIGH #undef PRIORITY_NORMAL diff --git a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm index 7abe44893a1..23e8537358c 100644 --- a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm @@ -687,7 +687,7 @@ Basically, we fill the time between now and 2s from now with hands based off the affected_mob.cure_trauma_type(temp_trauma, resilience = TRAUMA_RESILIENCE_MAGIC) /datum/reagent/inverse/corazargh - name = "Corazargh" //It's what you yell! Though, if you've a better name feel free. Also an omage to an older chem + name = "Corazargh" //It's what you yell! Though, if you've a better name feel free. Also an homage to an older chem description = "Interferes with the body's natural pacemaker, forcing the patient to manually beat their heart." color = "#5F5F5F" self_consuming = TRUE @@ -696,83 +696,23 @@ Basically, we fill the time between now and 2s from now with hands based off the metabolization_rate = REM chemical_flags = REAGENT_DEAD_PROCESS tox_damage = 0 - ///Weakref to the old heart we're swapping for - var/datum/weakref/original_heart_ref - ///Weakref to the new heart that's temp added - var/datum/weakref/manual_heart_ref -///Creates a new cursed heart and puts the old inside of it, then replaces the position of the old +///Give the victim the manual heart beating component. /datum/reagent/inverse/corazargh/on_mob_metabolize(mob/living/affected_mob) . = ..() if(!iscarbon(affected_mob)) return var/mob/living/carbon/carbon_mob = affected_mob - var/obj/item/organ/internal/heart/original_heart = affected_mob.get_organ_slot(ORGAN_SLOT_HEART) - if(!original_heart) - return - original_heart_ref = WEAKREF(original_heart) - - var/obj/item/organ/internal/heart/cursed/manual_heart = new(null, src) - manual_heart_ref = WEAKREF(manual_heart) - original_heart.Remove(carbon_mob, special = TRUE) //So we don't suddenly die - original_heart.forceMove(manual_heart) - original_heart.organ_flags |= ORGAN_FROZEN //Not actually frozen, but we want to pause decay - manual_heart.Insert(carbon_mob, special = TRUE) - //these last so instert doesn't call them - RegisterSignal(carbon_mob, COMSIG_CARBON_GAIN_ORGAN, PROC_REF(on_gained_organ)) - RegisterSignal(carbon_mob, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(on_removed_organ)) - to_chat(affected_mob, span_userdanger("You feel your heart suddenly stop beating on it's own - you'll have to manually beat it!")) - -///Intercepts the new heart and creates a new cursed heart - putting the old inside of it -/datum/reagent/inverse/corazargh/proc/on_gained_organ(mob/affected_mob, obj/item/organ/organ) - SIGNAL_HANDLER - if(!istype(organ, /obj/item/organ/internal/heart)) - return - // DO NOT REACT TO YOUR OWN HEART ADDITION I SWEAR TO CHRIST - var/obj/item/organ/internal/heart/cursed/manual_heart = manual_heart_ref?.resolve() - if(organ == manual_heart) - return - - var/mob/living/carbon/affected_carbon = affected_mob - var/obj/item/organ/internal/heart/original_heart = organ - original_heart_ref = WEAKREF(original_heart) - original_heart.Remove(affected_carbon, special = TRUE) - if(!manual_heart) - manual_heart = new(null, src) - manual_heart_ref = WEAKREF(manual_heart) - original_heart.forceMove(manual_heart) - original_heart.organ_flags |= ORGAN_FROZEN //Not actually frozen, but we want to pause decay - manual_heart.Insert(affected_carbon, special = TRUE) - -///If we're ejecting out the organ - replace it with the original -/datum/reagent/inverse/corazargh/proc/on_removed_organ(mob/prev_owner, obj/item/organ/organ) - SIGNAL_HANDLER - var/obj/item/organ/internal/heart/cursed/manual_heart = manual_heart_ref?.resolve() - if(organ != manual_heart) - return - var/obj/item/organ/internal/heart/original_heart = original_heart_ref?.resolve() - if(!original_heart) + var/obj/item/organ/internal/heart/affected_heart = carbon_mob.get_organ_slot(ORGAN_SLOT_HEART) + if(isnull(affected_heart)) return + carbon_mob.AddComponent(/datum/component/manual_heart) + return ..() - original_heart.forceMove(manual_heart.loc) - original_heart.organ_flags &= ~ORGAN_FROZEN //enable decay again - QDEL_NULL(manual_heart_ref) - -///We're done - remove the curse and restore the old one +///We're done - remove the curse /datum/reagent/inverse/corazargh/on_mob_end_metabolize(mob/living/affected_mob) - . = ..() - //Do these first so Insert doesn't call them - UnregisterSignal(affected_mob, COMSIG_CARBON_LOSE_ORGAN) - UnregisterSignal(affected_mob, COMSIG_CARBON_GAIN_ORGAN) - if(!iscarbon(affected_mob)) - return - var/mob/living/carbon/affected_carbon = affected_mob - var/obj/item/organ/internal/heart/original_heart = original_heart_ref?.resolve() - if(original_heart) //Mostly a just in case - original_heart.organ_flags &= ~ORGAN_FROZEN //enable decay again - original_heart.Insert(affected_carbon, special = TRUE) - QDEL_NULL(manual_heart_ref) - to_chat(affected_mob, span_userdanger("You feel your heart start beating normally again!")) + qdel(affected_mob.GetComponent(/datum/component/manual_heart)) + ..() /datum/reagent/inverse/antihol name = "Prohol" diff --git a/code/modules/surgery/organs/internal/heart/_heart.dm b/code/modules/surgery/organs/internal/heart/_heart.dm index 307d3e478a5..fb97ca7eda0 100644 --- a/code/modules/surgery/organs/internal/heart/_heart.dm +++ b/code/modules/surgery/organs/internal/heart/_heart.dm @@ -104,20 +104,12 @@ icon_state = "cursedheart-off" base_icon_state = "cursedheart" decay_factor = 0 - actions_types = list(/datum/action/item_action/organ_action/cursed_heart) - var/last_pump = 0 - var/add_colour = TRUE //So we're not constantly recreating colour datums - /// How long between needed pumps; you can pump one second early var/pump_delay = 3 SECONDS - /// How much blood volume you lose every missed pump, this is a flat amount not a percentage! - var/blood_loss = (BLOOD_VOLUME_NORMAL / 5) // 20% of normal volume, missing five pumps is instant death - - //How much to heal per pump, negative numbers would HURT the player + var/blood_loss = BLOOD_VOLUME_NORMAL * 0.2 var/heal_brute = 0 var/heal_burn = 0 var/heal_oxy = 0 - /obj/item/organ/internal/heart/cursed/attack(mob/living/carbon/human/accursed, mob/living/carbon/human/user, obj/target) if(accursed == user && istype(accursed)) playsound(user,'sound/effects/singlebeat.ogg',40,TRUE) @@ -126,75 +118,13 @@ else return ..() -/// Worker proc that checks logic for if a pump can happen, and applies effects/notifications from doing so -/obj/item/organ/internal/heart/cursed/proc/on_pump(mob/owner) - var/next_pump = last_pump + pump_delay - (1 SECONDS) // pump a second early - if(world.time < next_pump) - to_chat(owner, span_userdanger("Too soon!")) - return - - last_pump = world.time - playsound(owner,'sound/effects/singlebeat.ogg', 40, TRUE) - to_chat(owner, span_notice("Your heart beats.")) - - if(!ishuman(owner)) - return - var/mob/living/carbon/human/accursed = owner - - if(HAS_TRAIT(accursed, TRAIT_NOBLOOD) || !accursed.dna) - return - accursed.blood_volume = min(accursed.blood_volume + (blood_loss * 0.5), BLOOD_VOLUME_MAXIMUM) - accursed.remove_client_colour(/datum/client_colour/cursed_heart_blood) - add_colour = TRUE - accursed.adjustBruteLoss(-heal_brute) - accursed.adjustFireLoss(-heal_burn) - accursed.adjustOxyLoss(-heal_oxy) - -/obj/item/organ/internal/heart/cursed/on_life(seconds_per_tick, times_fired) - if(!owner.client || !ishuman(owner)) // Let's be fair, if you're not here to pump, you're not here to suffer. - last_pump = world.time - return - - if(world.time <= (last_pump + pump_delay)) - return - - var/mob/living/carbon/human/accursed = owner - if(HAS_TRAIT(accursed, TRAIT_NOBLOOD) || !accursed.dna) - return - - accursed.blood_volume = max(accursed.blood_volume - blood_loss, 0) - to_chat(accursed, span_userdanger("You have to keep pumping your blood!")) - if(add_colour) - accursed.add_client_colour(/datum/client_colour/cursed_heart_blood) //bloody screen so real - add_colour = FALSE - /obj/item/organ/internal/heart/cursed/on_insert(mob/living/carbon/accursed) . = ..() - last_pump = world.time // give them time to react - to_chat(accursed, span_userdanger("Your heart has been replaced with a cursed one, you have to pump this one manually otherwise you'll die!")) + accursed.AddComponent(/datum/component/manual_heart, pump_delay = pump_delay, blood_loss = blood_loss, heal_brute = heal_brute, heal_burn = heal_burn, heal_oxy = heal_oxy) /obj/item/organ/internal/heart/cursed/Remove(mob/living/carbon/accursed, special = FALSE) . = ..() - accursed.remove_client_colour(/datum/client_colour/cursed_heart_blood) - -/datum/action/item_action/organ_action/cursed_heart - name = "Pump your blood" - check_flags = NONE - -//You are now brea- pumping blood manually -/datum/action/item_action/organ_action/cursed_heart/Trigger(trigger_flags) - . = ..() - if(!.) - return - - var/obj/item/organ/internal/heart/cursed/cursed_heart = target - if(!istype(cursed_heart)) - CRASH("Cursed heart pump action created on non-cursed heart!") - cursed_heart.on_pump(owner) - -/datum/client_colour/cursed_heart_blood - priority = 100 //it's an indicator you're dying, so it's very high priority - colour = "#FF0000" + qdel(accursed.GetComponent(/datum/component/manual_heart)) /obj/item/organ/internal/heart/cybernetic name = "basic cybernetic heart" diff --git a/tgstation.dme b/tgstation.dme index 2db2a0deebc..fe09c682d3a 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1116,6 +1116,7 @@ #include "code\datums\components\magnet.dm" #include "code\datums\components\manual_blinking.dm" #include "code\datums\components\manual_breathing.dm" +#include "code\datums\components\manual_heart.dm" #include "code\datums\components\mind_linker.dm" #include "code\datums\components\mirv.dm" #include "code\datums\components\mob_harvest.dm" From 9c7be7d6bc5cfafb943a835ad7cdcad681fe85df Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 4 Oct 2023 07:00:40 +0200 Subject: [PATCH 18/49] Adds The Hand of Midas, an ancient Egyptian gun. [MDB IGNORE] (#24105) * Adds The Hand of Midas, an ancient Egyptian gun. (#78699) ## About The Pull Request Adds the Hand of Midas (HoM), a weapon for pirate captains. This matchlock pistol is powered by gold rather than gunpowder. If you hit someone with it, they will be afflicted with Midas Blight for a duration of time that scales with how much gold is in your gun. Midas Blight will slowly turn their blood into gold, and slow them down depending on how much blood is in their system. If you right-click on someone with the HoM, it will siphon all gold from their bloodstream and recharge the gun, curing them of Midas Blight in the process if they still have it. The amount of gold you can get from people is meant to be ~1.5x as much as you fired into them in the first place, if you get your timing right. This way you can exponentially scale the power of your weapon if you can hit your shots, with a limit of 30 Seconds on the Blight timer. The siphon has a range of 2 meters, and if you miss a shot you can input a gold coin into the gun to refill it with the same weak shot you started with. It's a little hard to explain in text so here's some video examples: https://github.com/tgstation/tgstation/assets/66052067/d49238fc-beb2-4ba9-be0c-83e8a701c995 https://github.com/tgstation/tgstation/assets/66052067/34dc23e7-2b88-4ee9-bb1e-c8067a491975 https://github.com/tgstation/tgstation/assets/66052067/68a07426-ba6c-43a7-8228-132fc4b02b83 ## Why It's Good For The Game Honestly I just had the idea for the gun and thought it would be really cool lmao. Also because Barrel Behind the Door is one of the funniest YuGiOh cards, the censored design is TOO GOOD. ![image](https://github.com/tgstation/tgstation/assets/66052067/7c930287-410d-43bd-8731-0f7224b9f049) ## Changelog :cl: Wallem add: Adds The Hand of Midas, an ancient Egyptian matchlock pistol. /:cl: * Adds The Hand of Midas, an ancient Egyptian gun. --------- Co-authored-by: Wallem <66052067+Wallemations@users.noreply.github.com> --- code/__DEFINES/actionspeed_modification.dm | 2 + code/__DEFINES/movespeed_modification.dm | 2 + code/datums/status_effects/debuffs/debuffs.dm | 66 +++++++++ .../objects/structures/petrified_statue.dm | 4 +- .../actionspeed/modifiers/status_effects.dm | 16 ++ .../antagonists/pirate/pirate_outfits.dm | 6 + .../antagonists/pirate/pirate_roles.dm | 2 +- .../movespeed/modifiers/status_effects.dm | 16 ++ .../projectiles/guns/special/hand_of_midas.dm | 138 ++++++++++++++++++ .../chemistry/reagents/other_reagents.dm | 5 + icons/effects/beam.dmi | Bin 129707 -> 130364 bytes icons/hud/screen_alert.dmi | Bin 144663 -> 145559 bytes icons/mob/effects/debuff_overlays.dmi | Bin 0 -> 248 bytes icons/obj/weapons/guns/magic.dmi | Bin 20090 -> 20735 bytes tgstation.dme | 1 + 15 files changed, 256 insertions(+), 2 deletions(-) create mode 100644 code/modules/projectiles/guns/special/hand_of_midas.dm create mode 100644 icons/mob/effects/debuff_overlays.dmi diff --git a/code/__DEFINES/actionspeed_modification.dm b/code/__DEFINES/actionspeed_modification.dm index c3d288e907f..1753105f127 100644 --- a/code/__DEFINES/actionspeed_modification.dm +++ b/code/__DEFINES/actionspeed_modification.dm @@ -1,3 +1,5 @@ //ids #define ACTIONSPEED_ID_SANITY "sanity_component" #define ACTIONSPEED_ID_STIMULANTS "stimulant_withdrawal" + +#define ACTIONSPEED_ID_MIDAS_BLIGHT "midas_blight_debuff" diff --git a/code/__DEFINES/movespeed_modification.dm b/code/__DEFINES/movespeed_modification.dm index c4300d96606..23c600aae70 100644 --- a/code/__DEFINES/movespeed_modification.dm +++ b/code/__DEFINES/movespeed_modification.dm @@ -11,3 +11,5 @@ #define MOVESPEED_ID_MOB_GRAB_STATE "mob_grab_state" #define MOVESPEED_ID_MOB_WALK_RUN "mob_walk_run" + +#define MOVESPEED_ID_MIDAS_BLIGHT "midas_blight_debuff" diff --git a/code/datums/status_effects/debuffs/debuffs.dm b/code/datums/status_effects/debuffs/debuffs.dm index 378fa4ebf29..ff3e1762074 100644 --- a/code/datums/status_effects/debuffs/debuffs.dm +++ b/code/datums/status_effects/debuffs/debuffs.dm @@ -970,5 +970,71 @@ /datum/movespeed_modifier/careful_driving multiplicative_slowdown = 3 +/datum/status_effect/midas_blight + id = "midas_blight" + alert_type = /atom/movable/screen/alert/status_effect/midas_blight + status_type = STATUS_EFFECT_REPLACE + tick_interval = 0.2 SECONDS + remove_on_fullheal = TRUE + + /// The visual overlay state, helps tell both you and enemies how much gold is in your system + var/midas_state = "midas_1" + /// How fast the gold in a person's system scales. + var/goldscale = 30 // x2.8 - Gives ~ 15u for 1 second + +/datum/status_effect/midas_blight/on_creation(mob/living/new_owner, duration = 1) + // Duration is already input in SECONDS + src.duration = duration + RegisterSignal(new_owner, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_update_overlays)) + return ..() + +/atom/movable/screen/alert/status_effect/midas_blight + name = "Midas Blight" + desc = "Your blood is being turned to gold, slowing your movements!" + icon_state = "midas_blight" + +/datum/status_effect/midas_blight/tick(seconds_between_ticks) + var/mob/living/carbon/human/victim = owner + // We're transmuting blood, time to lose some. + if(victim.blood_volume > BLOOD_VOLUME_SURVIVE + 50 && !HAS_TRAIT(victim, TRAIT_NOBLOOD)) + victim.blood_volume -= 5 * seconds_between_ticks + // This has been hell to try and balance so that you'll actually get anything out of it + victim.reagents.add_reagent(/datum/reagent/gold/cursed, amount = seconds_between_ticks * goldscale, no_react = TRUE) + var/current_gold_amount = victim.reagents.get_reagent_amount(/datum/reagent/gold, include_subtypes = TRUE) + switch(current_gold_amount) + if(-INFINITY to 50) + victim.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/midas_blight/soft, update = TRUE) + victim.add_actionspeed_modifier(/datum/actionspeed_modifier/status_effect/midas_blight/soft, update = TRUE) + midas_state = "midas_1" + if(50 to 100) + victim.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/midas_blight/medium, update = TRUE) + victim.add_actionspeed_modifier(/datum/actionspeed_modifier/status_effect/midas_blight/medium, update = TRUE) + midas_state = "midas_2" + if(100 to 200) + victim.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/midas_blight/hard, update = TRUE) + victim.add_actionspeed_modifier(/datum/actionspeed_modifier/status_effect/midas_blight/hard, update = TRUE) + midas_state = "midas_3" + if(200 to INFINITY) + victim.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/midas_blight/gold, update = TRUE) + victim.add_actionspeed_modifier(/datum/actionspeed_modifier/status_effect/midas_blight/gold, update = TRUE) + midas_state = "midas_4" + victim.update_icon() + if(victim.stat == DEAD) + qdel(src) // Dead people stop being turned to gold. Don't want people sitting on dead bodies. + +/datum/status_effect/midas_blight/proc/on_update_overlays(atom/parent_atom, list/overlays) + SIGNAL_HANDLER + + if(midas_state) + var/mutable_appearance/midas_overlay = mutable_appearance('icons/mob/effects/debuff_overlays.dmi', midas_state) + midas_overlay.blend_mode = BLEND_MULTIPLY + overlays += midas_overlay + +/datum/status_effect/midas_blight/on_remove() + owner.remove_movespeed_modifier(MOVESPEED_ID_MIDAS_BLIGHT, update = TRUE) + owner.remove_actionspeed_modifier(ACTIONSPEED_ID_MIDAS_BLIGHT, update = TRUE) + UnregisterSignal(owner, COMSIG_ATOM_UPDATE_OVERLAYS) + owner.update_icon() + #undef HEALING_SLEEP_DEFAULT #undef HEALING_SLEEP_ORGAN_MULTIPLIER diff --git a/code/game/objects/structures/petrified_statue.dm b/code/game/objects/structures/petrified_statue.dm index 78bd478d523..54896c2e414 100644 --- a/code/game/objects/structures/petrified_statue.dm +++ b/code/game/objects/structures/petrified_statue.dm @@ -94,7 +94,7 @@ /mob/proc/petrify(statue_timer) -/mob/living/carbon/human/petrify(statue_timer, save_brain) +/mob/living/carbon/human/petrify(statue_timer, save_brain, colorlist) if(!isturf(loc)) return FALSE var/obj/structure/statue/petrified/S = new(loc, src, statue_timer, save_brain) @@ -102,6 +102,8 @@ ADD_TRAIT(src, TRAIT_NOBLOOD, MAGIC_TRAIT) S.copy_overlays(src) var/newcolor = list(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) + if(colorlist) + newcolor = colorlist S.add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY) return TRUE diff --git a/code/modules/actionspeed/modifiers/status_effects.dm b/code/modules/actionspeed/modifiers/status_effects.dm index fa080edb8d0..ec7b0dba22e 100644 --- a/code/modules/actionspeed/modifiers/status_effects.dm +++ b/code/modules/actionspeed/modifiers/status_effects.dm @@ -12,3 +12,19 @@ /datum/actionspeed_modifier/status_effect/hazard_area multiplicative_slowdown = 4 + +/// Get slower the more gold is in your system. +/datum/actionspeed_modifier/status_effect/midas_blight + id = ACTIONSPEED_ID_MIDAS_BLIGHT + +/datum/actionspeed_modifier/status_effect/midas_blight/soft + multiplicative_slowdown = 0.25 + +/datum/actionspeed_modifier/status_effect/midas_blight/medium + multiplicative_slowdown = 0.75 + +/datum/actionspeed_modifier/status_effect/midas_blight/hard + multiplicative_slowdown = 1.5 + +/datum/actionspeed_modifier/status_effect/midas_blight/gold + multiplicative_slowdown = 2 diff --git a/code/modules/antagonists/pirate/pirate_outfits.dm b/code/modules/antagonists/pirate/pirate_outfits.dm index d2f648bb1fd..4c73cac107f 100644 --- a/code/modules/antagonists/pirate/pirate_outfits.dm +++ b/code/modules/antagonists/pirate/pirate_outfits.dm @@ -36,6 +36,12 @@ id_trim = /datum/id_trim/pirate/captain head = /obj/item/clothing/head/costume/pirate/armored +/datum/outfit/pirate/captain/skeleton + name = "Space Pirate Captain (Skeleton)" + + belt = /obj/item/gun/magic/midas_hand + l_pocket = /obj/item/coin/gold/doubloon + /datum/outfit/pirate/space name = "Space Pirate (EVA)" diff --git a/code/modules/antagonists/pirate/pirate_roles.dm b/code/modules/antagonists/pirate/pirate_roles.dm index 68683333c49..64baa724db1 100644 --- a/code/modules/antagonists/pirate/pirate_roles.dm +++ b/code/modules/antagonists/pirate/pirate_roles.dm @@ -61,7 +61,7 @@ /obj/effect/mob_spawn/ghost_role/human/pirate/skeleton/captain rank = "Captain" - outfit = /datum/outfit/pirate/captain + outfit = /datum/outfit/pirate/captain/skeleton /obj/effect/mob_spawn/ghost_role/human/pirate/skeleton/gunner rank = "Gunner" diff --git a/code/modules/movespeed/modifiers/status_effects.dm b/code/modules/movespeed/modifiers/status_effects.dm index e8aad88c50d..65245880ef4 100644 --- a/code/modules/movespeed/modifiers/status_effects.dm +++ b/code/modules/movespeed/modifiers/status_effects.dm @@ -37,3 +37,19 @@ /datum/movespeed_modifier/status_effect/tired_post_charge multiplicative_slowdown = 3 + +/// Get slower the more gold is in your system. +/datum/movespeed_modifier/status_effect/midas_blight + id = MOVESPEED_ID_MIDAS_BLIGHT + +/datum/movespeed_modifier/status_effect/midas_blight/soft + multiplicative_slowdown = 0.25 + +/datum/movespeed_modifier/status_effect/midas_blight/medium + multiplicative_slowdown = 0.75 + +/datum/movespeed_modifier/status_effect/midas_blight/hard + multiplicative_slowdown = 1.5 + +/datum/movespeed_modifier/status_effect/midas_blight/gold + multiplicative_slowdown = 2 diff --git a/code/modules/projectiles/guns/special/hand_of_midas.dm b/code/modules/projectiles/guns/special/hand_of_midas.dm new file mode 100644 index 00000000000..9907352e3f5 --- /dev/null +++ b/code/modules/projectiles/guns/special/hand_of_midas.dm @@ -0,0 +1,138 @@ +// Hand of Midas + +/obj/item/gun/magic/midas_hand + name = "The Hand of Midas" + desc = "An ancient Egyptian matchlock pistol imbued with the powers of the Greek King Midas. Don't question the cultural or religious implications of this." + ammo_type = /obj/item/ammo_casing/magic/midas_round + icon_state = "midas_hand" + inhand_icon_state = "gun" + worn_icon_state = "gun" + lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + fire_sound = 'sound/weapons/gun/rifle/shot.ogg' + pinless = TRUE + max_charges = 1 + can_charge = FALSE + item_flags = NEEDS_PERMIT + w_class = WEIGHT_CLASS_BULKY // Should fit on a belt. + force = 3 + trigger_guard = TRIGGER_GUARD_NORMAL + antimagic_flags = NONE + can_hold_up = FALSE + + /// The length of the Midas Blight debuff, dependant on the amount of gold reagent we've sucked up. + var/gold_timer = 3 SECONDS + /// The range that we can suck gold out of people's bodies + var/gold_suck_range = 2 + +/obj/item/gun/magic/midas_hand/examine(mob/user) + . = ..() + var/gold_time_converted = gold_time_convert() + . += span_notice("Your next shot will inflict [gold_time_converted] second[gold_time_converted == 1 ? "" : "s"] of Midas Blight.") + . += span_notice("Right-Click on enemies to drain gold from their bloodstreams to reload [src].") + . += span_notice("[src] can be reloaded using gold coins in a pinch.") + +/obj/item/gun/magic/midas_hand/shoot_with_empty_chamber(mob/living/user) + . = ..() + balloon_alert(user, "not enough gold") + +// Siphon gold from a victim, recharging our gun & removing their Midas Blight debuff in the process. +/obj/item/gun/magic/midas_hand/afterattack_secondary(mob/living/victim, mob/living/user, proximity_flag, click_parameters) + if(!isliving(victim) || !IN_GIVEN_RANGE(user, victim, gold_suck_range)) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + if(victim == user) + balloon_alert(user, "can't siphon from self") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + if(!victim.reagents) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + if(!victim.reagents.has_reagent(/datum/reagent/gold, check_subtypes = TRUE)) + balloon_alert(user, "no gold in bloodstream") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + var/gold_beam = user.Beam(victim, icon_state="drain_gold") + if(!do_after(user = user, delay = 1 SECONDS, target = victim, timed_action_flags = (IGNORE_USER_LOC_CHANGE | IGNORE_TARGET_LOC_CHANGE), extra_checks = CALLBACK(src, PROC_REF(check_gold_range), user, victim))) + qdel(gold_beam) + balloon_alert(user, "link broken") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + handle_gold_charges(user, victim.reagents.get_reagent_amount(/datum/reagent/gold, include_subtypes = TRUE)) + victim.reagents.remove_all_type(/datum/reagent/gold, victim.reagents.get_reagent_amount(/datum/reagent/gold, include_subtypes = TRUE)) + victim.remove_status_effect(/datum/status_effect/midas_blight) + qdel(gold_beam) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +// If we botch a shot, we have to start over again by inserting gold coins into the gun. Can only be done if it has no charges or gold. +/obj/item/gun/magic/midas_hand/attackby(obj/item/I, mob/living/user, params) + . = ..() + if(charges || gold_timer) + balloon_alert(user, "already loaded") + return + if(istype(I, /obj/item/coin/gold)) + handle_gold_charges(user, 1.5 SECONDS) + qdel(I) + +/// Handles recharging & inserting gold amount +/obj/item/gun/magic/midas_hand/proc/handle_gold_charges(user, gold_amount) + gold_timer += gold_amount + var/gold_time_converted = gold_time_convert() + balloon_alert(user, "[gold_time_converted] second[gold_time_converted == 1 ? "" : "s"]") + if(!charges) + instant_recharge() + +/// Converts our gold_timer to time in seconds, for various ballons/examines +/obj/item/gun/magic/midas_hand/proc/gold_time_convert() + return min(30 SECONDS, round(gold_timer, 0.2)) / 10 + +/// Checks our range to the person we're sucking gold out of. Double the initial range, so you need to get in close to start. +/obj/item/gun/magic/midas_hand/proc/check_gold_range(mob/living/user, mob/living/victim) + return IN_GIVEN_RANGE(user, victim, gold_suck_range*2) + +/obj/item/ammo_casing/magic/midas_round + projectile_type = /obj/projectile/magic/midas_round + + +/obj/projectile/magic/midas_round + name = "gold pellet" + desc = "A typical flintlock ball, save for the fact it's made of cursed Egyptian gold." + damage_type = BRUTE + damage = 10 + stamina = 20 + armour_penetration = 50 + hitsound = 'sound/effects/coin2.ogg' + icon_state = "pellet" + color = "#FFD700" + /// The gold charge in this pellet + var/gold_charge = 0 + + +/obj/projectile/magic/midas_round/fire(setAngle) + /// Transfer the gold energy to our bullet + var/obj/item/gun/magic/midas_hand/my_gun = fired_from + gold_charge = my_gun.gold_timer + my_gun.gold_timer = 0 + ..() + +// Gives human targets Midas Blight. +/obj/projectile/magic/midas_round/on_hit(atom/target) + . = ..() + if(ishuman(target)) + var/mob/living/carbon/human/my_guy = target + if(isskeleton(my_guy)) // No cheap farming + return + my_guy.apply_status_effect(/datum/status_effect/midas_blight, min(30 SECONDS, round(gold_charge, 0.2))) // 100u gives 10 seconds + return + +/obj/item/gun/magic/midas_hand/suicide_act(mob/living/user) + if(!ishuman(user)) + return + + var/mob/living/carbon/human/victim = user + victim.visible_message(span_suicide("[victim] holds the barrel of [src] to [victim.p_their()] head, lighting the fuse. It looks like [user.p_theyre()] trying to commit suicide!")) + if(!do_after(victim, 1.5 SECONDS)) + return + playsound(src, 'sound/weapons/gun/rifle/shot.ogg', 75, TRUE) + to_chat(victim, span_danger("You don't even have the time to register the gunshot by the time your body has completely converted into a golden statue.")) + var/newcolors = list(rgb(206, 164, 50), rgb(146, 146, 139), rgb(28,28,28), rgb(0,0,0)) + victim.petrify(statue_timer = INFINITY, save_brain = FALSE, colorlist = newcolors) + playsound(victim, 'sound/effects/coin2.ogg', 75, TRUE) + charges = 0 + gold_timer = 0 + return OXYLOSS diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 75780f65fc7..5e1d7b849e6 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -3056,3 +3056,8 @@ . = UPDATE_MOB_HEALTH if(SPT_PROB(10, seconds_per_tick)) affected_mob.emote(pick("twitch","choke","shiver","gag")) + +// The same as gold just with a slower metabolism rate, to make using the Hand of Midas easier. +/datum/reagent/gold/cursed + name = "Cursed Gold" + metabolization_rate = 0.2 * REAGENTS_METABOLISM diff --git a/icons/effects/beam.dmi b/icons/effects/beam.dmi index ae695c3227f3de4b51e2f276576fd6d8d66b83c2..12e3ce9f7d59462203cda9a18059375e6cffa277 100644 GIT binary patch delta 10844 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 delta 10164 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 JwK8U*{|8(`=A{4t delta 27515 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 literal 0 HcmV?d00001 diff --git a/icons/obj/weapons/guns/magic.dmi b/icons/obj/weapons/guns/magic.dmi index fe3eb6ae895f63bd4819a7552f3d08a3b7ff8428..7cab0cdfc25926e130fda5c4728ecd70ca7c7b75 100644 GIT binary patch literal 20735 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
Game Panel

" if(SSticker.current_state <= GAME_STATE_PREGAME) + dat += "(Manage Dynamic Rulesets)
" dat += "(Force Roundstart Rulesets)
" if (GLOB.dynamic_forced_roundstart_ruleset.len > 0) for(var/datum/dynamic_ruleset/roundstart/rule in GLOB.dynamic_forced_roundstart_ruleset) @@ -30,6 +31,8 @@ dat += "
" if(SSticker.IsRoundInProgress()) dat += "(Game Mode Panel)
" + if(istype(SSticker.mode, /datum/game_mode/dynamic)) + dat += "(Manage Dynamic Rulesets)
" dat += {"
Create Object
@@ -143,6 +146,111 @@ user << browse(dat, "window=dyn_mode_options;size=900x650") +/datum/admins/proc/dynamic_ruleset_manager(mob/user) + if (SSticker.current_state > GAME_STATE_PREGAME && !istype(SSticker.mode, /datum/game_mode/dynamic)) + return // Not running dynamic + + var/dat = "

Dynamic Ruleset Management


\ + Change these options to forcibly enable or disable dynamic rulesets.
\ + Disabled rulesets will never run, even if they would otherwise be valid.
\ + Enabled rulesets will run even if the qualifying minimum of threat or player count is not present, this does not guarantee that they will necessarily be chosen (for example their weight may be set to 0 in config).
\ + \[force enable all / \ + force disable all / \ + reset all\]" + + if (SSticker.current_state <= GAME_STATE_PREGAME) // Don't bother displaying after the round has started + var/static/list/rulesets_by_context = list() + if (!length(rulesets_by_context)) + for (var/datum/dynamic_ruleset/rule as anything in subtypesof(/datum/dynamic_ruleset)) + if (initial(rule.name) == "") + continue + LAZYADD(rulesets_by_context[initial(rule.ruletype)], rule) + + dat += dynamic_ruleset_category_pre_start_display("Roundstart", rulesets_by_context[ROUNDSTART_RULESET]) + dat += dynamic_ruleset_category_pre_start_display("Latejoin", rulesets_by_context[LATEJOIN_RULESET]) + dat += dynamic_ruleset_category_pre_start_display("Midround", rulesets_by_context[MIDROUND_RULESET]) + user << browse(dat, "window=dyn_mode_options;size=900x650") + return + + var/datum/game_mode/dynamic/current_mode = SSticker.mode + var/pop_count = length(GLOB.alive_player_list) + var/threat_level = current_mode.threat_level + dat += dynamic_ruleset_category_during_round_display("Latejoin", current_mode.latejoin_rules, pop_count, threat_level) + dat += dynamic_ruleset_category_during_round_display("Midround", current_mode.midround_rules, pop_count, threat_level) + user << browse(dat, "window=dyn_mode_options;size=900x650") + +/datum/admins/proc/dynamic_ruleset_category_pre_start_display(title, list/rules) + var/dat = "

[title]

" + for (var/datum/dynamic_ruleset/rule as anything in rules) + var/forced = GLOB.dynamic_forced_rulesets[rule] || RULESET_NOT_FORCED + var/color = COLOR_BLACK + switch (forced) + if (RULESET_FORCE_ENABLED) + color = COLOR_GREEN + if (RULESET_FORCE_DISABLED) + color = COLOR_RED + dat += "" + dat += "
[initial(rule.name)]\[[forced]\]\[\ + force enabled /\ + force disabled /\ + reset\]
" + return dat + +/datum/admins/proc/dynamic_ruleset_category_during_round_display(title, list/rules, pop_count, threat_level) + var/dat = "

[title]

" + for (var/datum/dynamic_ruleset/rule as anything in rules) + var/active = rule.acceptable(population = pop_count, threat_level = threat_level) && rule.weight > 0 + var/forced = GLOB.dynamic_forced_rulesets[rule.type] || RULESET_NOT_FORCED + var/color = (active) ? COLOR_GREEN : COLOR_RED + var/explanation = "" + if (!active) + if (rule.weight <= 0) + explanation = " - Weight is zero" + else if (forced == RULESET_FORCE_DISABLED) + explanation = " - Forcibly disabled" + else if (forced == RULESET_FORCE_ENABLED) + explanation = " - Failed spawn conditions" + else if (!rule.is_valid_population(pop_count)) + explanation = " - Invalid player count" + else if (!rule.is_valid_threat(pop_count, threat_level)) + explanation = " - Insufficient threat" + else + explanation = " - Failed spawn conditions" + else if (forced == RULESET_FORCE_ENABLED) + explanation = " - Forcibly enabled" + active = active ? "Active" : "Inactive" + + dat += "\ + \ + " + dat += "
[rule.name]\[Weight : [rule.weight]\]\ + \[[active][explanation]\]\[\ + force enabled /\ + force disabled /\ + reset\]\[VV\]
" + return dat + + +/datum/admins/proc/force_all_rulesets(mob/user, force_value) + if (force_value == RULESET_NOT_FORCED) + GLOB.dynamic_forced_rulesets = list() + else + for (var/datum/dynamic_ruleset/rule as anything in subtypesof(/datum/dynamic_ruleset)) + GLOB.dynamic_forced_rulesets[rule] = force_value + var/logged_message = "[key_name(user)] set all dynamic rulesets to [force_value]." + log_admin(logged_message) + message_admins(logged_message) + dynamic_ruleset_manager(user) + +/datum/admins/proc/set_dynamic_ruleset_forced(mob/user, datum/dynamic_ruleset/type, force_value) + if (isnull(type)) + return + GLOB.dynamic_forced_rulesets[type] = force_value + dynamic_ruleset_manager(user) + var/logged_message = "[key_name(user)] set '[initial(type.name)] ([initial(type.ruletype)])' to [GLOB.dynamic_forced_rulesets[type]]." + log_admin(logged_message) + message_admins(logged_message) + /datum/admins/proc/create_or_modify_area() set category = "Debug" set name = "Create or modify area" diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 9db6585799f..c4c09b51adf 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -465,6 +465,39 @@ log_admin("[key_name(usr)] removed [rule] from the forced roundstart rulesets.") message_admins("[key_name(usr)] removed [rule] from the forced roundstart rulesets.", 1) + else if (href_list["f_dynamic_ruleset_manage"]) + if(!check_rights(R_ADMIN)) + return + dynamic_ruleset_manager(usr) + else if (href_list["f_dynamic_ruleset_force_all_on"]) + if(!check_rights(R_ADMIN)) + return + force_all_rulesets(usr, RULESET_FORCE_ENABLED) + else if (href_list["f_dynamic_ruleset_force_all_off"]) + if(!check_rights(R_ADMIN)) + return + force_all_rulesets(usr, RULESET_FORCE_DISABLED) + else if (href_list["f_dynamic_ruleset_force_all_reset"]) + if(!check_rights(R_ADMIN)) + return + force_all_rulesets(usr, RULESET_NOT_FORCED) + else if (href_list["f_dynamic_ruleset_force_on"]) + if(!check_rights(R_ADMIN)) + return + set_dynamic_ruleset_forced(usr, locate(href_list["f_dynamic_ruleset_force_on"]), RULESET_FORCE_ENABLED) + else if (href_list["f_dynamic_ruleset_force_off"]) + if(!check_rights(R_ADMIN)) + return + set_dynamic_ruleset_forced(usr, locate(href_list["f_dynamic_ruleset_force_off"]), RULESET_FORCE_DISABLED) + else if (href_list["f_dynamic_ruleset_force_reset"]) + if(!check_rights(R_ADMIN)) + return + set_dynamic_ruleset_forced(usr, locate(href_list["f_dynamic_ruleset_force_reset"]), RULESET_NOT_FORCED) + else if (href_list["f_inspect_ruleset"]) + if(!check_rights(R_ADMIN)) + return + usr.client.debug_variables(locate(href_list["f_inspect_ruleset"])) + else if (href_list["f_dynamic_options"]) if(!check_rights(R_ADMIN)) return From 3140cccd02860bc0c6950c44029b4395ff4eadc8 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 4 Oct 2023 07:04:43 +0200 Subject: [PATCH 20/49] Rule Of Cool: Nukie Hallway Mosiac [MDB IGNORE] (#24095) * Rule Of Cool: Nukie Hallway Mosiac (#78726) ## About The Pull Request Quick history lesson, yes, seriously, this is backstory for this goofy PR that affects a *single line of tiles*: near the start of this year I was asked to help work on a project for here that, to my knowledge, is all but canned now(?) - more specifically, I was asked to [remap the nukie base](https://cdn.discordapp.com/attachments/927814428882251776/1070593334269190175/image.png), a project I didn't get too particularly far into before things went quiet. Up at the top-right there you can see I was starting to experiment with some, quote, "sick-ass designs" using the syndicate emblem turf decal, which later became [this.](https://cdn.discordapp.com/attachments/1040395260922183700/1158248386537996350/image.png) Not anything all too impressive, but it was still fun to work on (special shoutout to putting the assault pod into a implied slinglauncher, that was cool as fuck) - that all said, I recently *remembered* that exercise... which's led to this PR. ### So what does this PR **actually** do? Simple. Edits this single line of tiles to have a neat, snaking design on 'em. Yyyyep. That's it. ![image](https://github.com/tgstation/tgstation/assets/50649185/4d00fd35-0bb5-4d44-9efa-56db302dc1e1) ## Why It's Good For The Game Honestly it's just pretty neat looking. On a related note from my experimentation, if we ever get diagonal trimline turf decals, you could pretty easily repurpose the `syndicateemblem/top/left` decal to make a little Interdyne Pharmaceuticals logo following the design on the shipping containers. ## Changelog :cl: add: The funds the syndicate have been saving by restricting galley access has been suddenly funneled into a singular mosaic pattern in the experiments wing. /:cl: * Rule Of Cool: Nukie Hallway Mosiac --------- Co-authored-by: BluBerry016 <50649185+unit0016@users.noreply.github.com> --- _maps/templates/lazy_templates/nukie_base.dmm | 163 ++++++++++++++++-- 1 file changed, 145 insertions(+), 18 deletions(-) diff --git a/_maps/templates/lazy_templates/nukie_base.dmm b/_maps/templates/lazy_templates/nukie_base.dmm index 68913efe70d..d6e8dcfc607 100644 --- a/_maps/templates/lazy_templates/nukie_base.dmm +++ b/_maps/templates/lazy_templates/nukie_base.dmm @@ -210,6 +210,9 @@ /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 4 }, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/control) "cT" = ( @@ -696,6 +699,16 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/centcom/syndicate_mothership/control) +"hX" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark/corner{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) "ia" = ( /obj/structure/rack, /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -937,6 +950,7 @@ dir = 9 }, /obj/structure/sign/poster/contraband/gorlex_recruitment/directional/north, +/obj/effect/turf_decal/siding/thinplating_new/dark/corner, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/control) "kU" = ( @@ -1155,6 +1169,10 @@ /obj/effect/turf_decal/stripes/full, /turf/open/floor/mineral/titanium/yellow, /area/centcom/syndicate_mothership/control) +"nF" = ( +/obj/effect/turf_decal/syndicateemblem/top/middle, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/control) "nH" = ( /obj/effect/turf_decal/siding/thinplating_new/dark, /obj/structure/closet/syndicate/personal, @@ -1740,6 +1758,9 @@ }, /obj/structure/extinguisher_cabinet/directional/east, /obj/structure/sign/poster/contraband/gorlex_recruitment/directional/south, +/obj/effect/turf_decal/siding/thinplating_new/dark/corner{ + dir = 1 + }, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/control) "um" = ( @@ -1778,6 +1799,12 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/centcom/syndicate_mothership/control) +"ve" = ( +/obj/effect/turf_decal/syndicateemblem/top/middle{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/control) "vv" = ( /obj/structure/table/reinforced, /obj/item/paper/fluff/stations/centcom/disk_memo{ @@ -2042,6 +2069,9 @@ /obj/machinery/camera/autoname/directional/south{ network = list("nukie") }, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/control) "zi" = ( @@ -2134,6 +2164,13 @@ }, /turf/open/misc/ice/icemoon, /area/centcom/syndicate_mothership/control) +"zZ" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) "Ab" = ( /obj/effect/turf_decal/siding/thinplating_new/light{ dir = 8 @@ -2382,6 +2419,9 @@ dir = 10 }, /obj/structure/sign/poster/contraband/energy_swords/directional/west, +/obj/effect/turf_decal/siding/thinplating_new/dark/corner{ + dir = 4 + }, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/control) "CX" = ( @@ -2425,6 +2465,16 @@ /obj/structure/railing, /turf/open/floor/plating/snowed/icemoon, /area/centcom/syndicate_mothership/control) +"DM" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark/corner{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) "DY" = ( /obj/structure/table/wood/poker, /obj/machinery/light/warm/directional/north, @@ -2734,9 +2784,28 @@ }, /turf/open/floor/mineral/titanium/tiled/blue, /area/centcom/syndicate_mothership/control) +"GU" = ( +/obj/effect/turf_decal/syndicateemblem/top/right{ + dir = 1 + }, +/obj/effect/turf_decal/syndicateemblem/top/left{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/control) "Hc" = ( /turf/open/floor/plating/icemoon, /area/centcom/syndicate_mothership/control) +"Hm" = ( +/obj/effect/turf_decal/syndicateemblem/bottom/middle{ + dir = 8 + }, +/obj/effect/turf_decal/syndicateemblem/top/left, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/control) "Ho" = ( /obj/effect/light_emitter{ set_cap = 1; @@ -2972,6 +3041,9 @@ "JL" = ( /obj/machinery/light/cold/directional/south, /obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/control) "JR" = ( @@ -2996,6 +3068,11 @@ /obj/effect/turf_decal/siding/purple, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"JX" = ( +/obj/effect/turf_decal/syndicateemblem/top/right, +/obj/effect/turf_decal/syndicateemblem/top/left, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/control) "Ka" = ( /obj/structure/chair/sofa/bench/right{ dir = 4 @@ -3408,6 +3485,9 @@ /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 }, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 + }, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/control) "Ox" = ( @@ -3438,6 +3518,16 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/centcom/syndicate_mothership/control) +"OM" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/effect/turf_decal/siding/thinplating_new/dark/corner{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) "OO" = ( /obj/item/gun/energy/ionrifle, /obj/structure/rack, @@ -3833,6 +3923,14 @@ "To" = ( /turf/open/misc/asteroid/snow/icemoon, /area/centcom/syndicate_mothership/control) +"Ts" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/effect/turf_decal/siding/thinplating_new/dark/corner, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) "Tw" = ( /obj/machinery/door/airlock/hatch{ name = "Gangway" @@ -3912,6 +4010,15 @@ /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership) "TY" = ( +/obj/effect/turf_decal/syndicateemblem/bottom/middle{ + dir = 4 + }, +/obj/effect/turf_decal/syndicateemblem/top/left{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 + }, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/control) "Un" = ( @@ -3944,6 +4051,16 @@ /obj/machinery/light/cold/directional/east, /turf/open/floor/plating, /area/centcom/syndicate_mothership/control) +"Va" = ( +/obj/effect/turf_decal/syndicateemblem/middle/left{ + dir = 8 + }, +/obj/effect/turf_decal/syndicateemblem/middle/left{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/control) "Vm" = ( /obj/structure/flora/rock/pile/style_random, /turf/open/misc/asteroid/snow/icemoon, @@ -3952,6 +4069,9 @@ /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 5 }, +/obj/effect/turf_decal/siding/thinplating_new/dark/corner{ + dir = 8 + }, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/control) "VC" = ( @@ -4340,6 +4460,13 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/centcom/syndicate_mothership/control) +"ZI" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) "ZL" = ( /obj/structure/flora/grass/both/style_random, /obj/structure/flora/rock/icy/style_random, @@ -5252,9 +5379,9 @@ yf yf na PD -zE -TY -lt +OM +Hm +DM ws Wz KL @@ -5354,9 +5481,9 @@ Ge Ge Ge xf -zE -TY -lt +ZI +nF +zZ ZO JJ mb @@ -5456,8 +5583,8 @@ Jf eu hN PD -zE -TY +ZI +JX yP RD RD @@ -5558,8 +5685,8 @@ nQ nQ nQ nQ -zE -TY +ZI +Va JL RD SD @@ -5660,9 +5787,9 @@ yK Ht In VK -zE -TY -lt +ZI +GU +zZ FM wM ee @@ -5762,9 +5889,9 @@ Zg pU lt XQ -zE -TY -lt +ZI +ve +zZ Lu ae ae @@ -5864,9 +5991,9 @@ rS iH Bn VK -zE +Ts TY -lt +hX FM iL mB From eccc7d786f566a2f251150c0ec305ad60700c5ab Mon Sep 17 00:00:00 2001 From: Name Date: Wed, 4 Oct 2023 01:12:14 -0400 Subject: [PATCH 21/49] TG Aesthetic Revert (#24080) * Revert Crates * Revert Air Alarms * Fire Alarm TG * Oops I forgorted wrapped cratez * Nineteen Crate-y Four --- .../aesthetics/airalarm/code/airalarm.dm | 3 +-- .../aesthetics/firealarm/icons/firealarm.dmi | Bin 15111 -> 9168 bytes 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/modular_skyrat/modules/aesthetics/airalarm/code/airalarm.dm b/modular_skyrat/modules/aesthetics/airalarm/code/airalarm.dm index f3675f8e226..6792118bbaa 100644 --- a/modular_skyrat/modules/aesthetics/airalarm/code/airalarm.dm +++ b/modular_skyrat/modules/aesthetics/airalarm/code/airalarm.dm @@ -1,6 +1,5 @@ /obj/machinery/airalarm - icon = 'modular_skyrat/modules/aesthetics/airalarm/icons/airalarm.dmi' - var/light_mask = "alarm-light-mask" + icon = 'icons/obj/machines/wallmounts.dmi' /obj/machinery/airalarm/update_appearance(updates) . = ..() diff --git a/modular_skyrat/modules/aesthetics/firealarm/icons/firealarm.dmi b/modular_skyrat/modules/aesthetics/firealarm/icons/firealarm.dmi index 20adc064d3254fe78aaa892379d279f220d04df7..ce8c37b6004928c46f400573414372d33ea7d958 100644 GIT binary patch literal 9168 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 literal 15111 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 Qo)6MJVsJQH>)eh10+bc?xBvhE From 04e5be4d1aa881c0f99d183a9aadced39923af5e Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 4 Oct 2023 08:13:40 +0200 Subject: [PATCH 22/49] Audits placement of maintenance helpers in non-maintenance places [MDB IGNORE] (#24102) * [MDB Ignore] Audits placement of maintenance helpers in non-maintenance places (#78707) ## About The Pull Request I went through every map and removed `generic_maintenance_landmarks` from ares which were not ostensibly maintenance. For the most part, this meant removing maintenance spawns from morgues and incinerators, but some maps (such as Tramstation or Metastation) had maintenance landmarks in more overt places such as "security evidence", dorms rooms, or tech storage. To compensate, I also went through and added quite a few. In adding some, I added a fair bit of ventilation to some map maintenance systems. Icebox, for example, had almost no scrubbers or vents in (older) maintenance areas. ## Why It's Good For The Game Why are they called "maintenance spawners" if we have some in non-maintenance? More seriously, we spawn quite a few antagonists on maintenance spawnpoints that rely on stealth. - Paradox Clones - Morphs - Fugitives - Nightmares (Only in darkness) - Spiders (Only in darkness So, by having these spawnpoints placed in locations that can feasibly have players around consistently, such as the morgue (coroner), dorms, or security, there's a non-zero chance that we end up spawning antags right in front of people, which is not ideal. Or worse, we can get antags stuck in places they shouldn't be. Spawning a Paradox Clone in tech storage, for example, is not preferred. ## Changelog :cl: Melbert qol: Moved a lot of maintenance spawnpoints out of non-maintenance rooms. Some antags (paradox clone, fugitives, nightmares, spiders) are now less likely to spawn in obvious places like the morgue, tech storage, or dorms rooms. /:cl: * [MDB Ignore] Audits placement of maintenance helpers in non-maintenance places --------- Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> --- _maps/map_files/Birdshot/birdshot.dmm | 546 +++++- .../map_files/Deltastation/DeltaStation2.dmm | 328 ++-- .../map_files/IceBoxStation/IceBoxStation.dmm | 1463 ++++++++++------- _maps/map_files/MetaStation/MetaStation.dmm | 99 +- _maps/map_files/NorthStar/north_star.dmm | 518 +++--- _maps/map_files/tramstation/tramstation.dmm | 187 +-- 6 files changed, 1952 insertions(+), 1189 deletions(-) diff --git a/_maps/map_files/Birdshot/birdshot.dmm b/_maps/map_files/Birdshot/birdshot.dmm index cf218b898be..b6f8d1a4da2 100644 --- a/_maps/map_files/Birdshot/birdshot.dmm +++ b/_maps/map_files/Birdshot/birdshot.dmm @@ -538,6 +538,16 @@ }, /turf/open/floor/iron, /area/station/security) +"akY" = ( +/obj/machinery/door/airlock{ + name = "Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating/rust, +/area/station/maintenance/fore/greater) "akZ" = ( /turf/closed/mineral/random/stationside, /area/space) @@ -808,6 +818,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) +"aqV" = ( +/obj/machinery/door/airlock/glass, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) "aqW" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair/sofa/bench/right{ @@ -2093,6 +2110,7 @@ /turf/closed/wall/r_wall, /area/station/maintenance/department/engine) "aRw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/chapel{ dir = 4 }, @@ -2290,6 +2308,8 @@ /area/station/engineering/supermatter/room) "aUA" = ( /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/smooth_edge, /area/station/maintenance/starboard/greater) "aUQ" = ( @@ -2452,6 +2472,11 @@ }, /turf/open/floor/noslip/tram_platform, /area/station/security/tram) +"aYR" = ( +/obj/structure/broken_flooring/singular/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) "aYY" = ( /obj/structure/flora/bush/flowers_yw/style_random, /turf/open/misc/sandy_dirt, @@ -3111,6 +3136,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/construction) "bmB" = ( @@ -3439,6 +3465,8 @@ }, /area/station/engineering/break_room) "bsI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/smooth_corner{ dir = 4 }, @@ -3696,6 +3724,10 @@ "bxT" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/navigate_destination/dockescpod, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, /turf/open/floor/plating, /area/station/maintenance/starboard/central) "byk" = ( @@ -4373,6 +4405,8 @@ "bJw" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/broken_flooring/singular/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) "bJL" = ( @@ -4548,6 +4582,7 @@ /obj/structure/broken_flooring/pile/directional/east, /obj/effect/decal/cleanable/dirt, /obj/structure/alien/weeds, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) "bNQ" = ( @@ -4955,6 +4990,13 @@ /obj/effect/landmark/start/head_of_security, /turf/open/floor/iron/small, /area/station/security/office) +"bVR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) "bWa" = ( /obj/effect/turf_decal/siding/white{ dir = 10 @@ -5878,6 +5920,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/lesser) +"cpJ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/transit_tube/horizontal, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) "cpP" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -6274,6 +6322,8 @@ dir = 1 }, /obj/structure/broken_flooring/singular/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/hallway/secondary/dock) "cxO" = ( @@ -6726,6 +6776,12 @@ }, /turf/open/floor/iron, /area/station/security) +"cFj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/alien/weeds, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) "cFq" = ( /obj/machinery/door/airlock{ name = "Maintenance" @@ -6770,6 +6826,7 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, /area/station/maintenance/department/engine) "cFR" = ( @@ -7577,6 +7634,7 @@ /area/station/maintenance/department/engine) "cWh" = ( /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/stairs{ dir = 4 }, @@ -8523,6 +8581,8 @@ /obj/structure/disposalpipe/segment, /obj/effect/decal/cleanable/dirt, /obj/structure/broken_flooring/singular/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "doj" = ( @@ -8735,6 +8795,7 @@ "dtq" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) "dty" = ( @@ -8959,6 +9020,7 @@ /area/station/maintenance/department/medical/central) "dxz" = ( /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/fore/greater) "dxG" = ( @@ -9479,6 +9541,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "dHT" = ( @@ -10108,6 +10172,8 @@ /obj/machinery/light/small/directional/south, /obj/structure/alien/weeds, /obj/structure/alien/weeds, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) "dTI" = ( @@ -10696,6 +10762,7 @@ "ecL" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/transit_tube/horizontal, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "ecQ" = ( @@ -10723,6 +10790,9 @@ "edD" = ( /obj/machinery/light/small/directional/west, /obj/item/kirbyplants/random, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) "edJ" = ( @@ -10921,6 +10991,7 @@ /area/station/medical/storage) "egN" = ( /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/chapel, /area/station/maintenance/starboard/greater) "ehj" = ( @@ -12038,6 +12109,12 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/smooth_large, /area/station/science/robotics/mechbay) +"eAo" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/grimy, +/area/station/commons/vacant_room/office) "eAu" = ( /obj/structure/cable, /obj/machinery/power/tracker, @@ -12962,6 +13039,14 @@ /obj/machinery/computer/security/telescreen/entertainment/directional/south, /turf/open/floor/iron, /area/station/engineering/break_room) +"eQQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 1 + }, +/area/station/maintenance/starboard/greater) "eQR" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/smooth, @@ -13774,6 +13859,7 @@ spawn_loot_chance = 50 }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) "fik" = ( @@ -13951,6 +14037,8 @@ /obj/machinery/duct, /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/glass/plastitanium, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/fore/greater) "flM" = ( @@ -14560,6 +14648,11 @@ /obj/structure/disposalpipe/trunk, /turf/open/floor/iron, /area/station/hallway/primary/port) +"fvz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) "fvC" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -15538,6 +15631,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/ai_monitored/turret_protected/aisat_interior) +"fKx" = ( +/obj/structure/transit_tube/horizontal, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/space/basic, +/area/space/nearstation) "fKO" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -15740,6 +15839,7 @@ /obj/structure/broken_flooring/corner/directional/south, /obj/effect/spawner/random/trash/food_packaging, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) "fNA" = ( @@ -17017,6 +17117,8 @@ /turf/open/floor/iron/dark, /area/station/medical/medbay/aft) "gmm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) "gmn" = ( @@ -17672,6 +17774,8 @@ /obj/effect/mapping_helpers/broken_floor, /obj/machinery/duct, /obj/machinery/power/apc/auto_name/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/fore/greater) "gyd" = ( @@ -18432,6 +18536,7 @@ }, /obj/effect/mapping_helpers/airlock/abandoned, /obj/effect/mapping_helpers/airlock/access/any/command/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) "gMb" = ( @@ -19172,6 +19277,8 @@ /area/station/service/bar) "gYq" = ( /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/maintenance/starboard/greater) "gYy" = ( @@ -19470,6 +19577,8 @@ name = "Maintenance" }, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "hdB" = ( @@ -20120,6 +20229,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/commons/storage/tools) +"hnF" = ( +/obj/structure/cable, +/obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) "hnO" = ( /obj/structure/disposalpipe/segment, /obj/structure/disposalpipe/segment{ @@ -20727,6 +20842,7 @@ }, /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) "hyl" = ( @@ -21143,6 +21259,7 @@ /area/station/maintenance/starboard/greater) "hFC" = ( /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating/rust, /area/station/maintenance/fore/lesser) "hFG" = ( @@ -22176,6 +22293,12 @@ }, /turf/open/floor/wood/tile, /area/station/command/meeting_room) +"iaJ" = ( +/obj/structure/transit_tube/crossing/horizontal, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/space/basic, +/area/space/nearstation) "iaK" = ( /obj/structure/table/wood, /obj/item/reagent_containers/cup/glass/bottle/wine{ @@ -22337,6 +22460,7 @@ /area/station/science/lower) "icW" = ( /obj/structure/transit_tube/horizontal, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) "ide" = ( @@ -22524,6 +22648,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_command) +"igr" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/fore/lesser) "ihc" = ( /obj/structure/cable, /obj/machinery/door/airlock/command/glass{ @@ -23322,6 +23452,8 @@ /area/station/engineering/supermatter) "iux" = ( /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/fitness/recreation/entertainment) "iuH" = ( @@ -23340,6 +23472,9 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/west, /obj/item/kirbyplants/random, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) "iuZ" = ( @@ -23537,14 +23672,6 @@ /obj/effect/spawner/random/structure/girder, /turf/open/floor/noslip/tram_platform, /area/station/security/tram) -"iym" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/generic_maintenance_landmark, -/turf/open/floor/iron, -/area/station/engineering/storage/tech) "iyq" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/hidden{ dir = 9 @@ -23920,6 +24047,7 @@ name = "Command Maintanence" }, /obj/effect/mapping_helpers/airlock/access/all/command/general, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) "iHs" = ( @@ -24469,6 +24597,8 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, /obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating/rust, /area/station/maintenance/fore/greater) "iQU" = ( @@ -24491,6 +24621,8 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/glass/plastitanium, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/fore/greater) "iRz" = ( @@ -24788,6 +24920,12 @@ }, /turf/open/floor/iron, /area/station/security) +"iWI" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/transit_tube/horizontal, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "iWQ" = ( /obj/effect/turf_decal/tile/yellow/opposingcorners, /obj/effect/landmark/start/chemist, @@ -24833,6 +24971,8 @@ dir = 4 }, /obj/structure/broken_flooring/corner/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "iXi" = ( @@ -25277,6 +25417,8 @@ name = "Faded Door" }, /obj/effect/mapping_helpers/airlock/abandoned, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/fore/greater) "jfX" = ( @@ -26047,6 +26189,7 @@ pixel_x = -32; spawn_loot_chance = 50 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) "jwi" = ( @@ -27018,6 +27161,11 @@ /obj/effect/landmark/start/virologist, /turf/open/floor/iron/showroomfloor, /area/station/medical/virology) +"jLl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) "jLr" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -27278,6 +27426,8 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/duct, /obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/fore/greater) "jQo" = ( @@ -27293,12 +27443,19 @@ /obj/structure/chair{ pixel_y = -2 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, /turf/open/floor/wood, /area/station/maintenance/fore/greater) "jQL" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/blobstart, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, /turf/open/floor/iron, /area/station/maintenance/fore/greater) "jQW" = ( @@ -27335,6 +27492,9 @@ /obj/effect/mapping_helpers/broken_floor, /obj/structure/window/reinforced/spawner/directional/east, /obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, /turf/open/floor/plating, /area/station/maintenance/fore/greater) "jRE" = ( @@ -27884,7 +28044,6 @@ /area/station/service/abandoned_gambling_den) "kbW" = ( /obj/effect/mapping_helpers/broken_floor, -/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/carpet/orange, /area/station/service/abandoned_gambling_den) "kbY" = ( @@ -28849,6 +29008,7 @@ "ksN" = ( /obj/structure/transit_tube/station/dispenser, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) "ksP" = ( @@ -28863,7 +29023,6 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/iron, /area/station/engineering/gravity_generator) "ktc" = ( @@ -29016,6 +29175,12 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron, /area/station/security/execution/transfer) +"kwu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) "kwz" = ( /obj/structure/closet/secure_closet/engineering_personal, /obj/effect/turf_decal/stripes/line{ @@ -29211,6 +29376,7 @@ "kzP" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) "kzX" = ( @@ -29221,6 +29387,7 @@ /obj/structure/transit_tube/station/dispenser/flipped{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) "kAk" = ( @@ -29515,6 +29682,9 @@ /turf/open/floor/plating, /area/station/maintenance/fore/greater) "kGB" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, /turf/open/floor/iron/dark, /area/station/hallway/secondary/construction) "kGC" = ( @@ -29692,6 +29862,7 @@ "kIY" = ( /obj/structure/broken_flooring/singular/directional/south, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) "kJb" = ( @@ -30411,6 +30582,10 @@ }, /turf/open/floor/iron/dark, /area/station/security/interrogation) +"kXJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) "kXM" = ( /obj/effect/spawner/random/structure/girder, /obj/structure/barricade/wooden, @@ -30511,6 +30686,8 @@ /obj/effect/spawner/random/trash, /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/fore/greater) "kZx" = ( @@ -31336,6 +31513,15 @@ /obj/structure/alien/weeds, /turf/open/misc/asteroid, /area/station/maintenance/starboard/greater) +"lko" = ( +/obj/machinery/door/airlock{ + name = "Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) "lku" = ( /obj/structure/table, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -31709,6 +31895,7 @@ /obj/structure/disposalpipe/segment, /obj/structure/cable, /obj/structure/steam_vent, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) "ltp" = ( @@ -31988,6 +32175,8 @@ /obj/structure/disposalpipe/segment{ dir = 6 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "lxy" = ( @@ -32406,6 +32595,13 @@ "lEa" = ( /turf/open/floor/iron/half, /area/station/hallway/primary/central/fore) +"lEg" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/broken_flooring/pile/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "lEu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -32562,6 +32758,8 @@ "lHS" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair/stool/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) "lHT" = ( @@ -33076,6 +33274,11 @@ }, /turf/open/floor/iron/white/small, /area/station/science/lobby) +"lOY" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/fore/lesser) "lPd" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -33223,6 +33426,8 @@ dir = 6 }, /obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "lSf" = ( @@ -33408,6 +33613,11 @@ /obj/structure/window/spawner/directional/west, /turf/open/floor/plating, /area/station/cargo/sorting) +"lVg" = ( +/obj/structure/transit_tube/horizontal, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/maintenance/starboard/aft) "lVy" = ( /obj/effect/turf_decal/tile/green/anticorner/contrasted{ dir = 8 @@ -33891,6 +34101,8 @@ /obj/structure/disposalpipe/segment{ dir = 9 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "mcl" = ( @@ -33976,6 +34188,11 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/white/side, /area/station/science/lower) +"meJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) "meN" = ( /obj/structure/chair/sofa/bench{ dir = 8 @@ -34961,6 +35178,8 @@ }, /obj/effect/mapping_helpers/broken_floor, /obj/structure/broken_flooring/singular/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "myt" = ( @@ -36171,6 +36390,7 @@ "mTU" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/transit_tube/horizontal, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) "mUg" = ( @@ -36302,6 +36522,15 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron, /area/station/security/processing) +"mXk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/broken_flooring/singular/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "mXo" = ( /obj/machinery/atmospherics/pipe/smart/manifold/general/visible{ dir = 1 @@ -36686,6 +36915,7 @@ "nfm" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/hallway/secondary/construction) "nfs" = ( @@ -39281,6 +39511,10 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/iron/white/small, /area/station/science/ordnance/storage) +"obv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) "obG" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -39340,7 +39574,7 @@ /area/station/maintenance/hallway/abandoned_command) "odk" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/atmospheric_sanity/ignore_area, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/grimy, /area/station/commons/vacant_room/office) "odA" = ( @@ -39359,7 +39593,6 @@ /area/station/maintenance/fore/greater) "odP" = ( /obj/machinery/firealarm/directional/west, -/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/iron/dark/small, /area/station/medical/morgue) "odX" = ( @@ -40273,6 +40506,8 @@ /obj/item/clothing/head/cone{ pixel_x = 7 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) "ouN" = ( @@ -40336,6 +40571,8 @@ "ovB" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/alien/weeds, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) "ovQ" = ( @@ -40514,6 +40751,14 @@ /obj/structure/mannequin/plastic, /turf/open/floor/carpet/blue, /area/station/cargo/boutique) +"ozV" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 8 + }, +/area/station/maintenance/starboard/greater) "oAc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -40785,6 +41030,9 @@ "oFf" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, /turf/open/floor/iron/chapel{ dir = 4 }, @@ -41447,6 +41695,7 @@ /obj/machinery/door/airlock/grunge{ name = "St. Brendan's" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/maintenance/starboard/greater) "oRZ" = ( @@ -42317,6 +42566,8 @@ /obj/effect/mapping_helpers/airlock/unres{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "piG" = ( @@ -42614,6 +42865,11 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"pof" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/grimy, +/area/station/commons/vacant_room/office) "pog" = ( /obj/effect/turf_decal/siding/wood, /turf/open/floor/iron/freezer, @@ -43859,6 +44115,7 @@ "pHk" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/chapel, /area/station/maintenance/starboard/greater) "pHn" = ( @@ -44150,6 +44407,8 @@ /obj/structure/cable, /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/fore/greater) "pLZ" = ( @@ -44174,6 +44433,7 @@ /area/station/maintenance/department/engine) "pMs" = ( /obj/structure/transit_tube/horizontal, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) "pMu" = ( @@ -44349,6 +44609,8 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/glass/plastitanium, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/fore/greater) "pOX" = ( @@ -45175,6 +45437,7 @@ /area/station/command/heads_quarters/rd) "qcf" = ( /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/side, /area/station/hallway/secondary/construction) "qcl" = ( @@ -45466,6 +45729,8 @@ dir = 4 }, /obj/structure/broken_flooring/singular/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "qgx" = ( @@ -46455,6 +46720,7 @@ "qwn" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) "qwq" = ( @@ -46470,6 +46736,8 @@ }, /obj/effect/mapping_helpers/broken_floor, /obj/structure/steam_vent, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "qwz" = ( @@ -47845,6 +48113,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/commons/vacant_room/commissary) +"qTz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/fore/lesser) "qTD" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -48508,6 +48780,13 @@ /obj/structure/barricade/wooden/crude, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) +"rdh" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) "rdo" = ( /obj/structure/window/spawner/directional/west, /obj/structure/flora/bush/jungle/a/style_random, @@ -50593,6 +50872,11 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/dock) +"rMb" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/iron/grimy, +/area/station/commons/vacant_room/office) "rMl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -50933,6 +51217,7 @@ "rRu" = ( /obj/structure/transit_tube/horizontal, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) "rRy" = ( @@ -51310,6 +51595,8 @@ "rWO" = ( /obj/structure/disposalpipe/segment, /obj/structure/broken_flooring/singular/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "rWP" = ( @@ -51766,6 +52053,14 @@ /obj/structure/curtain/cloth, /turf/open/floor/carpet/purple, /area/station/commons/dorms) +"seI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/maintenance/fore/greater) "seM" = ( /obj/effect/turf_decal/stripes/red/line{ dir = 4 @@ -51775,6 +52070,7 @@ "seV" = ( /obj/structure/transit_tube/horizontal, /obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/space/basic, /area/space/nearstation) "sfb" = ( @@ -52696,6 +52992,13 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/checker, /area/station/command/heads_quarters/hos) +"suF" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) "suK" = ( /obj/effect/spawner/random/vending/snackvend, /obj/effect/mapping_helpers/broken_floor, @@ -53239,6 +53542,7 @@ /area/station/security/execution/transfer) "sCw" = ( /obj/structure/transit_tube/station/dispenser/flipped, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) "sCB" = ( @@ -53866,6 +54170,9 @@ /area/station/engineering/gravity_generator) "sOF" = ( /obj/item/kirbyplants/random, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) "sON" = ( @@ -53896,6 +54203,15 @@ /obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/service/kitchen/coldroom) +"sPa" = ( +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/machinery/door/airlock/grunge{ + name = "St. Brendan's" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/maintenance/starboard/greater) "sPt" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/green{ @@ -54289,6 +54605,11 @@ /obj/structure/cable, /turf/open/floor/iron/textured_half, /area/station/security) +"sVk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) "sVp" = ( /obj/structure/table, /obj/structure/sign/poster/official/corporate_perks_vacation/directional/east, @@ -54342,6 +54663,8 @@ /obj/effect/mapping_helpers/airlock/abandoned, /obj/effect/decal/cleanable/dirt, /obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/grimy, /area/station/maintenance/starboard/greater) "sWJ" = ( @@ -58505,6 +58828,8 @@ /obj/effect/mapping_helpers/broken_floor, /obj/effect/spawner/random/trash, /obj/structure/broken_flooring/singular/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "uqO" = ( @@ -59294,6 +59619,12 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/department/engine) +"uFc" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "uFk" = ( /obj/structure/flora/rock/pile/jungle/style_random, /obj/structure/window/reinforced/spawner/directional/east, @@ -59534,6 +59865,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white/small, /area/station/science/ordnance/storage) +"uIj" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/fore/lesser) "uIn" = ( /obj/structure/window/spawner/directional/west, /obj/structure/window/spawner/directional/east, @@ -59587,6 +59924,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/port) +"uJG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/maintenance/fore/greater) "uJR" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -60240,6 +60583,13 @@ /obj/item/food/cake/apple, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) +"uVO" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "uVT" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/hop) @@ -61255,6 +61605,13 @@ "vlV" = ( /turf/closed/wall, /area/station/maintenance/aft) +"vlX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/chapel{ + dir = 4 + }, +/area/station/maintenance/starboard/greater) "vlY" = ( /obj/structure/chair/stool/bamboo{ dir = 8 @@ -61596,6 +61953,10 @@ /obj/effect/spawner/random/trash/graffiti{ pixel_y = -32 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) "vql" = ( @@ -62689,6 +63050,8 @@ name = "Maintenance" }, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) "vIJ" = ( @@ -63048,6 +63411,7 @@ pixel_y = 12 }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) "vNv" = ( @@ -63576,6 +63940,7 @@ "vVT" = ( /obj/structure/transit_tube/crossing/horizontal, /obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/space/basic, /area/space/nearstation) "vVU" = ( @@ -63996,6 +64361,14 @@ }, /turf/open/floor/iron/cafeteria, /area/station/hallway/secondary/exit/departure_lounge) +"wcI" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) "wcP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/modular_computer/preset/cargochat/cargo, @@ -64459,6 +64832,8 @@ /turf/open/floor/plating, /area/station/hallway/secondary/recreation) "wla" = ( +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/chapel, /area/station/maintenance/starboard/greater) "wlf" = ( @@ -64792,6 +65167,7 @@ "wqM" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating/rust, /area/station/maintenance/fore/lesser) "wqY" = ( @@ -64815,6 +65191,8 @@ /obj/structure/disposalpipe/segment{ dir = 9 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) "wrF" = ( @@ -65079,6 +65457,9 @@ "wuH" = ( /obj/structure/broken_flooring/singular/directional/south, /obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) "wuI" = ( @@ -65484,6 +65865,7 @@ /obj/machinery/door/airlock/engineering{ name = "Supplies Depot" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/hallway/secondary/construction) "wBm" = ( @@ -65514,6 +65896,7 @@ /obj/machinery/light/small/broken/directional/east, /obj/effect/decal/cleanable/dirt, /obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/fore/greater) "wBQ" = ( @@ -67921,6 +68304,8 @@ /area/station/security/brig/entrance) "xkn" = ( /obj/structure/steam_vent, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) "xkt" = ( @@ -68221,6 +68606,7 @@ /obj/structure/transit_tube/station/dispenser{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) "xpf" = ( @@ -69266,6 +69652,9 @@ /turf/open/floor/iron, /area/station/security/execution/transfer) "xCT" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, /turf/open/floor/iron/dark/smooth_edge{ dir = 8 }, @@ -69370,6 +69759,8 @@ /area/station/maintenance/starboard/central) "xEv" = ( /obj/structure/sign/departments/holy/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) "xEC" = ( @@ -70824,6 +71215,8 @@ dir = 4 }, /obj/effect/spawner/random/trash, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "xXr" = ( @@ -70973,6 +71366,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/yellow/opposingcorners, /obj/effect/turf_decal/siding/white, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/construction) "xZx" = ( @@ -71938,6 +72332,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) +"ymh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) (1,1,1) = {" dDB @@ -98505,7 +98905,7 @@ hei hei vPP hxJ -jVe +gIb nsc vzt mnw @@ -99019,7 +99419,7 @@ iEQ hic azJ gcz -qtQ +lOY gcz ihl oVY @@ -99276,7 +99676,7 @@ ydj ykd qyz gcz -qtQ +lOY gcz ihq rHp @@ -100299,12 +100699,12 @@ gDp gIj iRz wqM -iRz -iRz -iRz +uIj +uIj +uIj lto hyj -qtQ +lOY gcz lcs xQD @@ -100812,7 +101212,7 @@ aJq aJq xRH nts -ruY +qTz gXf ruY iSb @@ -101069,7 +101469,7 @@ tYT aJq nIY gJY -ruY +igr gXg iFE iSk @@ -106262,7 +106662,7 @@ qRO ssz bFW rwW -iym +vtB pGD wSH kJW @@ -107247,7 +107647,7 @@ bqy bqy tIE nFW -twN +akY nFW nFW nFW @@ -108278,8 +108678,8 @@ ivO iRv nFW sJR -sJR -nfc +obv +seI nfc nFW wqj @@ -108534,7 +108934,7 @@ tIE yju pOL jfP -nfc +uJG jQF spH klf @@ -109306,7 +109706,7 @@ kGz jPr gxZ dxz -sJR +kXJ xwy sJR nFW @@ -109561,7 +109961,7 @@ aJN tIE nFW iSW -njm +rdh liR jQL uwH @@ -109818,7 +110218,7 @@ pyt nvS nFW iUy -vtL +hnF iKN jRb kaL @@ -110075,7 +110475,7 @@ nvS pyt vcE vcE -njm +rdh fjN jRz sSV @@ -110332,9 +110732,9 @@ kbY pvA iIe vcE -njm +rdh wBO -bHA +wcI njm njm njm @@ -120681,7 +121081,7 @@ blb blb kQt lxo -hzK +uFc pil cxy cyf @@ -122217,7 +122617,7 @@ hyE oix hyE iZH -mME +mXk lKG scv hyE @@ -123246,8 +123646,8 @@ xap ieY kks dof -ieY -rWA +uVO +lEg rWO wrD bHs @@ -124272,7 +124672,7 @@ dDB dDB dDB hyE -pMs +lVg afF afF pMs @@ -124529,7 +124929,7 @@ dDB dDB dDB hyE -ecL +iWI hyE hyE ecL @@ -124786,7 +125186,7 @@ dDB dDB dDB dDB -seV +fKx blb blb seV @@ -125043,7 +125443,7 @@ dDB dDB dDB dDB -vVT +iaJ blb blb seV @@ -125300,7 +125700,7 @@ dDB dDB dDB dDB -vVT +iaJ blb blb vVT @@ -125557,7 +125957,7 @@ dDB dDB dDB dDB -seV +fKx blb blb seV @@ -125814,7 +126214,7 @@ ylD dDB dDB ylD -mTU +cpJ ylD ylD mTU @@ -126329,7 +126729,7 @@ wNK pnt ylD ksN -jxD +sVk dtq xpb ylD @@ -126343,7 +126743,7 @@ dDB ylD urn pHk -aRw +vlX wla aRw egN @@ -126580,13 +126980,13 @@ qkp rfZ sEB odk -sEB +pof eLn xlx sEn csI -xlx -jxD +bVR +jLl xlx sOF cFq @@ -126600,7 +127000,7 @@ dDB ylD ylD ylD -oRV +sPa ylD ylD oRV @@ -126836,14 +127236,14 @@ mMr ylD rhL rTq -rir -sEB +rMb +eAo sWA -xlx +kwu ouL -csI -dtq -xlx +aqV +suF +kwu vLs qeT ylD @@ -126856,7 +127256,7 @@ ylD ylD ylD mEq -xCT +ozV bsI ylD wBa @@ -127104,15 +127504,15 @@ xBF sVp oyR ylD -idq -xZy +ymh +meJ xkn xEv -xZy -xZy -xZy -oRV -sgO +meJ +meJ +meJ +sPa +eQQ gYq aUA ylD @@ -127361,7 +127761,7 @@ ylD ylD ylD ylD -idq +ymh ylD ylD ylD @@ -127612,13 +128012,13 @@ ylD mMr dOb ovB -cFq -xZy -xZy -xZy -xZy +lko +meJ +meJ +meJ +meJ xkn -idq +ymh ylD xqq xLY @@ -127859,13 +128259,13 @@ mwx wgF ylD rZG -ovB +cFj bNP fii fNv jwh -xlx -vlb +fvz +aYR vNt kIY vqb diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 809f1335d24..610855acbaf 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -10094,16 +10094,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/station/security/prison/safe) -"cvc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/department/science) "cvo" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, @@ -13074,6 +13064,18 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"dhA" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/iron, +/area/station/maintenance/department/chapel) "dhM" = ( /obj/machinery/holopad, /obj/effect/turf_decal/bot, @@ -16060,10 +16062,6 @@ dir = 1 }, /area/station/hallway/primary/fore) -"dVe" = ( -/obj/effect/landmark/generic_maintenance_landmark, -/turf/open/floor/plating/airless, -/area/space/nearstation) "dVg" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -18649,6 +18647,13 @@ /obj/effect/turf_decal/tile/neutral/full, /turf/open/floor/iron/large, /area/station/hallway/secondary/exit/departure_lounge) +"eEG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "eEH" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -20394,6 +20399,15 @@ /obj/effect/turf_decal/tile/brown/anticorner/contrasted, /turf/open/floor/iron, /area/station/cargo/sorting) +"eZb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/iron, +/area/station/service/kitchen/abandoned) "eZe" = ( /obj/machinery/vending/wardrobe/viro_wardrobe, /obj/structure/sign/poster/official/cleanliness/directional/west, @@ -23780,15 +23794,6 @@ "fSW" = ( /turf/closed/indestructible/opshuttle, /area/station/science/ordnance/bomb) -"fTh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/blobstart, -/obj/effect/turf_decal/tile/red/opposingcorners, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/service/kitchen/abandoned) "fTw" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /obj/effect/turf_decal/bot, @@ -24344,6 +24349,17 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos/project) +"fZC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/department/science) "fZG" = ( /obj/effect/turf_decal/stripes/corner, /obj/effect/turf_decal/stripes/corner{ @@ -24444,6 +24460,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/medical/chemistry) +"gaE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, +/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/iron, +/area/station/maintenance/department/electrical) "gaG" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -27226,6 +27250,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) +"gHA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/iron, +/area/station/science/research/abandoned) "gHE" = ( /obj/machinery/requests_console/directional/north{ department = "Chapel"; @@ -27764,10 +27794,6 @@ }, /turf/open/floor/iron, /area/station/security/prison) -"gOH" = ( -/obj/effect/landmark/blobstart, -/turf/open/floor/plating, -/area/station/maintenance/solars/starboard/fore) "gOR" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -29747,22 +29773,6 @@ /obj/item/pen, /turf/open/floor/iron/grimy, /area/station/tcommsat/computer) -"hpB" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/obj/item/storage/box/bandages{ - pixel_y = 6; - pixel_x = 4 - }, -/obj/item/storage/toolbox/mechanical, -/obj/item/storage/belt/utility, -/turf/open/floor/iron, -/area/station/cargo/storage) "hpC" = ( /obj/effect/landmark/generic_maintenance_landmark, /obj/structure/cable, @@ -30085,13 +30095,6 @@ /obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"huS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, -/obj/effect/spawner/random/engineering/tracking_beacon, -/obj/effect/mapping_helpers/burnt_floor, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/maintenance/department/electrical) "huX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment{ @@ -33848,14 +33851,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/maintenance/port/fore) -"itC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/generic_maintenance_landmark, -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/maintenance/starboard/aft) "itF" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 6 @@ -37866,6 +37861,13 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/station/commons/dorms) +"jrN" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/port) "jsa" = ( /obj/item/storage/box/rxglasses, /obj/structure/table/reinforced/rglass, @@ -38964,6 +38966,16 @@ }, /turf/open/floor/iron/white, /area/station/science/lab) +"jFV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/blobstart, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/iron, +/area/station/service/kitchen/abandoned) "jGl" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, @@ -41505,19 +41517,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) -"klh" = ( -/obj/structure/table/glass, -/obj/machinery/status_display/ai/directional/west, -/obj/machinery/newscaster/directional/north, -/obj/effect/turf_decal/siding/dark_red, -/obj/item/storage/box/bandages{ - pixel_y = 6; - pixel_x = -6 - }, -/obj/item/reagent_containers/cup/bottle/morphine, -/obj/item/reagent_containers/syringe, -/turf/open/floor/iron/dark, -/area/station/security/execution/transfer) "klm" = ( /obj/structure/sign/plaques/kiddie/badger{ pixel_y = 32 @@ -43994,14 +43993,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/port/aft) -"kVw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron, -/area/station/service/kitchen/abandoned) "kVx" = ( /obj/machinery/door/airlock/highsecurity{ name = "Emergency Access" @@ -44734,6 +44725,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/engineering/atmos/project) +"leY" = ( +/obj/effect/landmark/blobstart, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/fore) "lfm" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -44771,6 +44767,22 @@ /mob/living/carbon/human/species/monkey, /turf/open/floor/engine, /area/station/science/genetics) +"lfC" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/obj/item/storage/box/bandages{ + pixel_y = 6; + pixel_x = 4 + }, +/obj/item/storage/toolbox/mechanical, +/obj/item/storage/belt/utility, +/turf/open/floor/iron, +/area/station/cargo/storage) "lfD" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/siding/dark_red{ @@ -45831,15 +45843,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/maintenance/department/science) -"ltg" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/maintenance/department/chapel) "ltr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -47100,6 +47103,13 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"lId" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/maintenance/starboard/aft) "lIe" = ( /obj/effect/landmark/blobstart, /obj/structure/disposalpipe/segment{ @@ -58011,6 +58021,12 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/aft) +"oBN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/iron, +/area/station/service/kitchen/abandoned) "oBX" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /obj/item/kirbyplants/random, @@ -63246,12 +63262,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) -"pRp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "pRy" = ( /obj/effect/turf_decal/siding/green, /obj/structure/window/reinforced/spawner/directional/south, @@ -67977,6 +67987,16 @@ /obj/effect/turf_decal/trimline/blue/end, /turf/open/floor/iron/dark/textured, /area/station/engineering/atmos/project) +"raE" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/department/chapel) "raI" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -69316,13 +69336,6 @@ }, /turf/open/floor/iron, /area/station/science/xenobiology) -"rqN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/port) "rqV" = ( /obj/machinery/dna_infuser, /obj/item/infuser_book, @@ -69761,6 +69774,14 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron/dark, /area/station/service/kitchen) +"rxO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/port) "rxT" = ( /obj/structure/table/reinforced, /obj/item/paper_bin{ @@ -75202,17 +75223,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/engineering/main) -"sNP" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/maintenance/department/chapel) "sOi" = ( /obj/machinery/portable_atmospherics/pump, /obj/effect/turf_decal/bot, @@ -78942,6 +78952,11 @@ /obj/effect/turf_decal/tile/neutral/full, /turf/open/floor/iron/half, /area/station/security/range) +"tLz" = ( +/obj/effect/landmark/blobstart, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/aft) "tLC" = ( /obj/structure/sign/warning/radiation, /turf/closed/wall/r_wall, @@ -81314,17 +81329,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"upq" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/maintenance/starboard/aft) "upv" = ( /obj/machinery/navbeacon{ codes_txt = "delivery;dir=4"; @@ -84870,10 +84874,6 @@ /obj/structure/cable, /turf/open/floor/iron/grimy, /area/station/service/bar/backroom) -"vhK" = ( -/obj/effect/landmark/blobstart, -/turf/open/floor/plating, -/area/station/maintenance/solars/starboard/aft) "vhW" = ( /obj/item/kirbyplants/random, /obj/structure/sign/warning/pods/directional/south{ @@ -85153,6 +85153,19 @@ }, /turf/open/floor/iron/cafeteria, /area/station/service/cafeteria) +"vmo" = ( +/obj/structure/table/glass, +/obj/machinery/status_display/ai/directional/west, +/obj/machinery/newscaster/directional/north, +/obj/effect/turf_decal/siding/dark_red, +/obj/item/storage/box/bandages{ + pixel_y = 6; + pixel_x = -6 + }, +/obj/item/reagent_containers/cup/bottle/morphine, +/obj/item/reagent_containers/syringe, +/turf/open/floor/iron/dark, +/area/station/security/execution/transfer) "vmr" = ( /obj/machinery/airalarm/directional/west, /obj/machinery/disposal/bin, @@ -88275,6 +88288,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, /turf/open/floor/iron, /area/station/science/xenobiology) +"wcb" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/iron, +/area/station/maintenance/starboard/aft) "wcd" = ( /obj/structure/chair/wood, /obj/effect/decal/cleanable/dirt, @@ -89260,6 +89285,11 @@ /obj/item/screwdriver, /turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) +"wnO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "wnQ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -94101,12 +94131,6 @@ "xzJ" = ( /turf/open/floor/iron, /area/station/security/execution/transfer) -"xzL" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/port) "xzO" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/medical/glass{ @@ -121738,7 +121762,7 @@ lAs trG fnq uKY -xzL +jrN mYM pTC eSu @@ -121760,7 +121784,7 @@ vSX nEc tFP oMV -nVQ +gHA cHU eKz qel @@ -124847,7 +124871,7 @@ aJX fSw fTA jkC -cvc +fZC jUx wEI qYo @@ -126611,7 +126635,7 @@ ikf vcB vcB jPf -rqN +rxO sIe bTe jTw @@ -127685,7 +127709,7 @@ bvd wJJ wEI dnV -tTg +wnO gFO qQM isR @@ -128081,7 +128105,7 @@ azA oYs bEs bEs -pRp +eEG tQY ltr qRN @@ -139620,7 +139644,7 @@ aad aad csz jSE -gOH +leY wFz xrr aaa @@ -139925,7 +139949,7 @@ oSv ueU cNf wqo -hpB +lfC oSv mOe yhh @@ -141179,11 +141203,11 @@ aeF vno nNs ffk -fTh +jFV egs vno rJN -tLW +oBN pGy vno kvs @@ -141802,7 +141826,7 @@ bRZ qMf jfW gUF -ltg +raE xeX qkj qMf @@ -142725,7 +142749,7 @@ aad aad vno iJj -kVw +eZb acU vno aad @@ -142830,7 +142854,7 @@ pPl vPf qMf rPf -sNP +dhA ovf qkj ygf @@ -144119,7 +144143,7 @@ xPK wZE eSU haQ -huS +gaE pdb hnH nvM @@ -146864,7 +146888,7 @@ mSe mSe mSe mSe -klh +vmo lQj xBD mXg @@ -149246,7 +149270,7 @@ ouy geH nXH gWF -upq +wcb jix nmD gQK @@ -150023,7 +150047,7 @@ nXH aad nXH uFH -itC +lId udQ cun kOR @@ -150291,7 +150315,7 @@ hrt wZV vNa cPU -vhK +tLz oBM pWe aad @@ -153368,7 +153392,7 @@ aaa aaa qYo kUH -dVe +yhJ yhJ vVc vVc diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index 47fcdebb2c1..ef2790cb69a 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -652,6 +652,11 @@ }, /turf/open/floor/plating, /area/mine/storage) +"ama" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/fore) "amg" = ( /obj/machinery/door/poddoor/shutters/window/preopen{ dir = 4; @@ -756,6 +761,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain) +"anI" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "anK" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 @@ -911,6 +922,15 @@ }, /turf/open/floor/iron, /area/station/command/gateway) +"apL" = ( +/obj/effect/turf_decal/trimline/green/filled/corner, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard/aft) "apS" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -1694,16 +1714,6 @@ /obj/machinery/light/cold/directional/south, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/cmo) -"aBx" = ( -/obj/effect/decal/cleanable/plasma, -/obj/effect/landmark/blobstart, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/morgue) -"aBQ" = ( -/obj/effect/landmark/blobstart, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) "aBR" = ( /turf/open/genturf/blue, /area/icemoon/surface/outdoors/noruins) @@ -1755,6 +1765,15 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"aCt" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/maintenance/fore/lesser) "aCA" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 10 @@ -1950,6 +1969,12 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"aGi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) "aGr" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/camera/directional/east{ @@ -2315,6 +2340,13 @@ }, /turf/open/floor/iron, /area/station/tcommsat/computer) +"aMB" = ( +/obj/effect/decal/cleanable/plasma, +/obj/effect/landmark/blobstart, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/morgue) "aME" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -2331,6 +2363,13 @@ /obj/effect/turf_decal/tile/yellow, /turf/open/floor/iron/white, /area/station/medical/pharmacy) +"aMR" = ( +/obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/fore) "aMX" = ( /obj/machinery/light/small/directional/south, /obj/structure/cable, @@ -2373,6 +2412,10 @@ /obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/plating, /area/mine/eva/lower) +"aNC" = ( +/obj/item/food/fried_chicken, +/turf/open/floor/plating/snowed/smoothed, +/area/station/maintenance/fore/lesser) "aNR" = ( /obj/machinery/smartfridge, /obj/machinery/door/firedoor, @@ -2418,6 +2461,11 @@ /obj/effect/mapping_helpers/airlock/access/all/supply/mining_station, /turf/open/floor/iron/smooth_large, /area/station/cargo/warehouse) +"aOG" = ( +/obj/item/trash/raisins, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "aOS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -3384,16 +3432,6 @@ "bcN" = ( /turf/closed/wall/r_wall, /area/station/hallway/primary/central) -"bcQ" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Firefighting Equipment" - }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "bcT" = ( /obj/structure/extinguisher_cabinet/directional/north, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -3441,6 +3479,15 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/external, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"bdA" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/morgue) "bdJ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -4380,6 +4427,11 @@ /obj/machinery/status_display/evac/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/central) +"brq" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "brt" = ( /obj/machinery/portable_atmospherics/canister/nitrous_oxide, /turf/open/floor/iron/dark, @@ -5544,6 +5596,11 @@ }, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"bHB" = ( +/obj/effect/spawner/random/structure/steam_vent, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "bHF" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, @@ -5639,6 +5696,11 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/disposal) +"bIr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "bIt" = ( /obj/structure/rack, /obj/effect/decal/cleanable/cobweb/cobweb2, @@ -5917,6 +5979,11 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel) +"bMi" = ( +/obj/structure/grille/broken, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "bMu" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/left/directional/north{ @@ -6541,6 +6608,15 @@ /obj/machinery/light/floor, /turf/open/floor/iron, /area/station/engineering/atmos) +"bWD" = ( +/obj/machinery/door/airlock/engineering{ + name = "Port Bow Solar Access" + }, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/fore) "bWK" = ( /turf/open/floor/iron/dark, /area/station/engineering/atmos/project) @@ -6874,6 +6950,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"cbt" = ( +/obj/structure/chair/plastic{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/department/cargo) "cbz" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/iron/dark/textured, @@ -7525,6 +7609,13 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/engine, /area/station/science/xenobiology) +"cky" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) "ckN" = ( /obj/structure/cable, /obj/machinery/newscaster/directional/south, @@ -8236,6 +8327,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"cvt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "cvz" = ( /obj/machinery/duct, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8368,6 +8466,18 @@ /obj/machinery/status_display/evac/directional/west, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai) +"cxo" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Firefighting Equipment" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "cxp" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/secure_closet/personal{ @@ -8418,6 +8528,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply, /turf/open/floor/iron/white, /area/station/medical/virology) +"cxS" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "cyh" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -9682,6 +9798,11 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/prison/work) +"cQg" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) "cQh" = ( /obj/structure/chair/office{ dir = 1 @@ -10616,6 +10737,12 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"dex" = ( +/obj/effect/landmark/blobstart, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) "deD" = ( /obj/machinery/modular_computer/preset/id{ dir = 4 @@ -12155,6 +12282,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/commons/fitness) +"dDk" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "dDm" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/on{ dir = 1 @@ -12512,6 +12646,18 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"dIp" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Research Delivery Access" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "dIx" = ( /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating, @@ -13239,6 +13385,9 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/commons/locker) +"dVj" = ( +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "dVq" = ( /obj/machinery/space_heater, /obj/structure/sign/poster/random/directional/east, @@ -13280,6 +13429,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/engineering/lobby) +"dVP" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "dVX" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/contraband/random/directional/east, @@ -13492,6 +13646,13 @@ dir = 8 }, /area/mine/eva) +"dZx" = ( +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/aft) "dZB" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -13569,11 +13730,6 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"eae" = ( -/obj/structure/sign/poster/contraband/random/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "eag" = ( /obj/structure/chair/stool/directional/north, /obj/effect/landmark/start/scientist, @@ -13645,12 +13801,6 @@ }, /turf/open/floor/iron/smooth, /area/mine/mechbay) -"ebw" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/maintenance/starboard/aft) "ebB" = ( /turf/open/misc/dirt{ initial_gas_mix = "ICEMOON_ATMOS" @@ -13860,6 +14010,16 @@ /obj/machinery/iv_drip, /turf/open/floor/iron/dark, /area/station/medical/morgue) +"efu" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "efv" = ( /obj/item/toy/snowball{ pixel_x = -6; @@ -14650,11 +14810,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/cargo/storage) -"erU" = ( -/obj/effect/landmark/generic_maintenance_landmark, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/department/crew_quarters/bar) "erY" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -14665,6 +14820,11 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/command/teleporter) +"esb" = ( +/obj/effect/spawner/random/structure/steam_vent, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/morgue) "esc" = ( /obj/machinery/computer/order_console/mining, /obj/effect/turf_decal/tile/brown/half/contrasted{ @@ -14919,6 +15079,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/cargo/storage) +"ewv" = ( +/obj/structure/plasticflaps, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/fore) "ewz" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/north, @@ -15486,6 +15652,12 @@ /obj/structure/sign/poster/official/report_crimes, /turf/closed/wall/ice, /area/icemoon/underground/explored) +"eFH" = ( +/obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/fore) "eFS" = ( /obj/machinery/door/airlock/maintenance{ name = "Mech Bay Maintenance" @@ -15585,6 +15757,13 @@ /obj/item/clothing/under/costume/jabroni, /turf/open/floor/iron, /area/station/maintenance/starboard/fore) +"eHA" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/maintenance/starboard/aft) "eHT" = ( /obj/structure/cable, /obj/effect/spawner/random/structure/steam_vent, @@ -15635,6 +15814,11 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/wood, /area/station/service/library) +"eIo" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "eIC" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -16154,9 +16338,6 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/hop) -"eSg" = ( -/turf/open/floor/plating, -/area/station/maintenance/solars/port/fore) "eSn" = ( /obj/structure/chair/office, /obj/effect/landmark/start/assistant, @@ -16236,6 +16417,11 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/large, /area/station/engineering/main) +"eTB" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/fore) "eTC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -16909,6 +17095,14 @@ "feJ" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/security/armory/upper) +"feP" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/smooth, +/area/station/maintenance/fore/lesser) "feQ" = ( /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating, @@ -17068,6 +17262,11 @@ }, /turf/open/floor/iron, /area/station/engineering/lobby) +"fif" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "fij" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -18123,11 +18322,6 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/central) -"fzA" = ( -/obj/effect/spawner/random/maintenance, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "fzD" = ( /obj/structure/disposalpipe/segment, /obj/item/radio/intercom/directional/east, @@ -18137,6 +18331,12 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"fzF" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "fzG" = ( /obj/structure/closet{ name = "evidence closet 5" @@ -18657,15 +18857,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/white, /area/station/maintenance/port/fore) -"fIL" = ( -/obj/machinery/door/airlock{ - name = "Observatory Access" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/mapping_helpers/airlock/unres, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "fJd" = ( /obj/item/kirbyplants/random, /obj/structure/sign/warning/pods/directional/west, @@ -19163,6 +19354,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/pink, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"fRn" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/maintenance/starboard/aft) "fRv" = ( /obj/machinery/light/small/directional/north, /turf/open/floor/engine, @@ -21022,6 +21221,11 @@ dir = 9 }, /area/station/science/research) +"gwo" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "gwp" = ( /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral/full, @@ -21615,6 +21819,12 @@ dir = 5 }, /area/station/hallway/secondary/entry) +"gFP" = ( +/obj/item/trash/popcorn, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/plating, +/area/station/maintenance/fore) "gFR" = ( /obj/structure/table/reinforced, /obj/item/clothing/suit/utility/radiation, @@ -21758,9 +21968,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"gHv" = ( -/turf/open/floor/plating, -/area/station/maintenance/solars/starboard/fore) "gHA" = ( /mob/living/simple_animal/hostile/asteroid/polarbear{ move_force = 999; @@ -22227,6 +22434,15 @@ dir = 8 }, /area/station/science/research) +"gPG" = ( +/obj/structure/chair/plastic{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/splatter, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/iron, +/area/station/maintenance/starboard/fore) "gPR" = ( /obj/effect/turf_decal/trimline/green/filled/warning, /obj/machinery/duct, @@ -22684,6 +22900,12 @@ dir = 8 }, /area/station/maintenance/department/medical/central) +"gXn" = ( +/obj/machinery/space_heater, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/plating, +/area/station/maintenance/fore/lesser) "gXp" = ( /obj/structure/table/wood, /obj/item/folder/yellow, @@ -23002,6 +23224,13 @@ /obj/structure/grille, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"hcb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/chair/stool/directional/south, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "hce" = ( /obj/machinery/door/airlock{ id_tag = "AuxToilet3"; @@ -23048,6 +23277,13 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/engineering/storage/tech) +"hcO" = ( +/obj/structure/sign/warning/cold_temp/directional/east, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "hdb" = ( /obj/machinery/shower/directional/south, /turf/open/floor/iron/smooth, @@ -23402,6 +23638,13 @@ "hjM" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/medical/morgue) +"hjO" = ( +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/morgue) "hjQ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -24446,6 +24689,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/genetics) +"hAW" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) "hBc" = ( /obj/effect/turf_decal/siding/white{ dir = 1 @@ -24646,6 +24896,12 @@ /obj/structure/closet/emcloset, /turf/open/floor/iron/dark, /area/mine/eva) +"hEC" = ( +/obj/structure/sign/poster/contraband/random/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "hEG" = ( /obj/machinery/door/airlock/security/glass{ name = "Brig Control" @@ -24799,12 +25055,6 @@ }, /turf/open/floor/iron, /area/station/commons/fitness) -"hHs" = ( -/obj/structure/cable, -/obj/structure/sign/warning/gas_mask/directional/south, -/obj/machinery/light/small/dim/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "hHu" = ( /obj/structure/disposalpipe/segment, /obj/structure/extinguisher_cabinet/directional/west, @@ -26760,14 +27010,6 @@ /obj/structure/falsewall, /turf/open/floor/plating, /area/station/maintenance/port/lesser) -"inw" = ( -/obj/machinery/door/airlock/engineering{ - name = "Port Bow Solar Access" - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/fore) "inE" = ( /turf/open/floor/iron/corner, /area/station/engineering/lobby) @@ -26951,6 +27193,13 @@ /obj/structure/cable, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) +"ipS" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "iqn" = ( /obj/structure/rack, /obj/effect/spawner/random/clothing/costume, @@ -27264,6 +27513,13 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/glass/reinforced, /area/station/ai_monitored/security/armory/upper) +"ivf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/trash/grille_or_waste, +/obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/morgue) "ivi" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/yellow, @@ -27342,11 +27598,6 @@ "iwC" = ( /turf/closed/wall/r_wall, /area/station/hallway/primary/central/fore) -"iwD" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "iwO" = ( /obj/structure/closet/secure_closet/personal{ anchored = 1 @@ -27411,6 +27662,12 @@ }, /turf/open/floor/wood/parquet, /area/station/service/bar/atrium) +"ixW" = ( +/obj/structure/sign/warning/gas_mask/directional/south, +/obj/effect/spawner/random/trash/grille_or_waste, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/morgue) "ixZ" = ( /obj/machinery/door/airlock/command/glass{ name = "Chief Engineer" @@ -27859,6 +28116,12 @@ /obj/item/kirbyplants/random, /turf/open/floor/wood, /area/station/security/prison/rec) +"iDv" = ( +/obj/structure/sign/poster/random/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/iron/smooth, +/area/station/maintenance/fore/lesser) "iDG" = ( /obj/machinery/door/window/left/directional/north{ dir = 4; @@ -27969,6 +28232,17 @@ }, /turf/open/floor/iron, /area/station/command/bridge) +"iFu" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Firefighting Equipment" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "iFL" = ( /obj/structure/bed/dogbed/renault, /mob/living/basic/pet/fox/renault, @@ -28644,15 +28918,6 @@ /obj/item/flashlight, /turf/open/floor/plating, /area/station/construction) -"iRd" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "iRo" = ( /turf/closed/wall, /area/station/security/checkpoint/customs/auxiliary) @@ -29334,6 +29599,11 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/dark/textured, /area/station/security/prison/rec) +"jbt" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/fore) "jbu" = ( /obj/structure/railing/corner, /turf/open/floor/iron/dark/side{ @@ -29446,10 +29716,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"jdP" = ( -/obj/machinery/duct, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/morgue) "jdQ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -29885,6 +30151,11 @@ }, /turf/open/floor/iron/grimy, /area/station/service/chapel/office) +"jnB" = ( +/obj/structure/cable, +/obj/machinery/light/floor, +/turf/open/floor/plating, +/area/station/engineering/storage/tech) "jnR" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle{ dir = 4 @@ -30388,6 +30659,16 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"juL" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/mapping_helpers/burnt_floor, +/obj/machinery/airalarm/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/port/lesser) "juQ" = ( /obj/structure/rack, /obj/item/stack/rods/fifty, @@ -30606,6 +30887,16 @@ /obj/structure/closet/secure_closet/captains, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain) +"jzt" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/morgue) "jzy" = ( /obj/machinery/computer/exodrone_control_console{ dir = 1 @@ -32112,6 +32403,11 @@ }, /turf/open/floor/carpet, /area/station/command/heads_quarters/hop) +"jWR" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/aft) "jXc" = ( /obj/structure/sign/poster/official/help_others, /turf/closed/wall/ice, @@ -32400,6 +32696,14 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/maintenance/fore) +"kbQ" = ( +/obj/structure/chair, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "kbU" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -33404,13 +33708,6 @@ }, /turf/open/floor/iron/smooth, /area/station/security/holding_cell) -"kpu" = ( -/obj/effect/spawner/random/trash/mess, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "kpC" = ( /turf/closed/wall/r_wall, /area/station/engineering/atmos/mix) @@ -33741,6 +34038,14 @@ /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/iron/dark, /area/station/command/gateway) +"ksZ" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/chapel) "kta" = ( /turf/closed/wall, /area/station/commons/storage/mining) @@ -33795,10 +34100,6 @@ /obj/effect/spawner/random/trash/hobo_squat, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"ktC" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron/smooth, -/area/station/maintenance/fore/lesser) "ktD" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 @@ -33830,6 +34131,15 @@ /obj/machinery/newscaster/directional/east, /turf/open/floor/iron/dark, /area/station/service/chapel) +"kuc" = ( +/obj/machinery/door/airlock/engineering{ + name = "Port Quarter Solar Access" + }, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) "kum" = ( /obj/structure/table, /obj/item/trash/can/food/beans, @@ -35049,6 +35359,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/medical/cryo) +"kNd" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/iron/cafeteria{ + dir = 5 + }, +/area/station/maintenance/port/aft) "kNi" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -35363,14 +35681,6 @@ /obj/structure/bookcase, /turf/open/floor/iron, /area/mine/laborcamp) -"kRr" = ( -/obj/machinery/door/airlock/engineering{ - name = "Port Quarter Solar Access" - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/aft) "kRw" = ( /obj/machinery/portable_atmospherics/scrubber, /obj/effect/turf_decal/stripes/line{ @@ -35577,10 +35887,6 @@ "kUD" = ( /turf/open/openspace, /area/mine/eva) -"kUG" = ( -/obj/item/trash/popcorn, -/turf/open/floor/plating, -/area/station/maintenance/fore) "kUJ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/built/directional/south, @@ -36280,11 +36586,6 @@ }, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) -"lge" = ( -/obj/structure/sign/poster/contraband/random/directional/east, -/obj/machinery/light/small/dim/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "lgk" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 4 @@ -36859,11 +37160,6 @@ /obj/item/screwdriver, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/cmo) -"loQ" = ( -/obj/effect/turf_decal/trimline/green/filled/corner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/starboard/aft) "loV" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ dir = 4 @@ -36916,6 +37212,14 @@ "lpM" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/captain) +"lpR" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "lpS" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, @@ -36996,12 +37300,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) -"lqP" = ( -/obj/effect/decal/cleanable/insectguts, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "lqU" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -37059,6 +37357,11 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/science/robotics/lab) +"lsd" = ( +/obj/effect/spawner/random/trash/mess, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "lsi" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -37170,9 +37473,6 @@ }, /turf/open/floor/iron/white/side, /area/station/science/ordnance/office) -"luK" = ( -/turf/open/floor/plating, -/area/station/maintenance/solars/starboard/aft) "lva" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, @@ -37374,6 +37674,13 @@ /obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, /turf/open/floor/iron, /area/station/engineering/atmos) +"lxI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/blobstart, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/maintenance/port/fore) "lxT" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/decal/cleanable/dirt, @@ -37810,6 +38117,12 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/medical/cryo) +"lDO" = ( +/obj/structure/sign/poster/contraband/random/directional/east, +/obj/machinery/light/small/dim/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "lDX" = ( /obj/structure/railing/corner{ dir = 1 @@ -38457,6 +38770,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/service) +"lPd" = ( +/obj/effect/spawner/random/trash/mess, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "lPh" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -38973,10 +39294,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"lXm" = ( -/obj/item/trash/pistachios, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) "lXn" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -39265,6 +39582,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/smooth_large, /area/station/command/heads_quarters/hos) +"mcP" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/bar) "mcW" = ( /turf/open/floor/iron/white, /area/station/medical/medbay/central) @@ -39833,6 +40161,11 @@ }, /turf/open/floor/iron/textured_half, /area/station/hallway/secondary/service) +"mnm" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) "mnu" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -40074,6 +40407,10 @@ /obj/structure/sign/warning/gas_mask/directional/south, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) +"mrj" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "mro" = ( /obj/structure/curtain/cloth, /obj/effect/turf_decal/tile/yellow/opposingcorners, @@ -40322,20 +40659,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) -"mvf" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "mvl" = ( /turf/closed/wall/r_wall, /area/station/security/interrogation) -"mvp" = ( -/obj/machinery/space_heater, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/fore/lesser) "mvv" = ( /turf/open/floor/wood, /area/station/security/courtroom) @@ -40402,6 +40728,13 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"mwB" = ( +/obj/item/trash/pistachios, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) "mwQ" = ( /obj/structure/tank_holder/extinguisher, /turf/open/floor/plating, @@ -40908,6 +41241,11 @@ /obj/item/weldingtool, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"mFC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "mFE" = ( /turf/closed/wall, /area/station/medical/surgery/aft) @@ -41054,6 +41392,14 @@ /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"mIG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "mIT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -41161,6 +41507,15 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark/textured_edge, /area/station/security/evidence) +"mKJ" = ( +/obj/machinery/door/airlock/engineering{ + name = "Starboard Bow Solar Access" + }, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/fore) "mLa" = ( /obj/item/kirbyplants/random, /turf/open/floor/plating, @@ -41482,16 +41837,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"mRu" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4{ - color = "#0000ff"; - name = "Supply multi deck pipe adapter" - }, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) "mRG" = ( /obj/structure/table, /obj/item/book/manual/wiki/atmospherics, @@ -41567,16 +41912,6 @@ /obj/effect/turf_decal/tile/yellow/anticorner/contrasted, /turf/open/floor/iron, /area/station/commons/storage/tools) -"mTi" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/obj/item/storage/box/bandages{ - pixel_y = 6; - pixel_x = -6 - }, -/obj/item/food/cheesiehonkers, -/turf/open/floor/iron, -/area/station/cargo/office) "mTm" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/air_input{ dir = 1 @@ -41631,13 +41966,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/plating, /area/station/engineering/supermatter/room) -"mUt" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/mapping_helpers/airlock/unres, -/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "mUz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -41850,14 +42178,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/ordnance/office) -"mXf" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/morgue) "mXi" = ( /obj/machinery/ai_slipper{ uses = 10 @@ -42496,6 +42816,13 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/engine_smes) +"neJ" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "neM" = ( /obj/machinery/hydroponics/soil, /turf/open/misc/asteroid/snow/icemoon, @@ -42648,6 +42975,11 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"nhF" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "nhI" = ( /obj/machinery/camera/directional/east{ c_tag = "Research Division Genetics Monkey Pen"; @@ -42715,20 +43047,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"niB" = ( -/obj/structure/cable, -/obj/machinery/button/door/directional/west{ - id = "maint2"; - name = "Blast Door Control B"; - pixel_y = 4 - }, -/obj/machinery/button/door/directional/west{ - id = "maint1"; - name = "Blast Door Control A"; - pixel_y = -6 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "niC" = ( /obj/structure/cable, /obj/structure/sign/warning/secure_area/directional/east, @@ -43149,6 +43467,10 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/chapel) +"noC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/morgue) "noF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -44019,6 +44341,14 @@ /obj/structure/lattice/catwalk, /turf/open/openspace/icemoon/keep_below, /area/station/maintenance/port/lesser) +"nAq" = ( +/obj/effect/spawner/random/maintenance, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "nAr" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plating, @@ -44604,12 +44934,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) -"nIa" = ( -/obj/effect/landmark/generic_maintenance_landmark, -/obj/structure/cable, -/obj/machinery/light/floor, -/turf/open/floor/plating, -/area/station/engineering/storage/tech) "nId" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -45829,10 +46153,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) -"oef" = ( -/obj/structure/grille/broken, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "oeh" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -46100,10 +46420,6 @@ dir = 4 }, /area/station/hallway/secondary/entry) -"oiH" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "oiK" = ( /obj/machinery/door/airlock{ id_tag = "commissarydoor"; @@ -46842,17 +47158,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"osq" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Firefighting Equipment" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "osr" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 @@ -48187,13 +48492,6 @@ "oMT" = ( /turf/open/floor/iron, /area/station/command/heads_quarters/rd) -"oNp" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/starboard/aft) "oNA" = ( /obj/effect/turf_decal/bot, /turf/open/floor/plating/snowed/smoothed/icemoon, @@ -48333,6 +48631,16 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/lobby) +"oQa" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/obj/item/storage/box/bandages{ + pixel_y = 6; + pixel_x = -6 + }, +/obj/item/food/cheesiehonkers, +/turf/open/floor/iron, +/area/station/cargo/office) "oQn" = ( /obj/structure/chair/sofa/corp/left{ dir = 8 @@ -48940,16 +49248,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) -"oYx" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/crew_quarters/bar) "oYH" = ( /obj/effect/turf_decal/siding/wideplating/dark, /obj/effect/landmark/start/botanist, @@ -49207,6 +49505,12 @@ /obj/item/coin/silver, /turf/open/floor/iron, /area/station/commons/dorms) +"pcX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "pdc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -51128,11 +51432,6 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"pGM" = ( -/obj/structure/girder, -/obj/structure/grille, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "pGQ" = ( /obj/machinery/atmospherics/pipe/smart/simple/orange/visible, /turf/closed/wall, @@ -51163,14 +51462,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/science) -"pHd" = ( -/obj/machinery/door/airlock/engineering{ - name = "Starboard Bow Solar Access" - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/turf/open/floor/plating, -/area/station/maintenance/solars/starboard/fore) "pHy" = ( /obj/structure/rack, /obj/item/clothing/mask/breath, @@ -51538,6 +51829,12 @@ "pMF" = ( /turf/open/floor/iron/white, /area/station/science/xenobiology) +"pMP" = ( +/obj/effect/landmark/generic_maintenance_landmark, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/bar) "pMY" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -51592,6 +51889,11 @@ }, /turf/open/floor/iron/dark/airless, /area/station/science/ordnance/freezerchamber) +"pNI" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/bar) "pNK" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -52553,6 +52855,14 @@ /obj/machinery/microwave, /turf/open/floor/stone, /area/mine/eva/lower) +"qet" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "qeF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -52567,13 +52877,6 @@ dir = 4 }, /area/station/hallway/secondary/entry) -"qeJ" = ( -/obj/structure/chair/plastic{ - dir = 1 - }, -/obj/effect/decal/cleanable/blood/splatter, -/turf/open/floor/iron, -/area/station/maintenance/starboard/fore) "qeL" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -52902,6 +53205,12 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/security/lockers) +"qkP" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/smooth, +/area/station/maintenance/fore/lesser) "qkT" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -53328,10 +53637,6 @@ /obj/effect/spawner/random/trash/mess, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"qqC" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/department/crew_quarters/bar) "qqJ" = ( /obj/machinery/navbeacon{ codes_txt = "delivery;dir=8"; @@ -53728,12 +54033,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/commons/fitness) -"qxa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/chair/stool/directional/south, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "qxb" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/tile/brown/half/contrasted{ @@ -55216,13 +55515,6 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"qTe" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) "qTj" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -56989,12 +57281,6 @@ /obj/item/clothing/suit/apron/chef, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) -"rwG" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/morgue) "rwR" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/status_display/evac/directional/west, @@ -57759,11 +58045,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"rIw" = ( -/obj/effect/landmark/generic_maintenance_landmark, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "rIF" = ( /obj/effect/turf_decal/trimline/dark_blue/line, /obj/machinery/camera/directional/south{ @@ -58109,10 +58390,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, /area/station/engineering/lobby) -"rOX" = ( -/obj/structure/chair, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "rPe" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/structure/closet/toolcloset, @@ -59246,13 +59523,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/sepia, /area/station/service/library) -"sin" = ( -/obj/machinery/door/poddoor/preopen{ - id = "maint3" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "siu" = ( /obj/structure/table, /obj/item/storage/toolbox/emergency, @@ -59791,6 +60061,13 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, /area/station/commons/dorms/laundry) +"sqe" = ( +/obj/structure/cable, +/obj/structure/sign/warning/gas_mask/directional/south, +/obj/machinery/light/small/dim/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "sqn" = ( /obj/machinery/computer/records/security{ dir = 1 @@ -61780,16 +62057,6 @@ }, /turf/open/floor/iron/smooth, /area/mine/eva) -"sUI" = ( -/obj/structure/rack, -/obj/machinery/light/cold/directional/north, -/obj/item/storage/box/bandages{ - pixel_y = 6; - pixel_x = -6 - }, -/obj/item/healthanalyzer, -/turf/open/floor/iron/white/textured, -/area/station/security/medical) "sUN" = ( /obj/machinery/power/solar{ id = "starboardsolar"; @@ -61883,13 +62150,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"sWv" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/maintenance/fore/lesser) "sWB" = ( /obj/machinery/door/airlock/mining/glass{ name = "Mining Smeltery" @@ -62395,17 +62655,6 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"tgw" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Research Delivery Access" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "tgx" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -62883,6 +63132,14 @@ /obj/effect/turf_decal/siding/yellow, /turf/open/floor/iron, /area/station/engineering/storage) +"tou" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/confetti, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/iron/white, +/area/station/maintenance/port/fore) "toG" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 6 @@ -63444,14 +63701,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"txe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/generic_maintenance_landmark, -/obj/effect/landmark/blobstart, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/maintenance/port/fore) "txj" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -63471,6 +63720,11 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/plating, /area/station/medical/treatment_center) +"txv" = ( +/obj/effect/decal/cleanable/oil, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "txE" = ( /obj/item/cigbutt, /obj/effect/decal/cleanable/dirt, @@ -65077,6 +65331,11 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron, /area/station/security/prison/garden) +"tYK" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "tYZ" = ( /obj/machinery/door/airlock/external{ name = "External Airlock" @@ -65127,6 +65386,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos/storage) +"tZM" = ( +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) "tZO" = ( /obj/machinery/modular_computer/preset/civilian{ dir = 8 @@ -67758,6 +68024,17 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron/white, /area/station/maintenance/port/fore) +"uSj" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) +"uSm" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "uSo" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -67768,6 +68045,14 @@ dir = 1 }, /area/station/engineering/main) +"uSp" = ( +/obj/effect/landmark/generic_maintenance_landmark, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "uSq" = ( /obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ dir = 4 @@ -68248,6 +68533,11 @@ /obj/structure/cable, /turf/open/floor/circuit/telecomms/mainframe, /area/station/tcommsat/server) +"vbr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/showroomfloor, +/area/station/maintenance/department/medical/morgue) "vbz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -68614,10 +68904,6 @@ /obj/effect/mapping_helpers/airlock/abandoned, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"vhg" = ( -/obj/structure/sign/poster/random/directional/east, -/turf/open/floor/iron/smooth, -/area/station/maintenance/fore/lesser) "vhm" = ( /obj/structure/sign/poster/random/directional/west, /obj/machinery/firealarm/directional/north, @@ -68663,6 +68949,11 @@ dir = 6 }, /area/station/science/research) +"vis" = ( +/obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/morgue) "viH" = ( /obj/machinery/power/emitter/welded{ dir = 4 @@ -68687,6 +68978,11 @@ dir = 1 }, /area/station/command/gateway) +"viZ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/fore) "vja" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, @@ -69068,6 +69364,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"voP" = ( +/obj/machinery/door/poddoor/preopen{ + id = "maint3" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "voY" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -70259,6 +70563,13 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/medical/chemistry) +"vIb" = ( +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "vIe" = ( /obj/item/soap/deluxe, /obj/item/bikehorn/rubberducky, @@ -70355,18 +70666,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"vKo" = ( -/obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4{ - color = "#0000ff"; - name = "Supply multi deck pipe adapter" - }, -/obj/structure/railing{ - dir = 1 - }, -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/light/small/dim/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/morgue) "vKq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -70436,15 +70735,6 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) -"vLY" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/morgue) "vMa" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/south, @@ -70532,6 +70822,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/hallway/secondary/entry) +"vNr" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "vNs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -70592,12 +70889,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"vOI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/trash/grille_or_waste, -/obj/machinery/duct, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/morgue) "vPh" = ( /obj/machinery/light/directional/north, /obj/machinery/digital_clock/directional/north, @@ -70693,6 +70984,16 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/cargo/lobby) +"vRh" = ( +/obj/machinery/door/airlock{ + name = "Observatory Access" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "vRo" = ( /obj/machinery/shower/directional/north, /obj/effect/turf_decal/trimline/blue/line{ @@ -70872,14 +71173,6 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"vTl" = ( -/obj/machinery/door/airlock/engineering{ - name = "Starboard Quarter Solar Access" - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/turf/open/floor/plating, -/area/station/maintenance/solars/starboard/aft) "vTo" = ( /obj/structure/disposalpipe/sorting/mail{ dir = 1 @@ -71275,13 +71568,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"vZq" = ( -/obj/structure/chair/plastic{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/department/cargo) "vZt" = ( /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ dir = 8 @@ -72064,6 +72350,12 @@ /mob/living/carbon/human/species/monkey, /turf/open/floor/grass, /area/station/medical/virology) +"wlK" = ( +/obj/structure/railing/corner/end/flip{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) "wlR" = ( /obj/structure/closet/boxinggloves, /turf/open/floor/iron, @@ -72230,10 +72522,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/brig) -"wog" = ( -/obj/item/food/fried_chicken, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/station/maintenance/fore/lesser) "wol" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/extinguisher_cabinet/directional/east, @@ -72951,6 +73239,15 @@ }, /turf/open/floor/iron/dark/textured_half, /area/station/service/bar/atrium) +"wyR" = ( +/obj/machinery/door/airlock/engineering{ + name = "Starboard Quarter Solar Access" + }, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/aft) "wzc" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -72983,6 +73280,16 @@ }, /turf/open/floor/iron, /area/mine/laborcamp) +"wzz" = ( +/obj/structure/rack, +/obj/machinery/light/cold/directional/north, +/obj/item/storage/box/bandages{ + pixel_y = 6; + pixel_x = -6 + }, +/obj/item/healthanalyzer, +/turf/open/floor/iron/white/textured, +/area/station/security/medical) "wAq" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -74470,14 +74777,6 @@ /obj/effect/spawner/random/structure/tank_holder, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"wWm" = ( -/obj/item/trash/raisins, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"wWJ" = ( -/obj/effect/landmark/generic_maintenance_landmark, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "wWM" = ( /obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ dir = 4 @@ -74507,11 +74806,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/mine/laborcamp) -"wXc" = ( -/obj/structure/sign/warning/cold_temp/directional/east, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "wXh" = ( /obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/co2{ dir = 8 @@ -74535,11 +74829,6 @@ /obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron, /area/station/cargo/office) -"wXW" = ( -/obj/structure/sign/warning/gas_mask/directional/south, -/obj/effect/spawner/random/trash/grille_or_waste, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/morgue) "wXX" = ( /obj/machinery/door/window/left/directional/north{ base_state = "right"; @@ -75262,15 +75551,6 @@ }, /turf/open/floor/iron/dark/textured_edge, /area/station/security/prison) -"xgM" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/mapping_helpers/burnt_floor, -/obj/machinery/airalarm/directional/north, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating, -/area/station/maintenance/port/lesser) "xgO" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/yellow/corner{ @@ -75494,14 +75774,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/commons/dorms) -"xkG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/generic_maintenance_landmark, -/obj/effect/decal/cleanable/confetti, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/maintenance/port/fore) "xkH" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -75940,13 +76212,6 @@ /obj/machinery/light/blacklight/directional/east, /turf/open/floor/wood, /area/station/service/library) -"xsm" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/station/maintenance/port/aft) "xss" = ( /obj/machinery/light/directional/south, /obj/effect/turf_decal/tile/yellow/half/contrasted, @@ -76454,6 +76719,14 @@ /obj/structure/cable, /turf/open/floor/iron, /area/mine/laborcamp/security) +"xzt" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/light/small/dim/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/morgue) "xzO" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/maintenance/three, @@ -76893,6 +77166,12 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"xGk" = ( +/obj/structure/girder, +/obj/structure/grille, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "xGp" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/left/directional/north{ @@ -77225,6 +77504,11 @@ }, /turf/open/floor/iron/cafeteria, /area/station/security/prison/work) +"xMf" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/plating, +/area/station/maintenance/fore) "xMh" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, @@ -77356,6 +77640,21 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) +"xPz" = ( +/obj/structure/cable, +/obj/machinery/button/door/directional/west{ + id = "maint2"; + name = "Blast Door Control B"; + pixel_y = 4 + }, +/obj/machinery/button/door/directional/west{ + id = "maint1"; + name = "Blast Door Control A"; + pixel_y = -6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "xPF" = ( /obj/structure/fence{ dir = 4 @@ -77663,6 +77962,13 @@ }, /turf/open/floor/wood/tile, /area/station/service/theater) +"xUr" = ( +/obj/effect/decal/cleanable/insectguts, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "xUw" = ( /obj/structure/sign/departments/maint/directional/west, /turf/open/floor/plating/snowed/smoothed/icemoon, @@ -78170,11 +78476,6 @@ dir = 1 }, /area/station/maintenance/department/cargo) -"ycc" = ( -/obj/structure/plasticflaps, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/fore) "ych" = ( /obj/item/chair/wood/wings, /obj/effect/turf_decal/bot_red, @@ -78550,12 +78851,6 @@ dir = 4 }, /area/station/hallway/secondary/entry) -"ykn" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/maintenance/fore/lesser) "ykw" = ( /turf/closed/wall/r_wall, /area/station/security/processing) @@ -160014,7 +160309,7 @@ thA thA thA iLh -xgM +juL mLm dxE ccB @@ -164425,7 +164720,7 @@ nWH nWH nWH xjC -vZq +cbt cZO gnh iDt @@ -166416,10 +166711,10 @@ ucN iDt iDt qQf -mvp -vhg -ktC -ykn +gXn +iDv +qkP +feP pFV jPs qQf @@ -166676,7 +166971,7 @@ qQf qQf qQf fro -sWv +aCt tym jur vqi @@ -166930,7 +167225,7 @@ ucN iDt iDt qQf -wog +aNC qQf uxZ dBp @@ -179327,7 +179622,7 @@ aJw sBJ qpD nxM -wXW +ixW nxM nxM pBW @@ -179581,10 +179876,10 @@ pHD jKG hjM xDU -aBx -sBJ -vLY -qck +aMB +vbr +jzt +noC bHF eos jol @@ -180576,9 +180871,9 @@ uRz aak dMS vJL -erU -qqC -oYx +pMP +pNI +mcP nCJ dMS fuH @@ -180869,7 +181164,7 @@ qmK nxM lAA nxM -vOI +ivf nxM qqv xzO @@ -181126,7 +181421,7 @@ lAA nxM scw ilN -jdP +vis nxM bgd kmM @@ -181383,10 +181678,10 @@ scw deN iDt nxM -jdP -jdP -jdP -cFJ +vis +vis +vis +esb oiT xUe hjM @@ -181643,7 +181938,7 @@ nxM myP nxM nxM -mXf +bdA nxM nxM hjM @@ -181874,7 +182169,7 @@ wvL jnY cWJ dYX -wWJ +dVj aRQ ako rjr @@ -181900,7 +182195,7 @@ nxM wEU jtD rBv -owG +qHl hRX oiT smw @@ -182155,9 +182450,9 @@ xMq xMq nxM bvS -vKo -qHl -rwG +xzt +owG +hjO cmQ skJ owG @@ -184745,9 +185040,9 @@ nsp fWO tRd tRd -jOp -oxO -oxO +bHB +tRd +tRd alM alM oxO @@ -185004,7 +185299,7 @@ tRd alM alM iry -oxO +tRd lms alM oxO @@ -185261,7 +185556,7 @@ tRd alM alM fuD -oxO +vIb eEY oxO fWO @@ -186015,9 +186310,9 @@ oxO oxO oxO oxO -oxO -oxO -oxO +fif +tRd +tRd nPI wjy nPI @@ -188274,7 +188569,7 @@ tBs nHQ oik oFl -vGJ +ksZ uDl feQ tBs @@ -190112,7 +190407,7 @@ alM alM alM oxO -oxO +mrj tNJ tNJ nyJ @@ -190374,11 +190669,11 @@ oLa pvh oxO oxO +fzF oxO +cvt oxO -iKG -oxO -oxO +uSj oxO oxO oxO @@ -225046,7 +225341,7 @@ stP dVX oLo tKI -eae +hEC bCQ tKI tKI @@ -226034,12 +226329,12 @@ izw pVN kJe pVN -eSg -pVN -inw -iwD -anl -anl +jbt +ama +bWD +rgs +eUf +eUf eUf hjI lJO @@ -227075,7 +227370,7 @@ qDI lJO lJO lJO -eUf +anI lFq dix lJO @@ -227583,7 +227878,7 @@ qDI pWb okU rSe -txe +lxI rSe hRt lJO @@ -228868,7 +229163,7 @@ lJO unq mZn uSd -xkG +tou tIh lJO ovt @@ -229156,7 +229451,7 @@ uKO juq tKI xqX -bCQ +mFC wBb tKI veh @@ -229197,12 +229492,12 @@ bln pRj mVN hUI -lqP +xUr qAI snw mNY kkp -ipE +hAW ipE glh bln @@ -229459,7 +229754,7 @@ mXN vUz mNY qIf -smj +cQg czR glh bln @@ -229716,7 +230011,7 @@ lDh pRj mNY bCc -kRr +kuc mNY glh bln @@ -229973,7 +230268,7 @@ aPV gFH apj cqL -eAj +xHe ptf bln bln @@ -230219,7 +230514,7 @@ thW pRj uhX dnM -aBQ +dex wEW hjH eMT @@ -230230,7 +230525,7 @@ ukA hUI apj daS -eAj +xHe ptf bln bln @@ -230486,8 +230781,8 @@ tKV cjL gfC pRj -eAj -hHs +daS +sqe pRj pRj pRj @@ -230728,7 +231023,7 @@ bln pRj jzk kYF -csE +mnm qzM pRj dOH @@ -230739,12 +231034,12 @@ hjH pRj nDy hUI -xsm +kNd nVR iWZ bse xHe -wXc +hcO lPE daS nNr @@ -231738,7 +232033,7 @@ kXA kXA oDt kRU -mTi +oQa kXr kQL ewq @@ -232269,7 +232564,7 @@ bln bln ptf jYS -jSe +pcX jSe oxB jQC @@ -233571,17 +233866,17 @@ pRj pRj pRj poc -oef -wWm -fSj -daS -lge -daS -rlj -daS -fIL -daS -rOX +bMi +aOG +txv +pXv +lDO +pXv +nhF +pXv +vRh +pXv +kbQ nkO ptf bln @@ -233830,7 +234125,7 @@ blO xHe pRj glX -daS +uSp kNZ pRj lDF @@ -234522,7 +234817,7 @@ sDl hEI iwj kEB -kpu +lPd rtq lJO lJO @@ -234601,7 +234896,7 @@ gob hwn cAe mXa -fzA +nAq mXa mXa qCl @@ -236373,7 +236668,7 @@ paM sqq nBk nBk -nIa +jnB nBk nBk aCX @@ -239644,7 +239939,7 @@ bUx jOQ bxQ bUx -sUI +wzz vxc aKt tDk @@ -243056,7 +243351,7 @@ cvS sxu kwX pNq -pNq +aGi gDp rxa qgm @@ -243253,9 +243548,9 @@ bln fsm bUx cCC -jOQ -ykA -ykA +xMf +aMR +eFH skl iHz jOQ @@ -243512,10 +243807,10 @@ bUx wnq dqv cKn -ykA +eFH skl -kUG -ykA +gFP +eFH skl gmW gmW @@ -243769,7 +244064,7 @@ skl skl skl skl -ycc +ewv skl byP eXY @@ -247434,7 +247729,7 @@ kRP kRP kRP vpR -qTe +wlK uep cvS lUU @@ -247691,7 +247986,7 @@ iHZ uOg kRP pAN -mRu +cky uep vsZ hnd @@ -250966,13 +251261,13 @@ rUR kxv fIs kxv -gHv -kxv -pHd -tvZ -tvZ -tvZ -tvZ +viZ +eTB +mKJ +uSm +uSm +uSm +uSm kKL gAt orf @@ -251040,7 +251335,7 @@ vIe sZF xsA wRr -lXm +mwB sKf tfG eZu @@ -251229,7 +251524,7 @@ pDQ xBL wJM wJM -tvZ +uSm kKL dnL orf @@ -251297,7 +251592,7 @@ sZF sZF hEZ mlo -sKf +tZM sKf sZF sZF @@ -251486,7 +251781,7 @@ mHB pVl kKL bqe -tvZ +uSm kKL hOu orf @@ -251743,7 +252038,7 @@ cvF lli kKL mwu -tvZ +uSm kKL kKL lAG @@ -252000,7 +252295,7 @@ oCv gGF kKL qqB -tvZ +uSm kKL weF orf @@ -252257,7 +252552,7 @@ sRI lli kKL hJx -iRd +efu kKL hOu orf @@ -252514,7 +252809,7 @@ rSq raH kKL lli -tvZ +uSm kKL kKL orf @@ -252771,9 +253066,9 @@ kKL kKL kKL xcp -tvZ -sin -niB +uSm +voP +xPz iOc uDW xlN @@ -253028,7 +253323,7 @@ sRI jwF kKL lli -sRI +tYK paT lli lli @@ -253281,11 +253576,11 @@ bln bln kKL cjO -qeJ -lRs -osq -lli -gGF +gPG +gwo +cxo +tDy +lsd kKL kKL kKL @@ -254834,7 +255129,7 @@ wsO bcC bcC bcC -bcC +neJ unu kKL hno @@ -255091,7 +255386,7 @@ bcC lli hJx weF -lli +cxS aME kKL qLf @@ -255338,7 +255633,7 @@ iyY kbn rCf vZa -qxa +hcb sxO ijb kKL @@ -255430,7 +255725,7 @@ vzD vzD vzD uZc -uZc +mIG sGZ gQw bln @@ -255678,16 +255973,16 @@ eBz eBz eBz fxV -jCl -jCl -jCl -rIw -jCl -nuj -jCl -mUt -uZc -uZc +rEU +rEU +rEU +dVP +rEU +dVP +rEU +lpR +bIr +bIr fNa gQw bln @@ -256191,10 +256486,10 @@ vzD vzD fxT jOj -pGM -mvf -oNp -ebw +xGk +ipS +fRn +eHA cAK szD xYw @@ -256451,7 +256746,7 @@ jOj axu vzD pPB -loQ +apL fwD too mHw @@ -258753,7 +259048,7 @@ rDZ rDZ bgx qUY -jCl +dDk juQ vzD geJ @@ -259010,7 +259305,7 @@ uaT oTd bgx jCl -jCl +rEU jCl vzD geJ @@ -259267,9 +259562,9 @@ rDZ rDZ bgx vzb -jCl -nuj -tgw +rEU +dVP +dIp pTW vzD bgx @@ -259785,10 +260080,10 @@ jCl axu jCl geJ -oiH -vTl -xCz -luK +eIo +wyR +jWR +dZx xCz qYP xCz @@ -260268,7 +260563,7 @@ elw elw elw rft -dbw +qet idt fMq pSz @@ -260281,7 +260576,7 @@ hyV bgx gti bhk -jCl +vNr jCl jCl jCl @@ -260295,7 +260590,7 @@ vzD vzD vzD vzD -bcQ +iFu vzD vzD vzD @@ -260552,7 +260847,7 @@ ibw iQT qob rZa -jCl +rEU vzD sDr twZ @@ -260808,8 +261103,8 @@ tKN qZh vzD twZ -jCl -jCl +brq +rEU vXd jCl mwQ diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index af7f222ea55..1e68aec16f6 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -2133,6 +2133,14 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron/dark, /area/station/command/bridge) +"aNL" = ( +/obj/effect/spawner/random/trash/garbage, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "aNN" = ( /obj/machinery/airalarm/directional/south, /obj/machinery/disposal/bin, @@ -6060,13 +6068,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"ckG" = ( -/obj/effect/landmark/generic_maintenance_landmark, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/hangover, -/turf/open/floor/carpet, -/area/station/commons/dorms) "ckI" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -12987,6 +12988,7 @@ dir = 4 }, /obj/effect/mapping_helpers/broken_floor, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, /area/station/maintenance/port/aft) "eNR" = ( @@ -15027,11 +15029,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/engineering/atmos) -"fBi" = ( -/obj/effect/landmark/generic_maintenance_landmark, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "fBl" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -17443,6 +17440,10 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron, /area/station/science/explab) +"gvZ" = ( +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "gwc" = ( /obj/structure/chair/stool/bar/directional/south, /obj/effect/turf_decal/siding/wood{ @@ -21108,6 +21109,10 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/chapel) +"hPG" = ( +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "hPK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/duct, @@ -21462,13 +21467,6 @@ /obj/effect/landmark/navigate_destination, /turf/open/floor/iron/white, /area/station/medical/virology) -"hVW" = ( -/obj/effect/landmark/generic_maintenance_landmark, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/hangover, -/turf/open/floor/wood, -/area/station/commons/dorms) "hVX" = ( /obj/structure/toilet{ pixel_y = 8 @@ -22877,6 +22875,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, /area/station/maintenance/port/aft) "itr" = ( @@ -23157,11 +23156,6 @@ /obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) -"iyj" = ( -/obj/effect/landmark/generic_maintenance_landmark, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "iym" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -23629,7 +23623,6 @@ /turf/open/floor/iron, /area/station/engineering/atmos) "iGy" = ( -/obj/effect/landmark/generic_maintenance_landmark, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, @@ -27118,6 +27111,13 @@ /obj/structure/railing/corner, /turf/open/floor/plating/airless, /area/space/nearstation) +"jLI" = ( +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "jMo" = ( /obj/structure/chair/stool/directional/north, /turf/open/floor/iron, @@ -29643,6 +29643,8 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, /area/station/maintenance/port/aft) "kGs" = ( @@ -30165,6 +30167,11 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/locker) +"kQZ" = ( +/obj/effect/spawner/random/structure/grille, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "kRc" = ( /obj/structure/table, /obj/item/multitool{ @@ -31231,7 +31238,6 @@ /area/station/engineering/storage/tech) "lkZ" = ( /obj/structure/cable, -/obj/effect/landmark/generic_maintenance_landmark, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, @@ -32133,7 +32139,6 @@ /turf/open/floor/plating, /area/station/maintenance/port) "lEB" = ( -/obj/effect/landmark/generic_maintenance_landmark, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, @@ -35965,7 +35970,6 @@ /turf/open/floor/plating, /area/station/engineering/atmos) "mVS" = ( -/obj/effect/landmark/generic_maintenance_landmark, /obj/effect/decal/cleanable/cobweb, /obj/effect/spawner/random/trash/janitor_supplies, /turf/open/floor/plating, @@ -38824,7 +38828,6 @@ /turf/open/floor/plating, /area/station/maintenance/port/fore) "nTU" = ( -/obj/effect/landmark/generic_maintenance_landmark, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, @@ -39652,6 +39655,12 @@ }, /turf/open/floor/engine/plasma, /area/station/engineering/atmos) +"okd" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "okP" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -41387,7 +41396,6 @@ /turf/open/floor/iron, /area/station/science/xenobiology) "oQN" = ( -/obj/effect/landmark/generic_maintenance_landmark, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, @@ -50711,6 +50719,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, /area/station/maintenance/fore) "shl" = ( @@ -56761,7 +56770,6 @@ /turf/open/floor/iron/white, /area/station/medical/chemistry) "unw" = ( -/obj/effect/landmark/generic_maintenance_landmark, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, @@ -57212,7 +57220,6 @@ /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) "uuz" = ( -/obj/effect/landmark/generic_maintenance_landmark, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, @@ -59736,6 +59743,7 @@ "vmY" = ( /obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6/directional/east, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, /area/station/maintenance/port/aft) "vnk" = ( @@ -60513,7 +60521,6 @@ /turf/open/floor/iron, /area/station/science/robotics/lab) "vzX" = ( -/obj/effect/landmark/generic_maintenance_landmark, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, @@ -96764,7 +96771,7 @@ jxW svS tjE rDB -nFa +gvZ lqh dKC mHK @@ -101136,7 +101143,7 @@ rxG dpN dpN egk -oEx +aNL bIa vYl nFa @@ -102664,7 +102671,7 @@ oWk xuD fFa xdF -fPD +qkl fPD fPD xZx @@ -102921,7 +102928,7 @@ oWk xuD sip bLd -clj +kQZ bLd bLd bLd @@ -103178,8 +103185,8 @@ oWk lPc qZg bLd -fPD -fPD +qkl +qkl fPD uGX oWk @@ -103436,7 +103443,7 @@ xuD qZg bLd yeI -fPD +okd fPD nYU oWk @@ -103867,10 +103874,10 @@ lOU nmI lnc sBa -hVW +obw lnc avU -ckG +cKC lnc crL wcr @@ -104468,7 +104475,7 @@ fPD fPD bLd ojt -iyj +eQY bLd tjf tjf @@ -104982,7 +104989,7 @@ vXO qkl bLd ias -fPD +hPG nMj pPN fPD @@ -105746,7 +105753,7 @@ yhu rnn oWk nPJ -jJm +jLI fwP fwP fwP @@ -107782,7 +107789,7 @@ fWA fWA dRj lWq -fBi +lWq lWq tLg pnH diff --git a/_maps/map_files/NorthStar/north_star.dmm b/_maps/map_files/NorthStar/north_star.dmm index 85c22ea665f..cc842a66084 100644 --- a/_maps/map_files/NorthStar/north_star.dmm +++ b/_maps/map_files/NorthStar/north_star.dmm @@ -182,11 +182,6 @@ }, /turf/open/floor/plating, /area/station/engineering/atmos/project) -"abJ" = ( -/obj/machinery/light_switch/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/station/maintenance/floor3/starboard/aft) "abP" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -300,6 +295,11 @@ /obj/effect/turf_decal/trimline/blue/line, /turf/open/floor/carpet/blue, /area/station/command/meeting_room) +"acX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen/abandoned) "adk" = ( /obj/structure/grille, /obj/structure/sign/directions/medical/directional/north, @@ -566,14 +566,6 @@ /obj/effect/spawner/random/maintenance/two, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port) -"agW" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/generic_maintenance_landmark, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "ahd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -1791,6 +1783,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/fore) +"awK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/pod/light, +/area/station/maintenance/floor4/port) "awR" = ( /obj/structure/flora/bush/flowers_br/style_random, /obj/machinery/light/directional/west, @@ -2521,13 +2519,6 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/iron, /area/station/cargo/storage) -"aHf" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/light, -/area/station/maintenance/solars/port/aft) "aHk" = ( /turf/closed/wall, /area/station/medical/medbay/lobby) @@ -7290,6 +7281,13 @@ /obj/effect/spawner/random/maintenance/two, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard) +"bOM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/airalarm/directional/east, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/wood/parquet, +/area/station/maintenance/floor2/port/aft) "bOZ" = ( /obj/effect/turf_decal/tile/red/half, /obj/structure/disposalpipe/segment, @@ -11632,16 +11630,6 @@ }, /turf/open/floor/iron/white, /area/station/science/robotics/lab) -"cVU" = ( -/obj/machinery/door/airlock/hatch{ - name = "Wine Cellar" - }, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/starboard/aft) "cVX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -12032,16 +12020,6 @@ /obj/structure/cable, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/fore) -"dad" = ( -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/hatch{ - name = "Emergency Power" - }, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor4/port/fore) "daf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, @@ -13068,11 +13046,6 @@ /obj/machinery/light/broken/directional/south, /turf/open/floor/plating, /area/station/medical/abandoned) -"dqJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/light, -/area/station/maintenance/floor2/port/aft) "dqQ" = ( /turf/closed/wall/r_wall, /area/station/security/medical) @@ -13182,12 +13155,6 @@ /obj/item/flamethrower, /turf/open/floor/iron, /area/station/maintenance/floor4/starboard) -"dsw" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/turf/open/floor/wood, -/area/station/maintenance/floor2/starboard) "dsz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -14939,6 +14906,16 @@ dir = 1 }, /area/station/hallway/floor1/aft) +"dRp" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/hatch{ + name = "Emergency Power" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor4/port/fore) "dRs" = ( /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/dark, @@ -15282,6 +15259,13 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/storage/eva) +"dVq" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/item/storage/medkit/regular, +/turf/open/floor/iron/white, +/area/station/security/medical) "dVt" = ( /obj/structure/railing{ dir = 4 @@ -18144,6 +18128,11 @@ dir = 4 }, /area/station/command/bridge) +"eId" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/pod/light, +/area/station/maintenance/floor4/port/fore) "eIq" = ( /obj/structure/chair/stool/directional/west, /obj/effect/turf_decal/trimline/red/warning{ @@ -18534,6 +18523,14 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/fore) +"ePr" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/pod/light, +/area/station/maintenance/floor4/port/fore) "ePv" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -21650,6 +21647,12 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/secondary/service) +"fKz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/pod/light, +/area/station/maintenance/floor4/port/fore) "fKC" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -23526,6 +23529,10 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"gki" = ( +/obj/effect/baseturf_helper/reinforced_plating/ceiling, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "gkq" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -23657,11 +23664,6 @@ /obj/machinery/newscaster/directional/west, /turf/open/floor/iron/dark, /area/station/hallway/secondary/service) -"gmg" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/pod/light, -/area/station/maintenance/floor4/port/fore) "gmj" = ( /obj/structure/chair/office{ dir = 1 @@ -23732,6 +23734,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard/aft) +"gmM" = ( +/obj/machinery/light_switch/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/maintenance/floor3/starboard/aft) "gmO" = ( /obj/machinery/camera/autoname/directional/west, /turf/open/floor/catwalk_floor, @@ -24452,6 +24463,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/aft) +"gwV" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/wood, +/area/station/maintenance/floor2/starboard) "gxb" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/multilayer/multiz, @@ -27255,6 +27273,11 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron/dark/smooth_large, /area/station/science/robotics/mechbay) +"hiO" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/floor4/port/fore) "hiQ" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -29617,6 +29640,12 @@ /obj/structure/disposalpipe/trunk, /turf/open/floor/carpet, /area/station/service/lawoffice) +"hNZ" = ( +/obj/structure/chair/wood, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/carpet/green, +/area/station/service/abandoned_gambling_den) "hOs" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -30857,6 +30886,12 @@ }, /turf/open/floor/iron/white, /area/station/science/circuits) +"ifE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/maintenance/floor3/starboard/aft) "ifG" = ( /obj/item/kirbyplants/random, /turf/open/floor/iron/dark/side{ @@ -31768,11 +31803,6 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"irp" = ( -/obj/effect/landmark/generic_maintenance_landmark, -/obj/effect/baseturf_helper/reinforced_plating/ceiling, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "irx" = ( /obj/machinery/door/window/left/directional/south{ name = "Robotics Lab"; @@ -32627,6 +32657,11 @@ /obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port) +"iCI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard/aft) "iCJ" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -33700,10 +33735,6 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/dark, /area/station/service/library/lounge) -"iRo" = ( -/obj/machinery/firealarm/directional/north, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/starboard) "iRr" = ( /obj/effect/turf_decal/siding/wideplating_new{ dir = 10 @@ -34075,6 +34106,11 @@ }, /turf/open/floor/iron/white, /area/station/command/heads_quarters/rd) +"iXb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/pod/light, +/area/station/maintenance/floor4/starboard/fore) "iXe" = ( /obj/item/restraints/legcuffs/beartrap/prearmed, /turf/open/floor/pod/light, @@ -36192,13 +36228,6 @@ }, /turf/open/floor/pod/dark, /area/station/bitrunning/den) -"jAv" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/item/reagent_containers/syringe, -/turf/open/floor/iron/white, -/area/station/security/medical) "jAB" = ( /obj/machinery/light/floor, /turf/open/floor/iron/dark/side{ @@ -38169,15 +38198,6 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) -"kbW" = ( -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Access" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/structure/barricade/wooden/crude, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/starboard) "kca" = ( /turf/closed/wall/r_wall, /area/station/service/library/lounge) @@ -39135,6 +39155,10 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron/white/textured, /area/station/medical/office) +"kof" = ( +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/medical/abandoned) "kok" = ( /obj/effect/turf_decal/trimline/dark_blue/line{ dir = 6 @@ -39697,6 +39721,14 @@ }, /turf/open/floor/wood/parquet, /area/station/service/lawoffice) +"kvr" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/pod/light, +/area/station/maintenance/solars/port/aft) "kvw" = ( /obj/machinery/igniter/incinerator_ordmix, /turf/open/floor/engine/vacuum, @@ -39952,6 +39984,12 @@ "kyR" = ( /turf/closed/wall, /area/station/hallway/floor1/fore) +"kzf" = ( +/obj/effect/spawner/random/trash/grime, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/medical/abandoned) "kzj" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -42922,6 +42960,17 @@ dir = 1 }, /area/station/medical/chemistry) +"lkI" = ( +/obj/structure/table, +/obj/item/storage/box/bandages{ + pixel_y = 6; + pixel_x = -6 + }, +/obj/item/storage/box/donkpockets{ + pixel_x = 6 + }, +/turf/open/floor/catwalk_floor/iron, +/area/station/cargo/storage) "lkP" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -43376,10 +43425,6 @@ /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, /area/station/maintenance/floor2/port) -"lrM" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/pod/light, -/area/station/maintenance/solars/starboard/aft) "lrN" = ( /obj/machinery/portable_atmospherics/canister/nitrogen, /obj/machinery/atmospherics/components/unary/portables_connector{ @@ -44466,6 +44511,10 @@ /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/pod/light, /area/station/maintenance/floor3/port/fore) +"lGN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor1/starboard) "lGX" = ( /obj/structure/flora/bush/sparsegrass/style_random, /obj/structure/sign/poster/official/random/directional/north, @@ -45375,6 +45424,12 @@ "lRY" = ( /turf/closed/wall, /area/station/commons/vacant_room/office) +"lSd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/oil, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/pod/light, +/area/station/maintenance/floor1/port/fore) "lSt" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/grime, @@ -46405,13 +46460,6 @@ /obj/structure/flora/bush/flowers_br/style_random, /turf/open/floor/grass, /area/station/security/courtroom) -"meE" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/item/storage/medkit/regular, -/turf/open/floor/iron/white, -/area/station/security/medical) "meH" = ( /obj/machinery/door/airlock/medical{ name = "CMO Quarters" @@ -47672,6 +47720,11 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"mvl" = ( +/obj/machinery/firealarm/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor1/starboard) "mvs" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -51202,11 +51255,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/port/aft) -"noF" = ( -/obj/effect/spawner/random/trash/grime, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/medical/abandoned) "noM" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer2{ dir = 4 @@ -51454,13 +51502,6 @@ }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"nry" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/pod/light, -/area/station/maintenance/floor4/port/fore) "nrB" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -52303,6 +52344,11 @@ /obj/structure/sign/departments/security, /turf/closed/wall/r_wall, /area/station/security/checkpoint/first) +"nCt" = ( +/obj/effect/landmark/blobstart, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/grass/fairy, +/area/station/maintenance/floor2/port/fore) "nCA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/dark, @@ -54201,6 +54247,11 @@ /obj/structure/window/spawner/directional/south, /turf/open/floor/grass, /area/station/hallway/secondary/exit/departure_lounge) +"ocr" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/pod, +/area/station/maintenance/floor4/starboard/aft) "oct" = ( /obj/machinery/camera/directional/south{ c_tag = "Security - Exterior" @@ -57630,6 +57681,12 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/carpet/green, /area/station/commons/dorms/apartment1) +"oYH" = ( +/obj/machinery/airalarm/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/floor3/starboard) "oYI" = ( /obj/effect/turf_decal/stripes{ dir = 4 @@ -58340,6 +58397,11 @@ /obj/structure/disposalpipe/trunk, /turf/open/floor/iron/dark, /area/station/service/hydroponics) +"pjq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/pod/light, +/area/station/maintenance/floor1/starboard) "pjs" = ( /obj/machinery/vending/hydronutrients, /obj/machinery/light/small/directional/north, @@ -58633,6 +58695,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/miningdock) +"pnv" = ( +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Access" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/structure/barricade/wooden/crude, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/pod/light, +/area/station/maintenance/floor1/starboard) "pnw" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/official/random/directional/south, @@ -59858,12 +59930,6 @@ }, /turf/open/floor/iron, /area/station/hallway/floor3/fore) -"pDB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/wood/parquet, -/area/station/maintenance/floor2/port/aft) "pDK" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -62619,17 +62685,6 @@ dir = 6 }, /area/station/commons/storage/primary) -"qsz" = ( -/obj/structure/table, -/obj/item/storage/box/bandages{ - pixel_y = 6; - pixel_x = -6 - }, -/obj/item/storage/box/donkpockets{ - pixel_x = 6 - }, -/turf/open/floor/catwalk_floor/iron, -/area/station/cargo/storage) "qsD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -66414,6 +66469,12 @@ /obj/structure/closet/firecloset, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) +"roL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/pod/light, +/area/station/maintenance/floor2/port/aft) "roZ" = ( /obj/machinery/light/floor, /turf/open/floor/iron, @@ -66844,10 +66905,6 @@ }, /turf/open/floor/plating, /area/station/cargo/storage) -"rvh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard/aft) "rvD" = ( /obj/structure/sink/directional/south, /obj/structure/mirror/directional/north, @@ -67741,6 +67798,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/virology) +"rIr" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "rIt" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/dark, @@ -72864,6 +72931,17 @@ /obj/effect/landmark/start/warden, /turf/open/floor/iron/dark, /area/station/security/warden) +"tcr" = ( +/obj/machinery/door/airlock/hatch{ + name = "Wine Cellar" + }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/aft) "tcA" = ( /obj/machinery/telecomms/server/presets/engineering, /turf/open/floor/circuit/telecomms, @@ -73304,11 +73382,6 @@ /obj/machinery/telecomms/broadcaster/preset_left, /turf/open/floor/circuit/green/telecomms, /area/station/tcommsat/server) -"tiC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/oil, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/port/fore) "tiX" = ( /obj/effect/turf_decal/trimline/green/warning{ dir = 10 @@ -74704,6 +74777,12 @@ /obj/machinery/vending/cola/starkist, /turf/open/floor/wood, /area/station/command/meeting_room) +"tAJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/floor4/port/fore) "tAL" = ( /obj/structure/railing{ dir = 4 @@ -74933,10 +75012,6 @@ /obj/machinery/light/cold/directional/north, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"tEb" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/textured_large, -/area/station/maintenance/solars/starboard/fore) "tEc" = ( /obj/machinery/door/airlock/external{ name = "External Airlock" @@ -75176,10 +75251,6 @@ }, /turf/open/floor/iron/cafeteria, /area/station/security/prison) -"tIa" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/floor4/port/fore) "tIc" = ( /obj/structure/chair/comfy/black{ dir = 8 @@ -76723,11 +76794,6 @@ /obj/structure/cable, /turf/open/floor/iron/textured_large, /area/station/maintenance/disposal/incinerator) -"udV" = ( -/obj/effect/spawner/structure/window, -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/station/maintenance/floor2/port/aft) "udZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -78172,6 +78238,13 @@ /obj/machinery/newscaster/directional/west, /turf/open/floor/iron/dark, /area/station/engineering/atmos/office) +"uyz" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "uyD" = ( /turf/closed/wall/r_wall, /area/station/engineering/supermatter) @@ -78195,11 +78268,6 @@ initial_gas_mix = "TEMP=2.7" }, /area/station/science/ordnance/bomb) -"uyS" = ( -/obj/machinery/airalarm/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/floor3/starboard) "uyX" = ( /obj/effect/turf_decal/tile/red/half/contrasted, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -78217,6 +78285,11 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron/dark, /area/station/command/teleporter) +"uzf" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/iron/textured_large, +/area/station/maintenance/solars/starboard/fore) "uzl" = ( /obj/structure/table, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -78492,10 +78565,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark, /area/station/maintenance/floor1/port) -"uDx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen/abandoned) "uDA" = ( /obj/structure/chair/sofa/corp{ dir = 8 @@ -82104,6 +82173,16 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/science/explab) +"vxL" = ( +/obj/structure/table/glass, +/obj/item/radio/intercom/directional/south, +/obj/item/storage/box/bandages{ + pixel_y = 6; + pixel_x = -6 + }, +/obj/item/storage/medkit/regular, +/turf/open/floor/iron/white, +/area/station/security/medical) "vxT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -83149,6 +83228,12 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/plating, /area/station/maintenance/floor2/starboard/aft) +"vMV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/pod/light, +/area/station/maintenance/floor1/starboard) "vNa" = ( /obj/effect/decal/cleanable/blood/drip, /turf/open/floor/iron/chapel{ @@ -84296,6 +84381,11 @@ }, /turf/open/space/openspace, /area/space) +"wch" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/pod/light, +/area/station/maintenance/solars/starboard/aft) "wci" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 4 @@ -85431,6 +85521,12 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/holding_cell) +"wpX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/pod/light, +/area/station/maintenance/floor4/port/fore) "wpY" = ( /obj/machinery/light/red/dim/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -86836,6 +86932,13 @@ }, /turf/open/floor/iron/dark/side, /area/station/security/prison) +"wHC" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/reagent_containers/syringe, +/turf/open/floor/iron/white, +/area/station/security/medical) "wHP" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 4 @@ -87237,10 +87340,6 @@ }, /turf/open/floor/iron, /area/station/science/auxlab) -"wLy" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/pod, -/area/station/maintenance/floor4/starboard/aft) "wLC" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -89292,16 +89391,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/hallway/floor4/aft) -"xoA" = ( -/obj/structure/table/glass, -/obj/item/radio/intercom/directional/south, -/obj/item/storage/box/bandages{ - pixel_y = 6; - pixel_x = -6 - }, -/obj/item/storage/medkit/regular, -/turf/open/floor/iron/white, -/area/station/security/medical) "xoF" = ( /obj/effect/turf_decal/trimline/purple/line, /obj/effect/turf_decal/trimline/purple/filled/corner{ @@ -90785,11 +90874,6 @@ "xHe" = ( /turf/closed/wall, /area/station/maintenance/floor4/starboard/fore) -"xHf" = ( -/obj/structure/chair/wood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/carpet/green, -/area/station/service/abandoned_gambling_den) "xHg" = ( /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/engine/hull/reinforced, @@ -92673,10 +92757,6 @@ }, /turf/open/floor/wood/large, /area/station/service/library/artgallery) -"yiV" = ( -/obj/effect/landmark/blobstart, -/turf/open/floor/grass/fairy, -/area/station/maintenance/floor2/port/fore) "yiZ" = ( /obj/effect/turf_decal/bot, /obj/effect/decal/cleanable/dirt, @@ -113861,7 +113941,7 @@ vIx hJy rXp oZW -tiC +lSd ifx hJy htg @@ -118460,7 +118540,7 @@ oCK fgr cJt jfa -qsz +lkI cMA mnR bvf @@ -126934,10 +127014,10 @@ bdC ddv mST dui -tRj -tRj -kbW -jJm +vMV +pjq +pnv +lGN wsE whV lYR @@ -127194,7 +127274,7 @@ dui rxJ jVW whV -jJm +lGN jFT whV whV @@ -127451,7 +127531,7 @@ whV whV whV whV -jJm +lGN yfi wJB eFY @@ -127708,7 +127788,7 @@ whV mWJ qKt whV -iRo +mvl jQG eFY qfr @@ -127965,7 +128045,7 @@ nho qKt aqd whV -jJm +lGN yfi vqN eFY @@ -128222,7 +128302,7 @@ whV whV whV whV -jJm +lGN bCT nSv vWS @@ -130788,7 +130868,7 @@ rIS fXy ihH gok -irp +gki kxq nJK nBx @@ -176288,7 +176368,7 @@ knP cpW qtf bQv -tEb +uzf rYw uUG wpa @@ -181978,7 +182058,7 @@ bSb clJ kEf ejl -uDx +acX rGP cfU pkr @@ -185317,7 +185397,7 @@ uXA hLz hZP pJf -yiV +nCt uJr pJf owM @@ -193244,7 +193324,7 @@ wJI wJI qvk sff -dsw +gwV erN wGl wGl @@ -197391,7 +197471,7 @@ rlB wLV uMK aZs -agW +uyz aKF vrA ffA @@ -205069,7 +205149,7 @@ oyh dEt dEt exc -rvh +iCI bwK tHn qWS @@ -205358,7 +205438,7 @@ aGI xui ijX xui -udV +aGI cWo nlN nlN @@ -206386,7 +206466,7 @@ dVH jtf nlN usq -pDB +bOM wWf xui mvS @@ -207926,7 +208006,7 @@ nlN mbe mbe rcp -dqJ +roL oin jtL cCq @@ -208189,7 +208269,7 @@ xRo cCq iDm xrj -aHf +kvr bIm hMs qCt @@ -242081,7 +242161,7 @@ kVp wRJ wRJ eCP -wPF +rIr wPF xkX ooF @@ -254185,7 +254265,7 @@ eDe xGx diU ufs -xGx +kof dDu ufs uZc @@ -257012,7 +257092,7 @@ ykZ ybK iuo wcC -noF +kzf hiu uZc gYj @@ -259033,7 +259113,7 @@ bof bof lDD xRM -uyS +oYH qrd sSB jpz @@ -268329,7 +268409,7 @@ sOD pOn mVR piR -xHf +hNZ cBq rsz mnY @@ -268557,7 +268637,7 @@ pwA rlX xLO kRw -abJ +gmM sBE kRw upo @@ -268814,7 +268894,7 @@ xJM hCJ vXH kRw -sBE +ifE iMM kRw cpa @@ -269071,7 +269151,7 @@ kRw kRw kRw kRw -cVU +tcr kRw kRw fpp @@ -269317,7 +269397,7 @@ rCv snd wVu pUC -lrM +wch qON snd tat @@ -307874,7 +307954,7 @@ ucA xHe xHe ioM -uxw +iXb xjQ iqD euv @@ -311760,10 +311840,10 @@ uIx aaO xFo lBG -gmg -tIa -wkF -dad +wpX +hiO +tAJ +dRp qlh nDu nDu @@ -312015,9 +312095,9 @@ xMF kBi uIx rao -rao -rao -nry +fKz +eId +ePr eiO wkF voT @@ -314333,7 +314413,7 @@ owb fXs dIh wtL -wtL +awK bAG wtL fXs @@ -320465,7 +320545,7 @@ kDq dlW xrY xdm -wLy +ocr vJf rVI oih @@ -323066,7 +323146,7 @@ eoL hSJ dBo mXY -xoA +vxL qFI wIn hyR @@ -323322,7 +323402,7 @@ eUU dDR iTd oPA -jAv +wHC hfd qFI iPH @@ -323579,7 +323659,7 @@ rIa bsI oOi dOD -meE +dVq bBg qFI omP diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index 7c561db5a62..d912a6ff9d6 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -19931,6 +19931,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/science/ordnance) +"gaR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/south{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/science/ordnance) "gaY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -26369,17 +26377,6 @@ }, /turf/open/floor/iron, /area/station/cargo/miningdock) -"iyC" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/effect/landmark/generic_maintenance_landmark, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/security/evidence) "iyK" = ( /obj/machinery/telecomms/bus/preset_two, /turf/open/floor/iron/dark/telecomms, @@ -32991,11 +32988,6 @@ /obj/machinery/light/small/dim/directional/north, /turf/open/floor/catwalk_floor, /area/station/hallway/primary/tram/center) -"kMw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/generic_maintenance_landmark, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "kMD" = ( /obj/machinery/duct, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -33596,6 +33588,15 @@ /obj/effect/turf_decal/trimline/neutral/filled/corner, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"kVQ" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/machinery/light/cold/directional/north, +/obj/item/storage/box/bandages, +/turf/open/floor/iron/white, +/area/station/security/medical) "kVV" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -38583,15 +38584,6 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/misc/asteroid/airless, /area/station/asteroid) -"mHT" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/machinery/light/cold/directional/north, -/obj/item/storage/box/bandages, -/turf/open/floor/iron/white, -/area/station/security/medical) "mHX" = ( /obj/effect/turf_decal/trimline/dark_blue/arrow_cw{ dir = 10 @@ -38842,10 +38834,6 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating, /area/station/maintenance/central/greater) -"mNo" = ( -/obj/effect/landmark/generic_maintenance_landmark, -/turf/open/floor/iron/dark, -/area/station/engineering/supermatter/room) "mNp" = ( /obj/structure/chair/sofa/middle{ dir = 8 @@ -39491,24 +39479,6 @@ /obj/effect/turf_decal/trimline/tram/filled/warning, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) -"nbB" = ( -/obj/structure/table, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 - }, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/obj/item/storage/box/bandages{ - pixel_y = 6; - pixel_x = -6 - }, -/obj/item/storage/box/bodybags{ - pixel_x = 3; - pixel_y = 2 - }, -/obj/item/reagent_containers/syringe, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "nbF" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, @@ -43463,15 +43433,6 @@ }, /turf/open/floor/glass/reinforced, /area/station/science/research) -"ovK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/generic_maintenance_landmark, -/obj/machinery/light/small/directional/south{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/science/ordnance) "ovL" = ( /turf/open/floor/iron, /area/station/hallway/secondary/service) @@ -43654,13 +43615,6 @@ }, /turf/open/space/openspace, /area/station/solars/starboard/fore) -"ozB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/landmark/generic_maintenance_landmark, -/turf/open/floor/iron, -/area/station/cargo/miningdock) "ozM" = ( /obj/structure/table/wood/poker, /obj/item/storage/dice, @@ -53416,10 +53370,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/tram/left) -"scF" = ( -/obj/effect/landmark/generic_maintenance_landmark, -/turf/open/floor/carpet, -/area/station/cargo/miningdock) "scO" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 1 @@ -53473,6 +53423,16 @@ /obj/effect/decal/cleanable/food/flour, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) +"sdO" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/security/evidence) "sed" = ( /obj/effect/turf_decal/trimline/dark_green/filled/line{ dir = 10 @@ -57464,6 +57424,24 @@ }, /turf/open/floor/iron/cafeteria, /area/station/science/breakroom) +"twW" = ( +/obj/structure/table, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/obj/item/storage/box/bandages{ + pixel_y = 6; + pixel_x = -6 + }, +/obj/item/storage/box/bodybags{ + pixel_x = 3; + pixel_y = 2 + }, +/obj/item/reagent_containers/syringe, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) "txh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -60934,20 +60912,6 @@ }, /turf/open/floor/noslip/tram_plate, /area/station/hallway/primary/tram/right) -"uEr" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/generic_maintenance_landmark, -/obj/effect/turf_decal/siding/thinplating{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/white/warning{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/maintenance/tram/left) "uEw" = ( /obj/machinery/button/door/directional/east{ id = "miningdorm3"; @@ -64687,18 +64651,6 @@ dir = 1 }, /area/station/commons/fitness) -"vSc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/generic_maintenance_landmark, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/white/warning, -/turf/open/floor/iron, -/area/station/maintenance/tram/right) "vSI" = ( /turf/open/openspace, /area/station/cargo/storage) @@ -65068,17 +65020,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"vZc" = ( -/obj/effect/landmark/generic_maintenance_landmark, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red/opposingcorners, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/service/theater) "vZB" = ( /obj/machinery/airalarm/directional/north, /turf/open/floor/wood/large, @@ -68593,6 +68534,12 @@ }, /turf/open/floor/iron, /area/station/security/brig) +"xuo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "xuq" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -69887,6 +69834,16 @@ /obj/machinery/light/small/dim/directional/south, /turf/open/floor/iron, /area/station/maintenance/tram/mid) +"xVb" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/service/theater) "xVp" = ( /obj/structure/cable, /turf/open/floor/wood, @@ -90537,7 +90494,7 @@ qQq hvm qQq qQq -uEr +lyV ncF elr elr @@ -100097,7 +100054,7 @@ sZA daJ gqp gqp -mNo +gqp gqp qHs aaa @@ -110109,7 +110066,7 @@ hkW rCd fFa gqV -kMw +gqV tTK xWj cdN @@ -114674,7 +114631,7 @@ kDi cJX uGW kot -scF +sOS iRL abM arE @@ -115203,7 +115160,7 @@ abM abM aaa mbJ -vSc +wip hFC hFC dBM @@ -119296,7 +119253,7 @@ aac aac pCL rci -ozB +xuo iyq pCL aac @@ -123461,7 +123418,7 @@ qAl nMB ryI frV -ovK +gaR lwt gaO mWp @@ -151152,7 +151109,7 @@ aBK dkO dta mjM -mHT +kVQ vRy gbr kMR @@ -159112,7 +159069,7 @@ abM tFJ voL mNy -iyC +sdO dGn jKq wqu @@ -167646,7 +167603,7 @@ kiN xJA gHh cen -nbB +twW iZh dyI tDP @@ -170440,7 +170397,7 @@ abM abM lZW eDV -vZc +xVb iZn dME evW From 5a19c092d955e7999ef7ba6fd08b3b0deef6ac48 Mon Sep 17 00:00:00 2001 From: Pinta <68373373+softcerv@users.noreply.github.com> Date: Wed, 4 Oct 2023 02:34:20 -0400 Subject: [PATCH 23/49] NIFSofts with TGUI now match the TGUI theme of the NIF (#24036) * wew * Update modular_skyrat/modules/modular_implants/code/nifsofts/soulcatcher.dm Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> * Just fixing this Prettier complaint for you --------- Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> --- .../modules/modular_implants/code/nifs_tgui.dm | 2 ++ .../modules/modular_implants/code/nifsofts.dm | 12 ++++++++++++ .../modular_implants/code/nifsofts/soul_poem.dm | 1 + .../modular_implants/code/nifsofts/soulcatcher.dm | 11 +++++++++++ .../code/soulcatcher/soulcatcher_component.dm | 2 ++ .../code/soulcatcher/soulcatcher_tgui.dm | 1 + tgui/packages/tgui/interfaces/NifSoulPoem.js | 3 ++- tgui/packages/tgui/interfaces/Soulcatcher.js | 3 ++- 8 files changed, 33 insertions(+), 2 deletions(-) diff --git a/modular_skyrat/modules/modular_implants/code/nifs_tgui.dm b/modular_skyrat/modules/modular_implants/code/nifs_tgui.dm index 6da74c6b89f..dfc9916ab83 100644 --- a/modular_skyrat/modules/modular_implants/code/nifs_tgui.dm +++ b/modular_skyrat/modules/modular_implants/code/nifs_tgui.dm @@ -121,6 +121,8 @@ return FALSE current_theme = target_theme + for(var/datum/nifsoft/installed_nifsoft as anything in loaded_nifsofts) + installed_nifsoft.update_theme() if("activate_nifsoft") var/datum/nifsoft/activated_nifsoft = locate(params["activated_nifsoft"]) in loaded_nifsofts diff --git a/modular_skyrat/modules/modular_implants/code/nifsofts.dm b/modular_skyrat/modules/modular_implants/code/nifsofts.dm index 1bf551866f5..ddbff9cf86e 100644 --- a/modular_skyrat/modules/modular_implants/code/nifsofts.dm +++ b/modular_skyrat/modules/modular_implants/code/nifsofts.dm @@ -18,6 +18,8 @@ var/buying_category = NIFSOFT_CATEGORY_GENERAL ///What font awesome icon is shown next to the name of the nifsoft? var/ui_icon = "floppy-disk" + ///What UI theme do we want to display to users if this NIFSoft has TGUI? + var/ui_theme = "default" ///Can the program be installed with other instances of itself? var/single_install = TRUE @@ -67,6 +69,7 @@ qdel(src) load_persistence_data() + update_theme() /datum/nifsoft/Destroy() if(active) @@ -148,6 +151,15 @@ /datum/nifsoft/ui_state(mob/user) return GLOB.conscious_state +/// Updates the theme of the NIFSoft to match the parent NIF +/datum/nifsoft/proc/update_theme() + var/obj/item/organ/internal/cyberimp/brain/nif/target_nif = parent_nif.resolve() + if(!target_nif) + return FALSE + + ui_theme = target_nif.current_theme + return TRUE + /// A disk that can upload NIFSofts to a recpient with a NIFSoft installed. /obj/item/disk/nifsoft_uploader name = "Generic NIFSoft datadisk" diff --git a/modular_skyrat/modules/modular_implants/code/nifsofts/soul_poem.dm b/modular_skyrat/modules/modular_implants/code/nifsofts/soul_poem.dm index 4dc4434d59d..093e9e566b7 100644 --- a/modular_skyrat/modules/modular_implants/code/nifsofts/soul_poem.dm +++ b/modular_skyrat/modules/modular_implants/code/nifsofts/soul_poem.dm @@ -166,6 +166,7 @@ var/list/data = list() data["messages"] = message_list + data["theme"] = ui_theme data["receiving_data"] = receiving_data data["transmitting_data"] = transmitting_data diff --git a/modular_skyrat/modules/modular_implants/code/nifsofts/soulcatcher.dm b/modular_skyrat/modules/modular_implants/code/nifsofts/soulcatcher.dm index 019ff546edc..2ec95a411ef 100644 --- a/modular_skyrat/modules/modular_implants/code/nifsofts/soulcatcher.dm +++ b/modular_skyrat/modules/modular_implants/code/nifsofts/soulcatcher.dm @@ -94,6 +94,17 @@ persistence.nif_soulcatcher_rooms = list2params(room_list) return TRUE +/datum/nifsoft/soulcatcher/update_theme() + . = ..() + if(!.) + return FALSE // uhoh + + var/datum/component/soulcatcher/current_soulcatcher = linked_soulcatcher.resolve() + if(!istype(current_soulcatcher)) + stack_trace("[src] ([REF(src)]) tried to update its theme when it was missing a linked_soulcatcher component!") + return FALSE + current_soulcatcher.ui_theme = ui_theme + /datum/modular_persistence ///A param string containing soulcatcher rooms var/nif_soulcatcher_rooms = "" diff --git a/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_component.dm b/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_component.dm index 03512b2c205..88cca7817a2 100644 --- a/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_component.dm +++ b/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_component.dm @@ -18,6 +18,8 @@ GLOBAL_LIST_EMPTY(soulcatchers) var/list/soulcatcher_rooms = list() /// What soulcatcher room are verbs sending messages to? var/datum/soulcatcher_room/targeted_soulcatcher_room + /// What theme are we using for our soulcatcher UI? + var/ui_theme = "default" /// Are ghosts currently able to join this soulcatcher? var/ghost_joinable = TRUE diff --git a/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_tgui.dm b/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_tgui.dm index 0c1d11c272e..5dbd31631ec 100644 --- a/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_tgui.dm +++ b/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_tgui.dm @@ -13,6 +13,7 @@ data["ghost_joinable"] = ghost_joinable data["require_approval"] = require_approval + data["theme"] = ui_theme data["communicate_as_parent"] = communicate_as_parent data["current_soul_count"] = length(get_current_souls()) data["max_souls"] = max_souls diff --git a/tgui/packages/tgui/interfaces/NifSoulPoem.js b/tgui/packages/tgui/interfaces/NifSoulPoem.js index f815f9287f8..9ced2081865 100644 --- a/tgui/packages/tgui/interfaces/NifSoulPoem.js +++ b/tgui/packages/tgui/interfaces/NifSoulPoem.js @@ -10,9 +10,10 @@ export const NifSoulPoem = (props, context) => { messages = [], receiving_data, transmitting_data, + theme, } = data; return ( - +
{messages.map((message) => ( diff --git a/tgui/packages/tgui/interfaces/Soulcatcher.js b/tgui/packages/tgui/interfaces/Soulcatcher.js index f91f5fabef8..0c8c4f6e66b 100644 --- a/tgui/packages/tgui/interfaces/Soulcatcher.js +++ b/tgui/packages/tgui/interfaces/Soulcatcher.js @@ -12,10 +12,11 @@ export const Soulcatcher = (props, context) => { max_souls, removable, communicate_as_parent, + theme, } = data; return ( - + {current_rooms.map((room) => (
Date: Tue, 3 Oct 2023 23:45:20 -0700 Subject: [PATCH 24/49] Colourable arm/leg wraps (#24074) * cloth arm wraps * legwraps * Update loadout_datum_gloves.dm * consistency * legwraps * Update hands.dm --- .../icons/donator/mob/clothing/hands.dmi | Bin 920 -> 2132 bytes .../icons/donator/obj/clothing/gloves.dmi | Bin 1061 -> 2625 bytes .../modules/GAGS/greyscale_configs.dm | 29 +++++++++++++++-- modular_skyrat/modules/GAGS/icons/shoes.dmi | Bin 1619 -> 2616 bytes .../json_configs/arm_wraps/arm_wraps.json | 10 ++++++ .../arm_wraps/arm_wraps_worn.json | 10 ++++++ .../GAGS/json_configs/wraps/legwraps.json | 10 ++++++ .../json_configs/wraps/legwraps_worn.json | 10 ++++++ .../wraps/legwraps_worn_digi.json | 10 ++++++ .../modules/clothing/hands/hands.dm | 11 +++++++ .../modules/clothing/shoes/shoes.dm | 30 +++++++++++++++--- .../loadout_items/loadout_datum_gloves.dm | 4 +++ .../loadout_items/loadout_datum_shoes.dm | 6 +++- .../modular_vending/code/clothesmate.dm | 2 ++ 14 files changed, 124 insertions(+), 8 deletions(-) create mode 100644 modular_skyrat/modules/GAGS/json_configs/arm_wraps/arm_wraps.json create mode 100644 modular_skyrat/modules/GAGS/json_configs/arm_wraps/arm_wraps_worn.json create mode 100644 modular_skyrat/modules/GAGS/json_configs/wraps/legwraps.json create mode 100644 modular_skyrat/modules/GAGS/json_configs/wraps/legwraps_worn.json create mode 100644 modular_skyrat/modules/GAGS/json_configs/wraps/legwraps_worn_digi.json diff --git a/modular_skyrat/master_files/icons/donator/mob/clothing/hands.dmi b/modular_skyrat/master_files/icons/donator/mob/clothing/hands.dmi index 44e58131a33a1925e520655ff6ed757cfb7e872c..93cadcbdbdbaf83e81c9e6d59de449768ec4d18c 100644 GIT binary patch literal 2132 zcmb_eYgE$N9{t-xTe=**IYy=V>S3m4*JnN{d+8KoI+myzO{QjwWF;sdR8*FZT4|=~ zfL2hgvhhJWJPfs3R=C27d&`Uy?jS5AZgB1xd0!mYk_Gvw!EZdW?+(6At+Rg$@g}s!c@F^S#Ru-) z9hzDq6GBd#$C!62Z0`jmCjMX__^jjN{)ZrfB6}5AIlRv}x;VeD)b+?T)G>A1ie=3u z95xPG3D1Js8}?p4U_=HH5M;F7w$(pu3{_pL(RCRRzXIT{0v`SY2-pbR-2W|56$85X zl8zHLZ`I&t*tZIL#IHmodtlAnv|!*Z&r>o;yri*laRji$GS^YYEElznnLZUIy12OHjh|bSn6c-+dool9HeHo2 z9>3B+!)aSbO!`2j6D0`)El# zKR46gh*VlTga4#zv@#5GJPh!D$6EMueP9Rc9rgL<6K>&fYw96R;)dj0-@3k5O_#wP zkmoCNvp6xF_!=>$&g+=iel+i@`{xR~giekJt_nN4;CK_kQQFKa3997ugvil}mpP_) zJbVna9C6cYrdD@+6e}P4?(QjWMDT}niM#sUFi*k$Yg zp)tOFnE&XQKLr|iK%yDm3!Su>!?qv^oD0ay>$54uu%P4^Iq6Y_jq*@r3tKW!i;dy& z`JjIBjXaQZ6i zTnyiS?-s~?pFGRclf%R~aQd5H!6+|*$Q#LAJEv4O_4kXXc;i1M4T*$qe36$XvEj_< zHV|ikmJm0E?h=8kD&+W`(l?}~c8K{G6k+%+B>L@h($(7ybamwe@fMG>d|?xjiULN6 zvMgF9olv_qFriacBO9hNEY<$Vo)@{w*tlTd?ZlzVufDTBcv3Gq_;w$i6z-@9e17*2 zqC#b`NaYWhu=+%Si>5Rbc88-f*7nAbF^NDARs~Vwe^mq#h!V$k%glJXGVn1FH>PAiQNsESL zRl9rULQRe_$MGRrWSep!0001>2m=5B0K5^G9{>OVW>8F2 zMZmzo0RR648dAve|EkjekB^VX$H%g=vg709gsT6bprBQH+P1c~03U9qsk*zr&x(zn z2?z}g3=$O=At4|lFD@||7#ao!2@nw)%gxc=-rl9DwsdhNg22GQF)=tzO;#TuCKMGK zm-Ill00001bW%=J06^y0W&i*HqLC#ge}q9^p(%2<7Ydl(0k1E};AHIf|H=0!mrK>H zD63lK_e#zX2**KP)#Y%MV!@W(TC%eg4$wN@3$bBXW77DE(ZZmYU|y6+(PE%&EyXjK z9=3e?@*ca%`f-N;l+dro=r#b6j@)?8V(HHG;*cR0H{LwDUpQ4ooqvA#2C{==e_?vi z{gwa#0y0TNK~#90?bvH`sxT0MVWby4ZMg+&wKyL9|9|oT0Ze3LLPtB!nfLinyV(s{ zQ|*V1A^-pY+`wwJ5`TXb@zYZ*2M;2Cj-65OAR0nD6FurulqMC~^?@mZds(P^hw8n2+Mr8X(H^IjhLQu~(@|or6lLe}(z>?9_-- zSA(gvY?Jq9d0tIHl?#93>-p&7Y8)38_HRa9ttwX#mInX;0002^-{o21FDkP9{+&3C zL%R8BDVmn0*t7w|?#E6T&qg=C!L5|+f9-b8l&@xEK6N`k-*_?cX)|pl}Vfmpb zO@Y^I=TqlNjQQ>Zz0uP6BooonR1 zKFzT?KlaoZ-Gt?bBE2pqhvl(mDeFwDo3Q*)6mo;|-hd8`KzN2PuZsfC4ygeE;AZ{- XT#6?5M2I!y00000NkvXXu0mjf&b_gi diff --git a/modular_skyrat/master_files/icons/donator/obj/clothing/gloves.dmi b/modular_skyrat/master_files/icons/donator/obj/clothing/gloves.dmi index 9c82af8e8b3fa1f17600aed38d09c271d5c12897..62bfc6d5433351cfce80c5557081e3a77b2c135d 100644 GIT binary patch delta 2611 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 delta 1521 zcma)6X;2af6b8l{TF+G~Jj+(iO!3GrS5P-3Pu$cr&%E+P^FUXG3==aWO(X9!O+!gr zQ?t~xFjs*wGjq+0GFM22JkU&8nr8RU?vLKgd*95P_v3qS-uJbuj6ig=T%1nrlG`H( z004H`qiiu^^#7VNQsTs_V6$^*qt-%&Z zQ84wS;v+FgSCtx!zKnK-o*cXoB9{SLUthX`#BMbha zq0+*oNgH?}Nx^UID8z;oK$e!*5c6c2ZwC9*h)gE)Nv6Cep=vVvyd?}dVusSsWrhgm z2GvmdCQt}AG4YBqBsMNCJ*}IvxER%?=-lH8y!=$FzJVJipin5e13~^!sdb@ncrj5? z0tnEO0i|y6fpv9tk2jRz?nDJp`OgH#@UUWB2P|F7+M+n4q2Vv#7EZKtve(#FC)XNY zXxnj)L13|1I&pq-3^|!TEEb0&^Tz1aV)}TzdH}R)I7|y-6ZGJ05PbLBM+xAhv>aqa?ZaB; zBNRwQwcAlpDL;WJ_CjXtP&_{;@7rg6K+A@i?RjbDI38veR6R_%;rcN(b!tT#!Jpi$ z#=SM6=L3AkW-Wg(987QG0f?zq@`EjW&U5hlmCcU%`>m}R;jJm!?v3uvt*z#xI1e;2 z0NQH|nN6O`XrE8^^!8Sch={oO^XL19;Lgs@YOwWK!pEhh-WFOtqZ0$tQOY81j8Cs1 z#}aU5nO=>F+63Qwqch1;(H}?FBTOuu?Oh48K}R=~utVRkJvID z{#wUtW2M=ie5mJP)N0BTS5suOr!9T#a@0g@=2gcB Date: Wed, 4 Oct 2023 08:46:04 +0200 Subject: [PATCH 25/49] Donk Co. imports fix and addition (#24073) --- .../code/armament_datums/put_a_donk_on_it.dm | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/modular_skyrat/modules/company_imports/code/armament_datums/put_a_donk_on_it.dm b/modular_skyrat/modules/company_imports/code/armament_datums/put_a_donk_on_it.dm index 97d8307efd9..534801d0031 100644 --- a/modular_skyrat/modules/company_imports/code/armament_datums/put_a_donk_on_it.dm +++ b/modular_skyrat/modules/company_imports/code/armament_datums/put_a_donk_on_it.dm @@ -99,6 +99,18 @@ item_type = /obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted cost = PAYCHECK_COMMAND * 5 +/datum/armament_entry/company_import/donk/mod_modules + subcategory = "Donk Co. MOD modules" + cost = PAYCHECK_COMMAND + +/datum/armament_entry/company_import/donk/mod_modules/dart_collector_safe + item_type = /obj/item/mod/module/recycler/donk/safe + cost = PAYCHECK_COMMAND + +/datum/armament_entry/company_import/donk/mod_modules/dart_collector + item_type = /obj/item/mod/module/recycler/donk + cost = PAYCHECK_COMMAND * 4 + /datum/armament_entry/company_import/donk/foamforce_ammo subcategory = "Foam Force (TM) Dart Accessories" cost = PAYCHECK_CREW @@ -111,14 +123,14 @@ item_type = /obj/item/ammo_box/foambox/riot cost = PAYCHECK_COMMAND * 1.5 -/datum/armament_entry/company_import/donk/foamforce_ammo +/datum/armament_entry/company_import/donk/foamforce_ammo/pistol_mag item_type = /obj/item/ammo_box/magazine/toy/pistol -/datum/armament_entry/company_import/donk/foamforce_ammo +/datum/armament_entry/company_import/donk/foamforce_ammo/smg_mag item_type = /obj/item/ammo_box/magazine/toy/smg -/datum/armament_entry/company_import/donk/foamforce_ammo +/datum/armament_entry/company_import/donk/foamforce_ammo/smgm45_mag item_type = /obj/item/ammo_box/magazine/toy/smgm45 -/datum/armament_entry/company_import/donk/foamforce_ammo +/datum/armament_entry/company_import/donk/foamforce_ammo/m762_mag item_type = /obj/item/ammo_box/magazine/toy/m762 From d89bee880be970c036de33e6349b7d3982731c3d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Oct 2023 03:48:29 -0400 Subject: [PATCH 26/49] Bump pillow from 9.3.0 to 10.0.1 in /tools (#24106) Bumps [pillow](https://github.com/python-pillow/Pillow) from 9.3.0 to 10.0.1. - [Release notes](https://github.com/python-pillow/Pillow/releases) - [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst) - [Commits](https://github.com/python-pillow/Pillow/compare/9.3.0...10.0.1) --- tools/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/requirements.txt b/tools/requirements.txt index b90dd042b41..06356594e1e 100644 --- a/tools/requirements.txt +++ b/tools/requirements.txt @@ -1,6 +1,6 @@ pygit2==1.11.1 bidict==0.22.0 -Pillow==9.3.0 +Pillow==10.0.1 # changelogs PyYaml==6.0.1 From 2ab27584f9cee952f3d4d7d1ef5eaccecbd7a717 Mon Sep 17 00:00:00 2001 From: lila Date: Wed, 4 Oct 2023 10:18:18 +0200 Subject: [PATCH 27/49] A unique racking sfx for the sol 'Renoster' shotgun (#24103) * Unique racking sfx for the Renoster shotgun * +3dB --- .../carwo_defense_systems/shotgun.dm | 1 + .../modular_weapons/sounds/shotgun_rack.ogg | Bin 0 -> 26962 bytes 2 files changed, 1 insertion(+) create mode 100644 modular_skyrat/modules/modular_weapons/sounds/shotgun_rack.ogg diff --git a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/shotgun.dm b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/shotgun.dm index 78220a95342..af5f6131d88 100644 --- a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/shotgun.dm +++ b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/shotgun.dm @@ -20,6 +20,7 @@ SET_BASE_PIXEL(-8, 0) fire_sound = 'modular_skyrat/modules/modular_weapons/sounds/shotgun_heavy.ogg' + rack_sound = 'modular_skyrat/modules/modular_weapons/sounds/shotgun_rack.ogg' suppressed_sound = 'modular_skyrat/modules/modular_weapons/sounds/suppressed_heavy.ogg' can_suppress = TRUE diff --git a/modular_skyrat/modules/modular_weapons/sounds/shotgun_rack.ogg b/modular_skyrat/modules/modular_weapons/sounds/shotgun_rack.ogg new file mode 100644 index 0000000000000000000000000000000000000000..2d68a21e5df1fac45ba91c142f91c00c8a1fb931 GIT binary patch literal 26962 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

XTYKz)N2|Zs`Aw3&-}trN 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 E0a7ofQ~&?~ literal 0 HcmV?d00001 From c0e9d43ae0322b005616ed6ab63575abdf9a13a8 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 4 Oct 2023 10:31:28 +0200 Subject: [PATCH 28/49] Moth death sound & moth wing flutter sound (and emote change) [MDB IGNORE] (#24096) * Moth death sound & moth wing flutter sound (and emote change) (#78711) ## About The Pull Request Characters with moth wings now have their own "flutter" noise for the *flap emote, sampled from a bird taking off https://freesound.org/people/Godowan/sounds/240476/ Moth species also have a death sound now, sampled from the iconic moth scream the *tremble emote, also "trembles in fear!" was changed to just "trembles!" ## Why It's Good For The Game Moths don't really have much in terms of _sound_. The only moth noise in tgstation is moff scream (which I reckon could use some variety in the future too) The tremble emote has bothered me particularly for a long time; the *tremble emote shouldn't be completed delegated to convey fear. *shiver and *tremble are now essentially the same emote, but "shivers." is a lot less severe then "trembles!". ## Changelog :cl:FIoppie sound: *flap now makes a fluttering noise for moth wings sound: Moths now have a death sound qol: *tremble emote now is just "trembles!" instead of "trembles in fear!" /:cl: * Moth death sound & moth wing flutter sound (and emote change) * Update emote.dm --------- Co-authored-by: flopp / Daniel Ast <75865592+RunKittenzRComing@users.noreply.github.com> Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> --- .../carbon/human/species_types/mothmen.dm | 1 + code/modules/mob/living/emote.dm | 8 +++++++- sound/voice/moth/credit.txt | 5 +++++ sound/voice/moth/moth_death.ogg | Bin 0 -> 18078 bytes sound/voice/moth/moth_flutter.ogg | Bin 0 -> 11558 bytes 5 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 sound/voice/moth/credit.txt create mode 100644 sound/voice/moth/moth_death.ogg create mode 100644 sound/voice/moth/moth_flutter.ogg diff --git a/code/modules/mob/living/carbon/human/species_types/mothmen.dm b/code/modules/mob/living/carbon/human/species_types/mothmen.dm index 9f576e03f07..050e79b70bf 100644 --- a/code/modules/mob/living/carbon/human/species_types/mothmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/mothmen.dm @@ -16,6 +16,7 @@ mutanteyes = /obj/item/organ/internal/eyes/moth changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT species_language_holder = /datum/language_holder/moth + death_sound = 'sound/voice/moth/moth_death.ogg' wing_types = list(/obj/item/organ/external/wings/functional/moth/megamoth, /obj/item/organ/external/wings/functional/moth/mothra) payday_modifier = 1.0 family_heirlooms = list(/obj/item/flashlight/lantern/heirloom_moth) diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 532d37ed1b2..dbb602aa2be 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -143,6 +143,8 @@ var/mob/living/carbon/human/H = user var/open = FALSE var/obj/item/organ/external/wings/functional/wings = H.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS) + + // open/close functional wings if(istype(wings)) if(wings.wings_open) open = TRUE @@ -150,6 +152,10 @@ else H.OpenWings() addtimer(CALLBACK(wings, open ? TYPE_PROC_REF(/obj/item/organ/external/wings/functional, open_wings) : TYPE_PROC_REF(/obj/item/organ/external/wings/functional, close_wings)), wing_time) + + // play moth flutter noise if moth wing + if(istype(wings, /obj/item/organ/external/wings/moth)) + playsound(H, 'sound/voice/moth/moth_flutter.ogg', 50, TRUE) */ //SKYRAT EDIT REMOVAL END @@ -487,7 +493,7 @@ /datum/emote/living/tremble key = "tremble" key_third_person = "trembles" - message = "trembles in fear!" + message = "trembles!" #define TREMBLE_LOOP_DURATION (4.4 SECONDS) /datum/emote/living/tremble/run_emote(mob/living/user, params, type_override, intentional) diff --git a/sound/voice/moth/credit.txt b/sound/voice/moth/credit.txt new file mode 100644 index 00000000000..7f64b72841e --- /dev/null +++ b/sound/voice/moth/credit.txt @@ -0,0 +1,5 @@ +"moth_flutter" modified from +https://freesound.org/people/Godowan/sounds/240476/ +(CC 0 license) + +who knows where the original moth scream noise was I sure as hell don't \ No newline at end of file diff --git a/sound/voice/moth/moth_death.ogg b/sound/voice/moth/moth_death.ogg new file mode 100644 index 0000000000000000000000000000000000000000..df23cfa472ac1043b1fc1eacde71a493402f9133 GIT binary patch literal 18078 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 Date: Wed, 4 Oct 2023 18:54:48 +0200 Subject: [PATCH 29/49] Rebalance CQC legsweeps and knockout kicks [MDB IGNORE] (#24110) * Rebalance CQC legsweeps and knockout kicks (#78341) ## About The Pull Request This is a remake of #74764 but focused only on kicks. #### Before my changes: - Legsweeps dealt 6 seconds of paralysis for **23 damage** - Knockout kicks dealt **30 seconds** of sleep that was guaranteed if the target was on the floor #### After my changes: - Legsweeps deal 5 seconds of knockdown for 10 damage - Knockout kick happens when a mob reaches 100 stamina loss and lasts 10 seconds. Helmet protection shortens the time length. ## Why It's Good For The Game ![chrome_UvcQ6vBQpH](https://github.com/tgstation/tgstation/assets/5195984/ea568e0f-7217-4e3c-be75-fa36996b73ae) ## Changelog :cl: balance: CQC legsweeps now cause knockdown instead of paralysis. balance: CQC kicks now knockout a target on the floor for ten seconds if they reach stam crit. Helmet protection shortens the knockout length. /:cl: * Rebalance CQC legsweeps and knockout kicks --------- Co-authored-by: Tim --- code/datums/martial/cqc.dm | 52 +++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index c982f0e086c..e5b959b340f 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -80,9 +80,21 @@ return TRUE /datum/martial_art/cqc/proc/Kick(mob/living/attacker, mob/living/defender) - if(!can_use(attacker)) + if(!can_use(attacker) || defender.stat != CONSCIOUS) return FALSE - if(!defender.stat || !defender.IsParalyzed()) + + if(defender.body_position == LYING_DOWN && !defender.IsUnconscious() && defender.getStaminaLoss() >= 100) + log_combat(attacker, defender, "knocked out (Head kick)(CQC)") + defender.visible_message(span_danger("[attacker] kicks [defender]'s head, knocking [defender.p_them()] out!"), \ + span_userdanger("You're knocked unconscious by [attacker]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), null, attacker) + to_chat(attacker, span_danger("You kick [defender]'s head, knocking [defender.p_them()] out!")) + playsound(get_turf(attacker), 'sound/weapons/genhit1.ogg', 50, TRUE, -1) + + var/helmet_protection = defender.run_armor_check(BODY_ZONE_HEAD, MELEE) + defender.apply_effect(20 SECONDS, EFFECT_KNOCKDOWN, helmet_protection) + defender.apply_effect(10 SECONDS, EFFECT_UNCONSCIOUS, helmet_protection) + defender.adjustOrganLoss(ORGAN_SLOT_BRAIN, 15, 150) + else defender.visible_message(span_danger("[attacker] kicks [defender] back!"), \ span_userdanger("You're kicked back by [attacker]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, attacker) to_chat(attacker, span_danger("You kick [defender] back!")) @@ -90,17 +102,9 @@ var/atom/throw_target = get_edge_target_turf(defender, attacker.dir) defender.throw_at(throw_target, 1, 14, attacker) defender.apply_damage(10, attacker.get_attack_type()) + defender.adjustStaminaLoss(45) log_combat(attacker, defender, "kicked (CQC)") - . = TRUE - if(defender.IsParalyzed() && !defender.stat) - log_combat(attacker, defender, "knocked out (Head kick)(CQC)") - defender.visible_message(span_danger("[attacker] kicks [defender]'s head, knocking [defender.p_them()] out!"), \ - span_userdanger("You're knocked unconscious by [attacker]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), null, attacker) - to_chat(attacker, span_danger("You kick [defender]'s head, knocking [defender.p_them()] out!")) - playsound(get_turf(attacker), 'sound/weapons/genhit1.ogg', 50, TRUE, -1) - defender.SetSleeping(30 SECONDS) - defender.adjustOrganLoss(ORGAN_SLOT_BRAIN, 15, 150) - . = TRUE + . = TRUE /datum/martial_art/cqc/proc/Pressure(mob/living/attacker, mob/living/defender) if(!can_use(attacker)) @@ -166,6 +170,19 @@ /datum/martial_art/cqc/harm_act(mob/living/attacker, mob/living/defender) if(!can_use(attacker)) return FALSE + + if(attacker.resting && defender.stat != DEAD && defender.body_position == STANDING_UP) + defender.visible_message(span_danger("[attacker] leg sweeps [defender]!"), \ + span_userdanger("Your legs are sweeped by [attacker]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), null, attacker) + to_chat(attacker, span_danger("You leg sweep [defender]!")) + playsound(get_turf(attacker), 'sound/effects/hit_kick.ogg', 50, TRUE, -1) + attacker.do_attack_animation(defender) + defender.apply_damage(10, BRUTE) + defender.Knockdown(5 SECONDS) + log_combat(attacker, defender, "sweeped (CQC)") + reset_streak() + return TRUE + add_to_streak("H", defender) if(check_streak(attacker, defender)) return TRUE @@ -185,14 +202,7 @@ span_userdanger("You're [picked_hit_type]ed by [attacker]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, attacker) to_chat(attacker, span_danger("You [picked_hit_type] [defender]!")) log_combat(attacker, defender, "[picked_hit_type]s (CQC)") - if(attacker.resting && !defender.stat && !defender.IsParalyzed()) - defender.visible_message(span_danger("[attacker] leg sweeps [defender]!"), \ - span_userdanger("Your legs are sweeped by [attacker]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), null, attacker) - to_chat(attacker, span_danger("You leg sweep [defender]!")) - playsound(get_turf(attacker), 'sound/effects/hit_kick.ogg', 50, TRUE, -1) - defender.apply_damage(10, BRUTE) - defender.Paralyze(6 SECONDS) - log_combat(attacker, defender, "sweeped (CQC)") + return TRUE /datum/martial_art/cqc/disarm_act(mob/living/attacker, mob/living/defender) @@ -239,7 +249,7 @@ to_chat(usr, "You try to remember some of the basics of CQC.") to_chat(usr, "[span_notice("Slam")]: Grab Punch. Slam opponent into the ground, knocking them down.") - to_chat(usr, "[span_notice("CQC Kick")]: Punch Punch. Knocks opponent away. Knocks out stunned or knocked down opponents.") + to_chat(usr, "[span_notice("CQC Kick")]: Punch Punch. Knocks opponent away. Knocks out stunned opponents and does stamina damage.") to_chat(usr, "[span_notice("Restrain")]: Grab Grab. Locks opponents into a restraining position, disarm to knock them out with a chokehold.") to_chat(usr, "[span_notice("Pressure")]: Shove Grab. Decent stamina damage.") to_chat(usr, "[span_notice("Consecutive CQC")]: Shove Shove Punch. Mainly offensive move, huge damage and decent stamina damage.") From ada98cb049a4813122f77b3d305ea9c2fafa0aa7 Mon Sep 17 00:00:00 2001 From: Tom <8881105+tf-4@users.noreply.github.com> Date: Wed, 4 Oct 2023 18:01:38 +0100 Subject: [PATCH 30/49] mold mob fixes (#23871) * mold mob attacks fix * del mobs on death * fixes * Update modular_skyrat/modules/mold/code/mold_mobs.dm --------- Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> --- modular_skyrat/modules/mold/code/mold_mobs.dm | 122 +++++++----------- 1 file changed, 47 insertions(+), 75 deletions(-) diff --git a/modular_skyrat/modules/mold/code/mold_mobs.dm b/modular_skyrat/modules/mold/code/mold_mobs.dm index 59b1db55462..c7ba1226435 100644 --- a/modular_skyrat/modules/mold/code/mold_mobs.dm +++ b/modular_skyrat/modules/mold/code/mold_mobs.dm @@ -15,6 +15,7 @@ icon = 'modular_skyrat/modules/mold/icons/blob_mobs.dmi' gold_core_spawnable = NO_SPAWN faction = list(FACTION_MOLD) + basic_mob_flags = DEL_ON_DEATH /** * OIL SHAMBLERS @@ -69,6 +70,17 @@ SSvis_overlays.add_vis_overlay(src, icon, OIL_SHAMBLER_OVERLAY, layer, plane, dir, alpha) SSvis_overlays.add_vis_overlay(src, icon, OIL_SHAMBLER_OVERLAY, OIL_SHAMBLER_OVERLAY_LAYER, EMISSIVE_PLANE, dir, alpha) +/mob/living/basic/mold/oil_shambler/melee_attack(atom/target, list/modifiers, ignore_cooldown) + . = ..() + if(!isliving(target)) + return + + var/mob/living/ignite_target = target + if(prob(ignite_chance)) + ignite_target.adjust_fire_stacks(additional_fire_stacks) + + ignite_target.ignite_mob() + /datum/ai_controller/basic_controller/oil_shambler blackboard = list( BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, @@ -79,7 +91,7 @@ planning_subtrees = list( /datum/ai_planning_subtree/simple_find_target, /datum/ai_planning_subtree/attack_obstacle_in_path, - /datum/ai_planning_subtree/basic_melee_attack_subtree/oil_shambler, + /datum/ai_planning_subtree/basic_melee_attack_subtree, /datum/ai_planning_subtree/random_speech/oil_shambler, ) @@ -88,23 +100,6 @@ emote_hear = list("bubbles.", "crackles.", "groans.") emote_see = list("bubbles.") -/datum/ai_planning_subtree/basic_melee_attack_subtree/oil_shambler - melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/oil_shambler - -/datum/ai_behavior/basic_melee_attack/oil_shambler/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key) - . = ..() - var/atom/target = controller.blackboard[target_key] - var/mob/living/basic/mold/oil_shambler/oil_shambler = controller.pawn - - if(!isliving(target)) - return - - var/mob/living/ignite_target = target - if(prob(oil_shambler.ignite_chance)) - ignite_target.adjust_fire_stacks(oil_shambler.additional_fire_stacks) - - if(ignite_target.fire_stacks) - ignite_target.ignite_mob() /** * DISEASE MOLD @@ -139,6 +134,17 @@ /// The disease given on melee attacks var/datum/disease/given_disease = /datum/disease/cryptococcus +/mob/living/basic/mold/diseased_rat/melee_attack(atom/target, list/modifiers, ignore_cooldown) + . = ..() + + if(!isliving(target)) + return + + var/mob/living/carbon/disease_target = target + if(can_inject(disease_target)) + to_chat(disease_target, span_danger("[src] manages to penetrate your clothing with its teeth!")) + disease_target.ForceContractDisease(new given_disease(), FALSE, TRUE) + /datum/ai_controller/basic_controller/diseased_rat blackboard = list( BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, @@ -149,7 +155,7 @@ planning_subtrees = list( /datum/ai_planning_subtree/simple_find_target, /datum/ai_planning_subtree/attack_obstacle_in_path, - /datum/ai_planning_subtree/basic_melee_attack_subtree/diseased_rat, + /datum/ai_planning_subtree/basic_melee_attack_subtree, /datum/ai_planning_subtree/random_speech/diseased_rat, ) @@ -158,21 +164,6 @@ emote_hear = list("squeaks.", "gnashes.", "hisses.") emote_see = list("drools.") -/datum/ai_planning_subtree/basic_melee_attack_subtree/diseased_rat - melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/diseased_rat - -/datum/ai_behavior/basic_melee_attack/diseased_rat/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key) - . = ..() - var/atom/target = controller.blackboard[target_key] - var/mob/living/basic/mold/diseased_rat/diseased_rat = controller.pawn - - if(!isliving(target)) - return - - var/mob/living/carbon/disease_target = target - if(diseased_rat.can_inject(disease_target)) - to_chat(disease_target, span_danger("[diseased_rat] manages to penetrate your clothing with its teeth!")) - disease_target.ForceContractDisease(new diseased_rat.given_disease(), FALSE, TRUE) /** * ELECTRIC MOLD @@ -202,6 +193,15 @@ pass_flags = PASSTABLE + /// What the mob injects per bite + var/inject_reagent = /datum/reagent/teslium + /// How many units to inject per bite + var/inject_amount = 2 + +/mob/living/basic/mold/electric_mosquito/Initialize(mapload) + . = ..() + AddElement(/datum/element/venomous, inject_reagent, inject_amount) + /datum/ai_controller/basic_controller/electric_mosquito blackboard = list( BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, @@ -212,7 +212,7 @@ planning_subtrees = list( /datum/ai_planning_subtree/simple_find_target, /datum/ai_planning_subtree/attack_obstacle_in_path, - /datum/ai_planning_subtree/basic_melee_attack_subtree/electric_mosquito, + /datum/ai_planning_subtree/basic_melee_attack_subtree, /datum/ai_planning_subtree/random_speech/electric_mosquito, ) @@ -221,24 +221,11 @@ emote_hear = list("zaps.", "buzzes.", "crackles.") emote_see = list("arcs.") -/datum/ai_planning_subtree/basic_melee_attack_subtree/electric_mosquito - melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/electric_mosquito - -/datum/ai_behavior/basic_melee_attack/electric_mosquito/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key) - . = ..() - var/atom/target = controller.blackboard[target_key] - - if(!iscarbon(target)) - return - - var/mob/living/carbon/shock_target = target - shock_target.reagents.add_reagent(/datum/reagent/teslium, 2) - /** * RADIATION MOLD * * Weird centipede things that spawn with a rad mold - * They have a chance to irradiate their target on hit, as well as splashing mutagen on death + * They have a chance to irradiate their target on hit */ /mob/living/basic/mold/centaur name = "centaur" @@ -271,21 +258,21 @@ /// The chance to irradiate on hit var/irradiate_chance = 20 - /// The chem to splash on death - var/death_chem = /datum/reagent/toxin/mutagen /mob/living/basic/mold/centaur/Initialize(mapload) . = ..() update_overlays() -/mob/living/basic/mold/centaur/death(gibbed) - visible_message(span_warning("[src] ruptures!")) - var/datum/reagents/reagent_spawn = new /datum/reagents(300) - reagent_spawn.my_atom = src - reagent_spawn.add_reagent(death_chem, 20) - chem_splash(loc, null, CENTAUR_DEATH_SPLASH_RANGE, list(reagent_spawn)) - playsound(src, 'sound/effects/splat.ogg', CENTAUR_DEATH_SPLAT_VOLUME, TRUE) - return ..() +/mob/living/basic/mold/centaur/melee_attack(atom/target, list/modifiers, ignore_cooldown) + . = ..() + + if(!isliving(target)) + return + + var/mob/living/radiation_target = target + if(prob(irradiate_chance)) + radiation_pulse(radiation_target, CENTAUR_RAD_PULSE_RANGE, CENTAUR_RAD_PULSE_THRESHOLD, FALSE, TRUE) + playsound(src, 'modular_skyrat/modules/horrorform/sound/horror_scream.ogg', CENTAUR_ATTACK_SCREAM_VOLUME, TRUE) /datum/ai_controller/basic_controller/centaur blackboard = list( @@ -297,7 +284,7 @@ planning_subtrees = list( /datum/ai_planning_subtree/simple_find_target, /datum/ai_planning_subtree/attack_obstacle_in_path, - /datum/ai_planning_subtree/basic_melee_attack_subtree/centaur, + /datum/ai_planning_subtree/basic_melee_attack_subtree, /datum/ai_planning_subtree/random_speech/centaur, ) @@ -306,21 +293,6 @@ emote_hear = list("chitters.", "groans.", "wails.") emote_see = list("writhes.") -/datum/ai_planning_subtree/basic_melee_attack_subtree/centaur - melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/centaur - -/datum/ai_behavior/basic_melee_attack/centaur/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key) - . = ..() - var/atom/target = controller.blackboard[target_key] - var/mob/living/basic/mold/centaur/centaur = controller.pawn - - if(!isliving(target)) - return - - var/mob/living/radiation_target = target - if(prob(centaur.irradiate_chance)) - radiation_pulse(radiation_target, CENTAUR_RAD_PULSE_RANGE, CENTAUR_RAD_PULSE_THRESHOLD, FALSE, TRUE) - playsound(src, 'modular_skyrat/modules/horrorform/sound/horror_scream.ogg', CENTAUR_ATTACK_SCREAM_VOLUME, TRUE) #undef OIL_SHAMBLER_OVERLAY From 95167c4a0b257e743a92a7d886061036d526a0ef Mon Sep 17 00:00:00 2001 From: MaSvedish <104115259+MaSvedish@users.noreply.github.com> Date: Wed, 4 Oct 2023 13:41:54 -0700 Subject: [PATCH 31/49] Donator Whitelist Holocigar MaSvedish (#23914) * Donator item edit -MaSvedish - Holocigar * Update donator_personal.dm Adds people to MaSvedish's donator item --- .../loadouts/loadout_items/donator/personal/donator_personal.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_skyrat/modules/loadouts/loadout_items/donator/personal/donator_personal.dm b/modular_skyrat/modules/loadouts/loadout_items/donator/personal/donator_personal.dm index 7b6e248a278..c41311e4694 100644 --- a/modular_skyrat/modules/loadouts/loadout_items/donator/personal/donator_personal.dm +++ b/modular_skyrat/modules/loadouts/loadout_items/donator/personal/donator_personal.dm @@ -667,7 +667,7 @@ /datum/loadout_item/pocket_items/masvedishcigar name = "Holocigar" item_path = /obj/item/clothing/mask/holocigarette/masvedishcigar - ckeywhitelist = list("masvedish") + ckeywhitelist = list("masvedish", "lutowski", "lawful", "anyacers", "apolloafk", "avianaviator", "notdhu") /datum/loadout_item/suit/lt3_armor name = "Silver Jacket Mk II" From fc8f0379beae01d848c23efd574492be80829154 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Thu, 5 Oct 2023 05:48:22 +0200 Subject: [PATCH 32/49] The Galactic Materials Market no longer runtimes on opening or ordering. [MDB IGNORE] (#24115) * The Galactic Materials Market no longer runtimes on opening or ordering. (#78729) ## About The Pull Request The Galactic Materials Market, currently, runtimes while attempting to open the UI. This is due to attempting to load various fields from un-initialized material datums. Through liberal application of `initial()`, these runtimes have been removed, and it is now possible to use the market at all (though it has some other issues that I'll make bug reports for...). Also gives priority to `greyscale_colors` over `color` when choosing colors for the UI, to make the correct colors appear. ## Why It's Good For The Game The Materials Market is rather important as the only source of minerals on rounds without any miners. So... it's good if it actually loads. ## Changelog :cl: fix: The Galactic Materials Market now offers things for sale as it should. /:cl: * The Galactic Materials Market no longer runtimes on opening or ordering. --------- Co-authored-by: lizardqueenlexi <105025397+lizardqueenlexi@users.noreply.github.com> --- code/modules/cargo/exports/materials.dm | 2 +- code/modules/cargo/materials_market.dm | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/code/modules/cargo/exports/materials.dm b/code/modules/cargo/exports/materials.dm index 46d089b5ac5..c9a88a6edfb 100644 --- a/code/modules/cargo/exports/materials.dm +++ b/code/modules/cargo/exports/materials.dm @@ -161,4 +161,4 @@ var/sale_value = sold_block.export_value SSstock_market.materials_quantity[sold_block.export_mat] += sold_block.quantity SSstock_market.materials_prices[sold_block.export_mat] -= round((sale_value) * (sold_block.quantity / (sold_block.quantity + SSstock_market.materials_quantity[sold_block.export_mat]))) - SSstock_market.materials_prices[sold_block.export_mat] = round(clamp(SSstock_market.materials_prices[sold_block.export_mat], sold_block.export_mat.value_per_unit * SHEET_MATERIAL_AMOUNT * 0.5 , sold_block.export_mat.value_per_unit * SHEET_MATERIAL_AMOUNT * 3)) + SSstock_market.materials_prices[sold_block.export_mat] = round(clamp(SSstock_market.materials_prices[sold_block.export_mat], initial(sold_block.export_mat.value_per_unit) * SHEET_MATERIAL_AMOUNT * 0.5 , initial(sold_block.export_mat.value_per_unit) * SHEET_MATERIAL_AMOUNT * 3)) diff --git a/code/modules/cargo/materials_market.dm b/code/modules/cargo/materials_market.dm index d211df7debd..dd56128241d 100644 --- a/code/modules/cargo/materials_market.dm +++ b/code/modules/cargo/materials_market.dm @@ -92,12 +92,12 @@ else if(SSstock_market.materials_trends[traded_mat] == -1) trend_string = "down" var/color_string = "" - if(traded_mat.color) - color_string = traded_mat.color - else if (traded_mat.greyscale_colors) - color_string = splicetext(traded_mat.greyscale_colors, 6, length(traded_mat.greyscale_colors), "") //slice it to a standard 6 char hex + if (initial(traded_mat.greyscale_colors)) + color_string = splicetext(initial(traded_mat.greyscale_colors), 7, length(initial(traded_mat.greyscale_colors)), "") //slice it to a standard 6 char hex + else if(initial(traded_mat.color)) + color_string = initial(traded_mat.color) material_data += list(list( - "name" = traded_mat.name, + "name" = initial(traded_mat.name), "price" = SSstock_market.materials_prices[traded_mat], "quantity" = SSstock_market.materials_quantity[traded_mat], "trend" = trend_string, @@ -144,7 +144,7 @@ var/datum/material/material_bought var/obj/item/stack/sheet/sheet_to_buy for(var/datum/material/mat as anything in SSstock_market.materials_prices) - if(mat.name == material_str) + if(initial(mat.name) == material_str) material_bought = mat break if(!material_bought) @@ -159,7 +159,7 @@ var/cost = SSstock_market.materials_prices[material_bought] * quantity - sheet_to_buy = material_bought.sheet_type + sheet_to_buy = initial(material_bought.sheet_type) if(!sheet_to_buy) CRASH("Material with no sheet type being sold on materials market!") if(!account_payable) @@ -231,7 +231,7 @@ /obj/item/stock_block/examine(mob/user) . = ..() - . += span_notice("\The [src] is worth [export_value] cr, from selling [quantity] sheets of [export_mat?.name].") + . += span_notice("\The [src] is worth [export_value] cr, from selling [quantity] sheets of [initial(export_mat?.name)].") if(fluid) . += span_warning("\The [src] is currently liquid! It's value is based on the market price.") else From d5ca9265f8634d5e293fedf631eaf25339ec7399 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Thu, 5 Oct 2023 05:49:41 +0200 Subject: [PATCH 33/49] Adds a passive scan to the Active Sonar module [MDB IGNORE] (#24117) * Adds a passive scan to the Active Sonar module (#78734) ## About The Pull Request Adds a passive, radial scan to the Active Sonar module. This will scan a 1/8th slice around the player for any creatures, and place a much smaller marker over them for the player to see. These small markers do not update their location when the scanned creature moves, unlike the normal markers. Activating the module initiates the normal full scan, which scans the entire radius at once rather than just a slice. Doing so will put _both_ scans in cooldown. https://github.com/tgstation/tgstation/assets/66052067/96226090-fa32-42d5-99f4-a8dbdc36cf98 ## Why It's Good For The Game Honestly I still felt the Active Sonar was a little weak even after I tried to buff it a little. I wanted to initially find a way to make the large scan effects smoothly move with whoever you're following, but since I couldn't manage to figure that out instead I went with a recommendation from ninjanomnom to make a radial scan. I think this is far more interesting either way ## Changelog :cl: Wallem add: Buffs the Active Sonar module with a radial scan, and makes the power costs more in-line with other modules. /:cl: * Adds a passive scan to the Active Sonar module --------- Co-authored-by: Wallem <66052067+Wallemations@users.noreply.github.com> --- .../temporary_visuals/miscellaneous.dm | 21 +++- code/modules/mod/modules/modules_security.dm | 94 ++++++++++++++++-- icons/effects/effects.dmi | Bin 949901 -> 949996 bytes 3 files changed, 104 insertions(+), 11 deletions(-) diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index e88753d25c1..c736aac35d8 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -594,11 +594,22 @@ var/datum/weakref/pinged_person /// The icon state applied to the image created for this ping. var/real_icon_state = "sonar_ping" + /// Does the visual follow the creature? + var/follow_creature = TRUE + /// Creature's X & Y coords, which can either be overridden or kept the same depending on follow_creature. + var/creature_x + var/creature_y -/obj/effect/temp_visual/sonar_ping/Initialize(mapload, mob/living/looker, mob/living/creature) +/obj/effect/temp_visual/sonar_ping/Initialize(mapload, mob/living/looker, mob/living/creature, ping_state, follow_creatures = TRUE) . = ..() if(!looker || !creature) return INITIALIZE_HINT_QDEL + if(ping_state) + real_icon_state = ping_state + follow_creature = follow_creatures + creature_x = creature.x + creature_y = creature.y + modsuit_image = image(icon = icon, loc = looker.loc, icon_state = real_icon_state, layer = ABOVE_ALL_MOB_LAYER, pixel_x = ((creature.x - looker.x) * 32), pixel_y = ((creature.y - looker.y) * 32)) modsuit_image.plane = ABOVE_LIGHTING_PLANE SET_PLANE_EXPLICIT(modsuit_image, ABOVE_LIGHTING_PLANE, creature) @@ -631,8 +642,12 @@ if(isnull(looker) || isnull(creature)) return PROCESS_KILL modsuit_image.loc = looker.loc - modsuit_image.pixel_x = ((creature.x - looker.x) * 32) - modsuit_image.pixel_y = ((creature.y - looker.y) * 32) + // Long pings follow, short pings stay put. We still need to update for looker.x&y though + if(follow_creature) + creature_y = creature.y + creature_x = creature.x + modsuit_image.pixel_x = ((creature_x - looker.x) * 32) + modsuit_image.pixel_y = ((creature_y - looker.y) * 32) /obj/effect/temp_visual/block //color is white by default, set to whatever is needed name = "blocking glow" diff --git a/code/modules/mod/modules/modules_security.dm b/code/modules/mod/modules/modules_security.dm index 2c7ae6821fe..7e331433b4f 100644 --- a/code/modules/mod/modules/modules_security.dm +++ b/code/modules/mod/modules/modules_security.dm @@ -361,13 +361,95 @@ /obj/item/mod/module/active_sonar name = "MOD active sonar" desc = "Ancient tech from the 20th century, this module uses sonic waves to detect living creatures within the user's radius. \ + Its basic function slowly scans around the user for any bio-signatures, however it can be overclocked to scan everywhere at once.\ Its loud ping is much harder to hide in an indoor station than in the outdoor operations it was designed for." icon_state = "active_sonar" module_type = MODULE_USABLE - use_power_cost = DEFAULT_CHARGE_DRAIN * 4 + idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 + use_power_cost = DEFAULT_CHARGE_DRAIN * 3 complexity = 2 incompatible_modules = list(/obj/item/mod/module/active_sonar) cooldown_time = 15 SECONDS + /// Time between us displaying radial scans + var/scan_cooldown_time = 0.5 SECONDS + /// The current slice we're going to scan + var/scanned_slice = 1 + /// How many slices we make 360 + var/radar_slices = 8 // 45 degrees each + + /// A list of all creatures in range sorted by angle. + var/list/sorted_creatures = list() + /// A keyed list of all creatures + var/list/keyed_creatures = list() + + /// Time between us displaying radial scans + COOLDOWN_DECLARE(scan_cooldown) + +/obj/item/mod/module/active_sonar/Initialize(mapload) + . = ..() + for(var/i in 1 to radar_slices) + sorted_creatures += list(list()) + +/obj/item/mod/module/active_sonar/on_suit_activation() + RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, PROC_REF(sort_all_creatures)) + +/obj/item/mod/module/active_sonar/on_suit_deactivation(deleting = FALSE) + UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) + +/// Detects all living creatures within world.view, and returns the amount. +/obj/item/mod/module/active_sonar/proc/detect_living_creatures() + var/creatures_detected = 0 + for(var/mob/living/creature in range(world.view, mod.wearer)) + if(creature == mod.wearer || creature.stat == DEAD) + continue + if(keyed_creatures[creature]) + creatures_detected++ + continue + sort_creature_angle(creature) + RegisterSignal(creature, COMSIG_MOVABLE_MOVED, PROC_REF(sort_creature_angle)) + creatures_detected++ + return creatures_detected + +/// Swaps around where a creature is, when they move or when they're first detected +/obj/item/mod/module/active_sonar/proc/sort_creature_angle(mob/living/creature, atom/old_loc, movement_dir, forced) + SIGNAL_HANDLER + var/oldgroup = keyed_creatures[creature] + var/newgroup = round(get_angle(mod.wearer, creature) / (360 / radar_slices)) + 1 + if(oldgroup) + if(creature.stat == DEAD || get_dist(get_turf(mod.wearer), get_turf(creature)) > world.view) + sorted_creatures[oldgroup] -= creature + keyed_creatures -= creature + UnregisterSignal(creature, COMSIG_MOVABLE_MOVED) + return + + if(oldgroup != newgroup) + sorted_creatures[oldgroup] -= creature + + sorted_creatures[newgroup] += creature + keyed_creatures[creature] = newgroup + +/// Swaps all creatures when mod.wearer moves +/obj/item/mod/module/active_sonar/proc/sort_all_creatures(mob/living/wearer, atom/old_loc, movement_dir, forced) + SIGNAL_HANDLER + + for(var/mob/living/creature as anything in keyed_creatures) + sort_creature_angle(creature) // Kinda spaghetti but it honestly seems like the shortest path to the same result + +/obj/item/mod/module/active_sonar/on_process(seconds_per_tick) + . = ..() + if(!.) + return + if(!COOLDOWN_FINISHED(src, cooldown_timer) || !COOLDOWN_FINISHED(src, scan_cooldown)) + return + detect_living_creatures() + for(var/mob/living/creature as anything in sorted_creatures[scanned_slice]) + new /obj/effect/temp_visual/sonar_ping(mod.wearer.loc, mod.wearer, creature, "sonar_ping_small", FALSE) + // Next slice! + scanned_slice++ + // IT'S ENOUGH SLICES + if(scanned_slice > radar_slices) + scanned_slice = 1 + COOLDOWN_START(src, scan_cooldown, scan_cooldown_time) /obj/item/mod/module/active_sonar/on_use() . = ..() @@ -377,14 +459,10 @@ playsound(mod.wearer, 'sound/mecha/skyfall_power_up.ogg', vol = 20, vary = TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) if(!do_after(mod.wearer, 1.1 SECONDS, target = mod)) return - var/creatures_detected = 0 - for(var/mob/living/creature in range(9, mod.wearer)) - if(creature == mod.wearer || creature.stat == DEAD) - continue + playsound(mod.wearer, 'sound/effects/ping_hit.ogg', vol = 75, vary = TRUE) // Should be audible for the radius of the sonar + to_chat(mod.wearer, span_notice("You slam your fist into the ground, sending out a sonic wave that detects [detect_living_creatures()] living beings nearby!")) + for(var/mob/living/creature as anything in keyed_creatures) new /obj/effect/temp_visual/sonar_ping(mod.wearer.loc, mod.wearer, creature) - creatures_detected++ - playsound(mod.wearer, 'sound/effects/ping_hit.ogg', vol = 75, vary = TRUE, extrarange = MEDIUM_RANGE_SOUND_EXTRARANGE) // Should be audible for the radius of the sonar - to_chat(mod.wearer, span_notice("You slam your fist into the ground, sending out a sonic wave that detects [creatures_detected] living beings nearby!")) #define SHOOTING_ASSISTANT_OFF "Currently Off" #define STORMTROOPER_MODE "Quick Fire Stormtrooper" diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index d59f065da28b9847a043bf70c80c163897ab4c0a..b01986a9522d0e3a8b1945702df92964db98b99e 100644 GIT binary patch delta 10567 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%0Ae2xh#$xnbwikr}xkN^kDcnp(ph%vkQ&S0|#_>Xh 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 From ad459a80b982067b9cb4bd89163810f575e8b3a0 Mon Sep 17 00:00:00 2001 From: Pinta <68373373+softcerv@users.noreply.github.com> Date: Wed, 4 Oct 2023 23:50:12 -0400 Subject: [PATCH 34/49] Ghost NIF boxes now contain the Purpura Eye NIFSoft (#24114) weh --- modular_skyrat/modules/modular_implants/code/nifs.dm | 1 + .../modules/modular_implants/code/nifsofts/hypnosis.dm | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/modular_skyrat/modules/modular_implants/code/nifs.dm b/modular_skyrat/modules/modular_implants/code/nifs.dm index 9dd1af28751..6ce9f780f83 100644 --- a/modular_skyrat/modules/modular_implants/code/nifs.dm +++ b/modular_skyrat/modules/modular_implants/code/nifs.dm @@ -507,6 +507,7 @@ new /obj/item/disk/nifsoft_uploader/summoner(src) new /obj/item/disk/nifsoft_uploader/money_sense(src) new /obj/item/disk/nifsoft_uploader/dorms(src) + new /obj/item/disk/nifsoft_uploader/dorms/hypnosis(src) new /obj/item/disk/nifsoft_uploader/soulcatcher(src) /obj/item/storage/box/nif_ghost_box/ghost_role/PopulateContents() diff --git a/modular_skyrat/modules/modular_implants/code/nifsofts/hypnosis.dm b/modular_skyrat/modules/modular_implants/code/nifsofts/hypnosis.dm index b4f59561872..8576b7cbab2 100644 --- a/modular_skyrat/modules/modular_implants/code/nifsofts/hypnosis.dm +++ b/modular_skyrat/modules/modular_implants/code/nifsofts/hypnosis.dm @@ -1,3 +1,7 @@ +/obj/item/disk/nifsoft_uploader/dorms/hypnosis + name = "Purpura Eye" + loaded_nifsoft = /datum/nifsoft/action_granter/hypnosis + /datum/nifsoft/action_granter/hypnosis name = "Purpura Eye" program_desc = "Based on the hypnotic equipment provided by the LustWish vendor, the purpura eyes NIFSoft allows the user to ensnare others in a hypnotic trance. ((This is intended as a tool for ERP, don't use this for gameplay reasons.))" From 0aab5350f7df78212c391eb75b881e0aa6512c4c Mon Sep 17 00:00:00 2001 From: RatFromTheJungle <62520989+RatFromTheJungle@users.noreply.github.com> Date: Thu, 5 Oct 2023 04:49:43 -0400 Subject: [PATCH 35/49] fixes the 'lizared' shirt from unequipping itself on save load (#24113) Update preferences_savefile.dm --- .../master_files/code/modules/client/preferences_savefile.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/modular_skyrat/master_files/code/modules/client/preferences_savefile.dm b/modular_skyrat/master_files/code/modules/client/preferences_savefile.dm index f7ffc6fddd6..be228d89f10 100644 --- a/modular_skyrat/master_files/code/modules/client/preferences_savefile.dm +++ b/modular_skyrat/master_files/code/modules/client/preferences_savefile.dm @@ -213,7 +213,6 @@ var/static/list/undershirt_to_bra = list( "Bra, Sports" = "Bra, Sports", "Sports Bra (Alt)" = "Sports Bra (Alt)", - "LIZARED Top" = "LIZARED Top", "Bra" = "Bra", "Bra - Alt" = "Bra - Alt", "Bra - Thin" = "Bra - Thin", From f2950a14f445ecda992982eec82484aec15b367e Mon Sep 17 00:00:00 2001 From: RatFromTheJungle <62520989+RatFromTheJungle@users.noreply.github.com> Date: Thu, 5 Oct 2023 04:56:58 -0400 Subject: [PATCH 36/49] replaces interdynes .50 cal with the sidano gunset (#24098) * Update mining_roles.dm * Update code/modules/mob_spawn/ghost_roles/mining_roles.dm * Update gunsets.dm * Update mining_roles.dm * Update gunsets.dm --------- Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> --- code/modules/mob_spawn/ghost_roles/mining_roles.dm | 2 +- .../carwo_defense_systems/gunsets.dm | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/code/modules/mob_spawn/ghost_roles/mining_roles.dm b/code/modules/mob_spawn/ghost_roles/mining_roles.dm index 4c34dc26699..98c6dbc6d45 100644 --- a/code/modules/mob_spawn/ghost_roles/mining_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/mining_roles.dm @@ -316,7 +316,7 @@ ears = /obj/item/radio/headset/syndicate/alt shoes = /obj/item/clothing/shoes/combat r_pocket = /obj/item/gun/ballistic/automatic/pistol - r_hand = /obj/item/gun/ballistic/rifle/sniper_rifle + r_hand = /obj/item/storage/toolbox/guncase/skyrat/carwo_large_case/sindano/evil // SKYRAT EDIT - Original: /obj/item/gun/ballistic/rifle/sniper_rifle implants = list(/obj/item/implant/weapons_auth) id_trim = /datum/id_trim/syndicom/skyrat/interdyne //SKYRAT EDIT diff --git a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/gunsets.dm b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/gunsets.dm index eceec87cad6..030d17d0c43 100644 --- a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/gunsets.dm +++ b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/gunsets.dm @@ -37,6 +37,9 @@ /obj/item/ammo_box/magazine/c35sol_pistol/starts_empty = 2, ), src) +/obj/item/storage/toolbox/guncase/skyrat/carwo_large_case/sindano/evil + weapon_to_spawn = /obj/item/gun/ballistic/automatic/sol_smg/evil/no_mag + // Boxed grenade launcher, grenades sold seperately on this one /obj/item/storage/toolbox/guncase/skyrat/carwo_large_case/kiboko_magless From 504293c9c14131f2abca451944df803f25725617 Mon Sep 17 00:00:00 2001 From: Waterpig <49160555+Majkl-J@users.noreply.github.com> Date: Thu, 5 Oct 2023 18:38:46 +0200 Subject: [PATCH 37/49] Adds a table (#24119) Update CentCom_skyrat_z2.dmm --- _maps/map_files/generic/CentCom_skyrat_z2.dmm | 1 + 1 file changed, 1 insertion(+) diff --git a/_maps/map_files/generic/CentCom_skyrat_z2.dmm b/_maps/map_files/generic/CentCom_skyrat_z2.dmm index d187e5f5dac..ebe14eb4f51 100644 --- a/_maps/map_files/generic/CentCom_skyrat_z2.dmm +++ b/_maps/map_files/generic/CentCom_skyrat_z2.dmm @@ -2283,6 +2283,7 @@ "aDY" = ( /obj/machinery/processor, /obj/machinery/light/directional/west, +/obj/structure/table, /turf/open/indestructible/hoteltile{ icon_state = "cafeteria" }, From 5a9880727d735f04bd5e105d2cd7f03a582084e4 Mon Sep 17 00:00:00 2001 From: Bloop <13398309+vinylspiders@users.noreply.github.com> Date: Thu, 5 Oct 2023 13:44:30 -0400 Subject: [PATCH 38/49] Fixes gender and height offsets shaping on underwear, fixes gender shaping on jumpsuits (#23988) * Fixes gender shaping on underwear, and height offsets * Skyrat edit comments * Matching diffs to upstream * Fixes the jumpsuit issue * Makes gender shaping for digi top only, unless a new flag FEMALE_UNIFORM_DIGI_FULL is set * We don't have to be changing the uniform flags themselves * Fixes the caching issue * More consistent documentation * Update human_update_icons.dm * Update human_update_icons.dm --- code/__DEFINES/inventory.dm | 6 +++- code/__DEFINES/~skyrat_defines/inventory.dm | 1 + .../living/carbon/human/human_update_icons.dm | 29 ++++++++++++------ .../code/modules/clothing/under/color.dm | 3 ++ .../icons/mob/clothing/under/color_digi.dmi | Bin 5866 -> 5793 bytes .../mob/living/carbon/human/species.dm | 11 +++++-- 6 files changed, 38 insertions(+), 12 deletions(-) diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index f2f511c791b..542a909c2e9 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -133,6 +133,10 @@ #define FEMALE_UNIFORM_TOP_ONLY (1<<1) /// For when you don't want the "breast" effect to be applied (the one that cuts two pixels in the middle of the front of the uniform when facing east or west). #define FEMALE_UNIFORM_NO_BREASTS (1<<2) +// SKYRAT EDIT ADDITION START +/// For when you -don't- want to apply FEMALE_UNIFORM_TOP_ONLY to the digi version (which happens by default). +#define FEMALE_UNIFORM_DIGI_FULL (1<<3) +// SKYRAT EDIT ADDITION END //flags for alternate styles: These are hard sprited so don't set this if you didn't put the effort in #define NORMAL_STYLE 0 @@ -148,7 +152,7 @@ #define CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON (1<<2) ///has a sprite for monkeys #define CLOTHING_MONKEY_VARIATION (1<<3) -// SKYRAT EDIT ADDITION +// SKYRAT EDIT ADDITION START /// The sprite works fine for snouts. #define CLOTHING_SNOUTED_VARIATION (1<<4) /// The sprite works fine for snouts as-is. diff --git a/code/__DEFINES/~skyrat_defines/inventory.dm b/code/__DEFINES/~skyrat_defines/inventory.dm index fe2c1d7cee9..6ff282affb3 100644 --- a/code/__DEFINES/~skyrat_defines/inventory.dm +++ b/code/__DEFINES/~skyrat_defines/inventory.dm @@ -3,6 +3,7 @@ #define STYLE_TAUR_PAW (1<<3) #define STYLE_TAUR_HOOF (1<<4) #define STYLE_TAUR_ALL (STYLE_TAUR_SNAKE|STYLE_TAUR_PAW|STYLE_TAUR_HOOF) +#define STYLE_DIGI (1<<5) // We don't use the HUD for these, they have their own menu. #define LEWD_SLOT_VAGINA (1<<0) diff --git a/code/modules/mob/living/carbon/human/human_update_icons.dm b/code/modules/mob/living/carbon/human/human_update_icons.dm index bb112144447..d1ecdfaa7aa 100644 --- a/code/modules/mob/living/carbon/human/human_update_icons.dm +++ b/code/modules/mob/living/carbon/human/human_update_icons.dm @@ -87,7 +87,6 @@ There are several things that need to be remembered: if(check_obscured_slots(transparent_protection = TRUE) & ITEM_SLOT_ICLOTHING) return - var/target_overlay = uniform.icon_state if(uniform.adjusted == ALT_STYLE) target_overlay = "[target_overlay]_d" @@ -102,19 +101,29 @@ There are several things that need to be remembered: var/handled_by_bodytype = TRUE var/icon_file var/woman + var/digi // SKYRAT EDIT ADDITION - Digi female gender shaping + var/female_sprite_flags = uniform.female_sprite_flags // SKYRAT EDIT ADDITION - Digi female gender shaping var/mutant_styles = NONE // SKYRAT EDIT ADDITON - mutant styles to pass down to build_worn_icon. //BEGIN SPECIES HANDLING if((bodytype & BODYTYPE_MONKEY) && (uniform.supports_variations_flags & CLOTHING_MONKEY_VARIATION)) - icon_file = dna.species.generate_custom_worn_icon(LOADOUT_ITEM_UNIFORM, w_uniform, src) // SKYRAT EDIT CHANGE + icon_file = dna.species.generate_custom_worn_icon(LOADOUT_ITEM_UNIFORM, w_uniform, src) // SKYRAT EDIT CHANGE - ORIGINAL: icon_file = MONKEY_UNIFORM_FILE else if((bodytype & BODYTYPE_DIGITIGRADE) && (uniform.supports_variations_flags & CLOTHING_DIGITIGRADE_VARIATION)) - icon_file = uniform.worn_icon_digi || DIGITIGRADE_UNIFORM_FILE // SKYRAT EDIT CHANGE + icon_file = uniform.worn_icon_digi || DIGITIGRADE_UNIFORM_FILE // SKYRAT EDIT CHANGE - ORIGINAL: icon_file = DIGITIGRADE_UNIFORM_FILE + digi = TRUE // SKYRAT EDIT ADDITION - Digi female gender shaping // SKYRAT EDIT ADDITION - birbs else if(bodytype & BODYTYPE_CUSTOM) icon_file = dna.species.generate_custom_worn_icon(LOADOUT_ITEM_UNIFORM, w_uniform, src) // Might have to refactor how this works eventually, maybe. // SKYRAT EDIT END //Female sprites have lower priority than digitigrade sprites - else if(dna.species.sexes && (bodytype & BODYTYPE_HUMANOID) && physique == FEMALE && !(uniform.female_sprite_flags & NO_FEMALE_UNIFORM)) //Agggggggghhhhh + if(dna.species.sexes && (bodytype & BODYTYPE_HUMANOID) && physique == FEMALE && !(female_sprite_flags & NO_FEMALE_UNIFORM)) //Agggggggghhhhh // SKYRAT EDIT CHANGE - ORIGINAL: else if(dna.species.sexes && (bodytype & BODYTYPE_HUMANOID) && physique == FEMALE && !(uniform.female_sprite_flags & NO_FEMALE_UNIFORM)) woman = TRUE + // SKYRAT EDIT ADDITION START - Digi female gender shaping + if(digi) + mutant_styles |= STYLE_DIGI // for passing to wear_female_version + if(!(female_sprite_flags & FEMALE_UNIFORM_DIGI_FULL)) + female_sprite_flags &= ~FEMALE_UNIFORM_FULL // clear the FEMALE_UNIFORM_DIGI_FULL bit if it was set, we don't want that. + female_sprite_flags |= FEMALE_UNIFORM_TOP_ONLY // And set the FEMALE_UNIFORM_TOP bit if it is unset. + // SKYRAT EDIT ADDITION END if(!icon_exists(icon_file, RESOLVE_ICON_STATE(uniform))) icon_file = DEFAULT_UNIFORM_FILE @@ -131,7 +140,7 @@ There are several things that need to be remembered: default_layer = UNIFORM_LAYER, default_icon_file = icon_file, isinhands = FALSE, - female_uniform = woman ? uniform.female_sprite_flags : null, + female_uniform = woman ? female_sprite_flags : null, // SKYRAT EDIT CHANGE - Digi female gender shaping - ORIGINAL: female_uniform = woman ? uniform.female_sprite_flags : null, override_state = target_overlay, override_file = handled_by_bodytype ? icon_file : null, mutant_styles = mutant_styles, // SKYRAT EDIT ADDITION - Taur-friendly uniforms! @@ -157,7 +166,9 @@ There are several things that need to be remembered: var/obj/item/worn_item = wear_id update_hud_id(worn_item) var/icon_file = 'icons/mob/clothing/id.dmi' + id_overlay = wear_id.build_worn_icon(default_layer = ID_LAYER, default_icon_file = icon_file) + if(!id_overlay) return @@ -167,6 +178,7 @@ There are several things that need to be remembered: apply_overlay(ID_LAYER) + /mob/living/carbon/human/update_worn_gloves() remove_overlay(GLOVES_LAYER) @@ -681,8 +693,8 @@ There are several things that need to be remembered: overlays_standing[HANDS_LAYER] = hands apply_overlay(HANDS_LAYER) -/proc/wear_female_version(t_color, icon, layer, type, greyscale_colors) - var/index = "[t_color]-[greyscale_colors]" +/proc/wear_female_version(t_color, icon, layer, type, greyscale_colors, mutant_styles) // SKYRAT EDIT CHANGE - Digi female gender shaping - ORIGINAL: /proc/wear_female_version(t_color, icon, layer, type, greyscale_colors) + var/index = "[t_color]-[greyscale_colors][(mutant_styles & STYLE_DIGI) ? "-d" : ""]" // SKYRAT EDIT CHANGE - Digi female gender shaping - Original: var/index = "[t_color]-[greyscale_colors]]" var/icon/female_clothing_icon = GLOB.female_clothing_icons[index] if(!female_clothing_icon) //Create standing/laying icons if they don't exist generate_female_clothing(index, t_color, icon, type) @@ -834,7 +846,7 @@ mutant_styles: The mutant style - taur bodytype, STYLE_TESHARI, etc. // SKYRAT E var/mutable_appearance/standing if(female_uniform) - standing = wear_female_version(t_state, file2use, layer2use, female_uniform, greyscale_colors) //should layer2use be in sync with the adjusted value below? needs testing - shiz + standing = wear_female_version(t_state, file2use, layer2use, female_uniform, greyscale_colors, mutant_styles) //should layer2use be in sync with the adjusted value below? needs testing - shiz // SKYRAT EDIT CHANGE - ORIGINAL: standing = wear_female_version(t_state, file2use, layer2use, female_uniform, greyscale_colors) if(!standing) standing = mutable_appearance(file2use, t_state, -layer2use) // SKYRAT EDIT ADDITION START - Taur-friendly uniforms and suits @@ -879,7 +891,6 @@ mutant_styles: The mutant style - taur bodytype, STYLE_TESHARI, etc. // SKYRAT E return standing - /// Returns offsets used for equipped item overlays in list(px_offset,py_offset) form. /obj/item/proc/get_worn_offsets(isinhands) . = list(0,0) //(px,py) diff --git a/modular_skyrat/master_files/code/modules/clothing/under/color.dm b/modular_skyrat/master_files/code/modules/clothing/under/color.dm index 07327d062b8..094dddaabd3 100644 --- a/modular_skyrat/master_files/code/modules/clothing/under/color.dm +++ b/modular_skyrat/master_files/code/modules/clothing/under/color.dm @@ -1,6 +1,9 @@ /obj/item/clothing/under/color greyscale_config_worn_monkey = /datum/greyscale_config/jumpsuit/worn/monkey +/obj/item/clothing/under/color/rainbow + worn_icon_digi = 'modular_skyrat/master_files/icons/mob/clothing/under/color_digi.dmi' + /** * Random jumpsuit is the preferred style of the wearer if loaded as an outfit. * This is cleaner than creating a ../skirt variant as skirts are precached into SSwardrobe diff --git a/modular_skyrat/master_files/icons/mob/clothing/under/color_digi.dmi b/modular_skyrat/master_files/icons/mob/clothing/under/color_digi.dmi index 1d7d6c0e9330c95b3934ddab5fc68dbe33bf504e..1366a6ba1ad53e0284898c359cd465539735515b 100644 GIT binary patch delta 4845 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 I={UXk57ny1mjD0& delta 4902 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 H0qOq&Qp&`^ diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species.dm index 76ebf34b682..b87946aaf37 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species.dm @@ -124,13 +124,19 @@ GLOBAL_LIST_EMPTY(customizable_races) if(species_human.underwear && !(species_human.underwear_visibility & UNDERWEAR_HIDE_UNDIES)) var/datum/sprite_accessory/underwear/underwear = GLOB.underwear_list[species_human.underwear] var/mutable_appearance/underwear_overlay + var/female_sprite_flags = FEMALE_UNIFORM_FULL // the default gender shaping if(underwear) var/icon_state = underwear.icon_state if(underwear.has_digitigrade && (species_human.bodytype & BODYTYPE_DIGITIGRADE)) icon_state += "_d" - underwear_overlay = mutable_appearance(underwear.icon, icon_state, -BODY_LAYER) + female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY // for digi gender shaping + if(species_human.dna.species.sexes && species_human.physique == FEMALE && (underwear.gender == MALE)) + underwear_overlay = wear_female_version(icon_state, underwear.icon, BODY_LAYER, female_sprite_flags) + else + underwear_overlay = mutable_appearance(underwear.icon, icon_state, -BODY_LAYER) if(!underwear.use_static) underwear_overlay.color = species_human.underwear_color + underwear_overlay.pixel_y += height_offset standing += underwear_overlay if(species_human.bra && !(species_human.underwear_visibility & UNDERWEAR_HIDE_BRA)) @@ -142,7 +148,7 @@ GLOBAL_LIST_EMPTY(customizable_races) bra_overlay = mutable_appearance(bra.icon, icon_state, -BODY_LAYER) if(!bra.use_static) bra_overlay.color = species_human.bra_color - + bra_overlay.pixel_y += height_offset standing += bra_overlay if(species_human.undershirt && !(species_human.underwear_visibility & UNDERWEAR_HIDE_SHIRT)) @@ -155,6 +161,7 @@ GLOBAL_LIST_EMPTY(customizable_races) undershirt_overlay = mutable_appearance(undershirt.icon, undershirt.icon_state, -BODY_LAYER) if(!undershirt.use_static) undershirt_overlay.color = species_human.undershirt_color + undershirt_overlay.pixel_y += height_offset standing += undershirt_overlay if(species_human.socks && species_human.num_legs >= 2 && !(mutant_bodyparts["taur"]) && !(species_human.underwear_visibility & UNDERWEAR_HIDE_SOCKS)) From 3f24c4458cebf68366e7b25536b87654a1e3c34c Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Thu, 5 Oct 2023 22:01:02 +0200 Subject: [PATCH 39/49] Resprites IDs, Random Sprites in the Cards DMI, and Fixes Prisoner Coloring [MDB IGNORE] (#24120) * Resprites IDs, Random Sprites in the Cards DMI, and Fixes Prisoner Coloring (#78761) ## About The Pull Request These sprites have been adapted from a person who wished to remain anonymous with their blessing for tg Take the old IDs and make them look a little more fancy and sci-fi, I think they look really nice! This makes the job marker into a cute little screen too, but this is totally optional, if maintainers want the animation gone It wont take long at all. Also resprites a few random other items in the cards.dmi, such as emags, doorjacks, hack-o-lanturn, budget cards, and one touch up on the red team ID for laser tag for consistency. Also prisoner IDs had black symbols and black department but orange trim on an orange card, so it was just a huge mess. ![all the small things](https://github.com/tgstation/tgstation/assets/81941674/7bfe75a3-bb75-45bc-9947-373f16d4096b) ## Why It's Good For The Game I'm gonna be real IDs are kinda crusty, and its something EVERYONE has to look at at least once a shift. Poor HOPs may even look at two. God forbid three. Now they will look pretty neat. As for the other changes, the hack-o-lantern looks like it was made in 2001 its OLD. I don't even know if we use it, but now its updated. The red laser tag team got a nerf so now all team letters are white, instead of red being orange for no reason. ## Changelog :cl: image: We have received a new shipment of IDs, as the old ones were found out to be haunted. image: Laser tag red team ID has received a massive nerf image: Station budget cards have gotten a facelift image: Emags and Doorjacks fix: Numbered prisoner IDs will now be legible /:cl: * Resprites IDs, Random Sprites in the Cards DMI, and Fixes Prisoner Coloring --------- Co-authored-by: EricZilla <81941674+EricZilla@users.noreply.github.com> --- code/datums/id_trim/jobs.dm | 2 +- icons/obj/card.dmi | Bin 18101 -> 24237 bytes icons/obj/storage/storage.dmi | Bin 12584 -> 12577 bytes 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/id_trim/jobs.dm b/code/datums/id_trim/jobs.dm index d2939529dc6..6d50347aa3d 100644 --- a/code/datums/id_trim/jobs.dm +++ b/code/datums/id_trim/jobs.dm @@ -766,7 +766,7 @@ assignment = "Prisoner" trim_state = "trim_warden" department_color = COLOR_PRISONER_BLACK - subdepartment_color = COLOR_PRISONER_ORANGE + subdepartment_color = COLOR_PRISONER_BLACK sechud_icon_state = SECHUD_PRISONER template_access = list( ACCESS_CAPTAIN, diff --git a/icons/obj/card.dmi b/icons/obj/card.dmi index 2bbec93eed2c96b18d5e4b87e5765c4c3a60d278..4172a0a3641a71d3c3d739833f7148afcafa12a5 100644 GIT binary patch literal 24237 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 literal 18101 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 Date: Thu, 5 Oct 2023 22:36:41 +0200 Subject: [PATCH 40/49] Plumbing chemical chamber UI and operation improvements [MDB IGNORE] (#24123) * Plumbing chemical chamber UI and operation improvements (#78619) ## About The Pull Request 1. Fixes #58119 The word "Fixes" actually means the reaction chamber does it's job but "**does not guarantee**" the ph & temperature of the final solution is exactly within the ranges you specify especially for instantaneous reactions. There were 2 problems with the reaction chamber. a) **The ph chemistry of the reaction chamber was completely flipped upside down.** Let's look at the code https://github.com/tgstation/tgstation/blob/cfe13015203480dafaf3fce1589ad6045e708442/code/modules/plumbing/plumbers/reaction_chamber.dm#L152-L155 This was adding basic buffer when the solution was getting to basic & acid buffer when the solution was getting too acidic The correct mode of operation is as follows - If the ph is getting way too **acidic** i.e. it's ph **decreases** and becomes **lower** than the acidic limit then we need to add some **base buffer** so as to **increase** it's value and bring it back **above** the acidic limit - If the ph is getting way to **basic** i.e. it's ph **increases** and becomes **higher** than the alkaline limit then we need to add some **acidic buffer** so as to **decrease** it's value and bring it back **below** the alkaline limit b) **The reaction chamber did it's work only half of the time** Looking at the code https://github.com/tgstation/tgstation/blob/cfe13015203480dafaf3fce1589ad6045e708442/code/modules/plumbing/plumbers/reaction_chamber.dm#L152 The reaction chamber would only balance the ph of the solution **ONLY** when an reaction was taking place i.e. only when `reagents.is_reacting` is true. It would not attempt to balance the ph of the reagents as and when they were coming in i.e when `emptying` is FALSE. This means if an reaction took only like 0.5 to 1 second to occur the ph would be balanced only during that very short interval of time and so it would not make much of difference. So the 2 problems were the chamber was doing its job wrong and would do it only half the time. Again re-emphasizing even with these patches the chamber "**does not guarantee**" the final solution ph will be within those ranges. This is because the nature of reactions is unpredictable. Some reactions can take place so fast and have huge drastic ph changes that the reaction chamber would be ineffective regardless of how much base/acid it used to balance the reaction. The only thing is that it does it's job correctly and too the best of its ability with no guarentees. 3. The plumbing mixing chamber(parent type of the plumbing chemical reaction chamber) which you make via research plumbing RCD, UI now also uses an TGUI input list to accept chemicals so no more manual typing. 4. Both these types have their UI files converted Typescript cause why not ## Changelog :cl: fix: plumbing reaction chamber now balances the ph of it's solution correctly to the best of it's ability so no guarantees code: converted plumbing reaction chamber & mixing chamber UI files to Typescript refactor: plumbing mixing chamber now also accepts an TGUI input list to input it's chemicals /:cl: --------- Co-authored-by: Time-Green <7501474+Time-Green@ users.noreply.github.com> * Plumbing chemical chamber UI and operation improvements --------- Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> Co-authored-by: Time-Green <7501474+Time-Green@ users.noreply.github.com> --- .../plumbing/plumbers/reaction_chamber.dm | 129 ++++++++++++------ ...MixingChamber.js => ChemMixingChamber.tsx} | 51 ++++--- ...tionChamber.js => ChemReactionChamber.tsx} | 25 ++-- 3 files changed, 129 insertions(+), 76 deletions(-) rename tgui/packages/tgui/interfaces/{ChemMixingChamber.js => ChemMixingChamber.tsx} (86%) rename tgui/packages/tgui/interfaces/{ChemReactionChamber.js => ChemReactionChamber.tsx} (93%) diff --git a/code/modules/plumbing/plumbers/reaction_chamber.dm b/code/modules/plumbing/plumbers/reaction_chamber.dm index 689d043418b..36320f18184 100644 --- a/code/modules/plumbing/plumbers/reaction_chamber.dm +++ b/code/modules/plumbing/plumbers/reaction_chamber.dm @@ -1,5 +1,8 @@ ///a reaction chamber for plumbing. pretty much everything can react, but this one keeps the reagents separated and only reacts under your given terms +/// coefficient to convert temperature to joules. same lvl as acclimator +#define HEATER_COEFFICIENT 0.05 + /obj/machinery/plumbing/reaction_chamber name = "mixing chamber" desc = "Keeps chemicals separated until given conditions are met." @@ -19,9 +22,6 @@ ///towards which temperature do we build (except during draining)? var/target_temperature = 300 - ///cool/heat power - var/heater_coefficient = 0.05 //same lvl as acclimator - /obj/machinery/plumbing/reaction_chamber/Initialize(mapload, bolt, layer) . = ..() @@ -35,30 +35,48 @@ /// Handles properly detaching signal hooks. /obj/machinery/plumbing/reaction_chamber/proc/on_reagents_del(datum/reagents/reagents) SIGNAL_HANDLER + UnregisterSignal(reagents, list(COMSIG_REAGENTS_REM_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_CLEAR_REAGENTS, COMSIG_REAGENTS_REACTED, COMSIG_QDELETING)) return NONE /// Handles stopping the emptying process when the chamber empties. /obj/machinery/plumbing/reaction_chamber/proc/on_reagent_change(datum/reagents/holder, ...) SIGNAL_HANDLER - if(holder.total_volume == 0 && emptying) //we were emptying, but now we aren't + + if(!holder.total_volume && emptying) //we were emptying, but now we aren't emptying = FALSE holder.flags |= NO_REACT return NONE /obj/machinery/plumbing/reaction_chamber/process(seconds_per_tick) - if(!emptying || reagents.is_reacting) //suspend heating/cooling during emptying phase - reagents.adjust_thermal_energy((target_temperature - reagents.chem_temp) * heater_coefficient * seconds_per_tick * SPECIFIC_HEAT_DEFAULT * reagents.total_volume) //keep constant with chem heater + //half the power for getting reagents in + var/power_usage = active_power_usage * 0.5 + + if(!emptying || reagents.is_reacting) + //do reactions and stuff reagents.handle_reactions() - use_power(active_power_usage * seconds_per_tick) + //adjust temperature of final solution + var/temp_diff = target_temperature - reagents.chem_temp + if(abs(temp_diff) > 0.01) //if we are not close enough keep going + reagents.adjust_thermal_energy(temp_diff * HEATER_COEFFICIENT * seconds_per_tick * SPECIFIC_HEAT_DEFAULT * reagents.total_volume) //keep constant with chem heater + + //do other stuff with final solution + handle_reagents(seconds_per_tick) + + //full power for doing reactions + power_usage *= 2 + + use_power(power_usage * seconds_per_tick) + +///For subtypes that want to do additional reagent handling +/obj/machinery/plumbing/reaction_chamber/proc/handle_reagents(seconds_per_tick) + return /obj/machinery/plumbing/reaction_chamber/power_change() . = ..() - if(use_power != NO_POWER_USE) - icon_state = initial(icon_state) + "_on" - else - icon_state = initial(icon_state) + + icon_state = initial(icon_state) + "[use_power != NO_POWER_USE ? "_on" : ""]" /obj/machinery/plumbing/reaction_chamber/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -67,31 +85,29 @@ ui.open() /obj/machinery/plumbing/reaction_chamber/ui_data(mob/user) - var/list/data = list() + . = list() var/list/reagents_data = list() for(var/datum/reagent/required_reagent as anything in required_reagents) //make a list where the key is text, because that looks alot better in the ui than a typepath var/list/reagent_data = list() reagent_data["name"] = initial(required_reagent.name) - reagent_data["required_reagent"] = required_reagents[required_reagent] + reagent_data["volume"] = required_reagents[required_reagent] reagents_data += list(reagent_data) - data["reagents"] = reagents_data - data["emptying"] = emptying - data["temperature"] = round(reagents.chem_temp, 0.1) - data["targetTemp"] = target_temperature - data["isReacting"] = reagents.is_reacting - return data + .["reagents"] = reagents_data + .["emptying"] = emptying + .["temperature"] = round(reagents.chem_temp, 0.1) + .["targetTemp"] = target_temperature + .["isReacting"] = reagents.is_reacting -/obj/machinery/plumbing/reaction_chamber/ui_act(action, params) +/obj/machinery/plumbing/reaction_chamber/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return TRUE - . = FALSE switch(action) if("add") - var/selected_reagent = tgui_input_list(usr, "Select reagent", "Reagent", GLOB.chemical_name_list) + var/selected_reagent = tgui_input_list(ui.user, "Select reagent", "Reagent", GLOB.chemical_name_list) if(!selected_reagent) return TRUE @@ -104,32 +120,41 @@ if(input_amount) required_reagents[input_reagent] = input_amount - . = TRUE + return TRUE if("remove") var/reagent = get_chem_id(params["chem"]) if(reagent) required_reagents.Remove(reagent) - . = TRUE + return TRUE if("temperature") var/target = text2num(params["target"]) if(target != null) - target_temperature=clamp(target, 0, 1000) - .=TRUE + target_temperature = clamp(target, 0, 1000) + return TRUE + + var/result = handle_ui_act(action, params, ui, state) + if(isnull(result)) + result = FALSE + return result + +/// For custom handling of ui actions from inside a subtype +/obj/machinery/plumbing/reaction_chamber/proc/handle_ui_act(action, params, datum/tgui/ui, datum/ui_state/state) + return null ///Chemistry version of reaction chamber that allows for acid and base buffers to be used while reacting /obj/machinery/plumbing/reaction_chamber/chem name = "reaction chamber" - ///If above this pH, we start dumping buffer into it - var/acidic_limit = 9 ///If below this pH, we start dumping buffer into it - var/alkaline_limit = 5 + var/acidic_limit = 5 + ///If above this pH, we start dumping acid into it + var/alkaline_limit = 9 - ///Beaker that holds the acidic buffer. I don't want to deal with snowflaking so it's just a separate thing. It's a small (50u) beaker + ///beaker that holds the acidic buffer(50u) var/obj/item/reagent_containers/cup/beaker/acidic_beaker - ///beaker that holds the alkaline buffer. + ///beaker that holds the alkaline buffer(50u). var/obj/item/reagent_containers/cup/beaker/alkaline_beaker /obj/machinery/plumbing/reaction_chamber/chem/Initialize(mapload, bolt, layer) @@ -147,13 +172,27 @@ QDEL_NULL(alkaline_beaker) return ..() -/obj/machinery/plumbing/reaction_chamber/chem/process(seconds_per_tick) - //add acidic/alkaine buffer if over/under limit - if(reagents.is_reacting && reagents.ph < alkaline_limit) - alkaline_beaker.reagents.trans_to(reagents, 1 * seconds_per_tick) - if(reagents.is_reacting && reagents.ph > acidic_limit) - acidic_beaker.reagents.trans_to(reagents, 1 * seconds_per_tick) - ..() +/obj/machinery/plumbing/reaction_chamber/chem/handle_reagents(seconds_per_tick) + while(reagents.ph < acidic_limit || reagents.ph > alkaline_limit) + if(machine_stat & NOPOWER) + return + + /** + * figure out which buffer to transfer to restore balance + * if solution is getting too basic(high ph) add some acid to lower it's value + * else if solution is getting too acidic(low ph) add some base to increase it's value + */ + var/datum/reagents/buffer = reagents.ph > alkaline_limit ? acidic_beaker.reagents : alkaline_beaker.reagents + if(!buffer.total_volume) + return + + //transfer buffer and handle reactions, not a proven math but looks logical + var/transfer_amount = FLOOR((reagents.ph > alkaline_limit ? (reagents.ph - alkaline_limit) : (acidic_limit - reagents.ph)) * seconds_per_tick, CHEMICAL_QUANTISATION_LEVEL) + if(transfer_amount <= CHEMICAL_QUANTISATION_LEVEL || !buffer.trans_to(reagents, transfer_amount)) + return + + //some power for accurate ph balancing + use_power(active_power_usage * 0.2 * seconds_per_tick) /obj/machinery/plumbing/reaction_chamber/chem/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -167,16 +206,16 @@ .["reagentAcidic"] = acidic_limit .["reagentAlkaline"] = alkaline_limit -/obj/machinery/plumbing/reaction_chamber/chem/ui_act(action, params) - . = ..() - if (.) - return +/obj/machinery/plumbing/reaction_chamber/chem/handle_ui_act(action, params, datum/tgui/ui, datum/ui_state/state) + . = TRUE switch(action) if("acidic") - acidic_limit = round(text2num(params["target"])) + acidic_limit = clamp(round(text2num(params["target"])), 0, alkaline_limit) if("alkaline") - alkaline_limit = round(text2num(params["target"])) + alkaline_limit = clamp(round(text2num(params["target"])), acidic_limit + 0.01, 14) + else + return FALSE - return TRUE +#undef HEATER_COEFFICIENT diff --git a/tgui/packages/tgui/interfaces/ChemMixingChamber.js b/tgui/packages/tgui/interfaces/ChemMixingChamber.tsx similarity index 86% rename from tgui/packages/tgui/interfaces/ChemMixingChamber.js rename to tgui/packages/tgui/interfaces/ChemMixingChamber.tsx index eeffd351387..30a41de8080 100644 --- a/tgui/packages/tgui/interfaces/ChemMixingChamber.js +++ b/tgui/packages/tgui/interfaces/ChemMixingChamber.tsx @@ -1,10 +1,24 @@ import { useBackend, useLocalState } from '../backend'; -import { AnimatedNumber, Box, Button, Input, NumberInput, Section, Stack } from '../components'; +import { AnimatedNumber, Box, Button, NumberInput, Section, Stack } from '../components'; import { Window } from '../layouts'; import { round, toFixed } from 'common/math'; +import { BooleanLike } from 'common/react'; + +type Reagent = { + name: string; + volume: number; +}; + +export type MixingData = { + reagents: Reagent[]; + emptying: BooleanLike; + temperature: number; + targetTemp: number; + isReacting: BooleanLike; +}; export const ChemMixingChamber = (props, context) => { - const { act, data } = useBackend(context); + const { act, data } = useBackend(context); const [reagentName, setReagentName] = useLocalState( context, @@ -17,7 +31,7 @@ export const ChemMixingChamber = (props, context) => { 1 ); - const { emptying, temperature, ph, targetTemp, isReacting } = data; + const { emptying, temperature, targetTemp, isReacting } = data; const reagents = data.reagents || []; return ( @@ -35,7 +49,7 @@ export const ChemMixingChamber = (props, context) => { unit="K" step={10} stepPixelSize={3} - value={round(targetTemp)} + value={round(targetTemp, 0.1)} minValue={0} maxValue={1000} onDrag={(e, value) => @@ -88,11 +102,15 @@ export const ChemMixingChamber = (props, context) => { - setReagentName(value)} +

E$E1E_y2X%5M^amrdbsVB~SU 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 Ml9gGd$(^YG1Ay5G^8f$< literal 20090 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 C2#!er diff --git a/tgstation.dme b/tgstation.dme index fe09c682d3a..aea653999d7 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5164,6 +5164,7 @@ #include "code\modules\projectiles\guns\special\blastcannon.dm" #include "code\modules\projectiles\guns\special\chem_gun.dm" #include "code\modules\projectiles\guns\special\grenade_launcher.dm" +#include "code\modules\projectiles\guns\special\hand_of_midas.dm" #include "code\modules\projectiles\guns\special\meat_hook.dm" #include "code\modules\projectiles\guns\special\medbeam.dm" #include "code\modules\projectiles\guns\special\syringe_gun.dm" From d479e96a9fe5c639d881f84b54436e3059a7afdb Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 4 Oct 2023 07:01:15 +0200 Subject: [PATCH 19/49] Admin dynamic rule management [MDB IGNORE] (#24101) * Admin dynamic rule management (#78720) ## About The Pull Request ![image](https://github.com/tgstation/tgstation/assets/7483112/a538643e-8d84-48b1-9dc0-c29a90d3a46c) This PR adds a very ugly menu which allows admins to force dynamic rulesets to be enabled or disabled. Some admins asked if someone could add this and it seems reasonably useful. ![image](https://github.com/tgstation/tgstation/assets/7483112/2a88cceb-0cdc-4d92-b688-19cd7daf31ae) The information you have available becomes slightly more detailed once the game is actually running, because then we know how many players and how much threat there is. ![image](https://github.com/tgstation/tgstation/assets/7483112/91fdc7e7-dc3e-4b56-a2db-a33cb241e39b) I don't know why the weight of every midround is 0 when I run locally. It's fine. Unfortunately, the interface I have crafted is hideous. This is because it's not part of tgui and I am not very good at working with byond UIs without my beautiful typescript. It functions though. If anyone has any pointers I'll take 'em. "Force disabling" a ruleset simply ensures it will never run. "Force enabling" a ruleset disregards minimum population and minimum threat rules, but doesn't ensure that the ruleset will run. It might still be skipped due to low weight, insufficient threat to _buy_ it, or other disqualifying factors. ## Why It's Good For The Game It was an admin request so presumably they have some plans for it. It's a less-intrusive way of theming a round than disabling dynamic and running all the midround rules yourself. If they want to temporarily set the game to traitorling I guess they can do that. Or only heretic/cult. ## Changelog :cl: admin: Admins can turn off dynamic rulesets (or force them on despite not meeting the qualification criteria) on a per-round basis. /:cl: * Admin dynamic rule management --------- Co-authored-by: Jacquerel --- code/__DEFINES/dynamic.dm | 6 + code/game/gamemodes/dynamic/dynamic.dm | 2 + .../dynamic/dynamic_midround_rolling.dm | 6 +- .../gamemodes/dynamic/dynamic_rulesets.dm | 38 ++++-- .../dynamic/dynamic_rulesets_latejoin.dm | 4 +- .../dynamic/dynamic_rulesets_midround.dm | 14 +-- code/modules/admin/admin.dm | 108 ++++++++++++++++++ code/modules/admin/topic.dm | 33 ++++++ 8 files changed, 190 insertions(+), 21 deletions(-) diff --git a/code/__DEFINES/dynamic.dm b/code/__DEFINES/dynamic.dm index f07b7e20b0f..07c833cdc49 100644 --- a/code/__DEFINES/dynamic.dm +++ b/code/__DEFINES/dynamic.dm @@ -32,3 +32,9 @@ #define ROUNDSTART_RULESET "Roundstart" #define LATEJOIN_RULESET "Latejoin" #define MIDROUND_RULESET "Midround" + +#define RULESET_NOT_FORCED "not forced" +/// Ruleset should run regardless of population and threat available +#define RULESET_FORCE_ENABLED "force enabled" +/// Ruleset should not run regardless of population and threat available +#define RULESET_FORCE_DISABLED "force disabled" diff --git a/code/game/gamemodes/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm index 6208df36de1..ce64f200458 100644 --- a/code/game/gamemodes/dynamic/dynamic.dm +++ b/code/game/gamemodes/dynamic/dynamic.dm @@ -17,6 +17,8 @@ GLOBAL_LIST_EMPTY(dynamic_forced_roundstart_ruleset) GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) /// Modify the threat level for station traits before dynamic can be Initialized. List(instance = threat_reduction) GLOBAL_LIST_EMPTY(dynamic_station_traits) +/// Rulesets which have been forcibly enabled or disabled +GLOBAL_LIST_EMPTY(dynamic_forced_rulesets) /datum/game_mode/dynamic // Threat logging vars diff --git a/code/game/gamemodes/dynamic/dynamic_midround_rolling.dm b/code/game/gamemodes/dynamic/dynamic_midround_rolling.dm index 5079035834b..c3e295ae875 100644 --- a/code/game/gamemodes/dynamic/dynamic_midround_rolling.dm +++ b/code/game/gamemodes/dynamic/dynamic_midround_rolling.dm @@ -45,7 +45,11 @@ continue if (!ruleset.acceptable(GLOB.alive_player_list.len, threat_level)) - log_dynamic("FAIL: [ruleset] is not acceptable with the current parameters. Alive players: [GLOB.alive_player_list.len], threat level: [threat_level]") + var/ruleset_forced = GLOB.dynamic_forced_rulesets[type] || RULESET_NOT_FORCED + if (ruleset_forced == RULESET_NOT_FORCED) + log_dynamic("FAIL: [ruleset] is not acceptable with the current parameters. Alive players: [GLOB.alive_player_list.len], threat level: [threat_level]") + else + log_dynamic("FAIL: [ruleset] was disabled.") continue if (mid_round_budget < ruleset.cost) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets.dm b/code/game/gamemodes/dynamic/dynamic_rulesets.dm index 1fe34273fb9..0af18e0b0aa 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets.dm @@ -106,23 +106,39 @@ /// By default, a rule is acceptable if it satisfies the threat level/population requirements. /// If your rule has extra checks, such as counting security officers, do that in ready() instead /datum/dynamic_ruleset/proc/acceptable(population = 0, threat_level = 0) - pop_per_requirement = pop_per_requirement > 0 ? pop_per_requirement : mode.pop_per_requirement - indice_pop = min(requirements.len,round(population/pop_per_requirement)+1) - - if(minimum_players > population) - log_dynamic("FAIL: [src] failed acceptable: minimum_players ([minimum_players]) > population ([population])") + var/ruleset_forced = GLOB.dynamic_forced_rulesets[type] || RULESET_NOT_FORCED + if (ruleset_forced != RULESET_NOT_FORCED) + if (ruleset_forced == RULESET_FORCE_ENABLED) + return TRUE + else + log_dynamic("FAIL: [src] was disabled in admin panel.") + return FALSE + + if(!is_valid_population(population)) + var/range = maximum_players > 0 ? "([minimum_players] - [maximum_players])" : "(minimum: [minimum_players])" + log_dynamic("FAIL: [src] failed acceptable: min/max players out of range [range] vs population ([population])") return FALSE - if(maximum_players > 0 && population > maximum_players) - log_dynamic("FAIL: [src] failed acceptable: maximum_players ([maximum_players]) < population ([population])") - return FALSE - - if (threat_level < requirements[indice_pop]) + if (!is_valid_threat(population, threat_level)) log_dynamic("FAIL: [src] failed acceptable: threat_level ([threat_level]) < requirement ([requirements[indice_pop]])") return FALSE return TRUE +/// Returns true if we have enough players to run +/datum/dynamic_ruleset/proc/is_valid_population(population) + if(minimum_players > population) + return FALSE + if(maximum_players > 0 && population > maximum_players) + return FALSE + return TRUE + +/// Sets the current threat indices and returns true if we're inside of them +/datum/dynamic_ruleset/proc/is_valid_threat(population, threat_level) + pop_per_requirement = pop_per_requirement > 0 ? pop_per_requirement : mode.pop_per_requirement + indice_pop = min(requirements.len,round(population/pop_per_requirement)+1) + return threat_level >= requirements[indice_pop] + /// When picking rulesets, if dynamic picks the same one multiple times, it will "scale up". /// However, doing this blindly would result in lowpop rounds (think under 10 people) where over 80% of the crew is antags! /// This function is here to ensure the antag ratio is kept under control while scaling up. @@ -175,7 +191,7 @@ candidates = list() assigned = list() antag_datum = null - + /// Here you can perform any additional checks you want. (such as checking the map etc) /// Remember that on roundstart no one knows what their job is at this point. /// IMPORTANT: If ready() returns TRUE, that means pre_execute() or execute() should never fail! diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm index 3610d8aad91..7b125439d53 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm @@ -38,8 +38,8 @@ job_check++ // Checking for "enemies" (such as sec officers). To be counters, they must either not be candidates to that rule, or have a job that restricts them from it var/threat = round(mode.threat_level/10) - - if (job_check < required_enemies[threat]) + var/ruleset_forced = (GLOB.dynamic_forced_rulesets[type] || RULESET_NOT_FORCED) == RULESET_FORCE_ENABLED + if (!ruleset_forced && job_check < required_enemies[threat]) log_dynamic("FAIL: [src] is not ready, because there are not enough enemies: [required_enemies[threat]] needed, [job_check] found") return FALSE diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm index 0634c44a4f2..b7c66873aee 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm @@ -116,8 +116,8 @@ job_check++ // Checking for "enemies" (such as sec officers). To be counters, they must either not be candidates to that rule, or have a job that restricts them from it var/threat = round(mode.threat_level/10) - - if (job_check < required_enemies[threat]) + var/ruleset_forced = (GLOB.dynamic_forced_rulesets[type] || RULESET_NOT_FORCED) == RULESET_FORCE_ENABLED + if (!ruleset_forced && job_check < required_enemies[threat]) log_dynamic("FAIL: [src] is not ready, because there are not enough enemies: [required_enemies[threat]] needed, [job_check] found") return FALSE @@ -387,7 +387,7 @@ var/list/operative_cap = list(2,2,3,3,4,5,5,5,5,5) -/datum/dynamic_ruleset/midround/from_ghosts/nuclear/acceptable(population=0, threat=0) +/datum/dynamic_ruleset/midround/from_ghosts/nuclear/acceptable(population=0, threat_level=0) if (locate(/datum/dynamic_ruleset/roundstart/nuclear) in mode.executed_rules) return FALSE // Unavailable if nuke ops were already sent at roundstart indice_pop = min(operative_cap.len, round(living_players.len/5)+1) @@ -542,7 +542,7 @@ minimum_players = 15 repeatable = TRUE -/datum/dynamic_ruleset/midround/from_ghosts/nightmare/acceptable(population = 0, threat = 0) +/datum/dynamic_ruleset/midround/from_ghosts/nightmare/acceptable(population = 0, threat_level = 0) var/turf/spawn_loc = find_maintenance_spawn(atmos_sensitive = TRUE, require_darkness = TRUE) //Checks if there's a single safe, dark tile on station. if(!spawn_loc) return FALSE @@ -719,7 +719,7 @@ spawn_locs = list() return ..() -/datum/dynamic_ruleset/midround/from_ghosts/revenant/acceptable(population=0, threat=0) +/datum/dynamic_ruleset/midround/from_ghosts/revenant/acceptable(population=0, threat_level=0) if(GLOB.dead_mob_list.len < dead_mobs_required) return FALSE return ..() @@ -782,7 +782,7 @@ minimum_players = 20 repeatable = TRUE -/datum/dynamic_ruleset/midround/pirates/acceptable(population=0, threat=0) +/datum/dynamic_ruleset/midround/pirates/acceptable(population=0, threat_level=0) if (SSmapping.is_planetary() || GLOB.light_pirate_gangs.len == 0) return FALSE return ..() @@ -804,7 +804,7 @@ minimum_players = 25 repeatable = TRUE -/datum/dynamic_ruleset/midround/dangerous_pirates/acceptable(population=0, threat=0) +/datum/dynamic_ruleset/midround/dangerous_pirates/acceptable(population=0, threat_level=0) if (SSmapping.is_planetary() || GLOB.heavy_pirate_gangs.len == 0) return FALSE return ..() diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index bc6942a9a11..2d2c692ed5f 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -21,6 +21,7 @@ var/dat = "