From 2011c229f9a37de8fa67a74d8e40974515724cde Mon Sep 17 00:00:00 2001 From: stalkerino <66872447+irakligabunia@users.noreply.github.com> Date: Mon, 27 Nov 2023 12:14:37 +0400 Subject: [PATCH 01/42] Readds skull facemask and facepaint (#5042) # About the pull request It readds two items that were removed in the past for no valid reason (in my opinion), since it was a targeted PR against a specific player I do not think it should've been removed. # Explain why it's good for the game It looks nice and fits the atmosphere, adding it will help players customize their characters without being too loud. The removal reason of "You'd get laughed at for wearing it IRL" is invalid, a lot of military and law enforcement people wear skull masks, punisher emblems and etcetra - this is especially evident in America (We're UA) https://discord.com/channels/150315577943130112/746325423289401395/1168350579307860078 https://discord.com/channels/150315577943130112/827156857566265375/1145494273568022588 https://files.catbox.moe/4o3ag1.png https://discord.com/channels/150315577943130112/604397850675380234/1094357565317586964 -- the person who made it admitting it was targeted. # Testing Photographs and Procedure I don't think it needs testing # Changelog :cl: stalkerino add: readds skull facepaint and skull balaclava (blue and black) /:cl: --- code/modules/client/preferences_gear.dm | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index c976f9b5715e..8a46e60956db 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -161,6 +161,18 @@ GLOBAL_LIST_EMPTY(gear_datums_by_name) display_name = "USCM balaclava, tan" path = /obj/item/clothing/mask/rebreather/scarf/tan +/datum/gear/skull_balaclava_blue + display_name = "Blue Skull Balaclava" + path = /obj/item/clothing/mask/rebreather/skull + cost = 4 //same as skull facepaint + slot = WEAR_FACE + +/datum/gear/skull_balaclava_black + display_name = "Black Skull Balaclava" + path = /obj/item/clothing/mask/rebreather/skull/black + cost = 4 + slot = WEAR_FACE + /datum/gear/headwear category = "Headwear" cost = 3 @@ -876,6 +888,11 @@ GLOBAL_LIST_EMPTY(gear_datums_by_name) display_name = "Facepaint, black" path = /obj/item/facepaint/black +/datum/gear/skullfacepaint + display_name = "Skull Facepaint" + path = /obj/item/facepaint/skull + cost = 3 + /datum/gear/misc/facepaint_body display_name = "Fullbody paint" path = /obj/item/facepaint/sniper From 77a9f061a2a880c879b6cdd0cbbdd4c0a491fc43 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Mon, 27 Nov 2023 08:22:43 +0000 Subject: [PATCH 02/42] Automatic changelog for PR #5042 [ci skip] --- html/changelogs/AutoChangeLog-pr-5042.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5042.yml diff --git a/html/changelogs/AutoChangeLog-pr-5042.yml b/html/changelogs/AutoChangeLog-pr-5042.yml new file mode 100644 index 000000000000..ff4fbf2ac464 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5042.yml @@ -0,0 +1,4 @@ +author: "stalkerino" +delete-after: True +changes: + - rscadd: "readds skull facepaint and skull balaclava (blue and black)" \ No newline at end of file From a955791561d5aeab0ff0640923fe1192ad377830 Mon Sep 17 00:00:00 2001 From: fira Date: Mon, 27 Nov 2023 13:22:49 +0100 Subject: [PATCH 03/42] /tg/ Status effects part 1 - fluid status updates (#4828) ![image](https://github.com/cmss13-devs/cmss13/assets/604624/38cdd1a0-e13c-4d69-b893-49cea2a8113f) CM Dev figured it out 9 years ago and nobody listened and kept tacking illogical conditions # About the pull request Builds on previous "prelude" PRs in the following steps: * Ports /tg/ body_position and mobility_flags * Fixes some interaction requirements to use stun/mobility rather than lying/knocked_down * Ports /tg/ granular status updates, ie. status propagating through handlers and signals. This includes changes to resting, buckling, and lying down human transforms. * Wires our status effect system to it directly * Removes `update_canmove` from existence completely as not needed anymore Because step 1 and 2 require updating all the gameplay logic using them, this PR modifies a lot of files. Part 2 will move the actual status effects to /tg/ status_effects, resolving our timing problems. # Testing Photographs and Procedure
Testing Checklist! - [x] Basic Movement - [x] Admin Freeze Prevents Movement - [x] Resting, Getting Up - [x] Xenos change icon when resting - [x] Buckling, including bed rotation and propelled chairs - [x] Crawling Movement including sprite movement - [x] Aggressive, Choke Grabbing, and Fireman carry apply rotation - [x] Xeno Pounce and Abduct properly freeze both target and caster - [x] Double dropship seats density update - [x] Explosive knockout on Humans - [x] Xeno burrow density and movement interactions - [x] Xeno nest interactions, specifically confirm density changes work - [ ] Xeno nest bullet hits doublecheck with snowflake trait check - [x] Combat Xeno ~~knockouts~~ knockdown and sprite updates - [x] ~~Sleeping, Waking up, Usage of items while sleeping~~ - Can't really test this we have almost no sleep code - [x] Arbitrary buckling rotations - [x] Admin-set transforms work with buckling/lying - [ ] All the broken objects that will only be found out in Testmerge
# Changelog :cl: code: Ported basic /tg/ Status Backend. add: Human transform changes such as lying down, knock down, buckling, are now animated. fix: Some statuses will now take effect immediately instead of waiting for a life tick, notably Resting. balance: Many interaction requirements were changed to eg. fail upon stuns rather than if lying down. /:cl: --- .../signals/atom/mob/living/signals_living.dm | 5 + .../dcs/signals/atom/mob/signals_mob.dm | 6 - code/__DEFINES/mobs.dm | 28 +++ code/__DEFINES/traits.dm | 45 +++- code/__HELPERS/animations.dm | 2 + code/__HELPERS/status_effects.dm | 1 + code/__HELPERS/unsorted.dm | 16 +- code/_globalvars/bitfields.dm | 7 + code/_onclick/human.dm | 6 +- code/_onclick/ventcrawl.dm | 4 +- code/_onclick/xeno.dm | 4 +- code/datums/action.dm | 6 +- code/datums/agents/tools/chloroform.dm | 2 - code/datums/ammo/ammo.dm | 6 +- code/datums/ammo/bullet/shotgun.dm | 2 +- code/datums/ammo/xeno.dm | 8 +- code/datums/components/footstep.dm | 2 +- code/datums/diseases/cold.dm | 4 +- code/datums/diseases/flu.dm | 4 +- .../effects/xeno_strains/boiler_trap.dm | 14 +- code/datums/elements/mouth_drop_item.dm | 4 +- code/datums/mob_hud.dm | 4 +- code/game/atoms.dm | 2 +- .../colonialmarines/whiskey_outpost.dm | 4 +- .../gamemodes/colonialmarines/xenovsxeno.dm | 1 - code/game/jobs/job/antag/xeno/xenomorph.dm | 3 +- code/game/machinery/OpTable.dm | 2 +- code/game/machinery/bots/mulebot.dm | 1 - code/game/machinery/computer/aifixer.dm | 1 - code/game/machinery/computer/medical.dm | 2 +- code/game/machinery/computer/robot.dm | 21 +- code/game/machinery/doors/airlock.dm | 2 +- code/game/machinery/doors/firedoor.dm | 2 +- code/game/machinery/fax_machine.dm | 3 +- code/game/machinery/floodlight.dm | 4 +- code/game/machinery/iv_drip.dm | 4 +- code/game/machinery/machinery.dm | 10 +- .../game/machinery/medical_pod/bodyscanner.dm | 4 +- .../game/machinery/medical_pod/medical_pod.dm | 1 - code/game/machinery/medical_pod/sleeper.dm | 4 +- code/game/machinery/nuclearbomb.dm | 4 +- code/game/machinery/pipe/pipe_dispenser.dm | 6 +- code/game/machinery/vending/cm_vending.dm | 2 +- code/game/machinery/vending/vending.dm | 2 +- code/game/objects/effects/acid_hole.dm | 10 +- code/game/objects/effects/aliens.dm | 4 +- code/game/objects/effects/step_triggers.dm | 4 +- code/game/objects/items.dm | 9 +- .../objects/items/devices/autopsy_scanner.dm | 2 +- code/game/objects/items/devices/binoculars.dm | 2 +- .../objects/items/devices/radio/beacon.dm | 2 +- .../items/explosives/grenades/flashbang.dm | 7 +- code/game/objects/items/hoverpack.dm | 4 +- .../items/implants/implantneurostim.dm | 2 +- .../items/reagent_containers/blood_pack.dm | 2 +- code/game/objects/items/storage/backpack.dm | 2 +- code/game/objects/items/storage/internal.dm | 8 +- .../objects/items/storage/large_holster.dm | 2 +- code/game/objects/items/storage/smartpack.dm | 2 +- .../objects/items/tools/experimental_tools.dm | 2 +- code/game/objects/items/toys/toy_weapons.dm | 6 +- code/game/objects/objs.dm | 19 +- code/game/objects/structures.dm | 7 +- .../structures/barricade/deployable.dm | 2 +- code/game/objects/structures/bookcase.dm | 2 +- .../structures/crates_lockers/closets.dm | 11 +- .../crates_lockers/closets/secure/personal.dm | 2 +- .../closets/secure/secure_closets.dm | 2 +- .../crates_lockers/secure_crates.dm | 2 +- code/game/objects/structures/ladders.dm | 12 +- code/game/objects/structures/morgue.dm | 5 +- .../structures/stool_bed_chair_nest/bed.dm | 2 +- .../structures/stool_bed_chair_nest/chairs.dm | 2 +- .../stool_bed_chair_nest/wheelchair.dm | 2 +- .../stool_bed_chair_nest/xeno_nest.dm | 12 +- .../objects/structures/vulture_spotter.dm | 4 +- code/game/objects/structures/watercloset.dm | 1 + code/modules/admin/topic/topic.dm | 11 - code/modules/animations/animation_library.dm | 4 +- code/modules/assembly/infrared.dm | 2 +- code/modules/clothing/glasses/glasses.dm | 62 +++--- code/modules/clothing/glasses/hud.dm | 2 +- code/modules/clothing/gloves/miscellaneous.dm | 2 +- code/modules/clothing/head/misc_special.dm | 56 ++--- code/modules/clothing/masks/breath.dm | 2 +- code/modules/clothing/suits/jobs.dm | 2 +- code/modules/clothing/suits/labcoat.dm | 2 +- code/modules/clothing/suits/marine_armor.dm | 7 +- code/modules/clothing/suits/marine_coat.dm | 2 +- code/modules/clothing/suits/miscellaneous.dm | 2 +- code/modules/clothing/under/under.dm | 2 +- code/modules/cm_aliens/XenoStructures.dm | 5 +- code/modules/cm_aliens/structures/fruit.dm | 2 +- code/modules/cm_aliens/structures/trap.dm | 2 +- code/modules/cm_aliens/structures/tunnel.dm | 4 +- code/modules/cm_marines/Donator_Items.dm | 8 +- code/modules/cm_marines/m2c.dm | 17 +- code/modules/cm_marines/marines_consoles.dm | 4 +- code/modules/cm_marines/orbital_cannon.dm | 2 +- code/modules/cm_marines/smartgun_mount.dm | 10 +- code/modules/cm_preds/thrall_procs.dm | 2 +- code/modules/cm_preds/yaut_bracers.dm | 5 +- code/modules/cm_preds/yaut_procs.dm | 6 +- code/modules/cm_tech/hologram.dm | 1 - code/modules/defenses/defenses.dm | 4 +- .../desert_dam/filtration/filtration.dm | 2 +- .../desert_dam/motion_sensor/sensortower.dm | 2 +- code/modules/droppod/container_droppod.dm | 2 +- code/modules/economy/ATM.dm | 2 +- code/modules/flufftext/Dreaming.dm | 2 +- code/modules/flufftext/Hallucination.dm | 2 +- code/modules/gear_presets/corpses.dm | 1 - code/modules/hydroponics/vines.dm | 1 - code/modules/mob/dead/observer/observer.dm | 4 +- code/modules/mob/death.dm | 2 - code/modules/mob/inventory.dm | 4 - code/modules/mob/living/brain/brain.dm | 9 - code/modules/mob/living/brain/life.dm | 1 - code/modules/mob/living/carbon/carbon.dm | 49 +++-- .../mob/living/carbon/carbon_defines.dm | 1 + code/modules/mob/living/carbon/give.dm | 4 +- code/modules/mob/living/carbon/human/human.dm | 5 +- .../living/carbon/human/human_abilities.dm | 2 - .../living/carbon/human/human_attackhand.dm | 5 +- .../mob/living/carbon/human/human_defines.dm | 1 + .../mob/living/carbon/human/human_helpers.dm | 8 - .../mob/living/carbon/human/human_movement.dm | 9 +- code/modules/mob/living/carbon/human/life.dm | 2 - .../carbon/human/life/handle_disabilities.dm | 8 +- .../living/carbon/human/life/handle_organs.dm | 4 +- .../life/handle_regular_status_updates.dm | 5 +- .../carbon/human/life/handle_stasis_bag.dm | 3 + .../living/carbon/human/life/life_helpers.dm | 29 --- .../carbon/human/powers/human_powers.dm | 53 ++++- .../mob/living/carbon/human/species/monkey.dm | 2 +- .../living/carbon/human/species/species.dm | 17 +- .../mob/living/carbon/human/species/zombie.dm | 5 +- .../mob/living/carbon/human/update_icons.dm | 29 +-- .../modules/mob/living/carbon/update_icons.dm | 5 - .../mob/living/carbon/xenomorph/Embryo.dm | 8 +- .../living/carbon/xenomorph/Facehuggers.dm | 8 +- .../mob/living/carbon/xenomorph/XenoProcs.dm | 15 +- .../abilities/ability_helper_procs.dm | 1 - .../abilities/burrower/burrower_powers.dm | 12 +- .../abilities/crusher/crusher_abilities.dm | 6 +- .../abilities/crusher/crusher_powers.dm | 4 +- .../abilities/defender/defender_powers.dm | 2 - .../xenomorph/abilities/general_abilities.dm | 11 +- .../xenomorph/abilities/general_powers.dm | 3 - .../abilities/hivelord/hivelord_abilities.dm | 2 +- .../abilities/lurker/lurker_powers.dm | 2 +- .../abilities/praetorian/praetorian_powers.dm | 19 +- .../abilities/predalien/predalien_powers.dm | 6 - .../abilities/ravager/ravager_powers.dm | 2 - .../carbon/xenomorph/abilities/xeno_action.dm | 2 +- .../living/carbon/xenomorph/attack_alien.dm | 6 +- .../carbon/xenomorph/castes/Burrower.dm | 7 - .../living/carbon/xenomorph/castes/Carrier.dm | 8 +- .../carbon/xenomorph/castes/Facehugger.dm | 14 +- .../living/carbon/xenomorph/castes/Larva.dm | 6 +- .../living/carbon/xenomorph/castes/Lurker.dm | 2 +- .../living/carbon/xenomorph/castes/Queen.dm | 14 +- .../living/carbon/xenomorph/damage_procs.dm | 2 +- .../mob/living/carbon/xenomorph/life.dm | 17 +- .../mutators/strains/crusher/charger.dm | 2 +- .../mutators/strains/drone/gardener.dm | 4 +- .../mutators/strains/drone/healer.dm | 4 +- .../mutators/strains/praetorian/oppressor.dm | 12 +- .../xenomorph/mutators/strains/runner/acid.dm | 2 +- .../living/carbon/xenomorph/update_icons.dm | 36 +++- code/modules/mob/living/init_signals.dm | 78 ++++++- code/modules/mob/living/living.dm | 202 +++++++++++++++++- code/modules/mob/living/living_defines.dm | 32 ++- .../modules/mob/living/living_health_procs.dm | 41 ++-- code/modules/mob/living/living_verbs.dm | 4 +- code/modules/mob/living/silicon/ai/ai.dm | 4 +- .../modules/mob/living/silicon/decoy/decoy.dm | 2 +- code/modules/mob/living/silicon/robot/life.dm | 16 +- .../modules/mob/living/silicon/robot/robot.dm | 4 +- code/modules/mob/living/simple_animal/bat.dm | 1 - .../living/simple_animal/friendly/mouse.dm | 1 - .../mob/living/simple_animal/hostile/alien.dm | 14 +- .../living/simple_animal/hostile/hostile.dm | 2 +- .../mob/living/simple_animal/parrot.dm | 4 +- .../mob/living/simple_animal/simple_animal.dm | 20 +- code/modules/mob/living/simple_animal/slug.dm | 1 - code/modules/mob/mob.dm | 71 +----- code/modules/mob/mob_defines.dm | 3 - code/modules/mob/mob_grab.dm | 10 +- code/modules/mob/mob_helpers.dm | 13 +- code/modules/mob/mob_movement.dm | 25 ++- code/modules/mob/mob_verbs.dm | 5 +- code/modules/mob/new_player/new_player.dm | 2 +- code/modules/mob/transform_procs.dm | 34 +-- code/modules/nano/nanoui.dm | 6 +- code/modules/paperwork/photography.dm | 2 +- code/modules/power/apc.dm | 4 +- code/modules/projectiles/gun.dm | 6 +- code/modules/projectiles/gun_attachables.dm | 2 +- code/modules/projectiles/gun_helpers.dm | 2 +- .../specialist/launcher/rocket_launcher.dm | 4 +- .../projectiles/guns/specialist/sniper.dm | 4 +- code/modules/projectiles/projectile.dm | 8 +- .../chemistry_machinery/acid_harness.dm | 2 +- .../chemistry_properties/prop_neutral.dm | 2 +- .../chemistry_properties/prop_positive.dm | 2 +- .../reagents/chemistry_reagents/drink.dm | 3 +- .../reagents/chemistry_reagents/toxin.dm | 2 + code/modules/recycling/conveyor2.dm | 2 +- code/modules/recycling/disposal.dm | 10 +- code/modules/shuttles/shuttle_console.dm | 2 - code/modules/sorokyne/sorokyne_cold_water.dm | 6 +- code/modules/surgery/surgery_initiator.dm | 4 +- code/modules/surgery/surgery_procedure.dm | 2 +- code/modules/tgui/status_composers.dm | 11 - .../vehicles/interior/interactable/seats.dm | 11 - code/modules/vehicles/train.dm | 6 +- code/modules/vehicles/van/van.dm | 6 +- colonialmarines.dme | 2 + 219 files changed, 1052 insertions(+), 819 deletions(-) create mode 100644 code/__HELPERS/animations.dm create mode 100644 code/__HELPERS/status_effects.dm diff --git a/code/__DEFINES/dcs/signals/atom/mob/living/signals_living.dm b/code/__DEFINES/dcs/signals/atom/mob/living/signals_living.dm index 89a65dad230e..56cd4dd8cd8e 100644 --- a/code/__DEFINES/dcs/signals/atom/mob/living/signals_living.dm +++ b/code/__DEFINES/dcs/signals/atom/mob/living/signals_living.dm @@ -33,3 +33,8 @@ /// From /mob/living/Collide(): (atom/A) #define COMSIG_LIVING_PRE_COLLIDE "living_pre_collide" #define COMPONENT_LIVING_COLLIDE_HANDLED (1<<0) + +///from base of mob/living/set_buckled(): (new_buckled) +#define COMSIG_LIVING_SET_BUCKLED "living_set_buckled" +///from base of mob/living/set_body_position() +#define COMSIG_LIVING_SET_BODY_POSITION "living_set_body_position" diff --git a/code/__DEFINES/dcs/signals/atom/mob/signals_mob.dm b/code/__DEFINES/dcs/signals/atom/mob/signals_mob.dm index 32717a2115f2..f4beec321c9e 100644 --- a/code/__DEFINES/dcs/signals/atom/mob/signals_mob.dm +++ b/code/__DEFINES/dcs/signals/atom/mob/signals_mob.dm @@ -37,10 +37,6 @@ #define COMSIG_MOB_FIRED_GUN_ATTACHMENT "mob_fired_gun_attachment" /// From /mob/proc/death #define COMSIG_MOB_DEATH "mob_death" -/// From /mob/proc/update_canmove() -#define COMSIG_MOB_GETTING_UP "mob_getting_up" -/// From /mob/proc/update_canmove() -#define COMSIG_MOB_KNOCKED_DOWN "mob_knocked_down" /// For when a mob is dragged #define COMSIG_MOB_DRAGGED "mob_dragged" /// From /obj/item/proc/unequipped() @@ -86,8 +82,6 @@ //from /mob/proc/on_deafness_loss() #define COMSIG_MOB_REGAINED_HEARING "mob_regained_hearing" -#define COMSIG_MOB_POST_UPDATE_CANMOVE "mob_can_move" - #define COMSIG_ATTEMPT_MOB_PULL "attempt_mob_pull" #define COMPONENT_CANCEL_MOB_PULL (1<<0) diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index a8b986f8873e..0dcd26de3e3a 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -419,3 +419,31 @@ GLOBAL_LIST_INIT(default_xeno_onmob_icons, list( #define CORE_LIMBS list("chest","head","groin") #define SYMPTOM_ACTIVATION_PROB 3 + +// Body position defines. +/// Mob is standing up, usually associated with lying_angle value of 0. +#define STANDING_UP 0 +/// Mob is lying down, usually associated with lying_angle values of 90 or 270. +#define LYING_DOWN 1 + +/// Possible value of [/atom/movable/buckle_lying]. If set to a different (positive-or-zero) value than this, the buckling thing will force a lying angle on the buckled. +#define NO_BUCKLE_LYING -1 + +// ==================================== +// /mob/living /tg/ mobility_flags +// These represent in what capacity the mob is capable of moving +// Because porting this is underway, NOT ALL FLAGS ARE CURRENTLY IN. + +/// can move +#define MOBILITY_MOVE (1<<0) +/// can, and is, standing up +#define MOBILITY_STAND (1<<1) +/// can rest +#define MOBILITY_REST (1<<7) +/// can lie down +#define MOBILITY_LIEDOWN (1<<8) + +#define MOBILITY_FLAGS_DEFAULT (MOBILITY_MOVE | MOBILITY_STAND) +#define MOBILITY_FLAGS_CARBON_DEFAULT (MOBILITY_MOVE | MOBILITY_STAND | MOBILITY_REST | MOBILITY_LIEDOWN) +#define MOBILITY_FLAGS_REST_CAPABLE_DEFAULT (MOBILITY_MOVE | MOBILITY_STAND | MOBILITY_REST | MOBILITY_LIEDOWN) + diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 7f69a4acc4d6..8962230946c8 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -143,10 +143,18 @@ // #define TRAIT_X "t_x" //-- mob traits -- -/// Prevents voluntary movement. -#define TRAIT_IMMOBILIZED "immobilized" /// Apply this to make a mob not dense, and remove it when you want it to no longer make them undense, other sorces of undesity will still apply. Always define a unique source when adding a new instance of this! #define TRAIT_UNDENSE "undense" +/// Forces the user to stay unconscious. +#define TRAIT_KNOCKEDOUT "knockedout" +/// Prevents voluntary movement. +#define TRAIT_IMMOBILIZED "immobilized" +/// Prevents voluntary standing or staying up on its own. +#define TRAIT_FLOORED "floored" +/// Forces user to stay standing +#define TRAIT_FORCED_STANDING "forcedstanding" +/// Stuns preventing movement and using objects but without further impairement +#define TRAIT_INCAPACITATED "incapacitated" /// Apply this to identify a mob as merged with weeds #define TRAIT_MERGED_WITH_WEEDS "merged_with_weeds" @@ -298,7 +306,10 @@ GLOBAL_LIST_INIT(mob_traits, list( */ GLOBAL_LIST_INIT(traits_by_type, list( /mob = list( + "TRAIT_KNOCKEDOUT" = TRAIT_KNOCKEDOUT, "TRAIT_IMMOBILIZED" = TRAIT_IMMOBILIZED, + "TRAIT_INCAPACITATED" = TRAIT_INCAPACITATED, + "TRAIT_FLOORED" = TRAIT_FLOORED, "TRAIT_UNDENSE" = TRAIT_UNDENSE, "TRAIT_YAUTJA_TECH" = TRAIT_YAUTJA_TECH, "TRAIT_SUPER_STRONG" = TRAIT_SUPER_STRONG, @@ -416,13 +427,39 @@ GLOBAL_LIST(trait_name_map) //Status trait coming from clothing. #define TRAIT_SOURCE_CLOTHING "t_s_clothing" -/// traits associated with actively interacted machinery -#define INTERACTION_TRAIT "interaction" +/// trait associated to being buckled +#define BUCKLED_TRAIT "buckled" // Yes the name doesn't conform. /tg/ appears to have changed naming style inbetween +/// trait source when an effect is coming from a fakedeath effect (refactor this) +#define FAKEDEATH_TRAIT "fakedeath" +/// trait source where a condition comes from body state +#define BODY_TRAIT "body" +/// Trait associated to lying down (having a [lying_angle] of a different value than zero). +#define LYING_DOWN_TRAIT "lying-down" +/// trait associated to a stat value or range of +#define STAT_TRAIT "stat" +/// trait effect related to the queen ovipositor +#define OVIPOSITOR_TRAIT "ovipositor" +/// trait associated to being held in a chokehold +#define CHOKEHOLD_TRAIT "chokehold" /// trait effect related to active specialist gear #define SPECIALIST_GEAR_TRAIT "specialist_gear" /// traits associated with usage of snowflake dropship double seats #define DOUBLE_SEATS_TRAIT "double_seats" /// traits associated with xeno on-ground weeds #define XENO_WEED_TRAIT "xeno_weed" +/// traits associated with actively interacted machinery +#define INTERACTION_TRAIT "interaction" +/// traits bound by stunned status effects +#define STUNNED_TRAIT "stunned" +/// traits bound by knocked_down status effect +#define KNOCKEDDOWN_TRAIT "knockeddown" +/// traits bound by knocked_out status effect +#define KNOCKEDOUT_TRAIT "knockedout" +/// traits from being pounced +#define POUNCED_TRAIT "pounced" +/// traits from step_triggers on the map +#define STEP_TRIGGER_TRAIT "step_trigger" +/// traits from hacked machine interactions +#define HACKED_TRAIT "hacked" /// traits from chloroform usage #define CHLOROFORM_TRAIT "chloroform" diff --git a/code/__HELPERS/animations.dm b/code/__HELPERS/animations.dm new file mode 100644 index 000000000000..f85fb763a4a6 --- /dev/null +++ b/code/__HELPERS/animations.dm @@ -0,0 +1,2 @@ +/// The duration of the animate call in mob/living/update_transform +#define UPDATE_TRANSFORM_ANIMATION_TIME (0.2 SECONDS) diff --git a/code/__HELPERS/status_effects.dm b/code/__HELPERS/status_effects.dm new file mode 100644 index 000000000000..d06cb687f6a5 --- /dev/null +++ b/code/__HELPERS/status_effects.dm @@ -0,0 +1 @@ +#define TRAIT_STATUS_EFFECT(effect_id) "[effect_id]-trait" diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 4bfde929464c..a7af9d7f6324 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1089,7 +1089,7 @@ GLOBAL_DATUM(action_purple_power_up, /image) target_orig_turf = get_turf(target) var/obj/user_holding = busy_user.get_active_hand() var/obj/target_holding - var/cur_user_lying = busy_user.lying + var/cur_user_lying = busy_user.body_position var/cur_target_lying var/expected_total_time = delayfraction*numticks var/time_remaining = expected_total_time @@ -1097,7 +1097,7 @@ GLOBAL_DATUM(action_purple_power_up, /image) if(has_target && istype(T)) cur_target_zone_sel = T.zone_selected target_holding = T.get_active_hand() - cur_target_lying = T.lying + cur_target_lying = T.body_position . = TRUE for(var/i in 1 to numticks) @@ -1121,13 +1121,13 @@ GLOBAL_DATUM(action_purple_power_up, /image) ) . = FALSE break - if(user_flags & INTERRUPT_KNOCKED_DOWN && busy_user.knocked_down || \ - target_is_mob && (target_flags & INTERRUPT_KNOCKED_DOWN && T.knocked_down) + if(user_flags & INTERRUPT_KNOCKED_DOWN && HAS_TRAIT(busy_user, TRAIT_FLOORED) || \ + target_is_mob && (target_flags & INTERRUPT_KNOCKED_DOWN && HAS_TRAIT(T, TRAIT_FLOORED)) ) . = FALSE break - if(user_flags & INTERRUPT_STUNNED && busy_user.stunned || \ - target_is_mob && (target_flags & INTERRUPT_STUNNED && T.stunned) + if(user_flags & INTERRUPT_STUNNED && HAS_TRAIT(busy_user, TRAIT_INCAPACITATED)|| \ + target_is_mob && (target_flags & INTERRUPT_STUNNED && HAS_TRAIT(T, TRAIT_INCAPACITATED)) ) . = FALSE break @@ -1201,8 +1201,8 @@ GLOBAL_DATUM(action_purple_power_up, /image) ) . = FALSE break - if(user_flags & INTERRUPT_CHANGED_LYING && busy_user.lying != cur_user_lying || \ - target_is_mob && (target_flags & INTERRUPT_CHANGED_LYING && T.lying != cur_target_lying) + if(user_flags & INTERRUPT_CHANGED_LYING && busy_user.body_position != cur_user_lying || \ + target_is_mob && (target_flags & INTERRUPT_CHANGED_LYING && T.body_position != cur_target_lying) ) . = FALSE break diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index b85aa18fdb6b..541d1a05362d 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -369,6 +369,13 @@ DEFINE_BITFIELD(mob_flags, list( "NOBIOSCAN" = NOBIOSCAN, )) +DEFINE_BITFIELD(mobility_flags, list( + "MOVE" = MOBILITY_MOVE, + "STAND" = MOBILITY_STAND, + "REST" = MOBILITY_REST, + "LIEDOWN" = MOBILITY_LIEDOWN +)) + DEFINE_BITFIELD(flags, list( "NO_BLOOD" = NO_BLOOD, "NO_BREATHE" = NO_BREATHE, diff --git a/code/_onclick/human.dm b/code/_onclick/human.dm index 8f329656ef6c..b09c26ffb92f 100644 --- a/code/_onclick/human.dm +++ b/code/_onclick/human.dm @@ -64,7 +64,7 @@ /mob/living/carbon/human/UnarmedAttack(atom/A, proximity, click_parameters) - if(lying) //No attacks while laying down + if(body_position == LYING_DOWN) //No attacks while laying down return 0 var/obj/item/clothing/gloves/G = gloves // not typecast specifically enough in defines @@ -88,7 +88,7 @@ /atom/proc/attack_hand(mob/user) return -/mob/living/carbon/human/MouseDrop_T(atom/dropping, mob/user) +/mob/living/carbon/human/MouseDrop_T(atom/dropping, mob/living/user) if(user != src) return . = ..() @@ -153,6 +153,4 @@ target.Move(user.loc, get_dir(target.loc, user.loc)) target.update_transform(TRUE) - target.update_canmove() - diff --git a/code/_onclick/ventcrawl.dm b/code/_onclick/ventcrawl.dm index b079cffe2afe..51afbc139fdd 100644 --- a/code/_onclick/ventcrawl.dm +++ b/code/_onclick/ventcrawl.dm @@ -45,7 +45,7 @@ to_chat(src, SPAN_WARNING("You must be conscious to do this!")) return - if(lying) + if(is_mob_incapacitated()) to_chat(src, SPAN_WARNING("You can't vent crawl while you're stunned!")) return @@ -88,7 +88,7 @@ return updatehealth() - if(stat || stunned || dazed || knocked_down || lying || health < 0 || !client || !ventcrawl_carry()) + if(is_mob_incapacitated(src) || health < 0 || !client || !ventcrawl_carry()) vent_found.animate_ventcrawl_reset() return diff --git a/code/_onclick/xeno.dm b/code/_onclick/xeno.dm index adb637dfe8fa..abb76ded498b 100644 --- a/code/_onclick/xeno.dm +++ b/code/_onclick/xeno.dm @@ -3,7 +3,7 @@ */ /mob/living/carbon/xenomorph/UnarmedAttack(atom/target, proximity, click_parameters, tile_attack = FALSE, ignores_resin = FALSE) - if(lying || HAS_TRAIT(src, TRAIT_ABILITY_BURROWED)) //No attacks while laying down + if(body_position == LYING_DOWN || HAS_TRAIT(src, TRAIT_ABILITY_BURROWED)) //No attacks while laying down return FALSE var/mob/alt @@ -21,7 +21,7 @@ if (!L.is_xeno_grabbable() || L == src) //Xenos never attack themselves. continue - if (L.lying) + if (L.body_position == LYING_DOWN) alt = L continue target = L diff --git a/code/datums/action.dm b/code/datums/action.dm index 47b302e09aac..0510a43415a7 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -187,8 +187,10 @@ I.ui_action_click(owner, holder_item) /datum/action/item_action/can_use_action() - if(ishuman(owner) && !owner.is_mob_incapacitated() && !owner.lying) - return TRUE + if(ishuman(owner) && !owner.is_mob_incapacitated()) + var/mob/living/carbon/human/human = owner + if(human.body_position == STANDING_UP) + return TRUE /datum/action/item_action/update_button_icon() button.overlays.Cut() diff --git a/code/datums/agents/tools/chloroform.dm b/code/datums/agents/tools/chloroform.dm index c6e3320688eb..b1c666ac9ec8 100644 --- a/code/datums/agents/tools/chloroform.dm +++ b/code/datums/agents/tools/chloroform.dm @@ -50,7 +50,6 @@ ADD_TRAIT(M, TRAIT_IMMOBILIZED, CHLOROFORM_TRAIT) ADD_TRAIT(M, TRAIT_UNDENSE, CHLOROFORM_TRAIT) M.able_to_speak = FALSE - M.update_canmove() M.drop_inv_item_on_ground(M.wear_mask, force = TRUE) @@ -79,7 +78,6 @@ /obj/item/weapon/chloroform/proc/remove_stun(mob/living/M) animate(M, pixel_x = 0, pixel_y = 0, time = 0.2 SECONDS, easing = QUAD_EASING) M.anchored = FALSE - M.density = TRUE M.able_to_speak = TRUE M.layer = MOB_LAYER REMOVE_TRAIT(M, TRAIT_IMMOBILIZED, CHLOROFORM_TRAIT) diff --git a/code/datums/ammo/ammo.dm b/code/datums/ammo/ammo.dm index a858c6b1f5a7..9faaf299669d 100644 --- a/code/datums/ammo/ammo.dm +++ b/code/datums/ammo/ammo.dm @@ -138,7 +138,7 @@ /datum/ammo/proc/knockback(mob/living/living_mob, obj/projectile/fired_projectile, max_range = 2) if(!living_mob || living_mob == fired_projectile.firer) return - if(fired_projectile.distance_travelled > max_range || living_mob.lying) + if(fired_projectile.distance_travelled > max_range || living_mob.body_position == LYING_DOWN) return //Two tiles away or more, basically. if(living_mob.mob_size >= MOB_SIZE_BIG) @@ -180,8 +180,8 @@ else living_mob.apply_stamina_damage(fired_projectile.ammo.damage, fired_projectile.def_zone, ARMOR_BULLET) -/datum/ammo/proc/pushback(mob/target_mob, obj/projectile/fired_projectile, max_range = 2) - if(!target_mob || target_mob == fired_projectile.firer || fired_projectile.distance_travelled > max_range || target_mob.lying) +/datum/ammo/proc/pushback(mob/living/target_mob, obj/projectile/fired_projectile, max_range = 2) + if(!target_mob || target_mob == fired_projectile.firer || fired_projectile.distance_travelled > max_range || target_mob.body_position == LYING_DOWN) return if(target_mob.mob_size >= MOB_SIZE_BIG) diff --git a/code/datums/ammo/bullet/shotgun.dm b/code/datums/ammo/bullet/shotgun.dm index 4cedb8b3ee69..77e1e6401472 100644 --- a/code/datums/ammo/bullet/shotgun.dm +++ b/code/datums/ammo/bullet/shotgun.dm @@ -334,7 +334,7 @@ if(P.distance_travelled > 8) knockback(M, P, 12) - else if(!M || M == P.firer || M.lying) //These checks are included in knockback and would be redundant above. + else if(!M || M == P.firer || M.body_position == LYING_DOWN) //These checks are included in knockback and would be redundant above. return shake_camera(M, 3, 4) diff --git a/code/datums/ammo/xeno.dm b/code/datums/ammo/xeno.dm index 75c78298fe4f..9ecc9ebf9321 100644 --- a/code/datums/ammo/xeno.dm +++ b/code/datums/ammo/xeno.dm @@ -49,9 +49,9 @@ if(!isxeno(M)) if(insta_neuro) - if(M.knocked_down < 3) + if(M.GetKnockDownValueNotADurationDoNotUse() < 3) // If they have less than somewhere random between 4 and 6 seconds KD left and assuming it doesnt get refreshed itnernally M.adjust_effect(1 * power, WEAKEN) - return + return if(ishuman(M)) M.apply_effect(2.5, SUPERSLOW) @@ -65,7 +65,7 @@ no_clothes_neuro = TRUE if(no_clothes_neuro) - if(M.knocked_down < 5) + if(M.GetKnockDownValueNotADurationDoNotUse() < 5) // If they have less than somewhere random between 8 and 10 seconds KD left and assuming it doesnt get refreshed itnernally M.adjust_effect(1 * power, WEAKEN) // KD them a bit more M.visible_message(SPAN_DANGER("[M] falls prone.")) @@ -79,7 +79,7 @@ H.visible_message(SPAN_DANGER("[M] shrugs off the neurotoxin!")) return - if(M.knocked_down < 0.7) // apply knockdown only if current knockdown is less than 0.7 second + if(M.GetKnockDownValueNotADurationDoNotUse() < 0.7) // basically (knocked_down && prob(90)) M.apply_effect(0.7, WEAKEN) M.visible_message(SPAN_DANGER("[M] falls prone.")) diff --git a/code/datums/components/footstep.dm b/code/datums/components/footstep.dm index ef77aaf471dc..6eaaa6e76af5 100644 --- a/code/datums/components/footstep.dm +++ b/code/datums/components/footstep.dm @@ -47,7 +47,7 @@ if(!T) return var/mob/living/parent_mob = parent - if(parent_mob.lying && (isfile(drag_sounds) || istext(drag_sounds))) + if(parent_mob.body_position == LYING_DOWN && (isfile(drag_sounds) || istext(drag_sounds))) playsound(T, drag_sounds, volume, rand(20000, 25000), range, falloff = falloff) else if(isfile(footstep_sounds) || istext(footstep_sounds)) playsound(T, footstep_sounds, volume, rand(20000, 25000), range, falloff = falloff) diff --git a/code/datums/diseases/cold.dm b/code/datums/diseases/cold.dm index 46cd8952dda1..fd3fbc3a7d2d 100644 --- a/code/datums/diseases/cold.dm +++ b/code/datums/diseases/cold.dm @@ -20,7 +20,7 @@ cure() return */ - if(affected_mob.lying && prob(40)) //changed FROM prob(10) until sleeping is fixed + if(affected_mob.body_position == LYING_DOWN && prob(40)) //changed FROM prob(10) until sleeping is fixed to_chat(affected_mob, SPAN_NOTICE(" You feel better.")) cure() return @@ -43,7 +43,7 @@ cure() return */ - if(affected_mob.lying && prob(25)) //changed FROM prob(5) until sleeping is fixed + if(affected_mob.body_position == LYING_DOWN && prob(25)) //changed FROM prob(5) until sleeping is fixed to_chat(affected_mob, SPAN_NOTICE(" You feel better.")) cure() return diff --git a/code/datums/diseases/flu.dm b/code/datums/diseases/flu.dm index f2c029587616..fad0b15228b1 100644 --- a/code/datums/diseases/flu.dm +++ b/code/datums/diseases/flu.dm @@ -21,7 +21,7 @@ stage-- return */ - if(affected_mob.lying && prob(20)) //added until sleeping is fixed --Blaank + if(affected_mob.body_position == LYING_DOWN && prob(20)) //added until sleeping is fixed --Blaank to_chat(affected_mob, SPAN_NOTICE(" You feel better.")) stage-- return @@ -46,7 +46,7 @@ stage-- return */ - if(affected_mob.lying && prob(15)) //added until sleeping is fixed + if(affected_mob.body_position == LYING_DOWN && prob(15)) //added until sleeping is fixed to_chat(affected_mob, SPAN_NOTICE(" You feel better.")) stage-- return diff --git a/code/datums/effects/xeno_strains/boiler_trap.dm b/code/datums/effects/xeno_strains/boiler_trap.dm index 1833b9641a9a..199505379b27 100644 --- a/code/datums/effects/xeno_strains/boiler_trap.dm +++ b/code/datums/effects/xeno_strains/boiler_trap.dm @@ -5,16 +5,16 @@ duration = null flags = INF_DURATION -/datum/effects/boiler_trap/New(atom/A, mob/from, last_dmg_source, zone) +/datum/effects/boiler_trap/New(atom/A, mob/living/from, last_dmg_source, zone) . = ..() if(!QDELETED(src)) - var/mob/M = affected_atom - ADD_TRAIT(M, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY(effect_name)) + var/mob/living/affected_living = affected_atom + ADD_TRAIT(affected_living, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY(effect_name)) /datum/effects/boiler_trap/Destroy(force) if(ismob(affected_atom)) - var/mob/M = affected_atom - REMOVE_TRAIT(M, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY(effect_name)) + var/mob/living/affected_living = affected_atom + REMOVE_TRAIT(affected_living, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY(effect_name)) return ..() /datum/effects/boiler_trap/validate_atom(atom/A) @@ -26,6 +26,6 @@ /datum/effects/boiler_trap/process_mob() . = ..() if(!.) return FALSE - var/mob/M = affected_atom - ADD_TRAIT(M, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY(effect_name)) + var/mob/living/affected_living = affected_atom + ADD_TRAIT(affected_living, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY(effect_name)) return TRUE diff --git a/code/datums/elements/mouth_drop_item.dm b/code/datums/elements/mouth_drop_item.dm index 42c61bd275cc..7a546c6b3933 100644 --- a/code/datums/elements/mouth_drop_item.dm +++ b/code/datums/elements/mouth_drop_item.dm @@ -19,9 +19,9 @@ SIGNAL_HANDLER if(slot == WEAR_FACE) - I.RegisterSignal(user, COMSIG_MOB_KNOCKED_DOWN, TYPE_PROC_REF(/obj/item, drop_to_floor)) + I.RegisterSignal(user, COMSIG_LIVING_SET_BODY_POSITION, TYPE_PROC_REF(/obj/item, drop_to_floor)) /datum/element/mouth_drop_item/proc/item_dropped(obj/item/I, mob/living/carbon/human/user) SIGNAL_HANDLER - I.UnregisterSignal(user, COMSIG_MOB_KNOCKED_DOWN) + I.UnregisterSignal(user, COMSIG_LIVING_SET_BODY_POSITION) diff --git a/code/datums/mob_hud.dm b/code/datums/mob_hud.dm index f3864476431b..e4ec3acc1410 100644 --- a/code/datums/mob_hud.dm +++ b/code/datums/mob_hud.dm @@ -803,8 +803,6 @@ GLOBAL_DATUM(hud_icon_hudfocus, /image) if (tag_found) tag_holder.overlays += image('icons/mob/hud/hud.dmi', src, "prae_tag") - // Hacky, but works. Currently effects are hard to make with precise timings - var/freeze_found = HAS_TRAIT(src, TRAIT_IMMOBILIZED) && !buckled && !lying - + var/freeze_found = HAS_TRAIT(src, TRAIT_IMMOBILIZED) && body_position == STANDING_UP && !buckled // Eligible targets are unable to move but can stand and aren't buckled (eg nested) - This is to convey that they are temporarily unable to move if (freeze_found) freeze_holder.overlays += image('icons/mob/hud/hud.dmi', src, "xeno_freeze") diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 17642836ba3f..5f36b3b8b390 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -166,7 +166,7 @@ directive is properly returned. if(!time) transform = complete return - animate(src, transform = complete, time = time, easing = easing) + animate(src, transform = complete, time = time, easing = easing, flags = ANIMATION_PARALLEL) /// Upates the base_transform which will be compounded with other transforms /atom/proc/update_base_transform(matrix/new_transform, time = 0) diff --git a/code/game/gamemodes/colonialmarines/whiskey_outpost.dm b/code/game/gamemodes/colonialmarines/whiskey_outpost.dm index 11e26e195c12..3bc56728a7b9 100644 --- a/code/game/gamemodes/colonialmarines/whiskey_outpost.dm +++ b/code/game/gamemodes/colonialmarines/whiskey_outpost.dm @@ -511,10 +511,10 @@ unacidable = TRUE var/working = 0 -/obj/structure/machinery/wo_recycler/attack_hand(mob/user) +/obj/structure/machinery/wo_recycler/attack_hand(mob/living/user) if(inoperable(MAINT)) return - if(user.lying || user.stat) + if(user.is_mob_incapacitated()) return if(ismaintdrone(usr) || \ istype(usr, /mob/living/carbon/xenomorph)) diff --git a/code/game/gamemodes/colonialmarines/xenovsxeno.dm b/code/game/gamemodes/colonialmarines/xenovsxeno.dm index 32afb2156925..a9ad48196257 100644 --- a/code/game/gamemodes/colonialmarines/xenovsxeno.dm +++ b/code/game/gamemodes/colonialmarines/xenovsxeno.dm @@ -141,7 +141,6 @@ original.statistic_exempt = TRUE original.buckled = start_nest original.setDir(start_nest.dir) - original.update_canmove() start_nest.buckled_mob = original start_nest.afterbuckle(original) diff --git a/code/game/jobs/job/antag/xeno/xenomorph.dm b/code/game/jobs/job/antag/xeno/xenomorph.dm index 53b06147e28c..78b6ab7e3ab2 100644 --- a/code/game/jobs/job/antag/xeno/xenomorph.dm +++ b/code/game/jobs/job/antag/xeno/xenomorph.dm @@ -88,9 +88,8 @@ break human_to_transform.statistic_exempt = TRUE - human_to_transform.buckled = start_nest + human_to_transform.set_buckled(start_nest) human_to_transform.setDir(start_nest.dir) - human_to_transform.update_canmove() start_nest.buckled_mob = human_to_transform start_nest.afterbuckle(human_to_transform) diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index c9092a750f73..03c013703b07 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -19,7 +19,7 @@ active_power_usage = 5 var/strapped = 0 can_buckle = TRUE - buckle_lying = TRUE + buckle_lying = 90 var/buckling_y = -4 surgery_duration_multiplier = SURGERY_SURFACE_MULT_IDEAL //Ideal surface for surgery. var/patient_exam = 0 diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm index b91b865b96a9..08437d35a8e3 100644 --- a/code/game/machinery/bots/mulebot.dm +++ b/code/game/machinery/bots/mulebot.dm @@ -763,7 +763,6 @@ M.stop_pulling() M.apply_effect(8, STUN) M.apply_effect(5, WEAKEN) - M.lying = 1 ..() /obj/structure/machinery/bot/mulebot/alter_health() diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index 67e4e8ed35ab..3a809620d7e6 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -68,7 +68,6 @@ src.occupant.updatehealth() if (src.occupant.health >= 0 && src.occupant.stat == DEAD) src.occupant.set_stat(CONSCIOUS) - src.occupant.lying = 0 GLOB.dead_mob_list -= src.occupant GLOB.alive_mob_list += src.occupant occupant.reload_fullscreens() diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index d28825939d86..20aa6925d0b4 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -24,7 +24,7 @@ set name = "Eject ID Card" set src in oview(1) - if(!usr || usr.stat || usr.lying) return + if(!usr || usr.is_mob_incapacitated()) return if(scan) to_chat(usr, "You remove \the [scan] from \the [src].") diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index c5a13e2c3e74..19e3ac900af6 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -51,11 +51,11 @@ dat += "[R.name] |" if(R.stat) dat += " Not Responding |" - else if (!R.canmove) + else if (HAS_TRAIT_FROM(R, TRAIT_IMMOBILIZED, HACKED_TRAIT)) dat += " Locked Down |" else dat += " Operating Normally |" - if(R.canmove && R.cell) + if(R.cell) dat += " Battery Installed ([R.cell.charge]/[R.cell.maxcharge]) |" else dat += " No Cell Installed |" @@ -70,7 +70,8 @@ if (isRemoteControlling(user)) if((user.mind.original == user)) dat += "(Hack) " - dat += "([R.canmove ? "Lockdown" : "Release"]) " + var/canmove = HAS_TRAIT_FROM(src, TRAIT_IMMOBILIZED, HACKED_TRAIT) + dat += "([canmove ? "Lockdown" : "Release"]) " dat += "(Destroy)" dat += "
" dat += "(Return to Main Menu)
" @@ -161,20 +162,22 @@ else if (href_list["stopbot"]) if(src.allowed(usr)) var/mob/living/silicon/robot/R = locate(href_list["stopbot"]) + var/canmove = HAS_TRAIT_FROM(src, TRAIT_IMMOBILIZED, HACKED_TRAIT) if(R && istype(R)) // Extra sancheck because of input var references - var/choice = tgui_input_list(usr, "Are you certain you wish to [R.canmove ? "lock down" : "release"] [R.name]?", "Hack machine", list("Confirm", "Abort")) + var/choice = tgui_input_list(usr, "Are you certain you wish to [canmove ? "lock down" : "release"] [R.name]?", "Hack machine", list("Confirm", "Abort")) if(choice == "Confirm") if(R && istype(R)) - message_admins("[key_name_admin(usr)] [R.canmove ? "locked down" : "released"] [R.name]!") - log_game("[key_name(usr)] [R.canmove ? "locked down" : "released"] [R.name]!") - R.canmove = !R.canmove + message_admins("[key_name_admin(usr)] [canmove ? "locked down" : "released"] [R.name]!") + log_game("[key_name(usr)] [canmove ? "locked down" : "released"] [R.name]!") + if(canmove) + ADD_TRAIT(src, TRAIT_IMMOBILIZED, HACKED_TRAIT) + else + REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, HACKED_TRAIT) if (R.lockcharge) - // R.cell.charge = R.lockcharge R.lockcharge = !R.lockcharge to_chat(R, "Your lockdown has been lifted!") else R.lockcharge = !R.lockcharge - // R.cell.charge = 0 to_chat(R, "You have been locked down!") else diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 80306ab483b1..4e362ef12fac 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -91,7 +91,7 @@ GLOBAL_LIST_INIT(airlock_wire_descriptions, list( else if(user.hallucination > 50 && prob(10) && operating == 0) to_chat(user, SPAN_DANGER("You feel a powerful shock course through your body!")) user.halloss += 10 - user.stunned += 10 + user.apply_effect(10, STUN) return ..(user) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index efb4a7d05c9d..cddd67c7e2b2 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -132,7 +132,7 @@ "Would you like to [density ? "open" : "close"] this [src.name]?[ alarmed && density ? "\nNote that by doing so, you acknowledge any damages from opening this\n[src.name] as being your own fault, and you will be held accountable under the law." : ""]",\ "\The [src]", list("Yes", "No")) != "Yes") return - if(user.is_mob_incapacitated() || (!user.canmove && !isRemoteControlling(user)) || (get_dist(src, user) > 1 && !isRemoteControlling(user))) + if(user.is_mob_incapacitated() || (get_dist(src, user) > 1 && !isRemoteControlling(user))) to_chat(user, "Sorry, you must remain able bodied and close to \the [src] in order to use it.") return if(density && (inoperable())) //can still close without power diff --git a/code/game/machinery/fax_machine.dm b/code/game/machinery/fax_machine.dm index db9a1dbbf76e..4a5c62b1f9a0 100644 --- a/code/game/machinery/fax_machine.dm +++ b/code/game/machinery/fax_machine.dm @@ -110,7 +110,8 @@ GLOBAL_LIST_EMPTY(alldepartments) set category = "Object" set name = "Eject ID Card" set src in view(1) - if(!usr || usr.stat || usr.lying) return + if(usr.is_mob_incapacitated()) + return if(ishuman(usr) && scan) to_chat(usr, "You remove \the [scan] from \the [src].") diff --git a/code/game/machinery/floodlight.dm b/code/game/machinery/floodlight.dm index 516cdad380b1..580fea644eec 100644 --- a/code/game/machinery/floodlight.dm +++ b/code/game/machinery/floodlight.dm @@ -36,12 +36,12 @@ update_icon() -/obj/structure/machinery/floodlight/attack_hand(mob/user) +/obj/structure/machinery/floodlight/attack_hand(mob/living/user) if(!toggleable) to_chat(user, SPAN_NOTICE("[src] doesn't seem to have a switch to toggle the light.")) return - if(user.lying || user.stat) + if(user.is_mob_incapacitated()) return if(!is_valid_user(user)) diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index ef6c74a052cd..4b863bec043d 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -57,7 +57,7 @@ if(ishuman(usr)) var/mob/living/carbon/human/user = usr - if(user.stat || get_dist(user, src) > 1 || user.blinded || user.lying) + if(user.is_mob_incapacitated() || get_dist(user, src) > 1 || user.blinded) return if(!skillcheck(user, SKILL_SURGERY, SKILL_SURGERY_NOVICE)) @@ -179,7 +179,7 @@ if(!istype(usr, /mob/living)) return - if(usr.stat || usr.lying) + if(usr.stat || usr.is_mob_incapacitated()) return mode = !mode diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 93c7327c8045..c5eaa14e05b5 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -229,7 +229,11 @@ Class Procs: return TRUE if(inoperable()) return 1 - if(usr.is_mob_restrained() || usr.lying || usr.stat) + if(isliving(usr)) + var/mob/living/living = usr + if(living.body_position == LYING_DOWN) // legacy. if you too find it doesn't make sense, consider removing it + return TRUE + if(usr.is_mob_restrained()) return 1 if(!is_valid_user(usr)) to_chat(usr, SPAN_DANGER("You don't have the dexterity to do this!")) @@ -251,10 +255,10 @@ Class Procs: else return src.attack_hand(user) -/obj/structure/machinery/attack_hand(mob/user as mob) +/obj/structure/machinery/attack_hand(mob/living/user as mob) if(inoperable(MAINT)) return TRUE - if(user.lying || user.stat) + if(user.is_mob_incapacitated()) return TRUE if(!is_valid_user(user)) to_chat(usr, SPAN_DANGER("You don't have the dexterity to do this!")) diff --git a/code/game/machinery/medical_pod/bodyscanner.dm b/code/game/machinery/medical_pod/bodyscanner.dm index fdcd0ceb62e6..bbc3be7d5aae 100644 --- a/code/game/machinery/medical_pod/bodyscanner.dm +++ b/code/game/machinery/medical_pod/bodyscanner.dm @@ -204,7 +204,7 @@ "toxloss" = H.getToxLoss(), "cloneloss" = H.getCloneLoss(), "brainloss" = H.getBrainLoss(), - "knocked_out" = H.knocked_out, + "knocked_out" = H.GetKnockOutValueNotADurationDoNotUse(), "bodytemp" = H.bodytemperature, "inaprovaline_amount" = H.reagents.get_reagent_amount("inaprovaline"), "dexalin_amount" = H.reagents.get_reagent_amount("dexalin"), @@ -263,7 +263,7 @@ s_class = occ["brainloss"] < 1 ? INTERFACE_GOOD : INTERFACE_BAD dat += "[SET_CLASS("  Approx. Brain Damage:", INTERFACE_PINK)] [SET_CLASS("[occ["brainloss"]]%", s_class)]

" - dat += "[SET_CLASS("Knocked Out Summary:", "#40628a")] [occ["knocked_out"]]% ([round(occ["knocked_out"] / 4)] seconds left!)
" + dat += "[SET_CLASS("Knocked Out Summary:", "#40628a")] [occ["knocked_out"]]% (approximately [round(occ["knocked_out"] / 5)] seconds left!)
" dat += "[SET_CLASS("Body Temperature:", "#40628a")] [occ["bodytemp"]-T0C]°C ([occ["bodytemp"]*1.8-459.67]°F)

" s_class = occ["blood_amount"] > 448 ? INTERFACE_OKAY : INTERFACE_BAD diff --git a/code/game/machinery/medical_pod/medical_pod.dm b/code/game/machinery/medical_pod/medical_pod.dm index b284d71ad4a7..62c8eef1f72c 100644 --- a/code/game/machinery/medical_pod/medical_pod.dm +++ b/code/game/machinery/medical_pod/medical_pod.dm @@ -155,7 +155,6 @@ if(exit_stun) occupant.apply_effect(exit_stun, STUN) //Action delay when going out - occupant.update_canmove() //Force the delay to go in action immediately occupant.visible_message(SPAN_WARNING("[occupant] pops out of \the [src]!"), SPAN_WARNING("You get out of \the [src] and get your bearings!")) diff --git a/code/game/machinery/medical_pod/sleeper.dm b/code/game/machinery/medical_pod/sleeper.dm index afd7c43979f0..fe2b698caed0 100644 --- a/code/game/machinery/medical_pod/sleeper.dm +++ b/code/game/machinery/medical_pod/sleeper.dm @@ -390,8 +390,8 @@ to_chat(user, "[]\t -Respiratory Damage %: []", (occupant.getOxyLoss() < 60 ? SPAN_NOTICE("") : SPAN_DANGER("")), occupant.getOxyLoss()) to_chat(user, "[]\t -Toxin Content %: []", (occupant.getToxLoss() < 60 ? SPAN_NOTICE("") : SPAN_DANGER("")), occupant.getToxLoss()) to_chat(user, "[]\t -Burn Severity %: []", (occupant.getFireLoss() < 60 ? SPAN_NOTICE("") : SPAN_DANGER("")), occupant.getFireLoss()) - to_chat(user, SPAN_NOTICE(" Expected time till occupant can safely awake: (note: If health is below 20% these times are inaccurate)")) - to_chat(user, SPAN_NOTICE(" \t [occupant.knocked_out / 5] second\s (if around 1 or 2 the sleeper is keeping them asleep.)")) + to_chat(user, SPAN_NOTICE(" Expected time till occupant can safely awake: (note: These times are always inaccurate)")) + to_chat(user, SPAN_NOTICE(" \t [occupant.GetKnockOutValueNotADurationDoNotUse() / 5] second\s (if around 1 or 2 the sleeper is keeping them asleep.)")) else to_chat(user, SPAN_NOTICE(" There is no one inside!")) return diff --git a/code/game/machinery/nuclearbomb.dm b/code/game/machinery/nuclearbomb.dm index 306f9c8bbcbe..369953788ae1 100644 --- a/code/game/machinery/nuclearbomb.dm +++ b/code/game/machinery/nuclearbomb.dm @@ -98,7 +98,7 @@ GLOBAL_VAR_INIT(bomb_set, FALSE) ..() /obj/structure/machinery/nuclearbomb/attack_hand(mob/user as mob) - if(user.is_mob_incapacitated() || !user.canmove || get_dist(src, user) > 1 || isRemoteControlling(user)) + if(user.is_mob_incapacitated() || get_dist(src, user) > 1 || isRemoteControlling(user)) return if(isyautja(user)) @@ -290,7 +290,7 @@ GLOBAL_VAR_INIT(bomb_set, FALSE) set name = "Make Deployable" set src in oview(1) - if(!usr.canmove || usr.stat || usr.is_mob_restrained() || being_used || timing) + if(usr.is_mob_incapacitated() || being_used || timing) return if(!ishuman(usr)) diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index fc8815b0511f..e007ada79a0e 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -75,7 +75,7 @@ /obj/structure/machinery/pipedispenser/Topic(href, href_list) if(..()) return - if(unwrenched || !usr.canmove || usr.stat || usr.is_mob_restrained() || !in_range(loc, usr)) + if(unwrenched || usr.is_mob_incapacitated() || !in_range(loc, usr)) close_browser(usr, "pipedispenser") return usr.set_interaction(src) @@ -150,7 +150,7 @@ Nah //Allow you to drag-drop disposal pipes into it /obj/structure/machinery/pipedispenser/disposal/MouseDrop_T(obj/structure/disposalconstruct/pipe as obj, mob/usr as mob) - if(!usr.canmove || usr.stat || usr.is_mob_restrained()) + if(usr.is_mob_incapacitated()) return if (!istype(pipe) || get_dist(usr, src) > 1 || get_dist(src,pipe) > 1 ) @@ -192,7 +192,7 @@ Nah usr.set_interaction(src) src.add_fingerprint(usr) if(href_list["dmake"]) - if(unwrenched || !usr.canmove || usr.stat || usr.is_mob_restrained() || !in_range(loc, usr)) + if(unwrenched || usr.is_mob_incapacitated() || !in_range(loc, usr)) close_browser(usr, "pipedispenser") return if(!wait) diff --git a/code/game/machinery/vending/cm_vending.dm b/code/game/machinery/vending/cm_vending.dm index b1d5fc9bb706..6205f24c8e05 100644 --- a/code/game/machinery/vending/cm_vending.dm +++ b/code/game/machinery/vending/cm_vending.dm @@ -899,7 +899,7 @@ GLOBAL_LIST_EMPTY(vending_products) if(inoperable()) return - if(user.stat || user.is_mob_restrained() || user.lying) + if(user.stat || user.is_mob_restrained()) return if(get_dist(user, src) > 1 || get_dist(src, A) > 1) diff --git a/code/game/machinery/vending/vending.dm b/code/game/machinery/vending/vending.dm index da1673cad06f..b6c4da03640c 100644 --- a/code/game/machinery/vending/vending.dm +++ b/code/game/machinery/vending/vending.dm @@ -820,7 +820,7 @@ GLOBAL_LIST_EMPTY_TYPED(total_vending_machines, /obj/structure/machinery/vending if(inoperable()) return - if(user.stat || user.is_mob_restrained() || user.lying) + if(user.stat || user.is_mob_restrained()) return if(get_dist(user, src) > 1 || get_dist(src, A) > 1) diff --git a/code/game/objects/effects/acid_hole.dm b/code/game/objects/effects/acid_hole.dm index 415df0e7e5a7..a4db9ef5c0e0 100644 --- a/code/game/objects/effects/acid_hole.dm +++ b/code/game/objects/effects/acid_hole.dm @@ -50,18 +50,18 @@ return XENO_NO_DELAY_ACTION /obj/effect/acid_hole/proc/expand_hole(mob/living/carbon/xenomorph/user) - if(user.action_busy || user.lying) + if(user.action_busy || user.is_mob_incapacitated()) return playsound(src, "pry", 25, 1) xeno_attack_delay(user) - if(do_after(user, 60, INTERRUPT_ALL, BUSY_ICON_GENERIC) && !QDELETED(src) && holed_wall && !user.lying && istype(holed_wall)) + if(do_after(user, 60, INTERRUPT_ALL, BUSY_ICON_GENERIC) && !QDELETED(src) && holed_wall && istype(holed_wall)) holed_wall.take_damage(rand(2000,3500)) user.emote("roar") -/obj/effect/acid_hole/proc/use_wall_hole(mob/user) +/obj/effect/acid_hole/proc/use_wall_hole(mob/living/user) - if(user.mob_size >= MOB_SIZE_BIG || user.is_mob_incapacitated() || user.lying || user.buckled || user.anchored) + if(user.mob_size >= MOB_SIZE_BIG || user.is_mob_incapacitated() || user.buckled || user.anchored) return FALSE var/mob_dir = get_dir(user, src) @@ -95,7 +95,7 @@ to_chat(user, SPAN_NOTICE("You start crawling through the hole.")) if(do_after(user, 15, INTERRUPT_NO_NEEDHAND, BUSY_ICON_GENERIC)) - if(!user.is_mob_incapacitated() && !user.lying && !user.buckled) + if(!user.is_mob_incapacitated() && !user.buckled) if (T.density) return for(var/obj/O in T) diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm index 867c6924b39d..0b44c0bb4443 100644 --- a/code/game/objects/effects/aliens.dm +++ b/code/game/objects/effects/aliens.dm @@ -160,7 +160,7 @@ //damages human that comes in contact /obj/effect/xenomorph/spray/proc/apply_spray(mob/living/carbon/H, should_stun = TRUE) - if(!H.lying) + if(H.body_position == STANDING_UP) to_chat(H, SPAN_DANGER("Your feet scald and burn! Argh!")) if(ishuman(H)) H.emote("pain") @@ -264,7 +264,7 @@ else PAS.increment_stack_count(2) - if(!H.lying) + if(H.body_position == STANDING_UP) to_chat(H, SPAN_DANGER("Your feet scald and burn! Argh!")) H.emote("pain") H.last_damage_data = cause_data diff --git a/code/game/objects/effects/step_triggers.dm b/code/game/objects/effects/step_triggers.dm index 2499810cbd3f..ab3c248c797f 100644 --- a/code/game/objects/effects/step_triggers.dm +++ b/code/game/objects/effects/step_triggers.dm @@ -50,7 +50,7 @@ if(ismob(AM)) var/mob/M = AM if(immobilize) - M.canmove = 0 + ADD_TRAIT(M, TRAIT_IMMOBILIZED, STEP_TRIGGER_TRAIT) affecting.Add(AM) while(AM && !stopthrow) @@ -87,7 +87,7 @@ if(ismob(AM)) var/mob/M = AM if(immobilize) - M.canmove = 1 + REMOVE_TRAIT(M, TRAIT_IMMOBILIZED, STEP_TRIGGER_TRAIT) /* Stops things thrown by a thrower, doesn't do anything */ diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index f27a35457a7c..11da4cce6d98 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -517,14 +517,14 @@ cases. Override_icon_state should be a list.*/ if(WEAR_L_HAND) if(human.l_hand) return FALSE - if(human.lying) + if(human.body_position == LYING_DOWN) to_chat(human, SPAN_WARNING("You can't equip that while lying down.")) return return TRUE if(WEAR_R_HAND) if(human.r_hand) return FALSE - if(human.lying) + if(human.body_position == LYING_DOWN) to_chat(human, SPAN_WARNING("You can't equip that while lying down.")) return return TRUE @@ -920,9 +920,10 @@ cases. Override_icon_state should be a list.*/ mob_state += GLOB.slot_to_contained_sprite_shorthand[slot] return mob_state -/obj/item/proc/drop_to_floor(mob/wearer) +/obj/item/proc/drop_to_floor(mob/wearer, body_position) SIGNAL_HANDLER - wearer.drop_inv_item_on_ground(src) + if(body_position == LYING_DOWN) + wearer.drop_inv_item_on_ground(src) // item animatzionen diff --git a/code/game/objects/items/devices/autopsy_scanner.dm b/code/game/objects/items/devices/autopsy_scanner.dm index 67d18924c02b..6703ead88147 100644 --- a/code/game/objects/items/devices/autopsy_scanner.dm +++ b/code/game/objects/items/devices/autopsy_scanner.dm @@ -174,7 +174,7 @@ M.update_inv_r_hand() /obj/item/device/autopsy_scanner/attack(mob/living/carbon/human/M as mob, mob/living/carbon/user as mob) - if(!istype(M) || !M.lying) + if(!istype(M) || !M.is_mob_incapacitated()) return var/table diff --git a/code/game/objects/items/devices/binoculars.dm b/code/game/objects/items/devices/binoculars.dm index f94d62c47de8..a9b7706bcfb7 100644 --- a/code/game/objects/items/devices/binoculars.dm +++ b/code/game/objects/items/devices/binoculars.dm @@ -422,7 +422,7 @@ if(!(GLOB.character_traits[/datum/character_trait/skills/spotter] in human.traits)) to_chat(human, SPAN_WARNING("You have no idea how to use this!")) return FALSE - if(istype(human) && !human.is_mob_incapacitated() && !human.lying && (holder_item == human.r_hand || holder_item || human.l_hand)) + if(istype(human) && !human.is_mob_incapacitated() && (holder_item == human.r_hand || holder_item || human.l_hand)) return TRUE /datum/action/item_action/specialist/spotter_target/proc/use_ability(atom/targeted_atom) diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm index 0b8cbc303c06..bc97cf04fdfb 100644 --- a/code/game/objects/items/devices/radio/beacon.dm +++ b/code/game/objects/items/devices/radio/beacon.dm @@ -27,7 +27,7 @@ set category = "Object" set src in usr - if ((usr.canmove && !( usr.is_mob_restrained() ))) + if (usr.is_mob_incapacitated()) src.code = t if (!( src.code )) src.code = "beacon" diff --git a/code/game/objects/items/explosives/grenades/flashbang.dm b/code/game/objects/items/explosives/grenades/flashbang.dm index 365dfe26df89..50cb34668ae3 100644 --- a/code/game/objects/items/explosives/grenades/flashbang.dm +++ b/code/game/objects/items/explosives/grenades/flashbang.dm @@ -256,6 +256,7 @@ //decide how banged mob is var/bang_effect = 0 + var/lying = H.body_position == LYING_DOWN //flashbang effect depends on eye protection only, so we will process this case first //A bit dumb, but headsets don't have ear protection and even earmuffs are a fluff now @@ -264,7 +265,7 @@ if((get_dist(H, T) <= 1 || src.loc == H.loc || src.loc == H)) H.apply_damage(5, BRUTE) H.apply_damage(5, BURN) - if(H.lying) + if(lying) bang_effect = 1 else bang_effect = 2 @@ -277,13 +278,13 @@ H.apply_damage(5, BRUTE) H.apply_damage(5, BURN) - if(H.lying) + if(lying) bang_effect = 4 else bang_effect = 5 else if(get_dist(H, T) <= 5) - if(H.lying) + if(lying) bang_effect = 3 else bang_effect = 4 diff --git a/code/game/objects/items/hoverpack.dm b/code/game/objects/items/hoverpack.dm index c2bfacd3c3ad..027b9d77f581 100644 --- a/code/game/objects/items/hoverpack.dm +++ b/code/game/objects/items/hoverpack.dm @@ -184,7 +184,7 @@ warning.forceMove(path[max_distance]) /obj/item/hoverpack/proc/can_use_hoverpack(mob/living/carbon/human/user) - if(user.is_mob_incapacitated() || user.lying) + if(user.is_mob_incapacitated()) to_chat(user, SPAN_WARNING("You're a bit too incapacitated for that.")) return FALSE @@ -204,7 +204,7 @@ /datum/action/item_action/hover/can_use_action() var/mob/living/carbon/human/H = owner - if(!H.is_mob_incapacitated() && !H.lying && holder_item == H.back) + if(!H.is_mob_incapacitated() && holder_item == H.back) return TRUE /datum/action/item_action/hover/action_activate() diff --git a/code/game/objects/items/implants/implantneurostim.dm b/code/game/objects/items/implants/implantneurostim.dm index 544cf70147e2..21ee2542649b 100644 --- a/code/game/objects/items/implants/implantneurostim.dm +++ b/code/game/objects/items/implants/implantneurostim.dm @@ -63,7 +63,7 @@ var/mob_pain_msg = "Excruciating pain shoots through [part ? "your [part.display_name]" : "you"]!" M.visible_message(SPAN_DANGER("[M] convulses in pain!"), SPAN_DANGER(mob_pain_msg)) M.flash_eyes(1, TRUE) - M.stunned += 10 + M.apply_effect(10, STUN) M.apply_effect(10, WEAKEN) M.apply_damage(100, HALLOSS, part) M.apply_damage(5, BURN, part, 0, 0, src) diff --git a/code/game/objects/items/reagent_containers/blood_pack.dm b/code/game/objects/items/reagent_containers/blood_pack.dm index 0879dcffdc68..92c68e81c9d2 100644 --- a/code/game/objects/items/reagent_containers/blood_pack.dm +++ b/code/game/objects/items/reagent_containers/blood_pack.dm @@ -163,7 +163,7 @@ if(!istype(usr, /mob/living)) return - if(usr.stat || usr.lying) + if(usr.stat || usr.is_mob_incapacitated()) return mode = !mode diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index c8516dd59b2b..5b77b9149a53 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -842,7 +842,7 @@ GLOBAL_LIST_EMPTY_TYPED(radio_packs, /obj/item/storage/backpack/marine/satchel/r /datum/action/item_action/specialist/toggle_cloak/can_use_action() var/mob/living/carbon/human/H = owner - if(istype(H) && !H.is_mob_incapacitated() && !H.lying && holder_item == H.back) + if(istype(H) && !H.is_mob_incapacitated() && holder_item == H.back) return TRUE /datum/action/item_action/specialist/toggle_cloak/action_activate() diff --git a/code/game/objects/items/storage/internal.dm b/code/game/objects/items/storage/internal.dm index 68bdda8d7e7b..a491df12f086 100644 --- a/code/game/objects/items/storage/internal.dm +++ b/code/game/objects/items/storage/internal.dm @@ -25,10 +25,10 @@ //Items that use internal storage have the option of calling this to emulate default storage MouseDrop behaviour. //Returns 1 if the master item's parent's MouseDrop() should be called, 0 otherwise. It's strange, but no other way of //Doing it without the ability to call another proc's parent, really. -/obj/item/storage/internal/proc/handle_mousedrop(mob/user as mob, obj/over_object as obj) +/obj/item/storage/internal/proc/handle_mousedrop(mob/living/carbon/human/user, obj/over_object as obj) if(ishuman(user)) - if(user.lying) //Can't use your inventory when lying + if(user.body_position == LYING_DOWN) //Can't use your inventory when lying //what about stuns? don't argue return if(QDELETED(master_object)) @@ -84,8 +84,8 @@ //Items that use internal storage have the option of calling this to emulate default storage attack_hand behaviour. //Returns 1 if the master item's parent's attack_hand() should be called, 0 otherwise. //It's strange, but no other way of doing it without the ability to call another proc's parent, really. -/obj/item/storage/internal/proc/handle_attack_hand(mob/user as mob, mods) - if(user.lying) +/obj/item/storage/internal/proc/handle_attack_hand(mob/living/user as mob, mods) + if(user.body_position == LYING_DOWN) // what about stuns? huh? return FALSE if(ishuman(user)) diff --git a/code/game/objects/items/storage/large_holster.dm b/code/game/objects/items/storage/large_holster.dm index 27026165fc31..76f98c423974 100644 --- a/code/game/objects/items/storage/large_holster.dm +++ b/code/game/objects/items/storage/large_holster.dm @@ -367,7 +367,7 @@ /datum/action/item_action/specialist/toggle_fuel/can_use_action() var/mob/living/carbon/human/H = owner - if(istype(H) && !H.is_mob_incapacitated() && !H.lying && holder_item == H.back) + if(istype(H) && !H.is_mob_incapacitated() && H.body_position == STANDING_UP && holder_item == H.back) return TRUE /datum/action/item_action/specialist/toggle_fuel/action_activate() diff --git a/code/game/objects/items/storage/smartpack.dm b/code/game/objects/items/storage/smartpack.dm index 0b0fd05eac17..d012e773617b 100644 --- a/code/game/objects/items/storage/smartpack.dm +++ b/code/game/objects/items/storage/smartpack.dm @@ -223,7 +223,7 @@ user.remove_filter("synth_protective_form") -/obj/item/storage/backpack/marine/smartpack/proc/immobile_form(mob/user) +/obj/item/storage/backpack/marine/smartpack/proc/immobile_form(mob/living/user) if(activated_form) return diff --git a/code/game/objects/items/tools/experimental_tools.dm b/code/game/objects/items/tools/experimental_tools.dm index d27272881e1e..221aa279a53b 100644 --- a/code/game/objects/items/tools/experimental_tools.dm +++ b/code/game/objects/items/tools/experimental_tools.dm @@ -279,7 +279,7 @@ return if(ishuman(user)) - if(user.stat || user.blinded || user.lying) + if(user.stat || user.blinded || user.body_position == LYING_DOWN) return if(attaching) diff --git a/code/game/objects/items/toys/toy_weapons.dm b/code/game/objects/items/toys/toy_weapons.dm index ed66be43dbc7..ce32cfdb67a9 100644 --- a/code/game/objects/items/toys/toy_weapons.dm +++ b/code/game/objects/items/toys/toy_weapons.dm @@ -156,10 +156,10 @@ O.show_message(SPAN_DANGER("[user] realized they were out of ammo and starting scrounging for some!"), SHOW_MESSAGE_VISIBLE) -/obj/item/toy/crossbow/attack(mob/M as mob, mob/user as mob) +/obj/item/toy/crossbow/attack(mob/living/M as mob, mob/user as mob) src.add_fingerprint(user) - if (src.bullets > 0 && M.lying) + if (src.bullets > 0 && M.body_position == LYING_DOWN) for(var/mob/O in viewers(M, null)) if(O.client) @@ -169,7 +169,7 @@ playsound(user.loc, 'sound/items/syringeproj.ogg', 15, 1) new /obj/item/toy/crossbow_ammo(M.loc) src.bullets-- - else if (M.lying && src.bullets == 0) + else if (M.body_position == LYING_DOWN && src.bullets == 0) for(var/mob/O in viewers(M, null)) if (O.client) O.show_message(SPAN_DANGER("[user] casually lines up a shot with [M]'s head, pulls the trigger, then realizes they are out of ammo and drops to the floor in search of some!"), SHOW_MESSAGE_VISIBLE, SPAN_DANGER("You hear someone fall"), SHOW_MESSAGE_AUDIBLE) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index db90ea1728dd..9d730c71970b 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -14,7 +14,8 @@ /// If we have a user using us, this will be set on. We will check if the user has stopped using us, and thus stop updating and LAGGING EVERYTHING! var/in_use = FALSE var/mob/living/buckled_mob - var/buckle_lying = FALSE //Is the mob buckled in a lying position + /// Bed-like behaviour, forces mob.lying = buckle_lying if not set to [NO_BUCKLE_LYING]. + var/buckle_lying = NO_BUCKLE_LYING var/can_buckle = FALSE /**Applied to surgery times for mobs buckled prone to it or lying on the same tile, if the surgery cares about surface conditions. The lowest multiplier of objects on the tile is used.**/ @@ -224,7 +225,7 @@ else . = ..() /obj/proc/afterbuckle(mob/M as mob) // Called after somebody buckled / unbuckled - handle_rotation() + handle_rotation() // To be removed when we have full dir support in set_buckled SEND_SIGNAL(src, COSMIG_OBJ_AFTER_BUCKLE, buckled_mob) if(!buckled_mob) UnregisterSignal(M, COMSIG_PARENT_QDELETING) @@ -235,9 +236,8 @@ /obj/proc/unbuckle() SIGNAL_HANDLER if(buckled_mob && buckled_mob.buckled == src) - buckled_mob.buckled = null + buckled_mob.set_buckled(null) buckled_mob.anchored = initial(buckled_mob.anchored) - buckled_mob.update_canmove() var/M = buckled_mob REMOVE_TRAITS_IN(buckled_mob, TRAIT_SOURCE_BUCKLE) @@ -268,7 +268,7 @@ //trying to buckle a mob /obj/proc/buckle_mob(mob/M, mob/user) - if (!ismob(M) || (get_dist(src, user) > 1) || user.is_mob_restrained() || user.lying || user.stat || buckled_mob || M.buckled || !isturf(user.loc)) + if (!ismob(M) || (get_dist(src, user) > 1) || user.is_mob_restrained() || user.stat || buckled_mob || M.buckled || !isturf(user.loc)) return if (isxeno(user)) @@ -299,20 +299,15 @@ // the actual buckling proc // Yes I know this is not style but its unreadable otherwise -/obj/proc/do_buckle(mob/target, mob/user) +/obj/proc/do_buckle(mob/living/target, mob/user) send_buckling_message(target, user) if (src && src.loc) - target.buckled = src + target.set_buckled(src) target.forceMove(src.loc) target.setDir(dir) - target.update_canmove() src.buckled_mob = target src.add_fingerprint(user) afterbuckle(target) - if(buckle_lying) // Make sure buckling to beds/nests etc only turns, and doesn't give a random offset - var/matrix/new_matrix = matrix() - new_matrix.Turn(90) - target.apply_transform(new_matrix) return TRUE /obj/proc/send_buckling_message(mob/M, mob/user) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 9b0b8cf30aae..95998d5de79a 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -150,7 +150,8 @@ for(var/mob/living/M in get_turf(src)) - if(M.lying) return //No spamming this on people. + if(HAS_TRAIT(M, TRAIT_FLOORED)) + return //No spamming this on people. M.apply_effect(5, WEAKEN) to_chat(M, SPAN_WARNING("You topple as \the [src] moves under you!")) @@ -191,7 +192,7 @@ H.updatehealth() return -/obj/structure/proc/can_touch(mob/user) +/obj/structure/proc/can_touch(mob/living/user) if(!user) return 0 if(!Adjacent(user) || !isturf(user.loc)) @@ -199,7 +200,7 @@ if(user.is_mob_restrained() || user.buckled) to_chat(user, SPAN_NOTICE("You need your hands and legs free for this.")) return 0 - if(user.is_mob_incapacitated(TRUE) || user.lying) + if(user.is_mob_incapacitated(TRUE) || user.body_position == LYING_DOWN) return 0 if(isRemoteControlling(user)) to_chat(user, SPAN_NOTICE("You need hands for this.")) diff --git a/code/game/objects/structures/barricade/deployable.dm b/code/game/objects/structures/barricade/deployable.dm index 77aa6b7e6816..0d5275f98a3d 100644 --- a/code/game/objects/structures/barricade/deployable.dm +++ b/code/game/objects/structures/barricade/deployable.dm @@ -63,7 +63,7 @@ if(!ishuman(usr)) return - if(usr.lying) + if(usr.is_mob_incapacitated()) return if(over_object == usr && Adjacent(usr)) diff --git a/code/game/objects/structures/bookcase.dm b/code/game/objects/structures/bookcase.dm index becb0906e3c6..ce338de47b35 100644 --- a/code/game/objects/structures/bookcase.dm +++ b/code/game/objects/structures/bookcase.dm @@ -33,7 +33,7 @@ if(contents.len) var/obj/item/book/choice = input("Which book would you like to remove from the shelf?") as null|obj in contents if(choice) - if(!usr.canmove || usr.stat || usr.is_mob_restrained() || !in_range(loc, usr)) + if(usr.is_mob_incapacitated() || !in_range(loc, usr)) return if(ishuman(user)) if(!user.get_active_hand()) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index a7394f3a7586..d6148b23b7f0 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -79,10 +79,11 @@ M.forceMove(loc) if(exit_stun) M.apply_effect(exit_stun, STUN) //Action delay when going out of a closet - M.update_canmove() //Force the delay to go in action immediately - if(!M.lying) - M.visible_message(SPAN_WARNING("[M] suddenly gets out of [src]!"), - SPAN_WARNING("You get out of [src] and get your bearings!")) + if(isliving(M)) + var/mob/living/living_M = M + if(living_M.mobility_flags & MOBILITY_MOVE) + M.visible_message(SPAN_WARNING("[M] suddenly gets out of [src]!"), + SPAN_WARNING("You get out of [src] and get your bearings!")) /obj/structure/closet/proc/open() if(opened) @@ -333,7 +334,7 @@ set category = "Object" set name = "Toggle Open" - if(!usr.canmove || usr.stat || usr.is_mob_restrained()) + if(usr.is_mob_incapacitated()) return if(usr.loc == src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm index d6b4a35b04f7..3206da86b197 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm @@ -78,7 +78,7 @@ set src in oview(1) // One square distance set category = "Object" set name = "Reset Lock" - if(!usr.canmove || usr.stat || usr.is_mob_restrained()) // Don't use it if you're not able to! Checks for stuns, ghost and restrain + if(usr.is_mob_incapacitated()) // Don't use it if you're not able to! Checks for stuns, ghost and restrain return if(ishuman(usr)) src.add_fingerprint(usr) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm index 331cb884bd59..ba974a8e722a 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm @@ -121,7 +121,7 @@ set category = "Object" set name = "Toggle Lock" - if(!usr.canmove || usr.stat || usr.is_mob_restrained()) // Don't use it if you're not able to! Checks for stuns, ghost and restrain + if(usr.is_mob_incapacitated()) // Don't use it if you're not able to! Checks for stuns, ghost and restrain return if(ishuman(usr)) diff --git a/code/game/objects/structures/crates_lockers/secure_crates.dm b/code/game/objects/structures/crates_lockers/secure_crates.dm index 28a77e0c81c0..6b025a57c78b 100644 --- a/code/game/objects/structures/crates_lockers/secure_crates.dm +++ b/code/game/objects/structures/crates_lockers/secure_crates.dm @@ -53,7 +53,7 @@ set category = "Object" set name = "Toggle Lock" - if(!usr.canmove || usr.stat || usr.is_mob_restrained()) // Don't use it if you're not able to! Checks for stuns, ghost and restrain + if(usr.is_mob_incapacitated()) // Don't use it if you're not able to! Checks for stuns, ghost and restrain return if(ishuman(usr)) diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm index f2e6b172ad88..da6d4f1a8254 100644 --- a/code/game/objects/structures/ladders.dm +++ b/code/game/objects/structures/ladders.dm @@ -67,8 +67,8 @@ else //wtf make your ladders properly assholes icon_state = "ladder00" -/obj/structure/ladder/attack_hand(mob/user) - if(user.stat || get_dist(user, src) > 1 || user.blinded || user.lying || user.buckled || user.anchored) return +/obj/structure/ladder/attack_hand(mob/living/user) + if(user.stat || get_dist(user, src) > 1 || user.blinded || user.body_position == LYING_DOWN || user.buckled || user.anchored) return if(busy) to_chat(user, SPAN_WARNING("Someone else is currently using [src].")) return @@ -94,7 +94,7 @@ SPAN_NOTICE("You start climbing [ladder_dir_name] [src].")) busy = TRUE if(do_after(user, 20, INTERRUPT_INCAPACITATED|INTERRUPT_OUT_OF_RANGE|INTERRUPT_RESIST, BUSY_ICON_GENERIC, src, INTERRUPT_NONE)) - if(!user.is_mob_incapacitated() && get_dist(user, src) <= 1 && !user.blinded && !user.lying && !user.buckled && !user.anchored) + if(!user.is_mob_incapacitated() && get_dist(user, src) <= 1 && !user.blinded && user.body_position != LYING_DOWN && !user.buckled && !user.anchored) visible_message(SPAN_NOTICE("[user] climbs [ladder_dir_name] [src].")) //Hack to give a visible message to the people here without duplicating user message user.visible_message(SPAN_NOTICE("[user] climbs [ladder_dir_name] [src]."), SPAN_NOTICE("You climb [ladder_dir_name] [src].")) @@ -103,9 +103,9 @@ busy = FALSE add_fingerprint(user) -/obj/structure/ladder/check_eye(mob/user) +/obj/structure/ladder/check_eye(mob/living/user) //Are we capable of looking? - if(user.is_mob_incapacitated() || get_dist(user, src) > 1 || user.blinded || user.lying || !user.client) + if(user.is_mob_incapacitated() || get_dist(user, src) > 1 || user.blinded || user.body_position == LYING_DOWN || !user.client) user.unset_interaction() //Are ladder cameras ok? @@ -140,7 +140,7 @@ //Peeking up/down /obj/structure/ladder/MouseDrop(over_object, src_location, over_location) if((over_object == usr && (in_range(src, usr)))) - if(islarva(usr) || isobserver(usr) || usr.is_mob_incapacitated() || usr.blinded || usr.lying) + if(islarva(usr) || isobserver(usr) || usr.is_mob_incapacitated() || usr.blinded) to_chat(usr, "You can't do that in your current state.") return if(is_watching) diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index b3fb2423008a..f1717f5bf0f5 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -117,9 +117,8 @@ if(user.is_mob_incapacitated()) return if(exit_stun) - user.stunned = max(user.stunned, exit_stun) //Action delay when going out of a closet (or morgue in this case) - user.update_canmove() //Force the delay to go in action immediately - if(!user.lying) + user.apply_effect(exit_stun, STUN) + if(user.mobility_flags & MOBILITY_MOVE) user.visible_message(SPAN_WARNING("[user] suddenly gets out of [src]!"), SPAN_WARNING("You get out of [src] and get your bearings!")) toggle_morgue(user) diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index fbf193a4abab..34b0fb01e9d6 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -13,7 +13,7 @@ icon_state = "bed" icon = 'icons/obj/objects.dmi' can_buckle = TRUE - buckle_lying = TRUE + buckle_lying = 90 throwpass = TRUE debris = list(/obj/item/stack/sheet/metal) var/buildstacktype = /obj/item/stack/sheet/metal diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index 4186ae8608a9..e523906f4cfe 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -6,7 +6,7 @@ name = "chair" desc = "A rectangular metallic frame sitting on four legs with a back panel. Designed to fit the sitting position, more or less comfortably." icon_state = "chair" - buckle_lying = FALSE + buckle_lying = 0 var/propelled = FALSE //Check for fire-extinguisher-driven chairs var/can_rotate = TRUE var/picked_up_item = /obj/item/weapon/twohanded/folded_metal_chair diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm index 2b42e641f0cf..986ae99739aa 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm @@ -20,7 +20,7 @@ if(world.time <= l_move_time + move_delay) return // Redundant check? - if(user.is_mob_incapacitated() || user.lying) + if(user.is_mob_incapacitated()) return if(propelled) //can't manually move it mid-propelling. diff --git a/code/game/objects/structures/stool_bed_chair_nest/xeno_nest.dm b/code/game/objects/structures/stool_bed_chair_nest/xeno_nest.dm index 6375fcd13823..65bb2fd6a963 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/xeno_nest.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/xeno_nest.dm @@ -10,7 +10,7 @@ health = 100 layer = ABOVE_MOB_LAYER plane = GAME_PLANE - buckle_lying = FALSE + buckle_lying = 0 var/on_fire = 0 var/resisting = 0 var/resisting_ready = 0 @@ -145,7 +145,7 @@ if(!(buckled_mob && buckled_mob.buckled == src && buckled_mob != user)) return - if(user.stat || user.lying || user.is_mob_restrained()) + if(user.body_position == LYING_DOWN || user.is_mob_incapacitated()) return if(isxeno(user)) @@ -167,7 +167,7 @@ if(H.stat != DEAD) if(alert(user, "[H] is still alive and kicking! Are you sure you want to remove them from the nest?", "Confirmation", "Yes", "No") != "Yes") return - if(!buckled_mob || !user.Adjacent(H) || user.stat || user.lying || user.is_mob_restrained()) + if(!buckled_mob || !user.Adjacent(H) || user.is_mob_incapacitated(FALSE)) return if(ishuman(user)) @@ -191,7 +191,7 @@ /obj/structure/bed/nest/buckle_mob(mob/mob, mob/user) . = FALSE - if(!isliving(mob) || islarva(user) || (get_dist(src, user) > 1) || user.is_mob_restrained() || user.stat || user.lying || mob.buckled || !iscarbon(user)) + if(!isliving(mob) || islarva(user) || (get_dist(src, user) > 1) || user.is_mob_incapacitated(FALSE)) return if(isxeno(mob)) @@ -220,7 +220,7 @@ var/mob/living/carbon/human/human = null if(ishuman(mob)) human = mob - if(!human.lying) //Don't ask me why is has to be + if(human.body_position != LYING_DOWN) //Don't ask me why is has to be to_chat(user, SPAN_WARNING("[mob] is resisting, ground them.")) return @@ -242,7 +242,7 @@ return if(human) //Improperly stunned Marines won't be nested - if(!human.lying) //Don't ask me why is has to be + if(human.body_position != LYING_DOWN) //Don't ask me why is has to be to_chat(user, SPAN_WARNING("[mob] is resisting, ground them.")) return diff --git a/code/game/objects/structures/vulture_spotter.dm b/code/game/objects/structures/vulture_spotter.dm index 682a13be98fc..d90a1ec1615a 100644 --- a/code/game/objects/structures/vulture_spotter.dm +++ b/code/game/objects/structures/vulture_spotter.dm @@ -78,7 +78,7 @@ try_scope(user) -/obj/structure/vulture_spotter_tripod/on_set_interaction(mob/user) +/obj/structure/vulture_spotter_tripod/on_set_interaction(mob/living/user) var/obj/item/attachable/vulture_scope/scope = get_vulture_scope() scope.spotter_spotting = TRUE to_chat(scope.scope_user, SPAN_NOTICE("You notice that [scope] drifts less.")) @@ -102,7 +102,7 @@ give_action(user, /datum/action/vulture_tripod_unscope, null, null, src) set_scope_loc(user, scope) -/obj/structure/vulture_spotter_tripod/on_unset_interaction(mob/user) +/obj/structure/vulture_spotter_tripod/on_unset_interaction(mob/living/user) user.status_flags &= ~IMMOBILE_ACTION user.visible_message(SPAN_NOTICE("[user] looks up from [src]."),SPAN_NOTICE("You look up from [src].")) REMOVE_TRAIT(user, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Vulture spotter")) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index cccc1211bfb0..60c37fcdc607 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -8,6 +8,7 @@ density = FALSE anchored = TRUE can_buckle = TRUE + buckle_lying = 0 var/open = 0 //if the lid is up var/cistern = 0 //if the cistern bit is open var/w_items = 0 //the combined w_class of all the items in the cistern diff --git a/code/modules/admin/topic/topic.dm b/code/modules/admin/topic/topic.dm index 93cd66d586c4..a0e9e8b787aa 100644 --- a/code/modules/admin/topic/topic.dm +++ b/code/modules/admin/topic/topic.dm @@ -585,17 +585,6 @@ message_admins("[key_name_admin(usr)] attempting to monkeyize [key_name_admin(H)]") H.monkeyize() - else if(href_list["corgione"]) - if(!check_rights(R_SPAWN)) return - - var/mob/living/carbon/human/H = locate(href_list["corgione"]) - if(!istype(H)) - to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") - return - - message_admins("[key_name_admin(usr)] attempting to corgize [key_name_admin(H)]") - H.corgize() - else if(href_list["forcespeech"]) if(!check_rights(R_ADMIN)) return diff --git a/code/modules/animations/animation_library.dm b/code/modules/animations/animation_library.dm index 2bbff8d4cfcd..d4fd8feeaf24 100644 --- a/code/modules/animations/animation_library.dm +++ b/code/modules/animations/animation_library.dm @@ -249,7 +249,7 @@ Can look good elsewhere as well.*/ var/pre_rappel_alpha = alpha alpha = 20 dir = WEST - canmove = FALSE + ADD_TRAIT(src, TRAIT_IMMOBILIZED, INTERACTION_TRAIT) var/matrix/initial_matrix = matrix() initial_matrix.Turn(45) apply_transform(initial_matrix) @@ -257,4 +257,4 @@ Can look good elsewhere as well.*/ var/matrix/reset_matrix = matrix() animate(src, 3, transform = reset_matrix, pixel_y = 0, alpha = pre_rappel_alpha, flags = ANIMATION_PARALLEL) sleep(3) - canmove = TRUE + REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, INTERACTION_TRAIT) diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 05ad7c5a87c7..929e2d6af7b2 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -137,7 +137,7 @@ /obj/item/device/assembly/infra/Topic(href, href_list) ..() - if(!usr.canmove || usr.stat || usr.is_mob_restrained() || !in_range(loc, usr)) + if(usr.is_mob_incapacitated() || !in_range(loc, usr)) close_browser(usr, "infra") return diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 8bf58c680798..dae7f633f05d 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -507,38 +507,40 @@ set name = "Adjust welding goggles" set src in usr - if(usr.canmove && !usr.stat && !usr.is_mob_restrained()) - if(active) - active = 0 - vision_impair = vision_impair_off - flags_inventory &= ~COVEREYES - flags_inv_hide &= ~HIDEEYES - flags_armor_protection &= ~BODY_FLAG_EYES - update_icon() - eye_protection = EYE_PROTECTION_NONE - to_chat(usr, "You push [src] up out of your face.") - else - active = 1 - vision_impair = vision_impair_on - flags_inventory |= COVEREYES - flags_inv_hide |= HIDEEYES - flags_armor_protection |= BODY_FLAG_EYES - update_icon() - eye_protection = initial(eye_protection) - to_chat(usr, "You flip [src] down to protect your eyes.") - - - if(ishuman(loc)) - var/mob/living/carbon/human/H = loc - if(H.glasses == src) - H.update_tint() + if(usr.is_mob_incapacitated()) + return + + if(active) + active = 0 + vision_impair = vision_impair_off + flags_inventory &= ~COVEREYES + flags_inv_hide &= ~HIDEEYES + flags_armor_protection &= ~BODY_FLAG_EYES + update_icon() + eye_protection = EYE_PROTECTION_NONE + to_chat(usr, "You push [src] up out of your face.") + else + active = 1 + vision_impair = vision_impair_on + flags_inventory |= COVEREYES + flags_inv_hide |= HIDEEYES + flags_armor_protection |= BODY_FLAG_EYES + update_icon() + eye_protection = initial(eye_protection) + to_chat(usr, "You flip [src] down to protect your eyes.") + + + if(ishuman(loc)) + var/mob/living/carbon/human/H = loc + if(H.glasses == src) + H.update_tint() - update_clothing_icon() + update_clothing_icon() - for(var/X in actions) - var/datum/action/A = X - if(istype(A, /datum/action/item_action/toggle)) - A.update_button_icon() + for(var/X in actions) + var/datum/action/A = X + if(istype(A, /datum/action/item_action/toggle)) + A.update_button_icon() /obj/item/clothing/glasses/welding/superior name = "superior welding goggles" diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 9ddaed35826a..7406e6baa754 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -36,7 +36,7 @@ return /datum/action/item_action/view_publications/can_use_action() - if(owner && !owner.is_mob_incapacitated() && !owner.lying && owner.faction != FACTION_SURVIVOR) + if(owner && !owner.is_mob_incapacitated() && owner.faction != FACTION_SURVIVOR) return TRUE /datum/action/item_action/view_publications/action_activate() diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index e6c8391ac0a1..15a4cf742464 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -88,7 +88,7 @@ playsound(loc, knockout_sound, 50, FALSE) M.show_message(FONT_SIZE_LARGE(SPAN_WARNING("KNOCKOUT!")), SHOW_MESSAGE_VISIBLE) return 1 - if (L.lying == 1 || L.stat == UNCONSCIOUS)//Can't beat 'em while they're down. + if (L.body_position == LYING_DOWN || L.stat == UNCONSCIOUS)//Can't beat 'em while they're down. to_chat(M, SPAN_WARNING("You can't box with [A], they're already down!")) return 1 M.visible_message(SPAN_DANGER("[M] [boxing_verb] [A]!")) diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 102d8241754f..afc8e0a7cbba 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -45,33 +45,35 @@ set name = "Adjust welding mask" set src in usr - if(usr.canmove && !usr.stat && !usr.is_mob_restrained()) - if(up) - vision_impair = VISION_IMPAIR_MAX - flags_inventory |= COVEREYES|COVERMOUTH|BLOCKSHARPOBJ - flags_inv_hide |= HIDEEARS|HIDEEYES|HIDEFACE - icon_state = initial(icon_state) - eye_protection = initial(eye_protection) - to_chat(usr, "You flip the [src] down to protect your eyes.") - else - vision_impair = VISION_IMPAIR_NONE - flags_inventory &= ~(COVEREYES|COVERMOUTH|BLOCKSHARPOBJ) - flags_inv_hide &= ~(HIDEEARS|HIDEEYES|HIDEFACE) - icon_state = "[initial(icon_state)]up" - eye_protection = EYE_PROTECTION_NONE - to_chat(usr, "You push the [src] up out of your face.") - up = !up - - if(ishuman(loc)) - var/mob/living/carbon/human/H = loc - if(H.head == src) - H.update_tint() - - update_clothing_icon() //so our mob-overlays update - - for(var/X in actions) - var/datum/action/A = X - A.update_button_icon() + if(usr.is_mob_incapacitated()) + return + + if(up) + vision_impair = VISION_IMPAIR_MAX + flags_inventory |= COVEREYES|COVERMOUTH|BLOCKSHARPOBJ + flags_inv_hide |= HIDEEARS|HIDEEYES|HIDEFACE + icon_state = initial(icon_state) + eye_protection = initial(eye_protection) + to_chat(usr, "You flip the [src] down to protect your eyes.") + else + vision_impair = VISION_IMPAIR_NONE + flags_inventory &= ~(COVEREYES|COVERMOUTH|BLOCKSHARPOBJ) + flags_inv_hide &= ~(HIDEEARS|HIDEEYES|HIDEFACE) + icon_state = "[initial(icon_state)]up" + eye_protection = EYE_PROTECTION_NONE + to_chat(usr, "You push the [src] up out of your face.") + up = !up + + if(ishuman(loc)) + var/mob/living/carbon/human/H = loc + if(H.head == src) + H.update_tint() + + update_clothing_icon() //so our mob-overlays update + + for(var/X in actions) + var/datum/action/A = X + A.update_button_icon() /* * Cakehat diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm index 76d61b4e3cc9..ffdda93f8a73 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -16,7 +16,7 @@ set name = "Adjust mask" set src in usr - if(usr.canmove && !usr.stat && !usr.is_mob_restrained()) + if(usr.is_mob_incapacitated()) if(!src.hanging) src.hanging = !src.hanging gas_transfer_coefficient = 1 //gas is now escaping to the turf and vice versa diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index a28a143f4ff0..5b97051852a6 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -385,7 +385,7 @@ set category = "Object" set src in usr - if(!usr.canmove || usr.stat || usr.is_mob_restrained()) + if(usr.is_mob_incapacitated()) return 0 switch(icon_state) diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index 278ffb666bfd..1c2fb2a9f29d 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -52,7 +52,7 @@ set category = "Object" set src in usr - if(!usr.canmove || usr.stat || usr.is_mob_restrained()) + if(usr.is_mob_incapacitated()) return 0 if(src.buttoned == TRUE) diff --git a/code/modules/clothing/suits/marine_armor.dm b/code/modules/clothing/suits/marine_armor.dm index d5dda73c061f..e505d458e496 100644 --- a/code/modules/clothing/suits/marine_armor.dm +++ b/code/modules/clothing/suits/marine_armor.dm @@ -644,7 +644,7 @@ set category = "Object" set src in usr - if(!usr.canmove || usr.stat || usr.is_mob_restrained()) + if(usr.is_mob_incapacitated()) return 0 if(!injections) @@ -923,7 +923,6 @@ H.alpha = full_camo_alpha H.FF_hit_evade = 1000 ADD_TRAIT(H, TRAIT_UNDENSE, SPECIALIST_GEAR_TRAIT) - H.density = FALSE RegisterSignal(H, COMSIG_MOB_MOVE_OR_LOOK, PROC_REF(handle_mob_move_or_look)) @@ -948,7 +947,6 @@ COMSIG_MOB_FIRED_GUN, COMSIG_MOB_FIRED_GUN_ATTACHMENT, COMSIG_MOB_DEATH, - COMSIG_MOB_POST_UPDATE_CANMOVE, COMSIG_HUMAN_EXTINGUISH, COMSIG_MOB_MOVE_OR_LOOK )) @@ -957,7 +955,6 @@ animate(H, alpha = initial(H.alpha), flags = ANIMATION_END_NOW) H.FF_hit_evade = initial(H.FF_hit_evade) REMOVE_TRAIT(H, TRAIT_UNDENSE, SPECIALIST_GEAR_TRAIT) - H.update_canmove() var/datum/mob_hud/security/advanced/SA = GLOB.huds[MOB_HUD_SECURITY_ADVANCED] SA.add_to_hud(H) @@ -1002,7 +999,7 @@ /datum/action/item_action/specialist/prepare_position/can_use_action() var/mob/living/carbon/human/H = owner - if(istype(H) && !H.is_mob_incapacitated() && !H.lying && holder_item == H.wear_suit) + if(istype(H) && !H.is_mob_incapacitated() && H.body_position == STANDING_UP && holder_item == H.wear_suit) return TRUE /datum/action/item_action/specialist/prepare_position/action_activate() diff --git a/code/modules/clothing/suits/marine_coat.dm b/code/modules/clothing/suits/marine_coat.dm index 73d7e0981859..3aa43706c7d8 100644 --- a/code/modules/clothing/suits/marine_coat.dm +++ b/code/modules/clothing/suits/marine_coat.dm @@ -53,7 +53,7 @@ set category = "Object" set src in usr - if(!usr.canmove || usr.stat || usr.is_mob_restrained()) + if(usr.is_mob_incapacitated()) return 0 if(src.buttoned == TRUE) diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 2a3cff05ee1e..b5859bb6f2d4 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -332,7 +332,7 @@ set category = "Object" set src in usr - if(!usr.canmove || usr.stat || usr.is_mob_restrained()) + if(usr.is_mob_incapacitated()) return 0 if(src.icon_state == "suitjacket_blue_open") diff --git a/code/modules/clothing/under/under.dm b/code/modules/clothing/under/under.dm index a48111690271..ebfac5216330 100644 --- a/code/modules/clothing/under/under.dm +++ b/code/modules/clothing/under/under.dm @@ -106,7 +106,7 @@ if ((flags_item & NODROP) || loc != usr) return - if (!usr.is_mob_incapacitated() && !(usr.buckled && usr.lying)) + if (!usr.is_mob_incapacitated() && !(usr.buckled)) if(over_object) switch(over_object.name) if("r_hand") diff --git a/code/modules/cm_aliens/XenoStructures.dm b/code/modules/cm_aliens/XenoStructures.dm index 0802295110c4..340fabdf1973 100644 --- a/code/modules/cm_aliens/XenoStructures.dm +++ b/code/modules/cm_aliens/XenoStructures.dm @@ -160,7 +160,8 @@ /obj/effect/alien/resin/sticky/Crossed(atom/movable/AM) . = ..() var/mob/living/carbon/human/H = AM - if(istype(H) && !H.lying && !H.ally_of_hivenumber(hivenumber)) + // Wait doesn't this stack slows if you get dragged over it? What's going on here? + if(istype(H) && !H.ally_of_hivenumber(hivenumber)) H.next_move_slowdown = H.next_move_slowdown + slow_amt return . var/mob/living/carbon/xenomorph/X = AM @@ -565,7 +566,7 @@ return FALSE burning_friendly = TRUE - else if(current_mob.lying || current_mob.is_mob_incapacitated(TRUE)) + else if(current_mob.body_position == LYING_DOWN || current_mob.is_mob_incapacitated(TRUE)) return FALSE if(!burning_friendly && current_mob.health < 0) diff --git a/code/modules/cm_aliens/structures/fruit.dm b/code/modules/cm_aliens/structures/fruit.dm index 318bc6ba6cf2..09983c930031 100644 --- a/code/modules/cm_aliens/structures/fruit.dm +++ b/code/modules/cm_aliens/structures/fruit.dm @@ -442,7 +442,7 @@ /obj/effect/alien/resin/fruit/MouseDrop(atom/over_object) var/mob/living/carbon/xenomorph/X = over_object - if(!istype(X) || !Adjacent(X) || X != usr || X.is_mob_incapacitated() || X.lying) return ..() + if(!istype(X) || !Adjacent(X) || X != usr || X.is_mob_incapacitated() || X.body_position == LYING_DOWN) return ..() X.pickup_fruit(src) // Handles xenos picking up fruit diff --git a/code/modules/cm_aliens/structures/trap.dm b/code/modules/cm_aliens/structures/trap.dm index bc8eb7e6c7c0..d885e4d14a91 100644 --- a/code/modules/cm_aliens/structures/trap.dm +++ b/code/modules/cm_aliens/structures/trap.dm @@ -106,7 +106,7 @@ var/mob/living/carbon/human/H = AM if(issynth(H) || isyautja(H)) return - if(H.stat == DEAD || H.lying) + if(H.stat == DEAD || H.body_position == LYING_DOWN) return if(H.ally_of_hivenumber(hivenumber)) return diff --git a/code/modules/cm_aliens/structures/tunnel.dm b/code/modules/cm_aliens/structures/tunnel.dm index 6ac90338045d..8c467be695b4 100644 --- a/code/modules/cm_aliens/structures/tunnel.dm +++ b/code/modules/cm_aliens/structures/tunnel.dm @@ -127,7 +127,7 @@ /obj/structure/tunnel/proc/pick_tunnel(mob/living/carbon/xenomorph/X) . = FALSE //For peace of mind when it comes to dealing with unintended proc failures - if(!istype(X) || X.stat || X.lying || !isfriendly(X) || !hive) + if(!istype(X) || X.is_mob_incapacitated(TRUE) || !isfriendly(X) || !hive) return FALSE if(X in contents) var/list/tunnels = list() @@ -195,7 +195,7 @@ . = attack_alien(M) /obj/structure/tunnel/attack_alien(mob/living/carbon/xenomorph/M) - if(!istype(M) || M.stat || M.lying) + if(!istype(M) || M.is_mob_incapacitated(TRUE)) return XENO_NO_DELAY_ACTION if(!isfriendly(M)) diff --git a/code/modules/cm_marines/Donator_Items.dm b/code/modules/cm_marines/Donator_Items.dm index e8eb3f75ae60..6d2f46490d13 100644 --- a/code/modules/cm_marines/Donator_Items.dm +++ b/code/modules/cm_marines/Donator_Items.dm @@ -23,7 +23,7 @@ set src in usr if(!ishuman(usr)) return - if(!usr.canmove || usr.stat || usr.is_mob_restrained() || !usr.loc || !isturf(usr.loc)) + if(usr.is_mob_incapacitated() || !isturf(usr.loc)) to_chat(usr, SPAN_WARNING("Not right now!")) return @@ -35,7 +35,7 @@ set src in usr if(!ishuman(usr)) return - if(!usr.canmove || usr.stat || usr.is_mob_restrained() || !usr.loc || !isturf(usr.loc)) + if(usr.is_mob_incapacitated() || !isturf(usr.loc)) to_chat(usr, SPAN_WARNING("Not right now!")) return @@ -91,7 +91,7 @@ set src in usr if(!ishuman(usr)) return - if(!usr.canmove || usr.stat || usr.is_mob_restrained() || !usr.loc || !isturf(usr.loc)) + if(usr.is_mob_incapacitated() || !isturf(usr.loc)) to_chat(usr, SPAN_WARNING("Not right now!")) return @@ -103,7 +103,7 @@ set src in usr if(!ishuman(usr)) return - if(!usr.canmove || usr.stat || usr.is_mob_restrained() || !usr.loc || !isturf(usr.loc)) + if(usr.is_mob_incapacitated() || !isturf(usr.loc)) to_chat(usr, SPAN_WARNING("Not right now!")) return diff --git a/code/modules/cm_marines/m2c.dm b/code/modules/cm_marines/m2c.dm index 820e318b2777..f61c9ef89659 100644 --- a/code/modules/cm_marines/m2c.dm +++ b/code/modules/cm_marines/m2c.dm @@ -445,7 +445,7 @@ //ATTACK WITH BOTH HANDS COMBO -/obj/structure/machinery/m56d_hmg/auto/attack_hand(mob/user) +/obj/structure/machinery/m56d_hmg/auto/attack_hand(mob/living/user) ..() var/turf/user_turf = get_turf(user) @@ -515,16 +515,13 @@ ..() ADD_TRAIT(user, TRAIT_OVERRIDE_CLICKDRAG, TRAIT_SOURCE_WEAPON) RegisterSignal(user, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(disable_interaction)) - RegisterSignal(user, COMSIG_MOB_POST_UPDATE_CANMOVE, PROC_REF(disable_canmove_interaction)) + RegisterSignal(user, COMSIG_LIVING_SET_BODY_POSITION, PROC_REF(body_position_changed)) // DISMOUNT THE MG /obj/structure/machinery/m56d_hmg/auto/on_unset_interaction(mob/user) REMOVE_TRAIT(user, TRAIT_OVERRIDE_CLICKDRAG, TRAIT_SOURCE_WEAPON) - UnregisterSignal(user, list( - COMSIG_MOVABLE_PRE_MOVE, - COMSIG_MOB_POST_UPDATE_CANMOVE - )) + UnregisterSignal(user, COMSIG_MOVABLE_PRE_MOVE) ..() // GET ANIMATED @@ -598,16 +595,16 @@ to_chat(user, SPAN_NOTICE("You rotate [src], using the tripod to support your pivoting movement.")) -/obj/structure/machinery/m56d_hmg/auto/proc/disable_interaction(mob/user, NewLoc, direction) +/obj/structure/machinery/m56d_hmg/auto/proc/disable_interaction(mob/living/user, NewLoc, direction) SIGNAL_HANDLER - if(user.lying || get_dist(user,src) > 0 || user.is_mob_incapacitated() || !user.client) + if(user.body_position != STANDING_UP || get_dist(user,src) > 0 || user.is_mob_incapacitated() || !user.client) user.unset_interaction() -/obj/structure/machinery/m56d_hmg/auto/proc/disable_canmove_interaction(mob/user, canmove, laid_down, lying) +/obj/structure/machinery/m56d_hmg/auto/proc/body_position_changed(mob/living/user, body_position, old_body_position) SIGNAL_HANDLER - if(laid_down) + if(body_position != STANDING_UP) user.unset_interaction() /obj/structure/machinery/m56d_hmg/auto/proc/handle_rotating_gun(mob/user) diff --git a/code/modules/cm_marines/marines_consoles.dm b/code/modules/cm_marines/marines_consoles.dm index d05233e57937..994e9f1ddcb2 100644 --- a/code/modules/cm_marines/marines_consoles.dm +++ b/code/modules/cm_marines/marines_consoles.dm @@ -432,7 +432,7 @@ set name = "Eject ID Card" set src in oview(1) - if(!usr || usr.stat || usr.lying) return + if(!usr || usr.is_mob_incapacitated()) return if(user_id_card) user_id_card.loc = get_turf(src) @@ -498,7 +498,7 @@ set name = "Eject ID Card" set src in view(1) - if(!usr || usr.stat || usr.lying) return + if(!usr || usr.is_mob_incapacitated()) return if(ishuman(usr) && ID_to_modify) to_chat(usr, "You remove \the [ID_to_modify] from \the [src].") diff --git a/code/modules/cm_marines/orbital_cannon.dm b/code/modules/cm_marines/orbital_cannon.dm index 612c43ae1dc9..c9ec4190ce90 100644 --- a/code/modules/cm_marines/orbital_cannon.dm +++ b/code/modules/cm_marines/orbital_cannon.dm @@ -446,7 +446,7 @@ GLOBAL_LIST_EMPTY(orbital_cannon_cancellation) shake_camera(user, 3, total_shake_factor, shake_frequency) user.KnockDown(rand(max_knockdown_time * distance_percent, (max_knockdown_time * distance_percent + 1))) - if(!user.knocked_down) + if(HAS_TRAIT(user, TRAIT_FLOORED)) continue to_chat(user, SPAN_WARNING("You are thrown off balance and fall to the ground!")) diff --git a/code/modules/cm_marines/smartgun_mount.dm b/code/modules/cm_marines/smartgun_mount.dm index dd9053810042..8b6dde5527e2 100644 --- a/code/modules/cm_marines/smartgun_mount.dm +++ b/code/modules/cm_marines/smartgun_mount.dm @@ -839,7 +839,7 @@ to_chat(usr, SPAN_NOTICE("You are too far from the handles to man [src]!")) /obj/structure/machinery/m56d_hmg/on_set_interaction(mob/user) - RegisterSignal(user, list(COMSIG_MOB_MG_EXIT, COMSIG_MOB_RESISTED, COMSIG_MOB_DEATH, COMSIG_MOB_KNOCKED_DOWN), PROC_REF(exit_interaction)) + RegisterSignal(user, list(COMSIG_MOB_MG_EXIT, COMSIG_MOB_RESISTED, COMSIG_MOB_DEATH, COMSIG_LIVING_SET_BODY_POSITION), PROC_REF(exit_interaction)) flags_atom |= RELAY_CLICK user.status_flags |= IMMOBILE_ACTION user.visible_message(SPAN_NOTICE("[user] mans \the [src]."),SPAN_NOTICE("You man \the [src], locked and loaded!")) @@ -854,7 +854,7 @@ update_pixels(user) operator = user -/obj/structure/machinery/m56d_hmg/on_unset_interaction(mob/user) +/obj/structure/machinery/m56d_hmg/on_unset_interaction(mob/living/user) flags_atom &= ~RELAY_CLICK SEND_SIGNAL(src, COMSIG_GUN_INTERRUPT_FIRE) user.status_flags &= ~IMMOBILE_ACTION @@ -875,7 +875,7 @@ COMSIG_MOB_MG_EXIT, COMSIG_MOB_RESISTED, COMSIG_MOB_DEATH, - COMSIG_MOB_KNOCKED_DOWN, + COMSIG_LIVING_SET_BODY_POSITION, )) @@ -915,8 +915,8 @@ user.client.pixel_y = 0 animate(user, pixel_x=user_old_x, pixel_y=user_old_y, 4, 1) -/obj/structure/machinery/m56d_hmg/check_eye(mob/user) - if(user.lying || get_dist(user,src) > 0 || user.is_mob_incapacitated() || !user.client) +/obj/structure/machinery/m56d_hmg/check_eye(mob/living/user) + if(user.body_position != STANDING_UP || get_dist(user,src) > 0 || user.is_mob_incapacitated() || !user.client) user.unset_interaction() /obj/structure/machinery/m56d_hmg/clicked(mob/user, list/mods) diff --git a/code/modules/cm_preds/thrall_procs.dm b/code/modules/cm_preds/thrall_procs.dm index 8ea0f2abb51a..a28f6eba2662 100644 --- a/code/modules/cm_preds/thrall_procs.dm +++ b/code/modules/cm_preds/thrall_procs.dm @@ -14,7 +14,7 @@ to_chat(wearer, SPAN_WARNING("You've already claimed your equipment.")) return - if(wearer.is_mob_incapacitated() || wearer.lying || wearer.buckled) + if(wearer.is_mob_incapacitated() || wearer.body_position == LYING_DOWN /* replace by mobility_flags */ || wearer.buckled) to_chat(wearer, SPAN_WARNING("You're not able to do that right now.")) return diff --git a/code/modules/cm_preds/yaut_bracers.dm b/code/modules/cm_preds/yaut_bracers.dm index d18ca4c153df..111a95d1089c 100644 --- a/code/modules/cm_preds/yaut_bracers.dm +++ b/code/modules/cm_preds/yaut_bracers.dm @@ -106,6 +106,7 @@ /// handles decloaking only on HUNTER gloves /obj/item/clothing/gloves/yautja/proc/decloak() + SIGNAL_HANDLER return /// Called to update the minimap icon of the predator @@ -408,7 +409,7 @@ . = wristblades_internal(usr, FALSE) /obj/item/clothing/gloves/yautja/hunter/proc/wristblades_internal(mob/living/carbon/human/caller, forced = FALSE) - if(!caller.loc || !caller.canmove || caller.stat || !ishuman(caller)) + if(!caller.loc || caller.is_mob_incapacitated() || !ishuman(caller)) return . = check_random_function(caller, forced) @@ -648,7 +649,7 @@ . = caster_internal(usr, FALSE) /obj/item/clothing/gloves/yautja/hunter/proc/caster_internal(mob/living/carbon/human/caller, forced = FALSE) - if(!caller.loc || !caller.canmove || caller.stat || !ishuman(caller)) + if(!caller.loc || caller.is_mob_incapacitated() || !ishuman(caller)) return . = check_random_function(caller, forced) diff --git a/code/modules/cm_preds/yaut_procs.dm b/code/modules/cm_preds/yaut_procs.dm index 32d532da72a0..728e548dfd2f 100644 --- a/code/modules/cm_preds/yaut_procs.dm +++ b/code/modules/cm_preds/yaut_procs.dm @@ -48,7 +48,7 @@ set name = "Butcher" set desc = "Butcher a corpse you're standing on for its tasty meats." - if(is_mob_incapacitated() || lying || buckled) + if(is_mob_incapacitated() || body_position != STANDING_UP || buckled) return var/list/choices = list() @@ -77,7 +77,7 @@ to_chat(src, SPAN_WARNING("This tiny worm is not even worth using your tools on.")) return - if(is_mob_incapacitated() || lying || buckled) + if(is_mob_incapacitated() || body_position != STANDING_UP || buckled) return if(issynth(T)) @@ -236,7 +236,7 @@ to_chat(src, SPAN_WARNING("You've already claimed your equipment.")) return - if(is_mob_incapacitated() || lying || buckled) + if(is_mob_incapacitated() || body_position != STANDING_UP || buckled) to_chat(src, SPAN_WARNING("You're not able to do that right now.")) return diff --git a/code/modules/cm_tech/hologram.dm b/code/modules/cm_tech/hologram.dm index 5c0e986f45b2..3509c0a73a7d 100644 --- a/code/modules/cm_tech/hologram.dm +++ b/code/modules/cm_tech/hologram.dm @@ -5,7 +5,6 @@ GLOBAL_LIST_EMPTY_TYPED(hologram_list, /mob/hologram) desc = "It seems to be a visual projection of someone" //jinkies! icon = 'icons/mob/mob.dmi' icon_state = "hologram" - canmove = TRUE blinded = FALSE invisibility = INVISIBILITY_OBSERVER diff --git a/code/modules/defenses/defenses.dm b/code/modules/defenses/defenses.dm index 099b41aee72b..633b51801e27 100644 --- a/code/modules/defenses/defenses.dm +++ b/code/modules/defenses/defenses.dm @@ -408,9 +408,9 @@ damaged_action(damage) if(stat == DEFENSE_DAMAGED) - density = FALSE + set_density(FALSE) else - density = initial(density) + set_density(initial(density)) update_icon() diff --git a/code/modules/desert_dam/filtration/filtration.dm b/code/modules/desert_dam/filtration/filtration.dm index 33c3e265e182..c289ae878bad 100644 --- a/code/modules/desert_dam/filtration/filtration.dm +++ b/code/modules/desert_dam/filtration/filtration.dm @@ -186,7 +186,7 @@ Each var depends on others M.apply_damage(0.5,BURN) else var/dam_amount = 3 - if(M.lying) + if(M.body_position == LYING_DOWN) M.apply_damage(dam_amount,BURN) M.apply_damage(dam_amount,BURN) M.apply_damage(dam_amount,BURN) diff --git a/code/modules/desert_dam/motion_sensor/sensortower.dm b/code/modules/desert_dam/motion_sensor/sensortower.dm index 6a718607aaf6..50aeede45f66 100644 --- a/code/modules/desert_dam/motion_sensor/sensortower.dm +++ b/code/modules/desert_dam/motion_sensor/sensortower.dm @@ -211,7 +211,7 @@ if(do_after(M, 40, INTERRUPT_ALL, BUSY_ICON_HOSTILE)) if(M.loc != cur_loc) return XENO_NO_DELAY_ACTION //Make sure we're still there - if(M.lying) + if(M.is_mob_incapacitated()) return XENO_NO_DELAY_ACTION if(buildstate == SENSORTOWER_BUILDSTATE_BLOWTORCH) return XENO_NO_DELAY_ACTION diff --git a/code/modules/droppod/container_droppod.dm b/code/modules/droppod/container_droppod.dm index 270f15011c5c..a9432933fa90 100644 --- a/code/modules/droppod/container_droppod.dm +++ b/code/modules/droppod/container_droppod.dm @@ -126,7 +126,7 @@ . = ..() if(loc) collect_objects(loc.contents) - density = TRUE + set_density(TRUE) /obj/structure/droppod/container/proc/collect_objects(list/L) for(var/atom/movable/A in L) diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm index a1cbce7a40a6..1345164fcf34 100644 --- a/code/modules/economy/ATM.dm +++ b/code/modules/economy/ATM.dm @@ -465,7 +465,7 @@ log transactions set name = "Eject ID Card" set src in view(1) - if(!usr || usr.stat || usr.lying) return + if(!usr || usr.is_mob_incapacitated()) return if(ishuman(usr) && held_card) to_chat(usr, "You remove \the [held_card] from \the [src].") diff --git a/code/modules/flufftext/Dreaming.dm b/code/modules/flufftext/Dreaming.dm index 9503eee267e0..e62ad15a649e 100644 --- a/code/modules/flufftext/Dreaming.dm +++ b/code/modules/flufftext/Dreaming.dm @@ -21,7 +21,7 @@ for(var/i = rand(1,4),i > 0, i--) to_chat(src, SPAN_NOTICE("... [pick(POSSIBLE_DREAM_TOPICS)] ...")) sleep(rand(40,70)) - if(knocked_out <= 0) + if(!stat) dreaming = 0 return dreaming = 0 diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index ee3d749ec4fa..ceff47b5b63c 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -351,7 +351,7 @@ GLOBAL_LIST_INIT(non_fakeattack_weapons, list(/obj/item/device/aicard,\ var/clone_weapon = null for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) - if(H.stat || H.lying) continue + if(H.stat) continue // possible_clones += H clone = H break //changed the code a bit. Less randomised, but less work to do. Should be ok, world.contents aren't stored in any particular order. diff --git a/code/modules/gear_presets/corpses.dm b/code/modules/gear_presets/corpses.dm index 70f4e2206002..de24f1f84ff3 100644 --- a/code/modules/gear_presets/corpses.dm +++ b/code/modules/gear_presets/corpses.dm @@ -39,7 +39,6 @@ if(nest) new_human.buckled = nest new_human.setDir(nest.dir) - new_human.update_canmove() nest.buckled_mob = new_human nest.afterbuckle(new_human) new_human.spawned_corpse = TRUE diff --git a/code/modules/hydroponics/vines.dm b/code/modules/hydroponics/vines.dm index 9268d3279539..bfca73e8d01b 100644 --- a/code/modules/hydroponics/vines.dm +++ b/code/modules/hydroponics/vines.dm @@ -124,7 +124,6 @@ if(V && (V.stat != DEAD) && (V.buckled != src)) // If mob exists and is not dead or captured. V.buckled = src V.forceMove(src.loc) - V.update_canmove() src.buckled_mob = V to_chat(V, SPAN_DANGER("The vines [pick("wind", "tangle", "tighten")] around you!")) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index cf3f9e8b4702..887313eb4db9 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -25,7 +25,6 @@ icon = 'icons/mob/mob.dmi' icon_state = "ghost" density = FALSE - canmove = TRUE blinded = FALSE anchored = TRUE // don't get pushed around invisibility = INVISIBILITY_OBSERVER @@ -80,6 +79,9 @@ GLOB.observer_list += src + // Ghosts don't move, they teleport via a special case in mob code + ADD_TRAIT(src, TRAIT_IMMOBILIZED, TRAIT_SOURCE_INHERENT) + var/turf/spawn_turf if(ismob(body)) spawn_turf = get_turf(body) //Where is the body located? diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm index 608458e2dd0d..8aea59b96a81 100644 --- a/code/modules/mob/death.dm +++ b/code/modules/mob/death.dm @@ -57,8 +57,6 @@ set_stat(DEAD) - update_canmove() - dizziness = 0 jitteriness = 0 diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 5ce40810e0b2..d71a908d627a 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -29,8 +29,6 @@ //Puts the item into your l_hand if possible and calls all necessary triggers/updates. returns 1 on success. /mob/proc/put_in_l_hand(obj/item/W) - if(lying) - return FALSE if(!istype(W)) return FALSE if(!l_hand) @@ -48,8 +46,6 @@ //Puts the item into your r_hand if possible and calls all necessary triggers/updates. returns 1 on success. /mob/proc/put_in_r_hand(obj/item/W) - if(lying) - return FALSE if(!istype(W)) return FALSE if(!r_hand) diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm index ec55e6c51b59..b815fe4e3621 100644 --- a/code/modules/mob/living/brain/brain.dm +++ b/code/modules/mob/living/brain/brain.dm @@ -41,15 +41,6 @@ return 1 return ..() - -/mob/living/brain/update_canmove() - canmove = FALSE - return canmove - - - - - /mob/living/brain/update_sight() if (stat == DEAD) sight |= SEE_TURFS diff --git a/code/modules/mob/living/brain/life.dm b/code/modules/mob/living/brain/life.dm index 82cbb155b516..7f84b6466144 100644 --- a/code/modules/mob/living/brain/life.dm +++ b/code/modules/mob/living/brain/life.dm @@ -18,7 +18,6 @@ //Status updates, death etc. handle_regular_status_updates() - update_canmove() if(client) handle_regular_hud_updates() diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 0d33503bcef4..b63ce0174a22 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -74,7 +74,7 @@ /mob/living/carbon/ex_act(severity, direction, datum/cause_data/cause_data) - if(lying) + if(body_position == LYING_DOWN) severity *= EXPLOSION_PRONE_MULTIPLIER if(severity >= 30) @@ -260,19 +260,24 @@ /mob/living/carbon/proc/help_shake_act(mob/living/carbon/M) if(src == M) return - var/t_him = "it" - if(gender == MALE) - t_him = "him" - else if(gender == FEMALE) - t_him = "her" - if(lying || sleeping) + var/t_him = p_them() + + var/shake_action + if(stat == DEAD || HAS_TRAIT(src, TRAIT_INCAPACITATED) || sleeping) // incap implies also unconscious or knockedout + shake_action = "wake [t_him] up!" + else if(HAS_TRAIT(src, TRAIT_FLOORED)) + shake_action = "get [t_him] up!" + + if(shake_action) // We are incapacitated in some fashion if(client) sleeping = max(0,sleeping-5) - if(sleeping == 0) - resting = 0 - update_canmove() - M.visible_message(SPAN_NOTICE("[M] shakes [src] trying to wake [t_him] up!"), \ - SPAN_NOTICE("You shake [src] trying to wake [t_him] up!"), null, 4) + M.visible_message(SPAN_NOTICE("[M] shakes [src] trying to [shake_action]"), \ + SPAN_NOTICE("You shake [src] trying to [shake_action]"), null, 4) + + else if(body_position == LYING_DOWN) // We're just chilling on the ground, let us be + M.visible_message(SPAN_NOTICE("[M] stares and waves impatiently at [src] lying on the ground."), \ + SPAN_NOTICE("You stare and wave at [src] just lying on the ground."), null, 4) + else var/mob/living/carbon/human/H = M if(istype(H)) @@ -452,19 +457,19 @@ /mob/living/carbon/slip(slip_source_name, stun_level, weaken_level, run_only, override_noslip, slide_steps) set waitfor = 0 if(buckled) return FALSE //can't slip while buckled - if(lying) return FALSE //can't slip if already lying down. + if(body_position != STANDING_UP) return FALSE //can't slip if already lying down. stop_pulling() to_chat(src, SPAN_WARNING("You slipped on \the [slip_source_name? slip_source_name : "floor"]!")) playsound(src.loc, 'sound/misc/slip.ogg', 25, 1) apply_effect(stun_level, STUN) apply_effect(weaken_level, WEAKEN) . = TRUE - if(slide_steps && lying)//lying check to make sure we downed the mob + if(slide_steps && HAS_TRAIT(src, TRAIT_FLOORED))//lying check to make sure we downed the mob var/slide_dir = dir for(var/i=1, i<=slide_steps, i++) step(src, slide_dir) sleep(2) - if(!lying) + if(!HAS_TRAIT(src, TRAIT_FLOORED)) // just watch this break in the most horrible way possible break @@ -518,3 +523,17 @@ . += SPAN_GREEN("[src] was thralled by [src.hunter_data.thralled_set.real_name] for '[src.hunter_data.thralled_reason]'.") else if(src.hunter_data.gear) . += SPAN_RED("[src] was marked as carrying gear by [src.hunter_data.gear_set].") + + +/mob/living/carbon/on_lying_down(new_lying_angle) + . = ..() + if(!buckled || buckled.buckle_lying != 0) + lying_angle_on_lying_down(new_lying_angle) + + +/// Special carbon interaction on lying down, to transform its sprite by a rotation. +/mob/living/carbon/proc/lying_angle_on_lying_down(new_lying_angle) + if(!new_lying_angle) + set_lying_angle(pick(90, 270)) + else + set_lying_angle(new_lying_angle) diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 5cac9db53cc6..6ff2a96b72f0 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -1,5 +1,6 @@ /mob/living/carbon gender = MALE + mobility_flags = MOBILITY_FLAGS_CARBON_DEFAULT var/list/stomach_contents = list() var/life_tick = 0 // The amount of life ticks that have processed on this mob. diff --git a/code/modules/mob/living/carbon/give.dm b/code/modules/mob/living/carbon/give.dm index c493559ff0d8..3f88d6beccb1 100644 --- a/code/modules/mob/living/carbon/give.dm +++ b/code/modules/mob/living/carbon/give.dm @@ -28,7 +28,7 @@ I = giver.r_hand if(!istype(I) || (I.flags_item & (DELONDROP|NODROP|ITEM_ABSTRACT))) return - if(lying) + if(body_position == LYING_DOWN) // replace by mobiilty_flags probably to_chat(giver, SPAN_WARNING("[src] can't hold that while lying down.")) return if(r_hand && l_hand) @@ -47,7 +47,7 @@ to_chat(giver, SPAN_WARNING("You need to keep the item in your active hand.")) to_chat(src, SPAN_WARNING("[giver] seem to have given up on giving [I] to you.")) return - if(lying) + if(body_position == LYING_DOWN) to_chat(src, SPAN_WARNING("You can't hold that while lying down.")) to_chat(giver, SPAN_WARNING("[src] can't hold that while lying down.")) return diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 38969c01488a..6170aec3031c 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -133,7 +133,7 @@ . += "Self Destruct Status: [SShijack.get_sd_eta()]" /mob/living/carbon/human/ex_act(severity, direction, datum/cause_data/cause_data) - if(lying) + if(body_position == LYING_DOWN) severity *= EXPLOSION_PRONE_MULTIPLIER @@ -172,6 +172,7 @@ var/obj/item/item1 = get_active_hand() var/obj/item/item2 = get_inactive_hand() apply_effect(round(knockdown_minus_armor), WEAKEN) + apply_effect(round(knockdown_minus_armor), STUN) // Remove this to let people crawl after an explosion. Funny but perhaps not desirable. var/knockout_value = damage * 0.1 var/knockout_minus_armor = min(knockout_value * bomb_armor_mult * 0.5, 0.5 SECONDS) // the KO time is halved from the knockdown timer. basically same stun time, you just spend less time KO'd. apply_effect(round(knockout_minus_armor), PARALYZE) @@ -1052,7 +1053,7 @@ /mob/living/carbon/human/proc/handle_embedded_objects() - if((stat == DEAD) || lying || buckled) // Shouldnt be needed, but better safe than sorry + if((stat == DEAD) || body_position || buckled) // Shouldnt be needed, but better safe than sorry return for(var/obj/item/W in embedded_items) diff --git a/code/modules/mob/living/carbon/human/human_abilities.dm b/code/modules/mob/living/carbon/human/human_abilities.dm index 37329c53b275..b5a401bc5649 100644 --- a/code/modules/mob/living/carbon/human/human_abilities.dm +++ b/code/modules/mob/living/carbon/human/human_abilities.dm @@ -455,9 +455,7 @@ CULT return to_chat(chosen, SPAN_HIGHDANGER("You feel a dangerous presence in the back of your head. You find yourself unable to move!")) - ADD_TRAIT(chosen, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Cultist Stun")) - chosen.update_canmove() chosen.update_xeno_hostile_hud() diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 805b3d7e1744..2bb113d67739 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -206,12 +206,11 @@ w_uniform.add_fingerprint(M) - if(lying || sleeping) + if(body_position == LYING_DOWN || sleeping) if(client) sleeping = max(0,src.sleeping-5) if(!sleeping) - resting = 0 - update_canmove() + set_resting(FALSE) M.visible_message(SPAN_NOTICE("[M] shakes [src] trying to wake [t_him] up!"), \ SPAN_NOTICE("You shake [src] trying to wake [t_him] up!"), null, 4) else if(stunned) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 1dd7ff5fe124..dd25a13538af 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -1,5 +1,6 @@ /mob/living/carbon/human light_system = MOVABLE_LIGHT + rotate_on_lying = TRUE //Hair color and style var/r_hair = 0 var/g_hair = 0 diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index c4690c03068f..08ddd11da5b3 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -219,14 +219,6 @@ return 0 - -/mob/living/carbon/human/has_legs() - . = 0 - if(has_limb("r_foot") && has_limb("r_leg")) - .++ - if(has_limb("l_foot") && has_limb("l_leg")) - .++ - /mob/living/carbon/human/proc/disable_special_flags() status_flags |= CANPUSH anchored = FALSE diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 1a906dfa5c11..1803e289114e 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -108,7 +108,7 @@ //Do we have a working jetpack if(istype(back, /obj/item/tank/jetpack)) var/obj/item/tank/jetpack/J = back - if(((!check_drift) || (check_drift && J.stabilization_on)) && (!lying) && (J.allow_thrust(0.01, src))) + if(((!check_drift) || (check_drift && J.stabilization_on)) && (body_position == STANDING_UP) && (J.allow_thrust(0.01, src))) inertia_dir = 0 return 1 // if(!check_drift && J.allow_thrust(0.01, src)) @@ -140,3 +140,10 @@ prob_slip = round(prob_slip) return(prob_slip) + +/// Updates [TRAIT_FLOORED] based on whether the mob has appropriate limbs to stand or not +/mob/living/carbon/human/proc/update_leg_status() + if((has_limb("r_foot") && has_limb("r_leg")) || (has_limb("l_foot") && has_limb("l_leg"))) + REMOVE_TRAIT(src, TRAIT_FLOORED, BODY_TRAIT) + else + ADD_TRAIT(src, TRAIT_FLOORED, BODY_TRAIT) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index fded3d5e3f77..be1c7833c5c1 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -82,8 +82,6 @@ //Status updates, death etc. handle_regular_status_updates() //Optimized a bit - update_canmove() - handle_regular_hud_updates() pulse = handle_pulse() diff --git a/code/modules/mob/living/carbon/human/life/handle_disabilities.dm b/code/modules/mob/living/carbon/human/life/handle_disabilities.dm index 9ab234212108..77358ca45b89 100644 --- a/code/modules/mob/living/carbon/human/life/handle_disabilities.dm +++ b/code/modules/mob/living/carbon/human/life/handle_disabilities.dm @@ -3,7 +3,7 @@ /mob/living/carbon/human/proc/handle_disabilities() if(disabilities & EPILEPSY) - if((prob(1) && knocked_out < 1)) + if(prob(1) && !HAS_TRAIT(src, TRAIT_KNOCKEDOUT)) visible_message(SPAN_DANGER("\The [src] starts having a seizure!"), \ SPAN_DANGER("You start having a seizure!"), null, 5) apply_effect(10, PARALYZE) @@ -11,14 +11,14 @@ return if(disabilities & COUGHING) - if((prob(5) && knocked_out <= 1)) + if(prob(5) && !HAS_TRAIT(src, TRAIT_KNOCKEDOUT)) drop_held_item() INVOKE_ASYNC(src, PROC_REF(emote), "cough") return if(disabilities & TOURETTES) speech_problem_flag = TRUE - if((prob(10) && knocked_out <= 1)) + if((prob(10) && !HAS_TRAIT(src, TRAIT_KNOCKEDOUT))) apply_effect(10, STUN) spawn() switch(rand(1, 3)) @@ -56,6 +56,6 @@ to_chat(src, SPAN_DANGER("Your hand won't respond properly, you drop what you're holding.")) drop_held_item() if(10 to 12) - if(getBrainLoss() >= 50 && !lying) + if(getBrainLoss() >= 50 && body_position == STANDING_UP) to_chat(src, SPAN_DANGER("Your legs won't respond properly, you fall down.")) resting = 1 diff --git a/code/modules/mob/living/carbon/human/life/handle_organs.dm b/code/modules/mob/living/carbon/human/life/handle_organs.dm index 2c978f2295ed..706e8567a50c 100644 --- a/code/modules/mob/living/carbon/human/life/handle_organs.dm +++ b/code/modules/mob/living/carbon/human/life/handle_organs.dm @@ -16,7 +16,7 @@ else E.process() - if(!lying && world.time - l_move_time < 15) + if(body_position == STANDING_UP && world.time - l_move_time < 15) // Moving around with fractured ribs won't do you any good if(E.is_broken() && E.internal_organs && prob(15)) var/datum/internal_organ/I = pick(E.internal_organs) @@ -32,7 +32,7 @@ custom_pain("You feel broken bones cutting at you in your [E.display_name]!", 1) pain.apply_pain(damage * 1.5) - if(!lying && !buckled && prob(2)) + if(body_position == STANDING_UP && !buckled && prob(2)) var/left_leg_crippled = FALSE var/right_leg_crippled = FALSE diff --git a/code/modules/mob/living/carbon/human/life/handle_regular_status_updates.dm b/code/modules/mob/living/carbon/human/life/handle_regular_status_updates.dm index 5c951a8112bf..41554f056744 100644 --- a/code/modules/mob/living/carbon/human/life/handle_regular_status_updates.dm +++ b/code/modules/mob/living/carbon/human/life/handle_regular_status_updates.dm @@ -1,6 +1,6 @@ //Refer to life.dm for caller -/mob/living/carbon/human/handle_regular_status_updates(regular_update = TRUE) +/mob/living/carbon/human/handle_regular_status_updates(regular_update = TRUE) // you're next, evil proc --fira if(status_flags & GODMODE) return 0 @@ -53,9 +53,8 @@ if(!already_in_crit) new /datum/effects/crit/human(src) - if(knocked_out) + if(HAS_TRAIT(src, TRAIT_KNOCKEDOUT)) blinded = TRUE - set_stat(UNCONSCIOUS) if(regular_update && halloss > 0) apply_damage(-3, HALLOSS) else if(sleeping) diff --git a/code/modules/mob/living/carbon/human/life/handle_stasis_bag.dm b/code/modules/mob/living/carbon/human/life/handle_stasis_bag.dm index 9d257da720b9..16d9955395b0 100644 --- a/code/modules/mob/living/carbon/human/life/handle_stasis_bag.dm +++ b/code/modules/mob/living/carbon/human/life/handle_stasis_bag.dm @@ -4,6 +4,9 @@ //Handle side effects from stasis switch(in_stasis) if(STASIS_IN_BAG) + // I hate whoever wrote this and statuses with a passion knocked_down = knocked_down? --knocked_down : knocked_down + 10 //knocked_down set. + if(knocked_down <= 0) + knocked_down_callback() if(STASIS_IN_CRYO_CELL) if(sleeping < 10) sleeping += 10 //Puts the mob to sleep indefinitely. diff --git a/code/modules/mob/living/carbon/human/life/life_helpers.dm b/code/modules/mob/living/carbon/human/life/life_helpers.dm index fedeaf9fd48c..25f020a9f8b6 100644 --- a/code/modules/mob/living/carbon/human/life/life_helpers.dm +++ b/code/modules/mob/living/carbon/human/life/life_helpers.dm @@ -25,33 +25,6 @@ pressure_adjustment_coefficient = min(1, max(pressure_adjustment_coefficient, 0)) //So it isn't less than 0 or larger than 1. return pressure_adjustment_coefficient -//Calculate how much of the enviroment pressure-difference affects the human. -/mob/living/carbon/human/calculate_affecting_pressure(pressure) - var/pressure_difference - - //First get the absolute pressure difference. - if(pressure < ONE_ATMOSPHERE) //We are in an underpressure. - pressure_difference = ONE_ATMOSPHERE - pressure - - else //We are in an overpressure or standard atmosphere. - pressure_difference = pressure - ONE_ATMOSPHERE - - if(pressure_difference < 5) //If the difference is small, don't bother calculating the fraction. - pressure_difference = 0 - - else - //Otherwise calculate how much of that absolute pressure difference affects us, can be 0 to 1 (equals 0% to 100%). - //This is our relative difference. - pressure_difference *= get_pressure_weakness() - - //The difference is always positive to avoid extra calculations. - //Apply the relative difference on a standard atmosphere to get the final result. - //The return value will be the adjusted_pressure of the human that is the basis of pressure warnings and damage. - if(pressure < ONE_ATMOSPHERE) - return ONE_ATMOSPHERE - pressure_difference - else - return ONE_ATMOSPHERE + pressure_difference - /mob/living/carbon/human/proc/stabilize_body_temperature() @@ -320,9 +293,7 @@ emote("gasp") regenerate_icons() reload_fullscreens() - update_canmove() flash_eyes() apply_effect(10, EYE_BLUR) apply_effect(10, PARALYZE) - update_canmove() updatehealth() //One more time, so it doesn't show the target as dead on HUDs diff --git a/code/modules/mob/living/carbon/human/powers/human_powers.dm b/code/modules/mob/living/carbon/human/powers/human_powers.dm index b31d7cbcce76..be7848b2a936 100644 --- a/code/modules/mob/living/carbon/human/powers/human_powers.dm +++ b/code/modules/mob/living/carbon/human/powers/human_powers.dm @@ -9,7 +9,7 @@ if(last_special > world.time) return - if(is_mob_incapacitated() || lying || buckled) + if(is_mob_incapacitated() || buckled) to_chat(src, "You cannot tackle someone in your current state.") return @@ -27,7 +27,7 @@ if(last_special > world.time) return - if(is_mob_incapacitated() || lying || buckled) + if(is_mob_incapacitated() || buckled) to_chat(src, "You cannot tackle in your current state.") return @@ -56,7 +56,7 @@ if(last_special > world.time) return - if(is_mob_incapacitated() || lying || buckled) + if(is_mob_incapacitated() || body_position != STANDING_UP || buckled) to_chat(src, "You cannot leap in your current state.") return @@ -74,7 +74,7 @@ if(last_special > world.time) return - if(is_mob_incapacitated() || lying || buckled) + if(is_mob_incapacitated() || body_position != STANDING_UP || buckled) to_chat(src, "You cannot leap in your current state.") return @@ -110,7 +110,7 @@ if(last_special > world.time) return - if(is_mob_incapacitated(TRUE) || lying) + if(is_mob_incapacitated() || body_position != STANDING_UP) to_chat(src, SPAN_DANGER("You cannot do that in your current state.")) return @@ -193,13 +193,46 @@ /mob/living/verb/lay_down() set name = "Rest" set category = "IC" + set_resting(!resting, FALSE, TRUE) - if(!resting) - apply_effect(1, WEAKEN) //so that the mob immediately falls over - - resting = !resting +///Proc to hook behavior to the change of value in the resting variable. +/mob/living/proc/set_resting(new_resting, silent = TRUE, instant = FALSE) + if(!(mobility_flags & MOBILITY_REST)) + return + if(new_resting == resting) + return + if(!COOLDOWN_FINISHED(src, rest_cooldown)) + to_chat(src, SPAN_WARNING("You can't 'rest' that fast. Take a breather!")) + return + COOLDOWN_START(src, rest_cooldown, 1 SECONDS) + + . = resting + resting = new_resting + if(new_resting) + if(body_position == LYING_DOWN) + if(!silent) + to_chat(src, SPAN_NOTICE("You will now try to stay lying down on the floor.")) + else if(HAS_TRAIT(src, TRAIT_FORCED_STANDING) || (buckled && buckled.buckle_lying != NO_BUCKLE_LYING)) + if(!silent) + to_chat(src, SPAN_NOTICE("You will now lay down as soon as you are able to.")) + else + if(!silent) + to_chat(src, SPAN_NOTICE("You lay down.")) + set_lying_down() + else + if(body_position == STANDING_UP) + if(!silent) + to_chat(src, SPAN_NOTICE("You will now try to remain standing up.")) + else if(HAS_TRAIT(src, TRAIT_FLOORED) || (buckled && buckled.buckle_lying != NO_BUCKLE_LYING)) + if(!silent) + to_chat(src, SPAN_NOTICE("You will now stand up as soon as you are able to.")) + else + if(!silent) + to_chat(src, SPAN_NOTICE("You stand up.")) + get_up(instant) - to_chat(src, SPAN_NOTICE("You are now [resting ? "resting." : "getting up."]")) +// SEND_SIGNAL(src, COMSIG_LIVING_RESTING, new_resting, silent, instant) +// update_resting() // HUD icons /mob/living/carbon/human/proc/toggle_inherent_nightvison() set category = "Synthetic" diff --git a/code/modules/mob/living/carbon/human/species/monkey.dm b/code/modules/mob/living/carbon/human/species/monkey.dm index f1ef5d40ec69..8e8d2443293d 100644 --- a/code/modules/mob/living/carbon/human/species/monkey.dm +++ b/code/modules/mob/living/carbon/human/species/monkey.dm @@ -46,7 +46,7 @@ /datum/species/monkey/handle_npc(mob/living/carbon/human/H) if(H.stat != CONSCIOUS) return - if(prob(33) && isturf(H.loc) && !H.pulledby && !H.lying && !H.is_mob_restrained()) //won't move if being pulled + if(prob(33) && isturf(H.loc) && !H.pulledby && (H.mobility_flags & MOBILITY_MOVE) && !H.is_mob_restrained()) //won't move if being pulled step(H, pick(GLOB.cardinals)) var/obj/held = H.get_active_hand() diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 52f0a54b7a4f..397a478a2779 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -166,6 +166,13 @@ for(var/datum/internal_organ/I in H.internal_organs) I.mechanize() + // We just deleted the legs so they fell down. + // Update again now that the legs are back so they can stand properly during rest of species code and before outside updates kick in. + // I hate this code. + H.update_leg_status() + // While we're deep in shitcode we also force instant transition so this nonsense isn't visually noticeable + H.update_transform(instant_update = TRUE) + /datum/species/proc/initialize_pain(mob/living/carbon/human/H) if(pain_type) QDEL_NULL(H.pain) @@ -179,12 +186,7 @@ /datum/species/proc/hug(mob/living/carbon/human/H, mob/living/carbon/target, target_zone = "chest") if(H.flags_emote) return - var/t_him = "them" - switch(target.gender) - if(MALE) - t_him = "him" - if(FEMALE) - t_him = "her" + var/t_him = target.p_them() if(target_zone == "head") attempt_rock_paper_scissors(H, target) @@ -195,6 +197,9 @@ else if(target_zone in list("l_hand", "r_hand")) attempt_fist_bump(H, target) return + else if(H.body_position == LYING_DOWN) // Keep other interactions above lying check for maximum awkwardness potential + H.visible_message(SPAN_NOTICE("[H] waves at [target] to make [t_him] feel better!"), \ + SPAN_NOTICE("You wave at [target] to make [t_him] feel better!"), null, 4) else if(target_zone == "groin") H.visible_message(SPAN_NOTICE("[H] hugs [target] to make [t_him] feel better!"), \ SPAN_NOTICE("You hug [target] to make [t_him] feel better!"), null, 4) diff --git a/code/modules/mob/living/carbon/human/species/zombie.dm b/code/modules/mob/living/carbon/human/species/zombie.dm index 251816c03468..76b1c3928659 100644 --- a/code/modules/mob/living/carbon/human/species/zombie.dm +++ b/code/modules/mob/living/carbon/human/species/zombie.dm @@ -53,9 +53,6 @@ if(zombie.glasses) zombie.drop_inv_item_on_ground(zombie.glasses, FALSE, TRUE) if(zombie.wear_mask) zombie.drop_inv_item_on_ground(zombie.wear_mask, FALSE, TRUE) - if(zombie.lying) - zombie.lying = FALSE - var/obj/item/weapon/zombie_claws/ZC = new(zombie) ZC.icon_state = "claw_r" zombie.equip_to_slot_or_del(ZC, WEAR_R_HAND, TRUE) @@ -116,7 +113,7 @@ /datum/species/zombie/proc/revive_from_death(mob/living/carbon/human/zombie) if(zombie && zombie.loc && zombie.stat == DEAD) zombie.revive(TRUE) - zombie.stunned = 4 + zombie.apply_effect(4, STUN) zombie.make_jittery(500) zombie.visible_message(SPAN_WARNING("[zombie] rises from the ground!")) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 6aaf05ff9f12..c7427384f0a4 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -89,25 +89,6 @@ There are several things that need to be remembered: overlays -= I overlays_standing[cache_index] = null - -/mob/living/carbon/human/update_transform(force = FALSE) - if(lying == lying_prev && !force) - return - lying_prev = lying - var/matrix/new_matrix = matrix() - if(lying) - if(pulledby && pulledby.grab_level >= GRAB_CARRY) - new_matrix.Turn(90) - else - if(prob(50)) - new_matrix.Turn(90) - else - new_matrix.Turn(270) - new_matrix.Translate(rand(-10,10), rand(-10,10)) - apply_transform(new_matrix) - else - apply_transform(new_matrix) - /mob/living/carbon/human/UpdateDamageIcon() for(var/obj/limb/O in limbs) if(!(O.status & LIMB_DESTROYED)) @@ -131,6 +112,8 @@ There are several things that need to be remembered: //BASE MOB SPRITE /mob/living/carbon/human/proc/update_body() + update_leg_status() // Not icon ops, but placed here due to lack of a non-icons update_body + appearance_flags |= KEEP_TOGETHER // sanity update_damage_overlays() @@ -807,3 +790,11 @@ Applied by gun suicide and high impact bullet executions, removed by rejuvenate, /mob/living/carbon/human/on_immobilized_trait_loss(datum/source) . = ..() update_xeno_hostile_hud() + +/mob/living/carbon/human/on_floored_trait_gain(datum/source) + . = ..() + update_xeno_hostile_hud() + +/mob/living/carbon/human/on_floored_trait_loss(datum/source) + . = ..() + update_xeno_hostile_hud() diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm index cc76999358a2..e08a71f81e12 100644 --- a/code/modules/mob/living/carbon/update_icons.dm +++ b/code/modules/mob/living/carbon/update_icons.dm @@ -4,8 +4,3 @@ /mob/living/carbon/proc/remove_overlay(cache_index) return - -/mob/living/carbon/update_transform() - if(lying != lying_prev ) - lying_prev = lying //so we don't update overlays for lying/standing unless our stance changes again - update_icons() diff --git a/code/modules/mob/living/carbon/xenomorph/Embryo.dm b/code/modules/mob/living/carbon/xenomorph/Embryo.dm index ee948b8ef1e0..0d522c142f36 100644 --- a/code/modules/mob/living/carbon/xenomorph/Embryo.dm +++ b/code/modules/mob/living/carbon/xenomorph/Embryo.dm @@ -102,7 +102,7 @@ switch(stage) if(2) if(prob(4)) - if(affected_mob.knocked_out < 1) + if(!HAS_TRAIT(src, TRAIT_KNOCKEDOUT)) affected_mob.pain.apply_pain(PAIN_CHESTBURST_WEAK) affected_mob.visible_message(SPAN_DANGER("[affected_mob] starts shaking uncontrollably!"), \ SPAN_DANGER("You feel something moving inside you! You start shaking uncontrollably!")) @@ -123,7 +123,7 @@ else if(prob(2)) affected_mob.emote("[pick("sneeze", "cough")]") if(prob(5)) - if(affected_mob.knocked_out < 1) + if(!HAS_TRAIT(src, TRAIT_KNOCKEDOUT)) affected_mob.pain.apply_pain(PAIN_CHESTBURST_WEAK) affected_mob.visible_message(SPAN_DANGER("\The [affected_mob] starts shaking uncontrollably!"), \ SPAN_DANGER("You feel something moving inside you! You start shaking uncontrollably!")) @@ -139,7 +139,7 @@ if(prob(50)) affected_mob.emote("scream") if(prob(6)) - if(affected_mob.knocked_out < 1) + if(!HAS_TRAIT(src, TRAIT_KNOCKEDOUT)) affected_mob.pain.apply_pain(PAIN_CHESTBURST_WEAK) affected_mob.visible_message(SPAN_DANGER("[affected_mob] starts shaking uncontrollably!"), \ SPAN_DANGER("You feel something moving inside you! You start shaking uncontrollably!")) @@ -295,7 +295,7 @@ return victim.chestburst = TRUE to_chat(src, SPAN_DANGER("You start bursting out of [victim]'s chest!")) - if(victim.knocked_out < 1) + if(!HAS_TRAIT(src, TRAIT_KNOCKEDOUT)) victim.apply_effect(20, DAZE) victim.visible_message(SPAN_DANGER("\The [victim] starts shaking uncontrollably!"), \ SPAN_DANGER("You feel something ripping up your insides!")) diff --git a/code/modules/mob/living/carbon/xenomorph/Facehuggers.dm b/code/modules/mob/living/carbon/xenomorph/Facehuggers.dm index 997d84465332..3ed4bf036e12 100644 --- a/code/modules/mob/living/carbon/xenomorph/Facehuggers.dm +++ b/code/modules/mob/living/carbon/xenomorph/Facehuggers.dm @@ -116,8 +116,8 @@ attack_hand(user)//Not a carrier, or already full? Just pick it up. return XENO_NO_DELAY_ACTION -/obj/item/clothing/mask/facehugger/attack(mob/M, mob/user) - if(!can_hug(M, hivenumber) || !(M.is_mob_incapacitated() || M.lying || M.buckled && !isyautja(M))) +/obj/item/clothing/mask/facehugger/attack(mob/living/M, mob/user) + if(!can_hug(M, hivenumber) || !(M.is_mob_incapacitated() || M.body_position == LYING_DOWN || M.buckled && !isyautja(M))) to_chat(user, SPAN_WARNING("The facehugger refuses to attach.")) ..() return @@ -130,7 +130,7 @@ if(!do_after(user, 2 SECONDS, INTERRUPT_ALL, BUSY_ICON_HOSTILE, M, INTERRUPT_MOVED, BUSY_ICON_HOSTILE)) return - if(!can_hug(M, hivenumber) || !(M.is_mob_incapacitated() || M.lying || M.buckled)) + if(!can_hug(M, hivenumber) || !(M.is_mob_incapacitated() || M.body_position == LYING_DOWN || M.buckled)) return attach(M) @@ -525,7 +525,7 @@ var/catch_chance = 50 if(target.dir == GLOB.reverse_dir[hugger.dir]) catch_chance += 20 - if(target.lying) + if(target.body_position == LYING_DOWN) catch_chance -= 50 catch_chance -= ((target.maxHealth - target.health) / 3) if(target.get_active_hand()) diff --git a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm index 7b13e0010057..84eceb028349 100644 --- a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm +++ b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm @@ -150,7 +150,7 @@ //A simple handler for checking your state. Used in pretty much all the procs. /mob/living/carbon/xenomorph/proc/check_state(permissive = FALSE) if(!permissive) - if(is_mob_incapacitated() || lying || buckled || evolving || !isturf(loc)) + if(is_mob_incapacitated() || body_position == LYING_DOWN || buckled || evolving || !isturf(loc)) to_chat(src, SPAN_WARNING("You cannot do this in your current state.")) return FALSE else if(caste_type != XENO_CASTE_QUEEN && observed_xeno) @@ -319,7 +319,6 @@ if (pounceAction.freeze_self) if(pounceAction.freeze_play_sound) playsound(loc, rand(0, 100) < 95 ? 'sound/voice/alien_pounce.ogg' : 'sound/voice/alien_pounce2.ogg', 25, 1) - canmove = FALSE ADD_TRAIT(src, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Pounce")) pounceAction.freeze_timer_id = addtimer(CALLBACK(src, PROC_REF(unfreeze_pounce)), pounceAction.freeze_time, TIMER_STOPPABLE) pounceAction.additional_effects(M) @@ -556,7 +555,7 @@ if(!TC) TC = new(tackle_min + tackle_min_offset, tackle_max + tackle_max_offset, tackle_chance*tackle_mult) LAZYSET(tackle_counter, M, TC) - RegisterSignal(M, COMSIG_MOB_KNOCKED_DOWN, PROC_REF(tackle_handle_lying_changed)) + RegisterSignal(M, COMSIG_LIVING_SET_BODY_POSITION, PROC_REF(tackle_handle_lying_changed)) if (TC.tackle_reset_id) deltimer(TC.tackle_reset_id) @@ -568,8 +567,11 @@ else reset_tackle(M) -/mob/living/carbon/xenomorph/proc/tackle_handle_lying_changed(mob/M) +/mob/living/carbon/xenomorph/proc/tackle_handle_lying_changed(mob/living/M, body_position) SIGNAL_HANDLER + if(body_position != LYING_DOWN) + return + // Infected mobs do not have their tackle counter reset if // they get knocked down or get up from a knockdown if(M.status_flags & XENO_HOST) @@ -582,7 +584,7 @@ if (TC) qdel(TC) LAZYREMOVE(tackle_counter, M) - UnregisterSignal(M, COMSIG_MOB_KNOCKED_DOWN) + UnregisterSignal(M, COMSIG_LIVING_SET_BODY_POSITION) /mob/living/carbon/xenomorph/burn_skin(burn_amount) @@ -707,3 +709,6 @@ SSminimaps.remove_marker(src) add_minimap_marker() + +/mob/living/carbon/xenomorph/lying_angle_on_lying_down(new_lying_angle) + return // Do not rotate xenos around on the floor, their sprite is already top-down'ish diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm b/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm index 6f8ccd157481..35024d7304af 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm @@ -165,7 +165,6 @@ return REMOVE_TRAIT(H, TRAIT_IMMOBILIZED, trait_source) - H.update_canmove() if(ishuman(H)) var/mob/living/carbon/human/T = H diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/burrower/burrower_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/burrower/burrower_powers.dm index 8b8e3f9c86a3..6a2071fafc3b 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/burrower/burrower_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/burrower/burrower_powers.dm @@ -37,18 +37,14 @@ to_chat(src, SPAN_XENOWARNING("You burrow yourself into the ground.")) invisibility = 101 anchored = TRUE - density = FALSE if(caste.fire_immunity == FIRE_IMMUNITY_NONE) RegisterSignal(src, COMSIG_LIVING_PREIGNITION, PROC_REF(fire_immune)) RegisterSignal(src, list( COMSIG_LIVING_FLAMER_CROSSED, COMSIG_LIVING_FLAMER_FLAMED, ), PROC_REF(flamer_crossed_immune)) - ADD_TRAIT(src, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Burrow")) - ADD_TRAIT(src, TRAIT_ABILITY_BURROWED, TRAIT_SOURCE_ABILITY("Burrow")) - ADD_TRAIT(src, TRAIT_UNDENSE, TRAIT_SOURCE_ABILITY("Burrow")) + add_traits(list(TRAIT_ABILITY_BURROWED, TRAIT_UNDENSE, TRAIT_IMMOBILIZED), TRAIT_SOURCE_ABILITY("Burrow")) playsound(src.loc, 'sound/effects/burrowing_b.ogg', 25) - update_canmove() update_icons() addtimer(CALLBACK(src, PROC_REF(do_burrow_cooldown)), (caste ? caste.burrow_cooldown : 5 SECONDS)) burrow_timer = world.time + 90 // How long we can be burrowed @@ -74,19 +70,15 @@ COMSIG_LIVING_FLAMER_CROSSED, COMSIG_LIVING_FLAMER_FLAMED, )) - REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Burrow")) - REMOVE_TRAIT(src, TRAIT_ABILITY_BURROWED, TRAIT_SOURCE_ABILITY("Burrow")) - REMOVE_TRAIT(src, TRAIT_UNDENSE, TRAIT_SOURCE_ABILITY("Burrow")) + remove_traits(list(TRAIT_ABILITY_BURROWED, TRAIT_UNDENSE, TRAIT_IMMOBILIZED), TRAIT_SOURCE_ABILITY("Burrow")) invisibility = FALSE anchored = FALSE - density = TRUE playsound(loc, 'sound/effects/burrowoff.ogg', 25) for(var/mob/living/carbon/mob in loc) if(!can_not_harm(mob)) mob.apply_effect(2, WEAKEN) addtimer(CALLBACK(src, PROC_REF(do_burrow_cooldown)), (caste ? caste.burrow_cooldown : 5 SECONDS)) - update_canmove() update_icons() /mob/living/carbon/xenomorph/proc/do_burrow_cooldown() diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/crusher/crusher_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/crusher/crusher_abilities.dm index 6405428de7cb..63051a94efa9 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/crusher/crusher_abilities.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/crusher/crusher_abilities.dm @@ -120,6 +120,10 @@ var/momentum = 0 +/datum/action/xeno_action/onclick/charger_charge/proc/handle_position_change(mob/living/carbon/xenomorph/xeno, body_position) + SIGNAL_HANDLER + if(body_position == LYING_DOWN) + handle_movement(xeno) /datum/action/xeno_action/onclick/charger_charge/proc/handle_movement(mob/living/carbon/xenomorph/Xeno, atom/oldloc, dir, forced) SIGNAL_HANDLER @@ -178,7 +182,7 @@ playsound(Xeno, 'sound/effects/alien_footstep_charge1.ogg', 50) for(var/mob/living/carbon/human/Mob in Xeno.loc) - if(Mob.lying && Mob.stat != DEAD) + if(Mob.body_position == LYING_DOWN && Mob.stat != DEAD) Xeno.visible_message(SPAN_DANGER("[Xeno] runs [Mob] over!"), SPAN_DANGER("You run [Mob] over!") ) diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/crusher/crusher_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/crusher/crusher_powers.dm index ce4a631e281f..34a9a4833fec 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/crusher/crusher_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/crusher/crusher_powers.dm @@ -252,7 +252,7 @@ to_chat(Xeno, SPAN_XENONOTICE("You will [will_charge] charge when moving.")) if(activated) RegisterSignal(Xeno, COMSIG_MOVABLE_MOVED, PROC_REF(handle_movement)) - RegisterSignal(Xeno, COMSIG_MOB_KNOCKED_DOWN, PROC_REF(handle_movement)) + RegisterSignal(Xeno, COMSIG_LIVING_SET_BODY_POSITION, PROC_REF(handle_position_change)) RegisterSignal(Xeno, COMSIG_ATOM_DIR_CHANGE, PROC_REF(handle_dir_change)) RegisterSignal(Xeno, COMSIG_XENO_RECALCULATE_SPEED, PROC_REF(update_speed)) RegisterSignal(Xeno, COMSIG_XENO_STOP_MOMENTUM, PROC_REF(stop_momentum)) @@ -264,7 +264,7 @@ stop_momentum() UnregisterSignal(Xeno, list( COMSIG_MOVABLE_MOVED, - COMSIG_MOB_KNOCKED_DOWN, + COMSIG_LIVING_SET_BODY_POSITION, COMSIG_ATOM_DIR_CHANGE, COMSIG_XENO_RECALCULATE_SPEED, COMSIG_MOVABLE_ENTERED_RIVER, diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/defender/defender_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/defender/defender_powers.dm index 249271c5f050..0709f2b17717 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/defender/defender_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/defender/defender_powers.dm @@ -220,7 +220,6 @@ ADD_TRAIT(X, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Fortify")) X.anchored = TRUE X.small_explosives_stun = FALSE - X.update_canmove() RegisterSignal(owner, COMSIG_XENO_PRE_CALCULATE_ARMOURED_DAMAGE_PROJECTILE, PROC_REF(check_directional_armor)) X.mob_size = MOB_SIZE_IMMOBILE //knockback immune X.mob_flags &= ~SQUEEZE_UNDER_VEHICLES @@ -242,7 +241,6 @@ UnregisterSignal(owner, COMSIG_XENO_PRE_CALCULATE_ARMOURED_DAMAGE_PROJECTILE) X.mob_size = MOB_SIZE_XENO //no longer knockback immune X.mob_flags |= SQUEEZE_UNDER_VEHICLES - X.update_canmove() X.update_icons() X.fortify = FALSE diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/general_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/general_abilities.dm index 5e3ab3b0afd9..00a7ceaba97e 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/general_abilities.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/general_abilities.dm @@ -252,7 +252,6 @@ return var/mob/living/carbon/xenomorph/X = owner REMOVE_TRAIT(X, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Pounce")) - X.update_canmove() deltimer(freeze_timer_id) freeze_timer_id = TIMER_ID_NULL to_chat(X, SPAN_XENONOTICE("Slashing frenzies you! You feel free to move immediately!")) @@ -285,7 +284,7 @@ /datum/action/xeno_action/onclick/toggle_long_range/can_use_action() var/mob/living/carbon/xenomorph/xeno = owner - if(xeno && !xeno.is_mob_incapacitated() && !xeno.lying && !xeno.buckled) + if(xeno && !xeno.is_mob_incapacitated() && !xeno.buckled) return TRUE /datum/action/xeno_action/onclick/toggle_long_range/give_to(mob/living/living_mob) @@ -542,6 +541,14 @@ hide_from(owner) +/datum/action/xeno_action/onclick/tacmap/can_use_action() + if(!owner) + return FALSE + var/mob/living/carbon/xenomorph/xeno = owner + if(xeno.is_mob_incapacitated() || xeno.dazed) + return FALSE + return TRUE + /datum/action/xeno_action/onclick/tacmap/use_ability(atom/target) var/mob/living/carbon/xenomorph/xeno = owner xeno.xeno_tacmap() diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/general_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/general_powers.dm index f362be4358e3..94c0110fc68f 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/general_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/general_powers.dm @@ -413,7 +413,6 @@ if (!windup_interruptable) ADD_TRAIT(X, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Pounce")) X.anchored = TRUE - X.update_canmove() pre_windup_effects() if (!do_after(X, windup_duration, INTERRUPT_NO_NEEDHAND, BUSY_ICON_HOSTILE)) @@ -421,14 +420,12 @@ if (!windup_interruptable) REMOVE_TRAIT(X, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Pounce")) X.anchored = FALSE - X.update_canmove() post_windup_effects(interrupted = TRUE) return if (!windup_interruptable) REMOVE_TRAIT(X, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Pounce")) X.anchored = FALSE - X.update_canmove() post_windup_effects() X.visible_message(SPAN_XENOWARNING("\The [X] [ability_name][findtext(ability_name, "e", -1) || findtext(ability_name, "p", -1) ? "s" : "es"] at [A]!"), SPAN_XENOWARNING("You [ability_name] at [A]!")) diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/hivelord/hivelord_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/hivelord/hivelord_abilities.dm index 8c39228e3567..02e7fd814453 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/hivelord/hivelord_abilities.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/hivelord/hivelord_abilities.dm @@ -18,7 +18,7 @@ /datum/action/xeno_action/active_toggle/toggle_speed/can_use_action() var/mob/living/carbon/xenomorph/hivelord/xeno = owner - if(xeno && !xeno.is_mob_incapacitated() && !xeno.lying && !xeno.buckled) + if(xeno && !xeno.is_mob_incapacitated() && xeno.body_position == STANDING_UP && !xeno.buckled) // do we rly need standing up? return TRUE /datum/action/xeno_action/active_toggle/toggle_speed/give_to(mob/living/living_mob) diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/lurker/lurker_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/lurker/lurker_powers.dm index 13734a5b9cf4..0c2b226cb268 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/lurker/lurker_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/lurker/lurker_powers.dm @@ -268,7 +268,7 @@ if(xeno.can_not_harm(target_carbon)) return - if(!(target_carbon.knocked_out || target_carbon.stat == UNCONSCIOUS)) //called knocked out because for some reason .stat seems to have a delay . + if(!(HAS_TRAIT(target_carbon, TRAIT_KNOCKEDOUT) || target_carbon.stat == UNCONSCIOUS)) //called knocked out because for some reason .stat seems to have a delay . to_chat(xeno, SPAN_XENOHIGHDANGER("You can only headbite an unconscious, adjacent target!")) return diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_powers.dm index 8fe8121a6d48..85a9ee8f054b 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_powers.dm @@ -174,9 +174,7 @@ var/root_duration = buffed ? root_duration_buffed : root_duration_unbuffed vanguard_user.visible_message(SPAN_XENODANGER("[vanguard_user] slams [target_atom] into the ground!"), SPAN_XENOHIGHDANGER("You slam [target_atom] into the ground!")) - ADD_TRAIT(target_carbon, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Cleave")) - target_carbon.update_canmove() if (ishuman(target_carbon)) var/mob/living/carbon/human/Hu = target_carbon @@ -293,7 +291,6 @@ var/throw_target_turf = get_step(xeno.loc, facing) ADD_TRAIT(xeno, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Abduct")) - xeno.update_canmove() if(!do_after(xeno, windup, INTERRUPT_NO_NEEDHAND, BUSY_ICON_HOSTILE, numticks = 1)) to_chat(xeno, SPAN_XENOWARNING("You relax your tail.")) apply_cooldown() @@ -303,7 +300,6 @@ qdel(xenotelegraph) REMOVE_TRAIT(xeno, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Abduct")) - xeno.update_canmove() return @@ -311,7 +307,6 @@ return REMOVE_TRAIT(xeno, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Abduct")) - xeno.update_canmove() playsound(get_turf(xeno), 'sound/effects/bang.ogg', 25, 0) xeno.visible_message(SPAN_XENODANGER("\The [xeno] suddenly uncoils its tail, firing it towards [atom]!"), SPAN_XENODANGER("You uncoil your tail, sending it out towards \the [atom]!")) @@ -339,13 +334,11 @@ new /datum/effects/xeno_slow(target, xeno, , ,25) target.apply_effect(1, SLOW) else if (LAZYLEN(targets) == 2) - ADD_TRAIT(target, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Abduct")) - target.update_canmove() if (ishuman(target)) - var/mob/living/carbon/human/human = target - human.update_xeno_hostile_hud() - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(unroot_human), target), get_xeno_stun_duration(target, 25)) + var/mob/living/carbon/human/target_human = target + target_human.update_xeno_hostile_hud() + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(unroot_human), target, TRAIT_SOURCE_ABILITY("Abduct")), get_xeno_stun_duration(target, 25)) to_chat(target, SPAN_XENOHIGHDANGER("[xeno] has pinned you to the ground! You cannot move!")) target.set_effect(2, DAZE) @@ -409,10 +402,9 @@ oppressor_user.animation_attack_on(target_carbon) oppressor_user.flick_attack_overlay(target_carbon, "punch") - if (HAS_TRAIT(target_carbon, TRAIT_IMMOBILIZED) || target_carbon.slowed || target_carbon.knocked_down) + if (!(target_carbon.mobility_flags & MOBILITY_MOVE) || !(target_carbon.mobility_flags & MOBILITY_STAND) || target_carbon.slowed) target_carbon.apply_damage(get_xeno_damage_slash(target_carbon, damage), BRUTE, target_limb? target_limb.name : "chest") ADD_TRAIT(target_carbon, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Oppressor Punch")) - target_carbon.update_canmove() if (ishuman(target_carbon)) var/mob/living/carbon/human/Hu = target_carbon @@ -1013,7 +1005,6 @@ throw_target_turf = behind_turf ADD_TRAIT(X, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Praetorian Retrieve")) - X.update_canmove() if(windup) if(!do_after(X, windup, INTERRUPT_NO_NEEDHAND, BUSY_ICON_HOSTILE, numticks = 1)) to_chat(X, SPAN_XENOWARNING("You cancel your retrieve.")) @@ -1024,12 +1015,10 @@ qdel(XT) REMOVE_TRAIT(X, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Praetorian Retrieve")) - X.update_canmove() return REMOVE_TRAIT(X, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Praetorian Retrieve")) - X.update_canmove() playsound(get_turf(X), 'sound/effects/bang.ogg', 25, 0) diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_powers.dm index a26cc922c528..3c475743c0bf 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_powers.dm @@ -79,7 +79,6 @@ for(var/mob/living/carbon/carbon in oview(round(behavior.kills * 0.5 + 2), xeno)) if(!xeno.can_not_harm(carbon) && carbon.stat != DEAD) ADD_TRAIT(carbon, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Smash")) - carbon.update_canmove() if (ishuman(carbon)) var/mob/living/carbon/human/human = carbon @@ -126,7 +125,6 @@ return ADD_TRAIT(carbon, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Devastate")) - carbon.update_canmove() if (ishuman(carbon)) var/mob/living/carbon/human/human = carbon @@ -136,7 +134,6 @@ ADD_TRAIT(xeno, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Devastate")) xeno.anchored = TRUE - xeno.update_canmove() if (do_after(xeno, activation_delay, INTERRUPT_ALL | BEHAVIOR_IMMOBILE, BUSY_ICON_HOSTILE)) xeno.visible_message(SPAN_XENOHIGHDANGER("[xeno] rips open the guts of [carbon]!"), SPAN_XENOHIGHDANGER("You rip open the guts of [carbon]!")) @@ -154,9 +151,6 @@ REMOVE_TRAIT(xeno, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Devastate")) xeno.anchored = FALSE unroot_human(carbon, TRAIT_SOURCE_ABILITY("Devastate")) - xeno.update_canmove() - - unroot_human(carbon) xeno.visible_message(SPAN_XENODANGER("[xeno] rapidly slices into [carbon]!")) diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/ravager/ravager_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/ravager/ravager_powers.dm index 34e84866304b..22f119faf234 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/ravager/ravager_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/ravager/ravager_powers.dm @@ -388,7 +388,6 @@ ADD_TRAIT(xeno, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Eviscerate")) xeno.anchored = TRUE - xeno.update_canmove() if (do_after(xeno, (activation_delay - windup_reduction), INTERRUPT_ALL | BEHAVIOR_IMMOBILE, BUSY_ICON_HOSTILE)) xeno.emote("roar") @@ -433,7 +432,6 @@ REMOVE_TRAIT(xeno, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Eviscerate")) xeno.anchored = FALSE - xeno.update_canmove() return ..() diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/xeno_action.dm b/code/modules/mob/living/carbon/xenomorph/abilities/xeno_action.dm index e0d1db45c9a7..11b8f0db0075 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/xeno_action.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/xeno_action.dm @@ -71,7 +71,7 @@ if(!owner) return FALSE var/mob/living/carbon/xenomorph/X = owner - if(X && !X.is_mob_incapacitated() && !X.dazed && !X.lying && !X.buckled && X.plasma_stored >= plasma_cost) + if(X && !X.is_mob_incapacitated() && !X.dazed && X.body_position == STANDING_UP && !X.buckled && X.plasma_stored >= plasma_cost) return TRUE /datum/action/xeno_action/give_to(mob/living/L) diff --git a/code/modules/mob/living/carbon/xenomorph/attack_alien.dm b/code/modules/mob/living/carbon/xenomorph/attack_alien.dm index ba8099cea404..0ad84fc49e42 100644 --- a/code/modules/mob/living/carbon/xenomorph/attack_alien.dm +++ b/code/modules/mob/living/carbon/xenomorph/attack_alien.dm @@ -209,7 +209,7 @@ SPAN_DANGER("You tackle down [src]!"), null, 5, CHAT_TYPE_XENO_COMBAT) else playsound(loc, 'sound/weapons/alien_claw_swipe.ogg', 25, 1) - if (knocked_down) + if (HAS_TRAIT(src, TRAIT_FLOORED)) M.visible_message(SPAN_DANGER("[M] tries to tackle [src], but they are already down!"), \ SPAN_DANGER("You try to tackle [src], but they are already down!"), null, 5, CHAT_TYPE_XENO_COMBAT) else @@ -555,7 +555,7 @@ if(M.action_busy) return XENO_NO_DELAY_ACTION - if(M.lying) + if(M.is_mob_incapacitated() || M.body_position != STANDING_UP) return XENO_NO_DELAY_ACTION var/delay @@ -574,7 +574,7 @@ if(do_after(M, delay, INTERRUPT_ALL, BUSY_ICON_HOSTILE)) if(M.loc != cur_loc) return XENO_NO_DELAY_ACTION //Make sure we're still there - if(M.lying) + if(M.is_mob_incapacitated() || M.body_position != STANDING_UP) return XENO_NO_DELAY_ACTION if(locked) to_chat(M, SPAN_WARNING("[src] is bolted down tight.")) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Burrower.dm b/code/modules/mob/living/carbon/xenomorph/castes/Burrower.dm index e7118164cf07..ee882bc14fdf 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Burrower.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Burrower.dm @@ -84,13 +84,6 @@ . = ..() sight |= SEE_TURFS -/mob/living/carbon/xenomorph/burrower/update_canmove() - . = ..() - if(HAS_TRAIT(src, TRAIT_ABILITY_BURROWED)) - density = FALSE - canmove = FALSE - return canmove - /mob/living/carbon/xenomorph/burrower/ex_act(severity) if(HAS_TRAIT(src, TRAIT_ABILITY_BURROWED)) return diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Carrier.dm b/code/modules/mob/living/carbon/xenomorph/castes/Carrier.dm index c13555cba12c..07f161f4c6f7 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Carrier.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Carrier.dm @@ -117,8 +117,8 @@ for(var/i in hugger_image_index) if(stat == DEAD) hugger_overlays_icon.overlays += icon(icon, "clinger_[i] Knocked Down") - else if(lying) - if((resting || sleeping) && (!knocked_down && !knocked_out && health > 0)) + else if(body_position == LYING_DOWN) + if(!HAS_TRAIT(src, TRAIT_INCAPACITATED) && !HAS_TRAIT(src, TRAIT_FLOORED)) hugger_overlays_icon.overlays += icon(icon, "clinger_[i] Sleeping") else hugger_overlays_icon.overlays +=icon(icon, "clinger_[i] Knocked Down") @@ -162,8 +162,8 @@ i = 1 if(stat != DEAD) - if(lying) - if((resting || sleeping) && (!knocked_down && !knocked_out && health > 0)) + if(body_position == LYING_DOWN) + if(!HAS_TRAIT(src, TRAIT_INCAPACITATED) && !HAS_TRAIT(src, TRAIT_FLOORED)) eggsac_overlays_icon.overlays += icon(icon, "eggsac_[i] Sleeping") else eggsac_overlays_icon.overlays +=icon(icon, "eggsac_[i] Knocked Down") diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Facehugger.dm b/code/modules/mob/living/carbon/xenomorph/castes/Facehugger.dm index c9ceaaa85cfb..3e01cc2af139 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Facehugger.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Facehugger.dm @@ -70,7 +70,7 @@ if(stat == DEAD) return ..() - if(!lying && !(mutation_type == FACEHUGGER_WATCHER) && !(locate(/obj/effect/alien/weeds) in get_turf(src))) + if(body_position == STANDING_UP && !(mutation_type == FACEHUGGER_WATCHER) && !(locate(/obj/effect/alien/weeds) in get_turf(src))) adjustBruteLoss(1) return ..() @@ -86,8 +86,8 @@ if(stat == DEAD) icon_state = "[mutation_type] [caste.caste_type] Dead" - else if(lying) - if((resting || sleeping) && (!knocked_down && !knocked_out && health > 0)) + else if(body_position == LYING_DOWN) + if(!HAS_TRAIT(src, TRAIT_INCAPACITATED) && !HAS_TRAIT(src, TRAIT_FLOORED)) icon_state = "[mutation_type] [caste.caste_type] Sleeping" else icon_state = "[mutation_type] [caste.caste_type] Knocked Down" @@ -110,8 +110,8 @@ if(!caste) return FALSE - if(lying) //No attacks while laying down - return FALSE + if(body_position == LYING_DOWN) //No attacks while laying down + return FALSE // Yoooo replace this by a mobility_flag for attacks or something if(istype(A, /obj/effect/alien/resin/special/eggmorph)) var/obj/effect/alien/resin/special/eggmorph/morpher = A @@ -130,7 +130,7 @@ if(ishuman(A)) var/mob/living/carbon/human/human = A - if(!human.lying) + if(human.body_position != LYING_DOWN) to_chat(src, SPAN_WARNING("You can't reach \the [human], they need to be lying down.")) return if(!can_hug(human, hivenumber)) @@ -139,7 +139,7 @@ visible_message(SPAN_WARNING("\The [src] starts climbing onto \the [human]'s face..."), SPAN_XENONOTICE("You start climbing onto \the [human]'s face...")) if(!do_after(src, FACEHUGGER_WINDUP_DURATION, INTERRUPT_ALL, BUSY_ICON_HOSTILE, human, INTERRUPT_MOVED, BUSY_ICON_HOSTILE)) return - if(!human.lying) + if(human.body_position != LYING_DOWN) to_chat(src, SPAN_WARNING("You can't reach \the [human], they need to be lying down.")) return if(!can_hug(human, hivenumber)) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Larva.dm b/code/modules/mob/living/carbon/xenomorph/castes/Larva.dm index 82d80752ec54..816e6020c30f 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Larva.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Larva.dm @@ -130,8 +130,8 @@ else if(handcuffed || legcuffed) icon_state = "[state_override || state]Larva Cuff" - else if(lying) - if((resting || sleeping) && (!knocked_down && !knocked_out && health > 0)) + else if(body_position == LYING_DOWN) + if(!HAS_TRAIT(src, TRAIT_INCAPACITATED) && !HAS_TRAIT(src, TRAIT_FLOORED)) icon_state = "[state_override || state]Larva Sleeping" else icon_state = "[state_override || state]Larva Stunned" @@ -155,7 +155,7 @@ if(!caste) return FALSE - if(lying) //No attacks while laying down + if(body_position) //No attacks while laying down return FALSE A.attack_larva(src) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Lurker.dm b/code/modules/mob/living/carbon/xenomorph/castes/Lurker.dm index 1c7ba8503d4d..a34913b2ff5c 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Lurker.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Lurker.dm @@ -102,7 +102,7 @@ if (!isxeno_human(target_carbon)) return - if (target_carbon.knocked_down) + if (HAS_TRAIT(target_carbon, TRAIT_FLOORED)) new /datum/effects/xeno_slow(target_carbon, bound_xeno, null, null, get_xeno_stun_duration(target_carbon, slash_slow_duration)) return diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm b/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm index b83b33e2eee5..e6f4dfae8a44 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm @@ -791,6 +791,9 @@ if(ovipositor) return //sanity check ovipositor = TRUE + ADD_TRAIT(src, TRAIT_IMMOBILIZED, OVIPOSITOR_TRAIT) + set_body_position(STANDING_UP) + set_resting(FALSE) set_resin_build_order(GLOB.resin_build_order_ovipositor) // This needs to occur before we update the abilities so we can update the choose resin icon for(var/datum/action/xeno_action/action in actions) @@ -843,7 +846,6 @@ egg_planting_range = 3 anchored = TRUE resting = FALSE - update_canmove() update_icons() bubble_icon_x_offset = 32 bubble_icon_y_offset = 32 @@ -871,6 +873,7 @@ if(!ovipositor) return ovipositor = FALSE + REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, OVIPOSITOR_TRAIT) update_icons() bubble_icon_x_offset = initial(bubble_icon_x_offset) bubble_icon_y_offset = initial(bubble_icon_y_offset) @@ -899,7 +902,6 @@ ovi_ability.apply_cooldown() break anchored = FALSE - update_canmove() for(var/mob/living/carbon/xenomorph/L in hive.xeno_leader_list) L.handle_xeno_leader_pheromones() @@ -909,14 +911,6 @@ SEND_SIGNAL(src, COMSIG_QUEEN_DISMOUNT_OVIPOSITOR, instant_dismount) -/mob/living/carbon/xenomorph/queen/update_canmove() - . = ..() - if(ovipositor) - lying = FALSE - density = TRUE - canmove = FALSE - return canmove - /mob/living/carbon/xenomorph/queen/handle_special_state() if(ovipositor) return TRUE diff --git a/code/modules/mob/living/carbon/xenomorph/damage_procs.dm b/code/modules/mob/living/carbon/xenomorph/damage_procs.dm index 51ceee153368..b6ceb2043458 100644 --- a/code/modules/mob/living/carbon/xenomorph/damage_procs.dm +++ b/code/modules/mob/living/carbon/xenomorph/damage_procs.dm @@ -36,7 +36,7 @@ /mob/living/carbon/xenomorph/ex_act(severity, direction, datum/cause_data/cause_data, pierce=0) - if(lying) + if(body_position == LYING_DOWN) severity *= EXPLOSION_PRONE_MULTIPLIER if(severity >= 30) diff --git a/code/modules/mob/living/carbon/xenomorph/life.dm b/code/modules/mob/living/carbon/xenomorph/life.dm index 09a4f5014bc4..f794c051dbff 100644 --- a/code/modules/mob/living/carbon/xenomorph/life.dm +++ b/code/modules/mob/living/carbon/xenomorph/life.dm @@ -10,7 +10,8 @@ ..() - if(is_zoomed && (stat || lying)) + // replace this by signals or trait signals + if(is_zoomed && (stat || body_position == LYING_DOWN)) zoom_out() if(stat != DEAD) //Stop if dead. Performance boost @@ -23,7 +24,6 @@ handle_regular_status_updates() handle_stomach_contents() handle_overwatch() // For new Xeno hivewide overwatch - Fourk, 6/24/19 - update_canmove() update_icons() handle_luminosity() handle_blood() @@ -187,9 +187,8 @@ ear_damage = 0 SetEyeBlind(0) - if(knocked_out) //If they're down, make sure they are actually down. + if(HAS_TRAIT(src, TRAIT_KNOCKEDOUT)) //If they're down, make sure they are actually down. blinded = TRUE - set_stat(UNCONSCIOUS) if(regular_update && halloss > 0) apply_damage(-3, HALLOSS) else if(sleeping) @@ -342,7 +341,7 @@ Make sure their actual health updates immediately.*/ if(recovery_aura) plasma_stored += round(plasma_gain * plasma_max / 100 * recovery_aura/4) //Divided by four because it gets massive fast. 1 is equivalent to weed regen! Only the strongest pheromones should bypass weeds if(health < maxHealth && !hardcore && is_hive_living(hive) && last_hit_time + caste.heal_delay_time <= world.time) - if(lying || resting) + if(body_position == LYING_DOWN || resting) if(health < 0) //Unconscious heal_wounds(caste.heal_knocked_out * regeneration_multiplier, recoveryActual) //Healing is much slower. Warding pheromones make up for the rest if you're curious else @@ -536,8 +535,6 @@ Make sure their actual health updates immediately.*/ if(layer != initial(layer)) //Unhide layer = initial(layer) recalculate_move_delay = TRUE - if(!lying) - update_canmove() /mob/living/carbon/xenomorph/proc/handle_luminosity() var/new_luminosity = 0 @@ -583,16 +580,14 @@ Make sure their actual health updates immediately.*/ return superslowed /mob/living/carbon/xenomorph/handle_knocked_down() - if(knocked_down) + if(HAS_TRAIT(src, TRAIT_FLOORED)) adjust_effect(life_knockdown_reduction, WEAKEN, EFFECT_FLAG_LIFE) knocked_down_callback_check() - return knocked_down /mob/living/carbon/xenomorph/handle_knocked_out() - if(knocked_out) + if(HAS_TRAIT(src, TRAIT_KNOCKEDOUT)) adjust_effect(life_knockout_reduction, PARALYZE, EFFECT_FLAG_LIFE) knocked_out_callback_check() - return knocked_out //Returns TRUE if xeno is on weeds //Returns TRUE if xeno is off weeds AND doesn't need weeds for healing AND is not on Almayer UNLESS Queen is also on Almayer (aka - no solo Lurker Almayer hero) diff --git a/code/modules/mob/living/carbon/xenomorph/mutators/strains/crusher/charger.dm b/code/modules/mob/living/carbon/xenomorph/mutators/strains/crusher/charger.dm index b455cbf9e0a4..1fc746829acd 100644 --- a/code/modules/mob/living/carbon/xenomorph/mutators/strains/crusher/charger.dm +++ b/code/modules/mob/living/carbon/xenomorph/mutators/strains/crusher/charger.dm @@ -82,7 +82,7 @@ return /datum/behavior_delegate/crusher_charger/on_update_icons() - if(HAS_TRAIT(bound_xeno, TRAIT_CHARGING) && !bound_xeno.lying) + if(HAS_TRAIT(bound_xeno, TRAIT_CHARGING) && bound_xeno.body_position == STANDING_UP) bound_xeno.icon_state = "[bound_xeno.mutation_icon_state || bound_xeno.mutation_type] Crusher Charging" return TRUE diff --git a/code/modules/mob/living/carbon/xenomorph/mutators/strains/drone/gardener.dm b/code/modules/mob/living/carbon/xenomorph/mutators/strains/drone/gardener.dm index 303e1c94692d..c11f0e11f399 100644 --- a/code/modules/mob/living/carbon/xenomorph/mutators/strains/drone/gardener.dm +++ b/code/modules/mob/living/carbon/xenomorph/mutators/strains/drone/gardener.dm @@ -379,8 +379,8 @@ if(bound_xeno.stat == DEAD) fruit_sac_overlay_icon.icon_state = "Gardener Drone Dead" - else if(bound_xeno.lying) - if((bound_xeno.resting || bound_xeno.sleeping) && (!bound_xeno.knocked_down && !bound_xeno.knocked_out && bound_xeno.health > 0)) + else if(bound_xeno.body_position == LYING_DOWN) + if(!HAS_TRAIT(bound_xeno, TRAIT_INCAPACITATED) && !HAS_TRAIT(bound_xeno, TRAIT_FLOORED)) fruit_sac_overlay_icon.icon_state = "Gardener Drone Sleeping" else fruit_sac_overlay_icon.icon_state = "Gardener Drone Knocked Down" diff --git a/code/modules/mob/living/carbon/xenomorph/mutators/strains/drone/healer.dm b/code/modules/mob/living/carbon/xenomorph/mutators/strains/drone/healer.dm index 5caab38529e6..2e562ceac6a9 100644 --- a/code/modules/mob/living/carbon/xenomorph/mutators/strains/drone/healer.dm +++ b/code/modules/mob/living/carbon/xenomorph/mutators/strains/drone/healer.dm @@ -160,8 +160,8 @@ if(bound_xeno.stat == DEAD) salve_applied_icon.icon_state = "Healer Drone Dead" - else if(bound_xeno.lying) - if((bound_xeno.resting || bound_xeno.sleeping) && (!bound_xeno.knocked_down && !bound_xeno.knocked_out && bound_xeno.health > 0)) + else if(bound_xeno.body_position == LYING_DOWN) + if(!HAS_TRAIT(bound_xeno, TRAIT_INCAPACITATED) && !HAS_TRAIT(bound_xeno, TRAIT_FLOORED)) salve_applied_icon.icon_state = "Healer Drone Sleeping" else salve_applied_icon.icon_state = "Healer Drone Knocked Down" diff --git a/code/modules/mob/living/carbon/xenomorph/mutators/strains/praetorian/oppressor.dm b/code/modules/mob/living/carbon/xenomorph/mutators/strains/praetorian/oppressor.dm index ecb0e1eff51e..4beaedf8d6a8 100644 --- a/code/modules/mob/living/carbon/xenomorph/mutators/strains/praetorian/oppressor.dm +++ b/code/modules/mob/living/carbon/xenomorph/mutators/strains/praetorian/oppressor.dm @@ -52,14 +52,12 @@ var/tearing_damage = 15 /datum/behavior_delegate/oppressor_praetorian/melee_attack_additional_effects_target(mob/living/carbon/target_carbon) - if(target_carbon.stat == DEAD) return - if(!(target_carbon.knocked_down || HAS_TRAIT(target_carbon, TRAIT_IMMOBILIZED) || target_carbon.slowed)) - return + // impaired in some capacity + if(!(target_carbon.mobility_flags & MOBILITY_STAND) || !(target_carbon.mobility_flags & MOBILITY_MOVE) || target_carbon.slowed) + target_carbon.apply_armoured_damage(get_xeno_damage_slash(target_carbon, tearing_damage), ARMOR_MELEE, BRUTE, bound_xeno.zone_selected ? bound_xeno.zone_selected : "chest") + target_carbon.visible_message(SPAN_DANGER("[bound_xeno] tears into [target_carbon]!")) + playsound(bound_xeno, 'sound/weapons/alien_tail_attack.ogg', 25, TRUE) - target_carbon.apply_armoured_damage(get_xeno_damage_slash(target_carbon, tearing_damage), ARMOR_MELEE, BRUTE, bound_xeno.zone_selected ? bound_xeno.zone_selected : "chest") - target_carbon.visible_message(SPAN_DANGER("[bound_xeno] tears into [target_carbon]!")) - playsound(bound_xeno, 'sound/weapons/alien_tail_attack.ogg', 25, TRUE) - return diff --git a/code/modules/mob/living/carbon/xenomorph/mutators/strains/runner/acid.dm b/code/modules/mob/living/carbon/xenomorph/mutators/strains/runner/acid.dm index 630edf26d353..490e5ca36cba 100644 --- a/code/modules/mob/living/carbon/xenomorph/mutators/strains/runner/acid.dm +++ b/code/modules/mob/living/carbon/xenomorph/mutators/strains/runner/acid.dm @@ -87,7 +87,7 @@ if(embryo?.stage >= 4) //very late stage hugged in case the runner unnests them return - if(target_mob.lying) + if(target_mob.body_position == LYING_DOWN) modify_acid(acid_slash_regen_lying) return modify_acid(acid_slash_regen_standing) diff --git a/code/modules/mob/living/carbon/xenomorph/update_icons.dm b/code/modules/mob/living/carbon/xenomorph/update_icons.dm index 27e7ec3225ed..e576b23e2855 100644 --- a/code/modules/mob/living/carbon/xenomorph/update_icons.dm +++ b/code/modules/mob/living/carbon/xenomorph/update_icons.dm @@ -69,8 +69,8 @@ icon_state = "[mutation_caste_state] Dead" if(!(icon_state in icon_states(icon_xeno))) icon_state = "Normal [caste.caste_type] Dead" - else if(lying) - if((resting || sleeping) && (!knocked_down && !knocked_out && health > 0)) + else if(body_position == LYING_DOWN) + if(!HAS_TRAIT(src, TRAIT_INCAPACITATED) && !HAS_TRAIT(src, TRAIT_FLOORED)) icon_state = "[mutation_caste_state] Sleeping" if(!(icon_state in icon_states(icon_xeno))) icon_state = "Normal [caste.caste_type] Sleeping" @@ -93,6 +93,28 @@ update_inv_resource() update_icons() +/* CRUTCH ZONE - Update icons when relevant status happen - Ideally do this properly and for everything, then kill update_icons() someday */ +// set_body_position is needed on addition of floored start/stop because we can be switching between resting and knockeddown +/mob/living/carbon/xenomorph/set_body_position(new_value) + . = ..() + if(. != new_value) + update_icons() // Snowflake handler for xeno resting icons + +/mob/living/carbon/xenomorph/on_floored_start() + . = ..() + update_icons() +/mob/living/carbon/xenomorph/on_floored_end() + . = ..() + update_icons() +/mob/living/carbon/xenomorph/on_incapacitated_trait_gain() + . = ..() + update_icons() +/mob/living/carbon/xenomorph/on_incapacitated_trait_loss() + . = ..() + update_icons() + +/* ^^^^^^^^^^^^^^ End Icon updates */ + /mob/living/carbon/xenomorph/update_inv_pockets() var/datum/custom_hud/alien/ui_datum = GLOB.custom_huds_list[HUD_ALIEN] if(l_store) @@ -142,8 +164,8 @@ var/state_modifier = "" if(stat == DEAD) state_modifier = " Dead" - else if(lying) - if((resting || sleeping) && (!knocked_down && !knocked_out && health > 0)) + else if(body_position == LYING_DOWN) + if(!HAS_TRAIT(src, TRAIT_INCAPACITATED) && !HAS_TRAIT(src, TRAIT_FLOORED)) state_modifier = " Sleeping" else state_modifier = " Knocked Down" @@ -237,7 +259,7 @@ if(on_fire && fire_reagent) var/image/I if(mob_size >= MOB_SIZE_BIG) - if((!initial(pixel_y) || lying) && !resting && !sleeping) + if((!initial(pixel_y) || body_position != LYING_DOWN)) // what's that pixel_y doing here??? I = image("icon"='icons/mob/xenos/overlay_effects64x64.dmi', "icon_state"="alien_fire", "layer"=-X_FIRE_LAYER) else I = image("icon"='icons/mob/xenos/overlay_effects64x64.dmi', "icon_state"="alien_fire_lying", "layer"=-X_FIRE_LAYER) @@ -278,8 +300,8 @@ if(health > HEALTH_THRESHOLD_DEAD) if(health_threshold > 3) wound_icon_holder.icon_state = "none" - else if(lying) - if((resting || sleeping) && (!knocked_down && !knocked_out && health > 0)) + else if(body_position == LYING_DOWN) + if(!HAS_TRAIT(src, TRAIT_INCAPACITATED) && !HAS_TRAIT(src, TRAIT_FLOORED)) wound_icon_holder.icon_state = "[caste.caste_type]_rest_[health_threshold]" else wound_icon_holder.icon_state = "[caste.caste_type]_downed_[health_threshold]" diff --git a/code/modules/mob/living/init_signals.dm b/code/modules/mob/living/init_signals.dm index d7edd02893b3..696eaa3f0120 100644 --- a/code/modules/mob/living/init_signals.dm +++ b/code/modules/mob/living/init_signals.dm @@ -1,21 +1,91 @@ /// Called on [/mob/living/Initialize(mapload)], for the mob to register to relevant signals. /mob/living/proc/register_init_signals() + RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_KNOCKEDOUT), PROC_REF(on_knockedout_trait_gain)) + RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_KNOCKEDOUT), PROC_REF(on_knockedout_trait_loss)) RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_IMMOBILIZED), PROC_REF(on_immobilized_trait_gain)) RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_IMMOBILIZED), PROC_REF(on_immobilized_trait_loss)) + + RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_FLOORED), PROC_REF(on_floored_trait_gain)) + RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_FLOORED), PROC_REF(on_floored_trait_loss)) + + RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_FORCED_STANDING), PROC_REF(on_forced_standing_trait_gain)) + RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_FORCED_STANDING), PROC_REF(on_forced_standing_trait_loss)) + + RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_INCAPACITATED), PROC_REF(on_incapacitated_trait_gain)) + RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_INCAPACITATED), PROC_REF(on_incapacitated_trait_loss)) + RegisterSignal(src, list(SIGNAL_ADDTRAIT(TRAIT_UNDENSE), SIGNAL_REMOVETRAIT(TRAIT_UNDENSE)), PROC_REF(undense_changed)) +/// Called when [TRAIT_KNOCKEDOUT] is added to the mob. +/mob/living/proc/on_knockedout_trait_gain(datum/source) + SIGNAL_HANDLER + if(stat < UNCONSCIOUS) + set_stat(UNCONSCIOUS) + +/// Called when [TRAIT_KNOCKEDOUT] is removed from the mob. +/mob/living/proc/on_knockedout_trait_loss(datum/source) + SIGNAL_HANDLER + if(stat <= UNCONSCIOUS) + update_stat() + /// Called when [TRAIT_IMMOBILIZED] is added to the mob. /mob/living/proc/on_immobilized_trait_gain(datum/source) SIGNAL_HANDLER -// mobility_flags &= ~MOBILITY_MOVE - update_canmove() + mobility_flags &= ~MOBILITY_MOVE /// Called when [TRAIT_IMMOBILIZED] is removed from the mob. /mob/living/proc/on_immobilized_trait_loss(datum/source) SIGNAL_HANDLER -// mobility_flags |= MOBILITY_MOVE - update_canmove() + mobility_flags |= MOBILITY_MOVE + +/// Called when [TRAIT_FLOORED] is added to the mob. +/mob/living/proc/on_floored_trait_gain(datum/source) + SIGNAL_HANDLER + if(buckled && buckled.buckle_lying != NO_BUCKLE_LYING) + return // Handled by the buckle. + if(HAS_TRAIT(src, TRAIT_FORCED_STANDING)) + return // Don't go horizontal if mob has forced standing trait. + mobility_flags &= ~MOBILITY_STAND + on_floored_start() + + +/// Called when [TRAIT_FLOORED] is removed from the mob. +/mob/living/proc/on_floored_trait_loss(datum/source) + SIGNAL_HANDLER + mobility_flags |= MOBILITY_STAND + on_floored_end() + +/// Called when [TRAIT_FORCED_STANDING] is added to the mob. +/mob/living/proc/on_forced_standing_trait_gain(datum/source) + SIGNAL_HANDLER + + set_body_position(STANDING_UP) + set_lying_angle(0) + +/// Called when [TRAIT_FORCED_STANDING] is removed from the mob. +/mob/living/proc/on_forced_standing_trait_loss(datum/source) + SIGNAL_HANDLER + + if(HAS_TRAIT(src, TRAIT_FLOORED)) + on_fall() + set_lying_down() + else if(resting) + set_lying_down() + +/// Called when [TRAIT_INCAPACITATED] is added to the mob. +/mob/living/proc/on_incapacitated_trait_gain(datum/source) + SIGNAL_HANDLER + //add_traits(list(TRAIT_UI_BLOCKED, TRAIT_PULL_BLOCKED), TRAIT_INCAPACITATED) + //update_appearance() + return + +/// Called when [TRAIT_INCAPACITATED] is removed from the mob. +/mob/living/proc/on_incapacitated_trait_loss(datum/source) + SIGNAL_HANDLER + //remove_traits(list(TRAIT_UI_BLOCKED, TRAIT_PULL_BLOCKED), TRAIT_INCAPACITATED) + //update_appearance() + return /// Called when [TRAIT_UNDENSE] is gained or lost /mob/living/proc/undense_changed(datum/source) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 9f01b8037e0f..6205c4f919a4 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -34,11 +34,6 @@ QDEL_NULL(stamina) QDEL_NULL(hallucinations) -//This proc is used for mobs which are affected by pressure to calculate the amount of pressure that actually -//affects them once clothing is factored in. ~Errorage -/mob/living/proc/calculate_affecting_pressure(pressure) - return - /mob/living/proc/initialize_pain() pain = new /datum/pain(src) @@ -151,6 +146,8 @@ return /mob/living/Move(NewLoc, direct) + if(lying_angle != 0) + lying_angle_on_movement(direct) if (buckled && buckled.loc != NewLoc) //not updating position if (!buckled.anchored) return buckled.Move(NewLoc, direct) @@ -454,16 +451,170 @@ for(var/h in src.hud_possible) src.clone.hud_list[h].icon_state = src.hud_list[h].icon_state +// Note that this might CLASH with handle_regular_status_updates until it is ELIMINATED +// and everything is switched from updates to signaling - due to not accounting for all cases. +// If this proc causes issues you can probably disable it until then. +/mob/living/carbon/update_stat() + if(stat != DEAD) + if(health <= HEALTH_THRESHOLD_DEAD) + death() + return + else if(HAS_TRAIT(src, TRAIT_KNOCKEDOUT)) + set_stat(UNCONSCIOUS) + else + set_stat(CONSCIOUS) + /mob/living/set_stat(new_stat) . = ..() if(isnull(.)) return - switch(.) + + switch(.) //Previous stat. + if(CONSCIOUS) + if(stat >= UNCONSCIOUS) + ADD_TRAIT(src, TRAIT_IMMOBILIZED, TRAIT_KNOCKEDOUT) + add_traits(list(/*TRAIT_HANDS_BLOCKED, */ TRAIT_INCAPACITATED, TRAIT_FLOORED), STAT_TRAIT) + if(UNCONSCIOUS) + if(stat >= UNCONSCIOUS) + ADD_TRAIT(src, TRAIT_IMMOBILIZED, TRAIT_KNOCKEDOUT) //adding trait sources should come before removing to avoid unnecessary updates if(DEAD) SEND_SIGNAL(src, COMSIG_MOB_STAT_SET_ALIVE) - switch(stat) +// remove_from_dead_mob_list() +// add_to_alive_mob_list() + + switch(stat) //Current stat. + if(CONSCIOUS) + if(. >= UNCONSCIOUS) + REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, TRAIT_KNOCKEDOUT) + remove_traits(list(/*TRAIT_HANDS_BLOCKED, */ TRAIT_INCAPACITATED, TRAIT_FLOORED, /*TRAIT_CRITICAL_CONDITION*/), STAT_TRAIT) + if(UNCONSCIOUS) + if(. >= UNCONSCIOUS) + REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, TRAIT_KNOCKEDOUT) if(DEAD) SEND_SIGNAL(src, COMSIG_MOB_STAT_SET_DEAD) +// REMOVE_TRAIT(src, TRAIT_CRITICAL_CONDITION, STAT_TRAIT) +// remove_from_alive_mob_list() +// add_to_dead_mob_list() + +/** + * Changes the inclination angle of a mob, used by humans and others to differentiate between standing up and prone positions. + * + * In BYOND-angles 0 is NORTH, 90 is EAST, 180 is SOUTH and 270 is WEST. + * This usually means that 0 is standing up, 90 and 270 are horizontal positions to right and left respectively, and 180 is upside-down. + * Mobs that do now follow these conventions due to unusual sprites should require a special handling or redefinition of this proc, due to the density and layer changes. + * The return of this proc is the previous value of the modified lying_angle if a change was successful (might include zero), or null if no change was made. + */ +/mob/living/proc/set_lying_angle(new_lying, on_movement = FALSE) + if(new_lying == lying_angle) + return + . = lying_angle + lying_angle = new_lying + if(lying_angle != lying_prev) + update_transform(instant_update = on_movement) // Don't use transition for eg. crawling movement, because we already have the movement glide + lying_prev = lying_angle + +///Called by mob Move() when the lying_angle is different than zero, to better visually simulate crawling. +/mob/living/proc/lying_angle_on_movement(direct) + if(direct & EAST) + set_lying_angle(90, on_movement = TRUE) + else if(direct & WEST) + set_lying_angle(270, on_movement = TRUE) + +///Reports the event of the change in value of the buckled variable. +/mob/living/proc/set_buckled(new_buckled) + if(new_buckled == buckled) + return + SEND_SIGNAL(src, COMSIG_LIVING_SET_BUCKLED, new_buckled) + . = buckled + buckled = new_buckled + if(buckled) +// if(!HAS_TRAIT(buckled, TRAIT_NO_IMMOBILIZE)) +// ADD_TRAIT(src, TRAIT_IMMOBILIZED, BUCKLED_TRAIT) + ADD_TRAIT(src, TRAIT_IMMOBILIZED, BUCKLED_TRAIT) + switch(buckled.buckle_lying) + if(NO_BUCKLE_LYING) // The buckle doesn't force a lying angle. + REMOVE_TRAIT(src, TRAIT_FLOORED, BUCKLED_TRAIT) + if(0) // Forcing to a standing position. + REMOVE_TRAIT(src, TRAIT_FLOORED, BUCKLED_TRAIT) + set_body_position(STANDING_UP) + set_lying_angle(0) + else // Forcing to a lying position. + ADD_TRAIT(src, TRAIT_FLOORED, BUCKLED_TRAIT) + set_body_position(LYING_DOWN) + set_lying_angle(buckled.buckle_lying) + else + remove_traits(list(TRAIT_IMMOBILIZED, TRAIT_FLOORED), BUCKLED_TRAIT) + if(.) // We unbuckled from something. + //var/atom/movable/old_buckled = . + var/obj/old_buckled = . // /tg/ code has buckling defined on /atom/movable - consider refactoring this sometime + if(old_buckled.buckle_lying == 0 && (resting || HAS_TRAIT(src, TRAIT_FLOORED))) // The buckle forced us to stay up (like a chair) + set_lying_down() // We want to rest or are otherwise floored, so let's drop on the ground. + +/mob/living/proc/get_up(instant = FALSE) // arg ignored +// set waitfor = FALSE +// if(!instant && !do_after(src, 1 SECONDS, src, timed_action_flags = (IGNORE_USER_LOC_CHANGE|IGNORE_TARGET_LOC_CHANGE|IGNORE_HELD_ITEM), extra_checks = CALLBACK(src, TYPE_PROC_REF(/mob/living, rest_checks_callback)), interaction_key = DOAFTER_SOURCE_GETTING_UP)) +// return + if(resting || body_position == STANDING_UP || HAS_TRAIT(src, TRAIT_FLOORED)) + return + set_body_position(STANDING_UP) + set_lying_angle(0) + +/// Change the [body_position] to [LYING_DOWN] and update associated behavior. +/mob/living/proc/set_lying_down(new_lying_angle) + set_body_position(LYING_DOWN) + +/// Proc to append behavior related to lying down. +/mob/living/proc/on_lying_down(new_lying_angle) +// if(layer == initial(layer)) //to avoid things like hiding larvas. +// layer = LYING_MOB_LAYER //so mob lying always appear behind standing mobs + add_traits(list(/*TRAIT_UI_BLOCKED, TRAIT_PULL_BLOCKED,*/ TRAIT_UNDENSE), LYING_DOWN_TRAIT) + if(HAS_TRAIT(src, TRAIT_FLOORED) && !(dir & (NORTH|SOUTH))) + setDir(pick(NORTH, SOUTH)) // We are and look helpless. +// if(rotate_on_lying) +// body_position_pixel_y_offset = PIXEL_Y_OFFSET_LYING + + // CM legacy canmove procs, replace this with signal procs probably + drop_l_hand() + drop_r_hand() + add_temp_pass_flags(PASS_MOB_THRU) + //so mob lying always appear behind standing mobs, but dead ones appear behind living ones + if(pulledby && pulledby.grab_level == GRAB_CARRY) + layer = ABOVE_MOB_LAYER + else if (stat == DEAD) + layer = LYING_DEAD_MOB_LAYER // Dead mobs should layer under living ones + else if(layer == initial(layer)) //to avoid things like hiding larvas. + layer = LYING_LIVING_MOB_LAYER + +/// Called when mob changes from a standing position into a prone while lacking the ability to stand up at the moment. +/mob/living/proc/on_fall() + return + +/// Changes the value of the [living/body_position] variable. Call this before set_lying_angle() +/mob/living/proc/set_body_position(new_value) + if(body_position == new_value) + return + if((new_value == LYING_DOWN) && !(mobility_flags & MOBILITY_LIEDOWN)) + return + . = body_position + body_position = new_value + SEND_SIGNAL(src, COMSIG_LIVING_SET_BODY_POSITION, new_value, .) + if(new_value == LYING_DOWN) // From standing to lying down. + on_lying_down() + else // From lying down to standing up. + on_standing_up() + +/// Proc to append behavior related to lying down. +/mob/living/proc/on_standing_up() + //if(layer == LYING_MOB_LAYER) + // layer = initial(layer) + remove_traits(list(/*TRAIT_UI_BLOCKED, TRAIT_PULL_BLOCKED,*/ TRAIT_UNDENSE), LYING_DOWN_TRAIT) + // Make sure it doesn't go out of the southern bounds of the tile when standing. + //body_position_pixel_y_offset = get_pixel_y_offset_standing(current_size) + // CM stuff below + remove_temp_pass_flags(PASS_MOB_THRU) + if(layer == LYING_DEAD_MOB_LAYER || layer == LYING_LIVING_MOB_LAYER) + layer = initial(layer) + /// Uses presence of [TRAIT_UNDENSE] to figure out what is the correct density state for the mob. Triggered by trait signal. /mob/living/proc/update_density() @@ -471,3 +622,40 @@ set_density(FALSE) else set_density(TRUE) + +/// Proc to append behavior to the condition of being floored. Called when the condition starts. +/mob/living/proc/on_floored_start() + if(body_position == STANDING_UP) //force them on the ground + set_body_position(LYING_DOWN) + set_lying_angle(pick(90, 270), on_movement = TRUE) +// on_fall() + + +/// Proc to append behavior to the condition of being floored. Called when the condition ends. +/mob/living/proc/on_floored_end() + if(!resting) + get_up() + + +/mob/living/update_transform(instant_update = FALSE) + var/visual_angle = lying_angle + if(!rotate_on_lying) + return + var/matrix/base = matrix() + if(pulledby && pulledby.grab_level >= GRAB_CARRY) + visual_angle = 90 // CM code - for fireman carry + if(instant_update) + apply_transform(base.Turn(visual_angle)) + else + apply_transform(base.Turn(visual_angle), UPDATE_TRANSFORM_ANIMATION_TIME) + + +// legacy procs +/mob/living/put_in_l_hand(obj/item/W) + if(body_position == LYING_DOWN) + return + return ..() +/mob/living/put_in_r_hand(obj/item/W) + if(body_position == LYING_DOWN) + return + return ..() diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 97d71fcb4e8e..ce4634a102fc 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -14,6 +14,18 @@ var/brainloss = 0 //'Retardation' damage caused by someone hitting you in the head with a bible or being infected with brainrot. var/halloss = 0 //Hallucination damage. 'Fake' damage obtained through hallucinating or the holodeck. Sleeping should cause it to wear off. + // please don't use these + VAR_PROTECTED/knocked_out = 0 + VAR_PROTECTED/knocked_down = 0 + VAR_PROTECTED/stunned = 0 + var/dazed = 0 + var/slowed = 0 // X_SLOW_AMOUNT + var/superslowed = 0 // X_SUPERSLOW_AMOUNT + var/sleeping = 0 + + /// Cooldown for manually toggling resting to avoid spamming + COOLDOWN_DECLARE(rest_cooldown) + var/hallucination = 0 //Directly affects how long a mob will hallucinate for var/list/atom/hallucinations = list() //A list of hallucinated people that try to attack the mob. See /obj/effect/fake_attacker in hallucinations.dm @@ -99,7 +111,6 @@ var/current_weather_effect_type - var/slash_verb = "attack" var/slashes_verb = "attacks" @@ -111,10 +122,15 @@ /// This is what the value is changed to when the mob dies. Actual BMV definition in atom/movable. var/dead_black_market_value = 0 - var/dazed = 0 - var/knocked_out = 0 - var/stunned = 0 - var/knocked_down = 0 - var/slowed = 0 // X_SLOW_AMOUNT - var/superslowed = 0 // X_SUPERSLOW_AMOUNT - var/sleeping = 0 + /// Variable to track the body position of a mob, regardgless of the actual angle of rotation (usually matching it, but not necessarily). + var/body_position = STANDING_UP + /// Number of degrees of rotation of a mob. 0 means no rotation, up-side facing NORTH. 90 means up-side rotated to face EAST, and so on. + VAR_PROTECTED/lying_angle = 0 + /// Value of lying lying_angle before last change. TODO: Remove the need for this. + var/lying_prev = 0 + /// Does the mob rotate when lying + var/rotate_on_lying = FALSE + + /// Flags that determine the potential of a mob to perform certain actions. Do not change this directly. + var/mobility_flags = MOBILITY_FLAGS_DEFAULT + diff --git a/code/modules/mob/living/living_health_procs.dm b/code/modules/mob/living/living_health_procs.dm index 3a96400ade6a..e4c9659db827 100644 --- a/code/modules/mob/living/living_health_procs.dm +++ b/code/modules/mob/living/living_health_procs.dm @@ -86,6 +86,7 @@ VAR_PROTECTED/stun_timer = TIMER_ID_NULL /mob/living/proc/stun_callback() + REMOVE_TRAIT(src, TRAIT_INCAPACITATED, STUNNED_TRAIT) stunned = 0 handle_regular_status_updates(FALSE) if(stun_timer != TIMER_ID_NULL) @@ -93,9 +94,14 @@ stun_timer = TIMER_ID_NULL /mob/living/proc/stun_callback_check() + if(stunned) + ADD_TRAIT(src, TRAIT_INCAPACITATED, STUNNED_TRAIT) if(stunned && stunned < recovery_constant) stun_timer = addtimer(CALLBACK(src, PROC_REF(stun_callback)), (stunned/recovery_constant) * 2 SECONDS, TIMER_OVERRIDE|TIMER_UNIQUE|TIMER_STOPPABLE) return + if(!stunned) // Force reset since the timer wasn't called + stun_callback() + return if(stun_timer != TIMER_ID_NULL) deltimer(stun_timer) @@ -172,15 +178,23 @@ VAR_PRIVATE/knocked_down_timer /mob/living/proc/knocked_down_callback() + remove_traits(list(TRAIT_FLOORED, TRAIT_INCAPACITATED), KNOCKEDDOWN_TRAIT) knocked_down = 0 handle_regular_status_updates(FALSE) knocked_down_timer = null /mob/living/proc/knocked_down_callback_check() + if(knocked_down) + add_traits(list(TRAIT_FLOORED, TRAIT_INCAPACITATED), KNOCKEDDOWN_TRAIT) + if(knocked_down && knocked_down < recovery_constant) knocked_down_timer = addtimer(CALLBACK(src, PROC_REF(knocked_down_callback)), (knocked_down/recovery_constant) * 2 SECONDS, TIMER_OVERRIDE|TIMER_UNIQUE|TIMER_STOPPABLE) // times whatever amount we have per tick return + if(!knocked_down) // Force reset since the timer wasn't called + knocked_down_callback() + return + if(knocked_down_timer) deltimer(knocked_down_timer) knocked_down_timer = null @@ -192,11 +206,14 @@ return /mob/living/proc/knocked_out_callback() + REMOVE_TRAIT(src, TRAIT_KNOCKEDOUT, KNOCKEDOUT_TRAIT) knocked_out = 0 handle_regular_status_updates(FALSE) knocked_out_timer = null /mob/living/proc/knocked_out_callback_check() + if(knocked_out) + ADD_TRAIT(src, TRAIT_KNOCKEDOUT, KNOCKEDOUT_TRAIT) if(knocked_out && knocked_out < recovery_constant) knocked_out_timer = addtimer(CALLBACK(src, PROC_REF(knocked_out_callback)), (knocked_out/recovery_constant) * 2 SECONDS, TIMER_OVERRIDE|TIMER_UNIQUE|TIMER_STOPPABLE) // times whatever amount we have per tick return @@ -219,7 +236,6 @@ knocked_down_callback_check() return - /mob/living/proc/SetKnockDown(amount) if(status_flags & CANKNOCKDOWN) knocked_down = max(amount,0) @@ -362,12 +378,6 @@ to_chat(src, SPAN_WARNING("You start hearing things again!")) SEND_SIGNAL(src, COMSIG_MOB_REGAINED_HEARING) - - - - - - // heal ONE limb, organ gets randomly selected from damaged ones. /mob/living/proc/heal_limb_damage(brute, burn) apply_damage(-brute, BRUTE) @@ -491,14 +501,13 @@ return if(stat >= UNCONSCIOUS) return + face_dir(direction) return ..() -/mob/living/is_laid_down() - if(knocked_down || knocked_out) - return TRUE - return ..() - -/mob/living/is_mob_incapacitated(ignore_restrained) - if(stunned || knocked_down || knocked_out) - return TRUE - return ..() +// Transition handlers. do NOT use this. I mean seriously don't. It's broken. Players love their broken behaviors. +/mob/living/proc/GetStunValueNotADurationDoNotUse() + return stunned +/mob/living/proc/GetKnockDownValueNotADurationDoNotUse() + return knocked_down +/mob/living/proc/GetKnockOutValueNotADurationDoNotUse() + return knocked_out diff --git a/code/modules/mob/living/living_verbs.dm b/code/modules/mob/living/living_verbs.dm index 77b996ff6bb0..45f5a25fce2c 100644 --- a/code/modules/mob/living/living_verbs.dm +++ b/code/modules/mob/living/living_verbs.dm @@ -163,7 +163,7 @@ return //breaking out of handcuffs & putting out fires - if(canmove && !knocked_down) + if(!is_mob_incapacitated(TRUE)) if(on_fire) resist_fire() @@ -179,7 +179,7 @@ if(!iscarbon(src)) return var/mob/living/carbon/C = src - if((C.handcuffed || C.legcuffed) && C.canmove && (C.last_special <= world.time)) + if((C.handcuffed || C.legcuffed) && (C.mobility_flags & MOBILITY_MOVE) && (C.last_special <= world.time)) resist_restraints() /mob/living/proc/resist_buckle() diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 0cd43361e22a..6782e3174579 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -101,8 +101,8 @@ GLOBAL_LIST_INIT(ai_verbs_default, list( // aiPDA = new/obj/item/device/pda/ai(src) SetName(pickedName) anchored = TRUE - canmove = 0 - density = TRUE + ADD_TRAIT(src, TRAIT_IMMOBILIZED, TRAIT_SOURCE_INHERENT) + set_density(TRUE) forceMove(loc) holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo1")) diff --git a/code/modules/mob/living/silicon/decoy/decoy.dm b/code/modules/mob/living/silicon/decoy/decoy.dm index 5294631a70ec..bc7271554352 100644 --- a/code/modules/mob/living/silicon/decoy/decoy.dm +++ b/code/modules/mob/living/silicon/decoy/decoy.dm @@ -4,7 +4,6 @@ icon = 'icons/obj/structures/machinery/ai.dmi' icon_state = "hydra" anchored = TRUE - canmove = 0 density = TRUE //Do not want to see past it. bound_height = 64 //putting this in so we can't walk through our machine. bound_width = 96 @@ -23,6 +22,7 @@ ai_headset = new(src) GLOB.ai_mob_list += src real_name = MAIN_AI_SYSTEM + ADD_TRAIT(src, TRAIT_IMMOBILIZED, TRAIT_SOURCE_INHERENT) /mob/living/silicon/decoy/ship_ai/Destroy() QDEL_NULL(ai_headset) diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index b0230bba5dba..b4a6e59e52e2 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -18,7 +18,6 @@ use_power() process_killswitch() process_locks() - update_canmove() /mob/living/silicon/robot/proc/clamp_values() @@ -79,14 +78,14 @@ death() if (stat != DEAD) //Alive. - if (knocked_out || stunned || knocked_down || !has_power) //Stunned etc. + if (HAS_TRAIT(src, TRAIT_KNOCKEDOUT) || HAS_TRAIT(src, TRAIT_INCAPACITATED) || !has_power) //Stunned etc. set_stat(UNCONSCIOUS) if(regular_update) - if (src.stunned > 0) + if (HAS_TRAIT(src, TRAIT_INCAPACITATED)) adjust_effect(-1, STUN) - if (src.knocked_down > 0) + if (HAS_TRAIT(src, TRAIT_FLOORED)) adjust_effect(-1, WEAKEN) - if (src.knocked_out > 0) + if (HAS_TRAIT(src, TRAIT_KNOCKEDOUT)) adjust_effect(-1, PARALYZE) src.blinded = TRUE else @@ -113,8 +112,6 @@ src.ear_damage -= 0.05 src.ear_damage = max(src.ear_damage, 0) - src.density = !( src.lying ) - if ((src.sdisabilities & DISABILITY_BLIND)) src.blinded = TRUE if ((src.sdisabilities & DISABILITY_DEAF)) @@ -271,8 +268,3 @@ to_chat(src, SPAN_DANGER("Weapon Lock Timed Out!")) weapon_lock = 0 weaponlock_time = 120 - -/mob/living/silicon/robot/update_canmove() - if(knocked_out || stunned || knocked_down || buckled || lockcharge || !is_component_functioning("actuator")) canmove = 0 - else canmove = 1 - return canmove diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 7a3ed2868389..888b484fab06 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -840,7 +840,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list( cleaned_item.clean_blood() else if(istype(A, /mob/living/carbon/human)) var/mob/living/carbon/human/cleaned_human = A - if(cleaned_human.lying) + if(cleaned_human.body_position == LYING_DOWN) if(cleaned_human.head) cleaned_human.head.clean_blood() cleaned_human.update_inv_head(0) @@ -866,7 +866,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list( src.connected_ai = null lawupdate = 0 lockcharge = 0 - canmove = 1 + //canmove = 1 // Yes this will probably break something, whatevver it is scrambledcodes = 1 //Disconnect it's camera so it's not so easily tracked. if(src.camera) diff --git a/code/modules/mob/living/simple_animal/bat.dm b/code/modules/mob/living/simple_animal/bat.dm index a95d97be6e1a..eea7998bda67 100644 --- a/code/modules/mob/living/simple_animal/bat.dm +++ b/code/modules/mob/living/simple_animal/bat.dm @@ -27,4 +27,3 @@ set_stat(CONSCIOUS) icon_state = "bat" wander = 1 - canmove = 1 diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index fa93399683d8..11064634d498 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -46,7 +46,6 @@ set_stat(CONSCIOUS) icon_state = "mouse_[body_color]" wander = 1 - canmove = 1 else if(prob(5)) INVOKE_ASYNC(src, PROC_REF(emote), "snuffles") diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index 5e56b0204777..6e8d0b8a2867 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -63,19 +63,19 @@ icon_living = "Normal [caste_name] Running" icon_dead = "Normal [caste_name] Dead" -/mob/living/simple_animal/hostile/alien/update_transform() - if(lying != lying_prev) - lying_prev = lying +/mob/living/simple_animal/hostile/alien/update_transform(instant_update = FALSE) + // TODO: Move all this mess outside of update_transform if(stat == DEAD) icon_state = "Normal [caste_name] Dead" - else if(lying) - if((resting || sleeping) && (!knocked_down && !knocked_out && health > 0)) + else if(body_position == LYING_DOWN) + if(!HAS_TRAIT(src, TRAIT_INCAPACITATED) && !HAS_TRAIT(src, TRAIT_FLOORED)) icon_state = "Normal [caste_name] Sleeping" else icon_state = "Normal [caste_name] Knocked Down" else icon_state = "Normal [caste_name] Running" update_wounds() + return ..() /mob/living/simple_animal/hostile/alien/evaluate_target(mob/living/carbon/target) . = ..() @@ -114,8 +114,8 @@ if(health > HEALTH_THRESHOLD_DEAD) if(health_threshold > 3) wound_icon_holder.icon_state = "none" - else if(lying) - if((resting || sleeping) && (!knocked_down && !knocked_out && health > 0)) + else if(body_position == LYING_DOWN) + if(!HAS_TRAIT(src, TRAIT_INCAPACITATED) && !HAS_TRAIT(src, TRAIT_FLOORED)) wound_icon_holder.icon_state = "[caste_name]_rest_[health_threshold]" else wound_icon_holder.icon_state = "[caste_name]_downed_[health_threshold]" diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 9d0dfc869d8c..5a5791eb8311 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -125,7 +125,7 @@ if(client) return 0 - if(!stat && canmove) + if(!stat && mobility_flags & MOBILITY_MOVE) switch(stance) if(HOSTILE_STANCE_IDLE) target_mob = FindTarget() diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index a5109685e41b..d1b140305d60 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -127,7 +127,7 @@ /mob/living/simple_animal/parrot/Topic(href, href_list) //Can the usr physically do this? - if(!usr.canmove || usr.stat || usr.is_mob_restrained() || !in_range(loc, usr)) + if(usr.is_mob_incapacitated() || !in_range(loc, usr)) return //Is the usr's mob type able to do this? @@ -284,7 +284,7 @@ if(client || stat) return //Lets not force players or dead/incap parrots to move - if(!isturf(src.loc) || !canmove || buckled) + if(!isturf(src.loc) || !(mobility_flags & MOBILITY_MOVE) || buckled) return //If it can't move, dont let it move. (The buckled check probably isn't necessary thanks to canmove) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index e18d8e8f066f..3d3a4b491950 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -81,8 +81,8 @@ GLOB.dead_mob_list -= src GLOB.alive_mob_list += src set_stat(CONSCIOUS) - lying = 0 - density = TRUE +// lying = 0 +// density = TRUE reload_fullscreens() return 0 @@ -96,11 +96,10 @@ handle_stunned() handle_knocked_down(TRUE) handle_knocked_out(TRUE) - update_canmove() //Movement if(!client && !stop_automated_movement && wander && !anchored) - if(isturf(src.loc) && !resting && !buckled && canmove) //This is so it only moves if it's not inside a closet, gentics machine, etc. + if(isturf(src.loc) && !resting && !buckled && (mobility_flags & MOBILITY_MOVE)) //This is so it only moves if it's not inside a closet, gentics machine, etc. turns_since_move++ if(turns_since_move >= turns_per_move) if(!(stop_automated_movement_when_pulled && pulledby)) //Soma animals don't move when pulled @@ -361,10 +360,17 @@ ..(message, null, verb, nolog = !ckey) //if the animal has a ckey then it will log the message -/mob/living/simple_animal/update_canmove() +/mob/living/simple_animal/on_immobilized_trait_gain(datum/source) . = ..() - if(!canmove) - stop_moving() + stop_moving() + +/mob/living/simple_animal/on_knockedout_trait_gain(datum/source) + . = ..() + stop_moving() + +/mob/living/simple_animal/on_incapacitated_trait_gain(datum/source) + . = ..() + stop_moving() /mob/living/simple_animal/proc/stop_moving() walk_to(src, 0) // stops us dead in our tracks diff --git a/code/modules/mob/living/simple_animal/slug.dm b/code/modules/mob/living/simple_animal/slug.dm index e09d2c715e54..3f2ceb57b838 100644 --- a/code/modules/mob/living/simple_animal/slug.dm +++ b/code/modules/mob/living/simple_animal/slug.dm @@ -33,7 +33,6 @@ set_stat(CONSCIOUS) icon_state = "slug_movement" wander = 1 - canmove = 1 /mob/living/simple_animal/alien_slug/Initialize() . = ..() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 03fc6c24ca26..c256f05e74b4 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -454,7 +454,7 @@ if(!Adjacent(usr)) return if(!ishuman(M) && !ismonkey(M)) return if(!ishuman(src) && !ismonkey(src)) return - if(M.lying || M.is_mob_incapacitated()) + if(M.is_mob_incapacitated()) return if(M.pulling == src && (M.a_intent & INTENT_GRAB) && M.grab_level == GRAB_AGGRESSIVE) return @@ -693,71 +693,15 @@ note dizziness decrements automatically in the mob's Life() proc. // facing verbs /mob/proc/canface() - if(!canmove) return 0 if(client.moving) return 0 if(stat==2) return 0 if(anchored) return 0 if(monkeyizing) return 0 if(is_mob_restrained()) return 0 + if(HAS_TRAIT(src, TRAIT_INCAPACITATED)) // We allow rotation if simply floored + return FALSE return 1 -//Updates canmove, lying and icons. Could perhaps do with a rename but I can't think of anything to describe it. -/mob/proc/update_canmove() - var/laid_down = is_laid_down() - - if(laid_down) - lying = TRUE - flags_atom &= ~DIRLOCK - else - lying = FALSE - if(buckled) - if(buckled.buckle_lying) - lying = TRUE - flags_atom &= ~DIRLOCK - else - lying = FALSE - - canmove = !HAS_TRAIT(src, TRAIT_IMMOBILIZED) - - if(isliving(src)) // Temporary I SWEAR. This whole proc is going down - var/mob/living/living = src - if(living.stunned) - canmove = FALSE - - if(!can_crawl && lying) - canmove = FALSE - - if(lying_prev != lying) - if(lying) - ADD_TRAIT(src, TRAIT_UNDENSE, LYING_TRAIT) - add_temp_pass_flags(PASS_MOB_THRU) - drop_l_hand() - drop_r_hand() - SEND_SIGNAL(src, COMSIG_MOB_KNOCKED_DOWN) - else - REMOVE_TRAIT(src, TRAIT_UNDENSE, LYING_TRAIT) - SEND_SIGNAL(src, COMSIG_MOB_GETTING_UP) - remove_temp_pass_flags(PASS_MOB_THRU) - update_transform() - - if(lying) - //so mob lying always appear behind standing mobs, but dead ones appear behind living ones - if(pulledby && pulledby.grab_level == GRAB_CARRY) - layer = ABOVE_MOB_LAYER - else if (stat == DEAD) - layer = LYING_DEAD_MOB_LAYER // Dead mobs should layer under living ones - else if(layer == initial(layer)) //to avoid things like hiding larvas. - layer = LYING_LIVING_MOB_LAYER - else if(layer == LYING_DEAD_MOB_LAYER || layer == LYING_LIVING_MOB_LAYER) - layer = initial(layer) - - SEND_SIGNAL(src, COMSIG_MOB_POST_UPDATE_CANMOVE, canmove, laid_down, lying) - - return canmove - -/mob/proc/is_laid_down() - return (stat || !has_legs() || resting || (status_flags & FAKEDEATH) || (pulledby && pulledby.grab_level >= GRAB_AGGRESSIVE)) - /mob/proc/face_dir(ndir, specific_dir) if(!canface()) return 0 if(dir != ndir) @@ -924,13 +868,13 @@ note dizziness decrements automatically in the mob's Life() proc. /mob/living/proc/handle_knocked_down(bypass_client_check = FALSE) if(knocked_down && (bypass_client_check || client)) - knocked_down = max(knocked_down-1,0) //before you get mad Rockdtben: I done this so update_canmove isn't called multiple times + knocked_down = max(knocked_down-1,0) knocked_down_callback_check() return knocked_down /mob/living/proc/handle_knocked_out(bypass_client_check = FALSE) if(knocked_out && (bypass_client_check || client)) - knocked_out = max(knocked_out-1,0) //before you get mad Rockdtben: I done this so update_canmove isn't called multiple times + knocked_out = max(knocked_out-1,0) knocked_out_callback_check() return knocked_out @@ -1123,6 +1067,9 @@ note dizziness decrements automatically in the mob's Life() proc. /mob/proc/set_stat(new_stat) if(new_stat == stat) return - . = stat //old stat + . = stat stat = new_stat SEND_SIGNAL(src, COMSIG_MOB_STATCHANGE, new_stat, .) + +/mob/proc/update_stat() + return diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index dc107e1bd190..f0e5bc48a855 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -87,9 +87,6 @@ var/exploit_record = "" var/gibbing = FALSE - var/lying = FALSE - var/lying_prev = 0 - var/canmove = 1 var/lastpuke = 0 unacidable = FALSE var/mob_size = MOB_SIZE_HUMAN diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index a234c5962f72..071728195e3f 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -83,21 +83,21 @@ if(GRAB_AGGRESSIVE) progress_aggressive(user, victim) -/obj/item/grab/proc/progress_passive(mob/living/carbon/human/user, mob/victim) + if(user.grab_level >= GRAB_AGGRESSIVE) + ADD_TRAIT(victim, TRAIT_FLOORED, CHOKEHOLD_TRAIT) + +/obj/item/grab/proc/progress_passive(mob/living/carbon/human/user, mob/living/victim) user.grab_level = GRAB_AGGRESSIVE playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 25, 1, 7) user.visible_message(SPAN_WARNING("[user] has grabbed [victim] aggressively!"), null, null, 5) - victim.update_canmove() -/obj/item/grab/proc/progress_aggressive(mob/living/carbon/human/user, mob/victim) +/obj/item/grab/proc/progress_aggressive(mob/living/carbon/human/user, mob/living/victim) user.grab_level = GRAB_CHOKE playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 25, 1, 7) user.visible_message(SPAN_WARNING("[user] holds [victim] by the neck and starts choking them!"), null, null, 5) victim.Move(user.loc, get_dir(victim.loc, user.loc)) victim.update_transform(TRUE) - victim.update_canmove() - /obj/item/grab/attack(mob/living/M, mob/living/user) if(M == grabbed_thing) attack_self(user) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 4529580859de..5d1baac3a534 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -311,14 +311,11 @@ GLOBAL_LIST_INIT(limb_types_by_name, list( /mob/proc/is_mob_restrained() return +/// Returns if the mob is incapacitated and unable to perform general actions /mob/proc/is_mob_incapacitated(ignore_restrained) - return (stat || (!ignore_restrained && is_mob_restrained()) || status_flags & FAKEDEATH) - - -//returns how many non-destroyed legs the mob has (currently only useful for humans) -/mob/proc/has_legs() - return 2 - + // note that stat includes knockout via unconscious + // TODO: re-re-re-figure out if we need TRAIT_FLOORED here or using TRAIT_INCAPACITATED only is acceptable deviance from legacy behavior + return (stat || (!ignore_restrained && is_mob_restrained()) || (status_flags & FAKEDEATH) || HAS_TRAIT(src, TRAIT_INCAPACITATED)) /mob/proc/get_eye_protection() return EYE_PROTECTION_NONE @@ -480,7 +477,7 @@ GLOBAL_LIST_INIT(limb_types_by_name, list( set name = "Pick Up" set category = "Object" - if(!canmove || stat || is_mob_restrained() || !Adjacent(pickupify)) + if(is_mob_incapacitated() || !Adjacent(pickupify)) return if(world.time <= next_move) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 86ce622824db..65489944211a 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -95,7 +95,13 @@ mob.next_delay_update = world.time + mob.next_delay_delay /client/Move(n, direct) - if(world.time < next_movement || (mob.lying && mob.crawling)) + var/mob/living/living_mob + if(isliving(mob)) + living_mob = mob + + if(world.time < next_movement) + return + if(living_mob && living_mob.body_position == LYING_DOWN && mob.crawling) return next_move_dir_add = 0 @@ -134,7 +140,17 @@ if(!isliving(mob)) return mob.Move(n, direct) - if(!mob.canmove || mob.is_mob_incapacitated(TRUE) || (mob.lying && !mob.can_crawl)) + if(mob.is_mob_incapacitated(TRUE)) + return + + if(mob.buckled) + // Handle buckled relay before mobility because buckling inherently immobilizes + // This means you can (try to) move with a cargo tug or powerloader while immobilized, which i think makes sense + return mob.buckled.relaymove(mob, direct) + + if(!(living_mob.mobility_flags & MOBILITY_MOVE)) + return + if(living_mob.body_position == LYING_DOWN && !living_mob.can_crawl) return //Check if you are being grabbed and if so attemps to break it @@ -150,9 +166,6 @@ next_movement = world.time + MINIMAL_MOVEMENT_INTERVAL return - if(mob.buckled) - return mob.buckled.relaymove(mob, direct) - if(!mob.z)//Inside an object, tell it we moved var/atom/O = mob.loc if(!O) @@ -172,7 +185,7 @@ //We are now going to move moving = TRUE mob.move_intentionally = TRUE - if(mob.lying) + if(living_mob && living_mob.body_position == LYING_DOWN) //check for them not being a limbless blob (only humans have limbs) if(ishuman(mob)) var/mob/living/carbon/human/human = mob diff --git a/code/modules/mob/mob_verbs.dm b/code/modules/mob/mob_verbs.dm index b6b27bcf6605..a941dfc51090 100644 --- a/code/modules/mob/mob_verbs.dm +++ b/code/modules/mob/mob_verbs.dm @@ -98,7 +98,8 @@ if(length(mind.memory) < 4000) mind.store_memory(msg) else - message_admins("[key_name(usr)] auto-slept for attempting to exceed mob memory limit.]", loc.x, loc.y, loc.z) + message_admins("[key_name(usr)] warned for attempting to exceed mob memory limit.]", loc.x, loc.y, loc.z) + to_chat(src, "You have exceeded the maximum memory limit. Sorry!") else to_chat(src, "The game appears to have misplaced your mind datum, so we can't show you your notes.") @@ -221,6 +222,7 @@ set category = "IC" if(pulling) + REMOVE_TRAIT(pulling, TRAIT_FLOORED, CHOKEHOLD_TRAIT) var/mob/M = pulling pulling.pulledby = null pulling = null @@ -243,4 +245,3 @@ //so we must undo it here so the victim can move right away M.client.next_movement = world.time M.update_transform(TRUE) - M.update_canmove() diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 5938f7f51a2d..2034202144b2 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -6,7 +6,6 @@ invisibility = 101 density = FALSE - canmove = FALSE anchored = TRUE universal_speak = TRUE stat = DEAD @@ -15,6 +14,7 @@ . = ..() GLOB.new_player_list += src GLOB.dead_mob_list -= src + ADD_TRAIT(src, TRAIT_IMMOBILIZED, TRAIT_SOURCE_INHERENT) /mob/new_player/Destroy() if(ready) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index aa292c39245b..6dda93e4d9c2 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -7,8 +7,8 @@ drop_inv_item_on_ground(W) regenerate_icons() monkeyizing = 1 - canmove = 0 - stunned = 1 + anchored = TRUE + ADD_TRAIT(src, TRAIT_INCAPACITATED, "Terminal Monkeyziation") icon = null invisibility = 101 for(var/t in limbs) @@ -68,7 +68,7 @@ for(var/obj/item/W in src) drop_inv_item_on_ground(W) monkeyizing = 1 - canmove = 0 + ADD_TRAIT(src, TRAIT_INCAPACITATED, "Terminal Monkeyziation") icon = null invisibility = 101 return ..() @@ -85,7 +85,7 @@ drop_inv_item_on_ground(W) regenerate_icons() monkeyizing = 1 - canmove = 0 + ADD_TRAIT(src, TRAIT_INCAPACITATED, "Terminal Monkeyziation") icon = null invisibility = 101 for(var/t in limbs) @@ -131,7 +131,7 @@ drop_inv_item_on_ground(W) regenerate_icons() monkeyizing = 1 - canmove = 0 + ADD_TRAIT(src, TRAIT_INCAPACITATED, "Terminal Monkeyziation") icon = null invisibility = 101 for(var/t in limbs) @@ -186,28 +186,6 @@ qdel(src) return -/mob/living/carbon/human/proc/corgize() - if (monkeyizing) - return - for(var/obj/item/W in src) - drop_inv_item_on_ground(W) - regenerate_icons() - monkeyizing = 1 - canmove = 0 - icon = null - invisibility = 101 - for(var/t in limbs) //this really should not be necessary - qdel(t) - - var/mob/living/simple_animal/corgi/new_corgi = new /mob/living/simple_animal/corgi (loc) - new_corgi.a_intent = INTENT_HARM - new_corgi.key = key - if(new_corgi.client) new_corgi.client.change_view(GLOB.world_view_size) - - to_chat(new_corgi, "You are now a Corgi. Yap Yap!") - qdel(src) - return - /mob/living/carbon/human/Animalize() var/list/mobtypes = typesof(/mob/living/simple_animal) @@ -224,7 +202,7 @@ regenerate_icons() monkeyizing = 1 - canmove = 0 + ADD_TRAIT(src, TRAIT_INCAPACITATED, "Terminal Monkeyziation") icon = null invisibility = 101 diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index 7d24db7d529f..46a30b313bb8 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -177,9 +177,13 @@ nanoui is used to open and update nano browser uis close() return + var/mob/living/living_user + if(isliving(user)) + living_user = user + if ((allowed_user_stat > -1) && (user.stat > allowed_user_stat)) set_status(STATUS_DISABLED, push_update) // no updates, completely disabled (red visibility) - else if (user.is_mob_restrained() || user.lying) + else if (user.is_mob_restrained() || (living_user && living_user.body_position == LYING_DOWN)) set_status(STATUS_UPDATE, push_update) // update only (orange visibility) else if (!(src_object in view(4, user))) // If the src object is not in visable, set status to 0 set_status(STATUS_DISABLED, push_update) // interactive (green visibility) diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index f5a680c5076a..cebb4ad613b0 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -213,7 +213,7 @@ // Check if we're looking at a mob that's lying down if(istype(cur_atom, /mob/living)) var/mob/living/cur_mob = cur_atom - if(!isxeno(cur_mob) && cur_mob.lying) //xenos don't use icon rotatin for lying. + if(!isxeno(cur_mob) && cur_mob.body_position == LYING_DOWN) //xenos don't use icon rotatin for lying. cur_icon.BecomeLying() // Calculate where we are relative to the center of the photo diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index df4e9badc598..dd0327e3821d 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -1000,7 +1000,7 @@ GLOBAL_LIST_INIT(apc_wire_descriptions, list( SEND_SIGNAL(user, COMSIG_MOB_APC_POWER_PULSE, src) addtimer(VARSET_CALLBACK(src, shorted, FALSE), 2 MINUTES) -/obj/structure/machinery/power/apc/proc/can_use(mob/user as mob, loud = 0) //used by attack_hand() and Topic() +/obj/structure/machinery/power/apc/proc/can_use(mob/living/user as mob, loud = 0) //used by attack_hand() and Topic() if(user.client && user.client.remote_control) return TRUE @@ -1016,7 +1016,7 @@ GLOBAL_LIST_INIT(apc_wire_descriptions, list( if(user.is_mob_restrained()) to_chat(user, SPAN_WARNING("You must have free hands to use [src].")) return 0 - if(user.lying) + if(user.body_position == LYING_DOWN) to_chat(user, SPAN_WARNING("You can't reach [src]!")) return 0 autoflag = 5 diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 4767f443506b..8d7ab1532ade 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -1400,7 +1400,7 @@ and you're good to go. var/damage_buff = BASE_BULLET_DAMAGE_MULT //if target is lying or unconscious - add damage bonus - if(attacked_mob.lying == TRUE || attacked_mob.stat == UNCONSCIOUS) + if(!(attacked_mob.mobility_flags & MOBILITY_STAND) || attacked_mob.stat == UNCONSCIOUS) damage_buff += BULLET_DAMAGE_MULT_TIER_4 projectile_to_fire.damage *= damage_buff //Multiply the damage for point blank. if(bullets_fired == 1) //First shot gives the PB message. @@ -1424,7 +1424,7 @@ and you're good to go. projectile_to_fire.give_bullet_traits(BP) if(bullets_fired > 1) BP.original = attacked_mob //original == the original target of the projectile. If the target is downed and this isn't set, the projectile will try to fly over it. Of course, it isn't going anywhere, but it's the principle of the thing. Very embarrassing. - if(!BP.handle_mob(attacked_mob) && attacked_mob.lying) //This is the 'handle impact' proc for a flying projectile, including hit RNG, on_hit_mob and bullet_act. If it misses, it doesn't go anywhere. We'll pretend it slams into the ground or punches a hole in the ceiling, because trying to make it bypass the xeno or shoot from the tile beyond it is probably more spaghet than my life is worth. + if(!BP.handle_mob(attacked_mob) && attacked_mob.body_position == LYING_DOWN) //This is the 'handle impact' proc for a flying projectile, including hit RNG, on_hit_mob and bullet_act. If it misses, it doesn't go anywhere. We'll pretend it slams into the ground or punches a hole in the ceiling, because trying to make it bypass the xeno or shoot from the tile beyond it is probably more spaghet than my life is worth. if(BP.ammo.sound_bounce) playsound(attacked_mob.loc, BP.ammo.sound_bounce, 35, 1) attacked_mob.visible_message(SPAN_AVOIDHARM("[BP] slams into [get_turf(attacked_mob)]!"), //Managing to miss an immobile target flat on the ground deserves some recognition, don't you think? @@ -1437,7 +1437,7 @@ and you're good to go. if(bullets_fired > 1) projectile_to_fire.original = attacked_mob - if(!projectile_to_fire.handle_mob(attacked_mob) && attacked_mob.lying) + if(!projectile_to_fire.handle_mob(attacked_mob) && attacked_mob.body_position == LYING_DOWN) if(projectile_to_fire.ammo.sound_bounce) playsound(attacked_mob.loc, projectile_to_fire.ammo.sound_bounce, 35, 1) attacked_mob.visible_message(SPAN_AVOIDHARM("[projectile_to_fire] slams into [get_turf(attacked_mob)]!"), diff --git a/code/modules/projectiles/gun_attachables.dm b/code/modules/projectiles/gun_attachables.dm index c567f7d684a2..9f0ddd04fc11 100644 --- a/code/modules/projectiles/gun_attachables.dm +++ b/code/modules/projectiles/gun_attachables.dm @@ -2685,7 +2685,7 @@ Defined in conflicts.dm of the #defines folder. /obj/item/attachable/attached_gun/grenade/unique_action(mob/user) if(!ishuman(usr)) return - if(!user.canmove || user.stat || user.is_mob_restrained() || !user.loc || !isturf(usr.loc)) + if(user.is_mob_incapacitated() || !isturf(usr.loc)) to_chat(user, SPAN_WARNING("Not right now.")) return diff --git a/code/modules/projectiles/gun_helpers.dm b/code/modules/projectiles/gun_helpers.dm index ba5f8e491590..8e73124a8b92 100644 --- a/code/modules/projectiles/gun_helpers.dm +++ b/code/modules/projectiles/gun_helpers.dm @@ -462,7 +462,7 @@ DEFINES in setup.dm, referenced here. /obj/item/weapon/gun/proc/get_active_firearm(mob/user, restrictive = TRUE) if(!ishuman(usr)) return - if(!user.canmove || user.stat || user.is_mob_restrained() || !user.loc || !isturf(usr.loc)) + if(user.is_mob_incapacitated() || !isturf(usr.loc)) to_chat(user, SPAN_WARNING("Not right now.")) return diff --git a/code/modules/projectiles/guns/specialist/launcher/rocket_launcher.dm b/code/modules/projectiles/guns/specialist/launcher/rocket_launcher.dm index 6d998002134c..356d0e6c3b48 100644 --- a/code/modules/projectiles/guns/specialist/launcher/rocket_launcher.dm +++ b/code/modules/projectiles/guns/specialist/launcher/rocket_launcher.dm @@ -190,7 +190,7 @@ smoke.start() playsound(src, 'sound/weapons/gun_rocketlauncher.ogg', 100, TRUE, 10) for(var/mob/living/carbon/C in backblast_loc) - if(!C.lying && !HAS_TRAIT(C, TRAIT_EAR_PROTECTION)) //Have to be standing up to get the fun stuff + if(C.body_position == STANDING_UP && !HAS_TRAIT(C, TRAIT_EAR_PROTECTION)) //Have to be standing up to get the fun stuff C.apply_damage(15, BRUTE) //The shockwave hurts, quite a bit. It can knock unarmored targets unconscious in real life C.apply_effect(4, STUN) //For good measure C.apply_effect(6, STUTTER) @@ -362,7 +362,7 @@ smoke.start() playsound(src, 'sound/weapons/gun_rocketlauncher.ogg', 100, TRUE, 10) for(var/mob/living/carbon/C in backblast_loc) - if(!C.lying && !HAS_TRAIT(C, TRAIT_EAR_PROTECTION)) //Have to be standing up to get the fun stuff + if(C.body_position == STANDING_UP && !HAS_TRAIT(C, TRAIT_EAR_PROTECTION)) //Have to be standing up to get the fun stuff C.apply_damage(15, BRUTE) //The shockwave hurts, quite a bit. It can knock unarmored targets unconscious in real life C.apply_effect(4, STUN) //For good measure C.apply_effect(6, STUTTER) diff --git a/code/modules/projectiles/guns/specialist/sniper.dm b/code/modules/projectiles/guns/specialist/sniper.dm index 3fe2934259bf..0cd9d8dd16c8 100644 --- a/code/modules/projectiles/guns/specialist/sniper.dm +++ b/code/modules/projectiles/guns/specialist/sniper.dm @@ -75,7 +75,7 @@ /datum/action/item_action/specialist/aimed_shot/can_use_action() var/mob/living/carbon/human/H = owner - if(istype(H) && !H.is_mob_incapacitated() && !H.lying && (holder_item == H.r_hand || holder_item || H.l_hand)) + if(istype(H) && !H.is_mob_incapacitated() && (holder_item == H.r_hand || holder_item || H.l_hand)) return TRUE /datum/action/item_action/specialist/aimed_shot/proc/use_ability(atom/A) @@ -450,7 +450,7 @@ . = ..() if(.) var/mob/living/carbon/human/PMC_sniper = user - if(PMC_sniper.lying == 0 && !istype(PMC_sniper.wear_suit,/obj/item/clothing/suit/storage/marine/smartgunner/veteran/pmc) && !istype(PMC_sniper.wear_suit,/obj/item/clothing/suit/storage/marine/veteran)) + if(PMC_sniper.body_position == STANDING_UP && !istype(PMC_sniper.wear_suit,/obj/item/clothing/suit/storage/marine/smartgunner/veteran/pmc) && !istype(PMC_sniper.wear_suit,/obj/item/clothing/suit/storage/marine/veteran)) PMC_sniper.visible_message(SPAN_WARNING("[PMC_sniper] is blown backwards from the recoil of the [src.name]!"),SPAN_HIGHDANGER("You are knocked prone by the blowback!")) step(PMC_sniper,turn(PMC_sniper.dir,180)) PMC_sniper.apply_effect(5, WEAKEN) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 37e398080227..7de8f12fc546 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -517,7 +517,7 @@ X.behavior_delegate.on_hitby_projectile(ammo) . = TRUE - else if(!L.lying) + else if(L.body_position != LYING_DOWN) animatation_displace_reset(L) if(ammo.sound_miss) playsound_client(L.client, ammo.sound_miss, get_turf(L), 75, TRUE) L.visible_message(SPAN_AVOIDHARM("[src] misses [L]!"), @@ -766,8 +766,8 @@ //mobs use get_projectile_hit_chance instead of get_projectile_hit_boolean /mob/living/proc/get_projectile_hit_chance(obj/projectile/P) - if(lying && src != P.original) - return FALSE + if((body_position == LYING_DOWN || HAS_TRAIT(src, TRAIT_NESTED)) && src != P.original) + return FALSE // Snowflake check for xeno nests, because we want bullets to fly through even though they're standing in it var/ammo_flags = P.ammo.flags_ammo_behavior | P.projectile_override_flags if(ammo_flags & AMMO_XENO) if((status_flags & XENO_HOST) && HAS_TRAIT(src, TRAIT_NESTED)) @@ -775,7 +775,7 @@ . = P.get_effective_accuracy() - if(lying && stat) + if(body_position == LYING_DOWN && stat) . += 15 //Bonus hit against unconscious people. if(isliving(P.firer)) diff --git a/code/modules/reagents/chemistry_machinery/acid_harness.dm b/code/modules/reagents/chemistry_machinery/acid_harness.dm index ae54474c3aed..52a1a5f13bd7 100644 --- a/code/modules/reagents/chemistry_machinery/acid_harness.dm +++ b/code/modules/reagents/chemistry_machinery/acid_harness.dm @@ -443,7 +443,7 @@ else if(inject_conditions & ACID_SCAN_CONDITION_DEFIB && vitals_scan < ACID_VITALS_DEAD && last_vitals_scan & ACID_SCAN_CONDITION_DEATH) condition_scan |= ACID_SCAN_CONDITION_DEFIB //If we were previously dead and are now alive, we assume we got defibbed - if(inject_conditions & ACID_SCAN_CONDITION_CONCUSSION && (user.knocked_down || user.knocked_out)) + if(inject_conditions & ACID_SCAN_CONDITION_CONCUSSION && (HAS_TRAIT(src, TRAIT_KNOCKEDOUT) || HAS_TRAIT(src, TRAIT_FLOORED))) condition_scan |= ACID_SCAN_CONDITION_CONCUSSION if(inject_conditions & ACID_SCAN_CONDITION_INTOXICATION && (user.dazed || user.slowed || user.confused || user.drowsyness || user.dizziness || user.druggy)) diff --git a/code/modules/reagents/chemistry_properties/prop_neutral.dm b/code/modules/reagents/chemistry_properties/prop_neutral.dm index a35fb5e554bf..3048b12ee296 100644 --- a/code/modules/reagents/chemistry_properties/prop_neutral.dm +++ b/code/modules/reagents/chemistry_properties/prop_neutral.dm @@ -199,7 +199,7 @@ M.druggy = min(M.druggy + 0.5 * potency * delta_time, potency * 10) /datum/chem_property/neutral/hallucinogenic/process_overdose(mob/living/M, potency = 1, delta_time) - if(isturf(M.loc) && !istype(M.loc, /turf/open/space) && M.canmove && !M.is_mob_restrained()) + if(isturf(M.loc) && !istype(M.loc, /turf/open/space) && (M.mobility_flags & MOBILITY_MOVE) && !M.is_mob_restrained()) step(M, pick(GLOB.cardinals)) M.hallucination += 10 M.make_jittery(5) diff --git a/code/modules/reagents/chemistry_properties/prop_positive.dm b/code/modules/reagents/chemistry_properties/prop_positive.dm index 971051e9bf88..8bf7eadc5d77 100644 --- a/code/modules/reagents/chemistry_properties/prop_positive.dm +++ b/code/modules/reagents/chemistry_properties/prop_positive.dm @@ -455,7 +455,7 @@ if(prob(10 * delta_time)) to_chat(M, SPAN_WARNING("You feel like you have the worst brain freeze ever!")) M.apply_effect(20, PARALYZE) - M.stunned = max(M.stunned,21) + M.apply_effect(20, STUN) /datum/chem_property/positive/neurocryogenic/process_overdose(mob/living/M, potency = 1, delta_time) M.bodytemperature = max(M.bodytemperature - 2.5 * potency * delta_time,0) diff --git a/code/modules/reagents/chemistry_reagents/drink.dm b/code/modules/reagents/chemistry_reagents/drink.dm index 3bd7336c32b6..66ce0844556b 100644 --- a/code/modules/reagents/chemistry_reagents/drink.dm +++ b/code/modules/reagents/chemistry_reagents/drink.dm @@ -555,7 +555,8 @@ /datum/reagent/neurotoxin/on_mob_life(mob/living/carbon/M) . = ..() if(!.) return - M.knocked_down = max(M.knocked_down, 3) + if(!HAS_TRAIT(src, TRAIT_FLOORED)) + M.apply_effect(5, WEAKEN) if(!data) data = 1 data++ M.dizziness +=6 diff --git a/code/modules/reagents/chemistry_reagents/toxin.dm b/code/modules/reagents/chemistry_reagents/toxin.dm index 6ffd14ea8ae3..d9be565a85b2 100644 --- a/code/modules/reagents/chemistry_reagents/toxin.dm +++ b/code/modules/reagents/chemistry_reagents/toxin.dm @@ -113,6 +113,7 @@ if(!. || deleted) return M.status_flags |= FAKEDEATH + ADD_TRAIT(M, TRAIT_IMMOBILIZED, FAKEDEATH_TRAIT) M.apply_damage(0.5*REM, OXY) M.apply_effect(2, WEAKEN) M.silent = max(M.silent, 10) @@ -125,6 +126,7 @@ var/mob/living/holder_mob = . holder_mob.status_flags &= ~FAKEDEATH + REMOVE_TRAIT(holder_mob, TRAIT_IMMOBILIZED, FAKEDEATH_TRAIT) /datum/reagent/toxin/mindbreaker name = "Mindbreaker Toxin" diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index b468116da5f2..4c60a9e345e0 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -112,7 +112,7 @@ // attack with hand, move pulled object onto conveyor /obj/structure/machinery/conveyor/attack_hand(mob/user as mob) - if ((!( user.canmove ) || user.is_mob_restrained() || !( user.pulling ))) + if (( user.is_mob_incapacitated() || !( user.pulling ))) return if (user.pulling.anchored) return diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 2ce4c992b80c..1522f0100c4e 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -222,7 +222,7 @@ ///Attempt to move while inside /obj/structure/machinery/disposal/relaymove(mob/living/user) - if(user.stat || user.stunned || user.knocked_down || flushing) + if(user.is_mob_incapacitated(TRUE) || flushing) return FALSE if(user.loc == src) go_out(user) @@ -234,9 +234,8 @@ user.client.eye = user.client.mob user.client.perspective = MOB_PERSPECTIVE user.forceMove(loc) - user.stunned = max(user.stunned, 2) //Action delay when going out of a bin - user.update_canmove() //Force the delay to go in action immediately - if(!user.lying) + user.apply_effect(2, STUN) + if(user.mobility_flags & MOBILITY_MOVE) user.visible_message(SPAN_WARNING("[user] suddenly climbs out of [src]!"), SPAN_WARNING("You climb out of [src] and get your bearings!")) update() @@ -305,8 +304,7 @@ if(isliving(AM)) var/mob/living/living = AM living.Stun(2) - living.update_canmove() //Force the delay to go in action immediately - if(!living.lying) + if(living.body_position == STANDING_UP) living.visible_message(SPAN_WARNING("[living] is suddenly pushed out of [src]!"), SPAN_WARNING("You get pushed out of [src] and get your bearings!")) update() diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm index 816447658f13..96cc72970f3b 100644 --- a/code/modules/shuttles/shuttle_console.dm +++ b/code/modules/shuttles/shuttle_console.dm @@ -82,8 +82,6 @@ GLOBAL_LIST_EMPTY(shuttle_controls) user.visible_message(SPAN_NOTICE("[user] starts to type on the [src]."), SPAN_NOTICE("You try to take back the control over the shuttle. It will take around 3 minutes.")) if(do_after(user, 3 MINUTES, INTERRUPT_ALL, BUSY_ICON_FRIENDLY)) - if(user.lying) - return 0 shuttle.last_locked = world.time shuttle.queen_locked = 0 shuttle.last_door_override = world.time diff --git a/code/modules/sorokyne/sorokyne_cold_water.dm b/code/modules/sorokyne/sorokyne_cold_water.dm index adf7e3de6228..345014a1e460 100644 --- a/code/modules/sorokyne/sorokyne_cold_water.dm +++ b/code/modules/sorokyne/sorokyne_cold_water.dm @@ -48,13 +48,13 @@ var/dam_amount = COLD_WATER_DAMAGE if(issynth(M) || isyautja(M)) dam_amount -= 0.5 - if(M.lying) - M.apply_damage(5*dam_amount,BURN) - else + if(M.body_position == STANDING_UP) M.apply_damage(dam_amount,BURN,"l_leg") M.apply_damage(dam_amount,BURN,"l_foot") M.apply_damage(dam_amount,BURN,"r_leg") M.apply_damage(dam_amount,BURN,"r_foot") + else + M.apply_damage(5*dam_amount,BURN) if (ishuman(M)) if (M.bodytemperature > MINIMUM_TEMP) diff --git a/code/modules/surgery/surgery_initiator.dm b/code/modules/surgery/surgery_initiator.dm index 8b7506c9b7b8..706b28d0e94e 100644 --- a/code/modules/surgery/surgery_initiator.dm +++ b/code/modules/surgery/surgery_initiator.dm @@ -43,7 +43,7 @@ continue //Lying and self-surgery checks. - if(surgeryloop.lying_required && !target.lying) + if(surgeryloop.lying_required && target.body_position != LYING_DOWN) continue if(!surgeryloop.self_operable && target == user) continue @@ -134,7 +134,7 @@ [target_zone == "r_hand"||target_zone == "l_hand" ? "hand":"arm"] you're using!")) return TRUE - if(surgeryinstance.lying_required && !target.lying) + if(surgeryinstance.lying_required && target.body_position != LYING_DOWN) return TRUE if(surgery_limb) diff --git a/code/modules/surgery/surgery_procedure.dm b/code/modules/surgery/surgery_procedure.dm index 1e11516a8079..8620c557eb4b 100644 --- a/code/modules/surgery/surgery_procedure.dm +++ b/code/modules/surgery/surgery_procedure.dm @@ -90,7 +90,7 @@ to_chat(user, SPAN_WARNING("You can't operate on [target], \he is being carried by [target.pulledby]!")) return FALSE - if(lying_required && !target.lying) + if(lying_required && target.body_position != LYING_DOWN) to_chat(user, SPAN_WARNING("[user == target ? "You need" : "[target] needs"] to be lying down for this operation!")) return FALSE diff --git a/code/modules/tgui/status_composers.dm b/code/modules/tgui/status_composers.dm index 6d7b5897863e..ba1b29d8152e 100644 --- a/code/modules/tgui/status_composers.dm +++ b/code/modules/tgui/status_composers.dm @@ -56,17 +56,6 @@ /mob/living/silicon/proc/get_ui_access(atom/source) return UI_INTERACTIVE // Ubiquitous networking. Do not abuse. -/// Returns UI_INTERACTIVE if the user is conscious and lying down. -/// Returns UI_UPDATE otherwise. -/proc/ui_status_user_is_conscious_and_lying_down(mob/user) - if (!isliving(user)) - return UI_UPDATE - - var/mob/living/living_user = user - return (living_user.lying && living_user.stat == CONSCIOUS) \ - ? UI_INTERACTIVE \ - : UI_UPDATE - /// Return UI_INTERACTIVE if the user is strictly adjacent to the target atom, whether they can see it or not. /// Return UI_CLOSE otherwise. /proc/ui_status_user_strictly_adjacent(mob/user, atom/target) diff --git a/code/modules/vehicles/interior/interactable/seats.dm b/code/modules/vehicles/interior/interactable/seats.dm index 1e5df9fd1d81..ea961bc72593 100644 --- a/code/modules/vehicles/interior/interactable/seats.dm +++ b/code/modules/vehicles/interior/interactable/seats.dm @@ -388,17 +388,6 @@ handle_rotation() -/obj/structure/bed/chair/vehicle/unbuckle() - if(buckled_mob && buckled_mob.buckled == src) - buckled_mob.buckled = null - buckled_mob.anchored = initial(buckled_mob.anchored) - buckled_mob.update_canmove() - - var/M = buckled_mob - buckled_mob = null - - afterbuckle(M) - //attack handling /obj/structure/bed/chair/vehicle/attack_alien(mob/living/user) diff --git a/code/modules/vehicles/train.dm b/code/modules/vehicles/train.dm index 92358a1e0f27..cbad4535df72 100644 --- a/code/modules/vehicles/train.dm +++ b/code/modules/vehicles/train.dm @@ -54,8 +54,8 @@ //------------------------------------------- -/obj/vehicle/train/MouseDrop_T(atom/movable/C, mob/user as mob) - if(user.buckled || user.stat || user.is_mob_restrained() || !Adjacent(user) || !user.Adjacent(C) || !istype(C) || (user == C && !user.canmove)) +/obj/vehicle/train/MouseDrop_T(atom/movable/C, mob/living/user as mob) + if(user.buckled || user.stat || user.is_mob_restrained() || !Adjacent(user) || !user.Adjacent(C) || !istype(C) || (user == C && !(user.mobility_flags & MOBILITY_MOVE))) return if(istype(C,/obj/vehicle/train)) latch(C, user) @@ -71,7 +71,7 @@ if(!istype(usr, /mob/living/carbon/human)) return - if(!usr.canmove || usr.stat || usr.is_mob_restrained() || !Adjacent(usr)) + if(usr.is_mob_incapacitated() || !Adjacent(usr)) return unattach(usr) diff --git a/code/modules/vehicles/van/van.dm b/code/modules/vehicles/van/van.dm index fdb2f397bb2e..c4aa64360ec0 100644 --- a/code/modules/vehicles/van/van.dm +++ b/code/modules/vehicles/van/van.dm @@ -92,13 +92,13 @@ if(mover in mobs_under) //can't collide with the thing you're buckled to return NO_BLOCKED_MOVEMENT - if(ismob(mover)) - var/mob/M = mover + if(isliving(mover)) + var/mob/living/M = mover if(M.mob_flags & SQUEEZE_UNDER_VEHICLES) add_under_van(M) return NO_BLOCKED_MOVEMENT - if(M.lying) + if(M.body_position == LYING_DOWN) return NO_BLOCKED_MOVEMENT if(M.mob_size >= MOB_SIZE_IMMOBILE && next_push < world.time) diff --git a/colonialmarines.dme b/colonialmarines.dme index df6c6c1bccb6..d632d6bd4998 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -144,6 +144,7 @@ #include "code\__HELPERS\#maths.dm" #include "code\__HELPERS\_lists.dm" #include "code\__HELPERS\_time.dm" +#include "code\__HELPERS\animations.dm" #include "code\__HELPERS\chat.dm" #include "code\__HELPERS\cmp.dm" #include "code\__HELPERS\datums.dm" @@ -165,6 +166,7 @@ #include "code\__HELPERS\qdel.dm" #include "code\__HELPERS\sanitize_values.dm" #include "code\__HELPERS\shell.dm" +#include "code\__HELPERS\status_effects.dm" #include "code\__HELPERS\text.dm" #include "code\__HELPERS\traits.dm" #include "code\__HELPERS\type2type.dm" From 6cc274343bac85c3ec8b459c99431f42bf4bd9a4 Mon Sep 17 00:00:00 2001 From: silencer-pl <103842328+silencer-pl@users.noreply.github.com> Date: Mon, 27 Nov 2023 07:28:51 -0500 Subject: [PATCH 04/42] initial --- code/__DEFINES/chat.dm | 4 + code/controllers/subsystem/ticker.dm | 9 +- .../datums/emergency_calls/big_game_hunter.dm | 10 +- code/datums/emergency_calls/cbrn.dm | 20 +- code/datums/emergency_calls/clf.dm | 42 ++--- code/datums/emergency_calls/cmb.dm | 178 +++++++++--------- code/datums/emergency_calls/colonist.dm | 4 +- code/datums/emergency_calls/contractor.dm | 58 +++--- code/datums/emergency_calls/cryo_marines.dm | 22 +-- .../emergency_calls/cryo_marines_heavy.dm | 26 +-- code/datums/emergency_calls/cryo_spec.dm | 6 +- code/datums/emergency_calls/deathsquad.dm | 60 +++--- code/datums/emergency_calls/deus_vult.dm | 20 +- code/datums/emergency_calls/dutch.dm | 2 +- code/datums/emergency_calls/goons.dm | 50 ++--- code/datums/emergency_calls/hefa_knight.dm | 2 +- code/datums/emergency_calls/inspection.dm | 160 ++++++++-------- code/datums/emergency_calls/mercs.dm | 52 ++--- code/datums/emergency_calls/pirates.dm | 10 +- code/datums/emergency_calls/pizza.dm | 6 +- code/datums/emergency_calls/pmc.dm | 52 ++--- code/datums/emergency_calls/provost.dm | 14 +- code/datums/emergency_calls/riot.dm | 14 +- code/datums/emergency_calls/royal_marines.dm | 26 +-- code/datums/emergency_calls/souto.dm | 6 +- code/datums/emergency_calls/tank_crew.dm | 8 +- code/datums/emergency_calls/upp.dm | 51 ++--- code/datums/emergency_calls/upp_commando.dm | 46 ++--- .../datums/emergency_calls/whiskey_outpost.dm | 2 +- code/datums/emergency_calls/xeno_cultists.dm | 10 +- code/datums/emergency_calls/zombie.dm | 4 +- code/game/gamemodes/cm_initialize.dm | 28 +-- code/game/gamemodes/cm_process.dm | 6 +- .../jobs/job/civilians/other/survivors.dm | 26 +-- code/game/jobs/job/job.dm | 14 +- code/game/jobs/job/marine/marine.dm | 2 +- .../effects/landmarks/survivor_spawner.dm | 63 +++---- .../living/carbon/human/human_abilities.dm | 4 +- code/span_macros.dm | 2 - code/stylesheet.dm | 4 +- .../tgui-panel/styles/goon/chat-dark.scss | 11 +- .../tgui-panel/styles/goon/chat-light.scss | 11 +- tgui/public/tgui-panel.bundle.css | 4 +- 43 files changed, 564 insertions(+), 585 deletions(-) diff --git a/code/__DEFINES/chat.dm b/code/__DEFINES/chat.dm index 85966e4032e2..5cc40e39c08e 100644 --- a/code/__DEFINES/chat.dm +++ b/code/__DEFINES/chat.dm @@ -23,3 +23,7 @@ /// Adds a generic box around whatever message you're sending in chat. Really makes things stand out. #define examine_block(str) ("
" + str + "
") + +// Role Display +#define role_header(str) ("

" + str + "

") +#define role_body(str) ("

" + str + "

") diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 0153f03565f6..adf838984586 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -252,7 +252,7 @@ SUBSYSTEM_DEF(ticker) save_mode(CONFIG_GET(string/gamemode_default)) if(GLOB.round_statistics) - to_chat_spaced(world, html = FONT_SIZE_BIG(SPAN_ROLE_BODY("Welcome to [GLOB.round_statistics.round_name]"))) + to_chat(world, html = role_body("
Welcome to [GLOB.round_statistics.round_name]
")) GLOB.supply_controller.process() //Start the supply shuttle regenerating points -- TLE @@ -415,14 +415,11 @@ SUBSYSTEM_DEF(ticker) qdel(player) /datum/controller/subsystem/ticker/proc/equip_characters() - var/captainless=1 if(mode && istype(mode,/datum/game_mode/huntergames)) // || istype(mode,/datum/game_mode/whiskey_outpost) return for(var/mob/living/carbon/human/player in GLOB.human_mob_list) if(player.mind) - if(player.job == JOB_CO) - captainless = FALSE if(player.job) GLOB.RoleAuthority.equip_role(player, GLOB.RoleAuthority.roles_by_name[player.job], late_join = FALSE) EquipCustomItems(player) @@ -432,10 +429,6 @@ SUBSYSTEM_DEF(ticker) msg_admin_niche("NEW PLAYER: [key_name(player, 1, 1, 0)]. IP: [player.lastKnownIP], CID: [player.computer_id]") if(C.player_data && C.player_data.playtime_loaded && ((round(C.get_total_human_playtime() DECISECONDS_TO_HOURS, 0.1)) <= 5)) msg_sea(("NEW PLAYER: [key_name(player, 0, 1, 0)] only has [(round(C.get_total_human_playtime() DECISECONDS_TO_HOURS, 0.1))] hours as a human. Current role: [get_actual_job_name(player)] - Current location: [get_area(player)]"), TRUE) - if(captainless) - for(var/mob/M in GLOB.player_list) - if(!istype(M,/mob/new_player)) - to_chat(M, "Marine commanding officer position not forced on anyone.") /datum/controller/subsystem/ticker/proc/send_tip_of_the_round() var/message diff --git a/code/datums/emergency_calls/big_game_hunter.dm b/code/datums/emergency_calls/big_game_hunter.dm index e749b6654355..54dcfb09594e 100644 --- a/code/datums/emergency_calls/big_game_hunter.dm +++ b/code/datums/emergency_calls/big_game_hunter.dm @@ -23,10 +23,6 @@ arm_equipment(H, /datum/equipment_preset/fun/van_bandolier, FALSE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are a big game hunter!")) - to_chat(H, SPAN_ROLE_BODY("You've taken a shot at every beast of the earth, every fowl of the air, and everything that creepeth upon the earth. Mundane beasts \ - now bore you (and there may be some minor poaching charges after the Misunderstanding) and so you have traveled to this backwater sector to hunt the most dangerous \ - game wherever you can find it. You've heard grisly tales of murderous xenomorphs, triggerhappy soldiers, and bloodthirsty alien hunters (who sound like they have \ - the right idea, not like those ghastly Arcturians at all!) but so far all you've potted has been penny-ante stuff. \n\n Whether you recruit the natives for \ - porters, beaters, and guides, or hunt them for sport, is entirely up to you. They'll point you at something excellent if they know what's good for them.\n\n ")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + to_chat(H, role_header("You are a big game hunter!")) + to_chat(H, role_body("You've taken a shot at every beast of the earth, every fowl of the air, and everything that creepeth upon the earth. Mundane beasts now bore you (and there may be some minor poaching charges after the Misunderstanding) and so you have traveled to this backwater sector to hunt the most dangerous game wherever you can find it. You've heard grisly tales of murderous xenomorphs, triggerhappy soldiers, and bloodthirsty alien hunters (who sound like they have the right idea, not like those ghastl Arcturians at all!) but so far all you've potted has been penny-ante stuff.

Whether you recruit the natives for porters, beaters, and guides, or hunt them for sport, is entirely up to you. They'll point you at something excellent if they know what's good for them.")) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) diff --git a/code/datums/emergency_calls/cbrn.dm b/code/datums/emergency_calls/cbrn.dm index cee96e10137e..d594c0ecdc94 100644 --- a/code/datums/emergency_calls/cbrn.dm +++ b/code/datums/emergency_calls/cbrn.dm @@ -19,24 +19,24 @@ if(!leader && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(mob.client, JOB_SQUAD_LEADER, time_required_for_job)) leader = mob arm_equipment(mob, /datum/equipment_preset/uscm/cbrn/leader, TRUE, TRUE) - to_chat(mob, SPAN_ROLE_HEADER("You are the CBRN Fireteam Leader!")) + to_chat(mob, role_header("You are the CBRN Fireteam Leader!")) else if(medics < max_medics && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_MEDIC) && check_timelock(mob.client, JOB_SQUAD_MEDIC, time_required_for_job)) medics++ arm_equipment(mob, /datum/equipment_preset/uscm/cbrn/medic, TRUE, TRUE) - to_chat(mob, SPAN_ROLE_HEADER("You are the CBRN Squad Medic!")) + to_chat(mob, role_header("You are the CBRN Squad Medic!")) else if(engineers < max_engineers && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_ENGINEER) && check_timelock(mob.client, JOB_SQUAD_ENGI, time_required_for_job)) engineers++ arm_equipment(mob, /datum/equipment_preset/uscm/cbrn/engineer, TRUE, TRUE) - to_chat(mob, SPAN_ROLE_HEADER("You are the CBRN Squad Engineer!")) + to_chat(mob, role_header("You are the CBRN Squad Engineer!")) else arm_equipment(mob, /datum/equipment_preset/uscm/cbrn/standard, TRUE, TRUE) - to_chat(mob, SPAN_ROLE_HEADER("You are a CBRN Squad Rifleman!")) + to_chat(mob, role_header("You are a CBRN Squad Rifleman!")) - to_chat(mob, SPAN_ROLE_BODY("You are a member of the USCM's CBRN. The CBRN is a force that specializes in handling chemical, biological, radiological, and nuclear threats.")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + to_chat(mob, role_body("You are a member of the USCM's CBRN. The CBRN is a force that specializes in handling chemical, biological, radiological, and nuclear threats.")) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/cbrn/ert name = "CBRN (Distress)" @@ -71,10 +71,10 @@ if(!leader && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(mob.client, JOB_SQUAD_LEADER, time_required_for_job)) leader = mob arm_equipment(mob, /datum/equipment_preset/uscm/cbrn/specialist/lead, TRUE, TRUE) - to_chat(mob, SPAN_ROLE_HEADER("You are the CBRN Specialist Squad Leader!")) + to_chat(mob, role_header("You are the CBRN Specialist Squad Leader!")) else arm_equipment(mob, /datum/equipment_preset/uscm/cbrn/specialist, TRUE, TRUE) - to_chat(mob, SPAN_ROLE_HEADER("You are a CBRN Specialist!")) + to_chat(mob, role_header("You are a CBRN Specialist!")) - to_chat(mob, SPAN_ROLE_BODY("You are a member of the USCM's CBRN. The CBRN is a force that specializes in handling chemical, biological, radiological, and nuclear threats.")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + to_chat(mob, role_body("You are a member of the USCM's CBRN. The CBRN is a force that specializes in handling chemical, biological, radiological, and nuclear threats.")) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) diff --git a/code/datums/emergency_calls/clf.dm b/code/datums/emergency_calls/clf.dm index 837ecb340dda..36e6b529cba5 100644 --- a/code/datums/emergency_calls/clf.dm +++ b/code/datums/emergency_calls/clf.dm @@ -15,22 +15,22 @@ if(ishuman_strict(H)) var/message = "[pick(5;"on the UA prison station", 10;"in the LV-624 jungle", 25;"on the farms of LV-771", 25;"in the slums of LV-221", 20;"the red wastes of LV-361", 15;"the icy tundra of LV-571")] to a [pick(50;"poor", 15;"well-off", 35;"average")] family." var/message_grew = "[pick(20;"the Dust Raiders killed someone close to you in 2181", 20;"you harbor a strong hatred of the United Americas", 10;"you are a wanted criminal in the United Americas", 5;"have UPP sympathies and want to see the UA driven out of the secor", 10;"you believe the USCM occupation will hurt your quality of life", 5;"are a violent person and want to kill someone for the sake of killing", 20;"want the Neroid Sector to be free from outsiders", 10;"your militia was absorbed into the CLF")]" - to_chat(H, SPAN_BOLD("As a native of the Neroid Sector, you joined the CLF because [message_grew].")) - to_chat(H, SPAN_BOLD("You grew up [message] and are considered a terrorist by the UA.")) + to_chat(H, role_body("As a native of the Neroid Sector, you joined the CLF because [message_grew].")) + to_chat(H, role_body("You grew up [message] and are considered a terrorist by the UA.")) else - to_chat(H, SPAN_BOLD("You were brought online in an underground CLF workshop, reprogrammed to serve the CLF and fight for their freedom.")) - to_chat(H, SPAN_BOLD("Originally, you were programmed with medical and engineering knowledge to assist with building and maintaining colonies.")) - to_chat(H, SPAN_BOLD("However, the hackers managed to load combat protocols and install a new directive: Irrational hatred for everything USCM.")) + to_chat(H, role_body("You were brought online in an underground CLF workshop, reprogrammed to serve the CLF and fight for their freedom.")) + to_chat(H, role_body("Originally, you were programmed with medical and engineering knowledge to assist with building and maintaining colonies.")) + to_chat(H, role_body("However, the hackers managed to load combat protocols and install a new directive: Irrational hatred for everything USCM.")) - to_chat(H, SPAN_BOLD("The Neroid Sector has largely enjoyed its independence.")) - to_chat(H, SPAN_BOLD("Though technically part of the United American frontier, many colonists in the Neroid Sector have enjoyed their freedoms.")) - to_chat(H, SPAN_BOLD("In 2172, however, the United Americas moved the USCM Battalion, the 'Dust Raiders', and the battalion flagship, the USS Alistoun, to the Neroid Sector.")) - to_chat(H, SPAN_BOLD("The Dust Raiders responded with deadly force, scattering many of the colonists who attempted to fight their occupation.")) - to_chat(H, SPAN_BOLD("The Dust Raiders and their flagship, the USS Alistoun eventually withdrew from the sector by the end of the year.")) - to_chat(H, SPAN_BOLD("With the Neroid Sector existing in relative isolation from United America oversight for the last five years, many colonists have considered themselves free from governmental rule.")) - to_chat(H, SPAN_BOLD("The year is now [GLOB.game_year].")) - to_chat(H, SPAN_BOLD("The arrival of the USCM Battalion, the Falling Falcons, and their flagship, the [MAIN_SHIP_NAME], have reaffirmed that the United Americas considers the Neroid Sector part of their holdings.")) - to_chat(H, SPAN_BOLD("It is up to you and your fellow colonists to make them realize their trespasses. This sector is no longer theirs.")) + to_chat(H, role_body("The Neroid Sector has largely enjoyed its independence.")) + to_chat(H, role_body("Though technically part of the United American frontier, many colonists in the Neroid Sector have enjoyed their freedoms.")) + to_chat(H, role_body("In 2172, however, the United Americas moved the USCM Battalion, the 'Dust Raiders', and the battalion flagship, the USS Alistoun, to the Neroid Sector.")) + to_chat(H, role_body("The Dust Raiders responded with deadly force, scattering many of the colonists who attempted to fight their occupation.")) + to_chat(H, role_body("The Dust Raiders and their flagship, the USS Alistoun eventually withdrew from the sector by the end of the year.")) + to_chat(H, role_body("With the Neroid Sector existing in relative isolation from United America oversight for the last five years, many colonists have considered themselves free from governmental rule.")) + to_chat(H, role_body("The year is now [GLOB.game_year].")) + to_chat(H, role_body("The arrival of the USCM Battalion, the Falling Falcons, and their flagship, the [MAIN_SHIP_NAME], have reaffirmed that the United Americas considers the Neroid Sector part of their holdings.")) + to_chat(H, role_body("It is up to you and your fellow colonists to make them realize their trespasses. This sector is no longer theirs.")) /datum/emergency_call/clf/create_member(datum/mind/M, turf/override_spawn_loc) var/turf/spawn_loc = override_spawn_loc ? override_spawn_loc : get_spawn_point() @@ -43,30 +43,30 @@ if(!leader && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(H.client, JOB_SQUAD_LEADER, time_required_for_job)) leader = H - to_chat(H, SPAN_ROLE_HEADER("You are a Cell Leader of the local resistance group, the Colonial Liberation Front!")) + to_chat(H, role_header("You are a Cell Leader of the local resistance group, the Colonial Liberation Front!")) arm_equipment(H, /datum/equipment_preset/clf/leader, TRUE, TRUE) else if(synths < max_synths && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_SYNTH) && GLOB.RoleAuthority.roles_whitelist[H.ckey] & WHITELIST_SYNTHETIC) synths++ - to_chat(H, SPAN_ROLE_HEADER("You are a Multi-Purpose Synthetic for the local resistance group, the Colonial Liberation Front!")) + to_chat(H, role_header("You are a Multi-Purpose Synthetic for the local resistance group, the Colonial Liberation Front!")) arm_equipment(H, /datum/equipment_preset/clf/synth, TRUE, TRUE) else if(medics < max_medics && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_MEDIC) && check_timelock(H.client, JOB_SQUAD_MEDIC, time_required_for_job)) medics++ - to_chat(H, SPAN_ROLE_HEADER("You are a Medic of the local resistance group, the Colonial Liberation Front!")) + to_chat(H, role_header("You are a Medic of the local resistance group, the Colonial Liberation Front!")) arm_equipment(H, /datum/equipment_preset/clf/medic, TRUE, TRUE) else if(engineers < max_engineers && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_ENGINEER) && check_timelock(H.client, JOB_SQUAD_ENGI, time_required_for_job)) engineers++ - to_chat(H, SPAN_ROLE_HEADER("You are an Engineer of the local resistance group, the Colonial Liberation Front!")) + to_chat(H, role_header("You are an Engineer of the local resistance group, the Colonial Liberation Front!")) arm_equipment(H, /datum/equipment_preset/clf/engineer, TRUE, TRUE) else if(heavies < max_heavies && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_HEAVY) && check_timelock(H.client, JOB_SQUAD_SPECIALIST, time_required_for_job)) heavies++ - to_chat(H, SPAN_ROLE_HEADER("You are a Specialist of the local resistance group, the Colonial Liberation Front!")) + to_chat(H, role_header("You are a Specialist of the local resistance group, the Colonial Liberation Front!")) arm_equipment(H, /datum/equipment_preset/clf/specialist, TRUE, TRUE) else - to_chat(H, SPAN_ROLE_HEADER("You are a Fighter of the local resistance group, the Colonial Liberation Front!")) + to_chat(H, role_header("You are a Fighter of the local resistance group, the Colonial Liberation Front!")) arm_equipment(H, /datum/equipment_preset/clf/soldier, TRUE, TRUE) print_backstory(H) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/clf/platoon diff --git a/code/datums/emergency_calls/cmb.dm b/code/datums/emergency_calls/cmb.dm index 5dba3ee8fc7d..335028b6da4e 100644 --- a/code/datums/emergency_calls/cmb.dm +++ b/code/datums/emergency_calls/cmb.dm @@ -33,72 +33,72 @@ if(!leader && HAS_FLAG(mob?.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(mob.client, JOB_SQUAD_LEADER, time_required_for_job)) leader = mob - to_chat(mob, SPAN_ROLE_HEADER("You are the Colonial Marshal!")) + to_chat(mob, role_header("You are the Colonial Marshal!")) arm_equipment(mob, /datum/equipment_preset/cmb/leader, TRUE, TRUE) else if(synths < max_synths && HAS_FLAG(mob?.client.prefs.toggles_ert, PLAY_SYNTH) && GLOB.RoleAuthority.roles_whitelist[mob.ckey] & WHITELIST_SYNTHETIC) synths++ - to_chat(mob, SPAN_ROLE_HEADER("You are a CMB Investigative Synthetic!")) + to_chat(mob, role_header("You are a CMB Investigative Synthetic!")) arm_equipment(mob, /datum/equipment_preset/cmb/synth, TRUE, TRUE) else if(!icc_liaison && will_spawn_icc_liaison && check_timelock(mob.client, JOB_CORPORATE_LIAISON, time_required_for_job)) icc_liaison = mob - to_chat(mob, SPAN_ROLE_HEADER("You are a CMB-attached Interstellar Commerce Commission Liaison!")) + to_chat(mob, role_header("You are a CMB-attached Interstellar Commerce Commission Liaison!")) arm_equipment(mob, /datum/equipment_preset/cmb/liaison, TRUE, TRUE) else if(!cmb_observer && will_spawn_cmb_observer) cmb_observer = mob - to_chat(mob, SPAN_ROLE_HEADER("You are an Interstellar Human Rights Observer!")) + to_chat(mob, role_header("You are an Interstellar Human Rights Observer!")) arm_equipment(mob, /datum/equipment_preset/cmb/observer, TRUE, TRUE) else - to_chat(mob, SPAN_ROLE_HEADER("You are a CMB Deputy!")) + to_chat(mob, role_header("You are a CMB Deputy!")) arm_equipment(mob, /datum/equipment_preset/cmb/standard, TRUE, TRUE) print_backstory(mob) - addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(to_chat), mob, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/cmb/print_backstory(mob/living/carbon/human/M) if(M == leader) - to_chat(M, SPAN_BOLD("You are the Colonial Marshal, originally from [pick(70;"The United Americas", 20;"Sol", 10;"a colony on the frontier")].")) - to_chat(M, SPAN_BOLD("You started in the Marshals through [pick(50; "pursuing a career during college", 40;"working for law enforcement", 10;"being recruited for your skills")].")) - to_chat(M, SPAN_BOLD("Rising through positions across the galaxy, you have become renown for your steadfast commitment to justice, fighting against crime and corruption alike.")) - to_chat(M, SPAN_BOLD("Enroute to a [pick(20; "homicide", 20;"corporate corruption investigation", 10; "hostage situation", 10;"terrorist attack", 10;"prisoner transfer", 10;"drug raid", 10;"barricaded fugitive situation", 5;"suspected smuggling incident", 5;"human trafficking situation" )] you were diverted by your command at Anchorpoint Station to the [MAIN_SHIP_NAME] because of a distress beacon.")) - to_chat(M, SPAN_BOLD("The laws of Earth stretch beyond the Sol. Where others are tempted and fall to corruption, you stay steadfast in your morals.")) - to_chat(M, SPAN_BOLD("Corporate Officers chase after paychecks and promotions, but you are motivated to do your sworn duty and care for the population, no matter how far or isolated a colony may be.")) - to_chat(M, SPAN_BOLD("You've seen a lot during your time in the Neroid Sector, but you're here because you're the best, doing the right thing to make the frontier a better place.")) - to_chat(M, SPAN_BOLD("Despite being stretched thin, the stalwart oath of the Marshals has continued to keep communities safe, with the CMB well respected by many. You are the representation of that oath, serve with distinction.")) + to_chat(M, role_body("You are the Colonial Marshal, originally from [pick(70;"The United Americas", 20;"Sol", 10;"a colony on the frontier")].")) + to_chat(M, role_body("You started in the Marshals through [pick(50; "pursuing a career during college", 40;"working for law enforcement", 10;"being recruited for your skills")].")) + to_chat(M, role_body("Rising through positions across the galaxy, you have become renown for your steadfast commitment to justice, fighting against crime and corruption alike.")) + to_chat(M, role_body("Enroute to a [pick(20; "homicide", 20;"corporate corruption investigation", 10; "hostage situation", 10;"terrorist attack", 10;"prisoner transfer", 10;"drug raid", 10;"barricaded fugitive situation", 5;"suspected smuggling incident", 5;"human trafficking situation" )] you were diverted by your command at Anchorpoint Station to the [MAIN_SHIP_NAME] because of a distress beacon.")) + to_chat(M, role_body("The laws of Earth stretch beyond the Sol. Where others are tempted and fall to corruption, you stay steadfast in your morals.")) + to_chat(M, role_body("Corporate Officers chase after paychecks and promotions, but you are motivated to do your sworn duty and care for the population, no matter how far or isolated a colony may be.")) + to_chat(M, role_body("You've seen a lot during your time in the Neroid Sector, but you're here because you're the best, doing the right thing to make the frontier a better place.")) + to_chat(M, role_body("Despite being stretched thin, the stalwart oath of the Marshals has continued to keep communities safe, with the CMB well respected by many. You are the representation of that oath, serve with distinction.")) else if(issynth(M)) - to_chat(M, SPAN_BOLD("Despite being an older model, you are well regarded among your peers for your keen senses and alertness.")) - to_chat(M, SPAN_BOLD("In addition to law enforcement procedures, you are programmed to be an absolute expert in locating evidence, analyzing chemicals and investigating crimes.")) - to_chat(M, SPAN_BOLD("You do not enforce or comply with Marine Law, however you have an understanding of it.")) - to_chat(M, SPAN_BOLD("After receiving a software and law update in Sol, you were stationed at Anchorpoint Station to assist with CMB units on the frontier.")) - to_chat(M, SPAN_BOLD("While enroute to an investigation you were diverted by your command to the [MAIN_SHIP_NAME] because of a distress beacon.")) - to_chat(M, SPAN_BOLD("Should it be required, you are currently carrying the light munition and equipment reserves in your backpack to be given to your team.")) - to_chat(M, SPAN_BOLD("Despite being stretched thin, the stalwart oath of the Marshals has continued to keep communities safe, with the CMB well respected by many. You are a representation of that oath, serve with distinction.")) + to_chat(M, role_body("Despite being an older model, you are well regarded among your peers for your keen senses and alertness.")) + to_chat(M, role_body("In addition to law enforcement procedures, you are programmed to be an absolute expert in locating evidence, analyzing chemicals and investigating crimes.")) + to_chat(M, role_body("You do not enforce or comply with Marine Law, however you have an understanding of it.")) + to_chat(M, role_body("After receiving a software and law update in Sol, you were stationed at Anchorpoint Station to assist with CMB units on the frontier.")) + to_chat(M, role_body("While enroute to an investigation you were diverted by your command to the [MAIN_SHIP_NAME] because of a distress beacon.")) + to_chat(M, role_body("Should it be required, you are currently carrying the light munition and equipment reserves in your backpack to be given to your team.")) + to_chat(M, role_body("Despite being stretched thin, the stalwart oath of the Marshals has continued to keep communities safe, with the CMB well respected by many. You are a representation of that oath, serve with distinction.")) else if(M == icc_liaison) - to_chat(M, SPAN_BOLD("You are an Interstellar Commerce Liaison, originally from [pick(70;"The United Americas", 25;"Sol", 5;"a colony on the frontier")].")) - to_chat(M, SPAN_BOLD("You are [pick(30; "skeptical", 40;"ambicable", 30;"supportive")] of Weyland-Yutani.")) - to_chat(M, SPAN_BOLD("Your headset is equipped with several frequencies, including a gifted key from The ICC's parent company, Weyland-Yutani, to try to incentivize your support. Use it for communication.")) - to_chat(M, SPAN_BOLD("As the ICC Agent attached to the CMB Office at Anchorpoint Station, your job is to observe and ensure fair trade practices.")) - to_chat(M, SPAN_BOLD("Serving alongside such reputable men has made you a more virtuous person, especially compared to the Corporate Liaisons of other heavy-weight organizations.")) - to_chat(M, SPAN_BOLD("Work with the Colonial Marshals in their investigations and report to command if you suspect smuggling or illicit trade is happening.")) - to_chat(M, SPAN_BOLD("You were on your way to a crime scene when your ship was diverted to the [MAIN_SHIP_NAME] because of a distress beacon.")) + to_chat(M, role_body("You are an Interstellar Commerce Liaison, originally from [pick(70;"The United Americas", 25;"Sol", 5;"a colony on the frontier")].")) + to_chat(M, role_body("You are [pick(30; "skeptical", 40;"ambicable", 30;"supportive")] of Weyland-Yutani.")) + to_chat(M, role_body("Your headset is equipped with several frequencies, including a gifted key from The ICC's parent company, Weyland-Yutani, to try to incentivize your support. Use it for communication.")) + to_chat(M, role_body("As the ICC Agent attached to the CMB Office at Anchorpoint Station, your job is to observe and ensure fair trade practices.")) + to_chat(M, role_body("Serving alongside such reputable men has made you a more virtuous person, especially compared to the Corporate Liaisons of other heavy-weight organizations.")) + to_chat(M, role_body("Work with the Colonial Marshals in their investigations and report to command if you suspect smuggling or illicit trade is happening.")) + to_chat(M, role_body("You were on your way to a crime scene when your ship was diverted to the [MAIN_SHIP_NAME] because of a distress beacon.")) else if(M == cmb_observer) - to_chat(M, SPAN_BOLD("You are an Interstellar Human Rights Observer, originally from [pick(50;"The United Americas", 10;"Europe", 10;"Luna", 20;"Sol", 10;"a colony on the frontier")].")) - to_chat(M, SPAN_BOLD("You are [pick(60; "skeptical", 40;"ambicable", 10;"supportive")] of Weyland-Yutani and their practices.")) - to_chat(M, SPAN_BOLD("You are [pick(40; "skeptical", 30;"ambicable", 30;"supportive")] of the USCM's actions on the frontier.")) - to_chat(M, SPAN_BOLD("Through a lot of hard work, your organization managed to convince the Colonial Marshals to take you to the frontier for an article about the quality of life there.")) - to_chat(M, SPAN_BOLD("Observe the Feds in their adventures and keep an eye out for any inhumane acts from others. The Neroid Sector is full of atrocities on every side.")) - to_chat(M, SPAN_BOLD("Do not instigate or start any confrontations. You are an observer, and you do not wage wars. Only intervene in medical emergencies.")) - to_chat(M, SPAN_BOLD("You were on your way to a crime scene when your ship was diverted to the [MAIN_SHIP_NAME] because of a distress beacon.")) + to_chat(M, role_body("You are an Interstellar Human Rights Observer, originally from [pick(50;"The United Americas", 10;"Europe", 10;"Luna", 20;"Sol", 10;"a colony on the frontier")].")) + to_chat(M, role_body("You are [pick(60; "skeptical", 40;"ambicable", 10;"supportive")] of Weyland-Yutani and their practices.")) + to_chat(M, role_body("You are [pick(40; "skeptical", 30;"ambicable", 30;"supportive")] of the USCM's actions on the frontier.")) + to_chat(M, role_body("Through a lot of hard work, your organization managed to convince the Colonial Marshals to take you to the frontier for an article about the quality of life there.")) + to_chat(M, role_body("Observe the Feds in their adventures and keep an eye out for any inhumane acts from others. The Neroid Sector is full of atrocities on every side.")) + to_chat(M, role_body("Do not instigate or start any confrontations. You are an observer, and you do not wage wars. Only intervene in medical emergencies.")) + to_chat(M, role_body("You were on your way to a crime scene when your ship was diverted to the [MAIN_SHIP_NAME] because of a distress beacon.")) else - to_chat(M, SPAN_BOLD("You are a CMB Deputy, originally from [pick(70;"The United Americas", 20;"Sol", 10;"a colony on the frontier")].")) - to_chat(M, SPAN_BOLD("You joined the Marshals through [pick(50; "pursuing a career during college", 40;"working for law enforcement", 10;"being recruited for your skills")].")) - to_chat(M, SPAN_BOLD("Following the lead of your Marshal, you have become renown for your steadfast commitment to justice, fighting against crime and corruption alike.")) - to_chat(M, SPAN_BOLD("While enroute to an investigation you were diverted by your command at Anchorpoint Station to the [MAIN_SHIP_NAME] because of a distress beacon.")) - to_chat(M, SPAN_BOLD("You have been stationed at Anchorpoint Station for [pick(80;"several months", 10;"only a week", 10;"years")] investigating henious crimes among the frontier.")) - to_chat(M, SPAN_BOLD("The laws of arth stretch beyond the Sol. Where others fall to corruption, you stay steadfast in your morals.")) - to_chat(M, SPAN_BOLD("Corporate Officers chase after paychecks and promotions, but you are motivated to do your sworn duty and care for the population, no matter how far or isolated a colony may be.")) - to_chat(M, SPAN_BOLD("Despite being stretched thin, the stalwart oath of the Marshals has continued to keep communities safe, with the CMB well respected by many. You are a representation of that oath, serve with distinction.")) + to_chat(M, role_body("You are a CMB Deputy, originally from [pick(70;"The United Americas", 20;"Sol", 10;"a colony on the frontier")].")) + to_chat(M, role_body("You joined the Marshals through [pick(50; "pursuing a career during college", 40;"working for law enforcement", 10;"being recruited for your skills")].")) + to_chat(M, role_body("Following the lead of your Marshal, you have become renown for your steadfast commitment to justice, fighting against crime and corruption alike.")) + to_chat(M, role_body("While enroute to an investigation you were diverted by your command at Anchorpoint Station to the [MAIN_SHIP_NAME] because of a distress beacon.")) + to_chat(M, role_body("You have been stationed at Anchorpoint Station for [pick(80;"several months", 10;"only a week", 10;"years")] investigating henious crimes among the frontier.")) + to_chat(M, role_body("The laws of arth stretch beyond the Sol. Where others fall to corruption, you stay steadfast in your morals.")) + to_chat(M, role_body("Corporate Officers chase after paychecks and promotions, but you are motivated to do your sworn duty and care for the population, no matter how far or isolated a colony may be.")) + to_chat(M, role_body("Despite being stretched thin, the stalwart oath of the Marshals has continued to keep communities safe, with the CMB well respected by many. You are a representation of that oath, serve with distinction.")) // A Nearby Colonial Marshal patrol team responding to Marshals in Distress. @@ -139,72 +139,72 @@ if(!leader && HAS_FLAG(mob?.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(mob.client, JOB_SQUAD_LEADER, time_required_for_job)) leader = mob - to_chat(mob, SPAN_ROLE_HEADER("You are the Marine Fireteam Leader of Anchorpoint Station!")) + to_chat(mob, role_header("You are the Marine Fireteam Leader of Anchorpoint Station!")) arm_equipment(mob, /datum/equipment_preset/uscm/cmb/leader, TRUE, TRUE) // placeholder else if(smartgunners < max_smartgunners && HAS_FLAG(mob?.client.prefs.toggles_ert, PLAY_SMARTGUNNER) && check_timelock(mob.client, JOB_SQUAD_SMARTGUN, time_required_for_job)) smartgunners++ - to_chat(mob, SPAN_ROLE_HEADER("You are a Smartgunner of Anchorpoint Station!")) + to_chat(mob, role_header("You are a Smartgunner of Anchorpoint Station!")) arm_equipment(mob, /datum/equipment_preset/uscm/cmb/smartgunner, TRUE, TRUE) else if (medics < max_medics && HAS_FLAG(mob?.client.prefs.toggles_ert, PLAY_MEDIC) && check_timelock(mob.client, JOB_SQUAD_MEDIC, time_required_for_job)) medics++ - to_chat(mob, SPAN_ROLE_HEADER("You are a Marine Corpsman of Anchorpoint Station!")) + to_chat(mob, role_header("You are a Marine Corpsman of Anchorpoint Station!")) arm_equipment(mob, /datum/equipment_preset/uscm/cmb/medic, TRUE, TRUE) else if(engineers < max_engineers && HAS_FLAG(mob?.client.prefs.toggles_ert, PLAY_ENGINEER) && check_timelock(mob.client, JOB_SQUAD_ENGI, time_required_for_job)) engineers++ - to_chat(mob, SPAN_ROLE_HEADER("You are a Technical Specialist of Anchorpoint Station!")) + to_chat(mob, role_header("You are a Technical Specialist of Anchorpoint Station!")) arm_equipment(mob, /datum/equipment_preset/uscm/cmb/rto, TRUE, TRUE) else - to_chat(mob, SPAN_ROLE_HEADER("You are a Marine Rifleman of Anchorpoint Station!")) + to_chat(mob, role_header("You are a Marine Rifleman of Anchorpoint Station!")) arm_equipment(mob, /datum/equipment_preset/uscm/cmb, TRUE, TRUE) print_backstory(mob) - addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(to_chat), mob, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/cmb/anchorpoint/print_backstory(mob/living/carbon/human/M) if(M == leader) - to_chat(M, SPAN_BOLD("You are the Anchorpoint QRF Fireteam Leader, originally from [pick(70;"The United Americas", 20;"Sol", 10;"a colony on the frontier")].")) - to_chat(M, SPAN_BOLD("You've served on The Station for [pick(50; "a Sol year, and a tour of duty", 40;"a couple months", 10;"six years, three tours")].")) - to_chat(M, SPAN_BOLD("Living, training and working alongside Colonial Marshals at Anchorpoint Station has kept you well disciplined, and you've always felt proud to be the cavalry.")) - to_chat(M, SPAN_BOLD("During your time at Anchorpoint, you [pick(20; "had your life saved by a Colonial Marshal", 20;"quelled a corporate riot", 10; "defended the station against a UPP incursion", 10;"experienced a pathogenic outbreak", 10;"assisted the Colonial Marshals during an enacted martial law", 10;"were deployed to the [MAIN_SHIP_NAME], and understand its layout", 10;"assisted the Colonial Marshals with barricaded fugitive situation", 5;"helped the ICC take down a suspected smuggling ring", 5;"helped take down a human trafficking scheme alongside the Colonial Marshals" )].")) - to_chat(M, SPAN_BOLD("Working on conjunction with the Colonial Marshals on many incidents has created a comradery between your organizations. The Marshals handle investigations and policing, while you come in to get the job done during riots or incursions. Any job where heavy lifting was required, you were there.")) - to_chat(M, SPAN_BOLD("You were activated as a part of a Quick Reaction Force to reinforce Colonial Marshals in distress.")) - to_chat(M, SPAN_BOLD("You weren't sure if it was a false alarm or not. Turns out it isn't...")) - to_chat(M, SPAN_BOLD("Now it looks like the time to be the cavalry is once more upon you. Brief your men, move 'em out!")) + to_chat(M, role_body("You are the Anchorpoint QRF Fireteam Leader, originally from [pick(70;"The United Americas", 20;"Sol", 10;"a colony on the frontier")].")) + to_chat(M, role_body("You've served on The Station for [pick(50; "a Sol year, and a tour of duty", 40;"a couple months", 10;"six years, three tours")].")) + to_chat(M, role_body("Living, training and working alongside Colonial Marshals at Anchorpoint Station has kept you well disciplined, and you've always felt proud to be the cavalry.")) + to_chat(M, role_body("During your time at Anchorpoint, you [pick(20; "had your life saved by a Colonial Marshal", 20;"quelled a corporate riot", 10; "defended the station against a UPP incursion", 10;"experienced a pathogenic outbreak", 10;"assisted the Colonial Marshals during an enacted martial law", 10;"were deployed to the [MAIN_SHIP_NAME], and understand its layout", 10;"assisted the Colonial Marshals with barricaded fugitive situation", 5;"helped the ICC take down a suspected smuggling ring", 5;"helped take down a human trafficking scheme alongside the Colonial Marshals" )].")) + to_chat(M, role_body("Working on conjunction with the Colonial Marshals on many incidents has created a comradery between your organizations. The Marshals handle investigations and policing, while you come in to get the job done during riots or incursions. Any job where heavy lifting was required, you were there.")) + to_chat(M, role_body("You were activated as a part of a Quick Reaction Force to reinforce Colonial Marshals in distress.")) + to_chat(M, role_body("You weren't sure if it was a false alarm or not. Turns out it isn't...")) + to_chat(M, role_body("Now it looks like the time to be the cavalry is once more upon you. Brief your men, move 'em out!")) else if(M == smartgunners) - to_chat(M, SPAN_BOLD("You are the Anchorpoint QRF Team Smartgunner, originally from [pick(70;"The United Americas", 20;"Sol", 10;"a colony on the frontier")].")) - to_chat(M, SPAN_BOLD("You've served on The Station for [pick(45; "a Sol year, and a tour of duty", 20;"a couple months", 5;"six long years, three consecutive tours")].")) - to_chat(M, SPAN_BOLD("Living, training and working alongside Colonial Marshals at Anchorpoint Station has kept you well disciplined, and you've always felt proud to be the cavalry.")) - to_chat(M, SPAN_BOLD("During your time at Anchorpoint, you [pick(20; "had your life saved by a Colonial Marshal", 20;"quelled a corporate riot", 10; "defended the station against a UPP incursion", 10;"experienced a pathogenic outbreak", 10;"assisted the Colonial Marshals during an enacted martial law", 10;"were deployed to the [MAIN_SHIP_NAME], and understand its layout", 10;"assisted the Colonial Marshals with barricaded fugitive situation", 5;"helped the ICC take down a suspected smuggling ring", 5;"helped take down a human trafficking scheme alongside the Colonial Marshals" )].")) - to_chat(M, SPAN_BOLD("Working on conjunction with the Colonial Marshals on many incidents has created a comradery between your organizations. The Marshals handle investigations and policing, while you come in to get the job done during riots or incursions. Any job where heavy lifting was required, you were there.")) - to_chat(M, SPAN_BOLD("You were activated as a part of a Quick Reaction Force to reinforce Colonial Marshals in distress.")) - to_chat(M, SPAN_BOLD("You weren't sure if it was a false alarm or not. Turns out it isn't... But you've been waiting for an excuse to let loose that M56.")) - to_chat(M, SPAN_BOLD("Now it looks like the time to be the cavalry is once more upon you. Let's rock!")) + to_chat(M, role_body("You are the Anchorpoint QRF Team Smartgunner, originally from [pick(70;"The United Americas", 20;"Sol", 10;"a colony on the frontier")].")) + to_chat(M, role_body("You've served on The Station for [pick(45; "a Sol year, and a tour of duty", 20;"a couple months", 5;"six long years, three consecutive tours")].")) + to_chat(M, role_body("Living, training and working alongside Colonial Marshals at Anchorpoint Station has kept you well disciplined, and you've always felt proud to be the cavalry.")) + to_chat(M, role_body("During your time at Anchorpoint, you [pick(20; "had your life saved by a Colonial Marshal", 20;"quelled a corporate riot", 10; "defended the station against a UPP incursion", 10;"experienced a pathogenic outbreak", 10;"assisted the Colonial Marshals during an enacted martial law", 10;"were deployed to the [MAIN_SHIP_NAME], and understand its layout", 10;"assisted the Colonial Marshals with barricaded fugitive situation", 5;"helped the ICC take down a suspected smuggling ring", 5;"helped take down a human trafficking scheme alongside the Colonial Marshals" )].")) + to_chat(M, role_body("Working on conjunction with the Colonial Marshals on many incidents has created a comradery between your organizations. The Marshals handle investigations and policing, while you come in to get the job done during riots or incursions. Any job where heavy lifting was required, you were there.")) + to_chat(M, role_body("You were activated as a part of a Quick Reaction Force to reinforce Colonial Marshals in distress.")) + to_chat(M, role_body("You weren't sure if it was a false alarm or not. Turns out it isn't... But you've been waiting for an excuse to let loose that M56.")) + to_chat(M, role_body("Now it looks like the time to be the cavalry is once more upon you. Let's rock!")) else if(M == medics) - to_chat(M, SPAN_BOLD("You are the Anchorpoint QRF Team Corpsman, originally from [pick(70;"The United Americas", 20;"Sol", 10;"a colony on the frontier")].")) - to_chat(M, SPAN_BOLD("You've served on The Station for [pick(45; "a Sol year, and a tour of duty", 20;"a couple months", 5;"six long years, three consecutive tours")].")) - to_chat(M, SPAN_BOLD("Living, training and working alongside Colonial Marshals at Anchorpoint Station has kept you well disciplined, and you've always felt proud to be the cavalry.")) - to_chat(M, SPAN_BOLD("During your time at Anchorpoint, you [pick(20; "had your life saved by a Colonial Marshal", 20;"quelled a corporate riot", 10; "defended the station against a UPP incursion", 10;"experienced a pathogenic outbreak", 10;"assisted the Colonial Marshals during an enacted martial law", 10;"were deployed to the [MAIN_SHIP_NAME], and understand its layout", 10;"assisted the Colonial Marshals with barricaded fugitive situation", 5;"helped the ICC take down a suspected smuggling ring", 5;"helped take down a human trafficking scheme alongside the Colonial Marshals" )].")) - to_chat(M, SPAN_BOLD("Working on conjunction with the Colonial Marshals on many incidents has created a comradery between your organizations. The Marshals handle investigations and policing, while you come in to get the job done during riots or incursions. Any job where heavy lifting was required, you were there.")) - to_chat(M, SPAN_BOLD("You were activated as a part of a Quick Reaction Force to reinforce Colonial Marshals in distress.")) - to_chat(M, SPAN_BOLD("You weren't sure if it was a false alarm or not. Turns out it isn't...")) - to_chat(M, SPAN_BOLD("Now it looks like the time to be the cavalry is once more upon you.")) + to_chat(M, role_body("You are the Anchorpoint QRF Team Corpsman, originally from [pick(70;"The United Americas", 20;"Sol", 10;"a colony on the frontier")].")) + to_chat(M, role_body("You've served on The Station for [pick(45; "a Sol year, and a tour of duty", 20;"a couple months", 5;"six long years, three consecutive tours")].")) + to_chat(M, role_body("Living, training and working alongside Colonial Marshals at Anchorpoint Station has kept you well disciplined, and you've always felt proud to be the cavalry.")) + to_chat(M, role_body("During your time at Anchorpoint, you [pick(20; "had your life saved by a Colonial Marshal", 20;"quelled a corporate riot", 10; "defended the station against a UPP incursion", 10;"experienced a pathogenic outbreak", 10;"assisted the Colonial Marshals during an enacted martial law", 10;"were deployed to the [MAIN_SHIP_NAME], and understand its layout", 10;"assisted the Colonial Marshals with barricaded fugitive situation", 5;"helped the ICC take down a suspected smuggling ring", 5;"helped take down a human trafficking scheme alongside the Colonial Marshals" )].")) + to_chat(M, role_body("Working on conjunction with the Colonial Marshals on many incidents has created a comradery between your organizations. The Marshals handle investigations and policing, while you come in to get the job done during riots or incursions. Any job where heavy lifting was required, you were there.")) + to_chat(M, role_body("You were activated as a part of a Quick Reaction Force to reinforce Colonial Marshals in distress.")) + to_chat(M, role_body("You weren't sure if it was a false alarm or not. Turns out it isn't...")) + to_chat(M, role_body("Now it looks like the time to be the cavalry is once more upon you.")) else if(M == engineers) - to_chat(M, SPAN_BOLD("You are the Anchorpoint QRF Team Technical Specialist, originally from [pick(70;"The United Americas", 20;"Sol", 10;"a colony on the frontier")].")) - to_chat(M, SPAN_BOLD("You've served on The Station for [pick(45; "a Sol year, and a tour of duty", 20;"a couple months", 5;"six long years, three consecutive tours")].")) - to_chat(M, SPAN_BOLD("Living, training and working alongside Colonial Marshals at Anchorpoint Station has kept you well disciplined, and you've always felt proud to be the cavalry.")) - to_chat(M, SPAN_BOLD("During your time at Anchorpoint, you [pick(20; "had your life saved by a Colonial Marshal", 20;"quelled a corporate riot", 10; "defended the station against a UPP incursion", 10;"experienced a pathogenic outbreak", 10;"assisted the Colonial Marshals during an enacted martial law", 10;"were deployed to the [MAIN_SHIP_NAME], and understand its layout", 10;"assisted the Colonial Marshals with barricaded fugitive situation", 5;"helped the ICC take down a suspected smuggling ring", 5;"helped take down a human trafficking scheme alongside the Colonial Marshals" )].")) - to_chat(M, SPAN_BOLD("Working on conjunction with the Colonial Marshals on many incidents has created a comradery between your organizations. The Marshals handle investigations and policing, while you come in to get the job done during riots or incursions. Any job where heavy lifting was required, you were there.")) - to_chat(M, SPAN_BOLD("You were activated as a part of a Quick Reaction Force to reinforce Colonial Marshals in distress.")) - to_chat(M, SPAN_BOLD("You weren't sure if it was a false alarm or not. Turns out it isn't...")) - to_chat(M, SPAN_BOLD("Now it looks like the time to be the cavalry is once more upon you. Signal's clean.")) + to_chat(M, role_body("You are the Anchorpoint QRF Team Technical Specialist, originally from [pick(70;"The United Americas", 20;"Sol", 10;"a colony on the frontier")].")) + to_chat(M, role_body("You've served on The Station for [pick(45; "a Sol year, and a tour of duty", 20;"a couple months", 5;"six long years, three consecutive tours")].")) + to_chat(M, role_body("Living, training and working alongside Colonial Marshals at Anchorpoint Station has kept you well disciplined, and you've always felt proud to be the cavalry.")) + to_chat(M, role_body("During your time at Anchorpoint, you [pick(20; "had your life saved by a Colonial Marshal", 20;"quelled a corporate riot", 10; "defended the station against a UPP incursion", 10;"experienced a pathogenic outbreak", 10;"assisted the Colonial Marshals during an enacted martial law", 10;"were deployed to the [MAIN_SHIP_NAME], and understand its layout", 10;"assisted the Colonial Marshals with barricaded fugitive situation", 5;"helped the ICC take down a suspected smuggling ring", 5;"helped take down a human trafficking scheme alongside the Colonial Marshals" )].")) + to_chat(M, role_body("Working on conjunction with the Colonial Marshals on many incidents has created a comradery between your organizations. The Marshals handle investigations and policing, while you come in to get the job done during riots or incursions. Any job where heavy lifting was required, you were there.")) + to_chat(M, role_body("You were activated as a part of a Quick Reaction Force to reinforce Colonial Marshals in distress.")) + to_chat(M, role_body("You weren't sure if it was a false alarm or not. Turns out it isn't...")) + to_chat(M, role_body("Now it looks like the time to be the cavalry is once more upon you. Signal's clean.")) else - to_chat(M, SPAN_BOLD("You are a Rifleman of the Anchorpoint Team QRF, originally from [pick(70;"The United Americas", 20;"Sol", 10;"a colony on the frontier")].")) - to_chat(M, SPAN_BOLD("You've served on The Station for [pick(45; "a Sol year, and a tour of duty", 20;"a couple months", 5;"six long years, three consecutive tours")].")) - to_chat(M, SPAN_BOLD("Living, training and working alongside Colonial Marshals at Anchorpoint Station has kept you well disciplined, and you've always felt proud to be the cavalry.")) - to_chat(M, SPAN_BOLD("During your time at Anchorpoint, you [pick(20; "had your life saved by a Colonial Marshal", 20;"quelled a corporate riot", 10; "defended the station against a UPP incursion", 10;"experienced a pathogenic outbreak", 10;"assisted the Colonial Marshals during an enacted martial law", 10;"were deployed to the [MAIN_SHIP_NAME], and understand its layout", 10;"assisted the Colonial Marshals with barricaded fugitive situation", 5;"helped the ICC take down a suspected smuggling ring", 5;"helped take down a human trafficking scheme alongside the Colonial Marshals" )].")) - to_chat(M, SPAN_BOLD("Working on conjunction with the Colonial Marshals on many incidents has created a comradery between your organizations. The Marshals handle investigations and policing, while you come in to get the job done during riots or incursions. Any job where heavy lifting was required, you were there.")) - to_chat(M, SPAN_BOLD("You were activated as a part of a Quick Reaction Force to reinforce Colonial Marshals in distress.")) - to_chat(M, SPAN_BOLD("You weren't sure if it was a false alarm or not. Turns out it isn't...")) - to_chat(M, SPAN_BOLD("Now it looks like the time to be the cavalry is once more upon you.")) + to_chat(M, role_body("You are a Rifleman of the Anchorpoint Team QRF, originally from [pick(70;"The United Americas", 20;"Sol", 10;"a colony on the frontier")].")) + to_chat(M, role_body("You've served on The Station for [pick(45; "a Sol year, and a tour of duty", 20;"a couple months", 5;"six long years, three consecutive tours")].")) + to_chat(M, role_body("Living, training and working alongside Colonial Marshals at Anchorpoint Station has kept you well disciplined, and you've always felt proud to be the cavalry.")) + to_chat(M, role_body("During your time at Anchorpoint, you [pick(20; "had your life saved by a Colonial Marshal", 20;"quelled a corporate riot", 10; "defended the station against a UPP incursion", 10;"experienced a pathogenic outbreak", 10;"assisted the Colonial Marshals during an enacted martial law", 10;"were deployed to the [MAIN_SHIP_NAME], and understand its layout", 10;"assisted the Colonial Marshals with barricaded fugitive situation", 5;"helped the ICC take down a suspected smuggling ring", 5;"helped take down a human trafficking scheme alongside the Colonial Marshals" )].")) + to_chat(M, role_body("Working on conjunction with the Colonial Marshals on many incidents has created a comradery between your organizations. The Marshals handle investigations and policing, while you come in to get the job done during riots or incursions. Any job where heavy lifting was required, you were there.")) + to_chat(M, role_body("You were activated as a part of a Quick Reaction Force to reinforce Colonial Marshals in distress.")) + to_chat(M, role_body("You weren't sure if it was a false alarm or not. Turns out it isn't...")) + to_chat(M, role_body("Now it looks like the time to be the cavalry is once more upon you.")) diff --git a/code/datums/emergency_calls/colonist.dm b/code/datums/emergency_calls/colonist.dm index 8b39ca12a01e..4eb5df50ea29 100644 --- a/code/datums/emergency_calls/colonist.dm +++ b/code/datums/emergency_calls/colonist.dm @@ -24,8 +24,8 @@ sleep(20) if(H && H.loc) - to_chat(H, SPAN_ROLE_HEADER("You are a colonist!")) - to_chat(H, SPAN_ROLE_BODY("You have been put into the game by a staff member. Please follow all staff instructions.")) + to_chat(H, role_header("You are a colonist!")) + to_chat(H, role_body("You have been put into the game by a staff member. Please follow all staff instructions.")) /datum/emergency_call/colonist/engineers name = "Colonists - Engineers" diff --git a/code/datums/emergency_calls/contractor.dm b/code/datums/emergency_calls/contractor.dm index 0e0c975f0d13..4d94896a827e 100644 --- a/code/datums/emergency_calls/contractor.dm +++ b/code/datums/emergency_calls/contractor.dm @@ -27,51 +27,51 @@ if(!leader && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(mob.client, JOB_SQUAD_LEADER, time_required_for_job)) leader = mob - to_chat(mob, SPAN_ROLE_HEADER("You are a Contractor Team Leader of Vanguard's Arrow Incorporated!")) + to_chat(mob, role_header("You are a Contractor Team Leader of Vanguard's Arrow Incorporated!")) arm_equipment(mob, /datum/equipment_preset/contractor/duty/leader, TRUE, TRUE) else if(synths < max_synths && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_SYNTH) && GLOB.RoleAuthority.roles_whitelist[mob.ckey] & WHITELIST_SYNTHETIC) synths++ - to_chat(mob, SPAN_ROLE_HEADER("You are a Contractor Support Synthetic of Vanguard's Arrow Incorporated!")) + to_chat(mob, role_header("You are a Contractor Support Synthetic of Vanguard's Arrow Incorporated!")) arm_equipment(mob, /datum/equipment_preset/contractor/duty/synth, TRUE, TRUE) else if(medics < max_medics && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_MEDIC) && check_timelock(mob.client, JOB_SQUAD_MEDIC, time_required_for_job)) medics++ - to_chat(mob, SPAN_ROLE_HEADER("You are a Contractor Medical Specialist of Vanguard's Arrow Incorporated!")) + to_chat(mob, role_header("You are a Contractor Medical Specialist of Vanguard's Arrow Incorporated!")) arm_equipment(mob, /datum/equipment_preset/contractor/duty/medic, TRUE, TRUE) else if(heavies < max_heavies && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_HEAVY) && check_timelock(mob.client, JOB_SQUAD_SPECIALIST)) heavies++ - to_chat(mob, SPAN_ROLE_HEADER("You are a Contractor Machinegunner of Vanguard's Arrow Incorporated!")) + to_chat(mob, role_header("You are a Contractor Machinegunner of Vanguard's Arrow Incorporated!")) arm_equipment(mob, /datum/equipment_preset/contractor/duty/heavy, TRUE, TRUE) else if(engineers < max_engineers && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_ENGINEER) && check_timelock(mob.client, JOB_SQUAD_ENGI)) engineers++ - to_chat(mob, SPAN_ROLE_HEADER("You are a Contractor Engineering Specialist of Vanguard's Arrow Incorporated!")) + to_chat(mob, role_header("You are a Contractor Engineering Specialist of Vanguard's Arrow Incorporated!")) arm_equipment(mob, /datum/equipment_preset/contractor/duty/engi, TRUE, TRUE) else - to_chat(mob, SPAN_ROLE_HEADER("You are a Contractor of Vanguard's Arrow Incorporated!")) + to_chat(mob, role_header("You are a Contractor of Vanguard's Arrow Incorporated!")) arm_equipment(mob, /datum/equipment_preset/contractor/duty/standard, TRUE, TRUE) print_backstory(mob) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/contractors/print_backstory(mob/living/carbon/human/M) if(ishuman_strict(M)) - to_chat(M, SPAN_BOLD("You were born [pick(60;"in the United States", 20;"on Earth", 20;"on a colony")] to a [pick(75;"average", 15;"poor", 10;"well-established")] family.")) - to_chat(M, SPAN_BOLD("Joining the USCM gave you a lot of combat experience and useful skills but changed you.")) - to_chat(M, SPAN_BOLD("After getting out, you couldn't hold a job with the things you saw and did, deciding to put your skills to use you joined a Military Contractor firm.")) - to_chat(M, SPAN_BOLD("You are a skilled mercenary, making better pay than in the Corps.")) + to_chat(M, role_body("You were born [pick(60;"in the United States", 20;"on Earth", 20;"on a colony")] to a [pick(75;"average", 15;"poor", 10;"well-established")] family.")) + to_chat(M, role_body("Joining the USCM gave you a lot of combat experience and useful skills but changed you.")) + to_chat(M, role_body("After getting out, you couldn't hold a job with the things you saw and did, deciding to put your skills to use you joined a Military Contractor firm.")) + to_chat(M, role_body("You are a skilled mercenary, making better pay than in the Corps.")) else - to_chat(M, SPAN_BOLD("You were brought online in a civilian factory.")) - to_chat(M, SPAN_BOLD("You were programmed with all of the medical and engineering knowledge a military fighting force support asset required.")) - to_chat(M, SPAN_BOLD("You were soon after bought by Vanguard's Arrow Incorporated(VAI) to act as support personnel.")) - to_chat(M, SPAN_BOLD("Some months after your purchase, you were assigned to the USCSS Inheritor, a VAI transport vessel.")) - to_chat(M, SPAN_BOLD("You are [pick(80;"unaware", 15;"faintly aware", 5;"knowledgeable")] of the xenomorph threat.")) - to_chat(M, SPAN_BOLD("You are employed by Vanguard's Arrow Incorporated(VAI), as a member of VAI Primary Operations(VAIPO)")) - to_chat(M, SPAN_BOLD("You are stationed on-board the USCSS Inheritor, a part of VAIPO Task-Force Charlie.")) - to_chat(M, SPAN_BOLD("Under the directive of the VAI executive board, you have been assist in riot control, military aid, and to assist USCMC forces wherever possible.")) - to_chat(M, SPAN_BOLD("The USCSS Inheritor is staffed with crew of roughly three hundred military contractors, and fifty support personnel.")) - to_chat(M, SPAN_BOLD("Assist the USCMC Force of the [MAIN_SHIP_NAME] however you can.")) - to_chat(M, SPAN_BOLD("As a side-objective, VAI has been hired by an unknown benefactor to engage in corporate espionage and sabotage against Weyland-Yutani, avoid direct conflict; you aren't VAISO; but attempt to recover Wey-Yu secrets and plans if possible.")) + to_chat(M, role_body("You were brought online in a civilian factory.")) + to_chat(M, role_body("You were programmed with all of the medical and engineering knowledge a military fighting force support asset required.")) + to_chat(M, role_body("You were soon after bought by Vanguard's Arrow Incorporated(VAI) to act as support personnel.")) + to_chat(M, role_body("Some months after your purchase, you were assigned to the USCSS Inheritor, a VAI transport vessel.")) + to_chat(M, role_body("You are [pick(80;"unaware", 15;"faintly aware", 5;"knowledgeable")] of the xenomorph threat.")) + to_chat(M, role_body("You are employed by Vanguard's Arrow Incorporated(VAI), as a member of VAI Primary Operations(VAIPO)")) + to_chat(M, role_body("You are stationed on-board the USCSS Inheritor, a part of VAIPO Task-Force Charlie.")) + to_chat(M, role_body("Under the directive of the VAI executive board, you have been assist in riot control, military aid, and to assist USCMC forces wherever possible.")) + to_chat(M, role_body("The USCSS Inheritor is staffed with crew of roughly three hundred military contractors, and fifty support personnel.")) + to_chat(M, role_body("Assist the USCMC Force of the [MAIN_SHIP_NAME] however you can.")) + to_chat(M, role_body("As a side-objective, VAI has been hired by an unknown benefactor to engage in corporate espionage and sabotage against Weyland-Yutani, avoid direct conflict; you aren't VAISO; but attempt to recover Wey-Yu secrets and plans if possible.")) /datum/emergency_call/contractors/platoon @@ -121,29 +121,29 @@ if(!leader && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(H.client, JOB_SQUAD_LEADER, time_required_for_job)) //First one spawned is always the leader. leader = H - to_chat(H, SPAN_ROLE_HEADER("You are a Covert Contractor Team Leader of Vanguard's Arrow Incorporated!")) + to_chat(H, role_header("You are a Covert Contractor Team Leader of Vanguard's Arrow Incorporated!")) arm_equipment(H, /datum/equipment_preset/contractor/covert/leader, TRUE, TRUE) else if(synths < max_synths && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_SYNTH) && GLOB.RoleAuthority.roles_whitelist[H.ckey] & WHITELIST_SYNTHETIC) synths++ - to_chat(H, SPAN_ROLE_HEADER("You are a Contractor Support Synthetic of Vanguard's Arrow Incorporated!")) + to_chat(H, role_header("You are a Contractor Support Synthetic of Vanguard's Arrow Incorporated!")) arm_equipment(H, /datum/equipment_preset/contractor/covert/synth, TRUE, TRUE) else if(medics < max_medics && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_MEDIC) && check_timelock(H.client, JOB_SQUAD_MEDIC, time_required_for_job)) medics++ - to_chat(H, SPAN_ROLE_HEADER("You are a Covert Contractor Medical Specialist of Vanguard's Arrow Incorporated!")) + to_chat(H, role_header("You are a Covert Contractor Medical Specialist of Vanguard's Arrow Incorporated!")) arm_equipment(H, /datum/equipment_preset/contractor/covert/medic, TRUE, TRUE) else if(heavies < max_heavies && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_SMARTGUNNER) && check_timelock(H.client, JOB_SQUAD_SMARTGUN, time_required_for_job)) heavies++ - to_chat(H, SPAN_ROLE_HEADER("You are a Covert Contractor Machinegunner of Vanguard's Arrow Incorporated!")) + to_chat(H, role_header("You are a Covert Contractor Machinegunner of Vanguard's Arrow Incorporated!")) arm_equipment(H, /datum/equipment_preset/contractor/covert/heavy, TRUE, TRUE) else if(engineers < max_engineers && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_ENGINEER) && check_timelock(H.client, JOB_SQUAD_ENGI)) engineers++ - to_chat(H, SPAN_ROLE_HEADER("You are a Covert Contractor Engineering Specialist of Vanguard's Arrow Incorporated!")) + to_chat(H, role_header("You are a Covert Contractor Engineering Specialist of Vanguard's Arrow Incorporated!")) arm_equipment(H, /datum/equipment_preset/contractor/covert/engi, TRUE, TRUE) else - to_chat(H, SPAN_ROLE_HEADER("You are a Covert Contractor of Vanguard's Arrow Incorporated!")) + to_chat(H, role_header("You are a Covert Contractor of Vanguard's Arrow Incorporated!")) arm_equipment(H, /datum/equipment_preset/contractor/covert/standard, TRUE, TRUE) print_backstory(H) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) diff --git a/code/datums/emergency_calls/cryo_marines.dm b/code/datums/emergency_calls/cryo_marines.dm index 4e997292f74d..45f1dd9ecf32 100644 --- a/code/datums/emergency_calls/cryo_marines.dm +++ b/code/datums/emergency_calls/cryo_marines.dm @@ -49,41 +49,41 @@ leaders++ human.client?.prefs.copy_all_to(human, JOB_SQUAD_LEADER, TRUE, TRUE) arm_equipment(human, /datum/equipment_preset/uscm/leader/cryo, mind == null, TRUE) - to_chat(human, SPAN_ROLE_HEADER("You are a Squad Leader in the USCM")) - to_chat(human, SPAN_ROLE_BODY("You are here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command.")) + to_chat(human, role_header("You are a Squad Leader in the USCM")) + to_chat(human, role_body("You are here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command.")) to_chat(human, SPAN_BOLDWARNING("If you wish to cryo or ghost upon spawning in, you must ahelp and inform staff so you can be replaced.")) else if (heavies < max_heavies && (!mind || (HAS_FLAG(human.client.prefs.toggles_ert, PLAY_HEAVY) && check_timelock(human.client, JOB_SQUAD_SPECIALIST, time_required_for_job)))) heavies++ human.client?.prefs.copy_all_to(human, JOB_SQUAD_SPECIALIST, TRUE, TRUE) arm_equipment(human, /datum/equipment_preset/uscm/spec/cryo, mind == null, TRUE) - to_chat(human, SPAN_ROLE_HEADER("You are a Weapons Specialist in the USCM")) - to_chat(human, SPAN_ROLE_BODY("Your squad is here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command.")) + to_chat(human, role_header("You are a Weapons Specialist in the USCM")) + to_chat(human, role_body("Your squad is here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command.")) to_chat(human, SPAN_BOLDWARNING("If you wish to cryo or ghost upon spawning in, you must ahelp and inform staff so you can be replaced.")) else if (medics < max_medics && (!mind || (HAS_FLAG(human.client.prefs.toggles_ert, PLAY_MEDIC) && check_timelock(human.client, JOB_SQUAD_MEDIC, time_required_for_job)))) medics++ human.client?.prefs.copy_all_to(human, JOB_SQUAD_MEDIC, TRUE, TRUE) arm_equipment(human, /datum/equipment_preset/uscm/medic/cryo, mind == null, TRUE) - to_chat(human, SPAN_ROLE_HEADER("You are a Hospital Corpsman in the USCM")) - to_chat(human, SPAN_ROLE_BODY("You are here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command.")) + to_chat(human, role_header("You are a Hospital Corpsman in the USCM")) + to_chat(human, role_body("You are here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command.")) to_chat(human, SPAN_BOLDWARNING("If you wish to cryo or ghost upon spawning in, you must ahelp and inform staff so you can be replaced.")) else if (engineers < max_engineers && (!mind || (HAS_FLAG(human.client.prefs.toggles_ert, PLAY_ENGINEER) && check_timelock(human.client, JOB_SQUAD_ENGI, time_required_for_job)))) engineers++ human.client?.prefs.copy_all_to(human, JOB_SQUAD_ENGI, TRUE, TRUE) arm_equipment(human, /datum/equipment_preset/uscm/engineer/cryo, mind == null, TRUE) - to_chat(human, SPAN_ROLE_HEADER("You are an Engineer in the USCM")) - to_chat(human, SPAN_ROLE_BODY("You are here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command.")) + to_chat(human, role_header("You are an Engineer in the USCM")) + to_chat(human, role_body("You are here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command.")) to_chat(human, SPAN_BOLDWARNING("If you wish to cryo or ghost upon spawning in, you must ahelp and inform staff so you can be replaced.")) else human.client?.prefs.copy_all_to(human, JOB_SQUAD_MARINE, TRUE, TRUE) arm_equipment(human, /datum/equipment_preset/uscm/pfc/cryo, mind == null, TRUE) - to_chat(human, SPAN_ROLE_HEADER("You are a Rifleman in the USCM")) - to_chat(human, SPAN_ROLE_BODY("You are here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command.")) + to_chat(human, role_header("You are a Rifleman in the USCM")) + to_chat(human, role_body("You are here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command.")) to_chat(human, SPAN_BOLDWARNING("If you wish to cryo or ghost upon spawning in, you must ahelp and inform staff so you can be replaced.")) sleep(10) if(!mind) human.free_for_ghosts() - to_chat(human, SPAN_BOLD("Objectives: [objectives]")) + to_chat(human, role_body("

Your objectives are:

[objectives]")) /datum/emergency_call/cryo_squad/platoon name = "Marine Cryo Reinforcements (Platoon)" diff --git a/code/datums/emergency_calls/cryo_marines_heavy.dm b/code/datums/emergency_calls/cryo_marines_heavy.dm index 2081d9564c50..39f1834a4b22 100644 --- a/code/datums/emergency_calls/cryo_marines_heavy.dm +++ b/code/datums/emergency_calls/cryo_marines_heavy.dm @@ -40,35 +40,35 @@ leader = H leaders++ arm_equipment(H, /datum/equipment_preset/uscm/leader_equipped/cryo, TRUE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are a Squad Leader in the USCM")) - to_chat(H, SPAN_ROLE_BODY("Your squad is here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name].")) + to_chat(H, role_header("You are a Squad Leader in the USCM")) + to_chat(H, role_body("Your squad is here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name].")) else if (heavies < max_heavies && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_HEAVY) && check_timelock(H.client, JOB_SQUAD_SPECIALIST, time_required_for_job)) heavies++ arm_equipment(H, /datum/equipment_preset/uscm/specialist_equipped/cryo, TRUE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are a Weapons Specialist in the USCM")) - to_chat(H, SPAN_ROLE_BODY("Your squad is here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name].")) + to_chat(H, role_header("You are a Weapons Specialist in the USCM")) + to_chat(H, role_body("Your squad is here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name].")) else if(smartgunners < max_smartgunners && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_SMARTGUNNER) && check_timelock(H.client, JOB_SQUAD_SMARTGUN, time_required_for_job)) smartgunners++ arm_equipment(H, /datum/equipment_preset/uscm/smartgunner_equipped/cryo, TRUE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are a Smartgunner in the USCM")) - to_chat(H, SPAN_ROLE_BODY("Your squad is here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name].")) + to_chat(H, role_header("You are a Smartgunner in the USCM")) + to_chat(H, role_body("Your squad is here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name].")) else if(engineers < max_engineers && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_ENGINEER) && check_timelock(H.client, JOB_SQUAD_ENGI, time_required_for_job)) engineers++ arm_equipment(H, /datum/equipment_preset/uscm/engineer_equipped/cryo, TRUE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are an Engineer in the USCM")) - to_chat(H, SPAN_ROLE_BODY("Your squad is here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name].")) + to_chat(H, role_header("You are an Engineer in the USCM")) + to_chat(H, role_body("Your squad is here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name].")) else if (medics < max_medics && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_MEDIC) && check_timelock(H.client, JOB_SQUAD_MEDIC, time_required_for_job)) medics++ arm_equipment(H, /datum/equipment_preset/uscm/medic_equipped/cryo, TRUE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are a Hospital Corpsman in the USCM")) - to_chat(H, SPAN_ROLE_BODY("Your squad is here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name].")) + to_chat(H, role_header("You are a Hospital Corpsman in the USCM")) + to_chat(H, role_body("Your squad is here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name].")) else arm_equipment(H, /datum/equipment_preset/uscm/private_equipped/cryo, TRUE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are a Rifleman in the USCM")) - to_chat(H, SPAN_ROLE_BODY("Your squad is here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name].")) + to_chat(H, role_header("You are a Rifleman in the USCM")) + to_chat(H, role_body("Your squad is here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name].")) sleep(10) - to_chat(H, SPAN_BOLD("Objectives: [objectives]")) + to_chat(H, role_body("

Your objectives are:

[objectives]")) /datum/emergency_call/cryo_squad_equipped/platoon diff --git a/code/datums/emergency_calls/cryo_spec.dm b/code/datums/emergency_calls/cryo_spec.dm index 6cc7c905efbc..22c1aae405bf 100644 --- a/code/datums/emergency_calls/cryo_spec.dm +++ b/code/datums/emergency_calls/cryo_spec.dm @@ -33,11 +33,11 @@ sleep(5) human.client?.prefs.copy_all_to(human, JOB_SQUAD_SPECIALIST, TRUE, TRUE) arm_equipment(human, /datum/equipment_preset/uscm/spec/cryo, mind == null, TRUE) - to_chat(human, SPAN_ROLE_HEADER("You are a Weapons Specialist in the USCM")) - to_chat(human, SPAN_ROLE_BODY("Your squad is here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command.")) + to_chat(human, role_header("You are a Weapons Specialist in the USCM")) + to_chat(human, role_body("Your squad is here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command.")) to_chat(human, SPAN_BOLDWARNING("If you wish to cryo or ghost upon spawning in, you must ahelp and inform staff so you can be replaced.")) sleep(10) if(!mind) human.free_for_ghosts() - to_chat(human, SPAN_BOLD("Objectives: [objectives]")) + to_chat(human, role_body("

Your objectives are:

[objectives]")) diff --git a/code/datums/emergency_calls/deathsquad.dm b/code/datums/emergency_calls/deathsquad.dm index 1cd5bdef6713..a913c0e94b46 100644 --- a/code/datums/emergency_calls/deathsquad.dm +++ b/code/datums/emergency_calls/deathsquad.dm @@ -29,25 +29,25 @@ if(!leader && HAS_FLAG(person.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(person.client, JOB_SQUAD_LEADER, time_required_for_job)) leader = person - to_chat(person, SPAN_ROLE_HEADER("You are the Whiteout Team Leader!")) - to_chat(person, SPAN_ROLE_BODY("Whiteout protocol is in effect for the target, all assets onboard are to be liquidated with expediency unless otherwise instructed by Weyland Yutani personnel holding the position of Director or above.")) + to_chat(person, role_header("You are the Whiteout Team Leader!")) + to_chat(person, role_body("Whiteout protocol is in effect for the target, all assets onboard are to be liquidated with expediency unless otherwise instructed by Weyland Yutani personnel holding the position of Director or above.")) arm_equipment(person, /datum/equipment_preset/pmc/w_y_whiteout/leader, TRUE, TRUE) else if(medics < max_medics && HAS_FLAG(person.client.prefs.toggles_ert, PLAY_MEDIC) && check_timelock(person.client, JOB_SQUAD_MEDIC, time_required_for_job)) medics++ - to_chat(person, SPAN_ROLE_HEADER("You are a Whiteout Team Medic!")) - to_chat(person, SPAN_ROLE_BODY("Whiteout protocol is in effect for the target, all assets onboard are to be liquidated with expediency unless otherwise instructed by Weyland Yutani personnel holding the position of Director or above.")) + to_chat(person, role_header("You are a Whiteout Team Medic!")) + to_chat(person, role_body("Whiteout protocol is in effect for the target, all assets onboard are to be liquidated with expediency unless otherwise instructed by Weyland Yutani personnel holding the position of Director or above.")) arm_equipment(person, /datum/equipment_preset/pmc/w_y_whiteout/medic, TRUE, TRUE) else if(heavies < max_heavies && HAS_FLAG(person.client.prefs.toggles_ert, PLAY_SMARTGUNNER) && check_timelock(person.client, list(JOB_SQUAD_SPECIALIST, JOB_SQUAD_SMARTGUN), time_required_for_job)) heavies++ - to_chat(person, SPAN_ROLE_HEADER("You are a Whiteout Team Terminator!")) - to_chat(person, SPAN_ROLE_BODY("Whiteout protocol is in effect for the target, all assets onboard are to be liquidated with expediency unless otherwise instructed by Weyland Yutani personnel holding the position of Director or above.")) + to_chat(person, role_header("You are a Whiteout Team Terminator!")) + to_chat(person, role_body("Whiteout protocol is in effect for the target, all assets onboard are to be liquidated with expediency unless otherwise instructed by Weyland Yutani personnel holding the position of Director or above.")) arm_equipment(person, /datum/equipment_preset/pmc/w_y_whiteout/terminator, TRUE, TRUE) else - to_chat(person, SPAN_ROLE_HEADER("You are a Whiteout Team Operative!")) - to_chat(person, SPAN_ROLE_BODY("Whiteout protocol is in effect for the target, all assets onboard are to be liquidated with expediency unless otherwise instructed by Weyland Yutani personnel holding the position of Director or above.")) + to_chat(person, role_header("You are a Whiteout Team Operative!")) + to_chat(person, role_body("Whiteout protocol is in effect for the target, all assets onboard are to be liquidated with expediency unless otherwise instructed by Weyland Yutani personnel holding the position of Director or above.")) arm_equipment(person, /datum/equipment_preset/pmc/w_y_whiteout, TRUE, TRUE) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), person, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), person, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/death/low_threat name = "Weyland Whiteout Operators" @@ -64,25 +64,25 @@ if(!leader && HAS_FLAG(person.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(person.client, JOB_SQUAD_LEADER, time_required_for_job)) leader = person - to_chat(person, SPAN_ROLE_HEADER("You are the Whiteout Team Leader!")) - to_chat(person, SPAN_ROLE_BODY("Whiteout protocol is in effect for the target, all assets onboard are to be liquidated with expediency unless otherwise instructed by Weyland Yutani personnel holding the position of Director or above.")) + to_chat(person, role_header("You are the Whiteout Team Leader!")) + to_chat(person, role_body("Whiteout protocol is in effect for the target, all assets onboard are to be liquidated with expediency unless otherwise instructed by Weyland Yutani personnel holding the position of Director or above.")) arm_equipment(person, /datum/equipment_preset/pmc/w_y_whiteout/low_threat/leader, TRUE, TRUE) else if(medics < max_medics && HAS_FLAG(person.client.prefs.toggles_ert, PLAY_MEDIC) && check_timelock(person.client, JOB_SQUAD_MEDIC, time_required_for_job)) medics++ - to_chat(person, SPAN_ROLE_HEADER("You are a Whiteout Team Medic!")) - to_chat(person, SPAN_ROLE_BODY("Whiteout protocol is in effect for the target, all assets onboard are to be liquidated with expediency unless otherwise instructed by Weyland Yutani personnel holding the position of Director or above.")) + to_chat(person, role_header("You are a Whiteout Team Medic!")) + to_chat(person, role_body("Whiteout protocol is in effect for the target, all assets onboard are to be liquidated with expediency unless otherwise instructed by Weyland Yutani personnel holding the position of Director or above.")) arm_equipment(person, /datum/equipment_preset/pmc/w_y_whiteout/low_threat/medic, TRUE, TRUE) else if(heavies < max_heavies && HAS_FLAG(person.client.prefs.toggles_ert, PLAY_SMARTGUNNER) && check_timelock(person.client, list(JOB_SQUAD_SPECIALIST, JOB_SQUAD_SMARTGUN), time_required_for_job)) heavies++ - to_chat(person, SPAN_ROLE_HEADER("You are a Whiteout Team Terminator!")) - to_chat(person, SPAN_ROLE_BODY("Whiteout protocol is in effect for the target, all assets onboard are to be liquidated with expediency unless otherwise instructed by Weyland Yutani personnel holding the position of Director or above.")) + to_chat(person, role_header("You are a Whiteout Team Terminator!")) + to_chat(person, role_body("Whiteout protocol is in effect for the target, all assets onboard are to be liquidated with expediency unless otherwise instructed by Weyland Yutani personnel holding the position of Director or above.")) arm_equipment(person, /datum/equipment_preset/pmc/w_y_whiteout/low_threat/terminator, TRUE, TRUE) else - to_chat(person, SPAN_ROLE_HEADER("You are a Whiteout Team Operative!")) - to_chat(person, SPAN_ROLE_BODY("Whiteout protocol is in effect for the target, all assets onboard are to be liquidated with expediency unless otherwise instructed by Weyland Yutani personnel holding the position of Director or above.")) + to_chat(person, role_header("You are a Whiteout Team Operative!")) + to_chat(person, role_body("Whiteout protocol is in effect for the target, all assets onboard are to be liquidated with expediency unless otherwise instructed by Weyland Yutani personnel holding the position of Director or above.")) arm_equipment(person, /datum/equipment_preset/pmc/w_y_whiteout/low_threat, TRUE, TRUE) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), person, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), person, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) //################################################################################################ // Marine commandos - USCM Deathsquad. Event only @@ -106,13 +106,13 @@ if(!leader && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(H.client, JOB_SQUAD_LEADER, time_required_for_job)) //First one spawned is always the leader. leader = H - to_chat(H, SPAN_WARNING(FONT_SIZE_BIG("You are a Marine Raider Team Leader, better than all the rest."))) + to_chat(H, role_header("You are a Marine Raider Team Leader, better than all the rest.")) arm_equipment(H, /datum/equipment_preset/uscm/marsoc/sl, TRUE, TRUE) else - to_chat(H, SPAN_WARNING(FONT_SIZE_BIG("You are an elite Marine Raider Operative, the best of the best."))) + to_chat(H, role_header("You are an elite Marine Raider Operative, the best of the best.")) arm_equipment(H, /datum/equipment_preset/uscm/marsoc, TRUE, TRUE) - to_chat(H, SPAN_BOLDNOTICE("You are absolutely loyal to High Command and must follow their directives.")) - to_chat(H, SPAN_BOLDNOTICE("Execute the mission assigned to you with extreme prejudice!")) + to_chat(H, role_header("You are absolutely loyal to High Command and must follow their directives.")) + to_chat(H, role_body("

Execute the mission assigned to you with extreme prejudice!
")) return /datum/emergency_call/marsoc_covert @@ -134,13 +134,13 @@ M.transfer_to(H, TRUE) if(!leader && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(H.client, JOB_SQUAD_LEADER, time_required_for_job)) //First one spawned is always the leader. leader = H - to_chat(H, SPAN_WARNING(FONT_SIZE_BIG("You are a Marine Raider Team Leader, better than all the rest."))) + to_chat(H, role_header("You are a Marine Raider Team Leader, better than all the rest.")) arm_equipment(H, /datum/equipment_preset/uscm/marsoc/sl/covert, TRUE, TRUE) else - to_chat(H, SPAN_WARNING(FONT_SIZE_BIG("You are an elite Marine Raider, the best of the best."))) + to_chat(H, role_header("You are an elite Marine Raider, the best of the best.")) arm_equipment(H, /datum/equipment_preset/uscm/marsoc/covert, TRUE, TRUE) - to_chat(H, SPAN_BOLDNOTICE("You are absolutely loyal to High Command and must follow their directives.")) - to_chat(H, SPAN_BOLDNOTICE("Execute the mission assigned to you with extreme prejudice!")) + to_chat(H, role_header("You are absolutely loyal to High Command and must follow their directives.")) + to_chat(H, role_body("
Execute the mission assigned to you with extreme prejudice!
")) return @@ -158,11 +158,11 @@ MIND.transfer_to(player, TRUE) if(!leader && HAS_FLAG(player.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(player.client, JOB_SQUAD_LEADER, time_required_for_job)) //First one spawned is always the leader. leader = player - to_chat(player, SPAN_WARNING(FONT_SIZE_BIG("You are a Marine Raider Team Leader, better than all the rest."))) + to_chat(player, role_header("You are a Marine Raider Team Leader, better than all the rest.")) arm_equipment(player, /datum/equipment_preset/uscm/marsoc/low_threat/sl, TRUE, TRUE) else - to_chat(player, SPAN_WARNING(FONT_SIZE_BIG("You are an elite Marine Raider, the best of the best."))) + to_chat(player, role_header("You are an elite Marine Raider, the best of the best.")) arm_equipment(player, /datum/equipment_preset/uscm/marsoc/low_threat, TRUE, TRUE) - to_chat(player, SPAN_BOLDNOTICE("You are absolutely loyal to High Command and must follow their directives.")) - to_chat(player, SPAN_BOLDNOTICE("Execute the mission assigned to you with extreme prejudice!")) + to_chat(player, role_header("You are absolutely loyal to High Command and must follow their directives.")) + to_chat(player, role_body("
Execute the mission assigned to you with extreme prejudice!
")) return diff --git a/code/datums/emergency_calls/deus_vult.dm b/code/datums/emergency_calls/deus_vult.dm index a5ba948c767e..f6bdc066e5c1 100644 --- a/code/datums/emergency_calls/deus_vult.dm +++ b/code/datums/emergency_calls/deus_vult.dm @@ -22,19 +22,19 @@ if(!leader && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(H.client, JOB_SQUAD_LEADER, time_required_for_job)) leader = H arm_equipment(H, /datum/equipment_preset/other/gladiator/leader, TRUE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are the leader of these holy warriors!")) - to_chat(H, SPAN_ROLE_BODY("You must clear out any traces of the unholy from this wretched place!")) - to_chat(H, SPAN_ROLE_BODY("Follow any orders directly from the Higher Power!")) + to_chat(H, role_header("You are the leader of these holy warriors!")) + to_chat(H, role_body("You must clear out any traces of the unholy from this wretched place!")) + to_chat(H, role_body("Follow any orders directly from the Higher Power!")) else if(heavies < max_heavies && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_HEAVY)) heavies++ arm_equipment(H, /datum/equipment_preset/other/gladiator/champion, TRUE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are a champion of the holy warriors!")) - to_chat(H, SPAN_ROLE_BODY("You must clear out any traces of the unholy from this wretched place!")) - to_chat(H, SPAN_ROLE_BODY("Follow any orders directly from the Higher Power!")) + to_chat(H, role_header("You are a champion of the holy warriors!")) + to_chat(H, role_body("You must clear out any traces of the unholy from this wretched place!")) + to_chat(H, role_body("Follow any orders directly from the Higher Power!")) else arm_equipment(H, /datum/equipment_preset/other/gladiator, TRUE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are a holy warrior!")) - to_chat(H, SPAN_ROLE_BODY("You must clear out any traces of the unholy from this wretched place!")) - to_chat(H, SPAN_ROLE_BODY("Follow any orders directly from the Higher Power!")) + to_chat(H, role_header("You are a holy warrior!")) + to_chat(H, role_body("You must clear out any traces of the unholy from this wretched place!")) + to_chat(H, role_body("Follow any orders directly from the Higher Power!")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("
Your objectives are:

[objectives]")), 1 SECONDS) diff --git a/code/datums/emergency_calls/dutch.dm b/code/datums/emergency_calls/dutch.dm index 32620fa43014..0b2c24d8eb08 100644 --- a/code/datums/emergency_calls/dutch.dm +++ b/code/datums/emergency_calls/dutch.dm @@ -36,7 +36,7 @@ arm_equipment(H, /datum/equipment_preset/dutch/medic, TRUE, TRUE) else arm_equipment(H, /datum/equipment_preset/dutch, TRUE, TRUE) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/dutch/full_dozen //AWWW YEAH DA FULL DOZEN FO TODAY name = "Dutch's Dozen - Full Strength" diff --git a/code/datums/emergency_calls/goons.dm b/code/datums/emergency_calls/goons.dm index 8a0b00968807..40e82091a381 100644 --- a/code/datums/emergency_calls/goons.dm +++ b/code/datums/emergency_calls/goons.dm @@ -19,23 +19,23 @@ if(!leader && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(mob.client, JOB_SQUAD_LEADER, time_required_for_job)) leader = mob - to_chat(mob, SPAN_ROLE_HEADER("You are a Weyland-Yutani Corporate Security Lead!")) + to_chat(mob, role_header("You are a Weyland-Yutani Corporate Security Lead!")) arm_equipment(mob, /datum/equipment_preset/goon/lead, TRUE, TRUE) else - to_chat(mob, SPAN_ROLE_HEADER("You are a Weyland-Yutani Corporate Security Officer!")) + to_chat(mob, role_header("You are a Weyland-Yutani Corporate Security Officer!")) arm_equipment(mob, /datum/equipment_preset/goon/standard, TRUE, TRUE) print_backstory(mob) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/goon/print_backstory(mob/living/carbon/human/M) - to_chat(M, SPAN_BOLD("You were born [pick(75;"in Europe", 15;"in Asia", 10;"on Mars")] to a poor family.")) - to_chat(M, SPAN_BOLD("Joining the ranks of Weyland-Yutani was all you could do to keep yourself and your loved ones fed.")) - to_chat(M, SPAN_BOLD("You have no idea what a xenomorph is.")) - to_chat(M, SPAN_BOLD("You are a simple security officer employed by Weyland-Yutani to guard their outposts and colonies.")) - to_chat(M, SPAN_BOLD("You heard about the original distress signal ages ago, but you have only just gotten permission from corporate to enter the area.")) - to_chat(M, SPAN_BOLD("Ensure no damage is incurred against Weyland-Yutani. Make sure the CL is safe.")) + to_chat(M, role_body("You were born [pick(75;"in Europe", 15;"in Asia", 10;"on Mars")] to a poor family.")) + to_chat(M, role_body("Joining the ranks of Weyland-Yutani was all you could do to keep yourself and your loved ones fed.")) + to_chat(M, role_body("You have no idea what a xenomorph is.")) + to_chat(M, role_body("You are a simple security officer employed by Weyland-Yutani to guard their outposts and colonies.")) + to_chat(M, role_body("You heard about the original distress signal ages ago, but you have only just gotten permission from corporate to enter the area.")) + to_chat(M, role_body("Ensure no damage is incurred against Weyland-Yutani. Make sure the CL is safe.")) /datum/emergency_call/goon/chem_retrieval name = "Weyland-Yutani Goon (Chemical Investigation Squad)" @@ -66,35 +66,35 @@ if(!leader && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(mob.client, JOB_SQUAD_LEADER, time_required_for_job)) leader = mob - to_chat(mob, SPAN_ROLE_HEADER("You are a Weyland-Yutani Corporate Security Lead!")) + to_chat(mob, role_header("You are a Weyland-Yutani Corporate Security Lead!")) arm_equipment(mob, /datum/equipment_preset/goon/lead, TRUE, TRUE) else if(medics < max_medics && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_MEDIC) && check_timelock(mob.client, JOB_SQUAD_MEDIC, time_required_for_job)) medics++ - to_chat(mob, SPAN_ROLE_HEADER("You are a Weyland-Yutani Corporate Research Consultant!")) + to_chat(mob, role_header("You are a Weyland-Yutani Corporate Research Consultant!")) arm_equipment(mob, /datum/equipment_preset/goon/researcher, TRUE, TRUE) else - to_chat(mob, SPAN_ROLE_HEADER("You are a Weyland-Yutani Corporate Security Officer!")) + to_chat(mob, role_header("You are a Weyland-Yutani Corporate Security Officer!")) arm_equipment(mob, /datum/equipment_preset/goon/standard, TRUE, TRUE) print_backstory(mob) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/goon/chem_retrieval/print_backstory(mob/living/carbon/human/backstory_human) if(backstory_human.job == JOB_WY_GOON_RESEARCHER) - to_chat(backstory_human, SPAN_BOLD("You were born [pick(75;"in Europe", 15;"in Asia", 10;"on Mars")] to a wealthy family.")) - to_chat(backstory_human, SPAN_BOLD("Joining the ranks of Weyland-Yutani was the perfect way to further your research goals.")) - to_chat(backstory_human, SPAN_BOLD("You have a very in depth understanding of xenomorphs.")) - to_chat(backstory_human, SPAN_BOLD("You are a well educated scientist employed by Weyland-Yutani to study various non-humans.")) - to_chat(backstory_human, SPAN_BOLD("You heard about the original distress signal ages ago, but you have only just gotten permission from corporate to enter the area.")) - to_chat(backstory_human, SPAN_BOLD("Your only goal is to recover the chemical aboard the Almayer. Do whatever you have to do.")) + to_chat(backstory_human, role_body("You were born [pick(75;"in Europe", 15;"in Asia", 10;"on Mars")] to a wealthy family.")) + to_chat(backstory_human, role_body("Joining the ranks of Weyland-Yutani was the perfect way to further your research goals.")) + to_chat(backstory_human, role_body("You have a very in depth understanding of xenomorphs.")) + to_chat(backstory_human, role_body("You are a well educated scientist employed by Weyland-Yutani to study various non-humans.")) + to_chat(backstory_human, role_body("You heard about the original distress signal ages ago, but you have only just gotten permission from corporate to enter the area.")) + to_chat(backstory_human, role_body("Your only goal is to recover the chemical aboard the Almayer. Do whatever you have to do.")) else - to_chat(backstory_human, SPAN_BOLD("You were born [pick(75;"in Europe", 15;"in Asia", 10;"on Mars")] to a poor family.")) - to_chat(backstory_human, SPAN_BOLD("Joining the ranks of Weyland-Yutani was all you could do to keep yourself and your loved ones fed.")) - to_chat(backstory_human, SPAN_BOLD("You have had a basic brief on xenomorphs.")) - to_chat(backstory_human, SPAN_BOLD("You are a simple security officer employed by Weyland-Yutani to guard their outposts and colonies.")) - to_chat(backstory_human, SPAN_BOLD("You heard about the original distress signal ages ago, but you have only just gotten permission from corporate to enter the area.")) - to_chat(backstory_human, SPAN_BOLD("Ensure no damage is incurred against Weyland-Yutani. Make sure the researcher is kept safe and follow their instructions.")) + to_chat(backstory_human, role_body("You were born [pick(75;"in Europe", 15;"in Asia", 10;"on Mars")] to a poor family.")) + to_chat(backstory_human, role_body("Joining the ranks of Weyland-Yutani was all you could do to keep yourself and your loved ones fed.")) + to_chat(backstory_human, role_body("You have had a basic brief on xenomorphs.")) + to_chat(backstory_human, role_body("You are a simple security officer employed by Weyland-Yutani to guard their outposts and colonies.")) + to_chat(backstory_human, role_body("You heard about the original distress signal ages ago, but you have only just gotten permission from corporate to enter the area.")) + to_chat(backstory_human, role_body("Ensure no damage is incurred against Weyland-Yutani. Make sure the researcher is kept safe and follow their instructions.")) /datum/emergency_call/goon/platoon name = "Weyland-Yutani Corporate Security (Platoon)" diff --git a/code/datums/emergency_calls/hefa_knight.dm b/code/datums/emergency_calls/hefa_knight.dm index 2af2f99f443e..c12c053bb08d 100644 --- a/code/datums/emergency_calls/hefa_knight.dm +++ b/code/datums/emergency_calls/hefa_knight.dm @@ -18,4 +18,4 @@ M.transfer_to(H, TRUE) arm_equipment(H, /datum/equipment_preset/fun/hefa/melee, FALSE, TRUE) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) diff --git a/code/datums/emergency_calls/inspection.dm b/code/datums/emergency_calls/inspection.dm index 2cd121093ea4..69faec10d942 100644 --- a/code/datums/emergency_calls/inspection.dm +++ b/code/datums/emergency_calls/inspection.dm @@ -22,17 +22,17 @@ if(!leader && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(H.client, list(JOB_WARDEN, JOB_CHIEF_POLICE), time_required_for_job)) leader = H arm_equipment(H, /datum/equipment_preset/uscm_event/provost/inspector, TRUE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are an Inspector of the USCM Provost Office!")) - to_chat(H, SPAN_ROLE_BODY("You are being dispatched to the [MAIN_SHIP_NAME] to investigate an undisclosed issue with ML enforcement. The Provost Office may provide more details, but you should head for the Brig to assess the situation.")) - to_chat(H, SPAN_ROLE_BODY("You have the final say on ML enforcement in your AO, but are still obligated to follow it. Use this authority to set things right and make sure that justice is served!")) - to_chat(H, SPAN_WARNING("This role requires familiarity with Marine Law and Standard Operating Procedure. Ahelp if you have any questions or wish to surrender the character to someone else.")) + to_chat(H, role_header("You are an Inspector of the USCM Provost Office!")) + to_chat(H, role_body("You are being dispatched to the [MAIN_SHIP_NAME] to investigate an undisclosed issue with ML enforcement. The Provost Office may provide more details, but you should head for the Brig to assess the situation.")) + to_chat(H, role_body("You have the final say on ML enforcement in your AO, but are still obligated to follow it. Use this authority to set things right and make sure that justice is served!")) + to_chat(H, role_header("This role requires familiarity with Marine Law and Standard Operating Procedure. Ahelp if you have any questions or wish to surrender the character to someone else.")) else arm_equipment(H, /datum/equipment_preset/uscm_event/provost/enforcer, TRUE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are an Enforcer of the USCM Provost Office!")) - to_chat(H, SPAN_ROLE_BODY("You are being assigned as part escort, part assistant and part law enforcer to the Inspector that is being dispatched to the [MAIN_SHIP_NAME]")) - to_chat(H, SPAN_ROLE_BODY("You are not expected to enforce ML on the ship, however the Inspector may ask you to perform MP duties as part of their investigation in which case you are obligated to act like any other MP.")) - to_chat(H, SPAN_WARNING("This role requires familiarity with Marine Law and Standard Operating Procedure. Ahelp if you have any questions or wish to surrender the character to someone else.")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + to_chat(H, role_header("You are an Enforcer of the USCM Provost Office!")) + to_chat(H, role_body("You are being assigned as part escort, part assistant and part law enforcer to the Inspector that is being dispatched to the [MAIN_SHIP_NAME]")) + to_chat(H, role_body("You are not expected to enforce ML on the ship, however the Inspector may ask you to perform MP duties as part of their investigation in which case you are obligated to act like any other MP.")) + to_chat(H, role_header("This role requires familiarity with Marine Law and Standard Operating Procedure. Ahelp if you have any questions or wish to surrender the character to someone else.")) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/inspection_provost/spawn_items() @@ -66,17 +66,17 @@ if(!leader && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(H.client, list(JOB_SO), time_required_for_job)) leader = H arm_equipment(H, /datum/equipment_preset/uscm_ship/so, TRUE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are an Inspector sent by the USCM High Command!")) - to_chat(H, SPAN_ROLE_BODY("An inspection is scheduled for the [MAIN_SHIP_NAME] during their current assignment. High Command may have other directives for you that they will relay via radio.")) - to_chat(H, SPAN_ROLE_BODY("Tour the ship, monitor the organization, effectiveness and SOP compliance of its respective departments, interview its crew and find any issues. Relay the results of your inspection to both the Officer in Command of the ship and USCM High Command.")) - to_chat(H, SPAN_WARNING("Remember, your inspection may not interrupt regular operation of the ship and you do not have privileges to make Marine Law enforcement related calls. Ahelp if you have any questions of you wish to offer the role to someone else.")) + to_chat(H, role_header("You are an Inspector sent by the USCM High Command!")) + to_chat(H, role_body("An inspection is scheduled for the [MAIN_SHIP_NAME] during their current assignment. High Command may have other directives for you that they will relay via radio.")) + to_chat(H, role_body("Tour the ship, monitor the organization, effectiveness and SOP compliance of its respective departments, interview its crew and find any issues. Relay the results of your inspection to both the Officer in Command of the ship and USCM High Command.")) + to_chat(H, role_header("Remember, your inspection may not interrupt regular operation of the ship and you do not have privileges to make Marine Law enforcement related calls. Ahelp if you have any questions of you wish to offer the role to someone else.")) else arm_equipment(H, /datum/equipment_preset/uscm/engineer_equipped, TRUE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are part of an inspection team sent by the USCM High Command!")) - to_chat(H, SPAN_ROLE_BODY("An inspection is scheduled for the [MAIN_SHIP_NAME] during their current assignment. You serve both as security detail to the officer performing the inspection and their assistant should they need your expertise.")) - to_chat(H, SPAN_ROLE_BODY("Follow the inspector as they perform their duties on the ship. Feel free to offer your insight if you feel like you have any and help then as they request it. Remember, while you do not answer directly to the officers on the ship, you still need to respect their position.")) - to_chat(H, SPAN_WARNING("Remember, you may not interrupt regular operation and are expected to follow orders of the Inspector at all times. Ahelp if you have any questions of you wish to offer the role to someone else.")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + to_chat(H, role_header("You are part of an inspection team sent by the USCM High Command!")) + to_chat(H, role_body("An inspection is scheduled for the [MAIN_SHIP_NAME] during their current assignment. You serve both as security detail to the officer performing the inspection and their assistant should they need your expertise.")) + to_chat(H, role_body("Follow the inspector as they perform their duties on the ship. Feel free to offer your insight if you feel like you have any and help then as they request it. Remember, while you do not answer directly to the officers on the ship, you still need to respect their position.")) + to_chat(H, role_header("Remember, you may not interrupt regular operation and are expected to follow orders of the Inspector at all times. Ahelp if you have any questions of you wish to offer the role to someone else.")) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) //UAAC-TIS /datum/emergency_call/inspection_tis @@ -101,17 +101,17 @@ if(!leader && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(H.client, list(JOB_INTEL,JOB_WARDEN), time_required_for_job)) leader = H arm_equipment(H, /datum/equipment_preset/uscm_event/uaac/tis/io, TRUE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are an Intelligence Officer working for the UAAC-TIS!")) - to_chat(H, SPAN_ROLE_BODY("The UAAC-TIS, also known as the Three Eyes, is responsible for the collection, collation and delivery of Intelligence across UA assets. Your Handler will contact you about the exact nature of your mission on board the [MAIN_SHIP_NAME].")) - to_chat(H, SPAN_ROLE_BODY("While you do not have any direct authority over the USCM, the TIS mandate also allows you to investigate any perceived abuse of the Law, be it written or implied. Remember, you have the authority to make calls on ML should the crew of the Almayer request it or your Handler order you to resolve ML issues.")) - to_chat(H, SPAN_WARNING("Remember that you cannot take antagonistic action unless specifically allowed by your Handler. You are also expected to know ML and SOP. Ahelp if you have any questions or wish to release this mob for other players.")) + to_chat(H, role_header("You are an Intelligence Officer working for the UAAC-TIS!")) + to_chat(H, role_body("The UAAC-TIS, also known as the Three Eyes, is responsible for the collection, collation and delivery of Intelligence across UA assets. Your Handler will contact you about the exact nature of your mission on board the [MAIN_SHIP_NAME].")) + to_chat(H, role_body("While you do not have any direct authority over the USCM, the TIS mandate also allows you to investigate any perceived abuse of the Law, be it written or implied. Remember, you have the authority to make calls on ML should the crew of the Almayer request it or your Handler order you to resolve ML issues.")) + to_chat(H, role_header("Remember that you cannot take antagonistic action unless specifically allowed by your Handler. You are also expected to know ML and SOP. Ahelp if you have any questions or wish to release this mob for other players.")) else arm_equipment(H, /datum/equipment_preset/uscm_event/provost/enforcer, TRUE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are an Enforcer of the USCM Provost Office!")) - to_chat(H, SPAN_ROLE_BODY("You have been assigned as an escort for an UAAC-TIS Officer being dispatched to the [MAIN_SHIP_NAME]. Technically, the TIS has no direct authority over you, however you have been ordered to follow the instructions of the TIS Officer.")) - to_chat(H, SPAN_ROLE_BODY("You are not expected to enforce ML on the ship and are generally expected to follow the instruction of the Officer you are protecting. Remember that should they start acting in a way that you believe puts the USCM in danger, you are not obligated to follow their orders and should report this to the Provost at once.")) - to_chat(H, SPAN_WARNING("This role requires familiarity with Marine Law and Standard Operating Procedure. Ahelp if you have any questions or wish to surrender the character to someone else.")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + to_chat(H, role_header("You are an Enforcer of the USCM Provost Office!")) + to_chat(H, role_body("You have been assigned as an escort for an UAAC-TIS Officer being dispatched to the [MAIN_SHIP_NAME]. Technically, the TIS has no direct authority over you, however you have been ordered to follow the instructions of the TIS Officer.")) + to_chat(H, role_body("You are not expected to enforce ML on the ship and are generally expected to follow the instruction of the Officer you are protecting. Remember that should they start acting in a way that you believe puts the USCM in danger, you are not obligated to follow their orders and should report this to the Provost at once.")) + to_chat(H, role_header("This role requires familiarity with Marine Law and Standard Operating Procedure. Ahelp if you have any questions or wish to surrender the character to someone else.")) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/inspection_tis/spawn_items() var/turf/drop_spawn @@ -145,17 +145,17 @@ if(!leader && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(H.client, list(JOB_SQUAD_LEADER), time_required_for_job)) leader = H arm_equipment(H, /datum/equipment_preset/pmc/pmc_lead_investigator, TRUE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are a Weyland Yutani PMC Inspector!")) - to_chat(H, SPAN_ROLE_BODY("While officially your outfit does mundane security work for Weyland-Yutani, in practice you serve as both official and unofficial investigators into conduct of Company personnel. You are being dispatched to the [MAIN_SHIP_NAME] to make sure that the local Liaison has not forgotten their priorities or worse, thought to bite the hand that feeds them.")) - to_chat(H, SPAN_ROLE_BODY("Remember the USCM personnel on the ship may not appreciate your presence there. Should the Liaison be in jail, you are not to act as legal counsel in any way unless instructed to do so by Dispatch. Your basic duty is to make a detailed report of anything involving the Liaison and any other WY personnel on board the ship.")) - to_chat(H, SPAN_WARNING("Unless ordered otherwise by Dispatch, you are to avoid open conflict with the Marines. Retreat and make a report if they are outright hostile. Ahelp if you have any more questions or wish to release this character for other players.")) + to_chat(H, role_header("You are a Weyland Yutani PMC Inspector!")) + to_chat(H, role_body("While officially your outfit does mundane security work for Weyland-Yutani, in practice you serve as both official and unofficial investigators into conduct of Company personnel. You are being dispatched to the [MAIN_SHIP_NAME] to make sure that the local Liaison has not forgotten their priorities or worse, thought to bite the hand that feeds them.")) + to_chat(H, role_body("Remember the USCM personnel on the ship may not appreciate your presence there. Should the Liaison be in jail, you are not to act as legal counsel in any way unless instructed to do so by Dispatch. Your basic duty is to make a detailed report of anything involving the Liaison and any other WY personnel on board the ship.")) + to_chat(H, role_header("Unless ordered otherwise by Dispatch, you are to avoid open conflict with the Marines. Retreat and make a report if they are outright hostile. Ahelp if you have any more questions or wish to release this character for other players.")) else arm_equipment(H, /datum/equipment_preset/pmc/pmc_detainer, TRUE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are part of a Weyland-Yutani PMC Investigation Team!")) - to_chat(H, SPAN_ROLE_BODY("While officially your outfit does mundane security work for Weyland-Yutani, in practice you serve as both official and unofficial investigators into conduct of Company personnel. The Lead Investigator is in charge, your duty is to provide backup, counsel and any other form of assistance you can render to make sure their mission is a success.")) - to_chat(H, SPAN_ROLE_BODY("Remember that the USCM, or at least some parts of it, may be hostile towards your presence on the ship. Unless ordered otherwise by Dispatch, you and your Team Leader are to avoid open conflict with the Marines. Your main priority is making sure that your Lead survives to write the report they are due.")) - to_chat(H, SPAN_WARNING("Unless ordered otherwise by Dispatch, you are to avoid open conflict with the Marines. Your priority is the safety of your team, if the ship gets to hot, your best bet is evacuation. Ahelp if you have any more questions or wish to release this character for other players.")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + to_chat(H, role_header("You are part of a Weyland-Yutani PMC Investigation Team!")) + to_chat(H, role_body("While officially your outfit does mundane security work for Weyland-Yutani, in practice you serve as both official and unofficial investigators into conduct of Company personnel. The Lead Investigator is in charge, your duty is to provide backup, counsel and any other form of assistance you can render to make sure their mission is a success.")) + to_chat(H, role_body("Remember that the USCM, or at least some parts of it, may be hostile towards your presence on the ship. Unless ordered otherwise by Dispatch, you and your Team Leader are to avoid open conflict with the Marines. Your main priority is making sure that your Lead survives to write the report they are due.")) + to_chat(H, role_header("Unless ordered otherwise by Dispatch, you are to avoid open conflict with the Marines. Your priority is the safety of your team, if the ship gets to hot, your best bet is evacuation. Ahelp if you have any more questions or wish to release this character for other players.")) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/inspection_wy/spawn_items() var/turf/drop_spawn @@ -200,69 +200,69 @@ if(!leader && HAS_FLAG(mob?.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(mob.client, JOB_SQUAD_LEADER, time_required_for_job)) leader = mob - to_chat(mob, SPAN_ROLE_HEADER("You are the Colonial Marshal!")) + to_chat(mob, role_header("You are the Colonial Marshal!")) arm_equipment(mob, /datum/equipment_preset/cmb/leader, TRUE, TRUE) else if(synths < max_synths && HAS_FLAG(mob?.client.prefs.toggles_ert, PLAY_SYNTH) && GLOB.RoleAuthority.roles_whitelist[mob.ckey] & WHITELIST_SYNTHETIC) synths++ - to_chat(mob, SPAN_ROLE_HEADER("You are a CMB Investigative Synthetic!")) + to_chat(mob, role_header("You are a CMB Investigative Synthetic!")) arm_equipment(mob, /datum/equipment_preset/cmb/synth, TRUE, TRUE) else if(!icc_liaison && will_spawn_icc_liaison && check_timelock(mob.client, JOB_CORPORATE_LIAISON, time_required_for_job)) icc_liaison = mob - to_chat(mob, SPAN_ROLE_HEADER("You are a CMB-attached Interstellar Commerce Commission Liaison!")) + to_chat(mob, role_header("You are a CMB-attached Interstellar Commerce Commission Liaison!")) arm_equipment(mob, /datum/equipment_preset/cmb/liaison, TRUE, TRUE) else if(!cmb_observer && will_spawn_cmb_observer) cmb_observer = mob - to_chat(mob, SPAN_ROLE_HEADER("You are an Interstellar Human Rights Observer!")) + to_chat(mob, role_header("You are an Interstellar Human Rights Observer!")) arm_equipment(mob, /datum/equipment_preset/cmb/observer, TRUE, TRUE) else - to_chat(mob, SPAN_ROLE_HEADER("You are a CMB Deputy!")) + to_chat(mob, role_header("You are a CMB Deputy!")) arm_equipment(mob, /datum/equipment_preset/cmb/standard, TRUE, TRUE) print_backstory(mob) - addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(to_chat), mob, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/inspection_cmb/print_backstory(mob/living/carbon/human/M) if(M == leader) - to_chat(M, SPAN_BOLD("You are the Colonial Marshal, originally from [pick(70;"The United Americas", 20;"Sol", 10;"a colony on the frontier")].")) - to_chat(M, SPAN_BOLD("You started in the Marshals through [pick(50; "pursuing a career during college", 40;"working for law enforcement", 10;"being recruited for your skills")].")) - to_chat(M, SPAN_BOLD("Rising through positions across the galaxy, you have become renown for your steadfast commitment to justice, fighting against crime and corruption alike.")) - to_chat(M, SPAN_BOLD("You have interstellar jurisdiction as a CMB Official to enforce Colonial and Earth law, but you cannot and should not override Marine Law on a Marine Ship.")) - to_chat(M, SPAN_BOLD("The laws of Earth stretch beyond the Sol. Where others are tempted and fall to corruption, you stay steadfast in your morals.")) - to_chat(M, SPAN_BOLD("Corporate Officers chase after paychecks and promotions, but you are motivated to do your sworn duty and care for the population, no matter how far or isolated a colony may be.")) - to_chat(M, SPAN_BOLD("You've seen a lot during your time in the Neroid Sector, but you're here because you're the best, doing the right thing to make the frontier a better place.")) - to_chat(M, SPAN_BOLD("Despite being stretched thin, the stalwart oath of the Marshals has continued to keep communities safe, with the CMB well respected by many. You are the representation of that oath, serve with distinction.")) + to_chat(M, role_body("You are the Colonial Marshal, originally from [pick(70;"The United Americas", 20;"Sol", 10;"a colony on the frontier")].")) + to_chat(M, role_body("You started in the Marshals through [pick(50; "pursuing a career during college", 40;"working for law enforcement", 10;"being recruited for your skills")].")) + to_chat(M, role_body("Rising through positions across the galaxy, you have become renown for your steadfast commitment to justice, fighting against crime and corruption alike.")) + to_chat(M, role_body("You have interstellar jurisdiction as a CMB Official to enforce Colonial and Earth law, but you cannot and should not override Marine Law on a Marine Ship.")) + to_chat(M, role_body("The laws of Earth stretch beyond the Sol. Where others are tempted and fall to corruption, you stay steadfast in your morals.")) + to_chat(M, role_body("Corporate Officers chase after paychecks and promotions, but you are motivated to do your sworn duty and care for the population, no matter how far or isolated a colony may be.")) + to_chat(M, role_body("You've seen a lot during your time in the Neroid Sector, but you're here because you're the best, doing the right thing to make the frontier a better place.")) + to_chat(M, role_body("Despite being stretched thin, the stalwart oath of the Marshals has continued to keep communities safe, with the CMB well respected by many. You are the representation of that oath, serve with distinction.")) else if(issynth(M)) - to_chat(M, SPAN_BOLD("Despite being an older model, you are well regarded among your peers for your keen senses and alertness.")) - to_chat(M, SPAN_BOLD("In addition to law enforcement procedures, you are programmed to be an absolute expert in locating evidence, analyzing chemicals and investigating crimes.")) - to_chat(M, SPAN_BOLD("You do not enforce or comply with Marine Law, however you have an understanding of it.")) - to_chat(M, SPAN_BOLD("After receiving a software and law update in Sol, you were stationed at Anchorpoint Station to assist with CMB units on the frontier.")) - to_chat(M, SPAN_BOLD("Although combat is not expected, you are carrying light munition and equipment reserves of the team in your backpack, should they be needed.")) - to_chat(M, SPAN_BOLD("Despite being stretched thin, the stalwart oath of the Marshals has continued to keep communities safe, with the CMB well respected by many. You are a representation of that oath, serve with distinction.")) + to_chat(M, role_body("Despite being an older model, you are well regarded among your peers for your keen senses and alertness.")) + to_chat(M, role_body("In addition to law enforcement procedures, you are programmed to be an absolute expert in locating evidence, analyzing chemicals and investigating crimes.")) + to_chat(M, role_body("You do not enforce or comply with Marine Law, however you have an understanding of it.")) + to_chat(M, role_body("After receiving a software and law update in Sol, you were stationed at Anchorpoint Station to assist with CMB units on the frontier.")) + to_chat(M, role_body("Although combat is not expected, you are carrying light munition and equipment reserves of the team in your backpack, should they be needed.")) + to_chat(M, role_body("Despite being stretched thin, the stalwart oath of the Marshals has continued to keep communities safe, with the CMB well respected by many. You are a representation of that oath, serve with distinction.")) else if(M == icc_liaison) - to_chat(M, SPAN_BOLD("You are an Interstellar Commerce Liaison, originally from [pick(70;"The United Americas", 25;"Sol", 5;"a colony on the frontier")].")) - to_chat(M, SPAN_BOLD("You are [pick(30; "skeptical", 40;"ambicable", 30;"supportive")] of Weyland-Yutani.")) - to_chat(M, SPAN_BOLD("Your headset is equipped with several frequencies, including a gifted key from The ICC's parent company, Weyland-Yutani, to try to incentivize your support. Use it for communication.")) - to_chat(M, SPAN_BOLD("As the ICC Agent attached to the CMB Office at Anchorpoint Station, your job is to observe and ensure fair trade practices. Inspect and document cargo shipments for suspected illict activity as needed. You should coordinate with the Marshals, and command(preferably for a warrant) in order to make arrests if necessary.")) - to_chat(M, SPAN_BOLD("Serving alongside such reputable men has made you a more virtuous person, especially compared to the Corporate Liaisons of other heavy-weight organizations.")) - to_chat(M, SPAN_BOLD("Work with the Colonial Marshals in their investigations and report to command if you suspect smuggling or illicit trade is happening.")) + to_chat(M, role_body("You are an Interstellar Commerce Liaison, originally from [pick(70;"The United Americas", 25;"Sol", 5;"a colony on the frontier")].")) + to_chat(M, role_body("You are [pick(30; "skeptical", 40;"ambicable", 30;"supportive")] of Weyland-Yutani.")) + to_chat(M, role_body("Your headset is equipped with several frequencies, including a gifted key from The ICC's parent company, Weyland-Yutani, to try to incentivize your support. Use it for communication.")) + to_chat(M, role_body("As the ICC Agent attached to the CMB Office at Anchorpoint Station, your job is to observe and ensure fair trade practices. Inspect and document cargo shipments for suspected illict activity as needed. You should coordinate with the Marshals, and command(preferably for a warrant) in order to make arrests if necessary.")) + to_chat(M, role_body("Serving alongside such reputable men has made you a more virtuous person, especially compared to the Corporate Liaisons of other heavy-weight organizations.")) + to_chat(M, role_body("Work with the Colonial Marshals in their investigations and report to command if you suspect smuggling or illicit trade is happening.")) else if(M == cmb_observer) - to_chat(M, SPAN_BOLD("You are an Interstellar Human Rights Observer, originally from [pick(50;"The United Americas", 10;"Europe", 10;"Luna", 20;"Sol", 10;"a colony on the frontier")].")) - to_chat(M, SPAN_BOLD("You are [pick(60; "skeptical", 40;"ambicable", 10;"supportive")] of Weyland-Yutani and their practices.")) - to_chat(M, SPAN_BOLD("You are [pick(40; "skeptical", 30;"ambicable", 30;"supportive")] with the USCM's actions on the frontier.")) - to_chat(M, SPAN_BOLD("Through a lot of hard work, your organization managed to convince the Colonial Marshals to take you to the frontier for an article about the quality of life there.")) - to_chat(M, SPAN_BOLD("Observe the Feds in their adventures and keep an eye out for any inhumane acts from others. The Neroid Sector is full of atrocities on every side.")) - to_chat(M, SPAN_BOLD("Do not instigate or start any confrontations. You are an observer, and you do not wage wars. Only intervene in medical emergencies.")) + to_chat(M, role_body("You are an Interstellar Human Rights Observer, originally from [pick(50;"The United Americas", 10;"Europe", 10;"Luna", 20;"Sol", 10;"a colony on the frontier")].")) + to_chat(M, role_body("You are [pick(60; "skeptical", 40;"ambicable", 10;"supportive")] of Weyland-Yutani and their practices.")) + to_chat(M, role_body("You are [pick(40; "skeptical", 30;"ambicable", 30;"supportive")] with the USCM's actions on the frontier.")) + to_chat(M, role_body("Through a lot of hard work, your organization managed to convince the Colonial Marshals to take you to the frontier for an article about the quality of life there.")) + to_chat(M, role_body("Observe the Feds in their adventures and keep an eye out for any inhumane acts from others. The Neroid Sector is full of atrocities on every side.")) + to_chat(M, role_body("Do not instigate or start any confrontations. You are an observer, and you do not wage wars. Only intervene in medical emergencies.")) else - to_chat(M, SPAN_BOLD("You are a CMB Deputy, originally from [pick(70;"The United Americas", 20;"Sol", 10;"a colony on the frontier")].")) - to_chat(M, SPAN_BOLD("You joined the Marshals through [pick(50; "pursuing a career during college", 40;"working for law enforcement", 10;"being recruited for your skills")].")) - to_chat(M, SPAN_BOLD("Following the lead of your Marshal, you have become renown for your steadfast commitment to justice, fighting against crime and corruption alike.")) - to_chat(M, SPAN_BOLD("You have interstellar jurisdiction as a CMB Official to enforce Colonial and Earth law, but you cannot and should not override Marine Law on a Marine Ship.")) - to_chat(M, SPAN_BOLD("You have been stationed at Anchorpoint Station for [pick(80;"several months", 10;"only a week", 10;"years")] investigating henious crimes among the frontier.")) - to_chat(M, SPAN_BOLD("The laws of arth stretch beyond the Sol. Where others fall to corruption, you stay steadfast in your morals.")) - to_chat(M, SPAN_BOLD("Corporate Officers chase after paychecks and promotions, but you are motivated to do your sworn duty and care for the population, no matter how far or isolated a colony may be.")) - to_chat(M, SPAN_BOLD("Despite being stretched thin, the stalwart oath of the Marshals has continued to keep communities safe, with the CMB well respected by many. You are a representation of that oath, serve with distinction.")) + to_chat(M, role_body("You are a CMB Deputy, originally from [pick(70;"The United Americas", 20;"Sol", 10;"a colony on the frontier")].")) + to_chat(M, role_body("You joined the Marshals through [pick(50; "pursuing a career during college", 40;"working for law enforcement", 10;"being recruited for your skills")].")) + to_chat(M, role_body("Following the lead of your Marshal, you have become renown for your steadfast commitment to justice, fighting against crime and corruption alike.")) + to_chat(M, role_body("You have interstellar jurisdiction as a CMB Official to enforce Colonial and Earth law, but you cannot and should not override Marine Law on a Marine Ship.")) + to_chat(M, role_body("You have been stationed at Anchorpoint Station for [pick(80;"several months", 10;"only a week", 10;"years")] investigating henious crimes among the frontier.")) + to_chat(M, role_body("The laws of arth stretch beyond the Sol. Where others fall to corruption, you stay steadfast in your morals.")) + to_chat(M, role_body("Corporate Officers chase after paychecks and promotions, but you are motivated to do your sworn duty and care for the population, no matter how far or isolated a colony may be.")) + to_chat(M, role_body("Despite being stretched thin, the stalwart oath of the Marshals has continued to keep communities safe, with the CMB well respected by many. You are a representation of that oath, serve with distinction.")) /datum/emergency_call/inspection_cmb/black_market name = "Inspection - Colonial Marshals Ledger Investigation Team" @@ -291,16 +291,16 @@ if(!leader && HAS_FLAG(mob?.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(mob.client, JOB_SQUAD_LEADER, time_required_for_job)) leader = mob - to_chat(mob, SPAN_ROLE_HEADER("You are the Colonial Marshal!")) + to_chat(mob, role_header("You are the Colonial Marshal!")) arm_equipment(mob, /datum/equipment_preset/cmb/leader, TRUE, TRUE) else if(!icc_liaison && will_spawn_icc_liaison && check_timelock(mob.client, JOB_CORPORATE_LIAISON, time_required_for_job)) icc_liaison = mob - to_chat(mob, SPAN_ROLE_HEADER("You are a CMB-attached Interstellar Commerce Commission Liaison!")) + to_chat(mob, role_header("You are a CMB-attached Interstellar Commerce Commission Liaison!")) arm_equipment(mob, /datum/equipment_preset/cmb/liaison/black_market, TRUE, TRUE) //ICC CL gets a custom item else - to_chat(mob, SPAN_ROLE_HEADER("You are a CMB Deputy!")) + to_chat(mob, role_header("You are a CMB Deputy!")) arm_equipment(mob, /datum/equipment_preset/cmb/standard, TRUE, TRUE) print_backstory(mob) - addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(to_chat), mob, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) diff --git a/code/datums/emergency_calls/mercs.dm b/code/datums/emergency_calls/mercs.dm index 67e09e8992f0..d99b164805e0 100644 --- a/code/datums/emergency_calls/mercs.dm +++ b/code/datums/emergency_calls/mercs.dm @@ -40,16 +40,16 @@ objectives = "Ransack the [MAIN_SHIP_NAME] and kill anyone who gets in your way. Do what your Captain says. Ensure your survival at all costs." /datum/emergency_call/mercs/print_backstory(mob/living/carbon/human/H) - to_chat(H, SPAN_BOLD("You started off in the Neroid Sector as a colonist seeking work at one of the established colonies.")) - to_chat(H, SPAN_BOLD("The withdrawl of United American forces in the early 2180s, the system fell into disarray.")) - to_chat(H, SPAN_BOLD("Taking up arms as a mercenary, the Freelancers have become a powerful force of order in the system.")) - to_chat(H, SPAN_BOLD("While they are motivated primarily by money, many colonists see the Freelancers as the main forces of order in the Neroid Sector.")) + to_chat(H, role_body("You started off in the Neroid Sector as a colonist seeking work at one of the established colonies.")) + to_chat(H, role_body("The withdrawl of United American forces in the early 2180s, the system fell into disarray.")) + to_chat(H, role_body("Taking up arms as a mercenary, the Freelancers have become a powerful force of order in the system.")) + to_chat(H, role_body("While they are motivated primarily by money, many colonists see the Freelancers as the main forces of order in the Neroid Sector.")) if(hostility) - to_chat(H, SPAN_NOTICE(SPAN_BOLD("Despite this, you have been tasked to ransack the [MAIN_SHIP_NAME] and kill anyone who gets in your way."))) - to_chat(H, SPAN_NOTICE(SPAN_BOLD("Any UPP, CLF or WY forces also responding are to be considered neutral parties unless proven hostile."))) + to_chat(H, SPAN_NOTICE(role_body("Despite this, you have been tasked to ransack the [MAIN_SHIP_NAME] and kill anyone who gets in your way."))) + to_chat(H, SPAN_NOTICE(role_body("Any UPP, CLF or WY forces also responding are to be considered neutral parties unless proven hostile."))) else - to_chat(H, SPAN_NOTICE(SPAN_BOLD("To this end, you have been contacted by Weyland-Yutani of the USCSS Royce to assist the [MAIN_SHIP_NAME].."))) - to_chat(H, SPAN_NOTICE(SPAN_BOLD("Ensure they are not destroyed."))) + to_chat(H, SPAN_NOTICE(role_body("To this end, you have been contacted by Weyland-Yutani of the USCSS Royce to assist the [MAIN_SHIP_NAME].."))) + to_chat(H, SPAN_NOTICE(role_body("Ensure they are not destroyed."))) /datum/emergency_call/mercs/create_member(datum/mind/M, turf/override_spawn_loc) var/turf/spawn_loc = override_spawn_loc ? override_spawn_loc : get_spawn_point() @@ -65,17 +65,17 @@ if(!leader && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(H.client, JOB_SQUAD_LEADER, time_required_for_job)) leader = H arm_equipment(H, /datum/equipment_preset/other/freelancer/leader, TRUE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are the Freelancer leader!")) + to_chat(H, role_header("You are the Freelancer leader!")) else if(medics < max_medics && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_MEDIC) && check_timelock(H.client, JOB_SQUAD_MEDIC, time_required_for_job)) medics++ arm_equipment(H, /datum/equipment_preset/other/freelancer/medic, TRUE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are a Freelancer Medic!")) + to_chat(H, role_header("You are a Freelancer Medic!")) else arm_equipment(H, /datum/equipment_preset/other/freelancer/standard, TRUE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are a Freelancer Mercenary!")) + to_chat(H, role_header("You are a Freelancer Mercenary!")) print_backstory(H) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/mercs/platoon name = "Freelancers (Platoon)" @@ -121,16 +121,16 @@ objectives = "Help the crew of the [MAIN_SHIP_NAME] in exchange for payment, and choose your payment well. Do what your Captain says. Ensure your survival at all costs." /datum/emergency_call/heavy_mercs/print_backstory(mob/living/carbon/human/H) - to_chat(H, SPAN_BOLD("You started off in the Neroid Sector as an experienced miner seeking work at one of the established colonies.")) - to_chat(H, SPAN_BOLD("The withdrawl of United American forces in the early 2180s, the system fell into disarray.")) - to_chat(H, SPAN_BOLD("Taking up arms as a mercenary, the Freelancers have become a powerful force of order in the system.")) - to_chat(H, SPAN_BOLD("While they are motivated primarily by money, many colonists see the Freelancers as the main forces of order in the Neroid Sector.")) + to_chat(H, role_body("You started off in the Neroid Sector as an experienced miner seeking work at one of the established colonies.")) + to_chat(H, role_body("The withdrawl of United American forces in the early 2180s, the system fell into disarray.")) + to_chat(H, role_body("Taking up arms as a mercenary, the Freelancers have become a powerful force of order in the system.")) + to_chat(H, role_body("While they are motivated primarily by money, many colonists see the Freelancers as the main forces of order in the Neroid Sector.")) if(hostility) - to_chat(H, SPAN_NOTICE(SPAN_BOLD("Despite this, you have been specially tasked to ransack the [MAIN_SHIP_NAME] and kill anyone who gets in your way."))) - to_chat(H, SPAN_NOTICE(SPAN_BOLD("Any UPP, CLF or WY forces also responding are to be considered neutral parties unless proven hostile."))) + to_chat(H, SPAN_NOTICE(role_body("Despite this, you have been specially tasked to ransack the [MAIN_SHIP_NAME] and kill anyone who gets in your way."))) + to_chat(H, SPAN_NOTICE(role_body("Any UPP, CLF or WY forces also responding are to be considered neutral parties unless proven hostile."))) else - to_chat(H, SPAN_NOTICE(SPAN_BOLD("To this end, you have been contacted by Weyland-Yutani of the USCSS Royce to assist the [MAIN_SHIP_NAME].."))) - to_chat(H, SPAN_NOTICE(SPAN_BOLD("Ensure they are not destroyed."))) + to_chat(H, SPAN_NOTICE(role_body("To this end, you have been contacted by Weyland-Yutani of the USCSS Royce to assist the [MAIN_SHIP_NAME].."))) + to_chat(H, SPAN_NOTICE(role_body("Ensure they are not destroyed."))) /datum/emergency_call/heavy_mercs/create_member(datum/mind/M, turf/override_spawn_loc) var/turf/spawn_loc = override_spawn_loc ? override_spawn_loc : get_spawn_point() @@ -146,22 +146,22 @@ if(!leader && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(H.client, JOB_SQUAD_LEADER, time_required_for_job)) //First one spawned is always the leader. leader = H arm_equipment(H, /datum/equipment_preset/other/elite_merc/leader, TRUE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are the Elite Mercenary leader!")) + to_chat(H, role_header("You are the Elite Mercenary leader!")) else if(medics < max_medics && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_MEDIC) && check_timelock(H.client, JOB_SQUAD_MEDIC, time_required_for_job)) medics++ arm_equipment(H, /datum/equipment_preset/other/elite_merc/medic, TRUE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are an Elite Mercenary Medic!")) + to_chat(H, role_header("You are an Elite Mercenary Medic!")) else if(engineers < max_engineers && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_ENGINEER) && check_timelock(H.client, JOB_SQUAD_ENGI, time_required_for_job)) engineers++ arm_equipment(H, /datum/equipment_preset/other/elite_merc/engineer, TRUE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are an Elite Mercenary Engineer!")) + to_chat(H, role_header("You are an Elite Mercenary Engineer!")) else if(heavies < max_heavies && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_SMARTGUNNER) && check_timelock(H.client, JOB_SQUAD_SMARTGUN, time_required_for_job)) heavies++ arm_equipment(H, /datum/equipment_preset/other/elite_merc/heavy, TRUE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are an Elite Mercenary Specialist!")) + to_chat(H, role_header("You are an Elite Mercenary Specialist!")) else arm_equipment(H, /datum/equipment_preset/other/elite_merc/standard, TRUE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are an Elite Mercenary!")) + to_chat(H, role_header("You are an Elite Mercenary!")) print_backstory(H) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) diff --git a/code/datums/emergency_calls/pirates.dm b/code/datums/emergency_calls/pirates.dm index 7a9d333de970..bc43fc51011d 100644 --- a/code/datums/emergency_calls/pirates.dm +++ b/code/datums/emergency_calls/pirates.dm @@ -20,11 +20,11 @@ if(!leader && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(H.client, JOB_SQUAD_LEADER, time_required_for_job)) leader = H arm_equipment(H, /datum/equipment_preset/fun/pirate/captain, TRUE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are the leader of these jolly pirates!")) - to_chat(H, SPAN_ROLE_BODY("Loot this place for all its worth! Take everything of value that's not nailed down!")) + to_chat(H, role_header("You are the leader of these jolly pirates!")) + to_chat(H, role_body("Loot this place for all its worth! Take everything of value that's not nailed down!")) else arm_equipment(H, /datum/equipment_preset/fun/pirate, TRUE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are a jolly pirate! Yarr!")) - to_chat(H, SPAN_ROLE_BODY("Loot this place for all its worth! Take everything of value that's not nailed down!")) + to_chat(H, role_header("You are a jolly pirate! Yarr!")) + to_chat(H, role_body("Loot this place for all its worth! Take everything of value that's not nailed down!")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) diff --git a/code/datums/emergency_calls/pizza.dm b/code/datums/emergency_calls/pizza.dm index a35ce584c68d..c3ba8d879e0c 100644 --- a/code/datums/emergency_calls/pizza.dm +++ b/code/datums/emergency_calls/pizza.dm @@ -22,10 +22,10 @@ arm_equipment(H, /datum/equipment_preset/other/pizza, TRUE, TRUE) var/pizzatxt = pick("Discount Pizza","Pizza Kingdom","Papa Pizza", "Pizza Galaxy") - to_chat(H, SPAN_ROLE_HEADER("You are a pizza deliverer! Your employer is the [pizzatxt] Corporation.")) - to_chat(H, SPAN_ROLE_BODY("Your job is to deliver your pizzas. You're PRETTY sure this is the right place...")) + to_chat(H, role_header("You are a pizza deliverer! Your employer is the [pizzatxt] Corporation.")) + to_chat(H, role_body("Your job is to deliver your pizzas. You're PRETTY sure this is the right place...")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/pizza/cryo diff --git a/code/datums/emergency_calls/pmc.dm b/code/datums/emergency_calls/pmc.dm index 2d21dc768f4a..5591062b7cd7 100644 --- a/code/datums/emergency_calls/pmc.dm +++ b/code/datums/emergency_calls/pmc.dm @@ -32,50 +32,50 @@ if(!leader && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(mob.client, JOB_SQUAD_LEADER, time_required_for_job)) leader = mob - to_chat(mob, SPAN_ROLE_HEADER("You are a Weyland-Yutani PMC Squad Leader!")) + to_chat(mob, role_header("You are a Weyland-Yutani PMC Squad Leader!")) arm_equipment(mob, /datum/equipment_preset/pmc/pmc_leader, TRUE, TRUE) else if(synths < max_synths && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_SYNTH) && GLOB.RoleAuthority.roles_whitelist[mob.ckey] & WHITELIST_SYNTHETIC) synths++ - to_chat(mob, SPAN_ROLE_HEADER("You are a Weyland-Yutani PMC Support Synthetic!")) + to_chat(mob, role_header("You are a Weyland-Yutani PMC Support Synthetic!")) arm_equipment(mob, /datum/equipment_preset/pmc/synth, TRUE, TRUE) else if(medics < max_medics && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_MEDIC) && check_timelock(mob.client, JOB_SQUAD_MEDIC, time_required_for_job)) medics++ - to_chat(mob, SPAN_ROLE_HEADER("You are a Weyland-Yutani PMC Medic!")) + to_chat(mob, role_header("You are a Weyland-Yutani PMC Medic!")) arm_equipment(mob, /datum/equipment_preset/pmc/pmc_medic, TRUE, TRUE) else if(smartgunners < max_smartgunners && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_SMARTGUNNER) && check_timelock(mob.client, JOB_SQUAD_SMARTGUN)) smartgunners++ - to_chat(mob, SPAN_ROLE_HEADER("You are a Weyland-Yutani PMC Heavy Gunner!")) + to_chat(mob, role_header("You are a Weyland-Yutani PMC Heavy Gunner!")) arm_equipment(mob, /datum/equipment_preset/pmc/pmc_gunner, TRUE, TRUE) else if(heavies < max_heavies && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_HEAVY) && check_timelock(mob.client, JOB_SQUAD_SPECIALIST)) heavies++ - to_chat(mob, SPAN_ROLE_HEADER("You are a Weyland-Yutani PMC Sniper!")) + to_chat(mob, role_header("You are a Weyland-Yutani PMC Sniper!")) arm_equipment(mob, /datum/equipment_preset/pmc/pmc_sniper, TRUE, TRUE) else - to_chat(mob, SPAN_ROLE_HEADER("You are a Weyland-Yutani PMC Operator!")) + to_chat(mob, role_header("You are a Weyland-Yutani PMC Operator!")) arm_equipment(mob, /datum/equipment_preset/pmc/pmc_standard, TRUE, TRUE) print_backstory(mob) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/pmc/print_backstory(mob/living/carbon/human/M) if(ishuman_strict(M)) - to_chat(M, SPAN_BOLD("You were born [pick(75;"in Europe", 15;"in Asia", 10;"on Mars")] to a [pick(75;"well-off", 15;"well-established", 10;"average")] family.")) - to_chat(M, SPAN_BOLD("Joining the ranks of Weyland-Yutani has proven to be very profitable for you.")) - to_chat(M, SPAN_BOLD("While you are officially an employee, much of your work is off the books. You work as a skilled mercenary.")) - to_chat(M, SPAN_BOLD("You are [pick(50;"unaware of the xenomorph threat", 15;"acutely aware of the xenomorph threat", 10;"well-informed of the xenomorph threat")]")) + to_chat(M, role_body("You were born [pick(75;"in Europe", 15;"in Asia", 10;"on Mars")] to a [pick(75;"well-off", 15;"well-established", 10;"average")] family.")) + to_chat(M, role_body("Joining the ranks of Weyland-Yutani has proven to be very profitable for you.")) + to_chat(M, role_body("While you are officially an employee, much of your work is off the books. You work as a skilled mercenary.")) + to_chat(M, role_body("You are [pick(50;"unaware of the xenomorph threat", 15;"acutely aware of the xenomorph threat", 10;"well-informed of the xenomorph threat")]")) else - to_chat(M, SPAN_BOLD("You were brought online in a Weyland-Yutani synthetic production facility, knowing only your engineers for the first few weeks for your pseudo-life.")) - to_chat(M, SPAN_BOLD("You were programmed with standard synthetic skills as per facility and geneva protocol.")) - to_chat(M, SPAN_BOLD("Throughout your service, you gained recognition as a capable unit and your model was given equipment upgrades which USCM models lack.")) - to_chat(M, SPAN_BOLD("You were given all available information about the xenomorph threat apart from classified data reserved for special employees.")) - to_chat(M, SPAN_BOLD("You are part of Weyland-Yutani Task Force Oberon that arrived in 2182 following the UA withdrawl of the Neroid Sector.")) - to_chat(M, SPAN_BOLD("Task-force Oberon is stationed aboard the USCSS Royce, a powerful Weyland-Yutani cruiser that patrols the outer edges of the Neroid Sector. ")) - to_chat(M, SPAN_BOLD("Under the directive of Weyland-Yutani board member Johan Almric, you act as private security for Weyland-Yutani science teams.")) - to_chat(M, SPAN_BOLD("The USCSS Royce contains a crew of roughly two hundred PMCs, and one hundred scientists and support personnel.")) - to_chat(M, SPAN_BOLD("Ensure no damage is incurred against Weyland-Yutani. Make sure the CL is safe.")) - to_chat(M, SPAN_BOLD("Deny Weyland-Yutani's involvement and do not trust the UA/USCM forces.")) + to_chat(M, role_body("You were brought online in a Weyland-Yutani synthetic production facility, knowing only your engineers for the first few weeks for your pseudo-life.")) + to_chat(M, role_body("You were programmed with standard synthetic skills as per facility and geneva protocol.")) + to_chat(M, role_body("Throughout your service, you gained recognition as a capable unit and your model was given equipment upgrades which USCM models lack.")) + to_chat(M, role_body("You were given all available information about the xenomorph threat apart from classified data reserved for special employees.")) + to_chat(M, role_body("You are part of Weyland-Yutani Task Force Oberon that arrived in 2182 following the UA withdrawl of the Neroid Sector.")) + to_chat(M, role_body("Task-force Oberon is stationed aboard the USCSS Royce, a powerful Weyland-Yutani cruiser that patrols the outer edges of the Neroid Sector. ")) + to_chat(M, role_body("Under the directive of Weyland-Yutani board member Johan Almric, you act as private security for Weyland-Yutani science teams.")) + to_chat(M, role_body("The USCSS Royce contains a crew of roughly two hundred PMCs, and one hundred scientists and support personnel.")) + to_chat(M, role_body("Ensure no damage is incurred against Weyland-Yutani. Make sure the CL is safe.")) + to_chat(M, role_body("Deny Weyland-Yutani's involvement and do not trust the UA/USCM forces.")) /datum/emergency_call/pmc/platoon @@ -124,23 +124,23 @@ if(!leader && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(H.client, JOB_SQUAD_LEADER, time_required_for_job)) //First one spawned is always the leader. leader = H - to_chat(H, SPAN_ROLE_HEADER("You are a Weyland-Yutani PMC Squad Leader!")) + to_chat(H, role_header("You are a Weyland-Yutani PMC Squad Leader!")) arm_equipment(H, /datum/equipment_preset/pmc/pmc_lead_investigator, TRUE, TRUE) else if(medics < max_medics && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_MEDIC) && check_timelock(H.client, JOB_SQUAD_MEDIC, time_required_for_job)) medics++ - to_chat(H, SPAN_ROLE_HEADER("You are a Weyland-Yutani PMC Medical Investigator!")) + to_chat(H, role_header("You are a Weyland-Yutani PMC Medical Investigator!")) arm_equipment(H, /datum/equipment_preset/pmc/pmc_med_investigator, TRUE, TRUE) else if(heavies < max_heavies && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_SMARTGUNNER) && check_timelock(H.client, JOB_SQUAD_SMARTGUN, time_required_for_job)) heavies++ - to_chat(H, SPAN_ROLE_HEADER("You are a Weyland-Yutani PMC Heavy Gunner!")) + to_chat(H, role_header("You are a Weyland-Yutani PMC Heavy Gunner!")) arm_equipment(H, /datum/equipment_preset/pmc/pmc_gunner, TRUE, TRUE) else - to_chat(H, SPAN_ROLE_HEADER("You are a Weyland-Yutani PMC Detainer!")) + to_chat(H, role_header("You are a Weyland-Yutani PMC Detainer!")) arm_equipment(H, /datum/equipment_preset/pmc/pmc_detainer, TRUE, TRUE) print_backstory(H) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /obj/effect/landmark/ert_spawns/distress_pmc name = "Distress_PMC" diff --git a/code/datums/emergency_calls/provost.dm b/code/datums/emergency_calls/provost.dm index 92c33706c178..fc573dc9350e 100644 --- a/code/datums/emergency_calls/provost.dm +++ b/code/datums/emergency_calls/provost.dm @@ -22,16 +22,16 @@ if(!leader && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(H.client, list(JOB_WARDEN, JOB_CHIEF_POLICE), time_required_for_job)) //First one spawned is always the leader. leader = H arm_equipment(H, /datum/equipment_preset/uscm_event/provost/tml, TRUE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are the leader of a Provost Enforcer Team!")) - to_chat(H, SPAN_ROLE_BODY("Follow any orders directly from High Command!")) - to_chat(H, SPAN_ROLE_BODY("You only answer to Marine Law and the Provost Marshal!")) + to_chat(H, role_header("You are the leader of a Provost Enforcer Team!")) + to_chat(H, role_body("Follow any orders directly from High Command!")) + to_chat(H, role_body("You only answer to Marine Law and the Provost Marshal!")) else arm_equipment(H, /datum/equipment_preset/uscm_event/provost/enforcer, TRUE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are a member of a Provost Enforcer Team!")) - to_chat(H, SPAN_ROLE_BODY("Follow any orders directly from High Command or your Team Leader!")) - to_chat(H, SPAN_ROLE_BODY("You only answer to your superior, Marine Law and High Command!")) + to_chat(H, role_header("You are a member of a Provost Enforcer Team!")) + to_chat(H, role_body("Follow any orders directly from High Command or your Team Leader!")) + to_chat(H, role_body("You only answer to your superior, Marine Law and High Command!")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/provost_enforcer/spawn_items() diff --git a/code/datums/emergency_calls/riot.dm b/code/datums/emergency_calls/riot.dm index bc9af3a64ac1..b7db71c51b40 100644 --- a/code/datums/emergency_calls/riot.dm +++ b/code/datums/emergency_calls/riot.dm @@ -20,16 +20,16 @@ if(!leader && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(H.client, list(JOB_WARDEN, JOB_CHIEF_POLICE), time_required_for_job)) leader = H arm_equipment(H, /datum/equipment_preset/uscm_ship/uscm_police/riot_mp/riot_cmp, TRUE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are the leader of the High Command Riot Control!")) - to_chat(H, SPAN_ROLE_BODY("Follow any orders directly from High Command!")) - to_chat(H, SPAN_ROLE_BODY("You only answer to the Marine Law and the High Command!")) + to_chat(H, role_header("You are the leader of the High Command Riot Control!")) + to_chat(H, role_body("Follow any orders directly from High Command!")) + to_chat(H, role_body("You only answer to the Marine Law and the High Command!")) else arm_equipment(H, /datum/equipment_preset/uscm_ship/uscm_police/riot_mp, TRUE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are a member of the High Command Riot Control!")) - to_chat(H, SPAN_ROLE_BODY("Follow any orders directly from High Command or your superior!")) - to_chat(H, SPAN_ROLE_BODY("You only answer to your superior, the Marine Law and the High Command!")) + to_chat(H, role_header("You are a member of the High Command Riot Control!")) + to_chat(H, role_body("Follow any orders directly from High Command or your superior!")) + to_chat(H, role_body("You only answer to your superior, the Marine Law and the High Command!")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/riot/spawn_items() diff --git a/code/datums/emergency_calls/royal_marines.dm b/code/datums/emergency_calls/royal_marines.dm index b3feaccf87bb..0f8493745b55 100644 --- a/code/datums/emergency_calls/royal_marines.dm +++ b/code/datums/emergency_calls/royal_marines.dm @@ -25,38 +25,38 @@ if(!leader && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(mob.client, JOB_SQUAD_LEADER, time_required_for_job)) leader = mob - to_chat(mob, SPAN_ROLE_HEADER("You are an Officer in the Royal Marines Commando. Born in the Three World Empire.")) + to_chat(mob, role_header("You are an Officer in the Royal Marines Commando. Born in the Three World Empire.")) arm_equipment(mob, /datum/equipment_preset/twe/royal_marine/team_leader, TRUE, TRUE) else if(heavies < max_heavies && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_HEAVY) && check_timelock(mob.client, JOB_SQUAD_SPECIALIST)) var/specialist_kit = pick("Sniper", "Smartgun", "Breach") switch(specialist_kit) if("Sniper") - to_chat(mob, SPAN_ROLE_HEADER("You are a skilled marksman in the Royal Marines Commando. Born in the Three World Empire.")) + to_chat(mob, role_header("You are a skilled marksman in the Royal Marines Commando. Born in the Three World Empire.")) arm_equipment(mob, /datum/equipment_preset/twe/royal_marine/spec/marksman, TRUE, TRUE) if("Smartgun") - to_chat(mob, SPAN_ROLE_HEADER("You are a Smartgunner in the Royal Marines Commando. Born in the Three World Empire.")) + to_chat(mob, role_header("You are a Smartgunner in the Royal Marines Commando. Born in the Three World Empire.")) arm_equipment(mob, /datum/equipment_preset/twe/royal_marine/spec/machinegun, TRUE, TRUE) if("Breach") - to_chat(mob, SPAN_ROLE_HEADER("You are a CQB Specialist in the Royal Marines Commando. Born in the Three World Empire.")) + to_chat(mob, role_header("You are a CQB Specialist in the Royal Marines Commando. Born in the Three World Empire.")) arm_equipment(mob, /datum/equipment_preset/twe/royal_marine/spec/breacher, TRUE, TRUE) heavies++ else - to_chat(mob, SPAN_ROLE_HEADER("You are a member of the Royal Marines Commando. Born in the three world empire.")) + to_chat(mob, role_header("You are a member of the Royal Marines Commando. Born in the three world empire.")) arm_equipment(mob, /datum/equipment_preset/twe/royal_marine/standard, TRUE, TRUE) print_backstory(mob) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/royal_marines/print_backstory(mob/living/carbon/human/spawning_mob) - to_chat(spawning_mob, SPAN_BOLD("You were born in the Three World Empire to a [pick_weight(list("average" = 75, "poor" = 15, "well-established" = 10))] family.")) - to_chat(spawning_mob, SPAN_BOLD("Joining the Royal Marines gave you a lot of combat experience and useful skills.")) - to_chat(spawning_mob, SPAN_BOLD("You are [pick_weight(list("unaware" = 75, "faintly aware" = 15, "knoledgeable" = 10))] of the xenomorph threat.")) - to_chat(spawning_mob, SPAN_BOLD("You are a citizen of the three world empire and joined the Royal Marines Commando")) - to_chat(spawning_mob, SPAN_BOLD("You are apart of a jointed UA/TWE taskforce onboard the HMS Patna and Thunderchild.")) - to_chat(spawning_mob, SPAN_BOLD("Under the directive of the RMC high command, you have been assisting USCM forces with maintaining peace in the area.")) - to_chat(spawning_mob, SPAN_BOLD("Assist the USCMC Force of the [MAIN_SHIP_NAME] however you can.")) + to_chat(spawning_mob, role_body("You were born in the Three World Empire to a [pick_weight(list("average" = 75, "poor" = 15, "well-established" = 10))] family.")) + to_chat(spawning_mob, role_body("Joining the Royal Marines gave you a lot of combat experience and useful skills.")) + to_chat(spawning_mob, role_body("You are [pick_weight(list("unaware" = 75, "faintly aware" = 15, "knoledgeable" = 10))] of the xenomorph threat.")) + to_chat(spawning_mob, role_body("You are a citizen of the three world empire and joined the Royal Marines Commando")) + to_chat(spawning_mob, role_body("You are apart of a jointed UA/TWE taskforce onboard the HMS Patna and Thunderchild.")) + to_chat(spawning_mob, role_body("Under the directive of the RMC high command, you have been assisting USCM forces with maintaining peace in the area.")) + to_chat(spawning_mob, role_body("Assist the USCMC Force of the [MAIN_SHIP_NAME] however you can.")) /datum/emergency_call/royal_marines/platoon name = "Royal Marines Commando (Platoon) (Friendly)" diff --git a/code/datums/emergency_calls/souto.dm b/code/datums/emergency_calls/souto.dm index 44aa5284b862..4b18a633f48a 100644 --- a/code/datums/emergency_calls/souto.dm +++ b/code/datums/emergency_calls/souto.dm @@ -22,10 +22,10 @@ arm_equipment(H, /datum/equipment_preset/other/souto, TRUE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are Souto Man! You should bring awareness to the Souto brand!")) - to_chat(H, SPAN_ROLE_BODY("Your job is to party hard and share Souto. Make sure those marines are never thirsty again!")) + to_chat(H, role_header("You are Souto Man! You should bring awareness to the Souto brand!")) + to_chat(H, role_body("Your job is to party hard and share Souto. Make sure those marines are never thirsty again!")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/souto/cryo name = "Souto Man (Cryo)" diff --git a/code/datums/emergency_calls/tank_crew.dm b/code/datums/emergency_calls/tank_crew.dm index fb437c179e48..c8fc2d23d151 100644 --- a/code/datums/emergency_calls/tank_crew.dm +++ b/code/datums/emergency_calls/tank_crew.dm @@ -23,12 +23,12 @@ sleep(5) arm_equipment(H, /datum/equipment_preset/uscm/tank/full, TRUE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are a Vehicle Crewman in the USCM")) - to_chat(H, SPAN_ROLE_BODY("You are here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command.")) - to_chat(H, SPAN_BOLDWARNING("If you wish to cryo or ghost upon spawning in, you must ahelp and inform staff so you can be replaced.")) + to_chat(H, role_header("You are a Vehicle Crewman in the USCM")) + to_chat(H, role_body("You are here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command.")) + to_chat(H, role_header("If you wish to cryo or ghost upon spawning in, you must ahelp and inform staff so you can be replaced.")) sleep(10) - to_chat(H, SPAN_BOLD("Objectives: [objectives]")) + to_chat(H, role_body("

Your objectives are:

[objectives]")) GLOB.data_core.manifest_inject(H) //Put people in crew manifest diff --git a/code/datums/emergency_calls/upp.dm b/code/datums/emergency_calls/upp.dm index 80ef111be3e4..54d076da4857 100644 --- a/code/datums/emergency_calls/upp.dm +++ b/code/datums/emergency_calls/upp.dm @@ -28,23 +28,26 @@ /datum/emergency_call/upp/print_backstory(mob/living/carbon/human/M) if(ishuman_strict(M)) - to_chat(M, SPAN_BOLD("You grew up in relatively simple family in [pick(75;"Eurasia", 25;"a famished UPP colony")] with few belongings or luxuries.")) - to_chat(M, SPAN_BOLD("The family you grew up with were [pick(50;"getting by", 25;"impoverished", 25;"starving")] and you were one of [pick(10;"two", 20;"three", 20;"four", 30;"five", 20;"six")] children.")) - to_chat(M, SPAN_BOLD("You come from a long line of [pick(40;"crop-harvesters", 20;"soldiers", 20;"factory workers", 5;"scientists", 15;"engineers")], and quickly enlisted to improve your living conditions.")) - to_chat(M, SPAN_BOLD("Following your enlistment to the UPP military at the age of 17, you were assigned to the 17th 'Smoldering Sons' battalion (six hundred strong) under the command of Colonel Ganbaatar.")) + to_chat(M, role_body("You grew up in relatively simple family in [pick(75;"Eurasia", 25;"a famished UPP colony")] with few belongings or luxuries.")) + to_chat(M, role_body("The family you grew up with were [pick(50;"getting by", 25;"impoverished", 25;"starving")] and you were one of [pick(10;"two", 20;"three", 20;"four", 30;"five", 20;"six")] children.")) + to_chat(M, role_body("You come from a long line of [pick(40;"crop-harvesters", 20;"soldiers", 20;"factory workers", 5;"scientists", 15;"engineers")], and quickly enlisted to improve your living conditions.")) + to_chat(M, role_body("Following your enlistment to the UPP military at the age of 17, you were assigned to the 17th 'Smoldering Sons' battalion (six hundred strong) under the command of Colonel Ganbaatar.")) else - to_chat(M, SPAN_BOLD("You were brought online in a UPP engineering facility, knowing only your engineers for the first few weeks for your pseudo-life.")) - to_chat(M, SPAN_BOLD("You were programmed with all of the medical and combat experience a military fighting force support asset required.")) - to_chat(M, SPAN_BOLD("Throughout your career, your engineers, and later, your UPP compatriots, treated you like a tool, and only that.")) - to_chat(M, SPAN_BOLD("Some weeks after your unit integration, you were assigned to the 17th 'Smoldering Sons' battalion (six hundred strong) under the command of Colonel Ganbaatar.")) - to_chat(M, SPAN_BOLD("You were shipped off with the battalion to one of the UPP's most remote territories, a gas giant designated MV-35 in the Anglo-Japanese Arm, in the Neroid Sector.")) - to_chat(M, SPAN_BOLD("For the past 14 months, you and the rest of the Smoldering Sons have been stationed at MV-35's only facility, the helium refinery, Altai Station.")) - to_chat(M, SPAN_BOLD("As MV-35 and Altai Station are the only UPP-held zones in the Neroid Sector for many lightyears, you have spent most of your military career holed up in crammed quarters in near darkness, waiting for supply shipments and transport escort deployments.")) - to_chat(M, SPAN_BOLD("With the recent arrival of the enemy USCM battalion the 'Falling Falcons' and their flagship, the [MAIN_SHIP_NAME], the UPP has felt threatened in the sector.")) - to_chat(M, SPAN_BOLD("In an effort to protect the vulnerable MV-35 from the encroaching UA/USCM imperialists, the leadership of your battalion has opted this to be the best opportunity to strike at the Falling Falcons to catch them off guard.")) - to_chat(M, SPAN_WARNING(FONT_SIZE_BIG("Glory to Colonel Ganbaatar."))) - to_chat(M, SPAN_WARNING(FONT_SIZE_BIG("Glory to the Smoldering Sons."))) - to_chat(M, SPAN_WARNING(FONT_SIZE_BIG("Glory to the UPP."))) + to_chat(M, role_body("You were brought online in a UPP engineering facility, knowing only your engineers for the first few weeks for your pseudo-life.")) + to_chat(M, role_body("You were programmed with all of the medical and combat experience a military fighting force support asset required.")) + to_chat(M, role_body("Throughout your career, your engineers, and later, your UPP compatriots, treated you like a tool, and only that.")) + to_chat(M, role_body("Some weeks after your unit integration, you were assigned to the 17th 'Smoldering Sons' battalion (six hundred strong) under the command of Colonel Ganbaatar.")) + to_chat(M, role_body("You were shipped off with the battalion to one of the UPP's most remote territories, a gas giant designated MV-35 in the Anglo-Japanese Arm, in the Neroid Sector.")) + to_chat(M, role_body("For the past 14 months, you and the rest of the Smoldering Sons have been stationed at MV-35's only facility, the helium refinery, Altai Station.")) + to_chat(M, role_body("As MV-35 and Altai Station are the only UPP-held zones in the Neroid Sector for many lightyears, you have spent most of your military career holed up in crammed quarters in near darkness, waiting for supply shipments and transport escort deployments.")) + to_chat(M, role_body("With the recent arrival of the enemy USCM battalion the 'Falling Falcons' and their flagship, the [MAIN_SHIP_NAME], the UPP has felt threatened in the sector.")) + to_chat(M, role_body("In an effort to protect the vulnerable MV-35 from the encroaching UA/USCM imperialists, the leadership of your battalion has opted this to be the best opportunity to strike at the Falling Falcons to catch them off guard.")) + to_chat(M, role_header("Glory to Colonel Ganbaatar.")) + to_chat(M, role_header("Glory to the Smoldering Sons.")) + to_chat(M, role_header("Glory to the UPP.")) + to_chat(M, role_body(" Use say :3 to speak in your native tongue.")) + to_chat(M, role_body(" This allows you to speak privately with your fellow UPP allies.")) + to_chat(M, role_body(" Utilize it with your radio to prevent enemy radio interceptions.")) ///////////////////UPP/////////////////////////// @@ -60,22 +63,22 @@ if(!leader && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(H.client, JOB_SQUAD_LEADER, time_required_for_job)) leader = H arm_equipment(H, /datum/equipment_preset/upp/leader, TRUE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are an Officer of the Union of Progressive People, a powerful socialist state that rivals the United Americas!")) + to_chat(H, role_header("You are an Officer of the Union of Progressive People, a powerful socialist state that rivals the United Americas!")) else if(synths < max_synths && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_SYNTH) && GLOB.RoleAuthority.roles_whitelist[H.ckey] & WHITELIST_SYNTHETIC) synths++ - to_chat(H, SPAN_ROLE_HEADER("You are a Combat Synthetic of the Union of Progressive People, a powerful socialist state that rivals the United Americas!")) + to_chat(H, role_header("You are a Combat Synthetic of the Union of Progressive People, a powerful socialist state that rivals the United Americas!")) arm_equipment(H, /datum/equipment_preset/upp/synth, TRUE, TRUE) else if(medics < max_medics && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_MEDIC) && check_timelock(H.client, JOB_SQUAD_MEDIC, time_required_for_job)) medics++ - to_chat(H, SPAN_ROLE_HEADER("You are a Medic of the Union of Progressive People, a powerful socialist state that rivals the United Americas!")) + to_chat(H, role_header("You are a Medic of the Union of Progressive People, a powerful socialist state that rivals the United Americas!")) arm_equipment(H, /datum/equipment_preset/upp/medic, TRUE, TRUE) else if(engineers < engineers && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_ENGINEER) && check_timelock(H.client, JOB_SQUAD_ENGI, time_required_for_job)) engineers++ - to_chat(H, SPAN_ROLE_HEADER("You are a Sapper of the Union of Progressive People, a powerful socialist state that rivals the United Americas!")) + to_chat(H, role_header("You are a Sapper of the Union of Progressive People, a powerful socialist state that rivals the United Americas!")) arm_equipment(H, /datum/equipment_preset/upp/sapper, TRUE, TRUE) else if(heavies < max_heavies && ((!heavy_pick && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_HEAVY)) || (heavy_pick && HAS_FLAG(H.client.prefs.toggles_ert, (PLAY_HEAVY|PLAY_SMARTGUNNER)))) && check_timelock(H.client, heavy_pick ? list(JOB_SQUAD_SPECIALIST, JOB_SQUAD_SMARTGUN) : JOB_SQUAD_SPECIALIST, time_required_for_job)) heavies++ - to_chat(H, SPAN_ROLE_HEADER("You are a Sergeant of the Union of Progressive People, a powerful socialist state that rivals the United Americas!")) + to_chat(H, role_header("You are a Sergeant of the Union of Progressive People, a powerful socialist state that rivals the United Americas!")) var/equipment_path = /datum/equipment_preset/upp/specialist if(heavy_pick) if(HAS_FLAG(H.client.prefs.toggles_ert, PLAY_HEAVY) && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_SMARTGUNNER)) @@ -85,15 +88,15 @@ arm_equipment(H, equipment_path, TRUE, TRUE) else if(smartgunners < max_smartgunners && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_SMARTGUNNER) && check_timelock(H.client, JOB_SQUAD_SMARTGUN, time_required_for_job)) smartgunners++ - to_chat(H, SPAN_ROLE_HEADER("You are a sergeant of the Union of Progressive People, a powerful socialist state that rivals the United Americas!")) + to_chat(H, role_header("You are a sergeant of the Union of Progressive People, a powerful socialist state that rivals the United Americas!")) arm_equipment(H, /datum/equipment_preset/upp/machinegunner, TRUE, TRUE) else - to_chat(H, SPAN_ROLE_HEADER("You are a soldier of the Union of Progressive People, a powerful socialist state that rivals the United Americas!")) + to_chat(H, role_header("You are a soldier of the Union of Progressive People, a powerful socialist state that rivals the United Americas!")) arm_equipment(H, /datum/equipment_preset/upp/soldier, TRUE, TRUE) print_backstory(H) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/upp/hostile diff --git a/code/datums/emergency_calls/upp_commando.dm b/code/datums/emergency_calls/upp_commando.dm index 1bc2b59ba08c..8856184dd24e 100644 --- a/code/datums/emergency_calls/upp_commando.dm +++ b/code/datums/emergency_calls/upp_commando.dm @@ -11,21 +11,21 @@ hostility = TRUE /datum/emergency_call/upp_commando/print_backstory(mob/living/carbon/human/M) - to_chat(M, SPAN_BOLD("You grew up in relativly simple family in [pick(75;"Eurasia", 25;"a famished UPP colony")] with few belongings or luxuries.")) - to_chat(M, SPAN_BOLD("The family you grew up with were [pick(50;"getting by", 25;"impoverished", 25;"starving")] and you were one of [pick(10;"two", 20;"three", 20;"four", 30;"five", 20;"six")] children.")) - to_chat(M, SPAN_BOLD("You come from a long line of [pick(40;"crop-harvesters", 20;"soldiers", 20;"factory workers", 5;"scientists", 15;"engineers")], and quickly enlisted to improve your living conditions.")) - to_chat(M, SPAN_BOLD("Following your enlistment UPP military at the age of 17 you were assigned to the 17th 'Smoldering Sons' battalion (six hundred strong) under the command of Colonel Ganbaatar.")) - to_chat(M, SPAN_BOLD("You were shipped off with the battalion to one of the UPP's most remote territories, a gas giant designated MV-35 in the Anglo-Japanese Arm, in the Neroid Sector.")) - to_chat(M, SPAN_BOLD("For the past 14 months, you and the rest of the Smoldering Sons have been stationed at MV-35's only facility, the helium refinery, Altai Station.")) - to_chat(M, SPAN_BOLD("As MV-35 and Altai Station are the only UPP-held zones in the Neroid Sector for many lightyears, you have spent most of your military career holed up in crammed quarters in near darkness, waiting for supply shipments and transport escort deployments.")) - to_chat(M, SPAN_BOLD("With the recent arrival of the enemy USCM battalion the 'Falling Falcons' and their flagship, the [MAIN_SHIP_NAME], the UPP has felt threatened in the sector.")) - to_chat(M, SPAN_BOLD("In an effort to protect the vunerable MV-35 from the emproaching UA/USCM imperialists, the leadership of your battalion has opted this the best opportunity to strike at the Falling Falcons to catch them off guard.")) - to_chat(M, SPAN_WARNING(FONT_SIZE_BIG("Glory to Colonel Ganbaatar."))) - to_chat(M, SPAN_WARNING(FONT_SIZE_BIG("Glory to the Smoldering Sons."))) - to_chat(M, SPAN_WARNING(FONT_SIZE_BIG("Glory to the UPP."))) - to_chat(M, SPAN_NOTICE(" Use say :3 to speak in your native tongue.")) - to_chat(M, SPAN_NOTICE(" This allows you to speak privately with your fellow UPP allies.")) - to_chat(M, SPAN_NOTICE(" Utilize it with your radio to prevent enemy radio interceptions.")) + to_chat(M, role_body("You grew up in relativly simple family in [pick(75;"Eurasia", 25;"a famished UPP colony")] with few belongings or luxuries.")) + to_chat(M, role_body("The family you grew up with were [pick(50;"getting by", 25;"impoverished", 25;"starving")] and you were one of [pick(10;"two", 20;"three", 20;"four", 30;"five", 20;"six")] children.")) + to_chat(M, role_body("You come from a long line of [pick(40;"crop-harvesters", 20;"soldiers", 20;"factory workers", 5;"scientists", 15;"engineers")], and quickly enlisted to improve your living conditions.")) + to_chat(M, role_body("Following your enlistment UPP military at the age of 17 you were assigned to the 17th 'Smoldering Sons' battalion (six hundred strong) under the command of Colonel Ganbaatar.")) + to_chat(M, role_body("You were shipped off with the battalion to one of the UPP's most remote territories, a gas giant designated MV-35 in the Anglo-Japanese Arm, in the Neroid Sector.")) + to_chat(M, role_body("For the past 14 months, you and the rest of the Smoldering Sons have been stationed at MV-35's only facility, the helium refinery, Altai Station.")) + to_chat(M, role_body("As MV-35 and Altai Station are the only UPP-held zones in the Neroid Sector for many lightyears, you have spent most of your military career holed up in crammed quarters in near darkness, waiting for supply shipments and transport escort deployments.")) + to_chat(M, role_body("With the recent arrival of the enemy USCM battalion the 'Falling Falcons' and their flagship, the [MAIN_SHIP_NAME], the UPP has felt threatened in the sector.")) + to_chat(M, role_body("In an effort to protect the vunerable MV-35 from the emproaching UA/USCM imperialists, the leadership of your battalion has opted this the best opportunity to strike at the Falling Falcons to catch them off guard.")) + to_chat(M, role_header("Glory to Colonel Ganbaatar.")) + to_chat(M, role_header("Glory to the Smoldering Sons.")) + to_chat(M, role_header("Glory to the UPP.")) + to_chat(M, role_body(" Use say :3 to speak in your native tongue.")) + to_chat(M, role_body(" This allows you to speak privately with your fellow UPP allies.")) + to_chat(M, role_body(" Utilize it with your radio to prevent enemy radio interceptions.")) /datum/emergency_call/upp_commando/create_member(datum/mind/M, turf/override_spawn_loc) var/turf/spawn_loc = override_spawn_loc ? override_spawn_loc : get_spawn_point() @@ -39,17 +39,17 @@ if(!leader && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(H.client, JOB_SQUAD_LEADER, time_required_for_job)) //First one spawned is always the leader. leader = H arm_equipment(H, /datum/equipment_preset/upp/commando/leader, TRUE, TRUE) - to_chat(H, SPAN_ROLE_HEADER("You are a Commando Team Leader of the Union of Progressive People, a powerful socialist state that rivals the United Americas!")) + to_chat(H, role_header("You are a Commando Team Leader of the Union of Progressive People, a powerful socialist state that rivals the United Americas!")) else if(medics < max_medics && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_MEDIC) && check_timelock(H.client, JOB_SQUAD_MEDIC, time_required_for_job)) medics++ - to_chat(H, SPAN_ROLE_HEADER("You are a Commando Medic of the Union of Progressive People, a powerful socialist state that rivals the United Americas!")) + to_chat(H, role_header("You are a Commando Medic of the Union of Progressive People, a powerful socialist state that rivals the United Americas!")) arm_equipment(H, /datum/equipment_preset/upp/commando/medic, TRUE, TRUE) else - to_chat(H, SPAN_ROLE_HEADER("You are a Commando of the Union of Progressive People, a powerful socialist state that rivals the United Americas!")) + to_chat(H, role_header("You are a Commando of the Union of Progressive People, a powerful socialist state that rivals the United Americas!")) arm_equipment(H, /datum/equipment_preset/upp/commando, TRUE, TRUE) print_backstory(H) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/upp_commando/low_threat name = "UPP Commandos" @@ -66,14 +66,14 @@ if(!leader && HAS_FLAG(person.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(person.client, JOB_SQUAD_LEADER, time_required_for_job)) //First one spawned is always the leader. leader = person arm_equipment(person, /datum/equipment_preset/upp/commando/leader/low_threat, TRUE, TRUE) - to_chat(person, SPAN_ROLE_HEADER("You are a Commando Team Leader of the Union of Progressive People, a powerful socialist state that rivals the United Americas!")) + to_chat(person, role_header("You are a Commando Team Leader of the Union of Progressive People, a powerful socialist state that rivals the United Americas!")) else if(medics < max_medics && HAS_FLAG(person.client.prefs.toggles_ert, PLAY_MEDIC) && check_timelock(person.client, JOB_SQUAD_MEDIC, time_required_for_job)) medics++ - to_chat(person, SPAN_ROLE_HEADER("You are a Commando Medic of the Union of Progressive People, a powerful socialist state that rivals the United Americas!")) + to_chat(person, role_header("You are a Commando Medic of the Union of Progressive People, a powerful socialist state that rivals the United Americas!")) arm_equipment(person, /datum/equipment_preset/upp/commando/medic/low_threat, TRUE, TRUE) else - to_chat(person, SPAN_ROLE_HEADER("You are a Commando of the Union of Progressive People, a powerful socialist state that rivals the United Americas!")) + to_chat(person, role_header("You are a Commando of the Union of Progressive People, a powerful socialist state that rivals the United Americas!")) arm_equipment(person, /datum/equipment_preset/upp/commando/low_threat, TRUE, TRUE) print_backstory(person) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), person, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), person, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) diff --git a/code/datums/emergency_calls/whiskey_outpost.dm b/code/datums/emergency_calls/whiskey_outpost.dm index 5c46ace04d6c..4af8e7adce92 100644 --- a/code/datums/emergency_calls/whiskey_outpost.dm +++ b/code/datums/emergency_calls/whiskey_outpost.dm @@ -50,7 +50,7 @@ to_chat(mob, SPAN_BOLDNOTICE("You are a Rifleman in the USCM, your squad is here to assist in the defence of [SSmapping.configs[GROUND_MAP].map_name].")) sleep(10) - to_chat(mob, "Objectives: [objectives]") + to_chat(mob, "

Your objectives are:

[objectives]") GLOB.RoleAuthority.randomize_squad(mob) mob.sec_hud_set_ID() mob.hud_set_squad() diff --git a/code/datums/emergency_calls/xeno_cultists.dm b/code/datums/emergency_calls/xeno_cultists.dm index 5da5c9c17e59..915d34501f42 100644 --- a/code/datums/emergency_calls/xeno_cultists.dm +++ b/code/datums/emergency_calls/xeno_cultists.dm @@ -10,7 +10,7 @@ var/synths = 0 /datum/emergency_call/xeno_cult/print_backstory(mob/living/carbon/human/H) - to_chat(H, SPAN_BOLD("The xenos are graced the Neroid Sector with their presence! It's time to spread their glory across the stars!")) + to_chat(H, role_body("The xenos are graced the Neroid Sector with their presence! It's time to spread their glory across the stars!")) /datum/emergency_call/xeno_cult/create_member(datum/mind/M, turf/override_spawn_loc) var/turf/spawn_loc = override_spawn_loc ? override_spawn_loc : get_spawn_point() @@ -23,15 +23,15 @@ if(!leader && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(H.client, JOB_SQUAD_LEADER, time_required_for_job)) leader = H - to_chat(H, SPAN_ROLE_HEADER("You are the leader of this xeno cult! Bring glory to Queen Mother!")) + to_chat(H, role_header("You are the leader of this xeno cult! Bring glory to Queen Mother!")) arm_equipment(H, /datum/equipment_preset/other/xeno_cultist/leader, TRUE, TRUE) else if(synths < max_synths && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_SYNTH) && GLOB.RoleAuthority.roles_whitelist[H.ckey] & WHITELIST_SYNTHETIC) synths++ - to_chat(H, SPAN_ROLE_HEADER("You are the xeno cult's synthetic! Tend to the Hive and the captured hosts, make sure the Hive grows!")) + to_chat(H, role_header("You are the xeno cult's synthetic! Tend to the Hive and the captured hosts, make sure the Hive grows!")) arm_equipment(H, /datum/equipment_preset/synth/survivor/cultist_synth, TRUE, TRUE) else - to_chat(H, SPAN_ROLE_HEADER("You are a xeno cultist! Follow the orders of the Queen Mother, the Queen, and your cult leader, in that order!")) + to_chat(H, role_header("You are a xeno cultist! Follow the orders of the Queen Mother, the Queen, and your cult leader, in that order!")) arm_equipment(H, /datum/equipment_preset/other/xeno_cultist, TRUE, TRUE) print_backstory(H) - addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(to_chat), H, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) diff --git a/code/datums/emergency_calls/zombie.dm b/code/datums/emergency_calls/zombie.dm index 80ca9b8503a5..d64a07ff1a23 100644 --- a/code/datums/emergency_calls/zombie.dm +++ b/code/datums/emergency_calls/zombie.dm @@ -22,5 +22,5 @@ sleep(20) if(H && H.loc) - to_chat(H, SPAN_ROLE_HEADER("You are a Zombie!")) - to_chat(H, SPAN_ROLE_BODY("Spread... Consume... Infect...")) + to_chat(H, role_header("You are a Zombie!")) + to_chat(H, role_body("Spread... Consume... Infect...")) diff --git a/code/game/gamemodes/cm_initialize.dm b/code/game/gamemodes/cm_initialize.dm index ffcfd37489af..710b0debe068 100644 --- a/code/game/gamemodes/cm_initialize.dm +++ b/code/game/gamemodes/cm_initialize.dm @@ -800,16 +800,22 @@ Additional game mode variables. H.name = H.get_visible_name() if(!H.first_xeno) //Only give objectives/back-stories to uninfected survivors - if(spawner.intro_text && spawner.intro_text.len) + if(spawner.intro_text) spawn(4) - for(var/line in spawner.intro_text) - to_chat(H, line) + to_chat(H, role_header(spawner.intro_text)) + if(spawner.intro_body) + to_chat(H, role_body(spawner.intro_body)) + else + to_chat(H, role_body(SSmapping.configs[GROUND_MAP].survivor_message)) + to_chat(H, role_body("You are fully aware of the xenomorph threat and are able to use this knowledge as you see fit.")) + to_chat(H, role_body("You are NOT aware of the marines or their intentions. ")) + else spawn(4) - to_chat(H, "

You are a survivor!

") - to_chat(H, SPAN_NOTICE(SSmapping.configs[GROUND_MAP].survivor_message)) - to_chat(H, SPAN_NOTICE("You are fully aware of the xenomorph threat and are able to use this knowledge as you see fit.")) - to_chat(H, SPAN_NOTICE("You are NOT aware of the marines or their intentions. ")) + to_chat(H, role_header("You are a survivor!")) + to_chat(H, role_body(SSmapping.configs[GROUND_MAP].survivor_message)) + to_chat(H, role_body("You are fully aware of the xenomorph threat and are able to use this knowledge as you see fit.")) + to_chat(H, role_body("You are NOT aware of the marines or their intentions. ")) if(spawner.story_text) . = 1 spawn(6) @@ -829,10 +835,10 @@ Additional game mode variables. if(!H.first_xeno) //Only give objectives/back-stories to uninfected survivors new /datum/cm_objective/move_mob/almayer/survivor(H) spawn(4) - to_chat(H, "

You are a survivor!

") - to_chat(H, SPAN_NOTICE(SSmapping.configs[GROUND_MAP].survivor_message)) - to_chat(H, SPAN_NOTICE("You are fully aware of the xenomorph threat and are able to use this knowledge as you see fit.")) - to_chat(H, SPAN_NOTICE("You are NOT aware of the marines or their intentions.")) + to_chat(H, role_header("You are a survivor!")) + to_chat(H, role_body(SSmapping.configs[GROUND_MAP].survivor_message)) + to_chat(H, role_body("You are fully aware of the xenomorph threat and are able to use this knowledge as you see fit.")) + to_chat(H, role_body("You are NOT aware of the marines or their intentions.")) return 1 /datum/game_mode/proc/tell_survivor_story() diff --git a/code/game/gamemodes/cm_process.dm b/code/game/gamemodes/cm_process.dm index 462f82e99cec..1685218bf6a3 100644 --- a/code/game/gamemodes/cm_process.dm +++ b/code/game/gamemodes/cm_process.dm @@ -107,8 +107,8 @@ of predators), but can be added to include variant game modes (like humans vs. h /datum/game_mode/proc/declare_fun_facts() set waitfor = 0 sleep(2 SECONDS) - to_chat_spaced(world, margin_bottom = 0, html = SPAN_ROLE_BODY("|______________________|")) - to_world(SPAN_ROLE_HEADER("FUN FACTS")) + to_chat_spaced(world, margin_bottom = 0, html = SPAN_ROUNDBODY("|______________________|")) + to_world(SPAN_ROUNDBODY("FUN FACTS")) var/list/fact_types = subtypesof(/datum/random_fact) for(var/fact_type as anything in fact_types) var/datum/random_fact/fact_human = new fact_type(set_check_human = TRUE, set_check_xeno = FALSE) @@ -116,7 +116,7 @@ of predators), but can be added to include variant game modes (like humans vs. h for(var/fact_type as anything in fact_types) var/datum/random_fact/fact_xeno = new fact_type(set_check_human = FALSE, set_check_xeno = TRUE) fact_xeno.announce() - to_chat_spaced(world, margin_top = 0, html = SPAN_ROLE_BODY("|______________________|")) + to_chat_spaced(world, margin_top = 0, html = SPAN_ROUNDBODY("|______________________|")) //===================================================\\ diff --git a/code/game/jobs/job/civilians/other/survivors.dm b/code/game/jobs/job/civilians/other/survivors.dm index 23097e139eda..941e5ec41f46 100644 --- a/code/game/jobs/job/civilians/other/survivors.dm +++ b/code/game/jobs/job/civilians/other/survivors.dm @@ -9,6 +9,7 @@ late_joinable = FALSE job_options = SURVIVOR_VARIANT_LIST var/intro_text + var/intro_body var/story_text /// Whether or not the survivor is an inherently hostile to marines. var/hostile = FALSE @@ -25,11 +26,7 @@ /datum/job/civilian/survivor/announce_entry_message(mob/living/carbon/human/survivor, datum/money_account/account, whitelist_status) //The actual message that is displayed to the mob when they enter the game as a new player. if(survivor?.loc && survivor.client) //Document syntax cannot have tabs for proper formatting. - var/entrydisplay = " \ - [SPAN_ROLE_BODY("|______________________|")] \n\ - [SPAN_ROLE_BODY("[generate_entry_message(survivor)]
[account ? "Your account number is: [account.account_number]. Your account pin is: [account.remote_access_pin]." : "You do not have a bank account."]")] \n\ - [SPAN_ROLE_BODY("|______________________|")] \ - " + var/entrydisplay = "[generate_entry_message(survivor)][account ? "Your account number is: [account.account_number]. Your account pin is: [account.remote_access_pin]." : "You do not have a bank account."]" to_chat_spaced(survivor, html = entrydisplay) /datum/job/civilian/survivor/spawn_in_player(mob/new_player/NP) @@ -69,16 +66,19 @@ /datum/job/civilian/survivor/generate_entry_message(mob/living/carbon/human/survivor) if(intro_text) - for(var/line in intro_text) - to_chat(survivor, line) + to_chat(survivor, role_header(intro_text)) else - to_chat(survivor, "

You are a survivor!

") - to_chat(survivor, SPAN_NOTICE(SSmapping.configs[GROUND_MAP].survivor_message)) - to_chat(survivor, SPAN_NOTICE("You are fully aware of the xenomorph threat and are able to use this knowledge as you see fit.")) - to_chat(survivor, SPAN_NOTICE("You are NOT aware of the marines or their intentions. ")) + to_chat(survivor, role_header("You are a survivor!")) + + if(intro_body) + to_chat(survivor, role_body(intro_body)) + else + to_chat(survivor, role_body(SSmapping.configs[GROUND_MAP].survivor_message)) + to_chat(survivor, role_body("You are fully aware of the xenomorph threat and are able to use this knowledge as you see fit.")) + to_chat(survivor, role_body("You are NOT aware of the marines or their intentions. ")) if(story_text) - to_chat(survivor, story_text) + to_chat(survivor, role_body(story_text)) survivor.mind.memory += story_text else tell_survivor_story(survivor) @@ -121,7 +121,7 @@ var/random_name = pick(random_name(FEMALE), random_name(MALE)) var/temp_story = "Your story thus far: " + replacetext(pick(survivor_story), "{name}", "[random_name]") - to_chat(H, temp_story) + to_chat(H, role_body(temp_story)) H.mind.memory += temp_story return TRUE diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index 56decd8f0c02..c9e05e9e1b5b 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -203,24 +203,16 @@ entry_message_intro = "You are the [title]!" if(!entry_message_end) entry_message_end = "As the [title] you answer to [supervisors]. Special circumstances may change this!" - return "[entry_message_intro]
[entry_message_body]
[entry_message_end]" + return "[role_header(entry_message_intro)][role_body(entry_message_body)][role_body(entry_message_end)]" /datum/job/proc/announce_entry_message(mob/living/carbon/human/H, datum/money_account/M, whitelist_status) //The actual message that is displayed to the mob when they enter the game as a new player. set waitfor = 0 sleep(10) if(H && H.loc && H.client) - var/title_given - title_given = lowertext(disp_title) //Document syntax cannot have tabs for proper formatting. - var/entrydisplay = " \ - [SPAN_ROLE_BODY("|______________________|")] \n\ - [SPAN_ROLE_HEADER("You are \a [title_given]")] \n\ - [flags_startup_parameters & ROLE_ADMIN_NOTIFY ? SPAN_ROLE_HEADER("You are playing a job that is important for game progression. If you have to disconnect, please notify the admins via adminhelp.") : ""] \n\ - [SPAN_ROLE_BODY("[generate_entry_message(H)]
[M ? "Your account number is: [M.account_number]. Your account pin is: [M.remote_access_pin]." : "You do not have a bank account."]")] \n\ - [SPAN_ROLE_BODY("|______________________|")] \ - " - to_chat_spaced(H, html = entrydisplay) + var/entrydisplay = "[generate_entry_message(H)][M ? role_body("Your account number is: [M.account_number]. Your account pin is: [M.remote_access_pin].") : role_body("You do not have a bank account.")][flags_startup_parameters & ROLE_ADMIN_NOTIFY ? role_header("You are playing a job that is important for game progression. If you have to disconnect, please notify the admins via adminhelp.") : ""]" + to_chat(H, html = entrydisplay) /datum/job/proc/generate_entry_conditions(mob/living/M, whitelist_status) if (istype(M) && M.client) diff --git a/code/game/jobs/job/marine/marine.dm b/code/game/jobs/job/marine/marine.dm index e07c1edd3138..286a1399182b 100644 --- a/code/game/jobs/job/marine/marine.dm +++ b/code/game/jobs/job/marine/marine.dm @@ -7,7 +7,7 @@ /datum/job/marine/generate_entry_message(mob/living/carbon/human/current_human) if(current_human.assigned_squad) - entry_message_intro = "You are a [title]!
You have been assigned to: [lowertext(current_human.assigned_squad.name)] squad.[Check_WO() ? "" : " Make your way to the cafeteria for some post-cryosleep chow, and then get equipped in your squad's prep room." ]" + entry_message_intro = "

You are a [title]!

You have been assigned to: [current_human.assigned_squad.name] Squad!.[Check_WO() ? "" : " Make your way to the cafeteria for some post-cryosleep chow, and then get equipped in your squad's prep room." ]" return ..() /datum/job/marine/generate_entry_conditions(mob/living/carbon/human/current_human) diff --git a/code/game/objects/effects/landmarks/survivor_spawner.dm b/code/game/objects/effects/landmarks/survivor_spawner.dm index a53fead0d3bf..470511296a09 100644 --- a/code/game/objects/effects/landmarks/survivor_spawner.dm +++ b/code/game/objects/effects/landmarks/survivor_spawner.dm @@ -3,7 +3,8 @@ var/equipment = null var/synth_equipment = null var/CO_equipment = null - var/list/intro_text = list() + var/intro_text = "" + var/intro_body = "" var/story_text = "" var/roundstart_damage_min = 0 var/roundstart_damage_max = 0 @@ -32,9 +33,8 @@ hostile = TRUE equipment = /datum/equipment_preset/survivor/clf synth_equipment = /datum/equipment_preset/clf/synth - intro_text = list("

You are a survivor of a crash landing!

",\ - "You are NOT aware of the xenomorph threat.",\ - "Your primary objective is to heal up and survive. If you want to assault the hive - adminhelp.") + intro_text = "You are a survivor of a crash landing!" + intro_body = "You are NOT aware of the xenomorph threat.

Your primary objective is to heal up and survive. If you want to assault the hive - adminhelp." story_text = "You are a soldier of Colonial Liberation Front. Your ship received a distress signal from a planet bordering the CLF controlled space under USCM control. Ready and willing to save poor colonists from parasitic tyrants, you and your team boarded small ship called Marie Curie. Unfortunately, right before you came close to a landing zone, a glob of acid hit the ship, damaging one of the engines. Despite all the efforts of the pilot, the ship went straight into nearby mountain. You were hurt pretty badly in the crash. Dumbfounded, you rose up and noticed that one of your limbs is at a weird angle, broken. You looked at other survivors, also limping and trying to fix their broken bones." roundstart_damage_min = 3 roundstart_damage_max = 10 @@ -46,9 +46,8 @@ hostile = TRUE equipment = /datum/equipment_preset/clf/engineer synth_equipment = /datum/equipment_preset/clf/synth - intro_text = list("

You are a survivor of a crash landing!

",\ - "You are NOT aware of the xenomorph threat.",\ - "Your primary objective is to heal up and survive. If you want to assault the hive - adminhelp.") + intro_text = "You are a survivor of a crash landing!" + intro_body = "You are NOT aware of the xenomorph threat.

Your primary objective is to heal up and survive. If you want to assault the hive - adminhelp." story_text = "You are a soldier of Colonial Liberation Front. Your ship received a distress signal from a planet bordering the CLF controlled space under USCM control. Ready and willing to save poor colonists from parasitic tyrants, you and your team boarded small ship called Marie Curie. Unfortunately, right before you came close to a landing zone, a glob of acid hit the ship, damaging one of the engines. Despite all the efforts of the pilot, the ship went straight into nearby mountain. You were hurt pretty badly in the crash. Dumbfounded, you rose up and noticed that one of your limbs is at a weird angle, broken. You looked at other survivors, also limping and trying to fix their broken bones." roundstart_damage_min = 3 roundstart_damage_max = 10 @@ -60,9 +59,8 @@ hostile = TRUE equipment = /datum/equipment_preset/clf/medic synth_equipment = /datum/equipment_preset/clf/synth - intro_text = list("

You are a survivor of a crash landing!

",\ - "You are NOT aware of the xenomorph threat.",\ - "Your primary objective is to heal up and survive. If you want to assault the hive - adminhelp.") + intro_text = "You are a survivor of a crash landing!" + intro_body = "You are NOT aware of the xenomorph threat.

Your primary objective is to heal up and survive. If you want to assault the hive - adminhelp." story_text = "You are a soldier of Colonial Liberation Front. Your ship received a distress signal from a planet bordering the CLF controlled space under USCM control. Ready and willing to save poor colonists from parasitic tyrants, you and your team boarded small ship called Marie Curie. Unfortunately, right before you came close to a landing zone, a glob of acid hit the ship, damaging one of the engines. Despite all the efforts of the pilot, the ship went straight into nearby mountain. You were hurt pretty badly in the crash. Dumbfounded, you rose up and noticed that one of your limbs is at a weird angle, broken. You looked at other survivors, also limping and trying to fix their broken bones." roundstart_damage_min = 3 roundstart_damage_max = 10 @@ -73,9 +71,8 @@ /obj/effect/landmark/survivor_spawner/bigred_crashed_pmc equipment = /datum/equipment_preset/survivor/pmc synth_equipment = /datum/equipment_preset/synth/survivor/pmc - intro_text = list("

You are a survivor of a crash landing!

",\ - "You are NOT aware of the xenomorph threat.",\ - "Your primary objective is to heal up and survive. If you want to assault the hive - adminhelp.") + intro_text = "You are a survivor of a crash landing!" + intro_body = "You are NOT aware of the xenomorph threat.

Your primary objective is to heal up and survive. If you want to assault the hive - adminhelp." story_text = "You are a PMC from Weyland-Yutani. Your ship was enroute to Solaris Ridge to escort an Assistant Manager. On the way, your ship received a distress signal from the colony about an attack. Worried that it might be a CLF attack, your pilot set full speed for the colony. However, during atmospheric entry the engine failed and you fell unconcious from the G-Forces. You wake up wounded... and see that the ship has crashed onto the colony. Your squadmates lie dead beside you, but there's some missing. Perhaps they survived and moved elsewhere? You need to find out what happened to the colony, see if you can find any of your squadmates, and find a way to contact Weyland-Yutani." roundstart_damage_min = 3 roundstart_damage_max = 10 @@ -86,9 +83,8 @@ /obj/effect/landmark/survivor_spawner/bigred_crashed_pmc_medic equipment = /datum/equipment_preset/survivor/pmc/medic synth_equipment = /datum/equipment_preset/synth/survivor/pmc - intro_text = list("

You are a survivor of a crash landing!

",\ - "You are NOT aware of the xenomorph threat.",\ - "Your primary objective is to heal up and survive. If you want to assault the hive - adminhelp.") + intro_text = "You are a survivor of a crash landing!" + intro_body = "You are NOT aware of the xenomorph threat.

Your primary objective is to heal up and survive. If you want to assault the hive - adminhelp." story_text = "You are a PMC medic from Weyland-Yutani. Your ship was enroute to Solaris Ridge to escort an Assistant Manager. On the way, your ship received a distress signal from the colony about an attack. Worried that it might be a CLF attack, your pilot set full speed for the colony. However, during atmospheric entry the engine failed and you fell unconcious from the G-Forces. You wake up wounded... and see that the ship has crashed onto the colony. Your squadmates lie dead beside you, but there's some missing. Perhaps they survived and moved elsewhere? You need to find out what happened to the colony, see if you can find any of your squadmates, and find a way to contact Weyland-Yutani." roundstart_damage_min = 3 roundstart_damage_max = 10 @@ -99,9 +95,8 @@ /obj/effect/landmark/survivor_spawner/bigred_crashed_pmc_engineer equipment = /datum/equipment_preset/survivor/pmc/engineer synth_equipment = /datum/equipment_preset/synth/survivor/pmc - intro_text = list("

You are a survivor of a crash landing!

",\ - "You are NOT aware of the xenomorph threat.",\ - "Your primary objective is to heal up and survive. If you want to assault the hive - adminhelp.") + intro_text = "You are a survivor of a crash landing!" + intro_body = "You are NOT aware of the xenomorph threat.

Your primary objective is to heal up and survive. If you want to assault the hive - adminhelp." story_text = "You are a PMC engineer from Weyland-Yutani. Your ship was enroute to Solaris Ridge to escort an Assistant Manager. On the way, your ship received a distress signal from the colony about an attack. Worried that it might be a CLF attack, your pilot set full speed for the colony. However, during atmospheric entry the engine failed and you fell unconcious from the G-Forces. You wake up wounded... and see that the ship has crashed onto the colony. Your squadmates lie dead beside you, but there's some missing. Perhaps they survived and moved elsewhere? You need to find out what happened to the colony, see if you can find any of your squadmates, and find a way to contact Weyland-Yutani." roundstart_damage_min = 3 roundstart_damage_max = 10 @@ -112,9 +107,8 @@ /obj/effect/landmark/survivor_spawner/bigred_crashed_cl equipment = /datum/equipment_preset/survivor/wy/manager synth_equipment = /datum/equipment_preset/synth/survivor/pmc - intro_text = list("

You are a survivor of a crash landing!

",\ - "You are NOT aware of the xenomorph threat.",\ - "Your primary objective is to heal up and survive. If you want to assault the hive - adminhelp.") + intro_text = "You are a survivor of a crash landing!" + intro_body = "You are NOT aware of the xenomorph threat.

Your primary objective is to heal up and survive. If you want to assault the hive - adminhelp." story_text = "You are an Assistant Manager from Weyland-Yutani. You were being escorted onboard a PMC ship to Solaris Ridge. On the way, the ship received a distress signal from the colony about an attack. Worried that it might be a CLF attack, the pilot set full speed for the colony. However, during atmospheric entry the engine failed and you fell unconcious from the G-Forces. You wake up wounded... and see that the ship has crashed onto the colony. The shipcrew lie dead beside you, but there's some missing. Perhaps they survived and moved elsewhere? You must get up and find a way to contact Weyland-Yutani." roundstart_damage_min = 3 roundstart_damage_max = 10 @@ -147,44 +141,39 @@ /obj/effect/landmark/survivor_spawner/upp/soldier equipment = /datum/equipment_preset/survivor/upp/soldier synth_equipment = /datum/equipment_preset/synth/survivor/upp - intro_text = list("

You are a member of a UPP recon force!

",\ - "You ARE aware of the xenomorph threat.",\ - "Your primary objective is to survive. You believe a second dropship crashed somewhere to the south east, which was carrying additional weapons") + intro_text = "You are a member of a UPP recon force!" + intro_body = "You ARE aware of the xenomorph threat.

Your primary objective is to survive. You believe a second dropship crashed somewhere to the south east, which was carrying additional weapons" story_text = "Your orders were simple, Recon the site, ascertain if there is a biological weapons program in the area, and if so to secure the colony and retrieve a sample. However your team failed to account for an active anti-air battery near the area. Both your craft and your sister ship crashed. Barely having a chance to catch your breath, you found yourself being assailed by vile xenomorphs! You and your team have barely held your ground, at the cost of four of your own, but more are coming and ammo is low. You believe an American rescue force is en route." spawn_priority = SPAWN_PRIORITY_LOW /obj/effect/landmark/survivor_spawner/upp_sapper equipment = /datum/equipment_preset/survivor/upp/sapper synth_equipment = /datum/equipment_preset/synth/survivor/upp - intro_text = list("

You are a member of a UPP recon force!

",\ - "You ARE aware of the xenomorph threat.",\ - "Your primary objective is to survive. You believe a second dropship crashed somewhere to the south east, which was carrying additional weapons") + intro_text = "You are a member of a UPP recon force!" + intro_body = "You ARE aware of the xenomorph threat.

Your primary objective is to survive. You believe a second dropship crashed somewhere to the south east, which was carrying additional weapons" story_text = "Your orders were simple, Recon the site, ascertain if there is a biological weapons program in the area, and if so to secure the colony and retrieve a sample. However your team failed to account for an active anti-air battery near the area. Both your craft and your sister ship crashed. Barely having a chance to catch your breath, you found yourself being assailed by vile xenomorphs! You and your team have barely held your ground, at the cost of four of your own, but more are coming and ammo is low. You believe an American rescue force is en route." spawn_priority = SPAWN_PRIORITY_MEDIUM /obj/effect/landmark/survivor_spawner/upp_medic equipment = /datum/equipment_preset/survivor/upp/medic synth_equipment = /datum/equipment_preset/synth/survivor/upp - intro_text = list("

You are a member of a UPP recon force!

",\ - "You ARE aware of the xenomorph threat.",\ - "Your primary objective is to survive. You believe a second dropship crashed somewhere to the south east, which was carrying additional weapons") + intro_text = "You are a member of a UPP recon force!" + intro_body = "You ARE aware of the xenomorph threat.

Your primary objective is to survive. You believe a second dropship crashed somewhere to the south east, which was carrying additional weapons" story_text = "Your orders were simple, Recon the site, ascertain if there is a biological weapons program in the area, and if so to secure the colony and retrieve a sample. However your team failed to account for an active anti-air battery near the area. Both your craft and your sister ship crashed. Barely having a chance to catch your breath, you found yourself being assailed by vile xenomorphs! You and your team have barely held your ground, at the cost of four of your own, but more are coming and ammo is low. You believe an American rescue force is en route." spawn_priority = SPAWN_PRIORITY_MEDIUM /obj/effect/landmark/survivor_spawner/upp_specialist equipment = /datum/equipment_preset/survivor/upp/specialist synth_equipment = /datum/equipment_preset/synth/survivor/upp - intro_text = list("

You are a member of a UPP recon force!

",\ - "You ARE aware of the xenomorph threat.",\ - "Your primary objective is to survive. You believe a second dropship crashed somewhere to the south east, which was carrying additional weapons") + intro_text = "You are a member of a UPP recon force!" + intro_body = "You ARE aware of the xenomorph threat.

Your primary objective is to survive. You believe a second dropship crashed somewhere to the south east, which was carrying additional weapons" story_text = "Your orders were simple, Recon the site, ascertain if there is a biological weapons program in the area, and if so to secure the colony and retrieve a sample. However your team failed to account for an active anti-air battery near the area. Both your craft and your sister ship crashed. Barely having a chance to catch your breath, you found yourself being assailed by vile xenomorphs! You and your team have barely held your ground, at the cost of four of your own, but more are coming and ammo is low. You believe an American rescue force is en route." spawn_priority = SPAWN_PRIORITY_HIGH /obj/effect/landmark/survivor_spawner/squad_leader equipment = /datum/equipment_preset/survivor/upp/squad_leader synth_equipment = /datum/equipment_preset/synth/survivor/upp - intro_text = list("

You are a member of a UPP recon force!

",\ - "You ARE aware of the xenomorph threat.",\ - "Your primary objective is to survive. You believe a second dropship crashed somewhere to the south east, which was carrying additional weapons") + intro_text = "You are a member of a UPP recon force!" + intro_body = "You ARE aware of the xenomorph threat.

Your primary objective is to survive. You believe a second dropship crashed somewhere to the south east, which was carrying additional weapons" story_text = "Your orders were simple, Recon the site, ascertain if there is a biological weapons program in the area, and if so to secure the colony and retrieve a sample. However your team failed to account for an active anti-air battery near the area. Both your craft and your sister ship crashed. Barely having a chance to catch your breath, you found yourself being assailed by vile xenomorphs! You and your team have barely held your ground, at the cost of four of your own, but more are coming and ammo is low. You believe an American rescue force is en route." spawn_priority = SPAWN_PRIORITY_VERY_HIGH diff --git a/code/modules/mob/living/carbon/human/human_abilities.dm b/code/modules/mob/living/carbon/human/human_abilities.dm index 37329c53b275..c6b54869776d 100644 --- a/code/modules/mob/living/carbon/human/human_abilities.dm +++ b/code/modules/mob/living/carbon/human/human_abilities.dm @@ -417,8 +417,8 @@ CULT preset.load_race(chosen) preset.load_status(chosen, H.hivenumber) - to_chat(chosen, SPAN_ROLE_HEADER("You are now a Xeno Cultist!")) - to_chat(chosen, SPAN_ROLE_BODY("Worship the Xenomorphs and listen to the Cult Leader for orders. The Cult Leader is typically the person who transformed you. Do not kill anyone unless you are wearing your black robes, you may defend yourself.")) + to_chat(chosen, role_header("You are now a Xeno Cultist!")) + to_chat(chosen, role_body("Worship the Xenomorphs and listen to the Cult Leader for orders. The Cult Leader is typically the person who transformed you. Do not kill anyone unless you are wearing your black robes, you may defend yourself.")) xeno_message("[chosen] has been converted into a cultist!", 2, hive.hivenumber) diff --git a/code/span_macros.dm b/code/span_macros.dm index 77e57f2077a0..1d7a73a53669 100644 --- a/code/span_macros.dm +++ b/code/span_macros.dm @@ -32,8 +32,6 @@ // Round and roles #define SPAN_ROUNDHEADER(X) "[X]" #define SPAN_ROUNDBODY(X) "[X]" -#define SPAN_ROLE_HEADER(X) "[X]" -#define SPAN_ROLE_BODY(X) "[X]" // OOC diff --git a/code/stylesheet.dm b/code/stylesheet.dm index ab74dc547cfa..0c531ca5a9c2 100644 --- a/code/stylesheet.dm +++ b/code/stylesheet.dm @@ -124,8 +124,8 @@ h1.alert, h2.alert {color: #000000;} .xenoqueen {color: #730d73; font-style: italic; font-weight: bold; font-size: 3;} .newscaster {color: #800000;} -.role_header {color: #db0000 text-align: center; font-weight: bold; font-family: trebuchet-ms; font-size: 2;} -.role_body {color: #000099; text-align: center;} +.role_header {color: #db0000 text-align: justify; font-weight: bold; font-family: trebuchet-ms; font-size: 2;padding: 0em 1em;} +.role_body {color: #000099; text-align: justify;padding: 0em 1em;} .round_header {color: #db0000; text-align: center; font-family: courier; font-weight: bold; font-size: 4;} .round_body {color: #001427; text-align: center; font-family: trebuchet-ms; font-weight: bold; font-size: 3;} diff --git a/tgui/packages/tgui-panel/styles/goon/chat-dark.scss b/tgui/packages/tgui-panel/styles/goon/chat-dark.scss index 835a94341708..c88a8a1d3c75 100644 --- a/tgui/packages/tgui-panel/styles/goon/chat-dark.scss +++ b/tgui/packages/tgui-panel/styles/goon/chat-dark.scss @@ -1209,18 +1209,17 @@ em { .role_header { color: #e92d2d; - display: block; text-align: center; font-weight: bold; - font-family: trebuchet-ms; - font-size: 150%; + font-size: 140%; + padding: 0em 1em; } .role_body { color: #3a3ae9; - display: block; - text-align: center; - font-size: 125%; + text-align: justify; + font-size: 110%; + padding: 0em 1em; } .round_header { diff --git a/tgui/packages/tgui-panel/styles/goon/chat-light.scss b/tgui/packages/tgui-panel/styles/goon/chat-light.scss index 8501d0b9526c..5520e5d980b3 100644 --- a/tgui/packages/tgui-panel/styles/goon/chat-light.scss +++ b/tgui/packages/tgui-panel/styles/goon/chat-light.scss @@ -1237,18 +1237,17 @@ h2.alert { .role_header { color: #db0000; - display: block; text-align: center; font-weight: bold; - font-family: trebuchet-ms; - font-size: 150%; + font-size: 140%; + padding: 0em 1em; } .role_body { color: #000099; - display: block; - text-align: center; - font-size: 125%; + text-align: justify; + font-size: 110%; + padding: 0em 1em; } .round_header { diff --git a/tgui/public/tgui-panel.bundle.css b/tgui/public/tgui-panel.bundle.css index 3cb39fe3dbb8..d39c783033a5 100644 --- a/tgui/public/tgui-panel.bundle.css +++ b/tgui/public/tgui-panel.bundle.css @@ -1,2 +1,2 @@ -html,body{box-sizing:border-box;height:100%;margin:0;font-size:12px}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif}*,*:before,*:after{box-sizing:inherit}h1,h2,h3,h4,h5,h6{display:block;margin:0;padding:6px 0;padding:.5rem 0}h1{font-size:18px;font-size:1.5rem}h2{font-size:16px;font-size:1.333rem}h3{font-size:14px;font-size:1.167rem}h4{font-size:12px;font-size:1rem}td,th{vertical-align:baseline;text-align:left}.candystripe:nth-child(odd){background-color:rgba(0,0,0,.25)}.color-black{color:#1a1a1a !important}.color-white{color:#fff !important}.color-red{color:#df3e3e !important}.color-orange{color:#f37f33 !important}.color-yellow{color:#fbda21 !important}.color-olive{color:#cbe41c !important}.color-green{color:#25ca4c !important}.color-teal{color:#00d6cc !important}.color-blue{color:#2e93de !important}.color-dark-blue{color:#005fa7 !important}.color-violet{color:#7349cf !important}.color-purple{color:#ad45d0 !important}.color-pink{color:#e34da1 !important}.color-brown{color:#b97447 !important}.color-grey{color:#848484 !important}.color-light-grey{color:#b3b3b3 !important}.color-good{color:#68c22d !important}.color-average{color:#f29a29 !important}.color-bad{color:#df3e3e !important}.color-label{color:#8b9bb0 !important}.color-xeno{color:#664573 !important}.color-bg-black{background-color:#000 !important}.color-bg-white{background-color:#d9d9d9 !important}.color-bg-red{background-color:#bd2020 !important}.color-bg-orange{background-color:#d95e0c !important}.color-bg-yellow{background-color:#d9b804 !important}.color-bg-olive{background-color:#9aad14 !important}.color-bg-green{background-color:#1b9638 !important}.color-bg-teal{background-color:#009a93 !important}.color-bg-blue{background-color:#1c71b1 !important}.color-bg-dark-blue{background-color:#003e6e !important}.color-bg-violet{background-color:#552dab !important}.color-bg-purple{background-color:#8b2baa !important}.color-bg-pink{background-color:#cf2082 !important}.color-bg-brown{background-color:#8c5836 !important}.color-bg-grey{background-color:#646464 !important}.color-bg-light-grey{background-color:#919191 !important}.color-bg-good{background-color:#4d9121 !important}.color-bg-average{background-color:#cd7a0d !important}.color-bg-bad{background-color:#bd2020 !important}.color-bg-label{background-color:#657a94 !important}.color-bg-xeno{background-color:#462f4e !important}.debug-layout,.debug-layout *:not(g):not(path){color:rgba(255,255,255,.9) !important;background:transparent !important;outline:1px solid rgba(255,255,255,.5) !important;box-shadow:none !important;filter:none !important}.debug-layout:hover,.debug-layout *:not(g):not(path):hover{outline-color:rgba(255,255,255,.8) !important}.outline-dotted{outline-style:dotted !important}.outline-dashed{outline-style:dashed !important}.outline-solid{outline-style:solid !important}.outline-double{outline-style:double !important}.outline-groove{outline-style:groove !important}.outline-ridge{outline-style:ridge !important}.outline-inset{outline-style:inset !important}.outline-outset{outline-style:outset !important}.outline-color-black{outline:.167rem solid #1a1a1a !important}.outline-color-white{outline:.167rem solid #fff !important}.outline-color-red{outline:.167rem solid #df3e3e !important}.outline-color-orange{outline:.167rem solid #f37f33 !important}.outline-color-yellow{outline:.167rem solid #fbda21 !important}.outline-color-olive{outline:.167rem solid #cbe41c !important}.outline-color-green{outline:.167rem solid #25ca4c !important}.outline-color-teal{outline:.167rem solid #00d6cc !important}.outline-color-blue{outline:.167rem solid #2e93de !important}.outline-color-dark-blue{outline:.167rem solid #005fa7 !important}.outline-color-violet{outline:.167rem solid #7349cf !important}.outline-color-purple{outline:.167rem solid #ad45d0 !important}.outline-color-pink{outline:.167rem solid #e34da1 !important}.outline-color-brown{outline:.167rem solid #b97447 !important}.outline-color-grey{outline:.167rem solid #848484 !important}.outline-color-light-grey{outline:.167rem solid #b3b3b3 !important}.outline-color-good{outline:.167rem solid #68c22d !important}.outline-color-average{outline:.167rem solid #f29a29 !important}.outline-color-bad{outline:.167rem solid #df3e3e !important}.outline-color-label{outline:.167rem solid #8b9bb0 !important}.outline-color-xeno{outline:.167rem solid #664573 !important}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-baseline{text-align:baseline}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-pre{white-space:pre}.text-bold{font-weight:bold}.text-italic{font-style:italic}.text-underline{text-decoration:underline}.BlockQuote{color:#8b9bb0;border-left:.1666666667em solid #8b9bb0;padding-left:.5em;margin-bottom:.5em}.BlockQuote:last-child{margin-bottom:0}.Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.Button:last-child{margin-right:0;margin-bottom:0}.Button .fa,.Button .fas,.Button .far{margin-left:-0.25em;margin-right:-0.25em;min-width:1.333em;text-align:center}.Button--hasContent .fa,.Button--hasContent .fas,.Button--hasContent .far{margin-right:.25em}.Button--hasContent.Button--iconPosition--right .fa,.Button--hasContent.Button--iconPosition--right .fas,.Button--hasContent.Button--iconPosition--right .far{margin-right:0px;margin-left:3px}.Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.Button--fluid{display:block;margin-left:0;margin-right:0}.Button--circular{border-radius:50%}.Button--compact{padding:0 .25em;line-height:1.333em}.Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.Button--color--black:hover{transition:color 0ms,background-color 0ms}.Button--color--black:focus{transition:color 100ms,background-color 100ms}.Button--color--black:hover,.Button--color--black:focus{background-color:#131313;color:#fff}.Button--color--white{transition:color 50ms,background-color 50ms;background-color:#d9d9d9;color:#000}.Button--color--white:hover{transition:color 0ms,background-color 0ms}.Button--color--white:focus{transition:color 100ms,background-color 100ms}.Button--color--white:hover,.Button--color--white:focus{background-color:#f8f8f8;color:#000}.Button--color--red{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--red:hover{transition:color 0ms,background-color 0ms}.Button--color--red:focus{transition:color 100ms,background-color 100ms}.Button--color--red:hover,.Button--color--red:focus{background-color:#dc4848;color:#fff}.Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#d95e0c;color:#fff}.Button--color--orange:hover{transition:color 0ms,background-color 0ms}.Button--color--orange:focus{transition:color 100ms,background-color 100ms}.Button--color--orange:hover,.Button--color--orange:focus{background-color:#f0853f;color:#fff}.Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.Button--color--yellow:focus{transition:color 100ms,background-color 100ms}.Button--color--yellow:hover,.Button--color--yellow:focus{background-color:#f5d72e;color:#000}.Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#9aad14;color:#fff}.Button--color--olive:hover{transition:color 0ms,background-color 0ms}.Button--color--olive:focus{transition:color 100ms,background-color 100ms}.Button--color--olive:hover,.Button--color--olive:focus{background-color:#c4da2b;color:#fff}.Button--color--green{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--color--green:hover{transition:color 0ms,background-color 0ms}.Button--color--green:focus{transition:color 100ms,background-color 100ms}.Button--color--green:hover,.Button--color--green:focus{background-color:#32c154;color:#fff}.Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#009a93;color:#fff}.Button--color--teal:hover{transition:color 0ms,background-color 0ms}.Button--color--teal:focus{transition:color 100ms,background-color 100ms}.Button--color--teal:hover,.Button--color--teal:focus{background-color:#13c4bc;color:#fff}.Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#1c71b1;color:#fff}.Button--color--blue:hover{transition:color 0ms,background-color 0ms}.Button--color--blue:focus{transition:color 100ms,background-color 100ms}.Button--color--blue:hover,.Button--color--blue:focus{background-color:#3a95d9;color:#fff}.Button--color--dark-blue{transition:color 50ms,background-color 50ms;background-color:#003e6e;color:#fff}.Button--color--dark-blue:hover{transition:color 0ms,background-color 0ms}.Button--color--dark-blue:focus{transition:color 100ms,background-color 100ms}.Button--color--dark-blue:hover,.Button--color--dark-blue:focus{background-color:#135b92;color:#fff}.Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#552dab;color:#fff}.Button--color--violet:hover{transition:color 0ms,background-color 0ms}.Button--color--violet:focus{transition:color 100ms,background-color 100ms}.Button--color--violet:hover,.Button--color--violet:focus{background-color:#7953cc;color:#fff}.Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#8b2baa;color:#fff}.Button--color--purple:hover{transition:color 0ms,background-color 0ms}.Button--color--purple:focus{transition:color 100ms,background-color 100ms}.Button--color--purple:hover,.Button--color--purple:focus{background-color:#ad4fcd;color:#fff}.Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#cf2082;color:#fff}.Button--color--pink:hover{transition:color 0ms,background-color 0ms}.Button--color--pink:focus{transition:color 100ms,background-color 100ms}.Button--color--pink:hover,.Button--color--pink:focus{background-color:#e257a5;color:#fff}.Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#8c5836;color:#fff}.Button--color--brown:hover{transition:color 0ms,background-color 0ms}.Button--color--brown:focus{transition:color 100ms,background-color 100ms}.Button--color--brown:hover,.Button--color--brown:focus{background-color:#b47851;color:#fff}.Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#646464;color:#fff}.Button--color--grey:hover{transition:color 0ms,background-color 0ms}.Button--color--grey:focus{transition:color 100ms,background-color 100ms}.Button--color--grey:hover,.Button--color--grey:focus{background-color:#868686;color:#fff}.Button--color--light-grey{transition:color 50ms,background-color 50ms;background-color:#919191;color:#fff}.Button--color--light-grey:hover{transition:color 0ms,background-color 0ms}.Button--color--light-grey:focus{transition:color 100ms,background-color 100ms}.Button--color--light-grey:hover,.Button--color--light-grey:focus{background-color:#bababa;color:#fff}.Button--color--good{transition:color 50ms,background-color 50ms;background-color:#4d9121;color:#fff}.Button--color--good:hover{transition:color 0ms,background-color 0ms}.Button--color--good:focus{transition:color 100ms,background-color 100ms}.Button--color--good:hover,.Button--color--good:focus{background-color:#6cba39;color:#fff}.Button--color--average{transition:color 50ms,background-color 50ms;background-color:#cd7a0d;color:#fff}.Button--color--average:hover{transition:color 0ms,background-color 0ms}.Button--color--average:focus{transition:color 100ms,background-color 100ms}.Button--color--average:hover,.Button--color--average:focus{background-color:#ed9d35;color:#fff}.Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--bad:hover{transition:color 0ms,background-color 0ms}.Button--color--bad:focus{transition:color 100ms,background-color 100ms}.Button--color--bad:hover,.Button--color--bad:focus{background-color:#dc4848;color:#fff}.Button--color--label{transition:color 50ms,background-color 50ms;background-color:#657a94;color:#fff}.Button--color--label:hover{transition:color 0ms,background-color 0ms}.Button--color--label:focus{transition:color 100ms,background-color 100ms}.Button--color--label:hover,.Button--color--label:focus{background-color:#91a1b3;color:#fff}.Button--color--xeno{transition:color 50ms,background-color 50ms;background-color:#462f4e;color:#fff}.Button--color--xeno:hover{transition:color 0ms,background-color 0ms}.Button--color--xeno:focus{transition:color 100ms,background-color 100ms}.Button--color--xeno:hover,.Button--color--xeno:focus{background-color:#64496d;color:#fff}.Button--color--default{transition:color 50ms,background-color 50ms;background-color:#3e6189;color:#fff}.Button--color--default:hover{transition:color 0ms,background-color 0ms}.Button--color--default:focus{transition:color 100ms,background-color 100ms}.Button--color--default:hover,.Button--color--default:focus{background-color:#5c83b0;color:#fff}.Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--caution:hover{transition:color 0ms,background-color 0ms}.Button--color--caution:focus{transition:color 100ms,background-color 100ms}.Button--color--caution:hover,.Button--color--caution:focus{background-color:#f5d72e;color:#000}.Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--danger:hover{transition:color 0ms,background-color 0ms}.Button--color--danger:focus{transition:color 100ms,background-color 100ms}.Button--color--danger:hover,.Button--color--danger:focus{background-color:#dc4848;color:#fff}.Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#202020;color:#fff;background-color:rgba(32,32,32,0);color:rgba(255,255,255,.5)}.Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.Button--color--transparent:focus{transition:color 100ms,background-color 100ms}.Button--color--transparent:hover,.Button--color--transparent:focus{background-color:#383838;color:#fff}.Button--disabled{background-color:#999 !important}.Button--selected{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--selected:hover{transition:color 0ms,background-color 0ms}.Button--selected:focus{transition:color 100ms,background-color 100ms}.Button--selected:hover,.Button--selected:focus{background-color:#32c154;color:#fff}.Button--flex{display:inline-flex;flex-direction:column}.Button--flex--fluid{width:100%}.Button--verticalAlignContent--top{justify-content:flex-start}.Button--verticalAlignContent--middle{justify-content:center}.Button--verticalAlignContent--bottom{justify-content:flex-end}.Button__content{display:block;align-self:stretch}.ColorBox{display:inline-block;width:1em;height:1em;line-height:1em;text-align:center}.Dimmer{display:flex;justify-content:center;align-items:center;position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(0,0,0,.75);z-index:1}.Divider--horizontal{margin:.5em 0}.Divider--horizontal:not(.Divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Divider--vertical{height:100%;margin:0 .5em}.Divider--vertical:not(.Divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Dropdown{position:relative}.Dropdown__control{position:relative;display:inline-block;font-family:Verdana,sans-serif;font-size:1em;width:8.3333333333em;line-height:1.4166666667em;user-select:none}.Dropdown__arrow-button{float:right;padding-left:.35em;width:1.2em;height:1.8333333333em;border-left:.0833333333em solid #000;border-left:.0833333333em solid rgba(0,0,0,.25)}.Dropdown__menu{position:absolute;overflow-y:auto;z-index:5;width:8.3333333333em;max-height:16.6666666667em;overflow-y:scroll;border-radius:0 0 .1666666667em .1666666667em;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75)}.Dropdown__menu-noscroll{position:absolute;overflow-y:auto;z-index:5;width:8.3333333333em;max-height:16.6666666667em;border-radius:0 0 .1666666667em .1666666667em;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75)}.Dropdown__menuentry{padding:.1666666667em .3333333333em;font-family:Verdana,sans-serif;font-size:1em;line-height:1.4166666667em;transition:background-color 100ms ease-out}.Dropdown__menuentry:hover{background-color:rgba(255,255,255,.2);transition:background-color 0ms}.Dropdown__over{top:auto;bottom:100%}.Dropdown__selected-text{display:inline-block;text-overflow:ellipsis;white-space:nowrap;height:1.4166666667em;width:calc(100% - 1.2em)}.Flex{display:-ms-flexbox;display:flex}.Flex--inline{display:inline-flex}.Flex--iefix{display:block}.Flex--iefix.Flex--inline{display:inline-block}.Flex__item--iefix{display:inline-block}.Flex--iefix--column>.Flex__item--iefix{display:block}.Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.Input--fluid{display:block;width:auto}.Input__baseline{display:inline-block;color:transparent}.Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input--monospace .Input__input{font-family:"Consolas",monospace}.Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto;margin-bottom:-0.2em;cursor:n-resize}.Knob:after{content:".";color:transparent;line-height:2.5em}.Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0) 100%);border-radius:50%;box-shadow:0 .05em .5em 0 rgba(0,0,0,.5)}.Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.Knob__popupValue{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translateX(50%);white-space:nowrap}.Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.Knob__ringTrackPivot{transform:rotateZ(135deg)}.Knob__ringTrack{fill:transparent;stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.Knob__ringFillPivot{transform:rotateZ(135deg)}.Knob--bipolar .Knob__ringFillPivot{transform:rotateZ(270deg)}.Knob__ringFill{fill:transparent;stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms ease-out}.Knob--color--black .Knob__ringFill{stroke:#1a1a1a}.Knob--color--white .Knob__ringFill{stroke:#fff}.Knob--color--red .Knob__ringFill{stroke:#df3e3e}.Knob--color--orange .Knob__ringFill{stroke:#f37f33}.Knob--color--yellow .Knob__ringFill{stroke:#fbda21}.Knob--color--olive .Knob__ringFill{stroke:#cbe41c}.Knob--color--green .Knob__ringFill{stroke:#25ca4c}.Knob--color--teal .Knob__ringFill{stroke:#00d6cc}.Knob--color--blue .Knob__ringFill{stroke:#2e93de}.Knob--color--dark-blue .Knob__ringFill{stroke:#005fa7}.Knob--color--violet .Knob__ringFill{stroke:#7349cf}.Knob--color--purple .Knob__ringFill{stroke:#ad45d0}.Knob--color--pink .Knob__ringFill{stroke:#e34da1}.Knob--color--brown .Knob__ringFill{stroke:#b97447}.Knob--color--grey .Knob__ringFill{stroke:#848484}.Knob--color--light-grey .Knob__ringFill{stroke:#b3b3b3}.Knob--color--good .Knob__ringFill{stroke:#68c22d}.Knob--color--average .Knob__ringFill{stroke:#f29a29}.Knob--color--bad .Knob__ringFill{stroke:#df3e3e}.Knob--color--label .Knob__ringFill{stroke:#8b9bb0}.Knob--color--xeno .Knob__ringFill{stroke:#664573}.LabeledList{display:table;width:100%;width:calc(100% + 1em);border-collapse:collapse;border-spacing:0;margin:-0.25em -0.5em;margin-bottom:0;padding:0}.LabeledList__row{display:table-row}.LabeledList__row:last-child .LabeledList__cell{padding-bottom:0}.LabeledList__cell{display:table-cell;margin:0;padding:.25em .5em;border:0;text-align:left}.LabeledList__label--nowrap{width:1%;white-space:nowrap;min-width:5em}.LabeledList__buttons{width:.1%;white-space:nowrap;text-align:right;padding-top:.0833333333em;padding-bottom:0}.Modal{background-color:#202020;max-width:calc(100% - 1rem);padding:1rem}.NoticeBox{padding:.33em .5em;margin-bottom:.5em;box-shadow:none;font-weight:bold;font-style:italic;color:#000;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg, transparent, transparent 0.8333333333em, rgba(0, 0, 0, 0.1) 0.8333333333em, rgba(0, 0, 0, 0.1) 1.6666666667em)}.NoticeBox--color--black{color:#fff;background-color:#000}.NoticeBox--color--white{color:#000;background-color:#b3b3b3}.NoticeBox--color--red{color:#fff;background-color:#701f1f}.NoticeBox--color--orange{color:#fff;background-color:#854114}.NoticeBox--color--yellow{color:#000;background-color:#83710d}.NoticeBox--color--olive{color:#000;background-color:#576015}.NoticeBox--color--green{color:#fff;background-color:#174e24}.NoticeBox--color--teal{color:#fff;background-color:#064845}.NoticeBox--color--blue{color:#fff;background-color:#1b4565}.NoticeBox--color--dark-blue{color:#fff;background-color:#02121f}.NoticeBox--color--violet{color:#fff;background-color:#3b2864}.NoticeBox--color--purple{color:#fff;background-color:#542663}.NoticeBox--color--pink{color:#fff;background-color:#802257}.NoticeBox--color--brown{color:#fff;background-color:#4c3729}.NoticeBox--color--grey{color:#fff;background-color:#3e3e3e}.NoticeBox--color--light-grey{color:#fff;background-color:#6a6a6a}.NoticeBox--color--good{color:#fff;background-color:#2e4b1a}.NoticeBox--color--average{color:#fff;background-color:#7b4e13}.NoticeBox--color--bad{color:#fff;background-color:#701f1f}.NoticeBox--color--label{color:#fff;background-color:#53565a}.NoticeBox--color--xeno{color:#fff;background-color:#19161b}.NoticeBox--type--info{color:#fff;background-color:#235982}.NoticeBox--type--success{color:#fff;background-color:#1e662f}.NoticeBox--type--warning{color:#fff;background-color:#a95219}.NoticeBox--type--danger{color:#fff;background-color:#8f2828}.Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.Input--fluid{display:block;width:auto}.Input__baseline{display:inline-block;color:transparent}.Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input--monospace .Input__input{font-family:"Consolas",monospace}.NumberInput{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#88bfff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.NumberInput--fluid{display:block}.NumberInput__content{margin-left:.5em}.NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #88bfff;background-color:#88bfff}.NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#0a0a0a;color:#fff;text-align:right}.ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-width:.0833333333em !important;border-style:solid !important;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color 900ms ease-out}.ProgressBar__fill{position:absolute;top:-0.5px;left:0px;bottom:-0.5px}.ProgressBar__fill--animated{transition:background-color 900ms ease-out,width 900ms ease-out}.ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.ProgressBar--color--default{border:.0833333333em solid #3e6189}.ProgressBar--color--default .ProgressBar__fill{background-color:#3e6189}.ProgressBar--color--black{border-color:#000 !important}.ProgressBar--color--black .ProgressBar__fill{background-color:#000}.ProgressBar--color--white{border-color:#d9d9d9 !important}.ProgressBar--color--white .ProgressBar__fill{background-color:#d9d9d9}.ProgressBar--color--red{border-color:#bd2020 !important}.ProgressBar--color--red .ProgressBar__fill{background-color:#bd2020}.ProgressBar--color--orange{border-color:#d95e0c !important}.ProgressBar--color--orange .ProgressBar__fill{background-color:#d95e0c}.ProgressBar--color--yellow{border-color:#d9b804 !important}.ProgressBar--color--yellow .ProgressBar__fill{background-color:#d9b804}.ProgressBar--color--olive{border-color:#9aad14 !important}.ProgressBar--color--olive .ProgressBar__fill{background-color:#9aad14}.ProgressBar--color--green{border-color:#1b9638 !important}.ProgressBar--color--green .ProgressBar__fill{background-color:#1b9638}.ProgressBar--color--teal{border-color:#009a93 !important}.ProgressBar--color--teal .ProgressBar__fill{background-color:#009a93}.ProgressBar--color--blue{border-color:#1c71b1 !important}.ProgressBar--color--blue .ProgressBar__fill{background-color:#1c71b1}.ProgressBar--color--dark-blue{border-color:#003e6e !important}.ProgressBar--color--dark-blue .ProgressBar__fill{background-color:#003e6e}.ProgressBar--color--violet{border-color:#552dab !important}.ProgressBar--color--violet .ProgressBar__fill{background-color:#552dab}.ProgressBar--color--purple{border-color:#8b2baa !important}.ProgressBar--color--purple .ProgressBar__fill{background-color:#8b2baa}.ProgressBar--color--pink{border-color:#cf2082 !important}.ProgressBar--color--pink .ProgressBar__fill{background-color:#cf2082}.ProgressBar--color--brown{border-color:#8c5836 !important}.ProgressBar--color--brown .ProgressBar__fill{background-color:#8c5836}.ProgressBar--color--grey{border-color:#646464 !important}.ProgressBar--color--grey .ProgressBar__fill{background-color:#646464}.ProgressBar--color--light-grey{border-color:#919191 !important}.ProgressBar--color--light-grey .ProgressBar__fill{background-color:#919191}.ProgressBar--color--good{border-color:#4d9121 !important}.ProgressBar--color--good .ProgressBar__fill{background-color:#4d9121}.ProgressBar--color--average{border-color:#cd7a0d !important}.ProgressBar--color--average .ProgressBar__fill{background-color:#cd7a0d}.ProgressBar--color--bad{border-color:#bd2020 !important}.ProgressBar--color--bad .ProgressBar__fill{background-color:#bd2020}.ProgressBar--color--label{border-color:#657a94 !important}.ProgressBar--color--label .ProgressBar__fill{background-color:#657a94}.ProgressBar--color--xeno{border-color:#462f4e !important}.ProgressBar--color--xeno .ProgressBar__fill{background-color:#462f4e}.Section{position:relative;margin-bottom:.5em;background-color:#131313;background-color:#131313;box-sizing:border-box}.Section:last-child{margin-bottom:0}.Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #4972a1}.Section__titleText{font-size:1.1666666667em;font-weight:bold;color:#fff}.Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.Section__rest{position:relative}.Section__content{padding:.66em .5em}.Section--fitted>.Section__rest>.Section__content{padding:0}.Section--fill{display:flex;flex-direction:column;height:100%}.Section--fill>.Section__rest{flex-grow:1}.Section--fill>.Section__rest>.Section__content{height:100%}.Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.Section--fill.Section--iefix{display:table !important;width:100% !important;height:100% !important;border-collapse:collapse;border-spacing:0}.Section--fill.Section--iefix>.Section__rest{display:table-row !important;height:100% !important}.Section--scrollable{overflow-x:hidden;overflow-y:hidden}.Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:hidden;overflow-x:scroll}.Section--scrollable.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.Section--scrollable.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:scroll}.Section .Section{background-color:transparent;margin-left:-0.5em;margin-right:-0.5em}.Section .Section:first-child{margin-top:-0.5em}.Section .Section .Section__titleText{font-size:1.0833333333em}.Section .Section .Section .Section__titleText{font-size:1em}.Slider{cursor:e-resize}.Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none !important}.Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #fff}.Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid transparent;border-right:.4166666667em solid transparent;border-bottom:.4166666667em solid #fff}.Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translateX(50%);white-space:nowrap}.Divider--horizontal{margin:.5em 0}.Divider--horizontal:not(.Divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Divider--vertical{height:100%;margin:0 .5em}.Divider--vertical:not(.Divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Stack--fill{height:100%}.Stack--horizontal>.Stack__item{margin-left:.5em}.Stack--horizontal>.Stack__item:first-child{margin-left:0}.Stack--vertical>.Stack__item{margin-top:.5em}.Stack--vertical>.Stack__item:first-child{margin-top:0}.Stack--horizontal>.Stack__divider:not(.Stack__divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Stack--vertical>.Stack__divider:not(.Stack__divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Table{display:table;width:100%;border-collapse:collapse;border-spacing:0;margin:0}.Table--collapsing{width:auto}.Table__row{display:table-row}.Table__cell{display:table-cell;padding:0 .25em}.Table__cell:first-child{padding-left:0}.Table__cell:last-child{padding-right:0}.Table__row--header .Table__cell,.Table__cell--header{font-weight:bold;padding-bottom:.5em}.Table__cell--collapsing{width:1%;white-space:nowrap}.Tabs{display:flex;align-items:stretch;overflow:hidden;background-color:#131313}.Tabs--fill{height:100%}.Section .Tabs{background-color:transparent}.Section:not(.Section--fitted) .Tabs{margin:0 -0.5em .5em}.Section:not(.Section--fitted) .Tabs:first-child{margin-top:-0.5em}.Tabs--vertical{flex-direction:column;padding:.25em 0 .25em .25em}.Tabs--horizontal{margin-bottom:.5em;padding:.25em .25em 0 .25em}.Tabs--horizontal:last-child{margin-bottom:0}.Tabs__Tab{flex-grow:0}.Tabs--fluid .Tabs__Tab{flex-grow:1}.Tab{display:flex;align-items:center;justify-content:space-between;background-color:transparent;color:rgba(255,255,255,.5);min-height:2.25em;min-width:4em}.Tab:not(.Tab--selected):hover{background-color:rgba(255,255,255,.075)}.Tab--selected{background-color:rgba(255,255,255,.125);color:#dfe7f0}.Tab__text{flex-grow:1;margin:0 .5em}.Tab__left{min-width:1.5em;text-align:center;margin-left:.25em}.Tab__right{min-width:1.5em;text-align:center;margin-right:.25em}.Tabs--horizontal .Tab{border-top:.1666666667em solid transparent;border-bottom:.1666666667em solid transparent;border-top-left-radius:.25em;border-top-right-radius:.25em}.Tabs--horizontal .Tab--selected{border-bottom:.1666666667em solid #d4dfec}.Tabs--vertical .Tab{min-height:2em;border-left:.1666666667em solid transparent;border-right:.1666666667em solid transparent;border-top-left-radius:.25em;border-bottom-left-radius:.25em}.Tabs--vertical .Tab--selected{border-right:.1666666667em solid #d4dfec}.Tab--selected.Tab--color--black{color:#535353}.Tabs--horizontal .Tab--selected.Tab--color--black{border-bottom-color:#1a1a1a}.Tabs--vertical .Tab--selected.Tab--color--black{border-right-color:#1a1a1a}.Tab--selected.Tab--color--white{color:#fff}.Tabs--horizontal .Tab--selected.Tab--color--white{border-bottom-color:#fff}.Tabs--vertical .Tab--selected.Tab--color--white{border-right-color:#fff}.Tab--selected.Tab--color--red{color:#e76e6e}.Tabs--horizontal .Tab--selected.Tab--color--red{border-bottom-color:#df3e3e}.Tabs--vertical .Tab--selected.Tab--color--red{border-right-color:#df3e3e}.Tab--selected.Tab--color--orange{color:#f69f66}.Tabs--horizontal .Tab--selected.Tab--color--orange{border-bottom-color:#f37f33}.Tabs--vertical .Tab--selected.Tab--color--orange{border-right-color:#f37f33}.Tab--selected.Tab--color--yellow{color:#fce358}.Tabs--horizontal .Tab--selected.Tab--color--yellow{border-bottom-color:#fbda21}.Tabs--vertical .Tab--selected.Tab--color--yellow{border-right-color:#fbda21}.Tab--selected.Tab--color--olive{color:#d8eb55}.Tabs--horizontal .Tab--selected.Tab--color--olive{border-bottom-color:#cbe41c}.Tabs--vertical .Tab--selected.Tab--color--olive{border-right-color:#cbe41c}.Tab--selected.Tab--color--green{color:#53e074}.Tabs--horizontal .Tab--selected.Tab--color--green{border-bottom-color:#25ca4c}.Tabs--vertical .Tab--selected.Tab--color--green{border-right-color:#25ca4c}.Tab--selected.Tab--color--teal{color:#21fff5}.Tabs--horizontal .Tab--selected.Tab--color--teal{border-bottom-color:#00d6cc}.Tabs--vertical .Tab--selected.Tab--color--teal{border-right-color:#00d6cc}.Tab--selected.Tab--color--blue{color:#62aee6}.Tabs--horizontal .Tab--selected.Tab--color--blue{border-bottom-color:#2e93de}.Tabs--vertical .Tab--selected.Tab--color--blue{border-right-color:#2e93de}.Tab--selected.Tab--color--dark-blue{color:#008ffd}.Tabs--horizontal .Tab--selected.Tab--color--dark-blue{border-bottom-color:#005fa7}.Tabs--vertical .Tab--selected.Tab--color--dark-blue{border-right-color:#005fa7}.Tab--selected.Tab--color--violet{color:#9676db}.Tabs--horizontal .Tab--selected.Tab--color--violet{border-bottom-color:#7349cf}.Tabs--vertical .Tab--selected.Tab--color--violet{border-right-color:#7349cf}.Tab--selected.Tab--color--purple{color:#c274db}.Tabs--horizontal .Tab--selected.Tab--color--purple{border-bottom-color:#ad45d0}.Tabs--vertical .Tab--selected.Tab--color--purple{border-right-color:#ad45d0}.Tab--selected.Tab--color--pink{color:#ea79b9}.Tabs--horizontal .Tab--selected.Tab--color--pink{border-bottom-color:#e34da1}.Tabs--vertical .Tab--selected.Tab--color--pink{border-right-color:#e34da1}.Tab--selected.Tab--color--brown{color:#ca9775}.Tabs--horizontal .Tab--selected.Tab--color--brown{border-bottom-color:#b97447}.Tabs--vertical .Tab--selected.Tab--color--brown{border-right-color:#b97447}.Tab--selected.Tab--color--grey{color:#a3a3a3}.Tabs--horizontal .Tab--selected.Tab--color--grey{border-bottom-color:#848484}.Tabs--vertical .Tab--selected.Tab--color--grey{border-right-color:#848484}.Tab--selected.Tab--color--light-grey{color:#c6c6c6}.Tabs--horizontal .Tab--selected.Tab--color--light-grey{border-bottom-color:#b3b3b3}.Tabs--vertical .Tab--selected.Tab--color--light-grey{border-right-color:#b3b3b3}.Tab--selected.Tab--color--good{color:#8cd95a}.Tabs--horizontal .Tab--selected.Tab--color--good{border-bottom-color:#68c22d}.Tabs--vertical .Tab--selected.Tab--color--good{border-right-color:#68c22d}.Tab--selected.Tab--color--average{color:#f5b35e}.Tabs--horizontal .Tab--selected.Tab--color--average{border-bottom-color:#f29a29}.Tabs--vertical .Tab--selected.Tab--color--average{border-right-color:#f29a29}.Tab--selected.Tab--color--bad{color:#e76e6e}.Tabs--horizontal .Tab--selected.Tab--color--bad{border-bottom-color:#df3e3e}.Tabs--vertical .Tab--selected.Tab--color--bad{border-right-color:#df3e3e}.Tab--selected.Tab--color--label{color:#a8b4c4}.Tabs--horizontal .Tab--selected.Tab--color--label{border-bottom-color:#8b9bb0}.Tabs--vertical .Tab--selected.Tab--color--label{border-right-color:#8b9bb0}.Tab--selected.Tab--color--xeno{color:#9366a3}.Tabs--horizontal .Tab--selected.Tab--color--xeno{border-bottom-color:#664573}.Tabs--vertical .Tab--selected.Tab--color--xeno{border-right-color:#664573}.Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.Input--fluid{display:block;width:auto}.Input__baseline{display:inline-block;color:transparent}.Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input--monospace .Input__input{font-family:"Consolas",monospace}.TextArea{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;background-color:#0a0a0a;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.TextArea--fluid{display:block;width:auto;height:auto}.TextArea--noborder{border:0px}.TextArea__textarea.TextArea__textarea--scrollable{overflow:auto;overflow-x:hidden;overflow-y:scroll}.TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:transparent;color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.TextArea__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.TextArea__textarea_custom{overflow:visible;white-space:pre-wrap}.Tooltip{z-index:2;padding:.5em .75em;pointer-events:none;text-align:left;transition:opacity 150ms ease-out;background-color:#000;color:#fff;box-shadow:.1em .1em 1.25em -0.1em rgba(0,0,0,.5);border-radius:.16em;max-width:20.8333333333em}.Chat{color:#abc6ec}.Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:crimson;border-radius:10px;transition:font-size 200ms ease-out}.Chat__badge:before{content:"x"}.Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.Chat__scrollButton{position:fixed;right:2em;bottom:1em}.Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#db2828;background-color:#131313}.Chat__reconnected:after{content:"";display:block;margin-top:-0.75em;border-bottom:.1666666667em solid #db2828}.Chat__highlight{color:#000}.Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:bold}.ChatMessage{word-wrap:break-word}.ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.Ping{position:relative;padding:.125em .25em;border:.0833333333em solid rgba(140,140,140,.5);border-radius:.25em;width:3.75em;text-align:right}.Ping__indicator{content:"";position:absolute;top:.5em;left:.5em;width:.5em;height:.5em;background-color:#888;border-radius:.25em}.Notifications{position:absolute;bottom:1em;left:1em;right:2em}.Notification{color:#fff;background-color:crimson;padding:.5em;margin:1em 0}.Notification:first-child{margin-top:0}.Notification:last-child{margin-bottom:0}.Layout,.Layout *{scrollbar-base-color:#181818;scrollbar-face-color:#363636;scrollbar-3dlight-color:#202020;scrollbar-highlight-color:#202020;scrollbar-track-color:#181818;scrollbar-arrow-color:#909090;scrollbar-shadow-color:#363636}.Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#202020;background-image:linear-gradient(to bottom, #202020 0%, #202020 100%)}.Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.Window__contentPadding:after{height:0}.Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(56,56,56,.25);pointer-events:none}.Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}em{font-style:normal;font-weight:bold}img{margin:0;padding:0;line-height:1;-ms-interpolation-mode:nearest-neighbor;image-rendering:pixelated}img.icon{height:1em;min-height:16px;width:auto;vertical-align:bottom}a{color:#397ea5}a.visited{color:#7c00e6}a:visited{color:#7c00e6}a.popt{text-decoration:none}.popup{position:fixed;top:50%;left:50%;background:#ddd}.popup .close{position:absolute;background:#aaa;top:0;right:0;color:#333;text-decoration:none;z-index:2;padding:0 10px;height:30px;line-height:30px}.popup .close:hover{background:#999}.popup .head{background:#999;color:#ddd;padding:0 10px;height:30px;line-height:30px;text-transform:uppercase;font-size:.9em;font-weight:bold;border-bottom:2px solid green}.popup input{border:1px solid #999;background:#fff;margin:0;padding:5px;outline:none;color:#333}.popup input[type=text]:hover,.popup input[type=text]:active,.popup input[type=text]:focus{border-color:green}.popup input[type=submit]{padding:5px 10px;background:#999;color:#ddd;text-transform:uppercase;font-size:.9em;font-weight:bold}.popup input[type=submit]:hover,.popup input[type=submit]:focus,.popup input[type=submit]:active{background:#aaa;cursor:pointer}.changeFont{padding:10px}.changeFont a{display:block;text-decoration:none;padding:3px;color:#333}.changeFont a:hover{background:#ccc}.highlightPopup{padding:10px;text-align:center}.highlightPopup input[type=text]{display:block;width:215px;text-align:left;margin-top:5px}.highlightPopup input.highlightColor{background-color:#ff0}.highlightPopup input.highlightTermSubmit{margin-top:5px}.contextMenu{background-color:#ddd;position:fixed;margin:2px;width:150px}.contextMenu a{display:block;padding:2px 5px;text-decoration:none;color:#333}.contextMenu a:hover{background-color:#ccc}.filterMessages{padding:5px}.filterMessages div{padding:2px 0}.icon-stack{height:1em;line-height:1em;width:1em;vertical-align:middle;margin-top:-2px}.motd{color:#a4bad6;font-family:Verdana,sans-serif;white-space:normal}.motd h1,.motd h2,.motd h3,.motd h4,.motd h5,.motd h6{color:#a4bad6;text-decoration:underline}.motd a,.motd a:link,.motd a:visited,.motd a:active,.motd a:hover{color:#a4bad6}.bold,.name,.prefix,.ooc,.looc,.adminooc,.admin,.medal,.yell{font-weight:bold}.italic,.italics{font-style:italic}.highlight{background:#ff0}h1,h2,h3,h4,h5,h6{color:#a4bad6;font-family:Georgia,Verdana,sans-serif}h1.alert,h2.alert{color:#a4bad6}em{font-style:normal;font-weight:bold}.ooc{font-weight:bold}.adminobserverooc{color:#09c;font-weight:bold}.adminooc{color:#3d5bc3;font-weight:bold}.adminsay{color:#9611d4;font-weight:bold}.admin{color:#5975da;font-weight:bold}.name{font-weight:bold}.deadsay{color:#e2c1ff}.binarysay{color:#1e90ff}.binarysay a{color:lime}.binarysay a:active,.binarysay a:visited{color:#8f8}.radio{color:#1ecc43}.sciradio{color:#c68cfa}.comradio{color:#fcdf03}.secradio{color:#dd3535}.medradio{color:#57b8f0}.engradio{color:#f37746}.suppradio{color:#b88646}.servradio{color:#6ca729}.syndradio{color:#8f4a4b}.gangradio{color:#ac2ea1}.centcomradio{color:#2681a5}.aiprivradio{color:#d65d95}.redteamradio{color:#f44}.blueteamradio{color:#3434fd}.greenteamradio{color:#34fd34}.yellowteamradio{color:#fdfd34}.yell{font-weight:bold}.alert{color:#d82020}.userdanger{color:#c51e1e;font-weight:bold;font-size:185%}.bolddanger{color:#c51e1e;font-weight:bold}.danger{color:#c51e1e}.warning{color:#c51e1e;font-style:italic}.alertwarning{color:red;font-weight:bold}.boldwarning{color:#c51e1e;font-style:italic;font-weight:bold}.announce{color:#c51e1e;font-weight:bold}.boldannounce{color:#c51e1e;font-weight:bold}.minorannounce{font-weight:bold;font-size:185%}.greenannounce{color:#059223;font-weight:bold}.rose{color:#ff5050}.info{color:#9ab0ff}.notice{color:#6685f5}.staff_ic{color:#6685f5}.tinynotice{color:#6685f5;font-size:85%}.tinynoticeital{color:#6685f5;font-style:italic;font-size:85%}.smallnotice{color:#6685f5;font-size:90%}.smallnoticeital{color:#6685f5;font-style:italic;font-size:90%}.boldnotice{color:#6685f5;font-weight:bold}.hear{color:#6685f5;font-style:italic}.adminnotice{color:#6685f5}.adminhelp{color:red;font-weight:bold}.unconscious{color:#a4bad6;font-weight:bold}.suicide{color:#ff5050;font-style:italic}.green{color:#059223}.grey{color:#838383}.red{color:red}.blue{color:#215cff}.nicegreen{color:#059223}.boldnicegreen{color:#059223;font-weight:bold}.cult{color:#973e3b}.cultitalic{color:#973e3b;font-style:italic}.cultbold{color:#973e3b;font-style:italic;font-weight:bold}.cultboldtalic{color:#973e3b;font-weight:bold;font-size:185%}.cultlarge{color:#973e3b;font-weight:bold;font-size:185%}.narsie{color:#973e3b;font-weight:bold;font-size:925%}.narsiesmall{color:#973e3b;font-weight:bold;font-size:370%}.colossus{color:#7f282a;font-size:310%}.hierophant{color:#b441ee;font-weight:bold;font-style:italic}.hierophant_warning{color:#c56bf1;font-style:italic}.purple{color:#9956d3}.holoparasite{color:#88809c}.revennotice{color:#c099e2}.revenboldnotice{color:#c099e2;font-weight:bold}.revenbignotice{color:#c099e2;font-weight:bold;font-size:185%}.revenminor{color:#823abb}.revenwarning{color:#760fbb;font-style:italic}.revendanger{color:#760fbb;font-weight:bold;font-size:185%}.deconversion_message{color:#a947ff;font-size:185%;font-style:italic}.ghostalert{color:#60f;font-style:italic;font-weight:bold}.alien{color:#855d85}.noticealien{color:#059223}.alertalien{color:#059223;font-weight:bold}.changeling{color:#059223;font-style:italic}.alertsyndie{color:red;font-size:185%;font-weight:bold}.spider{color:#80f;font-weight:bold;font-size:185%}.interface{color:#750e75}.sans{font-family:"Comic Sans MS",cursive,sans-serif}.papyrus{font-family:"Papyrus",cursive,sans-serif}.robot{font-family:"Courier New",cursive,sans-serif}.tape_recorder{color:red;font-family:"Courier New",cursive,sans-serif}.command_headset{font-weight:bold;font-size:160%}.small{font-size:60%}.big{font-size:185%}.reallybig{font-size:245%}.extremelybig{font-size:310%}.greentext{color:#059223;font-size:185%}.redtext{color:#c51e1e;font-size:185%}.clown{color:#ff70c1;font-size:160%;font-family:"Comic Sans MS",cursive,sans-serif;font-weight:bold}.singing{font-family:"Trebuchet MS",cursive,sans-serif;font-style:italic}.his_grace{color:#15d512;font-family:"Courier New",cursive,sans-serif;font-style:italic}.hypnophrase{color:#202020;font-weight:bold;animation:hypnocolor 1500ms infinite;animation-direction:alternate}@keyframes hypnocolor{0%{color:#202020}25%{color:#4b02ac}50%{color:#9f41f1}75%{color:#541c9c}100%{color:#7adbf3}}.phobia{color:#d00;font-weight:bold;animation:phobia 750ms infinite}@keyframes phobia{0%{color:#f75a5a}50%{color:#d00}100%{color:#f75a5a}}.icon{height:1em;width:auto}.bigicon{font-size:2.5em}.memo{color:#638500;text-align:center}.memoedit{text-align:center;font-size:125%}.abductor{color:#c204c2;font-style:italic}.mind_control{color:#df3da9;font-size:100%;font-weight:bold;font-style:italic}.slime{color:#00ced1}.drone{color:#848482}.monkey{color:#975032}.swarmer{color:#2c75ff}.resonate{color:#298f85}.monkeyhive{color:#a56408}.monkeylead{color:#af6805;font-size:80%}.connectionClosed,.fatalError{background:red;color:#fff;padding:5px}.connectionClosed.restored{background:green}.internal.boldnshit{color:#3d5bc3;font-weight:bold}.text-normal{font-weight:normal;font-style:normal}.hidden{display:none;visibility:hidden}.ml-1{margin-left:1em}.ml-2{margin-left:2em}.ml-3{margin-left:3em}.xooc{color:#ac04e9;font-weight:bold;font-size:140%}.mooc{color:#090;font-weight:bold;font-size:140%}.yooc{color:#999600;font-weight:bold;font-size:140%}.headminsay{color:#653d78;font-weight:bold}.radio{color:#b4b4b4}.deptradio{color:#939}.comradio{color:#779cc2}.centradio{color:#5c5c8a}.hcradio{color:#318779}.pvstradio{color:#9b0612}.cryoradio{color:#ad6d48}.airadio{color:#f0f}.secradio{color:#a52929}.engradio{color:#a66300}.sentryradio{color:#844300}.sentryradio{color:#844300}.medradio{color:#008160}.supradio{color:#ba8e41}.jtacradio{color:#ad3b98}.intelradio{color:#027d02}.wyradio{color:#fe9b24}.pmcradio{color:#4dc5ce}.vairadio{color:#e3580e}.rmcradio{color:#e3580e}.cmbradio{color:#1b748c}.clfradio{color:#8e83ca}.alpharadio{color:#db2626}.bravoradio{color:#c68610}.charlieradio{color:#a5a}.deltaradio{color:#007fcf}.echoradio{color:#3eb489}.medium{font-size:110%}.big{font-size:115%}.large{font-size:125%}.extra_large{font-size:130%}.huge{font-size:150%}.underline{text-decoration:underline}.orange{color:#eca100}.normal{font-style:normal}.attack{color:#ff3838}.moderate{color:#c00}.disarm{color:#900}.passive{color:#600}.helpful{color:#368f31}.scanner{color:#ff3838}.scannerb{color:#ff3838;font-weight:bold}.scannerburn{color:orange}.scannerburnb{color:orange;font-weight:bold}.rose{color:#ff5050}.debuginfo{color:#493d26;font-style:italic}.xenonotice{color:#51a16c}.xenoboldnotice{color:#51a16c;font-style:italic}.xenowarning{color:#51a16c;font-style:italic}.xenominorwarning{color:#51a16c;font-weight:bold;font-style:italic}.xenodanger{color:#51a16c;font-weight:bold}.avoidharm{color:#72a0e5;font-weight:bold}.highdanger{color:#ff3838;font-weight:bold;font-size:140%}.xenohighdanger{color:#51a16c;font-weight:bold;font-size:140%}.xenoannounce{color:#65c585;font-family:book-antiqua;font-weight:bold;font-size:140%}.yautjabold{color:purple;font-weight:bold}.yautjaboldbig{color:purple;font-weight:bold;font-size:120%}.objectivebig{font-weight:bold;font-size:130%}.objectivegreen{color:lime}.objectivered{color:red}.objectivesuccess{color:lime;font-weight:bold;font-size:110%}.objectivefail{color:red;font-weight:bold;font-size:110%}.xenotalk,.xeno{color:#c048c0;font-style:italic}.xenoleader{color:#996e99;font-style:italic;font-size:125%}.xenoqueen{color:#996e99;font-style:italic;font-weight:bold;font-size:125%}.newscaster{color:maroon}.role_header{color:#e92d2d;display:block;text-align:center;font-weight:bold;font-family:trebuchet-ms;font-size:150%}.role_body{color:#3a3ae9;display:block;text-align:center;font-size:125%}.round_header{color:#e92d2d;display:block;text-align:center;font-family:courier;font-weight:bold;font-size:180%}.round_body{color:#c5c5c5;display:block;text-align:center;font-family:trebuchet-ms;font-weight:bold;font-size:125%}.event_announcement{color:#600d48;font-family:arial-narrow;font-weight:bold;font-size:125%}.announce_header{color:#cecece;font-weight:bold;font-size:150%}.announce_header_blue{color:#7575f3;font-weight:bold;font-size:150%}.announce_header_admin{color:#7575f3;font-weight:bold;font-size:150%}.announce_body{color:#e92d2d;font-weight:normal;font-size:125%}.centerbold{display:block;text-align:center;font-weight:bold}.mod{color:#917455;font-weight:bold}.modooc{color:#184880;font-weight:bold}.adminmod{color:#7c440c;font-weight:bold}.mentorsay{color:#d4af57;font-weight:bold}.mentorhelp{color:#090;font-weight:bold}.mentorbody{color:#da6200;font-weight:bold}.mentorstaff{color:#b5850d;font-weight:bold}.staffsay{color:#b5850d;font-weight:bold}.tajaran{color:#803b56}.tajaran_signlang{color:#941c1c}.skrell{color:#00ced1}.soghun{color:#228b22}.changeling{color:purple}.vox{color:#a0a}.monkey{color:#966c47}.german{color:#858f1e;font-family:"Times New Roman",Times,serif}.spanish{color:#cf982b}.japanese{color:#940927}.chinese{color:#fe1919}.zombie{color:#2dacb1;font-style:italic}.rough{font-family:trebuchet-ms,cursive,sans-serif}.commando{color:#fe9b24;font-style:bold}.say_quote{font-family:Georgia,Verdana,sans-serif}.admin .message{color:#314cad}.admin .prefix{font-weight:bolder}.pm{font-size:110%}.deadsay{color:#8b4dff}.retro_translator{font-weight:bold}.yautja_translator{color:#a00;font-weight:bold;animation:glitch .5s infinite}@keyframes glitch{25%{color:#a00;transform:translate(-2px, -1px)}50%{color:#be0000;transform:translate(1px, -2px)}75%{color:#8d0000;transform:translate(-1px, 2px)}100%{color:#830000;transform:translate(1px, 1px)}}.examine_block{background:#1b1c1e;border:1px solid #a4bad6;margin:.5em;padding:.5em .75em}.examine_block .icon{width:1.5em;height:1.5em;margin:0;padding:0}.tooltip{font-style:italic;border-bottom:1px dashed #fff} -.theme-light .color-black{color:#000 !important}.theme-light .color-white{color:#e6e6e6 !important}.theme-light .color-red{color:#c82121 !important}.theme-light .color-orange{color:#e6630d !important}.theme-light .color-yellow{color:#e5c304 !important}.theme-light .color-olive{color:#a3b816 !important}.theme-light .color-green{color:#1d9f3b !important}.theme-light .color-teal{color:#00a39c !important}.theme-light .color-blue{color:#1e78bb !important}.theme-light .color-dark-blue{color:#004274 !important}.theme-light .color-violet{color:#5a30b5 !important}.theme-light .color-purple{color:#932eb4 !important}.theme-light .color-pink{color:#db228a !important}.theme-light .color-brown{color:#955d39 !important}.theme-light .color-grey{color:#e6e6e6 !important}.theme-light .color-light-grey{color:#999 !important}.theme-light .color-good{color:#529923 !important}.theme-light .color-average{color:#da810e !important}.theme-light .color-bad{color:#c82121 !important}.theme-light .color-label{color:#353535 !important}.theme-light .color-xeno{color:#4a3253 !important}.theme-light .color-bg-black{background-color:#000 !important}.theme-light .color-bg-white{background-color:#bfbfbf !important}.theme-light .color-bg-red{background-color:#a61c1c !important}.theme-light .color-bg-orange{background-color:#c0530b !important}.theme-light .color-bg-yellow{background-color:#bfa303 !important}.theme-light .color-bg-olive{background-color:#889912 !important}.theme-light .color-bg-green{background-color:#188532 !important}.theme-light .color-bg-teal{background-color:#008882 !important}.theme-light .color-bg-blue{background-color:#19649c !important}.theme-light .color-bg-dark-blue{background-color:#003761 !important}.theme-light .color-bg-violet{background-color:#4b2897 !important}.theme-light .color-bg-purple{background-color:#7a2696 !important}.theme-light .color-bg-pink{background-color:#b61d73 !important}.theme-light .color-bg-brown{background-color:#7c4d2f !important}.theme-light .color-bg-grey{background-color:#bfbfbf !important}.theme-light .color-bg-light-grey{background-color:gray !important}.theme-light .color-bg-good{background-color:#44801d !important}.theme-light .color-bg-average{background-color:#b56b0b !important}.theme-light .color-bg-bad{background-color:#a61c1c !important}.theme-light .color-bg-label{background-color:#2c2c2c !important}.theme-light .color-bg-xeno{background-color:#3e2945 !important}.theme-light .Tabs{display:flex;align-items:stretch;overflow:hidden;background-color:#fff}.theme-light .Tabs--fill{height:100%}.theme-light .Section .Tabs{background-color:transparent}.theme-light .Section:not(.Section--fitted) .Tabs{margin:0 -0.5em .5em}.theme-light .Section:not(.Section--fitted) .Tabs:first-child{margin-top:-0.5em}.theme-light .Tabs--vertical{flex-direction:column;padding:.25em 0 .25em .25em}.theme-light .Tabs--horizontal{margin-bottom:.5em;padding:.25em .25em 0 .25em}.theme-light .Tabs--horizontal:last-child{margin-bottom:0}.theme-light .Tabs__Tab{flex-grow:0}.theme-light .Tabs--fluid .Tabs__Tab{flex-grow:1}.theme-light .Tab{display:flex;align-items:center;justify-content:space-between;background-color:transparent;color:rgba(0,0,0,.5);min-height:2.25em;min-width:4em}.theme-light .Tab:not(.Tab--selected):hover{background-color:rgba(255,255,255,.075)}.theme-light .Tab--selected{background-color:rgba(255,255,255,.125);color:#404040}.theme-light .Tab__text{flex-grow:1;margin:0 .5em}.theme-light .Tab__left{min-width:1.5em;text-align:center;margin-left:.25em}.theme-light .Tab__right{min-width:1.5em;text-align:center;margin-right:.25em}.theme-light .Tabs--horizontal .Tab{border-top:.1666666667em solid transparent;border-bottom:.1666666667em solid transparent;border-top-left-radius:.25em;border-top-right-radius:.25em}.theme-light .Tabs--horizontal .Tab--selected{border-bottom:.1666666667em solid #000}.theme-light .Tabs--vertical .Tab{min-height:2em;border-left:.1666666667em solid transparent;border-right:.1666666667em solid transparent;border-top-left-radius:.25em;border-bottom-left-radius:.25em}.theme-light .Tabs--vertical .Tab--selected{border-right:.1666666667em solid #000}.theme-light .Tab--selected.Tab--color--black{color:#404040}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--black{border-bottom-color:#000}.theme-light .Tabs--vertical .Tab--selected.Tab--color--black{border-right-color:#000}.theme-light .Tab--selected.Tab--color--white{color:#ececec}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--white{border-bottom-color:#e6e6e6}.theme-light .Tabs--vertical .Tab--selected.Tab--color--white{border-right-color:#e6e6e6}.theme-light .Tab--selected.Tab--color--red{color:#e14d4d}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--red{border-bottom-color:#c82121}.theme-light .Tabs--vertical .Tab--selected.Tab--color--red{border-right-color:#c82121}.theme-light .Tab--selected.Tab--color--orange{color:#f48942}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--orange{border-bottom-color:#e6630d}.theme-light .Tabs--vertical .Tab--selected.Tab--color--orange{border-right-color:#e6630d}.theme-light .Tab--selected.Tab--color--yellow{color:#fcdd33}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--yellow{border-bottom-color:#e5c304}.theme-light .Tabs--vertical .Tab--selected.Tab--color--yellow{border-right-color:#e5c304}.theme-light .Tab--selected.Tab--color--olive{color:#d0e732}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--olive{border-bottom-color:#a3b816}.theme-light .Tabs--vertical .Tab--selected.Tab--color--olive{border-right-color:#a3b816}.theme-light .Tab--selected.Tab--color--green{color:#33da5a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--green{border-bottom-color:#1d9f3b}.theme-light .Tabs--vertical .Tab--selected.Tab--color--green{border-right-color:#1d9f3b}.theme-light .Tab--selected.Tab--color--teal{color:#00faef}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--teal{border-bottom-color:#00a39c}.theme-light .Tabs--vertical .Tab--selected.Tab--color--teal{border-right-color:#00a39c}.theme-light .Tab--selected.Tab--color--blue{color:#419ce1}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--blue{border-bottom-color:#1e78bb}.theme-light .Tabs--vertical .Tab--selected.Tab--color--blue{border-right-color:#1e78bb}.theme-light .Tab--selected.Tab--color--dark-blue{color:#0079d7}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--dark-blue{border-bottom-color:#004274}.theme-light .Tabs--vertical .Tab--selected.Tab--color--dark-blue{border-right-color:#004274}.theme-light .Tab--selected.Tab--color--violet{color:#7f58d3}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--violet{border-bottom-color:#5a30b5}.theme-light .Tabs--vertical .Tab--selected.Tab--color--violet{border-right-color:#5a30b5}.theme-light .Tab--selected.Tab--color--purple{color:#b455d4}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--purple{border-bottom-color:#932eb4}.theme-light .Tabs--vertical .Tab--selected.Tab--color--purple{border-right-color:#932eb4}.theme-light .Tab--selected.Tab--color--pink{color:#e558a7}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--pink{border-bottom-color:#db228a}.theme-light .Tabs--vertical .Tab--selected.Tab--color--pink{border-right-color:#db228a}.theme-light .Tab--selected.Tab--color--brown{color:#c0825a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--brown{border-bottom-color:#955d39}.theme-light .Tabs--vertical .Tab--selected.Tab--color--brown{border-right-color:#955d39}.theme-light .Tab--selected.Tab--color--grey{color:#ececec}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--grey{border-bottom-color:#e6e6e6}.theme-light .Tabs--vertical .Tab--selected.Tab--color--grey{border-right-color:#e6e6e6}.theme-light .Tab--selected.Tab--color--light-grey{color:#b3b3b3}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--light-grey{border-bottom-color:#999}.theme-light .Tabs--vertical .Tab--selected.Tab--color--light-grey{border-right-color:#999}.theme-light .Tab--selected.Tab--color--good{color:#77d23b}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--good{border-bottom-color:#529923}.theme-light .Tabs--vertical .Tab--selected.Tab--color--good{border-right-color:#529923}.theme-light .Tab--selected.Tab--color--average{color:#f3a23a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--average{border-bottom-color:#da810e}.theme-light .Tabs--vertical .Tab--selected.Tab--color--average{border-right-color:#da810e}.theme-light .Tab--selected.Tab--color--bad{color:#e14d4d}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--bad{border-bottom-color:#c82121}.theme-light .Tabs--vertical .Tab--selected.Tab--color--bad{border-right-color:#c82121}.theme-light .Tab--selected.Tab--color--label{color:#686868}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--label{border-bottom-color:#353535}.theme-light .Tabs--vertical .Tab--selected.Tab--color--label{border-right-color:#353535}.theme-light .Tab--selected.Tab--color--xeno{color:#7e558e}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--xeno{border-bottom-color:#4a3253}.theme-light .Tabs--vertical .Tab--selected.Tab--color--xeno{border-right-color:#4a3253}.theme-light .Section{position:relative;margin-bottom:.5em;background-color:#fff;background-color:#fff;box-sizing:border-box}.theme-light .Section:last-child{margin-bottom:0}.theme-light .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #fff}.theme-light .Section__titleText{font-size:1.1666666667em;font-weight:bold;color:#000}.theme-light .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-light .Section__rest{position:relative}.theme-light .Section__content{padding:.66em .5em}.theme-light .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-light .Section--fill{display:flex;flex-direction:column;height:100%}.theme-light .Section--fill>.Section__rest{flex-grow:1}.theme-light .Section--fill>.Section__rest>.Section__content{height:100%}.theme-light .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-light .Section--fill.Section--iefix{display:table !important;width:100% !important;height:100% !important;border-collapse:collapse;border-spacing:0}.theme-light .Section--fill.Section--iefix>.Section__rest{display:table-row !important;height:100% !important}.theme-light .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-light .Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.theme-light .Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.theme-light .Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:hidden;overflow-x:scroll}.theme-light .Section--scrollable.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.theme-light .Section--scrollable.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:scroll}.theme-light .Section .Section{background-color:transparent;margin-left:-0.5em;margin-right:-0.5em}.theme-light .Section .Section:first-child{margin-top:-0.5em}.theme-light .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-light .Section .Section .Section .Section__titleText{font-size:1em}.theme-light .Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.theme-light .Button:last-child{margin-right:0;margin-bottom:0}.theme-light .Button .fa,.theme-light .Button .fas,.theme-light .Button .far{margin-left:-0.25em;margin-right:-0.25em;min-width:1.333em;text-align:center}.theme-light .Button--hasContent .fa,.theme-light .Button--hasContent .fas,.theme-light .Button--hasContent .far{margin-right:.25em}.theme-light .Button--hasContent.Button--iconPosition--right .fa,.theme-light .Button--hasContent.Button--iconPosition--right .fas,.theme-light .Button--hasContent.Button--iconPosition--right .far{margin-right:0px;margin-left:3px}.theme-light .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-light .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-light .Button--circular{border-radius:50%}.theme-light .Button--compact{padding:0 .25em;line-height:1.333em}.theme-light .Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.theme-light .Button--color--black:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--black:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--black:hover,.theme-light .Button--color--black:focus{background-color:#131313;color:#fff}.theme-light .Button--color--white{transition:color 50ms,background-color 50ms;background-color:#bfbfbf;color:#000}.theme-light .Button--color--white:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--white:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--white:hover,.theme-light .Button--color--white:focus{background-color:#efefef;color:#000}.theme-light .Button--color--red{transition:color 50ms,background-color 50ms;background-color:#a61c1c;color:#fff}.theme-light .Button--color--red:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--red:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--red:hover,.theme-light .Button--color--red:focus{background-color:#d23333;color:#fff}.theme-light .Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#c0530b;color:#fff}.theme-light .Button--color--orange:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--orange:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--orange:hover,.theme-light .Button--color--orange:focus{background-color:#ea7426;color:#fff}.theme-light .Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#bfa303;color:#fff}.theme-light .Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--yellow:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--yellow:hover,.theme-light .Button--color--yellow:focus{background-color:#efce17;color:#fff}.theme-light .Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#889912;color:#fff}.theme-light .Button--color--olive:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--olive:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--olive:hover,.theme-light .Button--color--olive:focus{background-color:#afc328;color:#fff}.theme-light .Button--color--green{transition:color 50ms,background-color 50ms;background-color:#188532;color:#fff}.theme-light .Button--color--green:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--green:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--green:hover,.theme-light .Button--color--green:focus{background-color:#2fac4c;color:#fff}.theme-light .Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#008882;color:#fff}.theme-light .Button--color--teal:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--teal:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--teal:hover,.theme-light .Button--color--teal:focus{background-color:#13afa9;color:#fff}.theme-light .Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#19649c;color:#fff}.theme-light .Button--color--blue:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--blue:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--blue:hover,.theme-light .Button--color--blue:focus{background-color:#3086c7;color:#fff}.theme-light .Button--color--dark-blue{transition:color 50ms,background-color 50ms;background-color:#003761;color:#fff}.theme-light .Button--color--dark-blue:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--dark-blue:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--dark-blue:hover,.theme-light .Button--color--dark-blue:focus{background-color:#135283;color:#fff}.theme-light .Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#4b2897;color:#fff}.theme-light .Button--color--violet:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--violet:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--violet:hover,.theme-light .Button--color--violet:focus{background-color:#6a41c1;color:#fff}.theme-light .Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#7a2696;color:#fff}.theme-light .Button--color--purple:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--purple:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--purple:hover,.theme-light .Button--color--purple:focus{background-color:#a03fc0;color:#fff}.theme-light .Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#b61d73;color:#fff}.theme-light .Button--color--pink:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--pink:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--pink:hover,.theme-light .Button--color--pink:focus{background-color:#da3f96;color:#fff}.theme-light .Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#7c4d2f;color:#fff}.theme-light .Button--color--brown:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--brown:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--brown:hover,.theme-light .Button--color--brown:focus{background-color:#a26c49;color:#fff}.theme-light .Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#bfbfbf;color:#000}.theme-light .Button--color--grey:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--grey:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--grey:hover,.theme-light .Button--color--grey:focus{background-color:#efefef;color:#000}.theme-light .Button--color--light-grey{transition:color 50ms,background-color 50ms;background-color:gray;color:#fff}.theme-light .Button--color--light-grey:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--light-grey:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--light-grey:hover,.theme-light .Button--color--light-grey:focus{background-color:#a6a6a6;color:#fff}.theme-light .Button--color--good{transition:color 50ms,background-color 50ms;background-color:#44801d;color:#fff}.theme-light .Button--color--good:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--good:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--good:hover,.theme-light .Button--color--good:focus{background-color:#62a635;color:#fff}.theme-light .Button--color--average{transition:color 50ms,background-color 50ms;background-color:#b56b0b;color:#fff}.theme-light .Button--color--average:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--average:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--average:hover,.theme-light .Button--color--average:focus{background-color:#e48f20;color:#fff}.theme-light .Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#a61c1c;color:#fff}.theme-light .Button--color--bad:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--bad:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--bad:hover,.theme-light .Button--color--bad:focus{background-color:#d23333;color:#fff}.theme-light .Button--color--label{transition:color 50ms,background-color 50ms;background-color:#2c2c2c;color:#fff}.theme-light .Button--color--label:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--label:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--label:hover,.theme-light .Button--color--label:focus{background-color:#464646;color:#fff}.theme-light .Button--color--xeno{transition:color 50ms,background-color 50ms;background-color:#3e2945;color:#fff}.theme-light .Button--color--xeno:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--xeno:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--xeno:hover,.theme-light .Button--color--xeno:focus{background-color:#5a4363;color:#fff}.theme-light .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#bbb;color:#000}.theme-light .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--default:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--default:hover,.theme-light .Button--color--default:focus{background-color:#eaeaea;color:#000}.theme-light .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#be6209;color:#fff}.theme-light .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--caution:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--caution:hover,.theme-light .Button--color--caution:focus{background-color:#ec8420;color:#fff}.theme-light .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#9a9d00;color:#fff}.theme-light .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--danger:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--danger:hover,.theme-light .Button--color--danger:focus{background-color:#c4c813;color:#fff}.theme-light .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#eee;color:#000;background-color:rgba(238,238,238,0);color:rgba(0,0,0,.5)}.theme-light .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--transparent:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--transparent:hover,.theme-light .Button--color--transparent:focus{background-color:#fcfcfc;color:#000}.theme-light .Button--disabled{background-color:#363636 !important}.theme-light .Button--selected{transition:color 50ms,background-color 50ms;background-color:#0668b8;color:#fff}.theme-light .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--selected:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--selected:hover,.theme-light .Button--selected:focus{background-color:#1a8be7;color:#fff}.theme-light .Button--flex{display:inline-flex;flex-direction:column}.theme-light .Button--flex--fluid{width:100%}.theme-light .Button--verticalAlignContent--top{justify-content:flex-start}.theme-light .Button--verticalAlignContent--middle{justify-content:center}.theme-light .Button--verticalAlignContent--bottom{justify-content:flex-end}.theme-light .Button__content{display:block;align-self:stretch}.theme-light .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#000;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-light .Input--fluid{display:block;width:auto}.theme-light .Input__baseline{display:inline-block;color:transparent}.theme-light .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#000;color:inherit}.theme-light .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .Input--monospace .Input__input{font-family:"Consolas",monospace}.theme-light .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#000;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-light .Input--fluid{display:block;width:auto}.theme-light .Input__baseline{display:inline-block;color:transparent}.theme-light .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#000;color:inherit}.theme-light .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .Input--monospace .Input__input{font-family:"Consolas",monospace}.theme-light .NumberInput{position:relative;display:inline-block;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#353535;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.theme-light .NumberInput--fluid{display:block}.theme-light .NumberInput__content{margin-left:.5em}.theme-light .NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.theme-light .NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #353535;background-color:#353535}.theme-light .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#fff;color:#000;text-align:right}.theme-light .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#000;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-light .Input--fluid{display:block;width:auto}.theme-light .Input__baseline{display:inline-block;color:transparent}.theme-light .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#000;color:inherit}.theme-light .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .Input--monospace .Input__input{font-family:"Consolas",monospace}.theme-light .TextArea{position:relative;display:inline-block;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;background-color:#fff;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.theme-light .TextArea--fluid{display:block;width:auto;height:auto}.theme-light .TextArea--noborder{border:0px}.theme-light .TextArea__textarea.TextArea__textarea--scrollable{overflow:auto;overflow-x:hidden;overflow-y:scroll}.theme-light .TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:transparent;color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.theme-light .TextArea__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .TextArea__textarea_custom{overflow:visible;white-space:pre-wrap}.theme-light .Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto;margin-bottom:-0.2em;cursor:n-resize}.theme-light .Knob:after{content:".";color:transparent;line-height:2.5em}.theme-light .Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0) 100%);border-radius:50%;box-shadow:0 .05em .5em 0 rgba(0,0,0,.5)}.theme-light .Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.theme-light .Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.theme-light .Knob__popupValue{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translateX(50%);white-space:nowrap}.theme-light .Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.theme-light .Knob__ringTrackPivot{transform:rotateZ(135deg)}.theme-light .Knob__ringTrack{fill:transparent;stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.theme-light .Knob__ringFillPivot{transform:rotateZ(135deg)}.theme-light .Knob--bipolar .Knob__ringFillPivot{transform:rotateZ(270deg)}.theme-light .Knob__ringFill{fill:transparent;stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms ease-out}.theme-light .Knob--color--black .Knob__ringFill{stroke:#000}.theme-light .Knob--color--white .Knob__ringFill{stroke:#e6e6e6}.theme-light .Knob--color--red .Knob__ringFill{stroke:#c82121}.theme-light .Knob--color--orange .Knob__ringFill{stroke:#e6630d}.theme-light .Knob--color--yellow .Knob__ringFill{stroke:#e5c304}.theme-light .Knob--color--olive .Knob__ringFill{stroke:#a3b816}.theme-light .Knob--color--green .Knob__ringFill{stroke:#1d9f3b}.theme-light .Knob--color--teal .Knob__ringFill{stroke:#00a39c}.theme-light .Knob--color--blue .Knob__ringFill{stroke:#1e78bb}.theme-light .Knob--color--dark-blue .Knob__ringFill{stroke:#004274}.theme-light .Knob--color--violet .Knob__ringFill{stroke:#5a30b5}.theme-light .Knob--color--purple .Knob__ringFill{stroke:#932eb4}.theme-light .Knob--color--pink .Knob__ringFill{stroke:#db228a}.theme-light .Knob--color--brown .Knob__ringFill{stroke:#955d39}.theme-light .Knob--color--grey .Knob__ringFill{stroke:#e6e6e6}.theme-light .Knob--color--light-grey .Knob__ringFill{stroke:#999}.theme-light .Knob--color--good .Knob__ringFill{stroke:#529923}.theme-light .Knob--color--average .Knob__ringFill{stroke:#da810e}.theme-light .Knob--color--bad .Knob__ringFill{stroke:#c82121}.theme-light .Knob--color--label .Knob__ringFill{stroke:#353535}.theme-light .Knob--color--xeno .Knob__ringFill{stroke:#4a3253}.theme-light .Slider{cursor:e-resize}.theme-light .Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none !important}.theme-light .Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #000}.theme-light .Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid transparent;border-right:.4166666667em solid transparent;border-bottom:.4166666667em solid #000}.theme-light .Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translateX(50%);white-space:nowrap}.theme-light .ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-width:.0833333333em !important;border-style:solid !important;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color 900ms ease-out}.theme-light .ProgressBar__fill{position:absolute;top:-0.5px;left:0px;bottom:-0.5px}.theme-light .ProgressBar__fill--animated{transition:background-color 900ms ease-out,width 900ms ease-out}.theme-light .ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.theme-light .ProgressBar--color--default{border:.0833333333em solid #bfbfbf}.theme-light .ProgressBar--color--default .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--black{border-color:#000 !important}.theme-light .ProgressBar--color--black .ProgressBar__fill{background-color:#000}.theme-light .ProgressBar--color--white{border-color:#bfbfbf !important}.theme-light .ProgressBar--color--white .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--red{border-color:#a61c1c !important}.theme-light .ProgressBar--color--red .ProgressBar__fill{background-color:#a61c1c}.theme-light .ProgressBar--color--orange{border-color:#c0530b !important}.theme-light .ProgressBar--color--orange .ProgressBar__fill{background-color:#c0530b}.theme-light .ProgressBar--color--yellow{border-color:#bfa303 !important}.theme-light .ProgressBar--color--yellow .ProgressBar__fill{background-color:#bfa303}.theme-light .ProgressBar--color--olive{border-color:#889912 !important}.theme-light .ProgressBar--color--olive .ProgressBar__fill{background-color:#889912}.theme-light .ProgressBar--color--green{border-color:#188532 !important}.theme-light .ProgressBar--color--green .ProgressBar__fill{background-color:#188532}.theme-light .ProgressBar--color--teal{border-color:#008882 !important}.theme-light .ProgressBar--color--teal .ProgressBar__fill{background-color:#008882}.theme-light .ProgressBar--color--blue{border-color:#19649c !important}.theme-light .ProgressBar--color--blue .ProgressBar__fill{background-color:#19649c}.theme-light .ProgressBar--color--dark-blue{border-color:#003761 !important}.theme-light .ProgressBar--color--dark-blue .ProgressBar__fill{background-color:#003761}.theme-light .ProgressBar--color--violet{border-color:#4b2897 !important}.theme-light .ProgressBar--color--violet .ProgressBar__fill{background-color:#4b2897}.theme-light .ProgressBar--color--purple{border-color:#7a2696 !important}.theme-light .ProgressBar--color--purple .ProgressBar__fill{background-color:#7a2696}.theme-light .ProgressBar--color--pink{border-color:#b61d73 !important}.theme-light .ProgressBar--color--pink .ProgressBar__fill{background-color:#b61d73}.theme-light .ProgressBar--color--brown{border-color:#7c4d2f !important}.theme-light .ProgressBar--color--brown .ProgressBar__fill{background-color:#7c4d2f}.theme-light .ProgressBar--color--grey{border-color:#bfbfbf !important}.theme-light .ProgressBar--color--grey .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--light-grey{border-color:gray !important}.theme-light .ProgressBar--color--light-grey .ProgressBar__fill{background-color:gray}.theme-light .ProgressBar--color--good{border-color:#44801d !important}.theme-light .ProgressBar--color--good .ProgressBar__fill{background-color:#44801d}.theme-light .ProgressBar--color--average{border-color:#b56b0b !important}.theme-light .ProgressBar--color--average .ProgressBar__fill{background-color:#b56b0b}.theme-light .ProgressBar--color--bad{border-color:#a61c1c !important}.theme-light .ProgressBar--color--bad .ProgressBar__fill{background-color:#a61c1c}.theme-light .ProgressBar--color--label{border-color:#2c2c2c !important}.theme-light .ProgressBar--color--label .ProgressBar__fill{background-color:#2c2c2c}.theme-light .ProgressBar--color--xeno{border-color:#3e2945 !important}.theme-light .ProgressBar--color--xeno .ProgressBar__fill{background-color:#3e2945}.theme-light .Chat{color:#000}.theme-light .Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:crimson;border-radius:10px;transition:font-size 200ms ease-out}.theme-light .Chat__badge:before{content:"x"}.theme-light .Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.theme-light .Chat__scrollButton{position:fixed;right:2em;bottom:1em}.theme-light .Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.theme-light .Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#db2828;background-color:#fff}.theme-light .Chat__reconnected:after{content:"";display:block;margin-top:-0.75em;border-bottom:.1666666667em solid #db2828}.theme-light .Chat__highlight{color:#000}.theme-light .Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:bold}.theme-light .ChatMessage{word-wrap:break-word}.theme-light .ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.theme-light .ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.theme-light .Layout,.theme-light .Layout *{scrollbar-base-color:#f2f2f2;scrollbar-face-color:#d6d6d6;scrollbar-3dlight-color:#eee;scrollbar-highlight-color:#eee;scrollbar-track-color:#f2f2f2;scrollbar-arrow-color:#777;scrollbar-shadow-color:#d6d6d6}.theme-light .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-light .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-light .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#000;background-color:#eee;background-image:linear-gradient(to bottom, #eeeeee 0%, #eeeeee 100%)}.theme-light .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-light .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-light .Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.theme-light .Window__contentPadding:after{height:0}.theme-light .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-light .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(252,252,252,.25);pointer-events:none}.theme-light .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-light .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-light .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-light .TitleBar{background-color:#eee;border-bottom:1px solid rgba(0,0,0,.25);box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-light .TitleBar__clickable{color:rgba(0,0,0,.5);background-color:#eee;transition:color 250ms ease-out,background-color 250ms ease-out}.theme-light .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-light .TitleBar__title{position:absolute;display:inline-block;top:0;left:46px;left:3.8333333333rem;color:rgba(0,0,0,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap;pointer-events:none}.theme-light .TitleBar__buttons{pointer-events:initial;display:inline-block;width:100%;margin-left:10px}.theme-light .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-light .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px !important;line-height:2.6666666667rem !important}.theme-light .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-light .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-light html,.theme-light body{padding:0;margin:0;height:100%;color:#000}.theme-light body{background:#fff;font-family:Verdana,sans-serif;font-size:13px;line-height:1.2;overflow-x:hidden;overflow-y:scroll;word-wrap:break-word}.theme-light em{font-style:normal;font-weight:bold}.theme-light img{margin:0;padding:0;line-height:1;-ms-interpolation-mode:nearest-neighbor;image-rendering:pixelated}.theme-light img.icon{height:1em;min-height:16px;width:auto;vertical-align:bottom}.theme-light a{color:blue}.theme-light a.visited{color:#f0f}.theme-light a:visited{color:#f0f}.theme-light a.popt{text-decoration:none}.theme-light .popup{position:fixed;top:50%;left:50%;background:#ddd}.theme-light .popup .close{position:absolute;background:#aaa;top:0;right:0;color:#333;text-decoration:none;z-index:2;padding:0 10px;height:30px;line-height:30px}.theme-light .popup .close:hover{background:#999}.theme-light .popup .head{background:#999;color:#ddd;padding:0 10px;height:30px;line-height:30px;text-transform:uppercase;font-size:.9em;font-weight:bold;border-bottom:2px solid green}.theme-light .popup input{border:1px solid #999;background:#fff;margin:0;padding:5px;outline:none;color:#333}.theme-light .popup input[type=text]:hover,.theme-light .popup input[type=text]:active,.theme-light .popup input[type=text]:focus{border-color:green}.theme-light .popup input[type=submit]{padding:5px 10px;background:#999;color:#ddd;text-transform:uppercase;font-size:.9em;font-weight:bold}.theme-light .popup input[type=submit]:hover,.theme-light .popup input[type=submit]:focus,.theme-light .popup input[type=submit]:active{background:#aaa;cursor:pointer}.theme-light .changeFont{padding:10px}.theme-light .changeFont a{display:block;text-decoration:none;padding:3px;color:#333}.theme-light .changeFont a:hover{background:#ccc}.theme-light .highlightPopup{padding:10px;text-align:center}.theme-light .highlightPopup input[type=text]{display:block;width:215px;text-align:left;margin-top:5px}.theme-light .highlightPopup input.highlightColor{background-color:#ff0}.theme-light .highlightPopup input.highlightTermSubmit{margin-top:5px}.theme-light .contextMenu{background-color:#ddd;position:fixed;margin:2px;width:150px}.theme-light .contextMenu a{display:block;padding:2px 5px;text-decoration:none;color:#333}.theme-light .contextMenu a:hover{background-color:#ccc}.theme-light .filterMessages{padding:5px}.theme-light .filterMessages div{padding:2px 0}.theme-light .icon-stack{height:1em;line-height:1em;width:1em;vertical-align:middle;margin-top:-2px}.theme-light .motd{color:#638500;font-family:Verdana,sans-serif;white-space:normal}.theme-light .motd h1,.theme-light .motd h2,.theme-light .motd h3,.theme-light .motd h4,.theme-light .motd h5,.theme-light .motd h6{color:#638500;text-decoration:underline}.theme-light .motd a,.theme-light .motd a:link,.theme-light .motd a:visited,.theme-light .motd a:active,.theme-light .motd a:hover{color:#638500}.theme-light .bold,.theme-light .name,.theme-light .prefix,.theme-light .ooc,.theme-light .looc,.theme-light .adminooc,.theme-light .admin,.theme-light .medal,.theme-light .yell{font-weight:bold}.theme-light .italic,.theme-light .italics{font-style:italic}.theme-light .highlight{background:#ff0}.theme-light h1,.theme-light h2,.theme-light h3,.theme-light h4,.theme-light h5,.theme-light h6{color:blue;font-family:Georgia,Verdana,sans-serif}.theme-light h1.alert,.theme-light h2.alert{color:#000}.theme-light em{font-style:normal;font-weight:bold}.theme-light .ooc{font-weight:bold}.theme-light .adminobserverooc{color:#09c;font-weight:bold}.theme-light .adminooc{color:#700038;font-weight:bold}.theme-light .adminsay{color:#ff4500;font-weight:bold}.theme-light .admin{color:#4473ff;font-weight:bold}.theme-light .name{font-weight:bold}.theme-light .deadsay{color:#5c00e6}.theme-light .binarysay{color:#20c20e;background-color:#000;display:block}.theme-light .binarysay a{color:lime}.theme-light .binarysay a:active,.theme-light .binarysay a:visited{color:#8f8}.theme-light .radio{color:green}.theme-light .sciradio{color:#939}.theme-light .comradio{color:#948f02}.theme-light .secradio{color:#a30000}.theme-light .medradio{color:#337296}.theme-light .engradio{color:#fb5613}.theme-light .sentryradio{color:#844300}.theme-light .suppradio{color:#a8732b}.theme-light .servradio{color:#6eaa2c}.theme-light .syndradio{color:#6d3f40}.theme-light .gangradio{color:#ac2ea1}.theme-light .centcomradio{color:#686868}.theme-light .aiprivradio{color:#f0f}.theme-light .redteamradio{color:red}.theme-light .blueteamradio{color:blue}.theme-light .greenteamradio{color:lime}.theme-light .yellowteamradio{color:#d1ba22}.theme-light .yell{font-weight:bold}.theme-light .alert{color:red}.theme-light h1.alert,.theme-light h2.alert{color:#000}.theme-light .userdanger{color:red;font-weight:bold;font-size:185%}.theme-light .bolddanger{color:red;font-weight:bold}.theme-light .danger{color:red}.theme-light .tinydanger{color:red;font-size:85%}.theme-light .smalldanger{color:red;font-size:90%}.theme-light .warning{color:red;font-style:italic}.theme-light .alertwarning{color:red;font-weight:bold}.theme-light .boldwarning{color:red;font-style:italic;font-weight:bold}.theme-light .announce{color:#228b22;font-weight:bold}.theme-light .boldannounce{color:red;font-weight:bold}.theme-light .minorannounce{font-weight:bold;font-size:185%}.theme-light .greenannounce{color:lime;font-weight:bold}.theme-light .rose{color:#ff5050}.theme-light .info{color:#00c}.theme-light .notice{color:#009}.theme-light .staff_ic{color:#009}.theme-light .tinynotice{color:#009;font-size:85%}.theme-light .tinynoticeital{color:#009;font-style:italic;font-size:85%}.theme-light .smallnotice{color:#009;font-size:90%}.theme-light .smallnoticeital{color:#009;font-style:italic;font-size:90%}.theme-light .boldnotice{color:#009;font-weight:bold}.theme-light .hear{color:#009;font-style:italic}.theme-light .adminnotice{color:blue}.theme-light .adminhelp{color:red;font-weight:bold}.theme-light .unconscious{color:blue;font-weight:bold}.theme-light .suicide{color:#ff5050;font-style:italic}.theme-light .green{color:#03ff39}.theme-light .grey{color:#838383}.theme-light .red{color:red}.theme-light .blue{color:blue}.theme-light .nicegreen{color:#14a833}.theme-light .boldnicegreen{color:#14a833;font-weight:bold}.theme-light .cult{color:#973e3b}.theme-light .cultitalic{color:#973e3b;font-style:italic}.theme-light .cultbold{color:#973e3b;font-style:italic;font-weight:bold}.theme-light .cultboldtalic{color:#973e3b;font-weight:bold;font-size:185%}.theme-light .cultlarge{color:#973e3b;font-weight:bold;font-size:185%}.theme-light .narsie{color:#973e3b;font-weight:bold;font-size:925%}.theme-light .narsiesmall{color:#973e3b;font-weight:bold;font-size:370%}.theme-light .colossus{color:#7f282a;font-size:310%}.theme-light .hierophant{color:#609;font-weight:bold;font-style:italic}.theme-light .hierophant_warning{color:#609;font-style:italic}.theme-light .purple{color:#5e2d79}.theme-light .holoparasite{color:#35333a}.theme-light .revennotice{color:#1d2953}.theme-light .revenboldnotice{color:#1d2953;font-weight:bold}.theme-light .revenbignotice{color:#1d2953;font-weight:bold;font-size:185%}.theme-light .revenminor{color:#823abb}.theme-light .revenwarning{color:#760fbb;font-style:italic}.theme-light .revendanger{color:#760fbb;font-weight:bold;font-size:185%}.theme-light .deconversion_message{color:#5000a0;font-size:185%;font-style:italic}.theme-light .ghostalert{color:#5c00e6;font-style:italic;font-weight:bold}.theme-light .alien{color:#543354}.theme-light .noticealien{color:#00c000}.theme-light .alertalien{color:#00c000;font-weight:bold}.theme-light .changeling{color:purple;font-style:italic}.theme-light .alertsyndie{color:red;font-size:185%;font-weight:bold}.theme-light .spider{color:#4d004d;font-weight:bold;font-size:185%}.theme-light .interface{color:#303}.theme-light .sans{font-family:"Comic Sans MS",cursive,sans-serif}.theme-light .papyrus{font-family:"Papyrus",cursive,sans-serif}.theme-light .robot{font-family:"Courier New",cursive,sans-serif}.theme-light .tape_recorder{color:maroon;font-family:"Courier New",cursive,sans-serif}.theme-light .command_headset{font-weight:bold;font-size:160%}.theme-light .small{font-size:60%}.theme-light .big{font-size:185%}.theme-light .reallybig{font-size:245%}.theme-light .extremelybig{font-size:310%}.theme-light .greentext{color:lime;font-size:185%}.theme-light .redtext{color:red;font-size:185%}.theme-light .clown{color:#ff69bf;font-size:160%;font-family:"Comic Sans MS",cursive,sans-serif;font-weight:bold}.theme-light .singing{font-family:"Trebuchet MS",cursive,sans-serif;font-style:italic}.theme-light .his_grace{color:#15d512;font-family:"Courier New",cursive,sans-serif;font-style:italic}.theme-light .hypnophrase{color:#0d0d0d;font-weight:bold;animation:hypnocolor 1500ms infinite;animation-direction:alternate}@keyframes hypnocolor{0%{color:#0d0d0d}25%{color:#410194}50%{color:#7f17d8}75%{color:#410194}100%{color:#3bb5d3}}.theme-light .phobia{color:#d00;font-weight:bold;animation:phobia 750ms infinite}@keyframes phobia{0%{color:#0d0d0d}50%{color:#d00}100%{color:#0d0d0d}}.theme-light .icon{height:1em;width:auto}.theme-light .bigicon{font-size:2.5em}.theme-light .memo{color:#638500;text-align:center}.theme-light .memoedit{text-align:center;font-size:125%}.theme-light .abductor{color:purple;font-style:italic}.theme-light .mind_control{color:#a00d6f;font-size:100%;font-weight:bold;font-style:italic}.theme-light .slime{color:#00ced1}.theme-light .drone{color:#848482}.theme-light .monkey{color:#975032}.theme-light .swarmer{color:#2c75ff}.theme-light .resonate{color:#298f85}.theme-light .monkeyhive{color:#774704}.theme-light .monkeylead{color:#774704;font-size:80%}.theme-light .connectionClosed,.theme-light .fatalError{background:red;color:#fff;padding:5px}.theme-light .connectionClosed.restored{background:green}.theme-light .internal.boldnshit{color:blue;font-weight:bold}.theme-light .text-normal{font-weight:normal;font-style:normal}.theme-light .hidden{display:none;visibility:hidden}.theme-light .ml-1{margin-left:1em}.theme-light .ml-2{margin-left:2em}.theme-light .ml-3{margin-left:3em}.theme-light .xooc{color:#6c0094;font-weight:bold;font-size:140%}.theme-light .mooc{color:#090;font-weight:bold;font-size:140%}.theme-light .yooc{color:#999600;font-weight:bold;font-size:140%}.theme-light .headminsay{color:#5a0a7f;font-weight:bold}.theme-light .radio{color:#4e4e4e}.theme-light .deptradio{color:#939}.theme-light .comradio{color:#004080}.theme-light .centradio{color:#5c5c8a}.theme-light .cryoradio{color:#554e3f}.theme-light .hcradio{color:#318779}.theme-light .pvstradio{color:#9b0612}.theme-light .airadio{color:#f0f}.theme-light .secradio{color:#a30000}.theme-light .engradio{color:#a66300}.theme-light .sentryradio{color:#844300}.theme-light .medradio{color:#008160}.theme-light .supradio{color:#5f4519}.theme-light .jtacradio{color:#702963}.theme-light .intelradio{color:#027d02}.theme-light .wyradio{color:#fe9b24}.theme-light .pmcradio{color:#136957}.theme-light .vairadio{color:#943d0a}.theme-light .cmbradio{color:#1b748c}.theme-light .clfradio{color:#6f679c}.theme-light .alpharadio{color:#ea0000}.theme-light .bravoradio{color:#c68610}.theme-light .charlieradio{color:#a5a}.theme-light .deltaradio{color:#007fcf}.theme-light .echoradio{color:#3a7e65}.theme-light .medium{font-size:110%}.theme-light .big{font-size:115%}.theme-light .large{font-size:125%}.theme-light .extra_large{font-size:130%}.theme-light .huge{font-size:150%}.theme-light .underline{text-decoration:underline}.theme-light .orange{color:#eca100}.theme-light .normal{font-style:normal}.theme-light .attack{color:red}.theme-light .moderate{color:#c00}.theme-light .disarm{color:#900}.theme-light .passive{color:#600}.theme-light .helpful{color:#368f31}.theme-light .scanner{color:red}.theme-light .scannerb{color:red;font-weight:bold}.theme-light .scannerburn{color:orange}.theme-light .scannerburnb{color:orange;font-weight:bold}.theme-light .rose{color:#ff5050}.theme-light .debuginfo{color:#493d26;font-style:italic}.theme-light .xenonotice{color:#2a623d}.theme-light .xenoboldnotice{color:#2a623d;font-style:italic}.theme-light .xenowarning{color:#2a623d;font-style:italic}.theme-light .xenominorwarning{color:#2a623d;font-weight:bold;font-style:italic}.theme-light .xenodanger{color:#2a623d;font-weight:bold}.theme-light .avoidharm{color:#72a0e5;font-weight:bold}.theme-light .highdanger{color:red;font-weight:bold;font-size:140%}.theme-light .xenohighdanger{color:#2a623d;font-weight:bold;font-size:140%}.theme-light .xenoannounce{color:#1a472a;font-family:book-antiqua;font-weight:bold;font-size:140%}.theme-light .yautjabold{color:purple;font-weight:bold}.theme-light .yautjaboldbig{color:purple;font-weight:bold;font-size:120%}.theme-light .objectivebig{font-weight:bold;font-size:130%}.theme-light .objectivegreen{color:lime}.theme-light .objectivered{color:red}.theme-light .objectivesuccess{color:lime;font-weight:bold;font-size:110%}.theme-light .objectivefail{color:red;font-weight:bold;font-size:110%}.theme-light .xenotalk,.theme-light .xeno{color:#900090;font-style:italic}.theme-light .xenoleader{color:#730d73;font-style:italic;font-size:125%}.theme-light .xenoqueen{color:#730d73;font-style:italic;font-weight:bold;font-size:125%}.theme-light .newscaster{color:maroon}.theme-light .role_header{color:#db0000;display:block;text-align:center;font-weight:bold;font-family:trebuchet-ms;font-size:150%}.theme-light .role_body{color:#009;display:block;text-align:center;font-size:125%}.theme-light .round_header{color:#db0000;display:block;text-align:center;font-family:courier;font-weight:bold;font-size:180%}.theme-light .round_body{color:#001427;display:block;text-align:center;font-family:trebuchet-ms;font-weight:bold;font-size:125%}.theme-light .event_announcement{color:#600d48;font-family:arial-narrow;font-weight:bold;font-size:125%}.theme-light .announce_header{color:#000;font-weight:bold;font-size:150%}.theme-light .announce_header_blue{color:#009;font-weight:bold;font-size:150%}.theme-light .announce_body{color:red;font-weight:normal;font-size:125%}.theme-light .centerbold{display:block;text-align:center;font-weight:bold}.theme-light .mod{color:#735638;font-weight:bold}.theme-light .modooc{color:#184880;font-weight:bold}.theme-light .adminmod{color:#402a14;font-weight:bold}.theme-light .mentorsay{color:#b38c32;font-weight:bold}.theme-light .mentorhelp{color:#007e00;font-weight:bold}.theme-light .mentorbody{color:#da6200;font-weight:bold}.theme-light .mentorstaff{color:#876101;font-weight:bold}.theme-light .staffsay{color:#876101;font-weight:bold}.theme-light .tajaran{color:#803b56}.theme-light .tajaran_signlang{color:#941c1c}.theme-light .skrell{color:#00ced1}.theme-light .soghun{color:#228b22}.theme-light .changeling{color:purple}.theme-light .vox{color:#a0a}.theme-light .monkey{color:#966c47}.theme-light .german{color:#858f1e;font-family:"Times New Roman",Times,serif}.theme-light .spanish{color:#cf982b}.theme-light .japanese{color:#940927}.theme-light .chinese{color:#fe1919}.theme-light .zombie{color:#216163;font-style:italic}.theme-light .commando{color:#fe9b24;font-style:bold}.theme-light .rough{font-family:trebuchet-ms,cursive,sans-serif}.theme-light .say_quote{font-family:Georgia,Verdana,sans-serif}.theme-light .admin .message{color:#314cad}.theme-light .admin .prefix{font-weight:bolder}.theme-light .pm{font-size:110%}.theme-light .retro_translator{font-weight:bold}.theme-light .yautja_translator{color:#a00;font-weight:bold;animation:glitch .5s infinite}@keyframes glitch{25%{color:#a00;transform:translate(-2px, -1px)}50%{color:#be0000;transform:translate(1px, -2px)}75%{color:#8d0000;transform:translate(-1px, 2px)}100%{color:#830000;transform:translate(1px, 1px)}}.theme-light .examine_block{background:#f2f7fa;border:1px solid #111a27;margin:.5em;padding:.5em .75em}.theme-light .examine_block .icon{width:1.5em;height:1.5em;margin:0;padding:0}.theme-light .tooltip{font-style:italic;border-bottom:1px dashed #000} +html,body{box-sizing:border-box;height:100%;margin:0;font-size:12px}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif}*,*:before,*:after{box-sizing:inherit}h1,h2,h3,h4,h5,h6{display:block;margin:0;padding:6px 0;padding:.5rem 0}h1{font-size:18px;font-size:1.5rem}h2{font-size:16px;font-size:1.333rem}h3{font-size:14px;font-size:1.167rem}h4{font-size:12px;font-size:1rem}td,th{vertical-align:baseline;text-align:left}.candystripe:nth-child(odd){background-color:rgba(0,0,0,.25)}.color-black{color:#1a1a1a !important}.color-white{color:#fff !important}.color-red{color:#df3e3e !important}.color-orange{color:#f37f33 !important}.color-yellow{color:#fbda21 !important}.color-olive{color:#cbe41c !important}.color-green{color:#25ca4c !important}.color-teal{color:#00d6cc !important}.color-blue{color:#2e93de !important}.color-dark-blue{color:#005fa7 !important}.color-violet{color:#7349cf !important}.color-purple{color:#ad45d0 !important}.color-pink{color:#e34da1 !important}.color-brown{color:#b97447 !important}.color-grey{color:#848484 !important}.color-light-grey{color:#b3b3b3 !important}.color-good{color:#68c22d !important}.color-average{color:#f29a29 !important}.color-bad{color:#df3e3e !important}.color-label{color:#8b9bb0 !important}.color-xeno{color:#664573 !important}.color-bg-black{background-color:#000 !important}.color-bg-white{background-color:#d9d9d9 !important}.color-bg-red{background-color:#bd2020 !important}.color-bg-orange{background-color:#d95e0c !important}.color-bg-yellow{background-color:#d9b804 !important}.color-bg-olive{background-color:#9aad14 !important}.color-bg-green{background-color:#1b9638 !important}.color-bg-teal{background-color:#009a93 !important}.color-bg-blue{background-color:#1c71b1 !important}.color-bg-dark-blue{background-color:#003e6e !important}.color-bg-violet{background-color:#552dab !important}.color-bg-purple{background-color:#8b2baa !important}.color-bg-pink{background-color:#cf2082 !important}.color-bg-brown{background-color:#8c5836 !important}.color-bg-grey{background-color:#646464 !important}.color-bg-light-grey{background-color:#919191 !important}.color-bg-good{background-color:#4d9121 !important}.color-bg-average{background-color:#cd7a0d !important}.color-bg-bad{background-color:#bd2020 !important}.color-bg-label{background-color:#657a94 !important}.color-bg-xeno{background-color:#462f4e !important}.debug-layout,.debug-layout *:not(g):not(path){color:rgba(255,255,255,.9) !important;background:transparent !important;outline:1px solid rgba(255,255,255,.5) !important;box-shadow:none !important;filter:none !important}.debug-layout:hover,.debug-layout *:not(g):not(path):hover{outline-color:rgba(255,255,255,.8) !important}.outline-dotted{outline-style:dotted !important}.outline-dashed{outline-style:dashed !important}.outline-solid{outline-style:solid !important}.outline-double{outline-style:double !important}.outline-groove{outline-style:groove !important}.outline-ridge{outline-style:ridge !important}.outline-inset{outline-style:inset !important}.outline-outset{outline-style:outset !important}.outline-color-black{outline:.167rem solid #1a1a1a !important}.outline-color-white{outline:.167rem solid #fff !important}.outline-color-red{outline:.167rem solid #df3e3e !important}.outline-color-orange{outline:.167rem solid #f37f33 !important}.outline-color-yellow{outline:.167rem solid #fbda21 !important}.outline-color-olive{outline:.167rem solid #cbe41c !important}.outline-color-green{outline:.167rem solid #25ca4c !important}.outline-color-teal{outline:.167rem solid #00d6cc !important}.outline-color-blue{outline:.167rem solid #2e93de !important}.outline-color-dark-blue{outline:.167rem solid #005fa7 !important}.outline-color-violet{outline:.167rem solid #7349cf !important}.outline-color-purple{outline:.167rem solid #ad45d0 !important}.outline-color-pink{outline:.167rem solid #e34da1 !important}.outline-color-brown{outline:.167rem solid #b97447 !important}.outline-color-grey{outline:.167rem solid #848484 !important}.outline-color-light-grey{outline:.167rem solid #b3b3b3 !important}.outline-color-good{outline:.167rem solid #68c22d !important}.outline-color-average{outline:.167rem solid #f29a29 !important}.outline-color-bad{outline:.167rem solid #df3e3e !important}.outline-color-label{outline:.167rem solid #8b9bb0 !important}.outline-color-xeno{outline:.167rem solid #664573 !important}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-baseline{text-align:baseline}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-pre{white-space:pre}.text-bold{font-weight:bold}.text-italic{font-style:italic}.text-underline{text-decoration:underline}.BlockQuote{color:#8b9bb0;border-left:.1666666667em solid #8b9bb0;padding-left:.5em;margin-bottom:.5em}.BlockQuote:last-child{margin-bottom:0}.Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.Button:last-child{margin-right:0;margin-bottom:0}.Button .fa,.Button .fas,.Button .far{margin-left:-0.25em;margin-right:-0.25em;min-width:1.333em;text-align:center}.Button--hasContent .fa,.Button--hasContent .fas,.Button--hasContent .far{margin-right:.25em}.Button--hasContent.Button--iconPosition--right .fa,.Button--hasContent.Button--iconPosition--right .fas,.Button--hasContent.Button--iconPosition--right .far{margin-right:0px;margin-left:3px}.Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.Button--fluid{display:block;margin-left:0;margin-right:0}.Button--circular{border-radius:50%}.Button--compact{padding:0 .25em;line-height:1.333em}.Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.Button--color--black:hover{transition:color 0ms,background-color 0ms}.Button--color--black:focus{transition:color 100ms,background-color 100ms}.Button--color--black:hover,.Button--color--black:focus{background-color:#131313;color:#fff}.Button--color--white{transition:color 50ms,background-color 50ms;background-color:#d9d9d9;color:#000}.Button--color--white:hover{transition:color 0ms,background-color 0ms}.Button--color--white:focus{transition:color 100ms,background-color 100ms}.Button--color--white:hover,.Button--color--white:focus{background-color:#f8f8f8;color:#000}.Button--color--red{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--red:hover{transition:color 0ms,background-color 0ms}.Button--color--red:focus{transition:color 100ms,background-color 100ms}.Button--color--red:hover,.Button--color--red:focus{background-color:#dc4848;color:#fff}.Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#d95e0c;color:#fff}.Button--color--orange:hover{transition:color 0ms,background-color 0ms}.Button--color--orange:focus{transition:color 100ms,background-color 100ms}.Button--color--orange:hover,.Button--color--orange:focus{background-color:#f0853f;color:#fff}.Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.Button--color--yellow:focus{transition:color 100ms,background-color 100ms}.Button--color--yellow:hover,.Button--color--yellow:focus{background-color:#f5d72e;color:#000}.Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#9aad14;color:#fff}.Button--color--olive:hover{transition:color 0ms,background-color 0ms}.Button--color--olive:focus{transition:color 100ms,background-color 100ms}.Button--color--olive:hover,.Button--color--olive:focus{background-color:#c4da2b;color:#fff}.Button--color--green{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--color--green:hover{transition:color 0ms,background-color 0ms}.Button--color--green:focus{transition:color 100ms,background-color 100ms}.Button--color--green:hover,.Button--color--green:focus{background-color:#32c154;color:#fff}.Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#009a93;color:#fff}.Button--color--teal:hover{transition:color 0ms,background-color 0ms}.Button--color--teal:focus{transition:color 100ms,background-color 100ms}.Button--color--teal:hover,.Button--color--teal:focus{background-color:#13c4bc;color:#fff}.Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#1c71b1;color:#fff}.Button--color--blue:hover{transition:color 0ms,background-color 0ms}.Button--color--blue:focus{transition:color 100ms,background-color 100ms}.Button--color--blue:hover,.Button--color--blue:focus{background-color:#3a95d9;color:#fff}.Button--color--dark-blue{transition:color 50ms,background-color 50ms;background-color:#003e6e;color:#fff}.Button--color--dark-blue:hover{transition:color 0ms,background-color 0ms}.Button--color--dark-blue:focus{transition:color 100ms,background-color 100ms}.Button--color--dark-blue:hover,.Button--color--dark-blue:focus{background-color:#135b92;color:#fff}.Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#552dab;color:#fff}.Button--color--violet:hover{transition:color 0ms,background-color 0ms}.Button--color--violet:focus{transition:color 100ms,background-color 100ms}.Button--color--violet:hover,.Button--color--violet:focus{background-color:#7953cc;color:#fff}.Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#8b2baa;color:#fff}.Button--color--purple:hover{transition:color 0ms,background-color 0ms}.Button--color--purple:focus{transition:color 100ms,background-color 100ms}.Button--color--purple:hover,.Button--color--purple:focus{background-color:#ad4fcd;color:#fff}.Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#cf2082;color:#fff}.Button--color--pink:hover{transition:color 0ms,background-color 0ms}.Button--color--pink:focus{transition:color 100ms,background-color 100ms}.Button--color--pink:hover,.Button--color--pink:focus{background-color:#e257a5;color:#fff}.Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#8c5836;color:#fff}.Button--color--brown:hover{transition:color 0ms,background-color 0ms}.Button--color--brown:focus{transition:color 100ms,background-color 100ms}.Button--color--brown:hover,.Button--color--brown:focus{background-color:#b47851;color:#fff}.Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#646464;color:#fff}.Button--color--grey:hover{transition:color 0ms,background-color 0ms}.Button--color--grey:focus{transition:color 100ms,background-color 100ms}.Button--color--grey:hover,.Button--color--grey:focus{background-color:#868686;color:#fff}.Button--color--light-grey{transition:color 50ms,background-color 50ms;background-color:#919191;color:#fff}.Button--color--light-grey:hover{transition:color 0ms,background-color 0ms}.Button--color--light-grey:focus{transition:color 100ms,background-color 100ms}.Button--color--light-grey:hover,.Button--color--light-grey:focus{background-color:#bababa;color:#fff}.Button--color--good{transition:color 50ms,background-color 50ms;background-color:#4d9121;color:#fff}.Button--color--good:hover{transition:color 0ms,background-color 0ms}.Button--color--good:focus{transition:color 100ms,background-color 100ms}.Button--color--good:hover,.Button--color--good:focus{background-color:#6cba39;color:#fff}.Button--color--average{transition:color 50ms,background-color 50ms;background-color:#cd7a0d;color:#fff}.Button--color--average:hover{transition:color 0ms,background-color 0ms}.Button--color--average:focus{transition:color 100ms,background-color 100ms}.Button--color--average:hover,.Button--color--average:focus{background-color:#ed9d35;color:#fff}.Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--bad:hover{transition:color 0ms,background-color 0ms}.Button--color--bad:focus{transition:color 100ms,background-color 100ms}.Button--color--bad:hover,.Button--color--bad:focus{background-color:#dc4848;color:#fff}.Button--color--label{transition:color 50ms,background-color 50ms;background-color:#657a94;color:#fff}.Button--color--label:hover{transition:color 0ms,background-color 0ms}.Button--color--label:focus{transition:color 100ms,background-color 100ms}.Button--color--label:hover,.Button--color--label:focus{background-color:#91a1b3;color:#fff}.Button--color--xeno{transition:color 50ms,background-color 50ms;background-color:#462f4e;color:#fff}.Button--color--xeno:hover{transition:color 0ms,background-color 0ms}.Button--color--xeno:focus{transition:color 100ms,background-color 100ms}.Button--color--xeno:hover,.Button--color--xeno:focus{background-color:#64496d;color:#fff}.Button--color--default{transition:color 50ms,background-color 50ms;background-color:#3e6189;color:#fff}.Button--color--default:hover{transition:color 0ms,background-color 0ms}.Button--color--default:focus{transition:color 100ms,background-color 100ms}.Button--color--default:hover,.Button--color--default:focus{background-color:#5c83b0;color:#fff}.Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--caution:hover{transition:color 0ms,background-color 0ms}.Button--color--caution:focus{transition:color 100ms,background-color 100ms}.Button--color--caution:hover,.Button--color--caution:focus{background-color:#f5d72e;color:#000}.Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--danger:hover{transition:color 0ms,background-color 0ms}.Button--color--danger:focus{transition:color 100ms,background-color 100ms}.Button--color--danger:hover,.Button--color--danger:focus{background-color:#dc4848;color:#fff}.Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#202020;color:#fff;background-color:rgba(32,32,32,0);color:rgba(255,255,255,.5)}.Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.Button--color--transparent:focus{transition:color 100ms,background-color 100ms}.Button--color--transparent:hover,.Button--color--transparent:focus{background-color:#383838;color:#fff}.Button--disabled{background-color:#999 !important}.Button--selected{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--selected:hover{transition:color 0ms,background-color 0ms}.Button--selected:focus{transition:color 100ms,background-color 100ms}.Button--selected:hover,.Button--selected:focus{background-color:#32c154;color:#fff}.Button--flex{display:inline-flex;flex-direction:column}.Button--flex--fluid{width:100%}.Button--verticalAlignContent--top{justify-content:flex-start}.Button--verticalAlignContent--middle{justify-content:center}.Button--verticalAlignContent--bottom{justify-content:flex-end}.Button__content{display:block;align-self:stretch}.ColorBox{display:inline-block;width:1em;height:1em;line-height:1em;text-align:center}.Dimmer{display:flex;justify-content:center;align-items:center;position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(0,0,0,.75);z-index:1}.Divider--horizontal{margin:.5em 0}.Divider--horizontal:not(.Divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Divider--vertical{height:100%;margin:0 .5em}.Divider--vertical:not(.Divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Dropdown{position:relative}.Dropdown__control{position:relative;display:inline-block;font-family:Verdana,sans-serif;font-size:1em;width:8.3333333333em;line-height:1.4166666667em;user-select:none}.Dropdown__arrow-button{float:right;padding-left:.35em;width:1.2em;height:1.8333333333em;border-left:.0833333333em solid #000;border-left:.0833333333em solid rgba(0,0,0,.25)}.Dropdown__menu{position:absolute;overflow-y:auto;z-index:5;width:8.3333333333em;max-height:16.6666666667em;overflow-y:scroll;border-radius:0 0 .1666666667em .1666666667em;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75)}.Dropdown__menu-noscroll{position:absolute;overflow-y:auto;z-index:5;width:8.3333333333em;max-height:16.6666666667em;border-radius:0 0 .1666666667em .1666666667em;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75)}.Dropdown__menuentry{padding:.1666666667em .3333333333em;font-family:Verdana,sans-serif;font-size:1em;line-height:1.4166666667em;transition:background-color 100ms ease-out}.Dropdown__menuentry:hover{background-color:rgba(255,255,255,.2);transition:background-color 0ms}.Dropdown__over{top:auto;bottom:100%}.Dropdown__selected-text{display:inline-block;text-overflow:ellipsis;white-space:nowrap;height:1.4166666667em;width:calc(100% - 1.2em)}.Flex{display:-ms-flexbox;display:flex}.Flex--inline{display:inline-flex}.Flex--iefix{display:block}.Flex--iefix.Flex--inline{display:inline-block}.Flex__item--iefix{display:inline-block}.Flex--iefix--column>.Flex__item--iefix{display:block}.Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.Input--fluid{display:block;width:auto}.Input__baseline{display:inline-block;color:transparent}.Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input--monospace .Input__input{font-family:"Consolas",monospace}.Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto;margin-bottom:-0.2em;cursor:n-resize}.Knob:after{content:".";color:transparent;line-height:2.5em}.Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0) 100%);border-radius:50%;box-shadow:0 .05em .5em 0 rgba(0,0,0,.5)}.Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.Knob__popupValue{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translateX(50%);white-space:nowrap}.Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.Knob__ringTrackPivot{transform:rotateZ(135deg)}.Knob__ringTrack{fill:transparent;stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.Knob__ringFillPivot{transform:rotateZ(135deg)}.Knob--bipolar .Knob__ringFillPivot{transform:rotateZ(270deg)}.Knob__ringFill{fill:transparent;stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms ease-out}.Knob--color--black .Knob__ringFill{stroke:#1a1a1a}.Knob--color--white .Knob__ringFill{stroke:#fff}.Knob--color--red .Knob__ringFill{stroke:#df3e3e}.Knob--color--orange .Knob__ringFill{stroke:#f37f33}.Knob--color--yellow .Knob__ringFill{stroke:#fbda21}.Knob--color--olive .Knob__ringFill{stroke:#cbe41c}.Knob--color--green .Knob__ringFill{stroke:#25ca4c}.Knob--color--teal .Knob__ringFill{stroke:#00d6cc}.Knob--color--blue .Knob__ringFill{stroke:#2e93de}.Knob--color--dark-blue .Knob__ringFill{stroke:#005fa7}.Knob--color--violet .Knob__ringFill{stroke:#7349cf}.Knob--color--purple .Knob__ringFill{stroke:#ad45d0}.Knob--color--pink .Knob__ringFill{stroke:#e34da1}.Knob--color--brown .Knob__ringFill{stroke:#b97447}.Knob--color--grey .Knob__ringFill{stroke:#848484}.Knob--color--light-grey .Knob__ringFill{stroke:#b3b3b3}.Knob--color--good .Knob__ringFill{stroke:#68c22d}.Knob--color--average .Knob__ringFill{stroke:#f29a29}.Knob--color--bad .Knob__ringFill{stroke:#df3e3e}.Knob--color--label .Knob__ringFill{stroke:#8b9bb0}.Knob--color--xeno .Knob__ringFill{stroke:#664573}.LabeledList{display:table;width:100%;width:calc(100% + 1em);border-collapse:collapse;border-spacing:0;margin:-0.25em -0.5em;margin-bottom:0;padding:0}.LabeledList__row{display:table-row}.LabeledList__row:last-child .LabeledList__cell{padding-bottom:0}.LabeledList__cell{display:table-cell;margin:0;padding:.25em .5em;border:0;text-align:left}.LabeledList__label--nowrap{width:1%;white-space:nowrap;min-width:5em}.LabeledList__buttons{width:.1%;white-space:nowrap;text-align:right;padding-top:.0833333333em;padding-bottom:0}.Modal{background-color:#202020;max-width:calc(100% - 1rem);padding:1rem}.NoticeBox{padding:.33em .5em;margin-bottom:.5em;box-shadow:none;font-weight:bold;font-style:italic;color:#000;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg, transparent, transparent 0.8333333333em, rgba(0, 0, 0, 0.1) 0.8333333333em, rgba(0, 0, 0, 0.1) 1.6666666667em)}.NoticeBox--color--black{color:#fff;background-color:#000}.NoticeBox--color--white{color:#000;background-color:#b3b3b3}.NoticeBox--color--red{color:#fff;background-color:#701f1f}.NoticeBox--color--orange{color:#fff;background-color:#854114}.NoticeBox--color--yellow{color:#000;background-color:#83710d}.NoticeBox--color--olive{color:#000;background-color:#576015}.NoticeBox--color--green{color:#fff;background-color:#174e24}.NoticeBox--color--teal{color:#fff;background-color:#064845}.NoticeBox--color--blue{color:#fff;background-color:#1b4565}.NoticeBox--color--dark-blue{color:#fff;background-color:#02121f}.NoticeBox--color--violet{color:#fff;background-color:#3b2864}.NoticeBox--color--purple{color:#fff;background-color:#542663}.NoticeBox--color--pink{color:#fff;background-color:#802257}.NoticeBox--color--brown{color:#fff;background-color:#4c3729}.NoticeBox--color--grey{color:#fff;background-color:#3e3e3e}.NoticeBox--color--light-grey{color:#fff;background-color:#6a6a6a}.NoticeBox--color--good{color:#fff;background-color:#2e4b1a}.NoticeBox--color--average{color:#fff;background-color:#7b4e13}.NoticeBox--color--bad{color:#fff;background-color:#701f1f}.NoticeBox--color--label{color:#fff;background-color:#53565a}.NoticeBox--color--xeno{color:#fff;background-color:#19161b}.NoticeBox--type--info{color:#fff;background-color:#235982}.NoticeBox--type--success{color:#fff;background-color:#1e662f}.NoticeBox--type--warning{color:#fff;background-color:#a95219}.NoticeBox--type--danger{color:#fff;background-color:#8f2828}.Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.Input--fluid{display:block;width:auto}.Input__baseline{display:inline-block;color:transparent}.Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input--monospace .Input__input{font-family:"Consolas",monospace}.NumberInput{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#88bfff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.NumberInput--fluid{display:block}.NumberInput__content{margin-left:.5em}.NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #88bfff;background-color:#88bfff}.NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#0a0a0a;color:#fff;text-align:right}.ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-width:.0833333333em !important;border-style:solid !important;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color 900ms ease-out}.ProgressBar__fill{position:absolute;top:-0.5px;left:0px;bottom:-0.5px}.ProgressBar__fill--animated{transition:background-color 900ms ease-out,width 900ms ease-out}.ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.ProgressBar--color--default{border:.0833333333em solid #3e6189}.ProgressBar--color--default .ProgressBar__fill{background-color:#3e6189}.ProgressBar--color--black{border-color:#000 !important}.ProgressBar--color--black .ProgressBar__fill{background-color:#000}.ProgressBar--color--white{border-color:#d9d9d9 !important}.ProgressBar--color--white .ProgressBar__fill{background-color:#d9d9d9}.ProgressBar--color--red{border-color:#bd2020 !important}.ProgressBar--color--red .ProgressBar__fill{background-color:#bd2020}.ProgressBar--color--orange{border-color:#d95e0c !important}.ProgressBar--color--orange .ProgressBar__fill{background-color:#d95e0c}.ProgressBar--color--yellow{border-color:#d9b804 !important}.ProgressBar--color--yellow .ProgressBar__fill{background-color:#d9b804}.ProgressBar--color--olive{border-color:#9aad14 !important}.ProgressBar--color--olive .ProgressBar__fill{background-color:#9aad14}.ProgressBar--color--green{border-color:#1b9638 !important}.ProgressBar--color--green .ProgressBar__fill{background-color:#1b9638}.ProgressBar--color--teal{border-color:#009a93 !important}.ProgressBar--color--teal .ProgressBar__fill{background-color:#009a93}.ProgressBar--color--blue{border-color:#1c71b1 !important}.ProgressBar--color--blue .ProgressBar__fill{background-color:#1c71b1}.ProgressBar--color--dark-blue{border-color:#003e6e !important}.ProgressBar--color--dark-blue .ProgressBar__fill{background-color:#003e6e}.ProgressBar--color--violet{border-color:#552dab !important}.ProgressBar--color--violet .ProgressBar__fill{background-color:#552dab}.ProgressBar--color--purple{border-color:#8b2baa !important}.ProgressBar--color--purple .ProgressBar__fill{background-color:#8b2baa}.ProgressBar--color--pink{border-color:#cf2082 !important}.ProgressBar--color--pink .ProgressBar__fill{background-color:#cf2082}.ProgressBar--color--brown{border-color:#8c5836 !important}.ProgressBar--color--brown .ProgressBar__fill{background-color:#8c5836}.ProgressBar--color--grey{border-color:#646464 !important}.ProgressBar--color--grey .ProgressBar__fill{background-color:#646464}.ProgressBar--color--light-grey{border-color:#919191 !important}.ProgressBar--color--light-grey .ProgressBar__fill{background-color:#919191}.ProgressBar--color--good{border-color:#4d9121 !important}.ProgressBar--color--good .ProgressBar__fill{background-color:#4d9121}.ProgressBar--color--average{border-color:#cd7a0d !important}.ProgressBar--color--average .ProgressBar__fill{background-color:#cd7a0d}.ProgressBar--color--bad{border-color:#bd2020 !important}.ProgressBar--color--bad .ProgressBar__fill{background-color:#bd2020}.ProgressBar--color--label{border-color:#657a94 !important}.ProgressBar--color--label .ProgressBar__fill{background-color:#657a94}.ProgressBar--color--xeno{border-color:#462f4e !important}.ProgressBar--color--xeno .ProgressBar__fill{background-color:#462f4e}.Section{position:relative;margin-bottom:.5em;background-color:#131313;background-color:#131313;box-sizing:border-box}.Section:last-child{margin-bottom:0}.Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #4972a1}.Section__titleText{font-size:1.1666666667em;font-weight:bold;color:#fff}.Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.Section__rest{position:relative}.Section__content{padding:.66em .5em}.Section--fitted>.Section__rest>.Section__content{padding:0}.Section--fill{display:flex;flex-direction:column;height:100%}.Section--fill>.Section__rest{flex-grow:1}.Section--fill>.Section__rest>.Section__content{height:100%}.Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.Section--fill.Section--iefix{display:table !important;width:100% !important;height:100% !important;border-collapse:collapse;border-spacing:0}.Section--fill.Section--iefix>.Section__rest{display:table-row !important;height:100% !important}.Section--scrollable{overflow-x:hidden;overflow-y:hidden}.Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:hidden;overflow-x:scroll}.Section--scrollable.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.Section--scrollable.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:scroll}.Section .Section{background-color:transparent;margin-left:-0.5em;margin-right:-0.5em}.Section .Section:first-child{margin-top:-0.5em}.Section .Section .Section__titleText{font-size:1.0833333333em}.Section .Section .Section .Section__titleText{font-size:1em}.Slider{cursor:e-resize}.Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none !important}.Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #fff}.Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid transparent;border-right:.4166666667em solid transparent;border-bottom:.4166666667em solid #fff}.Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translateX(50%);white-space:nowrap}.Divider--horizontal{margin:.5em 0}.Divider--horizontal:not(.Divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Divider--vertical{height:100%;margin:0 .5em}.Divider--vertical:not(.Divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Stack--fill{height:100%}.Stack--horizontal>.Stack__item{margin-left:.5em}.Stack--horizontal>.Stack__item:first-child{margin-left:0}.Stack--vertical>.Stack__item{margin-top:.5em}.Stack--vertical>.Stack__item:first-child{margin-top:0}.Stack--horizontal>.Stack__divider:not(.Stack__divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Stack--vertical>.Stack__divider:not(.Stack__divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Table{display:table;width:100%;border-collapse:collapse;border-spacing:0;margin:0}.Table--collapsing{width:auto}.Table__row{display:table-row}.Table__cell{display:table-cell;padding:0 .25em}.Table__cell:first-child{padding-left:0}.Table__cell:last-child{padding-right:0}.Table__row--header .Table__cell,.Table__cell--header{font-weight:bold;padding-bottom:.5em}.Table__cell--collapsing{width:1%;white-space:nowrap}.Tabs{display:flex;align-items:stretch;overflow:hidden;background-color:#131313}.Tabs--fill{height:100%}.Section .Tabs{background-color:transparent}.Section:not(.Section--fitted) .Tabs{margin:0 -0.5em .5em}.Section:not(.Section--fitted) .Tabs:first-child{margin-top:-0.5em}.Tabs--vertical{flex-direction:column;padding:.25em 0 .25em .25em}.Tabs--horizontal{margin-bottom:.5em;padding:.25em .25em 0 .25em}.Tabs--horizontal:last-child{margin-bottom:0}.Tabs__Tab{flex-grow:0}.Tabs--fluid .Tabs__Tab{flex-grow:1}.Tab{display:flex;align-items:center;justify-content:space-between;background-color:transparent;color:rgba(255,255,255,.5);min-height:2.25em;min-width:4em}.Tab:not(.Tab--selected):hover{background-color:rgba(255,255,255,.075)}.Tab--selected{background-color:rgba(255,255,255,.125);color:#dfe7f0}.Tab__text{flex-grow:1;margin:0 .5em}.Tab__left{min-width:1.5em;text-align:center;margin-left:.25em}.Tab__right{min-width:1.5em;text-align:center;margin-right:.25em}.Tabs--horizontal .Tab{border-top:.1666666667em solid transparent;border-bottom:.1666666667em solid transparent;border-top-left-radius:.25em;border-top-right-radius:.25em}.Tabs--horizontal .Tab--selected{border-bottom:.1666666667em solid #d4dfec}.Tabs--vertical .Tab{min-height:2em;border-left:.1666666667em solid transparent;border-right:.1666666667em solid transparent;border-top-left-radius:.25em;border-bottom-left-radius:.25em}.Tabs--vertical .Tab--selected{border-right:.1666666667em solid #d4dfec}.Tab--selected.Tab--color--black{color:#535353}.Tabs--horizontal .Tab--selected.Tab--color--black{border-bottom-color:#1a1a1a}.Tabs--vertical .Tab--selected.Tab--color--black{border-right-color:#1a1a1a}.Tab--selected.Tab--color--white{color:#fff}.Tabs--horizontal .Tab--selected.Tab--color--white{border-bottom-color:#fff}.Tabs--vertical .Tab--selected.Tab--color--white{border-right-color:#fff}.Tab--selected.Tab--color--red{color:#e76e6e}.Tabs--horizontal .Tab--selected.Tab--color--red{border-bottom-color:#df3e3e}.Tabs--vertical .Tab--selected.Tab--color--red{border-right-color:#df3e3e}.Tab--selected.Tab--color--orange{color:#f69f66}.Tabs--horizontal .Tab--selected.Tab--color--orange{border-bottom-color:#f37f33}.Tabs--vertical .Tab--selected.Tab--color--orange{border-right-color:#f37f33}.Tab--selected.Tab--color--yellow{color:#fce358}.Tabs--horizontal .Tab--selected.Tab--color--yellow{border-bottom-color:#fbda21}.Tabs--vertical .Tab--selected.Tab--color--yellow{border-right-color:#fbda21}.Tab--selected.Tab--color--olive{color:#d8eb55}.Tabs--horizontal .Tab--selected.Tab--color--olive{border-bottom-color:#cbe41c}.Tabs--vertical .Tab--selected.Tab--color--olive{border-right-color:#cbe41c}.Tab--selected.Tab--color--green{color:#53e074}.Tabs--horizontal .Tab--selected.Tab--color--green{border-bottom-color:#25ca4c}.Tabs--vertical .Tab--selected.Tab--color--green{border-right-color:#25ca4c}.Tab--selected.Tab--color--teal{color:#21fff5}.Tabs--horizontal .Tab--selected.Tab--color--teal{border-bottom-color:#00d6cc}.Tabs--vertical .Tab--selected.Tab--color--teal{border-right-color:#00d6cc}.Tab--selected.Tab--color--blue{color:#62aee6}.Tabs--horizontal .Tab--selected.Tab--color--blue{border-bottom-color:#2e93de}.Tabs--vertical .Tab--selected.Tab--color--blue{border-right-color:#2e93de}.Tab--selected.Tab--color--dark-blue{color:#008ffd}.Tabs--horizontal .Tab--selected.Tab--color--dark-blue{border-bottom-color:#005fa7}.Tabs--vertical .Tab--selected.Tab--color--dark-blue{border-right-color:#005fa7}.Tab--selected.Tab--color--violet{color:#9676db}.Tabs--horizontal .Tab--selected.Tab--color--violet{border-bottom-color:#7349cf}.Tabs--vertical .Tab--selected.Tab--color--violet{border-right-color:#7349cf}.Tab--selected.Tab--color--purple{color:#c274db}.Tabs--horizontal .Tab--selected.Tab--color--purple{border-bottom-color:#ad45d0}.Tabs--vertical .Tab--selected.Tab--color--purple{border-right-color:#ad45d0}.Tab--selected.Tab--color--pink{color:#ea79b9}.Tabs--horizontal .Tab--selected.Tab--color--pink{border-bottom-color:#e34da1}.Tabs--vertical .Tab--selected.Tab--color--pink{border-right-color:#e34da1}.Tab--selected.Tab--color--brown{color:#ca9775}.Tabs--horizontal .Tab--selected.Tab--color--brown{border-bottom-color:#b97447}.Tabs--vertical .Tab--selected.Tab--color--brown{border-right-color:#b97447}.Tab--selected.Tab--color--grey{color:#a3a3a3}.Tabs--horizontal .Tab--selected.Tab--color--grey{border-bottom-color:#848484}.Tabs--vertical .Tab--selected.Tab--color--grey{border-right-color:#848484}.Tab--selected.Tab--color--light-grey{color:#c6c6c6}.Tabs--horizontal .Tab--selected.Tab--color--light-grey{border-bottom-color:#b3b3b3}.Tabs--vertical .Tab--selected.Tab--color--light-grey{border-right-color:#b3b3b3}.Tab--selected.Tab--color--good{color:#8cd95a}.Tabs--horizontal .Tab--selected.Tab--color--good{border-bottom-color:#68c22d}.Tabs--vertical .Tab--selected.Tab--color--good{border-right-color:#68c22d}.Tab--selected.Tab--color--average{color:#f5b35e}.Tabs--horizontal .Tab--selected.Tab--color--average{border-bottom-color:#f29a29}.Tabs--vertical .Tab--selected.Tab--color--average{border-right-color:#f29a29}.Tab--selected.Tab--color--bad{color:#e76e6e}.Tabs--horizontal .Tab--selected.Tab--color--bad{border-bottom-color:#df3e3e}.Tabs--vertical .Tab--selected.Tab--color--bad{border-right-color:#df3e3e}.Tab--selected.Tab--color--label{color:#a8b4c4}.Tabs--horizontal .Tab--selected.Tab--color--label{border-bottom-color:#8b9bb0}.Tabs--vertical .Tab--selected.Tab--color--label{border-right-color:#8b9bb0}.Tab--selected.Tab--color--xeno{color:#9366a3}.Tabs--horizontal .Tab--selected.Tab--color--xeno{border-bottom-color:#664573}.Tabs--vertical .Tab--selected.Tab--color--xeno{border-right-color:#664573}.Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.Input--fluid{display:block;width:auto}.Input__baseline{display:inline-block;color:transparent}.Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input--monospace .Input__input{font-family:"Consolas",monospace}.TextArea{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;background-color:#0a0a0a;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.TextArea--fluid{display:block;width:auto;height:auto}.TextArea--noborder{border:0px}.TextArea__textarea.TextArea__textarea--scrollable{overflow:auto;overflow-x:hidden;overflow-y:scroll}.TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:transparent;color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.TextArea__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.TextArea__textarea_custom{overflow:visible;white-space:pre-wrap}.Tooltip{z-index:2;padding:.5em .75em;pointer-events:none;text-align:left;transition:opacity 150ms ease-out;background-color:#000;color:#fff;box-shadow:.1em .1em 1.25em -0.1em rgba(0,0,0,.5);border-radius:.16em;max-width:20.8333333333em}.Chat{color:#abc6ec}.Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:crimson;border-radius:10px;transition:font-size 200ms ease-out}.Chat__badge:before{content:"x"}.Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.Chat__scrollButton{position:fixed;right:2em;bottom:1em}.Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#db2828;background-color:#131313}.Chat__reconnected:after{content:"";display:block;margin-top:-0.75em;border-bottom:.1666666667em solid #db2828}.Chat__highlight{color:#000}.Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:bold}.ChatMessage{word-wrap:break-word}.ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.Ping{position:relative;padding:.125em .25em;border:.0833333333em solid rgba(140,140,140,.5);border-radius:.25em;width:3.75em;text-align:right}.Ping__indicator{content:"";position:absolute;top:.5em;left:.5em;width:.5em;height:.5em;background-color:#888;border-radius:.25em}.Notifications{position:absolute;bottom:1em;left:1em;right:2em}.Notification{color:#fff;background-color:crimson;padding:.5em;margin:1em 0}.Notification:first-child{margin-top:0}.Notification:last-child{margin-bottom:0}.Layout,.Layout *{scrollbar-base-color:#181818;scrollbar-face-color:#363636;scrollbar-3dlight-color:#202020;scrollbar-highlight-color:#202020;scrollbar-track-color:#181818;scrollbar-arrow-color:#909090;scrollbar-shadow-color:#363636}.Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#202020;background-image:linear-gradient(to bottom, #202020 0%, #202020 100%)}.Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.Window__contentPadding:after{height:0}.Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(56,56,56,.25);pointer-events:none}.Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}em{font-style:normal;font-weight:bold}img{margin:0;padding:0;line-height:1;-ms-interpolation-mode:nearest-neighbor;image-rendering:pixelated}img.icon{height:1em;min-height:16px;width:auto;vertical-align:bottom}a{color:#397ea5}a.visited{color:#7c00e6}a:visited{color:#7c00e6}a.popt{text-decoration:none}.popup{position:fixed;top:50%;left:50%;background:#ddd}.popup .close{position:absolute;background:#aaa;top:0;right:0;color:#333;text-decoration:none;z-index:2;padding:0 10px;height:30px;line-height:30px}.popup .close:hover{background:#999}.popup .head{background:#999;color:#ddd;padding:0 10px;height:30px;line-height:30px;text-transform:uppercase;font-size:.9em;font-weight:bold;border-bottom:2px solid green}.popup input{border:1px solid #999;background:#fff;margin:0;padding:5px;outline:none;color:#333}.popup input[type=text]:hover,.popup input[type=text]:active,.popup input[type=text]:focus{border-color:green}.popup input[type=submit]{padding:5px 10px;background:#999;color:#ddd;text-transform:uppercase;font-size:.9em;font-weight:bold}.popup input[type=submit]:hover,.popup input[type=submit]:focus,.popup input[type=submit]:active{background:#aaa;cursor:pointer}.changeFont{padding:10px}.changeFont a{display:block;text-decoration:none;padding:3px;color:#333}.changeFont a:hover{background:#ccc}.highlightPopup{padding:10px;text-align:center}.highlightPopup input[type=text]{display:block;width:215px;text-align:left;margin-top:5px}.highlightPopup input.highlightColor{background-color:#ff0}.highlightPopup input.highlightTermSubmit{margin-top:5px}.contextMenu{background-color:#ddd;position:fixed;margin:2px;width:150px}.contextMenu a{display:block;padding:2px 5px;text-decoration:none;color:#333}.contextMenu a:hover{background-color:#ccc}.filterMessages{padding:5px}.filterMessages div{padding:2px 0}.icon-stack{height:1em;line-height:1em;width:1em;vertical-align:middle;margin-top:-2px}.motd{color:#a4bad6;font-family:Verdana,sans-serif;white-space:normal}.motd h1,.motd h2,.motd h3,.motd h4,.motd h5,.motd h6{color:#a4bad6;text-decoration:underline}.motd a,.motd a:link,.motd a:visited,.motd a:active,.motd a:hover{color:#a4bad6}.bold,.name,.prefix,.ooc,.looc,.adminooc,.admin,.medal,.yell{font-weight:bold}.italic,.italics{font-style:italic}.highlight{background:#ff0}h1,h2,h3,h4,h5,h6{color:#a4bad6;font-family:Georgia,Verdana,sans-serif}h1.alert,h2.alert{color:#a4bad6}em{font-style:normal;font-weight:bold}.ooc{font-weight:bold}.adminobserverooc{color:#09c;font-weight:bold}.adminooc{color:#3d5bc3;font-weight:bold}.adminsay{color:#9611d4;font-weight:bold}.admin{color:#5975da;font-weight:bold}.name{font-weight:bold}.deadsay{color:#e2c1ff}.binarysay{color:#1e90ff}.binarysay a{color:lime}.binarysay a:active,.binarysay a:visited{color:#8f8}.radio{color:#1ecc43}.sciradio{color:#c68cfa}.comradio{color:#fcdf03}.secradio{color:#dd3535}.medradio{color:#57b8f0}.engradio{color:#f37746}.suppradio{color:#b88646}.servradio{color:#6ca729}.syndradio{color:#8f4a4b}.gangradio{color:#ac2ea1}.centcomradio{color:#2681a5}.aiprivradio{color:#d65d95}.redteamradio{color:#f44}.blueteamradio{color:#3434fd}.greenteamradio{color:#34fd34}.yellowteamradio{color:#fdfd34}.yell{font-weight:bold}.alert{color:#d82020}.userdanger{color:#c51e1e;font-weight:bold;font-size:185%}.bolddanger{color:#c51e1e;font-weight:bold}.danger{color:#c51e1e}.warning{color:#c51e1e;font-style:italic}.alertwarning{color:red;font-weight:bold}.boldwarning{color:#c51e1e;font-style:italic;font-weight:bold}.announce{color:#c51e1e;font-weight:bold}.boldannounce{color:#c51e1e;font-weight:bold}.minorannounce{font-weight:bold;font-size:185%}.greenannounce{color:#059223;font-weight:bold}.rose{color:#ff5050}.info{color:#9ab0ff}.notice{color:#6685f5}.staff_ic{color:#6685f5}.tinynotice{color:#6685f5;font-size:85%}.tinynoticeital{color:#6685f5;font-style:italic;font-size:85%}.smallnotice{color:#6685f5;font-size:90%}.smallnoticeital{color:#6685f5;font-style:italic;font-size:90%}.boldnotice{color:#6685f5;font-weight:bold}.hear{color:#6685f5;font-style:italic}.adminnotice{color:#6685f5}.adminhelp{color:red;font-weight:bold}.unconscious{color:#a4bad6;font-weight:bold}.suicide{color:#ff5050;font-style:italic}.green{color:#059223}.grey{color:#838383}.red{color:red}.blue{color:#215cff}.nicegreen{color:#059223}.boldnicegreen{color:#059223;font-weight:bold}.cult{color:#973e3b}.cultitalic{color:#973e3b;font-style:italic}.cultbold{color:#973e3b;font-style:italic;font-weight:bold}.cultboldtalic{color:#973e3b;font-weight:bold;font-size:185%}.cultlarge{color:#973e3b;font-weight:bold;font-size:185%}.narsie{color:#973e3b;font-weight:bold;font-size:925%}.narsiesmall{color:#973e3b;font-weight:bold;font-size:370%}.colossus{color:#7f282a;font-size:310%}.hierophant{color:#b441ee;font-weight:bold;font-style:italic}.hierophant_warning{color:#c56bf1;font-style:italic}.purple{color:#9956d3}.holoparasite{color:#88809c}.revennotice{color:#c099e2}.revenboldnotice{color:#c099e2;font-weight:bold}.revenbignotice{color:#c099e2;font-weight:bold;font-size:185%}.revenminor{color:#823abb}.revenwarning{color:#760fbb;font-style:italic}.revendanger{color:#760fbb;font-weight:bold;font-size:185%}.deconversion_message{color:#a947ff;font-size:185%;font-style:italic}.ghostalert{color:#60f;font-style:italic;font-weight:bold}.alien{color:#855d85}.noticealien{color:#059223}.alertalien{color:#059223;font-weight:bold}.changeling{color:#059223;font-style:italic}.alertsyndie{color:red;font-size:185%;font-weight:bold}.spider{color:#80f;font-weight:bold;font-size:185%}.interface{color:#750e75}.sans{font-family:"Comic Sans MS",cursive,sans-serif}.papyrus{font-family:"Papyrus",cursive,sans-serif}.robot{font-family:"Courier New",cursive,sans-serif}.tape_recorder{color:red;font-family:"Courier New",cursive,sans-serif}.command_headset{font-weight:bold;font-size:160%}.small{font-size:60%}.big{font-size:185%}.reallybig{font-size:245%}.extremelybig{font-size:310%}.greentext{color:#059223;font-size:185%}.redtext{color:#c51e1e;font-size:185%}.clown{color:#ff70c1;font-size:160%;font-family:"Comic Sans MS",cursive,sans-serif;font-weight:bold}.singing{font-family:"Trebuchet MS",cursive,sans-serif;font-style:italic}.his_grace{color:#15d512;font-family:"Courier New",cursive,sans-serif;font-style:italic}.hypnophrase{color:#202020;font-weight:bold;animation:hypnocolor 1500ms infinite;animation-direction:alternate}@keyframes hypnocolor{0%{color:#202020}25%{color:#4b02ac}50%{color:#9f41f1}75%{color:#541c9c}100%{color:#7adbf3}}.phobia{color:#d00;font-weight:bold;animation:phobia 750ms infinite}@keyframes phobia{0%{color:#f75a5a}50%{color:#d00}100%{color:#f75a5a}}.icon{height:1em;width:auto}.bigicon{font-size:2.5em}.memo{color:#638500;text-align:center}.memoedit{text-align:center;font-size:125%}.abductor{color:#c204c2;font-style:italic}.mind_control{color:#df3da9;font-size:100%;font-weight:bold;font-style:italic}.slime{color:#00ced1}.drone{color:#848482}.monkey{color:#975032}.swarmer{color:#2c75ff}.resonate{color:#298f85}.monkeyhive{color:#a56408}.monkeylead{color:#af6805;font-size:80%}.connectionClosed,.fatalError{background:red;color:#fff;padding:5px}.connectionClosed.restored{background:green}.internal.boldnshit{color:#3d5bc3;font-weight:bold}.text-normal{font-weight:normal;font-style:normal}.hidden{display:none;visibility:hidden}.ml-1{margin-left:1em}.ml-2{margin-left:2em}.ml-3{margin-left:3em}.xooc{color:#ac04e9;font-weight:bold;font-size:140%}.mooc{color:#090;font-weight:bold;font-size:140%}.yooc{color:#999600;font-weight:bold;font-size:140%}.headminsay{color:#653d78;font-weight:bold}.radio{color:#b4b4b4}.deptradio{color:#939}.comradio{color:#779cc2}.centradio{color:#5c5c8a}.hcradio{color:#318779}.pvstradio{color:#9b0612}.cryoradio{color:#ad6d48}.airadio{color:#f0f}.secradio{color:#a52929}.engradio{color:#a66300}.sentryradio{color:#844300}.sentryradio{color:#844300}.medradio{color:#008160}.supradio{color:#ba8e41}.jtacradio{color:#ad3b98}.intelradio{color:#027d02}.wyradio{color:#fe9b24}.pmcradio{color:#4dc5ce}.vairadio{color:#e3580e}.rmcradio{color:#e3580e}.cmbradio{color:#1b748c}.clfradio{color:#8e83ca}.alpharadio{color:#db2626}.bravoradio{color:#c68610}.charlieradio{color:#a5a}.deltaradio{color:#007fcf}.echoradio{color:#3eb489}.medium{font-size:110%}.big{font-size:115%}.large{font-size:125%}.extra_large{font-size:130%}.huge{font-size:150%}.underline{text-decoration:underline}.orange{color:#eca100}.normal{font-style:normal}.attack{color:#ff3838}.moderate{color:#c00}.disarm{color:#900}.passive{color:#600}.helpful{color:#368f31}.scanner{color:#ff3838}.scannerb{color:#ff3838;font-weight:bold}.scannerburn{color:orange}.scannerburnb{color:orange;font-weight:bold}.rose{color:#ff5050}.debuginfo{color:#493d26;font-style:italic}.xenonotice{color:#51a16c}.xenoboldnotice{color:#51a16c;font-style:italic}.xenowarning{color:#51a16c;font-style:italic}.xenominorwarning{color:#51a16c;font-weight:bold;font-style:italic}.xenodanger{color:#51a16c;font-weight:bold}.avoidharm{color:#72a0e5;font-weight:bold}.highdanger{color:#ff3838;font-weight:bold;font-size:140%}.xenohighdanger{color:#51a16c;font-weight:bold;font-size:140%}.xenoannounce{color:#65c585;font-family:book-antiqua;font-weight:bold;font-size:140%}.yautjabold{color:purple;font-weight:bold}.yautjaboldbig{color:purple;font-weight:bold;font-size:120%}.objectivebig{font-weight:bold;font-size:130%}.objectivegreen{color:lime}.objectivered{color:red}.objectivesuccess{color:lime;font-weight:bold;font-size:110%}.objectivefail{color:red;font-weight:bold;font-size:110%}.xenotalk,.xeno{color:#c048c0;font-style:italic}.xenoleader{color:#996e99;font-style:italic;font-size:125%}.xenoqueen{color:#996e99;font-style:italic;font-weight:bold;font-size:125%}.newscaster{color:maroon}.role_header{color:#e92d2d;text-align:center;font-weight:bold;font-size:140%;padding:0em 1em}.role_body{color:#3a3ae9;text-align:justify;font-size:110%;padding:0em 1em}.round_header{color:#e92d2d;display:block;text-align:center;font-family:courier;font-weight:bold;font-size:180%}.round_body{color:#c5c5c5;display:block;text-align:center;font-family:trebuchet-ms;font-weight:bold;font-size:125%}.event_announcement{color:#600d48;font-family:arial-narrow;font-weight:bold;font-size:125%}.announce_header{color:#cecece;font-weight:bold;font-size:150%}.announce_header_blue{color:#7575f3;font-weight:bold;font-size:150%}.announce_header_admin{color:#7575f3;font-weight:bold;font-size:150%}.announce_body{color:#e92d2d;font-weight:normal;font-size:125%}.centerbold{display:block;text-align:center;font-weight:bold}.mod{color:#917455;font-weight:bold}.modooc{color:#184880;font-weight:bold}.adminmod{color:#7c440c;font-weight:bold}.mentorsay{color:#d4af57;font-weight:bold}.mentorhelp{color:#090;font-weight:bold}.mentorbody{color:#da6200;font-weight:bold}.mentorstaff{color:#b5850d;font-weight:bold}.staffsay{color:#b5850d;font-weight:bold}.tajaran{color:#803b56}.tajaran_signlang{color:#941c1c}.skrell{color:#00ced1}.soghun{color:#228b22}.changeling{color:purple}.vox{color:#a0a}.monkey{color:#966c47}.german{color:#858f1e;font-family:"Times New Roman",Times,serif}.spanish{color:#cf982b}.japanese{color:#940927}.chinese{color:#fe1919}.zombie{color:#2dacb1;font-style:italic}.rough{font-family:trebuchet-ms,cursive,sans-serif}.commando{color:#fe9b24;font-style:bold}.say_quote{font-family:Georgia,Verdana,sans-serif}.admin .message{color:#314cad}.admin .prefix{font-weight:bolder}.pm{font-size:110%}.deadsay{color:#8b4dff}.retro_translator{font-weight:bold}.yautja_translator{color:#a00;font-weight:bold;animation:glitch .5s infinite}@keyframes glitch{25%{color:#a00;transform:translate(-2px, -1px)}50%{color:#be0000;transform:translate(1px, -2px)}75%{color:#8d0000;transform:translate(-1px, 2px)}100%{color:#830000;transform:translate(1px, 1px)}}.examine_block{background:#1b1c1e;border:1px solid #a4bad6;margin:.5em;padding:.5em .75em}.examine_block .icon{width:1.5em;height:1.5em;margin:0;padding:0}.tooltip{font-style:italic;border-bottom:1px dashed #fff} +.theme-light .color-black{color:#000 !important}.theme-light .color-white{color:#e6e6e6 !important}.theme-light .color-red{color:#c82121 !important}.theme-light .color-orange{color:#e6630d !important}.theme-light .color-yellow{color:#e5c304 !important}.theme-light .color-olive{color:#a3b816 !important}.theme-light .color-green{color:#1d9f3b !important}.theme-light .color-teal{color:#00a39c !important}.theme-light .color-blue{color:#1e78bb !important}.theme-light .color-dark-blue{color:#004274 !important}.theme-light .color-violet{color:#5a30b5 !important}.theme-light .color-purple{color:#932eb4 !important}.theme-light .color-pink{color:#db228a !important}.theme-light .color-brown{color:#955d39 !important}.theme-light .color-grey{color:#e6e6e6 !important}.theme-light .color-light-grey{color:#999 !important}.theme-light .color-good{color:#529923 !important}.theme-light .color-average{color:#da810e !important}.theme-light .color-bad{color:#c82121 !important}.theme-light .color-label{color:#353535 !important}.theme-light .color-xeno{color:#4a3253 !important}.theme-light .color-bg-black{background-color:#000 !important}.theme-light .color-bg-white{background-color:#bfbfbf !important}.theme-light .color-bg-red{background-color:#a61c1c !important}.theme-light .color-bg-orange{background-color:#c0530b !important}.theme-light .color-bg-yellow{background-color:#bfa303 !important}.theme-light .color-bg-olive{background-color:#889912 !important}.theme-light .color-bg-green{background-color:#188532 !important}.theme-light .color-bg-teal{background-color:#008882 !important}.theme-light .color-bg-blue{background-color:#19649c !important}.theme-light .color-bg-dark-blue{background-color:#003761 !important}.theme-light .color-bg-violet{background-color:#4b2897 !important}.theme-light .color-bg-purple{background-color:#7a2696 !important}.theme-light .color-bg-pink{background-color:#b61d73 !important}.theme-light .color-bg-brown{background-color:#7c4d2f !important}.theme-light .color-bg-grey{background-color:#bfbfbf !important}.theme-light .color-bg-light-grey{background-color:gray !important}.theme-light .color-bg-good{background-color:#44801d !important}.theme-light .color-bg-average{background-color:#b56b0b !important}.theme-light .color-bg-bad{background-color:#a61c1c !important}.theme-light .color-bg-label{background-color:#2c2c2c !important}.theme-light .color-bg-xeno{background-color:#3e2945 !important}.theme-light .Tabs{display:flex;align-items:stretch;overflow:hidden;background-color:#fff}.theme-light .Tabs--fill{height:100%}.theme-light .Section .Tabs{background-color:transparent}.theme-light .Section:not(.Section--fitted) .Tabs{margin:0 -0.5em .5em}.theme-light .Section:not(.Section--fitted) .Tabs:first-child{margin-top:-0.5em}.theme-light .Tabs--vertical{flex-direction:column;padding:.25em 0 .25em .25em}.theme-light .Tabs--horizontal{margin-bottom:.5em;padding:.25em .25em 0 .25em}.theme-light .Tabs--horizontal:last-child{margin-bottom:0}.theme-light .Tabs__Tab{flex-grow:0}.theme-light .Tabs--fluid .Tabs__Tab{flex-grow:1}.theme-light .Tab{display:flex;align-items:center;justify-content:space-between;background-color:transparent;color:rgba(0,0,0,.5);min-height:2.25em;min-width:4em}.theme-light .Tab:not(.Tab--selected):hover{background-color:rgba(255,255,255,.075)}.theme-light .Tab--selected{background-color:rgba(255,255,255,.125);color:#404040}.theme-light .Tab__text{flex-grow:1;margin:0 .5em}.theme-light .Tab__left{min-width:1.5em;text-align:center;margin-left:.25em}.theme-light .Tab__right{min-width:1.5em;text-align:center;margin-right:.25em}.theme-light .Tabs--horizontal .Tab{border-top:.1666666667em solid transparent;border-bottom:.1666666667em solid transparent;border-top-left-radius:.25em;border-top-right-radius:.25em}.theme-light .Tabs--horizontal .Tab--selected{border-bottom:.1666666667em solid #000}.theme-light .Tabs--vertical .Tab{min-height:2em;border-left:.1666666667em solid transparent;border-right:.1666666667em solid transparent;border-top-left-radius:.25em;border-bottom-left-radius:.25em}.theme-light .Tabs--vertical .Tab--selected{border-right:.1666666667em solid #000}.theme-light .Tab--selected.Tab--color--black{color:#404040}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--black{border-bottom-color:#000}.theme-light .Tabs--vertical .Tab--selected.Tab--color--black{border-right-color:#000}.theme-light .Tab--selected.Tab--color--white{color:#ececec}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--white{border-bottom-color:#e6e6e6}.theme-light .Tabs--vertical .Tab--selected.Tab--color--white{border-right-color:#e6e6e6}.theme-light .Tab--selected.Tab--color--red{color:#e14d4d}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--red{border-bottom-color:#c82121}.theme-light .Tabs--vertical .Tab--selected.Tab--color--red{border-right-color:#c82121}.theme-light .Tab--selected.Tab--color--orange{color:#f48942}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--orange{border-bottom-color:#e6630d}.theme-light .Tabs--vertical .Tab--selected.Tab--color--orange{border-right-color:#e6630d}.theme-light .Tab--selected.Tab--color--yellow{color:#fcdd33}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--yellow{border-bottom-color:#e5c304}.theme-light .Tabs--vertical .Tab--selected.Tab--color--yellow{border-right-color:#e5c304}.theme-light .Tab--selected.Tab--color--olive{color:#d0e732}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--olive{border-bottom-color:#a3b816}.theme-light .Tabs--vertical .Tab--selected.Tab--color--olive{border-right-color:#a3b816}.theme-light .Tab--selected.Tab--color--green{color:#33da5a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--green{border-bottom-color:#1d9f3b}.theme-light .Tabs--vertical .Tab--selected.Tab--color--green{border-right-color:#1d9f3b}.theme-light .Tab--selected.Tab--color--teal{color:#00faef}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--teal{border-bottom-color:#00a39c}.theme-light .Tabs--vertical .Tab--selected.Tab--color--teal{border-right-color:#00a39c}.theme-light .Tab--selected.Tab--color--blue{color:#419ce1}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--blue{border-bottom-color:#1e78bb}.theme-light .Tabs--vertical .Tab--selected.Tab--color--blue{border-right-color:#1e78bb}.theme-light .Tab--selected.Tab--color--dark-blue{color:#0079d7}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--dark-blue{border-bottom-color:#004274}.theme-light .Tabs--vertical .Tab--selected.Tab--color--dark-blue{border-right-color:#004274}.theme-light .Tab--selected.Tab--color--violet{color:#7f58d3}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--violet{border-bottom-color:#5a30b5}.theme-light .Tabs--vertical .Tab--selected.Tab--color--violet{border-right-color:#5a30b5}.theme-light .Tab--selected.Tab--color--purple{color:#b455d4}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--purple{border-bottom-color:#932eb4}.theme-light .Tabs--vertical .Tab--selected.Tab--color--purple{border-right-color:#932eb4}.theme-light .Tab--selected.Tab--color--pink{color:#e558a7}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--pink{border-bottom-color:#db228a}.theme-light .Tabs--vertical .Tab--selected.Tab--color--pink{border-right-color:#db228a}.theme-light .Tab--selected.Tab--color--brown{color:#c0825a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--brown{border-bottom-color:#955d39}.theme-light .Tabs--vertical .Tab--selected.Tab--color--brown{border-right-color:#955d39}.theme-light .Tab--selected.Tab--color--grey{color:#ececec}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--grey{border-bottom-color:#e6e6e6}.theme-light .Tabs--vertical .Tab--selected.Tab--color--grey{border-right-color:#e6e6e6}.theme-light .Tab--selected.Tab--color--light-grey{color:#b3b3b3}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--light-grey{border-bottom-color:#999}.theme-light .Tabs--vertical .Tab--selected.Tab--color--light-grey{border-right-color:#999}.theme-light .Tab--selected.Tab--color--good{color:#77d23b}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--good{border-bottom-color:#529923}.theme-light .Tabs--vertical .Tab--selected.Tab--color--good{border-right-color:#529923}.theme-light .Tab--selected.Tab--color--average{color:#f3a23a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--average{border-bottom-color:#da810e}.theme-light .Tabs--vertical .Tab--selected.Tab--color--average{border-right-color:#da810e}.theme-light .Tab--selected.Tab--color--bad{color:#e14d4d}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--bad{border-bottom-color:#c82121}.theme-light .Tabs--vertical .Tab--selected.Tab--color--bad{border-right-color:#c82121}.theme-light .Tab--selected.Tab--color--label{color:#686868}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--label{border-bottom-color:#353535}.theme-light .Tabs--vertical .Tab--selected.Tab--color--label{border-right-color:#353535}.theme-light .Tab--selected.Tab--color--xeno{color:#7e558e}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--xeno{border-bottom-color:#4a3253}.theme-light .Tabs--vertical .Tab--selected.Tab--color--xeno{border-right-color:#4a3253}.theme-light .Section{position:relative;margin-bottom:.5em;background-color:#fff;background-color:#fff;box-sizing:border-box}.theme-light .Section:last-child{margin-bottom:0}.theme-light .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #fff}.theme-light .Section__titleText{font-size:1.1666666667em;font-weight:bold;color:#000}.theme-light .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-light .Section__rest{position:relative}.theme-light .Section__content{padding:.66em .5em}.theme-light .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-light .Section--fill{display:flex;flex-direction:column;height:100%}.theme-light .Section--fill>.Section__rest{flex-grow:1}.theme-light .Section--fill>.Section__rest>.Section__content{height:100%}.theme-light .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-light .Section--fill.Section--iefix{display:table !important;width:100% !important;height:100% !important;border-collapse:collapse;border-spacing:0}.theme-light .Section--fill.Section--iefix>.Section__rest{display:table-row !important;height:100% !important}.theme-light .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-light .Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.theme-light .Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.theme-light .Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:hidden;overflow-x:scroll}.theme-light .Section--scrollable.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.theme-light .Section--scrollable.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:scroll}.theme-light .Section .Section{background-color:transparent;margin-left:-0.5em;margin-right:-0.5em}.theme-light .Section .Section:first-child{margin-top:-0.5em}.theme-light .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-light .Section .Section .Section .Section__titleText{font-size:1em}.theme-light .Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.theme-light .Button:last-child{margin-right:0;margin-bottom:0}.theme-light .Button .fa,.theme-light .Button .fas,.theme-light .Button .far{margin-left:-0.25em;margin-right:-0.25em;min-width:1.333em;text-align:center}.theme-light .Button--hasContent .fa,.theme-light .Button--hasContent .fas,.theme-light .Button--hasContent .far{margin-right:.25em}.theme-light .Button--hasContent.Button--iconPosition--right .fa,.theme-light .Button--hasContent.Button--iconPosition--right .fas,.theme-light .Button--hasContent.Button--iconPosition--right .far{margin-right:0px;margin-left:3px}.theme-light .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-light .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-light .Button--circular{border-radius:50%}.theme-light .Button--compact{padding:0 .25em;line-height:1.333em}.theme-light .Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.theme-light .Button--color--black:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--black:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--black:hover,.theme-light .Button--color--black:focus{background-color:#131313;color:#fff}.theme-light .Button--color--white{transition:color 50ms,background-color 50ms;background-color:#bfbfbf;color:#000}.theme-light .Button--color--white:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--white:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--white:hover,.theme-light .Button--color--white:focus{background-color:#efefef;color:#000}.theme-light .Button--color--red{transition:color 50ms,background-color 50ms;background-color:#a61c1c;color:#fff}.theme-light .Button--color--red:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--red:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--red:hover,.theme-light .Button--color--red:focus{background-color:#d23333;color:#fff}.theme-light .Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#c0530b;color:#fff}.theme-light .Button--color--orange:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--orange:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--orange:hover,.theme-light .Button--color--orange:focus{background-color:#ea7426;color:#fff}.theme-light .Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#bfa303;color:#fff}.theme-light .Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--yellow:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--yellow:hover,.theme-light .Button--color--yellow:focus{background-color:#efce17;color:#fff}.theme-light .Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#889912;color:#fff}.theme-light .Button--color--olive:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--olive:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--olive:hover,.theme-light .Button--color--olive:focus{background-color:#afc328;color:#fff}.theme-light .Button--color--green{transition:color 50ms,background-color 50ms;background-color:#188532;color:#fff}.theme-light .Button--color--green:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--green:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--green:hover,.theme-light .Button--color--green:focus{background-color:#2fac4c;color:#fff}.theme-light .Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#008882;color:#fff}.theme-light .Button--color--teal:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--teal:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--teal:hover,.theme-light .Button--color--teal:focus{background-color:#13afa9;color:#fff}.theme-light .Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#19649c;color:#fff}.theme-light .Button--color--blue:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--blue:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--blue:hover,.theme-light .Button--color--blue:focus{background-color:#3086c7;color:#fff}.theme-light .Button--color--dark-blue{transition:color 50ms,background-color 50ms;background-color:#003761;color:#fff}.theme-light .Button--color--dark-blue:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--dark-blue:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--dark-blue:hover,.theme-light .Button--color--dark-blue:focus{background-color:#135283;color:#fff}.theme-light .Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#4b2897;color:#fff}.theme-light .Button--color--violet:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--violet:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--violet:hover,.theme-light .Button--color--violet:focus{background-color:#6a41c1;color:#fff}.theme-light .Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#7a2696;color:#fff}.theme-light .Button--color--purple:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--purple:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--purple:hover,.theme-light .Button--color--purple:focus{background-color:#a03fc0;color:#fff}.theme-light .Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#b61d73;color:#fff}.theme-light .Button--color--pink:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--pink:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--pink:hover,.theme-light .Button--color--pink:focus{background-color:#da3f96;color:#fff}.theme-light .Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#7c4d2f;color:#fff}.theme-light .Button--color--brown:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--brown:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--brown:hover,.theme-light .Button--color--brown:focus{background-color:#a26c49;color:#fff}.theme-light .Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#bfbfbf;color:#000}.theme-light .Button--color--grey:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--grey:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--grey:hover,.theme-light .Button--color--grey:focus{background-color:#efefef;color:#000}.theme-light .Button--color--light-grey{transition:color 50ms,background-color 50ms;background-color:gray;color:#fff}.theme-light .Button--color--light-grey:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--light-grey:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--light-grey:hover,.theme-light .Button--color--light-grey:focus{background-color:#a6a6a6;color:#fff}.theme-light .Button--color--good{transition:color 50ms,background-color 50ms;background-color:#44801d;color:#fff}.theme-light .Button--color--good:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--good:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--good:hover,.theme-light .Button--color--good:focus{background-color:#62a635;color:#fff}.theme-light .Button--color--average{transition:color 50ms,background-color 50ms;background-color:#b56b0b;color:#fff}.theme-light .Button--color--average:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--average:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--average:hover,.theme-light .Button--color--average:focus{background-color:#e48f20;color:#fff}.theme-light .Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#a61c1c;color:#fff}.theme-light .Button--color--bad:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--bad:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--bad:hover,.theme-light .Button--color--bad:focus{background-color:#d23333;color:#fff}.theme-light .Button--color--label{transition:color 50ms,background-color 50ms;background-color:#2c2c2c;color:#fff}.theme-light .Button--color--label:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--label:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--label:hover,.theme-light .Button--color--label:focus{background-color:#464646;color:#fff}.theme-light .Button--color--xeno{transition:color 50ms,background-color 50ms;background-color:#3e2945;color:#fff}.theme-light .Button--color--xeno:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--xeno:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--xeno:hover,.theme-light .Button--color--xeno:focus{background-color:#5a4363;color:#fff}.theme-light .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#bbb;color:#000}.theme-light .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--default:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--default:hover,.theme-light .Button--color--default:focus{background-color:#eaeaea;color:#000}.theme-light .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#be6209;color:#fff}.theme-light .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--caution:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--caution:hover,.theme-light .Button--color--caution:focus{background-color:#ec8420;color:#fff}.theme-light .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#9a9d00;color:#fff}.theme-light .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--danger:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--danger:hover,.theme-light .Button--color--danger:focus{background-color:#c4c813;color:#fff}.theme-light .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#eee;color:#000;background-color:rgba(238,238,238,0);color:rgba(0,0,0,.5)}.theme-light .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--transparent:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--transparent:hover,.theme-light .Button--color--transparent:focus{background-color:#fcfcfc;color:#000}.theme-light .Button--disabled{background-color:#363636 !important}.theme-light .Button--selected{transition:color 50ms,background-color 50ms;background-color:#0668b8;color:#fff}.theme-light .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--selected:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--selected:hover,.theme-light .Button--selected:focus{background-color:#1a8be7;color:#fff}.theme-light .Button--flex{display:inline-flex;flex-direction:column}.theme-light .Button--flex--fluid{width:100%}.theme-light .Button--verticalAlignContent--top{justify-content:flex-start}.theme-light .Button--verticalAlignContent--middle{justify-content:center}.theme-light .Button--verticalAlignContent--bottom{justify-content:flex-end}.theme-light .Button__content{display:block;align-self:stretch}.theme-light .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#000;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-light .Input--fluid{display:block;width:auto}.theme-light .Input__baseline{display:inline-block;color:transparent}.theme-light .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#000;color:inherit}.theme-light .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .Input--monospace .Input__input{font-family:"Consolas",monospace}.theme-light .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#000;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-light .Input--fluid{display:block;width:auto}.theme-light .Input__baseline{display:inline-block;color:transparent}.theme-light .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#000;color:inherit}.theme-light .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .Input--monospace .Input__input{font-family:"Consolas",monospace}.theme-light .NumberInput{position:relative;display:inline-block;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#353535;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.theme-light .NumberInput--fluid{display:block}.theme-light .NumberInput__content{margin-left:.5em}.theme-light .NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.theme-light .NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #353535;background-color:#353535}.theme-light .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#fff;color:#000;text-align:right}.theme-light .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#000;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-light .Input--fluid{display:block;width:auto}.theme-light .Input__baseline{display:inline-block;color:transparent}.theme-light .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#000;color:inherit}.theme-light .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .Input--monospace .Input__input{font-family:"Consolas",monospace}.theme-light .TextArea{position:relative;display:inline-block;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;background-color:#fff;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.theme-light .TextArea--fluid{display:block;width:auto;height:auto}.theme-light .TextArea--noborder{border:0px}.theme-light .TextArea__textarea.TextArea__textarea--scrollable{overflow:auto;overflow-x:hidden;overflow-y:scroll}.theme-light .TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:transparent;color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.theme-light .TextArea__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .TextArea__textarea_custom{overflow:visible;white-space:pre-wrap}.theme-light .Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto;margin-bottom:-0.2em;cursor:n-resize}.theme-light .Knob:after{content:".";color:transparent;line-height:2.5em}.theme-light .Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0) 100%);border-radius:50%;box-shadow:0 .05em .5em 0 rgba(0,0,0,.5)}.theme-light .Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.theme-light .Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.theme-light .Knob__popupValue{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translateX(50%);white-space:nowrap}.theme-light .Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.theme-light .Knob__ringTrackPivot{transform:rotateZ(135deg)}.theme-light .Knob__ringTrack{fill:transparent;stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.theme-light .Knob__ringFillPivot{transform:rotateZ(135deg)}.theme-light .Knob--bipolar .Knob__ringFillPivot{transform:rotateZ(270deg)}.theme-light .Knob__ringFill{fill:transparent;stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms ease-out}.theme-light .Knob--color--black .Knob__ringFill{stroke:#000}.theme-light .Knob--color--white .Knob__ringFill{stroke:#e6e6e6}.theme-light .Knob--color--red .Knob__ringFill{stroke:#c82121}.theme-light .Knob--color--orange .Knob__ringFill{stroke:#e6630d}.theme-light .Knob--color--yellow .Knob__ringFill{stroke:#e5c304}.theme-light .Knob--color--olive .Knob__ringFill{stroke:#a3b816}.theme-light .Knob--color--green .Knob__ringFill{stroke:#1d9f3b}.theme-light .Knob--color--teal .Knob__ringFill{stroke:#00a39c}.theme-light .Knob--color--blue .Knob__ringFill{stroke:#1e78bb}.theme-light .Knob--color--dark-blue .Knob__ringFill{stroke:#004274}.theme-light .Knob--color--violet .Knob__ringFill{stroke:#5a30b5}.theme-light .Knob--color--purple .Knob__ringFill{stroke:#932eb4}.theme-light .Knob--color--pink .Knob__ringFill{stroke:#db228a}.theme-light .Knob--color--brown .Knob__ringFill{stroke:#955d39}.theme-light .Knob--color--grey .Knob__ringFill{stroke:#e6e6e6}.theme-light .Knob--color--light-grey .Knob__ringFill{stroke:#999}.theme-light .Knob--color--good .Knob__ringFill{stroke:#529923}.theme-light .Knob--color--average .Knob__ringFill{stroke:#da810e}.theme-light .Knob--color--bad .Knob__ringFill{stroke:#c82121}.theme-light .Knob--color--label .Knob__ringFill{stroke:#353535}.theme-light .Knob--color--xeno .Knob__ringFill{stroke:#4a3253}.theme-light .Slider{cursor:e-resize}.theme-light .Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none !important}.theme-light .Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #000}.theme-light .Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid transparent;border-right:.4166666667em solid transparent;border-bottom:.4166666667em solid #000}.theme-light .Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translateX(50%);white-space:nowrap}.theme-light .ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-width:.0833333333em !important;border-style:solid !important;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color 900ms ease-out}.theme-light .ProgressBar__fill{position:absolute;top:-0.5px;left:0px;bottom:-0.5px}.theme-light .ProgressBar__fill--animated{transition:background-color 900ms ease-out,width 900ms ease-out}.theme-light .ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.theme-light .ProgressBar--color--default{border:.0833333333em solid #bfbfbf}.theme-light .ProgressBar--color--default .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--black{border-color:#000 !important}.theme-light .ProgressBar--color--black .ProgressBar__fill{background-color:#000}.theme-light .ProgressBar--color--white{border-color:#bfbfbf !important}.theme-light .ProgressBar--color--white .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--red{border-color:#a61c1c !important}.theme-light .ProgressBar--color--red .ProgressBar__fill{background-color:#a61c1c}.theme-light .ProgressBar--color--orange{border-color:#c0530b !important}.theme-light .ProgressBar--color--orange .ProgressBar__fill{background-color:#c0530b}.theme-light .ProgressBar--color--yellow{border-color:#bfa303 !important}.theme-light .ProgressBar--color--yellow .ProgressBar__fill{background-color:#bfa303}.theme-light .ProgressBar--color--olive{border-color:#889912 !important}.theme-light .ProgressBar--color--olive .ProgressBar__fill{background-color:#889912}.theme-light .ProgressBar--color--green{border-color:#188532 !important}.theme-light .ProgressBar--color--green .ProgressBar__fill{background-color:#188532}.theme-light .ProgressBar--color--teal{border-color:#008882 !important}.theme-light .ProgressBar--color--teal .ProgressBar__fill{background-color:#008882}.theme-light .ProgressBar--color--blue{border-color:#19649c !important}.theme-light .ProgressBar--color--blue .ProgressBar__fill{background-color:#19649c}.theme-light .ProgressBar--color--dark-blue{border-color:#003761 !important}.theme-light .ProgressBar--color--dark-blue .ProgressBar__fill{background-color:#003761}.theme-light .ProgressBar--color--violet{border-color:#4b2897 !important}.theme-light .ProgressBar--color--violet .ProgressBar__fill{background-color:#4b2897}.theme-light .ProgressBar--color--purple{border-color:#7a2696 !important}.theme-light .ProgressBar--color--purple .ProgressBar__fill{background-color:#7a2696}.theme-light .ProgressBar--color--pink{border-color:#b61d73 !important}.theme-light .ProgressBar--color--pink .ProgressBar__fill{background-color:#b61d73}.theme-light .ProgressBar--color--brown{border-color:#7c4d2f !important}.theme-light .ProgressBar--color--brown .ProgressBar__fill{background-color:#7c4d2f}.theme-light .ProgressBar--color--grey{border-color:#bfbfbf !important}.theme-light .ProgressBar--color--grey .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--light-grey{border-color:gray !important}.theme-light .ProgressBar--color--light-grey .ProgressBar__fill{background-color:gray}.theme-light .ProgressBar--color--good{border-color:#44801d !important}.theme-light .ProgressBar--color--good .ProgressBar__fill{background-color:#44801d}.theme-light .ProgressBar--color--average{border-color:#b56b0b !important}.theme-light .ProgressBar--color--average .ProgressBar__fill{background-color:#b56b0b}.theme-light .ProgressBar--color--bad{border-color:#a61c1c !important}.theme-light .ProgressBar--color--bad .ProgressBar__fill{background-color:#a61c1c}.theme-light .ProgressBar--color--label{border-color:#2c2c2c !important}.theme-light .ProgressBar--color--label .ProgressBar__fill{background-color:#2c2c2c}.theme-light .ProgressBar--color--xeno{border-color:#3e2945 !important}.theme-light .ProgressBar--color--xeno .ProgressBar__fill{background-color:#3e2945}.theme-light .Chat{color:#000}.theme-light .Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:crimson;border-radius:10px;transition:font-size 200ms ease-out}.theme-light .Chat__badge:before{content:"x"}.theme-light .Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.theme-light .Chat__scrollButton{position:fixed;right:2em;bottom:1em}.theme-light .Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.theme-light .Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#db2828;background-color:#fff}.theme-light .Chat__reconnected:after{content:"";display:block;margin-top:-0.75em;border-bottom:.1666666667em solid #db2828}.theme-light .Chat__highlight{color:#000}.theme-light .Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:bold}.theme-light .ChatMessage{word-wrap:break-word}.theme-light .ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.theme-light .ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.theme-light .Layout,.theme-light .Layout *{scrollbar-base-color:#f2f2f2;scrollbar-face-color:#d6d6d6;scrollbar-3dlight-color:#eee;scrollbar-highlight-color:#eee;scrollbar-track-color:#f2f2f2;scrollbar-arrow-color:#777;scrollbar-shadow-color:#d6d6d6}.theme-light .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-light .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-light .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#000;background-color:#eee;background-image:linear-gradient(to bottom, #eeeeee 0%, #eeeeee 100%)}.theme-light .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-light .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-light .Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.theme-light .Window__contentPadding:after{height:0}.theme-light .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-light .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(252,252,252,.25);pointer-events:none}.theme-light .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-light .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-light .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-light .TitleBar{background-color:#eee;border-bottom:1px solid rgba(0,0,0,.25);box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-light .TitleBar__clickable{color:rgba(0,0,0,.5);background-color:#eee;transition:color 250ms ease-out,background-color 250ms ease-out}.theme-light .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-light .TitleBar__title{position:absolute;display:inline-block;top:0;left:46px;left:3.8333333333rem;color:rgba(0,0,0,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap;pointer-events:none}.theme-light .TitleBar__buttons{pointer-events:initial;display:inline-block;width:100%;margin-left:10px}.theme-light .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-light .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px !important;line-height:2.6666666667rem !important}.theme-light .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-light .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-light html,.theme-light body{padding:0;margin:0;height:100%;color:#000}.theme-light body{background:#fff;font-family:Verdana,sans-serif;font-size:13px;line-height:1.2;overflow-x:hidden;overflow-y:scroll;word-wrap:break-word}.theme-light em{font-style:normal;font-weight:bold}.theme-light img{margin:0;padding:0;line-height:1;-ms-interpolation-mode:nearest-neighbor;image-rendering:pixelated}.theme-light img.icon{height:1em;min-height:16px;width:auto;vertical-align:bottom}.theme-light a{color:blue}.theme-light a.visited{color:#f0f}.theme-light a:visited{color:#f0f}.theme-light a.popt{text-decoration:none}.theme-light .popup{position:fixed;top:50%;left:50%;background:#ddd}.theme-light .popup .close{position:absolute;background:#aaa;top:0;right:0;color:#333;text-decoration:none;z-index:2;padding:0 10px;height:30px;line-height:30px}.theme-light .popup .close:hover{background:#999}.theme-light .popup .head{background:#999;color:#ddd;padding:0 10px;height:30px;line-height:30px;text-transform:uppercase;font-size:.9em;font-weight:bold;border-bottom:2px solid green}.theme-light .popup input{border:1px solid #999;background:#fff;margin:0;padding:5px;outline:none;color:#333}.theme-light .popup input[type=text]:hover,.theme-light .popup input[type=text]:active,.theme-light .popup input[type=text]:focus{border-color:green}.theme-light .popup input[type=submit]{padding:5px 10px;background:#999;color:#ddd;text-transform:uppercase;font-size:.9em;font-weight:bold}.theme-light .popup input[type=submit]:hover,.theme-light .popup input[type=submit]:focus,.theme-light .popup input[type=submit]:active{background:#aaa;cursor:pointer}.theme-light .changeFont{padding:10px}.theme-light .changeFont a{display:block;text-decoration:none;padding:3px;color:#333}.theme-light .changeFont a:hover{background:#ccc}.theme-light .highlightPopup{padding:10px;text-align:center}.theme-light .highlightPopup input[type=text]{display:block;width:215px;text-align:left;margin-top:5px}.theme-light .highlightPopup input.highlightColor{background-color:#ff0}.theme-light .highlightPopup input.highlightTermSubmit{margin-top:5px}.theme-light .contextMenu{background-color:#ddd;position:fixed;margin:2px;width:150px}.theme-light .contextMenu a{display:block;padding:2px 5px;text-decoration:none;color:#333}.theme-light .contextMenu a:hover{background-color:#ccc}.theme-light .filterMessages{padding:5px}.theme-light .filterMessages div{padding:2px 0}.theme-light .icon-stack{height:1em;line-height:1em;width:1em;vertical-align:middle;margin-top:-2px}.theme-light .motd{color:#638500;font-family:Verdana,sans-serif;white-space:normal}.theme-light .motd h1,.theme-light .motd h2,.theme-light .motd h3,.theme-light .motd h4,.theme-light .motd h5,.theme-light .motd h6{color:#638500;text-decoration:underline}.theme-light .motd a,.theme-light .motd a:link,.theme-light .motd a:visited,.theme-light .motd a:active,.theme-light .motd a:hover{color:#638500}.theme-light .bold,.theme-light .name,.theme-light .prefix,.theme-light .ooc,.theme-light .looc,.theme-light .adminooc,.theme-light .admin,.theme-light .medal,.theme-light .yell{font-weight:bold}.theme-light .italic,.theme-light .italics{font-style:italic}.theme-light .highlight{background:#ff0}.theme-light h1,.theme-light h2,.theme-light h3,.theme-light h4,.theme-light h5,.theme-light h6{color:blue;font-family:Georgia,Verdana,sans-serif}.theme-light h1.alert,.theme-light h2.alert{color:#000}.theme-light em{font-style:normal;font-weight:bold}.theme-light .ooc{font-weight:bold}.theme-light .adminobserverooc{color:#09c;font-weight:bold}.theme-light .adminooc{color:#700038;font-weight:bold}.theme-light .adminsay{color:#ff4500;font-weight:bold}.theme-light .admin{color:#4473ff;font-weight:bold}.theme-light .name{font-weight:bold}.theme-light .deadsay{color:#5c00e6}.theme-light .binarysay{color:#20c20e;background-color:#000;display:block}.theme-light .binarysay a{color:lime}.theme-light .binarysay a:active,.theme-light .binarysay a:visited{color:#8f8}.theme-light .radio{color:green}.theme-light .sciradio{color:#939}.theme-light .comradio{color:#948f02}.theme-light .secradio{color:#a30000}.theme-light .medradio{color:#337296}.theme-light .engradio{color:#fb5613}.theme-light .sentryradio{color:#844300}.theme-light .suppradio{color:#a8732b}.theme-light .servradio{color:#6eaa2c}.theme-light .syndradio{color:#6d3f40}.theme-light .gangradio{color:#ac2ea1}.theme-light .centcomradio{color:#686868}.theme-light .aiprivradio{color:#f0f}.theme-light .redteamradio{color:red}.theme-light .blueteamradio{color:blue}.theme-light .greenteamradio{color:lime}.theme-light .yellowteamradio{color:#d1ba22}.theme-light .yell{font-weight:bold}.theme-light .alert{color:red}.theme-light h1.alert,.theme-light h2.alert{color:#000}.theme-light .userdanger{color:red;font-weight:bold;font-size:185%}.theme-light .bolddanger{color:red;font-weight:bold}.theme-light .danger{color:red}.theme-light .tinydanger{color:red;font-size:85%}.theme-light .smalldanger{color:red;font-size:90%}.theme-light .warning{color:red;font-style:italic}.theme-light .alertwarning{color:red;font-weight:bold}.theme-light .boldwarning{color:red;font-style:italic;font-weight:bold}.theme-light .announce{color:#228b22;font-weight:bold}.theme-light .boldannounce{color:red;font-weight:bold}.theme-light .minorannounce{font-weight:bold;font-size:185%}.theme-light .greenannounce{color:lime;font-weight:bold}.theme-light .rose{color:#ff5050}.theme-light .info{color:#00c}.theme-light .notice{color:#009}.theme-light .staff_ic{color:#009}.theme-light .tinynotice{color:#009;font-size:85%}.theme-light .tinynoticeital{color:#009;font-style:italic;font-size:85%}.theme-light .smallnotice{color:#009;font-size:90%}.theme-light .smallnoticeital{color:#009;font-style:italic;font-size:90%}.theme-light .boldnotice{color:#009;font-weight:bold}.theme-light .hear{color:#009;font-style:italic}.theme-light .adminnotice{color:blue}.theme-light .adminhelp{color:red;font-weight:bold}.theme-light .unconscious{color:blue;font-weight:bold}.theme-light .suicide{color:#ff5050;font-style:italic}.theme-light .green{color:#03ff39}.theme-light .grey{color:#838383}.theme-light .red{color:red}.theme-light .blue{color:blue}.theme-light .nicegreen{color:#14a833}.theme-light .boldnicegreen{color:#14a833;font-weight:bold}.theme-light .cult{color:#973e3b}.theme-light .cultitalic{color:#973e3b;font-style:italic}.theme-light .cultbold{color:#973e3b;font-style:italic;font-weight:bold}.theme-light .cultboldtalic{color:#973e3b;font-weight:bold;font-size:185%}.theme-light .cultlarge{color:#973e3b;font-weight:bold;font-size:185%}.theme-light .narsie{color:#973e3b;font-weight:bold;font-size:925%}.theme-light .narsiesmall{color:#973e3b;font-weight:bold;font-size:370%}.theme-light .colossus{color:#7f282a;font-size:310%}.theme-light .hierophant{color:#609;font-weight:bold;font-style:italic}.theme-light .hierophant_warning{color:#609;font-style:italic}.theme-light .purple{color:#5e2d79}.theme-light .holoparasite{color:#35333a}.theme-light .revennotice{color:#1d2953}.theme-light .revenboldnotice{color:#1d2953;font-weight:bold}.theme-light .revenbignotice{color:#1d2953;font-weight:bold;font-size:185%}.theme-light .revenminor{color:#823abb}.theme-light .revenwarning{color:#760fbb;font-style:italic}.theme-light .revendanger{color:#760fbb;font-weight:bold;font-size:185%}.theme-light .deconversion_message{color:#5000a0;font-size:185%;font-style:italic}.theme-light .ghostalert{color:#5c00e6;font-style:italic;font-weight:bold}.theme-light .alien{color:#543354}.theme-light .noticealien{color:#00c000}.theme-light .alertalien{color:#00c000;font-weight:bold}.theme-light .changeling{color:purple;font-style:italic}.theme-light .alertsyndie{color:red;font-size:185%;font-weight:bold}.theme-light .spider{color:#4d004d;font-weight:bold;font-size:185%}.theme-light .interface{color:#303}.theme-light .sans{font-family:"Comic Sans MS",cursive,sans-serif}.theme-light .papyrus{font-family:"Papyrus",cursive,sans-serif}.theme-light .robot{font-family:"Courier New",cursive,sans-serif}.theme-light .tape_recorder{color:maroon;font-family:"Courier New",cursive,sans-serif}.theme-light .command_headset{font-weight:bold;font-size:160%}.theme-light .small{font-size:60%}.theme-light .big{font-size:185%}.theme-light .reallybig{font-size:245%}.theme-light .extremelybig{font-size:310%}.theme-light .greentext{color:lime;font-size:185%}.theme-light .redtext{color:red;font-size:185%}.theme-light .clown{color:#ff69bf;font-size:160%;font-family:"Comic Sans MS",cursive,sans-serif;font-weight:bold}.theme-light .singing{font-family:"Trebuchet MS",cursive,sans-serif;font-style:italic}.theme-light .his_grace{color:#15d512;font-family:"Courier New",cursive,sans-serif;font-style:italic}.theme-light .hypnophrase{color:#0d0d0d;font-weight:bold;animation:hypnocolor 1500ms infinite;animation-direction:alternate}@keyframes hypnocolor{0%{color:#0d0d0d}25%{color:#410194}50%{color:#7f17d8}75%{color:#410194}100%{color:#3bb5d3}}.theme-light .phobia{color:#d00;font-weight:bold;animation:phobia 750ms infinite}@keyframes phobia{0%{color:#0d0d0d}50%{color:#d00}100%{color:#0d0d0d}}.theme-light .icon{height:1em;width:auto}.theme-light .bigicon{font-size:2.5em}.theme-light .memo{color:#638500;text-align:center}.theme-light .memoedit{text-align:center;font-size:125%}.theme-light .abductor{color:purple;font-style:italic}.theme-light .mind_control{color:#a00d6f;font-size:100%;font-weight:bold;font-style:italic}.theme-light .slime{color:#00ced1}.theme-light .drone{color:#848482}.theme-light .monkey{color:#975032}.theme-light .swarmer{color:#2c75ff}.theme-light .resonate{color:#298f85}.theme-light .monkeyhive{color:#774704}.theme-light .monkeylead{color:#774704;font-size:80%}.theme-light .connectionClosed,.theme-light .fatalError{background:red;color:#fff;padding:5px}.theme-light .connectionClosed.restored{background:green}.theme-light .internal.boldnshit{color:blue;font-weight:bold}.theme-light .text-normal{font-weight:normal;font-style:normal}.theme-light .hidden{display:none;visibility:hidden}.theme-light .ml-1{margin-left:1em}.theme-light .ml-2{margin-left:2em}.theme-light .ml-3{margin-left:3em}.theme-light .xooc{color:#6c0094;font-weight:bold;font-size:140%}.theme-light .mooc{color:#090;font-weight:bold;font-size:140%}.theme-light .yooc{color:#999600;font-weight:bold;font-size:140%}.theme-light .headminsay{color:#5a0a7f;font-weight:bold}.theme-light .radio{color:#4e4e4e}.theme-light .deptradio{color:#939}.theme-light .comradio{color:#004080}.theme-light .centradio{color:#5c5c8a}.theme-light .cryoradio{color:#554e3f}.theme-light .hcradio{color:#318779}.theme-light .pvstradio{color:#9b0612}.theme-light .airadio{color:#f0f}.theme-light .secradio{color:#a30000}.theme-light .engradio{color:#a66300}.theme-light .sentryradio{color:#844300}.theme-light .medradio{color:#008160}.theme-light .supradio{color:#5f4519}.theme-light .jtacradio{color:#702963}.theme-light .intelradio{color:#027d02}.theme-light .wyradio{color:#fe9b24}.theme-light .pmcradio{color:#136957}.theme-light .vairadio{color:#943d0a}.theme-light .cmbradio{color:#1b748c}.theme-light .clfradio{color:#6f679c}.theme-light .alpharadio{color:#ea0000}.theme-light .bravoradio{color:#c68610}.theme-light .charlieradio{color:#a5a}.theme-light .deltaradio{color:#007fcf}.theme-light .echoradio{color:#3a7e65}.theme-light .medium{font-size:110%}.theme-light .big{font-size:115%}.theme-light .large{font-size:125%}.theme-light .extra_large{font-size:130%}.theme-light .huge{font-size:150%}.theme-light .underline{text-decoration:underline}.theme-light .orange{color:#eca100}.theme-light .normal{font-style:normal}.theme-light .attack{color:red}.theme-light .moderate{color:#c00}.theme-light .disarm{color:#900}.theme-light .passive{color:#600}.theme-light .helpful{color:#368f31}.theme-light .scanner{color:red}.theme-light .scannerb{color:red;font-weight:bold}.theme-light .scannerburn{color:orange}.theme-light .scannerburnb{color:orange;font-weight:bold}.theme-light .rose{color:#ff5050}.theme-light .debuginfo{color:#493d26;font-style:italic}.theme-light .xenonotice{color:#2a623d}.theme-light .xenoboldnotice{color:#2a623d;font-style:italic}.theme-light .xenowarning{color:#2a623d;font-style:italic}.theme-light .xenominorwarning{color:#2a623d;font-weight:bold;font-style:italic}.theme-light .xenodanger{color:#2a623d;font-weight:bold}.theme-light .avoidharm{color:#72a0e5;font-weight:bold}.theme-light .highdanger{color:red;font-weight:bold;font-size:140%}.theme-light .xenohighdanger{color:#2a623d;font-weight:bold;font-size:140%}.theme-light .xenoannounce{color:#1a472a;font-family:book-antiqua;font-weight:bold;font-size:140%}.theme-light .yautjabold{color:purple;font-weight:bold}.theme-light .yautjaboldbig{color:purple;font-weight:bold;font-size:120%}.theme-light .objectivebig{font-weight:bold;font-size:130%}.theme-light .objectivegreen{color:lime}.theme-light .objectivered{color:red}.theme-light .objectivesuccess{color:lime;font-weight:bold;font-size:110%}.theme-light .objectivefail{color:red;font-weight:bold;font-size:110%}.theme-light .xenotalk,.theme-light .xeno{color:#900090;font-style:italic}.theme-light .xenoleader{color:#730d73;font-style:italic;font-size:125%}.theme-light .xenoqueen{color:#730d73;font-style:italic;font-weight:bold;font-size:125%}.theme-light .newscaster{color:maroon}.theme-light .role_header{color:#db0000;text-align:center;font-weight:bold;font-size:140%;padding:0em 1em}.theme-light .role_body{color:#009;text-align:justify;font-size:110%;padding:0em 1em}.theme-light .round_header{color:#db0000;display:block;text-align:center;font-family:courier;font-weight:bold;font-size:180%}.theme-light .round_body{color:#001427;display:block;text-align:center;font-family:trebuchet-ms;font-weight:bold;font-size:125%}.theme-light .event_announcement{color:#600d48;font-family:arial-narrow;font-weight:bold;font-size:125%}.theme-light .announce_header{color:#000;font-weight:bold;font-size:150%}.theme-light .announce_header_blue{color:#009;font-weight:bold;font-size:150%}.theme-light .announce_body{color:red;font-weight:normal;font-size:125%}.theme-light .centerbold{display:block;text-align:center;font-weight:bold}.theme-light .mod{color:#735638;font-weight:bold}.theme-light .modooc{color:#184880;font-weight:bold}.theme-light .adminmod{color:#402a14;font-weight:bold}.theme-light .mentorsay{color:#b38c32;font-weight:bold}.theme-light .mentorhelp{color:#007e00;font-weight:bold}.theme-light .mentorbody{color:#da6200;font-weight:bold}.theme-light .mentorstaff{color:#876101;font-weight:bold}.theme-light .staffsay{color:#876101;font-weight:bold}.theme-light .tajaran{color:#803b56}.theme-light .tajaran_signlang{color:#941c1c}.theme-light .skrell{color:#00ced1}.theme-light .soghun{color:#228b22}.theme-light .changeling{color:purple}.theme-light .vox{color:#a0a}.theme-light .monkey{color:#966c47}.theme-light .german{color:#858f1e;font-family:"Times New Roman",Times,serif}.theme-light .spanish{color:#cf982b}.theme-light .japanese{color:#940927}.theme-light .chinese{color:#fe1919}.theme-light .zombie{color:#216163;font-style:italic}.theme-light .commando{color:#fe9b24;font-style:bold}.theme-light .rough{font-family:trebuchet-ms,cursive,sans-serif}.theme-light .say_quote{font-family:Georgia,Verdana,sans-serif}.theme-light .admin .message{color:#314cad}.theme-light .admin .prefix{font-weight:bolder}.theme-light .pm{font-size:110%}.theme-light .retro_translator{font-weight:bold}.theme-light .yautja_translator{color:#a00;font-weight:bold;animation:glitch .5s infinite}@keyframes glitch{25%{color:#a00;transform:translate(-2px, -1px)}50%{color:#be0000;transform:translate(1px, -2px)}75%{color:#8d0000;transform:translate(-1px, 2px)}100%{color:#830000;transform:translate(1px, 1px)}}.theme-light .examine_block{background:#f2f7fa;border:1px solid #111a27;margin:.5em;padding:.5em .75em}.theme-light .examine_block .icon{width:1.5em;height:1.5em;margin:0;padding:0}.theme-light .tooltip{font-style:italic;border-bottom:1px dashed #000} From 28891893f3a722a927a9b91615896ac0e808bf9c Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Mon, 27 Nov 2023 12:33:39 +0000 Subject: [PATCH 05/42] Automatic changelog for PR #4828 [ci skip] --- html/changelogs/AutoChangeLog-pr-4828.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4828.yml diff --git a/html/changelogs/AutoChangeLog-pr-4828.yml b/html/changelogs/AutoChangeLog-pr-4828.yml new file mode 100644 index 000000000000..133404e587a6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4828.yml @@ -0,0 +1,7 @@ +author: "fira" +delete-after: True +changes: + - code_imp: "Ported basic /tg/ Status Backend." + - rscadd: "Human transform changes such as lying down, knock down, buckling, are now animated." + - bugfix: "Some statuses will now take effect immediately instead of waiting for a life tick, notably Resting." + - balance: "Many interaction requirements were changed to eg. fail upon stuns rather than if lying down." \ No newline at end of file From 79bbc4e23f71d3153cd96cf1fd024603a3ddff29 Mon Sep 17 00:00:00 2001 From: silencer-pl <103842328+silencer-pl@users.noreply.github.com> Date: Mon, 27 Nov 2023 08:47:56 -0500 Subject: [PATCH 06/42] assorted fixes --- code/controllers/subsystem/ticker.dm | 2 +- .../datums/emergency_calls/big_game_hunter.dm | 2 +- code/datums/emergency_calls/cbrn.dm | 4 ++-- code/datums/emergency_calls/clf.dm | 2 +- code/datums/emergency_calls/cmb.dm | 4 ++-- code/datums/emergency_calls/contractor.dm | 4 ++-- code/datums/emergency_calls/cryo_marines.dm | 2 +- .../emergency_calls/cryo_marines_heavy.dm | 2 +- code/datums/emergency_calls/cryo_spec.dm | 2 +- code/datums/emergency_calls/deathsquad.dm | 4 ++-- code/datums/emergency_calls/deus_vult.dm | 2 +- code/datums/emergency_calls/dutch.dm | 2 +- code/datums/emergency_calls/goons.dm | 4 ++-- code/datums/emergency_calls/hefa_knight.dm | 2 +- code/datums/emergency_calls/inspection.dm | 12 +++++------ code/datums/emergency_calls/mercs.dm | 20 +++++++++---------- code/datums/emergency_calls/pirates.dm | 2 +- code/datums/emergency_calls/pizza.dm | 2 +- code/datums/emergency_calls/pmc.dm | 4 ++-- code/datums/emergency_calls/provost.dm | 2 +- code/datums/emergency_calls/riot.dm | 2 +- code/datums/emergency_calls/royal_marines.dm | 2 +- code/datums/emergency_calls/souto.dm | 2 +- code/datums/emergency_calls/tank_crew.dm | 2 +- code/datums/emergency_calls/upp.dm | 2 +- code/datums/emergency_calls/upp_commando.dm | 4 ++-- .../datums/emergency_calls/whiskey_outpost.dm | 2 +- code/datums/emergency_calls/xeno_cultists.dm | 2 +- code/game/jobs/job/marine/marine.dm | 2 +- .../carbon/xenomorph/castes/Predalien.dm | 14 ++++--------- code/stylesheet.dm | 4 ++-- 31 files changed, 56 insertions(+), 62 deletions(-) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index adf838984586..ba59c9dc9b21 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -252,7 +252,7 @@ SUBSYSTEM_DEF(ticker) save_mode(CONFIG_GET(string/gamemode_default)) if(GLOB.round_statistics) - to_chat(world, html = role_body("

Welcome to [GLOB.round_statistics.round_name]
")) + to_chat(world, html = role_header("Welcome to [GLOB.round_statistics.round_name]")) GLOB.supply_controller.process() //Start the supply shuttle regenerating points -- TLE diff --git a/code/datums/emergency_calls/big_game_hunter.dm b/code/datums/emergency_calls/big_game_hunter.dm index 54dcfb09594e..bcd85cd91578 100644 --- a/code/datums/emergency_calls/big_game_hunter.dm +++ b/code/datums/emergency_calls/big_game_hunter.dm @@ -25,4 +25,4 @@ to_chat(H, role_header("You are a big game hunter!")) to_chat(H, role_body("You've taken a shot at every beast of the earth, every fowl of the air, and everything that creepeth upon the earth. Mundane beasts now bore you (and there may be some minor poaching charges after the Misunderstanding) and so you have traveled to this backwater sector to hunt the most dangerous game wherever you can find it. You've heard grisly tales of murderous xenomorphs, triggerhappy soldiers, and bloodthirsty alien hunters (who sound like they have the right idea, not like those ghastl Arcturians at all!) but so far all you've potted has been penny-ante stuff.

Whether you recruit the natives for porters, beaters, and guides, or hunt them for sport, is entirely up to you. They'll point you at something excellent if they know what's good for them.")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) diff --git a/code/datums/emergency_calls/cbrn.dm b/code/datums/emergency_calls/cbrn.dm index d594c0ecdc94..67677c215032 100644 --- a/code/datums/emergency_calls/cbrn.dm +++ b/code/datums/emergency_calls/cbrn.dm @@ -36,7 +36,7 @@ to_chat(mob, role_header("You are a CBRN Squad Rifleman!")) to_chat(mob, role_body("You are a member of the USCM's CBRN. The CBRN is a force that specializes in handling chemical, biological, radiological, and nuclear threats.")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/cbrn/ert name = "CBRN (Distress)" @@ -77,4 +77,4 @@ to_chat(mob, role_header("You are a CBRN Specialist!")) to_chat(mob, role_body("You are a member of the USCM's CBRN. The CBRN is a force that specializes in handling chemical, biological, radiological, and nuclear threats.")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) diff --git a/code/datums/emergency_calls/clf.dm b/code/datums/emergency_calls/clf.dm index 36e6b529cba5..40cdd99255f2 100644 --- a/code/datums/emergency_calls/clf.dm +++ b/code/datums/emergency_calls/clf.dm @@ -66,7 +66,7 @@ arm_equipment(H, /datum/equipment_preset/clf/soldier, TRUE, TRUE) print_backstory(H) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/clf/platoon diff --git a/code/datums/emergency_calls/cmb.dm b/code/datums/emergency_calls/cmb.dm index 335028b6da4e..82f94544dc0b 100644 --- a/code/datums/emergency_calls/cmb.dm +++ b/code/datums/emergency_calls/cmb.dm @@ -53,7 +53,7 @@ print_backstory(mob) - addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/cmb/print_backstory(mob/living/carbon/human/M) @@ -159,7 +159,7 @@ print_backstory(mob) - addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/cmb/anchorpoint/print_backstory(mob/living/carbon/human/M) diff --git a/code/datums/emergency_calls/contractor.dm b/code/datums/emergency_calls/contractor.dm index 4d94896a827e..46aa70e0b5e9 100644 --- a/code/datums/emergency_calls/contractor.dm +++ b/code/datums/emergency_calls/contractor.dm @@ -51,7 +51,7 @@ print_backstory(mob) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/contractors/print_backstory(mob/living/carbon/human/M) @@ -145,5 +145,5 @@ print_backstory(H) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) diff --git a/code/datums/emergency_calls/cryo_marines.dm b/code/datums/emergency_calls/cryo_marines.dm index 45f1dd9ecf32..910e1ec04a4c 100644 --- a/code/datums/emergency_calls/cryo_marines.dm +++ b/code/datums/emergency_calls/cryo_marines.dm @@ -83,7 +83,7 @@ sleep(10) if(!mind) human.free_for_ghosts() - to_chat(human, role_body("

Your objectives are:

[objectives]")) + to_chat(human, role_body("

Your objectives are:

[objectives]")) /datum/emergency_call/cryo_squad/platoon name = "Marine Cryo Reinforcements (Platoon)" diff --git a/code/datums/emergency_calls/cryo_marines_heavy.dm b/code/datums/emergency_calls/cryo_marines_heavy.dm index 39f1834a4b22..8c1b2b8c8ffe 100644 --- a/code/datums/emergency_calls/cryo_marines_heavy.dm +++ b/code/datums/emergency_calls/cryo_marines_heavy.dm @@ -68,7 +68,7 @@ to_chat(H, role_body("Your squad is here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name].")) sleep(10) - to_chat(H, role_body("

Your objectives are:

[objectives]")) + to_chat(H, role_body("

Your objectives are:

[objectives]")) /datum/emergency_call/cryo_squad_equipped/platoon diff --git a/code/datums/emergency_calls/cryo_spec.dm b/code/datums/emergency_calls/cryo_spec.dm index 22c1aae405bf..3226a444a028 100644 --- a/code/datums/emergency_calls/cryo_spec.dm +++ b/code/datums/emergency_calls/cryo_spec.dm @@ -40,4 +40,4 @@ sleep(10) if(!mind) human.free_for_ghosts() - to_chat(human, role_body("

Your objectives are:

[objectives]")) + to_chat(human, role_body("

Your objectives are:

[objectives]")) diff --git a/code/datums/emergency_calls/deathsquad.dm b/code/datums/emergency_calls/deathsquad.dm index a913c0e94b46..39a165cd2a96 100644 --- a/code/datums/emergency_calls/deathsquad.dm +++ b/code/datums/emergency_calls/deathsquad.dm @@ -47,7 +47,7 @@ to_chat(person, role_body("Whiteout protocol is in effect for the target, all assets onboard are to be liquidated with expediency unless otherwise instructed by Weyland Yutani personnel holding the position of Director or above.")) arm_equipment(person, /datum/equipment_preset/pmc/w_y_whiteout, TRUE, TRUE) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), person, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), person, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/death/low_threat name = "Weyland Whiteout Operators" @@ -82,7 +82,7 @@ to_chat(person, role_body("Whiteout protocol is in effect for the target, all assets onboard are to be liquidated with expediency unless otherwise instructed by Weyland Yutani personnel holding the position of Director or above.")) arm_equipment(person, /datum/equipment_preset/pmc/w_y_whiteout/low_threat, TRUE, TRUE) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), person, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), person, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) //################################################################################################ // Marine commandos - USCM Deathsquad. Event only diff --git a/code/datums/emergency_calls/deus_vult.dm b/code/datums/emergency_calls/deus_vult.dm index f6bdc066e5c1..f77cf9341f7b 100644 --- a/code/datums/emergency_calls/deus_vult.dm +++ b/code/datums/emergency_calls/deus_vult.dm @@ -37,4 +37,4 @@ to_chat(H, role_body("You must clear out any traces of the unholy from this wretched place!")) to_chat(H, role_body("Follow any orders directly from the Higher Power!")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) diff --git a/code/datums/emergency_calls/dutch.dm b/code/datums/emergency_calls/dutch.dm index 0b2c24d8eb08..24f25bfe52a0 100644 --- a/code/datums/emergency_calls/dutch.dm +++ b/code/datums/emergency_calls/dutch.dm @@ -36,7 +36,7 @@ arm_equipment(H, /datum/equipment_preset/dutch/medic, TRUE, TRUE) else arm_equipment(H, /datum/equipment_preset/dutch, TRUE, TRUE) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/dutch/full_dozen //AWWW YEAH DA FULL DOZEN FO TODAY name = "Dutch's Dozen - Full Strength" diff --git a/code/datums/emergency_calls/goons.dm b/code/datums/emergency_calls/goons.dm index 40e82091a381..e9018b310769 100644 --- a/code/datums/emergency_calls/goons.dm +++ b/code/datums/emergency_calls/goons.dm @@ -27,7 +27,7 @@ print_backstory(mob) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/goon/print_backstory(mob/living/carbon/human/M) to_chat(M, role_body("You were born [pick(75;"in Europe", 15;"in Asia", 10;"on Mars")] to a poor family.")) @@ -78,7 +78,7 @@ print_backstory(mob) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/goon/chem_retrieval/print_backstory(mob/living/carbon/human/backstory_human) if(backstory_human.job == JOB_WY_GOON_RESEARCHER) diff --git a/code/datums/emergency_calls/hefa_knight.dm b/code/datums/emergency_calls/hefa_knight.dm index c12c053bb08d..5946f4b7b851 100644 --- a/code/datums/emergency_calls/hefa_knight.dm +++ b/code/datums/emergency_calls/hefa_knight.dm @@ -18,4 +18,4 @@ M.transfer_to(H, TRUE) arm_equipment(H, /datum/equipment_preset/fun/hefa/melee, FALSE, TRUE) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) diff --git a/code/datums/emergency_calls/inspection.dm b/code/datums/emergency_calls/inspection.dm index 69faec10d942..60d60925509b 100644 --- a/code/datums/emergency_calls/inspection.dm +++ b/code/datums/emergency_calls/inspection.dm @@ -32,7 +32,7 @@ to_chat(H, role_body("You are being assigned as part escort, part assistant and part law enforcer to the Inspector that is being dispatched to the [MAIN_SHIP_NAME]")) to_chat(H, role_body("You are not expected to enforce ML on the ship, however the Inspector may ask you to perform MP duties as part of their investigation in which case you are obligated to act like any other MP.")) to_chat(H, role_header("This role requires familiarity with Marine Law and Standard Operating Procedure. Ahelp if you have any questions or wish to surrender the character to someone else.")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/inspection_provost/spawn_items() @@ -76,7 +76,7 @@ to_chat(H, role_body("An inspection is scheduled for the [MAIN_SHIP_NAME] during their current assignment. You serve both as security detail to the officer performing the inspection and their assistant should they need your expertise.")) to_chat(H, role_body("Follow the inspector as they perform their duties on the ship. Feel free to offer your insight if you feel like you have any and help then as they request it. Remember, while you do not answer directly to the officers on the ship, you still need to respect their position.")) to_chat(H, role_header("Remember, you may not interrupt regular operation and are expected to follow orders of the Inspector at all times. Ahelp if you have any questions of you wish to offer the role to someone else.")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) //UAAC-TIS /datum/emergency_call/inspection_tis @@ -111,7 +111,7 @@ to_chat(H, role_body("You have been assigned as an escort for an UAAC-TIS Officer being dispatched to the [MAIN_SHIP_NAME]. Technically, the TIS has no direct authority over you, however you have been ordered to follow the instructions of the TIS Officer.")) to_chat(H, role_body("You are not expected to enforce ML on the ship and are generally expected to follow the instruction of the Officer you are protecting. Remember that should they start acting in a way that you believe puts the USCM in danger, you are not obligated to follow their orders and should report this to the Provost at once.")) to_chat(H, role_header("This role requires familiarity with Marine Law and Standard Operating Procedure. Ahelp if you have any questions or wish to surrender the character to someone else.")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/inspection_tis/spawn_items() var/turf/drop_spawn @@ -155,7 +155,7 @@ to_chat(H, role_body("While officially your outfit does mundane security work for Weyland-Yutani, in practice you serve as both official and unofficial investigators into conduct of Company personnel. The Lead Investigator is in charge, your duty is to provide backup, counsel and any other form of assistance you can render to make sure their mission is a success.")) to_chat(H, role_body("Remember that the USCM, or at least some parts of it, may be hostile towards your presence on the ship. Unless ordered otherwise by Dispatch, you and your Team Leader are to avoid open conflict with the Marines. Your main priority is making sure that your Lead survives to write the report they are due.")) to_chat(H, role_header("Unless ordered otherwise by Dispatch, you are to avoid open conflict with the Marines. Your priority is the safety of your team, if the ship gets to hot, your best bet is evacuation. Ahelp if you have any more questions or wish to release this character for other players.")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/inspection_wy/spawn_items() var/turf/drop_spawn @@ -220,7 +220,7 @@ print_backstory(mob) - addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/inspection_cmb/print_backstory(mob/living/carbon/human/M) @@ -303,4 +303,4 @@ print_backstory(mob) - addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) diff --git a/code/datums/emergency_calls/mercs.dm b/code/datums/emergency_calls/mercs.dm index d99b164805e0..a44393b651b7 100644 --- a/code/datums/emergency_calls/mercs.dm +++ b/code/datums/emergency_calls/mercs.dm @@ -45,11 +45,11 @@ to_chat(H, role_body("Taking up arms as a mercenary, the Freelancers have become a powerful force of order in the system.")) to_chat(H, role_body("While they are motivated primarily by money, many colonists see the Freelancers as the main forces of order in the Neroid Sector.")) if(hostility) - to_chat(H, SPAN_NOTICE(role_body("Despite this, you have been tasked to ransack the [MAIN_SHIP_NAME] and kill anyone who gets in your way."))) - to_chat(H, SPAN_NOTICE(role_body("Any UPP, CLF or WY forces also responding are to be considered neutral parties unless proven hostile."))) + to_chat(H, role_body("Despite this, you have been tasked to ransack the [MAIN_SHIP_NAME] and kill anyone who gets in your way.")) + to_chat(H, role_body("Any UPP, CLF or WY forces also responding are to be considered neutral parties unless proven hostile.")) else - to_chat(H, SPAN_NOTICE(role_body("To this end, you have been contacted by Weyland-Yutani of the USCSS Royce to assist the [MAIN_SHIP_NAME].."))) - to_chat(H, SPAN_NOTICE(role_body("Ensure they are not destroyed."))) + to_chat(H, role_body("To this end, you have been contacted by Weyland-Yutani of the USCSS Royce to assist the [MAIN_SHIP_NAME]..")) + to_chat(H, role_body("Ensure they are not destroyed.")) /datum/emergency_call/mercs/create_member(datum/mind/M, turf/override_spawn_loc) var/turf/spawn_loc = override_spawn_loc ? override_spawn_loc : get_spawn_point() @@ -75,7 +75,7 @@ to_chat(H, role_header("You are a Freelancer Mercenary!")) print_backstory(H) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/mercs/platoon name = "Freelancers (Platoon)" @@ -126,11 +126,11 @@ to_chat(H, role_body("Taking up arms as a mercenary, the Freelancers have become a powerful force of order in the system.")) to_chat(H, role_body("While they are motivated primarily by money, many colonists see the Freelancers as the main forces of order in the Neroid Sector.")) if(hostility) - to_chat(H, SPAN_NOTICE(role_body("Despite this, you have been specially tasked to ransack the [MAIN_SHIP_NAME] and kill anyone who gets in your way."))) - to_chat(H, SPAN_NOTICE(role_body("Any UPP, CLF or WY forces also responding are to be considered neutral parties unless proven hostile."))) + to_chat(H, role_body("Despite this, you have been specially tasked to ransack the [MAIN_SHIP_NAME] and kill anyone who gets in your way.")) + to_chat(H, role_body("Any UPP, CLF or WY forces also responding are to be considered neutral parties unless proven hostile.")) else - to_chat(H, SPAN_NOTICE(role_body("To this end, you have been contacted by Weyland-Yutani of the USCSS Royce to assist the [MAIN_SHIP_NAME].."))) - to_chat(H, SPAN_NOTICE(role_body("Ensure they are not destroyed."))) + to_chat(H, role_body("To this end, you have been contacted by Weyland-Yutani of the USCSS Royce to assist the [MAIN_SHIP_NAME]..")) + to_chat(H, role_body("Ensure they are not destroyed.")) /datum/emergency_call/heavy_mercs/create_member(datum/mind/M, turf/override_spawn_loc) var/turf/spawn_loc = override_spawn_loc ? override_spawn_loc : get_spawn_point() @@ -164,4 +164,4 @@ to_chat(H, role_header("You are an Elite Mercenary!")) print_backstory(H) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) diff --git a/code/datums/emergency_calls/pirates.dm b/code/datums/emergency_calls/pirates.dm index bc43fc51011d..67ac9d875796 100644 --- a/code/datums/emergency_calls/pirates.dm +++ b/code/datums/emergency_calls/pirates.dm @@ -27,4 +27,4 @@ to_chat(H, role_header("You are a jolly pirate! Yarr!")) to_chat(H, role_body("Loot this place for all its worth! Take everything of value that's not nailed down!")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) diff --git a/code/datums/emergency_calls/pizza.dm b/code/datums/emergency_calls/pizza.dm index c3ba8d879e0c..e5170942280e 100644 --- a/code/datums/emergency_calls/pizza.dm +++ b/code/datums/emergency_calls/pizza.dm @@ -25,7 +25,7 @@ to_chat(H, role_header("You are a pizza deliverer! Your employer is the [pizzatxt] Corporation.")) to_chat(H, role_body("Your job is to deliver your pizzas. You're PRETTY sure this is the right place...")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/pizza/cryo diff --git a/code/datums/emergency_calls/pmc.dm b/code/datums/emergency_calls/pmc.dm index 5591062b7cd7..e2c3a58c388a 100644 --- a/code/datums/emergency_calls/pmc.dm +++ b/code/datums/emergency_calls/pmc.dm @@ -56,7 +56,7 @@ print_backstory(mob) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/pmc/print_backstory(mob/living/carbon/human/M) @@ -140,7 +140,7 @@ print_backstory(H) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /obj/effect/landmark/ert_spawns/distress_pmc name = "Distress_PMC" diff --git a/code/datums/emergency_calls/provost.dm b/code/datums/emergency_calls/provost.dm index fc573dc9350e..7ccf181037b6 100644 --- a/code/datums/emergency_calls/provost.dm +++ b/code/datums/emergency_calls/provost.dm @@ -31,7 +31,7 @@ to_chat(H, role_body("Follow any orders directly from High Command or your Team Leader!")) to_chat(H, role_body("You only answer to your superior, Marine Law and High Command!")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/provost_enforcer/spawn_items() diff --git a/code/datums/emergency_calls/riot.dm b/code/datums/emergency_calls/riot.dm index b7db71c51b40..53bf45cb0597 100644 --- a/code/datums/emergency_calls/riot.dm +++ b/code/datums/emergency_calls/riot.dm @@ -29,7 +29,7 @@ to_chat(H, role_body("Follow any orders directly from High Command or your superior!")) to_chat(H, role_body("You only answer to your superior, the Marine Law and the High Command!")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/riot/spawn_items() diff --git a/code/datums/emergency_calls/royal_marines.dm b/code/datums/emergency_calls/royal_marines.dm index 0f8493745b55..38f755251654 100644 --- a/code/datums/emergency_calls/royal_marines.dm +++ b/code/datums/emergency_calls/royal_marines.dm @@ -46,7 +46,7 @@ print_backstory(mob) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/royal_marines/print_backstory(mob/living/carbon/human/spawning_mob) diff --git a/code/datums/emergency_calls/souto.dm b/code/datums/emergency_calls/souto.dm index 4b18a633f48a..0d077c42d3fa 100644 --- a/code/datums/emergency_calls/souto.dm +++ b/code/datums/emergency_calls/souto.dm @@ -25,7 +25,7 @@ to_chat(H, role_header("You are Souto Man! You should bring awareness to the Souto brand!")) to_chat(H, role_body("Your job is to party hard and share Souto. Make sure those marines are never thirsty again!")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/souto/cryo name = "Souto Man (Cryo)" diff --git a/code/datums/emergency_calls/tank_crew.dm b/code/datums/emergency_calls/tank_crew.dm index c8fc2d23d151..d7f0205f49ef 100644 --- a/code/datums/emergency_calls/tank_crew.dm +++ b/code/datums/emergency_calls/tank_crew.dm @@ -28,7 +28,7 @@ to_chat(H, role_header("If you wish to cryo or ghost upon spawning in, you must ahelp and inform staff so you can be replaced.")) sleep(10) - to_chat(H, role_body("

Your objectives are:

[objectives]")) + to_chat(H, role_body("

Your objectives are:

[objectives]")) GLOB.data_core.manifest_inject(H) //Put people in crew manifest diff --git a/code/datums/emergency_calls/upp.dm b/code/datums/emergency_calls/upp.dm index 54d076da4857..2e93397e6d59 100644 --- a/code/datums/emergency_calls/upp.dm +++ b/code/datums/emergency_calls/upp.dm @@ -96,7 +96,7 @@ print_backstory(H) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/upp/hostile diff --git a/code/datums/emergency_calls/upp_commando.dm b/code/datums/emergency_calls/upp_commando.dm index 8856184dd24e..4eaacc6f12fd 100644 --- a/code/datums/emergency_calls/upp_commando.dm +++ b/code/datums/emergency_calls/upp_commando.dm @@ -49,7 +49,7 @@ arm_equipment(H, /datum/equipment_preset/upp/commando, TRUE, TRUE) print_backstory(H) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) /datum/emergency_call/upp_commando/low_threat name = "UPP Commandos" @@ -76,4 +76,4 @@ arm_equipment(person, /datum/equipment_preset/upp/commando/low_threat, TRUE, TRUE) print_backstory(person) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), person, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), person, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) diff --git a/code/datums/emergency_calls/whiskey_outpost.dm b/code/datums/emergency_calls/whiskey_outpost.dm index 4af8e7adce92..e8fdbd042cde 100644 --- a/code/datums/emergency_calls/whiskey_outpost.dm +++ b/code/datums/emergency_calls/whiskey_outpost.dm @@ -50,7 +50,7 @@ to_chat(mob, SPAN_BOLDNOTICE("You are a Rifleman in the USCM, your squad is here to assist in the defence of [SSmapping.configs[GROUND_MAP].map_name].")) sleep(10) - to_chat(mob, "

Your objectives are:

[objectives]") + to_chat(mob, "

Your objectives are:

[objectives]") GLOB.RoleAuthority.randomize_squad(mob) mob.sec_hud_set_ID() mob.hud_set_squad() diff --git a/code/datums/emergency_calls/xeno_cultists.dm b/code/datums/emergency_calls/xeno_cultists.dm index 915d34501f42..2ae4f8191e87 100644 --- a/code/datums/emergency_calls/xeno_cultists.dm +++ b/code/datums/emergency_calls/xeno_cultists.dm @@ -34,4 +34,4 @@ arm_equipment(H, /datum/equipment_preset/other/xeno_cultist, TRUE, TRUE) print_backstory(H) - addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) diff --git a/code/game/jobs/job/marine/marine.dm b/code/game/jobs/job/marine/marine.dm index 286a1399182b..4a0cb970f6f8 100644 --- a/code/game/jobs/job/marine/marine.dm +++ b/code/game/jobs/job/marine/marine.dm @@ -7,7 +7,7 @@ /datum/job/marine/generate_entry_message(mob/living/carbon/human/current_human) if(current_human.assigned_squad) - entry_message_intro = "

You are a [title]!

You have been assigned to: [current_human.assigned_squad.name] Squad!.[Check_WO() ? "" : " Make your way to the cafeteria for some post-cryosleep chow, and then get equipped in your squad's prep room." ]" + entry_message_intro = "

You are a [title]!

You have been assigned to: [current_human.assigned_squad.name] Squad![Check_WO() ? "" : " Make your way to the cafeteria for some post-cryosleep chow, and then get equipped in your squad's prep room." ]" return ..() /datum/job/marine/generate_entry_conditions(mob/living/carbon/human/current_human) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Predalien.dm b/code/modules/mob/living/carbon/xenomorph/castes/Predalien.dm index 14aa31b1f1e8..a3386f624c87 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Predalien.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Predalien.dm @@ -81,15 +81,9 @@ if(!loc) return FALSE - to_chat(src, {" -|______________________| -You are a predator-alien hybrid! -You are a very powerful xenomorph creature that was born of a Yautja warrior body. -You are stronger, faster, and smarter than a regular xenomorph, but you must still listen to the queen. -You have a degree of freedom to where you can hunt and claim the heads of the hive's enemies, so check your verbs. -Your health meter will not regenerate normally, so kill and die for the hive! -|______________________| -"}) + to_chat(src, role_header("You are a predator-alien hybrid!")) + to_chat(src, role_body("You are a very powerful xenomorph creature that was born of a Yautja warrior body.

You are stronger, faster, and smarter than a regular xenomorph, but you must still listen to the queen. You have a degree of freedom to where you can hunt and claim the heads of the hive's enemies, so check your verbs.")) + to_chat(src, role_header("Your health meter will not regenerate normally, so kill and die for the hive!")) emote("roar") /datum/behavior_delegate/predalien_base @@ -147,7 +141,7 @@ Your health meter will not regenerate normally, so kill and die for the hive! Date: Mon, 27 Nov 2023 13:21:16 -0500 Subject: [PATCH 07/42] removes strays, more uniformization --- .../datums/emergency_calls/big_game_hunter.dm | 7 +++-- code/datums/emergency_calls/cbrn.dm | 8 ++++-- code/datums/emergency_calls/clf.dm | 5 ++-- code/datums/emergency_calls/cmb.dm | 10 ++++--- code/datums/emergency_calls/contractor.dm | 10 ++++--- code/datums/emergency_calls/cryo_marines.dm | 3 ++- .../emergency_calls/cryo_marines_heavy.dm | 6 ++--- code/datums/emergency_calls/cryo_spec.dm | 3 ++- code/datums/emergency_calls/deathsquad.dm | 8 ++++-- code/datums/emergency_calls/deus_vult.dm | 4 ++- code/datums/emergency_calls/dutch.dm | 4 ++- code/datums/emergency_calls/goons.dm | 8 ++++-- code/datums/emergency_calls/hefa_knight.dm | 4 ++- code/datums/emergency_calls/inspection.dm | 26 +++++++++++++------ code/datums/emergency_calls/mercs.dm | 8 ++++-- code/datums/emergency_calls/pirates.dm | 4 ++- code/datums/emergency_calls/pizza.dm | 5 ++-- code/datums/emergency_calls/pmc.dm | 10 ++++--- code/datums/emergency_calls/provost.dm | 5 ++-- code/datums/emergency_calls/riot.dm | 5 ++-- code/datums/emergency_calls/royal_marines.dm | 5 ++-- code/datums/emergency_calls/souto.dm | 4 ++- code/datums/emergency_calls/tank_crew.dm | 5 ++-- code/datums/emergency_calls/upp.dm | 5 ++-- code/datums/emergency_calls/upp_commando.dm | 8 ++++-- .../datums/emergency_calls/whiskey_outpost.dm | 3 ++- code/datums/emergency_calls/xeno_cultists.dm | 4 ++- .../effects/landmarks/survivor_spawner.dm | 24 ++++++++--------- .../carbon/xenomorph/castes/Predalien.dm | 5 ++-- 29 files changed, 135 insertions(+), 71 deletions(-) diff --git a/code/datums/emergency_calls/big_game_hunter.dm b/code/datums/emergency_calls/big_game_hunter.dm index bcd85cd91578..1bc9cadb77dd 100644 --- a/code/datums/emergency_calls/big_game_hunter.dm +++ b/code/datums/emergency_calls/big_game_hunter.dm @@ -24,5 +24,8 @@ arm_equipment(H, /datum/equipment_preset/fun/van_bandolier, FALSE, TRUE) to_chat(H, role_header("You are a big game hunter!")) - to_chat(H, role_body("You've taken a shot at every beast of the earth, every fowl of the air, and everything that creepeth upon the earth. Mundane beasts now bore you (and there may be some minor poaching charges after the Misunderstanding) and so you have traveled to this backwater sector to hunt the most dangerous game wherever you can find it. You've heard grisly tales of murderous xenomorphs, triggerhappy soldiers, and bloodthirsty alien hunters (who sound like they have the right idea, not like those ghastl Arcturians at all!) but so far all you've potted has been penny-ante stuff.

Whether you recruit the natives for porters, beaters, and guides, or hunt them for sport, is entirely up to you. They'll point you at something excellent if they know what's good for them.")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + to_chat(H, role_body("You've taken a shot at every beast of the earth, every fowl of the air, and everything that creepeth upon the earth. Mundane beasts now bore you (and there may be some minor poaching charges after the Misunderstanding) and so you have traveled to this backwater sector to hunt the most dangerous game wherever you can find it. You've heard grisly tales of murderous xenomorphs, triggerhappy soldiers, and bloodthirsty alien hunters (who sound like they have the right idea, not like those ghastl Arcturians at all!) but so far all you've potted has been penny-ante stuff.")) + to_chat(H, role_body("Whether you recruit the natives for porters, beaters, and guides, or hunt them for sport, is entirely up to you. They'll point you at something excellent if they know what's good for them.")) + sleep(1 SECONDS) + to_chat(H, role_header("Your objectives are:")) + to_chat(H, role_body("[objectives]")) diff --git a/code/datums/emergency_calls/cbrn.dm b/code/datums/emergency_calls/cbrn.dm index 67677c215032..d8f4f8e0ed4b 100644 --- a/code/datums/emergency_calls/cbrn.dm +++ b/code/datums/emergency_calls/cbrn.dm @@ -36,7 +36,9 @@ to_chat(mob, role_header("You are a CBRN Squad Rifleman!")) to_chat(mob, role_body("You are a member of the USCM's CBRN. The CBRN is a force that specializes in handling chemical, biological, radiological, and nuclear threats.")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + sleep(1 SECONDS) + to_chat(mob, role_header("Your objectives are:")) + to_chat(mob, role_body("[objectives]")) /datum/emergency_call/cbrn/ert name = "CBRN (Distress)" @@ -77,4 +79,6 @@ to_chat(mob, role_header("You are a CBRN Specialist!")) to_chat(mob, role_body("You are a member of the USCM's CBRN. The CBRN is a force that specializes in handling chemical, biological, radiological, and nuclear threats.")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + sleep(1 SECONDS) + to_chat(mob, role_header("Your objectives are:")) + to_chat(mob, role_body("[objectives]")) diff --git a/code/datums/emergency_calls/clf.dm b/code/datums/emergency_calls/clf.dm index 40cdd99255f2..483bd8f6bcf3 100644 --- a/code/datums/emergency_calls/clf.dm +++ b/code/datums/emergency_calls/clf.dm @@ -66,8 +66,9 @@ arm_equipment(H, /datum/equipment_preset/clf/soldier, TRUE, TRUE) print_backstory(H) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) - + sleep(1 SECONDS) + to_chat(H, role_header("Your objectives are:")) + to_chat(H, role_body("[objectives]")) /datum/emergency_call/clf/platoon name = "Colonial Liberation Front (Platoon)" diff --git a/code/datums/emergency_calls/cmb.dm b/code/datums/emergency_calls/cmb.dm index 82f94544dc0b..1b4e7a742bbf 100644 --- a/code/datums/emergency_calls/cmb.dm +++ b/code/datums/emergency_calls/cmb.dm @@ -53,8 +53,9 @@ print_backstory(mob) - addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) - + sleep(1 SECONDS) + to_chat(mob, role_header("Your objectives are:")) + to_chat(mob, role_body("[objectives]")) /datum/emergency_call/cmb/print_backstory(mob/living/carbon/human/M) if(M == leader) @@ -159,8 +160,9 @@ print_backstory(mob) - addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) - + sleep(1 SECONDS) + to_chat(mob, role_header("Your objectives are:")) + to_chat(mob, role_body("[objectives]")) /datum/emergency_call/cmb/anchorpoint/print_backstory(mob/living/carbon/human/M) if(M == leader) diff --git a/code/datums/emergency_calls/contractor.dm b/code/datums/emergency_calls/contractor.dm index 46aa70e0b5e9..a5bdc2054977 100644 --- a/code/datums/emergency_calls/contractor.dm +++ b/code/datums/emergency_calls/contractor.dm @@ -51,8 +51,9 @@ print_backstory(mob) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) - + sleep(1 SECONDS) + to_chat(mob, role_header("Your objectives are:")) + to_chat(mob, role_body("[objectives]")) /datum/emergency_call/contractors/print_backstory(mob/living/carbon/human/M) if(ishuman_strict(M)) @@ -145,5 +146,6 @@ print_backstory(H) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) - + sleep(1 SECONDS) + to_chat(H, role_header("Your objectives are:")) + to_chat(H, role_body("[objectives]")) diff --git a/code/datums/emergency_calls/cryo_marines.dm b/code/datums/emergency_calls/cryo_marines.dm index 910e1ec04a4c..d0687b7b050f 100644 --- a/code/datums/emergency_calls/cryo_marines.dm +++ b/code/datums/emergency_calls/cryo_marines.dm @@ -83,7 +83,8 @@ sleep(10) if(!mind) human.free_for_ghosts() - to_chat(human, role_body("

Your objectives are:

[objectives]")) + to_chat(human, role_header("Your objectives are:")) + to_chat(human, role_body("[objectives]")) /datum/emergency_call/cryo_squad/platoon name = "Marine Cryo Reinforcements (Platoon)" diff --git a/code/datums/emergency_calls/cryo_marines_heavy.dm b/code/datums/emergency_calls/cryo_marines_heavy.dm index 8c1b2b8c8ffe..7136cf063c58 100644 --- a/code/datums/emergency_calls/cryo_marines_heavy.dm +++ b/code/datums/emergency_calls/cryo_marines_heavy.dm @@ -67,9 +67,9 @@ to_chat(H, role_header("You are a Rifleman in the USCM")) to_chat(H, role_body("Your squad is here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name].")) - sleep(10) - to_chat(H, role_body("

Your objectives are:

[objectives]")) - + sleep(1 SECONDS) + to_chat(H, role_header("Your objectives are:")) + to_chat(H, role_body("[objectives]")) /datum/emergency_call/cryo_squad_equipped/platoon name = "Marine Cryo Reinforcements (Full Equipment) (Platoon)" diff --git a/code/datums/emergency_calls/cryo_spec.dm b/code/datums/emergency_calls/cryo_spec.dm index 3226a444a028..d01b12d8c0d5 100644 --- a/code/datums/emergency_calls/cryo_spec.dm +++ b/code/datums/emergency_calls/cryo_spec.dm @@ -40,4 +40,5 @@ sleep(10) if(!mind) human.free_for_ghosts() - to_chat(human, role_body("

Your objectives are:

[objectives]")) + to_chat(human, role_header("Your objectives are:")) + to_chat(human, role_body("[objectives]")) diff --git a/code/datums/emergency_calls/deathsquad.dm b/code/datums/emergency_calls/deathsquad.dm index 39a165cd2a96..f011d1d87a98 100644 --- a/code/datums/emergency_calls/deathsquad.dm +++ b/code/datums/emergency_calls/deathsquad.dm @@ -47,7 +47,9 @@ to_chat(person, role_body("Whiteout protocol is in effect for the target, all assets onboard are to be liquidated with expediency unless otherwise instructed by Weyland Yutani personnel holding the position of Director or above.")) arm_equipment(person, /datum/equipment_preset/pmc/w_y_whiteout, TRUE, TRUE) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), person, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + sleep(1 SECONDS) + to_chat(person, role_header("Your objectives are:")) + to_chat(person, role_body("[objectives]")) /datum/emergency_call/death/low_threat name = "Weyland Whiteout Operators" @@ -82,7 +84,9 @@ to_chat(person, role_body("Whiteout protocol is in effect for the target, all assets onboard are to be liquidated with expediency unless otherwise instructed by Weyland Yutani personnel holding the position of Director or above.")) arm_equipment(person, /datum/equipment_preset/pmc/w_y_whiteout/low_threat, TRUE, TRUE) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), person, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + sleep(1 SECONDS) + to_chat(person, role_header("Your objectives are:")) + to_chat(person, role_body("[objectives]")) //################################################################################################ // Marine commandos - USCM Deathsquad. Event only diff --git a/code/datums/emergency_calls/deus_vult.dm b/code/datums/emergency_calls/deus_vult.dm index f77cf9341f7b..e624a9ca276a 100644 --- a/code/datums/emergency_calls/deus_vult.dm +++ b/code/datums/emergency_calls/deus_vult.dm @@ -37,4 +37,6 @@ to_chat(H, role_body("You must clear out any traces of the unholy from this wretched place!")) to_chat(H, role_body("Follow any orders directly from the Higher Power!")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + sleep(1 SECONDS) + to_chat(H, role_header("Your objectives are:")) + to_chat(H, role_body("[objectives]")) diff --git a/code/datums/emergency_calls/dutch.dm b/code/datums/emergency_calls/dutch.dm index 24f25bfe52a0..b05902180bbb 100644 --- a/code/datums/emergency_calls/dutch.dm +++ b/code/datums/emergency_calls/dutch.dm @@ -36,7 +36,9 @@ arm_equipment(H, /datum/equipment_preset/dutch/medic, TRUE, TRUE) else arm_equipment(H, /datum/equipment_preset/dutch, TRUE, TRUE) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + sleep(1 SECONDS) + to_chat(H, role_header("Your objectives are:")) + to_chat(H, role_body("[objectives]")) /datum/emergency_call/dutch/full_dozen //AWWW YEAH DA FULL DOZEN FO TODAY name = "Dutch's Dozen - Full Strength" diff --git a/code/datums/emergency_calls/goons.dm b/code/datums/emergency_calls/goons.dm index e9018b310769..9137dfc765d6 100644 --- a/code/datums/emergency_calls/goons.dm +++ b/code/datums/emergency_calls/goons.dm @@ -27,7 +27,9 @@ print_backstory(mob) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + sleep(1 SECONDS) + to_chat(mob, role_header("Your objectives are:")) + to_chat(mob, role_body("[objectives]")) /datum/emergency_call/goon/print_backstory(mob/living/carbon/human/M) to_chat(M, role_body("You were born [pick(75;"in Europe", 15;"in Asia", 10;"on Mars")] to a poor family.")) @@ -78,7 +80,9 @@ print_backstory(mob) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + sleep(1 SECONDS) + to_chat(mob, role_header("Your objectives are:")) + to_chat(mob, role_body("[objectives]")) /datum/emergency_call/goon/chem_retrieval/print_backstory(mob/living/carbon/human/backstory_human) if(backstory_human.job == JOB_WY_GOON_RESEARCHER) diff --git a/code/datums/emergency_calls/hefa_knight.dm b/code/datums/emergency_calls/hefa_knight.dm index 5946f4b7b851..e24d88603593 100644 --- a/code/datums/emergency_calls/hefa_knight.dm +++ b/code/datums/emergency_calls/hefa_knight.dm @@ -18,4 +18,6 @@ M.transfer_to(H, TRUE) arm_equipment(H, /datum/equipment_preset/fun/hefa/melee, FALSE, TRUE) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + sleep(1 SECONDS) + to_chat(H, role_header("Your objectives are:")) + to_chat(H, role_body("[objectives]")) diff --git a/code/datums/emergency_calls/inspection.dm b/code/datums/emergency_calls/inspection.dm index 60d60925509b..00ec95716c32 100644 --- a/code/datums/emergency_calls/inspection.dm +++ b/code/datums/emergency_calls/inspection.dm @@ -32,8 +32,9 @@ to_chat(H, role_body("You are being assigned as part escort, part assistant and part law enforcer to the Inspector that is being dispatched to the [MAIN_SHIP_NAME]")) to_chat(H, role_body("You are not expected to enforce ML on the ship, however the Inspector may ask you to perform MP duties as part of their investigation in which case you are obligated to act like any other MP.")) to_chat(H, role_header("This role requires familiarity with Marine Law and Standard Operating Procedure. Ahelp if you have any questions or wish to surrender the character to someone else.")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) - + sleep(1 SECONDS) + to_chat(H, role_header("Your objectives are:")) + to_chat(H, role_body("[objectives]")) /datum/emergency_call/inspection_provost/spawn_items() var/turf/drop_spawn @@ -76,7 +77,9 @@ to_chat(H, role_body("An inspection is scheduled for the [MAIN_SHIP_NAME] during their current assignment. You serve both as security detail to the officer performing the inspection and their assistant should they need your expertise.")) to_chat(H, role_body("Follow the inspector as they perform their duties on the ship. Feel free to offer your insight if you feel like you have any and help then as they request it. Remember, while you do not answer directly to the officers on the ship, you still need to respect their position.")) to_chat(H, role_header("Remember, you may not interrupt regular operation and are expected to follow orders of the Inspector at all times. Ahelp if you have any questions of you wish to offer the role to someone else.")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + sleep(1 SECONDS) + to_chat(H, role_header("Your objectives are:")) + to_chat(H, role_body("[objectives]")) //UAAC-TIS /datum/emergency_call/inspection_tis @@ -111,7 +114,9 @@ to_chat(H, role_body("You have been assigned as an escort for an UAAC-TIS Officer being dispatched to the [MAIN_SHIP_NAME]. Technically, the TIS has no direct authority over you, however you have been ordered to follow the instructions of the TIS Officer.")) to_chat(H, role_body("You are not expected to enforce ML on the ship and are generally expected to follow the instruction of the Officer you are protecting. Remember that should they start acting in a way that you believe puts the USCM in danger, you are not obligated to follow their orders and should report this to the Provost at once.")) to_chat(H, role_header("This role requires familiarity with Marine Law and Standard Operating Procedure. Ahelp if you have any questions or wish to surrender the character to someone else.")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + sleep(1 SECONDS) + to_chat(H, role_header("Your objectives are:")) + to_chat(H, role_body("[objectives]")) /datum/emergency_call/inspection_tis/spawn_items() var/turf/drop_spawn @@ -155,7 +160,9 @@ to_chat(H, role_body("While officially your outfit does mundane security work for Weyland-Yutani, in practice you serve as both official and unofficial investigators into conduct of Company personnel. The Lead Investigator is in charge, your duty is to provide backup, counsel and any other form of assistance you can render to make sure their mission is a success.")) to_chat(H, role_body("Remember that the USCM, or at least some parts of it, may be hostile towards your presence on the ship. Unless ordered otherwise by Dispatch, you and your Team Leader are to avoid open conflict with the Marines. Your main priority is making sure that your Lead survives to write the report they are due.")) to_chat(H, role_header("Unless ordered otherwise by Dispatch, you are to avoid open conflict with the Marines. Your priority is the safety of your team, if the ship gets to hot, your best bet is evacuation. Ahelp if you have any more questions or wish to release this character for other players.")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + sleep(1 SECONDS) + to_chat(H, role_header("Your objectives are:")) + to_chat(H, role_body("[objectives]")) /datum/emergency_call/inspection_wy/spawn_items() var/turf/drop_spawn @@ -220,8 +227,9 @@ print_backstory(mob) - addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) - + sleep(1 SECONDS) + to_chat(mob, role_header("Your objectives are:")) + to_chat(mob, role_body("[objectives]")) /datum/emergency_call/inspection_cmb/print_backstory(mob/living/carbon/human/M) if(M == leader) @@ -303,4 +311,6 @@ print_backstory(mob) - addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + sleep(1 SECONDS) + to_chat(mob, role_header("Your objectives are:")) + to_chat(mob, role_body("[objectives]")) diff --git a/code/datums/emergency_calls/mercs.dm b/code/datums/emergency_calls/mercs.dm index a44393b651b7..891aaaa02f86 100644 --- a/code/datums/emergency_calls/mercs.dm +++ b/code/datums/emergency_calls/mercs.dm @@ -75,7 +75,9 @@ to_chat(H, role_header("You are a Freelancer Mercenary!")) print_backstory(H) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + sleep(1 SECONDS) + to_chat(H, role_header("Your objectives are:")) + to_chat(H, role_body("[objectives]")) /datum/emergency_call/mercs/platoon name = "Freelancers (Platoon)" @@ -164,4 +166,6 @@ to_chat(H, role_header("You are an Elite Mercenary!")) print_backstory(H) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + sleep(1 SECONDS) + to_chat(H, role_header("Your objectives are:")) + to_chat(H, role_body("[objectives]")) diff --git a/code/datums/emergency_calls/pirates.dm b/code/datums/emergency_calls/pirates.dm index 67ac9d875796..137ebade887c 100644 --- a/code/datums/emergency_calls/pirates.dm +++ b/code/datums/emergency_calls/pirates.dm @@ -27,4 +27,6 @@ to_chat(H, role_header("You are a jolly pirate! Yarr!")) to_chat(H, role_body("Loot this place for all its worth! Take everything of value that's not nailed down!")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + sleep(1 SECONDS) + to_chat(H, role_header("Your objectives are:")) + to_chat(H, role_body("[objectives]")) diff --git a/code/datums/emergency_calls/pizza.dm b/code/datums/emergency_calls/pizza.dm index e5170942280e..1223a2964eb8 100644 --- a/code/datums/emergency_calls/pizza.dm +++ b/code/datums/emergency_calls/pizza.dm @@ -25,8 +25,9 @@ to_chat(H, role_header("You are a pizza deliverer! Your employer is the [pizzatxt] Corporation.")) to_chat(H, role_body("Your job is to deliver your pizzas. You're PRETTY sure this is the right place...")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) - + sleep(1 SECONDS) + to_chat(H, role_header("Your objectives are:")) + to_chat(H, role_body("[objectives]")) /datum/emergency_call/pizza/cryo name = "Pizza Delivery (Cryo)" diff --git a/code/datums/emergency_calls/pmc.dm b/code/datums/emergency_calls/pmc.dm index e2c3a58c388a..6943741370ab 100644 --- a/code/datums/emergency_calls/pmc.dm +++ b/code/datums/emergency_calls/pmc.dm @@ -56,8 +56,9 @@ print_backstory(mob) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) - + sleep(1 SECONDS) + to_chat(mob, role_header("Your objectives are:")) + to_chat(mob, role_body("[objectives]")) /datum/emergency_call/pmc/print_backstory(mob/living/carbon/human/M) if(ishuman_strict(M)) @@ -140,7 +141,10 @@ print_backstory(H) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + sleep(1 SECONDS) + to_chat(H, role_header("Your objectives are:")) + to_chat(H, role_body("[objectives]")) + /obj/effect/landmark/ert_spawns/distress_pmc name = "Distress_PMC" diff --git a/code/datums/emergency_calls/provost.dm b/code/datums/emergency_calls/provost.dm index 7ccf181037b6..9c85b9a5a63e 100644 --- a/code/datums/emergency_calls/provost.dm +++ b/code/datums/emergency_calls/provost.dm @@ -31,8 +31,9 @@ to_chat(H, role_body("Follow any orders directly from High Command or your Team Leader!")) to_chat(H, role_body("You only answer to your superior, Marine Law and High Command!")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) - + sleep(1 SECONDS) + to_chat(H, role_header("Your objectives are:")) + to_chat(H, role_body("[objectives]")) /datum/emergency_call/provost_enforcer/spawn_items() var/turf/drop_spawn diff --git a/code/datums/emergency_calls/riot.dm b/code/datums/emergency_calls/riot.dm index 53bf45cb0597..e009caf3e5b2 100644 --- a/code/datums/emergency_calls/riot.dm +++ b/code/datums/emergency_calls/riot.dm @@ -29,8 +29,9 @@ to_chat(H, role_body("Follow any orders directly from High Command or your superior!")) to_chat(H, role_body("You only answer to your superior, the Marine Law and the High Command!")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) - + sleep(1 SECONDS) + to_chat(H, role_header("Your objectives are:")) + to_chat(H, role_body("[objectives]")) /datum/emergency_call/riot/spawn_items() var/turf/drop_spawn diff --git a/code/datums/emergency_calls/royal_marines.dm b/code/datums/emergency_calls/royal_marines.dm index 38f755251654..146ff47dc9cd 100644 --- a/code/datums/emergency_calls/royal_marines.dm +++ b/code/datums/emergency_calls/royal_marines.dm @@ -46,8 +46,9 @@ print_backstory(mob) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) - + sleep(1 SECONDS) + to_chat(mob, role_header("Your objectives are:")) + to_chat(mob, role_body("[objectives]")) /datum/emergency_call/royal_marines/print_backstory(mob/living/carbon/human/spawning_mob) to_chat(spawning_mob, role_body("You were born in the Three World Empire to a [pick_weight(list("average" = 75, "poor" = 15, "well-established" = 10))] family.")) diff --git a/code/datums/emergency_calls/souto.dm b/code/datums/emergency_calls/souto.dm index 0d077c42d3fa..d8e31dccfbc7 100644 --- a/code/datums/emergency_calls/souto.dm +++ b/code/datums/emergency_calls/souto.dm @@ -25,7 +25,9 @@ to_chat(H, role_header("You are Souto Man! You should bring awareness to the Souto brand!")) to_chat(H, role_body("Your job is to party hard and share Souto. Make sure those marines are never thirsty again!")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + sleep(1 SECONDS) + to_chat(H, role_header("Your objectives are:")) + to_chat(H, role_body("[objectives]")) /datum/emergency_call/souto/cryo name = "Souto Man (Cryo)" diff --git a/code/datums/emergency_calls/tank_crew.dm b/code/datums/emergency_calls/tank_crew.dm index d7f0205f49ef..a2f8bf16384b 100644 --- a/code/datums/emergency_calls/tank_crew.dm +++ b/code/datums/emergency_calls/tank_crew.dm @@ -27,8 +27,9 @@ to_chat(H, role_body("You are here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command.")) to_chat(H, role_header("If you wish to cryo or ghost upon spawning in, you must ahelp and inform staff so you can be replaced.")) - sleep(10) - to_chat(H, role_body("

Your objectives are:

[objectives]")) + sleep(1 SECONDS) + to_chat(H, role_header("Your objectives are:")) + to_chat(H, role_body("[objectives]")) GLOB.data_core.manifest_inject(H) //Put people in crew manifest diff --git a/code/datums/emergency_calls/upp.dm b/code/datums/emergency_calls/upp.dm index 2e93397e6d59..769195d497ea 100644 --- a/code/datums/emergency_calls/upp.dm +++ b/code/datums/emergency_calls/upp.dm @@ -96,8 +96,9 @@ print_backstory(H) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) - + sleep(1 SECONDS) + to_chat(H, role_header("Your objectives are:")) + to_chat(H, role_body("[objectives]")) /datum/emergency_call/upp/hostile name = "UPP Naval Infantry (Squad) (Hostile)" diff --git a/code/datums/emergency_calls/upp_commando.dm b/code/datums/emergency_calls/upp_commando.dm index 4eaacc6f12fd..ddc02ef2f837 100644 --- a/code/datums/emergency_calls/upp_commando.dm +++ b/code/datums/emergency_calls/upp_commando.dm @@ -49,7 +49,9 @@ arm_equipment(H, /datum/equipment_preset/upp/commando, TRUE, TRUE) print_backstory(H) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + sleep(1 SECONDS) + to_chat(H, role_header("Your objectives are:")) + to_chat(H, role_body("[objectives]")) /datum/emergency_call/upp_commando/low_threat name = "UPP Commandos" @@ -76,4 +78,6 @@ arm_equipment(person, /datum/equipment_preset/upp/commando/low_threat, TRUE, TRUE) print_backstory(person) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), person, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + sleep(1 SECONDS) + to_chat(person, role_header("Your objectives are:")) + to_chat(person, role_body("[objectives]")) diff --git a/code/datums/emergency_calls/whiskey_outpost.dm b/code/datums/emergency_calls/whiskey_outpost.dm index e8fdbd042cde..b4233d0d08d8 100644 --- a/code/datums/emergency_calls/whiskey_outpost.dm +++ b/code/datums/emergency_calls/whiskey_outpost.dm @@ -50,7 +50,8 @@ to_chat(mob, SPAN_BOLDNOTICE("You are a Rifleman in the USCM, your squad is here to assist in the defence of [SSmapping.configs[GROUND_MAP].map_name].")) sleep(10) - to_chat(mob, "

Your objectives are:

[objectives]") + to_chat(mob, role_header("Your objectives are:")) + to_chat(mob, role_body("[objectives]")) GLOB.RoleAuthority.randomize_squad(mob) mob.sec_hud_set_ID() mob.hud_set_squad() diff --git a/code/datums/emergency_calls/xeno_cultists.dm b/code/datums/emergency_calls/xeno_cultists.dm index 2ae4f8191e87..52509524bc50 100644 --- a/code/datums/emergency_calls/xeno_cultists.dm +++ b/code/datums/emergency_calls/xeno_cultists.dm @@ -34,4 +34,6 @@ arm_equipment(H, /datum/equipment_preset/other/xeno_cultist, TRUE, TRUE) print_backstory(H) - addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(to_chat), H, role_body("

Your objectives are:

[objectives]")), 1 SECONDS) + sleep(1 SECONDS) + to_chat(H, role_header("Your objectives are:")) + to_chat(H, role_body("[objectives]")) diff --git a/code/game/objects/effects/landmarks/survivor_spawner.dm b/code/game/objects/effects/landmarks/survivor_spawner.dm index 470511296a09..749323c706c7 100644 --- a/code/game/objects/effects/landmarks/survivor_spawner.dm +++ b/code/game/objects/effects/landmarks/survivor_spawner.dm @@ -34,7 +34,7 @@ equipment = /datum/equipment_preset/survivor/clf synth_equipment = /datum/equipment_preset/clf/synth intro_text = "You are a survivor of a crash landing!" - intro_body = "You are NOT aware of the xenomorph threat.

Your primary objective is to heal up and survive. If you want to assault the hive - adminhelp." + intro_body = "You are NOT aware of the xenomorph threat. Your primary objective is to heal up and survive. If you want to assault the hive - adminhelp." story_text = "You are a soldier of Colonial Liberation Front. Your ship received a distress signal from a planet bordering the CLF controlled space under USCM control. Ready and willing to save poor colonists from parasitic tyrants, you and your team boarded small ship called Marie Curie. Unfortunately, right before you came close to a landing zone, a glob of acid hit the ship, damaging one of the engines. Despite all the efforts of the pilot, the ship went straight into nearby mountain. You were hurt pretty badly in the crash. Dumbfounded, you rose up and noticed that one of your limbs is at a weird angle, broken. You looked at other survivors, also limping and trying to fix their broken bones." roundstart_damage_min = 3 roundstart_damage_max = 10 @@ -47,7 +47,7 @@ equipment = /datum/equipment_preset/clf/engineer synth_equipment = /datum/equipment_preset/clf/synth intro_text = "You are a survivor of a crash landing!" - intro_body = "You are NOT aware of the xenomorph threat.

Your primary objective is to heal up and survive. If you want to assault the hive - adminhelp." + intro_body = "You are NOT aware of the xenomorph threat. Your primary objective is to heal up and survive. If you want to assault the hive - adminhelp." story_text = "You are a soldier of Colonial Liberation Front. Your ship received a distress signal from a planet bordering the CLF controlled space under USCM control. Ready and willing to save poor colonists from parasitic tyrants, you and your team boarded small ship called Marie Curie. Unfortunately, right before you came close to a landing zone, a glob of acid hit the ship, damaging one of the engines. Despite all the efforts of the pilot, the ship went straight into nearby mountain. You were hurt pretty badly in the crash. Dumbfounded, you rose up and noticed that one of your limbs is at a weird angle, broken. You looked at other survivors, also limping and trying to fix their broken bones." roundstart_damage_min = 3 roundstart_damage_max = 10 @@ -60,7 +60,7 @@ equipment = /datum/equipment_preset/clf/medic synth_equipment = /datum/equipment_preset/clf/synth intro_text = "You are a survivor of a crash landing!" - intro_body = "You are NOT aware of the xenomorph threat.

Your primary objective is to heal up and survive. If you want to assault the hive - adminhelp." + intro_body = "You are NOT aware of the xenomorph threat. Your primary objective is to heal up and survive. If you want to assault the hive - adminhelp." story_text = "You are a soldier of Colonial Liberation Front. Your ship received a distress signal from a planet bordering the CLF controlled space under USCM control. Ready and willing to save poor colonists from parasitic tyrants, you and your team boarded small ship called Marie Curie. Unfortunately, right before you came close to a landing zone, a glob of acid hit the ship, damaging one of the engines. Despite all the efforts of the pilot, the ship went straight into nearby mountain. You were hurt pretty badly in the crash. Dumbfounded, you rose up and noticed that one of your limbs is at a weird angle, broken. You looked at other survivors, also limping and trying to fix their broken bones." roundstart_damage_min = 3 roundstart_damage_max = 10 @@ -72,7 +72,7 @@ equipment = /datum/equipment_preset/survivor/pmc synth_equipment = /datum/equipment_preset/synth/survivor/pmc intro_text = "You are a survivor of a crash landing!" - intro_body = "You are NOT aware of the xenomorph threat.

Your primary objective is to heal up and survive. If you want to assault the hive - adminhelp." + intro_body = "You are NOT aware of the xenomorph threat. Your primary objective is to heal up and survive. If you want to assault the hive - adminhelp." story_text = "You are a PMC from Weyland-Yutani. Your ship was enroute to Solaris Ridge to escort an Assistant Manager. On the way, your ship received a distress signal from the colony about an attack. Worried that it might be a CLF attack, your pilot set full speed for the colony. However, during atmospheric entry the engine failed and you fell unconcious from the G-Forces. You wake up wounded... and see that the ship has crashed onto the colony. Your squadmates lie dead beside you, but there's some missing. Perhaps they survived and moved elsewhere? You need to find out what happened to the colony, see if you can find any of your squadmates, and find a way to contact Weyland-Yutani." roundstart_damage_min = 3 roundstart_damage_max = 10 @@ -84,7 +84,7 @@ equipment = /datum/equipment_preset/survivor/pmc/medic synth_equipment = /datum/equipment_preset/synth/survivor/pmc intro_text = "You are a survivor of a crash landing!" - intro_body = "You are NOT aware of the xenomorph threat.

Your primary objective is to heal up and survive. If you want to assault the hive - adminhelp." + intro_body = "You are NOT aware of the xenomorph threat. Your primary objective is to heal up and survive. If you want to assault the hive - adminhelp." story_text = "You are a PMC medic from Weyland-Yutani. Your ship was enroute to Solaris Ridge to escort an Assistant Manager. On the way, your ship received a distress signal from the colony about an attack. Worried that it might be a CLF attack, your pilot set full speed for the colony. However, during atmospheric entry the engine failed and you fell unconcious from the G-Forces. You wake up wounded... and see that the ship has crashed onto the colony. Your squadmates lie dead beside you, but there's some missing. Perhaps they survived and moved elsewhere? You need to find out what happened to the colony, see if you can find any of your squadmates, and find a way to contact Weyland-Yutani." roundstart_damage_min = 3 roundstart_damage_max = 10 @@ -96,7 +96,7 @@ equipment = /datum/equipment_preset/survivor/pmc/engineer synth_equipment = /datum/equipment_preset/synth/survivor/pmc intro_text = "You are a survivor of a crash landing!" - intro_body = "You are NOT aware of the xenomorph threat.

Your primary objective is to heal up and survive. If you want to assault the hive - adminhelp." + intro_body = "You are NOT aware of the xenomorph threat. Your primary objective is to heal up and survive. If you want to assault the hive - adminhelp." story_text = "You are a PMC engineer from Weyland-Yutani. Your ship was enroute to Solaris Ridge to escort an Assistant Manager. On the way, your ship received a distress signal from the colony about an attack. Worried that it might be a CLF attack, your pilot set full speed for the colony. However, during atmospheric entry the engine failed and you fell unconcious from the G-Forces. You wake up wounded... and see that the ship has crashed onto the colony. Your squadmates lie dead beside you, but there's some missing. Perhaps they survived and moved elsewhere? You need to find out what happened to the colony, see if you can find any of your squadmates, and find a way to contact Weyland-Yutani." roundstart_damage_min = 3 roundstart_damage_max = 10 @@ -108,7 +108,7 @@ equipment = /datum/equipment_preset/survivor/wy/manager synth_equipment = /datum/equipment_preset/synth/survivor/pmc intro_text = "You are a survivor of a crash landing!" - intro_body = "You are NOT aware of the xenomorph threat.

Your primary objective is to heal up and survive. If you want to assault the hive - adminhelp." + intro_body = "You are NOT aware of the xenomorph threat. Your primary objective is to heal up and survive. If you want to assault the hive - adminhelp." story_text = "You are an Assistant Manager from Weyland-Yutani. You were being escorted onboard a PMC ship to Solaris Ridge. On the way, the ship received a distress signal from the colony about an attack. Worried that it might be a CLF attack, the pilot set full speed for the colony. However, during atmospheric entry the engine failed and you fell unconcious from the G-Forces. You wake up wounded... and see that the ship has crashed onto the colony. The shipcrew lie dead beside you, but there's some missing. Perhaps they survived and moved elsewhere? You must get up and find a way to contact Weyland-Yutani." roundstart_damage_min = 3 roundstart_damage_max = 10 @@ -142,7 +142,7 @@ equipment = /datum/equipment_preset/survivor/upp/soldier synth_equipment = /datum/equipment_preset/synth/survivor/upp intro_text = "You are a member of a UPP recon force!" - intro_body = "You ARE aware of the xenomorph threat.

Your primary objective is to survive. You believe a second dropship crashed somewhere to the south east, which was carrying additional weapons" + intro_body = "You ARE aware of the xenomorph threat. Your primary objective is to survive. You believe a second dropship crashed somewhere to the south east, which was carrying additional weapons" story_text = "Your orders were simple, Recon the site, ascertain if there is a biological weapons program in the area, and if so to secure the colony and retrieve a sample. However your team failed to account for an active anti-air battery near the area. Both your craft and your sister ship crashed. Barely having a chance to catch your breath, you found yourself being assailed by vile xenomorphs! You and your team have barely held your ground, at the cost of four of your own, but more are coming and ammo is low. You believe an American rescue force is en route." spawn_priority = SPAWN_PRIORITY_LOW @@ -150,7 +150,7 @@ equipment = /datum/equipment_preset/survivor/upp/sapper synth_equipment = /datum/equipment_preset/synth/survivor/upp intro_text = "You are a member of a UPP recon force!" - intro_body = "You ARE aware of the xenomorph threat.

Your primary objective is to survive. You believe a second dropship crashed somewhere to the south east, which was carrying additional weapons" + intro_body = "You ARE aware of the xenomorph threat. Your primary objective is to survive. You believe a second dropship crashed somewhere to the south east, which was carrying additional weapons" story_text = "Your orders were simple, Recon the site, ascertain if there is a biological weapons program in the area, and if so to secure the colony and retrieve a sample. However your team failed to account for an active anti-air battery near the area. Both your craft and your sister ship crashed. Barely having a chance to catch your breath, you found yourself being assailed by vile xenomorphs! You and your team have barely held your ground, at the cost of four of your own, but more are coming and ammo is low. You believe an American rescue force is en route." spawn_priority = SPAWN_PRIORITY_MEDIUM @@ -158,7 +158,7 @@ equipment = /datum/equipment_preset/survivor/upp/medic synth_equipment = /datum/equipment_preset/synth/survivor/upp intro_text = "You are a member of a UPP recon force!" - intro_body = "You ARE aware of the xenomorph threat.

Your primary objective is to survive. You believe a second dropship crashed somewhere to the south east, which was carrying additional weapons" + intro_body = "You ARE aware of the xenomorph threat. Your primary objective is to survive. You believe a second dropship crashed somewhere to the south east, which was carrying additional weapons" story_text = "Your orders were simple, Recon the site, ascertain if there is a biological weapons program in the area, and if so to secure the colony and retrieve a sample. However your team failed to account for an active anti-air battery near the area. Both your craft and your sister ship crashed. Barely having a chance to catch your breath, you found yourself being assailed by vile xenomorphs! You and your team have barely held your ground, at the cost of four of your own, but more are coming and ammo is low. You believe an American rescue force is en route." spawn_priority = SPAWN_PRIORITY_MEDIUM @@ -166,7 +166,7 @@ equipment = /datum/equipment_preset/survivor/upp/specialist synth_equipment = /datum/equipment_preset/synth/survivor/upp intro_text = "You are a member of a UPP recon force!" - intro_body = "You ARE aware of the xenomorph threat.

Your primary objective is to survive. You believe a second dropship crashed somewhere to the south east, which was carrying additional weapons" + intro_body = "You ARE aware of the xenomorph threat. Your primary objective is to survive. You believe a second dropship crashed somewhere to the south east, which was carrying additional weapons" story_text = "Your orders were simple, Recon the site, ascertain if there is a biological weapons program in the area, and if so to secure the colony and retrieve a sample. However your team failed to account for an active anti-air battery near the area. Both your craft and your sister ship crashed. Barely having a chance to catch your breath, you found yourself being assailed by vile xenomorphs! You and your team have barely held your ground, at the cost of four of your own, but more are coming and ammo is low. You believe an American rescue force is en route." spawn_priority = SPAWN_PRIORITY_HIGH @@ -174,6 +174,6 @@ equipment = /datum/equipment_preset/survivor/upp/squad_leader synth_equipment = /datum/equipment_preset/synth/survivor/upp intro_text = "You are a member of a UPP recon force!" - intro_body = "You ARE aware of the xenomorph threat.

Your primary objective is to survive. You believe a second dropship crashed somewhere to the south east, which was carrying additional weapons" + intro_body = "You ARE aware of the xenomorph threat. Your primary objective is to survive. You believe a second dropship crashed somewhere to the south east, which was carrying additional weapons" story_text = "Your orders were simple, Recon the site, ascertain if there is a biological weapons program in the area, and if so to secure the colony and retrieve a sample. However your team failed to account for an active anti-air battery near the area. Both your craft and your sister ship crashed. Barely having a chance to catch your breath, you found yourself being assailed by vile xenomorphs! You and your team have barely held your ground, at the cost of four of your own, but more are coming and ammo is low. You believe an American rescue force is en route." spawn_priority = SPAWN_PRIORITY_VERY_HIGH diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Predalien.dm b/code/modules/mob/living/carbon/xenomorph/castes/Predalien.dm index a3386f624c87..7bc738e220d0 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Predalien.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Predalien.dm @@ -82,8 +82,9 @@ return FALSE to_chat(src, role_header("You are a predator-alien hybrid!")) - to_chat(src, role_body("You are a very powerful xenomorph creature that was born of a Yautja warrior body.

You are stronger, faster, and smarter than a regular xenomorph, but you must still listen to the queen. You have a degree of freedom to where you can hunt and claim the heads of the hive's enemies, so check your verbs.")) - to_chat(src, role_header("Your health meter will not regenerate normally, so kill and die for the hive!")) + to_chat(src, role_body("You are a very powerful xenomorph creature that was born of a Yautja warrior body.")) + to_chat(src, role_body("You are stronger, faster, and smarter than a regular xenomorph, but you must still listen to the queen. You have a degree of freedom to where you can hunt and claim the heads of the hive's enemies, so check your verbs.")) + to_chat(src, role_header("Your health meter will not regenerate normally, so kill and die for the hive!")) emote("roar") /datum/behavior_delegate/predalien_base From f367771f5799b87257d92cb79db71bcd85b62f75 Mon Sep 17 00:00:00 2001 From: Birdtalon Date: Mon, 27 Nov 2023 18:42:21 +0000 Subject: [PATCH 08/42] Eggsac carrier revival (#4716) [Forum Thread](https://forum.cm-ss13.com/t/eggsac-carrier-revival/4711) # About the pull request The concept of this PR is to find a middle ground between the current eggsac carrier and the pre #4459 eggsac carrier. This PR will make the following changes. (From this point "normal weeds" can be substituted for "off hive weeds" Placing eggs on hive weeds is **unchanged**.) - Eggsac carrier can once again place eggs on normal weeds. - Eggsac carrier can only place 4 eggs at once on normal weeds. - If the Eggsac places more than 4 eggs on normal weeds, their oldest placed egg will die. No hugger release. - Eggs placed on normal weeds have a maximum lifetime of 5 MINUTES after which they will die. No hugger release. - Eggs placed on normal weeds have a 1 MINUTE life whilst the carrier is further than 14 tiles away from them. - If the carrier dies, all of their sustained eggs die. # Explain why it's good for the game Eggsac carrier at the moment is in a bit of a poor place and has gone from being very strong to quite poor. Considering the limitation of having to place only on hive weeds. The majority of feedback I read against eggsac carrier was with the quantity of eggs able to be placed, as well as the locations they can be placed in, all across the map and with impunity. This PR aims to address those concerns to make the eggsac both less infuriating to play against while still being satisfying to play as a frontline support or as a stealthy trapper. Eggs can no longer be placed all over the map because of the 4 egg limit off weeds, so the carrier has to think where they want to impact the map. The carrier also has to stay within a reasonable distance to where they are impacting with their eggs which localises their impact to their immediate play area. The carrier also has to be more reactive to current events as they cannot place an egg which then becomes useful 30 minutes later. Killing the carrier also has a small reward as in addition to removing a xeno from the game, the eggs they are sustaining are cleared. If a carrier is supporting the front and dies, the marines don't then have to clear X number of eggs AFTER the kill. # Testing Photographs and Procedure 1. Spawn as egg carrier. 2. Plant egg on normal weeds. 3. Move 15+ tiles away. 4. Wait 1 minute 5. OR Wait 5 minutes within 14 tiles. 6. Kill the carrier. The 5 minute lifetime of the eggs will also clear the eggs in the case that the carrier is admin deleted, or some other weird stuff happens which doesn't result in a death. This will also catch carriers de-evolving

Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: add: Eggsac carrier can now place eggs on normal weeds to a maximum of 4 eggs. add: Eggsac carrier eggs on normal weeds have an expiry date. /:cl: --- code/modules/cm_aliens/structures/egg.dm | 60 +++++++++++++++++++ .../mob/living/carbon/xenomorph/egg_item.dm | 13 +++- .../mutators/strains/carrier/eggsac.dm | 55 ++++++++++++++++- 3 files changed, 124 insertions(+), 4 deletions(-) diff --git a/code/modules/cm_aliens/structures/egg.dm b/code/modules/cm_aliens/structures/egg.dm index c23f4f3e2b20..ce0be7c0c8a1 100644 --- a/code/modules/cm_aliens/structures/egg.dm +++ b/code/modules/cm_aliens/structures/egg.dm @@ -296,3 +296,63 @@ linked_egg.HasProximity(C) if(linked_eggmorph) linked_eggmorph.HasProximity(C) + +/* +SPECIAL EGG USED BY EGG CARRIER +*/ + +#define CARRIER_EGG_UNSUSTAINED_LIFE 1 MINUTES +#define CARRIER_EGG_MAXIMUM_LIFE 5 MINUTES + +/obj/effect/alien/egg/carrier_egg + name = "fragile egg" + desc = "It looks like a weird, fragile egg." + ///Owner of the fragile egg, must be a mob/living/carbon/xenomorph/carrier + var/mob/living/carbon/xenomorph/carrier/owner = null + ///Time that the carrier was last within refresh range of the egg (14 tiles) + var/last_refreshed = null + /// Timer holder for the maximum lifetime of the egg as defined CARRIER_EGG_MAXIMUM_LIFE + var/life_timer = null + +/obj/effect/alien/egg/carrier_egg/Initialize(mapload, hivenumber, planter = null) + . = ..() + last_refreshed = world.time + if(!planter) + //If we have no owner when created... this really shouldn't happen but start decaying the egg immediately. + start_unstoppable_decay() + else + //Die after maximum lifetime + life_timer = addtimer(CALLBACK(src, PROC_REF(start_unstoppable_decay)), CARRIER_EGG_MAXIMUM_LIFE, TIMER_STOPPABLE) + set_owner(planter) + +/obj/effect/alien/egg/carrier_egg/Destroy() + if(life_timer) + deltimer(life_timer) + //Remove reference to src in owner's behavior_delegate and set owner to null + if(owner) + var/mob/living/carbon/xenomorph/carrier/my_owner = owner + var/datum/behavior_delegate/carrier_eggsac/behavior = my_owner.behavior_delegate + behavior.eggs_sustained -= src + my_owner = null + return ..() + +/// Set the owner of the egg to the planter. +/obj/effect/alien/egg/carrier_egg/proc/set_owner(mob/living/carbon/xenomorph/carrier/planter) + var/datum/behavior_delegate/carrier_eggsac/my_delegate = planter.behavior_delegate + my_delegate.eggs_sustained += src + owner = planter + +///Check the last refreshed time and burst the egg if we're over the lifetime of the egg +/obj/effect/alien/egg/carrier_egg/proc/check_decay() + if(last_refreshed + CARRIER_EGG_UNSUSTAINED_LIFE < world.time) + start_unstoppable_decay() + +///Burst the egg without hugger release after a 10 second timer & remove the life timer. +/obj/effect/alien/egg/carrier_egg/proc/start_unstoppable_decay() + addtimer(CALLBACK(src, PROC_REF(Burst), TRUE), 10 SECONDS) + if(life_timer) + deltimer(life_timer) + +/obj/effect/alien/egg/carrier_egg/Burst(kill, instant_trigger, mob/living/carbon/xenomorph/X, is_hugger_player_controlled) + . = ..() + owner = null diff --git a/code/modules/mob/living/carbon/xenomorph/egg_item.dm b/code/modules/mob/living/carbon/xenomorph/egg_item.dm index 77c5548d9f9f..05d456d0025d 100644 --- a/code/modules/mob/living/carbon/xenomorph/egg_item.dm +++ b/code/modules/mob/living/carbon/xenomorph/egg_item.dm @@ -98,7 +98,7 @@ to_chat(user, SPAN_XENOWARNING("[src] must be planted on [lowertext(hive.prefix)]weeds.")) return - if(!hive_weeds) + if(!hive_weeds && user.mutation_type != CARRIER_EGGSAC) to_chat(user, SPAN_XENOWARNING("[src] can only be planted on [lowertext(hive.prefix)]hive weeds.")) return @@ -117,9 +117,16 @@ return for(var/obj/effect/alien/weeds/weed in T) - if(weed.weed_strength >= WEED_LEVEL_HIVE) + if(weed.weed_strength >= WEED_LEVEL_HIVE || user.mutation_type == CARRIER_EGGSAC) user.use_plasma(30) - var/obj/effect/alien/egg/newegg = new /obj/effect/alien/egg(T, hivenumber) + var/obj/effect/alien/egg/newegg + if(weed.weed_strength >= WEED_LEVEL_HIVE) + newegg = new /obj/effect/alien/egg(T, hivenumber) + else if(weed.weed_strength == WEED_LEVEL_STANDARD) + newegg = new /obj/effect/alien/egg/carrier_egg(T,hivenumber, user) + else + to_chat(user, SPAN_XENOWARNING("[src] can't be planted on these weeds.")) + return newegg.flags_embryo = flags_embryo diff --git a/code/modules/mob/living/carbon/xenomorph/mutators/strains/carrier/eggsac.dm b/code/modules/mob/living/carbon/xenomorph/mutators/strains/carrier/eggsac.dm index 524571fc0dfd..3d032da2fe36 100644 --- a/code/modules/mob/living/carbon/xenomorph/mutators/strains/carrier/eggsac.dm +++ b/code/modules/mob/living/carbon/xenomorph/mutators/strains/carrier/eggsac.dm @@ -1,6 +1,6 @@ /datum/xeno_mutator/eggsac name = "STRAIN: Carrier - Eggsac" - description = "In exchange for your ability to store huggers and place traps, you gain larger plasma stores, strong pheromones, and the ability to lay eggs by using your plasma stores. In addition, you can now carry twelve eggs at once and can place eggs one pace further than normal" + description = "In exchange for your ability to store huggers and place traps, you gain larger plasma stores, strong pheromones, and the ability to lay eggs by using your plasma stores. In addition, you can now carry twelve eggs at once and can place eggs one pace further than normal. \n\nYou can also place a small number of fragile eggs on normal weeds. These eggs have a lifetime of five minutes while you remain within 14 tiles. Or one minute if you leave this range." flavor_description = "An egg is always an adventure; the next one may be different." cost = MUTATOR_COST_EXPENSIVE individual_only = TRUE @@ -15,6 +15,7 @@ /datum/action/xeno_action/active_toggle/generate_egg, /datum/action/xeno_action/activable/retrieve_egg, // readding it so it gets at the end of the ability list ) + behavior_delegate_type = /datum/behavior_delegate/carrier_eggsac keystone = TRUE /datum/xeno_mutator/eggsac/apply_mutator(datum/mutator_set/individual_mutators/mutator_set) @@ -40,8 +41,57 @@ carrier.update_eggsac_overlays() carrier.eggs_max = 12 carrier.egg_planting_range = 2 + apply_behavior_holder(carrier) return TRUE +#define EGGSAC_OFF_WEED_EGGCAP 4 +#define EGGSAC_EGG_SUSTAIN_DISTANCE 14 + +/datum/behavior_delegate/carrier_eggsac + name = "Eggsac Carrier Behavior Delegate" + ///List of /obj/effect/alien/egg/carrier_egg sustained by the carrier on normal weeds + var/list/eggs_sustained = list() + ///Total number of eggs which can be sustained defined as EGGSAC_OFF_WEED_EGGCAP + var/egg_sustain_cap = EGGSAC_OFF_WEED_EGGCAP + ///Distance from the egg that the carrier can go before it stops sustaining it + var/sustain_distance = EGGSAC_EGG_SUSTAIN_DISTANCE + +/datum/behavior_delegate/carrier_eggsac/append_to_stat() + . = list() + . += "Eggs sustained: [length(eggs_sustained)] / [egg_sustain_cap]" + +/datum/behavior_delegate/carrier_eggsac/on_life() + if(length(eggs_sustained) > egg_sustain_cap) + var/obj/effect/alien/egg/carrier_egg/my_egg = eggs_sustained[1] + remove_egg_owner(my_egg) + my_egg.start_unstoppable_decay() + to_chat(bound_xeno, SPAN_XENOWARNING("You can only sustain [egg_sustain_cap] eggs off hive weeds! Your oldest placed egg is decaying rapidly.")) + + for(var/obj/effect/alien/egg/carrier_egg/my_egg as anything in eggs_sustained) + //Get the distance from us to our sustained egg + if(get_dist(bound_xeno, my_egg) <= sustain_distance) + my_egg.last_refreshed = world.time + else + my_egg.check_decay() + +///Remove owner of egg +/datum/behavior_delegate/carrier_eggsac/proc/remove_egg_owner(obj/effect/alien/egg/carrier_egg/egg) + if(!egg.owner || egg.owner != bound_xeno) + return + eggs_sustained -= egg + egg.owner = null + +/datum/behavior_delegate/carrier_eggsac/handle_death(mob/M) + for(var/obj/effect/alien/egg/carrier_egg/my_egg as anything in eggs_sustained) + remove_egg_owner(my_egg) + my_egg.start_unstoppable_decay() + +///Remove all references to src in eggs_sustained +/datum/behavior_delegate/carrier_eggsac/Destroy() + for(var/obj/effect/alien/egg/carrier_egg/my_egg as anything in eggs_sustained) + my_egg.owner = null + return ..() + /datum/action/xeno_action/active_toggle/generate_egg name = "Generate Eggs (50)" action_icon_state = "lay_egg" @@ -77,3 +127,6 @@ xeno.eggs_cur++ to_chat(xeno, SPAN_XENONOTICE("You generate a egg. Now sheltering: [xeno.eggs_cur] / [xeno.eggs_max].")) xeno.update_icons() + +#undef EGGSAC_OFF_WEED_EGGCAP +#undef EGGSAC_EGG_SUSTAIN_DISTANCE From 52d5b542ec44c9ef9bd45dd0178de50ac9cda2b7 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Mon, 27 Nov 2023 18:50:46 +0000 Subject: [PATCH 09/42] Automatic changelog for PR #4716 [ci skip] --- html/changelogs/AutoChangeLog-pr-4716.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4716.yml diff --git a/html/changelogs/AutoChangeLog-pr-4716.yml b/html/changelogs/AutoChangeLog-pr-4716.yml new file mode 100644 index 000000000000..76dacd7a72ca --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4716.yml @@ -0,0 +1,5 @@ +author: "Birdtalon" +delete-after: True +changes: + - rscadd: "Eggsac carrier can now place eggs on normal weeds to a maximum of 4 eggs." + - rscadd: "Eggsac carrier eggs on normal weeds have an expiry date." \ No newline at end of file From 750591c8cf8bfbb2f29404b2e3b50fbbd9030b54 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Tue, 28 Nov 2023 01:12:25 +0000 Subject: [PATCH 10/42] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-4716.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4828.yml | 7 ------- html/changelogs/AutoChangeLog-pr-5042.yml | 4 ---- html/changelogs/archive/2023-11.yml | 14 ++++++++++++++ 4 files changed, 14 insertions(+), 16 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4716.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4828.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5042.yml diff --git a/html/changelogs/AutoChangeLog-pr-4716.yml b/html/changelogs/AutoChangeLog-pr-4716.yml deleted file mode 100644 index 76dacd7a72ca..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4716.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Birdtalon" -delete-after: True -changes: - - rscadd: "Eggsac carrier can now place eggs on normal weeds to a maximum of 4 eggs." - - rscadd: "Eggsac carrier eggs on normal weeds have an expiry date." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4828.yml b/html/changelogs/AutoChangeLog-pr-4828.yml deleted file mode 100644 index 133404e587a6..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4828.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "fira" -delete-after: True -changes: - - code_imp: "Ported basic /tg/ Status Backend." - - rscadd: "Human transform changes such as lying down, knock down, buckling, are now animated." - - bugfix: "Some statuses will now take effect immediately instead of waiting for a life tick, notably Resting." - - balance: "Many interaction requirements were changed to eg. fail upon stuns rather than if lying down." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5042.yml b/html/changelogs/AutoChangeLog-pr-5042.yml deleted file mode 100644 index ff4fbf2ac464..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5042.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "stalkerino" -delete-after: True -changes: - - rscadd: "readds skull facepaint and skull balaclava (blue and black)" \ No newline at end of file diff --git a/html/changelogs/archive/2023-11.yml b/html/changelogs/archive/2023-11.yml index 8fc0ce518efb..6bd90cf1578e 100644 --- a/html/changelogs/archive/2023-11.yml +++ b/html/changelogs/archive/2023-11.yml @@ -388,3 +388,17 @@ gone off. hislittlecuzingames: - bugfix: Disables launch announcment alarm if it's sounding when queen hijacks +2023-11-28: + Birdtalon: + - rscadd: Eggsac carrier can now place eggs on normal weeds to a maximum of 4 eggs. + - rscadd: Eggsac carrier eggs on normal weeds have an expiry date. + fira: + - code_imp: Ported basic /tg/ Status Backend. + - rscadd: Human transform changes such as lying down, knock down, buckling, are + now animated. + - bugfix: Some statuses will now take effect immediately instead of waiting for + a life tick, notably Resting. + - balance: Many interaction requirements were changed to eg. fail upon stuns rather + than if lying down. + stalkerino: + - rscadd: readds skull facepaint and skull balaclava (blue and black) From 0c02e7bede8350922a3a7225ae56d957c623a8e8 Mon Sep 17 00:00:00 2001 From: forest2001 <41653574+realforest2001@users.noreply.github.com> Date: Tue, 28 Nov 2023 19:18:38 +0000 Subject: [PATCH 11/42] Whiskey Outpost can no longer roll pred rounds. (#5035) # About the pull request As title says. # Explain why it's good for the game # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: del: Whiskey Outpost no longer rolls pred rounds naturally. /:cl: --- code/game/jobs/role_authority.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/jobs/role_authority.dm b/code/game/jobs/role_authority.dm index 8829bf983c25..8deadbeba32e 100644 --- a/code/game/jobs/role_authority.dm +++ b/code/game/jobs/role_authority.dm @@ -262,7 +262,7 @@ I hope it's easier to tell what the heck this proc is even doing, unlike previou if(istype(CO_surv_job)) CO_surv_job.set_spawn_positions(GLOB.players_preassigned) - if(SSnightmare.get_scenario_value("predator_round")) + if(SSnightmare.get_scenario_value("predator_round") && !Check_WO()) SSticker.mode.flags_round_type |= MODE_PREDATOR // Set predators starting amount based on marines assigned var/datum/job/PJ = temp_roles_for_mode[JOB_PREDATOR] From c8d3a20fe67ebc51ae5dc591f4dad690f51be44d Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Tue, 28 Nov 2023 19:26:49 +0000 Subject: [PATCH 12/42] Automatic changelog for PR #5035 [ci skip] --- html/changelogs/AutoChangeLog-pr-5035.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5035.yml diff --git a/html/changelogs/AutoChangeLog-pr-5035.yml b/html/changelogs/AutoChangeLog-pr-5035.yml new file mode 100644 index 000000000000..abc93c822ad3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5035.yml @@ -0,0 +1,4 @@ +author: "realforest2001" +delete-after: True +changes: + - rscdel: "Whiskey Outpost no longer rolls pred rounds naturally." \ No newline at end of file From f86e4737dbd9a1958ce80964b1c13dbe1a1efe97 Mon Sep 17 00:00:00 2001 From: Zonespace <41448081+Zonespace27@users.noreply.github.com> Date: Tue, 28 Nov 2023 15:32:26 -0800 Subject: [PATCH 13/42] Fix nullspaced closet runtime (#4964) # About the pull request ![image](https://github.com/cmss13-devs/cmss13/assets/41448081/a87707be-a80e-4e72-b6ea-d98d4172de79) --- code/game/objects/structures/crates_lockers/closets.dm | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index d6148b23b7f0..2efd8e4e81e9 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -158,10 +158,15 @@ /obj/structure/closet/proc/take_damage(damage) + if(health <= 0) + return + health = max(health - damage, 0) if(health <= 0) - for(var/atom/movable/A as anything in src) - A.forceMove(src.loc) + for(var/atom/movable/movable as anything in src) + if(!loc) + break + movable.forceMove(loc) playsound(loc, 'sound/effects/meteorimpact.ogg', 25, 1) qdel(src) From a454a4f3f40384bbb091e9f46db48eb13883fa3a Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 29 Nov 2023 01:12:33 +0000 Subject: [PATCH 14/42] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-5035.yml | 4 ---- html/changelogs/archive/2023-11.yml | 3 +++ 2 files changed, 3 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-5035.yml diff --git a/html/changelogs/AutoChangeLog-pr-5035.yml b/html/changelogs/AutoChangeLog-pr-5035.yml deleted file mode 100644 index abc93c822ad3..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5035.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "realforest2001" -delete-after: True -changes: - - rscdel: "Whiskey Outpost no longer rolls pred rounds naturally." \ No newline at end of file diff --git a/html/changelogs/archive/2023-11.yml b/html/changelogs/archive/2023-11.yml index 6bd90cf1578e..7b16c3526888 100644 --- a/html/changelogs/archive/2023-11.yml +++ b/html/changelogs/archive/2023-11.yml @@ -402,3 +402,6 @@ than if lying down. stalkerino: - rscadd: readds skull facepaint and skull balaclava (blue and black) +2023-11-29: + realforest2001: + - rscdel: Whiskey Outpost no longer rolls pred rounds naturally. From cce7ad268ba545ae90dce03dedddf4bc6f247da1 Mon Sep 17 00:00:00 2001 From: Kozmos <31109792+HeresKozmos@users.noreply.github.com> Date: Wed, 29 Nov 2023 13:30:40 +0000 Subject: [PATCH 15/42] Kutjevo - South Caves Spring (#5039) # About the pull request Adds a small underground spring to the far south caves of Kutjevo and slightly expands the existing cave system. # Explain why it's good for the game Kutjevo is a good map, but there's a lot of unused cave real estate especially on the NE and SE corners of the map; so I thought this could be a nice little addition which I plan to pair alongside other small cave extensions in the future to hopefully just give it a bit more personality and hopefully chip away at the unused space. To help reduce the chances that it'll become some kind of meta hive spot (somehow... even when it's right next to power plant...) I added a bunch of large rocks ontop of the already proportionally large body of water to reduce proper walling ability. # Testing Photographs and Procedure With Spring: ![image](https://github.com/cmss13-devs/cmss13/assets/31109792/59c3a316-39ac-4d52-8f18-823347eb2a6e) Without Spring: ![image](https://github.com/cmss13-devs/cmss13/assets/31109792/d018d3b6-da45-499f-8980-3696f4143979) Spring Close-Up: ![image](https://github.com/cmss13-devs/cmss13/assets/31109792/ed70d237-5b92-4ccd-8ca7-55c07864163b) Short Video: https://cdn.discordapp.com/attachments/746325498896056329/1178118032103587850/Kutjevo_Spring_Demo_720P.mp4?ex=6574faeb&is=656285eb&hm=9f1e047ab62ef4e99f9cabb682e6bd42599c1348c4cda0db4417de9a766b9ea7& _(It will download if you click the link*)_ # Changelog :cl: mapadd: added a new spring area to kutjevo's south caves /:cl: --- code/game/area/kutjevo.dm | 4 + maps/map_files/Kutjevo/Kutjevo.dmm | 1465 ++++++++++++++++++---------- 2 files changed, 938 insertions(+), 531 deletions(-) diff --git a/code/game/area/kutjevo.dm b/code/game/area/kutjevo.dm index 422017c0a46b..a5a12cd5b999 100644 --- a/code/game/area/kutjevo.dm +++ b/code/game/area/kutjevo.dm @@ -67,6 +67,10 @@ name = "Kutjevo - Power Station River" icon_state = "lz_river" +/area/kutjevo/exterior/spring + name = "Kutjevo - Southern Spring" + icon_state = "lz_river" + /area/kutjevo/exterior/scrubland name = "Kutjevo - Scrubland" icon_state = "scrubland" diff --git a/maps/map_files/Kutjevo/Kutjevo.dmm b/maps/map_files/Kutjevo/Kutjevo.dmm index 676bd49576f0..4eb4d6fd77e9 100644 --- a/maps/map_files/Kutjevo/Kutjevo.dmm +++ b/maps/map_files/Kutjevo/Kutjevo.dmm @@ -62,6 +62,10 @@ "adD" = ( /turf/open/floor/almayer/research/containment/floor1, /area/kutjevo/exterior/lz_dunes) +"adG" = ( +/obj/effect/landmark/structure_spawner/setup/distress/xeno_door, +/turf/open/auto_turf/sand/layer0, +/area/kutjevo/interior/colony_South) "adX" = ( /obj/item/stack/sheet/wood, /obj/structure/machinery/light, @@ -362,6 +366,15 @@ dir = 4 }, /area/kutjevo/interior/complex/Northwest_Dorms) +"axi" = ( +/obj/structure/flora/bush/ausbushes/grassybush{ + pixel_x = -4; + pixel_y = 10 + }, +/turf/open/gm/river/desert/shallow_edge{ + dir = 9 + }, +/area/kutjevo/exterior/spring) "axK" = ( /obj/item/trash/cigbutt/bcigbutt, /obj/structure/stairs/perspective/kutjevo{ @@ -679,6 +692,13 @@ icon = 'icons/turf/floors/desert_water_toxic.dmi' }, /area/kutjevo/interior/oob) +"aXU" = ( +/obj/structure/barricade/wooden{ + dir = 1; + pixel_y = 13 + }, +/turf/open/desert/desert_shore/shore_edge1, +/area/kutjevo/exterior/spring) "aXV" = ( /obj/structure/machinery/colony_floodlight_switch, /turf/closed/wall/kutjevo/colony/reinforced, @@ -1958,6 +1978,14 @@ }, /turf/open/asphalt/cement_sunbleached, /area/kutjevo/interior/power) +"cKY" = ( +/obj/structure/prop/brazier/frame/full/campfire, +/obj/item/tool/match/paper{ + pixel_y = -2; + pixel_x = -11 + }, +/turf/open/auto_turf/sand/layer1, +/area/kutjevo/exterior/spring) "cLn" = ( /obj/structure/stairs/perspective/kutjevo{ dir = 1; @@ -2286,6 +2314,11 @@ }, /turf/open/floor/plating/kutjevo, /area/kutjevo/interior/complex/botany) +"dcC" = ( +/turf/open/desert/desert_shore/shore_edge1{ + dir = 1 + }, +/area/kutjevo/exterior/spring) "ddi" = ( /obj/structure/platform/kutjevo, /obj/structure/blocker/invisible_wall, @@ -2418,6 +2451,11 @@ dir = 10 }, /area/kutjevo/interior/colony_South/power2) +"dnd" = ( +/turf/open/gm/river/desert/shallow_edge{ + dir = 8 + }, +/area/kutjevo/exterior/spring) "dnl" = ( /obj/structure/platform/kutjevo/rock, /turf/open/auto_turf/sand/layer1, @@ -2676,6 +2714,15 @@ dir = 8 }, /area/kutjevo/exterior/runoff_river) +"dBt" = ( +/obj/structure/flora/bush/ausbushes/grassybush{ + pixel_x = -8; + pixel_y = 10 + }, +/turf/open/gm/river/desert/shallow_edge{ + dir = 5 + }, +/area/kutjevo/exterior/spring) "dBO" = ( /obj/structure/ladder, /obj/structure/blocker/invisible_wall, @@ -2744,6 +2791,12 @@ }, /turf/open/auto_turf/sand/layer0, /area/kutjevo/interior/colony_South) +"dGi" = ( +/obj/structure/flora/grass/tallgrass/desert/corner{ + dir = 1 + }, +/turf/open/auto_turf/sand/layer1, +/area/kutjevo/exterior/spring) "dGx" = ( /obj/structure/window/framed/kutjevo, /turf/open/floor/kutjevo/tan, @@ -2867,6 +2920,11 @@ /obj/effect/landmark/structure_spawner/setup/distress/xeno_weed_node, /turf/open/auto_turf/sand/layer0, /area/kutjevo/interior/colony_north) +"dOj" = ( +/turf/open/gm/river/desert/shallow_corner{ + dir = 1 + }, +/area/kutjevo/exterior/spring) "dOJ" = ( /obj/structure/barricade/deployable, /turf/open/floor/kutjevo/colors/purple/edge, @@ -2957,6 +3015,10 @@ }, /turf/open/gm/river/desert/shallow, /area/kutjevo/exterior/runoff_river) +"dUc" = ( +/obj/structure/flora/grass/tallgrass/desert, +/turf/open/auto_turf/sand/layer2, +/area/kutjevo/exterior/spring) "dUy" = ( /obj/structure/platform/kutjevo/smooth, /turf/open/floor/kutjevo/multi_tiles{ @@ -3046,6 +3108,15 @@ /obj/structure/blocker/invisible_wall, /turf/open/floor/plating/kutjevo, /area/kutjevo/exterior/runoff_dunes) +"eaT" = ( +/obj/effect/landmark/structure_spawner/setup/distress/xeno_door, +/turf/open/auto_turf/sand/layer1, +/area/kutjevo/interior/colony_South) +"ebv" = ( +/turf/open/desert/desert_shore/shore_corner2{ + dir = 8 + }, +/area/kutjevo/exterior/spring) "ebB" = ( /turf/open/auto_turf/sand/layer1, /area/kutjevo/interior/colony_S_East) @@ -3427,6 +3498,9 @@ "evZ" = ( /turf/open/floor/almayer/research/containment/floor2, /area/kutjevo/interior/power) +"ewl" = ( +/turf/open/desert/desert_shore/desert_shore1, +/area/kutjevo/exterior/spring) "ewF" = ( /obj/item/phone{ pixel_x = 1; @@ -3548,6 +3622,20 @@ }, /turf/open/floor/kutjevo/grey/plate, /area/kutjevo/interior/construction) +"eCE" = ( +/obj/item/clipboard{ + pixel_y = 4; + pixel_x = -4 + }, +/obj/item/tool/pen{ + name = "stained pen"; + desc = "It's a seemingly normal pen... aside from the faint red fingerprints on the side..."; + pixel_x = 2; + pixel_y = 10 + }, +/obj/item/paper/crumpled/bloody, +/turf/open/auto_turf/sand/layer1, +/area/kutjevo/exterior/spring) "eCY" = ( /obj/structure/machinery/cryo_cell, /turf/open/floor/kutjevo/grey/plate, @@ -3604,6 +3692,10 @@ "eHX" = ( /turf/open/auto_turf/sand/layer0, /area/kutjevo/exterior/telecomm/lz1_south) +"eIq" = ( +/obj/item/tool/hatchet, +/turf/open/auto_turf/sand/layer1, +/area/kutjevo/exterior/spring) "eIL" = ( /turf/open/floor/kutjevo/colors/cyan/edge{ dir = 4 @@ -3859,6 +3951,9 @@ dir = 4 }, /area/kutjevo/interior/colony_South/power2) +"eVR" = ( +/turf/open/gm/river/desert/deep, +/area/kutjevo/exterior/spring) "eWP" = ( /obj/effect/landmark/corpsespawner/colonist/kutjevo, /turf/open/floor/kutjevo/multi_tiles, @@ -3943,6 +4038,10 @@ icon = 'icons/turf/floors/desert_water_toxic.dmi' }, /area/kutjevo/interior/power) +"fdH" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/auto_turf/sand/layer0, +/area/kutjevo/exterior/spring) "fdS" = ( /obj/effect/decal/cleanable/blood/xeno{ icon_state = "xgib1" @@ -4114,6 +4213,10 @@ dir = 4 }, /area/kutjevo/interior/construction) +"fne" = ( +/obj/item/trash/barcardine, +/turf/open/auto_turf/sand/layer1, +/area/kutjevo/exterior/spring) "foE" = ( /obj/structure/surface/table/reinforced/prison, /obj/structure/barricade/handrail/kutjevo{ @@ -4411,6 +4514,12 @@ }, /turf/open/floor/plating/kutjevo, /area/kutjevo/interior/colony_South/power2) +"fMB" = ( +/obj/structure/flora/grass/tallgrass/desert/corner{ + dir = 5 + }, +/turf/open/auto_turf/sand/layer1, +/area/kutjevo/exterior/spring) "fNc" = ( /obj/structure/platform/kutjevo{ dir = 4 @@ -4589,6 +4698,14 @@ /obj/structure/prop/dam/gravestone, /turf/open/auto_turf/sand/layer0, /area/kutjevo/interior/colony_N_East) +"fYr" = ( +/obj/structure/barricade/wooden{ + desc = "This barricade is heavily reinforced. Nothing short of blasting it open seems like it'll do the trick, that or melting the breams supporting it..."; + dir = 8; + health = 25000 + }, +/turf/open/auto_turf/sand/layer1, +/area/kutjevo/exterior/spring) "fYE" = ( /obj/structure/surface/table/almayer, /obj/structure/machinery/computer/shuttle/dropship/flight/lz2, @@ -4711,6 +4828,10 @@ dir = 8 }, /area/kutjevo/interior/power/comms) +"giY" = ( +/obj/item/device/flashlight/lamp/tripod/grey, +/turf/open/auto_turf/sand/layer1, +/area/kutjevo/exterior/spring) "giZ" = ( /obj/structure/machinery/cm_vending/sorted/medical/wall_med/limited{ pixel_y = 28 @@ -4782,6 +4903,13 @@ dir = 10 }, /area/kutjevo/exterior/runoff_dunes) +"gok" = ( +/obj/structure/flora/bush/desert{ + icon_state = "tree_2"; + pixel_y = 14 + }, +/turf/open/desert/desert_shore/desert_shore1, +/area/kutjevo/exterior/spring) "goT" = ( /turf/closed/wall/kutjevo/rock, /area/kutjevo/exterior/runoff_dunes) @@ -4813,6 +4941,15 @@ /obj/item/clipboard, /turf/open/floor/kutjevo/colors/green, /area/kutjevo/interior/complex/botany) +"gsn" = ( +/obj/structure/flora/bush/desert{ + icon_state = "tree_2"; + pixel_y = 14 + }, +/turf/open/desert/desert_shore/desert_shore1{ + dir = 1 + }, +/area/kutjevo/exterior/spring) "gsq" = ( /obj/structure/filingcabinet, /obj/structure/window/reinforced/tinted{ @@ -4956,6 +5093,13 @@ "gBl" = ( /turf/open/auto_turf/sand/layer0, /area/kutjevo/interior/oob) +"gBu" = ( +/obj/structure/barricade/wooden{ + dir = 4; + pixel_y = 4 + }, +/turf/open/auto_turf/sand/layer2, +/area/kutjevo/exterior/spring) "gBI" = ( /obj/effect/decal/cleanable/blood/oil, /obj/structure/machinery/door/poddoor/shutters/almayer/open{ @@ -5053,6 +5197,9 @@ dir = 8 }, /area/kutjevo/interior/complex/Northwest_Flight_Control) +"gFA" = ( +/turf/open/desert/desert_shore/shore_edge1, +/area/kutjevo/exterior/spring) "gHh" = ( /obj/structure/flora/grass/desert/lightgrass_9, /turf/open/auto_turf/sand/layer0, @@ -5072,6 +5219,15 @@ /obj/effect/landmark/objective_landmark/close, /turf/open/floor/kutjevo/grey/plate, /area/kutjevo/interior/foremans_office) +"gHV" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/auto_turf/sand/layer1, +/area/kutjevo/exterior/spring) +"gJx" = ( +/turf/open/gm/river/desert/shallow_corner{ + dir = 4 + }, +/area/kutjevo/exterior/spring) "gJB" = ( /obj/structure/stairs/perspective/kutjevo{ dir = 8; @@ -5720,6 +5876,11 @@ }, /turf/open/floor/kutjevo/plate, /area/kutjevo/interior/colony_central) +"hET" = ( +/turf/open/gm/river/desert/shallow_edge{ + dir = 10 + }, +/area/kutjevo/exterior/spring) "hFi" = ( /obj/structure/barricade/wooden{ dir = 1; @@ -5848,6 +6009,10 @@ icon_state = "platingdmg3" }, /area/kutjevo/interior/complex/Northwest_Dorms) +"hRG" = ( +/obj/structure/prop/dam/boulder/boulder2, +/turf/open/auto_turf/sand/layer1, +/area/kutjevo/exterior/spring) "hSo" = ( /obj/structure/flora/grass/tallgrass/desert/corner{ dir = 10 @@ -5961,6 +6126,11 @@ }, /turf/open/floor/plating/kutjevo, /area/kutjevo/exterior/construction) +"hZx" = ( +/obj/structure/flora/grass/tallgrass/desert, +/obj/structure/flora/grass/tallgrass/desert, +/turf/open/auto_turf/sand/layer1, +/area/kutjevo/exterior/spring) "iaj" = ( /turf/closed/wall/kutjevo/rock, /area/kutjevo/exterior/lz_river) @@ -6108,6 +6278,12 @@ }, /turf/open/floor/plating/kutjevo, /area/kutjevo/interior/complex/med/triage) +"irb" = ( +/obj/structure/flora/grass/tallgrass/desert/corner{ + dir = 8 + }, +/turf/open/auto_turf/sand/layer1, +/area/kutjevo/exterior/spring) "ird" = ( /obj/structure/blocker/invisible_wall, /obj/structure/platform/kutjevo{ @@ -6381,6 +6557,9 @@ /obj/item/storage/box/trackimp, /turf/open/floor/kutjevo/tan, /area/kutjevo/interior/complex/botany/east_tech) +"iNI" = ( +/turf/open/auto_turf/sand/layer0, +/area/kutjevo/exterior/spring) "iNY" = ( /obj/structure/barricade/wooden{ dir = 8 @@ -6541,6 +6720,13 @@ }, /turf/open/auto_turf/sand/layer0, /area/kutjevo/exterior/complex_border/med_rec) +"jac" = ( +/obj/item/device/radio{ + name = "damp shortwave radio"; + desc = "A regular shortwave radio, this one has experienced minor water damage but is still functional." + }, +/turf/open/desert/desert_shore/shore_corner2, +/area/kutjevo/exterior/spring) "jav" = ( /obj/structure/closet/secure_closet/engineering_welding, /obj/item/ammo_box/magazine/nailgun, @@ -6712,6 +6898,16 @@ /obj/item/stack/sheet/wood, /turf/open/floor/kutjevo/colors, /area/kutjevo/interior/power/comms) +"jnD" = ( +/obj/structure/barricade/wooden{ + dir = 4 + }, +/obj/structure/barricade/wooden{ + dir = 1; + pixel_y = 13 + }, +/turf/open/auto_turf/sand/layer1, +/area/kutjevo/exterior/spring) "jnS" = ( /obj/structure/window/framed/kutjevo, /turf/open/floor/plating/kutjevo, @@ -7282,6 +7478,10 @@ /obj/structure/platform/kutjevo, /turf/open/floor/kutjevo/tan, /area/kutjevo/interior/colony_north) +"kgx" = ( +/obj/structure/flora/grass/tallgrass/desert, +/turf/open/auto_turf/sand/layer1, +/area/kutjevo/exterior/spring) "khI" = ( /obj/structure/window/framed/kutjevo/reinforced/hull, /turf/open/floor/kutjevo/grey/plate, @@ -7668,6 +7868,9 @@ "kDS" = ( /turf/open/floor/kutjevo/tan, /area/kutjevo/interior/complex/botany) +"kEh" = ( +/turf/open/gm/river/desert/shallow_edge, +/area/kutjevo/exterior/spring) "kEG" = ( /obj/structure/sign/poster{ pixel_y = -32 @@ -7724,6 +7927,10 @@ "kIn" = ( /turf/open/auto_turf/sand/layer2, /area/kutjevo/exterior/scrubland) +"kIQ" = ( +/obj/structure/prop/dam/large_boulder/boulder2, +/turf/open/auto_turf/sand/layer1, +/area/kutjevo/exterior/spring) "kKb" = ( /obj/structure/barricade/wooden{ dir = 8 @@ -7837,10 +8044,20 @@ }, /turf/open/floor/plating/kutjevo, /area/kutjevo/interior/colony_South/power2) +"kQa" = ( +/obj/structure/bed/bedroll, +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/auto_turf/sand/layer1, +/area/kutjevo/exterior/spring) "kQo" = ( /obj/structure/girder, /turf/open/auto_turf/sand/layer1, /area/kutjevo/interior/construction) +"kQD" = ( +/turf/open/desert/desert_shore/desert_shore1{ + dir = 8 + }, +/area/kutjevo/exterior/spring) "kQU" = ( /obj/structure/platform/kutjevo{ dir = 8 @@ -8361,6 +8578,11 @@ /obj/item/stack/sheet/wood, /turf/open/floor/kutjevo/colors/purple, /area/kutjevo/interior/complex/med/locks) +"lEf" = ( +/turf/open/gm/river/desert/shallow_edge{ + dir = 6 + }, +/area/kutjevo/exterior/spring) "lEA" = ( /turf/closed/wall/kutjevo/colony/reinforced, /area/kutjevo/interior/colony_central) @@ -8682,6 +8904,11 @@ "mbS" = ( /turf/closed/wall/kutjevo/colony, /area/kutjevo/interior/complex/botany) +"mct" = ( +/turf/open/gm/river/desert/shallow_corner{ + dir = 8 + }, +/area/kutjevo/exterior/spring) "mcv" = ( /obj/structure/window/framed/kutjevo/reinforced/hull, /obj/structure/blocker/invisible_wall, @@ -8977,6 +9204,10 @@ dir = 6 }, /area/kutjevo/interior/complex/med/locks) +"mvX" = ( +/obj/effect/landmark/structure_spawner/setup/distress/xeno_weed_node, +/turf/open/auto_turf/sand/layer1, +/area/kutjevo/exterior/spring) "mwh" = ( /obj/structure/window/framed/kutjevo/reinforced, /turf/open/floor/kutjevo/colors/green/tile, @@ -8996,6 +9227,11 @@ /obj/item/frame/rack, /turf/open/floor/kutjevo/tan/multi_tiles, /area/kutjevo/interior/complex/botany/east_tech) +"myk" = ( +/turf/open/gm/river/desert/shallow_edge{ + dir = 4 + }, +/area/kutjevo/exterior/spring) "mzn" = ( /obj/structure/platform/kutjevo{ dir = 1 @@ -9015,6 +9251,18 @@ /obj/item/storage/pill_bottle/dexalin/skillless, /turf/open/floor/kutjevo/grey/plate, /area/kutjevo/interior/complex/med) +"mAD" = ( +/obj/structure/barricade/wooden{ + dir = 1; + pixel_y = 13 + }, +/obj/structure/barricade/wooden{ + desc = "This barricade is heavily reinforced. Nothing short of blasting it open seems like it'll do the trick, that or melting the breams supporting it..."; + dir = 8; + health = 25000 + }, +/turf/open/auto_turf/sand/layer1, +/area/kutjevo/exterior/spring) "mAH" = ( /obj/effect/decal/cleanable/blood, /obj/effect/decal/kutjevo_decals/catwalk, @@ -9308,6 +9556,11 @@ color = "#990000" }, /area/kutjevo/interior/oob) +"mNv" = ( +/turf/open/gm/river/desert/shallow_edge{ + dir = 5 + }, +/area/kutjevo/exterior/spring) "mNM" = ( /turf/closed/wall/kutjevo/colony, /area/kutjevo/exterior/runoff_bridge) @@ -10083,6 +10336,12 @@ /obj/structure/platform/kutjevo/rock, /turf/open/auto_turf/sand/layer0, /area/kutjevo/interior/colony_central) +"nPq" = ( +/obj/structure/flora/grass/tallgrass/desert/corner{ + dir = 6 + }, +/turf/open/auto_turf/sand/layer1, +/area/kutjevo/exterior/spring) "nPs" = ( /obj/structure/blocker/invisible_wall, /turf/open/auto_turf/sand/layer1, @@ -10096,6 +10355,11 @@ /obj/structure/machinery/iv_drip, /turf/open/floor/kutjevo/colors/cyan, /area/kutjevo/interior/complex/med/triage) +"nPX" = ( +/turf/open/gm/river/desert/shallow_edge{ + dir = 9 + }, +/area/kutjevo/exterior/spring) "nQc" = ( /obj/structure/platform_decoration/kutjevo/rock, /obj/structure/platform_decoration/kutjevo/rock{ @@ -10234,6 +10498,12 @@ /obj/effect/decal/cleanable/blood/splatter, /turf/open/floor/kutjevo/tan, /area/kutjevo/interior/complex/med/operating) +"nZC" = ( +/obj/structure/bed/bedroll, +/obj/effect/landmark/corpsespawner/colonist/kutjevo, +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/auto_turf/sand/layer0, +/area/kutjevo/exterior/spring) "nZK" = ( /turf/open/floor/kutjevo/tan, /area/kutjevo/interior/complex/Northwest_Flight_Control) @@ -10251,6 +10521,12 @@ }, /turf/open/floor/kutjevo/tan/alt_inner_edge, /area/kutjevo/interior/complex/Northwest_Flight_Control) +"obv" = ( +/obj/structure/flora/grass/tallgrass/desert/corner{ + dir = 10 + }, +/turf/open/auto_turf/sand/layer1, +/area/kutjevo/exterior/spring) "oca" = ( /obj/structure/surface/table/almayer, /obj/item/device/flashlight/lamp, @@ -10787,6 +11063,10 @@ /obj/structure/filingcabinet/chestdrawer, /turf/open/floor/carpet, /area/kutjevo/interior/oob) +"oQb" = ( +/obj/structure/flora/grass/tallgrass/desert/corner, +/turf/open/auto_turf/sand/layer1, +/area/kutjevo/exterior/spring) "oQc" = ( /turf/closed/wall/kutjevo/colony, /area/kutjevo/interior/power_pt2_electric_boogaloo) @@ -10990,6 +11270,13 @@ icon_state = "0,5" }, /area/kutjevo/interior/construction) +"pfK" = ( +/obj/structure/barricade/wooden{ + dir = 1; + pixel_y = 13 + }, +/turf/open/auto_turf/sand/layer1, +/area/kutjevo/exterior/spring) "pfR" = ( /obj/structure/platform/kutjevo/rock{ dir = 4 @@ -11116,6 +11403,15 @@ "pmv" = ( /turf/closed/wall/kutjevo/colony/reinforced, /area/kutjevo/exterior/complex_border/med_rec) +"pmD" = ( +/obj/structure/flora/bush/ausbushes/grassybush{ + pixel_x = -6; + pixel_y = 10 + }, +/turf/open/gm/river/desert/shallow_edge{ + dir = 6 + }, +/area/kutjevo/exterior/spring) "pmR" = ( /obj/structure/largecrate/supply/supplies/flares, /turf/open/auto_turf/sand/layer1, @@ -11733,6 +12029,11 @@ dir = 4 }, /area/kutjevo/interior/complex/botany/east_tech) +"qaU" = ( +/turf/open/desert/desert_shore/shore_corner2{ + dir = 1 + }, +/area/kutjevo/exterior/spring) "qaY" = ( /obj/structure/blocker/invisible_wall, /turf/open/desert/desert_shore/shore_corner2{ @@ -12102,6 +12403,12 @@ /obj/effect/landmark/structure_spawner/setup/distress/xeno_weed_node, /turf/open/auto_turf/sand/layer0, /area/kutjevo/interior/colony_S_East) +"qFh" = ( +/obj/structure/flora/grass/tallgrass/desert/corner{ + dir = 4 + }, +/turf/open/auto_turf/sand/layer1, +/area/kutjevo/exterior/spring) "qFU" = ( /turf/open/desert/desert_shore/shore_corner2{ dir = 8 @@ -12493,6 +12800,10 @@ /obj/structure/surface/table/reinforced/prison, /turf/open/floor/kutjevo/colors/red, /area/kutjevo/interior/complex/botany) +"riT" = ( +/obj/item/stack/sheet/wood/small_stack, +/turf/open/auto_turf/sand/layer1, +/area/kutjevo/exterior/spring) "rjS" = ( /obj/structure/blocker/invisible_wall, /obj/structure/platform/kutjevo{ @@ -12661,6 +12972,10 @@ /obj/structure/window/framed/kutjevo/reinforced/hull, /turf/open/floor/plating/kutjevo, /area/kutjevo/interior/power) +"rwC" = ( +/obj/effect/landmark/structure_spawner/setup/distress/xeno_door, +/turf/open/auto_turf/sand/layer2, +/area/kutjevo/interior/colony_South) "rwL" = ( /obj/item/frame/table/almayer, /turf/open/floor/kutjevo/tan, @@ -12739,6 +13054,10 @@ "rCp" = ( /turf/open/desert/desert_shore/desert_shore1, /area/kutjevo/exterior/runoff_bridge) +"rDe" = ( +/obj/structure/prop/dam/boulder/boulder2, +/turf/open/auto_turf/sand/layer0, +/area/kutjevo/exterior/spring) "rDO" = ( /obj/effect/decal/medical_decals{ icon_state = "triagedecalbottomright" @@ -12998,6 +13317,13 @@ }, /turf/open/auto_turf/sand/layer0, /area/kutjevo/exterior/complex_border/botany_medical_cave) +"rUE" = ( +/obj/structure/barricade/wooden{ + dir = 4; + pixel_y = 4 + }, +/turf/open/auto_turf/sand/layer1, +/area/kutjevo/exterior/spring) "rUM" = ( /obj/structure/blocker/forcefield/multitile_vehicles, /obj/structure/girder, @@ -13212,6 +13538,9 @@ /obj/effect/spawner/random/tool, /turf/open/auto_turf/sand/layer0, /area/kutjevo/interior/construction) +"skx" = ( +/turf/open/auto_turf/sand/layer1, +/area/kutjevo/exterior/spring) "slb" = ( /obj/structure/machinery/light{ dir = 4 @@ -13299,6 +13628,10 @@ }, /turf/open/auto_turf/sand/layer1, /area/kutjevo/exterior/scrubland) +"soL" = ( +/obj/item/stack/sheet/wood/small_stack, +/turf/open/auto_turf/sand/layer0, +/area/kutjevo/exterior/spring) "soP" = ( /obj/structure/platform/kutjevo/smooth{ dir = 1 @@ -13544,6 +13877,11 @@ }, /turf/open/floor/kutjevo/colors, /area/kutjevo/interior/complex/botany) +"sGS" = ( +/turf/open/desert/desert_shore/shore_edge1{ + dir = 8 + }, +/area/kutjevo/exterior/spring) "sHg" = ( /obj/structure/bed/chair{ dir = 4 @@ -13859,6 +14197,12 @@ "tax" = ( /turf/open/gm/river/desert/shallow_edge, /area/kutjevo/exterior/runoff_dunes) +"tbx" = ( +/obj/structure/flora/grass/tallgrass/desert/corner{ + dir = 9 + }, +/turf/open/auto_turf/sand/layer1, +/area/kutjevo/exterior/spring) "tdC" = ( /obj/structure/bed/chair{ dir = 4 @@ -14531,6 +14875,11 @@ /obj/structure/blocker/invisible_wall, /turf/open/gm/river/desert/deep, /area/kutjevo/interior/oob) +"uaz" = ( +/turf/open/desert/desert_shore/desert_shore1{ + dir = 1 + }, +/area/kutjevo/exterior/spring) "ubm" = ( /obj/structure/machinery/light{ dir = 8 @@ -14558,6 +14907,11 @@ /obj/structure/platform/kutjevo/rock, /turf/open/auto_turf/sand/layer0, /area/kutjevo/interior/colony_N_East) +"ueM" = ( +/turf/open/desert/desert_shore/shore_corner2{ + dir = 4 + }, +/area/kutjevo/exterior/spring) "ueO" = ( /obj/structure/prop/dam/boulder/boulder1, /turf/open/auto_turf/sand/layer0, @@ -14899,6 +15253,9 @@ }, /turf/open/auto_turf/sand/layer0, /area/kutjevo/exterior/complex_border/med_rec) +"uzJ" = ( +/turf/open/auto_turf/sand/layer2, +/area/kutjevo/exterior/spring) "uAh" = ( /obj/structure/platform/kutjevo/smooth, /turf/open/floor/kutjevo/multi_tiles, @@ -15150,6 +15507,10 @@ icon = 'icons/turf/floors/desert_water_toxic.dmi' }, /area/kutjevo/interior/oob) +"uNW" = ( +/obj/structure/prop/dam/boulder/boulder2, +/turf/open/auto_turf/sand/layer0, +/area/kutjevo/interior/colony_South) "uNZ" = ( /obj/structure/machinery/colony_floodlight, /obj/structure/platform/kutjevo/smooth{ @@ -15424,6 +15785,10 @@ /obj/structure/machinery/vending/snack, /turf/open/floor/kutjevo/colors/red, /area/kutjevo/interior/complex/botany) +"vdK" = ( +/obj/item/stack/sheet/wood/small_stack, +/turf/open/desert/desert_shore/desert_shore1, +/area/kutjevo/exterior/spring) "vdV" = ( /obj/structure/blocker/invisible_wall, /obj/structure/filtration/machine_96x96/indestructible{ @@ -15498,6 +15863,10 @@ /obj/effect/landmark/objective_landmark/medium, /turf/open/floor/kutjevo/colors/green, /area/kutjevo/interior/complex/botany) +"vhC" = ( +/obj/structure/flora/grass/desert/lightgrass_11, +/turf/open/auto_turf/sand/layer1, +/area/kutjevo/exterior/spring) "vhQ" = ( /obj/structure/platform_decoration/kutjevo/rock{ dir = 8 @@ -16316,6 +16685,16 @@ }, /turf/open/floor/kutjevo/multi_tiles, /area/kutjevo/exterior/Northwest_Colony) +"wrO" = ( +/turf/open/gm/river/desert/shallow_edge{ + dir = 1 + }, +/area/kutjevo/exterior/spring) +"wrV" = ( +/turf/open/desert/desert_shore/desert_shore1{ + dir = 4 + }, +/area/kutjevo/exterior/spring) "wsf" = ( /obj/structure/platform_decoration/kutjevo/rock{ dir = 8 @@ -16343,6 +16722,13 @@ dir = 1 }, /area/kutjevo/interior/foremans_office) +"wtk" = ( +/obj/structure/barricade/wooden{ + dir = 4; + pixel_y = 4 + }, +/turf/open/auto_turf/sand/layer0, +/area/kutjevo/exterior/spring) "wtu" = ( /obj/structure/platform_decoration/kutjevo{ dir = 4 @@ -17014,6 +17400,11 @@ dir = 8 }, /area/kutjevo/interior/complex/med/operating) +"xuN" = ( +/turf/open/desert/desert_shore/shore_edge1{ + dir = 4 + }, +/area/kutjevo/exterior/spring) "xuY" = ( /obj/structure/barricade/wooden, /turf/open/floor/kutjevo/multi_tiles{ @@ -17034,6 +17425,9 @@ /obj/structure/window/framed/kutjevo/reinforced, /turf/open/floor/plating/kutjevo, /area/kutjevo/interior/complex/med/pano) +"xxf" = ( +/turf/open/gm/river/desert/shallow_corner, +/area/kutjevo/exterior/spring) "xxz" = ( /obj/structure/prop/dam/gravestone{ icon_state = "gravestone3" @@ -17487,6 +17881,15 @@ /obj/effect/landmark/objective_landmark/close, /turf/open/floor/kutjevo/tan/alt_inner_edge, /area/kutjevo/interior/complex/Northwest_Flight_Control) +"yic" = ( +/obj/structure/flora/bush/desert{ + icon_state = "tree_2"; + pixel_y = 14 + }, +/turf/open/desert/desert_shore/desert_shore1{ + dir = 4 + }, +/area/kutjevo/exterior/spring) "yir" = ( /turf/open/floor/kutjevo/colors/orange, /area/kutjevo/interior/complex/botany/east) @@ -43246,11 +43649,11 @@ bpj bpj bpj bpj -dxF -dxF -dxF -dxF -dxF +bpj +bpj +uzJ +skx +hRG dxF dxF dxF @@ -43413,12 +43816,12 @@ bpj bpj bpj bpj -dxF -dxF -dxF -dxF -dxF -dxF +bpj +bpj +skx +skx +skx +skx dxF dxF dxF @@ -43580,14 +43983,14 @@ bpj bpj oXH bpj -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +bpj +bpj +skx +skx +skx +skx +iNI +iNI dxF dxF dxF @@ -43748,14 +44151,14 @@ npL bpj bpj bpj -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +bpj +skx +skx +skx +uzJ +skx +skx +iNI dxF dxF dxF @@ -43915,16 +44318,16 @@ npL bpj bpj bpj +bpj dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +skx +skx +skx +skx +skx +skx +skx +iNI dxF dxF dxF @@ -44086,13 +44489,13 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +hRG +skx +mvX +uzJ +skx +skx +hRG dxF dxF dxF @@ -44254,14 +44657,14 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +skx +skx +skx +skx +skx +skx +skx +iNI dxF dxF dxF @@ -44421,15 +44824,15 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +iNI +skx +skx +skx +skx +skx +skx +skx +skx dxF dxF dxF @@ -44589,15 +44992,15 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +iNI +skx +skx +uzJ +skx +skx +skx +skx +iNI dxF dxF dxF @@ -44757,14 +45160,14 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +skx +skx +skx +skx +skx +uzJ +uzJ +skx dxF dxF dxF @@ -44926,13 +45329,13 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +iNI +skx +skx +skx +mvX +skx +iNI dxF dxF dxF @@ -45095,12 +45498,12 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF +rDe +skx +skx +skx +skx +iNI dxF dxF dxF @@ -45263,12 +45666,12 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF +iNI +skx +uzJ +skx +skx +iNI dxF dxF dxF @@ -45430,12 +45833,12 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF +iNI +skx +uzJ +uzJ +skx +skx dxF dxF dxF @@ -45598,15 +46001,15 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +skx +mAD +fYr +riT +fYr +skx +skx +skx +pfK dxF dxF dxF @@ -45766,16 +46169,16 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +skx +eIq +skx +gHV +skx +uzJ +kIQ +skx +skx +skx dxF dxF dxF @@ -45933,17 +46336,17 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +giY +skx +skx +skx +mvX +skx +skx +skx +skx +kQa +vhC dxF dxF dxF @@ -46099,19 +46502,19 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +skx +uzJ +skx +skx +iNI +iNI +fdH +iNI +soL +uzJ +cKY +mvX +hRG dxF dxF dxF @@ -46265,21 +46668,21 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +hRG +skx +skx +skx +iNI +dcC +kQD +kQD +kQD +aXU +nZC +gHV +eCE +skx +fne dxF dxF dxF @@ -46432,21 +46835,21 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +skx +uzJ +skx +iNI +dcC +qaU +axi +dnd +hET +vdK +wtk +riT +rUE +gBu +rUE dxF dxF dxF @@ -46599,21 +47002,21 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +fMB +mvX +iNI +dcC +qaU +nPX +dOj +eVR +kEh +jac +gFA +iNI +skx +nPq +qFh dxF dxF dxF @@ -46765,23 +47168,23 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +kgx +dGi +uzJ +iNI +gsn +nPX +dOj +eVR +eVR +mct +hET +ewl +iNI +skx +oQb +kgx +dUc dxF dxF dxF @@ -46932,23 +47335,23 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +kgx +dGi +skx +iNI +uaz +wrO +eVR +eVR +eVR +eVR +kEh +gok +iNI +giY +oQb +kgx +kgx dxF dxF dxF @@ -47099,23 +47502,23 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +irb +tbx +skx +iNI +uaz +wrO +eVR +eVR +eVR +eVR +kEh +ewl +iNI +skx +oQb +kgx +kgx dxF dxF dxF @@ -47266,23 +47669,23 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +skx +skx +skx +iNI +uaz +dBt +xxf +eVR +eVR +gJx +pmD +ewl +iNI +skx +obv +dUc +kgx dxF dxF dxF @@ -47433,22 +47836,22 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +vhC +uzJ +skx +iNI +xuN +ebv +mNv +myk +myk +lEf +ueM +sGS +iNI +kIQ +skx +obv dxF dxF dxF @@ -47601,21 +48004,21 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +skx +skx +skx +iNI +xuN +wrV +wrV +yic +wrV +sGS +iNI +skx +skx +skx +skx dxF dxF dxF @@ -47768,21 +48171,21 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +skx +skx +skx +mvX +iNI +iNI +iNI +iNI +iNI +iNI +skx +uzJ +skx +skx +uzJ dxF dxF dxF @@ -47921,24 +48324,8 @@ npL bpj bpj bpj -mMH -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +bpj +gBl dxF dxF dxF @@ -47949,6 +48336,22 @@ dxF dxF dxF dxF +iNI +iNI +jnD +skx +skx +uzJ +skx +kIQ +skx +skx +skx +skx +skx +mvX +skx +hRG dxF dxF dxF @@ -48088,6 +48491,8 @@ tCm bpj bpj bpj +bpj +bpj dxF dxF dxF @@ -48097,24 +48502,22 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +rDe +iNI +uzJ +skx +riT +skx +giY +skx +skx +skx +nPq +qFh +qFh +fMB +uzJ +vhC dxF dxF dxF @@ -48254,26 +48657,10 @@ mMH bpj bpj bpj -mMH -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +bpj +bpj +bpj +bpj dxF dxF dxF @@ -48281,6 +48668,22 @@ dxF dxF dxF dxF +iNI +skx +skx +skx +skx +jnD +skx +skx +skx +skx +uzJ +oQb +dUc +kgx +dGi +skx dxF dxF dxF @@ -48421,31 +48824,31 @@ wXd npL bpj bpj +bpj +bpj +bpj +bpj +mMH mMH dxF dxF dxF dxF +iNI +skx +mvX +skx +skx +iNI +iNI dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +skx +oQb +kgx +hZx dxF dxF dxF @@ -48588,21 +48991,21 @@ wXd bpj npL bpj -qOP -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +oXH +bpj +bpj +bpj +bpj +bpj +mMH dxF dxF +skx +skx +uzJ +skx +iNI +iNI dxF dxF dxF @@ -48757,18 +49160,18 @@ bpj bpj mMH dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +mMH +bpj +npL +bpj +bpj +mMH +bpj +bpj +skx +skx +skx +iNI dxF dxF dxF @@ -48925,16 +49328,16 @@ bpj dxF dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +bpj +bpj +bpj +oXH +bpj +bpj +bpj +uzJ +skx +iNI dxF dxF dxF @@ -49093,14 +49496,14 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +bpj +bpj +bpj +bpj +bpj +bpj +skx +skx dxF dxF dxF @@ -49260,12 +49663,12 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF +mMH +bpj +bpj +npL +bpj +mMH dxF dxF dxF @@ -49429,10 +49832,10 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF +mMH +bpj +bpj +mMH dxF dxF dxF @@ -49596,11 +49999,11 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF +mMH +bpj +bpj +bpj +mMH dxF dxF dxF @@ -49763,11 +50166,11 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF +uNW +bpj +bpj +bpj +mMH dxF dxF dxF @@ -49931,10 +50334,10 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF +adG +eaT +rwC +eaT dxF dxF dxF @@ -50098,10 +50501,10 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF +mMH +oXH +bpj +bpj dxF dxF dxF @@ -50265,10 +50668,10 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF +mMH +bpj +bpj +bpj dxF dxF dxF @@ -50431,11 +50834,11 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF +mMH +bpj +bpj +bpj +mMH dxF dxF dxF @@ -50597,12 +51000,12 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF +bpj +bpj +bpj +npL +bpj +mMH dxF dxF dxF @@ -50762,13 +51165,13 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +mMH +bpj +bpj +bpj +bpj +bpj +mMH dxF dxF dxF @@ -50929,13 +51332,13 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +mMH +bpj +npL +bpj +bpj +bpj +mMH dxF dxF dxF @@ -51095,13 +51498,13 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +bpj +bpj +bpj +bpj +bpj +bpj +npL dxF dxF dxF @@ -51262,12 +51665,12 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF +bpj +bpj +oXH +bpj +bpj +bpj dxF dxF dxF @@ -51428,13 +51831,13 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +mMH +bpj +npL +bpj +bpj +bpj +bpj dxF dxF dxF @@ -51595,12 +51998,12 @@ dxF dxF dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF +mMH +bpj +bpj +bpj +bpj +mMH dxF dxF dxF @@ -51760,13 +52163,13 @@ bpj bpj dxF dxF -dxF -dxF -dxF -dxF -dxF -dxF -dxF +bpj +bpj +bpj +bpj +npL +bpj +mMH dxF dxF dxF @@ -51926,13 +52329,13 @@ bpj bpj bpj mMH -dxF -dxF -dxF -dxF -dxF -dxF -dxF +bpj +npL +bpj +bpj +bpj +bpj +bpj dxF dxF dxF @@ -52093,13 +52496,13 @@ bpj oXH bpj bpj -dxF -dxF -dxF -dxF -dxF -dxF -dxF +bpj +bpj +oXH +bpj +bpj +mMH +mMH dxF dxF dxF @@ -52260,11 +52663,11 @@ bpj bpj bpj bpj -dxF -dxF -dxF -dxF -dxF +bpj +bpj +bpj +npL +mMH dxF dxF dxF @@ -52428,9 +52831,9 @@ bpj bpj bpj mMH -dxF -dxF -dxF +bpj +bpj +bpj dxF dxF dxF From 95d92c107d784d6bbee683e62fb921670f2951fb Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 29 Nov 2023 13:45:31 +0000 Subject: [PATCH 16/42] Automatic changelog for PR #5039 [ci skip] --- html/changelogs/AutoChangeLog-pr-5039.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5039.yml diff --git a/html/changelogs/AutoChangeLog-pr-5039.yml b/html/changelogs/AutoChangeLog-pr-5039.yml new file mode 100644 index 000000000000..c16d44141a92 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5039.yml @@ -0,0 +1,4 @@ +author: "HeresKozmos" +delete-after: True +changes: + - mapadd: "added a new spring area to kutjevo's south caves" \ No newline at end of file From 26ae7065b6912ba792ae93b0310610d080747931 Mon Sep 17 00:00:00 2001 From: SabreML <57483089+SabreML@users.noreply.github.com> Date: Wed, 29 Nov 2023 14:22:45 +0000 Subject: [PATCH 17/42] Fixes Kutjevo space tiles (#5050) # About the pull request Fixes #5013 by replacing a couple of space tiles under a window with plating. (They were in a 'Nightmare' submap, so I didn't need to touch the main map file.) I also checked the other maps for any more hidden space tiles, and found a few out of bounds in Whiskey Outpost, so I figured I'd add those too. # Explain why it's good for the game They don't actually seem to do anything bad, but either way spess tiles shouldn't be visible on a ground map. # Testing Photographs and Procedure
Screenshots **Before:** ![scrnshot1](https://github.com/cmss13-devs/cmss13/assets/57483089/24b104bd-73bf-4de4-86d7-496db8bb9fef) **After:** ![scrnshot2](https://github.com/cmss13-devs/cmss13/assets/57483089/f99538a2-e16b-4aaf-927c-38a0abfc22ed)
# Changelog :cl: fix: Fixed a few space tiles under a window in Kutjevo Refinery. /:cl: --- maps/map_files/Kutjevo/sprinkles/35.communications.dmm | 8 ++------ maps/map_files/Whiskey_Outpost_v2/Whiskey_Outpost_v2.dmm | 9 +++------ 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/maps/map_files/Kutjevo/sprinkles/35.communications.dmm b/maps/map_files/Kutjevo/sprinkles/35.communications.dmm index 235f370b4321..bc89cfab0105 100644 --- a/maps/map_files/Kutjevo/sprinkles/35.communications.dmm +++ b/maps/map_files/Kutjevo/sprinkles/35.communications.dmm @@ -108,10 +108,6 @@ dir = 1 }, /area/template_noop) -"qI" = ( -/obj/structure/window/framed/kutjevo, -/turf/open/space/basic, -/area/template_noop) "qM" = ( /obj/structure/machinery/light, /obj/effect/decal/cleanable/blood/oil, @@ -492,7 +488,7 @@ Re EK "} (5,1,1) = {" -qI +EK wC rG LO @@ -506,7 +502,7 @@ cm YO "} (6,1,1) = {" -qI +EK rm lZ nn diff --git a/maps/map_files/Whiskey_Outpost_v2/Whiskey_Outpost_v2.dmm b/maps/map_files/Whiskey_Outpost_v2/Whiskey_Outpost_v2.dmm index 36c8e9abe717..917759783a2a 100644 --- a/maps/map_files/Whiskey_Outpost_v2/Whiskey_Outpost_v2.dmm +++ b/maps/map_files/Whiskey_Outpost_v2/Whiskey_Outpost_v2.dmm @@ -2220,9 +2220,6 @@ icon_state = "floor_plate" }, /area/whiskey_outpost/inside/living) -"hP" = ( -/turf/open/space/basic, -/area/whiskey_outpost/inside/caves) "hQ" = ( /turf/open/floor/prison{ icon_state = "floor_plate" @@ -22778,7 +22775,7 @@ mT mT mT mT -hP +mT mT mT dl @@ -23177,12 +23174,12 @@ mT mT mT mT -hP mT mT mT mT -hP +mT +mT mT mT qz From 5cbdba92131fd33973b1e684838ffb8f1feecac2 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 29 Nov 2023 14:31:20 +0000 Subject: [PATCH 18/42] Automatic changelog for PR #5050 [ci skip] --- html/changelogs/AutoChangeLog-pr-5050.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5050.yml diff --git a/html/changelogs/AutoChangeLog-pr-5050.yml b/html/changelogs/AutoChangeLog-pr-5050.yml new file mode 100644 index 000000000000..c78f4bdeb197 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5050.yml @@ -0,0 +1,4 @@ +author: "SabreML" +delete-after: True +changes: + - bugfix: "Fixed a few space tiles under a window in Kutjevo Refinery." \ No newline at end of file From c86715c4577c3bb1744a99910e77c96f52307cfa Mon Sep 17 00:00:00 2001 From: Birdtalon Date: Wed, 29 Nov 2023 21:20:08 +0000 Subject: [PATCH 19/42] Refactors Xenomorph initialize (#4991) # About the pull request Refactors /mob/living/carbon/xenomorph/Initialize() removes a few duplicate proc calls, generate_name() called twice, recalculate_actions() called twice etc. # Explain why it's good for the game # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: code: Refactiors xenomorph initialize & removes some duplicate proc calls /:cl: --- .../mob/living/carbon/xenomorph/Xenomorph.dm | 201 +++++++++--------- .../living/carbon/xenomorph/castes/Queen.dm | 1 + 2 files changed, 102 insertions(+), 100 deletions(-) diff --git a/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm b/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm index cf3be6de9086..645ade04ea4f 100644 --- a/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm +++ b/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm @@ -347,157 +347,158 @@ var/atom/movable/vis_obj/xeno_wounds/wound_icon_holder var/atom/movable/vis_obj/xeno_pack/backpack_icon_holder -/mob/living/carbon/xenomorph/Initialize(mapload, mob/living/carbon/xenomorph/oldXeno, h_number) - var/area/A = get_area(src) - if(A && A.statistic_exempt) - statistic_exempt = TRUE +/mob/living/carbon/xenomorph/Initialize(mapload, mob/living/carbon/xenomorph/old_xeno, hivenumber) + + if(old_xeno && old_xeno.hivenumber) + src.hivenumber = old_xeno.hivenumber + else if(hivenumber) + src.hivenumber = hivenumber + + var/datum/hive_status/hive = GLOB.hive_datum[src.hivenumber] + + if(hive) + hive.add_xeno(src) wound_icon_holder = new(null, src) vis_contents += wound_icon_holder - if(oldXeno) - set_movement_intent(oldXeno.m_intent) - hivenumber = oldXeno.hivenumber - nicknumber = oldXeno.nicknumber - life_kills_total = oldXeno.life_kills_total - life_damage_taken_total = oldXeno.life_damage_taken_total - evolution_stored = oldXeno.evolution_stored - if(oldXeno.iff_tag) - iff_tag = oldXeno.iff_tag - iff_tag.forceMove(src) - oldXeno.iff_tag = null - else if (h_number) - hivenumber = h_number - set_languages(list(LANGUAGE_XENOMORPH, LANGUAGE_HIVEMIND)) - if(oldXeno) - for(var/datum/language/L in oldXeno.languages) - add_language(L.name)//Make sure to keep languages (mostly for event Queens that know English) - // Well, not yet, technically - var/datum/hive_status/in_hive = GLOB.hive_datum[hivenumber] - if(in_hive) - in_hive.add_xeno(src) - // But now we are! + ///Handle transferring things from the old Xeno if we have one in the case of evolve, devolve etc. + if(old_xeno) + src.nicknumber = old_xeno.nicknumber + src.life_kills_total = old_xeno.life_kills_total + src.life_damage_taken_total = old_xeno.life_damage_taken_total + src.evolution_stored = old_xeno.evolution_stored - for(var/T in in_hive.hive_inherant_traits) - ADD_TRAIT(src, T, TRAIT_SOURCE_HIVE) + for(var/datum/language/language as anything in old_xeno.languages) + add_language(language.name)//Make sure to keep languages (mostly for event Queens that know English) + + //Carry over intents & targeted limb to the new Xeno + set_movement_intent(old_xeno.m_intent) + a_intent_change(old_xeno.a_intent) + + //We are hiding, let's keep hiding if we can! + if(old_xeno.layer == XENO_HIDING_LAYER) + for(var/datum/action/xeno_action/onclick/xenohide/hide in actions) + layer = XENO_HIDING_LAYER + hide.button.icon_state = "template_active" + + //If we're holding things drop them + for(var/obj/item/item in old_xeno.contents) //Drop stuff + old_xeno.drop_inv_item_on_ground(item) + old_xeno.empty_gut() + + if(old_xeno.iff_tag) + iff_tag = old_xeno.iff_tag + iff_tag.forceMove(src) + old_xeno.iff_tag = null + + if(hive) + for(var/trait in hive.hive_inherant_traits) + ADD_TRAIT(src, trait, TRAIT_SOURCE_HIVE) mutators.xeno = src + //Set caste stuff if(caste_type && GLOB.xeno_datum_list[caste_type]) caste = GLOB.xeno_datum_list[caste_type] - else - to_world("something went very wrong") - return - update_icon_source() + //Fire immunity signals + if (caste.fire_immunity != FIRE_IMMUNITY_NONE) + if(caste.fire_immunity & FIRE_IMMUNITY_NO_IGNITE) + RegisterSignal(src, COMSIG_LIVING_PREIGNITION, PROC_REF(fire_immune)) - acid_splash_cooldown = caste.acid_splash_cooldown + RegisterSignal(src, list(COMSIG_LIVING_FLAMER_CROSSED, COMSIG_LIVING_FLAMER_FLAMED), PROC_REF(flamer_crossed_immune)) + else + UnregisterSignal(src, list( + COMSIG_LIVING_PREIGNITION, + COMSIG_LIVING_FLAMER_CROSSED, + COMSIG_LIVING_FLAMER_FLAMED + )) - if (caste.fire_immunity != FIRE_IMMUNITY_NONE) - if(caste.fire_immunity & FIRE_IMMUNITY_NO_IGNITE) - RegisterSignal(src, COMSIG_LIVING_PREIGNITION, PROC_REF(fire_immune)) - RegisterSignal(src, list( - COMSIG_LIVING_FLAMER_CROSSED, - COMSIG_LIVING_FLAMER_FLAMED, - ), PROC_REF(flamer_crossed_immune)) - else - UnregisterSignal(src, list( - COMSIG_LIVING_PREIGNITION, - COMSIG_LIVING_FLAMER_CROSSED, - COMSIG_LIVING_FLAMER_FLAMED, - )) + if(caste.spit_types && length(caste.spit_types)) + ammo = GLOB.ammo_list[caste.spit_types[1]] - recalculate_everything() + acid_splash_cooldown = caste.acid_splash_cooldown + + if(caste.adjust_size_x != 1) + var/matrix/matrix = matrix() + matrix.Scale(caste.adjust_size_x, caste.adjust_size_y) + apply_transform(matrix) + + behavior_delegate = new caste.behavior_delegate_type() + behavior_delegate.bound_xeno = src + behavior_delegate.add_to_xeno() + resin_build_order = caste.resin_build_order + + job = caste.caste_type // Used for tracking the caste playtime + + else + CRASH("Attempted to create a new xenomorph [src] without caste datum.") if(mob_size < MOB_SIZE_BIG) mob_flags |= SQUEEZE_UNDER_VEHICLES + // More setup stuff for names, abilities etc + update_icon_source() generate_name() + add_inherent_verbs() + add_abilities() + create_reagents(100) + regenerate_icons() - if(isqueen(src)) - SStracking.set_leader("hive_[hivenumber]", src) - SStracking.start_tracking("hive_[hivenumber]", src) + toggle_xeno_hostilehud() + recalculate_everything() + toggle_xeno_mobhud() //This is a verb, but fuck it, it just werks . = ..() + + //Set leader to the new mob + if(old_xeno && hive && IS_XENO_LEADER(old_xeno)) + hive.replace_hive_leader(old_xeno, src) + + //Begin SStracking + SStracking.start_tracking("hive_[src.hivenumber]", src) + + GLOB.living_xeno_list += src + GLOB.xeno_mob_list += src + //WO GAMEMODE if(SSticker?.mode?.hardcore) hardcore = 1 //Prevents healing and queen evolution time_of_birth = world.time - add_inherent_verbs() - add_abilities() - recalculate_actions() - + //Minimap if(z) INVOKE_NEXT_TICK(src, PROC_REF(add_minimap_marker)) + //Sight sight |= SEE_MOBS see_invisible = SEE_INVISIBLE_LIVING see_in_dark = 12 + if(client) set_lighting_alpha_from_prefs(client) else lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE - if(caste && caste.spit_types && caste.spit_types.len) - ammo = GLOB.ammo_list[caste.spit_types[1]] - - create_reagents(100) - - GLOB.living_xeno_list += src - GLOB.xeno_mob_list += src - - if(caste && caste.adjust_size_x != 1) - var/matrix/M = matrix() - M.Scale(caste.adjust_size_x, caste.adjust_size_y) - apply_transform(M) - - if(caste) - behavior_delegate = new caste.behavior_delegate_type() - behavior_delegate.bound_xeno = src - behavior_delegate.add_to_xeno() - resin_build_order = caste.resin_build_order - else - CRASH("Xenomorph [src] has no caste datum! Tell the devs!") - - regenerate_icons() - toggle_xeno_mobhud() //This is a verb, but fuck it, it just werks - toggle_xeno_hostilehud() - - if(oldXeno) - a_intent_change(oldXeno.a_intent)//Keep intent - - if(oldXeno.layer == XENO_HIDING_LAYER) - //We are hiding, let's keep hiding if we can! - for(var/datum/action/xeno_action/onclick/xenohide/hide in actions) - if(istype(hide)) - layer = XENO_HIDING_LAYER - hide.button.icon_state = "template_active" - - for(var/obj/item/W in oldXeno.contents) //Drop stuff - oldXeno.drop_inv_item_on_ground(W) - - oldXeno.empty_gut() - - if(IS_XENO_LEADER(oldXeno)) - hive.replace_hive_leader(oldXeno, src) - // Only handle free slots if the xeno is not in tdome - if(!is_admin_level(z)) + if(hive && !is_admin_level(z)) var/selected_caste = GLOB.xeno_datum_list[caste_type]?.type hive.used_slots[selected_caste]++ + //Statistics + var/area/current_area = get_area(src) + if(current_area && current_area.statistic_exempt) + statistic_exempt = TRUE if(GLOB.round_statistics && !statistic_exempt) GLOB.round_statistics.track_new_participant(faction, 1) - generate_name() // This can happen if a xeno gets made before the game starts if (hive && hive.hive_ui) hive.hive_ui.update_all_xeno_data() - job = caste.caste_type // Used for tracking the caste playtime Decorate() RegisterSignal(src, COMSIG_MOB_SCREECH_ACT, PROC_REF(handle_screech_act)) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm b/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm index e6f4dfae8a44..ceedff03f2aa 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm @@ -389,6 +389,7 @@ /mob/living/carbon/xenomorph/queen/Initialize() . = ..() + SStracking.set_leader("hive_[hivenumber]", src) if(!is_admin_level(z))//so admins can safely spawn Queens in Thunderdome for tests. xeno_message(SPAN_XENOANNOUNCE("A new Queen has risen to lead the Hive! Rejoice!"),3,hivenumber) notify_ghosts(header = "New Queen", message = "A new Queen has risen.", source = src, action = NOTIFY_ORBIT) From 5e3e04edebd5800cab216b71118ee532780007ca Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 29 Nov 2023 21:30:53 +0000 Subject: [PATCH 20/42] Automatic changelog for PR #4991 [ci skip] --- html/changelogs/AutoChangeLog-pr-4991.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4991.yml diff --git a/html/changelogs/AutoChangeLog-pr-4991.yml b/html/changelogs/AutoChangeLog-pr-4991.yml new file mode 100644 index 000000000000..857c9c0894d2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4991.yml @@ -0,0 +1,4 @@ +author: "Birdtalon" +delete-after: True +changes: + - code_imp: "Refactiors xenomorph initialize & removes some duplicate proc calls" \ No newline at end of file From ddc6c67c1d53eb203e0590592a060f48e44fcdb2 Mon Sep 17 00:00:00 2001 From: harryob Date: Wed, 29 Nov 2023 21:51:14 +0000 Subject: [PATCH 21/42] fixes orbit menu for 0 health and admins refreshing (#5032) closes #5031 :cl: fix: the health indicator in the tooltip and colorbox is still present when a POI has 0 health fix: admins can refresh the orbit menu without runtimes /:cl: --- code/modules/mob/dead/observer/orbit.dm | 2 +- tgui/packages/tgui/interfaces/Orbit/helpers.ts | 4 +++- tgui/packages/tgui/interfaces/Orbit/index.tsx | 14 +++++++++----- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/code/modules/mob/dead/observer/orbit.dm b/code/modules/mob/dead/observer/orbit.dm index 06e404a43555..5fe27c5e5167 100644 --- a/code/modules/mob/dead/observer/orbit.dm +++ b/code/modules/mob/dead/observer/orbit.dm @@ -65,7 +65,7 @@ var/is_admin = FALSE if(user && user.client) - is_admin = check_other_rights(user.client, R_ADMIN, FALSE) + is_admin = check_client_rights(user.client, R_ADMIN, FALSE) var/list/pois = getpois(skip_mindless = !is_admin, specify_dead_role = FALSE) for(var/name in pois) var/list/serialized = list() diff --git a/tgui/packages/tgui/interfaces/Orbit/helpers.ts b/tgui/packages/tgui/interfaces/Orbit/helpers.ts index a43aaf1ff0b0..9facaf339b29 100644 --- a/tgui/packages/tgui/interfaces/Orbit/helpers.ts +++ b/tgui/packages/tgui/interfaces/Orbit/helpers.ts @@ -31,7 +31,9 @@ export const getDisplayName = (full_name: string, nickname?: string) => { }; /** Returns the display color for certain health percentages */ -export const getHealthColor = (health: number) => { +export const getHealthColor = (health?: number) => { + if (!health) return 'bad'; + switch (true) { case health > HEALTH.Good: return 'good'; diff --git a/tgui/packages/tgui/interfaces/Orbit/index.tsx b/tgui/packages/tgui/interfaces/Orbit/index.tsx index e9e345995271..83dfe3b361b2 100644 --- a/tgui/packages/tgui/interfaces/Orbit/index.tsx +++ b/tgui/packages/tgui/interfaces/Orbit/index.tsx @@ -215,6 +215,8 @@ const ObservableItem = ( const [autoObserve] = useLocalState(context, 'autoObserve', false); + const displayHealth = typeof health === 'number'; + return (