From b59b90cf3a9b0fd43c8f9a0617366ab1d95677f3 Mon Sep 17 00:00:00 2001 From: Matt Atlas Date: Fri, 29 Aug 2025 00:38:10 +0200 Subject: [PATCH 01/13] Adds an universal object health system. --- code/game/objects/objs.dm | 88 ++++++++++++++++++++++++++------------- 1 file changed, 59 insertions(+), 29 deletions(-) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 9fbd3aa26e7b..ba376c9d4c53 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -2,52 +2,79 @@ layer = OBJ_LAYER animate_movement = 2 - var/list/matter //Used to store information about the contents of the object. - var/recyclable = FALSE //Whether the object can be recycled (eaten) by something like the Autolathe - var/w_class // Size of the object. - var/list/origin_tech = null //Used by R&D to determine what research bonuses it grants. - var/unacidable = 0 //universal "unacidabliness" var, here so you can use it in any obj. - - var/obj_flags //Special flags such as whether or not this object can be rotated. + /// Used to store information about the contents of the object. + var/list/matter + /// Whether the object can be recycled (eaten) by something like the Autolathe. + var/recyclable = FALSE + /// Size of the object. + var/w_class + ///Used by R&D to determine what research bonuses it grants. + var/list/origin_tech = null + /// Universal "unacidabliness" var, here so you can use it in any obj. As xeno acid is gone, this is now only used for chemistry acid. + var/unacidable = 0 + + /// Special flags such as whether or not this object can be rotated. + var/obj_flags + /// The object's force when thrown. var/throwforce = 1 - var/list/attack_verb //Used in attackby() to say how something was attacked "[x] has been [z.attack_verb] by [y] with [z]" - var/sharp = 0 // whether this object cuts - var/edge = FALSE // whether this object is more likely to dismember - var/in_use = 0 // 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! + /// Used in attackby() to say how something was attacked "[x] has been [z.attack_verb] by [y] with [z]". + var/list/attack_verb + /// Whether this object creates CUT wounds. + var/sharp = 0 + /// Whether this object is more likely to dismember. + var/edge = FALSE + /// 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 = 0 + /// The type of damage this object deals. var/damtype = DAMAGE_BRUTE + /// The damage this object deals. var/force = 0 + /// The armour penetration this object has. var/armor_penetration = 0 - var/noslice = 0 // To make it not able to slice things. - + /// To make it not able to slice things. Used for curtains, flaps, pumpkins... why the fuck aren't you just using edge? + var/noslice = FALSE + /// The health of this object. If null, health is not used. + var/health + /// Set to TRUE when shocked by the tesla ball, to not repeatedly shock the object. var/being_shocked = 0 - var/icon_species_tag = ""//If set, this holds the 3-letter shortname of a species, used for species-specific worn icons - var/icon_auto_adapt = 0//If 1, this item will automatically change its species tag to match the wearer's species. - //requires that the wearer's species is listed in icon_supported_species_tags + /// The slot the object will equip to. + var/equip_slot = 0 + /// If set, this holds the 3-letter shortname of a species, used for species-specific worn icons + var/icon_species_tag = "" + /// If 1, this item will automatically change its species tag to match the wearer's species. Requires that the wearer's species is listed in icon_supported_species_tags. + var/icon_auto_adapt = 0 /** * A list of strings used with icon_auto_adapt, a list of species which have differing appearances for this item, - * based on the specie short name + * based on the species short name */ var/list/icon_supported_species_tags ///If `TRUE`, will use the `icon_species_tag` var for rendering this item in the left/right hand var/icon_species_in_hand = FALSE - var/equip_slot = 0 + ///Played when the item is used, for example tools var/usesound - + /// The speed of the tool. This is generally a divisor. var/toolspeed = 1 + /// The sound this tool makes in surgery. var/surgerysound /* START BUCKLING VARS */ + /// A list of things that can buckle to this atom. var/list/can_buckle + /// If the buckled atom can move, and thus face directions. var/buckle_movable = 0 + /// The direction forced on a buckled atom. var/buckle_dir = 0 - var/buckle_lying = -1 //bed-like behavior, forces mob.lying = buckle_lying if != -1 - var/buckle_require_restraints = 0 //require people to be handcuffed before being able to buckle. eg: pipes + /// Causesbed-like behavior, forces mob.lying = buckle_lying if != -1. + var/buckle_lying = -1 + /// Require people to be handcuffed before being able to buckle. eg: pipes. + var/buckle_require_restraints = 0 + /// The atom buckled to us. var/atom/movable/buckled = null /** * Stores the original layer of a buckled atom. @@ -57,25 +84,28 @@ * Used in `/unbuckle()` to restore the original layer. */ var/buckled_original_layer = null - var/buckle_delay = 0 //How much extra time to buckle someone to this object. + /// How much extra time to buckle someone to this object. + var/buckle_delay = 0 /* END BUCKLING VARS */ /* START ACCESS VARS */ + /// Required access. var/list/req_access + /// Only require one of these accesses. var/list/req_one_access /* END ACCESS VARS */ /* START PERSISTENCE VARS */ - // State check if the subsystem is tracking the object, used for easy state checking without iterating the register + /// State check if the subsystem is tracking the object, used for easy state checking without iterating the register var/persistence_track_active = FALSE - // Tracking ID of the object used by the persistence subsystem + /// Tracking ID of the object used by the persistence subsystem var/persistence_track_id = 0 - // Author ckey of the object used in persistence subsystem - // Note: Not every type can have an author, like generated dirt for example - // Additionally, the ckey is only an indicator, for example: A player could pin a paper without having written it - // This should be considered for any moderation purpose + /// Author ckey of the object used in persistence subsystem + /// Note: Not every type can have an author, like generated dirt for example + /// Additionally, the ckey is only an indicator, for example: A player could pin a paper without having written it + /// This should be considered for any moderation purpose var/persistence_author_ckey = null - // Expiration time used when saving/updating a persistent type, this can be changed depending on the use case by assigning a new value + /// Expiration time used when saving/updating a persistent type, this can be changed depending on the use case by assigning a new value var/persistance_expiration_time_days = PERSISTENT_DEFAULT_EXPIRATION_DAYS /* END PERSISTENCE VARS */ From 99307b727bba08c5b5d6dc14f7e62b376d378e1f Mon Sep 17 00:00:00 2001 From: Matt Atlas Date: Fri, 29 Aug 2025 01:52:10 +0200 Subject: [PATCH 02/13] in the sunset the sky was ablaze with gold embers --- code/game/machinery/atmoalter/canister.dm | 2 +- code/game/machinery/bots/bots.dm | 2 - code/game/machinery/deployable.dm | 7 +- code/game/machinery/doors/door.dm | 5 +- code/game/machinery/portable_turret.dm | 6 +- code/game/objects/effects/spiders.dm | 2 +- code/game/objects/items.dm | 1 - code/game/objects/items/weapons/weaponry.dm | 2 +- code/game/objects/objs.dm | 65 ++++++++++++++++++- code/game/objects/structures.dm | 28 ++++---- .../structures/barricades/_barricade.dm | 31 ++++----- .../objects/structures/barricades/liquid.dm | 2 +- .../objects/structures/barricades/metal.dm | 2 +- .../objects/structures/barricades/wood.dm | 2 +- .../structures/crates_lockers/closets.dm | 2 +- code/game/objects/structures/crystals.dm | 3 +- code/game/objects/structures/displaycase.dm | 2 +- .../objects/structures/full_window_frame.dm | 1 - code/game/objects/structures/girders.dm | 2 +- code/game/objects/structures/gore/core.dm | 9 +-- code/game/objects/structures/gore/nest.dm | 9 +-- code/game/objects/structures/gore/tendrils.dm | 8 +-- code/game/objects/structures/gore/wall.dm | 6 +- code/game/objects/structures/grille.dm | 2 +- code/game/objects/structures/hadii_statue.dm | 2 +- code/game/objects/structures/hivebot_head.dm | 2 +- code/game/objects/structures/inflatable.dm | 4 +- code/game/objects/structures/railing.dm | 5 +- code/game/objects/structures/simple_doors.dm | 5 +- code/game/objects/structures/window.dm | 4 +- code/modules/blob/blob.dm | 30 ++++----- .../heavy_vehicle/components/_components.dm | 6 +- code/modules/heavy_vehicle/mech_damage.dm | 8 +-- .../hydroponics/spreading/spreading.dm | 14 ++-- .../hydroponics/spreading/spreading_growth.dm | 10 +-- code/modules/hydroponics/trays/tray.dm | 30 ++++----- .../mob/living/simple_animal/borer/borer.dm | 2 +- .../constructs/constructs/artificer.dm | 2 +- .../constructs/constructs/harvester.dm | 2 +- .../constructs/constructs/juggernaut.dm | 2 +- .../constructs/constructs/wraith.dm | 2 +- .../living/simple_animal/friendly/adhomai.dm | 8 +-- .../simple_animal/friendly/farm_animals.dm | 12 ++-- .../living/simple_animal/friendly/hakhma.dm | 2 +- .../living/simple_animal/friendly/moghes.dm | 8 +-- .../living/simple_animal/friendly/ratking.dm | 18 ++--- .../simple_animal/friendly/schlorrgo.dm | 4 +- .../simple_animal/friendly/spiderbot.dm | 2 +- .../living/simple_animal/friendly/tomato.dm | 2 +- .../living/simple_animal/hostile/adhomai.dm | 8 +-- .../mob/living/simple_animal/hostile/alien.dm | 6 +- .../simple_animal/hostile/cavern_geist.dm | 2 +- .../simple_animal/hostile/changeling.dm | 4 +- .../hostile/commanded/bear_companion.dm | 2 +- .../hostile/commanded/guard_dog.dm | 2 +- .../simple_animal/hostile/commanded/ives.dm | 2 +- .../living/simple_animal/hostile/creature.dm | 2 +- .../living/simple_animal/hostile/faithless.dm | 2 +- .../simple_animal/hostile/giant_spider.dm | 2 +- .../simple_animal/hostile/hivebots/hivebot.dm | 10 +-- .../hostile/hivebots/hivebot_harvester.dm | 2 +- .../simple_animal/hostile/ipc_zombie.dm | 2 +- .../living/simple_animal/hostile/krampus.dm | 4 +- .../mob/living/simple_animal/hostile/mimic.dm | 4 +- .../living/simple_animal/hostile/moghes.dm | 4 +- .../mob/living/simple_animal/hostile/morph.dm | 2 +- .../simple_animal/hostile/phoron_worm.dm | 2 +- .../living/simple_animal/hostile/pirate.dm | 2 +- .../mob/living/simple_animal/hostile/pra.dm | 2 +- .../simple_animal/hostile/retaliate/cavern.dm | 2 +- .../simple_animal/hostile/retaliate/clown.dm | 2 +- .../hostile/retaliate/konyang.dm | 2 +- .../hostile/rogue_maint_drone.dm | 2 +- .../living/simple_animal/hostile/russian.dm | 2 +- .../simple_animal/hostile/space_fauna.dm | 4 +- .../simple_animal/hostile/spider_queen.dm | 2 +- .../living/simple_animal/hostile/syndicate.dm | 4 +- .../living/simple_animal/hostile/toy/mech.dm | 2 +- .../mob/living/simple_animal/hostile/tree.dm | 2 +- .../living/simple_animal/hostile/vannatusk.dm | 2 +- .../simple_animal/hostile/viscerator.dm | 2 +- .../modules/mob/living/simple_animal/shade.dm | 2 +- .../mob/living/simple_animal/simple_animal.dm | 2 +- code/modules/mob/living/simple_animal/worm.dm | 2 +- code/modules/organs/organ.dm | 2 +- code/modules/organs/organ_external.dm | 3 +- .../ship_weaponry/_ship_ammo_loader.dm | 11 +--- .../overmap/ship_weaponry/_ship_gun.dm | 26 ++++---- .../ship_weaponry/weaponry/leviathan.dm | 2 +- .../overmap/ships/computers/sensors.dm | 6 +- code/modules/power/cable.dm | 12 ++-- code/modules/power/collector.dm | 3 +- code/modules/power/smes.dm | 4 +- code/modules/power/solar.dm | 2 +- code/modules/random_map/automata/diona.dm | 7 +- code/modules/recycling/disposal.dm | 4 +- code/modules/research/server.dm | 3 +- code/modules/shieldgen/emergency_shield.dm | 4 +- code/modules/tables/tables.dm | 9 +-- code/modules/vehicles/vehicle.dm | 3 - .../code/sccv_horizon_structures.dm | 2 +- tgui/public/tgui.bundle.js | 2 +- 102 files changed, 313 insertions(+), 279 deletions(-) diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 3ded489fa4cf..6c6174ac6d2f 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/atmos.dmi' icon_state = "yellow" density = 1 - var/health = 100.0 + health = 50 obj_flags = OBJ_FLAG_SIGNALER | OBJ_FLAG_CONDUCTABLE w_class = WEIGHT_CLASS_HUGE diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm index 6eba6b53b97e..fe324062c750 100644 --- a/code/game/machinery/bots/bots.dm +++ b/code/game/machinery/bots/bots.dm @@ -7,8 +7,6 @@ use_power = POWER_USE_OFF var/obj/item/card/id/botcard // the ID card that the bot "holds" var/on = 1 - var/health = 0 //do not forget to set health for your bot! - var/maxhealth = 0 var/fire_dam_coeff = 1.0 var/brute_dam_coeff = 1.0 var/open = 0//Maint panel diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 0419fe5ec7d0..79fa3ec4850a 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -17,10 +17,9 @@ Deployable Kits build_amt = 5 anchored = TRUE density = TRUE + health = 100 var/force_material - var/health = 100 - var/maxhealth = 100 /obj/structure/blocker/Initialize(mapload, var/material_name) . = ..() @@ -146,8 +145,8 @@ Deployable Kits anchored = 0.0 density = 1.0 icon_state = "barrier" - var/health = 100.0 - var/maxhealth = 100.0 + health = 100 + maxhealth = 100 var/locked = 0.0 // req_access = list(ACCESS_MAINT_TUNNELS) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index cd0805f26616..e2a00c613091 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -11,6 +11,9 @@ density = 1 layer = CLOSED_DOOR_LAYER dir = SOUTH + + maxhealth = 300 + var/open_layer = OPEN_DOOR_LAYER var/closed_layer = CLOSED_DOOR_LAYER @@ -35,8 +38,6 @@ var/air_properties_vary_with_direction = 0 /// Integer. Corresponds to dirs. If opened from this dir, no access is required. var/unres_dir = null - var/maxhealth = 300 - var/health /// Integer. How many strong hits it takes to destroy the door. var/destroy_hits = 10 /// Integer. Minimum amount of force needed to damage the door with a melee weapon. diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index b7c3718099d4..b7c550befcae 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -19,6 +19,9 @@ active_power_usage = 300 //when active, this turret takes up constant 300 Equipment power power_channel = AREA_USAGE_EQUIP //drains power from the EQUIPMENT channel + health = 80 + maxhealth = 80 + req_one_access = list(ACCESS_SECURITY, ACCESS_HEADS) light_range = 3 @@ -26,8 +29,7 @@ var/raised = 0 //if the turret cover is "open" and the turret is raised var/raising= 0 //if the turret is currently opening or closing its cover - var/health = 80 //the turret's health - var/maxhealth = 80 //turrets maximal health. + var/auto_repair = 0 //if 1 the turret slowly repairs itself. var/locked = 1 //if the turret's behaviour control access is locked var/controllock = 0 //if the turret responds to control panels diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 46349b798b42..13c6e7dc20f6 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -6,7 +6,7 @@ anchored = TRUE density = FALSE mouse_opacity = MOUSE_OPACITY_ICON - var/health = 15 + maxhealth = 15 //similar to weeds, but only barfed out by nurses manually /obj/effect/spider/ex_act(severity) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index fef0c9d805ec..c1a9ab0a856e 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -10,7 +10,6 @@ var/randpixel = 6 var/abstract = 0 var/r_speed = 1.0 - var/health var/burn_point var/burning diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index 357592130c42..bcfbf950f528 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -44,7 +44,7 @@ anchored = TRUE mouse_opacity = MOUSE_OPACITY_ICON - var/health = 50 + health = 50 var/mob/living/affecting = null //Who it is currently affecting, if anyone. /obj/effect/energy_net/Initialize() diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index ba376c9d4c53..495869f5a8dd 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -33,8 +33,12 @@ var/armor_penetration = 0 /// To make it not able to slice things. Used for curtains, flaps, pumpkins... why the fuck aren't you just using edge? var/noslice = FALSE - /// The health of this object. If null, health is not used. + /// The health of this object. If this is null, it will set health to maxhealth on Initialize. Otherwise, you can set a custom health value to use at initialize. var/health + /// The maximum health of this object. If null, health is not used. + var/maxhealth + /// The sound played when this object is destroyed. + var/destroy_sound /// Set to TRUE when shocked by the tesla ball, to not repeatedly shock the object. var/being_shocked = 0 @@ -109,6 +113,13 @@ var/persistance_expiration_time_days = PERSISTENT_DEFAULT_EXPIRATION_DAYS /* END PERSISTENCE VARS */ +/obj/Initialize(mapload, ...) + . = ..() + if(maxhealth) + if(!health) + // Allows you to set dynamic health states on initialize. + maxhealth = health + /obj/Destroy() if(persistence_track_active) // Prevent hard deletion of references in the persistence register by removing it preemptively SSpersistence.deregister_track(src) @@ -143,6 +154,58 @@ /mob/proc/CanUseObjTopic() return 1 +/** + * This proc is called to add damage to an object. If there is no health left, it calls on_death(). + */ +/obj/proc/add_damage(damage, damage_flags, damage_type, armor_penetration, obj/weapon) + if(!damage) + return FALSE + + var/datum/component/armor/armor = GetComponent(/datum/component/armor) + if(armor) + var/blocked = armor.get_blocked(damage_type, damage_flags, armor_penetration, damage) + damage *= blocked + + health = max(health - damage, 0) + update_health() + if(!health) + on_death() + return TRUE + +/** + * This proc is called when object health changes. Use this to set custom states, do messages, etc. + */ +/obj/proc/update_health() + return + +/** + * This proc is called by update_health() when the health of the object hits zero. Handles the destruction of the object, or you can override it to do different effects. + */ +/obj/proc/on_death(damage, damage_flags, damage_type, armor_penetration, obj/weapon) + if(destroy_sound) + playsound(src, destroy_sound) + qdel(src) + +/** + * This proc is called to set the object's health directly. + */ +/obj/proc/change_health(new_health) + if(health >= maxhealth) + return FALSE + + health = min(new_health, maxhealth) + return TRUE + +/** + * This proc is called to directly add to an object's health (basically, to add it). + */ +/obj/proc/add_health(repair_amount) + if(health >= maxhealth) + return FALSE + + health = min(health + repair_amount, maxhealth) + return TRUE + /obj/proc/CouldUseTopic(var/mob/user) user.AddTopicPrint(src) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index a5b391ebaab2..49b59c2e3a8f 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -4,10 +4,10 @@ layer = STRUCTURE_LAYER blocks_emissive = EMISSIVE_BLOCK_GENERIC pass_flags_self = PASSSTRUCTURE + destroy_sound = 'sound/effects/metalhit.ogg' var/material_alteration = MATERIAL_ALTERATION_ALL // Overrides for material shit. Set them manually if you don't want colors etc. See wood chairs/office chairs. var/climbable - var/breakable var/parts var/list/climbers var/list/footstep_sound //footstep sounds when stepped on @@ -41,14 +41,13 @@ return ..() /obj/structure/attack_hand(mob/living/user) - if(breakable) - if((user.mutations & HULK) && !(user.isSynthetic()) && !(isvaurca(user))) - user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) - attack_generic(user,1,"smashes") - else if(istype(user,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = user - if(H.species.can_shred(user)) - attack_generic(user,1,"slices") + if((user.mutations & HULK) && !(user.isSynthetic()) && !(isvaurca(user))) + user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) + attack_generic(user, 25, "smashes") + else if(istype(user,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = user + if(H.species.can_shred(user)) + attack_generic(user, 25, "slices") if(LAZYLEN(climbers) && !(user in climbers)) user.visible_message(SPAN_WARNING("[user] shakes \the [src]."), \ @@ -232,12 +231,13 @@ return 1 /obj/structure/attack_generic(var/mob/user, var/damage, var/attack_verb, var/wallbreaker) - if(!breakable || !damage || !wallbreaker) - return 0 - visible_message(SPAN_DANGER("[user] [attack_verb] the [src] apart!")) + if(!maxhealth) + return FALSE + user.do_attack_animation(src) - qdel(src) - return 1 + visible_message(SPAN_DANGER("[user] [attack_verb] \the [src]!")) + add_damage(damage) + return TRUE /obj/structure/get_material() return material diff --git a/code/game/objects/structures/barricades/_barricade.dm b/code/game/objects/structures/barricades/_barricade.dm index 9fdde8ce5a01..2ee1e25e6da4 100644 --- a/code/game/objects/structures/barricades/_barricade.dm +++ b/code/game/objects/structures/barricades/_barricade.dm @@ -5,11 +5,11 @@ density = TRUE atom_flags = ATOM_FLAG_CHECKS_BORDER + maxhealth = 100 + var/stack_type //The type of stack the barricade dropped when disassembled if any. var/stack_amount = 5 //The amount of stack dropped when disassembled at full health var/destroyed_stack_amount //to specify a non-zero amount of stack to drop when destroyed - var/health = 100 //Pretty tough. Changes sprites at 300 and 150 - var/maxhealth = 100 //Basic code functions ///Used for calculating some stuff related to maxhealth as it constantly changes due to e.g. barbed wire. set to 100 to avoid possible divisions by zero var/starting_maxhealth = 100 @@ -173,7 +173,7 @@ SPAN_NOTICE("You set up [attacking_item.name] on [src].")) maxhealth += 50 - update_health(-50) + add_health(50) can_wire = FALSE is_wired = TRUE climbable = FALSE @@ -187,12 +187,11 @@ if(do_after(user, 20, src, DO_REPAIR_CONSTRUCT)) if(!is_wired) return - playsound(src.loc, 'sound/items/Wirecutter.ogg', 25, 1) user.visible_message(SPAN_NOTICE("[user] removes the barbed wire on [src]."), SPAN_NOTICE("You remove the barbed wire on [src].")) maxhealth -= 50 - update_health(50) + add_health(50) can_wire = TRUE is_wired = FALSE climbable = TRUE @@ -233,7 +232,7 @@ for(var/obj/structure/barricade/B in get_step(src,dir)) //discourage double-stacking barricades by removing health from opposing barricade if(B.dir == REVERSE_DIR(dir)) INVOKE_ASYNC(B, TYPE_PROC_REF(/atom, ex_act), severity, direction) - update_health(round(severity)) + add_damage(round(severity)) // This proc is called whenever the cade is moved, so I thought it was appropriate, // especially since the barricade's direction needs to be handled when moving @@ -263,21 +262,17 @@ /obj/structure/barricade/proc/take_damage(var/damage) for(var/obj/structure/barricade/B in get_step(src,dir)) //discourage double-stacking barricades by removing health from opposing barricade if(B.dir == REVERSE_DIR(dir)) - B.update_health(damage) - update_health(damage) + B.add_damage(damage) -/obj/structure/barricade/proc/update_health(damage, nomessage) - health -= damage - health = clamp(health, 0, maxhealth) +/obj/structure/barricade/add_damage(damage, damage_flags, damage_type, armor_penetration, obj/weapon) + if(..()) + update_damage_state() + update_icon() +/obj/structure/barricade/on_death(damage, damage_flags, damage_type, armor_penetration, obj/weapon) if(!health) - if(!nomessage) - visible_message(SPAN_DANGER("[src] falls apart!")) + visible_message(SPAN_DANGER("[src] falls apart!")) barricade_deconstruct() - return - - update_damage_state() - update_icon() /obj/structure/barricade/proc/update_damage_state() var/health_percent = round(health/maxhealth * 100) @@ -300,7 +295,7 @@ if(WT.use_tool(src, user, 7 SECONDS, volume = 40)) user.visible_message(SPAN_NOTICE("[user] repairs some damage on [src]."), SPAN_NOTICE("You repair \the [src].")) - update_health(-200) + add_health(200) return TRUE diff --git a/code/game/objects/structures/barricades/liquid.dm b/code/game/objects/structures/barricades/liquid.dm index 4cee55999e97..79d2ab4852bb 100644 --- a/code/game/objects/structures/barricades/liquid.dm +++ b/code/game/objects/structures/barricades/liquid.dm @@ -120,7 +120,7 @@ health = BARRICADE_LIQUIDBAG_TRESHOLD_5 maxhealth = BARRICADE_LIQUIDBAG_TRESHOLD_5 maxhealth += 50 - update_health(-50) + add_health(50) stack_amount = 5 can_wire = FALSE is_wired = TRUE diff --git a/code/game/objects/structures/barricades/metal.dm b/code/game/objects/structures/barricades/metal.dm index 5b8beea297a4..fddbf795817d 100644 --- a/code/game/objects/structures/barricades/metal.dm +++ b/code/game/objects/structures/barricades/metal.dm @@ -97,7 +97,7 @@ /obj/structure/barricade/metal/wired/Initialize(mapload, mob/user) . = ..() maxhealth += 50 - update_health(-50) + add_health(50) can_wire = FALSE is_wired = TRUE climbable = FALSE diff --git a/code/game/objects/structures/barricades/wood.dm b/code/game/objects/structures/barricades/wood.dm index 88a84b5c4478..a9f6d944f213 100644 --- a/code/game/objects/structures/barricades/wood.dm +++ b/code/game/objects/structures/barricades/wood.dm @@ -25,7 +25,7 @@ visible_message(SPAN_NOTICE("[user] begins to repair [src].")) if(do_after(user, 2 SECONDS, src, DO_REPAIR_CONSTRUCT) && (health < maxhealth)) if(D.use(1)) - update_health(-0.5*maxhealth) + add_health(50) update_damage_state() visible_message(SPAN_NOTICE("[user] clumsily repairs [src].")) return diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 83f47818cadb..c0208ed9fec1 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -7,6 +7,7 @@ build_amt = 2 slowdown = 5 pass_flags_self = PASSSTRUCTURE | LETPASSCLICKS | PASSTRACE + health = 45 var/icon_door = null /// Override to have open overlay use icon different to its base's @@ -34,7 +35,6 @@ /// Never solid (You can always pass over it) var/wall_mounted = FALSE - var/health = 100 /// If someone is currently breaking out. mutex var/breakout = 0 diff --git a/code/game/objects/structures/crystals.dm b/code/game/objects/structures/crystals.dm index 80c985de4bcf..f4a80fd03a59 100644 --- a/code/game/objects/structures/crystals.dm +++ b/code/game/objects/structures/crystals.dm @@ -5,9 +5,10 @@ icon_state = "scattered" anchored = TRUE density = FALSE + health = 100 + var/singleton/reagent/reagent_id var/state = 0 - var/health = 100 var/mine_rate = 1 // how fast you can mine it var/obj/machinery/power/crystal_agitator/creator // used to re-add dense turfs to agitation list when destroyed diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 8bbcce167eee..62f7917b4114 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -7,7 +7,7 @@ anchored = TRUE unacidable = TRUE req_access = list(ACCESS_CAPTAIN) - var/health = 30 + health = 30 var/obj/held_obj var/open = FALSE var/destroyed = FALSE diff --git a/code/game/objects/structures/full_window_frame.dm b/code/game/objects/structures/full_window_frame.dm index 211930173513..4a1bf17bbc34 100644 --- a/code/game/objects/structures/full_window_frame.dm +++ b/code/game/objects/structures/full_window_frame.dm @@ -10,7 +10,6 @@ density = TRUE climbable = TRUE smoothing_flags = SMOOTH_MORE - breakable = TRUE can_be_unanchored = TRUE canSmoothWith = list( /turf/simulated/wall, diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index e0b1d78fa4a6..ae046e6c98d6 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -7,8 +7,8 @@ w_class = WEIGHT_CLASS_HUGE obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED pass_flags_self = PASSTABLE + maxhealth = 200 var/state = 0 - var/health = 200 var/cover = 50 //how much cover the girder provides against projectiles. build_amt = 2 var/material/reinf_material diff --git a/code/game/objects/structures/gore/core.dm b/code/game/objects/structures/gore/core.dm index fb3d3c8d994e..f2d6cd553aff 100644 --- a/code/game/objects/structures/gore/core.dm +++ b/code/game/objects/structures/gore/core.dm @@ -4,18 +4,13 @@ icon = 'icons/obj/gore_structures.dmi' anchored = TRUE density = FALSE + maxhealth = 50 var/destroy_message = "THE STRUCTURE collapses in on itself!" - var/maxHealth = 50 - var/health = 50 - -/obj/structure/gore/Initialize(mapload) - . = ..() - health = maxHealth /obj/structure/gore/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) . = ..() if(distance <= 2) - var/health_div = health / maxHealth + var/health_div = health / maxhealth if(health_div >= 0.9) . += SPAN_NOTICE("\The [src] appears completely intact.") else if(health_div >= 0.7) diff --git a/code/game/objects/structures/gore/nest.dm b/code/game/objects/structures/gore/nest.dm index 098da1e2df9c..8d84fc978621 100644 --- a/code/game/objects/structures/gore/nest.dm +++ b/code/game/objects/structures/gore/nest.dm @@ -5,18 +5,13 @@ desc = "It's a gruesome pile of thick, sticky flesh shaped like a nest." icon = 'icons/obj/gore_structures.dmi' icon_state = "nest" + maxhealth = 100 var/destroy_message = "THE STRUCTURE collapses in on itself!" - var/maxHealth = 100 - var/health = 100 - -/obj/structure/bed/nest/Initialize(mapload, new_material, new_padding_material) - . = ..() - health = maxHealth /obj/structure/bed/nest/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) . = ..() if(distance <= 2) - var/health_div = health / maxHealth + var/health_div = health / maxhealth if(health_div >= 0.9) . += SPAN_NOTICE("\The [src] appears completely intact.") else if(health_div >= 0.7) diff --git a/code/game/objects/structures/gore/tendrils.dm b/code/game/objects/structures/gore/tendrils.dm index e710b34e0ae4..36dfa276b5c1 100644 --- a/code/game/objects/structures/gore/tendrils.dm +++ b/code/game/objects/structures/gore/tendrils.dm @@ -4,7 +4,7 @@ name = "bloody tendrils" desc = "Bloody, pulsating tendrils." icon_state = "tendril" - maxHealth = 40 + maxhealth = 40 pass_flags = PASSTABLE | PASSMOB | PASSTRACE | PASSRAILING var/being_destroyed = FALSE var/is_node = FALSE @@ -18,7 +18,7 @@ desc = "Clumped up flesh, pulsating in rhythm with the tendrils that surround it." icon_state = "tendril_node" density = TRUE - maxHealth = 150 + maxhealth = 150 light_range = NODERANGE light_color = LIGHT_COLOR_EMERGENCY is_node = TRUE @@ -127,9 +127,9 @@ if(1.0) health = 0 if(2.0) - health -= maxHealth / 2 + health -= maxhealth / 2 if(3.0) - health -= maxHealth / 5 + health -= maxhealth / 5 healthcheck() /obj/structure/gore/tendrils/fire_act(exposed_temperature, exposed_volume) diff --git a/code/game/objects/structures/gore/wall.dm b/code/game/objects/structures/gore/wall.dm index 3c5ac66e7fd2..07f00202e7f1 100644 --- a/code/game/objects/structures/gore/wall.dm +++ b/code/game/objects/structures/gore/wall.dm @@ -2,21 +2,21 @@ name = "flesh floor" desc = "Looks like the floor was covered by some fleshlike growth." icon_state = "flesh_floor" - maxHealth = 100 + maxhealth = 100 /obj/structure/gore/wall name = "flesh wall" desc = "Chunks of flesh sculpted to form an impassable wall." icon_state = "flesh_wall" opacity = TRUE - maxHealth = 200 + maxhealth = 200 /obj/structure/gore/wall/membrane name = "flesh membrane" desc = "Skin and muscle stretched just thin enough to let light pass through." icon_state = "flesh_membrane" opacity = FALSE - maxHealth = 120 + maxhealth = 120 /obj/structure/gore/wall/Initialize() . = ..() diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 977b8a3be777..7c089fb44b3a 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -9,7 +9,7 @@ obj_flags = OBJ_FLAG_CONDUCTABLE | OBJ_FLAG_MOVES_UNSUPPORTED explosion_resistance = 1 layer = BELOW_WINDOW_LAYER - var/health = 10 + health = 10 var/destroyed = 0 /obj/structure/grille/condition_hints(mob/user, distance, is_adjacent) diff --git a/code/game/objects/structures/hadii_statue.dm b/code/game/objects/structures/hadii_statue.dm index 188da667c7f9..a5445f3beacf 100644 --- a/code/game/objects/structures/hadii_statue.dm +++ b/code/game/objects/structures/hadii_statue.dm @@ -6,11 +6,11 @@ density = TRUE anchored = TRUE layer = ABOVE_HUMAN_LAYER + maxhealth = 100 var/toppled = FALSE var/outside = FALSE var/already_toppled = FALSE var/toppling_sound = 'sound/effects/metalhit.ogg' - var/health = 100 /obj/structure/hadii_statue/stone icon_state = "stone" diff --git a/code/game/objects/structures/hivebot_head.dm b/code/game/objects/structures/hivebot_head.dm index 428366d541fb..6a05d060d3e0 100644 --- a/code/game/objects/structures/hivebot_head.dm +++ b/code/game/objects/structures/hivebot_head.dm @@ -3,8 +3,8 @@ desc = "The central core of the Hivebot Secondary Transmitter Drone - all that remains after the machine's destruction. Perhaps some data as to the threat can be gleaned from this?" icon = 'icons/obj/structure/hivebot_head.dmi' icon_state = "hivebot_head" + maxhealth = null w_class = WEIGHT_CLASS_BULKY - breakable = FALSE climbable = FALSE density = FALSE diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index 7dcdd90256f6..a04b53dc6f96 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -45,10 +45,12 @@ anchored = TRUE atmos_canpass = CANPASS_DENSITY + maxhealth = 15 + var/deflating = FALSE var/undeploy_path = null var/torn_path = null - var/health = 15 + /obj/structure/inflatable/mechanics_hints(mob/user, distance, is_adjacent) . += ..() diff --git a/code/game/objects/structures/railing.dm b/code/game/objects/structures/railing.dm index 85cfcc46a9aa..09bd9e50e26b 100644 --- a/code/game/objects/structures/railing.dm +++ b/code/game/objects/structures/railing.dm @@ -13,9 +13,10 @@ obj_flags = OBJ_FLAG_ROTATABLE|OBJ_FLAG_MOVES_UNSUPPORTED build_amt = 2 + + maxhealth = 35 + var/broken = FALSE - var/health = 70 - var/maxhealth = 70 var/neighbor_status = 0 can_astar_pass = CANASTARPASS_ALWAYS_PROC diff --git a/code/game/objects/structures/simple_doors.dm b/code/game/objects/structures/simple_doors.dm index c5cda519721d..7b6cef1369f8 100644 --- a/code/game/objects/structures/simple_doors.dm +++ b/code/game/objects/structures/simple_doors.dm @@ -2,18 +2,19 @@ name = "door" density = 1 anchored = 1 + maxhealth = 100 icon = 'icons/obj/doors/material_doors.dmi' icon_state = "metal" build_amt = 10 + var/state = 0 //closed, 1 == open var/isSwitchingStates = 0 var/oreAmount = 7 var/datum/lock/lock var/initial_lock_value //for mapping purposes. Basically if this value is set, it sets the lock to this value. - var/health = 100 - var/maxhealth = 100 + /obj/structure/simple_door/feedback_hints(mob/user, distance, is_adjacent) . += ..() diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 1b6ced58adcd..c70841cc98ee 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -17,11 +17,11 @@ anchored = TRUE atom_flags = ATOM_FLAG_CHECKS_BORDER obj_flags = OBJ_FLAG_ROTATABLE|OBJ_FLAG_MOVES_UNSUPPORTED + maxhealth = 14 + var/hitsound = 'sound/effects/glass_hit.ogg' - var/maxhealth = 14 var/maximal_heat = T0C + 100 // Maximal heat before this window begins taking damage from fire var/damage_per_fire_tick = 2 // Amount of damage per fire tick. Regular windows are not fireproof so they might as well break quickly. - var/health var/ini_dir = null var/state = 2 var/reinf = FALSE diff --git a/code/modules/blob/blob.dm b/code/modules/blob/blob.dm index aad9db366309..665ce390b605 100644 --- a/code/modules/blob/blob.dm +++ b/code/modules/blob/blob.dm @@ -12,8 +12,8 @@ layer = BLOB_SHIELD_LAYER - var/maxHealth = 30 - var/health + maxhealth = 30 + var/regen_rate = 5 // damage gets divided by these modifiers, based on damage type @@ -35,7 +35,7 @@ /obj/effect/blob/Initialize() . = ..() - health = maxHealth + health = maxhealth update_icon() START_PROCESSING(SSprocessing, src) @@ -56,14 +56,14 @@ take_damage(rand(20, 60) / brute_resist) /obj/effect/blob/update_icon() - if(health > maxHealth / 2) + if(health > maxhealth / 2) icon_state = "blob" else icon_state = "blob_damaged" /obj/effect/blob/process() if(!parent_core || QDELETED(parent_core)) - take_damage(maxHealth / 4) // four processes to die if main core is deddo + take_damage(maxhealth / 4) // four processes to die if main core is deddo return regen() if(world.time < (attack_time + attack_cooldown)) @@ -79,7 +79,7 @@ update_icon() /obj/effect/blob/proc/regen() - health = min(health + regen_rate, maxHealth) + health = min(health + regen_rate, maxhealth) update_icon() /obj/effect/blob/proc/expand(var/turf/T) @@ -244,7 +244,7 @@ name = "master nucleus" desc = "A massive, fragile nucleus guarded by a shield of thick tendrils." icon_state = "blob_core" - maxHealth = 450 + maxhealth = 450 damage_min = 25 damage_max = 35 expandType = /obj/effect/blob/shield @@ -260,7 +260,7 @@ var/times_to_pulse = 4 /obj/effect/blob/core/proc/get_health_percent() - return ((health / maxHealth) * 100) + return ((health / maxhealth) * 100) /obj/effect/blob/core/proc/process_core_health() var/health_percent = get_health_percent() @@ -308,7 +308,7 @@ name = "auxiliary nucleus" desc = "An interwoven mass of tendrils. A glowing nucleus pulses at its center." icon_state = "blob_node" - maxHealth = 125 + maxhealth = 125 regen_rate = 1 damage_min = 15 damage_max = 20 @@ -319,7 +319,7 @@ /obj/effect/blob/core/secondary/process() if(!parent_core || QDELETED(parent_core)) - take_damage(maxHealth / 4) // four processes to die if main core is deddo + take_damage(maxhealth / 4) // four processes to die if main core is deddo return ..() @@ -327,13 +327,13 @@ return /obj/effect/blob/core/secondary/update_icon() - icon_state = (health / maxHealth >= 0.5) ? "blob_node" : "blob_factory" + icon_state = (health / maxhealth >= 0.5) ? "blob_node" : "blob_factory" /obj/effect/blob/shield name = "shielding mass" desc = "A pulsating mass of interwoven tendrils. These seem particularly robust, but not quite as active." icon_state = "blob_idle" - maxHealth = 120 + maxhealth = 120 damage_min = 15 damage_max = 25 attack_cooldown = 45 @@ -352,9 +352,9 @@ return ..() /obj/effect/blob/shield/update_icon() - if(health > maxHealth * 2 / 3) + if(health > maxhealth * 2 / 3) icon_state = "blob_idle" - else if(health > maxHealth / 3) + else if(health > maxhealth / 3) icon_state = "blob" else icon_state = "blob_damaged" @@ -367,7 +367,7 @@ /obj/effect/blob/ravaging name = "ravaging mass" desc = "A mass of interwoven tendrils. They thrash around haphazardly at anything in reach." - maxHealth = 20 + maxhealth = 20 damage_min = 20 damage_max = 25 attack_cooldown = 30 diff --git a/code/modules/heavy_vehicle/components/_components.dm b/code/modules/heavy_vehicle/components/_components.dm index e01b92de2e6d..c6d7569435ba 100644 --- a/code/modules/heavy_vehicle/components/_components.dm +++ b/code/modules/heavy_vehicle/components/_components.dm @@ -72,7 +72,7 @@ user.visible_message(SPAN_NOTICE("\The [user] installs \the [thing] in \the [src].")) return 1 -/obj/item/mech_component/proc/update_health() +/obj/item/mech_component/proc/update_component_damage() total_damage = brute_damage + burn_damage if(total_damage > max_damage) total_damage = max_damage damage_state = clamp(round((total_damage/max_damage) * 4), MECH_COMPONENT_DAMAGE_UNDAMAGED, MECH_COMPONENT_DAMAGE_DAMAGED_TOTAL) @@ -88,13 +88,13 @@ /obj/item/mech_component/proc/take_brute_damage(var/amt) brute_damage = max(0, brute_damage + amt) - update_health() + update_component_damage() if(total_damage == max_damage) take_component_damage(amt,0) /obj/item/mech_component/proc/take_burn_damage(var/amt) burn_damage = max(0, burn_damage + amt) - update_health() + update_component_damage() if(total_damage == max_damage) take_component_damage(0,amt) diff --git a/code/modules/heavy_vehicle/mech_damage.dm b/code/modules/heavy_vehicle/mech_damage.dm index d8b98d8a803b..0130f5782247 100644 --- a/code/modules/heavy_vehicle/mech_damage.dm +++ b/code/modules/heavy_vehicle/mech_damage.dm @@ -34,25 +34,25 @@ /mob/living/heavy_vehicle/adjustFireLoss(var/amount, var/obj/item/mech_component/C) if(C) C.take_brute_damage(amount) - C.update_health() + C.update_component_damage() else var/list/components = list(body, arms, legs, head) components = shuffle(components) for(var/obj/item/mech_component/MC in components) MC.take_burn_damage(amount) - MC.update_health() + MC.update_component_damage() break /mob/living/heavy_vehicle/adjustBruteLoss(var/amount, var/obj/item/mech_component/C) if(C) C.take_brute_damage(amount) - C.update_health() + C.update_component_damage() else var/list/components = list(body, arms, legs, head) components = shuffle(components) for(var/obj/item/mech_component/MC in components) MC.take_burn_damage(amount) - MC.update_health() + MC.update_component_damage() break /mob/living/heavy_vehicle/proc/zoneToComponent(var/zone) diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm index 21c58c3b67c2..89647c25ec89 100644 --- a/code/modules/hydroponics/spreading/spreading.dm +++ b/code/modules/hydroponics/spreading/spreading.dm @@ -12,7 +12,7 @@ //make vine zero start off fully matured var/obj/effect/plant/vine = new(T,seed) - vine.health = vine.max_health + vine.health = vine.maxhealth vine.mature_time = 0 vine.process() var/area_display_name = get_area_display_name(get_area(T)) @@ -49,8 +49,8 @@ pass_flags = PASSTABLE mouse_opacity = MOUSE_OPACITY_OPAQUE - var/health = 10 - var/max_health = 100 + health = 10 + maxhealth = 100 var/growth_threshold = 0 var/growth_type = 0 @@ -101,15 +101,15 @@ return name = seed.display_name - max_health = round(seed.get_trait(TRAIT_ENDURANCE)/2) + maxhealth = round(seed.get_trait(TRAIT_ENDURANCE)/2) if(seed.get_trait(TRAIT_SPREAD) == 2) mouse_opacity = 2 max_growth = VINE_GROWTH_STAGES - growth_threshold = max_health/VINE_GROWTH_STAGES + growth_threshold = maxhealth/VINE_GROWTH_STAGES growth_type = seed.get_growth_type() else max_growth = seed.growth_stages - growth_threshold = max_health/seed.growth_stages + growth_threshold = maxhealth/seed.growth_stages if(max_growth > 2 && prob(50)) max_growth-- //Ensure some variation in final sprite, makes the carpet of crap look less wonky. @@ -304,7 +304,7 @@ die_off() /obj/effect/plant/proc/is_mature() - return (health >= (max_health/3) && world.time > mature_time) + return (health >= (maxhealth/3) && world.time > mature_time) #undef DEFAULT_SEED diff --git a/code/modules/hydroponics/spreading/spreading_growth.dm b/code/modules/hydroponics/spreading/spreading_growth.dm index 17112f953a9d..9130961f8481 100644 --- a/code/modules/hydroponics/spreading/spreading_growth.dm +++ b/code/modules/hydroponics/spreading/spreading_growth.dm @@ -47,12 +47,12 @@ var/turf/simulated/T = get_turf(src) if(istype(T)) health -= seed.handle_environment(T,T.return_air(),null,1) - if(health < max_health) + if(health < maxhealth) health += rand(3,5) refresh_icon() - if(health > max_health) - health = max_health - else if(health == max_health && !plant) + if(health > maxhealth) + health = maxhealth + else if(health == maxhealth && !plant) plant = new(T,seed) plant.dir = src.dir plant.transform = src.transform @@ -90,7 +90,7 @@ // We shouldn't have spawned if the controller doesn't exist. check_health() - if(neighbors.len || health != max_health || buckled || !is_mature()) + if(neighbors.len || health != maxhealth || buckled || !is_mature()) SSplants.add_plant(src) /obj/effect/plant/proc/do_spread(spread_chance, max_spread) diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 4a7184ce2f64..663ecd8b41d3 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -58,8 +58,8 @@ var/tray_light = 5 // Mechanical concerns. - /// Plant health. - var/health = 0 + /// Plant plant_health. + var/plant_health = 0 /// Last time tray was harvested var/lastproduce = 0 /// Cycle timing/tracking var. @@ -291,7 +291,7 @@ /// If the plant should be dead, kill it. Otherwise, don't. /obj/machinery/portable_atmospherics/hydroponics/proc/check_health() - if(seed && !dead && health <= 0) + if(seed && !dead && plant_health <= 0) die() check_level_sanity() update_icon() @@ -331,9 +331,9 @@ if(pestkiller_reagents[_R]) pestlevel += pestkiller_reagents[_R] * reagent_total - // Beneficial reagents have a few impacts along with health buffs. + // Beneficial reagents have a few impacts along with plant_health buffs. if(beneficial_reagents[_R]) - health += beneficial_reagents[_R][1] * reagent_total + plant_health += beneficial_reagents[_R][1] * reagent_total yield_mod += beneficial_reagents[_R][2] * reagent_total mutation_mod += beneficial_reagents[_R][3] * reagent_total @@ -422,7 +422,7 @@ dead = FALSE age = 0 - health = seed.get_trait(TRAIT_ENDURANCE) + plant_health = seed.get_trait(TRAIT_ENDURANCE) lastcycle = world.time stunted = FALSE harvest = FALSE @@ -478,9 +478,9 @@ /// Verifies that all values are what they should be. /obj/machinery/portable_atmospherics/hydroponics/proc/check_level_sanity() if(seed) - health = max(0,min(seed.get_trait(TRAIT_ENDURANCE),health)) + plant_health = max(0,min(seed.get_trait(TRAIT_ENDURANCE),plant_health)) else - health = 0 + plant_health = 0 dead = FALSE mutation_level = max(0,min(mutation_level,100)) @@ -501,7 +501,7 @@ dead = FALSE mutate(1) age = 0 - health = seed.get_trait(TRAIT_ENDURANCE) + plant_health = seed.get_trait(TRAIT_ENDURANCE) lastcycle = world.time harvest = FALSE weedlevel = 0 @@ -551,7 +551,7 @@ if(do_after(user, 1 SECOND)) playsound(src, 'sound/items/Wirecutter.ogg', 25, 1) seed.harvest(user,yield_mod,1) - health -= (rand(3,5)*10) + plant_health -= (rand(3,5)*10) if(prob(30)) sampled = 1 @@ -601,7 +601,7 @@ dead = 0 age = 1 //Snowflakey, maybe move this to the seed datum - health = (istype(S, /obj/item/seeds/cutting) ? round(seed.get_trait(TRAIT_ENDURANCE)/rand(2,5)) : seed.get_trait(TRAIT_ENDURANCE)) + plant_health = (istype(S, /obj/item/seeds/cutting) ? round(seed.get_trait(TRAIT_ENDURANCE)/rand(2,5)) : seed.get_trait(TRAIT_ENDURANCE)) lastcycle = world.time qdel(attacking_item) @@ -627,7 +627,7 @@ // Hatchets can uproot the contents of trays to kill the plant with one click. else if (istype(attacking_item, /obj/item/material/hatchet) && !closed_system) - if(health > 0) + if(plant_health > 0) user.visible_message(SPAN_DANGER("[user] begins uprooting the contents of \the [src]."), SPAN_DANGER("You begin to uproot the contents of \the [src].")) @@ -635,7 +635,7 @@ playsound(src, /singleton/sound_category/shovel_sound, 25, 1) user.visible_message(SPAN_DANGER("[user] uproots the contents of \the [src]!"), SPAN_DANGER("You successfully uproot the contents of \the [src].")) - health = 0 + plant_health = 0 check_health() else to_chat(user, SPAN_DANGER("There is nothing in this plot for you to uproot!")) @@ -677,7 +677,7 @@ var/total_damage = attacking_item.force if ((attacking_item.sharp) || (attacking_item.damtype == "fire")) //fire and sharp things are more effective when dealing with plants total_damage = 2*attacking_item.force - health -= total_damage + plant_health -= total_damage check_health() return @@ -795,7 +795,7 @@ if(seed) if(dead) . += SPAN_DANGER("The plant is dead.") - else if(health <= (seed.get_trait(TRAIT_ENDURANCE)/ 2)) + else if(plant_health <= (seed.get_trait(TRAIT_ENDURANCE)/ 2)) . += SPAN_BAD("The plant looks unhealthy.") if(stunted) . += SPAN_BAD("This harvest is stunted due to improper growing conditions, reducing yield.") diff --git a/code/modules/mob/living/simple_animal/borer/borer.dm b/code/modules/mob/living/simple_animal/borer/borer.dm index 976523323c98..c8ebaf2e0950 100644 --- a/code/modules/mob/living/simple_animal/borer/borer.dm +++ b/code/modules/mob/living/simple_animal/borer/borer.dm @@ -16,7 +16,7 @@ a_intent = I_HURT stop_automated_movement = 1 status_flags = CANPUSH - attacktext = "nipped" + attacktext = "nips" friendly = "prods" wander = 0 maxHealth = 40 diff --git a/code/modules/mob/living/simple_animal/constructs/constructs/artificer.dm b/code/modules/mob/living/simple_animal/constructs/constructs/artificer.dm index 197d1568baf5..bdd3aec7aa0b 100644 --- a/code/modules/mob/living/simple_animal/constructs/constructs/artificer.dm +++ b/code/modules/mob/living/simple_animal/constructs/constructs/artificer.dm @@ -11,7 +11,7 @@ melee_damage_lower = 10 melee_damage_upper = 10 armor_penetration = 20 - attacktext = "rammed" + attacktext = "rams" organ_names = list("core", "production array", "sensor array") speed = 0 environment_smash = TRUE diff --git a/code/modules/mob/living/simple_animal/constructs/constructs/harvester.dm b/code/modules/mob/living/simple_animal/constructs/constructs/harvester.dm index 5b2ac78cfc03..61e1e50aad58 100644 --- a/code/modules/mob/living/simple_animal/constructs/constructs/harvester.dm +++ b/code/modules/mob/living/simple_animal/constructs/constructs/harvester.dm @@ -10,7 +10,7 @@ melee_damage_lower = 25 melee_damage_upper = 25 armor_penetration = 60 - attacktext = "violently stabbed" + attacktext = "violently stabs" organ_names = list("core", "harvesting array") speed = -1 environment_smash = 1 diff --git a/code/modules/mob/living/simple_animal/constructs/constructs/juggernaut.dm b/code/modules/mob/living/simple_animal/constructs/constructs/juggernaut.dm index 91242257343e..259ff6bca844 100644 --- a/code/modules/mob/living/simple_animal/constructs/constructs/juggernaut.dm +++ b/code/modules/mob/living/simple_animal/constructs/constructs/juggernaut.dm @@ -12,7 +12,7 @@ melee_damage_lower = 30 melee_damage_upper = 30 armor_penetration = 40 - attacktext = "smashed their armored gauntlet into" + attacktext = "smashes their armored gauntlet into" organ_names = list("core", "right arm", "left arm") mob_size = MOB_LARGE speed = 3 diff --git a/code/modules/mob/living/simple_animal/constructs/constructs/wraith.dm b/code/modules/mob/living/simple_animal/constructs/constructs/wraith.dm index 2f482c95bc39..4015d74ca275 100644 --- a/code/modules/mob/living/simple_animal/constructs/constructs/wraith.dm +++ b/code/modules/mob/living/simple_animal/constructs/constructs/wraith.dm @@ -9,7 +9,7 @@ health_prefix = "wraith" melee_damage_lower = 25 melee_damage_upper = 25 - attacktext = "slashed" + attacktext = "slashes" organ_names = list("core", "right arm", "left arm") speed = -1 environment_smash = TRUE diff --git a/code/modules/mob/living/simple_animal/friendly/adhomai.dm b/code/modules/mob/living/simple_animal/friendly/adhomai.dm index f3beb13a0b18..b78a6eae6233 100644 --- a/code/modules/mob/living/simple_animal/friendly/adhomai.dm +++ b/code/modules/mob/living/simple_animal/friendly/adhomai.dm @@ -85,7 +85,7 @@ response_help = "pets" response_disarm = "gently pushes aside" response_harm = "kicks" - attacktext = "kicked" + attacktext = "kicks" health = 200 maxHealth = 200 mob_size = 15 @@ -130,7 +130,7 @@ melee_damage_lower = 15 melee_damage_upper = 15 armor_penetration = 20 - attacktext = "gored" + attacktext = "gores" attack_sound = 'sound/weapons/bite.ogg' hostile_nameable = TRUE @@ -272,7 +272,7 @@ response_help = "pets" response_disarm = "gently pushes aside" response_harm = "kicks" - attacktext = "kicked" + attacktext = "kicks" meat_type = /obj/item/reagent_containers/food/snacks/meat/adhomai @@ -343,7 +343,7 @@ response_help = "pets" response_disarm = "gently pushes aside" response_harm = "kicks" - attacktext = "kicked" + attacktext = "kicks" health = 450 maxHealth = 452 mob_size = 30 diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index a08b7eb011c6..3c4c2b1c03d7 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -20,7 +20,7 @@ response_disarm = "gently pushes aside" response_harm = "kicks" faction = "goat" - attacktext = "kicked" + attacktext = "kicks" maxHealth = 40 melee_damage_lower = 1 melee_damage_upper = 5 @@ -94,7 +94,7 @@ response_help = "pets" response_disarm = "gently pushes aside" response_harm = "kicks" - attacktext = "kicked" + attacktext = "kicks" health = 250 mob_size = 20//based on mass of holstein fresian dairy cattle, what the sprite is based on emote_sounds = list('sound/effects/creatures/cow.ogg') @@ -140,7 +140,7 @@ response_help = "pets" response_disarm = "gently pushes aside" response_harm = "kicks" - attacktext = "kicked" + attacktext = "kicks" health = 120 emote_sounds = list('sound/effects/creatures/pigsnort.ogg') butchering_products = list(/obj/item/stack/material/animalhide/barehide = 6) @@ -166,7 +166,7 @@ response_help = "pets" response_disarm = "gently pushes aside" response_harm = "kicks" - attacktext = "kicked" + attacktext = "kicks" maxHealth = 1 var/amount_grown = 0 pass_flags = PASSTABLE | PASSGRILLE @@ -214,7 +214,7 @@ response_help = "pets" response_disarm = "gently pushes aside" response_harm = "kicks" - attacktext = "kicked" + attacktext = "kicks" maxHealth = 10 var/eggsleft = 0 var/body_color @@ -302,7 +302,7 @@ response_help = "pets" response_disarm = "bops" response_harm = "kicks" - attacktext = "kicked" + attacktext = "kicks" mob_size = 2 /mob/living/simple_animal/penguin/baby diff --git a/code/modules/mob/living/simple_animal/friendly/hakhma.dm b/code/modules/mob/living/simple_animal/friendly/hakhma.dm index f1c8cc5de461..48f7f41dabdc 100644 --- a/code/modules/mob/living/simple_animal/friendly/hakhma.dm +++ b/code/modules/mob/living/simple_animal/friendly/hakhma.dm @@ -17,7 +17,7 @@ response_help = "pets" response_disarm = "gently pushes aside" response_harm = "kicks" - attacktext = "kicked" + attacktext = "kicks" health = 250 maxHealth = 250 canbrush = TRUE diff --git a/code/modules/mob/living/simple_animal/friendly/moghes.dm b/code/modules/mob/living/simple_animal/friendly/moghes.dm index 6c3d222ea302..66abfab3d8a6 100644 --- a/code/modules/mob/living/simple_animal/friendly/moghes.dm +++ b/code/modules/mob/living/simple_animal/friendly/moghes.dm @@ -15,7 +15,7 @@ response_help = "pets" response_disarm = "gently pushes aside" response_harm = "kicks" - attacktext = "kicked" + attacktext = "kicks" faction = "Moghes" maxHealth = 100 @@ -61,7 +61,7 @@ response_help = "pets" response_disarm = "gently pushes aside" response_harm = "kicks" - attacktext = "gored" + attacktext = "gores" faction = "Moghes" maxHealth = 200 @@ -123,7 +123,7 @@ response_help = "pets" response_disarm = "gently pushes aside" response_harm = "kicks" - attacktext = "kicked" + attacktext = "kicks" canbrush = TRUE brush = /obj/item/reagent_containers/glass/rag speed = -1 @@ -154,7 +154,7 @@ response_help = "pets" response_disarm = "gently pushes aside" response_harm = "swats" - attacktext = "swatted" + attacktext = "swats" flying = TRUE butchering_products = list(/obj/item/stack/material/animalhide = 1) meat_type = /obj/item/reagent_containers/food/snacks/meat/moghes diff --git a/code/modules/mob/living/simple_animal/friendly/ratking.dm b/code/modules/mob/living/simple_animal/friendly/ratking.dm index bebb36362e06..67b4ec2b0a63 100644 --- a/code/modules/mob/living/simple_animal/friendly/ratking.dm +++ b/code/modules/mob/living/simple_animal/friendly/ratking.dm @@ -12,7 +12,7 @@ to_chat(R, message) /mob/living/simple_animal/rat/king - attacktext = "bitten" + attacktext = "bites" a_intent = "harm" icon_state = "rat_gray" @@ -74,7 +74,7 @@ swarm_name = "creation" announce_name = "commandment" desc = "A titanic swarm of rats." - attacktext = "swarmed" + attacktext = "swarm" melee_damage_lower = 15 melee_damage_upper = 20 maxHealth = 260 @@ -86,7 +86,7 @@ swarm_name = "flock" announce_name = "pronouncement" desc = "A massive swarm of rats." - attacktext = "swarmed" + attacktext = "swarm" melee_damage_lower = 10 melee_damage_upper = 10 maxHealth = 160 @@ -97,7 +97,7 @@ swarm_name = "empire" announce_name = "command" desc = "A large swarm of rats." - attacktext = "swarmed" + attacktext = "swarm" melee_damage_lower = 7 melee_damage_upper = 5 maxHealth = 110 @@ -108,7 +108,7 @@ swarm_name = "kingdom" announce_name = "decree" desc = "A big swarm of rats." - attacktext = "swarmed" + attacktext = "swarm" melee_damage_lower = 5 melee_damage_upper = 5 maxHealth = 60 @@ -119,7 +119,7 @@ swarm_name = "duchy" announce_name = "decree" desc = "A swarm of rats." - attacktext = "bitten" + attacktext = "bites" maxHealth = 35 health = 35 mob_size = 6 @@ -128,7 +128,7 @@ swarm_name = "barony" announce_name = "decree" desc = "A group of rats." - attacktext = "bitten" + attacktext = "bites" maxHealth = 25 health = 25 mob_size = 4 @@ -137,7 +137,7 @@ swarm_name = "hamlet" announce_name = "decree" desc = "A couple of rats." - attacktext = "bitten" + attacktext = "bites" maxHealth = 15 health = 15 mob_size = 3 @@ -146,7 +146,7 @@ swarm_name = "peasentry" announce_name = "request" desc = "A single rat. This one seems special." - attacktext = "scratched" + attacktext = "scratches" maxHealth = 10 health = 10 mob_size = 2 diff --git a/code/modules/mob/living/simple_animal/friendly/schlorrgo.dm b/code/modules/mob/living/simple_animal/friendly/schlorrgo.dm index 064cf5634033..f97c7f3f78a8 100644 --- a/code/modules/mob/living/simple_animal/friendly/schlorrgo.dm +++ b/code/modules/mob/living/simple_animal/friendly/schlorrgo.dm @@ -209,7 +209,7 @@ response_help = "rubs [name]'s belly" melee_damage_lower = 15 melee_damage_upper = 15 - attacktext = "crushed" + attacktext = "crushes" environment_smash = 1 resistance = 2 mob_swap_flags = HUMAN|ROBOT @@ -343,7 +343,7 @@ melee_damage_lower = 10 melee_damage_upper = 10 - attacktext = "sawed" + attacktext = "saws" attack_sound = 'sound/weapons/saw/circsawhit.ogg' mob_size = MOB_SMALL diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm index 5044d5f88fe5..a7f069d12f30 100644 --- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm +++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm @@ -32,7 +32,7 @@ maxHealth = 25 hunger_enabled = 0 - attacktext = "shocked" + attacktext = "shocks" melee_damage_lower = 1 melee_damage_upper = 3 diff --git a/code/modules/mob/living/simple_animal/friendly/tomato.dm b/code/modules/mob/living/simple_animal/friendly/tomato.dm index 69a7c2bebfc3..a02cb722dc0c 100644 --- a/code/modules/mob/living/simple_animal/friendly/tomato.dm +++ b/code/modules/mob/living/simple_animal/friendly/tomato.dm @@ -16,5 +16,5 @@ harm_intent_damage = 5 melee_damage_upper = 15 melee_damage_lower = 10 - attacktext = "mauled" + attacktext = "mauls" mob_size = 2 diff --git a/code/modules/mob/living/simple_animal/hostile/adhomai.dm b/code/modules/mob/living/simple_animal/hostile/adhomai.dm index 0557cd92897c..751d803272b8 100644 --- a/code/modules/mob/living/simple_animal/hostile/adhomai.dm +++ b/code/modules/mob/living/simple_animal/hostile/adhomai.dm @@ -20,7 +20,7 @@ melee_damage_lower = 15 melee_damage_upper = 15 - attacktext = "bitten" + attacktext = "bites" attack_sound = 'sound/weapons/bite.ogg' environment_smash = 1 @@ -56,7 +56,7 @@ melee_damage_lower = 15 melee_damage_upper = 15 - attacktext = "bitten" + attacktext = "bites" attack_sound = 'sound/weapons/bite.ogg' faction = "Adhomai" @@ -93,7 +93,7 @@ mob_swap_flags = HUMAN|SIMPLE_ANIMAL|SLIME|MONKEY mob_push_flags = ALLMOBS - attacktext = "strangled" + attacktext = "strangles" attack_sound = 'sound/effects/noosed.ogg' speed = 1 @@ -124,7 +124,7 @@ melee_damage_lower = 5 melee_damage_upper = 5 - attacktext = "shocked" + attacktext = "shocks" attack_sound = 'sound/magic/LightningShock.ogg' speed = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index 95eb9d312b15..86179bd344de 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -12,7 +12,7 @@ health = 125 melee_damage_lower = 5 melee_damage_upper = 15 - attacktext = "mauled" + attacktext = "mauls" cold_damage_per_tick = 0 speak_chance = 5 speak = list("Hruuugh!","Hrunnph") @@ -33,7 +33,7 @@ health = 25 melee_damage_lower = 1 melee_damage_upper = 8 - attacktext = "gouged" + attacktext = "gouges" cold_damage_per_tick = 0 speak_chance = 5 speak = list("Awrr?","Aowrl!","Worrl") @@ -58,7 +58,7 @@ health = 75 melee_damage_lower = 3 melee_damage_upper = 12 - attacktext = "gouged" + attacktext = "gouges" cold_damage_per_tick = 0 speak_chance = 5 speak = list("Shuhn","Shrunnph?","Shunpf") diff --git a/code/modules/mob/living/simple_animal/hostile/cavern_geist.dm b/code/modules/mob/living/simple_animal/hostile/cavern_geist.dm index e44baeca4b29..bfd1a2f5bc2c 100644 --- a/code/modules/mob/living/simple_animal/hostile/cavern_geist.dm +++ b/code/modules/mob/living/simple_animal/hostile/cavern_geist.dm @@ -30,7 +30,7 @@ resist_mod = 15 mob_size = 25 environment_smash = 2 - attacktext = "mangled" + attacktext = "mangles" attack_sound = 'sound/weapons/bloodyslice.ogg' see_invisible = SEE_INVISIBLE_NOLIGHTING diff --git a/code/modules/mob/living/simple_animal/hostile/changeling.dm b/code/modules/mob/living/simple_animal/hostile/changeling.dm index f51f2a63704f..f1f78d43fdd2 100644 --- a/code/modules/mob/living/simple_animal/hostile/changeling.dm +++ b/code/modules/mob/living/simple_animal/hostile/changeling.dm @@ -33,7 +33,7 @@ resist_mod = 15 mob_size = 25 environment_smash = 2 - attacktext = "mangled" + attacktext = "mangles" attack_sound = 'sound/weapons/bloodyslice.ogg' emote_sounds = list('sound/effects/creatures/bear_loud_1.ogg', 'sound/effects/creatures/bear_loud_2.ogg', 'sound/effects/creatures/bear_loud_3.ogg', 'sound/effects/creatures/bear_loud_4.ogg') @@ -163,7 +163,7 @@ melee_damage_lower = 5 melee_damage_upper = 10 mob_size = 15 - attacktext = "mangled" + attacktext = "mangles" attack_sound = 'sound/weapons/bloodyslice.ogg' see_invisible = SEE_INVISIBLE_NOLIGHTING diff --git a/code/modules/mob/living/simple_animal/hostile/commanded/bear_companion.dm b/code/modules/mob/living/simple_animal/hostile/commanded/bear_companion.dm index eb1fca962649..fe978b6ec89b 100644 --- a/code/modules/mob/living/simple_animal/hostile/commanded/bear_companion.dm +++ b/code/modules/mob/living/simple_animal/hostile/commanded/bear_companion.dm @@ -13,7 +13,7 @@ density = TRUE belongs_to_station = FALSE - attacktext = "swatted" + attacktext = "swats" melee_damage_lower = 25 melee_damage_upper = 25 resist_mod = 5 diff --git a/code/modules/mob/living/simple_animal/hostile/commanded/guard_dog.dm b/code/modules/mob/living/simple_animal/hostile/commanded/guard_dog.dm index 8ec4a03625e1..192af39487b9 100644 --- a/code/modules/mob/living/simple_animal/hostile/commanded/guard_dog.dm +++ b/code/modules/mob/living/simple_animal/hostile/commanded/guard_dog.dm @@ -23,7 +23,7 @@ sad_emote = list("whines") emote_sounds = list('sound/effects/creatures/dog_bark.ogg', 'sound/effects/creatures/dog_bark2.ogg', 'sound/effects/creatures/dog_bark3.ogg') - attacktext = "bitten" + attacktext = "bites" attack_sound = 'sound/effects/creatures/dog_bark.ogg' harm_intent_damage = 5 melee_damage_lower = 15 diff --git a/code/modules/mob/living/simple_animal/hostile/commanded/ives.dm b/code/modules/mob/living/simple_animal/hostile/commanded/ives.dm index 88da155a7d81..648afbabae00 100644 --- a/code/modules/mob/living/simple_animal/hostile/commanded/ives.dm +++ b/code/modules/mob/living/simple_animal/hostile/commanded/ives.dm @@ -35,7 +35,7 @@ projectilesound = 'sound/weapons/taser2.ogg' projectiletype = /obj/projectile/beam/hivebot/harmless - attacktext = "harmlessly clawed" + attacktext = "harmlessly claws" harm_intent_damage = 5 // the damage we take melee_damage_lower = 0 melee_damage_upper = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/creature.dm b/code/modules/mob/living/simple_animal/hostile/creature.dm index 783cd5823bd2..fcb280a0ef3f 100644 --- a/code/modules/mob/living/simple_animal/hostile/creature.dm +++ b/code/modules/mob/living/simple_animal/hostile/creature.dm @@ -10,7 +10,7 @@ melee_damage_lower = 20 melee_damage_upper = 30 organ_names = list("meaty core") - attacktext = "chomped" + attacktext = "chomps" attack_sound = 'sound/weapons/bite.ogg' faction = "creature" speed = 4 diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm index 59984542d044..592e6026954f 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithless.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm @@ -20,7 +20,7 @@ melee_damage_lower = 15 melee_damage_upper = 15 - attacktext = "gripped" + attacktext = "grips" attack_sound = 'sound/hallucinations/growl1.ogg' min_oxy = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 3992f41c293b..308e92e523a5 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -45,7 +45,7 @@ mob_size = 6 smart_melee = FALSE - attacktext = "bitten" + attacktext = "bites" attack_emote = "skitters toward" attack_sound = 'sound/weapons/bite.ogg' emote_sounds = list('sound/effects/creatures/spider_critter.ogg') diff --git a/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot.dm index d30faf4a2eed..383970deab4b 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot.dm @@ -12,7 +12,7 @@ armor_penetration = 40 attack_flags = DAMAGE_FLAG_SHARP|DAMAGE_FLAG_EDGE break_stuff_probability = 25 - attacktext = "slashed" + attacktext = "slashes" attack_sound = /singleton/sound_category/hivebot_melee projectilesound = 'sound/weapons/gunshot/gunshot_suppressed.ogg' projectiletype = /obj/projectile/bullet/pistol/hivebotspike @@ -179,7 +179,7 @@ maxHealth = 100 icon_state = "hivebotbomber" organ_names = list("head", "core", "bottom thruster") - attacktext = "bumped" + attacktext = "bumps" speed = 8 var/has_exploded = FALSE @@ -231,7 +231,7 @@ melee_damage_lower = 20 melee_damage_upper = 30 armor_penetration = 20 - attacktext = "eviscerated" + attacktext = "eviscerates" projectiletype = null var/playable = TRUE speed = -2 @@ -258,7 +258,7 @@ melee_damage_lower = 10 melee_damage_upper = 20 armor_penetration = 20 - attacktext = "stabbed" + attacktext = "stabs" ranged = 1 projectiletype = /obj/projectile/bullet/pistol/medium speed = -3 @@ -285,7 +285,7 @@ melee_damage_lower = 10 melee_damage_upper = 10 armor_penetration = 10 - attacktext = "slashed" + attacktext = "slashes" ranged = -1 projectiletype = /obj/projectile/bullet/pistol/ diff --git a/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_harvester.dm b/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_harvester.dm index c0bfcd90d8db..7cbfd7bbc852 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_harvester.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_harvester.dm @@ -12,7 +12,7 @@ destroy_surroundings = 0 wander = 0 ranged = 1 - attacktext = "skewered" + attacktext = "skewers" projectilesound = 'sound/weapons/lasercannonfire.ogg' projectiletype = /obj/projectile/beam/hivebot/incendiary/heavy organ_names = list("head", "core", "side thruster", "harvesting array") diff --git a/code/modules/mob/living/simple_animal/hostile/ipc_zombie.dm b/code/modules/mob/living/simple_animal/hostile/ipc_zombie.dm index 4e3c5a9d9e94..647f174479d3 100644 --- a/code/modules/mob/living/simple_animal/hostile/ipc_zombie.dm +++ b/code/modules/mob/living/simple_animal/hostile/ipc_zombie.dm @@ -11,7 +11,7 @@ melee_damage_upper = 20 armor_penetration = 20 attack_sound = 'sound/weapons/smash.ogg' - attacktext = "smashed" + attacktext = "smashes" faction = "hivebot" min_oxy = 0 max_oxy = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/krampus.dm b/code/modules/mob/living/simple_animal/hostile/krampus.dm index 0117abe17ca9..46d8afaebb7b 100644 --- a/code/modules/mob/living/simple_animal/hostile/krampus.dm +++ b/code/modules/mob/living/simple_animal/hostile/krampus.dm @@ -27,7 +27,7 @@ resist_mod = 15 mob_size = 25 environment_smash = 2 - attacktext = "punished" + attacktext = "punishes" attack_sound = 'sound/weapons/bladeslice.ogg' see_invisible = SEE_INVISIBLE_NOLIGHTING @@ -140,7 +140,7 @@ harm_intent_damage = 5 melee_damage_lower = 5 melee_damage_upper = 5 - attacktext = "nibbled" + attacktext = "nibbles" attack_sound = 'sound/weapons/bite.ogg' min_oxy = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index 5249f09c8b73..8d138aa2fc67 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -21,7 +21,7 @@ harm_intent_damage = 5 melee_damage_lower = 8 melee_damage_upper = 12 - attacktext = "attacked" + attacktext = "attacks" attack_sound = 'sound/weapons/bite.ogg' min_oxy = 0 @@ -57,7 +57,7 @@ // Aggro when you try to open them. Will also pickup loot when spawns and drop it when dies. /mob/living/simple_animal/hostile/mimic/crate - attacktext = "bitten" + attacktext = "bites" stop_automated_movement = 1 wander = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/moghes.dm b/code/modules/mob/living/simple_animal/hostile/moghes.dm index cd57c5e0fea1..a50e33d3036a 100644 --- a/code/modules/mob/living/simple_animal/hostile/moghes.dm +++ b/code/modules/mob/living/simple_animal/hostile/moghes.dm @@ -28,7 +28,7 @@ resist_mod = 10 mob_size = 30 environment_smash = 2 - attacktext = "chomped" + attacktext = "chomps" attack_sound = 'sound/weapons/bloodyslice.ogg' see_invisible = SEE_INVISIBLE_NOLIGHTING @@ -158,7 +158,7 @@ melee_damage_lower = 5 melee_damage_upper = 8 - attacktext = "rammed" + attacktext = "rams" attack_sound = 'sound/weapons/punch4_bass.ogg' environment_smash = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/morph.dm b/code/modules/mob/living/simple_animal/hostile/morph.dm index 0366a57317e3..8703c5a472ea 100644 --- a/code/modules/mob/living/simple_animal/hostile/morph.dm +++ b/code/modules/mob/living/simple_animal/hostile/morph.dm @@ -43,7 +43,7 @@ wander = FALSE - attacktext = "glomped" + attacktext = "glomps" attack_sound = 'sound/effects/blobattack.ogg' blood_overlay_icon = null diff --git a/code/modules/mob/living/simple_animal/hostile/phoron_worm.dm b/code/modules/mob/living/simple_animal/hostile/phoron_worm.dm index 18d676391167..e7e6d24f94c7 100644 --- a/code/modules/mob/living/simple_animal/hostile/phoron_worm.dm +++ b/code/modules/mob/living/simple_animal/hostile/phoron_worm.dm @@ -23,7 +23,7 @@ resist_mod = 2 mob_size = 30 environment_smash = 2 - attacktext = "chomped" + attacktext = "chomps" attack_sound = 'sound/weapons/bite.ogg' faction = "worm" diff --git a/code/modules/mob/living/simple_animal/hostile/pirate.dm b/code/modules/mob/living/simple_animal/hostile/pirate.dm index ea9417a4b7dc..8fad93727236 100644 --- a/code/modules/mob/living/simple_animal/hostile/pirate.dm +++ b/code/modules/mob/living/simple_animal/hostile/pirate.dm @@ -19,7 +19,7 @@ harm_intent_damage = 5 melee_damage_lower = 30 melee_damage_upper = 30 - attacktext = "slashed" + attacktext = "slashes" attack_sound = 'sound/weapons/bladeslice.ogg' min_oxy = 5 diff --git a/code/modules/mob/living/simple_animal/hostile/pra.dm b/code/modules/mob/living/simple_animal/hostile/pra.dm index 27822a1c9378..3cef71584ce2 100644 --- a/code/modules/mob/living/simple_animal/hostile/pra.dm +++ b/code/modules/mob/living/simple_animal/hostile/pra.dm @@ -35,7 +35,7 @@ melee_damage_upper = 15 mob_size = 5 - attacktext = "slashed" + attacktext = "slashes" attack_sound = 'sound/weapons/bladeslice.ogg' speed = 2 diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/cavern.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/cavern.dm index ad99e686a850..41a85b0bf712 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/cavern.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/cavern.dm @@ -23,7 +23,7 @@ blood_type = "#006666" melee_damage_lower = 10 melee_damage_upper = 10 - attacktext = "chomped" + attacktext = "chomps" attack_sound = 'sound/weapons/bite.ogg' speed = 4 projectiletype = /obj/projectile/beam/cavern diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm index ad2478c7a7bc..43802eac41f8 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm @@ -22,7 +22,7 @@ harm_intent_damage = 8 melee_damage_lower = 10 melee_damage_upper = 10 - attacktext = "attacked" + attacktext = "attacks" attack_sound = 'sound/items/bikehorn.ogg' min_oxy = 5 diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/konyang.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/konyang.dm index 9b985db8fd80..e4e819116976 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/konyang.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/konyang.dm @@ -20,7 +20,7 @@ melee_damage_lower = 20 melee_damage_upper = 30 armor_penetration = 20 - attacktext = "clawed" + attacktext = "claws" attack_sound = 'sound/weapons/slice.ogg' meat_amount = 8 diff --git a/code/modules/mob/living/simple_animal/hostile/rogue_maint_drone.dm b/code/modules/mob/living/simple_animal/hostile/rogue_maint_drone.dm index 73865532b5c3..ac9c3e859b97 100644 --- a/code/modules/mob/living/simple_animal/hostile/rogue_maint_drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/rogue_maint_drone.dm @@ -14,7 +14,7 @@ melee_damage_lower = 5 melee_damage_upper = 8 armor_penetration = 5 - attacktext = "sliced" + attacktext = "slices" faction = "silicon" min_oxy = 0 minbodytemp = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/russian.dm b/code/modules/mob/living/simple_animal/hostile/russian.dm index e754504a9c77..f97794276c4a 100644 --- a/code/modules/mob/living/simple_animal/hostile/russian.dm +++ b/code/modules/mob/living/simple_animal/hostile/russian.dm @@ -19,7 +19,7 @@ harm_intent_damage = 5 melee_damage_lower = 15 melee_damage_upper = 15 - attacktext = "punched" + attacktext = "punches" a_intent = I_HURT var/corpse = /obj/effect/landmark/mobcorpse/russian var/weapon1 = /obj/item/material/knife diff --git a/code/modules/mob/living/simple_animal/hostile/space_fauna.dm b/code/modules/mob/living/simple_animal/hostile/space_fauna.dm index 902ab7f41503..b9d698ccd6b4 100644 --- a/code/modules/mob/living/simple_animal/hostile/space_fauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/space_fauna.dm @@ -33,7 +33,7 @@ melee_damage_upper = 15 armor_penetration = 5 attack_flags = DAMAGE_FLAG_EDGE - attacktext = "bitten" + attacktext = "bites" attack_sound = 'sound/weapons/bite.ogg' //Space carp aren't affected by atmos. @@ -290,7 +290,7 @@ harm_intent_damage = 5 melee_damage_lower = 5 melee_damage_upper = 5 - attacktext = "bitten" + attacktext = "bites" attack_sound = 'sound/weapons/bite.ogg' min_oxy = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/spider_queen.dm b/code/modules/mob/living/simple_animal/hostile/spider_queen.dm index b18a752db6f5..a5ebe54bf189 100644 --- a/code/modules/mob/living/simple_animal/hostile/spider_queen.dm +++ b/code/modules/mob/living/simple_animal/hostile/spider_queen.dm @@ -36,7 +36,7 @@ mob_swap_flags = HUMAN|SIMPLE_ANIMAL|SLIME|MONKEY mob_push_flags = ALLMOBS - attacktext = "bit" + attacktext = "bites" attack_sound = 'sound/weapons/bite.ogg' pass_flags = PASSTABLE|PASSRAILING diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 34168ee73a02..37a42d70deea 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -19,7 +19,7 @@ harm_intent_damage = 5 melee_damage_lower = 10 melee_damage_upper = 10 - attacktext = "punched" + attacktext = "punches" a_intent = I_HURT var/corpse = /obj/effect/landmark/mobcorpse/syndicatesoldier var/weapon1 @@ -59,7 +59,7 @@ icon_living = "syndicatemelee" weapon1 = /obj/item/melee/energy/sword/red weapon2 = /obj/item/shield/energy - attacktext = "slashed" + attacktext = "slashes" status_flags = 0 /mob/living/simple_animal/hostile/syndicate/melee/attackby(obj/item/attacking_item, mob/user) diff --git a/code/modules/mob/living/simple_animal/hostile/toy/mech.dm b/code/modules/mob/living/simple_animal/hostile/toy/mech.dm index a3d0d1e466f4..63a1416c725b 100644 --- a/code/modules/mob/living/simple_animal/hostile/toy/mech.dm +++ b/code/modules/mob/living/simple_animal/hostile/toy/mech.dm @@ -14,7 +14,7 @@ melee_damage_upper = 2 organ_names = list("chest", "lower body", "left arm", "right arm", "left leg", "right leg", "head") attack_emote = "raises its fist at" - attacktext = "smashed" + attacktext = "smashes" attack_sound = 'sound/weapons/woodenhit.ogg' speed = 2 mob_size = MOB_MINISCULE diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index 0ff5f57dfe26..9303dfbeff6d 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -23,7 +23,7 @@ harm_intent_damage = 5 melee_damage_lower = 8 melee_damage_upper = 12 - attacktext = "bitten" + attacktext = "bites" attack_sound = 'sound/weapons/bite.ogg' //Space carp aren't affected by atmos. diff --git a/code/modules/mob/living/simple_animal/hostile/vannatusk.dm b/code/modules/mob/living/simple_animal/hostile/vannatusk.dm index 69d8fbc0abd5..a7abbf2e727b 100644 --- a/code/modules/mob/living/simple_animal/hostile/vannatusk.dm +++ b/code/modules/mob/living/simple_animal/hostile/vannatusk.dm @@ -24,7 +24,7 @@ resist_mod = 3 mob_size = 15 environment_smash = 2 - attacktext = "mangled" + attacktext = "mangles" attack_emote = "charges toward" attack_sound = 'sound/effects/creatures/vannatusk_attack.ogg' emote_sounds = list('sound/effects/creatures/vannatusk_sound.ogg', 'sound/effects/creatures/vannatusk_sound_2.ogg') diff --git a/code/modules/mob/living/simple_animal/hostile/viscerator.dm b/code/modules/mob/living/simple_animal/hostile/viscerator.dm index 2f278006e935..bfc1dfba9bee 100644 --- a/code/modules/mob/living/simple_animal/hostile/viscerator.dm +++ b/code/modules/mob/living/simple_animal/hostile/viscerator.dm @@ -11,7 +11,7 @@ melee_damage_upper = 15 armor_penetration = 20 density = 0 - attacktext = "cut" + attacktext = "cuts" attack_sound = 'sound/weapons/bladeslice.ogg' blood_overlay_icon = null faction = "syndicate" diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm index 3c7c563a107c..f7e98a353b95 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/simple_animal/shade.dm @@ -17,7 +17,7 @@ response_harm = "punches" melee_damage_lower = 5 melee_damage_upper = 15 - attacktext = "drained the life from" + attacktext = "drains the life from" minbodytemp = 0 maxbodytemp = 4000 min_oxy = 0 diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index a57f77542ae6..1e6935d3e393 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -118,7 +118,7 @@ var/melee_damage_upper = 0 var/armor_penetration = 0 var/attack_flags = 0 - var/attacktext = "attacked" + var/attacktext = "attacks" var/attack_sound = /singleton/sound_category/swing_hit_sound var/friendly = "nuzzles" var/environment_smash = 0 diff --git a/code/modules/mob/living/simple_animal/worm.dm b/code/modules/mob/living/simple_animal/worm.dm index 8848f18b18c0..db535a56a1f9 100644 --- a/code/modules/mob/living/simple_animal/worm.dm +++ b/code/modules/mob/living/simple_animal/worm.dm @@ -181,7 +181,7 @@ melee_damage_lower = 10 melee_damage_upper = 15 - attacktext = "bitten" + attacktext = "bites" animate_movement = SLIDE_STEPS diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 4b8399ffc480..66896b5323c3 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -107,7 +107,7 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) /obj/item/organ/attack_self(var/mob/user) return (owner && loc == owner && owner == user) -/obj/item/organ/proc/update_health() +/obj/item/organ/proc/update_organ_health() return /obj/item/organ/proc/set_dna(var/datum/dna/new_dna) diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 41ad661cd01f..f76124ab0f0b 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -318,9 +318,8 @@ return remove_verb(owner, /mob/living/carbon/human/proc/undislocate) -/obj/item/organ/external/update_health() +/obj/item/organ/external/update_organ_health() damage = min(max_damage, (brute_dam + burn_dam)) - return /obj/item/organ/external/Initialize(mapload) if(robotize_type) diff --git a/code/modules/overmap/ship_weaponry/_ship_ammo_loader.dm b/code/modules/overmap/ship_weaponry/_ship_ammo_loader.dm index c9e523d3a9b4..987fe608ad9e 100644 --- a/code/modules/overmap/ship_weaponry/_ship_ammo_loader.dm +++ b/code/modules/overmap/ship_weaponry/_ship_ammo_loader.dm @@ -5,8 +5,7 @@ icon_state = "ammo_loader" density = TRUE anchored = TRUE - var/damage = 0 - var/max_damage = 1000 + maxhealth = 1000 var/obj/machinery/ship_weapon/weapon var/weapon_id //Used to connect weapon systems to the relevant ammunition loader. @@ -40,14 +39,6 @@ if(3) add_damage(10) -/obj/machinery/ammunition_loader/proc/add_damage(var/amount) - damage = max(0, min(damage + amount, max_damage)) - update_damage() - -/obj/machinery/ammunition_loader/proc/update_damage() - if(damage >= max_damage) - qdel(src) - /obj/machinery/ammunition_loader/attackby(obj/item/attacking_item, mob/user) if(isliving(user)) var/mob/living/carbon/human/H = user diff --git a/code/modules/overmap/ship_weaponry/_ship_gun.dm b/code/modules/overmap/ship_weaponry/_ship_gun.dm index d460a1af82f9..e2b44d07a77f 100644 --- a/code/modules/overmap/ship_weaponry/_ship_gun.dm +++ b/code/modules/overmap/ship_weaponry/_ship_gun.dm @@ -6,8 +6,7 @@ active_power_usage = 50000 anchored = TRUE density = TRUE - var/damage = 0 - var/max_damage = 1000 + health = 1000 var/heavy_firing_sound = 'sound/weapons/gunshot/ship_weapons/120mm_mortar.ogg' //The sound in the immediate firing area. Very loud. var/light_firing_sound = 'sound/effects/explosionfar.ogg' //The sound played when you're a few walls away. Kind of loud. var/projectile_type = /obj/projectile/ship_ammo @@ -30,9 +29,13 @@ var/list/obj/structure/ship_weapon_dummy/connected_dummies = list() var/obj/structure/ship_weapon_dummy/barrel +/obj/machinery/ship_weapon/Initialize(mapload) + . = ..() + AddComponent(/datum/component/armor, list(MELEE = ARMOR_MELEE_MAJOR, BULLET = ARMOR_BALLISTIC_RIFLE, LASER = ARMOR_LASER_MAJOR)) + /obj/machinery/ship_weapon/condition_hints(mob/user, distance, is_adjacent) . += ..() - var/ratio = (damage / max_damage) * 100 + var/ratio = (health / maxhealth) * 100 switch(ratio) if(1 to 10) . += SPAN_NOTICE("It looks to be in tip top shape apart from a few minor scratches and dings.") @@ -58,7 +61,7 @@ /obj/machinery/ship_weapon/assembly_hints(mob/user, distance, is_adjacent) . += ..() - var/ratio = (damage / max_damage) * 100 + var/ratio = (health / maxhealth) * 100 if(ratio > 0) . += "The damage can be repaired with a welder, but given the size of \the [src] it will take a lot of time and welding fuel." @@ -104,13 +107,10 @@ if(3) add_damage(10) -/obj/machinery/ship_weapon/proc/add_damage(var/amount) - damage = max(0, min(damage + amount, max_damage)) - update_damage() - -/obj/machinery/ship_weapon/proc/update_damage() - if(damage >= max_damage) - qdel(src) +/obj/machinery/ship_weapon/on_death(damage, damage_flags, damage_type, armor_penetration, obj/weapon) + visible_message(FONT_LARGE(SPAN_DANGER("\The [src] explodes in a shower of sparks and fire!"))) + explosion(get_turf(src), 5, 7, 9) + . = ..() /obj/machinery/ship_weapon/attackby(obj/item/attacking_item, mob/user) if(istype(attacking_item, /obj/item/device/multitool)) @@ -126,13 +126,13 @@ weapon_id = new_id to_chat(user, SPAN_NOTICE("With some finicking, you change the identification tag to [new_id].")) return TRUE - if(istype(attacking_item, /obj/item/weldingtool) && damage) + if(istype(attacking_item, /obj/item/weldingtool) && (health < maxhealth)) var/obj/item/weldingtool/WT = attacking_item if(WT.get_fuel() >= 20) user.visible_message(SPAN_NOTICE("[user] starts slowly welding kinks and holes in \the [src] back to working shape..."), SPAN_NOTICE("You start welding kinks and holes back to working shape. This'll take a long while...")) if(do_after(user, 15 SECONDS)) - add_damage(-max_damage) + change_health(maxhealth) user.visible_message(SPAN_NOTICE("[user] finally finishes patching up \the [src]'s exterior! It's not a pretty job, but it'll do."), SPAN_NOTICE("You finally finish patching up \the [src]'s exterior! It's not a pretty job, but it'll do.")) WT.use(20) diff --git a/code/modules/overmap/ship_weaponry/weaponry/leviathan.dm b/code/modules/overmap/ship_weaponry/weaponry/leviathan.dm index 3476b8920ac5..56b6ef63deea 100644 --- a/code/modules/overmap/ship_weaponry/weaponry/leviathan.dm +++ b/code/modules/overmap/ship_weaponry/weaponry/leviathan.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/machinery/ship_guns/leviathan.dmi' icon_state = "weapon_off" special_firing_mechanism = TRUE - max_damage = 10000 + maxhealth = 10000 projectile_type = /obj/projectile/ship_ammo/leviathan use_ammunition = FALSE diff --git a/code/modules/overmap/ships/computers/sensors.dm b/code/modules/overmap/ships/computers/sensors.dm index 3b6a5aa114eb..65603ccb2e08 100644 --- a/code/modules/overmap/ships/computers/sensors.dm +++ b/code/modules/overmap/ships/computers/sensors.dm @@ -131,7 +131,7 @@ data["on"] = sensors.use_power data["range"] = sensors.range data["health"] = sensors.health - data["max_health"] = sensors.max_health + data["max_health"] = sensors.maxhealth //todomatt: fix this BULLSHIT data["deep_scan_name"] = sensors.deep_scan_sensor_name data["deep_scan_range"] = sensors.deep_scan_range data["deep_scan_toggled"] = sensors.deep_scan_toggled @@ -401,8 +401,8 @@ icon = 'icons/obj/machinery/sensors.dmi' icon_state = "sensors" anchored = 1 - var/max_health = 200 - var/health = 200 + health = 200 + var/max_health var/critical_heat = 50 // sparks and takes damage when active & above this heat var/heat_reduction = 1.7 // mitigates this much heat per tick - can sustain range 4 var/heat = 0 diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 5f27640bc07c..418cef3ca3b6 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -33,19 +33,21 @@ If d1 = dir1 and d2 = dir2, it's a full X-X cable, getting from dir1 to dir2 By design, d1 is the smallest direction and d2 is the highest */ /obj/structure/cable - level = 1 - anchored =1 - var/datum/powernet/powernet name = "power cable" desc = "A flexible superconducting cable for heavy-duty power transfer." icon = 'icons/obj/power_cond_white.dmi' icon_state = "0-1" + level = 1 + anchored =1 + maxhealth = null //why is this even a structure? obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED - var/d1 = 0 - var/d2 = 1 layer = EXPOSED_WIRE_LAYER color = COLOR_RED + + var/datum/powernet/powernet var/obj/machinery/power/breakerbox/breaker_box + var/d1 = 0 + var/d2 = 1 /obj/structure/cable/feedback_hints(mob/user, distance, is_adjacent) . += ..() diff --git a/code/modules/power/collector.dm b/code/modules/power/collector.dm index 4b4891adacd0..708ad2ff2f20 100644 --- a/code/modules/power/collector.dm +++ b/code/modules/power/collector.dm @@ -12,8 +12,7 @@ GLOBAL_LIST_INIT_TYPED(rad_collectors, /obj/machinery/power/rad_collector, list( /// The tank of phoron currently attached to the radiation collector var/obj/item/tank/phoron/loaded_tank = null - /// Current health of the collector. TODO: replace with global health - var/health = 100 + health = 100 /// The maximum safe temperature that the radiation collector can handle var/max_safe_temp = 1000 + T0C /// A boolean determining whether the collector has melted or not. diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index fe36f72f0fd9..4428bf0601cc 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -27,7 +27,9 @@ use_power = POWER_USE_OFF clicksound = /singleton/sound_category/switch_sound - var/health = 500 + health = 500 + maxhealth = 500 + var/busted = FALSE // this it to prevent the damage text from playing repeatedly var/capacity = 5e6 // maximum charge diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index af3455881080..fdcc3a95b4aa 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -8,8 +8,8 @@ use_power = POWER_USE_OFF idle_power_usage = 0 active_power_usage = 0 + var/id = 0 - var/health = 10 var/obscured = 0 var/sunfrac = 0 var/adir = SOUTH // actual dir diff --git a/code/modules/random_map/automata/diona.dm b/code/modules/random_map/automata/diona.dm index 229390b9f3a0..ee5b84007f67 100644 --- a/code/modules/random_map/automata/diona.dm +++ b/code/modules/random_map/automata/diona.dm @@ -13,14 +13,9 @@ density = TRUE opacity = FALSE layer = ABOVE_TILE_LAYER - var/max_health = 50 - var/health + maxhealth = 50 var/destroy_spawntype = /mob/living/carbon/alien/diona -/obj/structure/diona/Initialize(mapload) - . = ..() - health = max_health - /obj/structure/diona/attackby(obj/item/attacking_item, mob/user) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if(attacking_item.iswelder()) diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 980dcb37fc5c..184605652769 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -838,11 +838,13 @@ desc = "An underfloor disposal pipe." anchored = 1 density = 0 + maxhealth = 10 level = 1 // underfloor only + + var/dpdir = 0 // bitmask of pipe directions //dir = 0 // dir will contain dominant direction for junction pipes - var/health = 10 // health points 0-10 layer = EXPOSED_DISPOSALS_PIPE_LAYER var/sortType = "" var/subtype = 0 diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index 50bbe1d7a9b1..0169943d0cc2 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -2,8 +2,9 @@ name = "\improper R&D server" desc = "A server which houses a back-up of all station research. It can be used to restore lost data, or to act as another point of retrieval." icon_state = "RD-server" + health = 100 + var/datum/research/files - var/health = 100 var/list/id_with_upload = list() //List of R&D consoles with upload to server access. var/list/id_with_download = list() //List of R&D consoles with download from server access. var/id_with_upload_string = "" //String versions for easy editing in map editor. diff --git a/code/modules/shieldgen/emergency_shield.dm b/code/modules/shieldgen/emergency_shield.dm index 2253b7728d57..da0a2094d0a7 100644 --- a/code/modules/shieldgen/emergency_shield.dm +++ b/code/modules/shieldgen/emergency_shield.dm @@ -8,7 +8,7 @@ anchored = TRUE unacidable = TRUE atmos_canpass = CANPASS_NEVER - var/health = 75 //The shield can only take so much beating (prevents perma-prisons) + health = 75 var/shield_generate_power = 2500 //how much power we use when regenerating var/shield_idle_power = 500 //how much power we use when just being sustained. @@ -153,7 +153,7 @@ opacity = FALSE anchored = FALSE req_access = list(ACCESS_ENGINE) - var/health = 100 + health = 100 var/active = FALSE var/malfunction = FALSE //Malfunction causes parts of the shield to slowly dissapate var/list/deployed_shields = list() diff --git a/code/modules/tables/tables.dm b/code/modules/tables/tables.dm index 14e92fdf45cb..385edf9e209a 100644 --- a/code/modules/tables/tables.dm +++ b/code/modules/tables/tables.dm @@ -8,7 +8,6 @@ pass_flags_self = PASSTABLE | LETPASSTHROW climbable = TRUE layer = TABLE_LAYER - breakable = TRUE build_amt = 1 //Preset shit @@ -17,8 +16,7 @@ var/no_cargo var/flipped = 0 - var/maxhealth = 10 - var/health = 10 + health = 10 // For racks (which cannot be either of these things) var/can_reinforce = 1 @@ -138,8 +136,6 @@ material = SSmaterials.get_material_by_name(table_mat) if(table_reinf) reinforced = SSmaterials.get_material_by_name(table_reinf) - if(reinforced) - breakable = FALSE . = ..() @@ -174,6 +170,7 @@ T.queue_icon_update() return ..() +//todomatt: make reinforced tables add armour /obj/structure/table/proc/reinforce_table(obj/item/stack/material/S, mob/user) if(reinforced) to_chat(user, SPAN_WARNING("\The [src] is already reinforced!")) @@ -193,7 +190,6 @@ reinforced = common_material_add(S, user, "reinforc") if(reinforced) - breakable = FALSE update_desc() queue_icon_update() update_material() @@ -253,7 +249,6 @@ /obj/structure/table/proc/remove_reinforced(obj/item/screwdriver/S, mob/user) reinforced = common_material_remove(user, reinforced, 40, "reinforcements", "screws", 'sound/items/Screwdriver.ogg') - breakable = TRUE /obj/structure/table/proc/remove_material(obj/item/wrench/W, mob/user) material = common_material_remove(user, material, 20, "plating", "bolts", W.usesound) diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index 5f9d7ae553cb..9c51d4747c3a 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -12,7 +12,6 @@ anchored = 1 animate_movement=1 light_range = 3 - buckle_movable = 1 buckle_lying = 0 @@ -20,8 +19,6 @@ var/attack_log = null var/on = 0 - var/health = 0 //do not forget to set health for your vehicle! - var/maxhealth = 0 var/fire_dam_coeff = 1.0 var/brute_dam_coeff = 1.0 var/open = 0 //Maint panel diff --git a/maps/sccv_horizon/code/sccv_horizon_structures.dm b/maps/sccv_horizon/code/sccv_horizon_structures.dm index 383885135833..88042f11b202 100644 --- a/maps/sccv_horizon/code/sccv_horizon_structures.dm +++ b/maps/sccv_horizon/code/sccv_horizon_structures.dm @@ -8,7 +8,7 @@ icon_state = "m-1" atmos_canpass = CANPASS_DENSITY - var/health = 1000 + maxhealth = 1000 /obj/structure/tank_wall/Initialize(mapload) . = ..() diff --git a/tgui/public/tgui.bundle.js b/tgui/public/tgui.bundle.js index a8f6a2a34dc5..1821cd0d15e3 100644 --- a/tgui/public/tgui.bundle.js +++ b/tgui/public/tgui.bundle.js @@ -1 +1 @@ -!function(){var e={36997:function(e,t,n){"use strict";t.__esModule=!0,t.popperGenerator=h,t.createPopper=void 0;var o=p(n(65811)),r=p(n(62408)),a=p(n(39662)),i=p(n(95111)),c=(p(n(25462)),p(n(23967))),l=p(n(17850)),u=(p(n(23849)),p(n(6559)),p(n(91561)),p(n(13043))),d=p(n(63308));t.detectOverflow=d["default"];var s=n(1316);n(61797);function p(e){return e&&e.__esModule?e:{"default":e}}var m={placement:"bottom",modifiers:[],strategy:"absolute"};function f(){for(var e=arguments.length,t=new Array(e),n=0;n=0&&(0,d.isHTMLElement)(e)?(0,c["default"])(e):e;if(!(0,d.isElement)(n))return[];return t.filter((function(e){return(0,d.isElement)(e)&&(0,m["default"])(e,n)&&"body"!==(0,f["default"])(e)}))}(e):[].concat(t),r=[].concat(o,[n]),a=r[0],l=r.reduce((function(t,n){var o=b(e,n);return t.top=(0,C.max)(o.top,t.top),t.right=(0,C.min)(o.right,t.right),t.bottom=(0,C.min)(o.bottom,t.bottom),t.left=(0,C.max)(o.left,t.left),t}),b(e,a));return l.width=l.right-l.left,l.height=l.bottom-l.top,l.x=l.left,l.y=l.top,l};var o=n(61797),r=g(n(68056)),a=g(n(52779)),i=g(n(39662)),c=g(n(95111)),l=g(n(67977)),u=g(n(25462)),d=n(1316),s=g(n(93529)),p=g(n(62576)),m=g(n(63171)),f=g(n(22999)),h=g(n(24955)),C=n(36083);function g(e){return e&&e.__esModule?e:{"default":e}}function b(e,t){return t===o.viewport?(0,h["default"])((0,r["default"])(e)):(0,d.isHTMLElement)(t)?function(e){var t=(0,s["default"])(e);return t.top=t.top+e.clientTop,t.left=t.left+e.clientLeft,t.bottom=t.top+e.clientHeight,t.right=t.left+e.clientWidth,t.width=e.clientWidth,t.height=e.clientHeight,t.x=t.left,t.y=t.top,t}(t):(0,h["default"])((0,a["default"])((0,l["default"])(e)))}},65811:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e,t,n){void 0===n&&(n=!1);var d=(0,i.isHTMLElement)(t),s=(0,i.isHTMLElement)(t)&&function(e){var t=e.getBoundingClientRect(),n=t.width/e.offsetWidth||1,o=t.height/e.offsetHeight||1;return 1!==n||1!==o}(t),p=(0,l["default"])(t),m=(0,o["default"])(e,s),f={scrollLeft:0,scrollTop:0},h={x:0,y:0};(d||!d&&!n)&&(("body"!==(0,a["default"])(t)||(0,u["default"])(p))&&(f=(0,r["default"])(t)),(0,i.isHTMLElement)(t)?((h=(0,o["default"])(t,!0)).x+=t.clientLeft,h.y+=t.clientTop):p&&(h.x=(0,c["default"])(p)));return{x:m.left+f.scrollLeft-h.x,y:m.top+f.scrollTop-h.y,width:m.width,height:m.height}};var o=d(n(93529)),r=d(n(62317)),a=d(n(22999)),i=n(1316),c=d(n(54418)),l=d(n(67977)),u=d(n(63383));function d(e){return e&&e.__esModule?e:{"default":e}}},25462:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return(0,r["default"])(e).getComputedStyle(e)};var o,r=(o=n(83808))&&o.__esModule?o:{"default":o}},67977:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return(((0,o.isElement)(e)?e.ownerDocument:e.document)||window.document).documentElement};var o=n(1316)},52779:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t,n=(0,o["default"])(e),l=(0,i["default"])(e),u=null==(t=e.ownerDocument)?void 0:t.body,d=(0,c.max)(n.scrollWidth,n.clientWidth,u?u.scrollWidth:0,u?u.clientWidth:0),s=(0,c.max)(n.scrollHeight,n.clientHeight,u?u.scrollHeight:0,u?u.clientHeight:0),p=-l.scrollLeft+(0,a["default"])(e),m=-l.scrollTop;"rtl"===(0,r["default"])(u||n).direction&&(p+=(0,c.max)(n.clientWidth,u?u.clientWidth:0)-d);return{width:d,height:s,x:p,y:m}};var o=l(n(67977)),r=l(n(25462)),a=l(n(54418)),i=l(n(43581)),c=n(36083);function l(e){return e&&e.__esModule?e:{"default":e}}},66860:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}}},62408:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=(0,r["default"])(e),n=e.offsetWidth,o=e.offsetHeight;Math.abs(t.width-n)<=1&&(n=t.width);Math.abs(t.height-o)<=1&&(o=t.height);return{x:e.offsetLeft,y:e.offsetTop,width:n,height:o}};var o,r=(o=n(93529))&&o.__esModule?o:{"default":o}},22999:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return e?(e.nodeName||"").toLowerCase():null}},62317:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return e!==(0,r["default"])(e)&&(0,a.isHTMLElement)(e)?(0,i["default"])(e):(0,o["default"])(e)};var o=c(n(43581)),r=c(n(83808)),a=n(1316),i=c(n(66860));function c(e){return e&&e.__esModule?e:{"default":e}}},95111:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=(0,o["default"])(e),n=d(e);for(;n&&(0,c["default"])(n)&&"static"===(0,a["default"])(n).position;)n=d(n);if(n&&("html"===(0,r["default"])(n)||"body"===(0,r["default"])(n)&&"static"===(0,a["default"])(n).position))return t;return n||function(e){var t=-1!==navigator.userAgent.toLowerCase().indexOf("firefox");if(-1!==navigator.userAgent.indexOf("Trident")&&(0,i.isHTMLElement)(e)){if("fixed"===(0,a["default"])(e).position)return null}var n=(0,l["default"])(e);for(;(0,i.isHTMLElement)(n)&&["html","body"].indexOf((0,r["default"])(n))<0;){var o=(0,a["default"])(n);if("none"!==o.transform||"none"!==o.perspective||"paint"===o.contain||-1!==["transform","perspective"].indexOf(o.willChange)||t&&"filter"===o.willChange||t&&o.filter&&"none"!==o.filter)return n;n=n.parentNode}return null}(e)||t};var o=u(n(83808)),r=u(n(22999)),a=u(n(25462)),i=n(1316),c=u(n(45574)),l=u(n(62576));function u(e){return e&&e.__esModule?e:{"default":e}}function d(e){return(0,i.isHTMLElement)(e)&&"fixed"!==(0,a["default"])(e).position?e.offsetParent:null}},62576:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){if("html"===(0,o["default"])(e))return e;return e.assignedSlot||e.parentNode||((0,a.isShadowRoot)(e)?e.host:null)||(0,r["default"])(e)};var o=i(n(22999)),r=i(n(67977)),a=n(1316);function i(e){return e&&e.__esModule?e:{"default":e}}},99597:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function l(e){if(["html","body","#document"].indexOf((0,a["default"])(e))>=0)return e.ownerDocument.body;if((0,i.isHTMLElement)(e)&&(0,r["default"])(e))return e;return l((0,o["default"])(e))};var o=c(n(62576)),r=c(n(63383)),a=c(n(22999)),i=n(1316);function c(e){return e&&e.__esModule?e:{"default":e}}},68056:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=(0,o["default"])(e),n=(0,r["default"])(e),i=t.visualViewport,c=n.clientWidth,l=n.clientHeight,u=0,d=0;i&&(c=i.width,l=i.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(u=i.offsetLeft,d=i.offsetTop));return{width:c,height:l,x:u+(0,a["default"])(e),y:d}};var o=i(n(83808)),r=i(n(67977)),a=i(n(54418));function i(e){return e&&e.__esModule?e:{"default":e}}},83808:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){if(null==e)return window;if("[object Window]"!==e.toString()){var t=e.ownerDocument;return t&&t.defaultView||window}return e}},43581:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=(0,r["default"])(e),n=t.pageXOffset,o=t.pageYOffset;return{scrollLeft:n,scrollTop:o}};var o,r=(o=n(83808))&&o.__esModule?o:{"default":o}},54418:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return(0,o["default"])((0,r["default"])(e)).left+(0,a["default"])(e).scrollLeft};var o=i(n(93529)),r=i(n(67977)),a=i(n(43581));function i(e){return e&&e.__esModule?e:{"default":e}}},1316:function(e,t,n){"use strict";t.__esModule=!0,t.isElement=function(e){var t=(0,r["default"])(e).Element;return e instanceof t||e instanceof Element},t.isHTMLElement=function(e){var t=(0,r["default"])(e).HTMLElement;return e instanceof t||e instanceof HTMLElement},t.isShadowRoot=function(e){if("undefined"==typeof ShadowRoot)return!1;var t=(0,r["default"])(e).ShadowRoot;return e instanceof t||e instanceof ShadowRoot};var o,r=(o=n(83808))&&o.__esModule?o:{"default":o}},63383:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=(0,r["default"])(e),n=t.overflow,o=t.overflowX,a=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+a+o)};var o,r=(o=n(25462))&&o.__esModule?o:{"default":o}},45574:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return["table","td","th"].indexOf((0,r["default"])(e))>=0};var o,r=(o=n(22999))&&o.__esModule?o:{"default":o}},39662:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function l(e,t){var n;void 0===t&&(t=[]);var c=(0,o["default"])(e),u=c===(null==(n=e.ownerDocument)?void 0:n.body),d=(0,a["default"])(c),s=u?[d].concat(d.visualViewport||[],(0,i["default"])(c)?c:[]):c,p=t.concat(s);return u?p:p.concat(l((0,r["default"])(s)))};var o=c(n(99597)),r=c(n(62576)),a=c(n(83808)),i=c(n(63383));function c(e){return e&&e.__esModule?e:{"default":e}}},61797:function(e,t){"use strict";t.__esModule=!0,t.modifierPhases=t.afterWrite=t.write=t.beforeWrite=t.afterMain=t.main=t.beforeMain=t.afterRead=t.read=t.beforeRead=t.placements=t.variationPlacements=t.reference=t.popper=t.viewport=t.clippingParents=t.end=t.start=t.basePlacements=t.auto=t.left=t.right=t.bottom=t.top=void 0;t.top="top";var n="bottom";t.bottom=n;var o="right";t.right=o;var r="left";t.left=r;var a="auto";t.auto=a;var i=["top",n,o,r];t.basePlacements=i;var c="start";t.start=c;var l="end";t.end=l;t.clippingParents="clippingParents";t.viewport="viewport";t.popper="popper";t.reference="reference";var u=i.reduce((function(e,t){return e.concat([t+"-"+c,t+"-"+l])}),[]);t.variationPlacements=u;var d=[].concat(i,[a]).reduce((function(e,t){return e.concat([t,t+"-"+c,t+"-"+l])}),[]);t.placements=d;var s="beforeRead";t.beforeRead=s;var p="read";t.read=p;var m="afterRead";t.afterRead=m;var f="beforeMain";t.beforeMain=f;var h="main";t.main=h;var C="afterMain";t.afterMain=C;var g="beforeWrite";t.beforeWrite=g;var b="write";t.write=b;var v="afterWrite";t.afterWrite=v;var N=[s,p,m,f,h,C,g,b,v];t.modifierPhases=N},84195:function(e,t,n){"use strict";t.__esModule=!0;var o={popperGenerator:!0,detectOverflow:!0,createPopperBase:!0,createPopper:!0,createPopperLite:!0};t.createPopperLite=t.createPopper=t.createPopperBase=t.detectOverflow=t.popperGenerator=void 0;var r=n(61797);Object.keys(r).forEach((function(e){"default"!==e&&"__esModule"!==e&&(Object.prototype.hasOwnProperty.call(o,e)||e in t&&t[e]===r[e]||(t[e]=r[e]))}));var a=n(16850);Object.keys(a).forEach((function(e){"default"!==e&&"__esModule"!==e&&(Object.prototype.hasOwnProperty.call(o,e)||e in t&&t[e]===a[e]||(t[e]=a[e]))}));var i=n(36997);t.popperGenerator=i.popperGenerator,t.detectOverflow=i.detectOverflow,t.createPopperBase=i.createPopper;var c=n(38385);t.createPopper=c.createPopper;var l=n(97126);t.createPopperLite=l.createPopper},59028:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var o,r=(o=n(22999))&&o.__esModule?o:{"default":o},a=n(1316);var i={name:"applyStyles",enabled:!0,phase:"write",fn:function(e){var t=e.state;Object.keys(t.elements).forEach((function(e){var n=t.styles[e]||{},o=t.attributes[e]||{},i=t.elements[e];(0,a.isHTMLElement)(i)&&(0,r["default"])(i)&&(Object.assign(i.style,n),Object.keys(o).forEach((function(e){var t=o[e];!1===t?i.removeAttribute(e):i.setAttribute(e,!0===t?"":t)})))}))},effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach((function(e){var o=t.elements[e],i=t.attributes[e]||{},c=Object.keys(t.styles.hasOwnProperty(e)?t.styles[e]:n[e]).reduce((function(e,t){return e[t]="",e}),{});(0,a.isHTMLElement)(o)&&(0,r["default"])(o)&&(Object.assign(o.style,c),Object.keys(i).forEach((function(e){o.removeAttribute(e)})))}))}},requires:["computeStyles"]};t["default"]=i},25615:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var o=p(n(91561)),r=p(n(62408)),a=p(n(63171)),i=p(n(95111)),c=p(n(19398)),l=p(n(83158)),u=p(n(2595)),d=p(n(1724)),s=n(61797);n(1316);function p(e){return e&&e.__esModule?e:{"default":e}}var m=function(e,t){return e="function"==typeof e?e(Object.assign({},t.rects,{placement:t.placement})):e,(0,u["default"])("number"!=typeof e?e:(0,d["default"])(e,s.basePlacements))};var f={name:"arrow",enabled:!0,phase:"main",fn:function(e){var t,n=e.state,a=e.name,u=e.options,d=n.elements.arrow,p=n.modifiersData.popperOffsets,f=(0,o["default"])(n.placement),h=(0,c["default"])(f),C=[s.left,s.right].indexOf(f)>=0?"height":"width";if(d&&p){var g=m(u.padding,n),b=(0,r["default"])(d),v="y"===h?s.top:s.left,N="y"===h?s.bottom:s.right,V=n.rects.reference[C]+n.rects.reference[h]-p[h]-n.rects.popper[C],y=p[h]-n.rects.reference[h],_=(0,i["default"])(d),w=_?"y"===h?_.clientHeight||0:_.clientWidth||0:0,k=V/2-y/2,S=g[v],B=w-b[C]-g[N],x=w/2-b[C]/2+k,A=(0,l["default"])(S,x,B),D=h;n.modifiersData[a]=((t={})[D]=A,t.centerOffset=A-x,t)}},effect:function(e){var t=e.state,n=e.options.element,o=void 0===n?"[data-popper-arrow]":n;null!=o&&("string"!=typeof o||(o=t.elements.popper.querySelector(o)))&&(0,a["default"])(t.elements.popper,o)&&(t.elements.arrow=o)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};t["default"]=f},21481:function(e,t,n){"use strict";t.__esModule=!0,t.mapToStyles=p,t["default"]=void 0;var o=n(61797),r=d(n(95111)),a=d(n(83808)),i=d(n(67977)),c=d(n(25462)),l=d(n(91561)),u=n(36083);function d(e){return e&&e.__esModule?e:{"default":e}}var s={top:"auto",right:"auto",bottom:"auto",left:"auto"};function p(e){var t,n=e.popper,l=e.popperRect,d=e.placement,p=e.offsets,m=e.position,f=e.gpuAcceleration,h=e.adaptive,C=e.roundOffsets,g=!0===C?function(e){var t=e.x,n=e.y,o=window.devicePixelRatio||1;return{x:(0,u.round)((0,u.round)(t*o)/o)||0,y:(0,u.round)((0,u.round)(n*o)/o)||0}}(p):"function"==typeof C?C(p):p,b=g.x,v=void 0===b?0:b,N=g.y,V=void 0===N?0:N,y=p.hasOwnProperty("x"),_=p.hasOwnProperty("y"),w=o.left,k=o.top,S=window;if(h){var B=(0,r["default"])(n),x="clientHeight",A="clientWidth";B===(0,a["default"])(n)&&(B=(0,i["default"])(n),"static"!==(0,c["default"])(B).position&&(x="scrollHeight",A="scrollWidth")),d===o.top&&(k=o.bottom,V-=B[x]-l.height,V*=f?1:-1),d===o.left&&(w=o.right,v-=B[A]-l.width,v*=f?1:-1)}var D,L=Object.assign({position:m},h&&s);return f?Object.assign({},L,((D={})[k]=_?"0":"",D[w]=y?"0":"",D.transform=(S.devicePixelRatio||1)<2?"translate("+v+"px, "+V+"px)":"translate3d("+v+"px, "+V+"px, 0)",D)):Object.assign({},L,((t={})[k]=_?V+"px":"",t[w]=y?v+"px":"",t.transform="",t))}var m={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(e){var t=e.state,n=e.options,o=n.gpuAcceleration,r=void 0===o||o,a=n.adaptive,i=void 0===a||a,c=n.roundOffsets,u=void 0===c||c,d={placement:(0,l["default"])(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:r};null!=t.modifiersData.popperOffsets&&(t.styles.popper=Object.assign({},t.styles.popper,p(Object.assign({},d,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:i,roundOffsets:u})))),null!=t.modifiersData.arrow&&(t.styles.arrow=Object.assign({},t.styles.arrow,p(Object.assign({},d,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:u})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})},data:{}};t["default"]=m},42325:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var o,r=(o=n(83808))&&o.__esModule?o:{"default":o};var a={passive:!0};var i={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(e){var t=e.state,n=e.instance,o=e.options,i=o.scroll,c=void 0===i||i,l=o.resize,u=void 0===l||l,d=(0,r["default"])(t.elements.popper),s=[].concat(t.scrollParents.reference,t.scrollParents.popper);return c&&s.forEach((function(e){e.addEventListener("scroll",n.update,a)})),u&&d.addEventListener("resize",n.update,a),function(){c&&s.forEach((function(e){e.removeEventListener("scroll",n.update,a)})),u&&d.removeEventListener("resize",n.update,a)}},data:{}};t["default"]=i},56159:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var o=d(n(86141)),r=d(n(91561)),a=d(n(10404)),i=d(n(63308)),c=d(n(97396)),l=n(61797),u=d(n(26992));function d(e){return e&&e.__esModule?e:{"default":e}}var s={name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,d=e.name;if(!t.modifiersData[d]._skip){for(var s=n.mainAxis,p=void 0===s||s,m=n.altAxis,f=void 0===m||m,h=n.fallbackPlacements,C=n.padding,g=n.boundary,b=n.rootBoundary,v=n.altBoundary,N=n.flipVariations,V=void 0===N||N,y=n.allowedAutoPlacements,_=t.options.placement,w=(0,r["default"])(_),k=h||(w===_||!V?[(0,o["default"])(_)]:function(e){if((0,r["default"])(e)===l.auto)return[];var t=(0,o["default"])(e);return[(0,a["default"])(e),t,(0,a["default"])(t)]}(_)),S=[_].concat(k).reduce((function(e,n){return e.concat((0,r["default"])(n)===l.auto?(0,c["default"])(t,{placement:n,boundary:g,rootBoundary:b,padding:C,flipVariations:V,allowedAutoPlacements:y}):n)}),[]),B=t.rects.reference,x=t.rects.popper,A=new Map,D=!0,L=S[0],E=0;E=0,M=O?"width":"height",P=(0,i["default"])(t,{placement:T,boundary:g,rootBoundary:b,altBoundary:v,padding:C}),R=O?F?l.right:l.left:F?l.bottom:l.top;B[M]>x[M]&&(R=(0,o["default"])(R));var j=(0,o["default"])(R),W=[];if(p&&W.push(P[I]<=0),f&&W.push(P[R]<=0,P[j]<=0),W.every((function(e){return e}))){L=T,D=!1;break}A.set(T,W)}if(D)for(var z=function(e){var t=S.find((function(t){var n=A.get(t);if(n)return n.slice(0,e).every((function(e){return e}))}));if(t)return L=t,"break"},U=V?3:1;U>0;U--){if("break"===z(U))break}t.placement!==L&&(t.modifiersData[d]._skip=!0,t.placement=L,t.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};t["default"]=s},408:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var o,r=n(61797),a=(o=n(63308))&&o.__esModule?o:{"default":o};function i(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function c(e){return[r.top,r.right,r.bottom,r.left].some((function(t){return e[t]>=0}))}var l={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(e){var t=e.state,n=e.name,o=t.rects.reference,r=t.rects.popper,l=t.modifiersData.preventOverflow,u=(0,a["default"])(t,{elementContext:"reference"}),d=(0,a["default"])(t,{altBoundary:!0}),s=i(u,o),p=i(d,r,l),m=c(s),f=c(p);t.modifiersData[n]={referenceClippingOffsets:s,popperEscapeOffsets:p,isReferenceHidden:m,hasPopperEscaped:f},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":m,"data-popper-escaped":f})}};t["default"]=l},16850:function(e,t,n){"use strict";t.__esModule=!0,t.preventOverflow=t.popperOffsets=t.offset=t.hide=t.flip=t.eventListeners=t.computeStyles=t.arrow=t.applyStyles=void 0;var o=p(n(59028));t.applyStyles=o["default"];var r=p(n(25615));t.arrow=r["default"];var a=p(n(21481));t.computeStyles=a["default"];var i=p(n(42325));t.eventListeners=i["default"];var c=p(n(56159));t.flip=c["default"];var l=p(n(408));t.hide=l["default"];var u=p(n(62167));t.offset=u["default"];var d=p(n(56496));t.popperOffsets=d["default"];var s=p(n(458));function p(e){return e&&e.__esModule?e:{"default":e}}t.preventOverflow=s["default"]},62167:function(e,t,n){"use strict";t.__esModule=!0,t.distanceAndSkiddingToXY=i,t["default"]=void 0;var o,r=(o=n(91561))&&o.__esModule?o:{"default":o},a=n(61797);function i(e,t,n){var o=(0,r["default"])(e),i=[a.left,a.top].indexOf(o)>=0?-1:1,c="function"==typeof n?n(Object.assign({},t,{placement:e})):n,l=c[0],u=c[1];return l=l||0,u=(u||0)*i,[a.left,a.right].indexOf(o)>=0?{x:u,y:l}:{x:l,y:u}}var c={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(e){var t=e.state,n=e.options,o=e.name,r=n.offset,c=void 0===r?[0,0]:r,l=a.placements.reduce((function(e,n){return e[n]=i(n,t.rects,c),e}),{}),u=l[t.placement],d=u.x,s=u.y;null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=d,t.modifiersData.popperOffsets.y+=s),t.modifiersData[o]=l}};t["default"]=c},56496:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var o,r=(o=n(38138))&&o.__esModule?o:{"default":o};var a={name:"popperOffsets",enabled:!0,phase:"read",fn:function(e){var t=e.state,n=e.name;t.modifiersData[n]=(0,r["default"])({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})},data:{}};t["default"]=a},458:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var o=n(61797),r=f(n(91561)),a=f(n(19398)),i=f(n(81367)),c=f(n(83158)),l=f(n(62408)),u=f(n(95111)),d=f(n(63308)),s=f(n(26992)),p=f(n(15565)),m=n(36083);function f(e){return e&&e.__esModule?e:{"default":e}}var h={name:"preventOverflow",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,f=e.name,h=n.mainAxis,C=void 0===h||h,g=n.altAxis,b=void 0!==g&&g,v=n.boundary,N=n.rootBoundary,V=n.altBoundary,y=n.padding,_=n.tether,w=void 0===_||_,k=n.tetherOffset,S=void 0===k?0:k,B=(0,d["default"])(t,{boundary:v,rootBoundary:N,padding:y,altBoundary:V}),x=(0,r["default"])(t.placement),A=(0,s["default"])(t.placement),D=!A,L=(0,a["default"])(x),E=(0,i["default"])(L),T=t.modifiersData.popperOffsets,I=t.rects.reference,F=t.rects.popper,O="function"==typeof S?S(Object.assign({},t.rects,{placement:t.placement})):S,M={x:0,y:0};if(T){if(C||b){var P="y"===L?o.top:o.left,R="y"===L?o.bottom:o.right,j="y"===L?"height":"width",W=T[L],z=T[L]+B[P],U=T[L]-B[R],K=w?-F[j]/2:0,H=A===o.start?I[j]:F[j],G=A===o.start?-F[j]:-I[j],Y=t.elements.arrow,q=w&&Y?(0,l["default"])(Y):{width:0,height:0},$=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:(0,p["default"])(),Q=$[P],J=$[R],Z=(0,c["default"])(0,I[j],q[j]),X=D?I[j]/2-K-Z-Q-O:H-Z-Q-O,ee=D?-I[j]/2+K+Z+J+O:G+Z+J+O,te=t.elements.arrow&&(0,u["default"])(t.elements.arrow),ne=te?"y"===L?te.clientTop||0:te.clientLeft||0:0,oe=t.modifiersData.offset?t.modifiersData.offset[t.placement][L]:0,re=T[L]+X-oe-ne,ae=T[L]+ee-oe;if(C){var ie=(0,c["default"])(w?(0,m.min)(z,re):z,W,w?(0,m.max)(U,ae):U);T[L]=ie,M[L]=ie-W}if(b){var ce="x"===L?o.top:o.left,le="x"===L?o.bottom:o.right,ue=T[E],de=ue+B[ce],se=ue-B[le],pe=(0,c["default"])(w?(0,m.min)(de,re):de,ue,w?(0,m.max)(se,ae):se);T[E]=pe,M[E]=pe-ue}}t.modifiersData[f]=M}},requiresIfExists:["offset"]};t["default"]=h},97126:function(e,t,n){"use strict";t.__esModule=!0,t.defaultModifiers=t.createPopper=void 0;var o=n(36997);t.popperGenerator=o.popperGenerator,t.detectOverflow=o.detectOverflow;var r=l(n(42325)),a=l(n(56496)),i=l(n(21481)),c=l(n(59028));function l(e){return e&&e.__esModule?e:{"default":e}}var u=[r["default"],a["default"],i["default"],c["default"]];t.defaultModifiers=u;var d=(0,o.popperGenerator)({defaultModifiers:u});t.createPopper=d},38385:function(e,t,n){"use strict";t.__esModule=!0;var o={createPopper:!0,createPopperLite:!0,defaultModifiers:!0,popperGenerator:!0,detectOverflow:!0};t.defaultModifiers=t.createPopperLite=t.createPopper=void 0;var r=n(36997);t.popperGenerator=r.popperGenerator,t.detectOverflow=r.detectOverflow;var a=C(n(42325)),i=C(n(56496)),c=C(n(21481)),l=C(n(59028)),u=C(n(62167)),d=C(n(56159)),s=C(n(458)),p=C(n(25615)),m=C(n(408)),f=n(97126);t.createPopperLite=f.createPopper;var h=n(16850);function C(e){return e&&e.__esModule?e:{"default":e}}Object.keys(h).forEach((function(e){"default"!==e&&"__esModule"!==e&&(Object.prototype.hasOwnProperty.call(o,e)||e in t&&t[e]===h[e]||(t[e]=h[e]))}));var g=[a["default"],i["default"],c["default"],l["default"],u["default"],d["default"],s["default"],p["default"],m["default"]];t.defaultModifiers=g;var b=(0,r.popperGenerator)({defaultModifiers:g});t.createPopperLite=t.createPopper=b},97396:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e,t){void 0===t&&(t={});var n=t,c=n.placement,l=n.boundary,u=n.rootBoundary,d=n.padding,s=n.flipVariations,p=n.allowedAutoPlacements,m=void 0===p?r.placements:p,f=(0,o["default"])(c),h=f?s?r.variationPlacements:r.variationPlacements.filter((function(e){return(0,o["default"])(e)===f})):r.basePlacements,C=h.filter((function(e){return m.indexOf(e)>=0}));0===C.length&&(C=h);var g=C.reduce((function(t,n){return t[n]=(0,a["default"])(e,{placement:n,boundary:l,rootBoundary:u,padding:d})[(0,i["default"])(n)],t}),{});return Object.keys(g).sort((function(e,t){return g[e]-g[t]}))};var o=c(n(26992)),r=n(61797),a=c(n(63308)),i=c(n(91561));function c(e){return e&&e.__esModule?e:{"default":e}}},38138:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t,n=e.reference,c=e.element,l=e.placement,u=l?(0,o["default"])(l):null,d=l?(0,r["default"])(l):null,s=n.x+n.width/2-c.width/2,p=n.y+n.height/2-c.height/2;switch(u){case i.top:t={x:s,y:n.y-c.height};break;case i.bottom:t={x:s,y:n.y+n.height};break;case i.right:t={x:n.x+n.width,y:p};break;case i.left:t={x:n.x-c.width,y:p};break;default:t={x:n.x,y:n.y}}var m=u?(0,a["default"])(u):null;if(null!=m){var f="y"===m?"height":"width";switch(d){case i.start:t[m]=t[m]-(n[f]/2-c[f]/2);break;case i.end:t[m]=t[m]+(n[f]/2-c[f]/2)}}return t};var o=c(n(91561)),r=c(n(26992)),a=c(n(19398)),i=n(61797);function c(e){return e&&e.__esModule?e:{"default":e}}},17850:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){var t;return function(){return t||(t=new Promise((function(n){Promise.resolve().then((function(){t=undefined,n(e())}))}))),t}}},63308:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e,t){void 0===t&&(t={});var n=t,p=n.placement,m=void 0===p?e.placement:p,f=n.boundary,h=void 0===f?l.clippingParents:f,C=n.rootBoundary,g=void 0===C?l.viewport:C,b=n.elementContext,v=void 0===b?l.popper:b,N=n.altBoundary,V=void 0!==N&&N,y=n.padding,_=void 0===y?0:y,w=(0,d["default"])("number"!=typeof _?_:(0,s["default"])(_,l.basePlacements)),k=v===l.popper?l.reference:l.popper,S=e.elements.reference,B=e.rects.popper,x=e.elements[V?k:v],A=(0,r["default"])((0,u.isElement)(x)?x:x.contextElement||(0,a["default"])(e.elements.popper),h,g),D=(0,o["default"])(S),L=(0,i["default"])({reference:D,element:B,strategy:"absolute",placement:m}),E=(0,c["default"])(Object.assign({},B,L)),T=v===l.popper?E:D,I={top:A.top-T.top+w.top,bottom:T.bottom-A.bottom+w.bottom,left:A.left-T.left+w.left,right:T.right-A.right+w.right},F=e.modifiersData.offset;if(v===l.popper&&F){var O=F[m];Object.keys(I).forEach((function(e){var t=[l.right,l.bottom].indexOf(e)>=0?1:-1,n=[l.top,l.bottom].indexOf(e)>=0?"y":"x";I[e]+=O[n]*t}))}return I};var o=p(n(93529)),r=p(n(76416)),a=p(n(67977)),i=p(n(38138)),c=p(n(24955)),l=n(61797),u=n(1316),d=p(n(2595)),s=p(n(1724));function p(e){return e&&e.__esModule?e:{"default":e}}},1724:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}},62630:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),o=1;o=0?"x":"y"}},86141:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return e.replace(/left|right|bottom|top/g,(function(e){return n[e]}))};var n={left:"right",right:"left",bottom:"top",top:"bottom"}},10404:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return e.replace(/start|end/g,(function(e){return n[e]}))};var n={start:"end",end:"start"}},26992:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return e.split("-")[1]}},36083:function(e,t){"use strict";t.__esModule=!0,t.round=t.min=t.max=void 0;var n=Math.max;t.max=n;var o=Math.min;t.min=o;var r=Math.round;t.round=r},13043:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){var t=e.reduce((function(e,t){var n=e[t.name];return e[t.name]=n?Object.assign({},n,t,{options:Object.assign({},n.options,t.options),data:Object.assign({},n.data,t.data)}):t,e}),{});return Object.keys(t).map((function(e){return t[e]}))}},2595:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return Object.assign({},(0,r["default"])(),e)};var o,r=(o=n(15565))&&o.__esModule?o:{"default":o}},23967:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=function(e){var t=new Map,n=new Set,o=[];function r(e){n.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach((function(e){if(!n.has(e)){var o=t.get(e);o&&r(o)}})),o.push(e)}return e.forEach((function(e){t.set(e.name,e)})),e.forEach((function(e){n.has(e.name)||r(e)})),o}(e);return o.modifierPhases.reduce((function(e,n){return e.concat(t.filter((function(e){return e.phase===n})))}),[])};var o=n(61797)},24955:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}},6559:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e,t){var n=new Set;return e.filter((function(e){var o=t(e);if(!n.has(o))return n.add(o),!0}))}},23849:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){e.forEach((function(t){Object.keys(t).forEach((function(n){switch(n){case"name":t.name;break;case"enabled":t.enabled;case"phase":r.modifierPhases.indexOf(t.phase);break;case"fn":t.fn;break;case"effect":t.effect;break;case"requires":Array.isArray(t.requires);break;case"requiresIfExists":Array.isArray(t.requiresIfExists)}t.requires&&t.requires.forEach((function(t){e.find((function(e){return e.name===t}))}))}))}))};(o=n(62630))&&o.__esModule;var o,r=n(61797)},83158:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e,t,n){return(0,o.max)(e,(0,o.min)(t,n))};var o=n(36083)},52726:function(e){"use strict";e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},91254:function(e,t,n){"use strict";var o=n(81662);e.exports=function(e){if(!o(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e}},26817:function(e,t,n){"use strict";var o=n(20839),r=n(49500),a=n(81965),i=o("unscopables"),c=Array.prototype;c[i]==undefined&&a.f(c,i,{configurable:!0,value:r(null)}),e.exports=function(e){c[i][e]=!0}},84249:function(e,t,n){"use strict";var o=n(70219).charAt;e.exports=function(e,t,n){return t+(n?o(e,t).length:1)}},62147:function(e){"use strict";e.exports=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e}},90155:function(e,t,n){"use strict";var o=n(81662);e.exports=function(e){if(!o(e))throw TypeError(String(e)+" is not an object");return e}},38536:function(e){"use strict";e.exports="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof DataView},46024:function(e,t,n){"use strict";var o,r,a,i=n(38536),c=n(54408),l=n(29071),u=n(81662),d=n(83122),s=n(42287),p=n(95479),m=n(51414),f=n(81965).f,h=n(87263),C=n(99099),g=n(20839),b=n(58060),v=l.Int8Array,N=v&&v.prototype,V=l.Uint8ClampedArray,y=V&&V.prototype,_=v&&h(v),w=N&&h(N),k=Object.prototype,S=k.isPrototypeOf,B=g("toStringTag"),x=b("TYPED_ARRAY_TAG"),A=b("TYPED_ARRAY_CONSTRUCTOR"),D=i&&!!C&&"Opera"!==s(l.opera),L=!1,E={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},T={BigInt64Array:8,BigUint64Array:8},I=function(e){if(!u(e))return!1;var t=s(e);return"DataView"===t||d(E,t)||d(T,t)},F=function(e){if(!u(e))return!1;var t=s(e);return d(E,t)||d(T,t)};for(o in E)(a=(r=l[o])&&r.prototype)?p(a,A,r):D=!1;for(o in T)(a=(r=l[o])&&r.prototype)&&p(a,A,r);if((!D||"function"!=typeof _||_===Function.prototype)&&(_=function(){throw TypeError("Incorrect invocation")},D))for(o in E)l[o]&&C(l[o],_);if((!D||!w||w===k)&&(w=_.prototype,D))for(o in E)l[o]&&C(l[o].prototype,w);if(D&&h(y)!==w&&C(y,w),c&&!d(w,B))for(o in L=!0,f(w,B,{get:function(){return u(this)?this[x]:undefined}}),E)l[o]&&p(l[o],x,o);e.exports={NATIVE_ARRAY_BUFFER_VIEWS:D,TYPED_ARRAY_CONSTRUCTOR:A,TYPED_ARRAY_TAG:L&&x,aTypedArray:function(e){if(F(e))return e;throw TypeError("Target is not a typed array")},aTypedArrayConstructor:function(e){if(C&&!S.call(_,e))throw TypeError("Target is not a typed array constructor");return e},exportTypedArrayMethod:function(e,t,n){if(c){if(n)for(var o in E){var r=l[o];if(r&&d(r.prototype,e))try{delete r.prototype[e]}catch(a){}}w[e]&&!n||m(w,e,n?t:D&&N[e]||t)}},exportTypedArrayStaticMethod:function(e,t,n){var o,r;if(c){if(C){if(n)for(o in E)if((r=l[o])&&d(r,e))try{delete r[e]}catch(a){}if(_[e]&&!n)return;try{return m(_,e,n?t:D&&_[e]||t)}catch(a){}}for(o in E)!(r=l[o])||r[e]&&!n||m(r,e,t)}},isView:I,isTypedArray:F,TypedArray:_,TypedArrayPrototype:w}},14374:function(e,t,n){"use strict";var o=n(29071),r=n(54408),a=n(38536),i=n(95479),c=n(46360),l=n(46203),u=n(62147),d=n(54026),s=n(46330),p=n(21332),m=n(33830),f=n(87263),h=n(99099),C=n(6628).f,g=n(81965).f,b=n(21657),v=n(72843),N=n(48441),V=N.get,y=N.set,_="ArrayBuffer",w="DataView",k="Wrong index",S=o.ArrayBuffer,B=S,x=o.DataView,A=x&&x.prototype,D=Object.prototype,L=o.RangeError,E=m.pack,T=m.unpack,I=function(e){return[255&e]},F=function(e){return[255&e,e>>8&255]},O=function(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]},M=function(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]},P=function(e){return E(e,23,4)},R=function(e){return E(e,52,8)},j=function(e,t){g(e.prototype,t,{get:function(){return V(this)[t]}})},W=function(e,t,n,o){var r=p(n),a=V(e);if(r+t>a.byteLength)throw L(k);var i=V(a.buffer).bytes,c=r+a.byteOffset,l=i.slice(c,c+t);return o?l:l.reverse()},z=function(e,t,n,o,r,a){var i=p(n),c=V(e);if(i+t>c.byteLength)throw L(k);for(var l=V(c.buffer).bytes,u=i+c.byteOffset,d=o(+r),s=0;sG;)(U=H[G++])in B||i(B,U,S[U]);K.constructor=B}h&&f(A)!==D&&h(A,D);var Y=new x(new B(2)),q=A.setInt8;Y.setInt8(0,2147483648),Y.setInt8(1,2147483649),!Y.getInt8(0)&&Y.getInt8(1)||c(A,{setInt8:function(e,t){q.call(this,e,t<<24>>24)},setUint8:function(e,t){q.call(this,e,t<<24>>24)}},{unsafe:!0})}else B=function(e){u(this,B,_);var t=p(e);y(this,{bytes:b.call(new Array(t),0),byteLength:t}),r||(this.byteLength=t)},x=function(e,t,n){u(this,x,w),u(e,B,w);var o=V(e).byteLength,a=d(t);if(a<0||a>o)throw L("Wrong offset");if(a+(n=n===undefined?o-a:s(n))>o)throw L("Wrong length");y(this,{buffer:e,byteLength:n,byteOffset:a}),r||(this.buffer=e,this.byteLength=n,this.byteOffset=a)},r&&(j(B,"byteLength"),j(x,"buffer"),j(x,"byteLength"),j(x,"byteOffset")),c(x.prototype,{getInt8:function(e){return W(this,1,e)[0]<<24>>24},getUint8:function(e){return W(this,1,e)[0]},getInt16:function(e){var t=W(this,2,e,arguments.length>1?arguments[1]:undefined);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=W(this,2,e,arguments.length>1?arguments[1]:undefined);return t[1]<<8|t[0]},getInt32:function(e){return M(W(this,4,e,arguments.length>1?arguments[1]:undefined))},getUint32:function(e){return M(W(this,4,e,arguments.length>1?arguments[1]:undefined))>>>0},getFloat32:function(e){return T(W(this,4,e,arguments.length>1?arguments[1]:undefined),23)},getFloat64:function(e){return T(W(this,8,e,arguments.length>1?arguments[1]:undefined),52)},setInt8:function(e,t){z(this,1,e,I,t)},setUint8:function(e,t){z(this,1,e,I,t)},setInt16:function(e,t){z(this,2,e,F,t,arguments.length>2?arguments[2]:undefined)},setUint16:function(e,t){z(this,2,e,F,t,arguments.length>2?arguments[2]:undefined)},setInt32:function(e,t){z(this,4,e,O,t,arguments.length>2?arguments[2]:undefined)},setUint32:function(e,t){z(this,4,e,O,t,arguments.length>2?arguments[2]:undefined)},setFloat32:function(e,t){z(this,4,e,P,t,arguments.length>2?arguments[2]:undefined)},setFloat64:function(e,t){z(this,8,e,R,t,arguments.length>2?arguments[2]:undefined)}});v(B,_),v(x,w),e.exports={ArrayBuffer:B,DataView:x}},84705:function(e,t,n){"use strict";var o=n(45009),r=n(97094),a=n(46330),i=Math.min;e.exports=[].copyWithin||function(e,t){var n=o(this),c=a(n.length),l=r(e,c),u=r(t,c),d=arguments.length>2?arguments[2]:undefined,s=i((d===undefined?c:r(d,c))-u,c-l),p=1;for(u0;)u in n?n[l]=n[u]:delete n[l],l+=p,u+=p;return n}},21657:function(e,t,n){"use strict";var o=n(45009),r=n(97094),a=n(46330);e.exports=function(e){for(var t=o(this),n=a(t.length),i=arguments.length,c=r(i>1?arguments[1]:undefined,n),l=i>2?arguments[2]:undefined,u=l===undefined?n:r(l,n);u>c;)t[c++]=e;return t}},49751:function(e,t,n){"use strict";var o=n(78969).forEach,r=n(57978)("forEach");e.exports=r?[].forEach:function(e){return o(this,e,arguments.length>1?arguments[1]:undefined)}},15886:function(e){"use strict";e.exports=function(e,t){for(var n=0,o=t.length,r=new e(o);o>n;)r[n]=t[n++];return r}},34192:function(e,t,n){"use strict";var o=n(77348),r=n(45009),a=n(32603),i=n(64453),c=n(46330),l=n(18996),u=n(39423);e.exports=function(e){var t,n,d,s,p,m,f=r(e),h="function"==typeof this?this:Array,C=arguments.length,g=C>1?arguments[1]:undefined,b=g!==undefined,v=u(f),N=0;if(b&&(g=o(g,C>2?arguments[2]:undefined,2)),v==undefined||h==Array&&i(v))for(n=new h(t=c(f.length));t>N;N++)m=b?g(f[N],N):f[N],l(n,N,m);else for(p=(s=v.call(f)).next,n=new h;!(d=p.call(s)).done;N++)m=b?a(s,g,[d.value,N],!0):d.value,l(n,N,m);return n.length=N,n}},35957:function(e,t,n){"use strict";var o=n(10961),r=n(46330),a=n(97094),i=function(e){return function(t,n,i){var c,l=o(t),u=r(l.length),d=a(i,u);if(e&&n!=n){for(;u>d;)if((c=l[d++])!=c)return!0}else for(;u>d;d++)if((e||d in l)&&l[d]===n)return e||d||0;return!e&&-1}};e.exports={includes:i(!0),indexOf:i(!1)}},78969:function(e,t,n){"use strict";var o=n(77348),r=n(27371),a=n(45009),i=n(46330),c=n(87257),l=[].push,u=function(e){var t=1==e,n=2==e,u=3==e,d=4==e,s=6==e,p=7==e,m=5==e||s;return function(f,h,C,g){for(var b,v,N=a(f),V=r(N),y=o(h,C,3),_=i(V.length),w=0,k=g||c,S=t?k(f,_):n||p?k(f,0):undefined;_>w;w++)if((m||w in V)&&(v=y(b=V[w],w,N),e))if(t)S[w]=v;else if(v)switch(e){case 3:return!0;case 5:return b;case 6:return w;case 2:l.call(S,b)}else switch(e){case 4:return!1;case 7:l.call(S,b)}return s?-1:u||d?d:S}};e.exports={forEach:u(0),map:u(1),filter:u(2),some:u(3),every:u(4),find:u(5),findIndex:u(6),filterReject:u(7)}},65975:function(e,t,n){"use strict";var o=n(10961),r=n(54026),a=n(46330),i=n(57978),c=Math.min,l=[].lastIndexOf,u=!!l&&1/[1].lastIndexOf(1,-0)<0,d=i("lastIndexOf"),s=u||!d;e.exports=s?function(e){if(u)return l.apply(this,arguments)||0;var t=o(this),n=a(t.length),i=n-1;for(arguments.length>1&&(i=c(i,r(arguments[1]))),i<0&&(i=n+i);i>=0;i--)if(i in t&&t[i]===e)return i||0;return-1}:l},71721:function(e,t,n){"use strict";var o=n(46203),r=n(20839),a=n(95336),i=r("species");e.exports=function(e){return a>=51||!o((function(){var t=[];return(t.constructor={})[i]=function(){return{foo:1}},1!==t[e](Boolean).foo}))}},57978:function(e,t,n){"use strict";var o=n(46203);e.exports=function(e,t){var n=[][e];return!!n&&o((function(){n.call(null,t||function(){throw 1},1)}))}},97402:function(e,t,n){"use strict";var o=n(52726),r=n(45009),a=n(27371),i=n(46330),c=function(e){return function(t,n,c,l){o(n);var u=r(t),d=a(u),s=i(u.length),p=e?s-1:0,m=e?-1:1;if(c<2)for(;;){if(p in d){l=d[p],p+=m;break}if(p+=m,e?p<0:s<=p)throw TypeError("Reduce of empty array with no initial value")}for(;e?p>=0:s>p;p+=m)p in d&&(l=n(l,d[p],p,u));return l}};e.exports={left:c(!1),right:c(!0)}},85492:function(e){"use strict";var t=Math.floor,n=function(e,t){for(var n,o,r=e.length,a=1;a0;)e[o]=e[--o];o!==a++&&(e[o]=n)}return e},o=function(e,t,n){for(var o=e.length,r=t.length,a=0,i=0,c=[];a1?arguments[1]:undefined,3);t=t?t.next:n.first;)for(o(t.value,t.key,this);t&&t.removed;)t=t.previous},has:function(e){return!!g(this,e)}}),a(d.prototype,n?{get:function(e){var t=g(this,e);return t&&t.value},set:function(e,t){return C(this,0===e?0:e,t)}}:{add:function(e){return C(this,e=0===e?0:e,e)}}),s&&o(d.prototype,"size",{get:function(){return m(this).size}}),d},setStrong:function(e,t,n){var o=t+" Iterator",r=h(t),a=h(o);u(e,t,(function(e,t){f(this,{type:o,target:e,state:r(e),kind:t,last:undefined})}),(function(){for(var e=a(this),t=e.kind,n=e.last;n&&n.removed;)n=n.previous;return e.target&&(e.last=n=n?n.next:e.state.first)?"keys"==t?{value:n.key,done:!1}:"values"==t?{value:n.value,done:!1}:{value:[n.key,n.value],done:!1}:(e.target=undefined,{value:undefined,done:!0})}),n?"entries":"values",!n,!0),d(t)}}},6789:function(e,t,n){"use strict";var o=n(46360),r=n(88511).getWeakData,a=n(90155),i=n(81662),c=n(62147),l=n(1464),u=n(78969),d=n(83122),s=n(48441),p=s.set,m=s.getterFor,f=u.find,h=u.findIndex,C=0,g=function(e){return e.frozen||(e.frozen=new b)},b=function(){this.entries=[]},v=function(e,t){return f(e.entries,(function(e){return e[0]===t}))};b.prototype={get:function(e){var t=v(this,e);if(t)return t[1]},has:function(e){return!!v(this,e)},set:function(e,t){var n=v(this,e);n?n[1]=t:this.entries.push([e,t])},"delete":function(e){var t=h(this.entries,(function(t){return t[0]===e}));return~t&&this.entries.splice(t,1),!!~t}},e.exports={getConstructor:function(e,t,n,u){var s=e((function(e,o){c(e,s,t),p(e,{type:t,id:C++,frozen:undefined}),o!=undefined&&l(o,e[u],{that:e,AS_ENTRIES:n})})),f=m(t),h=function(e,t,n){var o=f(e),i=r(a(t),!0);return!0===i?g(o).set(t,n):i[o.id]=n,e};return o(s.prototype,{"delete":function(e){var t=f(this);if(!i(e))return!1;var n=r(e);return!0===n?g(t)["delete"](e):n&&d(n,t.id)&&delete n[t.id]},has:function(e){var t=f(this);if(!i(e))return!1;var n=r(e);return!0===n?g(t).has(e):n&&d(n,t.id)}}),o(s.prototype,n?{get:function(e){var t=f(this);if(i(e)){var n=r(e);return!0===n?g(t).get(e):n?n[t.id]:undefined}},set:function(e,t){return h(this,e,t)}}:{add:function(e){return h(this,e,!0)}}),s}}},37488:function(e,t,n){"use strict";var o=n(70850),r=n(29071),a=n(17600),i=n(51414),c=n(88511),l=n(1464),u=n(62147),d=n(81662),s=n(46203),p=n(61504),m=n(72843),f=n(50843);e.exports=function(e,t,n){var h=-1!==e.indexOf("Map"),C=-1!==e.indexOf("Weak"),g=h?"set":"add",b=r[e],v=b&&b.prototype,N=b,V={},y=function(e){var t=v[e];i(v,e,"add"==e?function(e){return t.call(this,0===e?0:e),this}:"delete"==e?function(e){return!(C&&!d(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return C&&!d(e)?undefined:t.call(this,0===e?0:e)}:"has"==e?function(e){return!(C&&!d(e))&&t.call(this,0===e?0:e)}:function(e,n){return t.call(this,0===e?0:e,n),this})};if(a(e,"function"!=typeof b||!(C||v.forEach&&!s((function(){(new b).entries().next()})))))N=n.getConstructor(t,e,h,g),c.enable();else if(a(e,!0)){var _=new N,w=_[g](C?{}:-0,1)!=_,k=s((function(){_.has(1)})),S=p((function(e){new b(e)})),B=!C&&s((function(){for(var e=new b,t=5;t--;)e[g](t,t);return!e.has(-0)}));S||((N=t((function(t,n){u(t,N,e);var o=f(new b,t,N);return n!=undefined&&l(n,o[g],{that:o,AS_ENTRIES:h}),o}))).prototype=v,v.constructor=N),(k||B)&&(y("delete"),y("has"),h&&y("get")),(B||w)&&y(g),C&&v.clear&&delete v.clear}return V[e]=N,o({global:!0,forced:N!=b},V),m(N,e),C||n.setStrong(N,e,h),N}},9088:function(e,t,n){"use strict";var o=n(83122),r=n(11475),a=n(77415),i=n(81965);e.exports=function(e,t){for(var n=r(t),c=i.f,l=a.f,u=0;u"+c+""}},89750:function(e,t,n){"use strict";var o=n(53637).IteratorPrototype,r=n(49500),a=n(66856),i=n(72843),c=n(63913),l=function(){return this};e.exports=function(e,t,n){var u=t+" Iterator";return e.prototype=r(o,{next:a(1,n)}),i(e,u,!1,!0),c[u]=l,e}},95479:function(e,t,n){"use strict";var o=n(54408),r=n(81965),a=n(66856);e.exports=o?function(e,t,n){return r.f(e,t,a(1,n))}:function(e,t,n){return e[t]=n,e}},66856:function(e){"use strict";e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},18996:function(e,t,n){"use strict";var o=n(86997),r=n(81965),a=n(66856);e.exports=function(e,t,n){var i=o(t);i in e?r.f(e,i,a(0,n)):e[i]=n}},11216:function(e,t,n){"use strict";var o=n(46203),r=n(77169).start,a=Math.abs,i=Date.prototype,c=i.getTime,l=i.toISOString;e.exports=o((function(){return"0385-07-25T07:06:39.999Z"!=l.call(new Date(-50000000000001))}))||!o((function(){l.call(new Date(NaN))}))?function(){if(!isFinite(c.call(this)))throw RangeError("Invalid time value");var e=this,t=e.getUTCFullYear(),n=e.getUTCMilliseconds(),o=t<0?"-":t>9999?"+":"";return o+r(a(t),o?6:4,0)+"-"+r(e.getUTCMonth()+1,2,0)+"-"+r(e.getUTCDate(),2,0)+"T"+r(e.getUTCHours(),2,0)+":"+r(e.getUTCMinutes(),2,0)+":"+r(e.getUTCSeconds(),2,0)+"."+r(n,3,0)+"Z"}:l},62812:function(e,t,n){"use strict";var o=n(90155),r=n(17762);e.exports=function(e){if(o(this),"string"===e||"default"===e)e="string";else if("number"!==e)throw TypeError("Incorrect hint");return r(this,e)}},54934:function(e,t,n){"use strict";var o=n(70850),r=n(89750),a=n(87263),i=n(99099),c=n(72843),l=n(95479),u=n(51414),d=n(20839),s=n(80591),p=n(63913),m=n(53637),f=m.IteratorPrototype,h=m.BUGGY_SAFARI_ITERATORS,C=d("iterator"),g="keys",b="values",v="entries",N=function(){return this};e.exports=function(e,t,n,d,m,V,y){r(n,t,d);var _,w,k,S=function(e){if(e===m&&L)return L;if(!h&&e in A)return A[e];switch(e){case g:case b:case v:return function(){return new n(this,e)}}return function(){return new n(this)}},B=t+" Iterator",x=!1,A=e.prototype,D=A[C]||A["@@iterator"]||m&&A[m],L=!h&&D||S(m),E="Array"==t&&A.entries||D;if(E&&(_=a(E.call(new e)),f!==Object.prototype&&_.next&&(s||a(_)===f||(i?i(_,f):"function"!=typeof _[C]&&l(_,C,N)),c(_,B,!0,!0),s&&(p[B]=N))),m==b&&D&&D.name!==b&&(x=!0,L=function(){return D.call(this)}),s&&!y||A[C]===L||l(A,C,L),p[t]=L,m)if(w={values:S(b),keys:V?L:S(g),entries:S(v)},y)for(k in w)(h||x||!(k in A))&&u(A,k,w[k]);else o({target:t,proto:!0,forced:h||x},w);return w}},34899:function(e,t,n){"use strict";var o=n(82155),r=n(83122),a=n(78131),i=n(81965).f;e.exports=function(e){var t=o.Symbol||(o.Symbol={});r(t,e)||i(t,e,{value:a.f(e)})}},54408:function(e,t,n){"use strict";var o=n(46203);e.exports=!o((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},939:function(e,t,n){"use strict";var o=n(29071),r=n(81662),a=o.document,i=r(a)&&r(a.createElement);e.exports=function(e){return i?a.createElement(e):{}}},69238:function(e,t,n){"use strict";var o=n(68548).match(/firefox\/(\d+)/i);e.exports=!!o&&+o[1]},45158:function(e){"use strict";e.exports="object"==typeof window},85342:function(e,t,n){"use strict";var o=n(68548);e.exports=/MSIE|Trident/.test(o)},10064:function(e,t,n){"use strict";var o=n(68548),r=n(29071);e.exports=/iphone|ipod|ipad/i.test(o)&&r.Pebble!==undefined},33459:function(e,t,n){"use strict";var o=n(68548);e.exports=/(?:iphone|ipod|ipad).*applewebkit/i.test(o)},12396:function(e,t,n){"use strict";var o=n(87684),r=n(29071);e.exports="process"==o(r.process)},45521:function(e,t,n){"use strict";var o=n(68548);e.exports=/web0s(?!.*chrome)/i.test(o)},68548:function(e,t,n){"use strict";var o=n(54883);e.exports=o("navigator","userAgent")||""},95336:function(e,t,n){"use strict";var o,r,a=n(29071),i=n(68548),c=a.process,l=a.Deno,u=c&&c.versions||l&&l.version,d=u&&u.v8;d?r=(o=d.split("."))[0]<4?1:o[0]+o[1]:i&&(!(o=i.match(/Edge\/(\d+)/))||o[1]>=74)&&(o=i.match(/Chrome\/(\d+)/))&&(r=o[1]),e.exports=r&&+r},5556:function(e,t,n){"use strict";var o=n(68548).match(/AppleWebKit\/(\d+)\./);e.exports=!!o&&+o[1]},17195:function(e){"use strict";e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},70850:function(e,t,n){"use strict";var o=n(29071),r=n(77415).f,a=n(95479),i=n(51414),c=n(97952),l=n(9088),u=n(17600);e.exports=function(e,t){var n,d,s,p,m,f=e.target,h=e.global,C=e.stat;if(n=h?o:C?o[f]||c(f,{}):(o[f]||{}).prototype)for(d in t){if(p=t[d],s=e.noTargetGet?(m=r(n,d))&&m.value:n[d],!u(h?d:f+(C?".":"#")+d,e.forced)&&s!==undefined){if(typeof p==typeof s)continue;l(p,s)}(e.sham||s&&s.sham)&&a(p,"sham",!0),i(n,d,p,e)}}},46203:function(e){"use strict";e.exports=function(e){try{return!!e()}catch(t){return!0}}},96504:function(e,t,n){"use strict";n(69811);var o=n(51414),r=n(10199),a=n(46203),i=n(20839),c=n(95479),l=i("species"),u=RegExp.prototype;e.exports=function(e,t,n,d){var s=i(e),p=!a((function(){var t={};return t[s]=function(){return 7},7!=""[e](t)})),m=p&&!a((function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[l]=function(){return n},n.flags="",n[s]=/./[s]),n.exec=function(){return t=!0,null},n[s](""),!t}));if(!p||!m||n){var f=/./[s],h=t(s,""[e],(function(e,t,n,o,a){var i=t.exec;return i===r||i===u.exec?p&&!a?{done:!0,value:f.call(t,n,o)}:{done:!0,value:e.call(n,t,o)}:{done:!1}}));o(String.prototype,e,h[0]),o(u,s,h[1])}d&&c(u[s],"sham",!0)}},46927:function(e,t,n){"use strict";var o=n(32420),r=n(46330),a=n(77348);e.exports=function i(e,t,n,c,l,u,d,s){for(var p,m=l,f=0,h=!!d&&a(d,s,3);f0&&o(p))m=i(e,t,p,r(p.length),m,u-1)-1;else{if(m>=9007199254740991)throw TypeError("Exceed the acceptable array length");e[m]=p}m++}f++}return m}},90452:function(e,t,n){"use strict";var o=n(46203);e.exports=!o((function(){return Object.isExtensible(Object.preventExtensions({}))}))},77348:function(e,t,n){"use strict";var o=n(52726);e.exports=function(e,t,n){if(o(e),t===undefined)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,o){return e.call(t,n,o)};case 3:return function(n,o,r){return e.call(t,n,o,r)}}return function(){return e.apply(t,arguments)}}},18602:function(e,t,n){"use strict";var o=n(52726),r=n(81662),a=[].slice,i={},c=function(e,t,n){if(!(t in i)){for(var o=[],r=0;r]*>)/g,c=/\$([$&'`]|\d{1,2})/g;e.exports=function(e,t,n,l,u,d){var s=n+e.length,p=l.length,m=c;return u!==undefined&&(u=o(u),m=i),a.call(d,m,(function(o,a){var i;switch(a.charAt(0)){case"$":return"$";case"&":return e;case"`":return t.slice(0,n);case"'":return t.slice(s);case"<":i=u[a.slice(1,-1)];break;default:var c=+a;if(0===c)return o;if(c>p){var d=r(c/10);return 0===d?o:d<=p?l[d-1]===undefined?a.charAt(1):l[d-1]+a.charAt(1):o}i=l[c-1]}return i===undefined?"":i}))}},29071:function(e,t,n){"use strict";var o=function(e){return e&&e.Math==Math&&e};e.exports=o("object"==typeof globalThis&&globalThis)||o("object"==typeof window&&window)||o("object"==typeof self&&self)||o("object"==typeof n.g&&n.g)||function(){return this}()||Function("return this")()},83122:function(e,t,n){"use strict";var o=n(45009),r={}.hasOwnProperty;e.exports=Object.hasOwn||function(e,t){return r.call(o(e),t)}},18609:function(e){"use strict";e.exports={}},40753:function(e,t,n){"use strict";var o=n(29071);e.exports=function(e,t){var n=o.console;n&&n.error&&(1===arguments.length?n.error(e):n.error(e,t))}},21929:function(e,t,n){"use strict";var o=n(54883);e.exports=o("document","documentElement")},72825:function(e,t,n){"use strict";var o=n(54408),r=n(46203),a=n(939);e.exports=!o&&!r((function(){return 7!=Object.defineProperty(a("div"),"a",{get:function(){return 7}}).a}))},33830:function(e){"use strict";var t=Math.abs,n=Math.pow,o=Math.floor,r=Math.log,a=Math.LN2;e.exports={pack:function(e,i,c){var l,u,d,s=new Array(c),p=8*c-i-1,m=(1<>1,h=23===i?n(2,-24)-n(2,-77):0,C=e<0||0===e&&1/e<0?1:0,g=0;for((e=t(e))!=e||e===Infinity?(u=e!=e?1:0,l=m):(l=o(r(e)/a),e*(d=n(2,-l))<1&&(l--,d*=2),(e+=l+f>=1?h/d:h*n(2,1-f))*d>=2&&(l++,d/=2),l+f>=m?(u=0,l=m):l+f>=1?(u=(e*d-1)*n(2,i),l+=f):(u=e*n(2,f-1)*n(2,i),l=0));i>=8;s[g++]=255&u,u/=256,i-=8);for(l=l<0;s[g++]=255&l,l/=256,p-=8);return s[--g]|=128*C,s},unpack:function(e,t){var o,r=e.length,a=8*r-t-1,i=(1<>1,l=a-7,u=r-1,d=e[u--],s=127&d;for(d>>=7;l>0;s=256*s+e[u],u--,l-=8);for(o=s&(1<<-l)-1,s>>=-l,l+=t;l>0;o=256*o+e[u],u--,l-=8);if(0===s)s=1-c;else{if(s===i)return o?NaN:d?-Infinity:Infinity;o+=n(2,t),s-=c}return(d?-1:1)*o*n(2,s-t)}}},27371:function(e,t,n){"use strict";var o=n(46203),r=n(87684),a="".split;e.exports=o((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==r(e)?a.call(e,""):Object(e)}:Object},50843:function(e,t,n){"use strict";var o=n(81662),r=n(99099);e.exports=function(e,t,n){var a,i;return r&&"function"==typeof(a=t.constructor)&&a!==n&&o(i=a.prototype)&&i!==n.prototype&&r(e,i),e}},69718:function(e,t,n){"use strict";var o=n(41537),r=Function.toString;"function"!=typeof o.inspectSource&&(o.inspectSource=function(e){return r.call(e)}),e.exports=o.inspectSource},88511:function(e,t,n){"use strict";var o=n(70850),r=n(18609),a=n(81662),i=n(83122),c=n(81965).f,l=n(6628),u=n(18118),d=n(58060),s=n(90452),p=!1,m=d("meta"),f=0,h=Object.isExtensible||function(){return!0},C=function(e){c(e,m,{value:{objectID:"O"+f++,weakData:{}}})},g=e.exports={enable:function(){g.enable=function(){},p=!0;var e=l.f,t=[].splice,n={};n[m]=1,e(n).length&&(l.f=function(n){for(var o=e(n),r=0,a=o.length;rp;p++)if((f=_(e[p]))&&f instanceof u)return f;return new u(!1)}d=s.call(e)}for(h=d.next;!(C=h.call(d)).done;){try{f=_(C.value)}catch(w){throw l(d),w}if("object"==typeof f&&f&&f instanceof u)return f}return new u(!1)}},151:function(e,t,n){"use strict";var o=n(90155);e.exports=function(e){var t=e["return"];if(t!==undefined)return o(t.call(e)).value}},53637:function(e,t,n){"use strict";var o,r,a,i=n(46203),c=n(87263),l=n(95479),u=n(83122),d=n(20839),s=n(80591),p=d("iterator"),m=!1;[].keys&&("next"in(a=[].keys())?(r=c(c(a)))!==Object.prototype&&(o=r):m=!0);var f=o==undefined||i((function(){var e={};return o[p].call(e)!==e}));f&&(o={}),s&&!f||u(o,p)||l(o,p,(function(){return this})),e.exports={IteratorPrototype:o,BUGGY_SAFARI_ITERATORS:m}},63913:function(e){"use strict";e.exports={}},49294:function(e){"use strict";var t=Math.expm1,n=Math.exp;e.exports=!t||t(10)>22025.465794806718||t(10)<22025.465794806718||-2e-17!=t(-2e-17)?function(e){return 0==(e=+e)?e:e>-1e-6&&e<1e-6?e+e*e/2:n(e)-1}:t},23965:function(e,t,n){"use strict";var o=n(84250),r=Math.abs,a=Math.pow,i=a(2,-52),c=a(2,-23),l=a(2,127)*(2-c),u=a(2,-126);e.exports=Math.fround||function(e){var t,n,a=r(e),d=o(e);return al||n!=n?d*Infinity:d*n}},82544:function(e){"use strict";var t=Math.log;e.exports=Math.log1p||function(e){return(e=+e)>-1e-8&&e<1e-8?e-e*e/2:t(1+e)}},84250:function(e){"use strict";e.exports=Math.sign||function(e){return 0==(e=+e)||e!=e?e:e<0?-1:1}},83639:function(e,t,n){"use strict";var o,r,a,i,c,l,u,d,s=n(29071),p=n(77415).f,m=n(37189).set,f=n(33459),h=n(10064),C=n(45521),g=n(12396),b=s.MutationObserver||s.WebKitMutationObserver,v=s.document,N=s.process,V=s.Promise,y=p(s,"queueMicrotask"),_=y&&y.value;_||(o=function(){var e,t;for(g&&(e=N.domain)&&e.exit();r;){t=r.fn,r=r.next;try{t()}catch(n){throw r?i():a=undefined,n}}a=undefined,e&&e.enter()},f||g||C||!b||!v?!h&&V&&V.resolve?((u=V.resolve(undefined)).constructor=V,d=u.then,i=function(){d.call(u,o)}):i=g?function(){N.nextTick(o)}:function(){m.call(s,o)}:(c=!0,l=v.createTextNode(""),new b(o).observe(l,{characterData:!0}),i=function(){l.data=c=!c})),e.exports=_||function(e){var t={fn:e,next:undefined};a&&(a.next=t),r||(r=t,i()),a=t}},86514:function(e,t,n){"use strict";var o=n(29071);e.exports=o.Promise},82156:function(e,t,n){"use strict";var o=n(95336),r=n(46203);e.exports=!!Object.getOwnPropertySymbols&&!r((function(){var e=Symbol();return!String(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&o&&o<41}))},63059:function(e,t,n){"use strict";var o=n(29071),r=n(69718),a=o.WeakMap;e.exports="function"==typeof a&&/native code/.test(r(a))},24735:function(e,t,n){"use strict";var o=n(52726),r=function(e){var t,n;this.promise=new e((function(e,o){if(t!==undefined||n!==undefined)throw TypeError("Bad Promise constructor");t=e,n=o})),this.resolve=o(t),this.reject=o(n)};e.exports.f=function(e){return new r(e)}},2019:function(e,t,n){"use strict";var o=n(94384);e.exports=function(e){if(o(e))throw TypeError("The method doesn't accept regular expressions");return e}},19548:function(e,t,n){"use strict";var o=n(29071).isFinite;e.exports=Number.isFinite||function(e){return"number"==typeof e&&o(e)}},14236:function(e,t,n){"use strict";var o=n(29071),r=n(1435),a=n(8182).trim,i=n(89384),c=o.parseFloat,l=1/c(i+"-0")!=-Infinity;e.exports=l?function(e){var t=a(r(e)),n=c(t);return 0===n&&"-"==t.charAt(0)?-0:n}:c},40731:function(e,t,n){"use strict";var o=n(29071),r=n(1435),a=n(8182).trim,i=n(89384),c=o.parseInt,l=/^[+-]?0[Xx]/,u=8!==c(i+"08")||22!==c(i+"0x16");e.exports=u?function(e,t){var n=a(r(e));return c(n,t>>>0||(l.test(n)?16:10))}:c},81217:function(e,t,n){"use strict";var o=n(54408),r=n(46203),a=n(45044),i=n(37881),c=n(96177),l=n(45009),u=n(27371),d=Object.assign,s=Object.defineProperty;e.exports=!d||r((function(){if(o&&1!==d({b:1},d(s({},"a",{enumerable:!0,get:function(){s(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),r="abcdefghijklmnopqrst";return e[n]=7,r.split("").forEach((function(e){t[e]=e})),7!=d({},e)[n]||a(d({},t)).join("")!=r}))?function(e,t){for(var n=l(e),r=arguments.length,d=1,s=i.f,p=c.f;r>d;)for(var m,f=u(arguments[d++]),h=s?a(f).concat(s(f)):a(f),C=h.length,g=0;C>g;)m=h[g++],o&&!p.call(f,m)||(n[m]=f[m]);return n}:d},49500:function(e,t,n){"use strict";var o,r=n(90155),a=n(61685),i=n(17195),c=n(18609),l=n(21929),u=n(939),d=n(15595),s=d("IE_PROTO"),p=function(){},m=function(e){return"