From 8b77ee159fcf7b32cf0a9a4bd2e0b6b265ac56af Mon Sep 17 00:00:00 2001 From: Solaris-Shade <73904284+Solaris-Shade@users.noreply.github.com> Date: Tue, 22 Feb 2022 14:57:08 -0500 Subject: [PATCH 01/53] Update projectile.dm Delete redundant list --- code/modules/projectiles/projectile.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 8d467c9901..ca07bde239 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -31,7 +31,6 @@ var/xo = null var/atom/original = null // the original target clicked var/turf/starting = null // the projectile's starting turf - var/list/permutated = list() // we've passed through these atoms, don't try to hit them again var/p_x = 16 var/p_y = 16 // the pixel location of the tile that the player clicked. Default is the center From 2fdb70b2b9f955ee8d5181b2d698fe5a8cabaf87 Mon Sep 17 00:00:00 2001 From: Solaris-Shade <73904284+Solaris-Shade@users.noreply.github.com> Date: Sun, 6 Mar 2022 15:20:23 -0500 Subject: [PATCH 02/53] [DNM][DNM][WIP] Projectile backend code port and update Ports#54924, #65061, #59804 from /tg. adds auxiliary code from /tg to make code work. --- code/__DEFINES/_flags/_flags.dm | 5 +- code/__DEFINES/projectiles.dm | 11 + code/_globalvars/bitfields.dm | 2 +- code/_onclick/adjacent.dm | 2 +- code/controllers/subsystem/throwing.dm | 2 +- code/datums/components/mirv.dm | 2 +- code/datums/components/pellet_cloud.dm | 2 +- code/game/atoms.dm | 34 +- code/game/atoms_movable.dm | 14 +- code/game/machinery/_machinery.dm | 1 + code/game/machinery/deployable.dm | 25 +- code/game/machinery/doors/door.dm | 6 +- code/game/machinery/doors/firedoor.dm | 14 +- code/game/machinery/doors/windowdoor.dm | 21 +- code/game/machinery/recycler.dm | 2 +- code/game/machinery/shieldgen.dm | 5 +- code/game/machinery/transformer.dm | 10 +- .../effects/effect_system/effects_foam.dm | 12 +- .../effects/effect_system/effects_smoke.dm | 10 +- code/game/objects/effects/spiders.dm | 4 +- code/game/objects/items/cardboard_cutouts.dm | 4 +- .../items/devices/forcefieldprojector.dm | 6 +- code/game/objects/objs.dm | 6 +- code/game/objects/structures.dm | 4 +- code/game/objects/structures/aliens.dm | 5 - .../structures/crates_lockers/closets.dm | 4 +- .../structures/crates_lockers/crates.dm | 8 +- code/game/objects/structures/girders.dm | 10 +- code/game/objects/structures/grille.dm | 13 +- code/game/objects/structures/holosign.dm | 44 +- code/game/objects/structures/mineral_doors.dm | 4 +- code/game/objects/structures/morgue.dm | 20 +- code/game/objects/structures/plasticflaps.dm | 5 +- code/game/objects/structures/railings.dm | 2 +- code/game/objects/structures/tables_racks.dm | 23 +- .../structures/transit_tubes/transit_tube.dm | 6 +- .../objects/structures/windoor_assembly.dm | 16 +- code/game/objects/structures/window.dm | 20 +- code/game/turfs/closed.dm | 6 +- code/game/turfs/simulated/chasm.dm | 3 - code/game/turfs/turf.dm | 23 +- .../antagonists/blob/blob/blobs/blob_mobs.dm | 6 +- code/modules/antagonists/blob/blob/theblob.dm | 12 +- code/modules/antagonists/swarmer/swarmer.dm | 11 +- code/modules/assembly/infrared.dm | 3 +- code/modules/awaymissions/away_props.dm | 5 +- code/modules/awaymissions/capture_the_flag.dm | 8 +- code/modules/events/spacevine.dm | 2 +- code/modules/fields/turf_objects.dm | 4 +- code/modules/flufftext/Hallucination.dm | 4 +- code/modules/holiday/halloween/halloween.dm | 5 +- code/modules/hydroponics/grown/towercap.dm | 8 +- code/modules/mining/minebot.dm | 4 +- code/modules/mob/dead/observer/observer.dm | 3 - .../mob/living/carbon/human/human_defense.dm | 4 +- code/modules/mob/living/living_defense.dm | 4 +- code/modules/mob/living/living_movement.dm | 12 +- .../mob/living/silicon/silicon_defense.dm | 4 +- .../living/simple_animal/animal_defense.dm | 4 +- .../simple_animal/hostile/jungle/mook.dm | 4 +- .../hostile/megafauna/bubblegum.dm | 12 +- .../hostile/megafauna/hierophant.dm | 4 +- .../simple_animal/hostile/megafauna/legion.dm | 2 +- .../hostile/mining_mobs/curse_blob.dm | 4 +- .../hostile/mining_mobs/elites/elite.dm | 5 +- .../mob/living/simple_animal/slime/slime.dm | 4 +- code/modules/mob/mob_defines.dm | 2 +- .../plumbing/plumbers/grinder_chemical.dm | 2 +- .../power/singularity/containment_field.dm | 4 +- .../guns/energy/kinetic_accelerator.dm | 4 +- .../projectiles/guns/misc/beam_rifle.dm | 76 ++-- .../projectiles/guns/misc/blastcannon.dm | 3 +- code/modules/projectiles/projectile.dm | 396 ++++++++++++------ code/modules/projectiles/projectile/beams.dm | 2 +- .../projectile/bullets/ferromagnetic.dm | 4 +- .../projectiles/projectile/bullets/sniper.dm | 3 +- .../projectiles/projectile/bullets/special.dm | 3 +- code/modules/projectiles/projectile/magic.dm | 13 +- .../projectiles/projectile/special/curse.dm | 11 +- .../ruins/objects_and_mobs/necropolis_gate.dm | 8 +- .../ruins/objects_and_mobs/sin_ruins.dm | 5 +- code/modules/shuttle/special.dm | 5 +- code/modules/spells/spell_types/forcewall.dm | 4 +- code/modules/vehicles/ridden.dm | 1 + 84 files changed, 597 insertions(+), 503 deletions(-) diff --git a/code/__DEFINES/_flags/_flags.dm b/code/__DEFINES/_flags/_flags.dm index 5f591b429b..99c9b293fb 100644 --- a/code/__DEFINES/_flags/_flags.dm +++ b/code/__DEFINES/_flags/_flags.dm @@ -104,6 +104,7 @@ GLOBAL_LIST_INIT(bitflags, list( #define PASSBLOB (1<<3) #define PASSMOB (1<<4) #define PASSCLOSEDTURF (1<<5) +/// Let thrown things past us. **ONLY MEANINGFUL ON pass_flags_self!** #define LETPASSTHROW (1<<6) //Movement Types @@ -111,8 +112,8 @@ GLOBAL_LIST_INIT(bitflags, list( #define FLYING (1<<1) #define VENTCRAWLING (1<<2) #define FLOATING (1<<3) -///When moving, will Bump()/Cross()/Uncross() everything, but won't be stopped. -#define UNSTOPPABLE (1<<4) +///When moving, will Bump()/Cross()/Uncross() everything, but won't stop or Bump() anything. +#define PHASING (1<<4) ///Applied if you're crawling around on the ground/resting. #define CRAWLING (1<<5) diff --git a/code/__DEFINES/projectiles.dm b/code/__DEFINES/projectiles.dm index 1bd67fbe02..70a2d611ab 100644 --- a/code/__DEFINES/projectiles.dm +++ b/code/__DEFINES/projectiles.dm @@ -1,3 +1,14 @@ + +// check_pierce() return values +/// Default behavior: hit and delete self +#define PROJECTILE_PIERCE_NONE 0 +/// Hit the thing but go through without deleting. Causes on_hit to be called with pierced = TRUE +#define PROJECTILE_PIERCE_HIT 1 +/// Entirely phase through the thing without ever hitting. +#define PROJECTILE_PIERCE_PHASE 2 +// Delete self without hitting +#define PROJECTILE_DELETE_WITHOUT_HITTING 3 + /// This atom should be ricocheted off of from its inherent properties using standard % chance handling. #define PROJECTILE_RICOCHET_YES 1 /// This atom should not be ricocheted off of from its inherent properties. diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index df3b6e5334..e3675a53f5 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -130,7 +130,7 @@ GLOBAL_LIST_INIT(bitfields, list( "FLYING" = FLYING, "VENTCRAWLING" = VENTCRAWLING, "FLOATING" = FLOATING, - "UNSTOPPABLE" = UNSTOPPABLE + "PHASING" = PHASING ), "resistance_flags" = list( "LAVA_PROOF" = LAVA_PROOF, diff --git a/code/_onclick/adjacent.dm b/code/_onclick/adjacent.dm index 3f3eecb676..e629a6eb57 100644 --- a/code/_onclick/adjacent.dm +++ b/code/_onclick/adjacent.dm @@ -94,7 +94,7 @@ for(var/obj/O in src) if((mover && O.CanPass(mover,get_step(src,target_dir))) || (!mover && !O.density)) continue - if(O == target_atom || O == mover || (O.pass_flags & LETPASSTHROW)) //check if there's a dense object present on the turf + if(O == target_atom || O == mover || (O.pass_flags_self & LETPASSTHROW)) //check if there's a dense object present on the turf continue // LETPASSTHROW is used for anything you can click through (or the firedoor special case, see above) if( O.flags_1&ON_BORDER_1) // windows are on border, check them first diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm index 0fa8035d72..2ff1e284d0 100644 --- a/code/controllers/subsystem/throwing.dm +++ b/code/controllers/subsystem/throwing.dm @@ -200,6 +200,6 @@ SUBSYSTEM_DEF(throwing) var/atom/movable/AM = thing if (AM == thrownthing || (AM == thrower && !ismob(thrownthing))) continue - if (AM.density && !(AM.pass_flags & LETPASSTHROW) && !(AM.flags_1 & ON_BORDER_1)) + if (AM.density && !(AM.pass_flags_self & LETPASSTHROW) && !(AM.flags_1 & ON_BORDER_1)) finalize(hit=TRUE, target=AM) return TRUE diff --git a/code/datums/components/mirv.dm b/code/datums/components/mirv.dm index 2a1663776c..77c47bcb1d 100644 --- a/code/datums/components/mirv.dm +++ b/code/datums/components/mirv.dm @@ -38,5 +38,5 @@ P.range = override_projectile_range P.preparePixelProjectile(shootat_turf, target) P.firer = firer // don't hit ourself that would be really annoying - P.permutated += target // don't hit the target we hit already with the flak + P.impacted = list(target = TRUE) // don't hit the target we hit already with the flak P.fire() diff --git a/code/datums/components/pellet_cloud.dm b/code/datums/components/pellet_cloud.dm index dcc806d991..a06242962f 100644 --- a/code/datums/components/pellet_cloud.dm +++ b/code/datums/components/pellet_cloud.dm @@ -242,7 +242,7 @@ P.original = target P.fired_from = parent P.firer = parent // don't hit ourself that would be really annoying - P.permutated += parent // don't hit the target we hit already with the flak + P.impacted = list(parent = TRUE) // don't hit the target we hit already with the flak P.suppressed = SUPPRESSED_VERY // set the projectiles to make no message so we can do our own aggregate message P.preparePixelProjectile(target, parent) RegisterSignal(P, COMSIG_PROJECTILE_SELF_ON_HIT, .proc/pellet_hit) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 40162a6c9b..e4b7507560 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -9,6 +9,9 @@ plane = GAME_PLANE appearance_flags = TILE_BOUND + /// pass_flags that we are. If any of this matches a pass_flag on a moving thing, by default, we let them through. + var/pass_flags_self = NONE + var/level = 2 ///If non-null, overrides a/an/some in all cases var/article @@ -269,12 +272,27 @@ return FALSE if((P.flag in list("bullet", "bomb")) && P.ricochet_incidence_leeway) if((a_incidence_s < 90 && a_incidence_s < 90 - P.ricochet_incidence_leeway) || (a_incidence_s > 270 && a_incidence_s -270 > P.ricochet_incidence_leeway)) - return + return FALSE var/new_angle_s = SIMPLIFY_DEGREES(face_angle + incidence_s) P.setAngle(new_angle_s) return TRUE /atom/proc/CanPass(atom/movable/mover, turf/target) + SHOULD_CALL_PARENT(TRUE) + if(mover.movement_type & PHASING) + return TRUE + . = CanAllowThrough(mover, target) + // This is cheaper than calling the proc every time since most things dont override CanPassThrough + if(!mover.generic_canpass) + return mover.CanPassThrough(src, target, .) + +/// Returns true or false to allow the mover to move through src +/atom/proc/CanAllowThrough(atom/movable/mover, turf/target) + SHOULD_CALL_PARENT(TRUE) + if(mover.pass_flags & pass_flags_self) + return TRUE + if(mover.throwing && (pass_flags_self & LETPASSTHROW)) + return TRUE return !density /** @@ -445,9 +463,19 @@ wires.emp_pulse(severity) return protection // Pass the protection value collected here upwards -/atom/proc/bullet_act(obj/item/projectile/P, def_zone) +/** + * React to a hit by a projectile object + * + * Default behaviour is to send the [COMSIG_ATOM_BULLET_ACT] and then call [on_hit][/obj/item/projectile/proc/on_hit] on the projectile + * + * @params + * P - projectile + * def_zone - zone hit + * piercing_hit - is this hit piercing or normal? + */ +/atom/proc/bullet_act(obj/item/projectile/P, def_zone, piercing_hit = FALSE) SEND_SIGNAL(src, COMSIG_ATOM_BULLET_ACT, P, def_zone) - . = P.on_hit(src, 0, def_zone) + . = P.on_hit(src, 0, def_zone, piercing_hit) //used on altdisarm() for special interactions between the shoved victim (target) and the src, with user being the one shoving the target on it. // IMPORTANT: if you wish to add a new own shove_act() to a certain object, remember to add SHOVABLE_ONTO to its obj_flags bitfied var first. diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 5da389fbb8..56c668a24b 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -25,7 +25,10 @@ var/inertia_moving = 0 var/inertia_next_move = 0 var/inertia_move_delay = 5 - var/pass_flags = 0 + /// Things we can pass through while moving. If any of this matches the thing we're trying to pass's [pass_flags_self], then we can pass through. + var/pass_flags = NONE + /// If false makes CanPass call CanPassThrough on this type instead of using default behaviour + var/generic_canpass = TRUE var/moving_diagonally = 0 //0: not doing a diagonal move. 1 and 2: doing the first/second step of the diagonal move var/atom/movable/moving_from_pull //attempt to resume grab after moving instead of before. var/list/acted_explosions //for explosion dodging @@ -473,10 +476,15 @@ /atom/movable/proc/move_crushed(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction) return FALSE -/atom/movable/CanPass(atom/movable/mover, turf/target) +/atom/movable/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() if(mover in buckled_mobs) return TRUE - return ..() + +/// Returns true or false to allow src to move through the blocker, mover has final say +/atom/movable/proc/CanPassThrough(atom/blocker, turf/target, blocker_opinion) + SHOULD_CALL_PARENT(TRUE) + return blocker_opinion /// called when this atom is removed from a storage item, which is passed on as S. The loc variable is already set to the new destination before this is called. /atom/movable/proc/on_exit_storage(datum/component/storage/concrete/S) // rename S to master_storage diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index f40adcd00b..675d54ef22 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -90,6 +90,7 @@ Class Procs: verb_say = "beeps" verb_yell = "blares" pressure_resistance = 15 + pass_flags_self = PASSMACHINE max_integrity = 200 layer = BELOW_OBJ_LAYER //keeps shit coming out of the machine from ending up underneath it. flags_1 = DEFAULT_RICOCHET_1 diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index ca4b392efa..b720a92402 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -37,22 +37,19 @@ else return ..() -/obj/structure/barricade/CanPass(atom/movable/mover, turf/target)//So bullets will fly over and stuff. +/obj/structure/barricade/CanAllowThrough(atom/movable/mover, turf/target)//So bullets will fly over and stuff. + . = ..() if(locate(/obj/structure/barricade) in get_turf(mover)) - return 1 + return TRUE else if(istype(mover, /obj/item/projectile)) if(!anchored) - return 1 + return TRUE var/obj/item/projectile/proj = mover if(proj.firer && Adjacent(proj.firer)) - return 1 + return TRUE if(prob(proj_pass_rate)) - return 1 - return 0 - else - return !density - - + return TRUE + return FALSE /////BARRICADE TYPES/////// @@ -79,7 +76,6 @@ return return ..() - /obj/structure/barricade/wooden/crude name = "crude plank barricade" desc = "This space is blocked off by a crude assortment of planks." @@ -96,7 +92,6 @@ /obj/structure/barricade/wooden/make_debris() new /obj/item/stack/sheet/mineral/wood(get_turf(src), drop_amount) - /obj/structure/barricade/sandbags name = "sandbags" desc = "Bags of sand. Self explanatory." @@ -104,13 +99,12 @@ icon_state = "sandbags" max_integrity = 280 proj_pass_rate = 20 - pass_flags = LETPASSTHROW + pass_flags_self = LETPASSTHROW bar_material = SAND climbable = TRUE smooth = SMOOTH_TRUE canSmoothWith = list(/obj/structure/barricade/sandbags, /turf/closed/wall, /turf/closed/wall/r_wall, /obj/structure/falsewall, /obj/structure/falsewall/reinforced, /turf/closed/wall/rust, /turf/closed/wall/r_wall/rust, /obj/structure/barricade/security) - /obj/structure/barricade/security name = "security barrier" desc = "A deployable barrier. Provides good cover in fire fights." @@ -125,7 +119,6 @@ var/deploy_time = 40 var/deploy_message = TRUE - /obj/structure/barricade/security/Initialize() . = ..() addtimer(CALLBACK(src, .proc/deploy), deploy_time) @@ -137,7 +130,6 @@ if(deploy_message) visible_message("[src] deploys!") - /obj/item/grenade/barrier name = "barrier grenade" desc = "Instant cover." @@ -194,7 +186,6 @@ /obj/item/grenade/barrier/ui_action_click(mob/user) toggle_mode(user) - #undef SINGLE #undef VERTICAL #undef HORIZONTAL diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index d1781d9477..71df6affb7 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -127,10 +127,12 @@ . = ..() move_update_air(T) -/obj/machinery/door/CanPass(atom/movable/mover, turf/target) +/obj/machinery/door/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() + + // Snowflake handling for PASSGLASS. if(istype(mover) && (mover.pass_flags & PASSGLASS)) return !opacity - return !density /obj/machinery/door/proc/bumpopen(mob/user) if(operating) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index d84b994b92..62eb08735f 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -347,21 +347,15 @@ return 0 // not big enough to matter return start_point.air.return_pressure() < 20 ? -1 : 1 -/obj/machinery/door/firedoor/border_only/CanPass(atom/movable/mover, turf/target) - if(istype(mover) && (mover.pass_flags & PASSGLASS)) - return TRUE - if(get_dir(loc, target) == dir) //Make sure looking at appropriate border - return !density - else +/obj/machinery/door/firedoor/border_only/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() + if(!(get_dir(loc, target) == dir)) //Make sure looking at appropriate border return TRUE /obj/machinery/door/firedoor/border_only/CheckExit(atom/movable/mover as mob|obj, turf/target) - if(istype(mover) && (mover.pass_flags & PASSGLASS)) - return TRUE if(get_dir(loc, target) == dir) return !density - else - return TRUE + return TRUE /obj/machinery/door/firedoor/border_only/CanAtmosPass(turf/T) if(get_dir(loc, T) == dir) diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index af7545d3c9..5027e46aa0 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -12,6 +12,7 @@ armor = list("melee" = 20, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 70, "acid" = 100) visible = FALSE flags_1 = ON_BORDER_1|DEFAULT_RICOCHET_1 + pass_flags_self = PASSGLASS opacity = 0 CanAtmosPass = ATMOS_PASS_PROC interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_REQUIRES_SILICON | INTERACT_MACHINE_OPEN @@ -103,11 +104,12 @@ do_animate("deny") return -/obj/machinery/door/window/CanPass(atom/movable/mover, turf/target) - if(istype(mover) && (mover.pass_flags & PASSGLASS)) - return 1 +/obj/machinery/door/window/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() + if(.) + return if(get_dir(loc, target) == dir) //Make sure looking at appropriate border - return !density + return if(istype(mover, /obj/structure/window)) var/obj/structure/window/W = mover if(!valid_window_location(loc, W.ini_dir)) @@ -119,7 +121,7 @@ else if(istype(mover, /obj/machinery/door/window) && !valid_window_location(loc, mover.dir)) return FALSE else - return 1 + return TRUE /obj/machinery/door/window/CanAtmosPass(turf/T) if(get_dir(loc, T) == dir) @@ -131,13 +133,12 @@ /obj/machinery/door/window/CanAStarPass(obj/item/card/id/ID, to_dir) return !density || (dir != to_dir) || (check_access(ID) && hasPower()) -/obj/machinery/door/window/CheckExit(atom/movable/mover as mob|obj, turf/target) - if(istype(mover) && (mover.pass_flags & PASSGLASS)) - return 1 +/obj/machinery/door/window/CheckExit(atom/movable/mover, turf/target) + if((pass_flags_self & mover.pass_flags)) || ((pass_flags_self & LETPASSTHROW) && mover.throwing)) + return TRUE if(get_dir(loc, target) == dir) return !density - else - return 1 + return TRUE /obj/machinery/door/window/open(forced=0) if (src.operating == 1) //doors can still open when emag-disabled diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index 21ef8e2dcf..7129b6fe57 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -87,7 +87,7 @@ is_powered = FALSE icon_state = icon_name + "[is_powered]" + "[(blood ? "bld" : "")]" // add the blood tag at the end -/obj/machinery/recycler/CanPass(atom/movable/AM) +/obj/machinery/recycler/CanAllowThrough(atom/movable/AM) . = ..() if(!anchored) return diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index 2ebb137839..51f16c3425 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -454,11 +454,10 @@ if(gen_secondary) //using power may cause us to be destroyed gen_secondary.use_stored_power(drain_amount*0.5) -/obj/machinery/shieldwall/CanPass(atom/movable/mover, turf/target) +/obj/machinery/shieldwall/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() if(istype(mover) && (mover.pass_flags & PASSGLASS)) return prob(20) else if(istype(mover, /obj/item/projectile)) return prob(10) - else - return !density diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm index 8bca58a7de..afaf617cbc 100644 --- a/code/game/machinery/transformer.dm +++ b/code/game/machinery/transformer.dm @@ -57,14 +57,14 @@ AM.forceMove(drop_location()) do_transform(AM) -/obj/machinery/transformer/CanPass(atom/movable/mover, turf/target) +/obj/machinery/transformer/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() // Allows items to go through, // to stop them from blocking the conveyor belt. if(!ishuman(mover)) - var/dir = get_dir(src, mover) - if(dir == EAST) - return ..() - return 0 + if(get_dir(src, mover) == EAST) + return + return FALSE /obj/machinery/transformer/process() if(cooldown && (cooldown_timer <= world.time)) diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index a0f53ceab7..d4a198a5b0 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -291,9 +291,6 @@ to_chat(user, "You hit [src] but bounce off it!") playsound(src.loc, 'sound/weapons/tap.ogg', 100, 1) -/obj/structure/foamedmetal/CanPass(atom/movable/mover, turf/target) - return !density - /obj/structure/foamedmetal/iron max_integrity = 50 icon_state = "ironfoam" @@ -306,6 +303,7 @@ icon_state = "atmos_resin" alpha = 120 max_integrity = 10 + pass_flags_self = PASSGLASS /obj/structure/foamedmetal/resin/Initialize() . = ..() @@ -336,14 +334,6 @@ for(var/obj/item/Item in O) Item.extinguish() -/obj/structure/foamedmetal/resin/CanPass(atom/movable/mover, turf/target) - if(istype(mover) && (mover.pass_flags & PASSGLASS)) - return TRUE - . = ..() - -/obj/structure/foamedmetal/resin/BlockThermalConductivity() - return TRUE - #undef ALUMINUM_FOAM #undef IRON_FOAM #undef RESIN_FOAM diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index 3e80ade0ce..db1b9d5b2b 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -133,13 +133,11 @@ M.emote("cough") return 1 -/obj/effect/particle_effect/smoke/bad/CanPass(atom/movable/mover, turf/target) - if(istype(mover, /obj/item/projectile/beam)) - var/obj/item/projectile/beam/B = mover +/obj/effect/particle_effect/smoke/bad/Crossed(atom/movable/AM, oldloc) + . = ..() + if(istype(AM, /obj/projectile/beam)) + var/obj/projectile/beam/B = AM B.damage = (B.damage/2) - return 1 - - /datum/effect_system/smoke_spread/bad effect_type = /obj/effect/particle_effect/smoke/bad diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 4b04606401..1c8df008fd 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -36,7 +36,8 @@ icon_state = "stickyweb2" . = ..() -/obj/structure/spider/stickyweb/CanPass(atom/movable/mover, turf/target) +/obj/structure/spider/stickyweb/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() if (genetic) return if(istype(mover, /mob/living/simple_animal/hostile/poison/giant_spider)) @@ -49,7 +50,6 @@ return FALSE else if(istype(mover, /obj/item/projectile)) return prob(30) - return TRUE /obj/structure/spider/stickyweb/genetic //for the spider genes in genetics genetic = TRUE diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm index a8ff7b9004..4a59118c8a 100644 --- a/code/game/objects/items/cardboard_cutouts.dm +++ b/code/game/objects/items/cardboard_cutouts.dm @@ -92,9 +92,9 @@ if(prob(I.force)) push_over() -/obj/item/cardboard_cutout/bullet_act(obj/item/projectile/P) +/obj/item/cardboard_cutout/bullet_act(obj/item/projectile/P, def_zone, piercing_hit = FALSE) if(istype(P, /obj/item/projectile/bullet/reusable)) - P.on_hit(src, 0) + P.on_hit(src, 0, piercing_hit) visible_message("[src] has been hit by [P]!") playsound(src, 'sound/weapons/slice.ogg', 50, 1) if(prob(P.damage)) diff --git a/code/game/objects/items/devices/forcefieldprojector.dm b/code/game/objects/items/devices/forcefieldprojector.dm index 9ef9d73705..71f69a5c93 100644 --- a/code/game/objects/items/devices/forcefieldprojector.dm +++ b/code/game/objects/items/devices/forcefieldprojector.dm @@ -84,6 +84,7 @@ layer = ABOVE_ALL_MOB_LAYER anchored = TRUE density = TRUE + pass_flags_self = PASSGLASS mouse_opacity = MOUSE_OPACITY_OPAQUE resistance_flags = INDESTRUCTIBLE CanAtmosPass = ATMOS_PASS_DENSITY @@ -101,11 +102,6 @@ generator = null return ..() -/obj/structure/projected_forcefield/CanPass(atom/movable/mover, turf/target) - if(istype(mover) && (mover.pass_flags & PASSGLASS)) - return 1 - return !density - /obj/structure/projected_forcefield/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) playsound(loc, 'sound/weapons/egloves.ogg', 80, 1) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index e263678943..0651891421 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -238,7 +238,11 @@ /obj/get_dumping_location(datum/component/storage/source,mob/user) return get_turf(src) -/obj/proc/CanAStarPass() +/obj/proc/CanAStarPass(ID, dir, caller) + if(ismovable(caller)) + var/atom/movable/AM = caller + if(AM.pass_flags & pass_flags_self) + return TRUE . = !density /obj/proc/check_uplink_validity() diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 52036427c8..a8f0739bed 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -10,9 +10,11 @@ var/broken = 0 //similar to machinery's stat BROKEN layer = BELOW_OBJ_LAYER //ricochets on structures commented out for now because there's a lot of structures that /shouldnt/ be ricocheting and those need to be reviewed first + //With the addition of [pass_flags_self] the ricocheting of structures /shouldnt/ happen by default thus the existing code could be uncommented out - Solaris-Shade //flags_1 = DEFAULT_RICOCHET_1 //flags_ricochet = RICOCHET_HARD //ricochet_chance_mod = 0.5 + pass_flags_self = PASSSTRUCTURE /obj/structure/Initialize() if (!armor) @@ -114,4 +116,4 @@ return "It's falling apart!" /obj/structure/rust_heretic_act() - take_damage(500, BRUTE, "melee", 1) + take_damage(500, BRUTE, "melee", 1) diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index bc7ce8c36e..bd90db9c12 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -97,11 +97,6 @@ /obj/structure/alien/resin/attack_paw(mob/user) return attack_hand(user) - -/obj/structure/alien/resin/CanPass(atom/movable/mover, turf/target) - return !density - - /* * Weeds */ diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index af4d098157..b511ed7e2d 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -110,10 +110,10 @@ if(HAS_TRAIT(user, TRAIT_SKITTISH)) . += "If you bump into [p_them()] while running, you will jump inside." -/obj/structure/closet/CanPass(atom/movable/mover, turf/target) +/obj/structure/closet/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() if(wall_mounted) return TRUE - return !density /obj/structure/closet/proc/can_open(mob/living/user, force = FALSE) if(force) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index f6153330e4..ec97dad72c 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -26,15 +26,15 @@ // AddElement(/datum/element/climbable, climb_time = crate_climb_time, climb_stun = 0) update_icon() -/obj/structure/closet/crate/CanPass(atom/movable/mover, turf/target) +/obj/structure/closet/crate/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() if(!istype(mover, /obj/structure/closet)) var/obj/structure/closet/crate/locatedcrate = locate(/obj/structure/closet/crate) in get_turf(mover) if(locatedcrate) //you can walk on it like tables, if you're not in an open crate trying to move to a closed crate if(opened) //if we're open, allow entering regardless of located crate openness - return 1 + return TRUE if(!locatedcrate.opened) //otherwise, if the located crate is closed, allow entering - return 1 - return !density + return TRUE /obj/structure/closet/crate/update_icon_state() icon_state = "[initial(icon_state)][opened ? "open" : ""]" diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 50240aabb3..3e6884613e 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -296,14 +296,10 @@ qdel(src) return TRUE -/obj/structure/girder/CanPass(atom/movable/mover, turf/target) - if(istype(mover) && (mover.pass_flags & PASSGRILLE)) +/obj/structure/girder/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() + if((mover.pass_flags & PASSGRILLE) || istype(mover, /obj/projectile)) return prob(girderpasschance) - else - if(istype(mover, /obj/item/projectile)) - return prob(girderpasschance) - else - return 0 /obj/structure/girder/CanAStarPass(ID, dir, caller) . = !density diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 2ac85f79dc..54dce18d44 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -5,6 +5,7 @@ icon_state = "grille" density = TRUE anchored = TRUE + pass_flags_self = PASSGRILLE flags_1 = CONDUCT_1 pressure_resistance = 5*ONE_ATMOSPHERE layer = BELOW_OBJ_LAYER @@ -124,14 +125,10 @@ if(!shock(user, 70)) take_damage(20, BRUTE, "melee", 1) -/obj/structure/grille/CanPass(atom/movable/mover, turf/target) - if(istype(mover) && (mover.pass_flags & PASSGRILLE)) - return TRUE - else - if(istype(mover, /obj/item/projectile) && density) - return prob(30) - else - return !density +/obj/structure/grille/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() + if(!. && istype(mover, /obj/projectile)) + return prob(30) /obj/structure/grille/CanAStarPass(ID, dir, caller) . = !density diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index cb9309c4c4..26dedf3b62 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -51,20 +51,19 @@ name = "holo barrier" desc = "A short holographic barrier which can only be passed by walking." icon_state = "holosign_sec" - pass_flags = LETPASSTHROW + pass_flags_self = PASSTABLE | PASSGRILLE | PASSGLASS | LETPASSTHROW density = TRUE max_integrity = 20 var/allow_walk = 1 //can we pass through it on walk intent -/obj/structure/holosign/barrier/CanPass(atom/movable/mover, turf/target) - if(!density) - return 1 - if(mover.pass_flags & (PASSGLASS|PASSTABLE|PASSGRILLE)) - return 1 +/obj/structure/holosign/barrier/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() + if(.) + return if(iscarbon(mover)) var/mob/living/carbon/C = mover if(allow_walk && C.m_intent == MOVE_INTENT_WALK) - return 1 + return TRUE /obj/structure/holosign/barrier/engineering icon_state = "holosign_engi" @@ -149,22 +148,27 @@ . = ..() . += "The biometric scanners are [force_allaccess ? "off" : "on"]." -/obj/structure/holosign/barrier/medical/CanPass(atom/movable/mover, turf/target) - icon_state = "holo_medical" +/obj/structure/holosign/barrier/medical/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() if(force_allaccess) return TRUE if(ishuman(mover)) - var/mob/living/carbon/human/sickboi = mover - var/threat = sickboi.check_virus() - switch(threat) - if(DISEASE_SEVERITY_MINOR, DISEASE_SEVERITY_MEDIUM, DISEASE_SEVERITY_HARMFUL, DISEASE_SEVERITY_DANGEROUS, DISEASE_SEVERITY_BIOHAZARD) - if(buzzcd < world.time) - playsound(get_turf(src),'sound/machines/buzz-sigh.ogg',65,1,4) - buzzcd = (world.time + 60) - icon_state = "holo_medical-deny" - return FALSE - else - return TRUE //nice or benign diseases! + + return CheckHuman(mover) + +/obj/structure/holosign/barrier/medical/Bumped(atom/movable/AM) + . = ..() + icon_state = "holo_medical" + if(ishuman(AM) && !CheckHuman(AM)) + if(buzzcd < world.time) + playsound(get_turf(src),'sound/machines/buzz-sigh.ogg',65,TRUE,4) + buzzcd = (world.time + 60) + icon_state = "holo_medical-deny" + +/obj/structure/holosign/barrier/medical/proc/CheckHuman(mob/living/carbon/human/sickboi) + var/threat = sickboi.check_virus() + if(get_disease_severity_value(threat) > get_disease_severity_value(DISEASE_SEVERITY_MINOR)) + return FALSE return TRUE /obj/structure/holosign/barrier/medical/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags) diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index b2f1de8750..ecd7c1a03e 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -53,10 +53,10 @@ /obj/structure/mineral_door/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) return TryToSwitchState(user) -/obj/structure/mineral_door/CanPass(atom/movable/mover, turf/target) +/obj/structure/mineral_door/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() if(istype(mover, /obj/effect/beam)) return !opacity - return !density /obj/structure/mineral_door/proc/TryToSwitchState(atom/user) if(isSwitchingStates) diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 73268009ce..f98151e76a 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -306,7 +306,7 @@ GLOBAL_LIST_EMPTY(crematoriums) layer = TRAY_LAYER var/obj/structure/bodycontainer/connected = null anchored = TRUE - pass_flags = LETPASSTHROW + pass_flags_self = LETPASSTHROW max_integrity = 350 /obj/structure/tray/Destroy() @@ -362,17 +362,11 @@ GLOBAL_LIST_EMPTY(crematoriums) name = "morgue tray" desc = "Apply corpse before closing." icon_state = "morguet" + pass_flags_self = PASSTABLE -/obj/structure/tray/m_tray/CanPass(atom/movable/mover, turf/target) - if(istype(mover) && (mover.pass_flags & PASSTABLE)) - return 1 +/obj/structure/tray/m_tray/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() + if(.) + return if(locate(/obj/structure/table) in get_turf(mover)) - return 1 - else - return 0 - -/obj/structure/tray/m_tray/CanAStarPass(ID, dir, caller) - . = !density - if(ismovable(caller)) - var/atom/movable/mover = caller - . = . || (mover.pass_flags & PASSTABLE) + return TRUE diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index ff8287d77b..4e916d57a6 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -69,7 +69,9 @@ return CanAStarPass(ID, to_dir, M.pulling) return 1 //diseases, stings, etc can pass -/obj/structure/plasticflaps/CanPass(atom/movable/A, turf/T) +/obj/structure/plasticflaps/CanAllowThrough(atom/movable/A, turf/T) + . = ..() + if(istype(A) && (A.pass_flags & PASSGLASS)) return prob(60) @@ -93,7 +95,6 @@ return 1 if(!M.lying && !(SEND_SIGNAL(M, COMSIG_CHECK_VENTCRAWL)) && M.mob_size != MOB_SIZE_TINY) //If your not laying down, or a ventcrawler or a small creature, no pass. return 0 - return ..() /obj/structure/plasticflaps/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm index 21cf97ba70..13bc676239 100644 --- a/code/game/objects/structures/railings.dm +++ b/code/game/objects/structures/railings.dm @@ -78,7 +78,7 @@ /obj/structure/railing/CheckExit(atom/movable/mover, turf/target) ..() if(get_dir(loc, target) & dir) - var/checking = UNSTOPPABLE | FLYING | FLOATING + var/checking = PHASING | FLYING | FLOATING return !density || mover.throwing || mover.movement_type & checking || mover.move_force >= MOVE_FORCE_EXTREMELY_STRONG return TRUE diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 065c0d2f28..2435e9a5f6 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -19,10 +19,10 @@ icon_state = "table" density = TRUE anchored = TRUE + pass_flags_self = PASSTABLE | LETPASSTHROW layer = TABLE_LAYER climbable = TRUE obj_flags = CAN_BE_HIT|SHOVABLE_ONTO - pass_flags = LETPASSTHROW //You can throw objects over this, despite it's density.") attack_hand_speed = CLICK_CD_MELEE attack_hand_is_action = TRUE var/frame = /obj/structure/table_frame @@ -99,15 +99,14 @@ /obj/structure/table/attack_tk() return FALSE -/obj/structure/table/CanPass(atom/movable/mover, turf/target) - if(istype(mover) && (mover.pass_flags & PASSTABLE)) - return 1 +/obj/structure/table/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() + if(.) + return if(mover.throwing) - return 1 + return TRUE if(locate(/obj/structure/table) in get_turf(mover)) - return 1 - else - return !density + return TRUE /obj/structure/table/CanAStarPass(ID, dir, caller) . = !density @@ -685,7 +684,7 @@ layer = TABLE_LAYER density = TRUE anchored = TRUE - pass_flags = LETPASSTHROW //You can throw objects over this, despite it's density. + pass_flags_self = LETPASSTHROW //You can throw objects over this, despite it's density. max_integrity = 20 attack_hand_speed = CLICK_CD_MELEE attack_hand_is_action = TRUE @@ -702,12 +701,6 @@ else return 0 -/obj/structure/rack/CanAStarPass(ID, dir, caller) - . = !density - if(ismovable(caller)) - var/atom/movable/mover = caller - . = . || (mover.pass_flags & PASSTABLE) - /obj/structure/rack/MouseDrop_T(obj/O, mob/user) . = ..() if ((!( istype(O, /obj/item) ) || user.get_active_held_item() != O)) diff --git a/code/game/objects/structures/transit_tubes/transit_tube.dm b/code/game/objects/structures/transit_tubes/transit_tube.dm index 7e3684ad32..c8341c8834 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube.dm @@ -8,17 +8,13 @@ layer = LOW_ITEM_LAYER anchored = TRUE climbable = 1 + pass_flags_self = PASSGLASS var/tube_construction = /obj/structure/c_transit_tube var/list/tube_dirs //list of directions this tube section can connect to. var/exit_delay = 1 var/enter_delay = 0 var/const/time_to_unwrench = 2 SECONDS -/obj/structure/transit_tube/CanPass(atom/movable/mover, turf/target) - if(istype(mover) && (mover.pass_flags & PASSGLASS)) - return 1 - return !density - /obj/structure/transit_tube/New(loc, newdirection) ..(loc) if(newdirection) diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index ef1ca6720a..4f1de6432a 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -50,11 +50,10 @@ /obj/structure/windoor_assembly/update_icon_state() icon_state = "[facing]_[secure ? "secure_" : ""]windoor_assembly[state]" -/obj/structure/windoor_assembly/CanPass(atom/movable/mover, turf/target) - if(istype(mover) && (mover.pass_flags & PASSGLASS)) - return 1 +/obj/structure/windoor_assembly/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() if(get_dir(loc, target) == dir) //Make sure looking at appropriate border - return !density + return if(istype(mover, /obj/structure/window)) var/obj/structure/window/W = mover if(!valid_window_location(loc, W.ini_dir)) @@ -65,7 +64,6 @@ return FALSE else if(istype(mover, /obj/machinery/door/window) && !valid_window_location(loc, mover.dir)) return FALSE - return 1 /obj/structure/windoor_assembly/CanAtmosPass(turf/T) if(get_dir(loc, T) == dir) @@ -73,13 +71,13 @@ else return 1 -/obj/structure/windoor_assembly/CheckExit(atom/movable/mover as mob|obj, turf/target) - if(istype(mover) && (mover.pass_flags & PASSGLASS)) - return 1 +/obj/structure/windoor_assembly/CheckExit(atom/movable/mover, turf/target) + if(mover.pass_flags & pass_flags_self) + return TRUE if(get_dir(loc, target) == dir) return !density else - return 1 + return TRUE /obj/structure/windoor_assembly/attackby(obj/item/W, mob/user, params) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 4853d553dc..a73de2d367 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -18,6 +18,7 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) pressure_resistance = 4*ONE_ATMOSPHERE anchored = TRUE //initially is 0 for tile smoothing max_integrity = 25 + pass_flags_self = PASSGLASS var/ini_dir = null var/state = WINDOW_OUT_OF_FRAME var/reinf = FALSE @@ -90,13 +91,13 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) . = ..() if(direct) setDir(direct) - + if(extra_reinforced && anchored) state = PRWINDOW_SECURE else if(reinf && anchored) state = WINDOW_SCREWED_TO_FRAME - + if(mapload && electrochromatic_id && electrochromatic_id[1] == "!") electrochromatic_id = SSmapping.get_obfuscated_id(electrochromatic_id) @@ -159,13 +160,15 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) else ..(FULLTILE_WINDOW_DIR) -/obj/structure/window/CanPass(atom/movable/mover, turf/target) - if(istype(mover) && (mover.pass_flags & PASSGLASS)) - return 1 +/obj/structure/window/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() + if(.) + return if(dir == FULLTILE_WINDOW_DIR) return 0 //full tile window, you can't move into it! - if(get_dir(loc, target) == dir) - return !density + var/attempted_dir = get_dir(loc, target) + if(attempted_dir == dir) + return if(istype(mover, /obj/structure/window)) var/obj/structure/window/W = mover if(!valid_window_location(loc, W.ini_dir)) @@ -176,7 +179,8 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) return FALSE else if(istype(mover, /obj/machinery/door/window) && !valid_window_location(loc, mover.dir)) return FALSE - return 1 + else if(attempted_dir != dir) + return TRUE /obj/structure/window/CheckExit(atom/movable/O, turf/target) if(istype(O) && (O.pass_flags & PASSGLASS)) diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm index ccfb5dc238..3c2f38e872 100644 --- a/code/game/turfs/closed.dm +++ b/code/game/turfs/closed.dm @@ -6,6 +6,7 @@ blocks_air = 1 rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE rad_insulation = RAD_MEDIUM_INSULATION + pass_flags_self = PASSCLOSEDTURF wave_explosion_block = 10 wave_explosion_multiply = 0.75 /// How much we block yelling @@ -23,11 +24,6 @@ /turf/closed/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) return FALSE -/turf/closed/CanPass(atom/movable/mover, turf/target) - if(istype(mover) && (mover.pass_flags & PASSCLOSEDTURF)) - return TRUE - return ..() - /turf/closed/indestructible name = "wall" icon = 'icons/turf/walls.dmi' diff --git a/code/game/turfs/simulated/chasm.dm b/code/game/turfs/simulated/chasm.dm index 9490d728fe..40b96dbcc8 100644 --- a/code/game/turfs/simulated/chasm.dm +++ b/code/game/turfs/simulated/chasm.dm @@ -77,9 +77,6 @@ else to_chat(user, "The plating is going to need some support! Place metal rods first.") -/turf/open/chasm/CanPass(atom/movable/mover, turf/target) - return 1 - // Chasms for Lavaland, with planetary atmos and lava glow /turf/open/chasm/lavaland initial_gas_mix = LAVALAND_DEFAULT_ATMOS diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 85de964463..c87d386b5f 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -225,16 +225,6 @@ GLOBAL_LIST_EMPTY(station_turfs) return FALSE -/turf/CanPass(atom/movable/mover, turf/target) - if(!target) - return FALSE - - if(istype(mover)) // turf/Enter(...) will perform more advanced checks - return !density - - stack_trace("Non movable passed to turf CanPass : [mover]") - return FALSE - //There's a lot of QDELETED() calls here if someone can figure out how to optimize this but not runtime when something gets deleted by a Bump/CanPass/Cross call, lemme know or go ahead and fix this mess - kevinz000 /turf/Enter(atom/movable/mover, atom/oldloc) // Do not call ..() @@ -243,7 +233,7 @@ GLOBAL_LIST_EMPTY(station_turfs) // Here's hoping it doesn't stay like this for years before we finish conversion to step_ var/atom/firstbump var/canPassSelf = CanPass(mover, src) - if(canPassSelf || (mover.movement_type & UNSTOPPABLE)) + if(canPassSelf || (mover.movement_type & PHASING)) for(var/i in contents) if(QDELETED(mover)) return FALSE //We were deleted, do not attempt to proceed with movement. @@ -253,7 +243,7 @@ GLOBAL_LIST_EMPTY(station_turfs) if(!thing.Cross(mover)) if(QDELETED(mover)) //Mover deleted from Cross/CanPass, do not proceed. return FALSE - if((mover.movement_type & UNSTOPPABLE)) + if((mover.movement_type & PHASING)) mover.Bump(thing) continue else @@ -265,7 +255,7 @@ GLOBAL_LIST_EMPTY(station_turfs) firstbump = src if(firstbump) mover.Bump(firstbump) - return (mover.movement_type & UNSTOPPABLE) + return (mover.movement_type & PHASING) return TRUE /turf/Exit(atom/movable/mover, atom/newloc) @@ -279,7 +269,7 @@ GLOBAL_LIST_EMPTY(station_turfs) if(!thing.Uncross(mover, newloc)) if(thing.flags_1 & ON_BORDER_1) mover.Bump(thing) - if(!(mover.movement_type & UNSTOPPABLE)) + if(!(mover.movement_type & PHASING)) return FALSE if(QDELETED(mover)) return FALSE //We were deleted. @@ -621,11 +611,6 @@ GLOBAL_LIST_EMPTY(station_turfs) /turf/proc/Melt() return ScrapeAway(flags = CHANGETURF_INHERIT_AIR) -/turf/bullet_act(obj/item/projectile/P) - . = ..() - if(. != BULLET_ACT_FORCE_PIERCE) - . = BULLET_ACT_TURF - /turf/proc/get_yelling_resistance(power) . = 0 // don't bother checking fulltile, we don't need accuracy diff --git a/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm b/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm index f9763b92fd..3caaff4a53 100644 --- a/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm +++ b/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm @@ -46,10 +46,10 @@ else adjustFireLoss(5) -/mob/living/simple_animal/hostile/blob/CanPass(atom/movable/mover, turf/target) +/mob/living/simple_animal/hostile/blob/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() if(istype(mover, /obj/structure/blob)) - return 1 - return ..() + return TRUE /mob/living/simple_animal/hostile/blob/Process_Spacemove(movement_dir = 0) for(var/obj/structure/blob/B in range(1, src)) diff --git a/code/modules/antagonists/blob/blob/theblob.dm b/code/modules/antagonists/blob/blob/theblob.dm index a95f73f90d..7651093ea1 100644 --- a/code/modules/antagonists/blob/blob/theblob.dm +++ b/code/modules/antagonists/blob/blob/theblob.dm @@ -8,6 +8,7 @@ opacity = 0 anchored = TRUE layer = BELOW_MOB_LAYER + pass_flags_self = PASSBLOB CanAtmosPass = ATMOS_PASS_PROC var/point_return = 0 //How many points the blob gets back when it removes a blob of that type. If less than 0, blob cannot be removed. max_integrity = 30 @@ -67,20 +68,9 @@ /obj/structure/blob/BlockThermalConductivity() return atmosblock -/obj/structure/blob/CanPass(atom/movable/mover, turf/target) - if(istype(mover) && (mover.pass_flags & PASSBLOB)) - return 1 - return 0 - /obj/structure/blob/CanAtmosPass(turf/T) return !atmosblock -/obj/structure/blob/CanAStarPass(ID, dir, caller) - . = 0 - if(ismovable(caller)) - var/atom/movable/mover = caller - . = . || (mover.pass_flags & PASSBLOB) - /obj/structure/blob/update_icon() //Updates color based on overmind color if we have an overmind. if(overmind) add_atom_colour(overmind.blobstrain.color, FIXED_COLOUR_PRIORITY) diff --git a/code/modules/antagonists/swarmer/swarmer.dm b/code/modules/antagonists/swarmer/swarmer.dm index 2d4ac88656..a572238877 100644 --- a/code/modules/antagonists/swarmer/swarmer.dm +++ b/code/modules/antagonists/swarmer/swarmer.dm @@ -139,12 +139,12 @@ else death() -/mob/living/simple_animal/hostile/swarmer/CanPass(atom/movable/O) +/mob/living/simple_animal/hostile/swarmer/CanAllowThrough(atom/movable/O) + . = ..() if(istype(O, /obj/item/projectile/beam/disabler))//Allows for swarmers to fight as a group without wasting their shots hitting each other return 1 if(isswarmer(O)) return 1 - ..() ////CTRL CLICK FOR SWARMERS AND SWARMER_ACT()'S//// /mob/living/simple_animal/hostile/swarmer/AttackingTarget() @@ -698,11 +698,12 @@ light_range = MINIMUM_USEFUL_LIGHT_RANGE max_integrity = 50 -/obj/structure/swarmer/blockade/CanPass(atom/movable/O) +/obj/structure/swarmer/blockade/CanAllowThrough(atom/movable/O) + . = ..() if(isswarmer(O)) - return 1 + return TRUE if(istype(O, /obj/item/projectile/beam/disabler)) - return 1 + return TRUE /mob/living/simple_animal/hostile/swarmer/proc/CreateSwarmer() set name = "Replicate" diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index d0ed0f2436..94f7409cc9 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -220,7 +220,8 @@ icon_state = "ibeam" anchored = TRUE density = FALSE - pass_flags = PASSTABLE|PASSGLASS|PASSGRILLE|LETPASSTHROW + pass_flags = PASSTABLE|PASSGLASS|PASSGRILLE + pass_flags_self = LETPASSTHROW var/obj/item/assembly/infra/master /obj/effect/beam/i_beam/Crossed(atom/movable/AM as mob|obj) diff --git a/code/modules/awaymissions/away_props.dm b/code/modules/awaymissions/away_props.dm index 36ed9b6ba3..d5d94b2a92 100644 --- a/code/modules/awaymissions/away_props.dm +++ b/code/modules/awaymissions/away_props.dm @@ -6,10 +6,11 @@ invisibility = INVISIBILITY_MAXIMUM anchored = TRUE -/obj/effect/oneway/CanPass(atom/movable/mover, turf/target) +/obj/effect/oneway/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() var/turf/T = get_turf(src) var/turf/MT = get_turf(mover) - return ..() && (T == MT || get_dir(MT,T) == dir) + return . && (T == MT || get_dir(MT,T) == dir) /obj/effect/wind diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index d32905e007..c6cd2e4d77 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -405,10 +405,10 @@ /obj/item/projectile/bullet/ctf damage = 0 -/obj/item/projectile/bullet/ctf/prehit(atom/target) +/obj/item/projectile/bullet/ctf/prehit_pierce(atom/target) if(is_ctf_target(target)) damage = 60 - return //PROJECTILE_PIERCE_NONE /// hey uhh don't hit anyone behind them + return PROJECTILE_PIERCE_NONE /// hey uhh don't hit anyone behind them . = ..() /obj/item/gun/ballistic/automatic/laser/ctf @@ -442,10 +442,10 @@ damage = 0 icon_state = "omnilaser" -/obj/item/projectile/beam/ctf/prehit(atom/target) +/obj/item/projectile/beam/ctf/prehit_pierce(atom/target) if(is_ctf_target(target)) damage = 150 - return //PROJECTILE_PIERCE_NONE /// hey uhhh don't hit anyone behind them + return PROJECTILE_PIERCE_NONE /// hey uhhh don't hit anyone behind them . = ..() /proc/is_ctf_target(atom/target) diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index ed6a087cd9..8cbe7f50e1 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -523,7 +523,7 @@ if(!override) qdel(src) -/obj/structure/spacevine/CanPass(atom/movable/mover, turf/target) +/obj/structure/spacevine/CanAllowThrough(atom/movable/mover, turf/target) . = ..() if(isvineimmune(mover)) return TRUE diff --git a/code/modules/fields/turf_objects.dm b/code/modules/fields/turf_objects.dm index 1af924294a..f8d139a45d 100644 --- a/code/modules/fields/turf_objects.dm +++ b/code/modules/fields/turf_objects.dm @@ -23,7 +23,7 @@ name = "energy field" desc = "Get off my turf!" -/obj/effect/abstract/proximity_checker/advanced/field_turf/CanPass(atom/movable/AM, turf/target) +/obj/effect/abstract/proximity_checker/advanced/field_turf/CanAllowThrough(atom/movable/AM, turf/target) . = ..() if(parent) return parent.field_turf_canpass(AM, src, target) @@ -48,7 +48,7 @@ name = "energy field edge" desc = "Edgy description here." -/obj/effect/abstract/proximity_checker/advanced/field_edge/CanPass(atom/movable/AM, turf/target) +/obj/effect/abstract/proximity_checker/advanced/field_edge/CanAllowThrough(atom/movable/AM, turf/target) . = ..() if(parent) return parent.field_edge_canpass(AM, src, target) diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 5d84901e7f..a43bb0cff5 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -647,10 +647,10 @@ GLOBAL_LIST_INIT(hallucination_list, list( target.playsound_local(get_turf(airlock), 'sound/machines/boltsup.ogg',30,0,3) qdel(src) -/obj/effect/hallucination/fake_door_lock/CanPass(atom/movable/mover, turf/_target) +/obj/effect/hallucination/fake_door_lock/CanAllowThrough(atom/movable/mover, turf/_target) + . = ..() if(mover == target && airlock.density) return FALSE - return TRUE /datum/hallucination/chat diff --git a/code/modules/holiday/halloween/halloween.dm b/code/modules/holiday/halloween/halloween.dm index 0c9987fc00..1e5f4b4502 100644 --- a/code/modules/holiday/halloween/halloween.dm +++ b/code/modules/holiday/halloween/halloween.dm @@ -175,9 +175,6 @@ step(I,direction) return -/mob/living/simple_animal/hostile/construct/shade/howling_ghost/CanPass(atom/movable/mover, turf/target) - return 1 - /////////////////////////// //Spookoween Insane Clown// /////////////////////////// @@ -233,7 +230,7 @@ return /mob/living/simple_animal/hostile/retaliate/clown/insane/adjustHealth() - . = ..() + . = ..() if(prob(5)) playsound(loc, 'sound/spookoween/insane_low_laugh.ogg', 300, 1) diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm index 38e4fcc6ff..a314210570 100644 --- a/code/modules/hydroponics/grown/towercap.dm +++ b/code/modules/hydroponics/grown/towercap.dm @@ -151,6 +151,7 @@ density = FALSE anchored = TRUE buckle_lying = 0 + pass_flags_self = PASSTABLE | LETPASSTHROW var/burning = 0 var/burn_icon = "bonfire_on_fire" //for a softer more burning embers icon, use "bonfire_warm" var/grill = FALSE @@ -163,13 +164,6 @@ . = ..() StartBurning() -/obj/structure/bonfire/CanPass(atom/movable/mover, turf/target) - if(istype(mover) && (mover.pass_flags & PASSTABLE)) - return TRUE - if(mover.throwing) - return TRUE - return ..() - /obj/structure/bonfire/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/stack/rods) && !can_buckle && !grill) var/obj/item/stack/rods/R = W diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index 8037a22a52..50c91378ec 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -131,7 +131,8 @@ to_chat(M, "[src] has been set to attack hostile wildlife.") return -/mob/living/simple_animal/hostile/mining_drone/CanPass(atom/movable/O) +/mob/living/simple_animal/hostile/mining_drone/CanAllowThrough(atom/movable/O) + . = ..() if(istype(O, /obj/item/projectile/kinetic)) var/obj/item/projectile/kinetic/K = O if(K.kinetic_gun) @@ -141,7 +142,6 @@ return TRUE if(istype(O, /obj/item/projectile/destabilizer)) return TRUE - return ..() /mob/living/simple_animal/hostile/mining_drone/proc/SetCollectBehavior() mode = MINEDRONE_COLLECT diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 624db8caf5..4b228e1eb3 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -166,9 +166,6 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) QDEL_NULL(spawners_menu) return ..() -/mob/dead/CanPass(atom/movable/mover, turf/target) - return 1 - /* * This proc will update the icon of the ghost itself, with hair overlays, as well as the ghost image. * Please call update_icon(icon_state) from now on when you want to update the icon_state of the ghost, diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 71573abc90..b65155f086 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -53,7 +53,7 @@ dna.species.on_hit(P, src) -/mob/living/carbon/human/bullet_act(obj/item/projectile/P, def_zone) +/mob/living/carbon/human/bullet_act(obj/item/projectile/P, def_zone, piercing_hit = FALSE) if(dna && dna.species) var/spec_return = dna.species.bullet_act(P, src) if(spec_return) @@ -61,7 +61,7 @@ if(mind) //martial art stuff if(mind.martial_art && mind.martial_art.can_use(src)) //Some martial arts users can deflect projectiles! - var/martial_art_result = mind.martial_art.on_projectile_hit(src, P, def_zone) + var/martial_art_result = mind.martial_art.on_projectile_hit(src, P, def_zone, piercing_hit) if(!(martial_art_result == BULLET_ACT_HIT)) return martial_art_result return ..() diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 5ce80c5575..2aaedb22a5 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -68,7 +68,7 @@ else CRASH("Invalid rediretion mode [redirection_mode]") -/mob/living/bullet_act(obj/item/projectile/P, def_zone) +/mob/living/bullet_act(obj/item/projectile/P, def_zone, piercing_hit = FALSE) var/totaldamage = P.damage var/final_percent = 0 if(P.original != src || P.firer != src) //try to block or reflect the bullet, can't do so when shooting oneself @@ -81,7 +81,7 @@ if(returned & BLOCK_REDIRECTED) return BULLET_ACT_FORCE_PIERCE if(returned & BLOCK_SUCCESS) - P.on_hit(src, final_percent, def_zone) + P.on_hit(src, final_percent, def_zone, piercing_hit) return BULLET_ACT_BLOCK totaldamage = block_calculate_resultant_damage(totaldamage, returnlist) var/armor = run_armor_check(def_zone, P.flag, null, null, P.armour_penetration, null) diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm index a35558884b..fcab9344d9 100644 --- a/code/modules/mob/living/living_movement.dm +++ b/code/modules/mob/living/living_movement.dm @@ -20,12 +20,10 @@ /mob/living/proc/update_density() density = !lying && !HAS_TRAIT(src, TRAIT_LIVING_NO_DENSITY) -/mob/living/CanPass(atom/movable/mover, turf/target) - if((mover.pass_flags & PASSMOB)) - return TRUE - if(istype(mover, /obj/item/projectile)) - var/obj/item/projectile/P = mover - return !P.can_hit_target(src, P.permutated, src == P.original, TRUE) +/mob/living/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() + if(.) + return if(mover.throwing) return (!density || lying) if(buckled == mover) @@ -41,7 +39,7 @@ var/mob/living/L = mover //typecast first, check isliving and only check this if living using short circuit if(isliving(L) && lying && L.lying) //if we're both lying down and aren't already being thrown/shipped around, don't pass return FALSE - return (!density || (isliving(mover)? L.can_move_under_living(src) : !mover.density)) + return (isliving(mover)? L.can_move_under_living(src) : !mover.density) /mob/living/toggle_move_intent() . = ..() diff --git a/code/modules/mob/living/silicon/silicon_defense.dm b/code/modules/mob/living/silicon/silicon_defense.dm index 55d0336671..a87c0a81ab 100644 --- a/code/modules/mob/living/silicon/silicon_defense.dm +++ b/code/modules/mob/living/silicon/silicon_defense.dm @@ -120,7 +120,7 @@ "You are thrown off of [src]!") flash_act(affect_silicon = 1) -/mob/living/silicon/bullet_act(obj/item/projectile/P, def_zone) +/mob/living/silicon/bullet_act(obj/item/projectile/P, def_zone, piercing_hit = FALSE) var/totaldamage = P.damage if(P.original != src || P.firer != src) //try to block or reflect the bullet, can't do so when shooting oneself var/list/returnlist = list() @@ -141,7 +141,7 @@ "You are knocked off of [src] by the [P]!") unbuckle_mob(M) M.DefaultCombatKnockdown(40) - P.on_hit(src, 0, def_zone) + P.on_hit(src, 0, def_zone, 0, piercing_hit) return BULLET_ACT_HIT /mob/living/silicon/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /atom/movable/screen/fullscreen/tiled/flash/static) diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm index b003e066ef..df8ef44845 100644 --- a/code/modules/mob/living/simple_animal/animal_defense.dm +++ b/code/modules/mob/living/simple_animal/animal_defense.dm @@ -124,10 +124,10 @@ apply_damage(damage, damagetype, null, getarmor(null, armorcheck)) return TRUE -/mob/living/simple_animal/bullet_act(obj/item/projectile/Proj) +/mob/living/simple_animal/bullet_act(obj/item/projectile/Proj, def_zone, piercing_hit = FALSE) if(!Proj) return - apply_damage(Proj.damage, Proj.damage_type) + apply_damage(Proj.damage, Proj.damage_type, 0, piercing_hit) Proj.on_hit(src) return BULLET_ACT_HIT diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm b/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm index 2d964f5721..baa0fe4649 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm @@ -33,12 +33,12 @@ footstep_type = FOOTSTEP_MOB_BAREFOOT -/mob/living/simple_animal/hostile/jungle/mook/CanPass(atom/movable/O) +/mob/living/simple_animal/hostile/jungle/mook/CanAllowThrough(atom/movable/O) + . = ..() if(istype(O, /mob/living/simple_animal/hostile/jungle/mook)) var/mob/living/simple_animal/hostile/jungle/mook/M = O if(M.attack_state == MOOK_ATTACK_ACTIVE && M.throwing) return TRUE - return ..() /mob/living/simple_animal/hostile/jungle/mook/death() desc = "A deceased primitive. Upon closer inspection, it was suffering from severe cellular degeneration and its garments are machine made..."//Can you guess the twist diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index 9bcc21efa6..ab6c9fa301 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -160,10 +160,10 @@ Difficulty: Hard severity = EXPLODE_LIGHT // puny mortals return ..() -/mob/living/simple_animal/hostile/megafauna/bubblegum/CanPass(atom/movable/mover, turf/target) +/mob/living/simple_animal/hostile/megafauna/bubblegum/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() if(istype(mover, /mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination)) - return 1 - return ..() + return TRUE /mob/living/simple_animal/hostile/megafauna/bubblegum/Goto(target, delay, minimum_distance) if(!charging) @@ -466,10 +466,10 @@ Difficulty: Hard new /obj/effect/decal/cleanable/blood(get_turf(src)) . = ..() -/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/CanPass(atom/movable/mover, turf/target) +/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() if(istype(mover, /mob/living/simple_animal/hostile/megafauna/bubblegum)) // hallucinations should not be stopping bubblegum or eachother - return 1 - return ..() + return TRUE /mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/Life() return diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index c1aea8db9d..a4620cd781 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -490,7 +490,8 @@ Difficulty: Normal queue_smooth_neighbors(src) return ..() -/obj/effect/temp_visual/hierophant/wall/CanPass(atom/movable/mover, turf/target) +/obj/effect/temp_visual/hierophant/wall/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() if(QDELETED(caster)) return FALSE if(mover == caster.pulledby) @@ -501,7 +502,6 @@ Difficulty: Normal return TRUE if(mover == caster) return TRUE - return FALSE /obj/effect/temp_visual/hierophant/chaser //a hierophant's chaser. follows target around, moving and producing a blast every speed deciseconds. duration = 98 diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm index 15bfe2b7f7..f0f978c03f 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm @@ -394,7 +394,7 @@ SHITCODE AHEAD. BE ADVISED. Also comment extravaganza muzzle_type = /obj/effect/projectile/tracer/legion impact_type = /obj/effect/projectile/tracer/legion hitscan = TRUE - movement_type = UNSTOPPABLE + projectile_piercing = ALL ///Used for the legion turret tracer. /obj/effect/projectile/tracer/legion/tracer diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm index ed056c2ad9..04b003b315 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm @@ -72,14 +72,14 @@ return //if it's not our target, we ignore it -/mob/living/simple_animal/hostile/asteroid/curseblob/CanPass(atom/movable/mover, turf/target) +/mob/living/simple_animal/hostile/asteroid/curseblob/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() if(mover == set_target) return FALSE if(istype(mover, /obj/item/projectile)) var/obj/item/projectile/P = mover if(P.firer == set_target) return FALSE - return TRUE #define IGNORE_PROC_IF_NOT_TARGET(X) /mob/living/simple_animal/hostile/asteroid/curseblob/##X(AM) { if (AM == set_target) return ..(); } diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm index be596b0292..b92f429c8c 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm @@ -383,8 +383,7 @@ While using this makes the system rely on OnFire, it still gives options for tim ourelite = null return ..() -/obj/effect/temp_visual/elite_tumor_wall/CanPass(atom/movable/mover, turf/target) +/obj/effect/temp_visual/elite_tumor_wall/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() if(mover == ourelite || mover == activator) return FALSE - else - return TRUE diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index 38149494bc..9812307300 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -231,11 +231,11 @@ amount = -abs(amount) return ..() //Heals them -/mob/living/simple_animal/slime/bullet_act(obj/item/projectile/Proj) +/mob/living/simple_animal/slime/bullet_act(obj/item/projectile/Proj, def_zone, piercing_hit = FALSE) attacked += 10 if((Proj.damage_type == BURN)) adjustBruteLoss(-abs(Proj.damage)) //fire projectiles heals slimes. - Proj.on_hit(src) + Proj.on_hit(src, 0, piercing_hit) return BULLET_ACT_BLOCK return ..() diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 527b0c0917..138a3b9662 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -9,7 +9,7 @@ mouse_drag_pointer = MOUSE_ACTIVE_POINTER throwforce = 10 blocks_emissive = EMISSIVE_BLOCK_GENERIC - + pass_flags_self = PASSMOB vis_flags = VIS_INHERIT_PLANE //when this be added to vis_contents of something it inherit something.plane, important for visualisation of mob in openspace. attack_hand_is_action = TRUE diff --git a/code/modules/plumbing/plumbers/grinder_chemical.dm b/code/modules/plumbing/plumbers/grinder_chemical.dm index f39c79f906..1d216046e4 100644 --- a/code/modules/plumbing/plumbers/grinder_chemical.dm +++ b/code/modules/plumbing/plumbers/grinder_chemical.dm @@ -31,7 +31,7 @@ eat_dir = WEST return TRUE -/obj/machinery/plumbing/grinder_chemical/CanPass(atom/movable/AM) +/obj/machinery/plumbing/grinder_chemical/CanAllowThrough(atom/movable/AM) . = ..() if(!anchored) return diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index ff6cf99411..7c6b1cc922 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -100,10 +100,10 @@ return -/obj/machinery/field/CanPass(atom/movable/mover, turf/target) +/obj/machinery/field/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() if(hasShocked || isliving(mover) || ismachinery(mover) || isstructure(mover) || ismecha(mover)) return FALSE - return ..() /obj/machinery/field/proc/shock(mob/living/user) var/shock_damage = min(rand(30,40),rand(30,40)) diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 4d394401c4..7516092149 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -232,14 +232,14 @@ kinetic_gun = null return ..() -/obj/item/projectile/kinetic/prehit(atom/target) +/obj/item/projectile/kinetic/prehit_pierce(atom/target) . = ..() if(.) if(kinetic_gun) var/list/mods = kinetic_gun.get_modkits() for(var/obj/item/borg/upgrade/modkit/M in mods) M.projectile_prehit(src, target, kinetic_gun) - if(!lavaland_equipment_pressure_check(get_turf(target))) + if(!pressure_decrease_active && !lavaland_equipment_pressure_check(get_turf(target))) name = "weakened [name]" damage = damage * pressure_decrease pressure_decrease_active = TRUE diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm index 2ef974a450..ebc388a965 100644 --- a/code/modules/projectiles/guns/misc/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -427,11 +427,9 @@ var/aoe_mob_damage = 30 var/impact_structure_damage = 0 var/impact_direct_damage = 0 - var/turf/cached var/list/pierced = list() /obj/item/projectile/beam/beam_rifle/proc/AOE(turf/epicenter) - set waitfor = FALSE if(!epicenter) return new /obj/effect/temp_visual/explosion/fast(epicenter) @@ -447,31 +445,22 @@ continue O.take_damage(aoe_structure_damage * get_damage_coeff(O), BURN, "laser", FALSE) -/obj/item/projectile/beam/beam_rifle/proc/check_pierce(atom/target) - if(!do_pierce) - return FALSE - if(pierced[target]) //we already pierced them go away - return TRUE - if(isclosedturf(target)) - if(wall_pierce++ < wall_pierce_amount) - if(prob(wall_devastate)) - if(iswallturf(target)) - var/turf/closed/wall/W = target - W.dismantle_wall(TRUE, TRUE) - else - target.ex_act(EXPLODE_HEAVY) - return TRUE - if(ismovable(target)) - var/atom/movable/AM = target - if(AM.density && !AM.CanPass(src, get_turf(target)) && !ismob(AM)) - if(structure_pierce < structure_pierce_amount) - if(isobj(AM)) - var/obj/O = AM - O.take_damage((impact_structure_damage + aoe_structure_damage) * structure_bleed_coeff * get_damage_coeff(AM), BURN, "energy", FALSE) - pierced[AM] = TRUE - structure_pierce++ - return TRUE - return FALSE +/obj/item/projectile/beam/beam_rifle/proc/check_pierce(atom/A) + if(isclosedturf(A) && (wall_pierce < wall_pierce_amount)) + if(prob(wall_devastate)) + if(iswallturf(A)) + var/turf/closed/wall/W = A + W.dismantle_wall(TRUE, TRUE) + else + target.ex_act(EXPLODE_HEAVY) + ++wall_pierce + return PROJECTILE_PIERCE_PHASE // yeah this gun is a snowflakey piece of garbage - Silly-Cons + if(isobj(A) && (structure_pierce < structure_pierce_amount)) + ++structure_pierce + var/obj/O = A + O.take_damage((impact_structure_damage + aoe_structure_damage) * structure_bleed_coeff * get_damage_coeff(A), BURN, ENERGY, FALSE) + return PROJECTILE_PIERCE_PHASE // ditto and this could be refactored to on_hit honestly - Silly-Cons + return ..() /obj/item/projectile/beam/beam_rifle/proc/get_damage_coeff(atom/target) if(istype(target, /obj/machinery/door)) @@ -491,32 +480,18 @@ L.adjustFireLoss(impact_direct_damage) L.emote("scream") -/obj/item/projectile/beam/beam_rifle/proc/handle_hit(atom/target) +/obj/item/projectile/beam/beam_rifle/proc/handle_hit(atom/target, piercing_hit = FALSE) set waitfor = FALSE - if(!cached && !QDELETED(target)) - cached = get_turf(target) if(nodamage) return FALSE - playsound(cached, 'sound/effects/explosion3.ogg', 100, 1) - AOE(cached) + playsound(src, 'sound/effects/explosion3.ogg', 100, TRUE) + if(!piercing_hit) + AOE(get_turf(target) || get_turf(src)) if(!QDELETED(target)) handle_impact(target) -/obj/item/projectile/beam/beam_rifle/Bump(atom/target) - if(check_pierce(target)) - permutated += target - trajectory_ignore_forcemove = TRUE - forceMove(target.loc) - trajectory_ignore_forcemove = FALSE - return FALSE - if(!QDELETED(target)) - cached = get_turf(target) - . = ..() - -/obj/item/projectile/beam/beam_rifle/on_hit(atom/target, blocked = FALSE) - if(!QDELETED(target)) - cached = get_turf(target) - handle_hit(target) +/obj/projectile/beam/beam_rifle/on_hit(atom/target, blocked = FALSE, piercing_hit = FALSE) + handle_hit(target, piercing_hit) . = ..() /obj/item/projectile/beam/beam_rifle/hitscan @@ -547,6 +522,9 @@ hitscan_light_intensity = 0 hitscan_light_color_override = "#99ff99" -/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/prehit(atom/target) +/obj/projectile/beam/beam_rifle/hitscan/aiming_beam/prehit_pierce(atom/target) + return PROJECTILE_DELETE_WITHOUT_HITTING + +/obj/projectile/beam/beam_rifle/hitscan/aiming_beam/on_hit() qdel(src) - return FALSE + return BULLET_ACT_BLOCK diff --git a/code/modules/projectiles/guns/misc/blastcannon.dm b/code/modules/projectiles/guns/misc/blastcannon.dm index 64cffe52e7..b28c06a2c2 100644 --- a/code/modules/projectiles/guns/misc/blastcannon.dm +++ b/code/modules/projectiles/guns/misc/blastcannon.dm @@ -114,7 +114,8 @@ icon_state = "blastwave" damage = 0 nodamage = FALSE - movement_type = FLYING | UNSTOPPABLE + movement_type = FLYING + projectile_phasing = ALL // just blows up the turfs lmao - Silly-Cons var/heavyr = 0 var/mediumr = 0 var/lightr = 0 diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index ca07bde239..3fd1bce1ca 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -13,9 +13,9 @@ density = FALSE anchored = TRUE item_flags = ABSTRACT - pass_flags = PASSTABLE mouse_opacity = MOUSE_OPACITY_TRANSPARENT movement_type = FLYING + generic_canpass = FALSE animate_movement = NO_STEPS hitsound = 'sound/weapons/pierce.ogg' appearance_flags = PIXEL_SCALE @@ -40,6 +40,35 @@ var/time_offset = 0 var/datum/point/vector/trajectory var/trajectory_ignore_forcemove = FALSE //instructs forceMove to NOT reset our trajectory to the new location! + /// We already impacted these things, do not impact them again. Used to make sure we can pierce things we want to pierce. Lazylist, typecache style (object = TRUE) for performance. + var/list/impacted + /// If TRUE, we can hit our firer. + var/ignore_source_check = FALSE + /// We are flagged PHASING temporarily to not stop moving when we Bump something but want to keep going anyways. + var/temporary_unstoppable_movement = FALSE + + /** PROJECTILE PIERCING + * WARNING: + * Projectile piercing MUST be done using these variables. + * Ordinary passflags will be **IGNORED**. + * The two flag variables below both use pass flags. + * In the context of LETPASStHROW, it means the projectile will ignore things that are currently "in the air" from a throw. + * + * Also, projectiles sense hits using Bump(), and then pierce them if necessary. + * They simply do not follow conventional movement rules. + * NEVER flag a projectile as PHASING movement type. + * If you so badly need to make one go through *everything*, override check_pierce() for your projectile to always return PROJECTILE_PIERCE_PHASE/HIT. + */ + /// The "usual" flags of pass_flags is used in that can_hit_target ignores these unless they're specifically targeted/clicked on. This behavior entirely bypasses process_hit if triggered, rather than phasing which uses prehit_pierce() to check. + pass_flags = PASSTABLE + /// If FALSE, allow us to hit something directly targeted/clicked/whatnot even if we're able to phase through it + var/phasing_ignore_direct_target = FALSE + /// Bitflag for things the projectile should just phase through entirely - No hitting unless direct target and [phasing_ignore_direct_target] is FALSE. Uses pass_flags flags. + var/projectile_phasing = NONE + /// Bitflag for things the projectile should hit, but pierce through without deleting itself. Defers to projectile_phasing. Uses pass_flags flags. + var/projectile_piercing = NONE + /// number of times we've pierced something. Incremented BEFORE bullet_act and on_hit proc! + var/pierces = 0 /// "leftover" pixels for Range() calculation as pixel_move() was moved to simulated semi-pixel movement and Range() is in tiles. var/pixels_range_leftover = 0 /// "leftover" tick pixels and stuff yeah, so we don't round off things and introducing tracing inaccuracy. @@ -117,8 +146,6 @@ /// How many deciseconds are each hitscan movement considered. Used for homing and other things that use seconds for timing rather than ticks. var/hitscan_movement_decisecond_equivalency = 0.1 - var/ignore_source_check = FALSE - var/damage = 10 var/damage_type = BRUTE //BRUTE, BURN, TOX, OXY, CLONE are the only things that should be in here var/nodamage = 0 //Determines if the projectile will skip any damage inflictions @@ -150,8 +177,6 @@ var/impact_effect_type //what type of impact effect to show when hitting something var/log_override = FALSE //is this type spammed enough to not log? (KAs) - var/temporary_unstoppable_movement = FALSE - ///If defined, on hit we create an item of this type then call hitby() on the hit target with this, mainly used for embedding items (bullets) in targets var/shrapnel_type ///If TRUE, hit mobs even if they're on the floor and not our target @@ -167,7 +192,6 @@ /obj/item/projectile/Initialize() . = ..() - permutated = list() decayedRange = range if(embedding) updateEmbedding() @@ -201,10 +225,7 @@ else //when a limb is missing the damage is actually passed to the chest return BODY_ZONE_CHEST -/obj/item/projectile/proc/prehit(atom/target) - return TRUE - -/obj/item/projectile/proc/on_hit(atom/target, blocked = FALSE) +/obj/item/projectile/proc/on_hit(atom/target, blocked = FALSE, pierce_hit) if(fired_from) SEND_SIGNAL(fired_from, COMSIG_PROJECTILE_ON_HIT, firer, target, Angle) @@ -238,6 +259,11 @@ if(!isliving(target)) if(impact_effect_type && !hitscan) new impact_effect_type(target_loca, hitx, hity) + if(isturf(target) && hitsound_wall) + var/volume = clamp(vol_by_damage() + 20, 0, 100) + if(suppressed) + volume = 5 + playsound(loc, hitsound_wall, volume, TRUE, -1) return BULLET_ACT_HIT var/mob/living/L = target @@ -278,7 +304,7 @@ else if(hitsound) var/volume = vol_by_damage() - playsound(loc, hitsound, volume, 1, -1) + playsound(src, hitsound, volume, 1, -1) L.visible_message("[L] is hit by \a [src][organ_hit_text]!", \ "[L] is hit by \a [src][organ_hit_text]!", null, COMBAT_MESSAGE_RANGE) if(candink && def_zone == BODY_ZONE_HEAD) @@ -298,7 +324,7 @@ /obj/item/projectile/proc/vol_by_damage() if(src.damage) - return clamp((src.damage) * 0.67, 30, 100)// Multiply projectile damage by 0.67, then CLAMP the value between 30 and 100 + return clamp((src.damage) * 0.67, 30, 100) // Multiply projectile damage by 0.67, then CLAMP the value between 30 and 100 else return 50 //if the projectile doesn't do damage, play its hitsound at 50% volume @@ -327,95 +353,267 @@ beam_segments[beam_index] = null /obj/item/projectile/Bump(atom/A) - if(!trajectory) + SEND_SIGNAL(src, COMSIG_MOVABLE_BUMP, A) + if(!can_hit_target(A, A == original, TRUE)) return + Impact(A) + +/** + * Called when the projectile hits something + * This can either be from it bumping something, + * or it passing over a turf/being crossed and scanning that there is infact + * a valid target it needs to hit. + * This target isn't however necessarily WHAT it hits + * that is determined by process_hit and select_target. + * + * Furthermore, this proc shouldn't check can_hit_target - this should only be called if can hit target is already checked. + * Also, we select_target to find what to process_hit first. + */ +/obj/projectile/proc/Impact(atom/A) + if(!trajectory) + qdel(src) + return FALSE + if(impacted[A]) // NEVER doublehit - Silly-Cons + return FALSE + var/datum/point/pcache = trajectory.copy_to() var/turf/T = get_turf(A) if(check_ricochet_flag(A) && check_ricochet(A)) //if you can ricochet, attempt to ricochet off the object ricochets++ if(A.handle_ricochet(src)) on_ricochet(A) //if allowed, use autoaim to ricochet into someone, otherwise default to ricocheting off the object from above - var/datum/point/pcache = trajectory.copy_to() - if(hitscan) - store_hitscan_collision(pcache) + impacted = list() // Shoot a x-ray laser at a pair of mirrors I dare you + ignore_source_check = TRUE // Firer is no longer immune decayedRange = max(0, decayedRange - reflect_range_decrease) ricochet_chance *= ricochet_decay_chance damage *= ricochet_decay_damage range = decayedRange + if(hitscan) + store_hitscan_collision(pcache) return TRUE var/distance = get_dist(T, starting) // Get the distance between the turf shot from and the mob we hit and use that for the calculations. if(def_zone && check_zone(def_zone) != BODY_ZONE_CHEST) def_zone = ran_zone(def_zone, max(100-(7*distance), 5) * zone_accuracy_factor) //Lower accurancy/longer range tradeoff. 7 is a balanced number to use. - if(isturf(A) && hitsound_wall) - var/volume = clamp(vol_by_damage() + 20, 0, 100) - if(suppressed) - volume = 5 - playsound(loc, hitsound_wall, volume, 1, -1) + return process_hit(T, select_target(T, A)) // SELECT TARGET FIRST! - return process_hit(T, select_target(T, A)) - -#define QDEL_SELF 1 //Delete if we're not UNSTOPPABLE flagged non-temporarily -#define DO_NOT_QDEL 2 //Pass through. -#define FORCE_QDEL 3 //Force deletion. - -/obj/item/projectile/proc/process_hit(turf/T, atom/target, qdel_self, hit_something = FALSE) //probably needs to be reworked entirely when pixel movement is done. - if(QDELETED(src) || !T || !target) //We're done, nothing's left. - if((qdel_self == FORCE_QDEL) || ((qdel_self == QDEL_SELF) && !temporary_unstoppable_movement && !(movement_type & UNSTOPPABLE))) - qdel(src) +/** + * The primary workhorse proc of projectile impacts. + * This is a RECURSIVE call - process_hit is called on the first selected target, and then repeatedly called if the projectile still hasn't been deleted. + * + * Order of operations: + * 1. Checks if we are deleted, or if we're somehow trying to hit a null, in which case, bail out + * 2. Adds the thing we're hitting to impacted so we can make sure we don't doublehit + * 3. Checks piercing - stores this. + * Afterwards: + * Hit and delete, hit without deleting and pass through, pass through without hitting, or delete without hitting depending on result + * If we're going through without hitting, find something else to hit if possible and recurse, set unstoppable movement to true + * If we're deleting without hitting, delete and return + * Otherwise, send signal of COMSIG_PROJECTILE_PREHIT to target + * Then, hit, deleting ourselves if necessary. + * @params + * T - Turf we're on/supposedly hitting + * target - target we're hitting + * hit_something - only should be set by recursive calling by this proc - tracks if we hit something already + * + * Returns if we hit something. + * - Silly-Cons + */ +/obj/item/projectile/proc/process_hit(turf/T, atom/target, hit_something = FALSE) + // 1. + if(QDELETED(src) || !T || !target) + return + // 2. + impacted[target] = TRUE //hash lookup > in for performance in hit-checking + // 3. + var/mode = prehit_pierce(target) + if(mode == PROJECTILE_DELETE_WITHOUT_HITTING) + qdel(src) return hit_something - permutated |= target //Make sure we're never hitting it again. If we ever run into weirdness with piercing projectiles needing to hit something multiple times.. well.. that's a to-do. - if(!prehit(target)) - return process_hit(T, select_target(T), qdel_self, hit_something) //Hit whatever else we can since that didn't work. - var/result = target.bullet_act(src, def_zone) - if(result == BULLET_ACT_FORCE_PIERCE) - if(!(movement_type & UNSTOPPABLE)) + else if(mode == PROJECTILE_PIERCE_PHASE) + if(!(movement_type & PHASING)) temporary_unstoppable_movement = TRUE - movement_type |= UNSTOPPABLE - return process_hit(T, select_target(T), qdel_self, TRUE) //Hit whatever else we can since we're piercing through but we're still on the same tile. - else if(result == BULLET_ACT_TURF) //We hit the turf but instead we're going to also hit something else on it. - return process_hit(T, select_target(T), QDEL_SELF, TRUE) - else //Whether it hit or blocked, we're done! - qdel_self = QDEL_SELF - hit_something = TRUE - if((qdel_self == FORCE_QDEL) || ((qdel_self == QDEL_SELF) && !temporary_unstoppable_movement && !(movement_type & UNSTOPPABLE))) + movement_type |= PHASING + return process_hit(T, select_target(T, target), hit_something) // try to hit something else + // at this point we are going to hit the thing + // in which case send signal to it + SEND_SIGNAL(target, COMSIG_PROJECTILE_PREHIT, args) + if(mode == PROJECTILE_PIERCE_HIT) + ++pierces + hit_something = TRUE + var/result = target.bullet_act(src, def_zone, mode == PROJECTILE_PIERCE_HIT) + if((result == BULLET_ACT_FORCE_PIERCE) || (mode == PROJECTILE_PIERCE_HIT)) + if(!(movement_type & PHASING)) + temporary_unstoppable_movement = TRUE + movement_type |= PHASING + return process_hit(T, select_target(T, target), TRUE) qdel(src) return hit_something -#undef QDEL_SELF -#undef DO_NOT_QDEL -#undef FORCE_QDEL - -/obj/item/projectile/proc/select_target(turf/T, atom/target) //Select a target from a turf. - if((original in T) && can_hit_target(original, permutated, TRUE, TRUE)) +/** + * Selects a target to hit from a turf + * + * @params + * T - The turf + * target - The "preferred" atom to hit, usually what we Bumped() first. + * + * Priority: + * 0. Anything that is already in impacted is ignored no matter what. Furthermore, in any bracket, if the target atom parameter is in it, that's hit first. + * Furthermore, can_hit_target is always checked. This (entire proc) is PERFORMANCE OVERHEAD!! But, it shouldn't be ""too"" bad and I frankly don't have a better *generic non snowflakey* way that I can think of right now at 3 AM. + * FURTHERMORE, mobs/objs have a density check from can_hit_target - to hit non dense objects over a turf, you must click on them, same for mobs that usually wouldn't get hit. + * 1. The thing originally aimed at/clicked on + * 2. Mobs - picks lowest buckled mob to prevent scarp piggybacking memes + * 3. Objs + * 4. Turf + * 5. Nothing + */ +/obj/projectile/proc/select_target(turf/T, atom/target) + // 1. original + if(can_hit_target(original, TRUE, FALSE)) return original - if(target && can_hit_target(target, permutated, target == original, TRUE)) - return target - var/list/mob/living/possible_mobs = typecache_filter_list(T, GLOB.typecache_mob) - var/list/mob/mobs = list() - for(var/mob/living/M in possible_mobs) - if(!can_hit_target(M, permutated, M == original, TRUE)) + var/list/atom/possible = list() // let's define these ONCE + var/list/atom/considering = list() + // 2. mobs + possible = typecache_filter_list(T, GLOB.typecache_living) // living only + for(var/i in possible) + if(!can_hit_target(i, i == original, TRUE)) continue - mobs += M - var/mob/M = safepick(mobs) - if(M) + considering += i + if(considering.len) + var/mob/living/M = pick(considering) return M.lowest_buckled_mob() - var/list/obj/possible_objs = typecache_filter_list(T, GLOB.typecache_machine_or_structure) - var/list/obj/objs = list() - for(var/obj/O in possible_objs) - if(!can_hit_target(O, permutated, O == original, TRUE)) + considering.len = 0 + // 3. objs + possible = typecache_filter_list(T, GLOB.typecache_machine_or_structure) // because why are items ever dense? + for(var/i in possible) + if(!can_hit_target(i, i == original, TRUE)) continue - objs += O - var/obj/O = safepick(objs) - if(O) - if(length(O.buckled_mobs)) - return pick(O.buckled_mobs) - return O - //Nothing else is here that we can hit, hit the turf if we haven't. - if(!(T in permutated) && can_hit_target(T, permutated, T == original, TRUE)) + considering += i + if(considering.len) + return pick(considering) + // 4. turf + if(can_hit_target(T, T == original, TRUE)) return T - //Returns null if nothing at all was found. + // 5. nothing + // (returns null) +//Returns true if the target atom is on our current turf and above the right layer +//If direct target is true it's the originally clicked target. +/obj/projectile/proc/can_hit_target(atom/target, direct_target = FALSE, ignore_loc = FALSE) + if(QDELETED(target) || impacted[target]) + return FALSE + if(!ignore_loc && (loc != target.loc)) + return FALSE + // if pass_flags match, pass through entirely + if(target.pass_flags_self & pass_flags) // phasing + return FALSE + if(!ignore_source_check && firer) + var/mob/M = firer + if((target == firer) || ((target == firer.loc) && ismecha(firer.loc)) || (target in firer.buckled_mobs) || (istype(M) && (M.buckled == target))) + return FALSE + if(target.density) //This thing blocks projectiles, hit it regardless of layer/mob stuns/etc. + return TRUE + if(!isliving(target)) + if(isturf(target)) // non dense turfs + return FALSE + if(target.layer < PROJECTILE_HIT_THRESHHOLD_LAYER) + return FALSE + else if(!direct_target) // non dense objects do not get hit unless specifically clicked + return FALSE + else + var/mob/living/L = target + if(direct_target) + return TRUE + // If target not able to use items, move and stand - or if they're just dead, pass over. + if(L.stat == DEAD || (!hit_stunned_targets && HAS_TRAIT(L, TRAIT_IMMOBILIZED) && HAS_TRAIT(L, TRAIT_FLOORED) && HAS_TRAIT(L, TRAIT_HANDS_BLOCKED))) + return FALSE + return TRUE + +/** + * Scan if we should hit something and hit it if we need to + * The difference between this and handling in Impact is + * In this we strictly check if we need to Impact() something in specific + * If we do, we do + * We don't even check if it got hit already - Impact() does that + * In impact there's more code for selecting WHAT to hit + * So this proc is more of checking if we should hit something at all BY having an atom cross us. + */ +/obj/projectile/proc/scan_crossed_hit(atom/movable/A) + if(can_hit_target(A, direct_target = (A == original))) + Impact(A) + +/** + * Scans if we should hit something on the turf we just moved to if we haven't already + * + * This proc is a little high in overhead but allows us to not snowflake CanPass in living and other things. + */ +/obj/projectile/proc/scan_moved_turf() + // Optimally, we scan: mobs --> objs --> turf for impact + // but, overhead is a thing and 2 for loops every time it moves is a no-go. + // realistically, since we already do select_target in impact, we can not do that + // and hope projectiles get refactored again in the future to have a less stupid impact detection system + // that hopefully won't also involve a ton of overhead + if(can_hit_target(original, TRUE, FALSE)) + Impact(original) // try to hit thing clicked on + // else, try to hit mobs + else // because if we impacted original and pierced we'll already have select target'd and hit everything else we should be hitting + for(var/mob/M in loc) // so I guess we're STILL doing a for loop of mobs because living movement would otherwise have snowflake code for projectile CanPass + // so the snowflake vs performance is pretty arguable here + if(can_hit_target(M, M == original, TRUE)) + Impact(M) + break + +/** + * Projectile crossed: When something enters a projectile's tile, make sure the projectile hits it if it should be hitting it. + */ +/obj/projectile/Crossed(atom/movable/AM) + . = ..() + scan_crossed_hit(AM) + +/** + * Projectile can pass through + * Used to not even attempt to Bump() or fail to Cross() anything we already hit. + */ +/obj/projectile/CanPassThrough(atom/blocker, turf/target, blocker_opinion) + return impacted[blocker]? TRUE : ..() + +/** + * Projectile moved: + * + * If not fired yet, do not do anything. Else, + * + * If temporary unstoppable movement used for piercing through things we already hit (impacted list) is set, unset it. + * Scan turf we're now in for anything we can/should hit. This is useful for hitting non dense objects the user + * directly clicks on, as well as for PHASING projectiles to be able to hit things at all as they don't ever Bump(). + */ +/obj/projectile/Moved(atom/OldLoc, Dir) + . = ..() + if(!fired) + return + if(temporary_unstoppable_movement) + temporary_unstoppable_movement = FALSE + movement_type &= ~PHASING + scan_moved_turf() //mostly used for making sure we can hit a non-dense object the user directly clicked on, and for penetrating projectiles that don't bump + +/** + * Checks if we should pierce something. + * + * NOT meant to be a pure proc, since this replaces prehit() which was used to do things. + * Return PROJECTILE_DELETE_WITHOUT_HITTING to delete projectile without hitting at all! + */ +/obj/projectile/proc/prehit_pierce(atom/A) + if(projectile_phasing & A.pass_flags_self) + return PROJECTILE_PIERCE_PHASE + if(projectile_piercing & A.pass_flags_self) + return PROJECTILE_PIERCE_HIT + if(ismovable(A)) + var/atom/movable/AM = A + if(AM.throwing) + return (projectile_phasing & LETPASSTHROW)? PROJECTILE_PIERCE_PHASE : ((projectile_piercing & LETPASSTHROW)? PROJECTILE_PIERCE_HIT : PROJECTILE_PIERCE_NONE) + return PROJECTILE_PIERCE_NONE + +/**INeedAnAdult I am unsure what the fuck is going on in here and I'll have to get clairification on this shit. + */ /obj/item/projectile/proc/check_ricochet(atom/A) if(ricochets > ricochets_max) //safety thing, we don't care about what the other thing says about this. return FALSE @@ -484,11 +682,10 @@ AddElement(/datum/element/embed, projectile_payload = shrapnel_type) if(!log_override && firer && original) log_combat(firer, original, "fired at", src, "from [get_area_name(src, TRUE)]") - if(direct_target) - if(prehit(direct_target)) - direct_target.bullet_act(src, def_zone) - qdel(src) - return + if(direct_target && (get_dist(direct_target, get_turf(src)) <= 1)) // point blank shots + process_hit(get_turf(direct_target), direct_target) + if(QDELETED(src)) + return if(isnum(angle)) setAngle(angle) if(spread) @@ -506,6 +703,7 @@ var/matrix/M = new M.Turn(Angle) transform = M + LAZYINITLIST(impacted) trajectory_ignore_forcemove = TRUE forceMove(starting) set_light(fired_light_range, fired_light_intensity, fired_light_color) @@ -544,6 +742,8 @@ if(zc) before_z_change(old, target) . = ..() + if(QDELETED(src)) // we coulda bumped something + return if(trajectory && !trajectory_ignore_forcemove && isturf(target)) if(hitscan) finalize_hitscan_and_generate_tracers(FALSE) @@ -678,30 +878,6 @@ if(prob(50)) homing_offset_y = -homing_offset_y -//Returns true if the target atom is on our current turf and above the right layer -//If direct target is true it's the originally clicked target. -/obj/item/projectile/proc/can_hit_target(atom/target, list/passthrough, direct_target = FALSE, ignore_loc = FALSE) - if(QDELETED(target)) - return FALSE - if(!ignore_source_check && firer) - var/mob/M = firer - if((target == firer) || ((target == firer.loc) && ismecha(firer.loc)) || (target in firer.buckled_mobs) || (istype(M) && (M.buckled == target))) - if(!ricochets) //if it has ricocheted, it can hit the firer. - return FALSE - if(!ignore_loc && (loc != target.loc)) - return FALSE - if(target in passthrough) - return FALSE - if(target.density) //This thing blocks projectiles, hit it regardless of layer/mob stuns/etc. - return TRUE - if(!isliving(target)) - if(target.layer < PROJECTILE_HIT_THRESHHOLD_LAYER) - return FALSE - else - var/mob/living/L = target - if(!direct_target && !L.density) - return FALSE - return TRUE //Spread is FORCED! /obj/item/projectile/proc/preparePixelProjectile(atom/target, atom/source, params, spread = 0) @@ -762,22 +938,6 @@ angle = arctan(y - oy, x - ox) return list(angle, p_x, p_y) -/obj/item/projectile/Crossed(atom/movable/AM) //A mob moving on a tile with a projectile is hit by it. - . = ..() - if(isliving(AM) && !(pass_flags & PASSMOB)) - var/mob/living/L = AM - if(can_hit_target(L, permutated, (AM == original))) - Bump(AM) - -/obj/item/projectile/Move(atom/newloc, dir = NONE) - . = ..() - if(.) - if(temporary_unstoppable_movement) - temporary_unstoppable_movement = FALSE - movement_type &= ~(UNSTOPPABLE) - if(fired && can_hit_target(original, permutated, TRUE)) - Bump(original) - /obj/item/projectile/Destroy() STOP_PROCESSING(SSprojectiles, src) if(hitscan) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 79e9ab8b4b..a74a71d141 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -166,7 +166,7 @@ /obj/item/projectile/beam/lasertag/mag //the projectile, compatible with regular laser tag armor icon_state = "magjectile-toy" name = "lasertag magbolt" - movement_type = FLYING | UNSTOPPABLE //for penetration memes + movement_type = FLYING | PHASING //for penetration memes range = 5 //so it isn't super annoying light_range = 2 light_color = LIGHT_COLOR_YELLOW diff --git a/code/modules/projectiles/projectile/bullets/ferromagnetic.dm b/code/modules/projectiles/projectile/bullets/ferromagnetic.dm index 03482e2a9d..1ba6ba7b79 100644 --- a/code/modules/projectiles/projectile/bullets/ferromagnetic.dm +++ b/code/modules/projectiles/projectile/bullets/ferromagnetic.dm @@ -28,7 +28,7 @@ damage = 10 armour_penetration = 20 stamina = 10 - movement_type = FLYING | UNSTOPPABLE + movement_type = FLYING | PHASING range = 6 fired_light_range = 1 fired_light_color = LIGHT_COLOR_RED @@ -37,7 +37,7 @@ icon_state = "magjectile-large" damage = 10 armour_penetration = 20 - movement_type = FLYING | UNSTOPPABLE + movement_type = FLYING | PHASING range = 20 pixels_per_second = TILES_TO_PIXELS(12.5) fired_light_range = 4 diff --git a/code/modules/projectiles/projectile/bullets/sniper.dm b/code/modules/projectiles/projectile/bullets/sniper.dm index f69b62a149..80edd716b5 100644 --- a/code/modules/projectiles/projectile/bullets/sniper.dm +++ b/code/modules/projectiles/projectile/bullets/sniper.dm @@ -35,7 +35,8 @@ icon_state = "gauss" name = "penetrator round" damage = 60 - movement_type = FLYING | UNSTOPPABLE + projectile_piercing = PASSMOB + projectile_phasing = (ALL & (~PASSMOB)) dismemberment = 0 //It goes through you cleanly. knockdown = 0 breakthings = FALSE diff --git a/code/modules/projectiles/projectile/bullets/special.dm b/code/modules/projectiles/projectile/bullets/special.dm index a0414d8a9c..76ba76fbfe 100644 --- a/code/modules/projectiles/projectile/bullets/special.dm +++ b/code/modules/projectiles/projectile/bullets/special.dm @@ -3,7 +3,8 @@ /obj/item/projectile/bullet/honker damage = 0 knockdown = 60 - movement_type = FLYING | UNSTOPPABLE + movement_type = FLYING + projectile_piercing = ALL nodamage = TRUE candink = FALSE hitsound = 'sound/items/bikehorn.ogg' diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 76cd1a6bc5..21af43478a 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -344,18 +344,17 @@ var/created = FALSE //prevents creation of more then one locker if it has multiple hits var/locker_suck = TRUE -/obj/item/projectile/magic/locker/prehit(atom/A) +/obj/item/projectile/magic/locker/prehit_pierce(atom/A) + . = ..() if(ismob(A) && locker_suck) var/mob/M = A - if(M.anti_magic_check()) + if(M.anti_magic_check()) // no this doesn't check if ..() returned to phase through do I care no it's magic ain't gotta explain shit - Silly-Cons M.visible_message("[src] vanishes on contact with [A]!") - qdel(src) - return + return PROJECTILE_DELETE_WITHOUT_HITTING if(M.anchored) - return ..() + return M.forceMove(src) - return FALSE - return ..() + return PROJECTILE_PIERCE_PHASE /obj/item/projectile/magic/locker/on_hit(target) if(created) diff --git a/code/modules/projectiles/projectile/special/curse.dm b/code/modules/projectiles/projectile/special/curse.dm index 6c682763ae..36c27ac0e1 100644 --- a/code/modules/projectiles/projectile/special/curse.dm +++ b/code/modules/projectiles/projectile/special/curse.dm @@ -12,7 +12,6 @@ knockdown = 20 pixels_per_second = TILES_TO_PIXELS(5) range = 16 - movement_type = FLYING | UNSTOPPABLE var/datum/beam/arm var/handedness = 0 @@ -29,18 +28,14 @@ arm = starting.Beam(src, icon_state = "curse[handedness]", time = INFINITY, maxdistance = INFINITY, beam_type=/obj/effect/ebeam/curse_arm) ..() -/obj/item/projectile/curse_hand/prehit(atom/target) - if(target == original) - movement_type &= ~(UNSTOPPABLE) - else if(!isturf(target)) - return FALSE - return ..() +/obj/projectile/curse_hand/prehit_pierce(atom/target) + return (target == original)? PROJECTILE_PIERCE_NONE : PROJECTILE_PIERCE_PHASE /obj/item/projectile/curse_hand/Destroy() if(arm) arm.End() arm = null - if((movement_type & UNSTOPPABLE)) + if((movement_type & PHASING)) playsound(src, 'sound/effects/curse3.ogg', 25, 1, -1) var/turf/T = get_step(src, dir) var/obj/effect/temp_visual/dir_setting/curse/hand/leftover = new(T, dir) diff --git a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm index d62b3c2611..54e07d24e5 100644 --- a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm +++ b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm @@ -59,10 +59,10 @@ /obj/structure/necropolis_gate/singularity_pull() return 0 -/obj/structure/necropolis_gate/CanPass(atom/movable/mover, turf/target) - if(get_dir(loc, target) == dir) - return !density - return 1 +/obj/structure/necropolis_gate/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() + if(!(get_dir(loc, target) == dir)) + return TRUE /obj/structure/necropolis_gate/CheckExit(atom/movable/O, target) if(get_dir(O.loc, target) == dir) diff --git a/code/modules/ruins/objects_and_mobs/sin_ruins.dm b/code/modules/ruins/objects_and_mobs/sin_ruins.dm index 5e2fc3d7e4..da6179197c 100644 --- a/code/modules/ruins/objects_and_mobs/sin_ruins.dm +++ b/code/modules/ruins/objects_and_mobs/sin_ruins.dm @@ -80,7 +80,8 @@ icon = 'icons/mob/blob.dmi' color = rgb(145, 150, 0) -/obj/effect/gluttony/CanPass(atom/movable/mover, turf/target)//So bullets will fly over and stuff. +/obj/effect/gluttony/CanAllowThrough(atom/movable/mover, turf/target)//So bullets will fly over and stuff. + . = ..() if(ishuman(mover)) var/mob/living/carbon/human/H = mover if(H.nutrition >= NUTRITION_LEVEL_FAT) @@ -90,8 +91,6 @@ to_chat(H, "You're repulsed by even looking at [src]. Only a pig could force themselves to go through it.") if(istype(mover, /mob/living/simple_animal/hostile/morph)) return TRUE - else - return FALSE /obj/structure/mirror/magic/pride //Pride's mirror: Used in the Pride ruin. name = "pride's mirror" diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm index 05450fd7c2..274efcda5a 100644 --- a/code/modules/shuttle/special.dm +++ b/code/modules/shuttle/special.dm @@ -212,15 +212,14 @@ var/static/list/check_times = list() -/obj/effect/forcefield/luxury_shuttle/CanPass(atom/movable/mover, turf/target) +/obj/effect/forcefield/luxury_shuttle/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() if(mover in approved_passengers) return TRUE if(!isliving(mover)) //No stowaways return FALSE - return FALSE - #define LUXURY_MESSAGE_COOLDOWN 100 /obj/effect/forcefield/luxury_shuttle/Bumped(atom/movable/AM) diff --git a/code/modules/spells/spell_types/forcewall.dm b/code/modules/spells/spell_types/forcewall.dm index e0c21066cf..be7bb4cbd3 100644 --- a/code/modules/spells/spell_types/forcewall.dm +++ b/code/modules/spells/spell_types/forcewall.dm @@ -30,11 +30,11 @@ . = ..() wizard = summoner -/obj/effect/forcefield/wizard/CanPass(atom/movable/mover, turf/target) +/obj/effect/forcefield/wizard/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() if(mover == wizard) return TRUE if(ismob(mover)) var/mob/M = mover if(M.anti_magic_check(chargecost = 0)) return TRUE - return FALSE diff --git a/code/modules/vehicles/ridden.dm b/code/modules/vehicles/ridden.dm index f71d9367d3..28b79a1599 100644 --- a/code/modules/vehicles/ridden.dm +++ b/code/modules/vehicles/ridden.dm @@ -4,6 +4,7 @@ max_buckled_mobs = 1 buckle_lying = FALSE default_driver_move = FALSE + pass_flags_self = PASSTABLE var/legs_required = 1 var/arms_required = 0 //why not? From c5be81c589a16ff0f5af9a3635e69af466e074fb Mon Sep 17 00:00:00 2001 From: Solaris-Shade <73904284+Solaris-Shade@users.noreply.github.com> Date: Sun, 6 Mar 2022 16:29:58 -0500 Subject: [PATCH 03/53] tg moved projectiles out of /item, added '/item' back --- .../effects/effect_system/effects_smoke.dm | 4 ++-- code/game/objects/structures/girders.dm | 2 +- code/game/objects/structures/grille.dm | 2 +- .../projectiles/guns/misc/beam_rifle.dm | 6 +++--- code/modules/projectiles/projectile.dm | 18 +++++++++--------- .../projectiles/projectile/special/curse.dm | 2 +- code/modules/unit_tests/projectiles.dm | 2 +- 7 files changed, 18 insertions(+), 18 deletions(-) diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index db1b9d5b2b..43d55a5756 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -135,8 +135,8 @@ /obj/effect/particle_effect/smoke/bad/Crossed(atom/movable/AM, oldloc) . = ..() - if(istype(AM, /obj/projectile/beam)) - var/obj/projectile/beam/B = AM + if(istype(AM, /obj/item/projectile/beam)) + var/obj/item/projectile/beam/B = AM B.damage = (B.damage/2) /datum/effect_system/smoke_spread/bad diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 3e6884613e..7e3d0262e1 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -298,7 +298,7 @@ /obj/structure/girder/CanAllowThrough(atom/movable/mover, turf/target) . = ..() - if((mover.pass_flags & PASSGRILLE) || istype(mover, /obj/projectile)) + if((mover.pass_flags & PASSGRILLE) || istype(mover, /obj/item/projectile)) return prob(girderpasschance) /obj/structure/girder/CanAStarPass(ID, dir, caller) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 54dce18d44..29817e3d58 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -127,7 +127,7 @@ /obj/structure/grille/CanAllowThrough(atom/movable/mover, turf/target) . = ..() - if(!. && istype(mover, /obj/projectile)) + if(!. && istype(mover, /obj/item/projectile)) return prob(30) /obj/structure/grille/CanAStarPass(ID, dir, caller) diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm index ebc388a965..cf64ae364e 100644 --- a/code/modules/projectiles/guns/misc/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -490,7 +490,7 @@ if(!QDELETED(target)) handle_impact(target) -/obj/projectile/beam/beam_rifle/on_hit(atom/target, blocked = FALSE, piercing_hit = FALSE) +/obj/item/projectile/beam/beam_rifle/on_hit(atom/target, blocked = FALSE, piercing_hit = FALSE) handle_hit(target, piercing_hit) . = ..() @@ -522,9 +522,9 @@ hitscan_light_intensity = 0 hitscan_light_color_override = "#99ff99" -/obj/projectile/beam/beam_rifle/hitscan/aiming_beam/prehit_pierce(atom/target) +/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/prehit_pierce(atom/target) return PROJECTILE_DELETE_WITHOUT_HITTING -/obj/projectile/beam/beam_rifle/hitscan/aiming_beam/on_hit() +/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/on_hit() qdel(src) return BULLET_ACT_BLOCK diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 3fd1bce1ca..4d567e8767 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -369,7 +369,7 @@ * Furthermore, this proc shouldn't check can_hit_target - this should only be called if can hit target is already checked. * Also, we select_target to find what to process_hit first. */ -/obj/projectile/proc/Impact(atom/A) +/obj/item/projectile/proc/Impact(atom/A) if(!trajectory) qdel(src) return FALSE @@ -467,7 +467,7 @@ * 4. Turf * 5. Nothing */ -/obj/projectile/proc/select_target(turf/T, atom/target) +/obj/item/projectile/proc/select_target(turf/T, atom/target) // 1. original if(can_hit_target(original, TRUE, FALSE)) return original @@ -499,7 +499,7 @@ //Returns true if the target atom is on our current turf and above the right layer //If direct target is true it's the originally clicked target. -/obj/projectile/proc/can_hit_target(atom/target, direct_target = FALSE, ignore_loc = FALSE) +/obj/item/projectile/proc/can_hit_target(atom/target, direct_target = FALSE, ignore_loc = FALSE) if(QDELETED(target) || impacted[target]) return FALSE if(!ignore_loc && (loc != target.loc)) @@ -538,7 +538,7 @@ * In impact there's more code for selecting WHAT to hit * So this proc is more of checking if we should hit something at all BY having an atom cross us. */ -/obj/projectile/proc/scan_crossed_hit(atom/movable/A) +/obj/item/projectile/proc/scan_crossed_hit(atom/movable/A) if(can_hit_target(A, direct_target = (A == original))) Impact(A) @@ -547,7 +547,7 @@ * * This proc is a little high in overhead but allows us to not snowflake CanPass in living and other things. */ -/obj/projectile/proc/scan_moved_turf() +/obj/item/projectile/proc/scan_moved_turf() // Optimally, we scan: mobs --> objs --> turf for impact // but, overhead is a thing and 2 for loops every time it moves is a no-go. // realistically, since we already do select_target in impact, we can not do that @@ -566,7 +566,7 @@ /** * Projectile crossed: When something enters a projectile's tile, make sure the projectile hits it if it should be hitting it. */ -/obj/projectile/Crossed(atom/movable/AM) +/obj/item/projectile/Crossed(atom/movable/AM) . = ..() scan_crossed_hit(AM) @@ -574,7 +574,7 @@ * Projectile can pass through * Used to not even attempt to Bump() or fail to Cross() anything we already hit. */ -/obj/projectile/CanPassThrough(atom/blocker, turf/target, blocker_opinion) +/obj/item/projectile/CanPassThrough(atom/blocker, turf/target, blocker_opinion) return impacted[blocker]? TRUE : ..() /** @@ -586,7 +586,7 @@ * Scan turf we're now in for anything we can/should hit. This is useful for hitting non dense objects the user * directly clicks on, as well as for PHASING projectiles to be able to hit things at all as they don't ever Bump(). */ -/obj/projectile/Moved(atom/OldLoc, Dir) +/obj/item/projectile/Moved(atom/OldLoc, Dir) . = ..() if(!fired) return @@ -601,7 +601,7 @@ * NOT meant to be a pure proc, since this replaces prehit() which was used to do things. * Return PROJECTILE_DELETE_WITHOUT_HITTING to delete projectile without hitting at all! */ -/obj/projectile/proc/prehit_pierce(atom/A) +/obj/item/projectile/proc/prehit_pierce(atom/A) if(projectile_phasing & A.pass_flags_self) return PROJECTILE_PIERCE_PHASE if(projectile_piercing & A.pass_flags_self) diff --git a/code/modules/projectiles/projectile/special/curse.dm b/code/modules/projectiles/projectile/special/curse.dm index 36c27ac0e1..89b1ecba4c 100644 --- a/code/modules/projectiles/projectile/special/curse.dm +++ b/code/modules/projectiles/projectile/special/curse.dm @@ -28,7 +28,7 @@ arm = starting.Beam(src, icon_state = "curse[handedness]", time = INFINITY, maxdistance = INFINITY, beam_type=/obj/effect/ebeam/curse_arm) ..() -/obj/projectile/curse_hand/prehit_pierce(atom/target) +/obj/item/projectile/curse_hand/prehit_pierce(atom/target) return (target == original)? PROJECTILE_PIERCE_NONE : PROJECTILE_PIERCE_PHASE /obj/item/projectile/curse_hand/Destroy() diff --git a/code/modules/unit_tests/projectiles.dm b/code/modules/unit_tests/projectiles.dm index 53ceef01d6..f1a2391c07 100644 --- a/code/modules/unit_tests/projectiles.dm +++ b/code/modules/unit_tests/projectiles.dm @@ -1,5 +1,5 @@ /datum/unit_test/projectile_movetypes/Run() for(var/path in typesof(/obj/item/projectile)) - var/obj/projectile/projectile = path + var/obj/item/projectile/projectile = path if(initial(projectile.movement_type) & PHASING) Fail("[path] has default movement type PHASING. Piercing projectiles should be done using the projectile piercing system, not movement_types!") From 171bd18c8ab35c468e203e330b429b5dea5aa74f Mon Sep 17 00:00:00 2001 From: Solaris-Shade <73904284+Solaris-Shade@users.noreply.github.com> Date: Fri, 11 Mar 2022 22:23:01 -0500 Subject: [PATCH 04/53] Updated Projectile code some more. --- code/__DEFINES/_flags/_flags.dm | 2 + code/game/atoms.dm | 4 +- code/game/machinery/_machinery.dm | 8 ++- code/game/machinery/doors/door.dm | 2 + code/game/machinery/doors/windowdoor.dm | 2 +- code/game/objects/structures.dm | 6 ++ code/game/objects/structures/holosign.dm | 29 ++++----- code/modules/antagonists/blob/blob/theblob.dm | 2 +- .../guns/energy/kinetic_accelerator.dm | 19 +++--- .../projectiles/guns/misc/beam_rifle.dm | 8 +-- code/modules/projectiles/projectile.dm | 62 +++++++++++-------- code/modules/projectiles/projectile/beams.dm | 2 +- 12 files changed, 83 insertions(+), 63 deletions(-) diff --git a/code/__DEFINES/_flags/_flags.dm b/code/__DEFINES/_flags/_flags.dm index 99c9b293fb..c1d997eaa0 100644 --- a/code/__DEFINES/_flags/_flags.dm +++ b/code/__DEFINES/_flags/_flags.dm @@ -106,6 +106,8 @@ GLOBAL_LIST_INIT(bitflags, list( #define PASSCLOSEDTURF (1<<5) /// Let thrown things past us. **ONLY MEANINGFUL ON pass_flags_self!** #define LETPASSTHROW (1<<6) +#define PASSMACHINE (1<<7) +#define PASSSTRUCTURE (1<<8) //Movement Types #define GROUND (1<<0) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index e4b7507560..f49dae2bb4 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -278,7 +278,7 @@ return TRUE /atom/proc/CanPass(atom/movable/mover, turf/target) - SHOULD_CALL_PARENT(TRUE) + //SHOULD_CALL_PARENT(TRUE) if(mover.movement_type & PHASING) return TRUE . = CanAllowThrough(mover, target) @@ -288,7 +288,7 @@ /// Returns true or false to allow the mover to move through src /atom/proc/CanAllowThrough(atom/movable/mover, turf/target) - SHOULD_CALL_PARENT(TRUE) + //SHOULD_CALL_PARENT(TRUE) if(mover.pass_flags & pass_flags_self) return TRUE if(mover.throwing && (pass_flags_self & LETPASSTHROW)) diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 675d54ef22..70794915bc 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -90,7 +90,7 @@ Class Procs: verb_say = "beeps" verb_yell = "blares" pressure_resistance = 15 - pass_flags_self = PASSMACHINE + pass_flags_self = PASSMACHINE max_integrity = 200 layer = BELOW_OBJ_LAYER //keeps shit coming out of the machine from ending up underneath it. flags_1 = DEFAULT_RICOCHET_1 @@ -449,6 +449,12 @@ Class Procs: update_icon() updateUsrDialog() +/obj/machinery/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() + + if(mover.pass_flags & PASSMACHINE) + return TRUE + /obj/machinery/proc/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/I) if(!(flags_1 & NODECONSTRUCT_1) && I.tool_behaviour == TOOL_SCREWDRIVER) I.play_tool_sound(src, 50) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 71df6affb7..ce84b8e8c6 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -129,6 +129,8 @@ /obj/machinery/door/CanAllowThrough(atom/movable/mover, turf/target) . = ..() + if(.) + return // Snowflake handling for PASSGLASS. if(istype(mover) && (mover.pass_flags & PASSGLASS)) diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 5027e46aa0..3fc5363459 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -134,7 +134,7 @@ return !density || (dir != to_dir) || (check_access(ID) && hasPower()) /obj/machinery/door/window/CheckExit(atom/movable/mover, turf/target) - if((pass_flags_self & mover.pass_flags)) || ((pass_flags_self & LETPASSTHROW) && mover.throwing)) + if((pass_flags_self & mover.pass_flags) || ((pass_flags_self & LETPASSTHROW) && mover.throwing)) return TRUE if(get_dir(loc, target) == dir) return !density diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index a8f0739bed..8cfb1068d4 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -104,6 +104,12 @@ if(examine_status) . += examine_status +/obj/structure/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() + + if(mover.pass_flags & PASSSTRUCTURE) + return TRUE + /obj/structure/proc/examine_status(mob/user) //An overridable proc, mostly for falsewalls. var/healthpercent = (obj_integrity/max_integrity) * 100 switch(healthpercent) diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index 26dedf3b62..95970f369d 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -149,26 +149,21 @@ . += "The biometric scanners are [force_allaccess ? "off" : "on"]." /obj/structure/holosign/barrier/medical/CanAllowThrough(atom/movable/mover, turf/target) - . = ..() + icon_state = "holo_medical" if(force_allaccess) return TRUE if(ishuman(mover)) - - return CheckHuman(mover) - -/obj/structure/holosign/barrier/medical/Bumped(atom/movable/AM) - . = ..() - icon_state = "holo_medical" - if(ishuman(AM) && !CheckHuman(AM)) - if(buzzcd < world.time) - playsound(get_turf(src),'sound/machines/buzz-sigh.ogg',65,TRUE,4) - buzzcd = (world.time + 60) - icon_state = "holo_medical-deny" - -/obj/structure/holosign/barrier/medical/proc/CheckHuman(mob/living/carbon/human/sickboi) - var/threat = sickboi.check_virus() - if(get_disease_severity_value(threat) > get_disease_severity_value(DISEASE_SEVERITY_MINOR)) - return FALSE + var/mob/living/carbon/human/sickboi = mover + var/threat = sickboi.check_virus() + switch(threat) + if(DISEASE_SEVERITY_MINOR, DISEASE_SEVERITY_MEDIUM, DISEASE_SEVERITY_HARMFUL, DISEASE_SEVERITY_DANGEROUS, DISEASE_SEVERITY_BIOHAZARD) + if(buzzcd < world.time) + playsound(get_turf(src),'sound/machines/buzz-sigh.ogg',65,TRUE,4) + buzzcd = (world.time + 60) + icon_state = "holo_medical-deny" + return FALSE + else + return TRUE //nice or benign diseases! return TRUE /obj/structure/holosign/barrier/medical/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags) diff --git a/code/modules/antagonists/blob/blob/theblob.dm b/code/modules/antagonists/blob/blob/theblob.dm index 7651093ea1..5d8086816a 100644 --- a/code/modules/antagonists/blob/blob/theblob.dm +++ b/code/modules/antagonists/blob/blob/theblob.dm @@ -4,7 +4,7 @@ icon = 'icons/mob/blob.dmi' light_range = 2 desc = "A thick wall of writhing tendrils." - density = FALSE //this being false causes two bugs, being able to attack blob tiles behind other blobs and being unable to move on blob tiles in no gravity, but turning it to 1 causes the blob mobs to be unable to path through blobs, which is probably worse. + density = TRUE opacity = 0 anchored = TRUE layer = BELOW_MOB_LAYER diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 7516092149..4d6d9bd6c7 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -234,15 +234,16 @@ /obj/item/projectile/kinetic/prehit_pierce(atom/target) . = ..() - if(.) - if(kinetic_gun) - var/list/mods = kinetic_gun.get_modkits() - for(var/obj/item/borg/upgrade/modkit/M in mods) - M.projectile_prehit(src, target, kinetic_gun) - if(!pressure_decrease_active && !lavaland_equipment_pressure_check(get_turf(target))) - name = "weakened [name]" - damage = damage * pressure_decrease - pressure_decrease_active = TRUE + if(. == PROJECTILE_PIERCE_PHASE) + return + if(kinetic_gun) + var/list/mods = kinetic_gun.modkits + for(var/obj/item/borg/upgrade/modkit/modkit in mods) + modkit.projectile_prehit(src, target, kinetic_gun) + if(!pressure_decrease_active && !lavaland_equipment_pressure_check(get_turf(target))) + name = "weakened [name]" + damage = damage * pressure_decrease + pressure_decrease_active = TRUE /obj/item/projectile/kinetic/on_range() strike_thing() diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm index cf64ae364e..182e479bbb 100644 --- a/code/modules/projectiles/guns/misc/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -445,22 +445,22 @@ continue O.take_damage(aoe_structure_damage * get_damage_coeff(O), BURN, "laser", FALSE) -/obj/item/projectile/beam/beam_rifle/proc/check_pierce(atom/A) +/obj/item/projectile/beam/beam_rifle/prehit_pierce(atom/A) if(isclosedturf(A) && (wall_pierce < wall_pierce_amount)) if(prob(wall_devastate)) if(iswallturf(A)) var/turf/closed/wall/W = A W.dismantle_wall(TRUE, TRUE) else - target.ex_act(EXPLODE_HEAVY) + A.ex_act(EXPLODE_HEAVY) ++wall_pierce return PROJECTILE_PIERCE_PHASE // yeah this gun is a snowflakey piece of garbage - Silly-Cons if(isobj(A) && (structure_pierce < structure_pierce_amount)) ++structure_pierce var/obj/O = A - O.take_damage((impact_structure_damage + aoe_structure_damage) * structure_bleed_coeff * get_damage_coeff(A), BURN, ENERGY, FALSE) + O.take_damage((impact_structure_damage + aoe_structure_damage) * structure_bleed_coeff * get_damage_coeff(A), BURN, "energy", FALSE) return PROJECTILE_PIERCE_PHASE // ditto and this could be refactored to on_hit honestly - Silly-Cons - return ..() + return ..() /obj/item/projectile/beam/beam_rifle/proc/get_damage_coeff(atom/target) if(istype(target, /obj/machinery/door)) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 4d567e8767..f0db597b27 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -50,7 +50,7 @@ /** PROJECTILE PIERCING * WARNING: * Projectile piercing MUST be done using these variables. - * Ordinary passflags will be **IGNORED**. + * Ordinary passflags will result in can_hit_target being false unless directly clicked on - similar to projectile_phasing but without even going to process_hit. * The two flag variables below both use pass flags. * In the context of LETPASStHROW, it means the projectile will ignore things that are currently "in the air" from a throw. * @@ -354,7 +354,7 @@ /obj/item/projectile/Bump(atom/A) SEND_SIGNAL(src, COMSIG_MOVABLE_BUMP, A) - if(!can_hit_target(A, A == original, TRUE)) + if(!can_hit_target(A, A == original, TRUE, TRUE)) return Impact(A) @@ -395,7 +395,7 @@ if(def_zone && check_zone(def_zone) != BODY_ZONE_CHEST) def_zone = ran_zone(def_zone, max(100-(7*distance), 5) * zone_accuracy_factor) //Lower accurancy/longer range tradeoff. 7 is a balanced number to use. - return process_hit(T, select_target(T, A)) // SELECT TARGET FIRST! + return process_hit(T, select_target(T, A, A), A) // SELECT TARGET FIRST! /** * The primary workhorse proc of projectile impacts. @@ -414,12 +414,14 @@ * @params * T - Turf we're on/supposedly hitting * target - target we're hitting + * bumped - target we originally bumped. it's here to ensure that if something blocks our projectile by means of Cross() failure, we hit it + * even if it is not dense. * hit_something - only should be set by recursive calling by this proc - tracks if we hit something already * * Returns if we hit something. * - Silly-Cons */ -/obj/item/projectile/proc/process_hit(turf/T, atom/target, hit_something = FALSE) +/obj/item/projectile/proc/process_hit(turf/T, atom/target, atom/bumped, hit_something = FALSE) // 1. if(QDELETED(src) || !T || !target) return @@ -434,7 +436,7 @@ if(!(movement_type & PHASING)) temporary_unstoppable_movement = TRUE movement_type |= PHASING - return process_hit(T, select_target(T, target), hit_something) // try to hit something else + return process_hit(T, select_target(T, target, bumped), bumped, hit_something) // try to hit something else // at this point we are going to hit the thing // in which case send signal to it SEND_SIGNAL(target, COMSIG_PROJECTILE_PREHIT, args) @@ -446,8 +448,8 @@ if(!(movement_type & PHASING)) temporary_unstoppable_movement = TRUE movement_type |= PHASING - return process_hit(T, select_target(T, target), TRUE) - qdel(src) + return process_hit(T, select_target(T, target, bumped), bumped, TRUE) + qdel(src) return hit_something /** @@ -456,7 +458,9 @@ * @params * T - The turf * target - The "preferred" atom to hit, usually what we Bumped() first. - * + * bumped - used to track if something is the reason we impacted in the first place. + * If set, this atom is always treated as dense by can_hit_target. + * Priority: * 0. Anything that is already in impacted is ignored no matter what. Furthermore, in any bracket, if the target atom parameter is in it, that's hit first. * Furthermore, can_hit_target is always checked. This (entire proc) is PERFORMANCE OVERHEAD!! But, it shouldn't be ""too"" bad and I frankly don't have a better *generic non snowflakey* way that I can think of right now at 3 AM. @@ -467,51 +471,50 @@ * 4. Turf * 5. Nothing */ -/obj/item/projectile/proc/select_target(turf/T, atom/target) +/obj/item/projectile/proc/select_target(turf/T, atom/target, atom/bumped) // 1. original - if(can_hit_target(original, TRUE, FALSE)) + if(can_hit_target(original, TRUE, FALSE, original == bumped)) return original var/list/atom/possible = list() // let's define these ONCE var/list/atom/considering = list() // 2. mobs possible = typecache_filter_list(T, GLOB.typecache_living) // living only for(var/i in possible) - if(!can_hit_target(i, i == original, TRUE)) + if(!can_hit_target(i, i == original, TRUE, i == bumped)) continue considering += i if(considering.len) var/mob/living/M = pick(considering) return M.lowest_buckled_mob() considering.len = 0 - // 3. objs - possible = typecache_filter_list(T, GLOB.typecache_machine_or_structure) // because why are items ever dense? - for(var/i in possible) - if(!can_hit_target(i, i == original, TRUE)) + // 3. objs and other dense things + for(var/i in T.contents) + if(!can_hit_target(i, i == original, TRUE, i == bumped)) continue considering += i if(considering.len) return pick(considering) // 4. turf - if(can_hit_target(T, T == original, TRUE)) + if(can_hit_target(T, T == original, TRUE, T == bumped)) return T // 5. nothing // (returns null) //Returns true if the target atom is on our current turf and above the right layer //If direct target is true it's the originally clicked target. -/obj/item/projectile/proc/can_hit_target(atom/target, direct_target = FALSE, ignore_loc = FALSE) +/obj/item/projectile/proc/can_hit_target(atom/target, direct_target = FALSE, ignore_loc = FALSE,cross_failed = FALSE) if(QDELETED(target) || impacted[target]) return FALSE if(!ignore_loc && (loc != target.loc)) return FALSE - // if pass_flags match, pass through entirely - if(target.pass_flags_self & pass_flags) // phasing + // if pass_flags match, pass through entirely - unless direct target is set. + if((target.pass_flags_self & pass_flags) && !direct_target) return FALSE if(!ignore_source_check && firer) var/mob/M = firer if((target == firer) || ((target == firer.loc) && ismecha(firer.loc)) || (target in firer.buckled_mobs) || (istype(M) && (M.buckled == target))) return FALSE - if(target.density) //This thing blocks projectiles, hit it regardless of layer/mob stuns/etc. + if(target.density || cross_failed) //This thing blocks projectiles, hit it regardless of layer/mob stuns/etc. return TRUE if(!isliving(target)) if(isturf(target)) // non dense turfs @@ -525,8 +528,14 @@ if(direct_target) return TRUE // If target not able to use items, move and stand - or if they're just dead, pass over. - if(L.stat == DEAD || (!hit_stunned_targets && HAS_TRAIT(L, TRAIT_IMMOBILIZED) && HAS_TRAIT(L, TRAIT_FLOORED) && HAS_TRAIT(L, TRAIT_HANDS_BLOCKED))) + if(L.stat == DEAD) return FALSE + if(!L.density) + return FALSE + if(L.resting) + return TRUE + var/stunned = HAS_TRAIT(L, TRAIT_MOBILITY_NOMOVE) && HAS_TRAIT(L, TRAIT_MOBILITY_NOREST) && HAS_TRAIT(L, TRAIT_MOBILITY_NOPICKUP) + return !stunned || hit_stunned_targets return TRUE /** @@ -601,8 +610,9 @@ * NOT meant to be a pure proc, since this replaces prehit() which was used to do things. * Return PROJECTILE_DELETE_WITHOUT_HITTING to delete projectile without hitting at all! */ + /obj/item/projectile/proc/prehit_pierce(atom/A) - if(projectile_phasing & A.pass_flags_self) + if((projectile_phasing & A.pass_flags_self) && (phasing_ignore_direct_target || original != A)) return PROJECTILE_PIERCE_PHASE if(projectile_piercing & A.pass_flags_self) return PROJECTILE_PIERCE_HIT @@ -612,8 +622,6 @@ return (projectile_phasing & LETPASSTHROW)? PROJECTILE_PIERCE_PHASE : ((projectile_piercing & LETPASSTHROW)? PROJECTILE_PIERCE_HIT : PROJECTILE_PIERCE_NONE) return PROJECTILE_PIERCE_NONE -/**INeedAnAdult I am unsure what the fuck is going on in here and I'll have to get clairification on this shit. - */ /obj/item/projectile/proc/check_ricochet(atom/A) if(ricochets > ricochets_max) //safety thing, we don't care about what the other thing says about this. return FALSE @@ -676,16 +684,17 @@ pixels_tick_leftover = required_pixels /obj/item/projectile/proc/fire(angle, atom/direct_target) + LAZYINITLIST(impacted) if(fired_from) SEND_SIGNAL(fired_from, COMSIG_PROJECTILE_BEFORE_FIRE, src, original) //If no angle needs to resolve it from xo/yo! if(shrapnel_type) AddElement(/datum/element/embed, projectile_payload = shrapnel_type) if(!log_override && firer && original) log_combat(firer, original, "fired at", src, "from [get_area_name(src, TRUE)]") - if(direct_target && (get_dist(direct_target, get_turf(src)) <= 1)) // point blank shots + if(direct_target && (get_dist(direct_target, get_turf(src)) <= 1)) // point blank shots process_hit(get_turf(direct_target), direct_target) if(QDELETED(src)) - return + return if(isnum(angle)) setAngle(angle) if(spread) @@ -703,7 +712,6 @@ var/matrix/M = new M.Turn(Angle) transform = M - LAZYINITLIST(impacted) trajectory_ignore_forcemove = TRUE forceMove(starting) set_light(fired_light_range, fired_light_intensity, fired_light_color) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index a74a71d141..0d196ef0e3 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -72,7 +72,7 @@ damage = 15 irradiate = 100 range = 15 - pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE | PASSCLOSEDTURF + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE | PASSCLOSEDTURF | PASSMACHINE | PASSSTRUCTURE impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser light_color = LIGHT_COLOR_GREEN From a478945424f1803ce35cf7b32214fc99386684b6 Mon Sep 17 00:00:00 2001 From: Solaris-Shade <73904284+Solaris-Shade@users.noreply.github.com> Date: Fri, 11 Mar 2022 22:49:16 -0500 Subject: [PATCH 05/53] Merge conflict one --- code/game/objects/objs.dm | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 0651891421..307307df61 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -238,7 +238,18 @@ /obj/get_dumping_location(datum/component/storage/source,mob/user) return get_turf(src) -/obj/proc/CanAStarPass(ID, dir, caller) +/** + * This proc is used for telling whether something can pass by this object in a given direction, for use by the pathfinding system. + * + * Trying to generate one long path across the station will call this proc on every single object on every single tile that we're seeing if we can move through, likely + * multiple times per tile since we're likely checking if we can access said tile from multiple directions, so keep these as lightweight as possible. + * + * Arguments: + * * ID- An ID card representing what access we have (and thus if we can open things like airlocks or windows to pass through them). The ID card's physical location does not matter, just the reference + * * to_dir- What direction we're trying to move in, relevant for things like directional windows that only block movement in certain directions + * * caller- The movable we're checking pass flags for, if we're making any such checks + **/ +/obj/proc/CanAStarPass(obj/item/card/id/ID, to_dir, atom/movable/caller) if(ismovable(caller)) var/atom/movable/AM = caller if(AM.pass_flags & pass_flags_self) From a8f454bd7289e03cfa755ef411d6d5ada6c61d78 Mon Sep 17 00:00:00 2001 From: SandPoot Date: Wed, 16 Mar 2022 14:00:31 -0300 Subject: [PATCH 06/53] Upload files --- .../lavaland_surface_random_ripley.dmm | 2 +- .../RandomRuins/SpaceRuins/mechtransport.dmm | 2 +- _maps/RandomZLevels/VR/snowdin_VR.dmm | 2 +- _maps/RandomZLevels/away_mission/caves.dmm | 2 +- _maps/RandomZLevels/away_mission/snowdin.dmm | 2 +- code/__DEFINES/cooldowns.dm | 9 + code/__DEFINES/dcs/signals.dm | 12 + code/__DEFINES/is_helpers.dm | 2 +- code/__DEFINES/logging.dm | 1 + code/__DEFINES/mecha.dm | 31 + code/__DEFINES/vehicles.dm | 5 + code/_onclick/ai.dm | 5 - code/_onclick/click.dm | 5 - code/_onclick/right_click.dm | 4 - code/_rendering/atom_huds/data_huds.dm | 8 +- code/controllers/subsystem/traumas.dm | 4 +- code/datums/armor.dm | 13 + code/datums/components/armor_plate.dm | 8 +- code/game/atoms.dm | 3 - .../game/gamemodes/clown_ops/clown_weapons.dm | 19 +- code/game/machinery/doors/door.dm | 15 +- code/game/machinery/doors/windowdoor.dm | 12 +- .../machinery/porta_turret/portable_turret.dm | 10 +- code/game/mecha/combat/combat.dm | 11 - code/game/mecha/combat/durand.dm | 21 - code/game/mecha/combat/gygax.dm | 68 - code/game/mecha/combat/phazon.dm | 29 - code/game/mecha/equipment/mecha_equipment.dm | 171 -- code/game/mecha/equipment/tools/work_tools.dm | 480 ---- code/game/mecha/mecha.dm | 1124 -------- code/game/mecha/mecha_actions.dm | 285 -- code/game/mecha/mecha_construction_paths.dm | 2292 ----------------- code/game/mecha/mecha_defense.dm | 334 --- code/game/mecha/mecha_topic.dm | 360 --- code/game/mecha/mecha_wreckage.dm | 271 -- code/game/mecha/medical/medical.dm | 16 - code/game/mecha/working/ripley.dm | 188 -- code/game/mecha/working/working.dm | 3 - code/game/objects/effects/effects.dm | 3 - .../effects/temporary_visuals/clockcult.dm | 14 +- code/game/objects/items.dm | 3 - code/game/objects/items/devices/camera_bug.dm | 2 +- code/game/objects/obj_defense.dm | 20 - code/game/objects/structures/window.dm | 5 - code/game/turfs/simulated/wall/misc_walls.dm | 5 +- code/game/turfs/simulated/walls.dm | 17 - code/game/turfs/turf.dm | 2 +- .../clock_helpers/clock_powerdrain.dm | 7 +- .../scripture_applications.dm | 8 +- .../antagonists/clockcult/clock_structure.dm | 5 - .../clock_structures/ocular_warden.dm | 13 +- .../trap_triggers/pressure_sensor_mech.dm | 10 +- .../clock_structures/traps/brass_skewer.dm | 2 +- .../eldritch_cult/eldritch_magic.dm | 2 +- code/modules/cargo/bounties/mech.dm | 18 +- code/modules/cargo/exports.dm | 2 +- code/modules/cargo/exports/large_objects.dm | 28 +- code/modules/cargo/exports/organs_robotics.dm | 2 +- code/modules/clothing/suits/wiz_robe.dm | 4 +- code/modules/fields/timestop.dm | 8 +- code/modules/mob/living/brain/MMI.dm | 2 +- code/modules/mob/living/brain/brain.dm | 11 +- code/modules/mob/living/carbon/human/death.dm | 4 - .../mob/living/carbon/human/human_defense.dm | 42 - code/modules/mob/living/living_defense.dm | 33 - code/modules/mob/living/silicon/ai/ai.dm | 4 +- code/modules/mob/living/silicon/ai/life.dm | 4 +- .../living/simple_animal/hostile/hostile.dm | 10 +- .../simple_animal/hostile/mecha_pilot.dm | 164 +- .../simple_animal/hostile/megafauna/drake.dm | 10 +- .../hostile/megafauna/hierophant.dm | 14 +- .../hostile/mining_mobs/goliath.dm | 2 +- .../hostile/retaliate/retaliate.dm | 10 +- .../simple_animal/hostile/space_dragon.dm | 8 +- .../mob/living/simple_animal/simple_animal.dm | 4 +- code/modules/mob/mob.dm | 2 +- code/modules/ninja/suit/ninjaDrainAct.dm | 8 +- .../projectiles/projectile/energy/tesla.dm | 4 + .../projectiles/projectile/special/rocket.dm | 4 +- code/modules/recycling/disposal/bin.dm | 2 +- .../designs/mechfabricator_designs.dm | 9 - code/modules/shuttle/supply.dm | 2 +- code/modules/shuttle/white_ship.dm | 2 +- .../uplink/uplink_items/uplink_support.dm | 6 +- code/modules/vehicles/_vehicle.dm | 6 +- code/modules/vehicles/mecha/_mecha.dm | 1217 +++++++++ code/modules/vehicles/mecha/combat/combat.dm | 23 + code/modules/vehicles/mecha/combat/durand.dm | 241 ++ .../vehicles}/mecha/combat/five_stars.dm | 4 +- code/modules/vehicles/mecha/combat/gygax.dm | 59 + .../vehicles}/mecha/combat/honker.dm | 97 +- .../vehicles}/mecha/combat/marauder.dm | 65 +- .../vehicles/mecha/combat}/medigax.dm | 30 +- .../vehicles}/mecha/combat/neovgre.dm | 43 +- code/modules/vehicles/mecha/combat/phazon.dm | 21 + .../vehicles}/mecha/combat/reticence.dm | 13 +- .../mecha/equipment/mecha_equipment.dm | 157 ++ .../mecha/equipment/tools/medical_tools.dm | 194 +- .../mecha/equipment/tools/mining_tools.dm | 76 +- .../mecha/equipment/tools/other_tools.dm | 289 ++- .../mecha/equipment/tools/weapon_bay.dm | 14 + .../mecha/equipment/tools/work_tools.dm | 410 +++ .../mecha/equipment/weapons/mecha_ammo.dm | 6 +- .../mecha/equipment/weapons/weapons.dm | 232 +- .../vehicles}/mecha/mech_bay.dm | 23 +- .../vehicles}/mecha/mech_fabricator.dm | 0 .../vehicles/mecha/mech_melee_attack.dm | 117 + code/modules/vehicles/mecha/mecha_actions.dm | 275 ++ .../mecha/mecha_construction_paths.dm | 1608 ++++++++++++ .../vehicles}/mecha/mecha_control_console.dm | 49 +- code/modules/vehicles/mecha/mecha_defense.dm | 390 +++ .../vehicles}/mecha/mecha_parts.dm | 33 +- code/modules/vehicles/mecha/mecha_topic.dm | 421 +++ code/modules/vehicles/mecha/mecha_wreckage.dm | 222 ++ .../vehicles}/mecha/medical/odysseus.dm | 20 +- code/modules/vehicles/mecha/working/ripley.dm | 219 ++ .../modules/vehicles/mecha/working/working.dm | 28 + code/modules/vehicles/sealed.dm | 4 +- icons/mecha/durand_shield.dmi | Bin 0 -> 9277 bytes icons/mecha/mecha.dmi | Bin 174946 -> 196928 bytes icons/mob/actions/actions_mecha.dmi | Bin 7153 -> 9801 bytes sound/mecha/mech_shield_deflect.ogg | Bin 0 -> 11708 bytes sound/mecha/mech_shield_drop.ogg | Bin 0 -> 17325 bytes sound/mecha/mech_shield_raise.ogg | Bin 0 -> 25055 bytes tgstation.dme | 63 +- 125 files changed, 6439 insertions(+), 6600 deletions(-) create mode 100644 code/__DEFINES/mecha.dm delete mode 100644 code/game/mecha/combat/combat.dm delete mode 100644 code/game/mecha/combat/durand.dm delete mode 100644 code/game/mecha/combat/gygax.dm delete mode 100644 code/game/mecha/combat/phazon.dm delete mode 100644 code/game/mecha/equipment/mecha_equipment.dm delete mode 100644 code/game/mecha/equipment/tools/work_tools.dm delete mode 100644 code/game/mecha/mecha.dm delete mode 100644 code/game/mecha/mecha_actions.dm delete mode 100644 code/game/mecha/mecha_construction_paths.dm delete mode 100644 code/game/mecha/mecha_defense.dm delete mode 100644 code/game/mecha/mecha_topic.dm delete mode 100644 code/game/mecha/mecha_wreckage.dm delete mode 100644 code/game/mecha/medical/medical.dm delete mode 100644 code/game/mecha/working/ripley.dm delete mode 100644 code/game/mecha/working/working.dm create mode 100644 code/modules/vehicles/mecha/_mecha.dm create mode 100644 code/modules/vehicles/mecha/combat/combat.dm create mode 100644 code/modules/vehicles/mecha/combat/durand.dm rename code/{game => modules/vehicles}/mecha/combat/five_stars.dm (88%) create mode 100644 code/modules/vehicles/mecha/combat/gygax.dm rename code/{game => modules/vehicles}/mecha/combat/honker.dm (63%) rename code/{game => modules/vehicles}/mecha/combat/marauder.dm (61%) rename code/{game/mecha/medical => modules/vehicles/mecha/combat}/medigax.dm (54%) rename code/{game => modules/vehicles}/mecha/combat/neovgre.dm (74%) create mode 100644 code/modules/vehicles/mecha/combat/phazon.dm rename code/{game => modules/vehicles}/mecha/combat/reticence.dm (66%) create mode 100644 code/modules/vehicles/mecha/equipment/mecha_equipment.dm rename code/{game => modules/vehicles}/mecha/equipment/tools/medical_tools.dm (73%) rename code/{game => modules/vehicles}/mecha/equipment/tools/mining_tools.dm (70%) rename code/{game => modules/vehicles}/mecha/equipment/tools/other_tools.dm (58%) create mode 100644 code/modules/vehicles/mecha/equipment/tools/weapon_bay.dm create mode 100644 code/modules/vehicles/mecha/equipment/tools/work_tools.dm rename code/{game => modules/vehicles}/mecha/equipment/weapons/mecha_ammo.dm (94%) rename code/{game => modules/vehicles}/mecha/equipment/weapons/weapons.dm (70%) rename code/{game => modules/vehicles}/mecha/mech_bay.dm (89%) rename code/{game => modules/vehicles}/mecha/mech_fabricator.dm (100%) create mode 100644 code/modules/vehicles/mecha/mech_melee_attack.dm create mode 100644 code/modules/vehicles/mecha/mecha_actions.dm create mode 100644 code/modules/vehicles/mecha/mecha_construction_paths.dm rename code/{game => modules/vehicles}/mecha/mecha_control_console.dm (77%) create mode 100644 code/modules/vehicles/mecha/mecha_defense.dm rename code/{game => modules/vehicles}/mecha/mecha_parts.dm (95%) create mode 100644 code/modules/vehicles/mecha/mecha_topic.dm create mode 100644 code/modules/vehicles/mecha/mecha_wreckage.dm rename code/{game => modules/vehicles}/mecha/medical/odysseus.dm (56%) create mode 100644 code/modules/vehicles/mecha/working/ripley.dm create mode 100644 code/modules/vehicles/mecha/working/working.dm create mode 100644 icons/mecha/durand_shield.dmi create mode 100644 sound/mecha/mech_shield_deflect.ogg create mode 100644 sound/mecha/mech_shield_drop.ogg create mode 100644 sound/mecha/mech_shield_raise.ogg diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_random_ripley.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_random_ripley.dmm index e1097d3f68..0ca8a35149 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_random_ripley.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_random_ripley.dmm @@ -9,7 +9,7 @@ /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "d" = ( -/obj/mecha/working/ripley/mining, +/obj/vehicle/sealed/mecha/working/ripley/mining, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "e" = ( diff --git a/_maps/RandomRuins/SpaceRuins/mechtransport.dmm b/_maps/RandomRuins/SpaceRuins/mechtransport.dmm index a9beb9540e..dbe8722b83 100644 --- a/_maps/RandomRuins/SpaceRuins/mechtransport.dmm +++ b/_maps/RandomRuins/SpaceRuins/mechtransport.dmm @@ -102,7 +102,7 @@ /turf/open/floor/mineral/titanium/yellow/airless, /area/ruin/space/has_grav/powered/mechtransport) "A" = ( -/obj/mecha/working/ripley, +/obj/vehicle/sealed/mecha/working/ripley, /turf/open/floor/mineral/titanium/yellow/airless, /area/ruin/space/has_grav/powered/mechtransport) "B" = ( diff --git a/_maps/RandomZLevels/VR/snowdin_VR.dmm b/_maps/RandomZLevels/VR/snowdin_VR.dmm index c0977f00f0..d1e3373633 100644 --- a/_maps/RandomZLevels/VR/snowdin_VR.dmm +++ b/_maps/RandomZLevels/VR/snowdin_VR.dmm @@ -14451,7 +14451,7 @@ /turf/open/floor/plasteel/dark, /area/awaymission/snowdin/post/mining_main/mechbay) "In" = ( -/obj/mecha/working/ripley/mining{ +/obj/vehicle/sealed/mecha/working/ripley/mining{ dir = 1; icon_state = "ripley" }, diff --git a/_maps/RandomZLevels/away_mission/caves.dmm b/_maps/RandomZLevels/away_mission/caves.dmm index ed246ff8b5..e33659fbdd 100644 --- a/_maps/RandomZLevels/away_mission/caves.dmm +++ b/_maps/RandomZLevels/away_mission/caves.dmm @@ -2039,7 +2039,7 @@ }, /area/awaymission/caves/BMP_asteroid) "gC" = ( -/obj/mecha/working/ripley/mining, +/obj/vehicle/sealed/mecha/working/ripley/mining, /turf/open/floor/plasteel/recharge_floor, /area/awaymission/caves/BMP_asteroid) "gD" = ( diff --git a/_maps/RandomZLevels/away_mission/snowdin.dmm b/_maps/RandomZLevels/away_mission/snowdin.dmm index aa4dd61154..dae17bd259 100644 --- a/_maps/RandomZLevels/away_mission/snowdin.dmm +++ b/_maps/RandomZLevels/away_mission/snowdin.dmm @@ -14452,7 +14452,7 @@ /turf/open/floor/plasteel/dark, /area/awaymission/snowdin/post/mining_main/mechbay) "In" = ( -/obj/mecha/working/ripley/mining{ +/obj/vehicle/sealed/mecha/working/ripley/mining{ dir = 1 }, /obj/effect/turf_decal/bot, diff --git a/code/__DEFINES/cooldowns.dm b/code/__DEFINES/cooldowns.dm index b783678c86..39240ed7e5 100644 --- a/code/__DEFINES/cooldowns.dm +++ b/code/__DEFINES/cooldowns.dm @@ -31,12 +31,21 @@ #define COOLDOWN_OBJECTIVES "objectives" #define COOLDOWN_OBJ_ADMIN_PING "obj_admin_ping" + +//Mecha cooldowns +#define COOLDOWN_MECHA_MESSAGE "mecha_message" +#define COOLDOWN_MECHA_EQUIPMENT "mecha_equipment" +#define COOLDOWN_MECHA_ARMOR "mecha_armor" +#define COOLDOWN_MECHA_MELEE_ATTACK "mecha_melee" +#define COOLDOWN_MECHA_SMOKE "mecha_smoke" + //car cooldowns #define COOLDOWN_CAR_HONK "car_honk" //clown car cooldowns #define COOLDOWN_CLOWNCAR_RANDOMNESS "clown_car_randomness" + //TIMER COOLDOWN MACROS #define COMSIG_CD_STOP(cd_index) "cooldown_[cd_index]" diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index dad0f49832..ea4fc2c361 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -526,7 +526,19 @@ #define COMSIG_PROJECTILE_PREHIT "com_proj_prehit" ///sent to targets during the process_hit proc of projectiles #define COMSIG_PELLET_CLOUD_INIT "pellet_cloud_init" // sent to targets during the process_hit proc of projectiles +// /obj/vehicle/sealed/mecha signals +// /sent from mecha action buttons to the mecha they're linked to +#define COMSIG_MECHA_ACTION_TRIGGER "mecha_action_activate" +///sent from clicking while you have no equipment selected. Sent before cooldown and adjacency checks, so you can use this for infinite range things if you want. +#define COMSIG_MECHA_MELEE_CLICK "mecha_action_melee_click" + /// Prevents click from happening. + #define COMPONENT_CANCEL_MELEE_CLICK (1<<0) +///sent from clicking while you have equipment selected. +#define COMSIG_MECHA_EQUIPMENT_CLICK "mecha_action_equipment_click" + /// Prevents click from happening. + #define COMPONENT_CANCEL_EQUIPMENT_CLICK (1<<0) + // /mob/living/carbon/human signals #define COMSIG_HUMAN_MELEE_UNARMED_ATTACK "human_melee_unarmed_attack" //from mob/living/carbon/human/UnarmedAttack(): (atom/target) #define COMSIG_HUMAN_MELEE_UNARMED_ATTACKBY "human_melee_unarmed_attackby" //from mob/living/carbon/human/UnarmedAttack(): (mob/living/carbon/human/attacker) diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index f893ab3dfe..cfd2cebbd0 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -207,7 +207,7 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( #define ismachinery(A) (istype(A, /obj/machinery)) -#define ismecha(A) (istype(A, /obj/mecha)) +#define ismecha(A) (istype(A, /obj/vehicle/sealed/mecha)) #define is_cleanable(A) (istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/rune)) //if something is cleanable diff --git a/code/__DEFINES/logging.dm b/code/__DEFINES/logging.dm index bde3189272..87e7fe3ce4 100644 --- a/code/__DEFINES/logging.dm +++ b/code/__DEFINES/logging.dm @@ -39,6 +39,7 @@ #define LOG_ADMIN_PRIVATE (1 << 14) #define LOG_ASAY (1 << 15) #define LOG_VIRUS (1 << 16) +#define LOG_MECHA (1 << 17) #define LOG_SHUTTLE (1 << 18) #define LOG_VICTIM (1 << 19) diff --git a/code/__DEFINES/mecha.dm b/code/__DEFINES/mecha.dm new file mode 100644 index 0000000000..4a90a32d08 --- /dev/null +++ b/code/__DEFINES/mecha.dm @@ -0,0 +1,31 @@ +#define MECHA_INT_FIRE (1<<0) +#define MECHA_INT_TEMP_CONTROL (1<<1) +#define MECHA_INT_SHORT_CIRCUIT (1<<2) +#define MECHA_INT_TANK_BREACH (1<<3) +#define MECHA_INT_CONTROL_LOST (1<<4) + +#define ADDING_ACCESS_POSSIBLE (1<<0) +#define ADDING_MAINT_ACCESS_POSSIBLE (1<<1) +#define CANSTRAFE (1<<2) +#define LIGHTS_ON (1<<3) +#define SILICON_PILOT (1<<4) +#define IS_ENCLOSED (1<<5) +#define HAS_LIGHTS (1<<6) +#define QUIET_STEPS (1<<7) +#define QUIET_TURNS (1<<8) +///blocks using equipment and melee attacking. +#define CANNOT_INTERACT (1<<9) +/// posibrains can drive this mecha +#define MMI_COMPATIBLE (1<<10) + +#define MECHA_MELEE (1 << 0) +#define MECHA_RANGED (1 << 1) + +#define MECHA_FRONT_ARMOUR 1 +#define MECHA_SIDE_ARMOUR 2 +#define MECHA_BACK_ARMOUR 3 + +#define MECHA_LOCKED 0 +#define MECHA_SECURE_BOLTS 1 +#define MECHA_LOOSE_BOLTS 2 +#define MECHA_OPEN_HATCH 3 diff --git a/code/__DEFINES/vehicles.dm b/code/__DEFINES/vehicles.dm index 1ff14f9506..0255327ed9 100644 --- a/code/__DEFINES/vehicles.dm +++ b/code/__DEFINES/vehicles.dm @@ -11,6 +11,11 @@ ///changing around settings and the like. #define VEHICLE_CONTROL_SETTINGS (1<<4) + +///ez define for giving a single pilot mech all the flags it needs. +#define FULL_MECHA_CONTROL ALL + + //car_traits flags ///Will this car kidnap people by ramming into them? #define CAN_KIDNAP (1<<0) diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index c7834dc5ef..239ef319d1 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -55,11 +55,6 @@ if(modifiers["shift"] && modifiers["ctrl"]) CtrlShiftClickOn(A) return - if(modifiers["middle"]) - if(controlled_mech) //Are we piloting a mech? Placed here so the modifiers are not overridden. - controlled_mech.click_action(A, src, params) //Override AI normal click behavior. - return - if(modifiers["shift"]) ShiftClickOn(A) return diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 773adc061f..c9e20bc01a 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -82,11 +82,6 @@ if(!modifiers["catcher"] && A.IsObscured()) return - if(ismecha(loc)) - var/obj/mecha/M = loc - M.click_action(A,src,params) - return TRUE - if(restrained()) DelayNextAction(CLICK_CD_HANDCUFFED) return RestrainedClickOn(A) diff --git a/code/_onclick/right_click.dm b/code/_onclick/right_click.dm index 4b2480eb8c..c1613561b4 100644 --- a/code/_onclick/right_click.dm +++ b/code/_onclick/right_click.dm @@ -11,10 +11,6 @@ if(!modifiers["catcher"] && A.IsObscured()) return - if(ismecha(loc)) - var/obj/mecha/M = loc - return M.click_action(A,src,params) - if(restrained()) DelayNextAction(CLICK_CD_HANDCUFFED) return RestrainedClickOn(A) diff --git a/code/_rendering/atom_huds/data_huds.dm b/code/_rendering/atom_huds/data_huds.dm index 413484b99b..d25dcb5380 100644 --- a/code/_rendering/atom_huds/data_huds.dm +++ b/code/_rendering/atom_huds/data_huds.dm @@ -381,14 +381,14 @@ /*~~~~~~~~~~~~~~~~~~~~ BIG STOMPY MECHS ~~~~~~~~~~~~~~~~~~~~~*/ -/obj/mecha/proc/diag_hud_set_mechhealth() +/obj/vehicle/sealed/mecha/proc/diag_hud_set_mechhealth() var/image/holder = hud_list[DIAG_MECH_HUD] var/icon/I = icon(icon, icon_state, dir) holder.pixel_y = I.Height() - world.icon_size holder.icon_state = "huddiag[RoundDiagBar(obj_integrity/max_integrity)]" -/obj/mecha/proc/diag_hud_set_mechcell() +/obj/vehicle/sealed/mecha/proc/diag_hud_set_mechcell() var/image/holder = hud_list[DIAG_BATT_HUD] var/icon/I = icon(icon, icon_state, dir) holder.pixel_y = I.Height() - world.icon_size @@ -399,7 +399,7 @@ holder.icon_state = "hudnobatt" -/obj/mecha/proc/diag_hud_set_mechstat() +/obj/vehicle/sealed/mecha/proc/diag_hud_set_mechstat() var/image/holder = hud_list[DIAG_STAT_HUD] var/icon/I = icon(icon, icon_state, dir) holder.pixel_y = I.Height() - world.icon_size @@ -407,7 +407,7 @@ if(internal_damage) holder.icon_state = "hudwarn" -/obj/mecha/proc/diag_hud_set_mechtracking() //Shows tracking beacons on the mech +/obj/vehicle/sealed/mecha/proc/diag_hud_set_mechtracking() //Shows tracking beacons on the mech var/image/holder = hud_list[DIAG_TRACK_HUD] var/icon/I = icon(icon, icon_state, dir) holder.pixel_y = I.Height() - world.icon_size diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm index 9a0665e91f..35997a8d89 100644 --- a/code/controllers/subsystem/traumas.dm +++ b/code/controllers/subsystem/traumas.dm @@ -159,7 +159,7 @@ SUBSYSTEM_DEF(traumas) /obj/item/storage/backpack/mime, /obj/item/reagent_containers/food/snacks/grown/banana/mime, /obj/item/grown/bananapeel/mimanapeel, /obj/item/cartridge/virus/mime, /obj/item/clothing/shoes/sneakers/mime, /obj/item/bedsheet/mime, /obj/item/reagent_containers/food/snacks/burger/mime, /obj/item/clothing/head/beret, - /obj/item/toy/figure/mime, /obj/item/toy/crayon/mime, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced, /obj/mecha/combat/reticence)), + /obj/item/toy/figure/mime, /obj/item/toy/crayon/mime, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced, /obj/vehicle/sealed/mecha/combat/reticence)), "cats" = typecacheof(list(/obj/item/organ/ears/cat, /obj/item/organ/tail/cat, /obj/item/laser_pointer, /obj/item/toy/cattoy, /obj/item/clothing/head/kitty, /obj/item/clothing/head/collectable/kitty, /obj/item/melee/chainofcommand/tailwhip/kitty, /obj/item/stack/sheet/animalhide/cat)), @@ -169,7 +169,7 @@ SUBSYSTEM_DEF(traumas) /obj/structure/fluff/empty_sleeper/syndicate, /obj/item/implant/radio/syndicate, /obj/item/clothing/head/helmet/space/syndicate, /obj/machinery/nuclearbomb/syndicate, /obj/item/grenade/syndieminibomb, /obj/item/storage/backpack/duffelbag/syndie, /obj/item/gun/ballistic/automatic/pistol, /obj/item/gun/ballistic/revolver, /obj/item/gun/ballistic/automatic/shotgun/bulldog, /obj/item/gun/ballistic/automatic/c20r, /obj/item/gun/ballistic/automatic/m90, /obj/item/gun/ballistic/automatic/l6_saw, /obj/item/storage/belt/grenade/full, /obj/item/gun/ballistic/automatic/sniper_rifle/syndicate, /obj/item/gun/energy/kinetic_accelerator/crossbow, /obj/item/melee/transforming/energy/sword/saber, /obj/item/dualsaber, /obj/item/melee/powerfist, /obj/item/storage/box/syndie_kit, /obj/item/grenade/spawnergrenade/manhacks, /obj/item/grenade/chem_grenade/bioterrorfoam, /obj/item/reagent_containers/spray/chemsprayer/bioterror, /obj/item/ammo_box/magazine/m10mm, - /obj/item/ammo_box/magazine/pistolm9mm, /obj/item/ammo_box/a357, /obj/item/ammo_box/magazine/m12g, /obj/item/ammo_box/magazine/mm195x129, /obj/item/antag_spawner/nuke_ops, /obj/mecha/combat/gygax/dark, /obj/mecha/combat/marauder/mauler, /obj/item/soap/syndie, /obj/item/gun/syringe/syndicate, /obj/item/cartridge/virus/syndicate, + /obj/item/ammo_box/magazine/pistolm9mm, /obj/item/ammo_box/a357, /obj/item/ammo_box/magazine/m12g, /obj/item/ammo_box/magazine/mm195x129, /obj/item/antag_spawner/nuke_ops, /obj/vehicle/sealed/mecha/combat/gygax/dark, /obj/vehicle/sealed/mecha/combat/marauder/mauler, /obj/item/soap/syndie, /obj/item/gun/syringe/syndicate, /obj/item/cartridge/virus/syndicate, /obj/item/cartridge/virus/frame, /obj/item/chameleon, /obj/item/storage/box/syndie_kit/cutouts, /obj/item/clothing/suit/space/hardsuit/syndi, /obj/item/card/emag, /obj/item/storage/toolbox/syndicate, /obj/item/storage/book/bible/syndicate, /obj/item/encryptionkey/binary, /obj/item/encryptionkey/syndicate, /obj/item/aiModule/syndicate, /obj/item/clothing/shoes/magboots/syndie, /obj/item/powersink, /obj/item/sbeacondrop, /obj/item/sbeacondrop/bomb, /obj/item/syndicatedetonator, /obj/item/shield/energy, /obj/item/assault_pod, /obj/item/slimepotion/slime/sentience/nuclear, /obj/item/stack/telecrystal, /obj/item/jammer, /obj/item/codespeak_manual/unlimited, /obj/item/toy/cards/deck/syndicate, /obj/item/storage/secure/briefcase/syndie, /obj/item/storage/fancy/cigarettes/cigpack_syndicate, /obj/item/toy/syndicateballoon, /obj/item/clothing/gloves/fingerless/pugilist/rapid, /obj/item/paper/fluff/ruins/thederelict/syndie_mission, /obj/item/organ/cyberimp/eyes/hud/security/syndicate, /obj/item/clothing/head/HoS/syndicate, diff --git a/code/datums/armor.dm b/code/datums/armor.dm index 88170541c6..b01b5ba238 100644 --- a/code/datums/armor.dm +++ b/code/datums/armor.dm @@ -1,5 +1,18 @@ #define ARMORID "armor-[melee]-[bullet]-[laser]-[energy]-[bomb]-[bio]-[rad]-[fire]-[acid]-[magic]-[wound]" +#define MELEE "melee" +#define BULLET "bullet" +#define LASER "laser" +#define ENERGY "energy" +#define BOMB "bomb" +#define BIO "bio" +#define RAD "rad" +#define FIRE "fire" +#define ACID "acid" +#define MAGIC "magic" +#define WOUND "wound" + + /proc/getArmor(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, magic = 0, wound = 0) . = locate(ARMORID) if (!.) diff --git a/code/datums/components/armor_plate.dm b/code/datums/components/armor_plate.dm index 763aef6a70..ee3d11924d 100644 --- a/code/datums/components/armor_plate.dm +++ b/code/datums/components/armor_plate.dm @@ -12,7 +12,7 @@ RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine) RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/applyplate) RegisterSignal(parent, COMSIG_PARENT_PREQDELETED, .proc/dropplates) - if(istype(parent, /obj/mecha/working/ripley)) + if(istype(parent, /obj/vehicle/sealed/mecha/working/ripley)) RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, .proc/apply_mech_overlays) if(_maxamount) @@ -67,7 +67,7 @@ O.armor = O.armor.attachArmor(added_armor) if(ismecha(O)) - var/obj/mecha/R = O + var/obj/vehicle/sealed/mecha/R = O R.update_icon() to_chat(user, "You strengthen [R], improving its resistance against melee, bullet and laser damage.") else @@ -80,11 +80,11 @@ for(var/i in 1 to amount) new upgrade_item(get_turf(parent)) -/datum/component/armor_plate/proc/apply_mech_overlays(obj/mecha/mech, list/overlays) +/datum/component/armor_plate/proc/apply_mech_overlays(obj/vehicle/sealed/mecha/mech, list/overlays) if(amount) var/overlay_string = "ripley-g" if(amount >= 3) overlay_string += "-full" - if(!mech.occupant) + if(LAZYLEN(mech.occupants)) overlay_string += "-open" overlays += overlay_string diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 925ac41a0b..1f57c1ced8 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -896,9 +896,6 @@ SEND_SIGNAL(src, COMSIG_ATOM_DIR_CHANGE, dir, newdir) dir = newdir -/atom/proc/mech_melee_attack(obj/mecha/M) - return - //If a mob logouts/logins in side of an object you can use this proc /atom/proc/on_log(login) if(loc) diff --git a/code/game/gamemodes/clown_ops/clown_weapons.dm b/code/game/gamemodes/clown_ops/clown_weapons.dm index 081ffbbdc4..c75fe42884 100644 --- a/code/game/gamemodes/clown_ops/clown_weapons.dm +++ b/code/game/gamemodes/clown_ops/clown_weapons.dm @@ -243,7 +243,7 @@ projectiles = 8 projectile_energy_cost = 1000 -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/banana_mortar/bombanana/can_attach(obj/mecha/combat/honker/M) +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/banana_mortar/bombanana/can_attach(obj/vehicle/sealed/mecha/combat/honker/M) if(..()) if(istype(M)) return TRUE @@ -261,13 +261,13 @@ equip_cooldown = 60 det_time = 20 -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang/tearstache/can_attach(obj/mecha/combat/honker/M) +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang/tearstache/can_attach(obj/vehicle/sealed/mecha/combat/honker/M) if(..()) if(istype(M)) return TRUE return FALSE -/obj/mecha/combat/honker/dark +/obj/vehicle/sealed/mecha/combat/honker/dark desc = "Produced by \"Tyranny of Honk, INC\", this exosuit is designed as heavy clown-support. This one has been painted black for maximum fun. HONK!" name = "\improper Dark H.O.N.K" icon_state = "darkhonker" @@ -280,23 +280,14 @@ wreckage = /obj/structure/mecha_wreckage/honker/dark max_equip = 3 -/obj/mecha/combat/honker/dark/GrantActions(mob/living/user, human_occupant = 0) - ..() - thrusters_action.Grant(user, src) - - -/obj/mecha/combat/honker/dark/RemoveActions(mob/living/user, human_occupant = 0) - ..() - thrusters_action.Remove(user) - -/obj/mecha/combat/honker/dark/add_cell(obj/item/stock_parts/cell/C) +/obj/vehicle/sealed/mecha/combat/honker/dark/add_cell(obj/item/stock_parts/cell/C) if(C) C.forceMove(src) cell = C return cell = new /obj/item/stock_parts/cell/hyper(src) -/obj/mecha/combat/honker/dark/loaded/Initialize() +/obj/vehicle/sealed/mecha/combat/honker/dark/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/honker() ME.attach(src) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index d1781d9477..24e3215d82 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -107,19 +107,6 @@ return bumpopen(M) return - - if(ismecha(AM)) - var/obj/mecha/mecha = AM - if(density) - if(mecha.occupant) - if(world.time - mecha.occupant.last_bumped <= 10) - return - mecha.occupant.last_bumped = world.time - if(mecha.occupant && (src.allowed(mecha.occupant) || src.check_access_list(mecha.operation_req_access))) - open() - else - do_animate("deny") - return return /obj/machinery/door/Move() @@ -362,7 +349,7 @@ C.bleed(DOOR_CRUSH_DAMAGE) else L.add_splatter_floor(location) - for(var/obj/mecha/M in get_turf(src)) + for(var/obj/vehicle/sealed/mecha/M in get_turf(src)) M.take_damage(DOOR_CRUSH_DAMAGE) /obj/machinery/door/proc/autoclose() diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index af7545d3c9..4c5aa6528f 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -77,11 +77,13 @@ return if (!( ismob(AM) )) if(ismecha(AM)) - var/obj/mecha/mecha = AM - if(mecha.occupant && src.allowed(mecha.occupant)) - open_and_close() - else - do_animate("deny") + var/obj/vehicle/sealed/mecha/mecha = AM + for(var/O in mecha.occupants) + var/mob/living/occupant = O + if(allowed(occupant)) + open_and_close() + return + do_animate("deny") return if (!( SSticker )) return diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index e346439e03..cac7edf8c9 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -478,10 +478,12 @@ for(var/A in GLOB.mechas_list) if((get_dist(A, base) < scan_range) && can_see(base, A, scan_range)) - var/obj/mecha/Mech = A - if(Mech.occupant && !in_faction(Mech.occupant)) //If there is a user and they're not in our faction - if(assess_perp(Mech.occupant) >= 4) - targets += Mech + var/obj/vehicle/sealed/mecha/mech = A + for(var/O in mech.occupants) + var/mob/living/occupant = O + if(!in_faction(occupant)) //If there is a user and they're not in our faction + if(assess_perp(occupant) >= 4) + targets += mech if((turret_flags & TURRET_FLAG_SHOOT_ANOMALOUS) && GLOB.blobs.len && (mode == TURRET_LETHAL)) for(var/obj/structure/blob/B in view(scan_range, base)) diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm deleted file mode 100644 index f9a86066ff..0000000000 --- a/code/game/mecha/combat/combat.dm +++ /dev/null @@ -1,11 +0,0 @@ -/obj/mecha/combat - force = 30 - internal_damage_threshold = 50 - armor = list("melee" = 30, "bullet" = 30, "laser" = 15, "energy" = 20, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) - mouse_pointer = 'icons/mecha/mecha_mouse.dmi' - -/obj/mecha/combat/proc/max_ammo() //Max the ammo stored for Nuke Ops mechs, or anyone else that calls this - for(var/obj/item/I in equipment) - if(istype(I, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/)) - var/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/gun = I - gun.projectiles_cache = gun.projectiles_cache_max diff --git a/code/game/mecha/combat/durand.dm b/code/game/mecha/combat/durand.dm deleted file mode 100644 index 498266d043..0000000000 --- a/code/game/mecha/combat/durand.dm +++ /dev/null @@ -1,21 +0,0 @@ -/obj/mecha/combat/durand - desc = "An aging combat exosuit utilized by the Nanotrasen corporation. Originally developed to combat hostile alien lifeforms." - name = "\improper Durand" - icon_state = "durand" - step_in = 4 - dir_in = 1 //Facing North. - max_integrity = 400 - deflect_chance = 20 - armor = list("melee" = 40, "bullet" = 35, "laser" = 15, "energy" = 10, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) - max_temperature = 30000 - infra_luminosity = 8 - force = 40 - wreckage = /obj/structure/mecha_wreckage/durand - -/obj/mecha/combat/durand/GrantActions(mob/living/user, human_occupant = 0) - ..() - defense_action.Grant(user, src) - -/obj/mecha/combat/durand/RemoveActions(mob/living/user, human_occupant = 0) - ..() - defense_action.Remove(user) diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm deleted file mode 100644 index 71258d1ccb..0000000000 --- a/code/game/mecha/combat/gygax.dm +++ /dev/null @@ -1,68 +0,0 @@ -/obj/mecha/combat/gygax - desc = "A lightweight, security exosuit. Popular among private and corporate security." - name = "\improper Gygax" - icon_state = "gygax" - step_in = 3 - dir_in = 1 //Facing North. - max_integrity = 250 - deflect_chance = 5 - force = 20 - armor = list("melee" = 25, "bullet" = 20, "laser" = 30, "energy" = 15, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) - max_temperature = 25000 - infra_luminosity = 6 - wreckage = /obj/structure/mecha_wreckage/gygax - internal_damage_threshold = 35 - max_equip = 3 - step_energy_drain = 3 - leg_overload_coeff = 300 - -/obj/mecha/combat/gygax/dark - desc = "A lightweight exosuit, painted in a dark scheme. This model appears to have some modifications." - name = "\improper Dark Gygax" - icon_state = "darkgygax" - max_integrity = 300 - deflect_chance = 15 - force = 25 - armor = list("melee" = 40, "bullet" = 40, "laser" = 50, "energy" = 35, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) - max_temperature = 35000 - leg_overload_coeff = 100 - operation_req_access = list(ACCESS_SYNDICATE) - internals_req_access = list(ACCESS_SYNDICATE) - wreckage = /obj/structure/mecha_wreckage/gygax/dark - max_equip = 4 - -/obj/mecha/combat/gygax/dark/loaded/Initialize() - . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/teleporter - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay - ME.attach(src) - max_ammo() - -/obj/mecha/combat/gygax/dark/add_cell(obj/item/stock_parts/cell/C=null) - if(C) - C.forceMove(src) - cell = C - return - cell = new /obj/item/stock_parts/cell/hyper(src) - -/obj/mecha/combat/gygax/GrantActions(mob/living/user, human_occupant = 0) - ..() - overload_action.Grant(user, src) - -/obj/mecha/combat/gygax/dark/GrantActions(mob/living/user, human_occupant = 0) - ..() - thrusters_action.Grant(user, src) - - -/obj/mecha/combat/gygax/RemoveActions(mob/living/user, human_occupant = 0) - ..() - overload_action.Remove(user) - -/obj/mecha/combat/gygax/dark/RemoveActions(mob/living/user, human_occupant = 0) - ..() - thrusters_action.Remove(user) diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm deleted file mode 100644 index 11a1bc1e84..0000000000 --- a/code/game/mecha/combat/phazon.dm +++ /dev/null @@ -1,29 +0,0 @@ -/obj/mecha/combat/phazon - desc = "This is a Phazon exosuit. The pinnacle of scientific research and pride of Nanotrasen, it uses cutting edge bluespace technology and expensive materials." - name = "\improper Phazon" - icon_state = "phazon" - step_in = 2 - dir_in = 2 //Facing South. - step_energy_drain = 3 - max_integrity = 200 - deflect_chance = 30 - armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) - max_temperature = 25000 - infra_luminosity = 3 - wreckage = /obj/structure/mecha_wreckage/phazon - add_req_access = 1 - internal_damage_threshold = 25 - force = 15 - max_equip = 3 - phase_state = "phazon-phase" - -/obj/mecha/combat/phazon/GrantActions(mob/living/user, human_occupant = 0) - ..() - switch_damtype_action.Grant(user, src) - phasing_action.Grant(user, src) - - -/obj/mecha/combat/phazon/RemoveActions(mob/living/user, human_occupant = 0) - ..() - switch_damtype_action.Remove(user) - phasing_action.Remove(user) diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm deleted file mode 100644 index ef1565502e..0000000000 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ /dev/null @@ -1,171 +0,0 @@ -//DO NOT ADD MECHA PARTS TO THE GAME WITH THE DEFAULT "SPRITE ME" SPRITE! -//I'm annoyed I even have to tell you this! SPRITE FIRST, then commit. - -/obj/item/mecha_parts/mecha_equipment - name = "mecha equipment" - icon = 'icons/mecha/mecha_equipment.dmi' - icon_state = "mecha_equip" - force = 5 - max_integrity = 300 - var/equip_cooldown = 0 // cooldown after use - var/equip_ready = 1 //whether the equipment is ready for use. (or deactivated/activated for static stuff) - var/energy_drain = 0 - var/obj/mecha/chassis = null - /// Bitflag. Determines the range of the equipment. - var/range = MELEE - /// Bitflag. Used by exosuit fabricator to assign sub-categories based on which exosuits can equip this. - var/mech_flags = NONE - var/salvageable = 1 - //var/detachable = TRUE // Set to FALSE for built-in equipment that cannot be removed - var/selectable = 1 // Set to 0 for passive equipment such as mining scanner or armor plates - var/harmful = FALSE //Controls if equipment can be used to attack by a pacifist. - //var/destroy_sound = 'sound/mecha/critdestr.ogg' - -/obj/item/mecha_parts/mecha_equipment/proc/update_chassis_page() - if(chassis) - send_byjax(chassis.occupant,"exosuit.browser","eq_list",chassis.get_equipment_list()) - send_byjax(chassis.occupant,"exosuit.browser","equipment_menu",chassis.get_equipment_menu(),"dropdowns") - return 1 - return - -/obj/item/mecha_parts/mecha_equipment/proc/update_equip_info() - if(chassis) - send_byjax(chassis.occupant,"exosuit.browser","[REF(src)]",get_equip_info()) - return 1 - return - -/obj/item/mecha_parts/mecha_equipment/Destroy() - if(chassis) - chassis.equipment -= src - if(chassis.selected == src) - chassis.selected = null - src.update_chassis_page() - //log_message("[src] is destroyed.", LOG_MECHA) - chassis.log_append_to_last("[src] is destroyed.",1) - if(chassis.occupant) - chassis.occupant_message("[src] is destroyed!") - SEND_SOUND(chassis.occupant, sound(istype(src, /obj/item/mecha_parts/mecha_equipment/weapon) ? 'sound/mecha/weapdestr.ogg' : 'sound/mecha/critdestr.ogg', volume=50)) - //chassis.occupant.playsound_local(chassis, destroy_sound, 50) - //if(!detachable) //If we're a built-in nondetachable equipment, let's lock up the slot that we were in. - // chassis.max_equip-- - chassis = null - return ..() - -/obj/item/mecha_parts/mecha_equipment/proc/critfail() - if(chassis) - mecha_log_message("Critical failure", color="red") - -/obj/item/mecha_parts/mecha_equipment/proc/get_equip_info() - if(!chassis) - return - var/txt = "* " - if(chassis.selected == src) - txt += "[src.name]" - else if(selectable) - txt += "[src.name]" - else - txt += "[src.name]" - - return txt - -/obj/item/mecha_parts/mecha_equipment/proc/is_ranged()//add a distance restricted equipment. Why not? - return range&RANGED //rename to MECHA_RANGE and MECHA_MELEE - -/obj/item/mecha_parts/mecha_equipment/proc/is_melee() - return range&MELEE - - -/obj/item/mecha_parts/mecha_equipment/proc/action_checks(atom/target) - if(!target) - return 0 - if(!chassis) - return 0 - if(!equip_ready) - return 0 - if(energy_drain && !chassis.has_charge(energy_drain)) - return 0 - if(crit_fail) - return 0 - if(chassis.equipment_disabled) - to_chat(chassis.occupant, "Error -- Equipment control unit is unresponsive.") - return 0 - return 1 - -/obj/item/mecha_parts/mecha_equipment/proc/action(atom/target) - return 0 - -/obj/item/mecha_parts/mecha_equipment/proc/start_cooldown() - set_ready_state(0) - chassis.use_power(energy_drain) - addtimer(CALLBACK(src, .proc/set_ready_state, 1), equip_cooldown) - -/obj/item/mecha_parts/mecha_equipment/proc/do_after_cooldown(atom/target) - if(!chassis) - return - var/C = chassis.loc - set_ready_state(0) - chassis.use_power(energy_drain) - . = do_after(chassis.occupant, equip_cooldown, target=target) - set_ready_state(1) - if(!chassis || chassis.loc != C || src != chassis.selected || !(get_dir(chassis, target)&chassis.dir)) - return 0 - -/obj/item/mecha_parts/mecha_equipment/proc/do_after_mecha(atom/target, delay) - if(!chassis) - return - var/C = chassis.loc - . = do_after(chassis.occupant, delay, target=target) - if(!chassis || chassis.loc != C || src != chassis.selected || !(get_dir(chassis, target)&chassis.dir)) - return 0 - -/obj/item/mecha_parts/mecha_equipment/proc/can_attach(obj/mecha/M) - if(M.equipment.len[target] successfully loaded.") - mecha_log_message("Loaded [O]. Cargo compartment capacity: [cargo_holder.cargo_capacity - cargo_holder.cargo.len]") - else - O.anchored = initial(O.anchored) - else - occupant_message("Not enough room in cargo compartment!") - else - occupant_message("[target] is firmly secured!") - - else if(isliving(target)) - var/mob/living/M = target - if(M.stat == DEAD) - return - if(chassis.occupant.a_intent == INTENT_HARM) - M.take_overall_damage(dam_force) - if(!M) - return - M.adjustOxyLoss(round(dam_force/2)) - M.updatehealth() - target.visible_message("[chassis] squeezes [target].", \ - "[chassis] squeezes [target].",\ - "You hear something crack.") - log_combat(chassis.occupant, M, "attacked", "[name]", "(INTENT: [uppertext(chassis.occupant.a_intent)]) (DAMTYE: [uppertext(damtype)])") - else - step_away(M,chassis) - occupant_message("You push [target] out of the way.") - chassis.visible_message("[chassis] pushes [target] out of the way.") - return 1 - - - -//This is pretty much just for the death-ripley -/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/kill - name = "\improper KILL CLAMP" - desc = "They won't know what clamped them!" - energy_drain = 0 - dam_force = 0 - var/real_clamp = FALSE - -/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/kill/real - desc = "They won't know what clamped them! This time for real!" - energy_drain = 10 - dam_force = 20 - real_clamp = TRUE - -/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/kill/action(atom/target) - if(!action_checks(target)) - return - if(!cargo_holder) - return - if(isobj(target)) - var/obj/O = target - if(!O.anchored) - if(cargo_holder.cargo.len < cargo_holder.cargo_capacity) - chassis.visible_message("[chassis] lifts [target] and starts to load it into cargo compartment.") - O.anchored = TRUE - if(do_after_cooldown(target)) - cargo_holder.cargo += O - O.forceMove(chassis) - O.anchored = FALSE - occupant_message("[target] successfully loaded.") - mecha_log_message("Loaded [O]. Cargo compartment capacity: [cargo_holder.cargo_capacity - cargo_holder.cargo.len]") - else - O.anchored = initial(O.anchored) - else - occupant_message("Not enough room in cargo compartment!") - else - occupant_message("[target] is firmly secured!") - - else if(isliving(target)) - var/mob/living/M = target - if(M.stat == DEAD) - return - if(chassis.occupant.a_intent == INTENT_HARM) - if(real_clamp) - M.take_overall_damage(dam_force) - if(!M) - return - M.adjustOxyLoss(round(dam_force/2)) - M.updatehealth() - target.visible_message("[chassis] destroys [target] in an unholy fury.", \ - "[chassis] destroys [target] in an unholy fury.") - log_combat(chassis.occupant, M, "attacked", "[name]", "(INTENT: [uppertext(chassis.occupant.a_intent)]) (DAMTYE: [uppertext(damtype)])") - else - target.visible_message("[chassis] destroys [target] in an unholy fury.", \ - "[chassis] destroys [target] in an unholy fury.") - else if(chassis.occupant.a_intent == INTENT_DISARM) - if(real_clamp) - var/mob/living/carbon/C = target - var/play_sound = FALSE - var/limbs_gone = "" - var/obj/item/bodypart/affected = C.get_bodypart(BODY_ZONE_L_ARM) - if(affected != null) - affected.dismember(damtype) - play_sound = TRUE - limbs_gone = ", [affected]" - affected = C.get_bodypart(BODY_ZONE_R_ARM) - if(affected != null) - affected.dismember(damtype) - play_sound = TRUE - limbs_gone = "[limbs_gone], [affected]" - if(play_sound) - playsound(src, get_dismember_sound(), 80, TRUE) - target.visible_message("[chassis] rips [target]'s arms off.", \ - "[chassis] rips [target]'s arms off.") - log_combat(chassis.occupant, M, "dismembered of[limbs_gone],", "[name]", "(INTENT: [uppertext(chassis.occupant.a_intent)]) (DAMTYE: [uppertext(damtype)])") - else - target.visible_message("[chassis] rips [target]'s arms off.", \ - "[chassis] rips [target]'s arms off.") - else - step_away(M,chassis) - target.visible_message("[chassis] tosses [target] like a piece of paper.") - return 1 - - - -/obj/item/mecha_parts/mecha_equipment/extinguisher - name = "exosuit extinguisher" - desc = "Equipment for engineering exosuits. A rapid-firing high capacity fire extinguisher." - icon_state = "mecha_exting" - equip_cooldown = 5 - energy_drain = 0 - range = MELEE|RANGED - mech_flags = EXOSUIT_MODULE_WORKING - -/obj/item/mecha_parts/mecha_equipment/extinguisher/Initialize() - . = ..() - create_reagents(1000) - reagents.add_reagent(/datum/reagent/water, 1000) - -/obj/item/mecha_parts/mecha_equipment/extinguisher/action(atom/target) //copypasted from extinguisher. TODO: Rewrite from scratch. - if(!action_checks(target) || get_dist(chassis, target)>3) - return - - if(istype(target, /obj/structure/reagent_dispensers/watertank) && get_dist(chassis,target) <= 1) - var/obj/structure/reagent_dispensers/watertank/WT = target - WT.reagents.trans_to(src, 1000) - occupant_message("Extinguisher refilled.") - playsound(chassis, 'sound/effects/refill.ogg', 50, 1, -6) - else - if(reagents.total_volume > 0) - playsound(chassis, 'sound/effects/extinguish.ogg', 75, 1, -3) - var/direction = get_dir(chassis,target) - var/turf/T = get_turf(target) - var/turf/T1 = get_step(T,turn(direction, 90)) - var/turf/T2 = get_step(T,turn(direction, -90)) - - var/list/the_targets = list(T,T1,T2) - spawn(0) - for(var/a=0, a<5, a++) - var/obj/effect/particle_effect/water/W = new /obj/effect/particle_effect/water(get_turf(chassis)) - if(!W) - return - var/turf/my_target = pick(the_targets) - var/datum/reagents/R = new/datum/reagents(5) - W.reagents = R - R.my_atom = W - reagents.trans_to(W,1) - for(var/b=0, b<4, b++) - if(!W) - return - step_towards(W,my_target) - if(!W) - return - var/turf/W_turf = get_turf(W) - W.reagents.reaction(W_turf) - for(var/atom/atm in W_turf) - W.reagents.reaction(atm) - if(W.loc == my_target) - break - sleep(2) - return 1 - -/obj/item/mecha_parts/mecha_equipment/extinguisher/get_equip_info() - return "[..()] \[[src.reagents.total_volume]\]" - -/obj/item/mecha_parts/mecha_equipment/extinguisher/can_attach(obj/mecha/working/M as obj) - if(..()) - if(istype(M)) - return 1 - return 0 - - - -/obj/item/mecha_parts/mecha_equipment/rcd - name = "mounted RCD" - desc = "An exosuit-mounted Rapid Construction Device." - icon_state = "mecha_rcd" - equip_cooldown = 10 - energy_drain = 250 - range = MELEE|RANGED - item_flags = NO_MAT_REDEMPTION - var/mode = 0 //0 - deconstruct, 1 - wall or floor, 2 - airlock. - -/obj/item/mecha_parts/mecha_equipment/rcd/Initialize() - . = ..() - GLOB.rcd_list += src - -/obj/item/mecha_parts/mecha_equipment/rcd/Destroy() - GLOB.rcd_list -= src - return ..() - -/obj/item/mecha_parts/mecha_equipment/rcd/action(atom/target) - if(istype(target, /turf/open/space/transit))//>implying these are ever made -Sieve - return - - if(!isturf(target) && !istype(target, /obj/machinery/door/airlock)) - target = get_turf(target) - if(!action_checks(target) || get_dist(chassis, target)>3) - return - playsound(chassis, 'sound/machines/click.ogg', 50, 1) - - switch(mode) - if(0) - if(iswallturf(target)) - var/turf/closed/wall/W = target - occupant_message("Deconstructing [W]...") - if(do_after_cooldown(W)) - chassis.spark_system.start() - W.ScrapeAway(flags = CHANGETURF_INHERIT_AIR) - playsound(W, 'sound/items/deconstruct.ogg', 50, 1) - else if(isfloorturf(target)) - var/turf/open/floor/F = target - occupant_message("Deconstructing [F]...") - if(do_after_cooldown(target)) - chassis.spark_system.start() - F.ScrapeAway(flags = CHANGETURF_INHERIT_AIR) - playsound(F, 'sound/items/deconstruct.ogg', 50, 1) - else if (istype(target, /obj/machinery/door/airlock)) - occupant_message("Deconstructing [target]...") - if(do_after_cooldown(target)) - chassis.spark_system.start() - qdel(target) - playsound(target, 'sound/items/deconstruct.ogg', 50, 1) - if(1) - if(isspaceturf(target)) - var/turf/open/space/S = target - occupant_message("Building Floor...") - if(do_after_cooldown(S)) - S.PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) - playsound(S, 'sound/items/deconstruct.ogg', 50, 1) - chassis.spark_system.start() - else if(isfloorturf(target)) - var/turf/open/floor/F = target - occupant_message("Building Wall...") - if(do_after_cooldown(F)) - F.PlaceOnTop(/turf/closed/wall) - playsound(F, 'sound/items/deconstruct.ogg', 50, 1) - chassis.spark_system.start() - if(2) - if(isfloorturf(target)) - occupant_message("Building Airlock...") - if(do_after_cooldown(target)) - chassis.spark_system.start() - var/obj/machinery/door/airlock/T = new /obj/machinery/door/airlock(target) - T.autoclose = TRUE - playsound(target, 'sound/items/deconstruct.ogg', 50, 1) - playsound(target, 'sound/effects/sparks2.ogg', 50, 1) - - - -/obj/item/mecha_parts/mecha_equipment/rcd/do_after_cooldown(var/atom/target) - . = ..() - -/obj/item/mecha_parts/mecha_equipment/rcd/Topic(href,href_list) - ..() - if(href_list["mode"]) - mode = text2num(href_list["mode"]) - switch(mode) - if(0) - occupant_message("Switched RCD to Deconstruct.") - energy_drain = initial(energy_drain) - if(1) - occupant_message("Switched RCD to Construct.") - energy_drain = 2*initial(energy_drain) - if(2) - occupant_message("Switched RCD to Construct Airlock.") - energy_drain = 2*initial(energy_drain) - return - -/obj/item/mecha_parts/mecha_equipment/rcd/get_equip_info() - return "[..()] \[D|C|A\]" - - - - -/obj/item/mecha_parts/mecha_equipment/cable_layer - name = "cable layer" - desc = "Equipment for engineering exosuits. Lays cable along the exosuit's path." - icon_state = "mecha_wire" - var/datum/callback/event - var/turf/old_turf - var/obj/structure/cable/last_piece - var/obj/item/stack/cable_coil/cable - var/max_cable = 1000 - -/obj/item/mecha_parts/mecha_equipment/cable_layer/Initialize() - . = ..() - cable = new(src, 0) - -/obj/item/mecha_parts/mecha_equipment/cable_layer/can_attach(obj/mecha/working/M) - if(..()) - if(istype(M)) - return 1 - return 0 - -/obj/item/mecha_parts/mecha_equipment/cable_layer/attach() - ..() - event = chassis.events.addEvent("onMove", CALLBACK(src, .proc/layCable)) - return - -/obj/item/mecha_parts/mecha_equipment/cable_layer/detach() - chassis.events.clearEvent("onMove",event) - return ..() - -/obj/item/mecha_parts/mecha_equipment/cable_layer/Destroy() - if(chassis) - chassis.events.clearEvent("onMove",event) - return ..() - -/obj/item/mecha_parts/mecha_equipment/cable_layer/action(var/obj/item/stack/cable_coil/target) - if(!action_checks(target)) - return - if(istype(target) && target.amount) - var/cur_amount = cable? cable.amount : 0 - var/to_load = max(max_cable - cur_amount,0) - if(to_load) - to_load = min(target.amount, to_load) - if(!cable) - cable = new(src, 0) - cable.amount += to_load - target.use(to_load) - occupant_message("[to_load] meters of cable successfully loaded.") - send_byjax(chassis.occupant,"exosuit.browser","[REF(src)]",src.get_equip_info()) - else - occupant_message("Reel is full.") - else - occupant_message("Unable to load [target] - no cable found.") - - -/obj/item/mecha_parts/mecha_equipment/cable_layer/Topic(href,href_list) - ..() - if(href_list["toggle"]) - set_ready_state(!equip_ready) - occupant_message("[src] [equip_ready?"dea":"a"]ctivated.") - mecha_log_message("[equip_ready?"Dea":"A"]ctivated.") - return - if(href_list["cut"]) - if(cable && cable.amount) - var/m = round(input(chassis.occupant,"Please specify the length of cable to cut","Cut cable",min(cable.amount,30)) as num, 1) - m = min(m, cable.amount) - if(m) - use_cable(m) - new /obj/item/stack/cable_coil(get_turf(chassis), m) - else - occupant_message("There's no more cable on the reel.") - return - -/obj/item/mecha_parts/mecha_equipment/cable_layer/get_equip_info() - var/output = ..() - if(output) - return "[output] \[Cable: [cable ? cable.amount : 0] m\][(cable && cable.amount) ? "- [!equip_ready?"Dea":"A"]ctivate|Cut" : null]" - return - -/obj/item/mecha_parts/mecha_equipment/cable_layer/proc/use_cable(amount) - if(!cable || cable.amount<1) - set_ready_state(1) - occupant_message("Cable depleted, [src] deactivated.") - mecha_log_message("Cable depleted, [src] deactivated.") - return - if(cable.amount < amount) - occupant_message("No enough cable to finish the task.") - return - cable.use(amount) - update_equip_info() - return 1 - -/obj/item/mecha_parts/mecha_equipment/cable_layer/proc/reset() - last_piece = null - -/obj/item/mecha_parts/mecha_equipment/cable_layer/proc/dismantleFloor(var/turf/new_turf) - if(isfloorturf(new_turf)) - var/turf/open/floor/T = new_turf - if(!isplatingturf(T)) - if(!T.broken && !T.burnt) - new T.floor_tile(T) - T.make_plating() - return !new_turf.intact - -/obj/item/mecha_parts/mecha_equipment/cable_layer/proc/layCable(var/turf/new_turf) - if(equip_ready || !istype(new_turf) || !dismantleFloor(new_turf)) - return reset() - var/fdirn = turn(chassis.dir,180) - for(var/obj/structure/cable/LC in new_turf) // check to make sure there's not a cable there already - if(LC.d1 == fdirn || LC.d2 == fdirn) - return reset() - if(!use_cable(1)) - return reset() - var/obj/structure/cable/NC = new(new_turf, "red") - NC.d1 = 0 - NC.d2 = fdirn - NC.update_icon() - - var/datum/powernet/PN - if(last_piece && last_piece.d2 != chassis.dir) - last_piece.d1 = min(last_piece.d2, chassis.dir) - last_piece.d2 = max(last_piece.d2, chassis.dir) - last_piece.update_icon() - PN = last_piece.powernet - - if(!PN) - PN = new() - GLOB.powernets += PN - NC.powernet = PN - PN.cables += NC - NC.mergeConnectedNetworks(NC.d2) - - //NC.mergeConnectedNetworksOnTurf() - last_piece = NC - return 1 diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm deleted file mode 100644 index 86bbf81dd2..0000000000 --- a/code/game/mecha/mecha.dm +++ /dev/null @@ -1,1124 +0,0 @@ -#define MECHA_INT_FIRE (1<<0) -#define MECHA_INT_TEMP_CONTROL (1<<1) -#define MECHA_INT_SHORT_CIRCUIT (1<<2) -#define MECHA_INT_TANK_BREACH (1<<3) -#define MECHA_INT_CONTROL_LOST (1<<4) - -#define MELEE 1 -#define RANGED 2 - -#define FRONT_ARMOUR 1 -#define SIDE_ARMOUR 2 -#define BACK_ARMOUR 3 - - -/obj/mecha - name = "mecha" - desc = "Exosuit" - icon = 'icons/mecha/mecha.dmi' - density = TRUE //Dense. To raise the heat. - opacity = 1 ///opaque. Menacing. - anchored = TRUE //no pulling around. - resistance_flags = FIRE_PROOF | ACID_PROOF - layer = BELOW_MOB_LAYER//icon draw layer - infra_luminosity = 15 //byond implementation is bugged. - force = 5 - flags_1 = HEAR_1|BLOCK_FACE_ATOM_1 - attack_hand_speed = CLICK_CD_MELEE - attack_hand_is_action = TRUE - var/can_move = 0 //time of next allowed movement - var/mob/living/occupant = null - var/step_in = 10 //make a step in step_in/10 sec. - var/dir_in = SOUTH //What direction will the mech face when entered/powered on? Defaults to South. - var/normal_step_energy_drain = 10 //How much energy the mech will consume each time it moves. This variable is a backup for when leg actuators affect the energy drain. - var/step_energy_drain = 10 - var/melee_energy_drain = 15 - var/overload_step_energy_drain_min = 100 - max_integrity = 300 //max_integrity is base health - var/deflect_chance = 10 //chance to deflect the incoming projectiles, hits, or lesser the effect of ex_act. - armor = list("melee" = 20, "bullet" = 10, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) - var/list/facing_modifiers = list(FRONT_ARMOUR = 1.5, SIDE_ARMOUR = 1, BACK_ARMOUR = 0.5) - var/obj/item/stock_parts/cell/cell - var/state = 0 - var/list/log = new - var/last_message = 0 - var/add_req_access = 1 - var/maint_access = 0 - var/equipment_disabled = 0 //disabled due to EMP - var/dna_lock //dna-locking the mech - var/list/proc_res = list() //stores proc owners, like proc_res["functionname"] = owner reference - var/datum/effect_system/spark_spread/spark_system = new - var/lights = FALSE - var/lights_power = 6 - var/last_user_hud = 1 // used to show/hide the mecha hud while preserving previous preference - var/completely_disabled = FALSE //stops the mech from doing anything - var/breach_time = 0 - var/recharge_rate = 0 - - var/bumpsmash = 0 //Whether or not the mech destroys walls by running into it. - //inner atmos - var/use_internal_tank = 0 - var/internal_tank_valve = ONE_ATMOSPHERE - var/obj/machinery/portable_atmospherics/canister/internal_tank - var/datum/gas_mixture/cabin_air - var/obj/machinery/atmospherics/components/unary/portables_connector/connected_port = null - - var/obj/item/radio/mech/radio - var/list/trackers = list() - - var/max_temperature = 25000 - var/internal_damage_threshold = 50 //health percentage below which internal damage is possible - var/internal_damage = 0 //contains bitflags - - var/list/operation_req_access = list()//required access level for mecha operation - var/list/internals_req_access = list(ACCESS_ROBOTICS)//REQUIRED ACCESS LEVEL TO OPEN CELL COMPARTMENT - - var/wreckage - - var/list/equipment = new - var/obj/item/mecha_parts/mecha_equipment/selected - var/max_equip = 3 - var/datum/events/events - - var/stepsound = 'sound/mecha/mechstep.ogg' - var/turnsound = 'sound/mecha/mechturn.ogg' - - var/melee_cooldown = 10 - var/melee_can_hit = 1 - - //Action datums - var/datum/action/innate/mecha/mech_eject/eject_action = new - var/datum/action/innate/mecha/mech_toggle_internals/internals_action = new - var/datum/action/innate/mecha/mech_cycle_equip/cycle_action = new - var/datum/action/innate/mecha/mech_toggle_lights/lights_action = new - var/datum/action/innate/mecha/mech_view_stats/stats_action = new - var/datum/action/innate/mecha/mech_toggle_thrusters/thrusters_action = new - var/datum/action/innate/mecha/mech_defence_mode/defense_action = new - var/datum/action/innate/mecha/mech_overload_mode/overload_action = new - var/datum/effect_system/smoke_spread/smoke_system = new //not an action, but trigged by one - var/datum/action/innate/mecha/mech_smoke/smoke_action = new - var/datum/action/innate/mecha/mech_zoom/zoom_action = new - var/datum/action/innate/mecha/mech_switch_damtype/switch_damtype_action = new - var/datum/action/innate/mecha/mech_toggle_phasing/phasing_action = new - var/datum/action/innate/mecha/strafe/strafing_action = new - - //Action vars - var/thrusters_active = FALSE - var/defence_mode = FALSE - var/defence_mode_deflect_chance = 35 - var/leg_overload_mode = FALSE - var/leg_overload_coeff = 100 - var/zoom_mode = FALSE - var/smoke = 5 - var/smoke_ready = 1 - var/smoke_cooldown = 100 - var/phasing = FALSE - var/phasing_energy_drain = 200 - var/phase_state = "" //icon_state when phasing - var/strafe = FALSE //If we are strafing - - var/nextsmash = 0 - var/smashcooldown = 3 //deciseconds - - var/occupant_sight_flags = 0 //sight flags to give to the occupant (e.g. mech mining scanner gives meson-like vision) - var/mouse_pointer - - hud_possible = list (DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_TRACK_HUD) - -/obj/item/radio/mech //this has to go somewhere - -/obj/mecha/Initialize() - . = ..() - events = new - icon_state += "-open" - add_radio() - spark_system.set_up(2, 0, src) - spark_system.attach(src) - smoke_system.set_up(3, src) - smoke_system.attach(src) - add_cell() - START_PROCESSING(SSobj, src) - GLOB.poi_list |= src - mecha_log_message("[src.name] created.") - GLOB.mechas_list += src //global mech list - prepare_huds() - for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) - diag_hud.add_to_hud(src) - diag_hud_set_mechhealth() - diag_hud_set_mechcell() - diag_hud_set_mechstat() - return INITIALIZE_HINT_LATELOAD - -/obj/mecha/LateInitialize() - . = ..() - add_airtank() - add_cabin() - -/obj/mecha/get_cell() - return cell - -/obj/mecha/rust_heretic_act() - take_damage(500, BRUTE) - -/obj/mecha/Destroy() - go_out() - var/mob/living/silicon/ai/AI - for(var/mob/M in src) //Let's just be ultra sure - if(isAI(M)) - occupant = null - AI = M //AIs are loaded into the mech computer itself. When the mech dies, so does the AI. They can be recovered with an AI card from the wreck. - else - M.forceMove(loc) - if(wreckage) - if(prob(30)) - explosion(get_turf(src), 0, 0, 1, 3) - var/obj/structure/mecha_wreckage/WR = new wreckage(loc, AI) - for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) - if(E.salvageable && prob(30)) - WR.crowbar_salvage += E - E.detach(WR) //detaches from src into WR - E.equip_ready = 1 - else - E.detach(loc) - qdel(E) - if(cell) - WR.crowbar_salvage += cell - cell.forceMove(WR) - cell.charge = rand(0, cell.charge) - if(internal_tank) - WR.crowbar_salvage += internal_tank - internal_tank.forceMove(WR) - else - for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) - E.detach(loc) - qdel(E) - if(cell) - qdel(cell) - if(internal_tank) - qdel(internal_tank) - if(AI) - AI.gib() //No wreck, no AI to recover - STOP_PROCESSING(SSobj, src) - GLOB.poi_list.Remove(src) - equipment.Cut() - cell = null - internal_tank = null - assume_air(cabin_air) - cabin_air = null - qdel(spark_system) - spark_system = null - qdel(smoke_system) - smoke_system = null - - GLOB.mechas_list -= src //global mech list - return ..() - -/obj/mecha/proc/restore_equipment() - equipment_disabled = 0 - if(istype(src, /obj/mecha/combat)) - mouse_pointer = 'icons/mecha/mecha_mouse.dmi' - if(occupant) - SEND_SOUND(occupant, sound('sound/items/timer.ogg', volume=50)) - to_chat(occupant, "Equipment control unit has been rebooted successfuly.") - occupant.update_mouse_pointer() - -/obj/mecha/CheckParts(list/parts_list) - ..() - cell = locate(/obj/item/stock_parts/cell) in contents - var/obj/item/stock_parts/scanning_module/SM = locate() in contents - var/obj/item/stock_parts/capacitor/CP = locate() in contents - if(SM) - normal_step_energy_drain = 20 - (5 * SM.rating) //10 is normal, so on lowest part its worse, on second its ok and on higher its real good up to 0 on best - step_energy_drain = normal_step_energy_drain - qdel(SM) - if(CP) - armor = armor.modifyRating(energy = (CP.rating * 10)) //Each level of capacitor protects the mech against emp by 10% - qdel(CP) - -//////////////////////// -////// Helpers ///////// -//////////////////////// - -/obj/mecha/proc/add_airtank() - internal_tank = new /obj/machinery/portable_atmospherics/canister/air(src) - return internal_tank - -/obj/mecha/proc/add_cell(var/obj/item/stock_parts/cell/C=null) - if(C) - C.forceMove(src) - cell = C - return - cell = new /obj/item/stock_parts/cell/high/plus(src) - -/obj/mecha/proc/add_cabin() - cabin_air = new(200) - cabin_air.set_temperature(T20C) - cabin_air.set_moles(GAS_O2,O2STANDARD*cabin_air.return_volume()/(R_IDEAL_GAS_EQUATION*cabin_air.return_temperature())) - cabin_air.set_moles(GAS_N2,N2STANDARD*cabin_air.return_volume()/(R_IDEAL_GAS_EQUATION*cabin_air.return_temperature())) - return cabin_air - -/obj/mecha/proc/add_radio() - radio = new(src) - radio.name = "[src] radio" - radio.icon = icon - radio.icon_state = icon_state - radio.subspace_transmission = TRUE - -/obj/mecha/proc/can_use(mob/user) - if(user != occupant) - return 0 - if(user && ismob(user)) - if(!user.incapacitated()) - return 1 - return 0 - -//////////////////////////////////////////////////////////////////////////////// - -/obj/mecha/examine(mob/user) - . = ..() - var/integrity = obj_integrity*100/max_integrity - switch(integrity) - if(85 to 100) - . += "It's fully intact." - if(65 to 85) - . += "It's slightly damaged." - if(45 to 65) - . += "It's badly damaged." - if(25 to 45) - . += "It's heavily damaged." - else - . += "It's falling apart." - if(equipment && equipment.len) - . += "It's equipped with:" - for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment) - . += "[icon2html(ME, user)] \A [ME]." - -//processing internal damage, temperature, air regulation, alert updates, lights power use. -/obj/mecha/process() - var/internal_temp_regulation = 1 - - if(internal_damage) - if(internal_damage & MECHA_INT_FIRE) - if(!(internal_damage & MECHA_INT_TEMP_CONTROL) && prob(5)) - clearInternalDamage(MECHA_INT_FIRE) - if(internal_tank) - var/datum/gas_mixture/int_tank_air = internal_tank.return_air() - if(int_tank_air.return_pressure() > internal_tank.maximum_pressure && !(internal_damage & MECHA_INT_TANK_BREACH)) - setInternalDamage(MECHA_INT_TANK_BREACH) - if(int_tank_air && int_tank_air.return_volume() > 0) //heat the air_contents - int_tank_air.set_temperature(min(6000+T0C, int_tank_air.return_temperature()+rand(10,15))) - if(cabin_air && cabin_air.return_volume()>0) - cabin_air.set_temperature(min(6000+T0C, cabin_air.return_temperature()+rand(10,15))) - if(cabin_air.return_temperature() > max_temperature/2) - take_damage(4/round(max_temperature/cabin_air.return_temperature(),0.1), BURN, 0, 0) - - if(internal_damage & MECHA_INT_TEMP_CONTROL) - internal_temp_regulation = 0 - - if(internal_damage & MECHA_INT_TANK_BREACH) //remove some air from internal tank - if(internal_tank) - assume_air_ratio(internal_tank.return_air(), 0.1) - - if(internal_damage & MECHA_INT_SHORT_CIRCUIT) - if(get_charge()) - spark_system.start() - cell.charge -= min(20,cell.charge) - cell.maxcharge -= min(20,cell.maxcharge) - - if(internal_temp_regulation) - if(cabin_air && cabin_air.return_volume() > 0) - var/delta = cabin_air.return_temperature() - T20C - cabin_air.set_temperature(cabin_air.return_temperature() - max(-10, min(10, round(delta/4,0.1)))) - - if(internal_tank) - var/datum/gas_mixture/tank_air = internal_tank.return_air() - - var/release_pressure = internal_tank_valve - var/cabin_pressure = cabin_air.return_pressure() - var/pressure_delta = min(release_pressure - cabin_pressure, (tank_air.return_pressure() - cabin_pressure)/2) - var/transfer_moles = 0 - if(pressure_delta > 0) //cabin pressure lower than release pressure - if(tank_air.return_temperature() > 0) - transfer_moles = pressure_delta*cabin_air.return_volume()/(cabin_air.return_temperature() * R_IDEAL_GAS_EQUATION) - tank_air.transfer_to(cabin_air,transfer_moles) - else if(pressure_delta < 0) //cabin pressure higher than release pressure - var/datum/gas_mixture/t_air = return_air() - pressure_delta = cabin_pressure - release_pressure - if(t_air) - pressure_delta = min(cabin_pressure - t_air.return_pressure(), pressure_delta) - if(pressure_delta > 0) //if location pressure is lower than cabin pressure - transfer_moles = pressure_delta*cabin_air.return_volume()/(cabin_air.return_temperature() * R_IDEAL_GAS_EQUATION) - cabin_air.transfer_to(t_air, transfer_moles) - - if(occupant) - if(cell) - var/cellcharge = cell.charge/cell.maxcharge - switch(cellcharge) - if(0.75 to INFINITY) - occupant.clear_alert("charge") - if(0.5 to 0.75) - occupant.throw_alert("charge", /atom/movable/screen/alert/lowcell, 1) - if(0.25 to 0.5) - occupant.throw_alert("charge", /atom/movable/screen/alert/lowcell, 2) - if(0.01 to 0.25) - occupant.throw_alert("charge", /atom/movable/screen/alert/lowcell, 3) - else - occupant.throw_alert("charge", /atom/movable/screen/alert/emptycell) - - var/integrity = obj_integrity/max_integrity*100 - switch(integrity) - if(30 to 45) - occupant.throw_alert("mech damage", /atom/movable/screen/alert/low_mech_integrity, 1) - if(15 to 35) - occupant.throw_alert("mech damage", /atom/movable/screen/alert/low_mech_integrity, 2) - if(-INFINITY to 15) - occupant.throw_alert("mech damage", /atom/movable/screen/alert/low_mech_integrity, 3) - else - occupant.clear_alert("mech damage") - var/atom/checking = occupant.loc - // recursive check to handle all cases regarding very nested occupants, - // such as brainmob inside brainitem inside MMI inside mecha - while (!isnull(checking)) - if (isturf(checking)) - // hit a turf before hitting the mecha, seems like they have - // been moved out - occupant.clear_alert("charge") - occupant.clear_alert("mech damage") - RemoveActions(occupant, human_occupant=1) - occupant = null - break - else if (checking == src) - break // all good - checking = checking.loc - - if(lights) - var/lights_energy_drain = 2 - use_power(lights_energy_drain) - -//Diagnostic HUD updates - diag_hud_set_mechhealth() - diag_hud_set_mechcell() - diag_hud_set_mechstat() - -/obj/mecha/proc/drop_item()//Derpfix, but may be useful in future for engineering exosuits. - return - -/obj/mecha/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode, atom/movable/source) - . = ..() - if(speaker == occupant) - if(radio.broadcasting) - radio.talk_into(speaker, text, , spans, message_language) - //flick speech bubble - var/list/speech_bubble_recipients = list() - for(var/mob/M in get_hearers_in_view(7,src)) - if(M.client) - speech_bubble_recipients.Add(M.client) - INVOKE_ASYNC(GLOBAL_PROC, /proc/flick_overlay, image('icons/mob/talk.dmi', src, "machine[say_test(raw_message)]",MOB_LAYER+1), speech_bubble_recipients, 30) - -//////////////////////////// -///// Action processing //// -//////////////////////////// - - -/obj/mecha/proc/click_action(atom/target,mob/user,params) - if(!occupant || occupant != user ) - return - if(!locate(/turf) in list(target,target.loc)) // Prevents inventory from being drilled - return - if(completely_disabled) - return - if(phasing) - occupant_message("Unable to interact with objects while phasing") - return - if(user.incapacitated()) - return - if(state) - occupant_message("Maintenance protocols in effect.") - return - if(!get_charge()) - return - if(src == target) - return - var/dir_to_target = get_dir(src,target) - if(dir_to_target && !(dir_to_target & dir))//wrong direction - return - if(internal_damage & MECHA_INT_CONTROL_LOST) - target = safepick(view(3,target)) - if(!target) - return - - var/mob/living/L = user - if(!Adjacent(target)) - if(selected && selected.is_ranged()) - if(HAS_TRAIT(L, TRAIT_PACIFISM) && selected.harmful) - to_chat(user, "You don't want to harm other living beings!") - return - if(selected.action(target,params)) - selected.start_cooldown() - else if(selected && selected.is_melee()) - if(isliving(target) && selected.harmful && HAS_TRAIT(L, TRAIT_PACIFISM)) - to_chat(user, "You don't want to harm other living beings!") - return - if(selected.action(target,params)) - selected.start_cooldown() - else - if(internal_damage & MECHA_INT_CONTROL_LOST) - target = safepick(oview(1,src)) - if(!melee_can_hit || !istype(target, /atom)) - return - target.mech_melee_attack(src) - melee_can_hit = 0 - spawn(melee_cooldown) - melee_can_hit = 1 - - -/obj/mecha/proc/range_action(atom/target) - return - - -////////////////////////////////// -//////// Movement procs //////// -////////////////////////////////// - -/obj/mecha/Move(atom/newloc, direct) - . = ..() - if(.) - events.fireEvent("onMove",get_turf(src)) - if (internal_tank.disconnect()) // Something moved us and broke connection - occupant_message("Air port connection teared off!") - mecha_log_message("Lost connection to gas port.") - -/obj/mecha/setDir(newdir) - . = ..() - occupant?.setDir(newdir) - -/obj/mecha/Process_Spacemove(var/movement_dir = 0) - . = ..() - if(.) - return 1 - if(thrusters_active && movement_dir && use_power(step_energy_drain)) - return 1 - - var/atom/movable/backup = get_spacemove_backup() - if(backup) - if(istype(backup) && movement_dir && !backup.anchored) - if(backup.newtonian_move(turn(movement_dir, 180))) - if(occupant) - to_chat(occupant, "You push off of [backup] to propel yourself.") - return 1 - -/obj/mecha/relaymove(mob/user,direction) - if(completely_disabled) - return - if(!direction) - return - if(user != occupant) //While not "realistic", this piece is player friendly. - user.forceMove(get_turf(src)) - to_chat(user, "You climb out from [src].") - return 0 - if(internal_tank.connected_port) - if(world.time - last_message > 20) - occupant_message("Unable to move while connected to the air system port!") - last_message = world.time - return 0 - if(state) - occupant_message("Maintenance protocols in effect.") - return - return domove(direction) - -/obj/mecha/proc/domove(direction) - if(can_move >= world.time) - return 0 - if(!Process_Spacemove(direction)) - return 0 - if(!has_charge(step_energy_drain)) - return 0 - if(defence_mode) - if(world.time - last_message > 20) - occupant_message("Unable to move while in defence mode") - last_message = world.time - return 0 - if(zoom_mode) - if(world.time - last_message > 20) - occupant_message("Unable to move while in zoom mode.") - last_message = world.time - return 0 - - var/move_result = 0 - var/oldloc = loc - if(internal_damage & MECHA_INT_CONTROL_LOST) - move_result = mechsteprand() - else if(dir != direction && (!strafe || occupant.client.keys_held["Alt"])) - move_result = mechturn(direction) - else - move_result = mechstep(direction) - if(move_result || loc != oldloc)// halfway done diagonal move still returns false - use_power(step_energy_drain) - can_move = world.time + step_in - return 1 - return 0 - -/obj/mecha/proc/mechturn(direction) - setDir(direction) - if(turnsound) - playsound(src,turnsound,40,1) - return 1 - -/obj/mecha/proc/mechstep(direction) - var/current_dir = dir - set_glide_size(DELAY_TO_GLIDE_SIZE(step_in)) - var/result = step(src,direction) - if(strafe) - setDir(current_dir) - if(result && stepsound) - playsound(src,stepsound,40,1) - return result - -/obj/mecha/proc/mechsteprand() - var/result = step_rand(src) - if(result && stepsound) - playsound(src,stepsound,40,1) - return result - -/obj/mecha/Bump(var/atom/obstacle) - if(phasing && get_charge() >= phasing_energy_drain && !throwing) - spawn() - if(can_move) - can_move = 0 - if(phase_state) - flick(phase_state, src) - forceMove(get_step(src,dir)) - use_power(phasing_energy_drain) - sleep(step_in*3) - can_move = 1 - else - if(..()) //mech was thrown - return - if(bumpsmash && occupant) //Need a pilot to push the PUNCH button. - if(nextsmash < world.time) - obstacle.mech_melee_attack(src) - nextsmash = world.time + smashcooldown - if(!obstacle || obstacle.CanPass(src,get_step(src,dir))) - step(src,dir) - if(isobj(obstacle)) - var/obj/O = obstacle - if(!O.anchored) - step(obstacle, dir) - else if(ismob(obstacle)) - var/mob/M = obstacle - if(!M.anchored) - step(obstacle, dir) - - - - - -/////////////////////////////////// -//////// Internal damage //////// -/////////////////////////////////// - -/obj/mecha/proc/check_for_internal_damage(list/possible_int_damage,ignore_threshold=null) - if(!islist(possible_int_damage) || isemptylist(possible_int_damage)) - return - if(prob(20)) - if(ignore_threshold || obj_integrity*100/max_integrity < internal_damage_threshold) - for(var/T in possible_int_damage) - if(internal_damage & T) - possible_int_damage -= T - var/int_dam_flag = safepick(possible_int_damage) - if(int_dam_flag) - setInternalDamage(int_dam_flag) - if(prob(5)) - if(ignore_threshold || obj_integrity*100/max_integrity < internal_damage_threshold) - var/obj/item/mecha_parts/mecha_equipment/ME = safepick(equipment) - if(ME) - qdel(ME) - return - -/obj/mecha/proc/setInternalDamage(int_dam_flag) - internal_damage |= int_dam_flag - log_append_to_last("Internal damage of type [int_dam_flag].",1) - SEND_SOUND(occupant, sound('sound/machines/warning-buzzer.ogg',wait=0)) - diag_hud_set_mechstat() - return - -/obj/mecha/proc/clearInternalDamage(int_dam_flag) - if(internal_damage & int_dam_flag) - switch(int_dam_flag) - if(MECHA_INT_TEMP_CONTROL) - occupant_message("Life support system reactivated.") - if(MECHA_INT_FIRE) - occupant_message("Internal fire extinquished.") - if(MECHA_INT_TANK_BREACH) - occupant_message("Damaged internal tank has been sealed.") - internal_damage &= ~int_dam_flag - diag_hud_set_mechstat() - -///////////////////////////////////// -//////////// AI piloting //////////// -///////////////////////////////////// - -/obj/mecha/attack_ai(mob/living/silicon/ai/user) - if(!isAI(user)) - return - //Allows the Malf to scan a mech's status and loadout, helping it to decide if it is a worthy chariot. - if(user.can_dominate_mechs) - examine(user) //Get diagnostic information! - for(var/obj/item/mecha_parts/mecha_tracking/B in trackers) - to_chat(user, "Warning: Tracking Beacon detected. Enter at your own risk. Beacon Data:") - to_chat(user, "[B.get_mecha_info()]") - break - //Nothing like a big, red link to make the player feel powerful! - to_chat(user, "ASSUME DIRECT CONTROL?
") - else - examine(user) - if(occupant) - to_chat(user, "This exosuit has a pilot and cannot be controlled.") - return - var/can_control_mech = 0 - for(var/obj/item/mecha_parts/mecha_tracking/ai_control/A in trackers) - can_control_mech = 1 - to_chat(user, "[icon2html(src, user)] Status of [name]:\n[A.get_mecha_info()]") - break - if(!can_control_mech) - to_chat(user, "You cannot control exosuits without AI control beacons installed.") - return - to_chat(user, "Take control of exosuit?
") - -/obj/mecha/transfer_ai(interaction, mob/user, mob/living/silicon/ai/AI, obj/item/aicard/card) - if(!..()) - return - - //Transfer from core or card to mech. Proc is called by mech. - switch(interaction) - if(AI_TRANS_TO_CARD) //Upload AI from mech to AI card. - if(!state) //Mech must be in maint mode to allow carding. - to_chat(user, "[name] must have maintenance protocols active in order to allow a transfer.") - return - AI = occupant - if(!AI || !isAI(occupant)) //Mech does not have an AI for a pilot - to_chat(user, "No AI detected in the [name] onboard computer.") - return - AI.ai_restore_power()//So the AI initially has power. - AI.control_disabled = 1 - AI.radio_enabled = 0 - AI.disconnect_shell() - RemoveActions(AI, TRUE) - occupant = null - AI.forceMove(card) - card.AI = AI - AI.controlled_mech = null - AI.remote_control = null - icon_state = initial(icon_state)+"-open" - to_chat(AI, "You have been downloaded to a mobile storage device. Wireless connection offline.") - to_chat(user, "Transfer successful: [AI.name] ([rand(1000,9999)].exe) removed from [name] and stored within local memory.") - - if(AI_MECH_HACK) //Called by AIs on the mech - AI.linked_core = new /obj/structure/AIcore/deactivated(AI.loc) - if(AI.can_dominate_mechs) - if(occupant) //Oh, I am sorry, were you using that? - to_chat(AI, "Pilot detected! Forced ejection initiated!") - to_chat(occupant, "You have been forcibly ejected!") - go_out(1) //IT IS MINE, NOW. SUCK IT, RD! - ai_enter_mech(AI, interaction) - - if(AI_TRANS_FROM_CARD) //Using an AI card to upload to a mech. - AI = card.AI - if(!AI) - to_chat(user, "There is no AI currently installed on this device.") - return - if(AI.deployed_shell) //Recall AI if shelled so it can be checked for a client - AI.disconnect_shell() - if(AI.stat || !AI.client) - to_chat(user, "[AI.name] is currently unresponsive, and cannot be uploaded.") - return - if(occupant || dna_lock) //Normal AIs cannot steal mechs! - to_chat(user, "Access denied. [name] is [occupant ? "currently occupied" : "secured with a DNA lock"].") - return - AI.control_disabled = 0 - AI.radio_enabled = 1 - to_chat(user, "Transfer successful: [AI.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed.") - card.AI = null - ai_enter_mech(AI, interaction) - -//Hack and From Card interactions share some code, so leave that here for both to use. -/obj/mecha/proc/ai_enter_mech(mob/living/silicon/ai/AI, interaction) - AI.ai_restore_power() - AI.forceMove(src) - occupant = AI - icon_state = initial(icon_state) - playsound(src, 'sound/machines/windowdoor.ogg', 50, 1) - if(!internal_damage) - SEND_SOUND(occupant, sound('sound/mecha/nominal.ogg',volume=50)) - AI.cancel_camera() - AI.controlled_mech = src - AI.remote_control = src - AI.mobility_flags = MOBILITY_FLAGS_DEFAULT //Much easier than adding AI checks! Be sure to set this back to 0 if you decide to allow an AI to leave a mech somehow. - AI.can_shunt = 0 //ONE AI ENTERS. NO AI LEAVES. - to_chat(AI, AI.can_dominate_mechs ? "Takeover of [name] complete! You are now loaded onto the onboard computer. Do not attempt to leave the station sector!" :\ - "You have been uploaded to a mech's onboard computer.") - to_chat(AI, "Use Middle-Mouse to activate mech functions and equipment. Click normally for AI interactions.") - if(interaction == AI_TRANS_FROM_CARD) - GrantActions(AI, FALSE) //No eject/return to core action for AI uploaded by card - else - GrantActions(AI, !AI.can_dominate_mechs) - - -//An actual AI (simple_animal mecha pilot) entering the mech -/obj/mecha/proc/aimob_enter_mech(mob/living/simple_animal/hostile/syndicate/mecha_pilot/pilot_mob) - if(pilot_mob && pilot_mob.Adjacent(src)) - if(occupant) - return - icon_state = initial(icon_state) - occupant = pilot_mob - pilot_mob.mecha = src - pilot_mob.forceMove(src) - GrantActions(pilot_mob)//needed for checks, and incase a badmin puts somebody in the mob - -/obj/mecha/proc/aimob_exit_mech(mob/living/simple_animal/hostile/syndicate/mecha_pilot/pilot_mob) - if(occupant == pilot_mob) - occupant = null - if(pilot_mob.mecha == src) - pilot_mob.mecha = null - icon_state = "[initial(icon_state)]-open" - pilot_mob.forceMove(get_turf(src)) - RemoveActions(pilot_mob) - - -///////////////////////////////////// -//////// Atmospheric stuff //////// -///////////////////////////////////// - -/obj/mecha/remove_air(amount) - if(use_internal_tank) - return cabin_air.remove(amount) - return ..() - -/obj/mecha/remove_air_ratio(ratio) - if(use_internal_tank) - return cabin_air.remove_ratio(ratio) - return ..() - -/obj/mecha/return_air() - if(use_internal_tank) - return cabin_air - return ..() - -/obj/mecha/proc/return_pressure() - var/datum/gas_mixture/t_air = return_air() - if(t_air) - . = t_air.return_pressure() - return - -/obj/mecha/return_temperature() - var/datum/gas_mixture/t_air = return_air() - if(t_air) - . = t_air.return_temperature() - return - -/obj/mecha/portableConnectorReturnAir() - return internal_tank.return_air() - - -/obj/mecha/MouseDrop_T(mob/M, mob/user) - if (!user.canUseTopic(src) || (user != M)) - return - if(!ishuman(user)) // no silicons or drones in mechas. - return - mecha_log_message("[user] tries to move in.") - if (occupant) - to_chat(usr, "The [name] is already occupied!") - log_append_to_last("Permission denied.") - return - if(dna_lock) - var/passed = FALSE - if(user.has_dna()) - var/mob/living/carbon/C = user - if(C.dna.unique_enzymes==dna_lock) - passed = TRUE - if (!passed) - to_chat(user, "Access denied. [name] is secured with a DNA lock.") - log_append_to_last("Permission denied.") - return - if(!operation_allowed(user)) - to_chat(user, "Access denied. Insufficient operation keycodes.") - log_append_to_last("Permission denied.") - return - if(user.buckled) - to_chat(user, "You are currently buckled and cannot move.") - log_append_to_last("Permission denied.") - return - if(user.has_buckled_mobs()) //mob attached to us - to_chat(user, "You can't enter the exosuit with other creatures attached to you!") - return - - visible_message("[user] starts to climb into [name].") - - if(do_after(user, 40, target = src)) - if(obj_integrity <= 0) - to_chat(user, "You cannot get in the [name], it has been destroyed!") - else if(occupant) - to_chat(user, "[occupant] was faster! Try better next time, loser.") - else if(user.buckled) - to_chat(user, "You can't enter the exosuit while buckled.") - else if(user.has_buckled_mobs()) - to_chat(user, "You can't enter the exosuit with other creatures attached to you!") - else - moved_inside(user) - else - to_chat(user, "You stop entering the exosuit!") - return - -/obj/mecha/proc/moved_inside(mob/living/carbon/human/H) - if(H?.client && (H in range(1))) - occupant = H - H.forceMove(src) - H.update_mouse_pointer() - add_fingerprint(H) - GrantActions(H, human_occupant=1) - forceMove(loc) - log_append_to_last("[H] moved in as pilot.") - icon_state = initial(icon_state) - setDir(dir_in) - playsound(src, 'sound/machines/windowdoor.ogg', 50, 1) - if(!internal_damage) - SEND_SOUND(occupant, sound('sound/mecha/nominal.ogg',volume=50)) - return 1 - else - return 0 - -/obj/mecha/proc/mmi_move_inside(obj/item/mmi/mmi_as_oc, mob/user) - if(!mmi_as_oc.brainmob || !mmi_as_oc.brainmob.client) - to_chat(user, "Consciousness matrix not detected!") - return FALSE - else if(mmi_as_oc.brainmob.stat) - to_chat(user, "Beta-rhythm below acceptable level!") - return FALSE - else if(occupant) - to_chat(user, "Occupant detected!") - return FALSE - else if(dna_lock && (!mmi_as_oc.brainmob.stored_dna || (dna_lock != mmi_as_oc.brainmob.stored_dna.unique_enzymes))) - to_chat(user, "Access denied. [name] is secured with a DNA lock.") - return FALSE - - visible_message("[user] starts to insert an MMI into [name].") - - if(do_after(user, 40, target = src)) - if(!occupant) - return mmi_moved_inside(mmi_as_oc, user) - else - to_chat(user, "Occupant detected!") - else - to_chat(user, "You stop inserting the MMI.") - return FALSE - -/obj/mecha/proc/mmi_moved_inside(obj/item/mmi/mmi_as_oc, mob/user) - if(!(Adjacent(mmi_as_oc) && Adjacent(user))) - return FALSE - if(!mmi_as_oc.brainmob || !mmi_as_oc.brainmob.client) - to_chat(user, "Consciousness matrix not detected!") - return FALSE - else if(mmi_as_oc.brainmob.stat) - to_chat(user, "Beta-rhythm below acceptable level!") - return FALSE - if(!user.transferItemToLoc(mmi_as_oc, src)) - to_chat(user, "\the [mmi_as_oc] is stuck to your hand, you cannot put it in \the [src]!") - return FALSE - var/mob/living/brainmob = mmi_as_oc.brainmob - mmi_as_oc.mecha = src - occupant = brainmob - brainmob.forceMove(src) //should allow relaymove - brainmob.reset_perspective(src) - brainmob.remote_control = src - brainmob.update_mobility() - brainmob.update_mouse_pointer() - icon_state = initial(icon_state) - update_icon() - setDir(dir_in) - mecha_log_message("[mmi_as_oc] moved in as pilot.") - if(!internal_damage) - SEND_SOUND(occupant, sound('sound/mecha/nominal.ogg',volume=50)) - GrantActions(brainmob) - return TRUE - -/obj/mecha/container_resist(mob/living/user) - go_out() - -/obj/mecha/Exited(atom/movable/M, atom/newloc) - if(occupant && occupant == M) // The occupant exited the mech without calling go_out() - go_out(TRUE, newloc) - -/obj/mecha/proc/go_out(forced, atom/newloc = loc) - if(!occupant) - return - var/atom/movable/mob_container - occupant.clear_alert("charge") - occupant.clear_alert("mech damage") - if(ishuman(occupant)) - mob_container = occupant - RemoveActions(occupant, human_occupant=1) - else if(isbrain(occupant)) - var/mob/living/brain/brain = occupant - RemoveActions(brain) - mob_container = brain.container - else if(isAI(occupant)) - var/mob/living/silicon/ai/AI = occupant - if(forced)//This should only happen if there are multiple AIs in a round, and at least one is Malf. - RemoveActions(occupant) - occupant.gib() //If one Malf decides to steal a mech from another AI (even other Malfs!), they are destroyed, as they have nowhere to go when replaced. - occupant = null - return - else - if(!AI.linked_core) - to_chat(AI, "Inactive core destroyed. Unable to return.") - AI.linked_core = null - return - to_chat(AI, "Returning to core...") - AI.controlled_mech = null - AI.remote_control = null - RemoveActions(occupant, 1) - mob_container = AI - newloc = get_turf(AI.linked_core) - qdel(AI.linked_core) - else - return - var/mob/living/L = occupant - occupant = null //we need it null when forceMove calls Exited(). - if(mob_container.forceMove(newloc))//ejecting mob container - mecha_log_message("[mob_container] moved out.") - L << browse(null, "window=exosuit") - - if(istype(mob_container, /obj/item/mmi)) - var/obj/item/mmi/mmi = mob_container - if(mmi.brainmob) - L.forceMove(mmi) - L.reset_perspective() - mmi.mecha = null - mmi.update_icon() - L.mobility_flags = NONE - icon_state = initial(icon_state)+"-open" - setDir(dir_in) - - if(L && L.client) - L.update_mouse_pointer() - L.client.view_size.resetToDefault() - zoom_mode = 0 - -///////////////////////// -////// Access stuff ///// -///////////////////////// - -/obj/mecha/proc/operation_allowed(mob/M) - req_access = operation_req_access - req_one_access = list() - return allowed(M) - -/obj/mecha/proc/internals_access_allowed(mob/M) - req_one_access = internals_req_access - req_access = list() - return allowed(M) - - - -//////////////////////////////// -/////// Messages and Log /////// -//////////////////////////////// - -/obj/mecha/proc/occupant_message(message as text) - if(message) - if(occupant && occupant.client) - to_chat(occupant, "[icon2html(src, occupant)] [message]") - return - -/obj/mecha/proc/mecha_log_message(message, color) - log.len++ - log[log.len] = list("time"="[STATION_TIME_TIMESTAMP("hh:mm:ss", world.time)]","date","year"="[GLOB.year_integer]","message"="[color?"":null][message][color?"":null]") - log_message(message, LOG_GAME, color) //also do the normal admin logs I guess. - return log.len - -/obj/mecha/proc/log_append_to_last(message as text,red=null) - var/list/last_entry = log[log.len] - last_entry["message"] += "
[red?"":null][message][red?"":null]" - return - -/////////////////////// -///// Power stuff ///// -/////////////////////// - -/obj/mecha/proc/has_charge(amount) - return (get_charge()>=amount) - -/obj/mecha/proc/get_charge() - for(var/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/R in equipment) - var/relay_charge = R.get_charge() - if(relay_charge) - return relay_charge - if(cell) - return max(0, cell.charge) - -/obj/mecha/proc/use_power(amount) - if(get_charge()) - cell.use(amount) - return 1 - return 0 - -/obj/mecha/proc/give_power(amount) - if(!isnull(get_charge())) - cell.give(amount) - return 1 - return 0 - -/obj/mecha/update_remote_sight(mob/living/user) - if(occupant_sight_flags) - if(user == occupant) - user.sight |= occupant_sight_flags - -/////////////////////// -////// Ammo stuff ///// -/////////////////////// - -/obj/mecha/proc/ammo_resupply(var/obj/item/mecha_ammo/A, mob/user,var/fail_chat_override = FALSE) - if(!A.rounds) - if(!fail_chat_override) - to_chat(user, "This box of ammo is empty!") - return FALSE - var/ammo_needed - var/found_gun - for(var/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/gun in equipment) - ammo_needed = 0 - - if(istype(gun, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic) && gun.ammo_type == A.ammo_type) - found_gun = TRUE - if(A.direct_load) - ammo_needed = initial(gun.projectiles) - gun.projectiles - else - ammo_needed = gun.projectiles_cache_max - gun.projectiles_cache - - if(ammo_needed) - if(ammo_needed < A.rounds) - if(A.direct_load) - gun.projectiles = gun.projectiles + ammo_needed - else - gun.projectiles_cache = gun.projectiles_cache + ammo_needed - playsound(get_turf(user),A.load_audio,50,1) - to_chat(user, "You add [ammo_needed] [A.round_term][ammo_needed > 1?"s":""] to the [gun.name]") - A.rounds = A.rounds - ammo_needed - A.update_name() - return TRUE - - else - if(A.direct_load) - gun.projectiles = gun.projectiles + A.rounds - else - gun.projectiles_cache = gun.projectiles_cache + A.rounds - playsound(get_turf(user),A.load_audio,50,1) - to_chat(user, "You add [A.rounds] [A.round_term][A.rounds > 1?"s":""] to the [gun.name]") - A.rounds = 0 - A.update_name() - return TRUE - if(!fail_chat_override) - if(found_gun) - to_chat(user, "You can't fit any more ammo of this type!") - else - to_chat(user, "None of the equipment on this exosuit can use this ammo!") - return FALSE diff --git a/code/game/mecha/mecha_actions.dm b/code/game/mecha/mecha_actions.dm deleted file mode 100644 index ee43e3f770..0000000000 --- a/code/game/mecha/mecha_actions.dm +++ /dev/null @@ -1,285 +0,0 @@ -//////////////////////////////////////// Action Buttons /////////////////////////////////////////////// - -/obj/mecha/proc/GrantActions(mob/living/user, human_occupant = 0) - if(human_occupant) - eject_action.Grant(user, src) - internals_action.Grant(user, src) - cycle_action.Grant(user, src) - lights_action.Grant(user, src) - stats_action.Grant(user, src) - strafing_action.Grant(user, src) - - -/obj/mecha/proc/RemoveActions(mob/living/user, human_occupant = 0) - if(human_occupant) - eject_action.Remove(user) - internals_action.Remove(user) - cycle_action.Remove(user) - lights_action.Remove(user) - stats_action.Remove(user) - strafing_action.Remove(user) - - -/datum/action/innate/mecha - check_flags = AB_CHECK_RESTRAINED | AB_CHECK_STUN | AB_CHECK_CONSCIOUS - icon_icon = 'icons/mob/actions/actions_mecha.dmi' - var/obj/mecha/chassis - -/datum/action/innate/mecha/Grant(mob/living/L, obj/mecha/M) - if(M) - chassis = M - ..() - -/datum/action/innate/mecha/Destroy() - chassis = null - return ..() - -/datum/action/innate/mecha/mech_eject - name = "Eject From Mech" - button_icon_state = "mech_eject" - -/datum/action/innate/mecha/mech_eject/Activate() - if(!owner) - return - if(!chassis || chassis.occupant != owner) - return - chassis.go_out() - - -/datum/action/innate/mecha/mech_toggle_internals - name = "Toggle Internal Airtank Usage" - button_icon_state = "mech_internals_off" - -/datum/action/innate/mecha/mech_toggle_internals/Activate() - if(!owner || !chassis || chassis.occupant != owner) - return - chassis.use_internal_tank = !chassis.use_internal_tank - button_icon_state = "mech_internals_[chassis.use_internal_tank ? "on" : "off"]" - chassis.occupant_message("Now taking air from [chassis.use_internal_tank?"internal airtank":"environment"].") - chassis.mecha_log_message("Now taking air from [chassis.use_internal_tank?"internal airtank":"environment"].") - UpdateButtonIcon() - -/datum/action/innate/mecha/mech_cycle_equip - name = "Cycle Equipment" - button_icon_state = "mech_cycle_equip_off" - -/datum/action/innate/mecha/mech_cycle_equip/Activate() - if(!owner || !chassis || chassis.occupant != owner) - return - - var/list/available_equipment = list() - for(var/obj/item/mecha_parts/mecha_equipment/M in chassis.equipment) - if(M.selectable) - available_equipment += M - - if(available_equipment.len == 0) - chassis.occupant_message("No equipment available.") - return - if(!chassis.selected) - chassis.selected = available_equipment[1] - chassis.occupant_message("You select [chassis.selected]") - send_byjax(chassis.occupant,"exosuit.browser","eq_list",chassis.get_equipment_list()) - button_icon_state = "mech_cycle_equip_on" - UpdateButtonIcon() - return - var/number = 0 - for(var/A in available_equipment) - number++ - if(A == chassis.selected) - if(available_equipment.len == number) - chassis.selected = null - chassis.occupant_message("You switch to no equipment") - button_icon_state = "mech_cycle_equip_off" - else - chassis.selected = available_equipment[number+1] - chassis.occupant_message("You switch to [chassis.selected]") - button_icon_state = "mech_cycle_equip_on" - send_byjax(chassis.occupant,"exosuit.browser","eq_list",chassis.get_equipment_list()) - UpdateButtonIcon() - return - - -/datum/action/innate/mecha/mech_toggle_lights - name = "Toggle Lights" - button_icon_state = "mech_lights_off" - -/datum/action/innate/mecha/mech_toggle_lights/Activate() - if(!owner || !chassis || chassis.occupant != owner) - return - chassis.lights = !chassis.lights - if(chassis.lights) - chassis.set_light(chassis.lights_power) - button_icon_state = "mech_lights_on" - else - chassis.set_light(-chassis.lights_power) - button_icon_state = "mech_lights_off" - chassis.occupant_message("Toggled lights [chassis.lights?"on":"off"].") - chassis.mecha_log_message("Toggled lights [chassis.lights?"on":"off"].") - UpdateButtonIcon() - -/datum/action/innate/mecha/mech_view_stats - name = "View Stats" - button_icon_state = "mech_view_stats" - -/datum/action/innate/mecha/mech_view_stats/Activate() - if(!owner || !chassis || chassis.occupant != owner) - return - chassis.occupant << browse(chassis.get_stats_html(), "window=exosuit") - - -/datum/action/innate/mecha/strafe - name = "Toggle Strafing. Disabled when Alt is held." - button_icon_state = "strafe" - -/datum/action/innate/mecha/strafe/Activate() - if(!owner || !chassis || chassis.occupant != owner) - return - - chassis.toggle_strafe() - -/obj/mecha/AltClick(mob/living/user) - . = ..() - if((user == occupant) && user.canUseTopic(src)) - toggle_strafe() - return TRUE - -/obj/mecha/proc/toggle_strafe() - strafe = !strafe - - occupant_message("Toggled strafing mode [strafe?"on":"off"].") - mecha_log_message("Toggled strafing mode [strafe?"on":"off"].") - strafing_action.UpdateButtonIcon() - -//////////////////////////////////////// Specific Ability Actions /////////////////////////////////////////////// -//Need to be granted by the mech type, Not default abilities. - -/datum/action/innate/mecha/mech_toggle_thrusters - name = "Toggle Thrusters" - button_icon_state = "mech_thrusters_off" - -/datum/action/innate/mecha/mech_toggle_thrusters/Activate() - if(!owner || !chassis || chassis.occupant != owner) - return - if(chassis.get_charge() > 0) - chassis.thrusters_active = !chassis.thrusters_active - button_icon_state = "mech_thrusters_[chassis.thrusters_active ? "on" : "off"]" - chassis.mecha_log_message("Toggled thrusters.") - chassis.occupant_message("Thrusters [chassis.thrusters_active ?"en":"dis"]abled.") - - -/datum/action/innate/mecha/mech_defence_mode - name = "Toggle Defence Mode" - button_icon_state = "mech_defense_mode_off" - -/datum/action/innate/mecha/mech_defence_mode/Activate(forced_state = null) - if(!owner || !chassis || chassis.occupant != owner) - return - if(!isnull(forced_state)) - chassis.defence_mode = forced_state - else - chassis.defence_mode = !chassis.defence_mode - button_icon_state = "mech_defense_mode_[chassis.defence_mode ? "on" : "off"]" - if(chassis.defence_mode) - chassis.deflect_chance = chassis.defence_mode_deflect_chance - chassis.occupant_message("You enable [chassis] defence mode.") - else - chassis.deflect_chance = initial(chassis.deflect_chance) - chassis.occupant_message("You disable [chassis] defence mode.") - chassis.mecha_log_message("Toggled defence mode.") - UpdateButtonIcon() - -/datum/action/innate/mecha/mech_overload_mode - name = "Toggle leg actuators overload" - button_icon_state = "mech_overload_off" - -/datum/action/innate/mecha/mech_overload_mode/Activate(forced_state = null) - if(!owner || !chassis || chassis.occupant != owner) - return - if(!isnull(forced_state)) - chassis.leg_overload_mode = forced_state - else - chassis.leg_overload_mode = !chassis.leg_overload_mode - button_icon_state = "mech_overload_[chassis.leg_overload_mode ? "on" : "off"]" - chassis.mecha_log_message("Toggled leg actuators overload.") - if(chassis.leg_overload_mode) - chassis.leg_overload_mode = 1 - chassis.bumpsmash = 1 - chassis.step_in = min(1, round(chassis.step_in/2)) - chassis.step_energy_drain = max(chassis.overload_step_energy_drain_min,chassis.step_energy_drain*chassis.leg_overload_coeff) - chassis.occupant_message("You enable leg actuators overload.") - else - chassis.leg_overload_mode = 0 - chassis.bumpsmash = 0 - chassis.step_in = initial(chassis.step_in) - chassis.step_energy_drain = chassis.normal_step_energy_drain - chassis.occupant_message("You disable leg actuators overload.") - UpdateButtonIcon() - -/datum/action/innate/mecha/mech_smoke - name = "Smoke" - button_icon_state = "mech_smoke" - -/datum/action/innate/mecha/mech_smoke/Activate() - if(!owner || !chassis || chassis.occupant != owner) - return - if(chassis.smoke_ready && chassis.smoke>0) - chassis.smoke_system.start() - chassis.smoke-- - chassis.smoke_ready = 0 - spawn(chassis.smoke_cooldown) - chassis.smoke_ready = 1 - - -/datum/action/innate/mecha/mech_zoom - name = "Zoom" - button_icon_state = "mech_zoom_off" - -/datum/action/innate/mecha/mech_zoom/Activate() - if(!owner || !chassis || chassis.occupant != owner) - return - if(owner.client) - chassis.zoom_mode = !chassis.zoom_mode - button_icon_state = "mech_zoom_[chassis.zoom_mode ? "on" : "off"]" - chassis.mecha_log_message("Toggled zoom mode.") - chassis.occupant_message("Zoom mode [chassis.zoom_mode?"en":"dis"]abled.") - if(chassis.zoom_mode) - owner.client.view_size.setTo(4.5) - SEND_SOUND(owner, sound('sound/mecha/imag_enh.ogg',volume=50)) - else - owner.client.view_size.resetToDefault() - UpdateButtonIcon() - -/datum/action/innate/mecha/mech_switch_damtype - name = "Reconfigure arm microtool arrays" - button_icon_state = "mech_damtype_brute" - -/datum/action/innate/mecha/mech_switch_damtype/Activate() - if(!owner || !chassis || chassis.occupant != owner) - return - var/new_damtype - switch(chassis.damtype) - if("tox") - new_damtype = "brute" - chassis.occupant_message("Your exosuit's hands form into fists.") - if("brute") - new_damtype = "fire" - chassis.occupant_message("A torch tip extends from your exosuit's hand, glowing red.") - if("fire") - new_damtype = "tox" - chassis.occupant_message("A bone-chillingly thick plasteel needle protracts from the exosuit's palm.") - chassis.damtype = new_damtype - button_icon_state = "mech_damtype_[new_damtype]" - playsound(src, 'sound/mecha/mechmove01.ogg', 50, 1) - UpdateButtonIcon() - -/datum/action/innate/mecha/mech_toggle_phasing - name = "Toggle Phasing" - button_icon_state = "mech_phasing_off" - -/datum/action/innate/mecha/mech_toggle_phasing/Activate() - if(!owner || !chassis || chassis.occupant != owner) - return - chassis.phasing = !chassis.phasing - button_icon_state = "mech_phasing_[chassis.phasing ? "on" : "off"]" - chassis.occupant_message("En":"#f00\">Dis"]abled phasing.") - UpdateButtonIcon() diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm deleted file mode 100644 index 34cb57f661..0000000000 --- a/code/game/mecha/mecha_construction_paths.dm +++ /dev/null @@ -1,2292 +0,0 @@ -//////////////////////////////// -///// Construction datums ////// -//////////////////////////////// -/datum/component/construction/mecha - var/base_icon - var/looky_helpy = TRUE - -/datum/component/construction/mecha/examine(datum/source, mob/user, list/examine_list) - . = ..() - if(looky_helpy) - switch(steps[index]["key"]) - if(TOOL_WRENCH) - examine_list += "The mech could be wrenched into place." - if(TOOL_SCREWDRIVER) - examine_list += "The mech could be screwed into place." - if(TOOL_WIRECUTTER) - examine_list += "The mech wires could be trimmed into place." - if(/obj/item/stack/cable_coil) - examine_list += "The mech could use some wiring." - if(/obj/item/circuitboard) - examine_list += "The mech could use a type ofcircuitboard." - if(/obj/item/stock_parts/scanning_module) - examine_list += "The mech could use a scanning stock part." - if(/obj/item/stock_parts/capacitor) - examine_list += "The mech could use a power based stock part." - if(/obj/item/stock_parts/cell) - examine_list += "The mech could use a power source." - if(/obj/item/stack/sheet/metal) - examine_list += "The mech could use some sheets of metal." - if(/obj/item/stack/sheet/plasteel) - examine_list += "The mech could use some sheets of strong steel." - if(/obj/item/bikehorn) - examine_list += "HONK IT!." - if(/obj/item/clothing/mask/gas/clown_hat) - examine_list += "GIVE IT CLOWN MAKEUP HONK!." - if(/obj/item/clothing/shoes/clown_shoes) - examine_list += "GIVE IT GOOFY SHOES HONK HONK!." - if(/obj/item/mecha_parts/part) - examine_list += "The mech could use a mech part." - if(/obj/item/stack/ore/bluespace_crystal) - examine_list += "The mech could use a crystal of sorts." - if(/obj/item/assembly/signaler/anomaly) - examine_list += "The mech could use a anomaly of sorts." - -/datum/component/construction/mecha/spawn_result() - if(!result) - return - // Remove default mech power cell, as we replace it with a new one. - var/obj/mecha/M = new result(drop_location()) - QDEL_NULL(M.cell) - - var/obj/item/mecha_parts/chassis/parent_chassis = parent - M.CheckParts(parent_chassis.contents) - - SSblackbox.record_feedback("tally", "mechas_created", 1, M.name) - QDEL_NULL(parent) - -/datum/component/construction/mecha/update_parent(step_index) - ..() - // By default, each step in mech construction has a single icon_state: - // "[base_icon][index - 1]" - // For example, Ripley's step 1 icon_state is "ripley0". - var/atom/parent_atom = parent - if(!steps[index]["icon_state"] && base_icon) - parent_atom.icon_state = "[base_icon][index - 1]" - -/datum/component/construction/unordered/mecha_chassis/custom_action(obj/item/I, mob/living/user, typepath) - . = user.transferItemToLoc(I, parent) - if(.) - var/atom/parent_atom = parent - user.visible_message("[user] has connected [I] to [parent].", "You connect [I] to [parent].") - parent_atom.add_overlay(I.icon_state+"+o") - qdel(I) - -/datum/component/construction/unordered/mecha_chassis/spawn_result() - var/atom/parent_atom = parent - parent_atom.icon = 'icons/mecha/mech_construction.dmi' - parent_atom.density = TRUE - parent_atom.cut_overlays() - ..() - - -/datum/component/construction/unordered/mecha_chassis/ripley - result = /datum/component/construction/mecha/ripley - steps = list( - /obj/item/mecha_parts/part/ripley_torso, - /obj/item/mecha_parts/part/ripley_left_arm, - /obj/item/mecha_parts/part/ripley_right_arm, - /obj/item/mecha_parts/part/ripley_left_leg, - /obj/item/mecha_parts/part/ripley_right_leg - ) - -/datum/component/construction/mecha/ripley - result = /obj/mecha/working/ripley - base_icon = "ripley" - steps = list( - //1 - list( - "key" = TOOL_WRENCH, - "desc" = "The hydraulic systems are disconnected." - ), - - //2 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_WRENCH, - "desc" = "The hydraulic systems are connected." - ), - - //3 - list( - "key" = /obj/item/stack/cable_coil, - "amount" = 5, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The hydraulic systems are active." - ), - - //4 - list( - "key" = TOOL_WIRECUTTER, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The wiring is added." - ), - - //5 - list( - "key" = /obj/item/circuitboard/mecha/ripley/main, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The wiring is adjusted." - ), - - //6 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Central control module is installed." - ), - - //7 - list( - "key" = /obj/item/circuitboard/mecha/ripley/peripherals, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Central control module is secured." - ), - - //8 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Peripherals control module is installed." - ), - - //9 - list( - "key" = /obj/item/stock_parts/scanning_module, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Peripherals control module is secured." - ), - - //10 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "The scanner module is installed." - ), - - //11 - list( - "key" = /obj/item/stock_parts/capacitor, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Scanner module is secured." - ), - - //12 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Capacitor is installed." - ), - - //13 - list( - "key" = /obj/item/stock_parts/cell, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Capacitor is secured." - ), - - //14 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "The power cell is installed." - ), - - //15 - list( - "key" = /obj/item/stack/sheet/metal, - "amount" = 5, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The power cell is secured." - ), - - //16 - list( - "key" = TOOL_WRENCH, - "back_key" = TOOL_CROWBAR, - "desc" = "Internal armor is installed." - ), - - //17 - list( - "key" = TOOL_WELDER, - "back_key" = TOOL_WRENCH, - "desc" = "Internal armor is wrenched." - ), - - //18 - list( - "key" = /obj/item/stack/sheet/plasteel, - "amount" = 5, - "back_key" = TOOL_WELDER, - "desc" = "Internal armor is welded." - ), - - //19 - list( - "key" = TOOL_WRENCH, - "back_key" = TOOL_CROWBAR, - "desc" = "External armor is installed." - ), - - //20 - list( - "key" = TOOL_WELDER, - "back_key" = TOOL_WRENCH, - "desc" = "External armor is wrenched." - ), - ) - -/datum/component/construction/mecha/ripley/custom_action(obj/item/I, mob/living/user, diff) - if(!..()) - return FALSE - - switch(index) - if(1) - user.visible_message("[user] connects [parent] hydraulic systems", "You connect [parent] hydraulic systems.") - if(2) - if(diff==FORWARD) - user.visible_message("[user] activates [parent] hydraulic systems.", "You activate [parent] hydraulic systems.") - else - user.visible_message("[user] disconnects [parent] hydraulic systems", "You disconnect [parent] hydraulic systems.") - if(3) - if(diff==FORWARD) - user.visible_message("[user] adds the wiring to [parent].", "You add the wiring to [parent].") - else - user.visible_message("[user] deactivates [parent] hydraulic systems.", "You deactivate [parent] hydraulic systems.") - if(4) - if(diff==FORWARD) - user.visible_message("[user] adjusts the wiring of [parent].", "You adjust the wiring of [parent].") - else - user.visible_message("[user] removes the wiring from [parent].", "You remove the wiring from [parent].") - if(5) - if(diff==FORWARD) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") - else - user.visible_message("[user] disconnects the wiring of [parent].", "You disconnect the wiring of [parent].") - if(6) - if(diff==FORWARD) - user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") - else - user.visible_message("[user] removes the central control module from [parent].", "You remove the central computer mainboard from [parent].") - if(7) - if(diff==FORWARD) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") - else - user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") - if(8) - if(diff==FORWARD) - user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") - else - user.visible_message("[user] removes the peripherals control module from [parent].", "You remove the peripherals control module from [parent].") - if(9) - if(diff==FORWARD) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") - else - user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") - if(10) - if(diff==FORWARD) - user.visible_message("[user] secures the scanner module.", "You secure the scanner module.") - else - user.visible_message("[user] removes the scanner module from [parent].", "You remove the scanner module from [parent].") - if(11) - if(diff==FORWARD) - user.visible_message("[user] installs [I] to [parent].", "You install [I] to [parent].") - else - user.visible_message("[user] unfastens the scanner module.", "You unfasten the scanner module.") - if(12) - if(diff==FORWARD) - user.visible_message("[user] secures [I].", "You secure [I].") - else - user.visible_message("[user] removes the capacitor from [parent].", "You remove the capacitor from [parent].") - if(13) - if(diff==FORWARD) - user.visible_message("[user] installs [I].", "You install [I].") - else - user.visible_message("[user] unsecures the capacitor from [parent].", "You unsecure the capacitor from [parent].") - if(14) - if(diff==FORWARD) - user.visible_message("[user] secures the power cell.", "You secure the power cell.") - else - user.visible_message("[user] pries the power cell from [parent].", "You pry the power cell from [parent].") - if(15) - if(diff==FORWARD) - user.visible_message("[user] installs the internal armor layer to [parent].", "You install the internal armor layer to [parent].") - else - user.visible_message("[user] unfastens the power cell.", "You unfasten the power cell.") - if(16) - if(diff==FORWARD) - user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") - else - user.visible_message("[user] pries internal armor layer from [parent].", "You pry internal armor layer from [parent].") - if(17) - if(diff==FORWARD) - user.visible_message("[user] welds the internal armor layer to [parent].", "You weld the internal armor layer to [parent].") - else - user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") - if(18) - if(diff==FORWARD) - user.visible_message("[user] installs the external reinforced armor layer to [parent].", "You install the external reinforced armor layer to [parent].") - else - user.visible_message("[user] cuts the internal armor layer from [parent].", "You cut the internal armor layer from [parent].") - if(19) - if(diff==FORWARD) - user.visible_message("[user] secures the external armor layer.", "You secure the external reinforced armor layer.") - else - user.visible_message("[user] pries external armor layer from [parent].", "You pry external armor layer from [parent].") - if(20) - if(diff==FORWARD) - user.visible_message("[user] welds the external armor layer to [parent].", "You weld the external armor layer to [parent].") - else - user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.") - return TRUE - -/datum/component/construction/unordered/mecha_chassis/gygax - result = /datum/component/construction/mecha/gygax - steps = list( - /obj/item/mecha_parts/part/gygax_torso, - /obj/item/mecha_parts/part/gygax_left_arm, - /obj/item/mecha_parts/part/gygax_right_arm, - /obj/item/mecha_parts/part/gygax_left_leg, - /obj/item/mecha_parts/part/gygax_right_leg, - /obj/item/mecha_parts/part/gygax_head - ) - -/datum/component/construction/mecha/gygax - result = /obj/mecha/combat/gygax - base_icon = "gygax" - steps = list( - //1 - list( - "key" = TOOL_WRENCH, - "desc" = "The hydraulic systems are disconnected." - ), - - //2 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_WRENCH, - "desc" = "The hydraulic systems are connected." - ), - - //3 - list( - "key" = /obj/item/stack/cable_coil, - "amount" = 5, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The hydraulic systems are active." - ), - - //4 - list( - "key" = TOOL_WIRECUTTER, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The wiring is added." - ), - - //5 - list( - "key" = /obj/item/circuitboard/mecha/gygax/main, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The wiring is adjusted." - ), - - //6 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Central control module is installed." - ), - - //7 - list( - "key" = /obj/item/circuitboard/mecha/gygax/peripherals, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Central control module is secured." - ), - - //8 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Peripherals control module is installed." - ), - - //9 - list( - "key" = /obj/item/circuitboard/mecha/gygax/targeting, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Peripherals control module is secured." - ), - - //10 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Weapon control module is installed." - ), - - //11 - list( - "key" = /obj/item/stock_parts/scanning_module, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Weapon control module is secured." - ), - - //12 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Scanner module is installed." - ), - - //13 - list( - "key" = /obj/item/stock_parts/capacitor, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Scanner module is secured." - ), - - //14 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Capacitor is installed." - ), - - //15 - list( - "key" = /obj/item/stock_parts/cell, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Capacitor is secured." - ), - - //16 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "The power cell is installed." - ), - - //17 - list( - "key" = /obj/item/stack/sheet/metal, - "amount" = 5, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The power cell is secured." - ), - - //18 - list( - "key" = TOOL_WRENCH, - "back_key" = TOOL_CROWBAR, - "desc" = "Internal armor is installed." - ), - - //19 - list( - "key" = TOOL_WELDER, - "back_key" = TOOL_WRENCH, - "desc" = "Internal armor is wrenched." - ), - - //20 - list( - "key" = /obj/item/mecha_parts/part/gygax_armor, - "action" = ITEM_DELETE, - "back_key" = TOOL_WELDER, - "desc" = "Internal armor is welded." - ), - - //21 - list( - "key" = TOOL_WRENCH, - "back_key" = TOOL_CROWBAR, - "desc" = "External armor is installed." - ), - - //22 - list( - "key" = TOOL_WELDER, - "back_key" = TOOL_WRENCH, - "desc" = "External armor is wrenched." - ), - - ) - -/datum/component/construction/mecha/gygax/action(datum/source, atom/used_atom, mob/user) - return check_step(used_atom,user) - -/datum/component/construction/mecha/gygax/custom_action(obj/item/I, mob/living/user, diff) - if(!..()) - return FALSE - - switch(index) - if(1) - user.visible_message("[user] connects [parent] hydraulic systems", "You connect [parent] hydraulic systems.") - if(2) - if(diff==FORWARD) - user.visible_message("[user] activates [parent] hydraulic systems.", "You activate [parent] hydraulic systems.") - else - user.visible_message("[user] disconnects [parent] hydraulic systems", "You disconnect [parent] hydraulic systems.") - if(3) - if(diff==FORWARD) - user.visible_message("[user] adds the wiring to [parent].", "You add the wiring to [parent].") - else - user.visible_message("[user] deactivates [parent] hydraulic systems.", "You deactivate [parent] hydraulic systems.") - if(4) - if(diff==FORWARD) - user.visible_message("[user] adjusts the wiring of [parent].", "You adjust the wiring of [parent].") - else - user.visible_message("[user] removes the wiring from [parent].", "You remove the wiring from [parent].") - if(5) - if(diff==FORWARD) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") - else - user.visible_message("[user] disconnects the wiring of [parent].", "You disconnect the wiring of [parent].") - if(6) - if(diff==FORWARD) - user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") - else - user.visible_message("[user] removes the central control module from [parent].", "You remove the central computer mainboard from [parent].") - if(7) - if(diff==FORWARD) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") - else - user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") - if(8) - if(diff==FORWARD) - user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") - else - user.visible_message("[user] removes the peripherals control module from [parent].", "You remove the peripherals control module from [parent].") - if(9) - if(diff==FORWARD) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") - else - user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") - if(10) - if(diff==FORWARD) - user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.") - else - user.visible_message("[user] removes the weapon control module from [parent].", "You remove the weapon control module from [parent].") - if(11) - if(diff==FORWARD) - user.visible_message("[user] installs [I] to [parent].", "You install [I] to [parent].") - else - user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.") - if(12) - if(diff==FORWARD) - user.visible_message("[user] secures the scanner module.", "You secure the scanner module.") - else - user.visible_message("[user] removes the scanner module from [parent].", "You remove the scanner module from [parent].") - if(13) - if(diff==FORWARD) - user.visible_message("[user] installs [I] to [parent].", "You install [I] to [parent].") - else - user.visible_message("[user] unfastens the scanner module.", "You unfasten the scanner module.") - if(14) - if(diff==FORWARD) - user.visible_message("[user] secures the capacitor.", "You secure the capacitor.") - else - user.visible_message("[user] removes the capacitor from [parent].", "You remove the capacitor from [parent].") - if(15) - if(diff==FORWARD) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") - else - user.visible_message("[user] unfastens the capacitor.", "You unfasten the capacitor.") - if(16) - if(diff==FORWARD) - user.visible_message("[user] secures the power cell.", "You secure the power cell.") - else - user.visible_message("[user] pries the power cell from [parent].", "You pry the power cell from [parent].") - if(17) - if(diff==FORWARD) - user.visible_message("[user] installs the internal armor layer to [parent].", "You install the internal armor layer to [parent].") - else - user.visible_message("[user] unfastens the power cell.", "You unfasten the power cell.") - if(18) - if(diff==FORWARD) - user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") - else - user.visible_message("[user] pries internal armor layer from [parent].", "You pry internal armor layer from [parent].") - if(19) - if(diff==FORWARD) - user.visible_message("[user] welds the internal armor layer to [parent].", "You weld the internal armor layer to [parent].") - else - user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") - if(20) - if(diff==FORWARD) - user.visible_message("[user] installs [I] to [parent].", "You install [I] to [parent].") - else - user.visible_message("[user] cuts the internal armor layer from [parent].", "You cut the internal armor layer from [parent].") - if(21) - if(diff==FORWARD) - user.visible_message("[user] secures Gygax Armor Plates.", "You secure Gygax Armor Plates.") - else - user.visible_message("[user] pries Gygax Armor Plates from [parent].", "You pry Gygax Armor Plates from [parent].") - if(22) - if(diff==FORWARD) - user.visible_message("[user] welds Gygax Armor Plates to [parent].", "You weld Gygax Armor Plates to [parent].") - else - user.visible_message("[user] unfastens Gygax Armor Plates.", "You unfasten Gygax Armor Plates.") - return TRUE - -//Begin Medigax -/datum/component/construction/unordered/mecha_chassis/medigax - result = /datum/component/construction/mecha/medigax - steps = list( - /obj/item/mecha_parts/part/medigax_torso, - /obj/item/mecha_parts/part/medigax_left_arm, - /obj/item/mecha_parts/part/medigax_right_arm, - /obj/item/mecha_parts/part/medigax_left_leg, - /obj/item/mecha_parts/part/medigax_right_leg, - /obj/item/mecha_parts/part/medigax_head - ) - -/datum/component/construction/mecha/medigax - result = /obj/mecha/medical/medigax - base_icon = "medigax" - steps = list( - //1 - list( - "key" = TOOL_WRENCH, - "desc" = "The hydraulic systems are disconnected." - ), - - //2 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_WRENCH, - "desc" = "The hydraulic systems are connected." - ), - - //3 - list( - "key" = /obj/item/stack/cable_coil, - "amount" = 5, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The hydraulic systems are active." - ), - - //4 - list( - "key" = TOOL_WIRECUTTER, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The wiring is added." - ), - - //5 - list( - "key" = /obj/item/circuitboard/mecha/gygax/main, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The wiring is adjusted." - ), - - //6 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Central control module is installed." - ), - - //7 - list( - "key" = /obj/item/circuitboard/mecha/gygax/peripherals, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Central control module is secured." - ), - - //8 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Peripherals control module is installed." - ), - - //9 - list( - "key" = /obj/item/circuitboard/mecha/gygax/targeting, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Peripherals control module is secured." - ), - - //10 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Weapon control module is installed." - ), - - //11 - list( - "key" = /obj/item/stock_parts/scanning_module, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Weapon control module is secured." - ), - - //12 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Scanner module is installed." - ), - - //13 - list( - "key" = /obj/item/stock_parts/capacitor, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Scanner module is secured." - ), - - //14 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Capacitor is installed." - ), - - //15 - list( - "key" = /obj/item/stock_parts/cell, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Capacitor is secured." - ), - - //16 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "The power cell is installed." - ), - - //17 - list( - "key" = /obj/item/stack/sheet/metal, - "amount" = 5, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The power cell is secured." - ), - - //18 - list( - "key" = TOOL_WRENCH, - "back_key" = TOOL_CROWBAR, - "desc" = "Internal armor is installed." - ), - - //19 - list( - "key" = TOOL_WELDER, - "back_key" = TOOL_WRENCH, - "desc" = "Internal armor is wrenched." - ), - - //20 - list( - "key" = /obj/item/mecha_parts/part/medigax_armor, - "action" = ITEM_DELETE, - "back_key" = TOOL_WELDER, - "desc" = "Internal armor is welded." - ), - - //21 - list( - "key" = TOOL_WRENCH, - "back_key" = TOOL_CROWBAR, - "desc" = "External armor is installed." - ), - - //22 - list( - "key" = TOOL_WELDER, - "back_key" = TOOL_WRENCH, - "desc" = "External armor is wrenched." - ), - - ) - -/datum/component/construction/mecha/medigax/action(datum/source, atom/used_atom, mob/user) - return check_step(used_atom,user) - -/datum/component/construction/mecha/medigax/custom_action(obj/item/I, mob/living/user, diff) - if(!..()) - return FALSE - - switch(index) - if(1) - user.visible_message("[user] connects [parent] hydraulic systems", "You connect [parent] hydraulic systems.") - if(2) - if(diff==FORWARD) - user.visible_message("[user] activates [parent] hydraulic systems.", "You activate [parent] hydraulic systems.") - else - user.visible_message("[user] disconnects [parent] hydraulic systems", "You disconnect [parent] hydraulic systems.") - if(3) - if(diff==FORWARD) - user.visible_message("[user] adds the wiring to [parent].", "You add the wiring to [parent].") - else - user.visible_message("[user] deactivates [parent] hydraulic systems.", "You deactivate [parent] hydraulic systems.") - if(4) - if(diff==FORWARD) - user.visible_message("[user] adjusts the wiring of [parent].", "You adjust the wiring of [parent].") - else - user.visible_message("[user] removes the wiring from [parent].", "You remove the wiring from [parent].") - if(5) - if(diff==FORWARD) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") - else - user.visible_message("[user] disconnects the wiring of [parent].", "You disconnect the wiring of [parent].") - if(6) - if(diff==FORWARD) - user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") - else - user.visible_message("[user] removes the central control module from [parent].", "You remove the central computer mainboard from [parent].") - if(7) - if(diff==FORWARD) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") - else - user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") - if(8) - if(diff==FORWARD) - user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") - else - user.visible_message("[user] removes the peripherals control module from [parent].", "You remove the peripherals control module from [parent].") - if(9) - if(diff==FORWARD) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") - else - user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") - if(10) - if(diff==FORWARD) - user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.") - else - user.visible_message("[user] removes the weapon control module from [parent].", "You remove the weapon control module from [parent].") - if(11) - if(diff==FORWARD) - user.visible_message("[user] installs [I] to [parent].", "You install [I] to [parent].") - else - user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.") - if(12) - if(diff==FORWARD) - user.visible_message("[user] secures the scanner module.", "You secure the scanner module.") - else - user.visible_message("[user] removes the scanner module from [parent].", "You remove the scanner module from [parent].") - if(13) - if(diff==FORWARD) - user.visible_message("[user] installs [I] to [parent].", "You install [I] to [parent].") - else - user.visible_message("[user] unfastens the scanner module.", "You unfasten the scanner module.") - if(14) - if(diff==FORWARD) - user.visible_message("[user] secures the capacitor.", "You secure the capacitor.") - else - user.visible_message("[user] removes the capacitor from [parent].", "You remove the capacitor from [parent].") - if(15) - if(diff==FORWARD) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") - else - user.visible_message("[user] unfastens the capacitor.", "You unfasten the capacitor.") - if(16) - if(diff==FORWARD) - user.visible_message("[user] secures the power cell.", "You secure the power cell.") - else - user.visible_message("[user] pries the power cell from [parent].", "You pry the power cell from [parent].") - if(17) - if(diff==FORWARD) - user.visible_message("[user] installs the internal armor layer to [parent].", "You install the internal armor layer to [parent].") - else - user.visible_message("[user] unfastens the power cell.", "You unfasten the power cell.") - if(18) - if(diff==FORWARD) - user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") - else - user.visible_message("[user] pries internal armor layer from [parent].", "You pry internal armor layer from [parent].") - if(19) - if(diff==FORWARD) - user.visible_message("[user] welds the internal armor layer to [parent].", "You weld the internal armor layer to [parent].") - else - user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") - if(20) - if(diff==FORWARD) - user.visible_message("[user] installs [I] to [parent].", "You install [I] to [parent].") - else - user.visible_message("[user] cuts the internal armor layer from [parent].", "You cut the internal armor layer from [parent].") - if(21) - if(diff==FORWARD) - user.visible_message("[user] secures Gygax Armor Plates.", "You secure Medical Gygax Armor Plates.") - else - user.visible_message("[user] pries Gygax Armor Plates from [parent].", "You pry Medical Gygax Armor Plates from [parent].") - if(22) - if(diff==FORWARD) - user.visible_message("[user] welds Gygax Armor Plates to [parent].", "You weld Medical Gygax Armor Plates to [parent].") - else - user.visible_message("[user] unfastens Gygax Armor Plates.", "You unfasten Medical Gygax Armor Plates.") - return TRUE -// End Medigax - -/datum/component/construction/unordered/mecha_chassis/firefighter - result = /datum/component/construction/mecha/firefighter - steps = list( - /obj/item/mecha_parts/part/ripley_torso, - /obj/item/mecha_parts/part/ripley_left_arm, - /obj/item/mecha_parts/part/ripley_right_arm, - /obj/item/mecha_parts/part/ripley_left_leg, - /obj/item/mecha_parts/part/ripley_right_leg, - /obj/item/clothing/suit/fire - ) - -/datum/component/construction/mecha/firefighter - result = /obj/mecha/working/ripley/firefighter - base_icon = "fireripley" - steps = list( - //1 - list( - "key" = TOOL_WRENCH, - "desc" = "The hydraulic systems are disconnected." - ), - - //2 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_WRENCH, - "desc" = "The hydraulic systems are connected." - ), - - //3 - list( - "key" = /obj/item/stack/cable_coil, - "amount" = 5, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The hydraulic systems are active." - ), - - //4 - list( - "key" = TOOL_WIRECUTTER, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The wiring is added." - ), - - //5 - list( - "key" = /obj/item/circuitboard/mecha/ripley/main, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The wiring is adjusted." - ), - - //6 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Central control module is installed." - ), - - //7 - list( - "key" = /obj/item/circuitboard/mecha/ripley/peripherals, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Central control module is secured." - ), - - //8 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Peripherals control module is installed." - ), - - //9 - list( - "key" = /obj/item/stock_parts/scanning_module, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Peripherals control module is secured." - ), - - //10 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "The scanner module is installed." - ), - - //11 - list( - "key" = /obj/item/stock_parts/capacitor, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The scanner module is secured." - ), - - //12 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "The capacitor is installed." - ), - - //13 - list( - "key" = /obj/item/stock_parts/cell, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The capacitor is secured." - ), - - //14 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "The power cell is installed." - ), - - //15 - list( - "key" = /obj/item/stack/sheet/plasteel, - "amount" = 5, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The power cell is secured." - ), - - //16 - list( - "key" = TOOL_WRENCH, - "back_key" = TOOL_CROWBAR, - "desc" = "Internal armor is installed." - ), - - //17 - list( - "key" = TOOL_WELDER, - "back_key" = TOOL_WRENCH, - "desc" = "Internal armor is wrenched." - ), - - //18 - list( - "key" = /obj/item/stack/sheet/plasteel, - "amount" = 5, - "back_key" = TOOL_WELDER, - "desc" = "Internal armor is welded." - ), - - //19 - list( - "key" = /obj/item/stack/sheet/plasteel, - "amount" = 5, - "back_key" = TOOL_CROWBAR, - "desc" = "External armor is being installed." - ), - - //20 - list( - "key" = TOOL_WRENCH, - "back_key" = TOOL_CROWBAR, - "desc" = "External armor is installed." - ), - - //21 - list( - "key" = TOOL_WELDER, - "back_key" = TOOL_WRENCH, - "desc" = "External armor is wrenched." - ), - ) - -/datum/component/construction/mecha/firefighter/custom_action(obj/item/I, mob/living/user, diff) - if(!..()) - return FALSE - - //TODO: better messages. - switch(index) - if(1) - user.visible_message("[user] connects [parent] hydraulic systems", "You connect [parent] hydraulic systems.") - if(2) - if(diff==FORWARD) - user.visible_message("[user] activates [parent] hydraulic systems.", "You activate [parent] hydraulic systems.") - else - user.visible_message("[user] disconnects [parent] hydraulic systems", "You disconnect [parent] hydraulic systems.") - if(3) - if(diff==FORWARD) - user.visible_message("[user] adds the wiring to [parent].", "You add the wiring to [parent].") - else - user.visible_message("[user] deactivates [parent] hydraulic systems.", "You deactivate [parent] hydraulic systems.") - if(4) - if(diff==FORWARD) - user.visible_message("[user] adjusts the wiring of [parent].", "You adjust the wiring of [parent].") - else - user.visible_message("[user] removes the wiring from [parent].", "You remove the wiring from [parent].") - if(5) - if(diff==FORWARD) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") - else - user.visible_message("[user] disconnects the wiring of [parent].", "You disconnect the wiring of [parent].") - if(6) - if(diff==FORWARD) - user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") - else - user.visible_message("[user] removes the central control module from [parent].", "You remove the central computer mainboard from [parent].") - if(7) - if(diff==FORWARD) - user.visible_message("[user] installs [I]into [parent].", "You install [I]into [parent].") - else - user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") - if(8) - if(diff==FORWARD) - user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") - else - user.visible_message("[user] removes the peripherals control module from [parent].", "You remove the peripherals control module from [parent].") - if(9) - if(diff==FORWARD) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") - else - user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") - if(10) - if(diff==FORWARD) - user.visible_message("[user] secures the scanner module.", "You secure the scanner module.") - else - user.visible_message("[user] removes the scanner module from [parent].", "You remove the scanner module from [parent].") - if(12) - if(diff==FORWARD) - user.visible_message("[user] installs [I] to [parent].", "You install [I] to [parent].") - else - user.visible_message("[user] unfastens the scanner module.", "You unfasten the scanner module.") - if(13) - if(diff==FORWARD) - user.visible_message("[user] secures the capacitor.", "You secure the capacitor.") - else - user.visible_message("[user] removes the capacitor from [parent].", "You remove the capacitor from [parent].") - if(14) - if(diff==FORWARD) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") - else - user.visible_message("[user] unfastens the capacitor.", "You unfasten the capacitor.") - if(15) - if(diff==FORWARD) - user.visible_message("[user] secures the power cell.", "You secure the power cell.") - else - user.visible_message("[user] pries the power cell from [parent].", "You pry the power cell from [parent].") - if(16) - if(diff==FORWARD) - user.visible_message("[user] installs the internal armor layer to [parent].", "You install the internal armor layer to [parent].") - else - user.visible_message("[user] unfastens the power cell.", "You unfasten the power cell.") - if(17) - if(diff==FORWARD) - user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") - else - user.visible_message("[user] pries internal armor layer from [parent].", "You pry internal armor layer from [parent].") - if(18) - if(diff==FORWARD) - user.visible_message("[user] welds the internal armor layer to [parent].", "You weld the internal armor layer to [parent].") - else - user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") - if(19) - if(diff==FORWARD) - user.visible_message("[user] starts to install the external armor layer to [parent].", "You install the external armor layer to [parent].") - else - user.visible_message("[user] cuts the internal armor layer from [parent].", "You cut the internal armor layer from [parent].") - if(20) - if(diff==FORWARD) - user.visible_message("[user] installs the external reinforced armor layer to [parent].", "You install the external reinforced armor layer to [parent].") - else - user.visible_message("[user] removes the external armor from [parent].", "You remove the external armor from [parent].") - if(21) - if(diff==FORWARD) - user.visible_message("[user] secures the external armor layer.", "You secure the external reinforced armor layer.") - else - user.visible_message("[user] pries external armor layer from [parent].", "You pry external armor layer from [parent].") - if(22) - if(diff==FORWARD) - user.visible_message("[user] welds the external armor layer to [parent].", "You weld the external armor layer to [parent].") - else - user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.") - return TRUE - -/datum/component/construction/unordered/mecha_chassis/honker - result = /datum/component/construction/mecha/honker - steps = list( - /obj/item/mecha_parts/part/honker_torso, - /obj/item/mecha_parts/part/honker_left_arm, - /obj/item/mecha_parts/part/honker_right_arm, - /obj/item/mecha_parts/part/honker_left_leg, - /obj/item/mecha_parts/part/honker_right_leg, - /obj/item/mecha_parts/part/honker_head - ) - - -/datum/component/construction/mecha/honker - result = /obj/mecha/combat/honker - steps = list( - //1 - list( - "key" = /obj/item/bikehorn - ), - - //2 - list( - "key" = /obj/item/circuitboard/mecha/honker/main, - "action" = ITEM_DELETE - ), - - //3 - list( - "key" = /obj/item/bikehorn - ), - - //4 - list( - "key" = /obj/item/circuitboard/mecha/honker/peripherals, - "action" = ITEM_DELETE - ), - - //5 - list( - "key" = /obj/item/bikehorn - ), - - //6 - list( - "key" = /obj/item/circuitboard/mecha/honker/targeting, - "action" = ITEM_DELETE - ), - - //7 - list( - "key" = /obj/item/bikehorn - ), - - //6 - list( - "key" = /obj/item/stock_parts/scanning_module, - "action" = ITEM_MOVE_INSIDE - ), - - //8 - list( - "key" = /obj/item/bikehorn - ), - - //9 - list( - "key" = /obj/item/stock_parts/capacitor, - "action" = ITEM_MOVE_INSIDE - ), - - //10 - list( - "key" = /obj/item/bikehorn - ), - - //11 - list( - "key" = /obj/item/stock_parts/cell, - "action" = ITEM_MOVE_INSIDE - ), - - //12 - list( - "key" = /obj/item/bikehorn - ), - - //13 - list( - "key" = /obj/item/clothing/mask/gas/clown_hat, - "action" = ITEM_DELETE - ), - - //14 - list( - "key" = /obj/item/bikehorn - ), - - //15 - list( - "key" = /obj/item/clothing/shoes/clown_shoes, - "action" = ITEM_DELETE - ), - - //16 - list( - "key" = /obj/item/bikehorn - ), - ) - -// HONK doesn't have any construction step icons, so we just set an icon once. -/datum/component/construction/mecha/honker/update_parent(step_index) - if(step_index == 1) - var/atom/parent_atom = parent - parent_atom.icon = 'icons/mecha/mech_construct.dmi' - parent_atom.icon_state = "honker_chassis" - ..() -// HONK doesn't have any construction step icons, so we just set an icon once. -/datum/component/construction/mecha/honker/update_parent(step_index) - if(step_index == 1) - var/atom/parent_atom = parent - parent_atom.icon = 'icons/mecha/mech_construct.dmi' - parent_atom.icon_state = "honker_chassis" - ..() - -/datum/component/construction/mecha/honker/custom_action(obj/item/I, mob/living/user, diff) - if(!..()) - return FALSE - - if(istype(I, /obj/item/bikehorn)) - playsound(parent, 'sound/items/bikehorn.ogg', 50, 1) - user.visible_message("HONK!") - - //TODO: better messages. - switch(index) - if(2) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") - if(4) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") - if(6) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") - if(8) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") - if(10) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") - if(12) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") - if(14) - user.visible_message("[user] puts [I] on [parent].", "You put [I] on [parent].") - if(16) - user.visible_message("[user] puts [I] on [parent].", "You put [I] on [parent].") - return TRUE - -/datum/component/construction/unordered/mecha_chassis/durand - result = /datum/component/construction/mecha/durand - steps = list( - /obj/item/mecha_parts/part/durand_torso, - /obj/item/mecha_parts/part/durand_left_arm, - /obj/item/mecha_parts/part/durand_right_arm, - /obj/item/mecha_parts/part/durand_left_leg, - /obj/item/mecha_parts/part/durand_right_leg, - /obj/item/mecha_parts/part/durand_head - ) - -/datum/component/construction/mecha/durand - result = /obj/mecha/combat/durand - base_icon = "durand" - steps = list( - //1 - list( - "key" = TOOL_WRENCH, - "desc" = "The hydraulic systems are disconnected." - ), - - //2 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_WRENCH, - "desc" = "The hydraulic systems are connected." - ), - - //3 - list( - "key" = /obj/item/stack/cable_coil, - "amount" = 5, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The hydraulic systems are active." - ), - - //4 - list( - "key" = TOOL_WIRECUTTER, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The wiring is added." - ), - - //5 - list( - "key" = /obj/item/circuitboard/mecha/durand/main, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The wiring is adjusted." - ), - - //6 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Central control module is installed." - ), - - //7 - list( - "key" = /obj/item/circuitboard/mecha/durand/peripherals, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Central control module is secured." - ), - - //8 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Peripherals control module is installed." - ), - - //9 - list( - "key" = /obj/item/circuitboard/mecha/durand/targeting, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Peripherals control module is secured." - ), - - //10 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Weapon control module is installed." - ), - - //11 - list( - "key" = /obj/item/stock_parts/scanning_module, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Weapon control module is secured." - ), - - //12 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Scanner module is installed." - ), - - //13 - list( - "key" = /obj/item/stock_parts/capacitor, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Scanner module is secured." - ), - - //14 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Capacitor is installed." - ), - - //15 - list( - "key" = /obj/item/stock_parts/cell, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Capacitor is secured." - ), - - //16 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "The power cell is installed." - ), - - //17 - list( - "key" = /obj/item/stack/sheet/metal, - "amount" = 5, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The power cell is secured." - ), - - //18 - list( - "key" = TOOL_WRENCH, - "back_key" = TOOL_CROWBAR, - "desc" = "Internal armor is installed." - ), - - //19 - list( - "key" = TOOL_WELDER, - "back_key" = TOOL_WRENCH, - "desc" = "Internal armor is wrenched." - ), - - //20 - list( - "key" = /obj/item/mecha_parts/part/durand_armor, - "action" = ITEM_DELETE, - "back_key" = TOOL_WELDER, - "desc" = "Internal armor is welded." - ), - - //21 - list( - "key" = TOOL_WRENCH, - "back_key" = TOOL_CROWBAR, - "desc" = "External armor is installed." - ), - - //22 - list( - "key" = TOOL_WELDER, - "back_key" = TOOL_WRENCH, - "desc" = "External armor is wrenched." - ), - ) - - -/datum/component/construction/mecha/durand/custom_action(obj/item/I, mob/living/user, diff) - if(!..()) - return FALSE - - //TODO: better messages. - switch(index) - if(1) - user.visible_message("[user] connects [parent] hydraulic systems", "You connect [parent] hydraulic systems.") - if(2) - if(diff==FORWARD) - user.visible_message("[user] activates [parent] hydraulic systems.", "You activate [parent] hydraulic systems.") - else - user.visible_message("[user] disconnects [parent] hydraulic systems", "You disconnect [parent] hydraulic systems.") - if(3) - if(diff==FORWARD) - user.visible_message("[user] adds the wiring to [parent].", "You add the wiring to [parent].") - else - user.visible_message("[user] deactivates [parent] hydraulic systems.", "You deactivate [parent] hydraulic systems.") - if(4) - if(diff==FORWARD) - user.visible_message("[user] adjusts the wiring of [parent].", "You adjust the wiring of [parent].") - else - user.visible_message("[user] removes the wiring from [parent].", "You remove the wiring from [parent].") - if(5) - if(diff==FORWARD) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") - else - user.visible_message("[user] disconnects the wiring of [parent].", "You disconnect the wiring of [parent].") - if(6) - if(diff==FORWARD) - user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") - else - user.visible_message("[user] removes the central control module from [parent].", "You remove the central computer mainboard from [parent].") - if(7) - if(diff==FORWARD) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") - else - user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") - if(8) - if(diff==FORWARD) - user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") - else - user.visible_message("[user] removes the peripherals control module from [parent].", "You remove the peripherals control module from [parent].") - if(9) - if(diff==FORWARD) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") - else - user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") - if(10) - if(diff==FORWARD) - user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.") - else - user.visible_message("[user] removes the weapon control module from [parent].", "You remove the weapon control module from [parent].") - if(11) - if(diff==FORWARD) - user.visible_message("[user] installs [I] to [parent].", "You install [I] to [parent].") - else - user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.") - if(12) - if(diff==FORWARD) - user.visible_message("[user] secures the scanner module.", "You secure the scanner module.") - else - user.visible_message("[user] removes the scanner module from [parent].", "You remove the scanner module from [parent].") - if(13) - if(diff==FORWARD) - user.visible_message("[user] installs [I] to [parent].", "You install [I] to [parent].") - else - user.visible_message("[user] unfastens the scanner module.", "You unfasten the scanner module.") - if(14) - if(diff==FORWARD) - user.visible_message("[user] secures the capacitor.", "You secure the capacitor.") - else - user.visible_message("[user] removes the capacitor from [parent].", "You remove the capacitor from [parent].") - if(15) - if(diff==FORWARD) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") - else - user.visible_message("[user] unfastens the capacitor.", "You unfasten the capacitor.") - if(16) - if(diff==FORWARD) - user.visible_message("[user] secures the power cell.", "You secure the power cell.") - else - user.visible_message("[user] pries the power cell from [parent].", "You pry the power cell from [parent].") - if(17) - if(diff==FORWARD) - user.visible_message("[user] installs the internal armor layer to [parent].", "You install the internal armor layer to [parent].") - else - user.visible_message("[user] unfastens the power cell.", "You unfasten the power cell.") - if(18) - if(diff==FORWARD) - user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") - else - user.visible_message("[user] pries internal armor layer from [parent].", "You pry internal armor layer from [parent].") - if(19) - if(diff==FORWARD) - user.visible_message("[user] welds the internal armor layer to [parent].", "You weld the internal armor layer to [parent].") - else - user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") - if(20) - if(diff==FORWARD) - user.visible_message("[user] installs [I] to [parent].", "You install [I] to [parent].") - else - user.visible_message("[user] cuts the internal armor layer from [parent].", "You cut the internal armor layer from [parent].") - if(21) - if(diff==FORWARD) - user.visible_message("[user] secures Durand Armor Plates.", "You secure Durand Armor Plates.") - else - user.visible_message("[user] pries Durand Armor Plates from [parent].", "You pry Durand Armor Plates from [parent].") - if(22) - if(diff==FORWARD) - user.visible_message("[user] welds Durand Armor Plates to [parent].", "You weld Durand Armor Plates to [parent].") - else - user.visible_message("[user] unfastens Durand Armor Plates.", "You unfasten Durand Armor Plates.") - return TRUE - -//PHAZON - -/datum/component/construction/unordered/mecha_chassis/phazon - result = /datum/component/construction/mecha/phazon - steps = list( - /obj/item/mecha_parts/part/phazon_torso, - /obj/item/mecha_parts/part/phazon_left_arm, - /obj/item/mecha_parts/part/phazon_right_arm, - /obj/item/mecha_parts/part/phazon_left_leg, - /obj/item/mecha_parts/part/phazon_right_leg, - /obj/item/mecha_parts/part/phazon_head - ) - -/datum/component/construction/mecha/phazon - result = /obj/mecha/combat/phazon - base_icon = "phazon" - steps = list( - //1 - list( - "key" = TOOL_WRENCH, - "desc" = "The hydraulic systems are disconnected." - ), - - //2 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_WRENCH, - "desc" = "The hydraulic systems are connected." - ), - - //3 - list( - "key" = /obj/item/stack/cable_coil, - "amount" = 5, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The hydraulic systems are active." - ), - - //4 - list( - "key" = TOOL_WIRECUTTER, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The wiring is added." - ), - - //5 - list( - "key" = /obj/item/circuitboard/mecha/phazon/main, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The wiring is adjusted." - ), - - //6 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Central control module is installed." - ), - - //7 - list( - "key" = /obj/item/circuitboard/mecha/phazon/peripherals, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Central control module is secured." - ), - - //8 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Peripherals control module is installed" - ), - - //9 - list( - "key" = /obj/item/circuitboard/mecha/phazon/targeting, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Peripherals control module is secured." - ), - - //10 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Weapon control is installed." - ), - - //11 - list( - "key" = /obj/item/stock_parts/scanning_module, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Weapon control module is secured." - ), - - //12 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Scanner module is installed." - ), - - //13 - list( - "key" = /obj/item/stock_parts/capacitor, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Scanner module is secured." - ), - - //14 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Capacitor is installed." - ), - - //15 - list( - "key" = /obj/item/stack/ore/bluespace_crystal, - "amount" = 1, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Capacitor is secured." - ), - - //16 - list( - "key" = /obj/item/stack/cable_coil, - "amount" = 5, - "back_key" = TOOL_CROWBAR, - "desc" = "The bluespace crystal is installed." - ), - - //17 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_WIRECUTTER, - "desc" = "The bluespace crystal is connected." - ), - - //18 - list( - "key" = /obj/item/stock_parts/cell, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The bluespace crystal is engaged." - ), - - //19 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "The power cell is installed.", - "icon_state" = "phazon17" - // This is the point where a step icon is skipped, so "icon_state" had to be set manually starting from here. - ), - - //20 - list( - "key" = /obj/item/stack/sheet/plasteel, - "amount" = 5, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The power cell is secured.", - "icon_state" = "phazon18" - ), - - //21 - list( - "key" = TOOL_WRENCH, - "back_key" = TOOL_CROWBAR, - "desc" = "Phase armor is installed.", - "icon_state" = "phazon19" - ), - - //22 - list( - "key" = TOOL_WELDER, - "back_key" = TOOL_WRENCH, - "desc" = "Phase armor is wrenched.", - "icon_state" = "phazon20" - ), - - //23 - list( - "key" = /obj/item/mecha_parts/part/phazon_armor, - "action" = ITEM_DELETE, - "back_key" = TOOL_WELDER, - "desc" = "Phase armor is welded.", - "icon_state" = "phazon21" - ), - - //24 - list( - "key" = TOOL_WRENCH, - "back_key" = TOOL_CROWBAR, - "desc" = "External armor is installed.", - "icon_state" = "phazon22" - ), - - //25 - list( - "key" = TOOL_WELDER, - "back_key" = TOOL_WRENCH, - "desc" = "External armor is wrenched.", - "icon_state" = "phazon23" - ), - - //26 - list( - "key" = /obj/item/assembly/signaler/anomaly, - "action" = ITEM_DELETE, - "back_key" = TOOL_WELDER, - "desc" = "Anomaly core socket is open.", - "icon_state" = "phazon24" - ), - ) - - -/datum/component/construction/mecha/phazon/custom_action(obj/item/I, mob/living/user, diff) - if(!..()) - return FALSE - - //TODO: better messages. - switch(index) - if(1) - user.visible_message("[user] connects [parent] hydraulic systems", "You connect [parent] hydraulic systems.") - if(2) - if(diff==FORWARD) - user.visible_message("[user] activates [parent] hydraulic systems.", "You activate [parent] hydraulic systems.") - else - user.visible_message("[user] disconnects [parent] hydraulic systems", "You disconnect [parent] hydraulic systems.") - if(3) - if(diff==FORWARD) - user.visible_message("[user] adds the wiring to [parent].", "You add the wiring to [parent].") - else - user.visible_message("[user] deactivates [parent] hydraulic systems.", "You deactivate [parent] hydraulic systems.") - if(4) - if(diff==FORWARD) - user.visible_message("[user] adjusts the wiring of [parent].", "You adjust the wiring of [parent].") - else - user.visible_message("[user] removes the wiring from [parent].", "You remove the wiring from [parent].") - if(5) - if(diff==FORWARD) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") - else - user.visible_message("[user] disconnects the wiring of [parent].", "You disconnect the wiring of [parent].") - if(6) - if(diff==FORWARD) - user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") - else - user.visible_message("[user] removes the central control module from [parent].", "You remove the central computer mainboard from [parent].") - if(7) - if(diff==FORWARD) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") - else - user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") - if(8) - if(diff==FORWARD) - user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") - else - user.visible_message("[user] removes the peripherals control module from [parent].", "You remove the peripherals control module from [parent].") - if(9) - if(diff==FORWARD) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") - else - user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") - if(10) - if(diff==FORWARD) - user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.") - else - user.visible_message("[user] removes the weapon control module from [parent].", "You remove the weapon control module from [parent].") - if(11) - if(diff==FORWARD) - user.visible_message("[user] installs [I] to [parent].", "You install [I] to [parent].") - else - user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.") - if(12) - if(diff==FORWARD) - user.visible_message("[user] secures the scanner module.", "You secure the scanner module.") - else - user.visible_message("[user] removes the scanner module from [parent].", "You remove the scanner module from [parent].") - if(13) - if(diff==FORWARD) - user.visible_message("[user] installs [I] to [parent].", "You install [I] to [parent].") - else - user.visible_message("[user] unfastens the scanner module.", "You unfasten the scanner module.") - if(14) - if(diff==FORWARD) - user.visible_message("[user] secures [I].", "You secure [I].") - else - user.visible_message("[user] removes the capacitor from [parent].", "You remove the capacitor from [parent].") - if(15) - if(diff==FORWARD) - user.visible_message("[user] installs [I].", "You install [I].") - else - user.visible_message("[user] unsecures the capacitor from [parent].", "You unsecure the capacitor from [parent].") - if(16) - if(diff==FORWARD) - user.visible_message("[user] connects the bluespace crystal.", "You connect the bluespace crystal.") - else - user.visible_message("[user] removes the bluespace crystal from [parent].", "You remove the bluespace crystal from [parent].") - if(17) - if(diff==FORWARD) - user.visible_message("[user] engages the bluespace crystal.", "You engage the bluespace crystal.") - else - user.visible_message("[user] disconnects the bluespace crystal from [parent].", "You disconnect the bluespace crystal from [parent].") - if(18) - if(diff==FORWARD) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") - else - user.visible_message("[user] disengages the bluespace crystal.", "You disengage the bluespace crystal.") - if(19) - if(diff==FORWARD) - user.visible_message("[user] secures the power cell.", "You secure the power cell.") - else - user.visible_message("[user] pries the power cell from [parent].", "You pry the power cell from [parent].") - if(20) - if(diff==FORWARD) - user.visible_message("[user] installs the phase armor layer to [parent].", "You install the phase armor layer to [parent].") - else - user.visible_message("[user] unfastens the power cell.", "You unfasten the power cell.") - if(21) - if(diff==FORWARD) - user.visible_message("[user] secures the phase armor layer.", "You secure the phase armor layer.") - else - user.visible_message("[user] pries the phase armor layer from [parent].", "You pry the phase armor layer from [parent].") - if(22) - if(diff==FORWARD) - user.visible_message("[user] welds the phase armor layer to [parent].", "You weld the phase armor layer to [parent].") - else - user.visible_message("[user] unfastens the phase armor layer.", "You unfasten the phase armor layer.") - if(23) - if(diff==FORWARD) - user.visible_message("[user] installs [I] to [parent].", "You install [I] to [parent].") - else - user.visible_message("[user] cuts phase armor layer from [parent].", "You cut the phase armor layer from [parent].") - if(24) - if(diff==FORWARD) - user.visible_message("[user] secures Phazon Armor Plates.", "You secure Phazon Armor Plates.") - else - user.visible_message("[user] pries Phazon Armor Plates from [parent].", "You pry Phazon Armor Plates from [parent].") - if(25) - if(diff==FORWARD) - user.visible_message("[user] welds Phazon Armor Plates to [parent].", "You weld Phazon Armor Plates to [parent].") - else - user.visible_message("[user] unfastens Phazon Armor Plates.", "You unfasten Phazon Armor Plates.") - if(26) - if(diff==FORWARD) - user.visible_message("[user] carefully inserts the anomaly core into [parent] and secures it.", - "You slowly place the anomaly core into its socket and close its chamber.") - return TRUE - -//ODYSSEUS - -/datum/component/construction/unordered/mecha_chassis/odysseus - result = /datum/component/construction/mecha/odysseus - steps = list( - /obj/item/mecha_parts/part/odysseus_torso, - /obj/item/mecha_parts/part/odysseus_head, - /obj/item/mecha_parts/part/odysseus_left_arm, - /obj/item/mecha_parts/part/odysseus_right_arm, - /obj/item/mecha_parts/part/odysseus_left_leg, - /obj/item/mecha_parts/part/odysseus_right_leg - ) - -/datum/component/construction/mecha/odysseus - result = /obj/mecha/medical/odysseus - base_icon = "odysseus" - steps = list( - //1 - list( - "key" = TOOL_WRENCH, - "desc" = "The hydraulic systems are disconnected." - ), - - //2 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_WRENCH, - "desc" = "The hydraulic systems are connected." - ), - - //3 - list( - "key" = /obj/item/stack/cable_coil, - "amount" = 5, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The hydraulic systems are active." - ), - - //4 - list( - "key" = TOOL_WIRECUTTER, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The wiring is added." - ), - - //5 - list( - "key" = /obj/item/circuitboard/mecha/odysseus/main, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The wiring is adjusted." - ), - - //6 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Central control module is installed." - ), - - //7 - list( - "key" = /obj/item/circuitboard/mecha/odysseus/peripherals, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Central control module is secured." - ), - - //8 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Peripherals control module is installed." - ), - //9 - list( - "key" = /obj/item/stock_parts/scanning_module, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Peripherals control module is secured." - ), - - //10 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Scanner module is installed." - ), - - //11 - list( - "key" = /obj/item/stock_parts/capacitor, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Scanner module is secured." - ), - - //12 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Capacitor is installed." - ), - - //13 - list( - "key" = /obj/item/stock_parts/cell, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Capacitor is secured." - ), - - //11 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "The power cell is installed." - ), - - //12 - list( - "key" = /obj/item/stack/sheet/metal, - "amount" = 5, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The power cell is secured." - ), - - //13 - list( - "key" = TOOL_WRENCH, - "back_key" = TOOL_CROWBAR, - "desc" = "Internal armor is installed." - ), - - //14 - list( - "key" = TOOL_WELDER, - "back_key" = TOOL_WRENCH, - "desc" = "Internal armor is wrenched." - ), - - //15 - list( - "key" = /obj/item/stack/sheet/plasteel, - "amount" = 5, - "back_key" = TOOL_WELDER, - "desc" = "Internal armor is welded." - ), - - //16 - list( - "key" = TOOL_WRENCH, - "back_key" = TOOL_CROWBAR, - "desc" = "External armor is installed." - ), - - //17 - list( - "key" = TOOL_WELDER, - "back_key" = TOOL_WRENCH, - "desc" = "External armor is wrenched." - ), - ) - -/datum/component/construction/mecha/odysseus/custom_action(obj/item/I, mob/living/user, diff) - if(!..()) - return FALSE - - //TODO: better messages. - switch(index) - if(1) - user.visible_message("[user] connects [parent] hydraulic systems", "You connect [parent] hydraulic systems.") - if(2) - if(diff==FORWARD) - user.visible_message("[user] activates [parent] hydraulic systems.", "You activate [parent] hydraulic systems.") - else - user.visible_message("[user] disconnects [parent] hydraulic systems", "You disconnect [parent] hydraulic systems.") - if(3) - if(diff==FORWARD) - user.visible_message("[user] adds the wiring to [parent].", "You add the wiring to [parent].") - else - user.visible_message("[user] deactivates [parent] hydraulic systems.", "You deactivate [parent] hydraulic systems.") - if(4) - if(diff==FORWARD) - user.visible_message("[user] adjusts the wiring of [parent].", "You adjust the wiring of [parent].") - else - user.visible_message("[user] removes the wiring from [parent].", "You remove the wiring from [parent].") - if(5) - if(diff==FORWARD) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") - else - user.visible_message("[user] disconnects the wiring of [parent].", "You disconnect the wiring of [parent].") - if(6) - if(diff==FORWARD) - user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") - else - user.visible_message("[user] removes the central control module from [parent].", "You remove the central computer mainboard from [parent].") - if(7) - if(diff==FORWARD) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") - else - user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") - if(8) - if(diff==FORWARD) - user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") - else - user.visible_message("[user] removes the peripherals control module from [parent].", "You remove the peripherals control module from [parent].") - if(9) - if(diff==FORWARD) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") - else - user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") - if(10) - if(diff==FORWARD) - user.visible_message("[user] secures the scanner module.", "You secure the scanner module.") - else - user.visible_message("[user] removes the scanner module from [parent].", "You remove the scanner module from [parent].") - if(11) - if(diff==FORWARD) - user.visible_message("[user] installs [I] to [parent].", "You install [I] to [parent].") - else - user.visible_message("[user] unfastens the scanner module.", "You unfasten the scanner module.") - if(12) - if(diff==FORWARD) - user.visible_message("[user] secures the capacitor.", "You secure the capacitor.") - else - user.visible_message("[user] removes the capacitor from [parent].", "You remove the capacitor from [parent].") - if(13) - if(diff==FORWARD) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") - else - user.visible_message("[user] unfastens the capacitor.", "You unfasten the capacitor.") - if(14) - if(diff==FORWARD) - user.visible_message("[user] secures the power cell.", "You secure the power cell.") - else - user.visible_message("[user] pries the power cell from [parent].", "You pry the power cell from [parent].") - if(15) - if(diff==FORWARD) - user.visible_message("[user] installs the internal armor layer to [parent].", "You install the internal armor layer to [parent].") - else - user.visible_message("[user] unfastens the power cell.", "You unfasten the power cell.") - if(16) - if(diff==FORWARD) - user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") - else - user.visible_message("[user] pries internal armor layer from [parent].", "You pry internal armor layer from [parent].") - if(17) - if(diff==FORWARD) - user.visible_message("[user] welds the internal armor layer to [parent].", "You weld the internal armor layer to [parent].") - else - user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") - if(18) - if(diff==FORWARD) - user.visible_message("[user] installs the external armor layer to [parent].", "You install the external reinforced armor layer to [parent].") - else - user.visible_message("[user] cuts the internal armor layer from [parent].", "You cut the internal armor layer from [parent].") - if(19) - if(diff==FORWARD) - user.visible_message("[user] secures the external armor layer.", "You secure the external reinforced armor layer.") - else - user.visible_message("[user] pries the external armor layer from [parent].", "You pry the external armor layer from [parent].") - if(20) - if(diff==FORWARD) - user.visible_message("[user] welds the external armor layer to [parent].", "You weld the external armor layer to [parent].") - else - user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.") - return TRUE diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm deleted file mode 100644 index 1db4cc30b9..0000000000 --- a/code/game/mecha/mecha_defense.dm +++ /dev/null @@ -1,334 +0,0 @@ -/obj/mecha/proc/get_armour_facing(relative_dir) - switch(relative_dir) - if(180) // BACKSTAB! - return facing_modifiers[BACK_ARMOUR] - if(0, 45) // direct or 45 degrees off - return facing_modifiers[FRONT_ARMOUR] - return facing_modifiers[SIDE_ARMOUR] //if its not a front hit or back hit then assume its from the side - -/obj/mecha/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) - . = ..() - if(. && obj_integrity > 0) - spark_system.start() - switch(damage_flag) - if("fire") - check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL)) - if("melee") - check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) - else - check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT)) - if(. >= 5 || prob(33)) - occupant_message("Taking damage!") - log_append_to_last("Took [damage_amount] points of damage. Damage type: \"[damage_type]\".",1) - -/obj/mecha/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) - . = ..() - if(!damage_amount) - return 0 - var/booster_deflection_modifier = 1 - var/booster_damage_modifier = 1 - if(damage_flag == "bullet" || damage_flag == "laser" || damage_flag == "energy") - for(var/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster/B in equipment) - if(B.projectile_react()) - booster_deflection_modifier = B.deflect_coeff - booster_damage_modifier = B.damage_coeff - break - else if(damage_flag == "melee") - for(var/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster/B in equipment) - if(B.attack_react()) - booster_deflection_modifier *= B.deflect_coeff - booster_damage_modifier *= B.damage_coeff - break - - if(attack_dir) - var/facing_modifier = get_armour_facing(abs(dir2angle(dir) - dir2angle(attack_dir))) - booster_damage_modifier /= facing_modifier - booster_deflection_modifier *= facing_modifier - if(prob(deflect_chance * booster_deflection_modifier)) - visible_message("[src]'s armour deflects the attack!") - log_append_to_last("Armor saved.") - return 0 - if(.) - . *= booster_damage_modifier - - -/obj/mecha/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags) - user.do_attack_animation(src, ATTACK_EFFECT_PUNCH) - playsound(loc, 'sound/weapons/tap.ogg', 40, 1, -1) - user.visible_message("[user] hits [name]. Nothing happens", null, null, COMBAT_MESSAGE_RANGE) - mecha_log_message("Attack by hand/paw. Attacker - [user].", color="red") - log_append_to_last("Armor saved.") - -/obj/mecha/attack_paw(mob/user as mob) - return attack_hand(user) - - -/obj/mecha/attack_alien(mob/living/user) - mecha_log_message("Attack by alien. Attacker - [user].", color="red") - playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1) - attack_generic(user, 15, BRUTE, "melee", 0) - -/obj/mecha/attack_animal(mob/living/simple_animal/user) - mecha_log_message("Attack by simple animal. Attacker - [user].", color="red") - if(!user.melee_damage_upper && !user.obj_damage) - user.emote("custom", message = "[user.friendly_verb_continuous] [src].") - return 0 - else - var/play_soundeffect = 1 - if(user.environment_smash) - play_soundeffect = 0 - playsound(src, 'sound/effects/bang.ogg', 50, 1) - var/animal_damage = rand(user.melee_damage_lower,user.melee_damage_upper) - if(user.obj_damage) - animal_damage = user.obj_damage - animal_damage = min(animal_damage, 20*user.environment_smash) - attack_generic(user, animal_damage, user.melee_damage_type, "melee", play_soundeffect) - log_combat(user, src, "attacked") - return 1 - - -/obj/mecha/hulk_damage() - return 15 - -/obj/mecha/attack_hulk(mob/living/carbon/human/user) - . = ..() - if(.) - mecha_log_message("Attack by hulk. Attacker - [user].", color="red") - log_combat(user, src, "punched", "hulk powers") - -/obj/mecha/blob_act(obj/structure/blob/B) - take_damage(30, BRUTE, "melee", 0, get_dir(src, B)) - -/obj/mecha/attack_tk() - return - -/obj/mecha/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) //wrapper - mecha_log_message("Hit by [AM].", color="red") - . = ..() - - -/obj/mecha/bullet_act(obj/item/projectile/Proj) //wrapper - mecha_log_message("Hit by projectile. Type: [Proj.name]([Proj.flag]).", color="red") - . = ..() - -/obj/mecha/ex_act(severity, target, origin) - mecha_log_message("Affected by explosion of severity: [severity].", color="red") - if(prob(deflect_chance)) - severity++ - log_append_to_last("Armor saved, changing severity to [severity].") - . = ..() - -/obj/mecha/contents_explosion(severity, target, origin) - severity++ - for(var/X in equipment) - var/obj/item/mecha_parts/mecha_equipment/ME = X - ME.ex_act(severity, target, origin) - for(var/Y in trackers) - var/obj/item/mecha_parts/mecha_tracking/MT = Y - MT.ex_act(severity, target, origin) - if(occupant) - occupant.ex_act(severity, target, origin) - -/obj/mecha/handle_atom_del(atom/A) - if(A == occupant) - occupant = null - icon_state = initial(icon_state)+"-open" - setDir(dir_in) - -/obj/mecha/emp_act(severity) - . = ..() - if (. & EMP_PROTECT_SELF) - return - if(get_charge()) - use_power((cell.charge/3)*(severity*0.005)) - take_damage(severity/3, BURN, "energy", 1) - mecha_log_message("EMP detected", color="red") - - if(istype(src, /obj/mecha/combat)) - mouse_pointer = 'icons/mecha/mecha_mouse-disable.dmi' - occupant?.update_mouse_pointer() - if(!equipment_disabled && occupant) //prevent spamming this message with back-to-back EMPs - to_chat(occupant, "Error -- Connection to equipment control unit has been lost.") - addtimer(CALLBACK(src, /obj/mecha/proc/restore_equipment), 3 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) - equipment_disabled = 1 - -/obj/mecha/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature>max_temperature) - mecha_log_message("Exposed to dangerous temperature.", color="red") - take_damage(5, BURN, 0, 1) - -/obj/mecha/attackby(obj/item/W as obj, mob/user as mob, params) - - if(istype(W, /obj/item/mmi)) - if(mmi_move_inside(W,user)) - to_chat(user, "[src]-[W] interface initialized successfully.") - else - to_chat(user, "[src]-[W] interface initialization failed.") - return - - if(istype(W, /obj/item/mecha_ammo)) - ammo_resupply(W, user) - return - - if(istype(W, /obj/item/mecha_parts/mecha_equipment)) - var/obj/item/mecha_parts/mecha_equipment/E = W - spawn() - if(E.can_attach(src)) - if(!user.temporarilyRemoveItemFromInventory(W)) - return - E.attach(src) - user.visible_message("[user] attaches [W] to [src].", "You attach [W] to [src].") - else - to_chat(user, "You were unable to attach [W] to [src]!") - return - if(W.GetID()) - if(add_req_access || maint_access) - if(internals_access_allowed(user)) - var/obj/item/card/id/id_card - if(istype(W, /obj/item/card/id)) - id_card = W - else - var/obj/item/pda/pda = W - id_card = pda.id - output_maintenance_dialog(id_card, user) - return - else - to_chat(user, "Invalid ID: Access denied.") - else - to_chat(user, "Maintenance protocols disabled by operator.") - else if(W.tool_behaviour == TOOL_WRENCH) - if(state==1) - state = 2 - to_chat(user, "You undo the securing bolts.") - else if(state==2) - state = 1 - to_chat(user, "You tighten the securing bolts.") - return - else if(W.tool_behaviour == TOOL_CROWBAR) - if(state==2) - state = 3 - to_chat(user, "You open the hatch to the power unit.") - else if(state==3) - state=2 - to_chat(user, "You close the hatch to the power unit.") - return - else if(istype(W, /obj/item/stack/cable_coil)) - if(state == 3 && (internal_damage & MECHA_INT_SHORT_CIRCUIT)) - if(W.use_tool(src, user, 0, 2)) - clearInternalDamage(MECHA_INT_SHORT_CIRCUIT) - to_chat(user, "You replace the fused wires.") - else - to_chat(user, "You need two lengths of cable to fix this mech!") - return - else if(W.tool_behaviour == TOOL_SCREWDRIVER && user.a_intent != INTENT_HARM) - if(internal_damage & MECHA_INT_TEMP_CONTROL) - clearInternalDamage(MECHA_INT_TEMP_CONTROL) - to_chat(user, "You repair the damaged temperature controller.") - else if(state==3 && cell) - cell.forceMove(loc) - cell = null - state = 4 - to_chat(user, "You unscrew and pry out the powercell.") - mecha_log_message("Powercell removed") - else if(state==4 && cell) - state=3 - to_chat(user, "You screw the cell in place.") - return - - else if(istype(W, /obj/item/stock_parts/cell)) - if(state==4) - if(!cell) - if(!user.transferItemToLoc(W, src)) - return - var/obj/item/stock_parts/cell/C = W - to_chat(user, "You install the powercell.") - cell = C - mecha_log_message("Powercell installed") - else - to_chat(user, "There's already a powercell installed.") - return - - else if(W.tool_behaviour == TOOL_WELDER && user.a_intent != INTENT_HARM) - user.DelayNextAction(CLICK_CD_MELEE) - if(obj_integrity < max_integrity) - if(W.use_tool(src, user, 0, volume=50, amount=1)) - if (internal_damage & MECHA_INT_TANK_BREACH) - clearInternalDamage(MECHA_INT_TANK_BREACH) - to_chat(user, "You repair the damaged gas tank.") - else - user.visible_message("[user] repairs some damage to [name].", "You repair some damage to [src].") - obj_integrity += min(10, max_integrity-obj_integrity) - if(obj_integrity == max_integrity) - to_chat(user, "It looks to be fully repaired now.") - return 1 - else - to_chat(user, "The [name] is at full integrity!") - return 1 - - else if(istype(W, /obj/item/mecha_parts/mecha_tracking)) - var/obj/item/mecha_parts/mecha_tracking/tracker = W - tracker.try_attach_part(user, src) - return - else - return ..() - -/obj/mecha/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1) - mecha_log_message("Attacked by [I]. Attacker - [user]") - return ..() - -/obj/mecha/proc/mech_toxin_damage(mob/living/target) - playsound(src, 'sound/effects/spray2.ogg', 50, 1) - if(target.reagents) - if(target.reagents.get_reagent_amount(/datum/reagent/cryptobiolin) + force < force*2) - target.reagents.add_reagent(/datum/reagent/cryptobiolin, force/2) - if(target.reagents.get_reagent_amount(/datum/reagent/toxin) + force < force*2) - target.reagents.add_reagent(/datum/reagent/toxin, force/2.5) - - -/obj/mecha/mech_melee_attack(obj/mecha/M) - if(!has_charge(melee_energy_drain)) - return 0 - use_power(melee_energy_drain) - if(M.damtype == BRUTE || M.damtype == BURN) - log_combat(M.occupant, src, "attacked", M, "(INTENT: [uppertext(M.occupant.a_intent)]) (DAMTYPE: [uppertext(M.damtype)])") - . = ..() - -/obj/mecha/proc/full_repair(charge_cell) - obj_integrity = max_integrity - if(cell && charge_cell) - cell.charge = cell.maxcharge - if(internal_damage & MECHA_INT_FIRE) - clearInternalDamage(MECHA_INT_FIRE) - if(internal_damage & MECHA_INT_TEMP_CONTROL) - clearInternalDamage(MECHA_INT_TEMP_CONTROL) - if(internal_damage & MECHA_INT_SHORT_CIRCUIT) - clearInternalDamage(MECHA_INT_SHORT_CIRCUIT) - if(internal_damage & MECHA_INT_TANK_BREACH) - clearInternalDamage(MECHA_INT_TANK_BREACH) - if(internal_damage & MECHA_INT_CONTROL_LOST) - clearInternalDamage(MECHA_INT_CONTROL_LOST) - -/obj/mecha/narsie_act() - emp_act(100) - -/obj/mecha/ratvar_act() - if((GLOB.ratvar_awakens || GLOB.clockwork_gateway_activated) && occupant) - if(is_servant_of_ratvar(occupant)) //reward the minion that got a mech by repairing it - full_repair(TRUE) - else - var/mob/living/L = occupant - go_out(TRUE) - if(L) - L.ratvar_act() - -/obj/mecha/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect) - if(!no_effect) - if(selected) - used_item = selected - else if(!visual_effect_icon) - visual_effect_icon = ATTACK_EFFECT_SMASH - if(damtype == BURN) - visual_effect_icon = ATTACK_EFFECT_MECHFIRE - else if(damtype == TOX) - visual_effect_icon = ATTACK_EFFECT_MECHTOXIN - ..() diff --git a/code/game/mecha/mecha_topic.dm b/code/game/mecha/mecha_topic.dm deleted file mode 100644 index 067cffd319..0000000000 --- a/code/game/mecha/mecha_topic.dm +++ /dev/null @@ -1,360 +0,0 @@ - -//////////////////////////////////// -///// Rendering stats window /////// -//////////////////////////////////// - -/obj/mecha/proc/get_stats_html() - . = {" - - - [name] data - - - - -
- [src.get_stats_part()] -
-
- [src.get_equipment_list()] -
-
-
- [src.get_commands()] -
- - - "} - - - -/obj/mecha/proc/report_internal_damage() - . = "" - var/list/dam_reports = list( - "[MECHA_INT_FIRE]" = "INTERNAL FIRE", - "[MECHA_INT_TEMP_CONTROL]" = "LIFE SUPPORT SYSTEM MALFUNCTION", - "[MECHA_INT_TANK_BREACH]" = "GAS TANK BREACH", - "[MECHA_INT_CONTROL_LOST]" = "COORDINATION SYSTEM CALIBRATION FAILURE - Recalibrate", - "[MECHA_INT_SHORT_CIRCUIT]" = "SHORT CIRCUIT" - ) - for(var/tflag in dam_reports) - var/intdamflag = text2num(tflag) - if(internal_damage & intdamflag) - . += dam_reports[tflag] - . += "
" - if(return_pressure() > WARNING_HIGH_PRESSURE) - . += "DANGEROUSLY HIGH CABIN PRESSURE
" - - - -/obj/mecha/proc/get_stats_part() - var/integrity = obj_integrity/max_integrity*100 - var/cell_charge = get_charge() - var/datum/gas_mixture/int_tank_air = internal_tank.return_air() - var/tank_pressure = internal_tank ? round(int_tank_air.return_pressure(),0.01) : "None" - var/tank_temperature = internal_tank ? int_tank_air.return_temperature() : "Unknown" - var/cabin_pressure = round(return_pressure(),0.01) - . = {"[report_internal_damage()] - [integrity<30?"DAMAGE LEVEL CRITICAL
":null] - Integrity: [integrity]%
- Powercell charge: [isnull(cell_charge)?"No powercell installed":"[cell.percent()]%"]
- Air source: [use_internal_tank?"Internal Airtank":"Environment"]
- Airtank pressure: [tank_pressure]kPa
- Airtank temperature: [tank_temperature]°K|[tank_temperature - T0C]°C
- Cabin pressure: [cabin_pressure>WARNING_HIGH_PRESSURE ? "[cabin_pressure]": cabin_pressure]kPa
- Cabin temperature: [return_temperature()]°K|[return_temperature() - T0C]°C
- [dna_lock?"DNA-locked:
[dna_lock] \[Reset\]
":""]
- [thrusters_action.owner ? "Thrusters: [thrusters_active ? "Enabled" : "Disabled"]
" : ""] - [defense_action.owner ? "Defence Mode: [defence_mode ? "Enabled" : "Disabled"]
" : ""] - [overload_action.owner ? "Leg Actuators Overload: [leg_overload_mode ? "Enabled" : "Disabled"]
" : ""] - [smoke_action.owner ? "Smoke: [smoke]
" : ""] - [zoom_action.owner ? "Zoom: [zoom_mode ? "Enabled" : "Disabled"]
" : ""] - [switch_damtype_action.owner ? "Damtype: [damtype]
" : ""] - [phasing_action.owner ? "Phase Modulator: [phasing ? "Enabled" : "Disabled"]
" : ""] - "} - - -/obj/mecha/proc/get_commands() - . = {"
-
Electronics
- -
- -
[get_equipment_menu()]
- "} - - -/obj/mecha/proc/get_equipment_menu() //outputs mecha html equipment menu - . = "" - if(equipment.len) - . += {"
-
Equipment
-
" - - -/obj/mecha/proc/get_equipment_list() //outputs mecha equipment list in html - if(!equipment.len) - return - . = "Equipment:
" - for(var/obj/item/mecha_parts/mecha_equipment/MT in equipment) - . += "
[MT.get_equip_info()]
" - . += "
" - - - -/obj/mecha/proc/get_log_html() - . = "[src.name] Log" - for(var/list/entry in log) - . += {"
[entry["time"]] [time2text(entry["date"],"MMM DD")] [entry["year"]]
-
[entry["message"]]
- "} - . += "" - - - -/obj/mecha/proc/output_access_dialog(obj/item/card/id/id_card, mob/user) - if(!id_card || !user) - return - . = {" - - - - - -

Following keycodes are present in this system:

"} - for(var/a in operation_req_access) - . += "[get_access_desc(a)] - Delete
" - . += "

Following keycodes were detected on portable device:

" - for(var/a in id_card.access) - if(a in operation_req_access) - continue - var/a_name = get_access_desc(a) - if(!a_name) - continue //there's some strange access without a name - . += "[a_name] - Add
" - . += "
Finish " - . += "(Warning! The ID upload panel will be locked. It can be unlocked only through Exosuit Interface.)" - . += "" - user << browse(., "window=exosuit_add_access") - onclose(user, "exosuit_add_access") - - -/obj/mecha/proc/output_maintenance_dialog(obj/item/card/id/id_card,mob/user) - if(!id_card || !user) - return - . = {" - - - - - - [add_req_access?"Edit operation keycodes":null] - [maint_access?"[(state>0) ? "Terminate" : "Initiate"] maintenance protocol":null] - [(state>0) ?"Set Cabin Air Pressure":null] - - "} - user << browse(., "window=exosuit_maint_console") - onclose(user, "exosuit_maint_console") - - - - -///////////////// -///// Topic ///// -///////////////// - -/obj/mecha/Topic(href, href_list) - ..() - if(href_list["close"]) - return - - if(usr.incapacitated()) - return - - if(in_range(src, usr)) - var/obj/item/card/id/id_card - if (href_list["id_card"]) - id_card = locate(href_list["id_card"]) - if (!istype(id_card)) - return - - if(href_list["req_access"] && add_req_access) - output_access_dialog(id_card, usr) - - if(href_list["maint_access"] && maint_access) - if(state==0) - state = 1 - to_chat(usr, "The securing bolts are now exposed.") - else if(state==1) - state = 0 - to_chat(usr, "The securing bolts are now hidden.") - output_maintenance_dialog(id_card, usr) - - if(href_list["set_internal_tank_valve"] && state >=1) - var/new_pressure = input(usr,"Input new output pressure","Pressure setting",internal_tank_valve) as num - if(new_pressure) - internal_tank_valve = new_pressure - to_chat(usr, "The internal pressure valve has been set to [internal_tank_valve]kPa.") - - if(href_list["add_req_access"] && add_req_access) - operation_req_access += text2num(href_list["add_req_access"]) - output_access_dialog(id_card, usr) - - if(href_list["del_req_access"] && add_req_access) - operation_req_access -= text2num(href_list["del_req_access"]) - output_access_dialog(id_card, usr) - - if(href_list["finish_req_access"]) - add_req_access = 0 - usr << browse(null,"window=exosuit_add_access") - - if(usr != occupant) - return - - if(href_list["update_content"]) - send_byjax(usr,"exosuit.browser","content",src.get_stats_part()) - - if(href_list["select_equip"]) - var/obj/item/mecha_parts/mecha_equipment/equip = locate(href_list["select_equip"]) in src - if(equip && equip.selectable) - selected = equip - occupant_message("You switch to [equip]") - visible_message("[src] raises [equip]") - send_byjax(usr, "exosuit.browser","eq_list", get_equipment_list()) - - if(href_list["rmictoggle"]) - radio.broadcasting = !radio.broadcasting - send_byjax(usr,"exosuit.browser","rmicstate",(radio.broadcasting?"Engaged":"Disengaged")) - - if(href_list["rspktoggle"]) - radio.listening = !radio.listening - send_byjax(usr,"exosuit.browser","rspkstate",(radio.listening?"Engaged":"Disengaged")) - - if(href_list["rfreq"]) - var/new_frequency = (radio.frequency + text2num(href_list["rfreq"])) - if (!radio.freerange || (radio.frequency < MIN_FREE_FREQ || radio.frequency > MAX_FREE_FREQ)) - new_frequency = sanitize_frequency(new_frequency) - radio.set_frequency(new_frequency) - send_byjax(usr,"exosuit.browser","rfreq","[format_frequency(radio.frequency)]") - - if (href_list["view_log"]) - src.occupant << browse(src.get_log_html(), "window=exosuit_log") - onclose(occupant, "exosuit_log") - - if (href_list["change_name"]) - var/userinput = stripped_input(occupant,"Choose new exosuit name","Rename exosuit","", MAX_NAME_LEN) - if(!userinput || usr != occupant || usr.incapacitated()) - return - name = userinput - return - - if (href_list["toggle_id_upload"]) - add_req_access = !add_req_access - send_byjax(usr,"exosuit.browser","t_id_upload","[add_req_access?"L":"Unl"]ock ID upload panel") - - if(href_list["toggle_maint_access"]) - if(state) - occupant_message("Maintenance protocols in effect") - return - maint_access = !maint_access - send_byjax(usr,"exosuit.browser","t_maint_access","[maint_access?"Forbid":"Permit"] maintenance protocols") - - if (href_list["toggle_port_connection"]) - if(internal_tank.connected_port) - if(internal_tank.disconnect()) - occupant_message("Disconnected from the air system port.") - mecha_log_message("Disconnected from gas port.") - else - occupant_message("Unable to disconnect from the air system port!") - return - else - var/obj/machinery/atmospherics/components/unary/portables_connector/possible_port = locate() in loc - if(internal_tank.connect(possible_port)) - occupant_message("Connected to the air system port.") - mecha_log_message("Connected to gas port.") - else - occupant_message("Unable to connect with air system port!") - return - send_byjax(occupant,"exosuit.browser","t_port_connection","[internal_tank.connected_port?"Disconnect from":"Connect to"] gas port") - - if(href_list["dna_lock"]) - if(!occupant) - return - var/mob/living/carbon/C = occupant - if(!istype(C) || !C.dna) - to_chat(C, " You do not have any DNA!") - return - dna_lock = C.dna.unique_enzymes - occupant_message("You feel a prick as the needle takes your DNA sample.") - - if(href_list["reset_dna"]) - dna_lock = null - - if(href_list["repair_int_control_lost"]) - occupant_message("Recalibrating coordination system...") - mecha_log_message("Recalibration of coordination system started.") - var/T = loc - spawn(100) - if(T == loc) - clearInternalDamage(MECHA_INT_CONTROL_LOST) - occupant_message("Recalibration successful.") - mecha_log_message("Recalibration of coordination system finished with 0 errors.") - else - occupant_message("Recalibration failed!") - mecha_log_message("Recalibration of coordination system failed with 1 error.", color="red") - diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm deleted file mode 100644 index 36584b85ec..0000000000 --- a/code/game/mecha/mecha_wreckage.dm +++ /dev/null @@ -1,271 +0,0 @@ -/////////////////////////////////// -//////// Mecha wreckage //////// -/////////////////////////////////// - - -/obj/structure/mecha_wreckage - name = "exosuit wreckage" - desc = "Remains of some unfortunate mecha. Completely irreparable, but perhaps something can be salvaged." - icon = 'icons/mecha/mecha.dmi' - density = TRUE - anchored = FALSE - opacity = 0 - var/list/welder_salvage = list(/obj/item/stack/sheet/plasteel, /obj/item/stack/sheet/metal, /obj/item/stack/rods) - var/list/wirecutters_salvage = list(/obj/item/stack/cable_coil) - var/list/crowbar_salvage = list() - var/salvage_num = 5 - var/mob/living/silicon/ai/AI //AIs to be salvaged - -/obj/structure/mecha_wreckage/Initialize(mapload, mob/living/silicon/ai/AI_pilot) - . = ..() - if(!AI_pilot) //Type-checking for this is already done in mecha/Destroy() - return - - AI = AI_pilot - AI.apply_damage(150, BURN) //Give the AI a bit of damage from the "shock" of being suddenly shut down - AI.death() //The damage is not enough to kill the AI, but to be 'corrupted files' in need of repair. - AI.forceMove(src) //Put the dead AI inside the wreckage for recovery - add_overlay(mutable_appearance('icons/obj/projectiles.dmi', "green_laser")) //Overlay for the recovery beacon - AI.controlled_mech = null - AI.remote_control = null - -/obj/structure/mecha_wreckage/examine(mob/user) - . = ..() - if(AI) - . += "The AI recovery beacon is active." - -/obj/structure/mecha_wreckage/attackby(obj/item/I, mob/user, params) - if(I.tool_behaviour == TOOL_WELDER) - if(salvage_num <= 0 || !length(welder_salvage)) - to_chat(user, "You don't see anything that can be cut with [I]!") - return - - if(!I.use_tool(src, user, 0, volume=50)) - return - - var/type = prob(70) ? pick(welder_salvage) : null - if(type) - var/N = new type(get_turf(user)) - user.visible_message("[user] cuts [N] from [src].", "You cut [N] from [src].") - if(istype(N, /obj/item/mecha_parts/part)) - welder_salvage -= type - salvage_num-- - else - to_chat(user, "You fail to salvage anything valuable from [src]!") - return - - else if(I.tool_behaviour == TOOL_WIRECUTTER) - if(salvage_num <= 0) - to_chat(user, "You don't see anything that can be cut with [I]!") - return - else if(wirecutters_salvage && wirecutters_salvage.len) - var/type = prob(70) ? pick(wirecutters_salvage) : null - if(type) - var/N = new type(get_turf(user)) - user.visible_message("[user] cuts [N] from [src].", "You cut [N] from [src].") - salvage_num-- - else - to_chat(user, "You fail to salvage anything valuable from [src]!") - - else if(I.tool_behaviour == TOOL_CROWBAR) - if(crowbar_salvage && crowbar_salvage.len) - var/obj/S = pick(crowbar_salvage) - if(S) - S.forceMove(user.drop_location()) - crowbar_salvage -= S - user.visible_message("[user] pries [S] from [src].", "You pry [S] from [src].") - return - else - to_chat(user, "You don't see anything that can be pried with [I]!") - - -/obj/structure/mecha_wreckage/transfer_ai(interaction, mob/user, null, obj/item/aicard/card) - if(!..()) - return - - //Proc called on the wreck by the AI card. - if(interaction == AI_TRANS_TO_CARD) //AIs can only be transferred in one direction, from the wreck to the card. - if(!AI) //No AI in the wreck - to_chat(user, "No AI backups found.") - return - cut_overlays() //Remove the recovery beacon overlay - AI.forceMove(card) //Move the dead AI to the card. - card.AI = AI - if(AI.client) //AI player is still in the dead AI and is connected - to_chat(AI, "The remains of your file system have been recovered on a mobile storage device.") - else //Give the AI a heads-up that it is probably going to get fixed. - AI.notify_ghost_cloning("You have been recovered from the wreckage!", source = card) - to_chat(user, "Backup files recovered: [AI.name] ([rand(1000,9999)].exe) salvaged from [name] and stored within local memory.") - - else - return ..() - - -/obj/structure/mecha_wreckage/gygax - name = "\improper Gygax wreckage" - icon_state = "gygax-broken" - -/obj/structure/mecha_wreckage/gygax/Initialize() - . = ..() - var/list/parts = list(/obj/item/mecha_parts/part/gygax_torso, - /obj/item/mecha_parts/part/gygax_head, - /obj/item/mecha_parts/part/gygax_left_arm, - /obj/item/mecha_parts/part/gygax_right_arm, - /obj/item/mecha_parts/part/gygax_left_leg, - /obj/item/mecha_parts/part/gygax_right_leg) - for(var/i = 0; i < 2; i++) - if(parts.len && prob(40)) - var/part = pick(parts) - welder_salvage += part - parts -= part - - - -/obj/structure/mecha_wreckage/gygax/dark - name = "\improper Dark Gygax wreckage" - icon_state = "darkgygax-broken" - -/obj/structure/mecha_wreckage/medigax - name = "\improper Medical Gygax wreckage" - icon_state = "medigax-broken" - -/obj/structure/mecha_wreckage/medigax/Initialize() - . = ..() - var/list/parts = list(/obj/item/mecha_parts/part/medigax_torso, - /obj/item/mecha_parts/part/medigax_head, - /obj/item/mecha_parts/part/medigax_left_arm, - /obj/item/mecha_parts/part/medigax_right_arm, - /obj/item/mecha_parts/part/medigax_left_leg, - /obj/item/mecha_parts/part/medigax_right_leg) - for(var/i = 0; i < 2; i++) - if(parts.len && prob(40)) - var/part = pick(parts) - welder_salvage += part - parts -= part - -/obj/structure/mecha_wreckage/marauder - name = "\improper Marauder wreckage" - icon_state = "marauder-broken" - -/obj/structure/mecha_wreckage/mauler - name = "\improper Mauler wreckage" - icon_state = "mauler-broken" - desc = "The syndicate won't be very happy about this..." - -/obj/structure/mecha_wreckage/seraph - name = "\improper Seraph wreckage" - icon_state = "seraph-broken" - -/obj/structure/mecha_wreckage/reticence - name = "\improper Reticence wreckage" - icon_state = "reticence-broken" - color = "#87878715" - desc = "..." - -/obj/structure/mecha_wreckage/ripley - name = "\improper Ripley wreckage" - icon_state = "ripley-broken" - -/obj/structure/mecha_wreckage/ripley/Initialize() - . = ..() - var/list/parts = list(/obj/item/mecha_parts/part/ripley_torso, - /obj/item/mecha_parts/part/ripley_left_arm, - /obj/item/mecha_parts/part/ripley_right_arm, - /obj/item/mecha_parts/part/ripley_left_leg, - /obj/item/mecha_parts/part/ripley_right_leg) - for(var/i = 0; i < 2; i++) - if(parts.len && prob(40)) - var/part = pick(parts) - welder_salvage += part - parts -= part - - -/obj/structure/mecha_wreckage/ripley/firefighter - name = "\improper Firefighter wreckage" - icon_state = "firefighter-broken" - -/obj/structure/mecha_wreckage/ripley/firefighter/Initialize() - . = ..() - var/list/parts = list(/obj/item/mecha_parts/part/ripley_torso, - /obj/item/mecha_parts/part/ripley_left_arm, - /obj/item/mecha_parts/part/ripley_right_arm, - /obj/item/mecha_parts/part/ripley_left_leg, - /obj/item/mecha_parts/part/ripley_right_leg, - /obj/item/clothing/suit/fire) - for(var/i = 0; i < 2; i++) - if(parts.len && prob(40)) - var/part = pick(parts) - welder_salvage += part - parts -= part - - -/obj/structure/mecha_wreckage/ripley/deathripley - name = "\improper Death-Ripley wreckage" - icon_state = "deathripley-broken" - - -/obj/structure/mecha_wreckage/honker - name = "\improper H.O.N.K wreckage" - icon_state = "honker-broken" - desc = "All is right in the universe." - -/obj/structure/mecha_wreckage/honker/Initialize() - . = ..() - var/list/parts = list( - /obj/item/mecha_parts/chassis/honker, - /obj/item/mecha_parts/part/honker_torso, - /obj/item/mecha_parts/part/honker_head, - /obj/item/mecha_parts/part/honker_left_arm, - /obj/item/mecha_parts/part/honker_right_arm, - /obj/item/mecha_parts/part/honker_left_leg, - /obj/item/mecha_parts/part/honker_right_leg) - for(var/i = 0; i < 2; i++) - if(parts.len && prob(40)) - var/part = pick(parts) - welder_salvage += part - parts -= part - - -/obj/structure/mecha_wreckage/durand - name = "\improper Durand wreckage" - icon_state = "durand-broken" - -/obj/structure/mecha_wreckage/durand/Initialize() - . = ..() - var/list/parts = list( - /obj/item/mecha_parts/part/durand_torso, - /obj/item/mecha_parts/part/durand_head, - /obj/item/mecha_parts/part/durand_left_arm, - /obj/item/mecha_parts/part/durand_right_arm, - /obj/item/mecha_parts/part/durand_left_leg, - /obj/item/mecha_parts/part/durand_right_leg) - for(var/i = 0; i < 2; i++) - if(parts.len && prob(40)) - var/part = pick(parts) - welder_salvage += part - parts -= part - - -/obj/structure/mecha_wreckage/phazon - name = "\improper Phazon wreckage" - icon_state = "phazon-broken" - - -/obj/structure/mecha_wreckage/odysseus - name = "\improper Odysseus wreckage" - icon_state = "odysseus-broken" - -/obj/structure/mecha_wreckage/odysseus/Initialize() - . = ..() - var/list/parts = list( - /obj/item/mecha_parts/part/odysseus_torso, - /obj/item/mecha_parts/part/odysseus_head, - /obj/item/mecha_parts/part/odysseus_left_arm, - /obj/item/mecha_parts/part/odysseus_right_arm, - /obj/item/mecha_parts/part/odysseus_left_leg, - /obj/item/mecha_parts/part/odysseus_right_leg) - for(var/i = 0; i < 2; i++) - if(parts.len && prob(40)) - var/part = pick(parts) - welder_salvage += part - parts -= part diff --git a/code/game/mecha/medical/medical.dm b/code/game/mecha/medical/medical.dm deleted file mode 100644 index 8b4e48cd3e..0000000000 --- a/code/game/mecha/medical/medical.dm +++ /dev/null @@ -1,16 +0,0 @@ -/obj/mecha/medical/mechturn(direction) - setDir(direction) - playsound(src,'sound/mecha/mechmove01.ogg',40,1) - return 1 - -/obj/mecha/medical/mechstep(direction) - var/result = step(src,direction) - if(result) - playsound(src,'sound/mecha/mechstep.ogg',25,1) - return result - -/obj/mecha/medical/mechsteprand() - var/result = step_rand(src) - if(result) - playsound(src,'sound/mecha/mechstep.ogg',25,1) - return result diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm deleted file mode 100644 index 3c2f75bd6c..0000000000 --- a/code/game/mecha/working/ripley.dm +++ /dev/null @@ -1,188 +0,0 @@ -/obj/mecha/working/ripley - desc = "Autonomous Power Loader Unit. This newer model is refitted with powerful armour against the dangers of planetary mining." - name = "\improper APLU \"Ripley\"" - icon_state = "ripley" - step_in = 3 //Move speed, lower is faster. - var/fast_pressure_step_in = 2 - var/slow_pressure_step_in = 3 - max_temperature = 20000 - max_integrity = 200 - lights_power = 8 - deflect_chance = 15 - armor = list("melee" = 30, "bullet" = 15, "laser" = 10, "energy" = 20, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) - max_equip = 6 - wreckage = /obj/structure/mecha_wreckage/ripley - var/list/cargo = new - var/cargo_capacity = 15 - var/hides = 0 - -/obj/mecha/working/ripley/Move() - . = ..() - if(.) - collect_ore() - update_pressure() - -/obj/mecha/working/ripley/proc/collect_ore() - if(locate(/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp) in equipment) - var/obj/structure/ore_box/ore_box = locate(/obj/structure/ore_box) in cargo - if(ore_box) - for(var/obj/item/stack/ore/ore in range(1, src)) - if(ore.Adjacent(src) && ((get_dir(src, ore) & dir) || ore.loc == loc)) //we can reach it and it's in front of us? grab it! - ore.forceMove(ore_box) - -/obj/mecha/working/ripley/Destroy() - for(var/atom/movable/A in cargo) - A.forceMove(drop_location()) - step_rand(A) - cargo.Cut() - return ..() - -/obj/mecha/working/ripley/go_out() - ..() - update_icon() - -/obj/mecha/working/ripley/moved_inside(mob/living/carbon/human/H) - ..() - update_icon() - -/obj/mecha/working/ripley/Initialize() - . = ..() - AddComponent(/datum/component/armor_plate,3,/obj/item/stack/sheet/animalhide/goliath_hide,list("melee" = 10, "bullet" = 5, "laser" = 5)) - - -/obj/mecha/working/ripley/firefighter - desc = "Autonomous Power Loader Unit. This model is refitted with additional thermal protection." - name = "\improper APLU \"Firefighter\"" - icon_state = "firefighter" - step_in = 4 - fast_pressure_step_in = 2 - slow_pressure_step_in = 4 - max_temperature = 65000 - max_integrity = 250 - resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF - lights_power = 7 - armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) - max_equip = 5 // More armor, less tools - wreckage = /obj/structure/mecha_wreckage/ripley/firefighter - - -/obj/mecha/working/ripley/deathripley - desc = "OH SHIT IT'S THE DEATHSQUAD WE'RE ALL GONNA DIE" - name = "\improper DEATH-RIPLEY" - icon_state = "deathripley" - armor = list("melee" = 40, "bullet" = 30, "laser" = 20, "energy" = 20, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) - slow_pressure_step_in = 3 - opacity=0 - lights_power = 7 - wreckage = /obj/structure/mecha_wreckage/ripley/deathripley - step_energy_drain = 0 - -/obj/mecha/working/ripley/deathripley/Initialize() - . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/kill - ME.attach(src) - -/obj/mecha/working/ripley/deathripley/real - desc = "OH SHIT IT'S THE DEATHSQUAD WE'RE ALL GONNA DIE. FOR REAL" - -/obj/mecha/working/ripley/deathripley/real/Initialize() - . = ..() - for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) - E.detach() - qdel(E) - equipment.Cut() - var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/kill/real - ME.attach(src) - -/obj/mecha/working/ripley/mining - desc = "An old, dusty mining Ripley." - name = "\improper APLU \"Miner\"" - obj_integrity = 75 //Low starting health - -/obj/mecha/working/ripley/mining/Initialize() - . = ..() - if(cell) - cell.charge = FLOOR(cell.charge * 0.25, 1) //Starts at very low charge - if(prob(70)) //Maybe add a drill - if(prob(15)) //Possible diamond drill... Feeling lucky? - var/obj/item/mecha_parts/mecha_equipment/drill/diamonddrill/D = new - D.attach(src) - else - var/obj/item/mecha_parts/mecha_equipment/drill/D = new - D.attach(src) - - else //Add plasma cutter if no drill - var/obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma/P = new - P.attach(src) - - //Add ore box to cargo - cargo.Add(new /obj/structure/ore_box(src)) - - //Attach hydraulic clamp - var/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/HC = new - HC.attach(src) - for(var/obj/item/mecha_parts/mecha_tracking/B in trackers)//Deletes the beacon so it can't be found easily - qdel(B) - - var/obj/item/mecha_parts/mecha_equipment/mining_scanner/scanner = new - scanner.attach(src) - -/obj/mecha/working/ripley/Exit(atom/movable/O) - if(O in cargo) - return 0 - return ..() - -/obj/mecha/working/ripley/Topic(href, href_list) - ..() - if(href_list["drop_from_cargo"]) - var/obj/O = locate(href_list["drop_from_cargo"]) - if(O && (O in cargo)) - occupant_message("You unload [O].") - O.forceMove(drop_location()) - cargo -= O - mecha_log_message("Unloaded [O]. Cargo compartment capacity: [cargo_capacity - src.cargo.len]") - return - - -/obj/mecha/working/ripley/contents_explosion(severity, target, origin) - for(var/X in cargo) - var/obj/O = X - if(prob(30/severity)) - cargo -= O - O.forceMove(drop_location()) - . = ..() - -/obj/mecha/working/ripley/get_stats_part() - var/output = ..() - output += "Cargo Compartment Contents:
" - if(cargo.len) - for(var/obj/O in cargo) - output += "Unload : [O]
" - else - output += "Nothing" - output += "
" - return output - -/obj/mecha/working/ripley/proc/update_pressure() - var/turf/T = get_turf(loc) - - if(lavaland_equipment_pressure_check(T)) - step_in = fast_pressure_step_in - for(var/obj/item/mecha_parts/mecha_equipment/drill/drill in equipment) - drill.equip_cooldown = initial(drill.equip_cooldown)/2 - else - step_in = slow_pressure_step_in - for(var/obj/item/mecha_parts/mecha_equipment/drill/drill in equipment) - drill.equip_cooldown = initial(drill.equip_cooldown) - -/obj/mecha/working/ripley/relay_container_resist(mob/living/user, obj/O) - to_chat(user, "You lean on the back of [O] and start pushing so it falls out of [src].") - if(do_after(user, 300, target = O)) - if(!user || user.stat != CONSCIOUS || user.loc != src || O.loc != src ) - return - to_chat(user, "You successfully pushed [O] out of [src]!") - O.forceMove(drop_location()) - cargo -= O - else - if(user.loc == src) //so we don't get the message if we resisted multiple times and succeeded. - to_chat(user, "You fail to push [O] out of [src]!") diff --git a/code/game/mecha/working/working.dm b/code/game/mecha/working/working.dm deleted file mode 100644 index c9e7d99ac0..0000000000 --- a/code/game/mecha/working/working.dm +++ /dev/null @@ -1,3 +0,0 @@ -/obj/mecha/working - internal_damage_threshold = 60 - diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm index fb245f7607..5d573c5a43 100644 --- a/code/game/objects/effects/effects.dm +++ b/code/game/objects/effects/effects.dm @@ -18,9 +18,6 @@ /obj/effect/acid_act() return -/obj/effect/mech_melee_attack(obj/mecha/M) - return 0 - /obj/effect/blob_act(obj/structure/blob/B) return diff --git a/code/game/objects/effects/temporary_visuals/clockcult.dm b/code/game/objects/effects/temporary_visuals/clockcult.dm index 9a236c00c3..4d79d50301 100644 --- a/code/game/objects/effects/temporary_visuals/clockcult.dm +++ b/code/game/objects/effects/temporary_visuals/clockcult.dm @@ -132,11 +132,15 @@ L.apply_damage(damage, BURN, "chest", L.run_armor_check("chest", "laser", "Your armor absorbs [src]!", "Your armor blocks part of [src]!", 0, "Your armor was penetrated by [src]!")) log_combat(user, L, "struck with a volt blast") hit_amount++ - for(var/obj/mecha/M in T) - if(M.occupant) - if(is_servant_of_ratvar(M.occupant)) - continue - to_chat(M.occupant, "Your [M.name] is struck by a [name]!") + for(var/obj/vehicle/sealed/mecha/M in T) + if(LAZYLEN(M.occupants)) + for(var/mob/living/MB in M.occupants) + if(is_servant_of_ratvar(MB)) + continue + else + to_chat(MB, "Your [M.name] is struck by a [name]!") + continue + M.visible_message("[M] is struck by a [name]!") M.take_damage(damage, BURN, 0, 0) hit_amount++ diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 54bdeff4de..14d5d943a2 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -841,9 +841,6 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb return ..() return 0 -/obj/item/mech_melee_attack(obj/mecha/M) - return 0 - /obj/item/burn() if(!QDELETED(src)) var/turf/T = get_turf(src) diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm index e20321414d..da5bed07ce 100644 --- a/code/game/objects/items/devices/camera_bug.dm +++ b/code/game/objects/items/devices/camera_bug.dm @@ -161,7 +161,7 @@ dat += " (Stage [stage])" dat += " \[Track\]
" - for(var/obj/mecha/M in seen) + for(var/obj/vehicle/sealed/mecha/M in seen) if(M.name in names) names[M.name]++ dat += "[M.name] ([names[M.name]])" diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 95a651b50e..33c683a6cc 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -171,26 +171,6 @@ #undef BLACKLISTED_OBJECTS -/obj/mech_melee_attack(obj/mecha/M) - M.do_attack_animation(src) - var/play_soundeffect = 0 - var/mech_damtype = M.damtype - if(M.selected) - mech_damtype = M.selected.damtype - play_soundeffect = 1 - else - switch(M.damtype) - if(BRUTE) - playsound(src, 'sound/weapons/punch4.ogg', 50, 1) - if(BURN) - playsound(src, 'sound/items/welder.ogg', 50, 1) - if(TOX) - playsound(src, 'sound/effects/spray2.ogg', 50, 1) - return 0 - else - return 0 - visible_message("[M.name] has hit [src].", null, null, COMBAT_MESSAGE_RANGE) - return take_damage(M.force*3, mech_damtype, "melee", play_soundeffect, get_dir(src, M)) // multiplied by 3 so we can hit objs hard but not be overpowered against mobs. /obj/singularity_act() ex_act(EXPLODE_DEVASTATE) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index e8e170446b..1e7f4fd64b 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -445,11 +445,6 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) /obj/structure/window/proc/check_state_and_anchored(checked_state, checked_anchored) return check_state(checked_state) && check_anchored(checked_anchored) -/obj/structure/window/mech_melee_attack(obj/mecha/M) - if(!can_be_reached()) - return - ..() - /obj/structure/window/proc/can_be_reached(mob/user) if(!fulltile) if(get_dir(user,src) & dir) diff --git a/code/game/turfs/simulated/wall/misc_walls.dm b/code/game/turfs/simulated/wall/misc_walls.dm index e4d991a082..041751d0cd 100644 --- a/code/game/turfs/simulated/wall/misc_walls.dm +++ b/code/game/turfs/simulated/wall/misc_walls.dm @@ -145,10 +145,11 @@ user.adjustFireLoss(5) playsound(src, 'sound/machines/fryer/deep_fryer_emerge.ogg', 50, TRUE) -/turf/closed/wall/clockwork/mech_melee_attack(obj/mecha/M) +/turf/closed/wall/clockwork/mech_melee_attack(obj/vehicle/sealed/mecha/M) ..() if(heated) - to_chat(M.occupant, "The wall's intense heat completely reflects your [M.name]'s attack!") + for(var/mob/living/MB in M.occupants) + to_chat(MB, "The wall's intense heat completely reflects your [M.name]'s attack!") M.take_damage(20, BURN) /turf/closed/wall/clockwork/proc/turn_up_the_heat() diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 6303b33afa..cac03b0637 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -115,23 +115,6 @@ else add_dent(WALL_DENT_HIT) -/turf/closed/wall/mech_melee_attack(obj/mecha/M) - M.do_attack_animation(src) - switch(M.damtype) - if(BRUTE) - playsound(src, 'sound/weapons/punch4.ogg', 50, 1) - visible_message("[M.name] has hit [src]!", null, null, COMBAT_MESSAGE_RANGE) - if(prob(hardness + M.force) && M.force > 20) - dismantle_wall(1) - playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1) - else - add_dent(WALL_DENT_HIT) - if(BURN) - playsound(src, 'sound/items/welder.ogg', 100, 1) - if(TOX) - playsound(src, 'sound/effects/spray2.ogg', 100, 1) - return FALSE - /turf/closed/wall/attack_paw(mob/living/user) return attack_hand(user) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 419378acb9..aaf8364229 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -379,7 +379,7 @@ GLOBAL_LIST_EMPTY(station_turfs) continue//Will not harm U. Since null != M, can be excluded to kill everyone. M.adjustBruteLoss(damage) M.Unconscious(damage * 4) - for(var/obj/mecha/M in src) + for(var/obj/vehicle/sealed/mecha/M in src) M.take_damage(damage*2, BRUTE, "melee", 1) /turf/proc/Bless() diff --git a/code/modules/antagonists/clockcult/clock_helpers/clock_powerdrain.dm b/code/modules/antagonists/clockcult/clock_helpers/clock_powerdrain.dm index 76738ab1de..8d0dff0ea8 100644 --- a/code/modules/antagonists/clockcult/clock_helpers/clock_powerdrain.dm +++ b/code/modules/antagonists/clockcult/clock_helpers/clock_powerdrain.dm @@ -72,8 +72,11 @@ drain_amount: How much is drained by default; Influenced by a multiplier on most cell.use(.) spark_system.start() -/obj/mecha/power_drain(clockcult_user, drain_weapons = FALSE, recursive = FALSE, drain_amount = MIN_CLOCKCULT_POWER) - if(!clockcult_user || (occupant && !is_servant_of_ratvar(occupant))) +/obj/vehicle/sealed/mecha/power_drain(clockcult_user, drain_weapons = FALSE, recursive = FALSE, drain_amount = MIN_CLOCKCULT_POWER) + if(!clockcult_user || LAZYLEN(occupants)) + for(var/mob/living/MB in occupants) + if(is_servant_of_ratvar(MB)) + return if(recursive) var/succ = 0 for(var/atom/movable/target in contents) //Hiding in your mech won't save you. diff --git a/code/modules/antagonists/clockcult/clock_scriptures/scripture_applications.dm b/code/modules/antagonists/clockcult/clock_scriptures/scripture_applications.dm index e251fb41e9..ae524ac257 100644 --- a/code/modules/antagonists/clockcult/clock_scriptures/scripture_applications.dm +++ b/code/modules/antagonists/clockcult/clock_scriptures/scripture_applications.dm @@ -207,20 +207,20 @@ /datum/clockwork_scripture/create_object/summon_arbiter descname = "Powerful Assault Mech" name = "Summon Neovgre, the Anima Bulwark" - desc = "Calls forth the mighty Anima Bulwark, a mech with superior defensive and offensive capabilities. It will \ + desc = "Calls forth the mighty Anima Bulwark, a two-person mech with superior defensive and offensive capabilities. It will \ steadily regenerate HP and triple its regeneration speed while standing \ on a clockwork tile. It will automatically draw power from nearby sigils of \ transmission should the need arise. Its Arbiter laser cannon can decimate foes \ from a range and is capable of smashing through any barrier presented to it. \ - Be warned however, choosing to pilot Neovgre is a lifetime commitment, once you are \ - in you cannot leave and when it is destroyed it will explode catastrophically, with you inside." + Be warned however, choosing to pilot or man Neovgre is a lifetime commitment, once you are \ + in you cannot leave and when it is destroyed it will explode catastrophically, with everyone inside." invocations = list("By the strength of the alloy...!!", "...call forth the Arbiter!!") channel_time = 200 // This is a strong fucking weapon, 20 seconds channel time is getting off light I tell ya. power_cost = 75000 //75 KW usage_tip = "Neovgre is a powerful mech that will crush your enemies!" invokers_required = 5 multiple_invokers_used = TRUE - object_path = /obj/mecha/combat/neovgre + object_path = /obj/vehicle/sealed/mecha/combat/neovgre tier = SCRIPTURE_APPLICATION primary_component = BELLIGERENT_EYE sort_priority = 8 diff --git a/code/modules/antagonists/clockcult/clock_structure.dm b/code/modules/antagonists/clockcult/clock_structure.dm index 380e93f102..daafb2add3 100644 --- a/code/modules/antagonists/clockcult/clock_structure.dm +++ b/code/modules/antagonists/clockcult/clock_structure.dm @@ -72,11 +72,6 @@ return FALSE return ..() -/obj/structure/destructible/clockwork/mech_melee_attack(obj/mecha/M) - if(M.occupant && is_servant_of_ratvar(M.occupant) && immune_to_servant_attacks) - return FALSE - return ..() - /obj/structure/destructible/clockwork/proc/get_efficiency_mod() if(GLOB.ratvar_awakens) return 2 diff --git a/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm b/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm index 00db2b0d72..44699b17ed 100644 --- a/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm +++ b/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm @@ -76,7 +76,7 @@ L.adjust_fire_stacks(damage_per_tick) L.IgniteMob() else if(ismecha(target)) - var/obj/mecha/M = target + var/obj/vehicle/sealed/mecha/M = target M.take_damage(damage_per_tick * get_efficiency_mod(), BURN, "melee", 1, get_dir(src, M)) new /obj/effect/temp_visual/ratvar/ocular_warden(get_turf(target)) @@ -91,8 +91,8 @@ var/mob/living/L = target to_chat(L, "\"I SEE YOU!\"\n[src]'s gaze [GLOB.ratvar_awakens ? "melts you alive" : "burns you"]!") else if(ismecha(target)) - var/obj/mecha/M = target - to_chat(M.occupant, "\"I SEE YOU!\"" ) + var/obj/vehicle/sealed/mecha/M = target + to_chat(M.occupants, "\"I SEE YOU!\"" ) else if(prob(0.5)) //Extremely low chance because of how fast the subsystem it uses processes if(prob(50)) visible_message("[src][pick(idle_messages)]") @@ -131,8 +131,11 @@ . += L var/list/viewcache = list() for(var/N in GLOB.mechas_list) - var/obj/mecha/M = N - if(get_dist(M, src) <= sight_range && M.occupant && !is_servant_of_ratvar(M.occupant)) + var/obj/vehicle/sealed/mecha/M = N + if(get_dist(M, src) <= sight_range && LAZYLEN(M.occupants)) + for(var/mob/living/MB in M.occupants) + if(is_servant_of_ratvar(MB)) + return if(!length(viewcache)) for (var/obj/Z in view(sight_range, src)) viewcache += Z diff --git a/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor_mech.dm b/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor_mech.dm index 21735ad6d7..55143fae66 100644 --- a/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor_mech.dm +++ b/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor_mech.dm @@ -9,12 +9,14 @@ /obj/structure/destructible/clockwork/trap/trigger/pressure_sensor/mech/Crossed(atom/movable/AM) . = ..() - if(!istype(AM,/obj/mecha/)) + if(!istype(AM,/obj/vehicle/sealed/mecha/)) return - var/obj/mecha/M = AM - if(M.occupant && is_servant_of_ratvar(M.occupant)) - return + var/obj/vehicle/sealed/mecha/M = AM + if(LAZYLEN(M.occupants)) + for(var/mob/living/MB in M.occupants) + if(is_servant_of_ratvar(MB)) + return audible_message("*click*") playsound(src, 'sound/items/screwdriver2.ogg', 50, TRUE) activate() diff --git a/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm b/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm index e8ae133ede..ab4294df85 100644 --- a/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm +++ b/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm @@ -68,7 +68,7 @@ mouse_opacity = MOUSE_OPACITY_OPAQUE //So players can interact with the tile it's on to pull them off buckle_mob(squirrel, TRUE) else - var/obj/mecha/M = locate() in get_turf(src) + var/obj/vehicle/sealed/mecha/M = locate() in get_turf(src) if(M) M.take_damage(50,BRUTE,"melee") M.visible_message("A massive brass spike erupts from the ground, penetrating \the [M] and shattering the trap into pieces!") diff --git a/code/modules/antagonists/eldritch_cult/eldritch_magic.dm b/code/modules/antagonists/eldritch_cult/eldritch_magic.dm index 158acc0071..bee2747626 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_magic.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_magic.dm @@ -402,7 +402,7 @@ new /obj/effect/hotspot(T) T.hotspot_expose(700,50,1) // deals damage to mechs - for(var/obj/mecha/M in T.contents) + for(var/obj/vehicle/sealed/mecha/M in T.contents) if(M in hit_list) continue hit_list += M diff --git a/code/modules/cargo/bounties/mech.dm b/code/modules/cargo/bounties/mech.dm index b7eac3499f..c1d22d9dbf 100644 --- a/code/modules/cargo/bounties/mech.dm +++ b/code/modules/cargo/bounties/mech.dm @@ -5,8 +5,8 @@ /datum/bounty/item/mech/ship(obj/O) if(!applies_to(O)) return - if(istype(O, /obj/mecha)) - var/obj/mecha/M = O + if(istype(O, /obj/vehicle/sealed/mecha)) + var/obj/vehicle/sealed/mecha/M = O M.wreckage = null // So the mech doesn't explode. ..() @@ -16,30 +16,30 @@ /datum/bounty/item/mech/ripley name = "APLU \"Ripley\"" reward = 13000 - wanted_types = list(/obj/mecha/working/ripley) - exclude_types = list(/obj/mecha/working/ripley/firefighter) + wanted_types = list(/obj/vehicle/sealed/mecha/working/ripley) + exclude_types = list(/obj/vehicle/sealed/mecha/working/ripley/firefighter) /datum/bounty/item/mech/firefighter name = "APLU \"Firefighter\"" reward = 18000 - wanted_types = list(/obj/mecha/working/ripley/firefighter) + wanted_types = list(/obj/vehicle/sealed/mecha/working/ripley/firefighter) /datum/bounty/item/mech/odysseus name = "Odysseus" reward = 11000 - wanted_types = list(/obj/mecha/medical/odysseus) + wanted_types = list(/obj/vehicle/sealed/mecha/medical/odysseus) /datum/bounty/item/mech/gygax name = "Gygax" reward = 28000 - wanted_types = list(/obj/mecha/combat/gygax) + wanted_types = list(/obj/vehicle/sealed/mecha/combat/gygax) /datum/bounty/item/mech/durand name = "Durand" reward = 20000 - wanted_types = list(/obj/mecha/combat/durand) + wanted_types = list(/obj/vehicle/sealed/mecha/combat/durand) /datum/bounty/item/mech/phazon name = "Phazon" reward = 50000 - wanted_types = list(/obj/mecha/combat/phazon) + wanted_types = list(/obj/vehicle/sealed/mecha/combat/phazon) diff --git a/code/modules/cargo/exports.dm b/code/modules/cargo/exports.dm index b72e497a5f..e6ed245294 100644 --- a/code/modules/cargo/exports.dm +++ b/code/modules/cargo/exports.dm @@ -61,7 +61,7 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they if(ismob(thing)) thing.investigate_log("deleted through cargo export",INVESTIGATE_CARGO) if(ismecha(thing)) - var/obj/mecha/mech = thing + var/obj/vehicle/sealed/mecha/mech = thing mech.wreckage = null // why a mech left a wreck when sold i will never know qdel(thing) diff --git a/code/modules/cargo/exports/large_objects.dm b/code/modules/cargo/exports/large_objects.dm index dca23c9f22..6d965e2c5a 100644 --- a/code/modules/cargo/exports/large_objects.dm +++ b/code/modules/cargo/exports/large_objects.dm @@ -278,69 +278,69 @@ /datum/export/large/mech/odysseus cost = 7500 unit_name = "working odysseus" - export_types = list(/obj/mecha/medical/odysseus) + export_types = list(/obj/vehicle/sealed/mecha/medical/odysseus) /datum/export/large/mech/ripley cost = 12000 unit_name = "working ripley" - export_types = list(/obj/mecha/working/ripley) + export_types = list(/obj/vehicle/sealed/mecha/working/ripley) /datum/export/large/mech/firefighter cost = 14000 unit_name = "working firefighter" - export_types = list(/obj/mecha/working/ripley/firefighter) + export_types = list(/obj/vehicle/sealed/mecha/working/ripley/firefighter) /datum/export/large/mech/gygax cost = 19000 unit_name = "working gygax" - export_types = list(/obj/mecha/combat/gygax) + export_types = list(/obj/vehicle/sealed/mecha/combat/gygax) /datum/export/large/mech/durand cost = 16000 unit_name = "working durand" - export_types = list(/obj/mecha/combat/durand) + export_types = list(/obj/vehicle/sealed/mecha/combat/durand) /datum/export/large/mech/phazon cost = 35000 //Little over half due to needing a core unit_name = "working phazon" - export_types = list(/obj/mecha/combat/phazon) + export_types = list(/obj/vehicle/sealed/mecha/combat/phazon) /datum/export/large/mech/marauder cost = 15000 //Still a Combat class mech - CC tech as well! 150% "normal" boundy price. unit_name = "working marauder" - export_types = list(/obj/mecha/combat/marauder) + export_types = list(/obj/vehicle/sealed/mecha/combat/marauder) /datum/export/large/mech/deathripley cost = 18500 //Still a "Combat class" mech - Illegal tech as well! 165% "normal" boundy price. unit_name = "working illegally modified" - export_types = list(/obj/mecha/working/ripley/deathripley) + export_types = list(/obj/vehicle/sealed/mecha/working/ripley/deathripley) /datum/export/large/mech/gygaxdark cost = 28500 //Still a Combat class mech - Illegal tech as well! 150% "normal" boundy price. unit_name = "working illegally modified gygax" - export_types = list(/obj/mecha/combat/gygax/dark) + export_types = list(/obj/vehicle/sealed/mecha/combat/gygax/dark) /datum/export/large/mech/oldripley cost = 6250 //old mech - Scrap metal ! 50% "normal" boundy price. unit_name = "working miner ripley" - export_types = list(/obj/mecha/working/ripley/mining) + export_types = list(/obj/vehicle/sealed/mecha/working/ripley/mining) /datum/export/large/mech/honk cost = 16000 //Still a "Combat class" mech - Comats bordem honk! unit_name = "working honker" - export_types = list(/obj/mecha/combat/honker) + export_types = list(/obj/vehicle/sealed/mecha/combat/honker) /datum/export/large/mech/reticence cost = 16000 //Still a "Combat class" mech - Has cloking and lethal weaponds. unit_name = "working reticence" - export_types = list(/obj/mecha/combat/reticence) + export_types = list(/obj/vehicle/sealed/mecha/combat/reticence) /datum/export/large/mech/seraph cost = 25500 //Still a Combat class mech - CC tech as well! 150% "normal" boundy price. unit_name = "working seraph" - export_types = list(/obj/mecha/combat/marauder/seraph) + export_types = list(/obj/vehicle/sealed/mecha/combat/marauder/seraph) /datum/export/large/mech/mauler cost = 25000 //Still a Combat class mech - CC lethal weaponds. unit_name = "working legally modified marauder" - export_types = list(/obj/mecha/combat/marauder/mauler) + export_types = list(/obj/vehicle/sealed/mecha/combat/marauder/mauler) diff --git a/code/modules/cargo/exports/organs_robotics.dm b/code/modules/cargo/exports/organs_robotics.dm index 08340e6a56..40f7edbd99 100644 --- a/code/modules/cargo/exports/organs_robotics.dm +++ b/code/modules/cargo/exports/organs_robotics.dm @@ -163,7 +163,7 @@ cost = 150 unit_name = "mech based tool" include_subtypes = TRUE - export_types = list(/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp, /obj/item/mecha_parts/mecha_equipment/extinguisher, /obj/item/mecha_parts/mecha_equipment/rcd, /obj/item/mecha_parts/mecha_equipment/cable_layer, \ + export_types = list(/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp, /obj/item/mecha_parts/mecha_equipment/extinguisher, /obj/item/mecha_parts/mecha_equipment/rcd, \ /obj/item/mecha_parts/mecha_equipment/drill, /obj/item/mecha_parts/mecha_equipment/mining_scanner, /obj/item/mecha_parts/mecha_equipment/medical/sleeper) /datum/export/robotics/mech_blue_space diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index 5b131749b8..9c144ee6f3 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -274,8 +274,8 @@ if(isliving(A)) //Gettem boys! L = A else if(ismecha(A)) - var/obj/mecha/M = A - L = M.occupant + var/obj/vehicle/sealed/mecha/M = A + L = pick(M.occupants) if(L && L.stat != DEAD && !HAS_TRAIT(L, TRAIT_DEATHCOMA)) //Taking revenge on the deads would be proposterous. addtimer(CALLBACK(src, .proc/clear_grudge, L), 2 MINUTES, TIMER_OVERRIDE|TIMER_UNIQUE) if(!book_of_grudges[L]) diff --git a/code/modules/fields/timestop.dm b/code/modules/fields/timestop.dm index a96a44a789..db42ad6798 100644 --- a/code/modules/fields/timestop.dm +++ b/code/modules/fields/timestop.dm @@ -84,7 +84,7 @@ freeze_mob(A) else if(istype(A, /obj/item/projectile)) freeze_projectile(A) - else if(istype(A, /obj/mecha)) + else if(istype(A, /obj/vehicle/sealed/mecha)) freeze_mecha(A) else if((ismachinery(A) && !istype(A, /obj/machinery/light)) || isstructure(A)) //Special exception for light fixtures since recoloring causes them to change light freeze_structure(A) @@ -120,7 +120,7 @@ unfreeze_mob(A) else if(istype(A, /obj/item/projectile)) unfreeze_projectile(A) - else if(istype(A, /obj/mecha)) + else if(istype(A, /obj/vehicle/sealed/mecha)) unfreeze_mecha(A) UnregisterSignal(A, COMSIG_MOVABLE_PRE_MOVE) @@ -131,10 +131,10 @@ global_frozen_atoms -= A -/datum/proximity_monitor/advanced/timestop/proc/freeze_mecha(obj/mecha/M) +/datum/proximity_monitor/advanced/timestop/proc/freeze_mecha(obj/vehicle/sealed/mecha/M) M.completely_disabled = TRUE -/datum/proximity_monitor/advanced/timestop/proc/unfreeze_mecha(obj/mecha/M) +/datum/proximity_monitor/advanced/timestop/proc/unfreeze_mecha(obj/vehicle/sealed/mecha/M) M.completely_disabled = FALSE diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm index f38f326bc6..b7907f227b 100644 --- a/code/modules/mob/living/brain/MMI.dm +++ b/code/modules/mob/living/brain/MMI.dm @@ -8,7 +8,7 @@ var/obj/item/radio/radio = null //Let's give it a radio. var/mob/living/brain/brainmob = null //The current occupant. var/mob/living/silicon/robot = null //Appears unused. - var/obj/mecha = null //This does not appear to be used outside of reference in mecha.dm. + var/obj/vehicle/sealed/mecha = null //This does not appear to be used outside of reference in mecha.dm. var/obj/item/organ/brain/brain = null //The actual brain var/datum/ai_laws/laws = new() var/force_replace_ai_name = FALSE diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm index 91fab5f2ec..ad2daf86e2 100644 --- a/code/modules/mob/living/brain/brain.dm +++ b/code/modules/mob/living/brain/brain.dm @@ -41,7 +41,7 @@ return ..() /mob/living/brain/update_mobility() - return ((mobility_flags = (container?.in_contents_of(/obj/mecha)? MOBILITY_FLAGS_DEFAULT : NONE))) + return ((mobility_flags = (container?.in_contents_of(/obj/vehicle/sealed/mecha)? MOBILITY_FLAGS_DEFAULT : NONE))) /mob/living/brain/ex_act(severity, target, origin) //you cant blow up brainmobs because it makes transfer_to() freak out when borgs blow up. return @@ -71,13 +71,6 @@ if(stored_dna) stored_dna.real_name = real_name -/mob/living/brain/ClickOn(atom/A, params) - ..() - if(container) - var/obj/mecha/M = container.mecha - if(istype(M)) - return M.click_action(A,src,params) - /mob/living/brain/forceMove(atom/destination) if(container) return container.forceMove(destination) @@ -98,7 +91,7 @@ if(!container) return if (container.mecha) - var/obj/mecha/M = container.mecha + var/obj/vehicle/sealed/mecha/M = container.mecha if(M.mouse_pointer) client.mouse_pointer_icon = M.mouse_pointer if (client && ranged_ability && ranged_ability.ranged_mousepointer) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index b7d9b0f61a..4ca45ceabd 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -43,10 +43,6 @@ GLOBAL_LIST_EMPTY(dead_players_during_shift) if(client && !suiciding && !(client in GLOB.dead_players_during_shift)) GLOB.dead_players_during_shift += client GLOB.deaths_during_shift++ - if(ismecha(loc)) - var/obj/mecha/M = loc - if(M.occupant == src) - M.go_out() if(!QDELETED(dna)) //The gibbed param is bit redundant here since dna won't exist at this point if they got deleted. dna.species.spec_death(gibbed, src) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 71573abc90..9a3c9fff0c 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -256,48 +256,6 @@ var/armor_block = run_armor_check(affecting, "melee") apply_damage(damage, BRUTE, affecting, armor_block, wound_bonus=wound_mod) -/mob/living/carbon/human/mech_melee_attack(obj/mecha/M) - if(M.occupant.a_intent == INTENT_HARM) - if(HAS_TRAIT(M.occupant, TRAIT_PACIFISM)) - to_chat(M.occupant, "You don't want to harm other living beings!") - return - M.do_attack_animation(src) - if(M.damtype == "brute") - step_away(src,M,15) - var/obj/item/bodypart/temp = get_bodypart(pick(BODY_ZONE_CHEST, BODY_ZONE_CHEST, BODY_ZONE_CHEST, BODY_ZONE_HEAD)) - if(temp) - var/update = 0 - var/dmg = rand(M.force/2, M.force) - var/atom/throw_target = get_edge_target_turf(src, M.dir) - switch(M.damtype) - if("brute") - if(M.force > 35) // durand and other heavy mechas - DefaultCombatKnockdown(50) - src.throw_at(throw_target, rand(1,5), 7) - else if(M.force >= 20 && CHECK_MOBILITY(src, MOBILITY_STAND)) // lightweight mechas like gygax - DefaultCombatKnockdown(30) - src.throw_at(throw_target, rand(1,3), 7) - update |= temp.receive_damage(dmg, 0) - playsound(src, 'sound/weapons/punch4.ogg', 50, 1) - if("fire") - update |= temp.receive_damage(0, dmg) - playsound(src, 'sound/items/welder.ogg', 50, 1) - if("tox") - M.mech_toxin_damage(src) - else - return - if(update) - update_damage_overlays() - updatehealth() - - visible_message("[M.name] has hit [src]!", \ - "[M.name] has hit you!", null, COMBAT_MESSAGE_RANGE, target = M, - target_message = "You have hit [src]!") - log_combat(M.occupant, src, "attacked", M, "(INTENT: [uppertext(M.occupant.a_intent)]) (DAMTYPE: [uppertext(M.damtype)])") - - else - ..() - /mob/living/carbon/human/ex_act(severity, target, origin) if(TRAIT_BOMBIMMUNE in dna.species.species_traits) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 5ce80c5575..b687986a40 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -149,39 +149,6 @@ playsound(loc, 'sound/weapons/genhit.ogg', 50, 1, -1) ..() - -/mob/living/mech_melee_attack(obj/mecha/M) - if(M.occupant.a_intent == INTENT_HARM) - if(HAS_TRAIT(M.occupant, TRAIT_PACIFISM)) - to_chat(M.occupant, "You don't want to harm other living beings!") - return - M.do_attack_animation(src) - if(M.damtype == "brute") - step_away(src,M,15) - switch(M.damtype) - if(BRUTE) - Unconscious(20) - take_overall_damage(rand(M.force/2, M.force)) - playsound(src, 'sound/weapons/punch4.ogg', 50, 1) - if(BURN) - take_overall_damage(0, rand(M.force/2, M.force)) - playsound(src, 'sound/items/welder.ogg', 50, 1) - if(TOX) - M.mech_toxin_damage(src) - else - return - updatehealth() - visible_message("[M.name] has hit [src]!", \ - "[M.name] has hit you!", null, COMBAT_MESSAGE_RANGE, null, - M.occupant, "You hit [src] with your [M.name]!") - log_combat(M.occupant, src, "attacked", M, "(INTENT: [uppertext(M.occupant.a_intent)]) (DAMTYPE: [uppertext(M.damtype)])") - else - step_away(src,M) - log_combat(M.occupant, src, "pushed", M) - visible_message("[M] pushes [src] out of the way.", \ - "[M] pushes you out of the way.", null, COMBAT_MESSAGE_RANGE, null, - M.occupant, "You push [src] out of the way with your [M.name].") - /mob/living/fire_act() adjust_fire_stacks(3) IgniteMob() diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index b2b1d2fb5f..a822917aa4 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -39,7 +39,7 @@ var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list(), "Camera"=list(), "Burglar"=list()) var/viewalerts = 0 var/icon/holo_icon//Female is assigned when AI is created. - var/obj/mecha/controlled_mech //For controlled_mech a mech, to determine whether to relaymove or use the AI eye. + var/obj/vehicle/sealed/mecha/controlled_mech //For controlled_mech a mech, to determine whether to relaymove or use the AI eye. var/radio_enabled = TRUE //Determins if a carded AI can speak with its built in radio or not. radiomod = ";" //AIs will, by default, state their laws on the internal radio. var/obj/item/pda/ai/aiPDA @@ -408,7 +408,7 @@ return if (href_list["ai_take_control"]) //Mech domination - var/obj/mecha/M = locate(href_list["ai_take_control"]) + var/obj/vehicle/sealed/mecha/M = locate(href_list["ai_take_control"]) if(controlled_mech) to_chat(src, "You are already loaded into an onboard computer!") return diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index 2cbd1f35ca..f14f2edcd4 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -53,11 +53,11 @@ if(NONE) return FALSE if(POWER_REQ_ALL) - return !T || !A || ((!A.powered(EQUIP) || isspaceturf(T)) && !is_type_in_list(loc, list(/obj/item, /obj/mecha))) + return !T || !A || ((!A.powered(EQUIP) || isspaceturf(T)) && !is_type_in_list(loc, list(/obj/item, /obj/vehicle/sealed/mecha))) if(POWER_REQ_CLOCKCULT) for(var/obj/effect/clockwork/sigil/transmission/ST in range(src, SIGIL_ACCESS_RANGE)) return FALSE - return !T || !A || (!istype(T, /turf/open/floor/clockwork) && (!A.powered(EQUIP) || isspaceturf(T)) && !is_type_in_list(loc, list(/obj/item, /obj/mecha))) + return !T || !A || (!istype(T, /turf/open/floor/clockwork) && (!A.powered(EQUIP) || isspaceturf(T)) && !is_type_in_list(loc, list(/obj/item, /obj/vehicle/sealed/mecha))) /mob/living/silicon/ai/updatehealth() if(status_flags & GODMODE) diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 029adbe92f..fcb5b34d0f 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -146,7 +146,7 @@ if(!search_objects) . = hearers(vision_range, targets_from) - src //Remove self, so we don't suicide - var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/mecha, /obj/structure/destructible/clockwork/ocular_warden,/obj/item/electronic_assembly)) + var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/vehicle/sealed/mecha, /obj/structure/destructible/clockwork/ocular_warden,/obj/item/electronic_assembly)) for(var/HM in typecache_filter_list(range(vision_range, targets_from), hostile_machines)) if(can_see(targets_from, HM, vision_range)) @@ -236,9 +236,9 @@ return TRUE if(ismecha(the_target)) - var/obj/mecha/M = the_target - if(M.occupant)//Just so we don't attack empty mechs - if(CanAttack(M.occupant)) + var/obj/vehicle/sealed/mecha/M = the_target + for(var/occupant in M.occupants) + if(CanAttack(occupant)) return TRUE if(istype(the_target, /obj/machinery/porta_turret)) @@ -604,7 +604,7 @@ toggle_ai(AI_ON) /mob/living/simple_animal/hostile/proc/ListTargetsLazy(var/_Z)//Step 1, find out what we can see - var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/mecha, /obj/structure/destructible/clockwork/ocular_warden)) + var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/vehicle/sealed/mecha, /obj/structure/destructible/clockwork/ocular_warden)) . = list() for (var/I in SSmobs.clients_by_zlevel[_Z]) var/mob/M = I diff --git a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm index f2dc6abe40..e24962c8af 100644 --- a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm +++ b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm @@ -25,14 +25,14 @@ search_objects = 0 mob_biotypes = MOB_ORGANIC|MOB_HUMANOID - var/spawn_mecha_type = /obj/mecha/combat/marauder/mauler/loaded - var/obj/mecha/mecha //Ref to pilot's mecha instance + var/spawn_mecha_type = /obj/vehicle/sealed/mecha/combat/marauder/mauler/loaded + var/obj/vehicle/sealed/mecha/mecha //Ref to pilot's mecha instance var/required_mecha_charge = 7500 //If the pilot doesn't have a mecha, what charge does a potential Grand Theft Mecha need? (Defaults to half a battery) var/mecha_charge_evacuate = 50 //Amount of charge at which the pilot tries to abandon the mecha //Vars that control when the pilot uses their mecha's abilities (if the mecha has that ability) var/threat_use_mecha_smoke = 5 //5 mobs is enough to engage crowd control - var/defence_mode_chance = 35 //Chance to engage Defence mode when damaged + var/defense_mode_chance = 35 //Chance to engage Defense mode when damaged var/smoke_chance = 20 //Chance to deploy smoke for crowd control var/retreat_chance = 40 //Chance to run away @@ -42,18 +42,18 @@ /mob/living/simple_animal/hostile/syndicate/mecha_pilot/no_mech/Initialize() . = ..() - wanted_objects = typecacheof(/obj/mecha/combat, TRUE) + wanted_objects = typecacheof(/obj/vehicle/sealed/mecha/combat, TRUE) /mob/living/simple_animal/hostile/syndicate/mecha_pilot/nanotrasen //nanotrasen are syndies! no it's just a weird path. - name = "Nanotrasen Mecha Pilot" + name = "\improper Nanotrasen Mecha Pilot" desc = "Death to the Syndicate. This variant comes in MECHA DEATH flavour." icon_living = "nanotrasen" icon_state = "nanotrasen" faction = list("nanotrasen") - spawn_mecha_type = /obj/mecha/combat/marauder/loaded + spawn_mecha_type = /obj/vehicle/sealed/mecha/combat/marauder/loaded /mob/living/simple_animal/hostile/syndicate/mecha_pilot/no_mech/nanotrasen - name = "Nanotrasen Mecha Pilot" + name = "\improper Nanotrasen Mecha Pilot" desc = "Death to the Syndicate. This variant comes in MECHA DEATH flavour." icon_living = "nanotrasen" icon_state = "nanotrasen" @@ -63,12 +63,12 @@ /mob/living/simple_animal/hostile/syndicate/mecha_pilot/Initialize() . = ..() if(spawn_mecha_type) - var/obj/mecha/M = new spawn_mecha_type (get_turf(src)) + var/obj/vehicle/sealed/mecha/M = new spawn_mecha_type (get_turf(src)) if(istype(M)) - enter_mecha(M) + INVOKE_ASYNC(src, .proc/enter_mecha, M) -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/enter_mecha(obj/mecha/M) +/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/enter_mecha(obj/vehicle/sealed/mecha/M) if(!M) return 0 target = null //Target was our mecha, so null it out @@ -78,7 +78,7 @@ var/do_ranged = 0 for(var/equip in mecha.equipment) var/obj/item/mecha_parts/mecha_equipment/ME = equip - if(ME.range & RANGED) + if(ME.range & MECHA_RANGED) do_ranged = 1 break if(do_ranged) @@ -89,11 +89,11 @@ ranged = 0 wanted_objects = list() search_objects = 0 - if(mecha && mecha.lights_action) //an AI mecha is an EVIL EVIL thing, so let's not hide them in the dark - mecha.lights_action.Activate() + if(LAZYACCESSASSOC(mecha.occupant_actions, src, /datum/action/vehicle/sealed/mecha/mech_defense_mode) && !mecha.defense_mode) + var/datum/action/action = mecha.occupant_actions[src][/datum/action/vehicle/sealed/mecha/mech_defense_mode] + action.Trigger(TRUE) - -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/exit_mecha(obj/mecha/M) +/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/exit_mecha(obj/vehicle/sealed/mecha/M) if(!M) return 0 @@ -102,9 +102,9 @@ targets_from = src //Find a new mecha - wanted_objects = typecacheof(/obj/mecha/combat, TRUE) + wanted_objects = typecacheof(/obj/vehicle/sealed/mecha/combat, TRUE) var/search_aggressiveness = 2 - for(var/obj/mecha/combat/C in range(vision_range,src)) + for(var/obj/vehicle/sealed/mecha/combat/C in range(vision_range,src)) if(is_valid_mecha(C)) target = C search_aggressiveness = 3 //We can see a mech? RUN FOR IT, IGNORE MOBS! @@ -116,23 +116,23 @@ walk(M,0)//end any lingering movement loops, to prevent the haunted mecha bug //Checks if a mecha is valid for theft -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/is_valid_mecha(obj/mecha/M) +/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/is_valid_mecha(obj/vehicle/sealed/mecha/M) if(!M) - return 0 - if(M.occupant) - return 0 + return FALSE + if(LAZYLEN(M.occupants)) + return FALSE if(!M.has_charge(required_mecha_charge)) - return 0 + return FALSE if(M.obj_integrity < M.max_integrity*0.5) - return 0 - return 1 + return FALSE + return TRUE /mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/mecha_face_target(atom/A) if(mecha) var/dirto = get_dir(mecha,A) if(mecha.dir != dirto) //checking, because otherwise the mecha makes too many turn noises - mecha.mechturn(dirto) + mecha.vehicle_move(dirto, TRUE) @@ -144,7 +144,7 @@ ME.rearm() -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/get_mecha_equip_by_flag(flag = RANGED) +/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/get_mecha_equip_by_flag(flag = MECHA_RANGED) . = list() if(mecha) for(var/equip in mecha.equipment) @@ -160,11 +160,10 @@ if(mecha) mecha_reload() mecha_face_target(A) - var/list/possible_weapons = get_mecha_equip_by_flag(RANGED) + var/list/possible_weapons = get_mecha_equip_by_flag(MECHA_RANGED) if(possible_weapons.len) var/obj/item/mecha_parts/mecha_equipment/ME = pick(possible_weapons) //so we don't favor mecha.equipment[1] forever - if(ME.action(A)) - ME.start_cooldown() + if(ME.action(src,A)) return else @@ -173,20 +172,19 @@ /mob/living/simple_animal/hostile/syndicate/mecha_pilot/AttackingTarget() if(mecha) - var/list/possible_weapons = get_mecha_equip_by_flag(MELEE) + var/list/possible_weapons = get_mecha_equip_by_flag(MECHA_MELEE) if(possible_weapons.len) var/obj/item/mecha_parts/mecha_equipment/ME = pick(possible_weapons) mecha_face_target(target) - if(ME.action(target)) - ME.start_cooldown() + if(ME.action(src,target)) return - if(mecha.melee_can_hit) + if(!TIMER_COOLDOWN_CHECK(mecha, COOLDOWN_MECHA_MELEE_ATTACK)) mecha_face_target(target) - target.mech_melee_attack(mecha) + target.mech_melee_attack(mecha, src) else if(ismecha(target)) - var/obj/mecha/M = target + var/obj/vehicle/sealed/mecha/M = target if(is_valid_mecha(M)) enter_mecha(M) return @@ -199,50 +197,54 @@ /mob/living/simple_animal/hostile/syndicate/mecha_pilot/handle_automated_action() - if(..()) - if(!mecha) - for(var/obj/mecha/combat/C in range(src,vision_range)) - if(is_valid_mecha(C)) - target = C //Let's nab it! - minimum_distance = 1 - ranged = 0 - break - if(mecha) - var/list/L = PossibleThreats() - var/threat_count = L.len + . = ..() + if(!.) + return + if(!mecha) + for(var/obj/vehicle/sealed/mecha/combat/mecha_in_range in range(src,vision_range)) + if(is_valid_mecha(mecha_in_range)) + target = mecha_in_range //Let's nab it! + minimum_distance = 1 + ranged = 0 + break + if(mecha) + var/list/L = PossibleThreats() + var/threat_count = L.len - //Low Charge - Eject - if(!mecha.has_charge(mecha_charge_evacuate)) - exit_mecha(mecha) - return + //Low Charge - Eject + if(!mecha.has_charge(mecha_charge_evacuate)) + exit_mecha(mecha) + return //Too Much Damage - Eject - if(mecha.obj_integrity < mecha.max_integrity*0.1) - exit_mecha(mecha) - return + if(mecha.obj_integrity < mecha.max_integrity*0.1) + exit_mecha(mecha) + return - //Smoke if there's too many targets - Smoke Power - if(threat_count >= threat_use_mecha_smoke && prob(smoke_chance)) - if(mecha.smoke_action && mecha.smoke_action.owner && mecha.smoke) - mecha.smoke_action.Activate() + //Smoke if there's too many targets - Smoke Power + if(threat_count >= threat_use_mecha_smoke && prob(smoke_chance)) + if(LAZYACCESSASSOC(mecha.occupant_actions, src, /datum/action/vehicle/sealed/mecha/mech_smoke) && !mecha.smoke_charges) + var/datum/action/action = mecha.occupant_actions[src][/datum/action/vehicle/sealed/mecha/mech_smoke] + action.Trigger() - //Heavy damage - Defence Power or Retreat - if(mecha.obj_integrity < mecha.max_integrity*0.25) - if(prob(defence_mode_chance)) - if(mecha.defense_action && mecha.defense_action.owner && !mecha.defence_mode) - mecha.leg_overload_mode = 0 - mecha.defense_action.Activate(TRUE) - addtimer(CALLBACK(mecha.defense_action, /datum/action/innate/mecha/mech_defence_mode.proc/Activate, FALSE), 100) //10 seconds of defence, then toggle off + //Heavy damage - Defense Power or Retreat + if(mecha.obj_integrity < mecha.max_integrity*0.25) + if(prob(defense_mode_chance)) + if(LAZYACCESSASSOC(mecha.occupant_actions, src, /datum/action/vehicle/sealed/mecha/mech_defense_mode) && !mecha.defense_mode) + var/datum/action/action = mecha.occupant_actions[src][/datum/action/vehicle/sealed/mecha/mech_defense_mode] + action.Trigger(TRUE) + addtimer(CALLBACK(action, /datum/action/vehicle/sealed/mecha/mech_defense_mode.proc/Trigger, FALSE), 100) //10 seconds of defense, then toggle off - else if(prob(retreat_chance)) - //Speed boost if possible - if(mecha.overload_action && mecha.overload_action.owner && !mecha.leg_overload_mode) - mecha.overload_action.Activate(TRUE) - addtimer(CALLBACK(mecha.overload_action, /datum/action/innate/mecha/mech_defence_mode.proc/Activate, FALSE), 100) //10 seconds of speeeeed, then toggle off + else if(prob(retreat_chance)) + //Speed boost if possible + if(LAZYACCESSASSOC(mecha.occupant_actions, src, /datum/action/vehicle/sealed/mecha/mech_overload_mode) && !mecha.leg_overload_mode) + var/datum/action/action = mecha.occupant_actions[src][/datum/action/vehicle/sealed/mecha/mech_overload_mode] + mecha.leg_overload_mode = FALSE + action.Trigger(TRUE) + addtimer(CALLBACK(action, /datum/action/vehicle/sealed/mecha/mech_overload_mode.proc/Trigger, FALSE), 100) //10 seconds of speeeeed, then toggle off - retreat_distance = 50 - spawn(100) - retreat_distance = 0 + retreat_distance = 50 + addtimer(VARSET_CALLBACK(src, retreat_distance, 0), 10 SECONDS) @@ -261,17 +263,17 @@ //~simple animals~ /mob/living/simple_animal/hostile/syndicate/mecha_pilot/CanAttack(atom/the_target) if(ismecha(the_target)) - var/obj/mecha/M = the_target + var/obj/vehicle/sealed/mecha/M = the_target if(mecha) - if(M == mecha || !CanAttack(M.occupant)) - return 0 + if(M == mecha) //Dont kill yourself + return FALSE else //we're not in a mecha, so we check if we can steal it instead. if(is_valid_mecha(M)) - return 1 - else if (M.occupant && CanAttack(M.occupant)) - return 1 - else - return 0 + return TRUE + for(var/occupant in M.occupants) + if(CanAttack(occupant)) + return TRUE + return FALSE . = ..() @@ -290,6 +292,6 @@ /mob/living/simple_animal/hostile/syndicate/mecha_pilot/Goto(target, delay, minimum_distance) if(mecha) - walk_to(mecha, target, minimum_distance, mecha.step_in) + walk_to(mecha, target, minimum_distance, mecha.movedelay) else ..() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index dc13d870c5..8ac3649604 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -195,7 +195,7 @@ Difficulty: Medium if(L.client) empty += pick(((RANGE_TURFS(2, L) - RANGE_TURFS(1, L)) & turfs) - empty) // picks a turf within 2 of the creature not outside or in the shield any_attack = 1 - for(var/obj/mecha/M in T.contents) + for(var/obj/vehicle/sealed/mecha/M in T.contents) empty += pick(((RANGE_TURFS(2, M) - RANGE_TURFS(1, M)) & turfs) - empty) any_attack = 1 if(!any_attack) @@ -264,7 +264,7 @@ Difficulty: Medium to_chat(L, "You're hit by [src]'s fire breath!") // deals damage to mechs - for(var/obj/mecha/M in T.contents) + for(var/obj/vehicle/sealed/mecha/M in T.contents) if(M in hit_list) continue hit_list += M @@ -350,7 +350,7 @@ Difficulty: Medium var/throwtarget = get_edge_target_turf(src, throw_dir) L.throw_at(throwtarget, 3) visible_message("[L] is thrown clear of [src]!") - for(var/obj/mecha/M in orange(1, src)) + for(var/obj/vehicle/sealed/mecha/M in orange(1, src)) M.take_damage(75, BRUTE, "melee", 1) for(var/mob/M in range(7, src)) @@ -409,7 +409,7 @@ Difficulty: Medium to_chat(L, "You fall directly into the pool of lava!") // deals damage to mechs - for(var/obj/mecha/M in T.contents) + for(var/obj/vehicle/sealed/mecha/M in T.contents) M.take_damage(45, BRUTE, "melee", 1) // changes turf to lava temporarily @@ -538,7 +538,7 @@ Difficulty: Medium to_chat(L, "You're hit by [source]'s fire breath!") // deals damage to mechs - for(var/obj/mecha/M in T.contents) + for(var/obj/vehicle/sealed/mecha/M in T.contents) if(M in hit_list) continue hit_list += M diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index c1aea8db9d..ed9e4b9112 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -656,14 +656,16 @@ Difficulty: Normal if(monster_damage_boost && (ismegafauna(L) || istype(L, /mob/living/simple_animal/hostile/asteroid))) L.adjustBruteLoss(damage) log_combat(caster, L, "struck with a [name]") - for(var/obj/mecha/M in T.contents - hit_things) //also damage mechs. + for(var/obj/vehicle/sealed/mecha/M in T.contents - hit_things) //also damage mechs. hit_things += M - if(M.occupant) - if(friendly_fire_check && caster && caster.faction_check_mob(M.occupant)) + for(var/O in M.occupants) + var/mob/living/occupant = O + if(friendly_fire_check && caster && caster.faction_check_mob(occupant)) continue - to_chat(M.occupant, "Your [M.name] is struck by a [name]!") - playsound(M,'sound/weapons/sear.ogg', 50, 1, -4) - M.take_damage(damage, BURN, 0, 0, null, 50) + to_chat(occupant, "Your [M.name] is struck by a [name]!") + playsound(M,'sound/weapons/sear.ogg', 50, TRUE, -4) + M.take_damage(damage, BURN, 0, 0) + /obj/effect/hierophant name = "hierophant beacon" diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm index 6bd55d06ae..463402f151 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm @@ -200,7 +200,7 @@ L.Stun(75) L.adjustBruteLoss(rand(15,20)) // Less stun more harm latched = TRUE - for(var/obj/mecha/M in loc) + for(var/obj/vehicle/sealed/mecha/M in loc) M.take_damage(20, BRUTE, null, null, null, 25) if(!latched) retract() diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm index 63a796a809..92eb310595 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm @@ -9,8 +9,8 @@ else enemies -= L else if(ismecha(A)) - var/obj/mecha/M = A - if(M.occupant) + var/obj/vehicle/sealed/mecha/M = A + if(LAZYLEN(M.occupants)) return A /mob/living/simple_animal/hostile/retaliate/ListTargets() @@ -31,10 +31,10 @@ if(faction_check_mob(M) && attack_same || !faction_check_mob(M)) enemies |= M else if(ismecha(A)) - var/obj/mecha/M = A - if(M.occupant) + var/obj/vehicle/sealed/mecha/M = A + if(LAZYLEN(M.occupants)) enemies |= M - enemies |= M.occupant + enemies |= M.occupants for(var/mob/living/simple_animal/hostile/retaliate/H in around) if(faction_check_mob(H) && !attack_same && !H.attack_same) diff --git a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm index 800c7d29ca..1179a95135 100644 --- a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm @@ -99,7 +99,7 @@ if(!chosen_color) dragon_name() color_selection() - + /mob/living/simple_animal/hostile/space_dragon/Life() . = ..() @@ -158,8 +158,8 @@ adjustHealth(-L.maxHealth * 0.5) return . = ..() - if(istype(target, /obj/mecha)) - var/obj/mecha/M = target + if(istype(target, /obj/vehicle/sealed/mecha)) + var/obj/vehicle/sealed/mecha/M = target M.take_damage(50, BRUTE, MELEE, 1) /mob/living/simple_animal/hostile/space_dragon/AltClickOn(atom/A) @@ -322,7 +322,7 @@ L.adjustFireLoss(30) to_chat(L, "You're hit by [src]'s fire breath!") // deals damage to mechs - for(var/obj/mecha/M in T.contents) + for(var/obj/vehicle/sealed/mecha/M in T.contents) if(M in hit_list) continue hit_list += M diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 2a978bedb4..2df583ab47 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -394,8 +394,8 @@ if(L.stat != CONSCIOUS) return FALSE if (ismecha(the_target)) - var/obj/mecha/M = the_target - if (M.occupant) + var/obj/vehicle/sealed/mecha/M = the_target + if(LAZYLEN(M.occupants)) return FALSE return TRUE diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 4b8fa75aee..950d0fc335 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -879,7 +879,7 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0) return client.mouse_pointer_icon = initial(client.mouse_pointer_icon) if (ismecha(loc)) - var/obj/mecha/M = loc + var/obj/vehicle/sealed/mecha/M = loc if(M.mouse_pointer) client.mouse_pointer_icon = M.mouse_pointer diff --git a/code/modules/ninja/suit/ninjaDrainAct.dm b/code/modules/ninja/suit/ninjaDrainAct.dm index 4f287fc81b..48efa2452f 100644 --- a/code/modules/ninja/suit/ninjaDrainAct.dm +++ b/code/modules/ninja/suit/ninjaDrainAct.dm @@ -241,16 +241,18 @@ return drain_total -//MECH// -/obj/mecha/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/ninja_suit, mob/living/carbon/human/ninja, obj/item/clothing/gloves/space_ninja/ninja_gloves) + +/obj/vehicle/sealed/mecha/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/ninja_suit, mob/living/carbon/human/ninja, obj/item/clothing/gloves/space_ninja/ninja_gloves) if(!ninja_suit || !ninja || !ninja_gloves) + return INVALID_DRAIN var/maxcapacity = FALSE //Safety check var/drain = 0 //Drain amount var/drain_total = 0 - occupant_message("Warning: Unauthorized access through sub-route 4, block H, detected.") + for(var/mob/living/MB in occupants) + to_chat(MB, "[icon2html(src, occupants)]Warning: Unauthorized access through sub-route 4, block H, detected.") if(get_charge()) while(ninja_gloves.candrain && cell.charge > 0 && !maxcapacity) drain = rand(ninja_gloves.mindrain, ninja_gloves.maxdrain) diff --git a/code/modules/projectiles/projectile/energy/tesla.dm b/code/modules/projectiles/projectile/energy/tesla.dm index 1afbdeae25..d88e217722 100644 --- a/code/modules/projectiles/projectile/energy/tesla.dm +++ b/code/modules/projectiles/projectile/energy/tesla.dm @@ -28,3 +28,7 @@ /obj/item/projectile/energy/tesla/cannon name = "tesla orb" power = 20000 + +/obj/item/projectile/energy/tesla/sphere + name = "tesla sphere" + power = 100000 diff --git a/code/modules/projectiles/projectile/special/rocket.dm b/code/modules/projectiles/projectile/special/rocket.dm index b3737a8388..87fa7557da 100644 --- a/code/modules/projectiles/projectile/special/rocket.dm +++ b/code/modules/projectiles/projectile/special/rocket.dm @@ -23,7 +23,7 @@ explosion(target, -1, 1, 3, 1, 0, flame_range = 4) if(ismecha(target)) - var/obj/mecha/M = target + var/obj/vehicle/sealed/mecha/M = target M.take_damage(anti_armour_damage) if(issilicon(target)) var/mob/living/silicon/S = target @@ -53,7 +53,7 @@ ricochets_max = 0 //it's a MISSILE var/sturdy = list( /turf/closed, - /obj/mecha, + /obj/vehicle/sealed/mecha, /obj/machinery/door/, /obj/machinery/door/poddoor/shutters ) diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index 85b5cdac51..b9513a7a01 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -524,7 +524,7 @@ /obj/effect/CanEnterDisposals() return -/obj/mecha/CanEnterDisposals() +/obj/vehicle/sealed/mecha/CanEnterDisposals() return /obj/machinery/disposal/deliveryChute/newHolderDestination(obj/structure/disposalholder/H) diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 4efcad97ba..12a18c7f91 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -585,15 +585,6 @@ construction_time = 100 category = list("Exosuit Equipment") -/datum/design/mech_cable_layer - name = "Exosuit Engineering Equipment (Cable Layer)" - id = "mech_cable_layer" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/cable_layer - materials = list(/datum/material/iron=10000) - construction_time = 100 - category = list("Exosuit Equipment") - /datum/design/mech_generator name = "Exosuit Equipment (Plasma Generator)" id = "mech_generator" diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index bfda6c453c..c4b7c8ffee 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -261,7 +261,7 @@ GLOBAL_LIST_INIT(cargo_shuttle_leave_behind_typecache, typecacheof(list( matched_bounty = TRUE // ignore mech checks because the mech is ONLY for bounty continue - if(!AM.anchored || istype(AM, /obj/mecha)) + if(!AM.anchored || istype(AM, /obj/vehicle/sealed/mecha)) export_item_and_contents(AM, export_categories , dry_run = FALSE, external_report = ex) if(ex.exported_atoms) diff --git a/code/modules/shuttle/white_ship.dm b/code/modules/shuttle/white_ship.dm index 66146edea1..4477489aaa 100644 --- a/code/modules/shuttle/white_ship.dm +++ b/code/modules/shuttle/white_ship.dm @@ -51,6 +51,6 @@ /obj/effect/spawner/lootdrop/whiteship_cere_ripley name = "25% mech 75% wreckage ripley spawner" - loot = list(/obj/mecha/working/ripley/mining = 1, + loot = list(/obj/vehicle/sealed/mecha/working/ripley/mining = 1, /obj/structure/mecha_wreckage/ripley = 5) lootdoubles = FALSE diff --git a/code/modules/uplink/uplink_items/uplink_support.dm b/code/modules/uplink/uplink_items/uplink_support.dm index efdfe1b06a..245074b2a5 100644 --- a/code/modules/uplink/uplink_items/uplink_support.dm +++ b/code/modules/uplink/uplink_items/uplink_support.dm @@ -58,13 +58,13 @@ name = "Dark Gygax Exosuit" desc = "A lightweight exosuit, painted in a dark scheme. Its speed and equipment selection make it excellent \ for hit-and-run style attacks. Features an incendiary carbine, flash bang launcher, teleporter, ion thrusters and a Tesla energy array." - item = /obj/mecha/combat/gygax/dark/loaded + item = /obj/vehicle/sealed/mecha/combat/gygax/dark/loaded cost = 80 /datum/uplink_item/support/honker name = "Dark H.O.N.K." desc = "A clown combat mech equipped with bombanana peel and tearstache grenade launchers, as well as the ubiquitous HoNkER BlAsT 5000." - item = /obj/mecha/combat/honker/dark/loaded + item = /obj/vehicle/sealed/mecha/combat/honker/dark/loaded cost = 80 purchasable_from = UPLINK_CLOWN_OPS @@ -72,5 +72,5 @@ name = "Mauler Exosuit" desc = "A massive and incredibly deadly military-grade exosuit. Features long-range targeting, thrust vectoring \ and deployable smoke. Comes equipped with an LMG, scattershot carbine, missile rack, an antiprojectile armor booster and a Tesla energy array." - item = /obj/mecha/combat/marauder/mauler/loaded + item = /obj/vehicle/sealed/mecha/combat/marauder/mauler/loaded cost = 140 diff --git a/code/modules/vehicles/_vehicle.dm b/code/modules/vehicles/_vehicle.dm index d0144269b7..954b5940bc 100644 --- a/code/modules/vehicles/_vehicle.dm +++ b/code/modules/vehicles/_vehicle.dm @@ -7,6 +7,7 @@ armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) density = TRUE anchored = FALSE + COOLDOWN_DECLARE(cooldown_vehicle_move) var/list/mob/occupants //mob = bitflags of their control level. var/max_occupants = 1 var/max_drivers = 1 @@ -23,6 +24,7 @@ var/list/autogrant_actions_controller //assoc list "[bitflag]" = list(typepaths) var/list/mob/occupant_actions //assoc list mob = list(type = action datum assigned to mob) var/obj/vehicle/trailer + var/mouse_pointer //do we have a special mouse /obj/vehicle/Initialize(mapload) . = ..() @@ -121,9 +123,9 @@ vehicle_move(direction) /obj/vehicle/proc/vehicle_move(direction) - if(lastmove + movedelay > world.time) + if(!COOLDOWN_FINISHED(src, cooldown_vehicle_move)) return FALSE - lastmove = world.time + COOLDOWN_START(src, cooldown_vehicle_move, movedelay) if(trailer) var/dir_to_move = get_dir(trailer.loc, loc) var/did_move = step(src, direction) diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm new file mode 100644 index 0000000000..ff901f2f01 --- /dev/null +++ b/code/modules/vehicles/mecha/_mecha.dm @@ -0,0 +1,1217 @@ +/***************** WELCOME TO MECHA.DM, ENJOY YOUR STAY *****************/ + +/** + * Mechs are now (finally) vehicles, this means you can make them multicrew + * They can also grant select ability buttons based on occupant bitflags + * + * Movement is handled through vehicle_move() which is called by relaymove + * Clicking is done by way of signals registering to the entering mob + * NOTE: MMIS are NOT mobs but instead contain a brain that is, so you need special checks + * AI also has special checks becaus it gets in and out of the mech differently + * Always call remove_occupant(mob) when leaving the mech so the mob is removed properly + * + * For multi-crew, you need to set how the occupants recieve ability bitflags corresponding to their status on the vehicle(i.e: driver, gunner etc) + * Abilities can then be set to only apply for certain bitflags and are assigned as such automatically + * + * Clicks are wither translated into mech_melee_attack (see mech_melee_attack.dm) + * Or are used to call action() on equipped gear + * Cooldown for gear is on the mech because exploits + */ +/obj/vehicle/sealed/mecha + name = "mecha" + desc = "Exosuit" + icon = 'icons/mecha/mecha.dmi' + resistance_flags = FIRE_PROOF | ACID_PROOF + flags_1 = HEAR_1 + max_integrity = 300 + armor = list(MELEE = 20, BULLET = 10, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 100, ACID = 100) + movedelay = 1 SECONDS + anchored = TRUE + emulate_door_bumps = TRUE + COOLDOWN_DECLARE(mecha_bump_smash) + var/light_on = FALSE + ///What direction will the mech face when entered/powered on? Defaults to South. + var/dir_in = SOUTH + ///How much energy the mech will consume each time it moves. This variable is a backup for when leg actuators affect the energy drain. + var/normal_step_energy_drain = 10 + ///How much energy the mech will consume each time it moves. this is the current active energy consumed + var/step_energy_drain = 10 + ///How much energy we drain each time we mechpunch someone + var/melee_energy_drain = 15 + ///The minimum amount of energy charge consumed by leg overload + var/overload_step_energy_drain_min = 100 + ///chance to deflect the incoming projectiles, hits, or lesser the effect of ex_act. + var/deflect_chance = 10 + ///Modifiers for directional armor + var/list/facing_modifiers = list(MECHA_FRONT_ARMOUR = 1.5, MECHA_SIDE_ARMOUR = 1, MECHA_BACK_ARMOUR = 0.5) + ///if we cant use our equipment(such as due to EMP) + var/equipment_disabled = FALSE + /// Keeps track of the mech's cell + var/obj/item/stock_parts/cell/cell + /// Keeps track of the mech's scanning module + var/obj/item/stock_parts/scanning_module/scanmod + /// Keeps track of the mech's capacitor + var/obj/item/stock_parts/capacitor/capacitor + ///Whether the mechs maintenance protocols are on or off + var/construction_state = MECHA_LOCKED + ///Contains flags for the mecha + var/mecha_flags = ADDING_ACCESS_POSSIBLE | CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS + ///Stores the DNA enzymes of a carbon so tht only they can access the mech + var/dna_lock + ///Spark effects are handled by this datum + var/datum/effect_system/spark_spread/spark_system = new + ///How powerful our lights are + var/lights_power = 6 + ///Just stop the mech from doing anything + var/completely_disabled = FALSE + ///Whether this mech is allowed to move diagonally + var/allow_diagonal_movement = TRUE + ///Whether or not the mech destroys walls by running into it. + var/bumpsmash = FALSE + + ///////////ATMOS + ///Whether we are currrently drawing from the internal tank + var/use_internal_tank = FALSE + ///The setting of the valve on the internal tank + var/internal_tank_valve = ONE_ATMOSPHERE + ///The internal air tank obj of the mech + var/obj/machinery/portable_atmospherics/canister/internal_tank + ///Internal air mix datum + var/datum/gas_mixture/cabin_air + ///The connected air port, if we have one + var/obj/machinery/atmospherics/components/unary/portables_connector/connected_port + + ///Special version of the radio, which is unsellable + var/obj/item/radio/mech/radio + var/list/trackers = list() + + var/max_temperature = 25000 + ///health percentage below which internal damage is possible + var/internal_damage_threshold = 50 + ///Bitflags for internal damage + var/internal_damage = NONE + + ///required access level for mecha operation + var/list/operation_req_access = list() + ///required access to change internal components + var/list/internals_req_access = list(ACCESS_ENGINE, ACCESS_ROBOTICS) + + ///Typepath for the wreckage it spawns when destroyed + var/wreckage + + var/list/equipment = new + ///Current active equipment + var/obj/item/mecha_parts/mecha_equipment/selected + ///Maximum amount of equipment we can have + var/max_equip = 3 + + ///Whether our steps are silent, for example in zero-G + var/step_silent = FALSE + ///Sound played when the mech moves + var/stepsound = 'sound/mecha/mechstep.ogg' + ///Sound played when the mech walks + var/turnsound = 'sound/mecha/mechturn.ogg' + + ///Cooldown duration between melee punches + var/melee_cooldown = 10 + + ///TIme taken to leave the mech + var/exit_delay = 2 SECONDS + ///Time you get slept for if you get forcible ejected by the mech exploding + var/destruction_sleep_duration = 2 SECONDS + ///Whether outside viewers can see the pilot inside + ///In case theres a different iconstate for AI/MMI pilot(currently only used for ripley) + var/silicon_icon_state = null + ///Currently ejecting, and unable to do things + var/is_currently_ejecting = FALSE + + var/datum/effect_system/smoke_spread/smoke_system = new + + ////Action vars + ///Ref to any active thrusters we might have + var/obj/item/mecha_parts/mecha_equipment/thrusters/active_thrusters + + ///Bool for energy shield on/off + var/defense_mode = FALSE + + ///Bool for leg overload on/off + var/leg_overload_mode = FALSE + ///Energy use modifier for leg overload + var/leg_overload_coeff = 100 + + //Bool for zoom on/off + var/zoom_mode = FALSE + + ///Remaining smoke charges + var/smoke_charges = 5 + ///Cooldown between using smoke + var/smoke_cooldown = 10 SECONDS + + ///Bool for if the mech is currently phasing + var/phasing = FALSE + ///Power we use every time we phaze through something + var/phasing_energy_drain = 200 + ///icon_state for flick() when phazing + var/phase_state = "" + + ///Wether we are strafing + var/strafe = FALSE + + ///Cooldown length between bumpsmashes + var/smashcooldown = 3 + + ///Bool for whether this mech can only be used on lavaland + var/lavaland_only = FALSE + + + hud_possible = list (DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_TRACK_HUD) + +/obj/item/radio/mech //this has to go somewhere + +/obj/vehicle/sealed/mecha/Initialize() + . = ..() + add_radio() + add_cabin() + if(enclosed) + add_airtank() + RegisterSignal(src, COMSIG_MOVABLE_PRE_MOVE , .proc/disconnect_air) + RegisterSignal(src, COMSIG_MOVABLE_MOVED, .proc/play_stepsound) + spark_system.set_up(2, 0, src) + spark_system.attach(src) + smoke_system.set_up(3, src) + smoke_system.attach(src) + add_cell() + add_scanmod() + add_capacitor() + START_PROCESSING(SSobj, src) + GLOB.poi_list |= src + log_message("[src.name] created.", LOG_MECHA) + GLOB.mechas_list += src //global mech list + prepare_huds() + for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) + diag_hud.add_to_hud(src) + diag_hud_set_mechhealth() + diag_hud_set_mechcell() + diag_hud_set_mechstat() + update_icon() + +/obj/vehicle/sealed/mecha/Destroy() + if(obj_integrity > 0) //no explody if we have hp remaining! + explode_on_death = FALSE + for(var/M in occupants) + var/mob/living/occupant = M + if(isAI(occupant)) + occupant.gib() //No wreck, no AI to recover + else + occupant.forceMove(loc) + occupant.SetSleeping(destruction_sleep_duration) + if(LAZYLEN(equipment)) + for(var/E in equipment) + var/obj/item/mecha_parts/mecha_equipment/equip = E + equip.detach(loc) + qdel(equip) + if(cell) + QDEL_NULL(cell) + if(scanmod) + QDEL_NULL(scanmod) + if(capacitor) + QDEL_NULL(capacitor) + if(internal_tank) + QDEL_NULL(internal_tank) + STOP_PROCESSING(SSobj, src) + GLOB.poi_list.Remove(src) + LAZYCLEARLIST(equipment) + if(loc) + loc.assume_air(cabin_air) + air_update_turf() + else + qdel(cabin_air) + cabin_air = null + QDEL_NULL(spark_system) + QDEL_NULL(smoke_system) + + GLOB.mechas_list -= src //global mech list + return ..() + +/obj/vehicle/sealed/mecha/update_icon() + icon_state = get_mecha_occupancy_state() + return ..() + +//override this proc if you need to split up mecha control between multiple people (see savannah_ivanov.dm) +/obj/vehicle/sealed/mecha/auto_assign_occupant_flags(mob/M) + if(driver_amount() < max_drivers) + add_control_flags(M, FULL_MECHA_CONTROL) + +/obj/vehicle/sealed/mecha/proc/get_mecha_occupancy_state() + if((mecha_flags & SILICON_PILOT) && silicon_icon_state) + return silicon_icon_state + if(LAZYLEN(occupants)) + return initial(icon_state) + return "[initial(icon_state)]-open" + +/obj/vehicle/sealed/mecha/get_cell() + return cell + +/obj/vehicle/sealed/mecha/rust_heretic_act() + take_damage(500, BRUTE) + +/obj/vehicle/sealed/mecha/proc/restore_equipment() + equipment_disabled = FALSE + for(var/occupant in occupants) + var/mob/mob_occupant + SEND_SOUND(mob_occupant, sound('sound/items/timer.ogg', volume=50)) + to_chat(mob_occupant, "Equipment control unit has been rebooted successfully.") + mob_occupant.update_mouse_pointer() + +/obj/vehicle/sealed/mecha/CheckParts(list/parts_list) + ..() + cell = locate(/obj/item/stock_parts/cell) in contents + scanmod = locate(/obj/item/stock_parts/scanning_module) in contents + capacitor = locate(/obj/item/stock_parts/capacitor) in contents + update_part_values() + +/obj/vehicle/sealed/mecha/proc/update_part_values() ///Updates the values given by scanning module and capacitor tier, called when a part is removed or inserted. + if(scanmod) + normal_step_energy_drain = 20 - (5 * scanmod.rating) //10 is normal, so on lowest part its worse, on second its ok and on higher its real good up to 0 on best + step_energy_drain = normal_step_energy_drain + else + normal_step_energy_drain = 500 + step_energy_drain = normal_step_energy_drain + if(capacitor) + armor = armor.modifyRating(energy = (capacitor.rating * 5)) //Each level of capacitor protects the mech against emp by 5% + else //because we can still be hit without a cap, even if we can't move + armor = armor.setRating(energy = 0) + + +//////////////////////// +////// Helpers ///////// +//////////////////////// + +/obj/vehicle/sealed/mecha/proc/add_airtank() + internal_tank = new /obj/machinery/portable_atmospherics/canister/air(src) + return internal_tank + +///Adds a cell, for use in Map-spawned mechs, Nuke Ops mechs, and admin-spawned mechs. Mechs built by hand will replace this. +/obj/vehicle/sealed/mecha/proc/add_cell(obj/item/stock_parts/cell/C=null) + QDEL_NULL(cell) + if(C) + C.forceMove(src) + cell = C + return + cell = new /obj/item/stock_parts/cell/high/plus(src) + +///Adds a scanning module, for use in Map-spawned mechs, Nuke Ops mechs, and admin-spawned mechs. Mechs built by hand will replace this. +/obj/vehicle/sealed/mecha/proc/add_scanmod(obj/item/stock_parts/scanning_module/sm=null) + QDEL_NULL(scanmod) + if(sm) + sm.forceMove(src) + scanmod = sm + return + scanmod = new /obj/item/stock_parts/scanning_module(src) + +///Adds a capacitor, for use in Map-spawned mechs, Nuke Ops mechs, and admin-spawned mechs. Mechs built by hand will replace this. +/obj/vehicle/sealed/mecha/proc/add_capacitor(obj/item/stock_parts/capacitor/cap=null) + QDEL_NULL(capacitor) + if(cap) + cap.forceMove(src) + capacitor = cap + else + capacitor = new /obj/item/stock_parts/capacitor(src) + +/obj/vehicle/sealed/mecha/proc/add_cabin() + cabin_air = new(200) + cabin_air.set_temperature(T20C) + cabin_air.set_moles(GAS_O2,O2STANDARD*cabin_air.return_volume()/(R_IDEAL_GAS_EQUATION*cabin_air.return_temperature())) + cabin_air.set_moles(GAS_N2,N2STANDARD*cabin_air.return_volume()/(R_IDEAL_GAS_EQUATION*cabin_air.return_temperature())) + return cabin_air + +/obj/vehicle/sealed/mecha/proc/add_radio() + radio = new(src) + radio.name = "[src] radio" + radio.icon = icon + radio.icon_state = icon_state + radio.subspace_transmission = TRUE + +/obj/vehicle/sealed/mecha/proc/can_use(mob/user) + if(istype(user) && is_occupant(user)) + if(!user.incapacitated()) + return TRUE + return FALSE + +//////////////////////////////////////////////////////////////////////////////// + +/obj/vehicle/sealed/mecha/examine(mob/user) + . = ..() + var/integrity = obj_integrity*100/max_integrity + switch(integrity) + if(85 to 100) + . += "It's fully intact." + if(65 to 85) + . += "It's slightly damaged." + if(45 to 65) + . += "It's badly damaged." + if(25 to 45) + . += "It's heavily damaged." + else + . += "It's falling apart." + var/hide_weapon = locate(/obj/item/mecha_parts/concealed_weapon_bay) in contents + var/hidden_weapon = hide_weapon ? (locate(/obj/item/mecha_parts/mecha_equipment/weapon) in equipment) : null + var/list/visible_equipment = equipment - hidden_weapon + if(visible_equipment.len) + . += "It's equipped with:" + for(var/obj/item/mecha_parts/mecha_equipment/ME in visible_equipment) + . += "[icon2html(ME, user)] \A [ME]." + if(!enclosed) + if(mecha_flags & SILICON_PILOT) + . += "[src] appears to be piloting itself..." + else + for(var/occupante in occupants) + . += "You can see [occupante] inside." + if(ishuman(user)) + var/mob/living/carbon/human/H = user + for(var/O in H.held_items) + if(istype(O, /obj/item/gun)) + . += "It looks like you can hit the pilot directly if you target the center or above." + break //in case user is holding two guns + +//processing internal damage, temperature, air regulation, alert updates, lights power use. +/obj/vehicle/sealed/mecha/process() + var/internal_temp_regulation = 1 + + if(internal_damage) + if(internal_damage & MECHA_INT_FIRE) + if(!(internal_damage & MECHA_INT_TEMP_CONTROL) && prob(5)) + clearInternalDamage(MECHA_INT_FIRE) + if(internal_tank) + var/datum/gas_mixture/int_tank_air = internal_tank.return_air() + if(int_tank_air.return_pressure() > internal_tank.maximum_pressure && !(internal_damage & MECHA_INT_TANK_BREACH)) + setInternalDamage(MECHA_INT_TANK_BREACH) + if(int_tank_air && int_tank_air.return_volume() > 0) //heat the air_contents + int_tank_air.set_temperature(min(6000+T0C, int_tank_air.return_temperature()+rand(10,15))) + if(cabin_air && cabin_air.return_volume()>0) + cabin_air.set_temperature(min(6000+T0C, cabin_air.return_temperature()+rand(10,15))) + if(cabin_air.return_temperature() > max_temperature/2) + take_damage(4/round(max_temperature/cabin_air.return_temperature(),0.1), BURN, 0, 0) + + if(internal_damage & MECHA_INT_TEMP_CONTROL) + internal_temp_regulation = 0 + + if(internal_damage & MECHA_INT_TANK_BREACH) //remove some air from internal tank + if(internal_tank) + assume_air_ratio(internal_tank.return_air(), 0.1) + + if(internal_damage & MECHA_INT_SHORT_CIRCUIT) + if(get_charge()) + spark_system.start() + cell.charge -= min(20,cell.charge) + cell.maxcharge -= min(20,cell.maxcharge) + + if(internal_temp_regulation) + if(cabin_air && cabin_air.return_volume() > 0) + var/delta = cabin_air.return_temperature() - T20C + cabin_air.set_temperature(cabin_air.return_temperature() - max(-10, min(10, round(delta/4,0.1)))) + + if(internal_tank) + var/datum/gas_mixture/tank_air = internal_tank.return_air() + + var/release_pressure = internal_tank_valve + var/cabin_pressure = cabin_air.return_pressure() + var/pressure_delta = min(release_pressure - cabin_pressure, (tank_air.return_pressure() - cabin_pressure)/2) + var/transfer_moles = 0 + if(pressure_delta > 0) //cabin pressure lower than release pressure + if(tank_air.return_temperature() > 0) + transfer_moles = pressure_delta*cabin_air.return_volume()/(cabin_air.return_temperature() * R_IDEAL_GAS_EQUATION) + tank_air.transfer_to(cabin_air,transfer_moles) + else if(pressure_delta < 0) //cabin pressure higher than release pressure + var/datum/gas_mixture/t_air = return_air() + pressure_delta = cabin_pressure - release_pressure + if(t_air) + pressure_delta = min(cabin_pressure - t_air.return_pressure(), pressure_delta) + if(pressure_delta > 0) //if location pressure is lower than cabin pressure + transfer_moles = pressure_delta*cabin_air.return_volume()/(cabin_air.return_temperature() * R_IDEAL_GAS_EQUATION) + cabin_air.transfer_to(t_air, transfer_moles) + + if(occupants) + for(var/i in occupants) + var/mob/living/occupant = i + if(cell) + var/cellcharge = cell.charge/cell.maxcharge + switch(cellcharge) + if(0.75 to INFINITY) + occupant.clear_alert("charge") + if(0.5 to 0.75) + occupant.throw_alert("charge", /atom/movable/screen/alert/lowcell, 1) + if(0.25 to 0.5) + occupant.throw_alert("charge", /atom/movable/screen/alert/lowcell, 2) + if(0.01 to 0.25) + occupant.throw_alert("charge", /atom/movable/screen/alert/lowcell, 3) + else + occupant.throw_alert("charge", /atom/movable/screen/alert/emptycell) + + var/integrity = obj_integrity/max_integrity*100 + switch(integrity) + if(30 to 45) + occupant.throw_alert("mech damage", /atom/movable/screen/alert/low_mech_integrity, 1) + if(15 to 35) + occupant.throw_alert("mech damage", /atom/movable/screen/alert/low_mech_integrity, 2) + if(-INFINITY to 15) + occupant.throw_alert("mech damage", /atom/movable/screen/alert/low_mech_integrity, 3) + else + occupant.clear_alert("mech damage") + var/atom/checking = occupant.loc + // recursive check to handle all cases regarding very nested occupants, + // such as brainmob inside brainitem inside MMI inside mecha + while(!isnull(checking)) + if(isturf(checking)) + // hit a turf before hitting the mecha, seems like they have been moved out + occupant.clear_alert("charge") + occupant.clear_alert("mech damage") + occupant = null + break + else if (checking == src) + break // all good + checking = checking.loc + + if(mecha_flags & LIGHTS_ON) + var/lights_energy_drain = 2 + use_power(lights_energy_drain) + + for(var/b in occupants) + var/mob/living/occupant = b + if(!enclosed && occupant?.incapacitated()) //no sides mean it's easy to just sorta fall out if you're incapacitated. + visible_message("[occupant] tumbles out of the cockpit!") + mob_try_exit(occupant, TRUE, TRUE) //bye bye + +//Diagnostic HUD updates + diag_hud_set_mechhealth() + diag_hud_set_mechcell() + diag_hud_set_mechstat() + +/obj/vehicle/sealed/mecha/fire_act() //Check if we should ignite the pilot of an open-canopy mech + . = ..() + if(LAZYLEN(occupants) && !enclosed && !(mecha_flags & SILICON_PILOT)) + for(var/M in occupants) + var/mob/living/cookedalive = M + if(cookedalive.fire_stacks < 5) + cookedalive.fire_stacks += 1 + cookedalive.IgniteMob() + +/obj/vehicle/sealed/mecha/proc/display_speech_bubble(datum/source, list/speech_args) + SIGNAL_HANDLER + var/list/speech_bubble_recipients = get_hearers_in_view(7,src) + for(var/mob/M in speech_bubble_recipients) + if(M.client) + speech_bubble_recipients.Add(M.client) + INVOKE_ASYNC(GLOBAL_PROC, /proc/flick_overlay, image('icons/mob/talk.dmi', src, "machine[say_test(speech_args[SPEECH_MESSAGE])]",MOB_LAYER+1), speech_bubble_recipients, 30) + +//////////////////////////// +///// Action processing //// +//////////////////////////// + +/obj/vehicle/sealed/mecha/proc/on_mouseclick(mob/user, atom/target, params) + SIGNAL_HANDLER + if(!locate(/turf) in list(target,target.loc)) // Prevents inventory from being drilled + return + if(completely_disabled || is_currently_ejecting || (mecha_flags & CANNOT_INTERACT)) + return + var/list/mouse_control = params2list(params) + if(isAI(user) && !mouse_control["middle"])//AIs use MMB + return + if(phasing) + to_chat(occupants, "[icon2html(src, occupants)]Unable to interact with objects while phasing.") + return + if(user.incapacitated()) + return + if(construction_state) + to_chat(occupants, "[icon2html(src, occupants)]Maintenance protocols in effect.") + return + if(!get_charge()) + return + if(src == target) + return + var/dir_to_target = get_dir(src,target) + if(dir_to_target && !(dir_to_target & dir))//wrong direction + return + if(internal_damage & MECHA_INT_CONTROL_LOST) + target = pick(view(3,target)) + if(!target) + return + var/mob/living/L = user + if(selected) + if(!(L in return_controllers_with_flag(VEHICLE_CONTROL_EQUIPMENT))) + to_chat(user, "You can't control mech equipment from here!") + return + if(!Adjacent(target) && (selected.range & MECHA_RANGED)) + if(HAS_TRAIT(L, TRAIT_PACIFISM) && selected.harmful) + to_chat(L, "You don't want to harm other living beings!") + return + if(SEND_SIGNAL(src, COMSIG_MECHA_EQUIPMENT_CLICK, L, target) & COMPONENT_CANCEL_EQUIPMENT_CLICK) + return + INVOKE_ASYNC(selected, /obj/item/mecha_parts/mecha_equipment.proc/action, user, target, params) + return + if((selected.range & MECHA_MELEE) && Adjacent(target)) + if(isliving(target) && selected.harmful && HAS_TRAIT(L, TRAIT_PACIFISM)) + to_chat(L, "You don't want to harm other living beings!") + return + if(SEND_SIGNAL(src, COMSIG_MECHA_EQUIPMENT_CLICK, L, target) & COMPONENT_CANCEL_EQUIPMENT_CLICK) + return + INVOKE_ASYNC(selected, /obj/item/mecha_parts/mecha_equipment.proc/action, user, target, params) + return + if(!(L in return_controllers_with_flag(VEHICLE_CONTROL_MELEE))) + to_chat(L, "You're in the wrong seat to interact with your hands.") + return + var/on_cooldown = TIMER_COOLDOWN_CHECK(src, COOLDOWN_MECHA_MELEE_ATTACK) + var/adjacent = Adjacent(target) + if(SEND_SIGNAL(src, COMSIG_MECHA_MELEE_CLICK, L, target, on_cooldown, adjacent) & COMPONENT_CANCEL_MELEE_CLICK) + return + if(on_cooldown || !adjacent) + return + if(internal_damage & MECHA_INT_CONTROL_LOST) + var/list/possible_targets = oview(1,src) + if(!length(possible_targets)) + return + target = pick(possible_targets) + target.mech_melee_attack(src, user) + TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MELEE_ATTACK, melee_cooldown) + + +////////////////////////////////// +//////// Movement procs //////// +////////////////////////////////// + +///Plays the mech step sound effect. Split from movement procs so that other mechs (HONK) can override this one specific part. +/obj/vehicle/sealed/mecha/proc/play_stepsound() + SIGNAL_HANDLER + if(stepsound) + playsound(src,stepsound,40,1) + +/obj/vehicle/sealed/mecha/proc/disconnect_air() + SIGNAL_HANDLER + if(internal_tank.disconnect()) // Something moved us and broke connection + to_chat(occupants, "[icon2html(src, occupants)]Air port connection has been severed!") + log_message("Lost connection to gas port.", LOG_MECHA) + +/obj/vehicle/sealed/mecha/Process_Spacemove(movement_dir = 0) + . = ..() + if(.) + return TRUE + + var/atom/movable/backup = get_spacemove_backup() + if(backup) + if(istype(backup) && movement_dir && !backup.anchored) + if(backup.newtonian_move(turn(movement_dir, 180))) + step_silent = TRUE + if(return_drivers()) + to_chat(occupants, "[icon2html(src, occupants)]The [src] push off [backup] to propel yourself.") + return TRUE + + if(movedelay <= world.time && active_thrusters && movement_dir && active_thrusters.thrust(movement_dir)) + step_silent = TRUE + return TRUE + + return FALSE + +/obj/vehicle/sealed/mecha/relaymove(mob/living/user, direction) + . = TRUE + if(!canmove || !(user in return_drivers())) + return + vehicle_move(direction) + + + +/obj/vehicle/sealed/mecha/vehicle_move(direction, forcerotate = FALSE) + if(!COOLDOWN_FINISHED(src, cooldown_vehicle_move)) + return FALSE + COOLDOWN_START(src, cooldown_vehicle_move, movedelay) + if(completely_disabled) + return FALSE + if(!direction) + return FALSE + if(internal_tank?.connected_port) + if(TIMER_COOLDOWN_CHECK(src, COOLDOWN_MECHA_MESSAGE)) + to_chat(occupants, "[icon2html(src, occupants)]Unable to move while connected to the air system port!") + TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MESSAGE, 2 SECONDS) + return FALSE + if(construction_state) + if(TIMER_COOLDOWN_CHECK(src, COOLDOWN_MECHA_MESSAGE)) + to_chat(occupants, "[icon2html(src, occupants)]Maintenance protocols in effect.") + TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MESSAGE, 2 SECONDS) + return FALSE + + if(!Process_Spacemove(direction)) + return FALSE + if(!has_charge(step_energy_drain)) + return FALSE + if(zoom_mode) + to_chat(occupants, "[icon2html(src, occupants)]Unable to move while in zoom mode!") + return FALSE + if(!cell) + to_chat(occupants, "[icon2html(src, occupants)]Missing power cell.") + return FALSE + if(!scanmod || !capacitor) + to_chat(occupants, "[icon2html(src, occupants)]Missing [scanmod? "capacitor" : "scanning module"].") + return FALSE + if(lavaland_only && is_mining_level(z)) + to_chat(occupants, "[icon2html(src, occupants)]Invalid Environment.") + return FALSE + + var/olddir = dir + + if(internal_damage & MECHA_INT_CONTROL_LOST) + direction = pick(GLOB.alldirs) + + //only mechs with diagonal movement may move diagonally + if(!allow_diagonal_movement && ISDIAGONALDIR(direction)) + return TRUE + + //if we're not facing the way we're going rotate us + var/no_strafe = FALSE + if(dir != direction || forcerotate) + if(strafe) + for(var/D in return_drivers()) + var/mob/driver = D + if(driver.client?.keys_held["Alt"]) + no_strafe = TRUE + setDir(direction) + if(turnsound) + playsound(src,turnsound,40,TRUE) + return TRUE + else + setDir(direction) + if(turnsound) + playsound(src,turnsound,40,TRUE) + return TRUE + + set_glide_size(DELAY_TO_GLIDE_SIZE(movedelay)) + //Otherwise just walk normally + . = step(src,direction, dir) + + if(strafe && !no_strafe) + setDir(olddir) + + +/obj/vehicle/sealed/mecha/Bump(atom/obstacle) + if(phasing && get_charge() >= phasing_energy_drain && !throwing) + if(phase_state) + flick(phase_state, src) + forceMove(get_step(src,dir))//This is jank I hate it thanks, this should be done thrugh move not this dumb shit + use_power(phasing_energy_drain) + addtimer(VARSET_CALLBACK(src, movedelay, TRUE), movedelay*3) + return + . = ..() + if(.) //mech was thrown/door/whatever + return + if(bumpsmash) //Need a pilot to push the PUNCH button. + if(COOLDOWN_FINISHED(src, mecha_bump_smash)) + obstacle.mech_melee_attack(src) + COOLDOWN_START(src, mecha_bump_smash, smashcooldown) + if(!obstacle || obstacle.CanPass(src,get_step(src,dir))) + step(src,dir) + if(isobj(obstacle)) + var/obj/obj_obstacle = obstacle + if(!obj_obstacle.anchored && obj_obstacle.move_resist <= move_force) + step(obstacle, dir) + else if(ismob(obstacle)) + var/mob/mob_obstacle = obstacle + if(mob_obstacle.move_resist <= move_force) + step(obstacle, dir) + + + + + +/////////////////////////////////// +//////// Internal damage //////// +/////////////////////////////////// + +/obj/vehicle/sealed/mecha/proc/check_for_internal_damage(list/possible_int_damage,ignore_threshold=null) + if(!islist(possible_int_damage) || !length(possible_int_damage)) + return + if(prob(20)) + if(ignore_threshold || obj_integrity*100/max_integrity < internal_damage_threshold) + for(var/T in possible_int_damage) + if(internal_damage & T) + possible_int_damage -= T + if (length(possible_int_damage)) + var/int_dam_flag = pick(possible_int_damage) + if(int_dam_flag) + setInternalDamage(int_dam_flag) + if(prob(5)) + if(ignore_threshold || obj_integrity*100/max_integrity < internal_damage_threshold) + if(LAZYLEN(equipment)) + var/obj/item/mecha_parts/mecha_equipment/ME = pick(equipment) + qdel(ME) + +/obj/vehicle/sealed/mecha/proc/setInternalDamage(int_dam_flag) + internal_damage |= int_dam_flag + log_message("Internal damage of type [int_dam_flag].", LOG_MECHA) + SEND_SOUND(occupants, sound('sound/machines/warning-buzzer.ogg',wait=0)) + diag_hud_set_mechstat() + +/obj/vehicle/sealed/mecha/proc/clearInternalDamage(int_dam_flag) + if(internal_damage & int_dam_flag) + switch(int_dam_flag) + if(MECHA_INT_TEMP_CONTROL) + to_chat(occupants, "[icon2html(src, occupants)]Life support system reactivated.") + if(MECHA_INT_FIRE) + to_chat(occupants, "[icon2html(src, occupants)]Internal fire extinguished.") + if(MECHA_INT_TANK_BREACH) + to_chat(occupants, "[icon2html(src, occupants)]Damaged internal tank has been sealed.") + internal_damage &= ~int_dam_flag + diag_hud_set_mechstat() + +///////////////////////////////////// +//////////// AI piloting //////////// +///////////////////////////////////// + +/obj/vehicle/sealed/mecha/attack_ai(mob/living/silicon/ai/user) + if(!isAI(user)) + return + //Allows the Malf to scan a mech's status and loadout, helping it to decide if it is a worthy chariot. + if(user.can_dominate_mechs) + examine(user) //Get diagnostic information! + for(var/obj/item/mecha_parts/mecha_tracking/B in trackers) + to_chat(user, "Warning: Tracking Beacon detected. Enter at your own risk. Beacon Data:") + to_chat(user, "[B.get_mecha_info()]") + break + //Nothing like a big, red link to make the player feel powerful! + to_chat(user, "ASSUME DIRECT CONTROL?
") + else + examine(user) + if(length(return_drivers()) > 0) + to_chat(user, "This exosuit has a pilot and cannot be controlled.") + return + var/can_control_mech = 0 + for(var/obj/item/mecha_parts/mecha_tracking/ai_control/A in trackers) + can_control_mech = 1 + to_chat(user, "[icon2html(src, user)] Status of [name]:\n[A.get_mecha_info()]") + break + if(!can_control_mech) + to_chat(user, "You cannot control exosuits without AI control beacons installed.") + return + to_chat(user, "Take control of exosuit?
") + +/obj/vehicle/sealed/mecha/transfer_ai(interaction, mob/user, mob/living/silicon/ai/AI, obj/item/aicard/card) + if(!..()) + return + + //Transfer from core or card to mech. Proc is called by mech. + switch(interaction) + if(AI_TRANS_TO_CARD) //Upload AI from mech to AI card. + if(!construction_state) //Mech must be in maint mode to allow carding. + to_chat(user, "[name] must have maintenance protocols active in order to allow a transfer.") + return + if(!locate(AI) in occupants) //Mech does not have an AI for a pilot + to_chat(user, "No AI detected in the [name] onboard computer.") + return + for(var/mob/living/silicon/ai in occupants) + AI.ai_restore_power()//So the AI initially has power. + AI.control_disabled = TRUE + AI.radio_enabled = FALSE + AI.disconnect_shell() + remove_occupant(AI) + mecha_flags &= ~SILICON_PILOT + AI.forceMove(card) + card.AI = AI + AI.controlled_mech = null + AI.remote_control = null + to_chat(AI, "You have been downloaded to a mobile storage device. Wireless connection offline.") + to_chat(user, "Transfer successful: [AI.name] ([rand(1000,9999)].exe) removed from [name] and stored within local memory.") + + if(AI_MECH_HACK) //Called by AIs on the mech + AI.linked_core = new /obj/structure/AIcore/deactivated(AI.loc) + if(AI.can_dominate_mechs) + if(LAZYLEN(occupants)) //Oh, I am sorry, were you using that? + to_chat(AI, "Occupants detected! Forced ejection initiated!") + to_chat(occupants, "You have been forcibly ejected!") + ejectall() //IT IS MINE, NOW. SUCK IT, RD! + ai_enter_mech(AI, interaction) + + if(AI_TRANS_FROM_CARD) //Using an AI card to upload to a mech. + AI = card.AI + if(!AI) + to_chat(user, "There is no AI currently installed on this device.") + return + if(AI.deployed_shell) //Recall AI if shelled so it can be checked for a client + AI.disconnect_shell() + if(AI.stat || !AI.client) + to_chat(user, "[AI.name] is currently unresponsive, and cannot be uploaded.") + return + if((LAZYLEN(occupants) >= max_occupants) || dna_lock) //Normal AIs cannot steal mechs! + to_chat(user, "Access denied. [name] is [LAZYLEN(occupants) >= max_occupants ? "currently fully occupied" : "secured with a DNA lock"].") + return + AI.control_disabled = FALSE + AI.radio_enabled = TRUE + to_chat(user, "Transfer successful: [AI.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed.") + card.AI = null + ai_enter_mech(AI, interaction) + +//Hack and From Card interactions share some code, so leave that here for both to use. +/obj/vehicle/sealed/mecha/proc/ai_enter_mech(mob/living/silicon/ai/AI, interaction) + AI.ai_restore_power() + mecha_flags |= SILICON_PILOT + moved_inside(AI) + AI.cancel_camera() + AI.controlled_mech = src + AI.remote_control = src + AI.mobility_flags = ALL //Much easier than adding AI checks! Be sure to set this back to 0 if you decide to allow an AI to leave a mech somehow. + if(interaction == AI_MECH_HACK) + AI.can_shunt = FALSE //ONE AI ENTERS. NO AI LEAVES. + to_chat(AI, AI.can_dominate_mechs ? "Takeover of [name] complete! You are now loaded onto the onboard computer. Do not attempt to leave the station sector!" :\ + "You have been uploaded to a mech's onboard computer.") + to_chat(AI, "Use Middle-Mouse to activate mech functions and equipment. Click normally for AI interactions.") + + +///Handles an actual AI (simple_animal mecha pilot) entering the mech +/obj/vehicle/sealed/mecha/proc/aimob_enter_mech(mob/living/simple_animal/hostile/syndicate/mecha_pilot/pilot_mob) + if(pilot_mob && pilot_mob.Adjacent(src)) + if(LAZYLEN(occupants)) + return + LAZYADD(occupants, src) + pilot_mob.mecha = src + pilot_mob.forceMove(src) + update_icon() + +///Handles an actual AI (simple_animal mecha pilot) exiting the mech +/obj/vehicle/sealed/mecha/proc/aimob_exit_mech(mob/living/simple_animal/hostile/syndicate/mecha_pilot/pilot_mob) + LAZYREMOVE(occupants, pilot_mob) + if(pilot_mob.mecha == src) + pilot_mob.mecha = null + pilot_mob.forceMove(get_turf(src)) + update_icon() + + +///////////////////////////////////// +//////// Atmospheric stuff //////// +///////////////////////////////////// + +/obj/vehicle/sealed/mecha/remove_air(amount) + if(use_internal_tank) + return cabin_air.remove(amount) + return ..() + +/obj/vehicle/sealed/mecha/remove_air_ratio(ratio) + if(use_internal_tank) + return cabin_air.remove_ratio(ratio) + return ..() + + +/obj/vehicle/sealed/mecha/return_air() + if(use_internal_tank) + return cabin_air + return ..() + + +/obj/vehicle/sealed/mecha/proc/return_pressure() + var/datum/gas_mixture/t_air = return_air() + if(t_air) + . = t_air.return_pressure() + return + +/obj/vehicle/sealed/mecha/return_temperature() + var/datum/gas_mixture/t_air = return_air() + if(t_air) + . = t_air.return_temperature() + return + +/obj/vehicle/sealed/mecha/mob_try_enter(mob/M) + if(!ishuman(M)) // no silicons or drones in mechas. + return + log_message("[M] tries to move into [src].", LOG_MECHA) + if(dna_lock && M.has_dna()) + var/mob/living/carbon/entering_carbon = M + if(entering_carbon.dna.unique_enzymes != dna_lock) + to_chat(M, "Access denied. [name] is secured with a DNA lock.") + log_message("Permission denied (DNA LOCK).", LOG_MECHA) + return + if(!operation_allowed(M)) + to_chat(M, "Access denied. Insufficient operation keycodes.") + log_message("Permission denied (No keycode).", LOG_MECHA) + return + if(M.buckled) + to_chat(M, "You are currently buckled and cannot move.") + log_message("Permission denied (Buckled).", LOG_MECHA) + return + if(M.has_buckled_mobs()) //mob attached to us + to_chat(M, "You can't enter the exosuit with other creatures attached to you!") + log_message("Permission denied (Attached mobs).", LOG_MECHA) + return + + visible_message("[M] starts to climb into [name].") + + if(do_after(M, enter_delay, target = src)) + if(obj_integrity <= 0) + to_chat(M, "You cannot get in the [name], it has been destroyed!") + else if(LAZYLEN(occupants) >= max_occupants) + to_chat(M, "[occupants[occupants.len]] was faster! Try better next time, loser.")//get the last one that hopped in + else if(M.buckled) + to_chat(M, "You can't enter the exosuit while buckled.") + else if(M.has_buckled_mobs()) + to_chat(M, "You can't enter the exosuit with other creatures attached to you!") + else + moved_inside(M) + return ..() + else + to_chat(M, "You stop entering the exosuit!") + + +/obj/vehicle/sealed/mecha/generate_actions() + initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_internals, VEHICLE_CONTROL_SETTINGS) + initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_cycle_equip, VEHICLE_CONTROL_EQUIPMENT) + initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_lights, VEHICLE_CONTROL_SETTINGS) + initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_view_stats, VEHICLE_CONTROL_SETTINGS) + initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/strafe, VEHICLE_CONTROL_DRIVE) + +/obj/vehicle/sealed/mecha/proc/moved_inside(mob/living/H) + . = FALSE + if(!(H?.client)) + return + if(ishuman(H) && !Adjacent(H)) + return + add_occupant(H) + H.forceMove(src) + H.update_mouse_pointer() + add_fingerprint(H) + log_message("[H] moved in as pilot.", LOG_MECHA) + setDir(dir_in) + playsound(src, 'sound/machines/windowdoor.ogg', 50, TRUE) + if(!internal_damage) + SEND_SOUND(H, sound('sound/mecha/nominal.ogg',volume=50)) + return TRUE + +/obj/vehicle/sealed/mecha/proc/mmi_move_inside(obj/item/mmi/M, mob/user) + if(!M.brainmob || !M.brainmob.client) + to_chat(user, "Consciousness matrix not detected!") + return FALSE + else if(M.brainmob.stat) + to_chat(user, "Beta-rhythm below acceptable level!") + return FALSE + var/mob/living/brain/B = M.brainmob + if(LAZYLEN(occupants) >= max_occupants) + to_chat(user, "It's full!") + return FALSE + if(dna_lock && (!B.stored_dna || (dna_lock != B.stored_dna.unique_enzymes))) + to_chat(user, "Access denied. [name] is secured with a DNA lock.") + return FALSE + + visible_message("[user] starts to insert an MMI into [name].") + + if(do_after(user, 40, target = src)) + if(LAZYLEN(occupants) < max_occupants) + return mmi_moved_inside(M, user) + else + to_chat(user, "Maximum occupants detected!") + else + to_chat(user, "You stop inserting the MMI.") + return FALSE + +/obj/vehicle/sealed/mecha/proc/mmi_moved_inside(obj/item/mmi/M, mob/user) + if(!(Adjacent(M) && Adjacent(user))) + return FALSE + if(!M.brainmob || !M.brainmob.client) + to_chat(user, "Consciousness matrix not detected!") + return FALSE + else if(M.brainmob.stat) + to_chat(user, "Beta-rhythm below acceptable level!") + + var/mob/living/brain/B = M.brainmob + if(!user.transferItemToLoc(M, src)) + to_chat(user, "\the [M] is stuck to your hand, you cannot put it in \the [src]!") + return FALSE + + M.mecha = src + add_occupant(B)//Note this forcemoves the brain into the mech to allow relaymove + mecha_flags |= SILICON_PILOT + B.reset_perspective(src) + B.remote_control = src + B.update_mobility() + B.update_mouse_pointer() + update_icon() + setDir(dir_in) + log_message("[M] moved in as pilot.", LOG_MECHA) + if(!internal_damage) + SEND_SOUND(M, sound('sound/mecha/nominal.ogg',volume=50)) + log_game("[key_name(user)] has put the MMI/posibrain of [key_name(B)] into [src] at [AREACOORD(src)]") + return TRUE + +/obj/vehicle/sealed/mecha/container_resist(mob/living/user) + if(isAI(user)) + var/mob/living/silicon/ai/AI = user + if(!AI.can_shunt) + to_chat(AI, "You can't leave a mech after dominating it!.") + return FALSE + to_chat(user, "You begin the ejection procedure. Equipment is disabled during this process. Hold still to finish ejecting.") + is_currently_ejecting = TRUE + if(do_after(user, exit_delay , target = src)) + to_chat(user, "You exit the mech.") + mob_try_exit(user, silent = FALSE) + else + to_chat(user, "You stop exiting the mech. Weapons are enabled again.") + is_currently_ejecting = FALSE + +/obj/vehicle/sealed/mecha/proc/ejectall() + for(var/ejectee in occupants) + mob_try_exit(ejectee, TRUE, TRUE) + +/obj/vehicle/sealed/mecha/mob_try_exit(mob/M, silent, randomstep) + mob_exit(M, silent, randomstep) + +/obj/vehicle/sealed/mecha/mob_exit(mob/M, silent, forced) + var/newloc = get_turf(src) + var/atom/movable/mob_container + if(ishuman(M)) + remove_occupant(M) + ..() + return + else if(isbrain(M)) + var/mob/living/brain/brain = M + mob_container = brain.container + else if(isAI(M)) + var/mob/living/silicon/ai/AI = M + if(forced)//This should only happen if there are multiple AIs in a round, and at least one is Malf. + AI.gib() //If one Malf decides to steal a mech from another AI (even other Malfs!), they are destroyed, as they have nowhere to go when replaced. + AI = null + mecha_flags &= ~SILICON_PILOT + return + else + if(!AI.linked_core) + to_chat(AI, "Inactive core destroyed. Unable to return.") + AI.linked_core = null + return + to_chat(AI, "Returning to core...") + AI.controlled_mech = null + AI.remote_control = null + mob_container = AI + newloc = get_turf(AI.linked_core) + qdel(AI.linked_core) + else + return ..() + var/mob/living/L = M + mecha_flags &= ~SILICON_PILOT + if(mob_container.forceMove(newloc)) + log_message("[mob_container] moved out.", LOG_MECHA) + L << browse(null, "window=exosuit") + if(istype(mob_container, /obj/item/mmi)) + var/obj/item/mmi/mmi = mob_container + if(mmi.brainmob) + L.forceMove(mmi) + L.reset_perspective() + remove_occupant(L) + mmi.mecha = null + mmi.update_icon() + L.mobility_flags = NONE + update_icon() + setDir(dir_in) + return ..() + + +/obj/vehicle/sealed/mecha/add_occupant(mob/M, control_flags) + RegisterSignal(M, COMSIG_MOB_DEATH, .proc/mob_exit) + RegisterSignal(M, COMSIG_MOB_CLICKON, .proc/on_mouseclick) + RegisterSignal(M, COMSIG_MOB_SAY, .proc/display_speech_bubble) + update_icon() + return ..() + +/obj/vehicle/sealed/mecha/remove_occupant(mob/M) + UnregisterSignal(M, COMSIG_MOB_DEATH) + UnregisterSignal(M, COMSIG_MOB_CLICKON) + UnregisterSignal(M, COMSIG_MOB_SAY) + update_icon() + M.clear_alert("charge") + M.clear_alert("mech damage") + if(M.client) + M.update_mouse_pointer() + M.client.view_size.resetToDefault() + zoom_mode = 0 + return ..() + +///////////////////////// +////// Access stuff ///// +///////////////////////// + +/obj/vehicle/sealed/mecha/proc/operation_allowed(mob/M) + req_access = operation_req_access + req_one_access = list() + return allowed(M) + +/obj/vehicle/sealed/mecha/proc/internals_access_allowed(mob/M) + req_one_access = internals_req_access + req_access = list() + return allowed(M) + + +/////////////////////// +///// Power stuff ///// +/////////////////////// + +/obj/vehicle/sealed/mecha/proc/has_charge(amount) + return (get_charge()>=amount) + +/obj/vehicle/sealed/mecha/proc/get_charge() + for(var/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/R in equipment) + var/relay_charge = R.get_charge() + if(relay_charge) + return relay_charge + if(cell) + return max(0, cell.charge) + +/obj/vehicle/sealed/mecha/proc/use_power(amount) + if(get_charge() && cell.use(amount)) + return TRUE + return FALSE + +/obj/vehicle/sealed/mecha/proc/give_power(amount) + if(!isnull(get_charge())) + cell.give(amount) + return TRUE + return FALSE + +/////////////////////// +////// Ammo stuff ///// +/////////////////////// + +/obj/vehicle/sealed/mecha/proc/ammo_resupply(obj/item/mecha_ammo/A, mob/user,fail_chat_override = FALSE) + if(!A.rounds) + if(!fail_chat_override) + to_chat(user, "This box of ammo is empty!") + return FALSE + var/ammo_needed + var/found_gun + for(var/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/gun in equipment) + ammo_needed = 0 + + if(istype(gun, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic) && gun.ammo_type == A.ammo_type) + found_gun = TRUE + if(A.direct_load) + ammo_needed = initial(gun.projectiles) - gun.projectiles + else + ammo_needed = gun.projectiles_cache_max - gun.projectiles_cache + + if(ammo_needed) + if(ammo_needed < A.rounds) + if(A.direct_load) + gun.projectiles = gun.projectiles + ammo_needed + else + gun.projectiles_cache = gun.projectiles_cache + ammo_needed + playsound(get_turf(user),A.load_audio,50,TRUE) + to_chat(user, "You add [ammo_needed] [A.round_term][ammo_needed > 1?"s":""] to the [gun.name]") + A.rounds = A.rounds - ammo_needed + A.update_name() + return TRUE + + else + if(A.direct_load) + gun.projectiles = gun.projectiles + A.rounds + else + gun.projectiles_cache = gun.projectiles_cache + A.rounds + playsound(get_turf(user),A.load_audio,50,TRUE) + to_chat(user, "You add [A.rounds] [A.round_term][A.rounds > 1?"s":""] to the [gun.name]") + A.rounds = 0 + A.update_name() + return TRUE + if(!fail_chat_override) + if(found_gun) + to_chat(user, "You can't fit any more ammo of this type!") + else + to_chat(user, "None of the equipment on this exosuit can use this ammo!") + return FALSE diff --git a/code/modules/vehicles/mecha/combat/combat.dm b/code/modules/vehicles/mecha/combat/combat.dm new file mode 100644 index 0000000000..ccfd92ecbc --- /dev/null +++ b/code/modules/vehicles/mecha/combat/combat.dm @@ -0,0 +1,23 @@ +/obj/vehicle/sealed/mecha/combat + force = 30 + internals_req_access = list(ACCESS_ROBOTICS, ACCESS_SECURITY) + internal_damage_threshold = 50 + armor = list(MELEE = 30, BULLET = 30, LASER = 15, ENERGY = 20, BOMB = 20, BIO = 0, RAD = 0, FIRE = 100, ACID = 100) + mouse_pointer = 'icons/mecha/mecha_mouse.dmi' + destruction_sleep_duration = 40 + exit_delay = 40 + +/obj/vehicle/sealed/mecha/combat/restore_equipment() + mouse_pointer = 'icons/mecha/mecha_mouse.dmi' + . = ..() + +/obj/vehicle/sealed/mecha/combat/moved_inside(mob/living/carbon/human/H) + ..() + update_icon() + + +/obj/vehicle/sealed/mecha/combat/proc/max_ammo() //Max the ammo stored for Nuke Ops mechs, or anyone else that calls this + for(var/obj/item/I in equipment) + if(istype(I, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/)) + var/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/gun = I + gun.projectiles_cache = gun.projectiles_cache_max diff --git a/code/modules/vehicles/mecha/combat/durand.dm b/code/modules/vehicles/mecha/combat/durand.dm new file mode 100644 index 0000000000..70edd9df89 --- /dev/null +++ b/code/modules/vehicles/mecha/combat/durand.dm @@ -0,0 +1,241 @@ +/obj/vehicle/sealed/mecha/combat/durand + desc = "An aging combat exosuit utilized by the Nanotrasen corporation. Originally developed to combat hostile alien lifeforms." + name = "\improper Durand" + icon_state = "durand" + movedelay = 4 + dir_in = 1 //Facing North. + max_integrity = 400 + deflect_chance = 20 + armor = list(MELEE = 40, BULLET = 35, LASER = 15, ENERGY = 10, BOMB = 20, BIO = 0, RAD = 50, FIRE = 100, ACID = 100) + max_temperature = 30000 + force = 40 + wreckage = /obj/structure/mecha_wreckage/durand + var/obj/durand_shield/shield + + +/obj/vehicle/sealed/mecha/combat/durand/Initialize() + . = ..() + shield = new /obj/durand_shield(loc, src, layer, dir) + RegisterSignal(src, COMSIG_MECHA_ACTION_TRIGGER, .proc/relay) + RegisterSignal(src, COMSIG_PROJECTILE_PREHIT, .proc/prehit) + + +/obj/vehicle/sealed/mecha/combat/durand/Destroy() + if(shield) + QDEL_NULL(shield) + return ..() + + +/obj/vehicle/sealed/mecha/combat/durand/generate_actions() + . = ..() + initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_defense_mode) + +/obj/vehicle/sealed/mecha/combat/durand/process() + . = ..() + if(defense_mode && !use_power(100)) //Defence mode can only be on with a occupant so we check if one of them can toggle it and toggle + for(var/O in occupants) + var/mob/living/occupant = O + var/datum/action/action = LAZYACCESSASSOC(occupant_actions, occupant, /datum/action/vehicle/sealed/mecha/mech_defense_mode) + if(action) + INVOKE_ASYNC(action, /datum/action.proc/Trigger) + break + +/obj/vehicle/sealed/mecha/combat/durand/Move(direction) + . = ..() + if(shield) + shield.forceMove(loc) + shield.setDir(dir) + +/obj/vehicle/sealed/mecha/combat/durand/forceMove(turf/T) + . = ..() + shield.forceMove(T) + +/obj/vehicle/sealed/mecha/combat/durand/mob_exit(mob/M, silent, randomstep, forced) + if(defense_mode) + var/datum/action/action = LAZYACCESSASSOC(occupant_actions, M, /datum/action/vehicle/sealed/mecha/mech_defense_mode) + if(action) + INVOKE_ASYNC(action, /datum/action.proc/Trigger, FALSE) + return ..() + +///Relays the signal from the action button to the shield, and creates a new shield if the old one is MIA. +/obj/vehicle/sealed/mecha/combat/durand/proc/relay(datum/source, mob/owner, list/signal_args) + SIGNAL_HANDLER + if(!shield) //if the shield somehow got deleted + stack_trace("Durand triggered relay without a shield") + shield = new /obj/durand_shield(loc, src, layer) + shield.setDir(dir) + SEND_SIGNAL(shield, COMSIG_MECHA_ACTION_TRIGGER, owner, signal_args) + +//Redirects projectiles to the shield if defense_check decides they should be blocked and returns true. +/obj/vehicle/sealed/mecha/combat/durand/proc/prehit(obj/item/projectile/source, list/signal_args) + if(defense_check(source.loc) && shield) + signal_args[2] = shield + + +/**Checks if defense mode is enabled, and if the attacker is standing in an area covered by the shield. +Expects a turf. Returns true if the attack should be blocked, false if not.*/ +/obj/vehicle/sealed/mecha/combat/durand/proc/defense_check(turf/aloc) + if (!defense_mode || !shield || shield.switching) + return FALSE + . = FALSE + switch(dir) + if (1) + if(abs(x - aloc.x) <= (y - aloc.y) * -2) + . = TRUE + if (2) + if(abs(x - aloc.x) <= (y - aloc.y) * 2) + . = TRUE + if (4) + if(abs(y - aloc.y) <= (x - aloc.x) * -2) + . = TRUE + if (8) + if(abs(y - aloc.y) <= (x - aloc.x) * 2) + . = TRUE + return + +/obj/vehicle/sealed/mecha/combat/durand/attack_generic(mob/user, damage_amount = 0, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, armor_penetration = 0) + if(defense_check(user.loc)) + log_message("Attack absorbed by defense field. Attacker - [user].", LOG_MECHA, color="orange") + shield.attack_generic(user, damage_amount, damage_type, damage_flag, sound_effect, armor_penetration) + else + . = ..() + +/obj/vehicle/sealed/mecha/combat/durand/blob_act(obj/structure/blob/B) + if(defense_check(B.loc)) + log_message("Attack by blob. Attacker - [B].", LOG_MECHA, color="red") + log_message("Attack absorbed by defense field.", LOG_MECHA, color="orange") + shield.blob_act(B) + else + . = ..() + +/obj/vehicle/sealed/mecha/combat/durand/attackby(obj/item/W as obj, mob/user as mob, params) + if(defense_check(user.loc)) + log_message("Attack absorbed by defense field. Attacker - [user], with [W]", LOG_MECHA, color="orange") + shield.attackby(W, user, params) + else + . = ..() + +/obj/vehicle/sealed/mecha/combat/durand/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) + if(defense_check(AM.loc)) + log_message("Impact with [AM] absorbed by defense field.", LOG_MECHA, color="orange") + shield.hitby(AM, skipcatch, hitpush, blocked, throwingdatum) + else + . = ..() + +//////////////////////////// +///// Shield processing //// +//////////////////////////// + +/**An object to take the hit for us when using the Durand's defense mode. +It is spawned in during the durand's initilization, and always stays on the same tile. +Normally invisible, until defense mode is actvated. When the durand detects an attack that should be blocked, the +attack is passed to the shield. The shield takes the damage, uses it to calculate charge cost, and then sets its +own integrity back to max. Shield is automatically dropped if we run out of power or the user gets out.*/ + +/obj/durand_shield //projectiles get passed to this when defense mode is enabled + name = "defense grid" + icon = 'icons/mecha/durand_shield.dmi' + icon_state = "shield_null" + invisibility = INVISIBILITY_MAXIMUM //no showing on right-click + pixel_y = 4 + max_integrity = 10000 + obj_integrity = 10000 + anchored = TRUE + light_range = MINIMUM_USEFUL_LIGHT_RANGE + light_power = 5 + light_color = COLOR_CYAN + ///Our link back to the durand + var/obj/vehicle/sealed/mecha/combat/durand/chassis + ///To keep track of things during the animation + var/switching = FALSE + var/currentuser + + +/obj/durand_shield/Initialize(mapload, _chassis, _layer, _dir) + . = ..() + chassis = _chassis + layer = _layer + setDir(_dir) + RegisterSignal(src, COMSIG_MECHA_ACTION_TRIGGER, .proc/activate) + + +/obj/durand_shield/Destroy() + if(chassis) + chassis.shield = null + chassis = null + return ..() + +/** + *Handles activating and deactivating the shield. This proc is called by a signal sent from the mech's action button + *and relayed by the mech itself. The "forced" variabe, signal_args[1], will skip the to-pilot text and is meant for when + *the shield is disabled by means other than the action button (like running out of power) + * Arguments: + * * source: the shield + * * owner: mob that activated the shield + * * signal_args: whether it's forced + */ +/obj/durand_shield/proc/activate(datum/source, mob/owner, list/signal_args) + SIGNAL_HANDLER + currentuser = owner + if(!chassis?.occupants) + return + if(switching && !signal_args[1]) + return + if(!chassis.defense_mode && (!chassis.cell || chassis.cell.charge < 100)) //If it's off, and we have less than 100 units of power + to_chat(currentuser, "[icon2html(src, currentuser)]Insufficient power; cannot activate defense mode.") + return + switching = TRUE + chassis.defense_mode = !chassis.defense_mode + if(!signal_args[1]) + to_chat(currentuser, "[icon2html(src, currentuser)]Defense mode [chassis.defense_mode?"enabled":"disabled"].") + chassis.log_message("User has toggled defense mode -- now [chassis.defense_mode?"enabled":"disabled"].", LOG_MECHA) + else + chassis.log_message("defense mode state changed -- now [chassis.defense_mode?"enabled":"disabled"].", LOG_MECHA) + for(var/occupant in chassis.occupants) + var/datum/action/button = chassis.occupant_actions[occupant][/datum/action/vehicle/sealed/mecha/mech_defense_mode] + button.button_icon_state = "mech_defense_mode_[chassis.defense_mode ? "on" : "off"]" + button.UpdateButtonIcon() + + set_light(light_range, light_power, light_color) + + if(chassis.defense_mode) + invisibility = 0 + flick("shield_raise", src) + playsound(src, 'sound/mecha/mech_shield_raise.ogg', 50, FALSE) + set_light(l_range = MINIMUM_USEFUL_LIGHT_RANGE , l_power = 5, l_color = "#00FFFF") + icon_state = "shield" + RegisterSignal(chassis, COMSIG_ATOM_DIR_CHANGE, .proc/resetdir) + else + flick("shield_drop", src) + playsound(src, 'sound/mecha/mech_shield_drop.ogg', 50, FALSE) + set_light(0) + icon_state = "shield_null" + invisibility = INVISIBILITY_MAXIMUM //no showing on right-click + UnregisterSignal(chassis, COMSIG_ATOM_DIR_CHANGE) + switching = FALSE + +/obj/durand_shield/proc/resetdir(datum/source, olddir, newdir) + setDir(newdir) + +/obj/durand_shield/take_damage() + if(!chassis) + qdel(src) + return + if(!chassis.defense_mode) //if defense mode is disabled, we're taking damage that we shouldn't be taking + return + . = ..() + flick("shield_impact", src) + if(!chassis.use_power((max_integrity - obj_integrity) * 100)) + chassis.cell?.charge = 0 + for(var/O in chassis.occupants) + var/mob/living/occupant = O + var/datum/action/action = LAZYACCESSASSOC(chassis.occupant_actions, occupant, /datum/action/vehicle/sealed/mecha/mech_defense_mode) + action.Trigger(FALSE) + obj_integrity = 10000 + +/obj/durand_shield/play_attack_sound() + playsound(src, 'sound/mecha/mech_shield_deflect.ogg', 100, TRUE) + +/obj/durand_shield/bullet_act() + play_attack_sound() + . = ..() diff --git a/code/game/mecha/combat/five_stars.dm b/code/modules/vehicles/mecha/combat/five_stars.dm similarity index 88% rename from code/game/mecha/combat/five_stars.dm rename to code/modules/vehicles/mecha/combat/five_stars.dm index 250ec7f3f6..3c14e9ad81 100644 --- a/code/game/mecha/combat/five_stars.dm +++ b/code/modules/vehicles/mecha/combat/five_stars.dm @@ -1,4 +1,4 @@ -/obj/mecha/combat/five_stars +/obj/vehicle/sealed/mecha/combat/five_stars desc = "A state of the art tank deployed by the Spinward Stellar Coalition National Guard." name = "\improper Tank" icon = 'icons/mecha/mecha_96x96.dmi' @@ -10,7 +10,7 @@ pixel_x = -32 pixel_y = -32 -/obj/mecha/combat/five_stars/Initialize() +/obj/vehicle/sealed/mecha/combat/five_stars/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/spacecops(src) ME.attach(src) diff --git a/code/modules/vehicles/mecha/combat/gygax.dm b/code/modules/vehicles/mecha/combat/gygax.dm new file mode 100644 index 0000000000..a90b776374 --- /dev/null +++ b/code/modules/vehicles/mecha/combat/gygax.dm @@ -0,0 +1,59 @@ +/obj/vehicle/sealed/mecha/combat/gygax + desc = "A lightweight, security exosuit. Popular among private and corporate security." + name = "\improper Gygax" + icon_state = "gygax" + allow_diagonal_movement = TRUE + movedelay = 3 + dir_in = 1 //Facing North. + max_integrity = 250 + deflect_chance = 5 + armor = list(MELEE = 25, BULLET = 20, LASER = 30, ENERGY = 15, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100) + max_temperature = 25000 + leg_overload_coeff = 80 + force = 25 + wreckage = /obj/structure/mecha_wreckage/gygax + internal_damage_threshold = 35 + max_equip = 3 + step_energy_drain = 3 + +/obj/vehicle/sealed/mecha/combat/gygax/dark + desc = "A lightweight exosuit, painted in a dark scheme. This model appears to have some modifications." + name = "\improper Dark Gygax" + icon_state = "darkgygax" + max_integrity = 300 + deflect_chance = 20 + armor = list(MELEE = 40, BULLET = 40, LASER = 50, ENERGY = 35, BOMB = 20, BIO = 0, RAD =20, FIRE = 100, ACID = 100) + max_temperature = 35000 + leg_overload_coeff = 70 + force = 30 + operation_req_access = list(ACCESS_SYNDICATE) + internals_req_access = list(ACCESS_SYNDICATE) + wreckage = /obj/structure/mecha_wreckage/gygax/dark + max_equip = 5 + destruction_sleep_duration = 20 + +/obj/vehicle/sealed/mecha/combat/gygax/dark/loaded/Initialize() + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/thrusters/ion(src) + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay + ME.attach(src) + max_ammo() + +/obj/vehicle/sealed/mecha/combat/gygax/dark/add_cell(obj/item/stock_parts/cell/C=null) + if(C) + C.forceMove(src) + cell = C + return + cell = new /obj/item/stock_parts/cell/bluespace(src) + + +/obj/vehicle/sealed/mecha/combat/gygax/generate_actions() + . = ..() + initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_overload_mode) diff --git a/code/game/mecha/combat/honker.dm b/code/modules/vehicles/mecha/combat/honker.dm similarity index 63% rename from code/game/mecha/combat/honker.dm rename to code/modules/vehicles/mecha/combat/honker.dm index 89b641ccc6..7373469614 100644 --- a/code/game/mecha/combat/honker.dm +++ b/code/modules/vehicles/mecha/combat/honker.dm @@ -1,22 +1,21 @@ -/obj/mecha/combat/honker +/obj/vehicle/sealed/mecha/combat/honker desc = "Produced by \"Tyranny of Honk, INC\", this exosuit is designed as heavy clown-support. Used to spread the fun and joy of life. HONK!" name = "\improper H.O.N.K" icon_state = "honker" - step_in = 3 + movedelay = 3 max_integrity = 140 deflect_chance = 60 internal_damage_threshold = 60 - armor = list("melee" = -20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) + armor = list(MELEE = -20, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100) max_temperature = 25000 - infra_luminosity = 5 operation_req_access = list(ACCESS_THEATRE) - internals_req_access = list(ACCESS_THEATRE, ACCESS_ROBOTICS) + internals_req_access = list(ACCESS_ROBOTICS, ACCESS_THEATRE) wreckage = /obj/structure/mecha_wreckage/honker - add_req_access = 0 + mecha_flags = CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS max_equip = 3 - var/squeak = 0 + var/squeak = TRUE -/obj/mecha/combat/honker/get_stats_part() +/obj/vehicle/sealed/mecha/combat/honker/get_stats_part(mob/user) var/integrity = obj_integrity/max_integrity*100 var/cell_charge = get_charge() var/datum/gas_mixture/int_tank_air = internal_tank.return_air() @@ -29,18 +28,18 @@ [internal_damage&MECHA_INT_TANK_BREACH?"GAS TANK HONK
":null] [internal_damage&MECHA_INT_CONTROL_LOST?"HONK-A-DOODLE - Recalibrate
":null] IntegriHONK: [integrity]%
- PowerHONK charge: [isnull(cell_charge)?"No powercell installed":"[cell.percent()]%"]
+ PowerHONK charge: [isnull(cell_charge)?"No power cell installed":"[cell.percent()]%"]
Air source: [use_internal_tank?"Internal Airtank":"Environment"]
AirHONK pressure: [tank_pressure]kPa
AirHONK temperature: [tank_temperature]°K|[tank_temperature - T0C]°C
HONK pressure: [cabin_pressure>WARNING_HIGH_PRESSURE ? "[cabin_pressure]": cabin_pressure]kPa
HONK temperature: [return_temperature()]°K|[return_temperature() - T0C]°C
- Lights: [lights?"on":"off"]
+ Lights: [(mecha_flags & LIGHTS_ON)?"on":"off"]
[dna_lock?"DNA-locked:
[dna_lock] \[Reset\]
":null] "} return output -/obj/mecha/combat/honker/get_stats_html() +/obj/vehicle/sealed/mecha/combat/honker/get_stats_html(mob/user) var/output = {" @@ -60,19 +59,19 @@ [js_byjax] [js_dropdowns] function SSticker() { - setInterval(function(){ - window.location='byond://?src=[REF(src)]&update_content=1'; - document.body.style.color = get_rand_color_string(); - document.body.style.background = get_rand_color_string(); - }, 1000); + setInterval(function(){ + window.location='byond://?src=[REF(src)]&update_content=1'; + document.body.style.color = get_rand_color_string(); + document.body.style.background = get_rand_color_string(); + }, 1000); } function get_rand_color_string() { - var color = new Array; - for(var i=0;i<3;i++){ - color.push(Math.floor(Math.random()*255)); - } - return "rgb("+color.toString()+")"; + var color = new Array; + for(var i=0;i<3;i++){ + color.push(Math.floor(Math.random()*255)); + } + return "rgb("+color.toString()+")"; } window.onload = function() { @@ -83,7 +82,7 @@
- [src.get_stats_part()] + [src.get_stats_part(user)]
[src.get_equipment_list()] @@ -97,7 +96,7 @@ "} return output -/obj/mecha/combat/honker/get_commands() +/obj/vehicle/sealed/mecha/combat/honker/get_commands() var/output = {" "} @@ -113,8 +120,8 @@ return output -/obj/mecha/combat/honker/get_equipment_list() - if(!equipment.len) +/obj/vehicle/sealed/mecha/combat/honker/get_equipment_list() + if(!LAZYLEN(equipment)) return var/output = "Honk-ON-Systems:
" for(var/obj/item/mecha_parts/mecha_equipment/MT in equipment) @@ -122,19 +129,12 @@ output += "
" return output +/obj/vehicle/sealed/mecha/combat/honker/play_stepsound() + if(squeak) + playsound(src, "clownstep", 70, 1) + squeak = !squeak - -/obj/mecha/combat/honker/mechstep(direction) - var/result = step(src,direction) - if(result) - if(!squeak) - playsound(src, "clownstep", 70, 1) - squeak = 1 - else - squeak = 0 - return result - -/obj/mecha/combat/honker/Topic(href, href_list) +/obj/vehicle/sealed/mecha/combat/honker/Topic(href, href_list) ..() if (href_list["play_sound"]) switch(href_list["play_sound"]) @@ -148,11 +148,20 @@ playsound(src, 'sound/items/carhorn.ogg', 80) //soundfile has lower than average volume if("party_horn") playsound(src, 'sound/items/party_horn.ogg', 50) + if("reee") + playsound(src, 'sound/effects/reee.ogg', 50) + if("weeoo1") + playsound(src, 'sound/items/weeoo1.ogg', 50) + if("hiss1") + playsound(src, 'sound/voice/hiss1.ogg', 50) + if("armbomb") + playsound(src, 'sound/weapons/armbomb.ogg', 50) + if("saberon") + playsound(src, 'sound/weapons/saberon.ogg', 50) + if("airlock_alien_prying") + playsound(src, 'sound/machines/airlock_alien_prying.ogg', 50) + if("lightningbolt") + playsound(src, 'sound/magic/lightningbolt.ogg', 50) + if("explosionfar") + playsound(src, 'sound/effects/explosionfar.ogg', 50) return - -/proc/rand_hex_color() - var/list/colors = list("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f") - var/color="" - for (var/i=0;i<6;i++) - color = color+pick(colors) - return color diff --git a/code/game/mecha/combat/marauder.dm b/code/modules/vehicles/mecha/combat/marauder.dm similarity index 61% rename from code/game/mecha/combat/marauder.dm rename to code/modules/vehicles/mecha/combat/marauder.dm index 5c60a97864..d595509d2e 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/modules/vehicles/mecha/combat/marauder.dm @@ -1,38 +1,32 @@ -/obj/mecha/combat/marauder +/obj/vehicle/sealed/mecha/combat/marauder desc = "Heavy-duty, combat exosuit, developed after the Durand model. Rarely found among civilian populations." name = "\improper Marauder" icon_state = "marauder" - step_in = 5 + movedelay = 5 max_integrity = 500 deflect_chance = 25 - armor = list("melee" = 50, "bullet" = 55, "laser" = 40, "energy" = 30, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) + armor = list(MELEE = 50, BULLET = 55, LASER = 40, ENERGY = 30, BOMB = 30, BIO = 0, RAD = 60, FIRE = 100, ACID = 100) max_temperature = 60000 resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF - infra_luminosity = 3 operation_req_access = list(ACCESS_CENT_SPECOPS) - internals_req_access = list(ACCESS_CENT_SPECOPS, ACCESS_ROBOTICS) + internals_req_access = list(ACCESS_CENT_SPECOPS) wreckage = /obj/structure/mecha_wreckage/marauder - add_req_access = 0 + mecha_flags = CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS internal_damage_threshold = 25 force = 45 - max_equip = 4 - bumpsmash = 1 + max_equip = 5 + bumpsmash = TRUE -/obj/mecha/combat/marauder/GrantActions(mob/living/user, human_occupant = 0) - ..() - smoke_action.Grant(user, src) - thrusters_action.Grant(user, src) - zoom_action.Grant(user, src) - -/obj/mecha/combat/marauder/RemoveActions(mob/living/user, human_occupant = 0) - ..() - smoke_action.Remove(user) - thrusters_action.Remove(user) - zoom_action.Remove(user) - -/obj/mecha/combat/marauder/loaded/Initialize() +/obj/vehicle/sealed/mecha/combat/marauder/generate_actions() . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse(src) + initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_smoke) + initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_zoom) + +/obj/vehicle/sealed/mecha/combat/marauder/loaded/Initialize() + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/thrusters/ion(src) + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse(src) ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src) ME.attach(src) @@ -42,23 +36,24 @@ ME.attach(src) max_ammo() -/obj/mecha/combat/marauder/seraph +/obj/vehicle/sealed/mecha/combat/marauder/seraph desc = "Heavy-duty, command-type exosuit. This is a custom model, utilized only by high-ranking military personnel." name = "\improper Seraph" icon_state = "seraph" operation_req_access = list(ACCESS_CENT_SPECOPS) - internals_req_access = list(ACCESS_CENT_SPECOPS, ACCESS_ROBOTICS) - step_in = 3 + internals_req_access = list(ACCESS_CENT_SPECOPS) + movedelay = 3 max_integrity = 550 wreckage = /obj/structure/mecha_wreckage/seraph internal_damage_threshold = 20 force = 55 - max_equip = 5 + max_equip = 6 -/obj/mecha/combat/marauder/seraph/Initialize() +/obj/vehicle/sealed/mecha/combat/marauder/seraph/Initialize() . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME - ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot(src) + var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/thrusters/ion(src) + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse(src) ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src) ME.attach(src) @@ -70,16 +65,22 @@ ME.attach(src) max_ammo() -/obj/mecha/combat/marauder/mauler +/obj/vehicle/sealed/mecha/combat/marauder/mauler desc = "Heavy-duty, combat exosuit, developed off of the existing Marauder model." name = "\improper Mauler" icon_state = "mauler" operation_req_access = list(ACCESS_SYNDICATE) internals_req_access = list(ACCESS_SYNDICATE) wreckage = /obj/structure/mecha_wreckage/mauler - max_equip = 5 + max_equip = 6 + destruction_sleep_duration = 20 -/obj/mecha/combat/marauder/mauler/loaded/Initialize() +/obj/vehicle/sealed/mecha/combat/marauder/mauler/Initialize() + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/thrusters/ion(src) + ME.attach(src) + +/obj/vehicle/sealed/mecha/combat/marauder/mauler/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg(src) ME.attach(src) diff --git a/code/game/mecha/medical/medigax.dm b/code/modules/vehicles/mecha/combat/medigax.dm similarity index 54% rename from code/game/mecha/medical/medigax.dm rename to code/modules/vehicles/mecha/combat/medigax.dm index 98b7c9455b..6b2f54a976 100644 --- a/code/game/mecha/medical/medigax.dm +++ b/code/modules/vehicles/mecha/combat/medigax.dm @@ -1,34 +1,36 @@ -/obj/mecha/medical/medigax +/obj/vehicle/sealed/mecha/medical/medigax desc = "A Gygax with it's actuator overload stripped and a slick white paint scheme, for medical use, These exosuits are developed and produced by Vey-Med. (© All rights reserved)." name = "\improper Medical Gygax" icon_state = "medigax" - step_in = 1.75 // a little faster than an odysseus - max_temperature = 25000 + allow_diagonal_movement = TRUE + movedelay = 2 + dir_in = 1 //Facing North. max_integrity = 250 - wreckage = /obj/structure/mecha_wreckage/odysseus - armor = list("melee" = 25, "bullet" = 20, "laser" = 30, "energy" = 15, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) - internal_damage_threshold = 35 deflect_chance = 15 + armor = list(MELEE = 25, BULLET = 20, LASER = 30, ENERGY = 15, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100) + max_temperature = 25000 + wreckage = /obj/structure/mecha_wreckage/odysseus + internal_damage_threshold = 35 step_energy_drain = 6 infra_luminosity = 6 + internals_req_access = list(ACCESS_ROBOTICS, ACCESS_MEDICAL) - -/obj/mecha/medical/medigax/moved_inside(mob/living/carbon/human/H) +/obj/vehicle/sealed/mecha/medical/medigax/moved_inside(mob/living/carbon/human/H) . = ..() if(.) var/datum/atom_hud/hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] hud.add_hud_to(H) -/obj/mecha/medical/medigax/go_out() - if(isliving(occupant)) - var/mob/living/carbon/human/L = occupant +/obj/vehicle/sealed/mecha/medical/medigax/remove_occupant(mob/M) + if(isliving(M)) + var/mob/living/L = M var/datum/atom_hud/hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] hud.remove_hud_from(L) - ..() + return ..() -/obj/mecha/medical/medigax/mmi_moved_inside(obj/item/mmi/mmi_as_oc, mob/user) +/obj/vehicle/sealed/mecha/medical/medigax/mmi_moved_inside(obj/item/mmi/M, mob/user) . = ..() if(.) var/datum/atom_hud/hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] - var/mob/living/brain/B = mmi_as_oc.brainmob + var/mob/living/brain/B = M.brainmob hud.add_hud_to(B) diff --git a/code/game/mecha/combat/neovgre.dm b/code/modules/vehicles/mecha/combat/neovgre.dm similarity index 74% rename from code/game/mecha/combat/neovgre.dm rename to code/modules/vehicles/mecha/combat/neovgre.dm index 75470abe88..8decd05f96 100644 --- a/code/game/mecha/combat/neovgre.dm +++ b/code/modules/vehicles/mecha/combat/neovgre.dm @@ -1,52 +1,43 @@ -/obj/mecha/combat/neovgre +/obj/vehicle/sealed/mecha/combat/neovgre name = "Neovgre, the Anima Bulwark" - desc = "Nezbere's most powerful creation, a mighty war machine of unmatched power said to have ended wars in a single night." + desc = "Nezbere's most powerful creation, a mighty war machine of unmatched power said to have ended wars in a single night. Armed with a heavy laser and a tesla sphere generator. Requires a pilot and a gunner." icon = 'icons/mecha/neovgre.dmi' icon_state = "neovgre" max_integrity = 500 //This is THE ratvarian superweaon, its deployment is an investment armor = list("melee" = 50, "bullet" = 40, "laser" = 25, "energy" = 25, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) //Its similar to the clockwork armour albeit with a few buffs becuase RATVARIAN SUPERWEAPON!! force = 50 //SMASHY SMASHY!! + movedelay = 3 internal_damage_threshold = 0 - step_in = 3 pixel_x = -16 layer = ABOVE_MOB_LAYER - breach_time = 100 //ten seconds till all goes to shit - recharge_rate = 100 + var/breach_time = 100 //ten seconds till all goes to shit + var/recharge_rate = 100 internals_req_access = list() - add_req_access = 0 wreckage = /obj/structure/mecha_wreckage/durand/neovgre stepsound = 'sound/mecha/neostep2.ogg' turnsound = 'sound/mecha/powerloader_step.ogg' -/obj/mecha/combat/neovgre/GrantActions(mob/living/user, human_occupant = 0) //No Eject action for you sonny jim, your life for Ratvar! - internals_action.Grant(user, src) - cycle_action.Grant(user, src) - lights_action.Grant(user, src) - stats_action.Grant(user, src) - strafing_action.Grant(user, src) -/obj/mecha/combat/neovgre/RemoveActions(mob/living/user, human_occupant = 0) - internals_action.Remove(user) - cycle_action.Remove(user) - lights_action.Remove(user) - stats_action.Remove(user) - strafing_action.Remove(user) -/obj/mecha/combat/neovgre/MouseDrop_T(mob/M, mob/user) +/obj/vehicle/sealed/mecha/neovgre/mob_exit(mob/M, silent, forced) + if(forced) + ..() + +/obj/vehicle/sealed/mecha/combat/neovgre/MouseDrop_T(mob/M, mob/user) if(!is_servant_of_ratvar(user)) to_chat(user, "BEGONE HEATHEN!") return else ..() -/obj/mecha/combat/neovgre/moved_inside(mob/living/carbon/human/H) +/obj/vehicle/sealed/mecha/combat/neovgre/moved_inside(mob/living/carbon/human/H) var/list/Itemlist = H.get_contents() for(var/obj/item/clockwork/slab/W in Itemlist) to_chat(H, "You safely store [W] inside [src].") qdel(W) . = ..() -/obj/mecha/combat/neovgre/obj_destruction() +/obj/vehicle/sealed/mecha/combat/neovgre/obj_destruction() for(var/mob/M in src) to_chat(M, "You are consumed by the fires raging within Neovgre...") M.dust() @@ -54,15 +45,15 @@ src.visible_message("The reactor has gone critical, its going to blow!") addtimer(CALLBACK(src,.proc/go_critical),breach_time) -/obj/mecha/combat/neovgre/proc/go_critical() +/obj/vehicle/sealed/mecha/combat/neovgre/proc/go_critical() explosion(get_turf(loc), 3, 5, 10, 20, 30) Destroy(src) -/obj/mecha/combat/neovgre/container_resist(mob/living/user) +/obj/vehicle/sealed/mecha/combat/neovgre/container_resist(mob/living/user) to_chat(user, "Neovgre requires a lifetime commitment friend, no backing out now!") return -/obj/mecha/combat/neovgre/process() +/obj/vehicle/sealed/mecha/combat/neovgre/process() ..() if(!obj_integrity) //Integrity is zero but we would heal out of that state if we went into this before it recognises it being zero return @@ -80,7 +71,7 @@ if(obj_integrity < max_integrity && istype(loc, /turf/open/floor/clockwork)) obj_integrity += min(max_integrity - obj_integrity, max_integrity / 200) -/obj/mecha/combat/neovgre/Initialize() +/obj/vehicle/sealed/mecha/combat/neovgre/Initialize() .=..() GLOB.neovgre_exists ++ var/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy/neovgre/N = new @@ -97,7 +88,7 @@ desc = "Please re-attach this to neovgre and stop asking questions about why it looks like a normal Nanotrasen issue Solaris laser cannon - Nezbere" fire_sound = 'sound/weapons/neovgre_laser.ogg' -/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy/neovgre/can_attach(obj/mecha/combat/neovgre/M) +/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy/neovgre/can_attach(obj/vehicle/sealed/mecha/combat/neovgre/M) if(istype(M)) return 1 return 0 diff --git a/code/modules/vehicles/mecha/combat/phazon.dm b/code/modules/vehicles/mecha/combat/phazon.dm new file mode 100644 index 0000000000..c964b17e36 --- /dev/null +++ b/code/modules/vehicles/mecha/combat/phazon.dm @@ -0,0 +1,21 @@ +/obj/vehicle/sealed/mecha/combat/phazon + desc = "This is a Phazon exosuit. The pinnacle of scientific research and pride of Nanotrasen, it uses cutting edge bluespace technology and expensive materials." + name = "\improper Phazon" + icon_state = "phazon" + movedelay = 2 + dir_in = 2 //Facing South. + step_energy_drain = 3 + max_integrity = 200 + deflect_chance = 30 + armor = list(MELEE = 30, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 30, BIO = 0, RAD = 50, FIRE = 100, ACID = 100) + max_temperature = 25000 + wreckage = /obj/structure/mecha_wreckage/phazon + internal_damage_threshold = 25 + force = 15 + max_equip = 3 + phase_state = "phazon-phase" + +/obj/vehicle/sealed/mecha/combat/phazon/generate_actions() + . = ..() + initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_phasing) + initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_switch_damtype) diff --git a/code/game/mecha/combat/reticence.dm b/code/modules/vehicles/mecha/combat/reticence.dm similarity index 66% rename from code/game/mecha/combat/reticence.dm rename to code/modules/vehicles/mecha/combat/reticence.dm index 7343a85483..54f13e0fa9 100644 --- a/code/game/mecha/combat/reticence.dm +++ b/code/modules/vehicles/mecha/combat/reticence.dm @@ -1,26 +1,25 @@ -/obj/mecha/combat/reticence +/obj/vehicle/sealed/mecha/combat/reticence desc = "A silent, fast, and nigh-invisible miming exosuit. Popular among mimes and mime assassins." name = "\improper reticence" icon_state = "reticence" - step_in = 2 + movedelay = 2 dir_in = 1 //Facing North. max_integrity = 100 deflect_chance = 3 - armor = list("melee" = 25, "bullet" = 20, "laser" = 30, "energy" = 15, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) + armor = list(MELEE = 25, BULLET = 20, LASER = 30, ENERGY = 15, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100) max_temperature = 15000 wreckage = /obj/structure/mecha_wreckage/reticence operation_req_access = list(ACCESS_THEATRE) - internals_req_access = list(ACCESS_THEATRE, ACCESS_ROBOTICS) - add_req_access = 0 + internals_req_access = list(ACCESS_ROBOTICS, ACCESS_THEATRE) + mecha_flags = CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS internal_damage_threshold = 25 max_equip = 2 step_energy_drain = 3 color = "#87878715" stepsound = null turnsound = null - opacity = 0 -/obj/mecha/combat/reticence/loaded/Initialize() +/obj/vehicle/sealed/mecha/combat/reticence/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced ME.attach(src) diff --git a/code/modules/vehicles/mecha/equipment/mecha_equipment.dm b/code/modules/vehicles/mecha/equipment/mecha_equipment.dm new file mode 100644 index 0000000000..617b82603a --- /dev/null +++ b/code/modules/vehicles/mecha/equipment/mecha_equipment.dm @@ -0,0 +1,157 @@ +//DO NOT ADD MECHA PARTS TO THE GAME WITH THE DEFAULT "SPRITE ME" SPRITE! +//I'm annoyed I even have to tell you this! SPRITE FIRST, then commit. + +/obj/item/mecha_parts/mecha_equipment + name = "mecha equipment" + icon = 'icons/mecha/mecha_equipment.dmi' + icon_state = "mecha_equip" + force = 5 + max_integrity = 300 + var/equip_cooldown = 0 + var/equip_ready = TRUE //whether the equipment is ready for use. (or deactivated/activated for static stuff) + var/energy_drain = 0 + var/obj/vehicle/sealed/mecha/chassis = null + ///Bitflag. Determines the range of the equipment. + var/range = MECHA_MELEE + /// Bitflag. Used by exosuit fabricator to assign sub-categories based on which exosuits can equip this. + var/mech_flags = NONE + var/salvageable = 1 + var/detachable = TRUE // Set to FALSE for built-in equipment that cannot be removed + var/selectable = 1 // Set to 0 for passive equipment such as mining scanner or armor plates + var/harmful = FALSE //Controls if equipment can be used to attack by a pacifist. + var/destroy_sound = 'sound/mecha/critdestr.ogg' + +/obj/item/mecha_parts/mecha_equipment/proc/update_chassis_page() + if(chassis) + send_byjax(chassis.occupants,"exosuit.browser","eq_list",chassis.get_equipment_list()) + send_byjax(chassis.occupants,"exosuit.browser","equipment_menu",chassis.get_equipment_menu(),"dropdowns") + return TRUE + return + +/obj/item/mecha_parts/mecha_equipment/proc/update_equip_info() + if(chassis) + send_byjax(chassis.occupants,"exosuit.browser","[REF(src)]",get_equip_info()) + return TRUE + return + +/obj/item/mecha_parts/mecha_equipment/Destroy() + if(chassis) + LAZYREMOVE(chassis.equipment, src) + if(chassis.selected == src) + chassis.selected = null + update_chassis_page() + log_message("[src] is destroyed.", LOG_MECHA) + if(chassis.occupants) + to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][src] is destroyed!") + playsound(chassis, destroy_sound, 50) + if(!detachable) //If we're a built-in nondetachable equipment, let's lock up the slot that we were in. + chassis.max_equip-- + chassis = null + return ..() + +/obj/item/mecha_parts/mecha_equipment/try_attach_part(mob/user, obj/vehicle/sealed/mecha/M) + if(can_attach(M)) + if(!user.temporarilyRemoveItemFromInventory(src)) + return FALSE + attach(M) + user.visible_message("[user] attaches [src] to [M].", "You attach [src] to [M].") + return TRUE + to_chat(user, "You are unable to attach [src] to [M]!") + return FALSE + +/obj/item/mecha_parts/mecha_equipment/proc/get_equip_info() + if(!chassis) + return + var/txt = "* " + if(chassis.selected == src) + txt += "[src.name]" + else if(selectable) + txt += "[src.name]" + else + txt += "[src.name]" + + return txt + +/obj/item/mecha_parts/mecha_equipment/proc/action_checks(atom/target) + if(!target) + return FALSE + if(!chassis) + return FALSE + if(!equip_ready) + return FALSE + if(energy_drain && !chassis.has_charge(energy_drain)) + return FALSE + if(chassis.is_currently_ejecting) + return FALSE + if(chassis.equipment_disabled) + to_chat(chassis.occupants, "Error -- Equipment control unit is unresponsive.") + return FALSE + if(TIMER_COOLDOWN_CHECK(chassis, COOLDOWN_MECHA_EQUIPMENT)) + return FALSE + return TRUE + +/obj/item/mecha_parts/mecha_equipment/proc/action(mob/source, atom/target, params) + TIMER_COOLDOWN_START(chassis, COOLDOWN_MECHA_EQUIPMENT, equip_cooldown)//Cooldown is on the MECH so people dont bypass it by switching equipment + send_byjax(chassis.occupants,"exosuit.browser","[REF(src)]",src.get_equip_info()) + chassis.use_power(energy_drain) + return TRUE + +/obj/item/mecha_parts/mecha_equipment/proc/do_after_cooldown(atom/target, mob/user) + if(!chassis) + return + var/C = chassis.loc + chassis.use_power(energy_drain) + . = do_after(user, equip_cooldown, target=target) + if(!chassis || chassis.loc != C || src != chassis.selected || !(get_dir(chassis, target)&chassis.dir)) + return FALSE + +/obj/item/mecha_parts/mecha_equipment/proc/do_after_mecha(atom/target, mob/user, delay) + if(!chassis) + return + var/C = chassis.loc + . = do_after(user, delay, target=target) + if(!chassis || chassis.loc != C || src != chassis.selected || !(get_dir(chassis, target)&chassis.dir)) + return FALSE + +/obj/item/mecha_parts/mecha_equipment/proc/can_attach(obj/vehicle/sealed/mecha/M) + if(LAZYLEN(M.equipment)You start putting [target] into [src]...") + to_chat(source, "[icon2html(src, source)]You start putting [target] into [src]...") chassis.visible_message("[chassis] starts putting [target] into \the [src].") - if(do_after_cooldown(target)) - if(!patient_insertion_check(target)) + if(do_after(source, equip_cooldown, target=target)) + if(!chassis || src != chassis.selected || !(get_dir(chassis, target)&chassis.dir)) + return + if(!patient_insertion_check(target, source)) return target.forceMove(src) patient = target START_PROCESSING(SSobj, src) update_equip_info() - occupant_message("[target] successfully loaded into [src]. Life support functions engaged.") + to_chat(source, "[icon2html(src, source)][target] successfully loaded into [src]. Life support functions engaged.") chassis.visible_message("[chassis] loads [target] into [src].") - mecha_log_message("[target] loaded. Life support functions engaged.") + log_message("[target] loaded. Life support functions engaged.", LOG_MECHA) + return ..() -/obj/item/mecha_parts/mecha_equipment/medical/sleeper/proc/patient_insertion_check(mob/living/carbon/target) +/obj/item/mecha_parts/mecha_equipment/medical/sleeper/proc/patient_insertion_check(mob/living/carbon/target, mob/user) if(target.buckled) - occupant_message("[target] will not fit into the sleeper because [target.p_theyre()] buckled to [target.buckled]!") + to_chat(user, "[icon2html(src, user)][target] will not fit into the sleeper because [target.p_theyre()] buckled to [target.buckled]!") return if(target.has_buckled_mobs()) - occupant_message("[target] will not fit into the sleeper because of the creatures attached to it!") + to_chat(user, "[icon2html(src, user)][target] will not fit into the sleeper because of the creatures attached to it!") return if(patient) - occupant_message("The sleeper is already occupied!") + to_chat(user, "[icon2html(src, user)]The sleeper is already occupied!") return - return 1 + return TRUE /obj/item/mecha_parts/mecha_equipment/medical/sleeper/proc/go_out() if(!patient) return patient.forceMove(get_turf(src)) - occupant_message("[patient] ejected. Life support functions disabled.") - mecha_log_message("[patient] ejected. Life support functions disabled.") + to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][patient] ejected. Life support functions disabled.") + log_message("[patient] ejected. Life support functions disabled.", LOG_MECHA) STOP_PROCESSING(SSobj, src) patient = null update_equip_info() /obj/item/mecha_parts/mecha_equipment/medical/sleeper/detach() if(patient) - occupant_message("Unable to detach [src] - equipment occupied!") + to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)]Unable to detach [src] - equipment occupied!") return STOP_PROCESSING(SSobj, src) return ..() @@ -105,20 +107,23 @@ if(patient) temp = "
\[Occupant: [patient] ([patient.stat > 1 ? "*DECEASED*" : "Health: [patient.health]%"])\]
View stats|Eject" return "[output] [temp]" - return /obj/item/mecha_parts/mecha_equipment/medical/sleeper/Topic(href,href_list) - ..() + . = ..() + if(.) + return + if(!(usr in chassis.occupants)) + return if(href_list["eject"]) go_out() if(href_list["view_stats"]) - chassis.occupant << browse(get_patient_stats(),"window=msleeper") - onclose(chassis.occupant, "msleeper") + usr << browse(get_patient_stats(),"window=msleeper") + onclose(usr, "msleeper") return if(href_list["inject"]) var/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/SG = locate() in chassis var/datum/reagent/R = locate(href_list["inject"]) in SG.reagents.reagent_list - if (istype(R)) + if(istype(R)) inject_reagent(R, SG) /obj/item/mecha_parts/mecha_equipment/medical/sleeper/proc/get_patient_stats() @@ -186,7 +191,7 @@ if(SG && SG.reagents && islist(SG.reagents.reagent_list)) for(var/datum/reagent/R in SG.reagents.reagent_list) if(R.volume > 0) - output += "Inject [R.name]
" + output += "Inject [R.name]
" return output @@ -195,9 +200,9 @@ return 0 var/to_inject = min(R.volume, inject_amount) if(to_inject && patient.reagents.get_reagent_amount(R.type) + to_inject <= inject_amount*2) - occupant_message("Injecting [patient] with [to_inject] units of [R.name].") - mecha_log_message("Injecting [patient] with [to_inject] units of [R.name].") - log_combat(chassis.occupant, patient, "injected", "[name] ([R] - [to_inject] units)") + to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)]Injecting [patient] with [to_inject] units of [R.name].") + log_message("Injecting [patient] with [to_inject] units of [R.name].", LOG_MECHA) + log_combat(chassis.occupants, patient, "injected", "[name] ([R] - [to_inject] units)") SG.reagents.trans_id_to(patient,R.type,to_inject) update_equip_info() return @@ -205,9 +210,9 @@ /obj/item/mecha_parts/mecha_equipment/medical/sleeper/update_equip_info() if(..()) if(patient) - send_byjax(chassis.occupant,"msleeper.browser","lossinfo",get_patient_dam()) - send_byjax(chassis.occupant,"msleeper.browser","reagents",get_patient_reagents()) - send_byjax(chassis.occupant,"msleeper.browser","injectwith",get_available_reagents()) + send_byjax(chassis.occupants,"msleeper.browser","lossinfo",get_patient_dam()) + send_byjax(chassis.occupants,"msleeper.browser","reagents",get_patient_reagents()) + send_byjax(chassis.occupants,"msleeper.browser","injectwith",get_available_reagents()) return 1 return @@ -218,9 +223,8 @@ if(..()) return if(!chassis.has_charge(energy_drain)) - set_ready_state(1) - mecha_log_message("Deactivated.") - occupant_message("[src] deactivated - no power.") + log_message("Deactivated.", LOG_MECHA) + to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][src] deactivated - no power.") STOP_PROCESSING(SSobj, src) return var/mob/living/carbon/M = patient @@ -228,7 +232,10 @@ return if(M.health > 0) M.adjustOxyLoss(-1) - M.AdjustAllImmobility(-80) + M.AdjustStun(-80) + M.AdjustKnockdown(-80) + M.AdjustParalyzed(-80) + M.AdjustImmobilized(-80) M.AdjustUnconscious(-80) if(M.reagents.get_reagent_amount(/datum/reagent/medicine/epinephrine) < 5) M.reagents.add_reagent(/datum/reagent/medicine/epinephrine, 5) @@ -254,15 +261,14 @@ var/synth_speed = 5 //[num] reagent units per cycle energy_drain = 10 var/mode = 0 //0 - fire syringe, 1 - analyze reagents. - range = MELEE|RANGED + range = MECHA_MELEE|MECHA_RANGED equip_cooldown = 10 /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/Initialize() . = ..() create_reagents(max_volume, NO_REACT) syringes = new - known_reagents = list(/datum/reagent/medicine/epinephrine = "Epinephrine", /datum/reagent/medicine/charcoal = "Charcoal", /datum/reagent/medicine/prussian_blue = "Prussian Blue", \ - /datum/reagent/medicine/dexalin = "Dexalin", /datum/reagent/medicine/insulin = "Insulin", /datum/reagent/medicine/kelotane = "Kelotane", /datum/reagent/medicine/bicaridine = "Bicaridine") + known_reagents = list(/datum/reagent/medicine/epinephrine="Epinephrine") processed_reagents = new /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/detach() @@ -273,39 +279,35 @@ STOP_PROCESSING(SSobj, src) return ..() -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/critfail() - ..() - if(reagents) - reagents.reagents_holder_flags &= ~(NO_REACT) - -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/can_attach(obj/mecha/medical/M) - if(..()) - if(istype(M)) - return 1 - return 0 +/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/can_attach(obj/vehicle/sealed/mecha/medical/M) + . = ..() + if(!istype(M)) + return FALSE /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/get_equip_info() var/output = ..() if(output) return "[output] \[[mode? "Analyze" : "Launch"]\]
\[Syringes: [syringes.len]/[max_syringes] | Reagents: [reagents.total_volume]/[reagents.maximum_volume]\]
Reagents list" - return -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/action(atom/movable/target) +/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/action(mob/source, atom/movable/target, params) if(!action_checks(target)) return if(istype(target, /obj/item/reagent_containers/syringe)) return load_syringe(target) if(istype(target, /obj/item/storage))//Loads syringes from boxes for(var/obj/item/reagent_containers/syringe/S in target.contents) - load_syringe(S) + load_syringe(S, source) return if(mode) - return analyze_reagents(target) + return analyze_reagents(target, source) if(!syringes.len) - occupant_message("No syringes loaded.") + to_chat(source, "[icon2html(src, source)]No syringes loaded.") return if(reagents.total_volume<=0) - occupant_message("No available reagents to load syringe with.") + to_chat(source, "[icon2html(src, source)]No available reagents to load syringe with.") + return + if(HAS_TRAIT(source, TRAIT_PACIFISM)) + to_chat(source, "The [src] is lethally chambered! You don't want to risk harming anyone...") return var/turf/trg = get_turf(target) var/obj/item/reagent_containers/syringe/mechsyringe = syringes[1] @@ -314,11 +316,9 @@ syringes -= mechsyringe mechsyringe.icon = 'icons/obj/chemical.dmi' mechsyringe.icon_state = "syringeproj" - playsound(chassis, 'sound/items/syringeproj.ogg', 50, 1) - mecha_log_message("Launched [mechsyringe] from [src], targeting [target].") - var/mob/originaloccupant = chassis.occupant - spawn(0) - src = null //if src is deleted, still process the syringe + playsound(chassis, 'sound/items/syringeproj.ogg', 50, TRUE) + log_message("Launched [mechsyringe] from [src] by [source], targeting [target].", LOG_MECHA) + spawn(0) //This code is trash and whoever wrote it should feel bad for(var/i=0, i<6, i++) if(!mechsyringe) break @@ -326,10 +326,10 @@ var/list/mobs = new for(var/mob/living/carbon/M in mechsyringe.loc) mobs += M - var/mob/living/carbon/M = safepick(mobs) - if(M) + if(length(mobs)) + var/mob/living/carbon/M = pick(mobs) var/R - mechsyringe.visible_message(" [M] was hit by the syringe!") + mechsyringe.visible_message(" [M] is hit by the syringe!") if(M.can_inject(null, 1)) if(mechsyringe.reagents) for(var/datum/reagent/A in mechsyringe.reagents.reagent_list) @@ -337,9 +337,9 @@ mechsyringe.icon_state = initial(mechsyringe.icon_state) mechsyringe.icon = initial(mechsyringe.icon) mechsyringe.reagents.reaction(M, INJECT) - mechsyringe.reagents.trans_to(M, mechsyringe.reagents.total_volume) + mechsyringe.reagents.trans_to(M, mechsyringe.reagents.total_volume, log = TRUE) M.take_bodypart_damage(2) - log_combat(originaloccupant, M, "shot", "syringegun") + log_combat(source, M, "shot", "syringegun") break else if(mechsyringe.loc == trg) mechsyringe.icon_state = initial(mechsyringe.icon_state) @@ -352,7 +352,7 @@ mechsyringe.update_icon() break sleep(1) - return 1 + return ..() /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/Topic(href,href_list) @@ -376,12 +376,14 @@ if(processed_reagents.len) message += " added to production" START_PROCESSING(SSobj, src) - occupant_message(message) - occupant_message("Reagent processing started.") - mecha_log_message("Reagent processing started.") + to_chat(usr, message) + to_chat(usr, "[icon2html(src, usr)]Reagent processing started.") + log_message("Reagent processing started.", LOG_MECHA) return if (href_list["show_reagents"]) - chassis.occupant << browse(get_reagents_page(),"window=msyringegun") + if(!(usr in chassis.occupants)) + return + usr << browse(get_reagents_page(),"window=msyringegun") if (href_list["purge_reagent"]) var/reagent = href_list["purge_reagent"] if(reagent) @@ -445,74 +447,72 @@ var/output for(var/datum/reagent/R in reagents.reagent_list) if(R.volume > 0) - output += "[R]: [round(R.volume,0.001)] - Purge Reagent
" + output += "[R]: [round(R.volume,0.001)] - Purge Reagent
" if(output) output += "Total: [round(reagents.total_volume,0.001)]/[reagents.maximum_volume] - Purge All" return output || "None" -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/proc/load_syringe(obj/item/reagent_containers/syringe/S) +/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/proc/load_syringe(obj/item/reagent_containers/syringe/S, mob/user) if(syringes.len= 2) - occupant_message("The syringe is too far away.") + to_chat(user, "[icon2html(src, user)]The syringe is too far away!") return 0 for(var/obj/structure/D in S.loc)//Basic level check for structures in the way (Like grilles and windows) if(!(D.CanPass(S,src.loc))) - occupant_message("Unable to load syringe.") + to_chat(user, "[icon2html(src, user)]Unable to load syringe!") return 0 for(var/obj/machinery/door/D in S.loc)//Checks for doors if(!(D.CanPass(S,src.loc))) - occupant_message("Unable to load syringe.") + to_chat(user, "[icon2html(src, user)]Unable to load syringe!") return 0 S.reagents.trans_to(src, S.reagents.total_volume) S.forceMove(src) syringes += S - occupant_message("Syringe loaded.") + to_chat(user, "[icon2html(src, user)]Syringe loaded.") update_equip_info() return 1 - occupant_message("[src]'s syringe chamber is full.") + to_chat(user, "[icon2html(src, user)][src]'s syringe chamber is full!") return 0 -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/proc/analyze_reagents(atom/A) +/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/proc/analyze_reagents(atom/A, mob/user) if(get_dist(src,A) >= 4) - occupant_message("The object is too far away.") - return 0 + to_chat(user, "[icon2html(src, user)]The object is too far away!") + return FALSE if(!A.reagents || ismob(A)) - occupant_message("No reagent info gained from [A].") - return 0 - occupant_message("Analyzing reagents...") + to_chat(user, "[icon2html(src, user)]No reagent info gained from [A].") + return FALSE + to_chat(user, "[icon2html(src, user)]Analyzing reagents...") for(var/datum/reagent/R in A.reagents.reagent_list) if(R.can_synth && add_known_reagent(R.type,R.name)) - occupant_message("Reagent analyzed, identified as [R.name] and added to database.") - send_byjax(chassis.occupant,"msyringegun.browser","reagents_form",get_reagents_form()) - occupant_message("Analyzis complete.") - return 1 + to_chat(user, "[icon2html(src, user)]Reagent analyzed, identified as [R.name] and added to database.") + send_byjax(chassis.occupants,"msyringegun.browser","reagents_form",get_reagents_form()) + to_chat(user, "[icon2html(src, user)]Analysis complete.") + return TRUE /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/proc/add_known_reagent(r_id,r_name) if(!(r_id in known_reagents)) known_reagents += r_id known_reagents[r_id] = r_name - return 1 - return 0 + return TRUE + return FALSE /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/update_equip_info() if(..()) - send_byjax(chassis.occupant,"msyringegun.browser","reagents",get_current_reagents()) - send_byjax(chassis.occupant,"msyringegun.browser","reagents_form",get_reagents_form()) - return 1 - return + send_byjax(chassis.occupants,"msyringegun.browser","reagents",get_current_reagents()) + send_byjax(chassis.occupants,"msyringegun.browser","reagents_form",get_reagents_form()) + return TRUE /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/on_reagent_change(changetype) ..() update_equip_info() - return /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/process() if(..()) return if(!processed_reagents.len || reagents.total_volume >= reagents.maximum_volume || !chassis.has_charge(energy_drain)) - occupant_message("Reagent processing stopped.") - mecha_log_message("Reagent processing stopped.") + to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)]Reagent processing stopped.") + log_message("Reagent processing stopped.", LOG_MECHA) STOP_PROCESSING(SSobj, src) return var/amount = synth_speed / processed_reagents.len @@ -527,7 +527,7 @@ desc = "Equipment for medical exosuits. Generates a focused beam of medical nanites." icon_state = "mecha_medigun" energy_drain = 10 - range = MELEE|RANGED + range = MECHA_MELEE|MECHA_RANGED equip_cooldown = 0 var/obj/item/gun/medbeam/mech/medigun custom_materials = list(/datum/material/iron = 15000, /datum/material/glass = 8000, /datum/material/plasma = 3000, /datum/material/gold = 8000, /datum/material/diamond = 2000) @@ -546,7 +546,7 @@ return medigun.process() -/obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam/action(atom/target) +/obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam/action(mob/source, atom/movable/target, params) medigun.process_fire(target, loc) diff --git a/code/game/mecha/equipment/tools/mining_tools.dm b/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm similarity index 70% rename from code/game/mecha/equipment/tools/mining_tools.dm rename to code/modules/vehicles/mecha/equipment/tools/mining_tools.dm index 47820d1e27..80a3c050a5 100644 --- a/code/game/mecha/equipment/tools/mining_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm @@ -13,6 +13,7 @@ energy_drain = 10 force = 15 harmful = TRUE + range = MECHA_MELEE tool_behaviour = TOOL_DRILL toolspeed = 0.9 var/drill_delay = 7 @@ -23,7 +24,7 @@ . = ..() AddComponent(/datum/component/butchering, 50, 100, null, null, TRUE) -/obj/item/mecha_parts/mecha_equipment/drill/action(atom/target) +/obj/item/mecha_parts/mecha_equipment/drill/action(mob/source, atom/target, params) if(!action_checks(target)) return if(isspaceturf(target)) @@ -34,72 +35,69 @@ return target.visible_message("[chassis] starts to drill [target].", \ "[chassis] starts to drill [target]...", \ - "You hear drilling.") + "You hear drilling.") - if(do_after_cooldown(target)) - set_ready_state(FALSE) - mecha_log_message("Started drilling [target]") + if(do_after_cooldown(target, source)) + log_message("Started drilling [target]", LOG_MECHA) if(isturf(target)) var/turf/T = target - T.drill_act(src) - set_ready_state(TRUE) + T.drill_act(src, source) return - while(do_after_mecha(target, drill_delay)) + while(do_after_mecha(target, source, drill_delay)) if(isliving(target)) - drill_mob(target, chassis.occupant) - playsound(src,'sound/weapons/drill.ogg',40,1) + drill_mob(target, source) + playsound(src,'sound/weapons/drill.ogg',40,TRUE) else if(isobj(target)) var/obj/O = target O.take_damage(15, BRUTE, 0, FALSE, get_dir(chassis, target)) - playsound(src,'sound/weapons/drill.ogg',40,1) + playsound(src,'sound/weapons/drill.ogg',40,TRUE) else - set_ready_state(TRUE) return - set_ready_state(TRUE) + return ..() -/turf/proc/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill) +/turf/proc/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill, mob/user) return -/turf/closed/wall/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill) - if(drill.do_after_mecha(src, 60 / drill.drill_level)) - drill.mecha_log_message("Drilled through [src]") +/turf/closed/wall/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill, mob/user) + if(drill.do_after_mecha(src, user, 60 / drill.drill_level)) + drill.log_message("Drilled through [src]", LOG_MECHA) dismantle_wall(TRUE, FALSE) -/turf/closed/wall/r_wall/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill) +/turf/closed/wall/r_wall/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill, mob/user) if(drill.drill_level >= DRILL_HARDENED) - if(drill.do_after_mecha(src, 120 / drill.drill_level)) - drill.mecha_log_message("Drilled through [src]") + if(drill.do_after_mecha(src, user, 120 / drill.drill_level)) + drill.log_message("Drilled through [src]", LOG_MECHA) dismantle_wall(TRUE, FALSE) else - drill.occupant_message("[src] is too durable to drill through.") + to_chat(user, "[icon2html(src, user)][src] is too durable to drill through.") -/turf/closed/mineral/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill) +/turf/closed/mineral/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill, mob/user) for(var/turf/closed/mineral/M in range(drill.chassis,1)) if(get_dir(drill.chassis,M)&drill.chassis.dir) M.gets_drilled() - drill.mecha_log_message("Drilled through [src]") + drill.log_message("[user] drilled through [src]", LOG_MECHA) drill.move_ores() /turf/open/floor/plating/asteroid/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill) for(var/turf/open/floor/plating/asteroid/M in range(1, drill.chassis)) if((get_dir(drill.chassis,M)&drill.chassis.dir) && !M.dug) M.getDug() - drill.mecha_log_message("Drilled through [src]") + drill.log_message("Drilled through [src]", LOG_MECHA) drill.move_ores() /obj/item/mecha_parts/mecha_equipment/drill/proc/move_ores() - if(locate(/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp) in chassis.equipment && istype(chassis, /obj/mecha/working/ripley)) - var/obj/mecha/working/ripley/R = chassis //we could assume that it's a ripley because it has a clamp, but that's ~unsafe~ and ~bad practice~ + if(locate(/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp) in chassis.equipment && istype(chassis, /obj/vehicle/sealed/mecha/working/ripley)) + var/obj/vehicle/sealed/mecha/working/ripley/R = chassis //we could assume that it's a ripley because it has a clamp, but that's ~unsafe~ and ~bad practice~ R.collect_ore() -/obj/item/mecha_parts/mecha_equipment/drill/can_attach(obj/mecha/M as obj) +/obj/item/mecha_parts/mecha_equipment/drill/can_attach(obj/vehicle/sealed/mecha/M as obj) if(..()) - if(istype(M, /obj/mecha/working) || istype(M, /obj/mecha/combat)) - return 1 - return 0 + if(istype(M, /obj/vehicle/sealed/mecha/working) || istype(M, /obj/vehicle/sealed/mecha/combat)) + return TRUE + return FALSE -/obj/item/mecha_parts/mecha_equipment/drill/attach(obj/mecha/M) +/obj/item/mecha_parts/mecha_equipment/drill/attach(obj/vehicle/sealed/mecha/M) ..() var/datum/component/butchering/butchering = src.GetComponent(/datum/component/butchering) butchering.butchering_enabled = TRUE @@ -123,7 +121,7 @@ else //drill makes a hole var/obj/item/bodypart/target_part = target.get_bodypart(ran_zone(BODY_ZONE_CHEST)) - target.apply_damage(10, BRUTE, BODY_ZONE_CHEST, target.run_armor_check(target_part, "melee")) + target.apply_damage(10, BRUTE, BODY_ZONE_CHEST, target.run_armor_check(target_part, MELEE)) //blood splatters var/splatter_dir = get_dir(chassis, target) @@ -153,7 +151,7 @@ /obj/item/mecha_parts/mecha_equipment/mining_scanner name = "exosuit mining scanner" - desc = "Equipment for engineering and combat exosuits. It will automatically check surrounding rock for useful minerals." + desc = "Equipment for working exosuits. It will automatically check surrounding rock for useful minerals." icon_state = "mecha_analyzer" selectable = 0 equip_cooldown = 15 @@ -164,13 +162,19 @@ . = ..() START_PROCESSING(SSfastprocess, src) +/obj/item/mecha_parts/mecha_equipment/mining_scanner/can_attach(obj/vehicle/sealed/mecha/M as obj) + if(..()) + if(istype(M, /obj/vehicle/sealed/mecha/working)) + return TRUE + return FALSE + /obj/item/mecha_parts/mecha_equipment/mining_scanner/process() if(!loc) STOP_PROCESSING(SSfastprocess, src) qdel(src) - if(istype(loc, /obj/mecha/working) && scanning_time <= world.time) - var/obj/mecha/working/mecha = loc - if(!mecha.occupant) + if(istype(loc, /obj/vehicle/sealed/mecha/working) && scanning_time <= world.time) + var/obj/vehicle/sealed/mecha/working/mecha = loc + if(!mecha.occupants) return scanning_time = world.time + equip_cooldown mineral_scan_pulse(get_turf(src)) diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm similarity index 58% rename from code/game/mecha/equipment/tools/other_tools.dm rename to code/modules/vehicles/mecha/equipment/tools/other_tools.dm index e1861232f4..30642db926 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm @@ -10,15 +10,16 @@ icon_state = "mecha_teleport" equip_cooldown = 150 energy_drain = 1000 - range = RANGED + range = MECHA_RANGED + var/teleport_range = 7 -/obj/item/mecha_parts/mecha_equipment/teleporter/action(atom/target) +/obj/item/mecha_parts/mecha_equipment/teleporter/action(mob/source, atom/target, params) if(!action_checks(target) || is_centcom_level(loc.z)) return var/turf/T = get_turf(target) - if(T) + if(T && (loc.z == T.z) && (get_dist(loc, T) <= teleport_range)) do_teleport(chassis, T, 4, channel = TELEPORT_CHANNEL_BLUESPACE) - return 1 + return ..() @@ -30,10 +31,10 @@ icon_state = "mecha_wholegen" equip_cooldown = 50 energy_drain = 300 - range = RANGED + range = MECHA_RANGED -/obj/item/mecha_parts/mecha_equipment/wormhole_generator/action(atom/target) +/obj/item/mecha_parts/mecha_equipment/wormhole_generator/action(mob/source, atom/target, params) if(!action_checks(target) || is_centcom_level(loc.z)) return var/list/theareas = get_areas_in_range(100, chassis) @@ -44,10 +45,10 @@ var/turf/pos = get_turf(src) for(var/turf/T in get_area_turfs(thearea.type)) if(!T.density && pos.z == T.z) - var/clear = 1 + var/clear = TRUE for(var/obj/O in T) if(O.density) - clear = 0 + clear = FALSE break if(clear) L+=T @@ -58,11 +59,11 @@ return var/list/obj/effect/portal/created = create_portal_pair(get_turf(src), target_turf, 300, 1, /obj/effect/portal/anom) var/turf/T = get_turf(target) - message_admins("[ADMIN_LOOKUPFLW(chassis.occupant)] used a Wormhole Generator in [ADMIN_VERBOSEJMP(T)]") - log_game("[key_name(chassis.occupant)] used a Wormhole Generator in [AREACOORD(T)]") + message_admins("[ADMIN_LOOKUPFLW(source)] used a Wormhole Generator in [ADMIN_VERBOSEJMP(T)]") + log_game("[key_name(source)] used a Wormhole Generator in [AREACOORD(T)]") src = null QDEL_LIST_IN(created, rand(150,300)) - return 1 + return ..() /////////////////////////////////////// GRAVITATIONAL CATAPULT /////////////////////////////////////////// @@ -73,36 +74,41 @@ icon_state = "mecha_teleport" equip_cooldown = 10 energy_drain = 100 - range = MELEE|RANGED + range = MECHA_MELEE|MECHA_RANGED var/atom/movable/locked var/mode = 1 //1 - gravsling 2 - gravpush -/obj/item/mecha_parts/mecha_equipment/gravcatapult/action(atom/movable/target) +/obj/item/mecha_parts/mecha_equipment/gravcatapult/action(mob/source, atom/movable/target, params) if(!action_checks(target)) return switch(mode) if(1) if(!locked) if(!istype(target) || target.anchored || target.move_resist >= MOVE_FORCE_EXTREMELY_STRONG) - occupant_message("Unable to lock on [target]") + to_chat(source, "[icon2html(src, source)]Unable to lock on [target]!") return + if(ismob(target)) + var/mob/M = target + if(M.mob_negates_gravity()) + to_chat(source, "[icon2html(src, source)]Unable to lock on [target]!") + return locked = target - occupant_message("Locked on [target]") - send_byjax(chassis.occupant,"exosuit.browser","[REF(src)]",src.get_equip_info()) + to_chat(source, "[icon2html(src, source)]Locked on [target].") + send_byjax(source,"exosuit.browser","[REF(src)]",src.get_equip_info()) else if(target!=locked) if(locked in view(chassis)) var/turf/targ = get_turf(target) var/turf/orig = get_turf(locked) locked.throw_at(target, 14, 1.5) locked = null - send_byjax(chassis.occupant,"exosuit.browser","[REF(src)]",src.get_equip_info()) - log_game("[key_name(chassis.occupant)] used a Gravitational Catapult to throw [locked] (From [AREACOORD(orig)]) at [target] ([AREACOORD(targ)]).") - return TRUE + send_byjax(source,"exosuit.browser","[REF(src)]",src.get_equip_info()) + log_game("[key_name(source)] used a Gravitational Catapult to throw [locked] (From [AREACOORD(orig)]) at [target] ([AREACOORD(targ)]).") + return ..() else locked = null - occupant_message("Lock on [locked] disengaged.") - send_byjax(chassis.occupant,"exosuit.browser","[REF(src)]",src.get_equip_info()) + to_chat(source, "[icon2html(src, source)]Lock on [locked] disengaged.") + send_byjax(source,"exosuit.browser","[REF(src)]",src.get_equip_info()) if(2) var/list/atoms = list() if(isturf(target)) @@ -112,15 +118,21 @@ for(var/atom/movable/A in atoms) if(A.anchored || A.move_resist >= MOVE_FORCE_EXTREMELY_STRONG) continue - spawn(0) - var/iter = 5-get_dist(A,target) - for(var/i=0 to iter) - step_away(A,target) - sleep(2) - var/turf/T = get_turf(target) - log_game("[key_name(chassis.occupant)] used a Gravitational Catapult repulse wave on [AREACOORD(T)]") - return TRUE + if(ismob(A)) + var/mob/M = A + if(M.mob_negates_gravity()) + continue + INVOKE_ASYNC(src, .proc/do_scatter, A, target) + var/turf/T = get_turf(target) + log_game("[key_name(source)] used a Gravitational Catapult repulse wave on [AREACOORD(T)]") + return ..() + +/obj/item/mecha_parts/mecha_equipment/gravcatapult/proc/do_scatter(atom/movable/A, atom/movable/target) + var/iter = 5-get_dist(A,target) + for(var/i in 0 to iter) + step_away(A,target) + sleep(2) /obj/item/mecha_parts/mecha_equipment/gravcatapult/get_equip_info() return "[..()] [mode==1?"([locked||"Nothing"])":null] \[S|P\]" @@ -129,7 +141,7 @@ ..() if(href_list["mode"]) mode = text2num(href_list["mode"]) - send_byjax(chassis.occupant,"exosuit.browser","[REF(src)]",src.get_equip_info()) + send_byjax(chassis.occupants,"exosuit.browser","[REF(src)]",src.get_equip_info()) return @@ -150,9 +162,10 @@ selectable = 0 /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster/proc/attack_react() - if(action_checks(src)) - start_cooldown() - return 1 + if(energy_drain && !chassis.has_charge(energy_drain)) + return FALSE + TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_ARMOR, equip_cooldown) + return TRUE @@ -168,9 +181,10 @@ selectable = 0 /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster/proc/projectile_react() - if(action_checks(src)) - start_cooldown() - return 1 + if(energy_drain && !chassis.has_charge(energy_drain)) + return FALSE + TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_ARMOR, equip_cooldown) + return TRUE ////////////////////////////////// REPAIR DROID ////////////////////////////////////////////////// @@ -193,7 +207,7 @@ chassis.cut_overlay(droid_overlay) return ..() -/obj/item/mecha_parts/mecha_equipment/repair_droid/attach(obj/mecha/M as obj) +/obj/item/mecha_parts/mecha_equipment/repair_droid/attach(obj/vehicle/sealed/mecha/M) ..() droid_overlay = new(src.icon, icon_state = "repair_droid") M.add_overlay(droid_overlay) @@ -216,21 +230,18 @@ if(equip_ready) START_PROCESSING(SSobj, src) droid_overlay = new(src.icon, icon_state = "repair_droid_a") - mecha_log_message("Activated.") - set_ready_state(0) + log_message("Activated.", LOG_MECHA) else STOP_PROCESSING(SSobj, src) droid_overlay = new(src.icon, icon_state = "repair_droid") - mecha_log_message("Deactivated.") - set_ready_state(1) + log_message("Deactivated.", LOG_MECHA) chassis.add_overlay(droid_overlay) - send_byjax(chassis.occupant,"exosuit.browser","[REF(src)]",src.get_equip_info()) + send_byjax(chassis.occupants,"exosuit.browser", "[REF(src)]", get_equip_info()) /obj/item/mecha_parts/mecha_equipment/repair_droid/process() if(!chassis) STOP_PROCESSING(SSobj, src) - set_ready_state(1) return var/h_boost = health_boost var/repaired = 0 @@ -242,16 +253,14 @@ chassis.clearInternalDamage(int_dam_flag) repaired = 1 break - if(health_boost<0 || chassis.obj_integrity < chassis.max_integrity) - chassis.obj_integrity += min(health_boost, chassis.max_integrity-chassis.obj_integrity) + if(h_boost<0 || chassis.obj_integrity < chassis.max_integrity) + chassis.obj_integrity += min(h_boost, chassis.max_integrity-chassis.obj_integrity) repaired = 1 if(repaired) if(!chassis.use_power(energy_drain)) STOP_PROCESSING(SSobj, src) - set_ready_state(1) else //no repair needed, we turn off STOP_PROCESSING(SSobj, src) - set_ready_state(1) chassis.cut_overlay(droid_overlay) droid_overlay = new(src.icon, icon_state = "repair_droid") chassis.add_overlay(droid_overlay) @@ -284,12 +293,12 @@ if(equip_ready) //disabled return var/area/A = get_area(chassis) - var/pow_chan = get_MUTATION_POWER_channel(A) + var/pow_chan = GET_MUTATION_POWER_channel(A) if(pow_chan) return 1000 //making magic -/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/proc/get_MUTATION_POWER_channel(var/area/A) +/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/proc/GET_MUTATION_POWER_channel(area/A) var/pow_chan if(A) for(var/c in use_channels) @@ -303,12 +312,10 @@ if(href_list["toggle_relay"]) if(equip_ready) //inactive START_PROCESSING(SSobj, src) - set_ready_state(0) - mecha_log_message("Activated.") + log_message("Activated.", LOG_MECHA) else STOP_PROCESSING(SSobj, src) - set_ready_state(1) - mecha_log_message("Deactivated.") + log_message("Deactivated.", LOG_MECHA) /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/get_equip_info() if(!chassis) @@ -319,19 +326,17 @@ /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/process() if(!chassis || chassis.internal_damage & MECHA_INT_SHORT_CIRCUIT) STOP_PROCESSING(SSobj, src) - set_ready_state(1) return var/cur_charge = chassis.get_charge() if(isnull(cur_charge) || !chassis.cell) STOP_PROCESSING(SSobj, src) - set_ready_state(1) - occupant_message("No powercell detected.") + to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)]No power cell detected.") return if(cur_charge < chassis.cell.maxcharge) - var/area/A = get_base_area(chassis) + var/area/A = get_area(chassis) if(A) var/pow_chan - for(var/c in list(EQUIP,ENVIRON,LIGHT)) + for(var/c in use_channels) if(A.powered(c)) pow_chan = c break @@ -350,7 +355,7 @@ name = "exosuit plasma converter" desc = "An exosuit module that generates power using solid plasma as fuel. Pollutes the environment." icon_state = "tesla" - range = MELEE + range = MECHA_MELEE var/coeff = 100 var/obj/item/stack/sheet/fuel var/max_fuel = 150000 @@ -377,77 +382,54 @@ ..() if(href_list["toggle"]) if(equip_ready) //inactive - set_ready_state(0) START_PROCESSING(SSobj, src) - mecha_log_message("Activated.") + log_message("Activated.", LOG_MECHA) else - set_ready_state(1) STOP_PROCESSING(SSobj, src) - mecha_log_message("Deactivated.") + log_message("Deactivated.", LOG_MECHA) /obj/item/mecha_parts/mecha_equipment/generator/get_equip_info() var/output = ..() if(output) return "[output] \[[fuel]: [round(fuel.amount*MINERAL_MATERIAL_AMOUNT,0.1)] cm3\] - [equip_ready?"A":"Dea"]ctivate" -/obj/item/mecha_parts/mecha_equipment/generator/action(target) +/obj/item/mecha_parts/mecha_equipment/generator/action(mob/source, atom/movable/target, params) if(chassis) - var/result = load_fuel(target) - if(result) - send_byjax(chassis.occupant,"exosuit.browser","[REF(src)]",src.get_equip_info()) + if(load_fuel(target, source)) + send_byjax(chassis.occupants,"exosuit.browser","[REF(src)]",src.get_equip_info()) + return ..() -/obj/item/mecha_parts/mecha_equipment/generator/proc/load_fuel(var/obj/item/stack/sheet/P) +/obj/item/mecha_parts/mecha_equipment/generator/proc/load_fuel(obj/item/stack/sheet/P, mob/user) if(P.type == fuel.type && P.amount > 0) var/to_load = max(max_fuel - fuel.amount*MINERAL_MATERIAL_AMOUNT,0) if(to_load) var/units = min(max(round(to_load / MINERAL_MATERIAL_AMOUNT),1),P.amount) fuel.amount += units P.use(units) - occupant_message("[units] unit\s of [fuel] successfully loaded.") + to_chat(user, "[icon2html(src, user)][units] unit\s of [fuel] successfully loaded.") return units else - occupant_message("Unit is full.") + to_chat(user, "[icon2html(src, user)]Unit is full.") return 0 else - occupant_message("[fuel] traces in target minimal! [P] cannot be used as fuel.") + to_chat(user, "[icon2html(src, user)][fuel] traces in target minimal! [P] cannot be used as fuel.") return /obj/item/mecha_parts/mecha_equipment/generator/attackby(weapon,mob/user, params) load_fuel(weapon) -/obj/item/mecha_parts/mecha_equipment/generator/critfail() - ..() - var/turf/open/T = get_turf(src) - if(!istype(T)) - return - var/datum/gas_mixture/GM = new - if(prob(10)) - GM.adjust_moles(GAS_PLASMA,100) - GM.set_temperature(1500+T0C) //should be enough to start a fire - T.visible_message("[src] suddenly disgorges a cloud of heated plasma.") - qdel(src) - else - GM.adjust_moles(GAS_PLASMA,5) - GM.set_temperature(istype(T) ? T.air.return_temperature() : T20C) - T.visible_message("[src] suddenly disgorges a cloud of plasma.") - T.assume_air(GM) - return - /obj/item/mecha_parts/mecha_equipment/generator/process() if(!chassis) STOP_PROCESSING(SSobj, src) - set_ready_state(1) return if(fuel.amount<=0) STOP_PROCESSING(SSobj, src) - mecha_log_message("Deactivated - no fuel.") - set_ready_state(1) + log_message("Deactivated - no fuel.", LOG_MECHA) return var/cur_charge = chassis.get_charge() if(isnull(cur_charge)) - set_ready_state(1) - occupant_message("No powercell detected.") - mecha_log_message("Deactivated.") + to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)]No power cell detected.") + log_message("Deactivated.", LOG_MECHA) STOP_PROCESSING(SSobj, src) return var/use_fuel = fuel_per_cycle_idle @@ -456,7 +438,7 @@ chassis.give_power(power_per_cycle) fuel.amount -= min(use_fuel/MINERAL_MATERIAL_AMOUNT,fuel.amount) update_equip_info() - return 1 + return TRUE /obj/item/mecha_parts/mecha_equipment/generator/nuclear @@ -472,9 +454,118 @@ /obj/item/mecha_parts/mecha_equipment/generator/nuclear/generator_init() fuel = new /obj/item/stack/sheet/mineral/uranium(src, 0) -/obj/item/mecha_parts/mecha_equipment/generator/nuclear/critfail() - return - /obj/item/mecha_parts/mecha_equipment/generator/nuclear/process() if(..()) radiation_pulse(get_turf(src), rad_per_cycle) + + +/////////////////////////////////////////// THRUSTERS ///////////////////////////////////////////// + +/obj/item/mecha_parts/mecha_equipment/thrusters + name = "generic exosuit thrusters" //parent object, in-game sources will be a child object + desc = "A generic set of thrusters, from an unknown source. Uses not-understood methods to propel exosuits seemingly for free." + icon_state = "thrusters" + selectable = FALSE + var/effect_type = /obj/effect/particle_effect/sparks + +/obj/item/mecha_parts/mecha_equipment/thrusters/try_attach_part(mob/user, obj/vehicle/sealed/mecha/M) + for(var/obj/item/I in M.equipment) + if(istype(I, src)) + to_chat(user, "[M] already has this thruster package!") + return FALSE + . = ..() + +/obj/item/mecha_parts/mecha_equipment/thrusters/attach(obj/vehicle/sealed/mecha/M) + M.active_thrusters = src //Enable by default + . = ..() + +/obj/item/mecha_parts/mecha_equipment/thrusters/detach() + if(chassis?.active_thrusters == src) + chassis.active_thrusters = null + . = ..() + +/obj/item/mecha_parts/mecha_equipment/thrusters/Destroy() + if(chassis?.active_thrusters == src) + chassis.active_thrusters = null + . = ..() + +/obj/item/mecha_parts/mecha_equipment/thrusters/Topic(href,href_list) + ..() + if(!chassis) + return + if(href_list["mode"]) + var/mode = text2num(href_list["mode"]) + switch(mode) + if(0) + enable() + if(1) + disable() + return + +/obj/item/mecha_parts/mecha_equipment/thrusters/proc/enable() + if (chassis.active_thrusters == src) + return + chassis.active_thrusters = src + to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][src] enabled.") + +/obj/item/mecha_parts/mecha_equipment/thrusters/proc/disable() + if(chassis.active_thrusters != src) + return + chassis.active_thrusters = null + to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][src] disabled.") + +/obj/item/mecha_parts/mecha_equipment/thrusters/get_equip_info() + return "[..()] \[Enable|Disable\]" + +/obj/item/mecha_parts/mecha_equipment/thrusters/proc/thrust(movement_dir) + if(!chassis) + return FALSE + generate_effect(movement_dir) + return TRUE //This parent should never exist in-game outside admeme use, so why not let it be a creative thruster? + +/obj/item/mecha_parts/mecha_equipment/thrusters/proc/generate_effect(movement_dir) + var/obj/effect/particle_effect/E = new effect_type(get_turf(chassis)) + E.dir = turn(movement_dir, 180) + step(E, turn(movement_dir, 180)) + QDEL_IN(E, 5) + + +/obj/item/mecha_parts/mecha_equipment/thrusters/gas + name = "RCS thruster package" + desc = "A set of thrusters that allow for exosuit movement in zero-gravity environments, by expelling gas from the internal life support tank." + effect_type = /obj/effect/particle_effect/smoke + var/move_cost = 20 //moles per step + +/obj/item/mecha_parts/mecha_equipment/thrusters/gas/try_attach_part(mob/user, obj/vehicle/sealed/mecha/M) + if(!M.internal_tank) + to_chat(user, "[M] does not have an internal tank and cannot support this upgrade!") + return FALSE + . = ..() + +/obj/item/mecha_parts/mecha_equipment/thrusters/gas/thrust(movement_dir) + if(!chassis || !chassis.internal_tank) + return FALSE + var/moles = chassis.internal_tank.air_contents.total_moles() + if(moles < move_cost) + chassis.internal_tank.air_contents.remove(moles) + return FALSE + chassis.internal_tank.air_contents.remove(move_cost) + generate_effect(movement_dir) + return TRUE + + + +/obj/item/mecha_parts/mecha_equipment/thrusters/ion //for mechs with built-in thrusters, should never really exist un-attached to a mech + name = "Ion thruster package" + desc = "A set of thrusters that allow for exosuit movement in zero-gravity environments." + detachable = FALSE + salvageable = FALSE + effect_type = /obj/effect/particle_effect/ion_trails + +/obj/item/mecha_parts/mecha_equipment/thrusters/ion/thrust(movement_dir) + if(!chassis) + return FALSE + if(chassis.use_power(chassis.step_energy_drain)) + generate_effect(movement_dir) + return TRUE + return FALSE diff --git a/code/modules/vehicles/mecha/equipment/tools/weapon_bay.dm b/code/modules/vehicles/mecha/equipment/tools/weapon_bay.dm new file mode 100644 index 0000000000..469d430328 --- /dev/null +++ b/code/modules/vehicles/mecha/equipment/tools/weapon_bay.dm @@ -0,0 +1,14 @@ +/obj/item/mecha_parts/concealed_weapon_bay + name = "concealed weapon bay" + desc = "A compartment that allows a non-combat mecha to equip one weapon while hiding the weapon from plain sight." + icon = 'icons/mecha/mecha_equipment.dmi' + icon_state = "mecha_weapon_bay" + +/obj/item/mecha_parts/concealed_weapon_bay/try_attach_part(mob/user, obj/vehicle/sealed/mecha/M) + if(istype(M, /obj/vehicle/sealed/mecha/combat)) + to_chat(user, "[M] can already hold weapons!") + return + if(locate(/obj/item/mecha_parts/concealed_weapon_bay) in M.contents) + to_chat(user, "[M] already has a concealed weapon bay!") + return + ..() diff --git a/code/modules/vehicles/mecha/equipment/tools/work_tools.dm b/code/modules/vehicles/mecha/equipment/tools/work_tools.dm new file mode 100644 index 0000000000..d3d4c8addc --- /dev/null +++ b/code/modules/vehicles/mecha/equipment/tools/work_tools.dm @@ -0,0 +1,410 @@ + +//Hydraulic clamp, Kill clamp, Extinguisher, RCD, Cable layer. + + +/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp + name = "hydraulic clamp" + desc = "Equipment for engineering exosuits. Lifts objects and loads them into cargo." + icon_state = "mecha_clamp" + equip_cooldown = 15 + energy_drain = 10 + tool_behaviour = TOOL_RETRACTOR + range = MECHA_MELEE + toolspeed = 0.8 + var/dam_force = 20 + var/obj/vehicle/sealed/mecha/working/ripley/cargo_holder + harmful = TRUE + mech_flags = EXOSUIT_MODULE_RIPLEY + +/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/can_attach(obj/vehicle/sealed/mecha/working/ripley/M) + if(..()) + if(istype(M)) + return 1 + return 0 + +/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/attach(obj/vehicle/sealed/mecha/M) + ..() + cargo_holder = M + return + +/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/detach(atom/moveto = null) + ..() + cargo_holder = null + +/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/action(mob/source, atom/target, params) + if(!action_checks(target)) + return + if(!cargo_holder) + return + if(ismecha(target)) + var/obj/vehicle/sealed/mecha/M = target + var/have_ammo + for(var/obj/item/mecha_ammo/box in cargo_holder.cargo) + if(istype(box, /obj/item/mecha_ammo) && box.rounds) + have_ammo = TRUE + if(M.ammo_resupply(box, source, TRUE)) + return + if(have_ammo) + to_chat(source, "No further supplies can be provided to [M].") + else + to_chat(source, "No providable supplies found in cargo hold") + return + if(isobj(target)) + var/obj/O = target + if(istype(O, /obj/machinery/door/firedoor)) + var/obj/machinery/door/firedoor/D = O + D.try_to_crowbar(src, source) + return + if(istype(O, /obj/machinery/door/airlock/)) + var/obj/machinery/door/airlock/D = O + D.try_to_crowbar(src, source) + return + if(!O.anchored) + if(cargo_holder.cargo.len < cargo_holder.cargo_capacity) + chassis.visible_message("[chassis] lifts [target] and starts to load it into cargo compartment.") + O.set_anchored(TRUE) + if(do_after_cooldown(target, source)) + cargo_holder.cargo += O + O.forceMove(chassis) + O.set_anchored(FALSE) + to_chat(source, "[icon2html(src, source)][target] successfully loaded.") + log_message("Loaded [O]. Cargo compartment capacity: [cargo_holder.cargo_capacity - cargo_holder.cargo.len]", LOG_MECHA) + else + O.set_anchored(initial(O.anchored)) + else + to_chat(source, "[icon2html(src, source)]Not enough room in cargo compartment!") + else + to_chat(source, "[icon2html(src, source)][target] is firmly secured!") + + else if(isliving(target)) + var/mob/living/M = target + if(M.stat == DEAD) + return + if(source.a_intent == INTENT_HARM) + M.take_overall_damage(dam_force) + if(!M) + return + M.adjustOxyLoss(round(dam_force/2)) + M.updatehealth() + target.visible_message("[chassis] squeezes [target]!", \ + "[chassis] squeezes you!",\ + "You hear something crack.") + log_combat(source, M, "attacked", "[name]", "(INTENT: [uppertext(source.a_intent)]) (DAMTYPE: [uppertext(damtype)])") + else + step_away(M,chassis) + to_chat(source, "[icon2html(src, source)]You push [target] out of the way.") + chassis.visible_message("[chassis] pushes [target] out of the way.") + return ..() + + + +//This is pretty much just for the death-ripley +/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/kill + name = "\improper KILL CLAMP" + desc = "They won't know what clamped them!" + energy_drain = 0 + dam_force = 0 + var/real_clamp = FALSE + +/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/kill/real + desc = "They won't know what clamped them! This time for real!" + energy_drain = 10 + dam_force = 20 + real_clamp = TRUE + +/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/kill/action(mob/source, atom/target, params) + if(!action_checks(target)) + return + if(!cargo_holder) + return + if(isobj(target)) + var/obj/O = target + if(!O.anchored) + if(cargo_holder.cargo.len < cargo_holder.cargo_capacity) + chassis.visible_message("[chassis] lifts [target] and starts to load it into cargo compartment.") + O.set_anchored(TRUE) + if(do_after_cooldown(target, source)) + cargo_holder.cargo += O + O.forceMove(chassis) + O.set_anchored(FALSE) + to_chat(source, "[icon2html(src, source)][target] successfully loaded.") + log_message("Loaded [O]. Cargo compartment capacity: [cargo_holder.cargo_capacity - cargo_holder.cargo.len]", LOG_MECHA) + else + O.set_anchored(initial(O.anchored)) + else + to_chat(source, "[icon2html(src, source)]Not enough room in cargo compartment!") + else + to_chat(source, "[icon2html(src, source)][target] is firmly secured!") + + else if(isliving(target)) + var/mob/living/M = target + if(M.stat == DEAD) + return + if(source.a_intent == INTENT_HARM) + if(real_clamp) + M.take_overall_damage(dam_force) + if(!M) + return + M.adjustOxyLoss(round(dam_force/2)) + M.updatehealth() + target.visible_message("[chassis] destroys [target] in an unholy fury!", \ + "[chassis] destroys you in an unholy fury!") + log_combat(source, M, "attacked", "[name]", "(INTENT: [uppertext(source.a_intent)]) (DAMTYPE: [uppertext(damtype)])") + else + target.visible_message("[chassis] destroys [target] in an unholy fury!", \ + "[chassis] destroys you in an unholy fury!") + else if(source.a_intent == INTENT_DISARM) + if(real_clamp) + var/mob/living/carbon/C = target + var/play_sound = FALSE + var/limbs_gone = "" + var/obj/item/bodypart/affected = C.get_bodypart(BODY_ZONE_L_ARM) + if(affected != null) + affected.dismember(damtype) + play_sound = TRUE + limbs_gone = ", [affected]" + affected = C.get_bodypart(BODY_ZONE_R_ARM) + if(affected != null) + affected.dismember(damtype) + play_sound = TRUE + limbs_gone = "[limbs_gone], [affected]" + if(play_sound) + playsound(src, get_dismember_sound(), 80, TRUE) + target.visible_message("[chassis] rips [target]'s arms off!", \ + "[chassis] rips your arms off!") + log_combat(source, M, "dismembered of[limbs_gone],", "[name]", "(INTENT: [uppertext(source.a_intent)]) (DAMTYPE: [uppertext(damtype)])") + else + target.visible_message("[chassis] rips [target]'s arms off!", \ + "[chassis] rips your arms off!") + else + step_away(M,chassis) + target.visible_message("[chassis] tosses [target] like a piece of paper!", \ + "[chassis] tosses you like a piece of paper!") + return ..() + + + +/obj/item/mecha_parts/mecha_equipment/extinguisher + name = "exosuit extinguisher" + desc = "Equipment for engineering exosuits. A rapid-firing high capacity fire extinguisher." + icon_state = "mecha_exting" + equip_cooldown = 5 + energy_drain = 0 + range = MECHA_MELEE|MECHA_RANGED + mech_flags = EXOSUIT_MODULE_WORKING + +/obj/item/mecha_parts/mecha_equipment/extinguisher/Initialize() + . = ..() + create_reagents(1000) + reagents.add_reagent(/datum/reagent/water, 1000) + +/obj/item/mecha_parts/mecha_equipment/extinguisher/action(mob/source, atom/target, params) //copypasted from extinguisher. TODO: Rewrite from scratch.//Still todo + if(!action_checks(target) || get_dist(chassis, target)>3) + return + + if(istype(target, /obj/structure/reagent_dispensers/watertank) && get_dist(chassis,target) <= 1) + var/obj/structure/reagent_dispensers/watertank/WT = target + WT.reagents.trans_to(src, 1000) + to_chat(chassis.occupants,"Extinguisher refilled.") + playsound(chassis, 'sound/effects/refill.ogg', 50, 1, -6) + else + if(reagents.total_volume > 0) + playsound(chassis, 'sound/effects/extinguish.ogg', 75, 1, -3) + var/direction = get_dir(chassis,target) + var/turf/T = get_turf(target) + var/turf/T1 = get_step(T,turn(direction, 90)) + var/turf/T2 = get_step(T,turn(direction, -90)) + + var/list/the_targets = list(T,T1,T2) + spawn(0) + for(var/a=0, a<5, a++) + var/obj/effect/particle_effect/water/W = new /obj/effect/particle_effect/water(get_turf(chassis)) + if(!W) + return + var/turf/my_target = pick(the_targets) + var/datum/reagents/R = new/datum/reagents(5) + W.reagents = R + R.my_atom = W + reagents.trans_to(W,1) + for(var/b=0, b<4, b++) + if(!W) + return + step_towards(W,my_target) + if(!W) + return + var/turf/W_turf = get_turf(W) + W.reagents.reaction(W_turf) + for(var/atom/atm in W_turf) + W.reagents.reaction(atm) + if(W.loc == my_target) + break + sleep(2) + return 1 + +/obj/item/mecha_parts/mecha_equipment/extinguisher/get_equip_info() + return "[..()] \[[src.reagents.total_volume]\]" + +/obj/item/mecha_parts/mecha_equipment/extinguisher/can_attach(obj/vehicle/sealed/mecha/working/M as obj) + if(..()) + if(istype(M)) + return 1 + return 0 + + + +/obj/item/mecha_parts/mecha_equipment/rcd + name = "mounted RCD" + desc = "An exosuit-mounted Rapid Construction Device." + icon_state = "mecha_rcd" + equip_cooldown = 10 + energy_drain = 250 + range = MECHA_MELEE|MECHA_RANGED + item_flags = NO_MAT_REDEMPTION + var/mode = 0 //0 - deconstruct, 1 - wall or floor, 2 - airlock. + +/obj/item/mecha_parts/mecha_equipment/rcd/Initialize() + . = ..() + GLOB.rcd_list += src + +/obj/item/mecha_parts/mecha_equipment/rcd/Destroy() + GLOB.rcd_list -= src + return ..() + +/obj/item/mecha_parts/mecha_equipment/rcd/action(mob/source, atom/target, params) + if(istype(target, /turf/open/space/transit))//>implying these are ever made -Sieve + return + + if(!isturf(target) && !istype(target, /obj/machinery/door/airlock)) + target = get_turf(target) + if(!action_checks(target) || get_dist(chassis, target)>3) + return + playsound(chassis, 'sound/machines/click.ogg', 50, TRUE) + + switch(mode) + if(0) + if(iswallturf(target)) + var/turf/closed/wall/W = target + to_chat(source, "[icon2html(src, source)]Deconstructing [W]...") + if(do_after_cooldown(W, source)) + chassis.spark_system.start() + W.ScrapeAway(flags = CHANGETURF_INHERIT_AIR) + playsound(W, 'sound/items/deconstruct.ogg', 50, TRUE) + else if(isfloorturf(target)) + var/turf/open/floor/F = target + to_chat(source, "[icon2html(src, source)]Deconstructing [F]...") + if(do_after_cooldown(target, source)) + chassis.spark_system.start() + F.ScrapeAway(flags = CHANGETURF_INHERIT_AIR) + playsound(F, 'sound/items/deconstruct.ogg', 50, TRUE) + else if (istype(target, /obj/machinery/door/airlock)) + to_chat(source, "[icon2html(src, source)]Deconstructing [target]...") + if(do_after_cooldown(target, source)) + chassis.spark_system.start() + qdel(target) + playsound(target, 'sound/items/deconstruct.ogg', 50, TRUE) + if(1) + if(isspaceturf(target)) + var/turf/open/space/S = target + to_chat(source, "[icon2html(src, source)]Building Floor...") + if(do_after_cooldown(S, source)) + S.PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) + playsound(S, 'sound/items/deconstruct.ogg', 50, TRUE) + chassis.spark_system.start() + else if(isfloorturf(target)) + var/turf/open/floor/F = target + to_chat(source, "[icon2html(src, source)]Building Wall...") + if(do_after_cooldown(F, source)) + F.PlaceOnTop(/turf/closed/wall) + playsound(F, 'sound/items/deconstruct.ogg', 50, TRUE) + chassis.spark_system.start() + if(2) + if(isfloorturf(target)) + to_chat(source, "[icon2html(src, source)]Building Airlock...") + if(do_after_cooldown(target, source)) + chassis.spark_system.start() + var/obj/machinery/door/airlock/T = new /obj/machinery/door/airlock(target) + T.autoclose = TRUE + playsound(target, 'sound/items/deconstruct.ogg', 50, TRUE) + playsound(target, 'sound/effects/sparks2.ogg', 50, TRUE) + return ..() + +/obj/item/mecha_parts/mecha_equipment/rcd/Topic(href,href_list) + ..() + if(href_list["mode"]) + mode = text2num(href_list["mode"]) + switch(mode) + if(0) + to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)]Switched RCD to Deconstruct.") + energy_drain = initial(energy_drain) + if(1) + to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)]Switched RCD to Construct.") + energy_drain = 2*initial(energy_drain) + if(2) + to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)]Switched RCD to Construct Airlock.") + energy_drain = 2*initial(energy_drain) + return + +/obj/item/mecha_parts/mecha_equipment/rcd/get_equip_info() + return "[..()] \[D|C|A\]" + +//Dunno where else to put this so shrug +/obj/item/mecha_parts/mecha_equipment/ripleyupgrade + name = "Ripley MK-II Conversion Kit" + desc = "A pressurized canopy attachment kit for an Autonomous Power Loader Unit \"Ripley\" MK-I mecha, to convert it to the slower, but space-worthy MK-II design. This kit cannot be removed, once applied." + icon_state = "tesla" + mech_flags = EXOSUIT_MODULE_RIPLEY + +/obj/item/mecha_parts/mecha_equipment/ripleyupgrade/can_attach(obj/vehicle/sealed/mecha/working/ripley/M) + if(M.type != /obj/vehicle/sealed/mecha/working/ripley) + to_chat(loc, "This conversion kit can only be applied to APLU MK-I models.") + return FALSE + if(M.cargo.len) + to_chat(loc, "[M]'s cargo hold must be empty before this conversion kit can be applied.") + return FALSE + if(!(M.mecha_flags & ADDING_MAINT_ACCESS_POSSIBLE)) //non-removable upgrade, so lets make sure the pilot or owner has their say. + to_chat(loc, "[M] must have maintenance protocols active in order to allow this conversion kit.") + return FALSE + if(LAZYLEN(M.occupants)) //We're actualy making a new mech and swapping things over, it might get weird if players are involved + to_chat(loc, "[M] must be unoccupied before this conversion kit can be applied.") + return FALSE + if(!M.cell) //Turns out things break if the cell is missing + to_chat(loc, "The conversion process requires a cell installed.") + return FALSE + return TRUE + +/obj/item/mecha_parts/mecha_equipment/ripleyupgrade/attach(obj/vehicle/sealed/mecha/M) + var/obj/vehicle/sealed/mecha/working/ripley/mkii/N = new /obj/vehicle/sealed/mecha/working/ripley/mkii(get_turf(M),1) + if(!N) + return + QDEL_NULL(N.cell) + if (M.cell) + N.cell = M.cell + M.cell.forceMove(N) + M.cell = null + QDEL_NULL(N.scanmod) + if (M.scanmod) + N.scanmod = M.scanmod + M.scanmod.forceMove(N) + M.scanmod = null + QDEL_NULL(N.capacitor) + if (M.capacitor) + N.capacitor = M.capacitor + M.capacitor.forceMove(N) + M.capacitor = null + N.update_part_values() + for(var/obj/item/mecha_parts/E in M.contents) + if(istype(E, /obj/item/mecha_parts/concealed_weapon_bay)) //why is the bay not just a variable change who did this + E.forceMove(N) + for(var/obj/item/mecha_parts/mecha_equipment/E in M.equipment) //Move the equipment over... + E.detach(M) + E.attach(N) + N.dna_lock = M.dna_lock + N.mecha_flags = M.mecha_flags + N.strafe = M.strafe + N.obj_integrity = M.obj_integrity //This is not a repair tool + if (M.name != "\improper APLU MK-I \"Ripley\"") + N.name = M.name + M.wreckage = 0 + qdel(M) + playsound(get_turf(N),'sound/items/ratchet.ogg',50,TRUE) + return diff --git a/code/game/mecha/equipment/weapons/mecha_ammo.dm b/code/modules/vehicles/mecha/equipment/weapons/mecha_ammo.dm similarity index 94% rename from code/game/mecha/equipment/weapons/mecha_ammo.dm rename to code/modules/vehicles/mecha/equipment/weapons/mecha_ammo.dm index 3253e6cbd6..edc2b4716e 100644 --- a/code/game/mecha/equipment/weapons/mecha_ammo.dm +++ b/code/modules/vehicles/mecha/equipment/weapons/mecha_ammo.dm @@ -9,7 +9,7 @@ var/rounds = 0 var/round_term = "round" var/direct_load //For weapons where we re-load the weapon itself rather than adding to the ammo storage. - var/load_audio = "sound/weapons/gun_magazine_insert_empty_1.ogg" + var/load_audio = 'sound/weapons/bulletinsert.ogg' var/ammo_type /obj/item/mecha_ammo/update_name() @@ -62,7 +62,7 @@ rounds = 6 round_term = "missile" direct_load = TRUE - load_audio = "sound/weapons/bulletinsert.ogg" + load_audio = 'sound/weapons/bulletinsert.ogg' ammo_type = "missiles_br" /obj/item/mecha_ammo/missiles_he @@ -72,7 +72,7 @@ rounds = 8 round_term = "missile" direct_load = TRUE - load_audio = "sound/weapons/bulletinsert.ogg" + load_audio = 'sound/weapons/bulletinsert.ogg' ammo_type = "missiles_he" diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/modules/vehicles/mecha/equipment/weapons/weapons.dm similarity index 70% rename from code/game/mecha/equipment/weapons/weapons.dm rename to code/modules/vehicles/mecha/equipment/weapons/weapons.dm index a9d7853187..1f1211a3a4 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/modules/vehicles/mecha/equipment/weapons/weapons.dm @@ -1,76 +1,61 @@ /obj/item/mecha_parts/mecha_equipment/weapon name = "mecha weapon" - range = RANGED + range = MECHA_RANGED + destroy_sound = 'sound/mecha/weapdestr.ogg' var/projectile var/fire_sound var/projectiles_per_shot = 1 var/variance = 0 - var/randomspread = 0 //use random spread for machineguns, instead of shotgun scatter + var/randomspread = FALSE //use random spread for machineguns, instead of shotgun scatter var/projectile_delay = 0 var/firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect //the visual effect appearing when the weapon is fired. var/kickback = TRUE //Will using this weapon in no grav push mecha back. mech_flags = EXOSUIT_MODULE_COMBAT -/obj/item/mecha_parts/mecha_equipment/weapon/can_attach(obj/mecha/combat/M) - if(..()) - if(istype(M)) - return 1 - return 0 +/obj/item/mecha_parts/mecha_equipment/weapon/can_attach(obj/vehicle/sealed/mecha/M) + if(!..()) + return FALSE + if(istype(M, /obj/vehicle/sealed/mecha/combat)) + return TRUE + if((locate(/obj/item/mecha_parts/concealed_weapon_bay) in M.contents) && !(locate(/obj/item/mecha_parts/mecha_equipment/weapon) in M.equipment)) + return TRUE + return FALSE -/obj/item/mecha_parts/mecha_equipment/weapon/proc/get_shot_amount() - return projectiles_per_shot - -/obj/item/mecha_parts/mecha_equipment/weapon/action(atom/target, params) +/obj/item/mecha_parts/mecha_equipment/weapon/action(mob/source, atom/target, params) if(!action_checks(target)) - return 0 - - var/turf/curloc = get_turf(chassis) - var/turf/targloc = get_turf(target) - if (!targloc || !istype(targloc) || !curloc) - return 0 - if (targloc == curloc) - return 0 - - set_ready_state(0) - for(var/i=1 to get_shot_amount()) - var/obj/item/projectile/A = new projectile(curloc) - A.firer = chassis.occupant - A.original = target - if(!A.suppressed && firing_effect_type) - new firing_effect_type(get_turf(src), chassis.dir) - + return FALSE + var/newtonian_target = turn(chassis.dir,180) + . = ..()//start the cooldown early because of sleeps + for(var/i in 1 to projectiles_per_shot) + if(energy_drain && !chassis.has_charge(energy_drain))//in case we run out of energy mid-burst, such as emp + break var/spread = 0 if(variance) if(randomspread) spread = round((rand() - 0.5) * variance) else spread = round((i / projectiles_per_shot - 0.5) * variance) - A.preparePixelProjectile(target, chassis.occupant, params, spread) + + var/obj/item/projectile/A = new projectile(get_turf(src)) + A.preparePixelProjectile(target, source, params, spread) A.fire() - playsound(chassis, fire_sound, 50, 1) + if(!A.suppressed && firing_effect_type) + new firing_effect_type(get_turf(src), chassis.dir) + playsound(chassis, fire_sound, 50, TRUE) sleep(max(0, projectile_delay)) - if(kickback) - chassis.newtonian_move(turn(chassis.dir,180)) - chassis.mecha_log_message("Fired from [src.name], targeting [target].") - return 1 - + if(kickback) + chassis.newtonian_move(newtonian_target) + chassis.log_message("Fired from [src.name], targeting [target].", LOG_MECHA) + return ..() //Base energy weapon type /obj/item/mecha_parts/mecha_equipment/weapon/energy name = "general energy weapon" firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy -/obj/item/mecha_parts/mecha_equipment/weapon/energy/get_shot_amount() - return min(round(chassis.cell.charge / energy_drain), projectiles_per_shot) - -/obj/item/mecha_parts/mecha_equipment/weapon/energy/start_cooldown() - set_ready_state(0) - chassis.use_power(energy_drain*get_shot_amount()) - addtimer(CALLBACK(src, .proc/set_ready_state, 1), equip_cooldown) - /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser equip_cooldown = 8 name = "\improper CH-PS \"Immolator\" laser" @@ -81,6 +66,15 @@ fire_sound = 'sound/weapons/laser.ogg' harmful = TRUE +/obj/item/mecha_parts/mecha_equipment/weapon/energy/disabler + equip_cooldown = 8 + name = "\improper CH-DS \"Peacemaker\" disabler" + desc = "A weapon for combat exosuits. Shoots basic disablers." + icon_state = "mecha_disabler" + energy_drain = 30 + projectile = /obj/item/projectile/beam/disabler + fire_sound = 'sound/weapons/taser2.ogg' + /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy equip_cooldown = 15 name = "\improper CH-LC \"Solaris\" laser cannon" @@ -97,7 +91,7 @@ icon_state = "mecha_ion" energy_drain = 120 projectile = /obj/item/projectile/ion - fire_sound = 'sound/weapons/IonRifle.ogg' + fire_sound = 'sound/weapons/laser.ogg' /obj/item/mecha_parts/mecha_equipment/weapon/energy/tesla equip_cooldown = 35 @@ -124,7 +118,6 @@ name = "217-D Heavy Plasma Cutter" desc = "A device that shoots resonant plasma bursts at extreme velocity. The blasts are capable of crushing rock and demolishing solid obstacles." icon_state = "mecha_plasmacutter" - item_state = "plasmacutter" lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' energy_drain = 30 @@ -132,12 +125,12 @@ fire_sound = 'sound/weapons/plasma_cutter.ogg' harmful = TRUE -/obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma/can_attach(obj/mecha/working/M) +/obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma/can_attach(obj/vehicle/sealed/mecha/M) if(..()) //combat mech - return 1 - else if(M.equipment.len < M.max_equip && istype(M)) - return 1 - return 0 + return TRUE + else if(LAZYLEN(M.equipment) < M.max_equip) + return TRUE + return FALSE /obj/item/mecha_parts/mecha_equipment/weapon/energy/taser name = "\improper PBT \"Pacifier\" mounted taser" @@ -155,47 +148,53 @@ icon_state = "mecha_honker" energy_drain = 200 equip_cooldown = 150 - range = MELEE|RANGED + range = MECHA_MELEE|MECHA_RANGED kickback = FALSE + mech_flags = EXOSUIT_MODULE_HONK -/obj/item/mecha_parts/mecha_equipment/weapon/honker/can_attach(obj/mecha/combat/honker/M) - if(..()) - if(istype(M)) - return 1 - return 0 +/obj/item/mecha_parts/mecha_equipment/weapon/honker/can_attach(obj/vehicle/sealed/mecha/mecha) + . = ..() + if(!.) + return + if(!istype(mecha, /obj/vehicle/sealed/mecha/combat/honker)) + return FALSE -/obj/item/mecha_parts/mecha_equipment/weapon/honker/action(target, params) + +/obj/item/mecha_parts/mecha_equipment/weapon/honker/action(mob/source, atom/target, params) if(!action_checks(target)) return - playsound(chassis, 'sound/items/airhorn.ogg', 100, 1) - chassis.occupant_message("HONK") + playsound(chassis, 'sound/items/airhorn.ogg', 100, TRUE) + to_chat(source, "[icon2html(src, source)]HONK") for(var/mob/living/carbon/M in ohearers(6, chassis)) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(istype(H.ears, /obj/item/clothing/ears/earmuffs)) - continue + if(!M.can_hear()) + continue + var/turf/turf_check = get_turf(M) + if(isspaceturf(turf_check) && !turf_check.Adjacent(src)) //in space nobody can hear you honk. + continue to_chat(M, "HONK") M.SetSleeping(0) M.stuttering += 20 - M.adjustEarDamage(0, 30) - M.DefaultCombatKnockdown(60) + var/obj/item/organ/ears/ears = M.getorganslot(ORGAN_SLOT_EARS) + if(ears) + ears.adjustEarDamage(0, 30) + M.Paralyze(60) if(prob(30)) M.Stun(200) M.Unconscious(80) else M.Jitter(500) - mecha_log_message("Honked from [src.name]. HONK!") + log_message("Honked from [src.name]. HONK!", LOG_MECHA) var/turf/T = get_turf(src) - message_admins("[ADMIN_LOOKUPFLW(chassis.occupant)] used a Mecha Honker in [ADMIN_VERBOSEJMP(T)]") - log_game("[key_name(chassis.occupant)] used a Mecha Honker in [AREACOORD(T)]") - return 1 + message_admins("[ADMIN_LOOKUPFLW(source)] used a Mecha Honker in [ADMIN_VERBOSEJMP(T)]") + log_game("[key_name(source)] used a Mecha Honker in [AREACOORD(T)]") + return ..() //Base ballistic weapon type /obj/item/mecha_parts/mecha_equipment/weapon/ballistic name = "general ballistic weapon" - fire_sound = 'sound/weapons/lmgshot.ogg' + fire_sound = 'sound/weapons/shot.ogg' var/projectiles var/projectiles_cache //ammo to be loaded in, if possible. var/projectiles_cache_max @@ -203,15 +202,12 @@ var/disabledreload //For weapons with no cache (like the rockets) which are reloaded by hand var/ammo_type -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/get_shot_amount() - return min(projectiles, projectiles_per_shot) - /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/action_checks(target) if(!..()) - return 0 + return FALSE if(projectiles <= 0) - return 0 - return 1 + return FALSE + return TRUE /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/get_equip_info() return "[..()] \[[src.projectiles][projectiles_cache_max &&!projectile_energy_cost?"/[projectiles_cache]":""]\][!disabledreload &&(src.projectiles < initial(src.projectiles))?" - Rearm":null]" @@ -237,7 +233,8 @@ projectiles = projectiles + projectiles_cache projectiles_cache = 0 - send_byjax(chassis.occupant,"exosuit.browser","[REF(src)]",src.get_equip_info()) + send_byjax(chassis.occupants,"exosuit.browser","[REF(src)]",src.get_equip_info()) + log_message("Rearmed [src.name].", LOG_MECHA) return TRUE @@ -252,11 +249,11 @@ src.rearm() return -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/action(atom/target) +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/action(mob/source, atom/target, params) if(..()) - projectiles -= get_shot_amount() - send_byjax(chassis.occupant,"exosuit.browser","[REF(src)]",src.get_equip_info()) - return 1 + projectiles -= projectiles_per_shot + send_byjax(chassis.occupants,"exosuit.browser","[REF(src)]",src.get_equip_info()) + return ..() /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine @@ -274,7 +271,7 @@ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced name = "\improper S.H.H. \"Quietus\" Carbine" desc = "A weapon for combat exosuits. A mime invention, field tests have shown that targets cannot even scream before going down." - fire_sound = 'sound/weapons/gunshot_silenced.ogg' + fire_sound = 'sound/weapons/Gunshot_silenced.ogg' icon_state = "mecha_mime" equip_cooldown = 30 projectile = /obj/item/projectile/bullet/mime @@ -285,7 +282,6 @@ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot name = "\improper LBX AC 10 \"Scattershot\"" desc = "A weapon for combat exosuits. Shoots a spread of pellets." - fire_sound = 'sound/weapons/gunshotshotgunshot.ogg' icon_state = "mecha_scatter" equip_cooldown = 20 projectile = /obj/item/projectile/bullet/scattershot @@ -347,7 +343,7 @@ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/breaching name = "\improper BRM-6 missile rack" - desc = "A weapon for combat exosuits. Launches low-explosive breaching missiles designed to explode only when striking a sturdy target." + desc = "A weapon for combat exosuits. Launches high-explosive breaching missiles with a safety fuze designed to explode only when striking a sturdy target." icon_state = "mecha_missilerack_six" projectile = /obj/item/projectile/bullet/a84mm_br fire_sound = 'sound/weapons/rocketlaunch.ogg' @@ -365,19 +361,19 @@ var/missile_range = 30 var/diags_first = FALSE -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/action(target) +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/action(mob/source, atom/target, params) if(!action_checks(target)) return var/obj/O = new projectile(chassis.loc) - playsound(chassis, fire_sound, 50, 1) - mecha_log_message("Launched a [O.name] from [name], targeting [target].") + playsound(chassis, fire_sound, 50, TRUE) + log_message("Launched a [O.name] from [name], targeting [target].", LOG_MECHA) projectiles-- - proj_init(O) - O.throw_at(target, missile_range, missile_speed, chassis.occupant, FALSE, diagonals_first = diags_first) - return 1 + proj_init(O, source) + O.throw_at(target, missile_range, missile_speed, source, FALSE, diagonals_first = diags_first) + return TRUE //used for projectile initilisation (priming flashbang) and additional logging -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/proc/proj_init(var/obj/O) +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/proc/proj_init(obj/O, mob/user) return @@ -395,10 +391,10 @@ var/det_time = 20 ammo_type = "flashbang" -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang/proj_init(var/obj/item/grenade/flashbang/F) +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang/proj_init(obj/item/grenade/flashbang/F, mob/user) var/turf/T = get_turf(src) - message_admins("[ADMIN_LOOKUPFLW(chassis.occupant)] fired a [src] in [ADMIN_VERBOSEJMP(T)]") - log_game("[key_name(chassis.occupant)] fired a [src] in [AREACOORD(T)]") + message_admins("[ADMIN_LOOKUPFLW(user)] fired a [F] in [ADMIN_VERBOSEJMP(T)]") + log_game("[key_name(user)] fired a [F] in [AREACOORD(T)]") addtimer(CALLBACK(F, /obj/item/grenade/flashbang.proc/prime), det_time) /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang/clusterbang //Because I am a heartless bastard -Sieve //Heartless? for making the poor man's honkblast? - Kaze @@ -422,8 +418,9 @@ missile_speed = 1.5 projectile_energy_cost = 100 equip_cooldown = 20 + mech_flags = EXOSUIT_MODULE_HONK -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/banana_mortar/can_attach(obj/mecha/combat/honker/M) +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/banana_mortar/can_attach(obj/vehicle/sealed/mecha/combat/honker/M) if(..()) if(istype(M)) return 1 @@ -439,14 +436,15 @@ missile_speed = 1.5 projectile_energy_cost = 100 equip_cooldown = 10 + mech_flags = EXOSUIT_MODULE_HONK -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/mousetrap_mortar/can_attach(obj/mecha/combat/honker/M) +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/mousetrap_mortar/can_attach(obj/vehicle/sealed/mecha/combat/honker/M) if(..()) if(istype(M)) return 1 return 0 -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/mousetrap_mortar/proj_init(var/obj/item/assembly/mousetrap/armed/M) +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/mousetrap_mortar/proj_init(obj/item/assembly/mousetrap/armed/M) M.secured = 1 @@ -457,28 +455,58 @@ icon_state = "mecha_punching_glove" energy_drain = 250 equip_cooldown = 20 - range = MELEE|RANGED + range = MECHA_MELEE|MECHA_RANGED missile_range = 5 projectile = /obj/item/punching_glove fire_sound = 'sound/items/bikehorn.ogg' projectiles = 10 projectile_energy_cost = 500 + harmful = TRUE diags_first = TRUE + /// Damage done by the glove on contact. Also used to determine throw distance (damage / 5) + var/punch_damage = 35 + /// TRUE - Can toggle between lethal and non-lethal || FALSE - Cannot toggle + var/can_toggle_lethal = TRUE + mech_flags = EXOSUIT_MODULE_HONK -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove/can_attach(obj/mecha/combat/honker/M) +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove/can_attach(obj/vehicle/sealed/mecha/combat/honker/M) if(..()) if(istype(M)) return 1 return 0 -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove/action(target) +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove/get_equip_info() + if(!chassis) + return + + if(can_toggle_lethal) + return "[..()]   [harmful?"Punch":"Pat"] mode" + else + return ..() + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove/Topic(href, href_list) + ..() + if(href_list["lethalPunch"]) + harmful = !harmful + if(harmful) + to_chat(usr, "[icon2html(src, usr)]Lethal Fisting Enabled.") + else + to_chat(usr, "[icon2html(src, usr)]Lethal Fisting Disabled.") + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove/action(mob/source, atom/target, params) . = ..() if(.) - chassis.occupant_message("HONK") + to_chat(usr, "[icon2html(src, usr)]HONK") /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove/proj_init(obj/item/punching_glove/PG) if(!istype(PG)) return + + if(harmful) + PG.throwforce = punch_damage + else + PG.throwforce = 0 + //has to be low sleep or it looks weird, the beam doesn't exist for very long so it's a non-issue chassis.Beam(PG, icon_state = "chain", time = missile_range * 20, maxdistance = missile_range + 2, beam_sleep_time = 1) @@ -492,5 +520,5 @@ if(!..()) if(ismovable(hit_atom)) var/atom/movable/AM = hit_atom - AM.safe_throw_at(get_edge_target_turf(AM,get_dir(src, AM)), 7, 2) + AM.safe_throw_at(get_edge_target_turf(AM,get_dir(src, AM)), clamp(round(throwforce/5), 2, 20), 2) //Throws them equal to damage/5, with a min range of 2 and max range of 20 qdel(src) diff --git a/code/game/mecha/mech_bay.dm b/code/modules/vehicles/mecha/mech_bay.dm similarity index 89% rename from code/game/mecha/mech_bay.dm rename to code/modules/vehicles/mecha/mech_bay.dm index e9f682e929..18149401de 100644 --- a/code/game/mecha/mech_bay.dm +++ b/code/modules/vehicles/mecha/mech_bay.dm @@ -5,7 +5,7 @@ icon_state = "recharge_floor" // Some people just want to watch the world burn i guess /turf/open/floor/mech_bay_recharge_floor/break_tile() - ScrapeAway() + ScrapeAway(flags = CHANGETURF_INHERIT_AIR) /turf/open/floor/mech_bay_recharge_floor/airless icon_state = "recharge_floor_asteroid" @@ -19,17 +19,25 @@ icon = 'icons/mecha/mech_bay.dmi' icon_state = "recharge_port" circuit = /obj/item/circuitboard/machine/mech_recharger - var/obj/mecha/recharging_mech + var/obj/vehicle/sealed/mecha/recharging_mech var/obj/machinery/computer/mech_bay_power_console/recharge_console var/max_charge = 50 var/on = FALSE - var/repairability = 0 var/turf/recharging_turf = null /obj/machinery/mech_bay_recharge_port/Initialize() . = ..() recharging_turf = get_step(loc, dir) +/obj/machinery/mech_bay_recharge_port/Destroy() + if (recharge_console && recharge_console.recharge_port == src) + recharge_console.recharge_port = null + return ..() + +/obj/machinery/mech_bay_recharge_port/setDir(new_dir) + . = ..() + recharging_turf = get_step(loc, dir) + /obj/machinery/mech_bay_recharge_port/RefreshParts() var/MC for(var/obj/item/stock_parts/capacitor/C in component_parts) @@ -45,7 +53,7 @@ if(stat & NOPOWER || !recharge_console) return if(!recharging_mech) - recharging_mech = locate(/obj/mecha) in recharging_turf + recharging_mech = locate(/obj/vehicle/sealed/mecha) in recharging_turf if(recharging_mech) recharge_console.update_icon() if(recharging_mech && recharging_mech.cell) @@ -78,8 +86,8 @@ icon_screen = "recharge_comp" icon_keyboard = "rd_key" circuit = /obj/item/circuitboard/computer/mech_bay_power_console - var/obj/machinery/mech_bay_recharge_port/recharge_port light_color = LIGHT_COLOR_PINK + var/obj/machinery/mech_bay_recharge_port/recharge_port /obj/machinery/computer/mech_bay_power_console/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -136,3 +144,8 @@ /obj/machinery/computer/mech_bay_power_console/Initialize() . = ..() reconnect() + +/obj/machinery/computer/mech_bay_power_console/Destroy() + if (recharge_port && recharge_port.recharge_console == src) + recharge_port.recharge_console = null + return ..() diff --git a/code/game/mecha/mech_fabricator.dm b/code/modules/vehicles/mecha/mech_fabricator.dm similarity index 100% rename from code/game/mecha/mech_fabricator.dm rename to code/modules/vehicles/mecha/mech_fabricator.dm diff --git a/code/modules/vehicles/mecha/mech_melee_attack.dm b/code/modules/vehicles/mecha/mech_melee_attack.dm new file mode 100644 index 0000000000..36a6ed1251 --- /dev/null +++ b/code/modules/vehicles/mecha/mech_melee_attack.dm @@ -0,0 +1,117 @@ +///Called when a mech melee attacks an atom +/atom/proc/mech_melee_attack(obj/vehicle/sealed/mecha/mecha_attacker) + return + +/turf/closed/wall/mech_melee_attack(obj/vehicle/sealed/mecha/mecha_attacker) + mecha_attacker.do_attack_animation(src) + switch(mecha_attacker.damtype) + if(BRUTE) + playsound(src, 'sound/weapons/punch4.ogg', 50, TRUE) + mecha_attacker.visible_message("[mecha_attacker.name] hits [src]!", \ + "You hit [src]!", null, COMBAT_MESSAGE_RANGE) + if(prob(hardness + mecha_attacker.force) && mecha_attacker.force > 20) + dismantle_wall(1) + playsound(src, 'sound/effects/meteorimpact.ogg', 100, TRUE) + else + add_dent(WALL_DENT_HIT) + if(BURN) + playsound(src, 'sound/items/welder.ogg', 100, TRUE) + if(TOX) + playsound(src, 'sound/effects/spray2.ogg', 100, TRUE) + return FALSE + +/obj/mech_melee_attack(obj/vehicle/sealed/mecha/mecha_attacker) + mecha_attacker.do_attack_animation(src) + var/play_soundeffect = 0 + var/mech_damtype = mecha_attacker.damtype + if(mecha_attacker.selected) + mech_damtype = mecha_attacker.selected.damtype + play_soundeffect = 1 + else + switch(mecha_attacker.damtype) + if(BRUTE) + playsound(src, 'sound/weapons/punch4.ogg', 50, TRUE) + if(BURN) + playsound(src, 'sound/items/welder.ogg', 50, TRUE) + if(TOX) + playsound(src, 'sound/effects/spray2.ogg', 50, TRUE) + return 0 + else + return 0 + mecha_attacker.visible_message("[mecha_attacker.name] hits [src]!", "You hit [src]!", null, COMBAT_MESSAGE_RANGE) + return take_damage(mecha_attacker.force * 3, mech_damtype, "melee", play_soundeffect, get_dir(src, mecha_attacker)) // multiplied by 3 so we can hit objs hard but not be overpowered against mobs. + +/obj/structure/window/mech_melee_attack(obj/vehicle/sealed/mecha/mecha_attacker) + if(!can_be_reached()) + return + return ..() + +/mob/living/mech_melee_attack(obj/vehicle/sealed/mecha/mecha_attacker, mob/user) + if(user.a_intent == INTENT_HARM) + if(HAS_TRAIT(user, TRAIT_PACIFISM)) + to_chat(user, "You don't want to harm other living beings!") + return + mecha_attacker.do_attack_animation(src) + if(mecha_attacker.damtype == "brute") + step_away(src, mecha_attacker, 15) + switch(mecha_attacker.damtype) + if(BRUTE) + Unconscious(20) + take_overall_damage(rand(mecha_attacker.force/2, mecha_attacker.force)) + playsound(src, 'sound/weapons/punch4.ogg', 50, TRUE) + if(BURN) + take_overall_damage(0, rand(mecha_attacker.force * 0.5, mecha_attacker.force)) + playsound(src, 'sound/items/welder.ogg', 50, TRUE) + if(TOX) + mecha_attacker.mech_toxin_damage(src) + else + return + updatehealth() + visible_message("[mecha_attacker.name] hits [src]!", \ + "[mecha_attacker.name] hits you!", "You hear a sickening sound of flesh hitting flesh!", COMBAT_MESSAGE_RANGE, mecha_attacker) + to_chat(mecha_attacker, "You hit [src]!") + log_combat(user, src, "attacked", mecha_attacker, "(INTENT: [uppertext(user.a_intent)]) (DAMTYPE: [uppertext(mecha_attacker.damtype)])") + else + step_away(src, mecha_attacker) + log_combat(user, src, "pushed", mecha_attacker) + visible_message("[mecha_attacker] pushes [src] out of the way.", \ + "[mecha_attacker] pushes you out of the way.", "You hear aggressive shuffling!", 5, list(mecha_attacker)) + to_chat(mecha_attacker, "You push [src] out of the way.") + +/mob/living/carbon/human/mech_melee_attack(obj/vehicle/sealed/mecha/mecha_attacker, mob/user) + if(user.a_intent == INTENT_HARM) + if(HAS_TRAIT(user, TRAIT_PACIFISM)) + to_chat(user, "You don't want to harm other living beings!") + return + mecha_attacker.do_attack_animation(src) + if(mecha_attacker.damtype == BRUTE) + step_away(src, mecha_attacker, 15) + var/obj/item/bodypart/temp = get_bodypart(pick(BODY_ZONE_CHEST, BODY_ZONE_CHEST, BODY_ZONE_CHEST, BODY_ZONE_HEAD)) + if(temp) + var/update = 0 + var/dmg = rand(mecha_attacker.force * 0.5, mecha_attacker.force) + switch(mecha_attacker.damtype) + if(BRUTE) + if(mecha_attacker.force > 35) // durand and other heavy mechas + Unconscious(20) + else if(mecha_attacker.force > 20 && !IsKnockdown()) // lightweight mechas like gygax + Knockdown(40) + update |= temp.receive_damage(dmg, 0) + playsound(src, 'sound/weapons/punch4.ogg', 50, TRUE) + if(BURN) + update |= temp.receive_damage(0, dmg) + playsound(src, 'sound/items/welder.ogg', 50, TRUE) + if(TOX) + mecha_attacker.mech_toxin_damage(src) + else + return + if(update) + update_damage_overlays() + updatehealth() + + visible_message("[mecha_attacker.name] hits [src]!", \ + "[mecha_attacker.name] hits you!", "You hear a sickening sound of flesh hitting flesh!", COMBAT_MESSAGE_RANGE, list(mecha_attacker)) + to_chat(mecha_attacker, "You hit [src]!") + log_combat(user, src, "attacked", mecha_attacker, "(INTENT: [uppertext(user.a_intent)]) (DAMTYPE: [uppertext(mecha_attacker.damtype)])") + else + return ..() diff --git a/code/modules/vehicles/mecha/mecha_actions.dm b/code/modules/vehicles/mecha/mecha_actions.dm new file mode 100644 index 0000000000..09ccaad2c2 --- /dev/null +++ b/code/modules/vehicles/mecha/mecha_actions.dm @@ -0,0 +1,275 @@ +/***************** MECHA ACTIONS *****************/ + +/obj/vehicle/sealed/mecha/generate_action_type() + . = ..() + if(istype(., /datum/action/vehicle/sealed/mecha)) + var/datum/action/vehicle/sealed/mecha/mecha = . + mecha.chassis = src + + +/datum/action/vehicle/sealed/mecha + icon_icon = 'icons/mob/actions/actions_mecha.dmi' + var/obj/vehicle/sealed/mecha/chassis + +/datum/action/vehicle/sealed/mecha/Destroy() + chassis = null + return ..() + +/datum/action/vehicle/sealed/mecha/mech_eject + name = "Eject From Mech" + button_icon_state = "mech_eject" + +/datum/action/vehicle/sealed/mecha/mech_eject/Trigger() + if(!owner) + return + if(!chassis || !(owner in chassis.occupants)) + return + chassis.container_resist(owner) + +/datum/action/vehicle/sealed/mecha/mech_toggle_internals + name = "Toggle Internal Airtank Usage" + button_icon_state = "mech_internals_off" + +/datum/action/vehicle/sealed/mecha/mech_toggle_internals/Trigger() + if(!owner || !chassis || !(owner in chassis.occupants)) + return + chassis.use_internal_tank = !chassis.use_internal_tank + button_icon_state = "mech_internals_[chassis.use_internal_tank ? "on" : "off"]" + to_chat(chassis.occupants, "[icon2html(chassis, owner)]Now taking air from [chassis.use_internal_tank?"internal airtank":"environment"].") + chassis.log_message("Now taking air from [chassis.use_internal_tank?"internal airtank":"environment"].", LOG_MECHA) + UpdateButtonIcon() + +/datum/action/vehicle/sealed/mecha/mech_cycle_equip + name = "Cycle Equipment" + button_icon_state = "mech_cycle_equip_off" + +/datum/action/vehicle/sealed/mecha/mech_cycle_equip/Trigger() + if(!owner || !chassis || !(owner in chassis.occupants)) + return + + var/list/available_equipment = list() + for(var/e in chassis.equipment) + var/obj/item/mecha_parts/mecha_equipment/equipment = e + if(equipment.selectable) + available_equipment += equipment + + if(available_equipment.len == 0) + to_chat(owner, "[icon2html(chassis, owner)]No equipment available!") + return + if(!chassis.selected) + chassis.selected = available_equipment[1] + to_chat(owner, "[icon2html(chassis, owner)]You select [chassis.selected].") + send_byjax(chassis.occupants,"exosuit.browser","eq_list",chassis.get_equipment_list()) + button_icon_state = "mech_cycle_equip_on" + UpdateButtonIcon() + return + var/number = 0 + for(var/equipment in available_equipment) + number++ + if(equipment != chassis.selected) + continue + if(available_equipment.len == number) + chassis.selected = null + to_chat(owner, "[icon2html(chassis, owner)]You switch to no equipment.") + button_icon_state = "mech_cycle_equip_off" + else + chassis.selected = available_equipment[number+1] + to_chat(owner, "[icon2html(chassis, owner)]You switch to [chassis.selected].") + button_icon_state = "mech_cycle_equip_on" + send_byjax(chassis.occupants,"exosuit.browser","eq_list",chassis.get_equipment_list()) + UpdateButtonIcon() + return + + +/datum/action/vehicle/sealed/mecha/mech_toggle_lights + name = "Toggle Lights" + button_icon_state = "mech_lights_off" + +/datum/action/vehicle/sealed/mecha/mech_toggle_lights/Trigger() + if(!owner || !chassis || !(owner in chassis.occupants)) + return + if(!(chassis.mecha_flags & HAS_LIGHTS)) + to_chat(owner, "This mechs lights are destroyed!") + return + chassis.mecha_flags ^= LIGHTS_ON + if(chassis.mecha_flags & LIGHTS_ON) + button_icon_state = "mech_lights_on" + chassis.set_light(5, 5) + else + button_icon_state = "mech_lights_off" + chassis.set_light(0) + to_chat(owner, "[icon2html(chassis, owner)]Toggled lights [(chassis.mecha_flags & LIGHTS_ON)?"on":"off"].") + chassis.log_message("Toggled lights [(chassis.mecha_flags & LIGHTS_ON)?"on":"off"].", LOG_MECHA) + UpdateButtonIcon() + +/datum/action/vehicle/sealed/mecha/mech_view_stats + name = "View Stats" + button_icon_state = "mech_view_stats" + +/datum/action/vehicle/sealed/mecha/mech_view_stats/Trigger() + if(!owner || !chassis || !(owner in chassis.occupants)) + return + var/datum/browser/popup = new(owner , "exosuit") + popup.set_content(chassis.get_stats_html(owner)) + popup.open() + + +/datum/action/vehicle/sealed/mecha/strafe + name = "Toggle Strafing. Disabled when Alt is held." + button_icon_state = "strafe" + +/datum/action/vehicle/sealed/mecha/strafe/Trigger() + if(!owner || !chassis || !(owner in chassis.occupants)) + return + chassis.toggle_strafe() + +/obj/vehicle/sealed/mecha/AltClick(mob/living/user) + if(!(user in occupants) || !user.canUseTopic(src)) + return + if(!(user in return_controllers_with_flag(VEHICLE_CONTROL_DRIVE))) + to_chat(user, "You're in the wrong seat to control movement.") + return + + toggle_strafe() + +/obj/vehicle/sealed/mecha/proc/toggle_strafe() + strafe = !strafe + + to_chat(occupants, "[icon2html(src, occupants)]Toggled strafing mode [strafe?"on":"off"].") + log_message("Toggled strafing mode [strafe?"on":"off"].", LOG_MECHA) + + for(var/occupant in occupants) + var/datum/action/action = LAZYACCESSASSOC(occupant_actions, occupant, /datum/action/vehicle/sealed/mecha/strafe) + action?.UpdateButtonIcon() + +//////////////////////////////////////// Specific Ability Actions /////////////////////////////////////////////// +//Need to be granted by the mech type, Not default abilities. + +/datum/action/vehicle/sealed/mecha/mech_defense_mode + name = "Toggle an energy shield that blocks all attacks from the faced direction at a heavy power cost." + button_icon_state = "mech_defense_mode_off" + +/datum/action/vehicle/sealed/mecha/mech_defense_mode/Trigger(forced_state = FALSE) + SEND_SIGNAL(chassis, COMSIG_MECHA_ACTION_TRIGGER, owner, args) //Signal sent to the mech, to be handed to the shield. See durand.dm for more details + +/datum/action/vehicle/sealed/mecha/mech_overload_mode + name = "Toggle leg actuators overload" + button_icon_state = "mech_overload_off" + +/datum/action/vehicle/sealed/mecha/mech_overload_mode/Trigger(forced_state = null) + if(!owner || !chassis || !(owner in chassis.occupants)) + return + if(!isnull(forced_state)) + chassis.leg_overload_mode = forced_state + else + chassis.leg_overload_mode = !chassis.leg_overload_mode + chassis.log_message("Toggled leg actuators overload.", LOG_MECHA) + if(!chassis.leg_overload_mode) + button_icon_state = "mech_overload_on" + chassis.bumpsmash = TRUE + chassis.movedelay = min(1, round(chassis.movedelay * 0.5)) + chassis.step_energy_drain = max(chassis.overload_step_energy_drain_min,chassis.step_energy_drain*chassis.leg_overload_coeff) + to_chat(owner, "[icon2html(chassis, owner)]You enable leg actuators overload.") + else + button_icon_state = "mech_overload_off" + chassis.bumpsmash = FALSE + chassis.movedelay = initial(chassis.movedelay) + chassis.step_energy_drain = chassis.normal_step_energy_drain + to_chat(owner, "[icon2html(chassis, owner)]You disable leg actuators overload.") + UpdateButtonIcon() + +/datum/action/vehicle/sealed/mecha/mech_smoke + name = "Smoke" + button_icon_state = "mech_smoke" + +/datum/action/vehicle/sealed/mecha/mech_smoke/Trigger() + if(!owner || !chassis || !(owner in chassis.occupants)) + return + if(!TIMER_COOLDOWN_CHECK(src, COOLDOWN_MECHA_SMOKE) && chassis.smoke_charges>0) + chassis.smoke_system.start() + chassis.smoke_charges-- + TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_SMOKE, chassis.smoke_cooldown) + + +/datum/action/vehicle/sealed/mecha/mech_zoom + name = "Zoom" + button_icon_state = "mech_zoom_off" + +/datum/action/vehicle/sealed/mecha/mech_zoom/Trigger() + if(!owner || !chassis || !(owner in chassis.occupants)) + return + if(owner.client) + chassis.zoom_mode = !chassis.zoom_mode + button_icon_state = "mech_zoom_[chassis.zoom_mode ? "on" : "off"]" + chassis.log_message("Toggled zoom mode.", LOG_MECHA) + to_chat(owner, "[icon2html(chassis, owner)]Zoom mode [chassis.zoom_mode?"en":"dis"]abled.") + if(chassis.zoom_mode) + owner.client.view_size.setTo(4.5) + SEND_SOUND(owner, sound('sound/mecha/imag_enh.ogg',volume=50)) + else + owner.client.view_size.resetToDefault() //Let's not let this stack shall we? + UpdateButtonIcon() + +/datum/action/vehicle/sealed/mecha/mech_switch_damtype + name = "Reconfigure arm microtool arrays" + button_icon_state = "mech_damtype_brute" + +/datum/action/vehicle/sealed/mecha/mech_switch_damtype/Trigger() + if(!owner || !chassis || !(owner in chassis.occupants)) + return + var/new_damtype + switch(chassis.damtype) + if("tox") + new_damtype = "brute" + to_chat(owner, "[icon2html(chassis, owner)]Your exosuit's hands form into fists.") + if("brute") + new_damtype = "fire" + to_chat(owner, "[icon2html(chassis, owner)]A torch tip extends from your exosuit's hand, glowing red.") + if("fire") + new_damtype = "tox" + to_chat(owner, "[icon2html(chassis, owner)]A bone-chillingly thick plasteel needle protracts from the exosuit's palm.") + chassis.damtype = new_damtype + button_icon_state = "mech_damtype_[new_damtype]" + playsound(chassis, 'sound/mecha/mechmove01.ogg', 50, TRUE) + UpdateButtonIcon() + +///swap seats, for two person mecha +/datum/action/vehicle/sealed/mecha/swap_seat + name = "Switch Seats" + button_icon_state = "mech_seat_swap" + +/datum/action/vehicle/sealed/mecha/swap_seat/Trigger() + if(!owner || !chassis || !(owner in chassis.occupants)) + return + + if(chassis.occupants.len == chassis.max_occupants) + to_chat(owner, "The other seat is occupied!") + return + var/list/drivers = chassis.return_drivers() + to_chat(owner, "Switching seats...") + chassis.is_currently_ejecting = TRUE + if(!do_after(owner, chassis.has_gravity() ? chassis.exit_delay : 0 , target = chassis)) + chassis.is_currently_ejecting = FALSE + return + chassis.is_currently_ejecting = FALSE + if(owner in drivers) + to_chat(owner, "You shift to the gunner seat!") + chassis.remove_control_flags(owner, VEHICLE_CONTROL_DRIVE|VEHICLE_CONTROL_SETTINGS) + chassis.add_control_flags(owner, VEHICLE_CONTROL_MELEE|VEHICLE_CONTROL_EQUIPMENT) + else + to_chat(owner, "You shift to the pilot seat!") + chassis.remove_control_flags(owner, VEHICLE_CONTROL_MELEE|VEHICLE_CONTROL_EQUIPMENT) + chassis.add_control_flags(owner, VEHICLE_CONTROL_DRIVE|VEHICLE_CONTROL_SETTINGS) + chassis.update_icon_state() + +/datum/action/vehicle/sealed/mecha/mech_toggle_phasing + name = "Toggle Phasing" + button_icon_state = "mech_phasing_off" + +/datum/action/vehicle/sealed/mecha/mech_toggle_phasing/Trigger() + if(!owner || !chassis || !(owner in chassis.occupants)) + return + chassis.phasing = !chassis.phasing + button_icon_state = "mech_phasing_[chassis.phasing ? "on" : "off"]" + to_chat(owner, "[icon2html(chassis, owner)]En":"#f00\">Dis"]abled phasing.") + UpdateButtonIcon() diff --git a/code/modules/vehicles/mecha/mecha_construction_paths.dm b/code/modules/vehicles/mecha/mecha_construction_paths.dm new file mode 100644 index 0000000000..d0fa7aca0b --- /dev/null +++ b/code/modules/vehicles/mecha/mecha_construction_paths.dm @@ -0,0 +1,1608 @@ +//////////////////////////////// +///// Construction datums ////// +//////////////////////////////// +/datum/component/construction/mecha + var/base_icon + + // Component typepaths. + // most must be defined unless + // get_steps is overriden. + + // Circuit board typepaths. + // circuit_control and circuit_periph must be defined + // unless get_circuit_steps is overriden. + var/circuit_control + var/circuit_periph + var/circuit_weapon + + // Armor plating typepaths. both must be defined + // unless relevant step procs are overriden. amounts + // must be defined if using /obj/item/stack/sheet types + var/inner_plating + var/inner_plating_amount + + var/outer_plating + var/outer_plating_amount + +/datum/component/construction/mecha/spawn_result() + if(!result) + return + // Remove default mech power cell, as we replace it with a new one. + var/obj/vehicle/sealed/mecha/M = new result(drop_location()) + QDEL_NULL(M.cell) + QDEL_NULL(M.scanmod) + QDEL_NULL(M.capacitor) + + var/obj/item/mecha_parts/chassis/parent_chassis = parent + M.CheckParts(parent_chassis.contents) + + SSblackbox.record_feedback("tally", "mechas_created", 1, M.name) + QDEL_NULL(parent) + +// Default proc to generate mech steps. +// Override if the mech needs an entirely custom process (See HONK mech) +// Otherwise override specific steps as needed (Ripley, Clarke, Phazon) +/datum/component/construction/mecha/proc/get_steps() + return get_frame_steps() + get_circuit_steps() + (circuit_weapon ? get_circuit_weapon_steps() : list()) + get_stockpart_steps() + get_inner_plating_steps() + get_outer_plating_steps() + +/datum/component/construction/mecha/update_parent(step_index) + steps = get_steps() + ..() + // By default, each step in mech construction has a single icon_state: + // "[base_icon][index - 1]" + // For example, Ripley's step 1 icon_state is "ripley0". + var/atom/parent_atom = parent + if(!steps[index]["icon_state"] && base_icon) + parent_atom.icon_state = "[base_icon][index - 1]" + +/datum/component/construction/unordered/mecha_chassis/custom_action(obj/item/I, mob/living/user, typepath) + . = user.transferItemToLoc(I, parent) + if(.) + var/atom/parent_atom = parent + user.visible_message("[user] connects [I] to [parent].", "You connect [I] to [parent].") + parent_atom.add_overlay(I.icon_state+"+o") + qdel(I) + +/datum/component/construction/unordered/mecha_chassis/spawn_result() + var/atom/parent_atom = parent + parent_atom.icon = 'icons/mecha/mech_construction.dmi' + parent_atom.density = TRUE + parent_atom.cut_overlays() + ..() + +// Default proc for the first steps of mech construction. +/datum/component/construction/mecha/proc/get_frame_steps() + return list( + list( + "key" = TOOL_WRENCH, + "desc" = "The hydraulic systems are disconnected." + ), + list( + "key" = TOOL_SCREWDRIVER, + "back_key" = TOOL_WRENCH, + "desc" = "The hydraulic systems are connected." + ), + list( + "key" = /obj/item/stack/cable_coil, + "amount" = 5, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "The hydraulic systems are active." + ), + list( + "key" = TOOL_WIRECUTTER, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "The wiring is added." + ) + ) + +// Default proc for the circuit board steps of a mech. +// Second set of steps by default. +/datum/component/construction/mecha/proc/get_circuit_steps() + return list( + list( + "key" = circuit_control, + "action" = ITEM_DELETE, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "The wiring is adjusted." + ), + list( + "key" = TOOL_SCREWDRIVER, + "back_key" = TOOL_CROWBAR, + "desc" = "Central control module is installed." + ), + list( + "key" = circuit_periph, + "action" = ITEM_DELETE, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "Central control module is secured." + ), + list( + "key" = TOOL_SCREWDRIVER, + "back_key" = TOOL_CROWBAR, + "desc" = "Peripherals control module is installed." + ) + ) + +// Default proc for weapon circuitboard steps +// Used by combat mechs +/datum/component/construction/mecha/proc/get_circuit_weapon_steps() + return list( + list( + "key" = circuit_weapon, + "action" = ITEM_DELETE, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "Peripherals control module is secured." + ), + list( + "key" = TOOL_SCREWDRIVER, + "back_key" = TOOL_CROWBAR, + "desc" = "Weapons control module is installed." + ) + ) + +// Default proc for stock part installation +// Third set of steps by default +/datum/component/construction/mecha/proc/get_stockpart_steps() + var/prevstep_text = circuit_weapon ? "Weapons control module is secured." : "Peripherals control module is secured." + return list( + list( + "key" = /obj/item/stock_parts/scanning_module, + "action" = ITEM_MOVE_INSIDE, + "back_key" = TOOL_SCREWDRIVER, + "desc" = prevstep_text + ), + list( + "key" = TOOL_SCREWDRIVER, + "back_key" = TOOL_CROWBAR, + "desc" = "Scanner module is installed." + ), + list( + "key" = /obj/item/stock_parts/capacitor, + "action" = ITEM_MOVE_INSIDE, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "Scanner module is secured." + ), + list( + "key" = TOOL_SCREWDRIVER, + "back_key" = TOOL_CROWBAR, + "desc" = "Capacitor is installed." + ), + list( + "key" = /obj/item/stock_parts/cell, + "action" = ITEM_MOVE_INSIDE, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "Capacitor is secured." + ), + list( + "key" = TOOL_SCREWDRIVER, + "back_key" = TOOL_CROWBAR, + "desc" = "The power cell is installed." + ) + ) + +// Default proc for inner armor plating +// Fourth set of steps by default +/datum/component/construction/mecha/proc/get_inner_plating_steps() + var/list/first_step + if(ispath(inner_plating, /obj/item/stack/sheet)) + first_step = list( + list( + "key" = inner_plating, + "amount" = inner_plating_amount, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "The power cell is secured." + ) + ) + else + first_step = list( + list( + "key" = inner_plating, + "action" = ITEM_DELETE, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "The power cell is secured." + ) + ) + + return first_step + list( + list( + "key" = TOOL_WRENCH, + "back_key" = TOOL_CROWBAR, + "desc" = "Inner plating is installed." + ), + list( + "key" = TOOL_WELDER, + "back_key" = TOOL_WRENCH, + "desc" = "Inner Plating is wrenched." + ) + ) + +// Default proc for outer armor plating +// Fifth set of steps by default +/datum/component/construction/mecha/proc/get_outer_plating_steps() + var/list/first_step + if(ispath(outer_plating, /obj/item/stack/sheet)) + first_step = list( + list( + "key" = outer_plating, + "amount" = outer_plating_amount, + "back_key" = TOOL_WELDER, + "desc" = "Inner plating is welded." + ) + ) + else + first_step = list( + list( + "key" = outer_plating, + "action" = ITEM_DELETE, + "back_key" = TOOL_WELDER, + "desc" = "Inner plating is welded." + ) + ) + + return first_step + list( + list( + "key" = TOOL_WRENCH, + "back_key" = TOOL_CROWBAR, + "desc" = "External armor is installed." + ), + list( + "key" = TOOL_WELDER, + "back_key" = TOOL_WRENCH, + "desc" = "External armor is wrenched." + ) + ) + + +/datum/component/construction/unordered/mecha_chassis/ripley + result = /datum/component/construction/mecha/ripley + steps = list( + /obj/item/mecha_parts/part/ripley_torso, + /obj/item/mecha_parts/part/ripley_left_arm, + /obj/item/mecha_parts/part/ripley_right_arm, + /obj/item/mecha_parts/part/ripley_left_leg, + /obj/item/mecha_parts/part/ripley_right_leg + ) + +/datum/component/construction/mecha/ripley + result = /obj/vehicle/sealed/mecha/working/ripley + base_icon = "ripley" + + circuit_control = /obj/item/circuitboard/mecha/ripley/main + circuit_periph = /obj/item/circuitboard/mecha/ripley/peripherals + + inner_plating=/obj/item/stack/sheet/metal + inner_plating_amount = 5 + + outer_plating=/obj/item/stack/rods + outer_plating_amount = 10 + +/datum/component/construction/mecha/ripley/get_outer_plating_steps() + return list( + list( + "key" = /obj/item/stack/rods, + "amount" = 10, + "back_key" = TOOL_WELDER, + "desc" = "Outer Plating is welded." + ), + list( + "key" = TOOL_WELDER, + "back_key" = TOOL_WIRECUTTER, + "desc" = "Cockpit wire screen is installed." + ), + ) + +/datum/component/construction/mecha/ripley/custom_action(obj/item/I, mob/living/user, diff) + if(!..()) + return FALSE + + switch(index) + if(1) + user.visible_message("[user] connects [parent] hydraulic systems.", "You connect [parent] hydraulic systems.") + if(2) + if(diff==FORWARD) + user.visible_message("[user] activates [parent] hydraulic systems.", "You activate [parent] hydraulic systems.") + else + user.visible_message("[user] disconnects [parent] hydraulic systems.", "You disconnect [parent] hydraulic systems.") + if(3) + if(diff==FORWARD) + user.visible_message("[user] adds the wiring to [parent].", "You add the wiring to [parent].") + else + user.visible_message("[user] deactivates [parent] hydraulic systems.", "You deactivate [parent] hydraulic systems.") + if(4) + if(diff==FORWARD) + user.visible_message("[user] adjusts the wiring of [parent].", "You adjust the wiring of [parent].") + else + user.visible_message("[user] removes the wiring from [parent].", "You remove the wiring from [parent].") + if(5) + if(diff==FORWARD) + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + else + user.visible_message("[user] disconnects the wiring of [parent].", "You disconnect the wiring of [parent].") + if(6) + if(diff==FORWARD) + user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") + else + user.visible_message("[user] removes the central control module from [parent].", "You remove the central computer mainboard from [parent].") + if(7) + if(diff==FORWARD) + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + else + user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") + if(8) + if(diff==FORWARD) + user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") + else + user.visible_message("[user] removes the peripherals control module from [parent].", "You remove the peripherals control module from [parent].") + if(9) + if(diff==FORWARD) + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + else + user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") + if(10) + if(diff==FORWARD) + user.visible_message("[user] secures the scanner module.", "You secure the scanner module.") + else + user.visible_message("[user] removes the scanner module from [parent].", "You remove the scanner module from [parent].") + if(11) + if(diff==FORWARD) + user.visible_message("[user] installs [I] to [parent].", "You install [I] to [parent].") + else + user.visible_message("[user] unfastens the scanner module.", "You unfasten the scanner module.") + if(12) + if(diff==FORWARD) + user.visible_message("[user] secures [I].", "You secure [I].") + else + user.visible_message("[user] removes the capacitor from [parent].", "You remove the capacitor from [parent].") + if(13) + if(diff==FORWARD) + user.visible_message("[user] installs [I].", "You install [I].") + else + user.visible_message("[user] unsecures the capacitor from [parent].", "You unsecure the capacitor from [parent].") + if(14) + if(diff==FORWARD) + user.visible_message("[user] secures the power cell.", "You secure the power cell.") + else + user.visible_message("[user] pries the power cell from [parent].", "You pry the power cell from [parent].") + if(15) + if(diff==FORWARD) + user.visible_message("[user] installs the internal armor layer to [parent].", "You install the internal armor layer to [parent].") + else + user.visible_message("[user] unfastens the power cell.", "You unfasten the power cell.") + if(16) + if(diff==FORWARD) + user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") + else + user.visible_message("[user] pries internal armor layer from [parent].", "You pry internal armor layer from [parent].") + if(17) + if(diff==FORWARD) + user.visible_message("[user] welds the internal armor layer to [parent].", "You weld the internal armor layer to [parent].") + else + user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") + if(18) + if(diff==FORWARD) + user.visible_message("[user] installs the external reinforced armor layer to [parent].", "You install the external reinforced armor layer to [parent].") + else + user.visible_message("[user] cuts the internal armor layer from [parent].", "You cut the internal armor layer from [parent].") + if(19) + if(diff==FORWARD) + user.visible_message("[user] secures the external armor layer.", "You secure the external reinforced armor layer.") + else + user.visible_message("[user] pries external armor layer from [parent].", "You pry external armor layer from [parent].") + if(20) + if(diff==FORWARD) + user.visible_message("[user] welds the external armor layer to [parent].", "You weld the external armor layer to [parent].") + else + user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.") + return TRUE + +/datum/component/construction/unordered/mecha_chassis/gygax + result = /datum/component/construction/mecha/gygax + steps = list( + /obj/item/mecha_parts/part/gygax_torso, + /obj/item/mecha_parts/part/gygax_left_arm, + /obj/item/mecha_parts/part/gygax_right_arm, + /obj/item/mecha_parts/part/gygax_left_leg, + /obj/item/mecha_parts/part/gygax_right_leg, + /obj/item/mecha_parts/part/gygax_head + ) + +/datum/component/construction/mecha/gygax + result = /obj/vehicle/sealed/mecha/combat/gygax + base_icon = "gygax" + + circuit_control = /obj/item/circuitboard/mecha/gygax/main + circuit_periph = /obj/item/circuitboard/mecha/gygax/peripherals + circuit_weapon = /obj/item/circuitboard/mecha/gygax/targeting + + inner_plating = /obj/item/stack/sheet/metal + inner_plating_amount = 5 + + outer_plating=/obj/item/mecha_parts/part/gygax_armor + outer_plating_amount=1 + +/datum/component/construction/mecha/gygax/action(datum/source, atom/used_atom, mob/user) + return check_step(used_atom,user) + +/datum/component/construction/mecha/gygax/custom_action(obj/item/I, mob/living/user, diff) + if(!..()) + return FALSE + + switch(index) + if(1) + user.visible_message("[user] connects [parent] hydraulic systems.", "You connect [parent] hydraulic systems.") + if(2) + if(diff==FORWARD) + user.visible_message("[user] activates [parent] hydraulic systems.", "You activate [parent] hydraulic systems.") + else + user.visible_message("[user] disconnects [parent] hydraulic systems.", "You disconnect [parent] hydraulic systems.") + if(3) + if(diff==FORWARD) + user.visible_message("[user] adds the wiring to [parent].", "You add the wiring to [parent].") + else + user.visible_message("[user] deactivates [parent] hydraulic systems.", "You deactivate [parent] hydraulic systems.") + if(4) + if(diff==FORWARD) + user.visible_message("[user] adjusts the wiring of [parent].", "You adjust the wiring of [parent].") + else + user.visible_message("[user] removes the wiring from [parent].", "You remove the wiring from [parent].") + if(5) + if(diff==FORWARD) + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + else + user.visible_message("[user] disconnects the wiring of [parent].", "You disconnect the wiring of [parent].") + if(6) + if(diff==FORWARD) + user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") + else + user.visible_message("[user] removes the central control module from [parent].", "You remove the central computer mainboard from [parent].") + if(7) + if(diff==FORWARD) + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + else + user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") + if(8) + if(diff==FORWARD) + user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") + else + user.visible_message("[user] removes the peripherals control module from [parent].", "You remove the peripherals control module from [parent].") + if(9) + if(diff==FORWARD) + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + else + user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") + if(10) + if(diff==FORWARD) + user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.") + else + user.visible_message("[user] removes the weapon control module from [parent].", "You remove the weapon control module from [parent].") + if(11) + if(diff==FORWARD) + user.visible_message("[user] installs [I] to [parent].", "You install [I] to [parent].") + else + user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.") + if(12) + if(diff==FORWARD) + user.visible_message("[user] secures the scanner module.", "You secure the scanner module.") + else + user.visible_message("[user] removes the scanner module from [parent].", "You remove the scanner module from [parent].") + if(13) + if(diff==FORWARD) + user.visible_message("[user] installs [I] to [parent].", "You install [I] to [parent].") + else + user.visible_message("[user] unfastens the scanner module.", "You unfasten the scanner module.") + if(14) + if(diff==FORWARD) + user.visible_message("[user] secures the capacitor.", "You secure the capacitor.") + else + user.visible_message("[user] removes the capacitor from [parent].", "You remove the capacitor from [parent].") + if(15) + if(diff==FORWARD) + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + else + user.visible_message("[user] unfastens the capacitor.", "You unfasten the capacitor.") + if(16) + if(diff==FORWARD) + user.visible_message("[user] secures the power cell.", "You secure the power cell.") + else + user.visible_message("[user] pries the power cell from [parent].", "You pry the power cell from [parent].") + if(17) + if(diff==FORWARD) + user.visible_message("[user] installs the internal armor layer to [parent].", "You install the internal armor layer to [parent].") + else + user.visible_message("[user] unfastens the power cell.", "You unfasten the power cell.") + if(18) + if(diff==FORWARD) + user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") + else + user.visible_message("[user] pries internal armor layer from [parent].", "You pry internal armor layer from [parent].") + if(19) + if(diff==FORWARD) + user.visible_message("[user] welds the internal armor layer to [parent].", "You weld the internal armor layer to [parent].") + else + user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") + if(20) + if(diff==FORWARD) + user.visible_message("[user] installs [I] to [parent].", "You install [I] to [parent].") + else + user.visible_message("[user] cuts the internal armor layer from [parent].", "You cut the internal armor layer from [parent].") + if(21) + if(diff==FORWARD) + user.visible_message("[user] secures Gygax Armor Plates.", "You secure Gygax Armor Plates.") + else + user.visible_message("[user] pries Gygax Armor Plates from [parent].", "You pry Gygax Armor Plates from [parent].") + if(22) + if(diff==FORWARD) + user.visible_message("[user] welds Gygax Armor Plates to [parent].", "You weld Gygax Armor Plates to [parent].") + else + user.visible_message("[user] unfastens Gygax Armor Plates.", "You unfasten Gygax Armor Plates.") + return TRUE + +//Begin Medigax +/datum/component/construction/unordered/mecha_chassis/medigax + result = /datum/component/construction/mecha/medigax + steps = list( + /obj/item/mecha_parts/part/medigax_torso, + /obj/item/mecha_parts/part/medigax_left_arm, + /obj/item/mecha_parts/part/medigax_right_arm, + /obj/item/mecha_parts/part/medigax_left_leg, + /obj/item/mecha_parts/part/medigax_right_leg, + /obj/item/mecha_parts/part/medigax_head + ) + +/datum/component/construction/mecha/medigax + result = /obj/vehicle/sealed/mecha/medical/medigax + base_icon = "medigax" + steps = list( + //1 + list( + "key" = TOOL_WRENCH, + "desc" = "The hydraulic systems are disconnected." + ), + + //2 + list( + "key" = TOOL_SCREWDRIVER, + "back_key" = TOOL_WRENCH, + "desc" = "The hydraulic systems are connected." + ), + + //3 + list( + "key" = /obj/item/stack/cable_coil, + "amount" = 5, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "The hydraulic systems are active." + ), + + //4 + list( + "key" = TOOL_WIRECUTTER, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "The wiring is added." + ), + + //5 + list( + "key" = /obj/item/circuitboard/mecha/gygax/main, + "action" = ITEM_DELETE, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "The wiring is adjusted." + ), + + //6 + list( + "key" = TOOL_SCREWDRIVER, + "back_key" = TOOL_CROWBAR, + "desc" = "Central control module is installed." + ), + + //7 + list( + "key" = /obj/item/circuitboard/mecha/gygax/peripherals, + "action" = ITEM_DELETE, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "Central control module is secured." + ), + + //8 + list( + "key" = TOOL_SCREWDRIVER, + "back_key" = TOOL_CROWBAR, + "desc" = "Peripherals control module is installed." + ), + + //9 + list( + "key" = /obj/item/circuitboard/mecha/gygax/targeting, + "action" = ITEM_DELETE, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "Peripherals control module is secured." + ), + + //10 + list( + "key" = TOOL_SCREWDRIVER, + "back_key" = TOOL_CROWBAR, + "desc" = "Weapon control module is installed." + ), + + //11 + list( + "key" = /obj/item/stock_parts/scanning_module, + "action" = ITEM_MOVE_INSIDE, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "Weapon control module is secured." + ), + + //12 + list( + "key" = TOOL_SCREWDRIVER, + "back_key" = TOOL_CROWBAR, + "desc" = "Scanner module is installed." + ), + + //13 + list( + "key" = /obj/item/stock_parts/capacitor, + "action" = ITEM_MOVE_INSIDE, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "Scanner module is secured." + ), + + //14 + list( + "key" = TOOL_SCREWDRIVER, + "back_key" = TOOL_CROWBAR, + "desc" = "Capacitor is installed." + ), + + //15 + list( + "key" = /obj/item/stock_parts/cell, + "action" = ITEM_MOVE_INSIDE, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "Capacitor is secured." + ), + + //16 + list( + "key" = TOOL_SCREWDRIVER, + "back_key" = TOOL_CROWBAR, + "desc" = "The power cell is installed." + ), + + //17 + list( + "key" = /obj/item/stack/sheet/metal, + "amount" = 5, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "The power cell is secured." + ), + + //18 + list( + "key" = TOOL_WRENCH, + "back_key" = TOOL_CROWBAR, + "desc" = "Internal armor is installed." + ), + + //19 + list( + "key" = TOOL_WELDER, + "back_key" = TOOL_WRENCH, + "desc" = "Internal armor is wrenched." + ), + + //20 + list( + "key" = /obj/item/mecha_parts/part/medigax_armor, + "action" = ITEM_DELETE, + "back_key" = TOOL_WELDER, + "desc" = "Internal armor is welded." + ), + + //21 + list( + "key" = TOOL_WRENCH, + "back_key" = TOOL_CROWBAR, + "desc" = "External armor is installed." + ), + + //22 + list( + "key" = TOOL_WELDER, + "back_key" = TOOL_WRENCH, + "desc" = "External armor is wrenched." + ), + + ) + +/datum/component/construction/mecha/medigax/action(datum/source, atom/used_atom, mob/user) + return check_step(used_atom,user) + +/datum/component/construction/mecha/medigax/custom_action(obj/item/I, mob/living/user, diff) + if(!..()) + return FALSE + + switch(index) + if(1) + user.visible_message("[user] connects [parent] hydraulic systems", "You connect [parent] hydraulic systems.") + if(2) + if(diff==FORWARD) + user.visible_message("[user] activates [parent] hydraulic systems.", "You activate [parent] hydraulic systems.") + else + user.visible_message("[user] disconnects [parent] hydraulic systems", "You disconnect [parent] hydraulic systems.") + if(3) + if(diff==FORWARD) + user.visible_message("[user] adds the wiring to [parent].", "You add the wiring to [parent].") + else + user.visible_message("[user] deactivates [parent] hydraulic systems.", "You deactivate [parent] hydraulic systems.") + if(4) + if(diff==FORWARD) + user.visible_message("[user] adjusts the wiring of [parent].", "You adjust the wiring of [parent].") + else + user.visible_message("[user] removes the wiring from [parent].", "You remove the wiring from [parent].") + if(5) + if(diff==FORWARD) + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + else + user.visible_message("[user] disconnects the wiring of [parent].", "You disconnect the wiring of [parent].") + if(6) + if(diff==FORWARD) + user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") + else + user.visible_message("[user] removes the central control module from [parent].", "You remove the central computer mainboard from [parent].") + if(7) + if(diff==FORWARD) + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + else + user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") + if(8) + if(diff==FORWARD) + user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") + else + user.visible_message("[user] removes the peripherals control module from [parent].", "You remove the peripherals control module from [parent].") + if(9) + if(diff==FORWARD) + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + else + user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") + if(10) + if(diff==FORWARD) + user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.") + else + user.visible_message("[user] removes the weapon control module from [parent].", "You remove the weapon control module from [parent].") + if(11) + if(diff==FORWARD) + user.visible_message("[user] installs [I] to [parent].", "You install [I] to [parent].") + else + user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.") + if(12) + if(diff==FORWARD) + user.visible_message("[user] secures the scanner module.", "You secure the scanner module.") + else + user.visible_message("[user] removes the scanner module from [parent].", "You remove the scanner module from [parent].") + if(13) + if(diff==FORWARD) + user.visible_message("[user] installs [I] to [parent].", "You install [I] to [parent].") + else + user.visible_message("[user] unfastens the scanner module.", "You unfasten the scanner module.") + if(14) + if(diff==FORWARD) + user.visible_message("[user] secures the capacitor.", "You secure the capacitor.") + else + user.visible_message("[user] removes the capacitor from [parent].", "You remove the capacitor from [parent].") + if(15) + if(diff==FORWARD) + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + else + user.visible_message("[user] unfastens the capacitor.", "You unfasten the capacitor.") + if(16) + if(diff==FORWARD) + user.visible_message("[user] secures the power cell.", "You secure the power cell.") + else + user.visible_message("[user] pries the power cell from [parent].", "You pry the power cell from [parent].") + if(17) + if(diff==FORWARD) + user.visible_message("[user] installs the internal armor layer to [parent].", "You install the internal armor layer to [parent].") + else + user.visible_message("[user] unfastens the power cell.", "You unfasten the power cell.") + if(18) + if(diff==FORWARD) + user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") + else + user.visible_message("[user] pries internal armor layer from [parent].", "You pry internal armor layer from [parent].") + if(19) + if(diff==FORWARD) + user.visible_message("[user] welds the internal armor layer to [parent].", "You weld the internal armor layer to [parent].") + else + user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") + if(20) + if(diff==FORWARD) + user.visible_message("[user] installs [I] to [parent].", "You install [I] to [parent].") + else + user.visible_message("[user] cuts the internal armor layer from [parent].", "You cut the internal armor layer from [parent].") + if(21) + if(diff==FORWARD) + user.visible_message("[user] secures Gygax Armor Plates.", "You secure Medical Gygax Armor Plates.") + else + user.visible_message("[user] pries Gygax Armor Plates from [parent].", "You pry Medical Gygax Armor Plates from [parent].") + if(22) + if(diff==FORWARD) + user.visible_message("[user] welds Gygax Armor Plates to [parent].", "You weld Medical Gygax Armor Plates to [parent].") + else + user.visible_message("[user] unfastens Gygax Armor Plates.", "You unfasten Medical Gygax Armor Plates.") + return TRUE +// End Medigax + +/datum/component/construction/unordered/mecha_chassis/firefighter + result = /datum/component/construction/mecha/firefighter + steps = list( + /obj/item/mecha_parts/part/ripley_torso, + /obj/item/mecha_parts/part/ripley_left_arm, + /obj/item/mecha_parts/part/ripley_right_arm, + /obj/item/mecha_parts/part/ripley_left_leg, + /obj/item/mecha_parts/part/ripley_right_leg + ) + +/datum/component/construction/mecha/firefighter + result = /obj/vehicle/sealed/mecha/working/ripley/firefighter + base_icon = "firefighter" + + circuit_control = /obj/item/circuitboard/mecha/ripley/main + circuit_periph = /obj/item/circuitboard/mecha/ripley/peripherals + + inner_plating= /obj/item/clothing/suit/fire + inner_plating_amount = 1 + + outer_plating=/obj/item/stack/sheet/plasteel + outer_plating_amount = 10 + +/datum/component/construction/mecha/firefighter/get_outer_plating_steps() + return list( + list( + "key" = /obj/item/stack/sheet/plasteel, + "amount" = 10, + "back_key" = TOOL_WELDER, + "desc" = "Outer plating is welded." + ), + list( + "key" = TOOL_WELDER, + "back_key" = TOOL_WRENCH, + "desc" = "Outer plating is complete." + ), + ) + +/datum/component/construction/mecha/firefighter/custom_action(obj/item/I, mob/living/user, diff) + if(!..()) + return FALSE + + switch(index) + if(1) + user.visible_message("[user] connects [parent] hydraulic systems.", "You connect [parent] hydraulic systems.") + if(2) + if(diff==FORWARD) + user.visible_message("[user] activates [parent] hydraulic systems.", "You activate [parent] hydraulic systems.") + else + user.visible_message("[user] disconnects [parent] hydraulic systems.", "You disconnect [parent] hydraulic systems.") + if(3) + if(diff==FORWARD) + user.visible_message("[user] adds the wiring to [parent].", "You add the wiring to [parent].") + else + user.visible_message("[user] deactivates [parent] hydraulic systems.", "You deactivate [parent] hydraulic systems.") + if(4) + if(diff==FORWARD) + user.visible_message("[user] adjusts the wiring of [parent].", "You adjust the wiring of [parent].") + else + user.visible_message("[user] removes the wiring from [parent].", "You remove the wiring from [parent].") + if(5) + if(diff==FORWARD) + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + else + user.visible_message("[user] disconnects the wiring of [parent].", "You disconnect the wiring of [parent].") + if(6) + if(diff==FORWARD) + user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") + else + user.visible_message("[user] removes the central control module from [parent].", "You remove the central computer mainboard from [parent].") + if(7) + if(diff==FORWARD) + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + else + user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") + if(8) + if(diff==FORWARD) + user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") + else + user.visible_message("[user] removes the peripherals control module from [parent].", "You remove the peripherals control module from [parent].") + if(9) + if(diff==FORWARD) + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + else + user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") + if(10) + if(diff==FORWARD) + user.visible_message("[user] secures the scanner module.", "You secure the scanner module.") + else + user.visible_message("[user] removes the scanner module from [parent].", "You remove the scanner module from [parent].") + if(11) + if(diff==FORWARD) + user.visible_message("[user] installs [I] to [parent].", "You install [I] to [parent].") + else + user.visible_message("[user] unfastens the scanner module.", "You unfasten the scanner module.") + if(12) + if(diff==FORWARD) + user.visible_message("[user] secures [I].", "You secure [I].") + else + user.visible_message("[user] removes the capacitor from [parent].", "You remove the capacitor from [parent].") + if(13) + if(diff==FORWARD) + user.visible_message("[user] installs [I].", "You install [I].") + else + user.visible_message("[user] unsecures the capacitor from [parent].", "You unsecure the capacitor from [parent].") + if(14) + if(diff==FORWARD) + user.visible_message("[user] secures the power cell.", "You secure the power cell.") + else + user.visible_message("[user] pries the power cell from [parent].", "You pry the power cell from [parent].") + if(15) + if(diff==FORWARD) + user.visible_message("[user] installs the internal armor layer to [parent].", "You install the internal armor layer to [parent].") + else + user.visible_message("[user] unfastens the power cell.", "You unfasten the power cell.") + if(16) + if(diff==FORWARD) + user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") + else + user.visible_message("[user] pries internal armor layer from [parent].", "You pry internal armor layer from [parent].") + if(17) + if(diff==FORWARD) + user.visible_message("[user] welds the internal armor layer to [parent].", "You weld the internal armor layer to [parent].") + else + user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") + if(18) + if(diff==FORWARD) + user.visible_message("[user] installs the external reinforced armor layer to [parent].", "You install the external reinforced armor layer to [parent].") + else + user.visible_message("[user] cuts the internal armor layer from [parent].", "You cut the internal armor layer from [parent].") + if(19) + if(diff==FORWARD) + user.visible_message("[user] secures the external armor layer.", "You secure the external reinforced armor layer.") + else + user.visible_message("[user] pries external armor layer from [parent].", "You pry external armor layer from [parent].") + if(20) + if(diff==FORWARD) + user.visible_message("[user] welds the external armor layer to [parent].", "You weld the external armor layer to [parent].") + else + user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.") + return TRUE + +/datum/component/construction/unordered/mecha_chassis/honker + result = /datum/component/construction/mecha/honker + steps = list( + /obj/item/mecha_parts/part/honker_torso, + /obj/item/mecha_parts/part/honker_left_arm, + /obj/item/mecha_parts/part/honker_right_arm, + /obj/item/mecha_parts/part/honker_left_leg, + /obj/item/mecha_parts/part/honker_right_leg, + /obj/item/mecha_parts/part/honker_head + ) + +/datum/component/construction/mecha/honker + result = /obj/vehicle/sealed/mecha/combat/honker + steps = list( + list( + "key" = /obj/item/bikehorn + ), + list( + "key" = /obj/item/circuitboard/mecha/honker/main, + "action" = ITEM_DELETE + ), + list( + "key" = /obj/item/bikehorn + ), + list( + "key" = /obj/item/circuitboard/mecha/honker/peripherals, + "action" = ITEM_DELETE + ), + list( + "key" = /obj/item/bikehorn + ), + list( + "key" = /obj/item/circuitboard/mecha/honker/targeting, + "action" = ITEM_DELETE + ), + list( + "key" = /obj/item/bikehorn + ), + list( + "key" = /obj/item/stock_parts/scanning_module, + "action" = ITEM_MOVE_INSIDE + ), + list( + "key" = /obj/item/bikehorn + ), + list( + "key" = /obj/item/stock_parts/capacitor, + "action" = ITEM_MOVE_INSIDE + ), + list( + "key" = /obj/item/bikehorn + ), + list( + "key" = /obj/item/stock_parts/cell, + "action" = ITEM_MOVE_INSIDE + ), + list( + "key" = /obj/item/bikehorn + ), + list( + "key" = /obj/item/clothing/mask/gas/clown_hat, + "action" = ITEM_DELETE + ), + list( + "key" = /obj/item/bikehorn + ), + list( + "key" = /obj/item/clothing/shoes/clown_shoes, + "action" = ITEM_DELETE + ), + list( + "key" = /obj/item/bikehorn + ), + ) + +/datum/component/construction/mecha/honker/get_steps() + return steps + +// HONK doesn't have any construction step icons, so we just set an icon once. +/datum/component/construction/mecha/honker/update_parent(step_index) + if(step_index == 1) + var/atom/parent_atom = parent + parent_atom.icon = 'icons/mecha/mech_construct.dmi' + parent_atom.icon_state = "honker_chassis" + ..() + +/datum/component/construction/mecha/honker/custom_action(obj/item/I, mob/living/user, diff) + if(!..()) + return FALSE + + if(istype(I, /obj/item/bikehorn)) + playsound(parent, 'sound/items/bikehorn.ogg', 50, TRUE) + user.visible_message("HONK!") + + //TODO: better messages. + switch(index) + if(2) + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + if(4) + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + if(6) + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + if(8) + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + if(10) + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + if(12) + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + if(14) + user.visible_message("[user] puts [I] on [parent].", "You put [I] on [parent].") + if(16) + user.visible_message("[user] puts [I] on [parent].", "You put [I] on [parent].") + return TRUE + +/datum/component/construction/unordered/mecha_chassis/durand + result = /datum/component/construction/mecha/durand + steps = list( + /obj/item/mecha_parts/part/durand_torso, + /obj/item/mecha_parts/part/durand_left_arm, + /obj/item/mecha_parts/part/durand_right_arm, + /obj/item/mecha_parts/part/durand_left_leg, + /obj/item/mecha_parts/part/durand_right_leg, + /obj/item/mecha_parts/part/durand_head + ) + +/datum/component/construction/mecha/durand + result = /obj/vehicle/sealed/mecha/combat/durand + base_icon = "durand" + + circuit_control = /obj/item/circuitboard/mecha/durand/main + circuit_periph = /obj/item/circuitboard/mecha/durand/peripherals + circuit_weapon = /obj/item/circuitboard/mecha/durand/targeting + + inner_plating = /obj/item/stack/sheet/metal + inner_plating_amount = 5 + + outer_plating = /obj/item/mecha_parts/part/durand_armor + outer_plating_amount = 1 + +/datum/component/construction/mecha/durand/custom_action(obj/item/I, mob/living/user, diff) + if(!..()) + return FALSE + + //TODO: better messages. + switch(index) + if(1) + user.visible_message("[user] connects [parent] hydraulic systems.", "You connect [parent] hydraulic systems.") + if(2) + if(diff==FORWARD) + user.visible_message("[user] activates [parent] hydraulic systems.", "You activate [parent] hydraulic systems.") + else + user.visible_message("[user] disconnects [parent] hydraulic systems.", "You disconnect [parent] hydraulic systems.") + if(3) + if(diff==FORWARD) + user.visible_message("[user] adds the wiring to [parent].", "You add the wiring to [parent].") + else + user.visible_message("[user] deactivates [parent] hydraulic systems.", "You deactivate [parent] hydraulic systems.") + if(4) + if(diff==FORWARD) + user.visible_message("[user] adjusts the wiring of [parent].", "You adjust the wiring of [parent].") + else + user.visible_message("[user] removes the wiring from [parent].", "You remove the wiring from [parent].") + if(5) + if(diff==FORWARD) + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + else + user.visible_message("[user] disconnects the wiring of [parent].", "You disconnect the wiring of [parent].") + if(6) + if(diff==FORWARD) + user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") + else + user.visible_message("[user] removes the central control module from [parent].", "You remove the central computer mainboard from [parent].") + if(7) + if(diff==FORWARD) + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + else + user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") + if(8) + if(diff==FORWARD) + user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") + else + user.visible_message("[user] removes the peripherals control module from [parent].", "You remove the peripherals control module from [parent].") + if(9) + if(diff==FORWARD) + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + else + user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") + if(10) + if(diff==FORWARD) + user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.") + else + user.visible_message("[user] removes the weapon control module from [parent].", "You remove the weapon control module from [parent].") + if(11) + if(diff==FORWARD) + user.visible_message("[user] installs [I] to [parent].", "You install [I] to [parent].") + else + user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.") + if(12) + if(diff==FORWARD) + user.visible_message("[user] secures the scanner module.", "You secure the scanner module.") + else + user.visible_message("[user] removes the scanner module from [parent].", "You remove the scanner module from [parent].") + if(13) + if(diff==FORWARD) + user.visible_message("[user] installs [I] to [parent].", "You install [I] to [parent].") + else + user.visible_message("[user] unfastens the scanner module.", "You unfasten the scanner module.") + if(14) + if(diff==FORWARD) + user.visible_message("[user] secures the capacitor.", "You secure the capacitor.") + else + user.visible_message("[user] removes the capacitor from [parent].", "You remove the capacitor from [parent].") + if(15) + if(diff==FORWARD) + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + else + user.visible_message("[user] unfastens the capacitor.", "You unfasten the capacitor.") + if(16) + if(diff==FORWARD) + user.visible_message("[user] secures the power cell.", "You secure the power cell.") + else + user.visible_message("[user] pries the power cell from [parent].", "You pry the power cell from [parent].") + if(17) + if(diff==FORWARD) + user.visible_message("[user] installs the internal armor layer to [parent].", "You install the internal armor layer to [parent].") + else + user.visible_message("[user] unfastens the power cell.", "You unfasten the power cell.") + if(18) + if(diff==FORWARD) + user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") + else + user.visible_message("[user] pries internal armor layer from [parent].", "You pry internal armor layer from [parent].") + if(19) + if(diff==FORWARD) + user.visible_message("[user] welds the internal armor layer to [parent].", "You weld the internal armor layer to [parent].") + else + user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") + if(20) + if(diff==FORWARD) + user.visible_message("[user] installs [I] to [parent].", "You install [I] to [parent].") + else + user.visible_message("[user] cuts the internal armor layer from [parent].", "You cut the internal armor layer from [parent].") + if(21) + if(diff==FORWARD) + user.visible_message("[user] secures Durand Armor Plates.", "You secure Durand Armor Plates.") + else + user.visible_message("[user] pries Durand Armor Plates from [parent].", "You pry Durand Armor Plates from [parent].") + if(22) + if(diff==FORWARD) + user.visible_message("[user] welds Durand Armor Plates to [parent].", "You weld Durand Armor Plates to [parent].") + else + user.visible_message("[user] unfastens Durand Armor Plates.", "You unfasten Durand Armor Plates.") + return TRUE + +//PHAZON + +/datum/component/construction/unordered/mecha_chassis/phazon + result = /datum/component/construction/mecha/phazon + steps = list( + /obj/item/mecha_parts/part/phazon_torso, + /obj/item/mecha_parts/part/phazon_left_arm, + /obj/item/mecha_parts/part/phazon_right_arm, + /obj/item/mecha_parts/part/phazon_left_leg, + /obj/item/mecha_parts/part/phazon_right_leg, + /obj/item/mecha_parts/part/phazon_head + ) + +/datum/component/construction/mecha/phazon + result = /obj/vehicle/sealed/mecha/combat/phazon + base_icon = "phazon" + + circuit_control = /obj/item/circuitboard/mecha/phazon/main + circuit_periph = /obj/item/circuitboard/mecha/phazon/peripherals + circuit_weapon = /obj/item/circuitboard/mecha/phazon/targeting + + inner_plating = /obj/item/stack/sheet/plasteel + inner_plating_amount = 5 + + outer_plating = /obj/item/mecha_parts/part/phazon_armor + outer_plating_amount = 1 + +/datum/component/construction/mecha/phazon/get_stockpart_steps() + return list( + list( + "key" = /obj/item/stock_parts/scanning_module, + "action" = ITEM_MOVE_INSIDE, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "Weapon control module is secured." + ), + list( + "key" = TOOL_SCREWDRIVER, + "back_key" = TOOL_CROWBAR, + "desc" = "Scanner module is installed." + ), + list( + "key" = /obj/item/stock_parts/capacitor, + "action" = ITEM_MOVE_INSIDE, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "Scanner module is secured." + ), + list( + "key" = TOOL_SCREWDRIVER, + "back_key" = TOOL_CROWBAR, + "desc" = "Capacitor is installed." + ), + list( + "key" = /obj/item/stack/ore/bluespace_crystal, + "amount" = 1, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "Capacitor is secured." + ), + list( + "key" = /obj/item/stack/cable_coil, + "amount" = 5, + "back_key" = TOOL_CROWBAR, + "desc" = "The bluespace crystal is installed." + ), + list( + "key" = TOOL_SCREWDRIVER, + "back_key" = TOOL_WIRECUTTER, + "desc" = "The bluespace crystal is connected." + ), + list( + "key" = /obj/item/stock_parts/cell, + "action" = ITEM_MOVE_INSIDE, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "The bluespace crystal is engaged." + ), + list( + "key" = TOOL_SCREWDRIVER, + "back_key" = TOOL_CROWBAR, + "desc" = "The power cell is installed.", + "icon_state" = "phazon17" + // This is the point where a step icon is skipped, so "icon_state" had to be set manually starting from here. + ) + ) + +/datum/component/construction/mecha/phazon/get_outer_plating_steps() + return list( + list( + "key" = outer_plating, + "amount" = 1, + "action" = ITEM_DELETE, + "back_key" = TOOL_WELDER, + "desc" = "Internal armor is welded." + ), + list( + "key" = TOOL_WRENCH, + "back_key" = TOOL_CROWBAR, + "desc" = "External armor is installed." + ), + list( + "key" = TOOL_WELDER, + "back_key" = TOOL_WRENCH, + "desc" = "External armor is wrenched." + ), + list( + "key" = /obj/item/assembly/signaler/anomaly/bluespace, + "action" = ITEM_DELETE, + "back_key" = TOOL_WELDER, + "desc" = "Bluespace anomaly core socket is open.", + "icon_state" = "phazon24" + ) + ) + +/datum/component/construction/mecha/phazon/custom_action(obj/item/I, mob/living/user, diff) + if(!..()) + return FALSE + + //TODO: better messages. + switch(index) + if(1) + user.visible_message("[user] connects [parent] hydraulic systems.", "You connect [parent] hydraulic systems.") + if(2) + if(diff==FORWARD) + user.visible_message("[user] activates [parent] hydraulic systems.", "You activate [parent] hydraulic systems.") + else + user.visible_message("[user] disconnects [parent] hydraulic systems.", "You disconnect [parent] hydraulic systems.") + if(3) + if(diff==FORWARD) + user.visible_message("[user] adds the wiring to [parent].", "You add the wiring to [parent].") + else + user.visible_message("[user] deactivates [parent] hydraulic systems.", "You deactivate [parent] hydraulic systems.") + if(4) + if(diff==FORWARD) + user.visible_message("[user] adjusts the wiring of [parent].", "You adjust the wiring of [parent].") + else + user.visible_message("[user] removes the wiring from [parent].", "You remove the wiring from [parent].") + if(5) + if(diff==FORWARD) + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + else + user.visible_message("[user] disconnects the wiring of [parent].", "You disconnect the wiring of [parent].") + if(6) + if(diff==FORWARD) + user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") + else + user.visible_message("[user] removes the central control module from [parent].", "You remove the central computer mainboard from [parent].") + if(7) + if(diff==FORWARD) + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + else + user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") + if(8) + if(diff==FORWARD) + user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") + else + user.visible_message("[user] removes the peripherals control module from [parent].", "You remove the peripherals control module from [parent].") + if(9) + if(diff==FORWARD) + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + else + user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") + if(10) + if(diff==FORWARD) + user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.") + else + user.visible_message("[user] removes the weapon control module from [parent].", "You remove the weapon control module from [parent].") + if(11) + if(diff==FORWARD) + user.visible_message("[user] installs [I] to [parent].", "You install [I] to [parent].") + else + user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.") + if(12) + if(diff==FORWARD) + user.visible_message("[user] secures the scanner module.", "You secure the scanner module.") + else + user.visible_message("[user] removes the scanner module from [parent].", "You remove the scanner module from [parent].") + if(13) + if(diff==FORWARD) + user.visible_message("[user] installs [I] to [parent].", "You install [I] to [parent].") + else + user.visible_message("[user] unfastens the scanner module.", "You unfasten the scanner module.") + if(14) + if(diff==FORWARD) + user.visible_message("[user] secures the capacitor.", "You secure the capacitor.") + else + user.visible_message("[user] removes the capacitor from [parent].", "You remove the capacitor from [parent].") + if(15) + if(diff==FORWARD) + user.visible_message("[user] installs [I].", "You install [I].") + else + user.visible_message("[user] unsecures the capacitor from [parent].", "You unsecure the capacitor from [parent].") + if(16) + if(diff==FORWARD) + user.visible_message("[user] connects the bluespace crystal.", "You connect the bluespace crystal.") + else + user.visible_message("[user] removes the bluespace crystal from [parent].", "You remove the bluespace crystal from [parent].") + if(17) + if(diff==FORWARD) + user.visible_message("[user] engages the bluespace crystal.", "You engage the bluespace crystal.") + else + user.visible_message("[user] disconnects the bluespace crystal from [parent].", "You disconnect the bluespace crystal from [parent].") + if(18) + if(diff==FORWARD) + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + else + user.visible_message("[user] disengages the bluespace crystal.", "You disengage the bluespace crystal.") + if(19) + if(diff==FORWARD) + user.visible_message("[user] secures the power cell.", "You secure the power cell.") + else + user.visible_message("[user] pries the power cell from [parent].", "You pry the power cell from [parent].") + if(20) + if(diff==FORWARD) + user.visible_message("[user] installs the phase armor layer to [parent].", "You install the phase armor layer to [parent].") + else + user.visible_message("[user] unfastens the power cell.", "You unfasten the power cell.") + if(21) + if(diff==FORWARD) + user.visible_message("[user] secures the phase armor layer.", "You secure the phase armor layer.") + else + user.visible_message("[user] pries the phase armor layer from [parent].", "You pry the phase armor layer from [parent].") + if(22) + if(diff==FORWARD) + user.visible_message("[user] welds the phase armor layer to [parent].", "You weld the phase armor layer to [parent].") + else + user.visible_message("[user] unfastens the phase armor layer.", "You unfasten the phase armor layer.") + if(23) + if(diff==FORWARD) + user.visible_message("[user] installs [I] to [parent].", "You install [I] to [parent].") + else + user.visible_message("[user] cuts phase armor layer from [parent].", "You cut the phase armor layer from [parent].") + if(24) + if(diff==FORWARD) + user.visible_message("[user] secures Phazon Armor Plates.", "You secure Phazon Armor Plates.") + else + user.visible_message("[user] pries Phazon Armor Plates from [parent].", "You pry Phazon Armor Plates from [parent].") + if(25) + if(diff==FORWARD) + user.visible_message("[user] welds Phazon Armor Plates to [parent].", "You weld Phazon Armor Plates to [parent].") + else + user.visible_message("[user] unfastens Phazon Armor Plates.", "You unfasten Phazon Armor Plates.") + if(26) + if(diff==FORWARD) + user.visible_message("[user] carefully inserts the bluespace anomaly core into [parent] and secures it.", + "You slowly place the bluespace anomaly core into its socket and close its chamber.") + return TRUE + +//ODYSSEUS + +/datum/component/construction/unordered/mecha_chassis/odysseus + result = /datum/component/construction/mecha/odysseus + steps = list( + /obj/item/mecha_parts/part/odysseus_torso, + /obj/item/mecha_parts/part/odysseus_head, + /obj/item/mecha_parts/part/odysseus_left_arm, + /obj/item/mecha_parts/part/odysseus_right_arm, + /obj/item/mecha_parts/part/odysseus_left_leg, + /obj/item/mecha_parts/part/odysseus_right_leg + ) + +/datum/component/construction/mecha/odysseus + result = /obj/vehicle/sealed/mecha/medical/odysseus + base_icon = "odysseus" + + circuit_control = /obj/item/circuitboard/mecha/odysseus/main + circuit_periph = /obj/item/circuitboard/mecha/odysseus/peripherals + + inner_plating = /obj/item/stack/sheet/metal + inner_plating_amount = 5 + + outer_plating = /obj/item/stack/sheet/plasteel + outer_plating_amount = 5 + +/datum/component/construction/mecha/odysseus/custom_action(obj/item/I, mob/living/user, diff) + if(!..()) + return FALSE + + //TODO: better messages. + switch(index) + if(1) + user.visible_message("[user] connects [parent] hydraulic systems.", "You connect [parent] hydraulic systems.") + if(2) + if(diff==FORWARD) + user.visible_message("[user] activates [parent] hydraulic systems.", "You activate [parent] hydraulic systems.") + else + user.visible_message("[user] disconnects [parent] hydraulic systems.", "You disconnect [parent] hydraulic systems.") + if(3) + if(diff==FORWARD) + user.visible_message("[user] adds the wiring to [parent].", "You add the wiring to [parent].") + else + user.visible_message("[user] deactivates [parent] hydraulic systems.", "You deactivate [parent] hydraulic systems.") + if(4) + if(diff==FORWARD) + user.visible_message("[user] adjusts the wiring of [parent].", "You adjust the wiring of [parent].") + else + user.visible_message("[user] removes the wiring from [parent].", "You remove the wiring from [parent].") + if(5) + if(diff==FORWARD) + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + else + user.visible_message("[user] disconnects the wiring of [parent].", "You disconnect the wiring of [parent].") + if(6) + if(diff==FORWARD) + user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") + else + user.visible_message("[user] removes the central control module from [parent].", "You remove the central computer mainboard from [parent].") + if(7) + if(diff==FORWARD) + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + else + user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") + if(8) + if(diff==FORWARD) + user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") + else + user.visible_message("[user] removes the peripherals control module from [parent].", "You remove the peripherals control module from [parent].") + if(9) + if(diff==FORWARD) + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + else + user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") + if(10) + if(diff==FORWARD) + user.visible_message("[user] secures the scanner module.", "You secure the scanner module.") + else + user.visible_message("[user] removes the scanner module from [parent].", "You remove the scanner module from [parent].") + if(11) + if(diff==FORWARD) + user.visible_message("[user] installs [I] to [parent].", "You install [I] to [parent].") + else + user.visible_message("[user] unfastens the scanner module.", "You unfasten the scanner module.") + if(12) + if(diff==FORWARD) + user.visible_message("[user] secures the capacitor.", "You secure the capacitor.") + else + user.visible_message("[user] removes the capacitor from [parent].", "You remove the capacitor from [parent].") + if(13) + if(diff==FORWARD) + user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + else + user.visible_message("[user] unfastens the capacitor.", "You unfasten the capacitor.") + if(14) + if(diff==FORWARD) + user.visible_message("[user] secures the power cell.", "You secure the power cell.") + else + user.visible_message("[user] pries the power cell from [parent].", "You pry the power cell from [parent].") + if(15) + if(diff==FORWARD) + user.visible_message("[user] installs the internal armor layer to [parent].", "You install the internal armor layer to [parent].") + else + user.visible_message("[user] unfastens the power cell.", "You unfasten the power cell.") + if(16) + if(diff==FORWARD) + user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") + else + user.visible_message("[user] pries internal armor layer from [parent].", "You pry internal armor layer from [parent].") + if(17) + if(diff==FORWARD) + user.visible_message("[user] welds the internal armor layer to [parent].", "You weld the internal armor layer to [parent].") + else + user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") + if(18) + if(diff==FORWARD) + user.visible_message("[user] installs the external armor layer to [parent].", "You install the external reinforced armor layer to [parent].") + else + user.visible_message("[user] cuts the internal armor layer from [parent].", "You cut the internal armor layer from [parent].") + if(19) + if(diff==FORWARD) + user.visible_message("[user] secures the external armor layer.", "You secure the external reinforced armor layer.") + else + user.visible_message("[user] pries the external armor layer from [parent].", "You pry the external armor layer from [parent].") + if(20) + if(diff==FORWARD) + user.visible_message("[user] welds the external armor layer to [parent].", "You weld the external armor layer to [parent].") + else + user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.") + return TRUE diff --git a/code/game/mecha/mecha_control_console.dm b/code/modules/vehicles/mecha/mecha_control_console.dm similarity index 77% rename from code/game/mecha/mecha_control_console.dm rename to code/modules/vehicles/mecha/mecha_control_console.dm index ab547f4ccd..38224fbbdd 100644 --- a/code/game/mecha/mecha_control_console.dm +++ b/code/modules/vehicles/mecha/mecha_control_console.dm @@ -16,29 +16,29 @@ var/list/data = list() var/list/trackerlist = list() - for(var/obj/mecha/MC in GLOB.mechas_list) + for(var/obj/vehicle/sealed/mecha/MC in GLOB.mechas_list) trackerlist += MC.trackers data["mechs"] = list() for(var/obj/item/mecha_parts/mecha_tracking/MT in trackerlist) if(!MT.chassis) continue - var/obj/mecha/M = MT.chassis + var/obj/vehicle/sealed/mecha/M = MT.chassis var/list/mech_data = list( name = M.name, integrity = round((M.obj_integrity / M.max_integrity) * 100), charge = M.cell ? round(M.cell.percent()) : null, airtank = M.internal_tank ? M.return_pressure() : null, - pilot = list(M.occupant), + pilot = M.return_drivers(), location = get_area_name(M, TRUE), active_equipment = M.selected, emp_recharging = MT.recharging, tracker_ref = REF(MT) ) - if(istype(M, /obj/mecha/working/ripley)) - var/obj/mecha/working/ripley/RM = M + if(istype(M, /obj/vehicle/sealed/mecha/working/ripley)) + var/obj/vehicle/sealed/mecha/working/ripley/RM = M mech_data += list( - cargo_space = round((LAZYLEN(RM.cargo) / RM.cargo_capacity) * 100) + cargo_space = round((RM.cargo.len / RM.cargo_capacity) * 100) ) data["mechs"] += list(mech_data) @@ -46,8 +46,7 @@ return data /obj/machinery/computer/mecha/ui_act(action, params) - . = ..() - if(.) + if(..()) return switch(action) @@ -56,20 +55,20 @@ if(!istype(MT)) return var/message = stripped_input(usr, "Input message", "Transmit message") - var/obj/mecha/M = MT.chassis + var/obj/vehicle/sealed/mecha/M = MT.chassis if(trim(message) && M) - to_chat(M.occupant, message) + to_chat(M.occupants, message) to_chat(usr, "Message sent.") . = TRUE if("shock") var/obj/item/mecha_parts/mecha_tracking/MT = locate(params["tracker_ref"]) if(!istype(MT)) return - var/obj/mecha/M = MT.chassis + var/obj/vehicle/sealed/mecha/M = MT.chassis if(M) MT.shock() - log_game("[key_name(usr)] has activated remote EMP on exosuit [M], located at [loc_name(M)], which [M.occupant ? "has the occupants [M.occupant]." : "without a pilot."] ") - message_admins("[key_name_admin(usr)][ADMIN_FLW(usr)] has activated remote EMP on exosuit [M][ADMIN_JMP(M)], which is currently [M.occupant ? "occupied by [M.occupant][ADMIN_FLW(M)]." : "without a pilot."] ") + log_game("[key_name(usr)] has activated remote EMP on exosuit [M], located at [loc_name(M)], which [M.occupants ? "has the occupants [M.occupants]." : "without a pilot."] ") + message_admins("[key_name_admin(usr)][ADMIN_FLW(usr)] has activated remote EMP on exosuit [M][ADMIN_JMP(M)], which is currently [M.occupants ? "occupied by [M.occupants][ADMIN_FLW(M)]." : "without a pilot."] ") . = TRUE /obj/item/mecha_parts/mecha_tracking @@ -83,11 +82,11 @@ /// Cooldown variable for EMP pulsing var/recharging = FALSE /// The Mecha that this tracking beacon is attached to - var/obj/mecha/chassis + var/obj/vehicle/sealed/mecha/chassis /** - * Returns a html formatted string describing attached mech status - */ + * Returns a html formatted string describing attached mech status + */ /obj/item/mecha_parts/mecha_tracking/proc/get_mecha_info() if(!chassis) return FALSE @@ -97,12 +96,12 @@ Integrity: [round((chassis.obj_integrity/chassis.max_integrity * 100), 0.01)]%
Cell Charge: [isnull(cell_charge) ? "Not Found":"[chassis.cell.percent()]%"]
Airtank: [chassis.internal_tank ? "[round(chassis.return_pressure(), 0.01)]" : "Not Equipped"] kPa
- Pilot: [chassis.occupant || "None"]
+ Pilot: [chassis.return_drivers() || "None"]
Location: [get_area_name(chassis, TRUE) || "Unknown"]
Active Equipment: [chassis.selected || "None"]"} - if(istype(chassis, /obj/mecha/working/ripley)) - var/obj/mecha/working/ripley/RM = chassis - answer += "
Used Cargo Space: [round((LAZYLEN(RM.cargo) / RM.cargo_capacity * 100), 0.01)]%" + if(istype(chassis, /obj/vehicle/sealed/mecha/working/ripley)) + var/obj/vehicle/sealed/mecha/working/ripley/RM = chassis + answer += "
Used Cargo Space: [round((RM.cargo.len / RM.cargo_capacity * 100), 0.01)]%" return answer @@ -118,7 +117,7 @@ chassis = null return ..() -/obj/item/mecha_parts/mecha_tracking/try_attach_part(mob/user, obj/mecha/M) +/obj/item/mecha_parts/mecha_tracking/try_attach_part(mob/user, obj/vehicle/sealed/mecha/M) if(!..()) return M.trackers += src @@ -126,8 +125,8 @@ chassis = M /** - * Attempts to EMP mech that the tracker is attached to, if there is one and tracker is not on cooldown - */ + * Attempts to EMP mech that the tracker is attached to, if there is one and tracker is not on cooldown + */ /obj/item/mecha_parts/mecha_tracking/proc/shock() if(recharging) return @@ -137,8 +136,8 @@ recharging = TRUE /** - * Resets recharge variable, allowing tracker to be EMP pulsed again - */ + * Resets recharge variable, allowing tracker to be EMP pulsed again + */ /obj/item/mecha_parts/mecha_tracking/proc/recharge() recharging = FALSE diff --git a/code/modules/vehicles/mecha/mecha_defense.dm b/code/modules/vehicles/mecha/mecha_defense.dm new file mode 100644 index 0000000000..39a1b74709 --- /dev/null +++ b/code/modules/vehicles/mecha/mecha_defense.dm @@ -0,0 +1,390 @@ +/obj/vehicle/sealed/mecha/proc/get_armour_facing(relative_dir) + switch(relative_dir) + if(180) // BACKSTAB! + return facing_modifiers[MECHA_BACK_ARMOUR] + if(0, 45) // direct or 45 degrees off + return facing_modifiers[MECHA_FRONT_ARMOUR] + return facing_modifiers[MECHA_SIDE_ARMOUR] //if its not a front hit or back hit then assume its from the side + +/obj/vehicle/sealed/mecha/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) + . = ..() + if(. && obj_integrity > 0) + spark_system.start() + switch(damage_flag) + if(FIRE) + check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL)) + if(MELEE) + check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) + else + check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT)) + if(. >= 5 || prob(33)) + to_chat(occupants, "[icon2html(src, occupants)]Taking damage!") + log_message("Took [damage_amount] points of damage. Damage type: [damage_type]", LOG_MECHA) + +/obj/vehicle/sealed/mecha/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) + . = ..() + if(!damage_amount) + return 0 + var/booster_deflection_modifier = 1 + var/booster_damage_modifier = 1 + if(damage_flag == BULLET || damage_flag == LASER || damage_flag == ENERGY) + for(var/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster/B in equipment) + if(B.projectile_react()) + booster_deflection_modifier = B.deflect_coeff + booster_damage_modifier = B.damage_coeff + break + else if(damage_flag == MELEE) + for(var/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster/B in equipment) + if(B.attack_react()) + booster_deflection_modifier *= B.deflect_coeff + booster_damage_modifier *= B.damage_coeff + break + + if(attack_dir) + var/facing_modifier = get_armour_facing(abs(dir2angle(dir) - dir2angle(attack_dir))) + booster_damage_modifier /= facing_modifier + booster_deflection_modifier *= facing_modifier + if(prob(deflect_chance * booster_deflection_modifier)) + visible_message("[src]'s armour deflects the attack!") + log_message("Armor saved.", LOG_MECHA) + return 0 + if(.) + . *= booster_damage_modifier + +/obj/vehicle/sealed/mecha/attack_hand(mob/living/user) + . = ..() + if(.) + return + user.do_attack_animation(src, ATTACK_EFFECT_PUNCH) + playsound(loc, 'sound/weapons/tap.ogg', 40, TRUE, -1) + user.visible_message("[user] hits [name]. Nothing happens.", null, null, COMBAT_MESSAGE_RANGE) + log_message("Attack by hand/paw. Attacker - [user].", LOG_MECHA, color="red") + +/obj/vehicle/sealed/mecha/attack_paw(mob/user as mob) + return attack_hand(user) + +/obj/vehicle/sealed/mecha/attack_alien(mob/living/user) + log_message("Attack by alien. Attacker - [user].", LOG_MECHA, color="red") + playsound(src.loc, 'sound/weapons/slash.ogg', 100, TRUE) + attack_generic(user, 15, BRUTE, MELEE, 0) + +/obj/vehicle/sealed/mecha/attack_animal(mob/living/simple_animal/user) + log_message("Attack by simple animal. Attacker - [user].", LOG_MECHA, color="red") + if(!user.melee_damage_upper && !user.obj_damage) + user.emote("custom", message = "[user.friendly_verb_continuous] [src].") + return 0 + else + var/play_soundeffect = 1 + if(user.environment_smash) + play_soundeffect = 0 + playsound(src, 'sound/effects/bang.ogg', 50, TRUE) + var/animal_damage = rand(user.melee_damage_lower,user.melee_damage_upper) + if(user.obj_damage) + animal_damage = user.obj_damage + animal_damage = min(animal_damage, 20*user.environment_smash) + log_combat(user, src, "attacked") + attack_generic(user, animal_damage, user.melee_damage_type, MELEE, play_soundeffect) + return 1 + + +/obj/vehicle/sealed/mecha/hulk_damage() + return 15 + +/obj/vehicle/sealed/mecha/attack_hulk(mob/living/carbon/human/user) + . = ..() + if(.) + log_message("Attack by hulk. Attacker - [user].", LOG_MECHA, color="red") + log_combat(user, src, "punched", "hulk powers") + +/obj/vehicle/sealed/mecha/blob_act(obj/structure/blob/B) + log_message("Attack by blob. Attacker - [B].", LOG_MECHA, color="red") + take_damage(30, BRUTE, MELEE, 0, get_dir(src, B)) + +/obj/vehicle/sealed/mecha/attack_tk() + return + +/obj/vehicle/sealed/mecha/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) //wrapper + log_message("Hit by [AM].", LOG_MECHA, color="red") + . = ..() + +/obj/vehicle/sealed/mecha/bullet_act(obj/item/projectile/Proj) //wrapper + if(!enclosed && LAZYLEN(occupants) && !(mecha_flags & SILICON_PILOT) && !Proj.force_hit && (Proj.def_zone == BODY_ZONE_HEAD || Proj.def_zone == BODY_ZONE_CHEST)) //allows bullets to hit the pilot of open-canopy mechs + for(var/m in occupants) + var/mob/living/hitmob = m + hitmob.bullet_act(Proj) //If the sides are open, the occupant can be hit + return BULLET_ACT_HIT + log_message("Hit by projectile. Type: [Proj.name]([Proj.flag]).", LOG_MECHA, color="red") + . = ..() + +/obj/vehicle/sealed/mecha/ex_act(severity, target) + log_message("Affected by explosion of severity: [severity].", LOG_MECHA, color="red") + if(prob(deflect_chance)) + severity++ + log_message("Armor saved, changing severity to [severity]", LOG_MECHA) + . = ..() + + +/obj/vehicle/sealed/mecha/contents_explosion(severity, target, origin) + severity++ + for(var/X in equipment) + var/obj/item/mecha_parts/mecha_equipment/ME = X + ME.ex_act(severity, target, origin) + for(var/Y in trackers) + var/obj/item/mecha_parts/mecha_tracking/MT = Y + MT.ex_act(severity, target, origin) + for(var/Z in occupants) + var/mob/living/occupant = Z + occupant.ex_act(severity, target, origin) + +/obj/vehicle/sealed/mecha/handle_atom_del(atom/A) + if(A in occupants) + LAZYREMOVE(occupants, A) + icon_state = initial(icon_state)+"-open" + setDir(dir_in) + +/obj/vehicle/sealed/mecha/emp_act(severity) + . = ..() + if (. & EMP_PROTECT_SELF) + return + if(get_charge()) + use_power((cell.charge/3)/(severity*2)) + take_damage(30 / severity, BURN, ENERGY, 1) + log_message("EMP detected", LOG_MECHA, color="red") + + if(istype(src, /obj/vehicle/sealed/mecha/combat)) + mouse_pointer = 'icons/effects/mouse_pointers/mecha_mouse-disable.dmi' + for(var/occus in occupants) + var/mob/living/occupant = occus + occupant.update_mouse_pointer() + if(!equipment_disabled && occupants) //prevent spamming this message with back-to-back EMPs + to_chat(occupants, "Error -- Connection to equipment control unit has been lost.
") + addtimer(CALLBACK(src, /obj/vehicle/sealed/mecha/proc/restore_equipment), 3 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) + equipment_disabled = 1 + +/obj/vehicle/sealed/mecha/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) + if(exposed_temperature>max_temperature) + log_message("Exposed to dangerous temperature.", LOG_MECHA, color="red") + take_damage(5, BURN, 0, 1) + +/obj/vehicle/sealed/mecha/attackby(obj/item/W, mob/user, params) + + if(istype(W, /obj/item/mmi)) + if(mmi_move_inside(W,user)) + to_chat(user, "[src]-[W] interface initialized successfully.") + else + to_chat(user, "[src]-[W] interface initialization failed.") + return + + if(istype(W, /obj/item/mecha_ammo)) + ammo_resupply(W, user) + return + + if(W.GetID()) + if((mecha_flags & ADDING_ACCESS_POSSIBLE) || (mecha_flags & ADDING_MAINT_ACCESS_POSSIBLE)) + if(internals_access_allowed(user)) + var/obj/item/card/id/id_card + if(istype(W, /obj/item/card/id)) + id_card = W + else + var/obj/item/pda/pda = W + id_card = pda.id + output_maintenance_dialog(id_card, user) + return + to_chat(user, "Invalid ID: Access denied.") + return + to_chat(user, "Maintenance protocols disabled by operator.") + return + + if(istype(W, /obj/item/stock_parts/cell)) + if(construction_state == MECHA_OPEN_HATCH) + if(!cell) + if(!user.transferItemToLoc(W, src, silent = FALSE)) + return + var/obj/item/stock_parts/cell/C = W + to_chat(user, "You install the power cell.") + playsound(src, 'sound/items/screwdriver2.ogg', 50, FALSE) + cell = C + log_message("Power cell installed", LOG_MECHA) + else + to_chat(user, "There's already a power cell installed!") + return + + if(istype(W, /obj/item/stock_parts/scanning_module)) + if(construction_state == MECHA_OPEN_HATCH) + if(!scanmod) + if(!user.transferItemToLoc(W, src)) + return + to_chat(user, "You install the scanning module.") + playsound(src, 'sound/items/screwdriver2.ogg', 50, FALSE) + scanmod = W + log_message("[W] installed", LOG_MECHA) + update_part_values() + else + to_chat(user, "There's already a scanning module installed!") + return + + if(istype(W, /obj/item/stock_parts/capacitor)) + if(construction_state == MECHA_OPEN_HATCH) + if(!capacitor) + if(!user.transferItemToLoc(W, src)) + return + to_chat(user, "You install the capacitor.") + playsound(src, 'sound/items/screwdriver2.ogg', 50, FALSE) + capacitor = W + log_message("[W] installed", LOG_MECHA) + update_part_values() + else + to_chat(user, "There's already a capacitor installed!") + return + + if(istype(W, /obj/item/stack/cable_coil)) + if(construction_state == MECHA_OPEN_HATCH && (internal_damage & MECHA_INT_SHORT_CIRCUIT)) + var/obj/item/stack/cable_coil/CC = W + if(CC.use(2)) + clearInternalDamage(MECHA_INT_SHORT_CIRCUIT) + to_chat(user, "You replace the fused wires.") + else + to_chat(user, "You need two lengths of cable to fix this mech!") + return + + if(istype(W, /obj/item/mecha_parts)) + var/obj/item/mecha_parts/P = W + P.try_attach_part(user, src) + return + if(istype(W, /obj/item/analyzer)) + if(construction_state) + var/datum/gas_mixture/GasNux = internal_tank.return_air() + atmosanalyzer_scan(GasNux,user,src,TRUE) + else + atmosanalyzer_scan(cabin_air,user,src,TRUE) + return + log_message("Attacked by [W]. Attacker - [user]", LOG_MECHA) + return ..() + +/obj/vehicle/sealed/mecha/wrench_act(mob/living/user, obj/item/I) + ..() + . = TRUE + if(construction_state == MECHA_SECURE_BOLTS) + construction_state = MECHA_LOOSE_BOLTS + to_chat(user, "You undo the securing bolts.") + return + if(construction_state == MECHA_LOOSE_BOLTS) + construction_state = MECHA_SECURE_BOLTS + to_chat(user, "You tighten the securing bolts.") + +/obj/vehicle/sealed/mecha/crowbar_act(mob/living/user, obj/item/I) + ..() + . = TRUE + if(construction_state == MECHA_LOOSE_BOLTS) + construction_state = MECHA_OPEN_HATCH + to_chat(user, "You open the hatch to the power unit.") + return + if(construction_state == MECHA_OPEN_HATCH) + construction_state = MECHA_LOOSE_BOLTS + to_chat(user, "You close the hatch to the power unit.") + +/obj/vehicle/sealed/mecha/screwdriver_act(mob/living/user, obj/item/I) + ..() + . = TRUE + if(internal_damage & MECHA_INT_TEMP_CONTROL) + clearInternalDamage(MECHA_INT_TEMP_CONTROL) + to_chat(user, "You repair the damaged temperature controller.") + return + +/obj/vehicle/sealed/mecha/welder_act(mob/living/user, obj/item/W) + . = ..() + if(user.a_intent == INTENT_HARM) + return + . = TRUE + if(internal_damage & MECHA_INT_TANK_BREACH) + if(!W.use_tool(src, user, 0, volume=50, amount=1)) + return + clearInternalDamage(MECHA_INT_TANK_BREACH) + to_chat(user, "You repair the damaged gas tank.") + return + if(obj_integrity < max_integrity) + if(!W.use_tool(src, user, 0, volume=50, amount=1)) + return + user.visible_message("[user] repairs some damage to [name].", "You repair some damage to [src].") + obj_integrity += min(10, max_integrity-obj_integrity) + if(obj_integrity == max_integrity) + to_chat(user, "It looks to be fully repaired now.") + return + to_chat(user, "The [name] is at full integrity!") + +/obj/vehicle/sealed/mecha/proc/mech_toxin_damage(mob/living/target) + playsound(src, 'sound/effects/spray2.ogg', 50, TRUE) + if(target.reagents) + if(target.reagents.get_reagent_amount(/datum/reagent/cryptobiolin) + force < force*2) + target.reagents.add_reagent(/datum/reagent/cryptobiolin, force/2) + if(target.reagents.get_reagent_amount(/datum/reagent/toxin) + force < force*2) + target.reagents.add_reagent(/datum/reagent/toxin, force/2.5) + + +/obj/vehicle/sealed/mecha/mech_melee_attack(obj/vehicle/sealed/mecha/M, mob/user) + if(!has_charge(melee_energy_drain)) + return NONE + use_power(melee_energy_drain) + if(M.damtype == BRUTE || M.damtype == BURN) + log_combat(user, src, "attacked", M, "(INTENT: [uppertext(user.a_intent)]) (DAMTYPE: [uppertext(M.damtype)])") + . = ..() + +/obj/vehicle/sealed/mecha/proc/full_repair(charge_cell) + obj_integrity = max_integrity + if(cell && charge_cell) + cell.charge = cell.maxcharge + if(internal_damage & MECHA_INT_FIRE) + clearInternalDamage(MECHA_INT_FIRE) + if(internal_damage & MECHA_INT_TEMP_CONTROL) + clearInternalDamage(MECHA_INT_TEMP_CONTROL) + if(internal_damage & MECHA_INT_SHORT_CIRCUIT) + clearInternalDamage(MECHA_INT_SHORT_CIRCUIT) + if(internal_damage & MECHA_INT_TANK_BREACH) + clearInternalDamage(MECHA_INT_TANK_BREACH) + if(internal_damage & MECHA_INT_CONTROL_LOST) + clearInternalDamage(MECHA_INT_CONTROL_LOST) + +/obj/vehicle/sealed/mecha/narsie_act() + emp_act(80) + +/obj/vehicle/sealed/mecha/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect) + if(!no_effect) + if(selected) + used_item = selected + else if(!visual_effect_icon) + visual_effect_icon = ATTACK_EFFECT_SMASH + if(damtype == BURN) + visual_effect_icon = ATTACK_EFFECT_MECHFIRE + else if(damtype == TOX) + visual_effect_icon = ATTACK_EFFECT_MECHTOXIN + ..() + +/obj/vehicle/sealed/mecha/obj_destruction() + if(wreckage) + var/mob/living/silicon/ai/AI + for(var/crew in occupants) + if(isAI(crew)) + if(AI) + var/mob/living/silicon/ai/unlucky_ais = crew + unlucky_ais.gib() + continue + AI = crew + var/obj/structure/mecha_wreckage/WR = new wreckage(loc, AI) + for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) + if(E.salvageable && prob(30)) + WR.crowbar_salvage += E + E.detach(WR) //detaches from src into WR + E.equip_ready = 1 + else + E.detach(loc) + qdel(E) + if(cell) + WR.crowbar_salvage += cell + cell.forceMove(WR) + cell.charge = rand(0, cell.charge) + cell = null + if(internal_tank) + WR.crowbar_salvage += internal_tank + internal_tank.forceMove(WR) + cell = null + . = ..() diff --git a/code/game/mecha/mecha_parts.dm b/code/modules/vehicles/mecha/mecha_parts.dm similarity index 95% rename from code/game/mecha/mecha_parts.dm rename to code/modules/vehicles/mecha/mecha_parts.dm index 8a9e4e641f..31c4c72a2b 100644 --- a/code/game/mecha/mecha_parts.dm +++ b/code/modules/vehicles/mecha/mecha_parts.dm @@ -9,13 +9,16 @@ w_class = WEIGHT_CLASS_GIGANTIC flags_1 = CONDUCT_1 -/obj/item/mecha_parts/proc/try_attach_part(mob/user, obj/mecha/M) //For attaching parts to a finished mech +/obj/item/mecha_parts/proc/try_attach_part(mob/user, obj/vehicle/sealed/mecha/M) //For attaching parts to a finished mech if(!user.transferItemToLoc(src, M)) to_chat(user, "\The [src] is stuck to your hand, you cannot put it in \the [M]!") return FALSE user.visible_message("[user] attaches [src] to [M].", "You attach [src] to [M].") return TRUE - + +/obj/item/mecha_parts/part/try_attach_part(mob/user, obj/vehicle/sealed/mecha/M) + return + /obj/item/mecha_parts/chassis name = "Mecha Chassis" icon_state = "backbone" @@ -58,6 +61,12 @@ desc = "A Ripley APLU right leg. Contains somewhat complex servodrives and balance maintaining systems." icon_state = "ripley_r_leg" + +//Firefighter +/obj/item/mecha_parts/chassis/firefighter + name = "\improper Firefighter chassis" + construct_type = /datum/component/construction/unordered/mecha_chassis/firefighter + ///////// Odysseus /obj/item/mecha_parts/chassis/odysseus @@ -220,12 +229,6 @@ desc = "A set of armor plates for the Durand. Built heavy to resist an incredible amount of brute force." icon_state = "durand_armor" -////////// Firefighter - -/obj/item/mecha_parts/chassis/firefighter - name = "\improper Firefighter chassis" - construct_type = /datum/component/construction/unordered/mecha_chassis/firefighter - ////////// HONK @@ -270,6 +273,11 @@ name = "\improper Phazon chassis" construct_type = /datum/component/construction/unordered/mecha_chassis/phazon +/obj/item/mecha_parts/chassis/phazon/attackby(obj/item/I, mob/user, params) + . = ..() + if(istype(I, /obj/item/assembly/signaler/anomaly) && !istype(I, /obj/item/assembly/signaler/anomaly/bluespace)) + to_chat(user, "The anomaly core socket only accepts bluespace anomaly cores!") + /obj/item/mecha_parts/part/phazon_torso name="\improper Phazon torso" desc="A Phazon torso part. The socket for the bluespace core that powers the exosuit's unique phase drives is located in the middle." @@ -312,7 +320,6 @@ name = "exosuit circuit board" icon = 'icons/obj/module.dmi' icon_state = "std_mod" - item_state = "electronic" lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' flags_1 = CONDUCT_1 @@ -385,3 +392,11 @@ /obj/item/circuitboard/mecha/phazon/main name = "Phazon Central Control module (Exosuit Board)" + +/obj/item/circuitboard/mecha/clarke/peripherals + name = "Clarke Peripherals Control module (Exosuit Board)" + icon_state = "mcontroller" + +/obj/item/circuitboard/mecha/clarke/main + name = "Clarke Central Control module (Exosuit Board)" + icon_state = "mainboard" diff --git a/code/modules/vehicles/mecha/mecha_topic.dm b/code/modules/vehicles/mecha/mecha_topic.dm new file mode 100644 index 0000000000..eb7dcd01db --- /dev/null +++ b/code/modules/vehicles/mecha/mecha_topic.dm @@ -0,0 +1,421 @@ + +//////////////////////////////////// +///// Rendering stats window /////// +//////////////////////////////////// + +/obj/vehicle/sealed/mecha/proc/get_stats_html(mob/user) + . = {" + + + [name] data + + + + +
+ [get_stats_part(user)] +
+
+ [get_equipment_list()] +
+
+
+ [get_commands()] +
+
+ [get_equipment_menu()] +
+ + "} + +///Returns the status of the mech. +/obj/vehicle/sealed/mecha/proc/get_stats_part(mob/user) + var/integrity = obj_integrity/max_integrity*100 + var/cell_charge = get_charge() + var/datum/gas_mixture/int_tank_air = 0 + var/tank_pressure = 0 + var/tank_temperature = 0 + var/cabin_pressure = 0 + if (internal_tank) + int_tank_air = internal_tank.return_air() + tank_pressure = internal_tank ? round(int_tank_air.return_pressure(),0.01) : "None" + tank_temperature = internal_tank ? int_tank_air.return_temperature() : "Unknown" + cabin_pressure = round(return_pressure(),0.01) + . = {"[report_internal_damage()] + [integrity<30?"DAMAGE LEVEL CRITICAL
":null] + Integrity: [integrity]%
+ Power cell charge: [isnull(cell_charge)?"No power cell installed":"[cell.percent()]%"]
+ Air source: [internal_tank?"[use_internal_tank?"Internal Airtank":"Environment"]":"Environment"]
+ Airtank pressure: [internal_tank?"[tank_pressure]kPa":"N/A"]
+ Airtank temperature: [internal_tank?"[tank_temperature]°K|[tank_temperature - T0C]°C":"N/A"]
+ Cabin pressure: [internal_tank?"[cabin_pressure>WARNING_HIGH_PRESSURE ? "[cabin_pressure]": cabin_pressure]kPa":"N/A"]
+ Cabin temperature: [internal_tank?"[return_temperature()]°K|[return_temperature() - T0C]°C":"N/A"]
+ [dna_lock?"DNA-locked:
[dna_lock] \[Reset\]
":""]
"} + . += "[get_actions(user)]
" + +///Returns HTML for mech actions. Ideally, this proc would be empty for the base mecha. Segmented for easy refactoring. +/obj/vehicle/sealed/mecha/proc/get_actions(mob/user) + . = "" + . += "[LAZYACCESSASSOC(occupant_actions, user, /datum/action/vehicle/sealed/mecha/mech_defense_mode) ? "Defense Mode: [defense_mode ? "Enabled" : "Disabled"]
" : ""]" + . += "[LAZYACCESSASSOC(occupant_actions, user, /datum/action/vehicle/sealed/mecha/mech_overload_mode) ? "Leg Actuators Overload: [leg_overload_mode ? "Enabled" : "Disabled"]
" : ""]" + . += "[LAZYACCESSASSOC(occupant_actions, user, /datum/action/vehicle/sealed/mecha/mech_smoke) ? "Smoke Charges remaining: [smoke_charges]
" : ""]" + . += "[LAZYACCESSASSOC(occupant_actions, user, /datum/action/vehicle/sealed/mecha/mech_zoom) ? "Zoom: [zoom_mode ? "Enabled" : "Disabled"]
" : ""]" + . += "[LAZYACCESSASSOC(occupant_actions, user, /datum/action/vehicle/sealed/mecha/mech_switch_damtype) ? "Damtype: [damtype]
" : ""]" + . += "[LAZYACCESSASSOC(occupant_actions, user, /datum/action/vehicle/sealed/mecha/mech_toggle_phasing) ? "Phase Modulator: [phasing ? "Enabled" : "Disabled"]
" : ""]" + +///HTML for internal damage. +/obj/vehicle/sealed/mecha/proc/report_internal_damage() + . = "" + var/list/dam_reports = list( + "[MECHA_INT_FIRE]" = "INTERNAL FIRE", + "[MECHA_INT_TEMP_CONTROL]" = "LIFE SUPPORT SYSTEM MALFUNCTION", + "[MECHA_INT_TANK_BREACH]" = "GAS TANK BREACH", + "[MECHA_INT_CONTROL_LOST]" = "COORDINATION SYSTEM CALIBRATION FAILURE - Recalibrate", + "[MECHA_INT_SHORT_CIRCUIT]" = "SHORT CIRCUIT" + ) + for(var/tflag in dam_reports) + var/intdamflag = text2num(tflag) + if(internal_damage & intdamflag) + . += dam_reports[tflag] + . += "
" + if(return_pressure() > WARNING_HIGH_PRESSURE) + . += "DANGEROUSLY HIGH CABIN PRESSURE
" + +///HTML for list of equipment. +/obj/vehicle/sealed/mecha/proc/get_equipment_list() //outputs mecha equipment list in html + if(!LAZYLEN(equipment)) + return + . = "Equipment:
" + for(var/obj/item/mecha_parts/mecha_equipment/MT in equipment) + . += "
[MT.get_equip_info()]
" + . += "
" + +///HTML for commands. +/obj/vehicle/sealed/mecha/proc/get_commands() + . = {" +
+
Electronics
+ +
+ "} + + +/obj/vehicle/sealed/mecha/proc/get_equipment_menu() //outputs mecha html equipment menu + . = {" +
+
Equipment
+ +
"} + +/obj/vehicle/sealed/mecha/proc/output_access_dialog(obj/item/card/id/id_card, mob/user) + if(!id_card || !user) + return + . = {" + + + + + +

Following keycodes are present in this system:

"} + for(var/a in operation_req_access) + . += "[get_access_desc(a)] - Delete
" + . += "

Following keycodes were detected on portable device:

" + for(var/a in id_card.access) + if(a in operation_req_access) + continue + var/a_name = get_access_desc(a) + if(!a_name) + continue //there's some strange access without a name + . += "[a_name] - Add
" + . +={"
Lock ID panel
+ (Warning! The ID upload panel can be unlocked only through Exosuit Interface.) + + "} + user << browse(., "window=exosuit_add_access") + onclose(user, "exosuit_add_access") + + +/obj/vehicle/sealed/mecha/proc/output_maintenance_dialog(obj/item/card/id/id_card,mob/user) + if(!id_card || !user) + return + . = {" + + + + + + [(mecha_flags & ADDING_ACCESS_POSSIBLE)?"Edit operation keycodes":null] + [(mecha_flags & ADDING_MAINT_ACCESS_POSSIBLE)?"[(construction_state > MECHA_LOCKED) ? "Terminate" : "Initiate"] maintenance protocol":null] + [(construction_state == MECHA_OPEN_HATCH) ?"--------------------
":null] + [(construction_state == MECHA_OPEN_HATCH) ?"[cell?"Drop power cell":"No cell installed
"]":null] + [(construction_state == MECHA_OPEN_HATCH) ?"[scanmod?"Drop scanning module":"No scanning module installed
"]":null] + [(construction_state == MECHA_OPEN_HATCH) ?"[capacitor?"Drop capacitor":"No capacitor installed
"]":null] + [(construction_state == MECHA_OPEN_HATCH) ?"--------------------
":null] + [(construction_state > MECHA_LOCKED) ?"Set Cabin Air Pressure":null] + + "} + user << browse(., "window=exosuit_maint_console") + onclose(user, "exosuit_maint_console") + + + + +///////////////// +///// Topic ///// +///////////////// + +/obj/vehicle/sealed/mecha/Topic(href, href_list) + ..() + + if(!usr) + return + + if(href_list["close"]) + return + + if(usr.incapacitated()) + return + + if(in_range(src, usr)) + //Start of ID requirements. + if(href_list["id_card"]) + var/obj/item/card/id/id_card + id_card = locate(href_list["id_card"]) + if(!istype(id_card)) + return + + if(href_list["req_access"]) + if(!(mecha_flags & ADDING_ACCESS_POSSIBLE)) + return + output_access_dialog(id_card,usr) + return + + if(href_list["maint_access"]) + if(!(mecha_flags & ADDING_MAINT_ACCESS_POSSIBLE)) + return + if(construction_state == MECHA_LOCKED) + construction_state = MECHA_SECURE_BOLTS + to_chat(usr, "The securing bolts are now exposed.") + else if(construction_state == MECHA_SECURE_BOLTS) + construction_state = MECHA_LOCKED + to_chat(usr, "The securing bolts are now hidden.") + output_maintenance_dialog(id_card,usr) + return + if(href_list["drop_cell"]) + if(construction_state == MECHA_OPEN_HATCH) + cell.forceMove(get_turf(src)) + cell = null + output_maintenance_dialog(id_card,usr) + return + if(href_list["drop_scanmod"]) + if(construction_state == MECHA_OPEN_HATCH) + scanmod.forceMove(get_turf(src)) + scanmod = null + output_maintenance_dialog(id_card,usr) + return + if(href_list["drop_cap"]) + if(construction_state == MECHA_OPEN_HATCH) + capacitor.forceMove(get_turf(src)) + capacitor = null + output_maintenance_dialog(id_card,usr) + return + + if(href_list["add_req_access"]) + if(!(mecha_flags & ADDING_ACCESS_POSSIBLE)) + return + operation_req_access += text2num(href_list["add_req_access"]) + output_access_dialog(id_card,usr) + return + + if(href_list["del_req_access"]) + if(!(mecha_flags & ADDING_ACCESS_POSSIBLE)) + return + operation_req_access -= text2num(href_list["del_req_access"]) + output_access_dialog(id_card, usr) + return + return //Here end everything requiring an ID. + + //Here ID access stuff goes to die. + if(href_list["finish_req_access"]) + mecha_flags &= ~ADDING_ACCESS_POSSIBLE + usr << browse(null,"window=exosuit_add_access") + return + + //Set pressure. + if(href_list["set_internal_tank_valve"] && construction_state) + var/new_pressure = input(usr,"Input new output pressure","Pressure setting",internal_tank_valve) as num|null + if(isnull(new_pressure) || usr.incapacitated() || !construction_state) + return + internal_tank_valve = new_pressure + to_chat(usr, "The internal pressure valve has been set to [internal_tank_valve]kPa.") + return + + //Start of all internal topic stuff. + if(!locate(usr) in occupants) + return + + if(href_list["update_content"]) + send_byjax(usr,"exosuit.browser","content", get_stats_part()) + return + + //Selects the mech equipment/weapon. + if(href_list["select_equip"]) + var/obj/item/mecha_parts/mecha_equipment/equip = locate(href_list["select_equip"]) in src + if(!equip || !equip.selectable) + return + selected = equip + to_chat(occupants, "[icon2html(src, occupants)]You switch to [equip].") + visible_message("[src] raises [equip].") + send_byjax(usr, "exosuit.browser", "eq_list", get_equipment_list()) + return + + //Toggles radio broadcasting + if(href_list["rmictoggle"]) + radio.broadcasting = !radio.broadcasting + send_byjax(usr,"exosuit.browser","rmicstate",(radio.broadcasting?"Engaged":"Disengaged")) + return + + //Toggles radio listening + if(href_list["rspktoggle"]) + radio.listening = !radio.listening + send_byjax(usr,"exosuit.browser","rspkstate",(radio.listening?"Engaged":"Disengaged")) + return + + //Changes radio freqency. + if(href_list["rfreq"]) + var/new_frequency = radio.frequency + text2num(href_list["rfreq"]) + radio.set_frequency(sanitize_frequency(new_frequency, radio.freerange)) + send_byjax(usr,"exosuit.browser","rfreq","[format_frequency(radio.frequency)]") + return + + //Changes the exosuit name. + if(href_list["change_name"]) + var/userinput = stripped_input(usr, "Choose a new exosuit name.", "Rename exosuit", "", MAX_NAME_LEN) + if(!userinput || !locate(usr) in occupants || usr.incapacitated()) + return + name = userinput + return + + //Toggles ID upload. + if (href_list["toggle_id_upload"]) + mecha_flags ^= ADDING_ACCESS_POSSIBLE + send_byjax(usr,"exosuit.browser","t_id_upload","[(mecha_flags & ADDING_ACCESS_POSSIBLE)?"L":"Unl"]ock ID upload panel") + return + + //Toggles main access. + if(href_list["toggle_maint_access"]) + if(construction_state) + to_chat(occupants, "[icon2html(src, occupants)]Maintenance protocols in effect") + return + mecha_flags ^= ADDING_MAINT_ACCESS_POSSIBLE + send_byjax(usr,"exosuit.browser","t_maint_access","[(mecha_flags & ADDING_MAINT_ACCESS_POSSIBLE)?"Forbid":"Permit"] maintenance protocols") + return + + //Toggles connection port. + if (href_list["toggle_port_connection"]) + if(internal_tank.connected_port) + if(internal_tank.disconnect()) + to_chat(occupants, "[icon2html(src, occupants)]Disconnected from the air system port.") + log_message("Disconnected from gas port.", LOG_MECHA) + else + to_chat(occupants, "[icon2html(src, occupants)]Unable to disconnect from the air system port!") + return + else + var/obj/machinery/atmospherics/components/unary/portables_connector/possible_port = locate() in loc + if(internal_tank.connect(possible_port)) + to_chat(occupants, "[icon2html(src, occupants)]Connected to the air system port.") + log_message("Connected to gas port.", LOG_MECHA) + else + to_chat(occupants, "[icon2html(src, occupants)]Unable to connect with air system port!") + return + send_byjax(occupants,"exosuit.browser","t_port_connection","[internal_tank.connected_port?"Disconnect from":"Connect to"] gas port") + return + + //Turns on the DNA lock + if(href_list["dna_lock"]) + var/mob/living/carbon/user = usr + if(!istype(user) || !user.dna) + to_chat(user, "[icon2html(src, occupants)]You can't create a DNA lock with no DNA!.") + return + dna_lock = user.dna.unique_enzymes + to_chat(user, "[icon2html(src, occupants)]You feel a prick as the needle takes your DNA sample.") + return + + //Resets the DNA lock + if(href_list["reset_dna"]) + dna_lock = null + return + + //Repairs internal damage + if(href_list["repair_int_control_lost"]) + to_chat(occupants, "[icon2html(src, occupants)]Recalibrating coordination system...") + log_message("Recalibration of coordination system started.", LOG_MECHA) + addtimer(CALLBACK(src, .proc/stationary_repair, loc), 100, TIMER_UNIQUE) + +///Repairs internal damage if the mech hasn't moved. +/obj/vehicle/sealed/mecha/proc/stationary_repair(location) + if(location == loc) + clearInternalDamage(MECHA_INT_CONTROL_LOST) + to_chat(occupants, "[icon2html(src, occupants)]Recalibration successful.") + log_message("Recalibration of coordination system finished with 0 errors.", LOG_MECHA) + else + to_chat(occupants, "[icon2html(src, occupants)]Recalibration failed!") + log_message("Recalibration of coordination system failed with 1 error.", LOG_MECHA, color="red") diff --git a/code/modules/vehicles/mecha/mecha_wreckage.dm b/code/modules/vehicles/mecha/mecha_wreckage.dm new file mode 100644 index 0000000000..b9f299731a --- /dev/null +++ b/code/modules/vehicles/mecha/mecha_wreckage.dm @@ -0,0 +1,222 @@ +/////////////////////////////////// +//////// Mecha wreckage //////// +/////////////////////////////////// + + +/obj/structure/mecha_wreckage + name = "exosuit wreckage" + desc = "Remains of some unfortunate mecha. Completely irreparable, but perhaps something can be salvaged." + icon = 'icons/mecha/mecha.dmi' + density = TRUE + anchored = FALSE + opacity = FALSE + var/list/welder_salvage = list(/obj/item/stack/sheet/plasteel, /obj/item/stack/sheet/metal, /obj/item/stack/rods) + var/salvage_num = 5 + var/list/crowbar_salvage = list() + var/wires_removed = FALSE + var/mob/living/silicon/ai/AI //AIs to be salvaged + var/list/parts + +/obj/structure/mecha_wreckage/Initialize(mapload, mob/living/silicon/ai/AI_pilot) + . = ..() + if(parts) + for(var/i in 1 to 2) + if(!parts.len) + break + if(prob(60)) + continue + var/part = pick(parts) + welder_salvage += part + parts = null + if(!AI_pilot) //Type-checking for this is already done in mecha/Destroy() + return + AI = AI_pilot + AI.apply_damage(150, BURN) //Give the AI a bit of damage from the "shock" of being suddenly shut down + AI.death() //The damage is not enough to kill the AI, but to be 'corrupted files' in need of repair. + AI.forceMove(src) //Put the dead AI inside the wreckage for recovery + add_overlay(mutable_appearance('icons/obj/projectiles.dmi', "green_laser")) //Overlay for the recovery beacon + AI.controlled_mech = null + AI.remote_control = null + +/obj/structure/mecha_wreckage/Destroy() + if(AI) + QDEL_NULL(AI) + QDEL_LIST(crowbar_salvage) + return ..() + +/obj/structure/mecha_wreckage/examine(mob/user) + . = ..() + if(!AI) + return + . += "The AI recovery beacon is active." + +/obj/structure/mecha_wreckage/welder_act(mob/living/user, obj/item/I) + ..() + . = TRUE + if(salvage_num <= 0 || !length(welder_salvage)) + to_chat(user, "You don't see anything that can be cut with [I]!") + return + if(!I.use_tool(src, user, 0, volume=50)) + return + if(prob(30)) + to_chat(user, "You fail to salvage anything valuable from [src]!") + return + var/type = pick(welder_salvage) + var/N = new type(get_turf(user)) + user.visible_message("[user] cuts [N] from [src].", "You cut [N] from [src].") + if(!istype(N, /obj/item/stack)) + welder_salvage -= type + salvage_num-- + +/obj/structure/mecha_wreckage/wirecutter_act(mob/living/user, obj/item/I) + ..() + . = TRUE + if(wires_removed) + to_chat(user, "You don't see anything that can be cut with [I]!") + return + var/N = new /obj/item/stack/cable_coil(get_turf(user), rand(1,3)) + user.visible_message("[user] cuts [N] from [src].", "You cut [N] from [src].") + wires_removed = TRUE + +/obj/structure/mecha_wreckage/crowbar_act(mob/living/user, obj/item/I) + ..() + . = TRUE + if(crowbar_salvage.len) + var/obj/S = pick(crowbar_salvage) + S.forceMove(user.drop_location()) + user.visible_message("[user] pries [S] from [src].", "You pry [S] from [src].") + crowbar_salvage -= S + return + to_chat(user, "You don't see anything that can be cut with [I]!") + +/obj/structure/mecha_wreckage/transfer_ai(interaction, mob/user, null, obj/item/aicard/card) + if(!..()) + return + + //Proc called on the wreck by the AI card. + if(interaction != AI_TRANS_TO_CARD) //AIs can only be transferred in one direction, from the wreck to the card. + return + if(!AI) //No AI in the wreck + to_chat(user, "No AI backups found.") + return + cut_overlays() //Remove the recovery beacon overlay + AI.forceMove(card) //Move the dead AI to the card. + card.AI = AI + if(AI.client) //AI player is still in the dead AI and is connected + to_chat(AI, "The remains of your file system have been recovered on a mobile storage device.") + else //Give the AI a heads-up that it is probably going to get fixed. + AI.notify_ghost_cloning("You have been recovered from the wreckage!", source = card) + to_chat(user, "Backup files recovered: [AI.name] ([rand(1000,9999)].exe) salvaged from [name] and stored within local memory.") + AI = null + +/obj/structure/mecha_wreckage/gygax + name = "\improper Gygax wreckage" + icon_state = "gygax-broken" + parts = list( + /obj/item/mecha_parts/part/gygax_torso, + /obj/item/mecha_parts/part/gygax_head, + /obj/item/mecha_parts/part/gygax_left_arm, + /obj/item/mecha_parts/part/gygax_right_arm, + /obj/item/mecha_parts/part/gygax_left_leg, + /obj/item/mecha_parts/part/gygax_right_leg + ) + +/obj/structure/mecha_wreckage/gygax/dark + name = "\improper Dark Gygax wreckage" + icon_state = "darkgygax-broken" + +/obj/structure/mecha_wreckage/marauder + name = "\improper Marauder wreckage" + icon_state = "marauder-broken" + +/obj/structure/mecha_wreckage/mauler + name = "\improper Mauler wreckage" + icon_state = "mauler-broken" + desc = "The syndicate won't be very happy about this..." + +/obj/structure/mecha_wreckage/seraph + name = "\improper Seraph wreckage" + icon_state = "seraph-broken" + +/obj/structure/mecha_wreckage/reticence + name = "\improper Reticence wreckage" + icon_state = "reticence-broken" + color = "#87878715" + desc = "..." + +/obj/structure/mecha_wreckage/ripley + name = "\improper Ripley wreckage" + icon_state = "ripley-broken" + parts = list( + /obj/item/mecha_parts/part/ripley_torso, + /obj/item/mecha_parts/part/ripley_left_arm, + /obj/item/mecha_parts/part/ripley_right_arm, + /obj/item/mecha_parts/part/ripley_left_leg, + /obj/item/mecha_parts/part/ripley_right_leg) + +/obj/structure/mecha_wreckage/ripley/mkii + name = "\improper Ripley MK-II wreckage" + icon_state = "ripleymkii-broken" + +/obj/structure/mecha_wreckage/ripley/deathripley + name = "\improper Death-Ripley wreckage" + icon_state = "deathripley-broken" + parts = null + +/obj/structure/mecha_wreckage/ripley/firefighter + name = "\improper Firefighter wreckage" + icon_state = "firefighter-broken" + parts = list( + /obj/item/mecha_parts/part/ripley_torso, + /obj/item/mecha_parts/part/ripley_left_arm, + /obj/item/mecha_parts/part/ripley_right_arm, + /obj/item/mecha_parts/part/ripley_left_leg, + /obj/item/mecha_parts/part/ripley_right_leg) + + +/obj/structure/mecha_wreckage/honker + name = "\improper H.O.N.K wreckage" + icon_state = "honker-broken" + desc = "All is right in the universe." + parts = list( + /obj/item/mecha_parts/part/honker_torso, + /obj/item/mecha_parts/part/honker_head, + /obj/item/mecha_parts/part/honker_left_arm, + /obj/item/mecha_parts/part/honker_right_arm, + /obj/item/mecha_parts/part/honker_left_leg, + /obj/item/mecha_parts/part/honker_right_leg) + +/obj/structure/mecha_wreckage/durand + name = "\improper Durand wreckage" + icon_state = "durand-broken" + parts = list( + /obj/item/mecha_parts/part/durand_torso, + /obj/item/mecha_parts/part/durand_head, + /obj/item/mecha_parts/part/durand_left_arm, + /obj/item/mecha_parts/part/durand_right_arm, + /obj/item/mecha_parts/part/durand_left_leg, + /obj/item/mecha_parts/part/durand_right_leg) + +/obj/structure/mecha_wreckage/phazon + name = "\improper Phazon wreckage" + icon_state = "phazon-broken" + parts = list( + /obj/item/mecha_parts/part/phazon_torso, + /obj/item/mecha_parts/part/phazon_head, + /obj/item/mecha_parts/part/phazon_left_arm, + /obj/item/mecha_parts/part/phazon_right_arm, + /obj/item/mecha_parts/part/phazon_left_leg, + /obj/item/mecha_parts/part/phazon_right_leg) + + + +/obj/structure/mecha_wreckage/odysseus + name = "\improper Odysseus wreckage" + icon_state = "odysseus-broken" + parts = list( + /obj/item/mecha_parts/part/odysseus_torso, + /obj/item/mecha_parts/part/odysseus_head, + /obj/item/mecha_parts/part/odysseus_left_arm, + /obj/item/mecha_parts/part/odysseus_right_arm, + /obj/item/mecha_parts/part/odysseus_left_leg, + /obj/item/mecha_parts/part/odysseus_right_leg) diff --git a/code/game/mecha/medical/odysseus.dm b/code/modules/vehicles/mecha/medical/odysseus.dm similarity index 56% rename from code/game/mecha/medical/odysseus.dm rename to code/modules/vehicles/mecha/medical/odysseus.dm index 6ed207a4c4..bd415cd64f 100644 --- a/code/game/mecha/medical/odysseus.dm +++ b/code/modules/vehicles/mecha/medical/odysseus.dm @@ -1,31 +1,33 @@ -/obj/mecha/medical/odysseus +/obj/vehicle/sealed/mecha/medical/odysseus desc = "These exosuits are developed and produced by Vey-Med. (© All rights reserved)." name = "\improper Odysseus" icon_state = "odysseus" - step_in = 2 + allow_diagonal_movement = TRUE + movedelay = 2 max_temperature = 15000 max_integrity = 120 wreckage = /obj/structure/mecha_wreckage/odysseus internal_damage_threshold = 35 deflect_chance = 15 step_energy_drain = 6 + internals_req_access = list(ACCESS_ROBOTICS, ACCESS_MEDICAL) -/obj/mecha/medical/odysseus/moved_inside(mob/living/carbon/human/H) +/obj/vehicle/sealed/mecha/medical/odysseus/moved_inside(mob/living/carbon/human/H) . = ..() if(.) var/datum/atom_hud/hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] hud.add_hud_to(H) -/obj/mecha/medical/odysseus/go_out() - if(isliving(occupant)) - var/mob/living/carbon/human/L = occupant +/obj/vehicle/sealed/mecha/medical/odysseus/remove_occupant(mob/M) + if(isliving(M)) + var/mob/living/L = M var/datum/atom_hud/hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] hud.remove_hud_from(L) - ..() + return ..() -/obj/mecha/medical/odysseus/mmi_moved_inside(obj/item/mmi/mmi_as_oc, mob/user) +/obj/vehicle/sealed/mecha/medical/odysseus/mmi_moved_inside(obj/item/mmi/M, mob/user) . = ..() if(.) var/datum/atom_hud/hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] - var/mob/living/brain/B = mmi_as_oc.brainmob + var/mob/living/brain/B = M.brainmob hud.add_hud_to(B) diff --git a/code/modules/vehicles/mecha/working/ripley.dm b/code/modules/vehicles/mecha/working/ripley.dm new file mode 100644 index 0000000000..e8fae6d985 --- /dev/null +++ b/code/modules/vehicles/mecha/working/ripley.dm @@ -0,0 +1,219 @@ +/obj/vehicle/sealed/mecha/working/ripley + desc = "Autonomous Power Loader Unit MK-I. Designed primarily around heavy lifting, the Ripley can be outfitted with utility equipment to fill a number of roles." + name = "\improper APLU MK-I \"Ripley\"" + icon_state = "ripley" + silicon_icon_state = "ripley-empty" + movedelay = 1.5 //Move speed, lower is faster. + /// How fast the mech is in low pressure + var/fast_pressure_step_in = 1.5 + /// How fast the mech is in normal pressure + var/slow_pressure_step_in = 2 + max_temperature = 20000 + max_integrity = 200 + lights_power = 7 + deflect_chance = 15 + armor = list(MELEE = 40, BULLET = 20, LASER = 10, ENERGY = 20, BOMB = 40, BIO = 0, RAD = 20, FIRE = 100, ACID = 100) + max_equip = 6 + wreckage = /obj/structure/mecha_wreckage/ripley + internals_req_access = list(ACCESS_ENGINE, ACCESS_ROBOTICS, ACCESS_MINING) + enclosed = FALSE //Normal ripley has an open cockpit design + enter_delay = 10 //can enter in a quarter of the time of other mechs + exit_delay = 10 + /// Amount of Goliath hides attached to the mech + var/hides = 0 + /// List of all things in Ripley's Cargo Compartment + var/list/cargo = new + /// How much things Ripley can carry in their Cargo Compartment + var/cargo_capacity = 15 + +/obj/vehicle/sealed/mecha/working/ripley/Move() + . = ..() + update_pressure() + +/obj/vehicle/sealed/mecha/working/ripley/moved_inside(mob/living/carbon/human/H) + ..() + update_icon() + +/obj/vehicle/sealed/mecha/working/ripley/check_for_internal_damage(list/possible_int_damage, ignore_threshold = FALSE) + if (!enclosed) + possible_int_damage -= (MECHA_INT_TEMP_CONTROL + MECHA_INT_TANK_BREACH) //if we don't even have an air tank, these two doesn't make a ton of sense. + . = ..() + +/obj/vehicle/sealed/mecha/working/ripley/Initialize() + . = ..() + AddComponent(/datum/component/armor_plate,3,/obj/item/stack/sheet/animalhide/goliath_hide,list(MELEE = 10, BULLET = 5, LASER = 5)) + +/obj/vehicle/sealed/mecha/working/ripley/generate_actions() + if(enclosed) + initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_internals, VEHICLE_CONTROL_SETTINGS) + initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_cycle_equip, VEHICLE_CONTROL_EQUIPMENT) + initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_lights, VEHICLE_CONTROL_SETTINGS) + initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_view_stats, VEHICLE_CONTROL_SETTINGS) + initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/strafe, VEHICLE_CONTROL_DRIVE) + +/obj/vehicle/sealed/mecha/working/ripley/Destroy() + for(var/atom/movable/A in cargo) + A.forceMove(drop_location()) + step_rand(A) + cargo.Cut() + return ..() + +/obj/vehicle/sealed/mecha/working/ripley/mkii + desc = "Autonomous Power Loader Unit MK-II. This prototype Ripley is refitted with a pressurized cabin, trading its prior speed for atmospheric protection and armor." + name = "\improper APLU MK-II \"Ripley\"" + icon_state = "ripleymkii" + fast_pressure_step_in = 2 //step_in while in low pressure conditions + slow_pressure_step_in = 4 //step_in while in normal pressure conditions + movedelay = 4 + max_temperature = 30000 + max_integrity = 250 + armor = list(MELEE = 40, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 60, BIO = 0, RAD = 70, FIRE = 100, ACID = 100) + wreckage = /obj/structure/mecha_wreckage/ripley/mkii + enclosed = TRUE + enter_delay = 40 + silicon_icon_state = null + +/obj/vehicle/sealed/mecha/working/ripley/firefighter + desc = "Autonomous Power Loader Unit MK-II-F. This model is refitted with additional thermal protection." + name = "\improper APLU \"Firefighter\"" + icon_state = "firefighter" + movedelay = 4 + fast_pressure_step_in = 2 + slow_pressure_step_in = 4 + max_temperature = 65000 + max_integrity = 250 + resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF + armor = list(MELEE = 40, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 60, BIO = 0, RAD = 70, FIRE = 100, ACID = 100) + max_equip = 5 // More armor, less tools + enclosed = TRUE + enter_delay = 40 + +/obj/vehicle/sealed/mecha/working/ripley/deathripley + desc = "OH SHIT IT'S THE DEATHSQUAD WE'RE ALL GONNA DIE" + name = "\improper DEATH-RIPLEY" + icon_state = "deathripley" + fast_pressure_step_in = 2 //step_in while in low pressure conditions + slow_pressure_step_in = 3 //step_in while in normal pressure conditions + movedelay = 4 + lights_power = 7 + wreckage = /obj/structure/mecha_wreckage/ripley/deathripley + step_energy_drain = 0 + enclosed = TRUE + enter_delay = 40 + silicon_icon_state = null + +/obj/vehicle/sealed/mecha/working/ripley/deathripley/Initialize() + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/kill + ME.attach(src) + +/obj/vehicle/sealed/mecha/working/ripley/deathripley/real + desc = "OH SHIT IT'S THE DEATHSQUAD WE'RE ALL GONNA DIE. FOR REAL" + +/obj/vehicle/sealed/mecha/working/ripley/deathripley/real/Initialize() + . = ..() + for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) + E.detach() + qdel(E) + LAZYCLEARLIST(equipment) + var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/kill/real + ME.attach(src) + +/obj/vehicle/sealed/mecha/working/ripley/mining + desc = "An old, dusty mining Ripley." + name = "\improper APLU \"Miner\"" + obj_integrity = 75 //Low starting health + +/obj/vehicle/sealed/mecha/working/ripley/mining/Initialize() + . = ..() + if(cell) + cell.charge = FLOOR(cell.charge * 0.25, 1) //Starts at very low charge + if(prob(70)) //Maybe add a drill + if(prob(15)) //Possible diamond drill... Feeling lucky? + var/obj/item/mecha_parts/mecha_equipment/drill/diamonddrill/D = new + D.attach(src) + else + var/obj/item/mecha_parts/mecha_equipment/drill/D = new + D.attach(src) + + else //Add plasma cutter if no drill + var/obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma/P = new + P.attach(src) + + //Add ore box to cargo + cargo.Add(new /obj/structure/ore_box(src)) + + //Attach hydraulic clamp + var/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/HC = new + HC.attach(src) + for(var/obj/item/mecha_parts/mecha_tracking/B in trackers)//Deletes the beacon so it can't be found easily + qdel(B) + + var/obj/item/mecha_parts/mecha_equipment/mining_scanner/scanner = new + scanner.attach(src) + +/obj/vehicle/sealed/mecha/working/ripley/Exit(atom/movable/O) + if(O in cargo) + return 0 + return ..() + +/obj/vehicle/sealed/mecha/working/ripley/Topic(href, href_list) + ..() + if(href_list["drop_from_cargo"]) + var/obj/O = locate(href_list["drop_from_cargo"]) in cargo + if(O) + to_chat(occupants, "[icon2html(src, occupants)]You unload [O].") + O.forceMove(drop_location()) + cargo -= O + log_message("Unloaded [O]. Cargo compartment capacity: [cargo_capacity - src.cargo.len]", LOG_MECHA) + return + + +/obj/vehicle/sealed/mecha/working/ripley/contents_explosion(severity, target, origin) + for(var/X in cargo) + var/obj/O = X + if(prob(30/severity)) + cargo -= O + O.forceMove(drop_location()) + . = ..() + +/obj/vehicle/sealed/mecha/working/ripley/get_stats_part() + var/output = ..() + output += "Cargo Compartment Contents:
" + if(cargo.len) + for(var/obj/O in cargo) + output += "Unload : [O]
" + else + output += "Nothing" + output += "
" + return output + +/obj/vehicle/sealed/mecha/working/ripley/relay_container_resist(mob/living/user, obj/O) + to_chat(user, "You lean on the back of [O] and start pushing so it falls out of [src].") + if(do_after(user, 300, target = O)) + if(!user || user.stat != CONSCIOUS || user.loc != src || O.loc != src ) + return + to_chat(user, "You successfully pushed [O] out of [src]!") + O.forceMove(drop_location()) + cargo -= O + else + if(user.loc == src) //so we don't get the message if we resisted multiple times and succeeded. + to_chat(user, "You fail to push [O] out of [src]!") + +/** + * Makes the mecha go faster and halves the mecha drill cooldown if in Lavaland pressure. + * + * Checks for Lavaland pressure, if that works out the mech's speed is equal to fast_pressure_step_in and the cooldown for the mecha drill is halved. If not it uses slow_pressure_step_in and drill cooldown is normal. + */ +/obj/vehicle/sealed/mecha/working/ripley/proc/update_pressure() + var/turf/T = get_turf(loc) + + if(lavaland_equipment_pressure_check(T)) + movedelay = fast_pressure_step_in + for(var/obj/item/mecha_parts/mecha_equipment/drill/drill in equipment) + drill.equip_cooldown = initial(drill.equip_cooldown) * 0.5 + + else + movedelay = slow_pressure_step_in + for(var/obj/item/mecha_parts/mecha_equipment/drill/drill in equipment) + drill.equip_cooldown = initial(drill.equip_cooldown) diff --git a/code/modules/vehicles/mecha/working/working.dm b/code/modules/vehicles/mecha/working/working.dm new file mode 100644 index 0000000000..c765e0f0e5 --- /dev/null +++ b/code/modules/vehicles/mecha/working/working.dm @@ -0,0 +1,28 @@ +/obj/vehicle/sealed/mecha/working + internal_damage_threshold = 60 + +/obj/vehicle/sealed/mecha/working/Move() + . = ..() + if(.) + collect_ore() + +/** + * Handles collecting ore. + * + * Checks for a hydraulic clamp or ore box manager and if it finds an ore box inside them puts ore in the ore box. + */ +/obj/vehicle/sealed/mecha/working/proc/collect_ore() + if((locate(/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp) in equipment)) + var/obj/structure/ore_box/ore_box = locate(/obj/structure/ore_box) in contents + if(ore_box) + for(var/obj/item/stack/ore/ore in range(1, src)) + if(ore.Adjacent(src) && ((get_dir(src, ore) & dir) || ore.loc == loc)) //we can reach it and it's in front of us? grab it! + ore.forceMove(ore_box) + +/obj/vehicle/sealed/mecha/working/Bump(atom/obstacle) + if(istype(selected, /obj/item/mecha_parts/mecha_equipment/drill) && istype(obstacle, /turf/closed/mineral)) + var/obj/item/mecha_parts/mecha_equipment/drill/thedrill = selected + for(var/mob/M in occupants) + thedrill.action(M, obstacle) + break + ..() diff --git a/code/modules/vehicles/sealed.dm b/code/modules/vehicles/sealed.dm index 63c7c9f858..1a1858522a 100644 --- a/code/modules/vehicles/sealed.dm +++ b/code/modules/vehicles/sealed.dm @@ -47,10 +47,12 @@ mob_exit(M, silent, randomstep) /obj/vehicle/sealed/proc/mob_exit(mob/M, silent = FALSE, randomstep = FALSE) + SIGNAL_HANDLER if(!istype(M)) return FALSE remove_occupant(M) - M.forceMove(exit_location(M)) + if(!isAI(M))//This is the ONE mob we dont want to be moved to the vehicle that should be handeled when used + M.forceMove(exit_location(M)) if(randomstep) var/turf/target_turf = get_step(exit_location(M), pick(GLOB.cardinals)) M.throw_at(target_turf, 5, 10) diff --git a/icons/mecha/durand_shield.dmi b/icons/mecha/durand_shield.dmi new file mode 100644 index 0000000000000000000000000000000000000000..0600e352b316ea0947dd5c8dc24ea710117d6e1a GIT binary patch literal 9277 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[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�vAFEF^@5<8^p6B;YIJ_ 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�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

`oY?f=?)#=c?GG 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�m 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 @|f?{Y_m5r$E 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 m?V}Mb>tro%EDhw4OZz<#x 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

KXaRACf-AIww+K4 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 literal 7153 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 diff --git a/sound/mecha/mech_shield_deflect.ogg b/sound/mecha/mech_shield_deflect.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5c1970d872408b831b705f2785f4a0fc9dcfd536 GIT binary patch literal 11708 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 literal 0 HcmV?d00001 diff --git a/sound/mecha/mech_shield_drop.ogg b/sound/mecha/mech_shield_drop.ogg new file mode 100644 index 0000000000000000000000000000000000000000..21c6cb5edb9c1646e03eba1e18bca3e2e22b04bc GIT binary patch literal 17325 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 z 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 literal 0 HcmV?d00001 diff --git a/sound/mecha/mech_shield_raise.ogg b/sound/mecha/mech_shield_raise.ogg new file mode 100644 index 0000000000000000000000000000000000000000..65ad70ad14d61464448b9fab2e278189d360c950 GIT binary patch literal 25055 zcmagG1ymi+vM)RvcZc8>T!Oma>d;ow0zzoQ7g*&o#Qv%k6^l`3v z0=7#0rId(Ks#^lceV26RP9=>c_D)lbv`FZ>@BmaVVlq@8@YJ3&vk0m%LTDCF>N-MI zn&pbZRF)Tv!Z|`2qQJRdl%yoMUsf0=c)-v&BZ11=I4h^Xv7lvM^98}s&uvOzH|t*+ z^51b#Li-|tKxBa>f%MEig0Upc70T+LVNn8L=r9541U%W#c;lZ*C%@7t|7KCe<@w6> zMqNWu6MA?UYI|BPdU`B+`s=2B&~NqEZT+CX^uh4@gDGLyztSK7&Fkm%cj%NLAn&C> z>NaBmHF3drfdbgjuqqh9;#nn>$cfa9iG{KyR(3VEnawtp&5q;sEaUZPe=mXB6z;h< zK%Q+z$^Vh8bW<(=-$~47gb5IX>T=kHbl8RFjT+6cD+}UZ4UYg&n~JHi47zelyKxV@ z2}6^#yVPj1!sLYl=6@OC+3Wxy#z8vhLOKf7h8pXfE04CD$fBF#B2*R68u{Okpuc#5 z4umS(D%B2*#1(J)S1n*DTf%%KNwj|?K`)5N|3R5ClW{&NfRXVtuN*IPt~XL6lfJDy zE%UDh9j1u3p|)fkOCQWjpUH5Wl10lX{-@-PlZjYeJ`1fQ+RefkA~Jzm{ZIIa zLG5O`L^zZkOz9toV1`FkLX|}B{t+W7k7I`^IKL-9U z&vC&UP9PmkppmbqQJiI&{LQU=&ixhljViaII=I(|>!8v?~oXK|SYcfh zODTlJ((=VoqW6^;$o}Lsz%(t@&XJto=k_qLbvWsxcBdei}07U2yHGd`^A0&nc0A^@vD2yMH)utGC;?>4D zev+!m36y53PYEEAg^qC`WQSle7L%$^F%FZ4PKf`^3YigS007D!5cDU(z-{pcz@i7X zoN1<$xaIL^<#FFk<5@1^DlVpQPjd69YG{t*YA$GKt`aC}Hq$ENDk@%RXyU%n#Mhil zRn%;9oaVM%*3euh&|GM?TqOw5PW9O2Qq+Z>LZDQS#Z-S|h@)ZJzgQ{a{bj|gx!BC3 z>aMA(X{oEBsq1N}d#$Mr@t22E)fJcVH8qE?;Zv5(MZke)x9f z|BdjO^WuUBlxhmGG;Q(NWU$S!wJRvA$Y7|bD6eRCtf;BhFW9Rns2HoauBfRRtFNuB zaX5rhYsxC>St=@6D(kE6Dp(Gi%PQKd$Li}cYbp<$Pf`0>4%?k8YHBL$kDjUR)rUha zhwbcsC5+=Gl?UzR?d?v7?Jg6|j--VZ2VG3#eRX5?r-$uqjUH60njY)PhTGcEaX1=# z<>+63sCN|VuD%)foGfE=qMQP>S8{TnKd9+Ba6q!u9C)C;g0f1Kb6_3P(^qKnz|uqg+pFp(EqlA_ zA*gWLVnTVj&rJmOP8>VLa<6LeMb>UhMQb9WL_;6N-%f) zvXJ3>`d=eAvtu2Cm{mUuXZoCy2o=7wq8B5OJZlDJm8cd2ZK3bbR+4H5C1j{YH|?yr zIq+P~>s39=kcZwO+&;ElYC&fmFf1SjMz+j*oYWzWb69R({i?)dAr2#S$|AQW_6WIzh)#Y2?P zc?W^0m@s69un5l_i@KN)YL{X>bEs|!-7qAWh|H(N85l!VeE_!H_`0hjs&c zubL2mW>^wX0yN&s4}oUI$+OP{HMxCCXdPp*`!gX~4Fv$0oS_j>ovMXfa6%q*&V&KH zpXW?D0mS^|w~RxS$%$%EanK=^yP`pLH>mYYNY*=|ghIoC#}f+*t06r}x#~e3`x>fZ zh*=fSA{4|;I~n$JP=ftr8vv}qBLa1>ByV`>36Yt&E&dJyObJzE3`ZEASro@^mLwA6 zU>Y>WDIt6gJ)k$)=lCNAN`RgYK?wr8q|aHFTim|`lYf_x|1X0mhsIghTF|@o5FrWD zKT-KxoWG~$4*v?$)BZXAkC^@6(fj{a(zmaMLhe5^K&%@D5qLr*(URt8Bt~U<9wQb8 zG|=l$gZ3DKEHsR9uP791o_t9;0R~zqN*EcT@PT@CvYuSJo0=LEZE@=J)G@Co#|q_* zNLvh1vx7s(>IVh^0F+vpzHN!u3q4ED+hb6fC5450w+WqIcWEF|O&_c?G)-jSnLB{a6 zL<=n;{}aId1!E`0f5Vr-611ngmN$|G*vz{-WAL26}DQGfb?fe z8KObLg=CImJaskuy)3gBRpo4RIgb9SWGy*{gy31%swU3~=!%jO31G*f;tCQ2;Sr8N z1%<*f0(o^kGaLqRa6fQ3QP5C^L)~U=VF9er5wwH|9W)%=il72BK|sgAWCRh678~0b zjk?F#18=zIK^aO3M-?#$!ixuo;5xnkj;`F=i!Au27~`J>FbE(AfJAgkYU&JuIE;^& z@mLAii8x8P$x!$Lz!nIM34m$fBO)TK;tKn>VQHi+LW>4|z|sCCKW9it|14GD{+9n) zAdAWULw;T$KZ|*%uHJ)(qV{=UdVO(!;m5}Q+41hy@4chbdD83UH)vtl0I*_tpZn5Z z97M82ZX#mU51l$Mrkf*cfCZ4}g-aX&egO-xe~g-}7uNutcfNr;iF#z{!@kCZ>5A)x zJEBV6L!yW(dI=Ohbqk&VaY&@d2Y{&6efzAFg6&yihoO?r=&1mvNe~HKyTJ-v)!bJY zu+?1#I4TKZ+Rsnj$F`Xnx2iaeBX)&>48C2w@dV2jmn=%V?}lHk0Ld@$L7kl`LZq^F zEF{SYL>*Zmz(@iB7Z_8qmp0e{#xF?N1Mxpz<5Ep)%U7tp7i#x{O|G>?zUDRwh$GmR zeVJy|&^|Lj(eJ0kmNAL{U=CWlZ3TE=V4mz6w@kPG@g+>;ZH(%Y7m#oje5Nv6dgWfg;P7{eu z3c#ZS@ui0^34##f`NL_KntueZPbVE#mAMBp85#(k z*Cy5%l>$a~cjrBa0s8IKq#c(4t%+vzBR(>D#_}BVtZQixmzi&`8T(|qYd*O>y(|=+ ztKm1Qsctr_81Ung)9JpDCh5XhfvWi}WFc3*qDHIhtJhntItIYnZK`XToTQB3ZSU{w#v z3*e?Mt1;&?jp`KRZBk%{#q7}9pTn{OyTjD`L_W6I>V~+)CLi=#?K82v9NP*J?iJZ6WmlO(BoZB# zCQbaNdU2yzh3P{ON0#z9U->Qz?$*kCtK;IBq$$?}|4Z-{8iteZyBi_$l7g4IB7s(- zVA{!X=eM3jk3Uhow8{heRLK0aK89$Aq~QKC*W-bsmD>z(!}2I>81D}ocfkga(hVvu z1vmY!{1n=Fp?{->Q}7mSt)-{8I1;}yICiF2(c)F^fwQbAe=|0uVxilnH?nQwj&m72 zc6#b#<~lZ8vW{R#`$9InaAMv-j`2XQ@S5l+Ga*9rrZ%Xuvlfr9D+&gZgO;X~4rD0+ z0n1h7MWa%s1rv8`=;%R>TeP5y*$i*WtoBHHd#i{Y%U#F9bS<-Qap71eIhlO)dNxP;RX_Cmaz} zGzht|s@788t+C^*h~C}rMSz9(oO^42EH4hQ-#p+q6C&h^Z}T%^0>^Kz!(`Ajel(~L z2B8UP2=((xAFOod^N3v?6`9q|NZW}9T_t+JOkm=#@18XJ-UP(K+93VpxsViVh_Dcx z3&?Wf2sMc(3@r{{9qzJ05*_4R0m{xV6JbX9g*OAitH;;`4brO30KA~ zyv&cc{4AX_pKi%_N_6-pG8=E*+0b|<5=m=sh2kv-i4j}#W-IJSYZqE*B(ru+erW^` zb^7~1;uvu4ziWXJfoE&ut~e!G!aN>$FUbTd zvd*i_-rS+U6Md2MJLQ^oPMVACB+ETHPdz*0_%Qvn-kySlT%qCi$gCZyB|6l&L!~MP zQdL8p(`)`fw`rMTx4}lE#90Ka_p+jDhq|bFqXztp6h-o>DfrF20AlIGAg4MD!UtAw^6x5oL13{oJ;rMhK&K(MDZq$DUXtR1iWQXG=C zj^SF)=nYS#5WNB&bJJYJ%>{mZ}ojY_qd0lcJpk?~YHw9@D zCK9Nt+KK9ZY3p3#m7SdIN+a0??UWf7TfBQL{enBoesF;U8jI2IqPGyS$4|bzjlr}R zWbgVgJuJtC{<0ra$sQH$yM<_EFX|&hC-wck)A)M(8@03S;rHU+hFwyVrSwtXO2n2P zK7&v0+GrKxggi)S;ls9A0#AF`^b-TC*dyv^6VNtnu#J4}Xs2 zmhHr><*?gWRZ8R2k42eyxUuqwlVghvoOFil3l`juk7SgTC#`qz@E6-XRD#CDcl!9< zQ>U^g-jq!Xi$CUq(}*S+3=P~x)FkZdB?yma13!cm2vFUpx1d)%Y`=Z6hiVT5<{-LZ zWTkB)k}4?fQ8|C;>NbFn%aUJ5rH;owPoGCRSd!m#>}b>FaE0u$YS; z+CNRJwV4hOQ27?`zOfaUCgCAu{d8*W_F8~V{tJZ>O|#3&!^{%!m|30hQHUyd-p@<& zEU5z7XAa#x6`ZNF>=mr*%t>o${@G~EG3Q1ocj)>$$52$)tz&#Hqg*n?yLRIf`&DAk zAw($+C88{tz`9a9=l222?=LjyCnNZ{b#gT&p~cL^c_Dk%sfyh~uh>H9u&_=~{YFBT z7_4GeHjIbeAWsRT3aCsgk$(=}OJY5d+Ro@s#`P<*)axQ0RUkpeFedAgQOuLrtoVvb zk^t939}zE0$4GCLOs~XH8JwY~8|`fZ{of@5?g*6M`iPTH3C4#p&ZhkkRvm==bK?&9 zjM$Btddt7hJKKFRe%dAj&y@G00FU;uksk#?GT%2-zWrGycnfH>+N-}VcTG(X?CfUG zQl{(To~_yZiQesZDM%*M+$e8X(PDJ(2*Fjq z8-KN!y>8T+H?A=H4pin0-u<(vlQOQF5C0Y+?Bdmn{j5aZF z%+%(z%)PzcaQJk7p0D3^0Jc5tI(q1HKBixH=51Rq9%0-=n#C*qal=m-nexI|*EIMSjz!s-mRjTp3-K2x* zX=IGK7Y&`M*=tZOsx!0Fz~VZ2IPV(z!AY^X^6>by+j*E8zif8}7fA(@3)CZ6VQh%I zen&uh?3?*$VT9frM4o4-T3Cq94C6H~IX6kf2@xmm*uD8IAx8R^Ak9GMPP(^OLnDRd znt`cq{aUg-^cArk+P5dCU@WrY&A>1X1XE1%N$jY12(?oo9RruZMkRb$&;{n|z%o+z zusY5pB$Hjddan*{Z$$~BO6#EeWbls2`QG2SZNMYuj{Mpy{OTmqg{qjAceF?>v9iwh zf#YS#kK2*m%Y0!>Brx_|vZ{eGO^+^?PWoz%Gs|7m6hy`8B~Wox-0eji=nx zU7of@x;Fz&L2tx3!3<%=4#y*H<7v{te-0deUKtnTAu^~!Di8!&2~wOcuV3q0=)*;S zIM4;dQKJ4jlvu8$uYbXbhFflO$)Xy1qZRQMdx^FVnGRWRm19TzTkDC>t1_a--f=jm zq3?dYy7&9;h|->)jO<-F3Ofl{V4-W1qf6p9rg-3|7=3HW4vZpy+0mc$E1^27lk45? zfp@R`%`(@Xo=zUxnr~LtRzp5+Ta|zRvtmvFKP{hFFr?nifnr`kRCi;5tkK`rlO`3kH^U~V40@_VNoy9T|_t>r5_v` zqoQUlNa#wwD}SpRbu*3wW4b)sx^&`KU0zh`w>J3h~CG> z#lVB|{QWFeR8aH4zZx^TIP4s=wKR;T zO_FqOdbn~lz!)GpR*{UZ{T_+9!W(0jb$i|G7jcjX_% zFhf8ysY~wb@Oj3IK3w@KYGN>hGX0kd8*ajJFN@8Vkcl6+^@@36p84i~d_4HOtSQgO zh-kzJIqMqr-O6BD*YQsmFSF!@iC^oG z63cu7io8E1#g(H%Q;`azbxz(;Q9G@P859hZ_-ioLPf#g}UUp*CCN8{ZMxZFs;{f!WIhW5fZ_+zEW)iNSuW0sLJu+e#p z0qW!io|eV4SYG4-^}l0U6wZk&G{FVBr1W3+-B3+g6U{k7H{hBh555@!*qVbPR29y z`-|pFN7xWuQDx<~ZuD9pxi@4+>VS`J4A8$D2QLT)xV<9^EhIPk(%Rf=Ie; z2I%|NS{hf)EiaR>xmKd-XKQhN+H3o5b+r6${kQ3g$=H`v2W&^HT1=hkSy9H?Mf%`T zN33*$`XHY8cDpVf)-nDL^-v|pF$e6qFI;LYJ9jlfJkzrI-~?_nIrern+Unu`I^0?X z{`n102cO`(F!E_5ZA8s+G$aL`%ILa|t2=pQQ{_%U1j&xE&!<|8tLR%!uO+cC3dapO zL(=3wuunwP7MN0Oe7A9NMu%_3pve$wk`boQOW`ckm1pJE`Lm1B^OXVqz0B2Dpesg^ z80Hb+ytj_A#+vagYyosY^|97|ru)_Fsmu*?eA#g%nAOIzue{l6>&g96uW54X3rm6z z*`0+dl`Q>DXq7s%v%SXiNV0v1CFH&|^ZwSg#5NUOvVG0m=0SVVXjZxt94I7P?_|J` zz|6)ywvSdwj@eSeTL%)p{_!x7c1Te@{ME&6173aA6+vk+=49lKungavXxgJb@jVl$ z#lY9Ej6eA+^-l!_M-zh>wLyC#?=kUM0I9W7_5iQKCk7K}yu=vuTM*iiHf5mA1C>y3 zjFOZeiU+rqUhvWX?xZ9wis=$K`gRnf(%7IGh6m(yDk6Xn5%FenP8^u{*~yYz>fzE5 zmjD1Hhe;FO18Dpc%s8YjX2BIecASdCz(1OJYx zXY{&Ax2!XhBxTJE73FE$Gt=;^e05FQaaI8(0J)_F&{4!oGdzwlfgU7wPmWh$GeO!! zseJriVm|@q5v!oRx#Zezh`E+JG9bY;x`?p^0<8Wfd*iq>XhQDR% zz3$H?jAF0wdxlNEZ~-xl_GvN4ZgOS0t%gIg87UJt$QffiyP4!M(u|mC~XH@MBq) z?fatOnlkj5^FTn684tFOhk!>bY>{abuEhgyttu@u^nqKJwA_Wa-5N@y=6iWX4rfiv zvs7SB%N8kqJ>7+F65x%f+HdAjDkc&B<#O}UiB|gOhRw88C>6#v_&PTt4Oo+a59%TE zau37VJmm)SFr*HRfE>B3J4%#9a!R+wP7&<5GN|_07|nP=$-I|>LNN#6i|+^nlpe9h z<0kDnasg?YE?gA^KgTjzmC0AiYojKFX}(d@w7=Z#x%=~)K2Zy(QhQ@1UBH2qIDesO zr%`a@cB;)cnqL;j`1k-c_T-kDJ$#`xDjCRTDJTvNoWCO#Faswb&mPbM7;nU2)-eGw zWE1$Zqb~Rv(mWayWJ&=U!d?eomroeI2R;0It~*9LCtmhQEpDThB3Eccycv75Nre(U zRlFR^x`!R|ZPBbuX@(P#;n)3}Ph{raiSc%S^M zb04;pt1rJNE(X_Ye6`k5Poj?OS$TJ$buai4FpOlOXe!_2_Y*EPrtiKB|8cZ1Bed z=8fRdG^D8%176c2#k*r+4hM%>_Gv~6r5f1!LRb!sG>*Z7%=U)1YoqLYg{EyqU z+wHc|hRH{b`e4kQtS{@?E}lcp17^k|!RK}-pG%8_BRDCA!_ZIU+{1mA&4?dYXmF3) zCp|Ug?s&ub+CQBql;%e zD&APmyq0*GmfI<&BnAS0c!Cguqfypng~S+l+4F|tkV)TkNG32?R;_e4!?l4 z-j|(ijRYV8oo|DT%w`(oxlUDSkicS{yJ-Bds#2RggKseD0~1QP$K6wpgM8vd?Hpm& z%&5>c-fwArYY&9M<&fpi^=X#jP#WO`TM#->@kwTLh|v?Qm4 z=G7z`(&fYqy;uX`Rc+XBQpqAX>35&u3_%6(VDlF1G8wb)z>S zx5?jl7|j*WhCX$Af01D*p z=y&$e4(UN*w<3E1e%%8b8iMq)Uem#8Pt*bh{pQn~!nOzL{vR1nPnAzgxArp^g2Rnm zwn_J|Yn!pwG}y4U%kmW5TOX$KKZS$sm?TH(*!06QPah3@Ow0^(nGf|+TBq4^s+}l4 zUK7*vq27^O3hHjJ1f(;xMg?@4>ab~))aD)=bf1;5{G|2qoRPdQnoQj? zCI2}om6`7i|%Z zS69UYlSjmB?&5HKHQ-YT@%XxY0A}fA?0mKSTwi6QZzO@ihYadCr>@~{G_e)=;IO-n zTRlcOUc3A1hsgN1WHA^2NGw{DIkRnv=(zlM6?4qVKJEDJbAbQ4{V1 zB^rUPZy1xU3%ZGeHn?jPCr_HtRO(~8&v&P>TuIxocMVq#8v*yc0Rf#n_S=x1L3^Fu zj&I9y#NWp!d<$(9GhUv^ad)MELNpF2@8Z4Mc^Ch0y67xMRpZlB|n)fUcr zX;GuGk}I8p&h)z{t4E81;0)ben!U30kjL?)S))H@?&gl2S^lg~D{8Ih211=$3Qj7c zQ<^lhW|RaATC#o`mO^-X=$%F#K_VpVVt?*wZfqpFEgn12#EzBm=tw;s0nCz&* zxjk8=;tvi~aF_iF6!Ci@60dUCN(;0R8Yp0ZiS64QArV8NBdnw*vs=~}_r`TSSoFu$ zOQqmDOqv-{(My=mfYN3wOcg-F&v%E2p;Cen984o)<)oy);FQG7&aHfSrZCd^XXK+^ zilNi5xtxcZLgs|}UBB$(mc^M)8yD_LUU`SBokjvIxLU~XFp?d~L+gD^C7c_G|AEOb z7M0+wGL1#LosYEki{0H5tl4&<2Y+yz#|Vh6$cL61MO+S~M44CQEPZQlQ)dwJh**gA zj>u{Y>mK@r>Fw{m`9c%uqp5T8!!_QL06m>wnWb|Pf9Ih?nCCSz$4|q*DcPlCu``eo zi5^kPcg?v9)^nD7DrAAaYqe~Z214h@0gV>_hqV&QXHC`c2W`gB=VWl!V}UH`rRXRHv|D%hjjA< zJON#+u?VGb+v5FeqFqzSoZ|3=+F*Q>`XFWuO6ZHOqlo}b#01=2?I%7-CIO3u;H!Pc zPTniyT$+K$x}lKcDvAAe?bfF&Ya0|zx%>>;y|$_k;`ZV=DlQw^O?rs|NMK&Z^Xq-* zF3sf?iW*%AWG<&v9Ilo9Cd>Pb#j!0qTIjtS1QMf7ls3yKciPVOlG3JVop9BsA8ptB zEkDDgrKcL_=qP93T@&nYnYlHp1>=w|o6HI2j9?s&-^uN65DS@w-uVf+MgtLRywFe1 z%HtNs-F%IgO+@tIbyU*oQxBc(;>39Z8aF(V;X5g_IW7wFg~6YhFeN@-vcD%a!&9Lz zV+E{bw@387k9^6D^JKjT+S`HMjzT^MQ29yIh&PdpSi(rtSxL)w+E2Y|_q(kO5 z)P_gC*G_BG*Mo{{qy5oUgNyxTdxF00BK$nks1+*}Yus**DaTrK8!r#$-COqD+ewb!SBPJHD8W6z|UCL9;&5gu77wNTHrA|AxX@L`Q!fOya=5CVfmfCfTNOz+T` zpy=cpk#Rg@;i3qfzS|8}`Yu@V^->@axpFT@pS<&3!H2i-BUILvH?oiVq_08=eqD@i zKpIe6nl(MmFIKt6`De6@Oh*0EmuAPLUX%*;NpZjP`Ajb)<;)rvk;UgeA4Np)S;(E| zWO7VGS3NF5m{q6Qf41m_(EiU4Btd7EX?Yx98Aj>LIRm37w#HL%tvG)r<~QY&AcQp0 zm3rJ>SGy4SZk&HS*lpRagSH;s-->o*GR6_W@K)hAZ+eF;#++1 zR`R^uz!wnEbr@?zr{T;|!SbWb|9(*;wf=>aNTER zp8lAnkZ?ODXQG`RYx!{ICV1JhJ8mjWxl<&WzF)b1M>4m+wZ$%?ODk&miB(^pr!n&5 zk3hA`)$O~xy!iNthH%^JV=YXxgJIvp&ZEa21(abBme~h6G`G{aqgw4x%_N0rU!)Z5 zs`NXOY16Yaqp=xS_)@AYn^W^x_4(r0?iPsN@BaYkMBLo(voU|IivHQwIPkPlV90;l z?PkB=+^@gQ6=t|^VA3zzK|R|b2ak~v-HrZKl&zKc0@sgZs{htNwcdPJ8yShmQ0D#u z-6^*ZgpCw?#wpMjyOAyi3v8?^e)v!#)^jWJb{ObIAgi21;6am>XuS4U8LK4z5j4ILyt`$o?KRLK0&2x)#m&dHmJdJ8o|| ztexQ?J$lScajLpDU=w@rt6079#t_08*%|0D1aKmDWX=XUReogx!KDv82&-mUE9=4Ad79Ok`QV>{HQ@pr1^Su1tTosk}K2VXa&YKeolyzr=c)VosJrl5J33@v4j- z|E!9$au&t?n@BO>!hO81QeCj72svqOvhnPjul~W9Log%!K~#uuQd7*M&zgI{%~A02 z-JIFdJH_dYlK!^0Mz34q^5}F;`E5%J&yriq1fq0Me`1^8viES8S|O@!Q1qNO-WmNg z`e^EG@aF0A_i^f$x6ix>GWhlT7NhhyP@+%zE$@S2`M1FNRgC*WKk~j$hd+Wi>Ll;; z);e5zFy|3>_Jd|?6HeY*1`6|{px1$N##xmt5Vp-`?0!C-H6zJ+y5V|($ENHz?5W%ECYcSUqp`QIH#S6bJ zT++txdpdnZ+v4$QV$g&DV{40=P*$R!(0#KntdEE>V*}vV1hN z)4f|COKkkTZxgp<#z#VjHAmJ(+0sAYv9TAdtSIu?kz0lruQG}9{X{=~t7AtEe_Z%J z)kC+b2)t5f{J_XaUaAh?*G@?wV8)~QMwJ>ckw^}Od+Z>4If*tX&(}c9^fYWhhfZ=8 zg}~gCw(bR%@4<0Sw|a?`NU6Xsxe({6pfxWv`NGX@Ijie@n3Y8E(sOJ+Ti??n`?81K zD!=j~F>irjA8q^FFYBo%hsLN3Rj1SxrtOy_V8zOJ7Q){cZj2Wsm=-l}s1dpyw zl6c%+Tz&5h6?A`@g_6|@kqo*m!oKRGy>9Lzr!t{@M3`f=sLx&u){CL|`2N(o+RK0P z>(Fwy*0=OSuf{0odo<$sWyu}y5$lhljQOIvrb=_#Yu|DKxHj8)XrvE274uS;T;O!h zWs>yVBps&OQdk9j8|JMtQj9chJccwFK(s?q$*SVJWX=N11Njp#{Y)YlzeYsMZ%lOn*f_yuAt@+qdS?<|E+aG2jPVj|YrTm32-ddqH zk>rrzb$|d(IhMs>REBrD^2^~_BRyByqCM!R3_}rGIsxQstsT1b$3t(E8a(6%3mGF$ z9;8#1IH6DRSH59mqGhHZ#pc3CI=>lYIP^YGOCZGM-(-I9>Au3}kQgQrLRGy$zlp*{ zj^zeSNPjfV1{xc~3f=S`7O%2A8b0*C)-*DBorrY1DOA8`)vz;qJu)0UgJ&Z_7*OC~nMhLqoddwQ!E>eqQV-gt%hSBqP|7L6AfGvc#uTj8QB(HM-dejbvN< zmaoXF!+fc*UlMOC&`EMf`*+3x{_ErpFUGjCM1am8yYEH1Nkq^|V>iJZ6K)Rj5IKEX zWPLTl^+=zgONfde{^ZMofocH^?maQs8IWiPt1Qh}&=B<_`I9h#A;MS1>KvrdxwkX655286dG8rJ`@3cpY@1Nq zdh|rh7I*5b`K&mRVTx+;{A#Uwr>GqB?S~weW;oXhwS&v>>`35g8#{Ld)7E_Z3x?f`y69nUFio3VB0gSp6rs2b>)LcT?;p>5Oj?yAG(2`e zfi+vF6h2+R(^tf8yLs%0Y<8a6S04I&rQ$No%4e(CiD2LNTNM*xp1!<^!B;AwyR9rh z80Z-Xg_$8Dz{tQ*qLjcHw9R!6MU`rQ4QUl7@#ERVNNcmr`9Sq7|(s%Fw^vsM=?))PYg5)^!Y{lOXrO>}a3*x`KHowOa3!;dhgU8RvP{Fays{QW1Q(UICxiu8N; z_-H%=?OUY9FqXo-M&K)HJ9!P`0Gt$w1^^F`S2||XQU8i3IV^IgcoL#XOsNN;s|e^L zLz6%;W6&Oa2Mc^Cwm-t{5bAES`RQlQW2NhrMQ%1e4Brh-Yr16}Sx7S6eChk+G9VZQ zjJgiow=zqA z;yu&c+2_&OEiw5ih0JC^N`2DH;Hp-5~(c2<@+rQt^`A1TPZEpWg2WL8^f z3jJhUx!N$i(}pKt^b40yEca#_vU6P$+ZU&gdLew#nvU? z&0xTA>v8e~)P}@qnCJ~4qe??Tr4(FImPpxq@>6;-3mo*Aq$7A5jEQ70>@5OrJV%g; z8my^QBGJ``yRB=~QrINvPI)-J*Uiq3=$Y-f8MoxQ&(Q^nmXe!iLq8K8+yHLyQNqZ3 zR`MGz=7hSK12Qpia9Lm1jnndm(PkzO&+ZN#pW}}w%YGUl8oLIaTe43rU(cizB05ZA zL8BJzE1$A16FxBHqKnYzlkUk+8LMJlY0RJJ-GeLqfXdE?l3Ju3*%ja;v%w2_)kYNg zYsP?JvHr~4=3%wJ<)#4xB0m1I0&T`whBQBW=ubzfkw*W-0$TI+f+HO6BaPD^G6prb z3Trh*v0fYK&KAOB1{vy942}QH)}F`-f+q)@dmRkR43#f5Fj)tYnw-N;0KxfStf3bQ zs+Smm!9!*@{Ij+{LKvi!f0 z@38}AEH+Z9z1l-jv$tb@svDF-$`8&L2BtDYHFH$3e9ip1gwv&^#ikuDy$Wj9zlkS| zfLVhOgn#WiU_bxY0RTLI)B*jU0N~JACJXlo?eXmD;_T{V?|Aoe@95{o#(GXvHgVhx z&Hd~PJ#nD@H2_Taw)TV`2`q(%SpNZff<)2b&}zUYFmU}ie`sL+kij1WD9CdNEsR^* z6V~^_>JM;AQtcBe$Y`TpRpRHKlc8nkq?*mcY&P*38xnr>w_ML^iH81BK@TWi?dX*D@@_38~Jjsm@3QL%S* ztmD`(V(>A(&>o)HXEqO3N@9mVC_J^}Lu?XI6dGkViuuw%!bur81!0<+8?Mo^om`&2!;trx? z^Oa6?g@$jjsphh7wMFgM4w#=?FXiJYL^&L>xpUdcm)4b+Z()zY+1gzHJ0SvXe-^`0 z`lss$tBo2WSt;7~8N)-*t`1KTed;NC(MM`&e}b(7lR%1YS}&~+ZdJ_9BF?!?^{i_l+15wwC~oQMhgZg_ZnY) zr+Q8L=dPy;b=g8@MVR;%${L#7Mw?wG$EHjLO1w9zIxT|P)u;XBKH*%-1A61(t8GGf zvgJ!j4@x1VJEigNK!w56cf5ze(z>X`NWr?wLF#B!A)XWm9ZyGu4Bkw}07~PF2A(-L zV{)OwHaBADzQAvDrz35it=JU3OtK$whvmTl10bqr$RzXTyQyQ0K_>+OAk%7-5#AA~ z#5RI>$!7pGbr9^lI3XiL&nl4#)hB*}Yon$OTcIDx<8?TT*Tca$u<{U8#?IV(idlQ5 z9h%bUk7_@rPFEG^-#tEp@;=K<9{P41RcPBf;XpQZ-{3(!f4lv>8OlQv%h@w4C+XP{sQ^86u8RtRa-b{*4?Jo`XrQd(s6e_rrL~$ zUo4!W14VNcqK0!U(s~Se00ufL*nc{$*gyse7G=X5pUB3C2w8TglXv!~niSSJMKhfA zGFYZ%?hk~2j{e5uSu@FBm#Mp6ZUR>+7l~^T&n&XyuA%h1ku&)6_;=C0?IgyUTIrdd zE`t^hRX4jRgI>R%ckJTeVCY>K{bRw?#7JLNYZi84&B*xJQr+gMt0N|qUAs3s7Ll$} zod#!JkEZ1N;SDN!^N}%ryil)fW!JzPhP*>E+1!7-%W>SXLujgBllMYSW!HZk@H211 zy80-U|7$1kW%<#q^Ji8C)=&UAx6+(;qImK_ubhSY@CgD8S+vz-UnxQ;BAJptG!KzV zViZCd4QQL{54@68&O(#t%EB=wR~_s0nB(C|x$BhOlKKgROgM3UuKI65T{q@RPvBO!f886{hVF|v!LbXT8f1~Y_V-PWByYuX3;T;4hRN}E34)j z!;5ZR^pjvu!b`)cfF*TA3&_l1Rlm!DQ)*M`;PbYyQr)Uoqd z<~a1e+5H_cthH@WJ>RjD6%~J?V;-639?}+sA4PI5QWzsB_+Y-lSH4KTm_%oKHWh#W zV(xfnt0BwtV{vzjZ-zJT<+X96>78`GnyAqH(x*`wKmSrJ9RCpv?urWfU}up3`DEk| zJI957CP1fIn0WV&t@L}>fWAXzv2%-ta*&sH4*WWH$c2l_!`UZgWUg!TzI=2p>uIWS zz%-*%x!hDFr^aF8nY!&)F2AQk(HC9 zw}Y6x=YOE5eM;yc#65e=BAA3Bu$6)sHNGoD;v74r^$o;=2eMuZ5}D&0a~Tc#HmO|x zO&oe{dFnaM=brks(-Ug>OR8ZR>02q~&6R8gx?*ZDkO;>`M1-~y15chM4W9mZcMGtH zO-nkqsEehV@D@Ax|9$jCW3)_2$hpPH*Q6>dY`NV~gRMoAk;uGD9Www|WMi$>U)tpo z3t%Yx9q2sx51(`c&Yxy2CU0ZQ1SFrio<`gOIK9JHrbOn#`yRjBa+2$%*uCilc%{nN z#;X-0f>nxZRA$~%1Dj)INAZhR6lGD09@Z~NFMJ0|sShTKd4hh&wFsP{T%3BaWPAa5 zag~|)>k6THbMA)E^Qz==$;~GHF8%0#;;siSd13?_Ik~x+=DuGv;m(SRE5tHA`Ryw9L5p_}bc#GaFM)sK22Zpr5$5ADP0COhcpL?!Z0}dKcxW zZu}%6VN*wwfYG5WyVViJm%eq+xe6-!<-9TVY20{*5YVJrY0J>HsrFZQ8!^Yz!XJXi zXM(Pxua4|4H6|Bd`27v4PpY)#GNuc3g1>-wjFr~lxYK~@W}~b$A^Xv{w;p=bTKg+1 zOin}8IK-5sEe#G9gzzQ8xG~B@z_y?WtGU79!ajDQm>t-7Z=g}-!_5hnXsZ}n`GkbK z{;@i#Va8$`(;Ct2ZN3iIS}wABEsBX4oHTDNj(f<A7~U*kBc9HXBYU{UhMl)em(? zigtrqHy)76C{E7b#{62nssY36>&tyYwf4#IS^I`l&-3{-Lk%#(+`b&r8}*?8BZUbs zeZTA`H}3GAG|7*9aHZ7Bt+iA0cNQBf3J(y_E8lsjEQtTZ`IV-K*wM#hL2F4|?v`WL zzN=)!-m!nUJ)mqe-6(D+EU@Ae(=o9^x~VWh&7L&u>uMg0mXrz*5{W=2aE0^ThJ0KA zodlQ6S)1JR($puHhZ#gdJjZ4C#W-i<#w>*AEa%P$wd1wgG)UgUmuAwxhK^5L+GH2H z1>OOGu`!(WjCv*G<3(2G89AqDt_^E*Q(wysK79S!EONB6ILlds1ytj|nR^OV?H|5> z9a0v5Z7(wh3~Ev>$)E-2@05LF!`IH|*e%d+kI?|*|B49* z8=CaN^&mxI@=n-F77PW%$hi3SnJ85A951>OA%sIvy)NAv|mtek(#6VaEI@bvm2RA00)w-?EZaeze7NUREo=Locx(u$@OK zd*WaE%u%41K4I+wubjB-^!Z*s>PK#~_dOJJe0~ruW&A?6RWzN>iTK0#qB(s<nnxR(;z$C+9&p#{^?x$kufU#*t5lK2n%Or0bbw&xeM-)#)+0rmX3>@ z!2p)=Rae8lrKg!s`Fr}t>9eGpEdz&kjDy+ji|;lg-ZL_!Pu5u zk)AngP3Cb?FT#QOZIPJ&s~XCHP*!Nzzka4@N5vad&H7RmY2aReF%HQkEQOA-^G zG_c)KT86)UYmt05I*r+OyX6!%5oSMEXbp+*ERf*ml*&saWlQgYy$0bRTvZ6Nn-TK$ z>JxD5-6&4qZoARC`e3?XzPIse;isNi@>`+by8DmaZnaGXwOg+QR? zp-(Kw!w}AQ`inPQYmWnI5j@K#>BcVs&`djc|H`$h_?KMPlor{|f^=q{{glC~>!(OP zRML*a8n)@?*(}{xRlkLutPZZ%;#IF#vldaAEH9h{df|KQ-cwvpXJU>Sc!S(R3!kgL?$FXy z>N;3WwhV=zEkU;YZMQAOYsX6VteCWRPU&&Blz)%JAj=W-g|L$p;h{c@y+&>K`n;0=3nnegyJ4Hr-c|*>H2d1(5*jCG!X8?D12k(ZO9<7{?90T+`M4OHF0*<4ALn%b-Hx!pl4z0*q>HEIkPQZOj&VXxDAUHYKz-^c?C zP1AXAA*YvG@HZUE4mfIwj!}?SXIAcp9?={FsJPK|gzFiNA)WDM;XR0;(Gq z=m7i{=Lh>>UcFlxhW{uZ!iQvw67=q5cVp*^Cn%4)bR+IyE3Pfc8&lT0?^H{|e)OQY zxV2~Ngt}>08)TL*n3M9nduD5P>8>B6MO6V6lj(?XeswRk=rL*0w7> zUtg%ssHk5OTUVklaU6B6r5@F$hHh&%H051Q6Dbbb;ov40B%r_I9ps5qB^t!mAaBKK z{PnY3y&!o%7sSpx3twGZxyWbvm+I<6f07@UXzo821(!VO?mj!6TQLav+uSLxK#`(kP9IDqcyotsG(P7w*K9$`h^Vr;p(axG4c3^6A zl-_KJ{#-3xp7H1PT z)UOKjfUmNFXCw{<;i25*Xw85AnIQ%3`r%#D7vC3dtF zwWxBjmaY!qHGybR4h1@DBa&8A} z=2U}AD{I2m=}2B~i3mD6FoR+g1?x+mi+n_wH&znj%Lm;CL0@={=cd~m$pi&LbC`NZ zTW@mr6t#aE2}$O8xStl9_-yEj4z+9k>y$Y=1r#IsdBJ!_T$+^;c2=ga+oMWako`0l zXYa?`Kc+5y@_-Q$=RNSD*j~mG@2{x?w8Faq_t@PZ-L0Y#gd~bD2^m0Aj9j4E zK2v~oE9ThNb$vU$bLWemtaohRL*_mhsa7Xe!;yS>pqmO?Ac)F6CfiP7>0Ua=^<{}( z@%n1B&%V!g@wb!WR&|APZIY1i=(1EDy(4a1b50G1zk1vpKwtPIHb5esl6LH{RU3ea zBuU|4=Xm3VMSB}X9^!T8lPMDB%oHth&G;w)Rs5OqiA9Y!JfNSklJzal%O62=5YogA zsOBrQUsa#e9i!%$R*X912^_vqOhkvLJ~Vm181aFTGLV!2<0kKZiZg3gRcp958xGXS zIcqzsmEfPZjMmkF(xy+8mtyqe?h+^ti3P@r?0Mp?rURVWAdd zX>Pb|fBl)?(-D4HuCqyr^5OW2Xj6ab`#;KeTTP(7^R~Dy6&D@E$B>#WEuqW{(eG7t zLSSpciG&^o`QCO9yTvZ=6&FyP6Ls>-l2s%wsuWEH2=C1l3OWNrwBQD!-6&sY(#X&p zB`E4KMAvg(U;u&kv)YVrdG~!PT9@wktvKhS*db4DjPnHQn|CuGaDan}KcbS01JXri zlg(UT5#8<_$MxHiPF>bt=K78M->DGjc`ho55CusCgXLNCrh{J=rXSf}g?=~LwF>AgBo3(p? z{MGI_6F#t66Aql#&1f3^_O84a0HXL(te&`ZBbcg%A}9jwtpzwYQ}*+s6)Ikyac@MR z=&=jR-lRR#Y6}y9-3m^Fg+KNox4E7ohto|xZ(P&v7(=&-TLyn(bADf&VKD8&Swl@< z!`EF^rBA2gKJu{hLg=cE`+{!FcbMI~mtSzyZG^Apix=bKE!?*%w~4WLst;eeBwE7S z|9<|-^~3s3VYKit84`qzU({}0+Pr>a>);_(Zi;#Kx%PR6Y)~|RXun^shMN}(a;ZO1 zp0Ra@YQNWta4_W3Gc?;b_U+bqvgW9&yTnTTq7H3}slrloT7)=oE1fU{uiRcJ6iG6~ z*;yDL$|+mI(d>UQ;4e!*ZS^5x4W59O#t*22~yA62MGmf{*h`#e61TH0q}%KuI8>9tjn zm$HC7>c0SVaVrNHO8qCknHgOrO$I1@y)F>=f!9rLhen%k$p_!pcgo{KY`%QxIy|Dh z0Td)@D?yjiD+(_heQYcy4Gziuh1Xo3p>zLnb25W={Y8A$dDe~*RG%$-d&VO}YU~!Z zZdL{SURl&^k=HeoD~#6f+=>$naAw5MLHdQwi$93d|7A2e>{@@KSaftC{N^8URJeH$ zXOW59_&D;Vr*9EP)h{OKKD;CUaf+Y|W*kaad1!KxR71ue*m-$%6G1E_Uz<7s8pVfU z-1f>WnFR@Z8Rkp;j7Qf87#85UA)YWv?O+s<)8ZoRmbxUsmLD3I{#+o-TDSYc|6$;E zvT3h!%~ju7p`qr?4T0;Tskd@f<1fA}&WjRX#6%Vs3~$rrAw-zM$19Ro)49xpL*e_*x09kWIn2rxs9UtGDcl z;Ag?tvhQJ7INjhaKX(|B13hownB!ue)3@+J3>}b3Q7LsjjOd2|@hI8Vs(~PF0o`~Q zcx+RUjQ{&Iv9jC*uRJ}cROu-jqi|N0_MPO#CTw;HX`4cM@J|Lb5`+uI%hTrwr#t6U zT?X#Q>ch`B9lnSDqx^f@YMnu|X#^L7#1eB}`iuNwbrA7A2-?TN;T_q73<>9M_o~bR z7+^YCL!+=a?BZq&$S|<$N|7Ad^i#FR6xsHTmyQyZ@Dk2%vOA9a{oAepgV-k0`2@_1 z1vlgS0C@gX=Up=|}lM6{TtiU6=aCTcbt*YW9a> z<>b-aSK#q%0ORlp>GqtyuE*T)DjRce3~kl8(2?KIMLiw+EwQroa!OIS@5|>O97{EZ zs8_W|enctH$(GQ)VpQU^J>qw&R(-zyjUgCW^^{H-EA-ZBp&U-?UaohNft4W{0nwPn zZyaRC6Q9wtePX5YKarKKGa~3DO6gap)wekD`@usxs zJfJThMY=tWUSvb<;8`*Z!cIG#v*@1fjfTmPSJ2yHNJJjv ziMJyIIB#U7{-{#;L17u?<<)4n#>(3thraB3a*q8PR;qqSL3{^TE9m$1$Cp`K(CXZl72CuwO`nWhBP6ezIcu_48B-b|aCmNN!il z{@5vJF+Xz=Rv9@)5Q!B@RWR(O0ur(V@;VvAp%jAL1w*RZJc8~X09&KyV zW-y)fJlhBiD}#>hC26A~K*0(Yr>vFZy!BBz@AS>cZ|jHo^7o2j18$B)-Z+iW(hSlB z%FcIce)(T6_lHj-&|X(vo1D{cY)bS|HSWl?F}zUXf?lD4O3#TnW}lObDfuQhG3zMG z>z>m*gDV#187K*n#eB%@rO8~WL;*fhG>TJmnsoCg69yDZbS-1h4@Jn@jmAJnfPzG< z%XSMopNu!lUD8ZNu51k15STzZT)}+RUn_|5;hkd?5ZAZw9jT~Id-Ie$VU_qm@ceCQ zLmrCVgxqG&>=_QF3c7Yu-PELX_dL88rWP^DhUYY<{Vg#1@}CS)m=*g0pB-W%9!*aQ zqiKbpy=+^&?!gin`%;Mkd|UTGHOz7XU2Hg#5n$TLR%7rbp9weEem6%^M&Qw#eQ;y!xw*5#2jbF@$A%gA|G9+`T1xw?+Qo85`k6?BkG+QeU-k;f%kd=ddVLnf2kILdCgC-y(oLsgk;_7rRRETPsIRZtzGJ{*>A>rK)KZBLKzhpLV=-+SM1Ap z)PiJ4h4QR_@s3lpSx%Uy^tZ46_wQUoW2JRT4P83i=&wluqSFNKLrX+7ggwr$ef{jE zNU&AT0~N;L3o}1UpWDOtCe@F#dY%CcXuOv^7*}c4baf7TjDS_#{AVsw^Z!kjq@D)u+-m$T+gX-&D4R1-sAX=9L)@~wBOPnDak_yy+*-b`T((Bu`er!suCS9d?9q3wH2gn4HxEd41jBSB6 zzsw*S4cO}=c6;947??2%f@v(tLcBCBUn@Q+@u?|&P%j?)dY07Z1b b4m`ZHkqC?^0QQtXD1%MizTk_;BEbIxNX@vh literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index de8e9ccddc..e338be74df 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -73,6 +73,7 @@ #include "code\__DEFINES\materials.dm" #include "code\__DEFINES\maths.dm" #include "code\__DEFINES\MC.dm" +#include "code\__DEFINES\mecha.dm" #include "code\__DEFINES\melee.dm" #include "code\__DEFINES\menu.dm" #include "code\__DEFINES\misc.dm" @@ -998,37 +999,6 @@ #include "code\game\machinery\telecomms\machines\receiver.dm" #include "code\game\machinery\telecomms\machines\relay.dm" #include "code\game\machinery\telecomms\machines\server.dm" -#include "code\game\mecha\mech_bay.dm" -#include "code\game\mecha\mech_fabricator.dm" -#include "code\game\mecha\mecha.dm" -#include "code\game\mecha\mecha_actions.dm" -#include "code\game\mecha\mecha_construction_paths.dm" -#include "code\game\mecha\mecha_control_console.dm" -#include "code\game\mecha\mecha_defense.dm" -#include "code\game\mecha\mecha_parts.dm" -#include "code\game\mecha\mecha_topic.dm" -#include "code\game\mecha\mecha_wreckage.dm" -#include "code\game\mecha\combat\combat.dm" -#include "code\game\mecha\combat\durand.dm" -#include "code\game\mecha\combat\five_stars.dm" -#include "code\game\mecha\combat\gygax.dm" -#include "code\game\mecha\combat\honker.dm" -#include "code\game\mecha\combat\marauder.dm" -#include "code\game\mecha\combat\neovgre.dm" -#include "code\game\mecha\combat\phazon.dm" -#include "code\game\mecha\combat\reticence.dm" -#include "code\game\mecha\equipment\mecha_equipment.dm" -#include "code\game\mecha\equipment\tools\medical_tools.dm" -#include "code\game\mecha\equipment\tools\mining_tools.dm" -#include "code\game\mecha\equipment\tools\other_tools.dm" -#include "code\game\mecha\equipment\tools\work_tools.dm" -#include "code\game\mecha\equipment\weapons\mecha_ammo.dm" -#include "code\game\mecha\equipment\weapons\weapons.dm" -#include "code\game\mecha\medical\medical.dm" -#include "code\game\mecha\medical\medigax.dm" -#include "code\game\mecha\medical\odysseus.dm" -#include "code\game\mecha\working\ripley.dm" -#include "code\game\mecha\working\working.dm" #include "code\game\objects\buckling.dm" #include "code\game\objects\empulse.dm" #include "code\game\objects\items.dm" @@ -3705,6 +3675,37 @@ #include "code\modules\vehicles\wheelchair.dm" #include "code\modules\vehicles\cars\car.dm" #include "code\modules\vehicles\cars\clowncar.dm" +#include "code\modules\vehicles\mecha\_mecha.dm" +#include "code\modules\vehicles\mecha\mech_bay.dm" +#include "code\modules\vehicles\mecha\mech_fabricator.dm" +#include "code\modules\vehicles\mecha\mech_melee_attack.dm" +#include "code\modules\vehicles\mecha\mecha_actions.dm" +#include "code\modules\vehicles\mecha\mecha_construction_paths.dm" +#include "code\modules\vehicles\mecha\mecha_control_console.dm" +#include "code\modules\vehicles\mecha\mecha_defense.dm" +#include "code\modules\vehicles\mecha\mecha_parts.dm" +#include "code\modules\vehicles\mecha\mecha_topic.dm" +#include "code\modules\vehicles\mecha\mecha_wreckage.dm" +#include "code\modules\vehicles\mecha\combat\combat.dm" +#include "code\modules\vehicles\mecha\combat\durand.dm" +#include "code\modules\vehicles\mecha\combat\gygax.dm" +#include "code\modules\vehicles\mecha\combat\honker.dm" +#include "code\modules\vehicles\mecha\combat\marauder.dm" +#include "code\modules\vehicles\mecha\combat\medigax.dm" +#include "code\modules\vehicles\mecha\combat\neovgre.dm" +#include "code\modules\vehicles\mecha\combat\phazon.dm" +#include "code\modules\vehicles\mecha\combat\reticence.dm" +#include "code\modules\vehicles\mecha\equipment\mecha_equipment.dm" +#include "code\modules\vehicles\mecha\equipment\tools\medical_tools.dm" +#include "code\modules\vehicles\mecha\equipment\tools\mining_tools.dm" +#include "code\modules\vehicles\mecha\equipment\tools\other_tools.dm" +#include "code\modules\vehicles\mecha\equipment\tools\weapon_bay.dm" +#include "code\modules\vehicles\mecha\equipment\tools\work_tools.dm" +#include "code\modules\vehicles\mecha\equipment\weapons\mecha_ammo.dm" +#include "code\modules\vehicles\mecha\equipment\weapons\weapons.dm" +#include "code\modules\vehicles\mecha\medical\odysseus.dm" +#include "code\modules\vehicles\mecha\working\ripley.dm" +#include "code\modules\vehicles\mecha\working\working.dm" #include "code\modules\vending\_vending.dm" #include "code\modules\vending\assist.dm" #include "code\modules\vending\autodrobe.dm" From aec888a7b62f035026fc3d41f5ea33cccac7cf35 Mon Sep 17 00:00:00 2001 From: SandPoot Date: Wed, 16 Mar 2022 15:17:57 -0300 Subject: [PATCH 07/53] Update files --- .../research/techweb/nodes/mecha_nodes.dm | 2 +- code/modules/vehicles/mecha/_mecha.dm | 20 +++++++++++-------- code/modules/vehicles/mecha/combat/combat.dm | 5 ----- code/modules/vehicles/mecha/mecha_actions.dm | 4 ++++ code/modules/vehicles/mecha/working/ripley.dm | 5 +---- 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/code/modules/research/techweb/nodes/mecha_nodes.dm b/code/modules/research/techweb/nodes/mecha_nodes.dm index 2e77f697da..740faf3832 100644 --- a/code/modules/research/techweb/nodes/mecha_nodes.dm +++ b/code/modules/research/techweb/nodes/mecha_nodes.dm @@ -14,7 +14,7 @@ starting_node = TRUE display_name = "Basic Exosuit Equipment" description = "Various tools fit for basic mech units" - design_ids = list("mech_drill", "mech_mscanner", "mech_extinguisher", "mech_cable_layer") + design_ids = list("mech_drill", "mech_mscanner", "mech_extinguisher") /datum/techweb_node/adv_mecha id = "adv_mecha" diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm index ff901f2f01..785be3d61f 100644 --- a/code/modules/vehicles/mecha/_mecha.dm +++ b/code/modules/vehicles/mecha/_mecha.dm @@ -956,6 +956,7 @@ /obj/vehicle/sealed/mecha/generate_actions() + initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/climb_out) // I don't see a single problem in generating exit vehicle action. initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_internals, VEHICLE_CONTROL_SETTINGS) initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_cycle_equip, VEHICLE_CONTROL_EQUIPMENT) initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_lights, VEHICLE_CONTROL_SETTINGS) @@ -968,9 +969,8 @@ return if(ishuman(H) && !Adjacent(H)) return - add_occupant(H) H.forceMove(src) - H.update_mouse_pointer() + add_occupant(H) add_fingerprint(H) log_message("[H] moved in as pilot.", LOG_MECHA) setDir(dir_in) @@ -1025,8 +1025,6 @@ B.reset_perspective(src) B.remote_control = src B.update_mobility() - B.update_mouse_pointer() - update_icon() setDir(dir_in) log_message("[M] moved in as pilot.", LOG_MECHA) if(!internal_damage) @@ -1100,7 +1098,6 @@ mmi.mecha = null mmi.update_icon() L.mobility_flags = NONE - update_icon() setDir(dir_in) return ..() @@ -1109,22 +1106,29 @@ RegisterSignal(M, COMSIG_MOB_DEATH, .proc/mob_exit) RegisterSignal(M, COMSIG_MOB_CLICKON, .proc/on_mouseclick) RegisterSignal(M, COMSIG_MOB_SAY, .proc/display_speech_bubble) - update_icon() return ..() +/obj/vehicle/sealed/mecha/after_add_occupant(mob/M) + . = ..() + update_icon() + M.update_mouse_pointer() + /obj/vehicle/sealed/mecha/remove_occupant(mob/M) UnregisterSignal(M, COMSIG_MOB_DEATH) UnregisterSignal(M, COMSIG_MOB_CLICKON) UnregisterSignal(M, COMSIG_MOB_SAY) - update_icon() M.clear_alert("charge") M.clear_alert("mech damage") if(M.client) - M.update_mouse_pointer() M.client.view_size.resetToDefault() zoom_mode = 0 return ..() +/obj/vehicle/sealed/mecha/after_remove_occupant(mob/M) + . = ..() + update_icon() + M.update_mouse_pointer() + ///////////////////////// ////// Access stuff ///// ///////////////////////// diff --git a/code/modules/vehicles/mecha/combat/combat.dm b/code/modules/vehicles/mecha/combat/combat.dm index ccfd92ecbc..b5479c6867 100644 --- a/code/modules/vehicles/mecha/combat/combat.dm +++ b/code/modules/vehicles/mecha/combat/combat.dm @@ -11,11 +11,6 @@ mouse_pointer = 'icons/mecha/mecha_mouse.dmi' . = ..() -/obj/vehicle/sealed/mecha/combat/moved_inside(mob/living/carbon/human/H) - ..() - update_icon() - - /obj/vehicle/sealed/mecha/combat/proc/max_ammo() //Max the ammo stored for Nuke Ops mechs, or anyone else that calls this for(var/obj/item/I in equipment) if(istype(I, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/)) diff --git a/code/modules/vehicles/mecha/mecha_actions.dm b/code/modules/vehicles/mecha/mecha_actions.dm index 09ccaad2c2..070a3158b0 100644 --- a/code/modules/vehicles/mecha/mecha_actions.dm +++ b/code/modules/vehicles/mecha/mecha_actions.dm @@ -273,3 +273,7 @@ button_icon_state = "mech_phasing_[chassis.phasing ? "on" : "off"]" to_chat(owner, "[icon2html(chassis, owner)]En":"#f00\">Dis"]abled phasing.") UpdateButtonIcon() + +/datum/action/vehicle/sealed/mecha/climb_out + name = "Eject From Mech" + button_icon_state = "mech_eject" diff --git a/code/modules/vehicles/mecha/working/ripley.dm b/code/modules/vehicles/mecha/working/ripley.dm index e8fae6d985..2d6b510c2a 100644 --- a/code/modules/vehicles/mecha/working/ripley.dm +++ b/code/modules/vehicles/mecha/working/ripley.dm @@ -30,10 +30,6 @@ . = ..() update_pressure() -/obj/vehicle/sealed/mecha/working/ripley/moved_inside(mob/living/carbon/human/H) - ..() - update_icon() - /obj/vehicle/sealed/mecha/working/ripley/check_for_internal_damage(list/possible_int_damage, ignore_threshold = FALSE) if (!enclosed) possible_int_damage -= (MECHA_INT_TEMP_CONTROL + MECHA_INT_TANK_BREACH) //if we don't even have an air tank, these two doesn't make a ton of sense. @@ -44,6 +40,7 @@ AddComponent(/datum/component/armor_plate,3,/obj/item/stack/sheet/animalhide/goliath_hide,list(MELEE = 10, BULLET = 5, LASER = 5)) /obj/vehicle/sealed/mecha/working/ripley/generate_actions() + initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/climb_out) if(enclosed) initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_internals, VEHICLE_CONTROL_SETTINGS) initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_cycle_equip, VEHICLE_CONTROL_EQUIPMENT) From fdb6413d2339cfc8736d3dbe386d6b452a5996bd Mon Sep 17 00:00:00 2001 From: SandPoot Date: Wed, 16 Mar 2022 15:22:04 -0300 Subject: [PATCH 08/53] You guys want some logs? --- code/__HELPERS/_logging.dm | 4 ++++ code/controllers/configuration/entries/logging.dm | 4 ++++ code/game/atoms.dm | 2 ++ config/entries/logging.txt | 3 +++ 4 files changed, 13 insertions(+) diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index 4bc9ccaacd..6f12d09265 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -77,6 +77,10 @@ if (CONFIG_GET(flag/log_game)) WRITE_LOG(GLOB.world_game_log, "GAME: [text]") +/proc/log_mecha(text) + if (CONFIG_GET(flag/log_mecha)) + WRITE_LOG(GLOB.world_mecha_log, "MECHA: [text]") + /proc/log_virus(text) if (CONFIG_GET(flag/log_virus)) WRITE_LOG(GLOB.world_virus_log, "VIRUS: [text]") diff --git a/code/controllers/configuration/entries/logging.dm b/code/controllers/configuration/entries/logging.dm index 54bd5cb713..0a7e714a33 100644 --- a/code/controllers/configuration/entries/logging.dm +++ b/code/controllers/configuration/entries/logging.dm @@ -24,6 +24,10 @@ /datum/config_entry/flag/log_game // log game events config_entry_value = TRUE +/// log mech data +/datum/config_entry/flag/log_mecha + config_entry_value = TRUE + /datum/config_entry/flag/log_virus // log virology data config_entry_value = TRUE diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 1f57c1ced8..6e153028e4 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -1159,6 +1159,8 @@ log_game(log_text) if(LOG_GAME) log_game(log_text) + if(LOG_MECHA) + log_mecha(log_text) if(LOG_SHUTTLE) log_shuttle(log_text) else diff --git a/config/entries/logging.txt b/config/entries/logging.txt index 31692afccb..5b66898ff6 100644 --- a/config/entries/logging.txt +++ b/config/entries/logging.txt @@ -19,6 +19,9 @@ LOG_SUSPICIOUS_LOGIN ## log game actions (start of round, results, etc.) LOG_GAME +## log mecha actions +LOG_MECHA + ## log player votes LOG_VOTE From 25bcad7be8d74a72d3b8a8324bfa2399b9662c3d Mon Sep 17 00:00:00 2001 From: SandPoot <43283559+SandPoot@users.noreply.github.com> Date: Wed, 16 Mar 2022 18:06:25 -0300 Subject: [PATCH 09/53] Update code/datums/components/armor_plate.dm --- code/datums/components/armor_plate.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/components/armor_plate.dm b/code/datums/components/armor_plate.dm index ee3d11924d..80c35c1ecb 100644 --- a/code/datums/components/armor_plate.dm +++ b/code/datums/components/armor_plate.dm @@ -85,6 +85,6 @@ var/overlay_string = "ripley-g" if(amount >= 3) overlay_string += "-full" - if(LAZYLEN(mech.occupants)) + if(LAZYLEN(mech.occupants) < 1) overlay_string += "-open" overlays += overlay_string From 11522b77619bfa952e66906638f2c0e990fa849c Mon Sep 17 00:00:00 2001 From: SandPoot Date: Wed, 16 Mar 2022 18:21:37 -0300 Subject: [PATCH 10/53] global var --- code/_globalvars/logging.dm | 4 ++-- code/game/world.dm | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm index 843eab6fb0..e685255469 100644 --- a/code/_globalvars/logging.dm +++ b/code/_globalvars/logging.dm @@ -31,8 +31,8 @@ GLOBAL_VAR(query_debug_log) GLOBAL_PROTECT(query_debug_log) GLOBAL_VAR(world_job_debug_log) GLOBAL_PROTECT(world_job_debug_log) -// GLOBAL_VAR(world_mecha_log) -// GLOBAL_PROTECT(world_mecha_log) +GLOBAL_VAR(world_mecha_log) +GLOBAL_PROTECT(world_mecha_log) GLOBAL_VAR(world_virus_log) GLOBAL_PROTECT(world_virus_log) GLOBAL_VAR(world_asset_log) diff --git a/code/game/world.dm b/code/game/world.dm index af11b7c93e..b16d553b89 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -112,6 +112,7 @@ GLOBAL_LIST(topic_status_cache) GLOB.world_game_log = "[GLOB.log_directory]/game.log" GLOB.world_suspicious_login_log = "[GLOB.log_directory]/suspicious_logins.log" + GLOB.world_mecha_log = "[GLOB.log_directory]/mecha.log" GLOB.world_virus_log = "[GLOB.log_directory]/virus.log" GLOB.world_asset_log = "[GLOB.log_directory]/asset.log" GLOB.world_attack_log = "[GLOB.log_directory]/attack.log" From f4b74119cfa477007d0e019b40100c216d1b5d18 Mon Sep 17 00:00:00 2001 From: SandPoot Date: Wed, 16 Mar 2022 18:37:13 -0300 Subject: [PATCH 11/53] try to force it through by just changing path --- _maps/map_files/SpookyStation/SpookyStation.dmm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_maps/map_files/SpookyStation/SpookyStation.dmm b/_maps/map_files/SpookyStation/SpookyStation.dmm index 90ba06f372..b40f7adaab 100644 --- a/_maps/map_files/SpookyStation/SpookyStation.dmm +++ b/_maps/map_files/SpookyStation/SpookyStation.dmm @@ -4981,7 +4981,7 @@ /turf/open/floor/wood, /area/eventmap/inside) "aoJ" = ( -/obj/mecha/working/ripley/deathripley{ +/obj/vehicle/sealed/mecha/working/ripley/deathripley{ equipment_disabled = 1; light_color = "#FAA019"; lights_power = 3 From d8f656ecf1ec8efbea23cf3943ace46029d0c4d7 Mon Sep 17 00:00:00 2001 From: SandPoot Date: Wed, 23 Mar 2022 10:26:58 -0300 Subject: [PATCH 12/53] restores EMP behavior --- code/modules/vehicles/mecha/mecha_defense.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/vehicles/mecha/mecha_defense.dm b/code/modules/vehicles/mecha/mecha_defense.dm index 39a1b74709..78b4c7b441 100644 --- a/code/modules/vehicles/mecha/mecha_defense.dm +++ b/code/modules/vehicles/mecha/mecha_defense.dm @@ -147,8 +147,8 @@ if (. & EMP_PROTECT_SELF) return if(get_charge()) - use_power((cell.charge/3)/(severity*2)) - take_damage(30 / severity, BURN, ENERGY, 1) + use_power((cell.charge/3)*(severity*0.005)) + take_damage(severity/3, BURN, ENERGY, 1) log_message("EMP detected", LOG_MECHA, color="red") if(istype(src, /obj/vehicle/sealed/mecha/combat)) From 189716314f610de2113eb2ade1cf92a917d6c4cd Mon Sep 17 00:00:00 2001 From: SandPoot Date: Wed, 23 Mar 2022 12:10:02 -0300 Subject: [PATCH 13/53] Would you like some defines in these trying times? --- code/__DEFINES/traits.dm | 2 +- code/_onclick/hud/alert.dm | 4 +- code/_onclick/item_attack.dm | 2 +- code/_onclick/other_mobs.dm | 2 +- code/controllers/subsystem/fire_burning.dm | 2 +- code/datums/armor.dm | 2 +- code/datums/components/acid.dm | 2 +- code/datums/components/armor_plate.dm | 2 +- code/datums/components/embedded.dm | 2 +- code/datums/diseases/_MobProcs.dm | 2 +- code/datums/elements/embed.dm | 2 +- code/datums/martial/boxing.dm | 2 +- code/datums/martial/krav_maga.dm | 8 +- code/datums/materials/_material.dm | 2 +- code/datums/materials/basemats.dm | 44 +++++----- code/datums/materials/meat.dm | 2 +- code/datums/materials/pizza.dm | 2 +- .../datums/weather/weather_types/acid_rain.dm | 2 +- .../weather/weather_types/radiation_storm.dm | 2 +- code/game/atoms.dm | 2 +- .../game/gamemodes/clown_ops/clown_weapons.dm | 6 +- code/game/machinery/_machinery.dm | 8 +- code/game/machinery/ai_slipper.dm | 2 +- code/game/machinery/buttons.dm | 2 +- code/game/machinery/camera/camera.dm | 4 +- code/game/machinery/computer/_computer.dm | 6 +- code/game/machinery/computer/atmos_control.dm | 2 +- code/game/machinery/deployable.dm | 2 +- code/game/machinery/doors/airlock_types.dm | 2 +- code/game/machinery/doors/door.dm | 2 +- code/game/machinery/doors/firedoor.dm | 2 +- code/game/machinery/doors/passworddoor.dm | 2 +- code/game/machinery/doors/poddoor.dm | 2 +- code/game/machinery/doors/shutters.dm | 4 +- code/game/machinery/doors/windowdoor.dm | 2 +- code/game/machinery/firealarm.dm | 2 +- code/game/machinery/flasher.dm | 2 +- code/game/machinery/hologram.dm | 2 +- code/game/machinery/igniter.dm | 2 +- code/game/machinery/navbeacon.dm | 2 +- .../machinery/porta_turret/portable_turret.dm | 6 +- code/game/machinery/requests_console.dm | 2 +- code/game/machinery/shieldgen.dm | 2 +- code/game/machinery/shuttle/shuttle_heater.dm | 2 +- code/game/machinery/spaceheater.dm | 2 +- .../telecomms/machines/message_server.dm | 2 +- code/game/objects/effects/arachnid_web.dm | 2 +- code/game/objects/effects/spiders.dm | 2 +- .../effects/temporary_visuals/clockcult.dm | 2 +- code/game/objects/items/RCD.dm | 2 +- code/game/objects/items/RPD.dm | 2 +- code/game/objects/items/RSF.dm | 2 +- code/game/objects/items/armor_kits.dm | 20 ++--- code/game/objects/items/cards_ids.dm | 2 +- code/game/objects/items/crab17.dm | 2 +- code/game/objects/items/defib.dm | 2 +- code/game/objects/items/devices/PDA/PDA.dm | 2 +- .../items/devices/forcefieldprojector.dm | 2 +- code/game/objects/items/dualsaber.dm | 2 +- code/game/objects/items/fireaxe.dm | 6 +- code/game/objects/items/grenades/smokebomb.dm | 2 +- code/game/objects/items/handcuffs.dm | 2 +- code/game/objects/items/holy_weapons.dm | 2 +- code/game/objects/items/kitchen.dm | 8 +- code/game/objects/items/melee/energy.dm | 2 +- code/game/objects/items/pitchfork.dm | 2 +- code/game/objects/items/pneumaticCannon.dm | 2 +- code/game/objects/items/powerfist.dm | 2 +- code/game/objects/items/puzzle_pieces.dm | 2 +- code/game/objects/items/religion.dm | 8 +- code/game/objects/items/shields.dm | 12 +-- code/game/objects/items/singularityhammer.dm | 2 +- code/game/objects/items/spear.dm | 2 +- .../game/objects/items/stacks/sheets/glass.dm | 14 +-- .../items/stacks/sheets/sheet_types.dm | 6 +- .../objects/items/stacks/tiles/tile_types.dm | 2 +- code/game/objects/items/storage/backpack.dm | 2 +- code/game/objects/items/stunbaton.dm | 4 +- code/game/objects/items/tanks/tanks.dm | 2 +- code/game/objects/items/tanks/watertank.dm | 2 +- code/game/objects/items/teleportation.dm | 2 +- code/game/objects/items/tools/crowbar.dm | 2 +- code/game/objects/items/tools/screwdriver.dm | 2 +- code/game/objects/items/tools/weldingtool.dm | 2 +- code/game/objects/items/tools/wirecutters.dm | 2 +- code/game/objects/items/tools/wrench.dm | 2 +- code/game/objects/items/vending_items.dm | 2 +- code/game/objects/items/weaponry.dm | 6 +- code/game/objects/obj_defense.dm | 30 +++---- code/game/objects/objs.dm | 18 ++-- code/game/objects/structures.dm | 4 +- code/game/objects/structures/barsigns.dm | 2 +- .../structures/crates_lockers/closets.dm | 2 +- .../closets/secure/secure_closets.dm | 4 +- .../crates_lockers/crates/secure.dm | 4 +- code/game/objects/structures/displaycase.dm | 2 +- code/game/objects/structures/fireaxe.dm | 2 +- code/game/objects/structures/grille.dm | 8 +- code/game/objects/structures/holosign.dm | 12 +-- code/game/objects/structures/lattice.dm | 2 +- code/game/objects/structures/mineral_doors.dm | 2 +- code/game/objects/structures/plasticflaps.dm | 2 +- code/game/objects/structures/signs/_signs.dm | 2 +- code/game/objects/structures/tables_racks.dm | 8 +- code/game/objects/structures/window.dm | 18 ++-- code/game/shuttle_engines.dm | 2 +- code/game/turfs/turf.dm | 2 +- .../abductor/equipment/abduction_gear.dm | 6 +- .../antagonists/blob/blob/blobs/core.dm | 4 +- .../antagonists/blob/blob/blobs/factory.dm | 2 +- .../antagonists/blob/blob/blobs/node.dm | 2 +- .../antagonists/blob/blob/blobs/resource.dm | 2 +- .../antagonists/blob/blob/blobs/shield.dm | 6 +- .../blob/blob/blobstrains/blazing_oil.dm | 6 +- .../blob/blobstrains/electromagnetic_web.dm | 2 +- .../blob/blob/blobstrains/energized_jelly.dm | 4 +- .../blob/blobstrains/explosive_lattice.dm | 4 +- .../blob/blobstrains/pressurized_slime.dm | 4 +- .../blob/blob/blobstrains/reactive_spines.dm | 2 +- .../blob/blobstrains/shifting_fragments.dm | 2 +- .../blob/blob/blobstrains/synchronous_mesh.dm | 2 +- .../blob/blob/blobstrains/zombifying_pods.dm | 2 +- code/modules/antagonists/blob/blob/theblob.dm | 6 +- .../bloodsucker/objects/bloodsucker_coffin.dm | 6 +- .../changeling/powers/mutations.dm | 12 +-- .../clock_weapons/ratvarian_shield.dm | 2 +- .../clockcult/clock_items/clockwork_armor.dm | 6 +- .../ark_of_the_clockwork_justicar.dm | 4 +- .../clock_structures/ocular_warden.dm | 2 +- .../clock_structures/traps/brass_skewer.dm | 2 +- code/modules/antagonists/cult/cult_items.dm | 20 ++--- .../eldritch_cult/eldritch_items.dm | 6 +- .../eldritch_cult/eldritch_magic.dm | 2 +- .../nukeop/equipment/nuclearbomb.dm | 2 +- .../atmospherics/machinery/airalarm.dm | 2 +- .../atmospherics/machinery/atmosmachinery.dm | 2 +- .../components/unary_devices/cryo.dm | 2 +- .../components/unary_devices/thermomachine.dm | 2 +- .../atmospherics/machinery/other/meter.dm | 2 +- .../atmospherics/machinery/pipes/pipes.dm | 2 +- .../machinery/portable/canister.dm | 2 +- .../portable/portable_atmospherics.dm | 2 +- .../awaymissions/mission_code/jungleresort.dm | 2 +- .../awaymissions/mission_code/snowdin.dm | 2 +- code/modules/cargo/supplypod.dm | 2 +- code/modules/clothing/chameleon.dm | 20 ++--- code/modules/clothing/clothing.dm | 6 +- code/modules/clothing/glasses/_glasses.dm | 2 +- code/modules/clothing/gloves/color.dm | 2 +- code/modules/clothing/gloves/miscellaneous.dm | 12 +-- code/modules/clothing/head/beanie.dm | 2 +- code/modules/clothing/head/hardhat.dm | 2 +- code/modules/clothing/head/helmet.dm | 34 ++++---- code/modules/clothing/head/jobs.dm | 14 +-- code/modules/clothing/head/misc.dm | 6 +- code/modules/clothing/head/misc_special.dm | 14 +-- code/modules/clothing/head/soft_caps.dm | 4 +- code/modules/clothing/masks/boxing.dm | 2 +- code/modules/clothing/masks/gasmask.dm | 4 +- code/modules/clothing/masks/miscellaneous.dm | 4 +- code/modules/clothing/shoes/miscellaneous.dm | 6 +- .../clothing/spacesuits/_spacesuits.dm | 4 +- .../modules/clothing/spacesuits/chronosuit.dm | 4 +- code/modules/clothing/spacesuits/hardsuit.dm | 86 +++++++++---------- .../clothing/spacesuits/miscellaneous.dm | 52 +++++------ code/modules/clothing/spacesuits/plasmamen.dm | 12 +-- code/modules/clothing/spacesuits/syndi.dm | 4 +- code/modules/clothing/suits/_suits.dm | 2 +- code/modules/clothing/suits/armor.dm | 36 ++++---- code/modules/clothing/suits/bio.dm | 8 +- code/modules/clothing/suits/cloaks.dm | 8 +- code/modules/clothing/suits/jobs.dm | 6 +- code/modules/clothing/suits/labcoat.dm | 10 +-- code/modules/clothing/suits/miscellaneous.dm | 58 ++++++------- .../modules/clothing/suits/reactive_armour.dm | 2 +- code/modules/clothing/suits/utility.dm | 10 +-- code/modules/clothing/suits/wiz_robe.dm | 16 ++-- code/modules/clothing/under/_under.dm | 2 +- code/modules/clothing/under/accessories.dm | 16 ++-- .../under/jobs/Plasmaman/civilian_service.dm | 2 +- .../under/jobs/Plasmaman/engineering.dm | 2 +- .../clothing/under/jobs/Plasmaman/medsci.dm | 2 +- .../clothing/under/jobs/Plasmaman/security.dm | 2 +- code/modules/clothing/under/jobs/cargo.dm | 2 +- .../clothing/under/jobs/civilian/civilian.dm | 2 +- code/modules/clothing/under/jobs/command.dm | 2 +- .../clothing/under/jobs/engineering.dm | 4 +- code/modules/clothing/under/jobs/medical.dm | 14 +-- code/modules/clothing/under/jobs/rnd.dm | 8 +- code/modules/clothing/under/jobs/security.dm | 8 +- code/modules/clothing/under/miscellaneous.dm | 6 +- code/modules/clothing/under/syndicate.dm | 22 ++--- code/modules/clothing/under/trek.dm | 4 +- code/modules/events/holiday/xmas.dm | 2 +- code/modules/events/spacevine.dm | 2 +- .../food_and_drinks/drinks/drinks/bottle.dm | 2 +- code/modules/hydroponics/grown/misc.dm | 2 +- .../integrated_electronics/core/assemblies.dm | 2 +- code/modules/library/lib_items.dm | 2 +- .../modules/mining/equipment/explorer_gear.dm | 18 ++-- .../mining/equipment/kinetic_crusher.dm | 4 +- .../mining/equipment/marker_beacons.dm | 2 +- .../modules/mob/living/carbon/damage_procs.dm | 2 +- .../mob/living/carbon/human/human_defense.dm | 22 ++--- .../mob/living/carbon/human/species.dm | 6 +- .../carbon/human/species_types/golems.dm | 8 +- .../human/species_types/shadowpeople.dm | 2 +- code/modules/mob/living/carbon/monkey/life.dm | 2 +- .../living/carbon/monkey/monkey_defense.dm | 4 +- code/modules/mob/living/living.dm | 4 +- code/modules/mob/living/living_defense.dm | 4 +- .../living/simple_animal/animal_defense.dm | 4 +- .../mob/living/simple_animal/bot/mulebot.dm | 12 +-- .../simple_animal/hostile/dark_wizard.dm | 2 +- .../simple_animal/hostile/jungle/seedling.dm | 2 +- .../hostile/megafauna/bubblegum.dm | 2 +- .../simple_animal/hostile/megafauna/drake.dm | 8 +- .../hostile/megafauna/hierophant.dm | 2 +- .../simple_animal/hostile/megafauna/legion.dm | 2 +- .../hostile/mining_mobs/basilisk.dm | 2 +- .../hostile/mining_mobs/elites/elite.dm | 2 +- .../simple_animal/hostile/space_dragon.dm | 4 +- .../computers/item/computer.dm | 2 +- .../computers/item/computer_damage.dm | 4 +- code/modules/newscaster/newscaster_machine.dm | 4 +- code/modules/ninja/suit/head.dm | 2 +- code/modules/ninja/suit/shoes.dm | 2 +- code/modules/ninja/suit/suit.dm | 2 +- code/modules/pool/pool_main.dm | 2 +- code/modules/power/antimatter/control.dm | 2 +- code/modules/power/antimatter/shielding.dm | 2 +- code/modules/power/apc.dm | 4 +- code/modules/power/lighting.dm | 2 +- .../power/singularity/field_generator.dm | 4 +- .../particle_accelerator.dm | 2 +- code/modules/power/supermatter/supermatter.dm | 2 +- .../projectiles/ammunition/caseless/misc.dm | 2 +- .../projectiles/ammunition/energy/_energy.dm | 2 +- .../boxes_magazines/external/rechargable.dm | 2 +- .../guns/energy/kinetic_accelerator.dm | 4 +- .../projectiles/guns/misc/beam_rifle.dm | 8 +- code/modules/projectiles/projectile.dm | 6 +- code/modules/projectiles/projectile/beams.dm | 8 +- .../modules/projectiles/projectile/bullets.dm | 2 +- .../projectiles/projectile/bullets/sniper.dm | 2 +- .../projectiles/projectile/energy/_energy.dm | 2 +- code/modules/projectiles/projectile/magic.dm | 10 +-- .../projectiles/projectile/magic/spellcard.dm | 4 +- code/modules/projectiles/projectile/plasma.dm | 2 +- .../projectiles/projectile/special/floral.dm | 6 +- .../projectiles/projectile/special/ion.dm | 2 +- .../projectiles/projectile/special/meteor.dm | 2 +- .../projectile/special/temperature.dm | 2 +- .../reagents/reagent_containers/glass.dm | 2 +- .../reagents/reagent_containers/rags.dm | 2 +- code/modules/reagents/reagent_dispenser.dm | 2 +- code/modules/recycling/disposal/bin.dm | 2 +- code/modules/recycling/disposal/pipe.dm | 4 +- .../xenobiology/crossbreeding/_clothing.dm | 2 +- .../xenobiology/crossbreeding/_misc.dm | 2 +- .../xenobiology/crossbreeding/burning.dm | 2 +- .../modules/ruins/lavalandruin_code/puzzle.dm | 18 ++-- .../shuttle_creation/shuttle_creator.dm | 2 +- .../spells/spell_types/construct_spells.dm | 2 +- code/modules/surgery/bodyparts/_bodyparts.dm | 4 +- code/modules/vehicles/_vehicle.dm | 2 +- code/modules/vehicles/cars/clowncar.dm | 2 +- .../vehicles/mecha/combat/five_stars.dm | 2 +- code/modules/vehicles/mecha/combat/neovgre.dm | 2 +- .../vehicles/mecha/mech_melee_attack.dm | 2 +- code/modules/vehicles/wheelchair.dm | 2 +- code/modules/vending/_vending.dm | 2 +- code/modules/vending/cartridge.dm | 2 +- code/modules/vending/dinnerware.dm | 2 +- code/modules/vending/liberation_toy.dm | 2 +- code/modules/vending/magivend.dm | 2 +- code/modules/zombie/items.dm | 2 +- modular_citadel/code/modules/clothing/trek.dm | 10 +-- .../modules/custom_loadout/custom_items.dm | 2 +- .../code/modules/festive/wheelchair.dm | 2 +- .../code/modules/reagents/objects/clothes.dm | 2 +- 281 files changed, 725 insertions(+), 725 deletions(-) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index e1154b305f..bff1bd4bf3 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -226,7 +226,7 @@ #define TRAIT_HUMAN_NO_RENDER "human_no_render" #define TRAIT_TRASHCAN "trashcan" ///Used for fireman carry to have mobe not be dropped when passing by a prone individual. -#define TRAIT_BEING_CARRIED "being_carried" +#define TRAIT_BEING_CARRIED "being_carried" // mobility flag traits // IN THE FUTURE, IT WOULD BE NICE TO DO SOMETHING SIMILAR TO https://github.com/tgstation/tgstation/pull/48923/files (ofcourse not nearly the same because I have my.. thoughts on it) diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index f74d380b8a..39ef32c27a 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -349,7 +349,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." /// Simply checks if the other person is still in range /atom/movable/screen/alert/give/proc/check_in_range(atom/taker) SIGNAL_HANDLER - + if(!offerer.CanReach(taker)) to_chat(owner, span_warning("You moved out of range of [offerer]!")) owner.clear_alert("[offerer]") @@ -820,7 +820,7 @@ so as to remain in compliance with the most up-to-date laws." return FALSE if(master && click_master) return usr.client.Click(master, location, control, params) - + return TRUE /atom/movable/screen/alert/Destroy() diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 8f3a7ef02c..cdc561e4b3 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -146,7 +146,7 @@ visible_message("[user] has hit [src] with [I]!", null, null, COMBAT_MESSAGE_RANGE) //only witnesses close by and the victim see a hit message. log_combat(user, src, "attacked", I) - take_damage(totitemdamage, I.damtype, "melee", 1) + take_damage(totitemdamage, I.damtype, MELEE, 1) /mob/living/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1) var/list/block_return = list() diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 073f50d8c5..b4b3582c73 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -171,7 +171,7 @@ if(ishuman(ML)) var/mob/living/carbon/human/H = ML affecting = H.get_bodypart(ran_zone(dam_zone)) - var/armor = ML.run_armor_check(affecting, "melee") + var/armor = ML.run_armor_check(affecting, MELEE) if(prob(75)) ML.apply_damage(rand(1,3), BRUTE, affecting, armor) ML.visible_message("[name] bites [ML]!", \ diff --git a/code/controllers/subsystem/fire_burning.dm b/code/controllers/subsystem/fire_burning.dm index f81c23d186..a5e903221a 100644 --- a/code/controllers/subsystem/fire_burning.dm +++ b/code/controllers/subsystem/fire_burning.dm @@ -32,7 +32,7 @@ SUBSYSTEM_DEF(fire_burning) if(O.resistance_flags & ON_FIRE) //in case an object is extinguished while still in currentrun if(!(O.resistance_flags & FIRE_PROOF)) - O.take_damage(10 * delta_time, BURN, "fire", 0) + O.take_damage(10 * delta_time, BURN, FIRE, 0) else O.extinguish() diff --git a/code/datums/armor.dm b/code/datums/armor.dm index b01b5ba238..6814706e1e 100644 --- a/code/datums/armor.dm +++ b/code/datums/armor.dm @@ -69,7 +69,7 @@ return vars[rating] /datum/armor/proc/getList() - return list("melee" = melee, "bullet" = bullet, "laser" = laser, "energy" = energy, "bomb" = bomb, "bio" = bio, "rad" = rad, "fire" = fire, "acid" = acid, "magic" = magic, "wound" = wound) + return list(MELEE = melee, BULLET = bullet, LASER = laser, ENERGY = energy, BOMB = bomb, BIO = bio, RAD = rad, FIRE = fire, ACID = acid, MAGIC = magic, WOUND = wound) /datum/armor/proc/attachArmor(datum/armor/AA) return getArmor(melee+AA.melee, bullet+AA.bullet, laser+AA.laser, energy+AA.energy, bomb+AA.bomb, bio+AA.bio, rad+AA.rad, fire+AA.fire, acid+AA.acid, magic+AA.magic, wound+AA.wound) diff --git a/code/datums/components/acid.dm b/code/datums/components/acid.dm index 39e9b2cb63..686d47cb1e 100644 --- a/code/datums/components/acid.dm +++ b/code/datums/components/acid.dm @@ -53,7 +53,7 @@ if(!(O.resistance_flags & ACID_PROOF)) if(prob(33)) playsound(O.loc, 'sound/items/welder.ogg', 150, 1) - O.take_damage(min(1 + round(sqrt(level)*0.3), 300), BURN, "acid", 0) + O.take_damage(min(1 + round(sqrt(level)*0.3), 300), BURN, ACID, 0) level = max(level - (5 + 3*round(sqrt(level))), 0) if(level <= 0) diff --git a/code/datums/components/armor_plate.dm b/code/datums/components/armor_plate.dm index 80c35c1ecb..db22e2277b 100644 --- a/code/datums/components/armor_plate.dm +++ b/code/datums/components/armor_plate.dm @@ -2,7 +2,7 @@ var/amount = 0 var/maxamount = 3 var/upgrade_item = /obj/item/stack/sheet/animalhide/goliath_hide - var/datum/armor/added_armor = list("melee" = 10) + var/datum/armor/added_armor = list(MELEE = 10) var/upgrade_name /datum/component/armor_plate/Initialize(_maxamount,obj/item/_upgrade_item,datum/armor/_added_armor) diff --git a/code/datums/components/embedded.dm b/code/datums/components/embedded.dm index dcbf40a16b..1535c3f142 100644 --- a/code/datums/components/embedded.dm +++ b/code/datums/components/embedded.dm @@ -152,7 +152,7 @@ to_chat(victim, "[weapon] sticks itself to your [limb.name]!") if(damage > 0) - var/armor = victim.run_armor_check(limb.body_zone, "melee", "Your armor has protected your [limb.name].", "Your armor has softened a hit to your [limb.name].",weapon.armour_penetration) + var/armor = victim.run_armor_check(limb.body_zone, MELEE, "Your armor has protected your [limb.name].", "Your armor has softened a hit to your [limb.name].",weapon.armour_penetration) limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, blocked=armor, sharpness = weapon.get_sharpness()) /// Called every time a carbon with a harmful embed moves, rolling a chance for the item to cause pain. The chance is halved if the carbon is crawling or walking. diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm index d6c11ab452..c00a0fdb5d 100644 --- a/code/datums/diseases/_MobProcs.dm +++ b/code/datums/diseases/_MobProcs.dm @@ -145,7 +145,7 @@ return !is_mouth_covered() /mob/living/carbon/CanSpreadAirborneDisease() - return !((head && (head.flags_cover & HEADCOVERSMOUTH) && (head.armor.getRating("bio") >= 25)) || (wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH) && (wear_mask.armor.getRating("bio") >= 25))) + return !((head && (head.flags_cover & HEADCOVERSMOUTH) && (head.armor.getRating(BIO) >= 25)) || (wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH) && (wear_mask.armor.getRating(BIO) >= 25))) /mob/living/proc/set_shocked() flags_1 |= SHOCKED_1 diff --git a/code/datums/elements/embed.dm b/code/datums/elements/embed.dm index 4a9044b6e1..66c11e3668 100644 --- a/code/datums/elements/embed.dm +++ b/code/datums/elements/embed.dm @@ -79,7 +79,7 @@ var/actual_chance = embed_chance if(!weapon.isEmbedHarmless()) // all the armor in the world won't save you from a kick me sign - var/armor = max(victim.run_armor_check(hit_zone, "bullet", silent=TRUE), victim.run_armor_check(hit_zone, "bomb", silent=TRUE)) * 0.5 // we'll be nice and take the better of bullet and bomb armor, halved + var/armor = max(victim.run_armor_check(hit_zone, BULLET, silent=TRUE), victim.run_armor_check(hit_zone, BOMB, silent=TRUE)) * 0.5 // we'll be nice and take the better of bullet and bomb armor, halved if(armor) // we only care about armor penetration if there's actually armor to penetrate var/pen_mod = -armor + weapon.armour_penetration // even a little bit of armor can make a big difference for shrapnel with large negative armor pen diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm index 5b6c0e222d..32b916d724 100644 --- a/code/datums/martial/boxing.dm +++ b/code/datums/martial/boxing.dm @@ -26,7 +26,7 @@ return TRUE var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected)) - var/armor_block = D.run_armor_check(affecting, "melee") + var/armor_block = D.run_armor_check(affecting, MELEE) playsound(D.loc, A.dna.species.attack_sound, 25, 1, -1) diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm index f8ed72eae8..d91e802a8a 100644 --- a/code/datums/martial/krav_maga.dm +++ b/code/datums/martial/krav_maga.dm @@ -98,7 +98,7 @@ /datum/martial_art/krav_maga/proc/leg_sweep(mob/living/carbon/human/A, mob/living/carbon/human/D) var/obj/item/bodypart/affecting = D.get_bodypart(BODY_ZONE_CHEST) - var/armor_block = D.run_armor_check(affecting, "melee") + var/armor_block = D.run_armor_check(affecting, MELEE) var/damage = (damage_roll(A,D)*2 + 25) if(!CHECK_MOBILITY(D, MOBILITY_STAND)) return FALSE @@ -140,7 +140,7 @@ /datum/martial_art/krav_maga/harm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected)) - var/armor_block = D.run_armor_check(affecting, "melee") + var/armor_block = D.run_armor_check(affecting, MELEE) if(check_streak(A,D)) return TRUE log_combat(A, D, "punched") @@ -165,7 +165,7 @@ if(check_streak(A,D)) return TRUE var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected)) - var/armor_block = D.run_armor_check(affecting, "melee") + var/armor_block = D.run_armor_check(affecting, MELEE) var/damage = damage_roll(A,D) var/stunthreshold = A.dna.species.punchstunthreshold if(CHECK_MOBILITY(D, MOBILITY_STAND)) @@ -233,4 +233,4 @@ heat_protection = HANDS max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT resistance_flags = NONE - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 50) diff --git a/code/datums/materials/_material.dm b/code/datums/materials/_material.dm index dbd976b2f7..c57b3bad8e 100644 --- a/code/datums/materials/_material.dm +++ b/code/datums/materials/_material.dm @@ -30,7 +30,7 @@ Simple datum which is instanced once per type and is used for every object of sa ///This is the amount of value per 1 unit of the material var/value_per_unit = 0 ///Armor modifiers, multiplies an items normal armor vars by these amounts. - var/armor_modifiers = list("melee" = 1, "bullet" = 1, "laser" = 1, "energy" = 1, "bomb" = 1, "bio" = 1, "rad" = 1, "fire" = 1, "acid" = 1) + var/armor_modifiers = list(MELEE = 1, BULLET = 1, LASER = 1, ENERGY = 1, BOMB = 1, BIO = 1, RAD = 1, FIRE = 1, ACID = 1) ///How beautiful is this material per unit. var/beauty_modifier = 0 ///Can be used to override the sound items make, lets add some SLOSHing. diff --git a/code/datums/materials/basemats.dm b/code/datums/materials/basemats.dm index 5bf6b8642c..e423ccd1d6 100644 --- a/code/datums/materials/basemats.dm +++ b/code/datums/materials/basemats.dm @@ -18,7 +18,7 @@ sheet_type = /obj/item/stack/sheet/glass value_per_unit = 0.0025 beauty_modifier = 0.05 - armor_modifiers = list("melee" = 0.2, "bullet" = 0.2, "laser" = 0, "energy" = 1, "bomb" = 0, "bio" = 0.2, "rad" = 0.2, "fire" = 1, "acid" = 0.2) // yeah ok + armor_modifiers = list(MELEE = 0.2, BULLET = 0.2, LASER = 0, ENERGY = 1, BOMB = 0, BIO = 0.2, RAD = 0.2, FIRE = 1, ACID = 0.2) // yeah ok /* Color matrices are like regular colors but unlike with normal colors, you can go over 255 on a channel. @@ -45,7 +45,7 @@ Unless you know what you're doing, only use the first three numbers. They're in sheet_type = /obj/item/stack/sheet/mineral/gold value_per_unit = 0.0625 beauty_modifier = 0.15 - armor_modifiers = list("melee" = 1.1, "bullet" = 1.1, "laser" = 1.15, "energy" = 1.15, "bomb" = 1, "bio" = 1, "rad" = 1, "fire" = 0.7, "acid" = 1.1) + armor_modifiers = list(MELEE = 1.1, BULLET = 1.1, LASER = 1.15, ENERGY = 1.15, BOMB = 1, BIO = 1, RAD = 1, FIRE = 0.7, ACID = 1.1) ///Small force increase, for diamond swords /datum/material/diamond @@ -58,7 +58,7 @@ Unless you know what you're doing, only use the first three numbers. They're in sheet_type = /obj/item/stack/sheet/mineral/diamond value_per_unit = 0.25 beauty_modifier = 0.3 - armor_modifiers = list("melee" = 1.3, "bullet" = 1.3, "laser" = 0.6, "energy" = 1, "bomb" = 1.2, "bio" = 1, "rad" = 1, "fire" = 1, "acid" = 1) + armor_modifiers = list(MELEE = 1.3, BULLET = 1.3, LASER = 0.6, ENERGY = 1, BOMB = 1.2, BIO = 1, RAD = 1, FIRE = 1, ACID = 1) ///Is slightly radioactive /datum/material/uranium @@ -69,7 +69,7 @@ Unless you know what you're doing, only use the first three numbers. They're in sheet_type = /obj/item/stack/sheet/mineral/uranium value_per_unit = 0.05 beauty_modifier = 0.3 //It shines so beautiful - armor_modifiers = list("melee" = 1.5, "bullet" = 1.4, "laser" = 0.5, "energy" = 0.5, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 1, "acid" = 1) + armor_modifiers = list(MELEE = 1.5, BULLET = 1.4, LASER = 0.5, ENERGY = 0.5, BOMB = 0, BIO = 0, RAD = 0, FIRE = 1, ACID = 1) /datum/material/uranium/on_applied(atom/source, amount, material_flags) . = ..() @@ -90,7 +90,7 @@ Unless you know what you're doing, only use the first three numbers. They're in sheet_type = /obj/item/stack/sheet/mineral/plasma value_per_unit = 0.1 beauty_modifier = 0.15 - armor_modifiers = list("melee" = 1.4, "bullet" = 0.7, "laser" = 0, "energy" = 1.2, "bomb" = 0, "bio" = 1.2, "rad" = 1, "fire" = 0, "acid" = 0.5) + armor_modifiers = list(MELEE = 1.4, BULLET = 0.7, LASER = 0, ENERGY = 1.2, BOMB = 0, BIO = 1.2, RAD = 1, FIRE = 0, ACID = 0.5) /datum/material/plasma/on_applied(atom/source, amount, material_flags) . = ..() @@ -124,7 +124,7 @@ Unless you know what you're doing, only use the first three numbers. They're in sheet_type = /obj/item/stack/sheet/mineral/bananium value_per_unit = 0.5 beauty_modifier = 0.5 - armor_modifiers = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 100, "bio" = 0, "rad" = 0, "fire" = 10, "acid" = 0) //Clowns cant be blown away + armor_modifiers = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 100, BIO = 0, RAD = 0, FIRE = 10, ACID = 0) //Clowns cant be blown away /datum/material/bananium/on_applied(atom/source, amount, material_flags) . = ..() @@ -147,7 +147,7 @@ Unless you know what you're doing, only use the first three numbers. They're in sheet_type = /obj/item/stack/sheet/mineral/titanium value_per_unit = 0.0625 beauty_modifier = 0.05 - armor_modifiers = list("melee" = 1.35, "bullet" = 1.3, "laser" = 1.3, "energy" = 1.25, "bomb" = 1.25, "bio" = 1, "rad" = 1, "fire" = 0.7, "acid" = 1) + armor_modifiers = list(MELEE = 1.35, BULLET = 1.3, LASER = 1.3, ENERGY = 1.25, BOMB = 1.25, BIO = 1, RAD = 1, FIRE = 0.7, ACID = 1) /datum/material/runite name = "runite" @@ -157,7 +157,7 @@ Unless you know what you're doing, only use the first three numbers. They're in categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) sheet_type = /obj/item/stack/sheet/mineral/runite beauty_modifier = 0.5 - armor_modifiers = list("melee" = 1.35, "bullet" = 2, "laser" = 0.5, "energy" = 1.25, "bomb" = 1.25, "bio" = 1, "rad" = 1, "fire" = 1.4, "acid" = 1) //rune is weak against magic lasers but strong against bullets. This is the combat triangle. + armor_modifiers = list(MELEE = 1.35, BULLET = 2, LASER = 0.5, ENERGY = 1.25, BOMB = 1.25, BIO = 1, RAD = 1, FIRE = 1.4, ACID = 1) //rune is weak against magic lasers but strong against bullets. This is the combat triangle. ///Force decrease /datum/material/plastic @@ -168,7 +168,7 @@ Unless you know what you're doing, only use the first three numbers. They're in sheet_type = /obj/item/stack/sheet/plastic value_per_unit = 0.0125 beauty_modifier = -0.01 - armor_modifiers = list("melee" = 1.5, "bullet" = 1.1, "laser" = 0.3, "energy" = 0.5, "bomb" = 1, "bio" = 1, "rad" = 1, "fire" = 1.1, "acid" = 1) + armor_modifiers = list(MELEE = 1.5, BULLET = 1.1, LASER = 0.3, ENERGY = 0.5, BOMB = 1, BIO = 1, RAD = 1, FIRE = 1.1, ACID = 1) ///Force decrease and mushy sound effect. (Not yet implemented) /datum/material/biomass @@ -187,7 +187,7 @@ Unless you know what you're doing, only use the first three numbers. They're in categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) value_per_unit = 0.06 beauty_modifier = 0.1 - armor_modifiers = list("melee" = 1.1, "bullet" = 1.1, "laser" = 0.4, "energy" = 0.4, "bomb" = 1, "bio" = 0.2, "rad" = 0, "fire" = 0, "acid" = 0.3) + armor_modifiers = list(MELEE = 1.1, BULLET = 1.1, LASER = 0.4, ENERGY = 0.4, BOMB = 1, BIO = 0.2, RAD = 0, FIRE = 0, ACID = 0.3) /datum/material/wood/on_applied_obj(obj/source, amount, material_flags) . = ..() @@ -211,7 +211,7 @@ Unless you know what you're doing, only use the first three numbers. They're in sheet_type = /obj/item/stack/sheet/mineral/adamantine value_per_unit = 0.25 beauty_modifier = 0.4 - armor_modifiers = list("melee" = 1.5, "bullet" = 1.5, "laser" = 1.3, "energy" = 1.3, "bomb" = 1, "bio" = 1, "rad" = 1, "fire" = 2.5, "acid" = 1) + armor_modifiers = list(MELEE = 1.5, BULLET = 1.5, LASER = 1.3, ENERGY = 1.3, BOMB = 1, BIO = 1, RAD = 1, FIRE = 2.5, ACID = 1) ///RPG Magic. (Admin only) /datum/material/mythril @@ -222,7 +222,7 @@ Unless you know what you're doing, only use the first three numbers. They're in sheet_type = /obj/item/stack/sheet/mineral/mythril value_per_unit = 0.75 beauty_modifier = 0.5 - armor_modifiers = list("melee" = 2, "bullet" = 2, "laser" = 2, "energy" = 2, "bomb" = 2, "bio" = 2, "rad" = 2, "fire" = 2, "acid" = 2) + armor_modifiers = list(MELEE = 2, BULLET = 2, LASER = 2, ENERGY = 2, BOMB = 2, BIO = 2, RAD = 2, FIRE = 2, ACID = 2) /datum/material/mythril/on_applied_obj(atom/source, amount, material_flags) . = ..() @@ -244,7 +244,7 @@ Unless you know what you're doing, only use the first three numbers. They're in value_per_unit = 0.001 strength_modifier = 0.5 integrity_modifier = 0.1 - armor_modifiers = list("melee" = 0.25, "bullet" = 0.25, "laser" = 1.25, "energy" = 0.25, "bomb" = 0.25, "bio" = 0.25, "rad" = 1.5, "fire" = 1.5, "acid" = 1.5) + armor_modifiers = list(MELEE = 0.25, BULLET = 0.25, LASER = 1.25, ENERGY = 0.25, BOMB = 0.25, BIO = 0.25, RAD = 1.5, FIRE = 1.5, ACID = 1.5) beauty_modifier = 0.25 turf_sound_override = FOOTSTEP_SAND texture_layer_icon_state = "sand" @@ -257,7 +257,7 @@ Unless you know what you're doing, only use the first three numbers. They're in categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) sheet_type = /obj/item/stack/sheet/mineral/sandstone value_per_unit = 0.0025 - armor_modifiers = list("melee" = 0.5, "bullet" = 0.5, "laser" = 1.25, "energy" = 0.5, "bomb" = 0.5, "bio" = 0.25, "rad" = 1.5, "fire" = 1.5, "acid" = 1.5) + armor_modifiers = list(MELEE = 0.5, BULLET = 0.5, LASER = 1.25, ENERGY = 0.5, BOMB = 0.5, BIO = 0.25, RAD = 1.5, FIRE = 1.5, ACID = 1.5) beauty_modifier = 0.3 turf_sound_override = FOOTSTEP_WOOD texture_layer_icon_state = "brick" @@ -269,7 +269,7 @@ Unless you know what you're doing, only use the first three numbers. They're in categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) sheet_type = /obj/item/stack/sheet/mineral/snow value_per_unit = 0.0025 - armor_modifiers = list("melee" = 0.25, "bullet" = 0.25, "laser" = 0.25, "energy" = 0.25, "bomb" = 0.25, "bio" = 0.25, "rad" = 1.5, "fire" = 0.25, "acid" = 1.5) + armor_modifiers = list(MELEE = 0.25, BULLET = 0.25, LASER = 0.25, ENERGY = 0.25, BOMB = 0.25, BIO = 0.25, RAD = 1.5, FIRE = 0.25, ACID = 1.5) beauty_modifier = 0.3 turf_sound_override = FOOTSTEP_SAND texture_layer_icon_state = "sand" @@ -282,7 +282,7 @@ Unless you know what you're doing, only use the first three numbers. They're in strength_modifier = 1.2 sheet_type = /obj/item/stack/sheet/runed_metal value_per_unit = 0.75 - armor_modifiers = list("melee" = 1.2, "bullet" = 1.2, "laser" = 1, "energy" = 1, "bomb" = 1.2, "bio" = 1.2, "rad" = 1.5, "fire" = 1.5, "acid" = 1.5) + armor_modifiers = list(MELEE = 1.2, BULLET = 1.2, LASER = 1, ENERGY = 1, BOMB = 1.2, BIO = 1.2, RAD = 1.5, FIRE = 1.5, ACID = 1.5) beauty_modifier = -0.15 texture_layer_icon_state = "runed" @@ -294,7 +294,7 @@ Unless you know what you're doing, only use the first three numbers. They're in strength_modifier = 1.3 // Replicant Alloy is very good for skull beatings.. sheet_type = /obj/item/stack/tile/brass value_per_unit = 0.75 - armor_modifiers = list("melee" = 1.4, "bullet" = 1.4, "laser" = 0, "energy" = 0, "bomb" = 1.4, "bio" = 1.2, "rad" = 1.5, "fire" = 1.5, "acid" = 1.5) //But it has.. a few problems that can't easily be compensated for. + armor_modifiers = list(MELEE = 1.4, BULLET = 1.4, LASER = 0, ENERGY = 0, BOMB = 1.4, BIO = 1.2, RAD = 1.5, FIRE = 1.5, ACID = 1.5) //But it has.. a few problems that can't easily be compensated for. beauty_modifier = 0.3 //It really beats the cold plain plating of the station, doesn't it? /datum/material/bronze @@ -305,7 +305,7 @@ Unless you know what you're doing, only use the first three numbers. They're in categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) sheet_type = /obj/item/stack/sheet/bronze value_per_unit = 0.025 - armor_modifiers = list("melee" = 1, "bullet" = 1, "laser" = 1, "energy" = 1, "bomb" = 1, "bio" = 1, "rad" = 1.5, "fire" = 1.5, "acid" = 1.5) + armor_modifiers = list(MELEE = 1, BULLET = 1, LASER = 1, ENERGY = 1, BOMB = 1, BIO = 1, RAD = 1.5, FIRE = 1.5, ACID = 1.5) beauty_modifier = 0.2 /datum/material/paper @@ -315,7 +315,7 @@ Unless you know what you're doing, only use the first three numbers. They're in categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) sheet_type = /obj/item/stack/sheet/paperframes value_per_unit = 0.0025 - armor_modifiers = list("melee" = 0.1, "bullet" = 0.1, "laser" = 0.1, "energy" = 0.1, "bomb" = 0.1, "bio" = 0.1, "rad" = 1.5, "fire" = 0, "acid" = 1.5) + armor_modifiers = list(MELEE = 0.1, BULLET = 0.1, LASER = 0.1, ENERGY = 0.1, BOMB = 0.1, BIO = 0.1, RAD = 1.5, FIRE = 0, ACID = 1.5) beauty_modifier = 0.3 turf_sound_override = FOOTSTEP_SAND texture_layer_icon_state = "paper" @@ -340,7 +340,7 @@ Unless you know what you're doing, only use the first three numbers. They're in categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) sheet_type = /obj/item/stack/sheet/cardboard value_per_unit = 0.003 - armor_modifiers = list("melee" = 0.25, "bullet" = 0.25, "laser" = 0.25, "energy" = 0.25, "bomb" = 0.25, "bio" = 0.25, "rad" = 1.5, "fire" = 0, "acid" = 1.5) + armor_modifiers = list(MELEE = 0.25, BULLET = 0.25, LASER = 0.25, ENERGY = 0.25, BOMB = 0.25, BIO = 0.25, RAD = 1.5, FIRE = 0, ACID = 1.5) beauty_modifier = -0.1 /datum/material/cardboard/on_applied_obj(obj/source, amount, material_flags) @@ -364,7 +364,7 @@ Unless you know what you're doing, only use the first three numbers. They're in sheet_type = /obj/item/stack/sheet/bone strength_modifier = 1.05 value_per_unit = 0.05 - armor_modifiers = list("melee" = 1.2, "bullet" = 0.75, "laser" = 0.75, "energy" = 1.2, "bomb" = 1, "bio" = 1, "rad" = 1.5, "fire" = 1.5, "acid" = 1.5) + armor_modifiers = list(MELEE = 1.2, BULLET = 0.75, LASER = 0.75, ENERGY = 1.2, BOMB = 1, BIO = 1, RAD = 1.5, FIRE = 1.5, ACID = 1.5) beauty_modifier = -0.2 /datum/material/bamboo @@ -374,7 +374,7 @@ Unless you know what you're doing, only use the first three numbers. They're in categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) sheet_type = /obj/item/stack/sheet/mineral/bamboo value_per_unit = 0.0025 - armor_modifiers = list("melee" = 0.5, "bullet" = 0.5, "laser" = 0.5, "energy" = 0.5, "bomb" = 0.5, "bio" = 0.51, "rad" = 1.5, "fire" = 0.5, "acid" = 1.5) + armor_modifiers = list(MELEE = 0.5, BULLET = 0.5, LASER = 0.5, ENERGY = 0.5, BOMB = 0.5, BIO = 0.51, RAD = 1.5, FIRE = 0.5, ACID = 1.5) beauty_modifier = 0.2 turf_sound_override = FOOTSTEP_WOOD texture_layer_icon_state = "bamboo" diff --git a/code/datums/materials/meat.dm b/code/datums/materials/meat.dm index 14a373f2d2..c902aa078e 100644 --- a/code/datums/materials/meat.dm +++ b/code/datums/materials/meat.dm @@ -8,7 +8,7 @@ value_per_unit = 0.05 beauty_modifier = -0.3 strength_modifier = 0.7 - armor_modifiers = list("melee" = 0.3, "bullet" = 0.3, "laser" = 1.2, "energy" = 1.2, "bomb" = 0.3, "bio" = 0, "rad" = 0.7, "fire" = 1, "acid" = 1) + armor_modifiers = list(MELEE = 0.3, BULLET = 0.3, LASER = 1.2, ENERGY = 1.2, BOMB = 0.3, BIO = 0, RAD = 0.7, FIRE = 1, ACID = 1) item_sound_override = 'sound/effects/meatslap.ogg' turf_sound_override = FOOTSTEP_MEAT texture_layer_icon_state = "meat" diff --git a/code/datums/materials/pizza.dm b/code/datums/materials/pizza.dm index 2a9542234f..013538614f 100644 --- a/code/datums/materials/pizza.dm +++ b/code/datums/materials/pizza.dm @@ -7,7 +7,7 @@ value_per_unit = 0.05 beauty_modifier = 0.1 strength_modifier = 0.7 - armor_modifiers = list("melee" = 0.3, "bullet" = 0.3, "laser" = 1.2, "energy" = 1.2, "bomb" = 0.3, "bio" = 0, "rad" = 0.7, "fire" = 1, "acid" = 1) + armor_modifiers = list(MELEE = 0.3, BULLET = 0.3, LASER = 1.2, ENERGY = 1.2, BOMB = 0.3, BIO = 0, RAD = 0.7, FIRE = 1, ACID = 1) item_sound_override = 'sound/effects/meatslap.ogg' turf_sound_override = FOOTSTEP_MEAT texture_layer_icon_state = "pizza" diff --git a/code/datums/weather/weather_types/acid_rain.dm b/code/datums/weather/weather_types/acid_rain.dm index a1ec4871d5..9fa12a0938 100644 --- a/code/datums/weather/weather_types/acid_rain.dm +++ b/code/datums/weather/weather_types/acid_rain.dm @@ -27,6 +27,6 @@ /datum/weather/acid_rain/weather_act(mob/living/L) - var/resist = L.getarmor(null, "acid") + var/resist = L.getarmor(null, ACID) if(prob(max(0,100-resist))) L.acid_act(20,20) diff --git a/code/datums/weather/weather_types/radiation_storm.dm b/code/datums/weather/weather_types/radiation_storm.dm index 5c14968be4..acc0232c21 100644 --- a/code/datums/weather/weather_types/radiation_storm.dm +++ b/code/datums/weather/weather_types/radiation_storm.dm @@ -30,7 +30,7 @@ status_alarm(TRUE) /datum/weather/rad_storm/weather_act(mob/living/L) - var/resist = L.getarmor(null, "rad") + var/resist = L.getarmor(null, RAD) var/ratio = 1 - (min(resist, 100) / 100) L.rad_act(radiation_intensity * ratio) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 01402b1518..4ffd4af6d7 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -267,7 +267,7 @@ var/a_incidence_s = abs(incidence_s) if(a_incidence_s > 90 && a_incidence_s < 270) return FALSE - if((P.flag in list("bullet", "bomb")) && P.ricochet_incidence_leeway) + if((P.flag in list(BULLET, BOMB)) && P.ricochet_incidence_leeway) if((a_incidence_s < 90 && a_incidence_s < 90 - P.ricochet_incidence_leeway) || (a_incidence_s > 270 && a_incidence_s -270 > P.ricochet_incidence_leeway)) return var/new_angle_s = SIMPLIFY_DEGREES(face_angle + incidence_s) diff --git a/code/game/gamemodes/clown_ops/clown_weapons.dm b/code/game/gamemodes/clown_ops/clown_weapons.dm index c75fe42884..92a3d84c79 100644 --- a/code/game/gamemodes/clown_ops/clown_weapons.dm +++ b/code/game/gamemodes/clown_ops/clown_weapons.dm @@ -17,7 +17,7 @@ desc = "advanced clown shoes that protect the wearer and render them nearly immune to slipping on their own peels. They also squeak at 100% capacity." clothing_flags = NOSLIP slowdown = SHOES_SLOWDOWN - armor = list("melee" = 25, "bullet" = 25, "laser" = 25, "energy" = 25, "bomb" = 50, "bio" = 10, "rad" = 0, "fire" = 70, "acid" = 50) + armor = list(MELEE = 25, BULLET = 25, LASER = 25, ENERGY = 25, BOMB = 50, BIO = 10, RAD = 0, FIRE = 70, ACID = 50) strip_delay = 70 resistance_flags = NONE permeability_coefficient = 0.05 @@ -28,7 +28,7 @@ name = "mk-honk combat shoes" desc = "The culmination of years of clown combat research, these shoes leave a trail of chaos in their wake. They will slowly recharge themselves over time, or can be manually charged with bananium." slowdown = SHOES_SLOWDOWN - armor = list("melee" = 25, "bullet" = 25, "laser" = 25, "energy" = 25, "bomb" = 50, "bio" = 10, "rad" = 0, "fire" = 70, "acid" = 50) + armor = list(MELEE = 25, BULLET = 25, LASER = 25, ENERGY = 25, BOMB = 50, BIO = 10, RAD = 0, FIRE = 70, ACID = 50) strip_delay = 70 resistance_flags = NONE permeability_coefficient = 0.05 @@ -273,7 +273,7 @@ icon_state = "darkhonker" max_integrity = 300 deflect_chance = 15 - armor = list("melee" = 40, "bullet" = 40, "laser" = 50, "energy" = 35, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) + armor = list(MELEE = 40, BULLET = 40, LASER = 50, ENERGY = 35, BOMB = 20, BIO = 0, RAD = 0, FIRE = 100, ACID = 100) max_temperature = 35000 operation_req_access = list(ACCESS_SYNDICATE) internals_req_access = list(ACCESS_SYNDICATE) diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index f40adcd00b..0fecfcd4be 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -136,7 +136,7 @@ Class Procs: /obj/machinery/Initialize() if(!armor) - armor = list("melee" = 25, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 70) + armor = list(MELEE = 25, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 70) . = ..() GLOB.machines += src @@ -370,7 +370,7 @@ Class Procs: user.DelayNextAction(CLICK_CD_MELEE) user.do_attack_animation(src, ATTACK_EFFECT_PUNCH) user.visible_message("[user.name] smashes against \the [src.name] with its paws.", null, null, COMBAT_MESSAGE_RANGE) - take_damage(4, BRUTE, "melee", 1) + take_damage(4, BRUTE, MELEE, 1) /obj/machinery/attack_robot(mob/user) if(!(interaction_flags_machine & INTERACT_MACHINE_ALLOW_SILICON) && !IsAdminGhost(user)) @@ -590,7 +590,7 @@ Class Procs: if(prob(85) && (zap_flags & ZAP_MACHINE_EXPLOSIVE)) explosion(src, 1, 2, 4, flame_range = 2, adminlog = FALSE, smoke = FALSE) else if(zap_flags & ZAP_OBJ_DAMAGE) - take_damage(power/2000, BURN, "energy") + take_damage(power/2000, BURN, ENERGY) if(prob(40)) emp_act(50) @@ -614,7 +614,7 @@ Class Procs: AM.pixel_y = -8 + (round( . / 3)*8) /obj/machinery/rust_heretic_act() - take_damage(500, BRUTE, "melee", 1) + take_damage(500, BRUTE, MELEE, 1) /** * Alerts the AI that a hack is in progress. diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm index 4935c9d4d3..80621e2bcd 100644 --- a/code/game/machinery/ai_slipper.dm +++ b/code/game/machinery/ai_slipper.dm @@ -6,7 +6,7 @@ layer = PROJECTILE_HIT_THRESHHOLD_LAYER plane = FLOOR_PLANE max_integrity = 200 - armor = list("melee" = 50, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30) + armor = list(MELEE = 50, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30) var/uses = 20 var/cooldown = 0 diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index 0de76694c0..d3e79d38c5 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -10,7 +10,7 @@ var/device_type = null var/id = null var/initialized_button = 0 - armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 70) + armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 10, BIO = 100, RAD = 100, FIRE = 90, ACID = 70) use_power = IDLE_POWER_USE idle_power_usage = 2 resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index b680377d0a..9a23cc86fb 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -15,7 +15,7 @@ resistance_flags = FIRE_PROOF - armor = list("melee" = 50, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 50) + armor = list(MELEE = 50, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 0, BIO = 0, RAD = 0, FIRE = 90, ACID = 50) max_integrity = 100 integrity_failure = 0.5 var/list/network = list("ss13") @@ -273,7 +273,7 @@ return ..() /obj/machinery/camera/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) - if(damage_flag == "melee" && damage_amount < 12 && !(stat & BROKEN)) + if(damage_flag == MELEE && damage_amount < 12 && !(stat & BROKEN)) return 0 . = ..() diff --git a/code/game/machinery/computer/_computer.dm b/code/game/machinery/computer/_computer.dm index abca9db109..6b1d28fcba 100644 --- a/code/game/machinery/computer/_computer.dm +++ b/code/game/machinery/computer/_computer.dm @@ -8,7 +8,7 @@ active_power_usage = 300 max_integrity = 200 integrity_failure = 0.5 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 40, "acid" = 20) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 40, ACID = 20) var/brightness_on = 1 var/icon_keyboard = "generic_key" var/icon_screen = "generic" @@ -101,10 +101,10 @@ switch(severity) if(1) if(prob(50)) - obj_break("energy") + obj_break(ENERGY) if(2) if(prob(10)) - obj_break("energy") + obj_break(ENERGY) /obj/machinery/computer/deconstruct(disassembled = TRUE, mob/user) on_deconstruction() diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm index fa552a4e66..63ebdc3f92 100644 --- a/code/game/machinery/computer/atmos_control.dm +++ b/code/game/machinery/computer/atmos_control.dm @@ -6,7 +6,7 @@ name = "gas sensor" icon = 'icons/obj/stationobjs.dmi' icon_state = "gsensor1" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 0) var/on = TRUE diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index ca4b392efa..9bb6a35ce1 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -120,7 +120,7 @@ anchored = FALSE max_integrity = 180 proj_pass_rate = 20 - armor = list("melee" = 10, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 10, "acid" = 0) + armor = list(MELEE = 10, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 10, BIO = 100, RAD = 100, FIRE = 10, ACID = 0) var/deploy_time = 40 var/deploy_message = TRUE diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index 5215baf87f..5453d26334 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -576,7 +576,7 @@ desc = "An airlock hastily corrupted by blood magic, it is unusually brittle in this state." normal_integrity = 150 damage_deflection = 5 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) //Pinion airlocks: Clockwork doors that only let servants of Ratvar through. /obj/machinery/door/airlock/clockwork diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 24e3215d82..f812bdd5a2 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -10,7 +10,7 @@ power_channel = ENVIRON max_integrity = 350 damage_deflection = 10 - armor = list("melee" = 30, "bullet" = 30, "laser" = 20, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 70) + armor = list(MELEE = 30, BULLET = 30, LASER = 20, ENERGY = 20, BOMB = 10, BIO = 100, RAD = 100, FIRE = 80, ACID = 70) CanAtmosPass = ATMOS_PASS_DENSITY flags_1 = PREVENT_CLICK_UNDER_1|DEFAULT_RICOCHET_1 ricochet_chance_mod = 0.8 diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index d84b994b92..bcb7bf22b9 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -21,7 +21,7 @@ layer = BELOW_OPEN_DOOR_LAYER closingLayer = CLOSED_FIREDOOR_LAYER assemblytype = /obj/structure/firelock_frame - armor = list("melee" = 30, "bullet" = 30, "laser" = 20, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 95, "acid" = 70) + armor = list(MELEE = 30, BULLET = 30, LASER = 20, ENERGY = 20, BOMB = 10, BIO = 100, RAD = 100, FIRE = 95, ACID = 70) interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_REQUIRES_SILICON | INTERACT_MACHINE_OPEN air_tight = TRUE attack_hand_is_action = TRUE diff --git a/code/game/machinery/doors/passworddoor.dm b/code/game/machinery/doors/passworddoor.dm index c4f01e58b5..64afc07ae3 100644 --- a/code/game/machinery/doors/passworddoor.dm +++ b/code/game/machinery/doors/passworddoor.dm @@ -6,7 +6,7 @@ explosion_block = 3 heat_proof = TRUE max_integrity = 600 - armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) + armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100) resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF damage_deflection = 70 var/password = "Swordfish" diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index e1c0843f55..654dc13e1c 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -13,7 +13,7 @@ heat_proof = TRUE safe = FALSE max_integrity = 600 - armor = list("melee" = 50, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 70) + armor = list(MELEE = 50, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 70) resistance_flags = FIRE_PROOF damage_deflection = 70 poddoor = TRUE diff --git a/code/game/machinery/doors/shutters.dm b/code/game/machinery/doors/shutters.dm index 362dde1157..323fab4cf2 100644 --- a/code/game/machinery/doors/shutters.dm +++ b/code/game/machinery/doors/shutters.dm @@ -5,7 +5,7 @@ icon = 'icons/obj/doors/shutters.dmi' layer = SHUTTER_LAYER closingLayer = SHUTTER_LAYER - armor = list("melee" = 20, "bullet" = 20, "laser" = 20, "energy" = 75, "bomb" = 25, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 70) + armor = list(MELEE = 20, BULLET = 20, LASER = 20, ENERGY = 75, BOMB = 25, BIO = 100, RAD = 100, FIRE = 100, ACID = 70) damage_deflection = 20 max_integrity = 100 @@ -24,7 +24,7 @@ desc = "These shutters have an armoured frame; it looks like plasteel. These shutters look robust enough to survive explosions." icon = 'icons/obj/doors/shutters_old.dmi' icon_state = "closed" - armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 75, "bomb" = 30, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 70) + armor = list(MELEE = 30, BULLET = 30, LASER = 30, ENERGY = 75, BOMB = 30, BIO = 100, RAD = 100, FIRE = 100, ACID = 70) max_integrity = 300 /obj/machinery/door/poddoor/shutters/old/preopen diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 4c5aa6528f..e95faeb39b 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -9,7 +9,7 @@ var/base_state = "left" max_integrity = 150 //If you change this, consider changing ../door/window/brigdoor/ max_integrity at the bottom of this .dm file integrity_failure = 0 - armor = list("melee" = 20, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 70, "acid" = 100) + armor = list(MELEE = 20, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 10, BIO = 100, RAD = 100, FIRE = 70, ACID = 100) visible = FALSE flags_1 = ON_BORDER_1|DEFAULT_RICOCHET_1 opacity = 0 diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index 229a2d98d8..cca67030ed 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -20,7 +20,7 @@ plane = ABOVE_WALL_PLANE max_integrity = 250 integrity_failure = 0.4 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 30) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 100, FIRE = 90, ACID = 30) use_power = IDLE_POWER_USE idle_power_usage = 2 active_power_usage = 6 diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 20aac89743..6d82f4ca67 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -93,7 +93,7 @@ return flash() /obj/machinery/flasher/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) - if(damage_flag == "melee" && damage_amount < 10) //any melee attack below 10 dmg does nothing + if(damage_flag == MELEE && damage_amount < 10) //any melee attack below 10 dmg does nothing return 0 . = ..() diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index d83819a1b3..02c89b26fc 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -40,7 +40,7 @@ Possible to do for anyone motivated enough: idle_power_usage = 5 active_power_usage = 100 max_integrity = 300 - armor = list("melee" = 50, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 0) + armor = list(MELEE = 50, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 0) circuit = /obj/item/circuitboard/machine/holopad /// List of living mobs that use the holopad var/list/masters diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index bb047a6a5e..93302bed30 100644 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -8,7 +8,7 @@ idle_power_usage = 2 active_power_usage = 4 max_integrity = 300 - armor = list("melee" = 50, "bullet" = 30, "laser" = 70, "energy" = 50, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 70) + armor = list(MELEE = 50, BULLET = 30, LASER = 70, ENERGY = 50, BOMB = 20, BIO = 0, RAD = 0, FIRE = 100, ACID = 70) resistance_flags = FIRE_PROOF var/id = null var/on = FALSE diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index 752ba1b732..6a30e98e4c 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -10,7 +10,7 @@ level = 1 // underfloor layer = LOW_OBJ_LAYER max_integrity = 500 - armor = list("melee" = 70, "bullet" = 70, "laser" = 70, "energy" = 70, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80) + armor = list(MELEE = 70, BULLET = 70, LASER = 70, ENERGY = 70, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 80) var/open = FALSE // true if cover is open var/locked = TRUE // true if controls are locked diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index cac7edf8c9..b885942c28 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -28,7 +28,7 @@ power_channel = EQUIP //drains power from the EQUIPMENT channel max_integrity = 160 //the turret's health integrity_failure = 0.5 - armor = list("melee" = 50, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) + armor = list(MELEE = 50, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 30, BIO = 0, RAD = 0, FIRE = 90, ACID = 90) /// Base turret icon state base_icon_state = "standard" /// Scan range of the turret for locating targets @@ -776,7 +776,7 @@ /obj/machinery/porta_turret/syndicate/energy/pirate max_integrity = 260 integrity_failure = 0.08 - armor = list("melee" = 50, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) + armor = list(MELEE = 50, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 50, BIO = 0, RAD = 0, FIRE = 90, ACID = 90) /obj/machinery/porta_turret/syndicate/energy/raven stun_projectile = /obj/item/projectile/beam/laser @@ -796,7 +796,7 @@ lethal_projectile = /obj/item/projectile/bullet/p50/penetrator/shuttle lethal_projectile_sound = 'sound/weapons/gunshot_smg.ogg' stun_projectile_sound = 'sound/weapons/gunshot_smg.ogg' - armor = list("melee" = 50, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 80, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) + armor = list(MELEE = 50, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 80, BIO = 0, RAD = 0, FIRE = 90, ACID = 90) /obj/machinery/porta_turret/syndicate/pod/toolbox max_integrity = 100 diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index a273aad0dd..d3929175c4 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -55,7 +55,7 @@ GLOBAL_LIST_EMPTY(allConsoles) var/emergency //If an emergency has been called by this device. Acts as both a cooldown and lets the responder know where it the emergency was triggered from var/receive_ore_updates = FALSE //If ore redemption machines will send an update when it receives new ores. max_integrity = 300 - armor = list("melee" = 70, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) + armor = list(MELEE = 70, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 0, BIO = 0, RAD = 0, FIRE = 90, ACID = 90) /obj/machinery/requests_console/power_change() ..() diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index 2ebb137839..cde64ffe26 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -28,7 +28,7 @@ if(severity >= 70) qdel(src) else - take_damage(severity/1.3, BRUTE, "energy", 0) + take_damage(severity/1.3, BRUTE, ENERGY, 0) /obj/structure/emergency_shield/play_attack_sound(damage, damage_type = BRUTE, damage_flag = 0) switch(damage_type) diff --git a/code/game/machinery/shuttle/shuttle_heater.dm b/code/game/machinery/shuttle/shuttle_heater.dm index 8f7b772072..31fcabffda 100644 --- a/code/game/machinery/shuttle/shuttle_heater.dm +++ b/code/game/machinery/shuttle/shuttle_heater.dm @@ -22,7 +22,7 @@ density = TRUE max_integrity = 400 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 30) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 100, ACID = 30) layer = OBJ_LAYER showpipe = TRUE diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 17e58f2a49..2daeda7b07 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -12,7 +12,7 @@ name = "space heater" desc = "Made by Space Amish using traditional space techniques, this heater/cooler is guaranteed not to set the station on fire. Warranty void if used in engines." max_integrity = 250 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 10) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 100, FIRE = 80, ACID = 10) circuit = /obj/item/circuitboard/machine/space_heater var/obj/item/stock_parts/cell/cell var/on = FALSE diff --git a/code/game/machinery/telecomms/machines/message_server.dm b/code/game/machinery/telecomms/machines/message_server.dm index a0440001c3..817a331f1a 100644 --- a/code/game/machinery/telecomms/machines/message_server.dm +++ b/code/game/machinery/telecomms/machines/message_server.dm @@ -14,7 +14,7 @@ use_power = IDLE_POWER_USE idle_power_usage = 10 active_power_usage = 100 - armor = list("melee" = 25, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 70) + armor = list(MELEE = 25, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 70) var/obj/item/stored /obj/machinery/blackbox_recorder/Initialize() diff --git a/code/game/objects/effects/arachnid_web.dm b/code/game/objects/effects/arachnid_web.dm index 2adaa12dc9..ef82e8226d 100644 --- a/code/game/objects/effects/arachnid_web.dm +++ b/code/game/objects/effects/arachnid_web.dm @@ -16,7 +16,7 @@ playsound(loc, 'sound/items/welder.ogg', 100, TRUE) /obj/structure/arachnid/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) - if(damage_flag == "melee") + if(damage_flag == MELEE) switch(damage_type) if(BURN) damage_amount *= 2 diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 4b04606401..6d75b5d6c9 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -15,7 +15,7 @@ /obj/structure/spider/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) - if(damage_flag == "melee") + if(damage_flag == MELEE) switch(damage_type) if(BURN) damage_amount *= 2 diff --git a/code/game/objects/effects/temporary_visuals/clockcult.dm b/code/game/objects/effects/temporary_visuals/clockcult.dm index 4d79d50301..e097ed61ea 100644 --- a/code/game/objects/effects/temporary_visuals/clockcult.dm +++ b/code/game/objects/effects/temporary_visuals/clockcult.dm @@ -129,7 +129,7 @@ "Your [I.name] shields you from [src]!") continue L.visible_message("[L] is struck by a [name]!", "You're struck by a [name]!") - L.apply_damage(damage, BURN, "chest", L.run_armor_check("chest", "laser", "Your armor absorbs [src]!", "Your armor blocks part of [src]!", 0, "Your armor was penetrated by [src]!")) + L.apply_damage(damage, BURN, "chest", L.run_armor_check("chest", LASER, "Your armor absorbs [src]!", "Your armor blocks part of [src]!", 0, "Your armor was penetrated by [src]!")) log_combat(user, L, "struck with a volt blast") hit_amount++ for(var/obj/vehicle/sealed/mecha/M in T) diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index 07ffe8896e..2a82ff406a 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -24,7 +24,7 @@ RLD w_class = WEIGHT_CLASS_NORMAL custom_materials = list(/datum/material/iron=100000) req_access_txt = "11" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50) resistance_flags = FIRE_PROOF var/datum/effect_system/spark_spread/spark_system var/matter = 0 diff --git a/code/game/objects/items/RPD.dm b/code/game/objects/items/RPD.dm index 635ea97902..2c8a2194cd 100644 --- a/code/game/objects/items/RPD.dm +++ b/code/game/objects/items/RPD.dm @@ -206,7 +206,7 @@ GLOBAL_LIST_INIT(fluid_duct_recipes, list( throw_range = 5 w_class = WEIGHT_CLASS_NORMAL custom_materials = list(/datum/material/iron=75000, /datum/material/glass=37500) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50) resistance_flags = FIRE_PROOF var/datum/effect_system/spark_spread/spark_system var/effectcooldown diff --git a/code/game/objects/items/RSF.dm b/code/game/objects/items/RSF.dm index da5ab1a5a5..4e9470141c 100644 --- a/code/game/objects/items/RSF.dm +++ b/code/game/objects/items/RSF.dm @@ -14,7 +14,7 @@ RSF density = FALSE anchored = FALSE item_flags = NOBLUDGEON - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) var/matter = 0 var/mode = 1 w_class = WEIGHT_CLASS_NORMAL diff --git a/code/game/objects/items/armor_kits.dm b/code/game/objects/items/armor_kits.dm index 906d7c5f81..5bed4f01a4 100644 --- a/code/game/objects/items/armor_kits.dm +++ b/code/game/objects/items/armor_kits.dm @@ -20,20 +20,20 @@ if(C.attached_accessory) to_chat(user,"Kind of hard to sew around [C.attached_accessory].") return - if(C.armor.getRating("melee") < 10) - C.armor = C.armor.setRating("melee" = 10) + if(C.armor.getRating(MELEE) < 10) + C.armor = C.armor.setRating(MELEE = 10) used = TRUE - if(C.armor.getRating("laser") < 10) - C.armor = C.armor.setRating("laser" = 10) + if(C.armor.getRating(LASER) < 10) + C.armor = C.armor.setRating(LASER = 10) used = TRUE - if(C.armor.getRating("fire") < 40) - C.armor = C.armor.setRating("fire" = 40) + if(C.armor.getRating(FIRE) < 40) + C.armor = C.armor.setRating(FIRE = 40) used = TRUE - if(C.armor.getRating("acid") < 10) - C.armor = C.armor.setRating("acid" = 10) + if(C.armor.getRating(ACID) < 10) + C.armor = C.armor.setRating(ACID = 10) used = TRUE - if(C.armor.getRating("bomb") < 5) - C.armor = C.armor.setRating("bomb" = 5) + if(C.armor.getRating(BOMB) < 5) + C.armor = C.armor.setRating(BOMB = 5) used = TRUE if(used) diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index df7d6467f0..4f68132df6 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -184,7 +184,7 @@ lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' slot_flags = ITEM_SLOT_ID - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100) resistance_flags = FIRE_PROOF | ACID_PROOF var/id_type_name = "identification card" var/mining_points = 0 //For redeeming at mining equipment vendors diff --git a/code/game/objects/items/crab17.dm b/code/game/objects/items/crab17.dm index 8d55d3d5a2..b71b520517 100644 --- a/code/game/objects/items/crab17.dm +++ b/code/game/objects/items/crab17.dm @@ -29,7 +29,7 @@ icon = 'icons/obj/money_machine.dmi' icon_state = "bogdanoff" layer = LARGE_MOB_LAYER - armor = list("melee" = 80, "bullet" = 30, "laser" = 30, "energy" = 60, "bomb" = 90, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 80) + armor = list(MELEE = 80, BULLET = 30, LASER = 30, ENERGY = 60, BOMB = 90, BIO = 0, RAD = 0, FIRE = 100, ACID = 80) density = TRUE pixel_z = -8 max_integrity = 5000 diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 36f68cfdf3..e46474d6fa 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -14,7 +14,7 @@ throwforce = 6 w_class = WEIGHT_CLASS_BULKY actions_types = list(/datum/action/item_action/toggle_paddles) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50) var/on = FALSE //if the paddles are equipped (1) or on the defib (0) var/safety = TRUE //if you can zap people with the defibs on harm mode diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 1a130998b6..565da49e20 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -29,7 +29,7 @@ GLOBAL_LIST_EMPTY(PDAs) item_flags = NOBLUDGEON w_class = WEIGHT_CLASS_TINY slot_flags = ITEM_SLOT_ID | ITEM_SLOT_BELT - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100) resistance_flags = FIRE_PROOF | ACID_PROOF //Main variables diff --git a/code/game/objects/items/devices/forcefieldprojector.dm b/code/game/objects/items/devices/forcefieldprojector.dm index 9ef9d73705..a82d206eca 100644 --- a/code/game/objects/items/devices/forcefieldprojector.dm +++ b/code/game/objects/items/devices/forcefieldprojector.dm @@ -87,7 +87,7 @@ mouse_opacity = MOUSE_OPACITY_OPAQUE resistance_flags = INDESTRUCTIBLE CanAtmosPass = ATMOS_PASS_DENSITY - armor = list("melee" = 0, "bullet" = 25, "laser" = 25, "energy" = 25, "bomb" = 25, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) + armor = list(MELEE = 0, BULLET = 25, LASER = 25, ENERGY = 25, BOMB = 25, BIO = 100, RAD = 100, FIRE = 100, ACID = 100) var/obj/item/forcefield_projector/generator /obj/structure/projected_forcefield/Initialize(mapload, obj/item/forcefield_projector/origin) diff --git a/code/game/objects/items/dualsaber.dm b/code/game/objects/items/dualsaber.dm index 9a6a87bb51..86a08fc1c3 100644 --- a/code/game/objects/items/dualsaber.dm +++ b/code/game/objects/items/dualsaber.dm @@ -21,7 +21,7 @@ light_color = "#00ff00"//green attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") max_integrity = 200 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 70) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 70) resistance_flags = FIRE_PROOF wound_bonus = -40 bare_wound_bonus = 20 diff --git a/code/game/objects/items/fireaxe.dm b/code/game/objects/items/fireaxe.dm index 6fb7b89262..e0d11cb4e2 100644 --- a/code/game/objects/items/fireaxe.dm +++ b/code/game/objects/items/fireaxe.dm @@ -15,7 +15,7 @@ hitsound = 'sound/weapons/bladeslice.ogg' sharpness = SHARP_EDGED max_integrity = 200 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 30) resistance_flags = FIRE_PROOF wound_bonus = -15 bare_wound_bonus = 20 @@ -52,10 +52,10 @@ return if(istype(A, /obj/structure/window)) //destroys windows and grilles in one hit (or more if it has a ton of health like plasmaglass) var/obj/structure/window/W = A - W.take_damage(200, BRUTE, "melee", 0) + W.take_damage(200, BRUTE, MELEE, 0) else if(istype(A, /obj/structure/grille)) var/obj/structure/grille/G = A - G.take_damage(40, BRUTE, "melee", 0) + G.take_damage(40, BRUTE, MELEE, 0) /* * Bone Axe diff --git a/code/game/objects/items/grenades/smokebomb.dm b/code/game/objects/items/grenades/smokebomb.dm index 1b856fc013..501f019027 100644 --- a/code/game/objects/items/grenades/smokebomb.dm +++ b/code/game/objects/items/grenades/smokebomb.dm @@ -27,6 +27,6 @@ for(var/obj/structure/blob/B in view(8,src)) var/damage = round(30/(get_dist(B,src)+1)) - B.take_damage(damage, BURN, "melee", 0) + B.take_damage(damage, BURN, MELEE, 0) sleep(80) qdel(src) diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index 60538b479b..61d83f8a99 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -40,7 +40,7 @@ throw_range = 5 custom_materials = list(/datum/material/iron=500) breakouttime = 600 //Deciseconds = 60s = 1 minute - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50) var/cuffsound = 'sound/weapons/handcuffs.ogg' var/trashtype = null //for disposable cuffs diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index 1360fb970e..a89780c807 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -5,7 +5,7 @@ desc = "Deus Vult." icon_state = "knight_templar" item_state = "knight_templar" - armor = list("melee" = 41, "bullet" = 15, "laser" = 5,"energy" = 5, "bomb" = 5, "bio" = 2, "rad" = 0, "fire" = 0, "acid" = 50) + armor = list(MELEE = 41, BULLET = 15, LASER = 5,ENERGY = 5, BOMB = 5, BIO = 2, RAD = 0, FIRE = 0, ACID = 50) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH strip_delay = 80 diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm index 5a16c24b8e..fe4ae7b9d6 100644 --- a/code/game/objects/items/kitchen.dm +++ b/code/game/objects/items/kitchen.dm @@ -27,7 +27,7 @@ flags_1 = CONDUCT_1 attack_verb = list("attacked", "stabbed", "poked") hitsound = 'sound/weapons/bladeslice.ogg' - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30) sharpness = SHARP_POINTY var/datum/reagent/forkload //used to eat omelette @@ -78,7 +78,7 @@ custom_materials = list(/datum/material/iron=12000) attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") sharpness = SHARP_POINTY - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50) var/bayonet = FALSE //Can this be attached to a gun? wound_bonus = -5 bare_wound_bonus = 10 @@ -114,7 +114,7 @@ custom_materials = list(/datum/material/iron=12000) attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") sharpness = SHARP_POINTY - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50) var/bayonet = FALSE //Can this be attached to a gun? wound_bonus = -5 bare_wound_bonus = 10 @@ -266,7 +266,7 @@ force = 8 throwforce = 12//fuck git attack_verb = list("shanked", "shivved") - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) custom_materials = list(/datum/material/glass=400) /obj/item/kitchen/knife/shiv/carrot diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index dd176f6d54..81a0a2cb40 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -2,7 +2,7 @@ hitsound_on = 'sound/weapons/blade1.ogg' heat = 3500 max_integrity = 200 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 30) resistance_flags = FIRE_PROOF var/brightness_on = 3 var/sword_color diff --git a/code/game/objects/items/pitchfork.dm b/code/game/objects/items/pitchfork.dm index b296e2d0cb..9f5768147e 100644 --- a/code/game/objects/items/pitchfork.dm +++ b/code/game/objects/items/pitchfork.dm @@ -11,7 +11,7 @@ hitsound = 'sound/weapons/bladeslice.ogg' sharpness = SHARP_EDGED max_integrity = 200 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 30) resistance_flags = FIRE_PROOF var/wielded = FALSE // track wielded status on item diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm index 42e345b502..3dd6212fce 100644 --- a/code/game/objects/items/pneumaticCannon.dm +++ b/code/game/objects/items/pneumaticCannon.dm @@ -13,7 +13,7 @@ item_state = "bulldog" lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 50) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 60, ACID = 50) var/maxWeightClass = 20 //The max weight of items that can fit into the cannon var/loadedWeightClass = 0 //The weight of items currently in the cannon var/obj/item/tank/internals/tank = null //The gas tank that is drawn from to fire things diff --git a/code/game/objects/items/powerfist.dm b/code/game/objects/items/powerfist.dm index 569b11b8b0..713a14460b 100644 --- a/code/game/objects/items/powerfist.dm +++ b/code/game/objects/items/powerfist.dm @@ -12,7 +12,7 @@ throwforce = 10 throw_range = 7 w_class = WEIGHT_CLASS_NORMAL - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 40) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 40) resistance_flags = FIRE_PROOF attack_speed = CLICK_CD_MELEE * 1.5 var/fisto_setting = 1 diff --git a/code/game/objects/items/puzzle_pieces.dm b/code/game/objects/items/puzzle_pieces.dm index 3f3e81604e..325acc6ac6 100644 --- a/code/game/objects/items/puzzle_pieces.dm +++ b/code/game/objects/items/puzzle_pieces.dm @@ -39,7 +39,7 @@ explosion_block = 3 heat_proof = TRUE max_integrity = 600 - armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) + armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100) resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF damage_deflection = 70 /// Make sure that the key has the same puzzle_id as the keycard door! diff --git a/code/game/objects/items/religion.dm b/code/game/objects/items/religion.dm index b8f0d161dc..26f0b978d2 100644 --- a/code/game/objects/items/religion.dm +++ b/code/game/objects/items/religion.dm @@ -188,7 +188,7 @@ w_class = WEIGHT_CLASS_BULKY slowdown = 2.0 //gotta pretend we're balanced. body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS - armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 40, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) + armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 40, BOMB = 60, BIO = 0, RAD = 0, FIRE = 60, ACID = 60) mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/suit/armor/plate/crusader/red @@ -203,7 +203,7 @@ icon_state = "crusader" w_class = WEIGHT_CLASS_NORMAL flags_inv = HIDEHAIR|HIDEEARS|HIDEFACE - armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 40, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) + armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 40, BOMB = 60, BIO = 0, RAD = 0, FIRE = 60, ACID = 60) /obj/item/clothing/head/helmet/plate/crusader/blue icon_state = "crusader-blue" @@ -218,7 +218,7 @@ icon_state = "prophet" mob_overlay_icon = 'icons/mob/large-worn-icons/64x64/head.dmi' flags_1 = NONE - armor = list("melee" = 60, "bullet" = 60, "laser" = 60, "energy" = 50, "bomb" = 70, "bio" = 50, "rad" = 50, "fire" = 60, "acid" = 60) //religion protects you from disease and radiation, honk. + armor = list(MELEE = 60, BULLET = 60, LASER = 60, ENERGY = 50, BOMB = 70, BIO = 50, RAD = 50, FIRE = 60, ACID = 60) //religion protects you from disease and radiation, honk. worn_x_dimension = 64 worn_y_dimension = 64 @@ -277,7 +277,7 @@ desc = "Metal boots, they look heavy." icon_state = "crusader" w_class = WEIGHT_CLASS_NORMAL - armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 40, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) //does this even do anything on boots? + armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 40, BOMB = 60, BIO = 0, RAD = 0, FIRE = 60, ACID = 60) //does this even do anything on boots? clothing_flags = NOSLIP cold_protection = FEET min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm index 36559d14be..308822d609 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -3,7 +3,7 @@ icon = 'icons/obj/shields.dmi' item_flags = ITEM_CAN_BLOCK block_parry_data = /datum/block_parry_data/shield - armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 70) + armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 0, BOMB = 30, BIO = 0, RAD = 0, FIRE = 80, ACID = 70) /// Shield flags var/shield_flags = SHIELD_FLAGS_DEFAULT /// Last shieldbash world.time @@ -304,7 +304,7 @@ /obj/item/shield/riot/energy_proof name = "energy resistant shield" desc = "An ablative shield designed to absorb and disperse energy attacks. This comes at significant cost to its ability to withstand ballistics and kinetics, breaking apart easily." - armor = list("melee" = 30, "bullet" = -10, "laser" = 80, "energy" = 80, "bomb" = -40, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50) + armor = list(MELEE = 30, BULLET = -10, LASER = 80, ENERGY = 80, BOMB = -40, BIO = 0, RAD = 0, FIRE = 0, ACID = 50) icon_state = "riot_laser" item_state = "riot_laser" lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi' @@ -315,7 +315,7 @@ /obj/item/shield/riot/kinetic_proof name = "kinetic resistant shield" desc = "A polymer and ceramic shield designed to absorb ballistic projectiles and kinetic force. It doesn't do very well into energy attacks, especially from weapons that inflict burns." - armor = list("melee" = 30, "bullet" = 80, "laser" = 0, "energy" = 0, "bomb" = -40, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50) + armor = list(MELEE = 30, BULLET = 80, LASER = 0, ENERGY = 0, BOMB = -40, BIO = 0, RAD = 0, FIRE = 0, ACID = 50) icon_state = "riot_bullet" item_state = "riot_bullet" shield_flags = SHIELD_FLAGS_DEFAULT | SHIELD_KINETIC_STRONG | SHIELD_ENERGY_WEAK @@ -334,7 +334,7 @@ /obj/item/shield/riot/roman/fake desc = "Bears an inscription on the inside: \"Romanes venio domus\". It appears to be a bit flimsy." - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) shield_flags = SHIELD_ENERGY_WEAK | SHIELD_KINETIC_WEAK | SHIELD_NO_RANGED max_integrity = 40 @@ -471,7 +471,7 @@ /obj/item/shield/makeshift name = "metal shield" desc = "A large shield made of wired and welded sheets of metal. The handle is made of cloth and leather, making it unwieldy." - armor = list("melee" = 25, "bullet" = 25, "laser" = 5, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 80) + armor = list(MELEE = 25, BULLET = 25, LASER = 5, ENERGY = 0, BOMB = 30, BIO = 0, RAD = 0, FIRE = 70, ACID = 80) lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi' item_state = "metal" @@ -485,7 +485,7 @@ /obj/item/shield/riot/tower name = "tower shield" desc = "An immense tower shield. Designed to ensure maximum protection to the user, at the expense of mobility." - armor = list("melee" = 95, "bullet" = 95, "laser" = 75, "energy" = 60, "bomb" = 90, "bio" = 90, "rad" = 0, "fire" = 90, "acid" = 10) //Armor for the item, dosnt transfer to user + armor = list(MELEE = 95, BULLET = 95, LASER = 75, ENERGY = 60, BOMB = 90, BIO = 90, RAD = 0, FIRE = 90, ACID = 10) //Armor for the item, dosnt transfer to user item_state = "metal" icon_state = "metal" force = 16 diff --git a/code/game/objects/items/singularityhammer.dm b/code/game/objects/items/singularityhammer.dm index e58dbc23ce..30b3526990 100644 --- a/code/game/objects/items/singularityhammer.dm +++ b/code/game/objects/items/singularityhammer.dm @@ -10,7 +10,7 @@ throwforce = 15 throw_range = 1 w_class = WEIGHT_CLASS_HUGE - armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) + armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 0, BOMB = 50, BIO = 0, RAD = 0, FIRE = 100, ACID = 100) resistance_flags = FIRE_PROOF | ACID_PROOF force_string = "LORD SINGULOTH HIMSELF" total_mass = TOTAL_MASS_MEDIEVAL_WEAPON diff --git a/code/game/objects/items/spear.dm b/code/game/objects/items/spear.dm index f40c774551..29d089422c 100644 --- a/code/game/objects/items/spear.dm +++ b/code/game/objects/items/spear.dm @@ -17,7 +17,7 @@ attack_verb = list("attacked", "poked", "jabbed", "torn", "gored") sharpness = SHARP_EDGED max_integrity = 200 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30) var/obj/item/grenade/explosive = null var/war_cry = "AAAAARGH!!!" var/icon_prefix = "spearglass" diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 1f19821df6..a2b992c395 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -34,7 +34,7 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \ icon_state = "sheet-glass" item_state = "sheet-glass" custom_materials = list(/datum/material/glass=MINERAL_MATERIAL_AMOUNT) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 100) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 100) resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/glass grind_results = list(/datum/reagent/silicon = 20) @@ -106,7 +106,7 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \ icon_state = "sheet-pglass" item_state = "sheet-pglass" custom_materials = list(/datum/material/plasma=MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/glass=MINERAL_MATERIAL_AMOUNT) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 100) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 75, ACID = 100) resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/plasmaglass grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/toxin/plasma = 10) @@ -161,7 +161,7 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ icon_state = "sheet-rglass" item_state = "sheet-rglass" custom_materials = list(/datum/material/iron=MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/glass=MINERAL_MATERIAL_AMOUNT) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 100) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 70, ACID = 100) resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/rglass grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/iron = 10) @@ -209,7 +209,7 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \ icon_state = "sheet-prglass" item_state = "sheet-prglass" custom_materials = list(/datum/material/plasma=MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/glass=MINERAL_MATERIAL_AMOUNT, /datum/material/iron=MINERAL_MATERIAL_AMOUNT * 0.5,) - armor = list("melee" = 20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100) + armor = list(MELEE = 20, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 100) resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/plasmarglass grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/toxin/plasma = 10, /datum/reagent/iron = 10) @@ -236,7 +236,7 @@ GLOBAL_LIST_INIT(titaniumglass_recipes, list( icon_state = "sheet-titaniumglass" item_state = "sheet-titaniumglass" custom_materials = list(/datum/material/titanium=MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/glass=MINERAL_MATERIAL_AMOUNT) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 100) resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/titaniumglass shard_type = /obj/item/shard @@ -260,7 +260,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( icon_state = "sheet-plastitaniumglass" item_state = "sheet-plastitaniumglass" custom_materials = list(/datum/material/titanium=MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/plasma=MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/glass=MINERAL_MATERIAL_AMOUNT) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 100) resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/plastitaniumglass shard_type = /obj/item/shard @@ -291,7 +291,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( attack_verb = list("stabbed", "slashed", "sliced", "cut") hitsound = 'sound/weapons/bladeslice.ogg' resistance_flags = ACID_PROOF - armor = list("melee" = 100, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 100) + armor = list(MELEE = 100, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 100) max_integrity = 40 sharpness = SHARP_EDGED var/icon_prefix diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 1fbd0433be..5dbdddb540 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -212,7 +212,7 @@ GLOBAL_LIST_INIT(plasteel_recipes, list ( \ custom_materials = list(/datum/material/iron=MINERAL_MATERIAL_AMOUNT, /datum/material/plasma=MINERAL_MATERIAL_AMOUNT) throwforce = 10 flags_1 = CONDUCT_1 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 80) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 80) resistance_flags = FIRE_PROOF merge_type = /obj/item/stack/sheet/plasteel grind_results = list(/datum/reagent/iron = 20, /datum/reagent/toxin/plasma = 20) @@ -291,7 +291,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ icon = 'icons/obj/stack_objects.dmi' custom_materials = list(/datum/material/wood=MINERAL_MATERIAL_AMOUNT) sheettype = "wood" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 0) resistance_flags = FLAMMABLE merge_type = /obj/item/stack/sheet/mineral/wood novariants = TRUE @@ -355,7 +355,7 @@ GLOBAL_LIST_INIT(bamboo_recipes, list ( \ icon = 'icons/obj/stack_objects.dmi' custom_materials = list(/datum/material/bamboo = MINERAL_MATERIAL_AMOUNT) throwforce = 15 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 0) resistance_flags = FLAMMABLE merge_type = /obj/item/stack/sheet/mineral/bamboo grind_results = list(/datum/reagent/cellulose = 10) diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 6eac04b976..728e5fd726 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -530,7 +530,7 @@ flags_1 = CONDUCT_1 turf_type = /turf/open/floor/plasteel mineralType = "metal" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 70) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 70) resistance_flags = FIRE_PROOF /obj/item/stack/tile/plasteel/cyborg diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index b6520f6bb5..c1eb91bff8 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -44,7 +44,7 @@ item_state = "holdingpack" resistance_flags = FIRE_PROOF item_flags = NO_MAT_REDEMPTION - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 50) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 60, ACID = 50) component_type = /datum/component/storage/concrete/bluespace/bag_of_holding rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index 6db1e4baae..bedf33c272 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -13,7 +13,7 @@ throwforce = 7 w_class = WEIGHT_CLASS_NORMAL attack_verb = list("beaten") - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 0, RAD = 0, FIRE = 80, ACID = 80) attack_speed = CLICK_CD_MELEE var/stamina_loss_amount = 35 @@ -190,7 +190,7 @@ var/final_stamina_loss_amount = stamina_loss_amount //Our stunning power for the baton var/shoved = FALSE //Did we succeed on knocking our target over? var/zap_penetration = armor_pen - var/zap_block = L.run_armor_check(BODY_ZONE_CHEST, "melee", null, null, zap_penetration) //armor check, including calculation for armor penetration, for our attack + var/zap_block = L.run_armor_check(BODY_ZONE_CHEST, MELEE, null, null, zap_penetration) //armor check, including calculation for armor penetration, for our attack final_stamina_loss_amount = block_calculate_resultant_damage(final_stamina_loss_amount, return_list) var/obj/item/stock_parts/cell/our_cell = get_cell() diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index ef798ae631..b56199dfad 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -15,7 +15,7 @@ throw_range = 4 custom_materials = list(/datum/material/iron = 500) actions_types = list(/datum/action/item_action/set_internals) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 30) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 80, ACID = 30) var/datum/gas_mixture/air_contents = null var/distribute_pressure = ONE_ATMOSPHERE var/integrity = 3 diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index 88131fb197..2be62b4ac7 100644 --- a/code/game/objects/items/tanks/watertank.dm +++ b/code/game/objects/items/tanks/watertank.dm @@ -10,7 +10,7 @@ slowdown = 1 actions_types = list(/datum/action/item_action/toggle_mister) max_integrity = 200 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 30) resistance_flags = FIRE_PROOF var/obj/item/noz diff --git a/code/game/objects/items/teleportation.dm b/code/game/objects/items/teleportation.dm index bc6a40f8c0..708151a399 100644 --- a/code/game/objects/items/teleportation.dm +++ b/code/game/objects/items/teleportation.dm @@ -107,7 +107,7 @@ throw_speed = 3 throw_range = 5 custom_materials = list(/datum/material/iron=10000) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 30, BIO = 0, RAD = 0, FIRE = 100, ACID = 100) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF var/list/active_portal_pairs var/max_portal_pairs = 3 diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm index 93f8915f95..8ddcda55e1 100644 --- a/code/game/objects/items/tools/crowbar.dm +++ b/code/game/objects/items/tools/crowbar.dm @@ -17,7 +17,7 @@ attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked") tool_behaviour = TOOL_CROWBAR toolspeed = 1 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30) wound_bonus = -10 bare_wound_bonus = 5 diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm index 9f393a7fcb..4ef43b1177 100644 --- a/code/game/objects/items/tools/screwdriver.dm +++ b/code/game/objects/items/tools/screwdriver.dm @@ -20,7 +20,7 @@ usesound = list('sound/items/screwdriver.ogg', 'sound/items/screwdriver2.ogg') tool_behaviour = TOOL_SCREWDRIVER toolspeed = 1 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30) var/random_color = TRUE //if the screwdriver uses random coloring var/static/list/screwdriver_colors = list( "blue" = rgb(24, 97, 213), diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index 7688d2d342..209e104cbd 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -19,7 +19,7 @@ throw_speed = 3 throw_range = 5 w_class = WEIGHT_CLASS_SMALL - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 30) resistance_flags = FIRE_PROOF var/self_fueling = FALSE //Do we refill ourselves or not diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm index cbca26e63c..9fa724e74a 100644 --- a/code/game/objects/items/tools/wirecutters.dm +++ b/code/game/objects/items/tools/wirecutters.dm @@ -20,7 +20,7 @@ tool_behaviour = TOOL_WIRECUTTER toolspeed = 1 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30) var/random_color = TRUE var/static/list/wirecutter_colors = list( "blue" = rgb(24, 97, 213), diff --git a/code/game/objects/items/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm index 9a0db3b92b..8f60ab9d4a 100644 --- a/code/game/objects/items/tools/wrench.dm +++ b/code/game/objects/items/tools/wrench.dm @@ -17,7 +17,7 @@ attack_verb = list("bashed", "battered", "bludgeoned", "whacked") tool_behaviour = TOOL_WRENCH toolspeed = 1 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30) wound_bonus = -10 bare_wound_bonus = 5 diff --git a/code/game/objects/items/vending_items.dm b/code/game/objects/items/vending_items.dm index 2964d31259..325827c3d0 100755 --- a/code/game/objects/items/vending_items.dm +++ b/code/game/objects/items/vending_items.dm @@ -17,7 +17,7 @@ throw_speed = 1 throw_range = 7 w_class = WEIGHT_CLASS_BULKY - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 30) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 70, ACID = 30) // Built automatically from the corresponding vending machine. // If null, considered to be full. Otherwise, is list(/typepath = amount). diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index b00d736282..9055dd073d 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -11,7 +11,7 @@ throw_range = 7 attack_verb = list("banned") max_integrity = 200 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 70) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 70) resistance_flags = FIRE_PROOF /obj/item/banhammer/suicide_act(mob/user) @@ -67,7 +67,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 block_chance = 50 sharpness = SHARP_EDGED max_integrity = 200 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50) resistance_flags = FIRE_PROOF total_mass = TOTAL_MASS_MEDIEVAL_WEAPON @@ -250,7 +250,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 block_chance = 50 sharpness = SHARP_EDGED max_integrity = 200 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50) resistance_flags = FIRE_PROOF total_mass = TOTAL_MASS_MEDIEVAL_WEAPON diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 33c683a6cc..e7ab7214b7 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -22,7 +22,7 @@ //returns the damage value of the attack after processing the obj's various armor protections /obj/proc/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir, armour_penetration = 0) - if(damage_flag == "melee" && damage_amount < damage_deflection) // TODO: Refactor armor datums and types entirely jfc + if(damage_flag == MELEE && damage_amount < damage_deflection) // TODO: Refactor armor datums and types entirely jfc return 0 switch(damage_type) if(BRUTE) @@ -54,7 +54,7 @@ var/obj/O = AM if(O.damtype == STAMINA) throwdamage = 0 - take_damage(throwdamage, BRUTE, "melee", 1, get_dir(src, AM)) + take_damage(throwdamage, BRUTE, MELEE, 1, get_dir(src, AM)) /obj/ex_act(severity, target, origin) if(resistance_flags & INDESTRUCTIBLE) @@ -69,9 +69,9 @@ obj_integrity = 0 qdel(src) if(2) - take_damage(rand(100, 250), BRUTE, "bomb", 0) + take_damage(rand(100, 250), BRUTE, BOMB, 0) if(3) - take_damage(rand(10, 90), BRUTE, "bomb", 0) + take_damage(rand(10, 90), BRUTE, BOMB, 0) /obj/wave_ex_act(power, datum/wave_explosion/explosion, dir) if(resistance_flags & INDESTRUCTIBLE) @@ -81,7 +81,7 @@ obj_integrity = 0 qdel(src) return - take_damage(wave_explosion_damage(power, explosion), BRUTE, "bomb", 0) + take_damage(wave_explosion_damage(power, explosion), BRUTE, BOMB, 0) /obj/proc/wave_explosion_damage(power, datum/wave_explosion/explosion) return (explosion_flags & EXPLOSION_FLAG_HARD_OBSTACLE)? EXPLOSION_POWER_STANDARD_SCALE_HARD_OBSTACLE_DAMAGE(power, explosion.hard_obstacle_mod) : EXPLOSION_POWER_STANDARD_SCALE_OBJECT_DAMAGE(power, explosion.object_damage_mod) @@ -106,7 +106,7 @@ user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced="hulk") else playsound(src, 'sound/effects/bang.ogg', 50, 1) - take_damage(hulk_damage(), BRUTE, "melee", 0, get_dir(src, user)) + take_damage(hulk_damage(), BRUTE, MELEE, 0, get_dir(src, user)) return 1 return 0 @@ -115,7 +115,7 @@ var/turf/T = loc if(T.intact && level == 1) //the blob doesn't destroy thing below the floor return - take_damage(400, BRUTE, "melee", 0, get_dir(src, B)) + take_damage(400, BRUTE, MELEE, 0, get_dir(src, B)) /obj/proc/attack_generic(mob/user, damage_amount = 0, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, armor_penetration = 0) //used by attack_alien, attack_animal, and attack_slime if(SEND_SIGNAL(src, COMSIG_OBJ_ATTACK_GENERIC, user, damage_amount, damage_type, damage_flag, sound_effect, armor_penetration) & COMPONENT_STOP_GENERIC_ATTACK) @@ -127,7 +127,7 @@ user.DelayNextAction(CLICK_CD_MELEE) /obj/attack_alien(mob/living/carbon/alien/humanoid/user) - if(attack_generic(user, 60, BRUTE, "melee", 0)) + if(attack_generic(user, 60, BRUTE, MELEE, 0)) playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1) /obj/attack_animal(mob/living/simple_animal/M) @@ -141,9 +141,9 @@ if(M.environment_smash) play_soundeffect = 0 if(M.obj_damage) - . = attack_generic(M, M.obj_damage, M.melee_damage_type, "melee", play_soundeffect, M.armour_penetration) + . = attack_generic(M, M.obj_damage, M.melee_damage_type, MELEE, play_soundeffect, M.armour_penetration) else - . = attack_generic(M, rand(M.melee_damage_lower,M.melee_damage_upper), M.melee_damage_type, "melee", play_soundeffect, M.armour_penetration) + . = attack_generic(M, rand(M.melee_damage_lower,M.melee_damage_upper), M.melee_damage_type, MELEE, play_soundeffect, M.armour_penetration) if(. && !play_soundeffect) playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1) @@ -167,7 +167,7 @@ return if(istype(src, /obj/machinery/atmospherics)) return - attack_generic(user, rand(10, 15), BRUTE, "melee", 1) + attack_generic(user, rand(10, 15), BRUTE, MELEE, 1) #undef BLACKLISTED_OBJECTS @@ -181,7 +181,7 @@ ///// ACID -GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/effects/effects.dmi', "acid")) +GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/effects/effects.dmi', ACID)) //the obj's reaction when touched by acid /obj/acid_act(acidpwr, acid_volume) @@ -211,7 +211,7 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e if(T.intact && level == 1) //fire can't damage things hidden below the floor. return if(exposed_temperature && !(resistance_flags & FIRE_PROOF)) - take_damage(clamp(0.02 * exposed_temperature, 0, 20), BURN, "fire", 0) + take_damage(clamp(0.02 * exposed_temperature, 0, 20), BURN, FIRE, 0) if(!(resistance_flags & ON_FIRE) && (resistance_flags & FLAMMABLE)) resistance_flags |= ON_FIRE SSfire_burning.processing[src] = src @@ -260,9 +260,9 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e //what happens when the obj's integrity reaches zero. /obj/proc/obj_destruction(damage_flag) - if(damage_flag == "acid") + if(damage_flag == ACID) acid_melt() - else if(damage_flag == "fire") + else if(damage_flag == FIRE) burn() else deconstruct(FALSE) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index cf256dd6fc..5d16a44c00 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -280,15 +280,15 @@ if (islist(result)) if (result["button"] != 2) // If the user pressed the cancel button // text2num conveniently returns a null on invalid values - armor = armor.setRating(melee = text2num(result["values"]["melee"]),\ - bullet = text2num(result["values"]["bullet"]),\ - laser = text2num(result["values"]["laser"]),\ - energy = text2num(result["values"]["energy"]),\ - bomb = text2num(result["values"]["bomb"]),\ - bio = text2num(result["values"]["bio"]),\ - rad = text2num(result["values"]["rad"]),\ - fire = text2num(result["values"]["fire"]),\ - acid = text2num(result["values"]["acid"])) + armor = armor.setRating(melee = text2num(result["values"][MELEE]),\ + bullet = text2num(result["values"][BULLET]),\ + laser = text2num(result["values"][LASER]),\ + energy = text2num(result["values"][ENERGY]),\ + bomb = text2num(result["values"][BOMB]),\ + bio = text2num(result["values"][BIO]),\ + rad = text2num(result["values"][RAD]),\ + fire = text2num(result["values"][FIRE]),\ + acid = text2num(result["values"][ACID])) log_admin("[key_name(usr)] modified the armor on [src] ([type]) to melee: [armor.melee], bullet: [armor.bullet], laser: [armor.laser], energy: [armor.energy], bomb: [armor.bomb], bio: [armor.bio], rad: [armor.rad], fire: [armor.fire], acid: [armor.acid]") message_admins("[key_name_admin(usr)] modified the armor on [src] ([type]) to melee: [armor.melee], bullet: [armor.bullet], laser: [armor.laser], energy: [armor.energy], bomb: [armor.bomb], bio: [armor.bio], rad: [armor.rad], fire: [armor.fire], acid: [armor.acid]") if(href_list[VV_HK_MASS_DEL_TYPE]) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 52036427c8..f712c2e5f9 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -16,7 +16,7 @@ /obj/structure/Initialize() if (!armor) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50) . = ..() if(smooth) queue_smooth(src) @@ -114,4 +114,4 @@ return "It's falling apart!" /obj/structure/rust_heretic_act() - take_damage(500, BRUTE, "melee", 1) + take_damage(500, BRUTE, MELEE, 1) diff --git a/code/game/objects/structures/barsigns.dm b/code/game/objects/structures/barsigns.dm index a96d39316e..86c7031127 100644 --- a/code/game/objects/structures/barsigns.dm +++ b/code/game/objects/structures/barsigns.dm @@ -6,7 +6,7 @@ req_access = list(ACCESS_BAR) max_integrity = 500 integrity_failure = 0.5 - armor = list("melee" = 20, "bullet" = 20, "laser" = 20, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list(MELEE = 20, BULLET = 20, LASER = 20, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50) buildable_sign = 0 var/list/barsigns=list() var/panel_open = FALSE diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index af4d098157..e6516b04d2 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -6,7 +6,7 @@ density = TRUE max_integrity = 200 integrity_failure = 0.25 - armor = list("melee" = 20, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 60) + armor = list(MELEE = 20, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 70, ACID = 60) var/icon_door = null var/icon_door_override = FALSE //override to have open overlay use icon different to its base's diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm index 4266f006ec..22996339ef 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm @@ -4,12 +4,12 @@ locked = TRUE icon_state = "secure" max_integrity = 250 - armor = list("melee" = 30, "bullet" = 50, "laser" = 50, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80) + armor = list(MELEE = 30, BULLET = 50, LASER = 50, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 80) secure = TRUE var/melee_min_damage = 20 /obj/structure/closet/secure_closet/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) - if(damage_flag == "melee" && damage_amount < melee_min_damage) + if(damage_flag == MELEE && damage_amount < melee_min_damage) return 0 . = ..() diff --git a/code/game/objects/structures/crates_lockers/crates/secure.dm b/code/game/objects/structures/crates_lockers/crates/secure.dm index f63f3afbd9..e60454a7ce 100644 --- a/code/game/objects/structures/crates_lockers/crates/secure.dm +++ b/code/game/objects/structures/crates_lockers/crates/secure.dm @@ -5,11 +5,11 @@ secure = TRUE locked = TRUE max_integrity = 500 - armor = list("melee" = 30, "bullet" = 50, "laser" = 50, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80) + armor = list(MELEE = 30, BULLET = 50, LASER = 50, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 80) var/tamperproof = 0 /obj/structure/closet/crate/secure/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) - if(damage_flag == "melee" && damage_amount < 25) + if(damage_flag == MELEE && damage_amount < 25) return 0 . = ..() diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index ce2acdbdf7..04b78f2145 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -6,7 +6,7 @@ density = TRUE anchored = TRUE resistance_flags = ACID_PROOF - armor = list("melee" = 30, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 100) + armor = list(MELEE = 30, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 70, ACID = 100) max_integrity = 200 integrity_failure = 0.25 attack_hand_speed = CLICK_CD_MELEE diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm index a247908b3b..54be2755bc 100644 --- a/code/game/objects/structures/fireaxe.dm +++ b/code/game/objects/structures/fireaxe.dm @@ -6,7 +6,7 @@ plane = ABOVE_WALL_PLANE anchored = TRUE density = FALSE - armor = list("melee" = 50, "bullet" = 20, "laser" = 0, "energy" = 100, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 50) + armor = list(MELEE = 50, BULLET = 20, LASER = 0, ENERGY = 100, BOMB = 10, BIO = 100, RAD = 100, FIRE = 90, ACID = 50) max_integrity = 150 integrity_failure = 0.33 var/locked = TRUE diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index a09ce578e7..75b0ebc6a1 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -8,7 +8,7 @@ flags_1 = CONDUCT_1 pressure_resistance = 5*ONE_ATMOSPHERE layer = BELOW_OBJ_LAYER - armor = list("melee" = 50, "bullet" = 70, "laser" = 70, "energy" = 100, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 0, "acid" = 0) + armor = list(MELEE = 50, BULLET = 70, LASER = 70, ENERGY = 100, BOMB = 10, BIO = 100, RAD = 100, FIRE = 0, ACID = 0) max_integrity = 50 attack_hand_is_action = TRUE attack_hand_speed = 8 @@ -91,7 +91,7 @@ user.DelayNextAction(flush = TRUE) user.do_attack_animation(src) if(!shock(user, 70) && !QDELETED(src)) //Last hit still shocks but shouldn't deal damage to the grille) - take_damage(rand(5,10), BRUTE, "melee", 1) + take_damage(rand(5,10), BRUTE, MELEE, 1) /obj/structure/grille/attack_paw(mob/user) return attack_hand(user) @@ -113,7 +113,7 @@ user.visible_message("[user] hits [src].", null, null, COMBAT_MESSAGE_RANGE) log_combat(user, src, "hit") if(!shock(user, 70)) - take_damage(rand(5,10), BRUTE, "melee", 1) + take_damage(rand(5,10), BRUTE, MELEE, 1) /obj/structure/grille/attack_alien(mob/living/user) if(!user.CheckActionCooldown(CLICK_CD_MELEE)) @@ -122,7 +122,7 @@ user.do_attack_animation(src) user.visible_message("[user] mangles [src].", null, null, COMBAT_MESSAGE_RANGE) if(!shock(user, 70)) - take_damage(20, BRUTE, "melee", 1) + take_damage(20, BRUTE, MELEE, 1) /obj/structure/grille/CanPass(atom/movable/mover, turf/target) if(istype(mover) && (mover.pass_flags & PASSGRILLE)) diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index cb9309c4c4..7349865529 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -6,7 +6,7 @@ icon = 'icons/effects/effects.dmi' anchored = TRUE max_integrity = 1 - armor = list("melee" = 0, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 20) + armor = list(MELEE = 0, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 0, BIO = 0, RAD = 0, FIRE = 20, ACID = 20) var/obj/item/holosign_creator/projector var/init_vis_overlay = TRUE rad_flags = RAD_NO_CONTAMINATE @@ -32,7 +32,7 @@ return user.do_attack_animation(src, ATTACK_EFFECT_PUNCH) user.DelayNextAction(CLICK_CD_MELEE) - take_damage(5 , BRUTE, "melee", 1) + take_damage(5 , BRUTE, MELEE, 1) /obj/structure/holosign/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) @@ -130,11 +130,11 @@ allow_walk = 0 /obj/structure/holosign/barrier/cyborg/bullet_act(obj/item/projectile/P) - take_damage((P.damage / 5) , BRUTE, "melee", 1) //Doesn't really matter what damage flag it is. + take_damage((P.damage / 5) , BRUTE, MELEE, 1) //Doesn't really matter what damage flag it is. if(istype(P, /obj/item/projectile/energy/electrode)) - take_damage(10, BRUTE, "melee", 1) //Tasers aren't harmful. + take_damage(10, BRUTE, MELEE, 1) //Tasers aren't harmful. if(istype(P, /obj/item/projectile/beam/disabler)) - take_damage(5, BRUTE, "melee", 1) //Disablers aren't harmful. + take_damage(5, BRUTE, MELEE, 1) //Disablers aren't harmful. return BULLET_ACT_HIT /obj/structure/holosign/barrier/medical @@ -181,7 +181,7 @@ var/shockcd = 0 /obj/structure/holosign/barrier/cyborg/hacked/bullet_act(obj/item/projectile/P) - take_damage(P.damage, BRUTE, "melee", 1) //Yeah no this doesn't get projectile resistance. + take_damage(P.damage, BRUTE, MELEE, 1) //Yeah no this doesn't get projectile resistance. return BULLET_ACT_HIT /obj/structure/holosign/barrier/cyborg/hacked/proc/cooldown() diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 13f86d13bd..e86123eb25 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -5,7 +5,7 @@ icon_state = "lattice" density = FALSE anchored = TRUE - armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50) + armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 50) max_integrity = 50 layer = LATTICE_LAYER //under pipes plane = FLOOR_PLANE diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index b2f1de8750..387872e448 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -16,7 +16,7 @@ var/isSwitchingStates = 0 var/close_delay = -1 //-1 if does not auto close. max_integrity = 200 - armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 50, "acid" = 50) + armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 10, BIO = 100, RAD = 100, FIRE = 50, ACID = 50) var/sheetType = /obj/item/stack/sheet/metal var/sheetAmount = 7 var/openSound = 'sound/effects/stonedoor_openclose.ogg' diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index 46d5316458..d1e6849e87 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -3,7 +3,7 @@ desc = "Heavy duty, airtight, plastic flaps. Definitely can't get past those. No way." icon = 'icons/obj/stationobjs.dmi' icon_state = "plasticflaps" - armor = list("melee" = 100, "bullet" = 80, "laser" = 80, "energy" = 100, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 50, "acid" = 50) + armor = list(MELEE = 100, BULLET = 80, LASER = 80, ENERGY = 100, BOMB = 50, BIO = 100, RAD = 100, FIRE = 50, ACID = 50) density = FALSE anchored = TRUE CanAtmosPass = ATMOS_PASS_NO diff --git a/code/game/objects/structures/signs/_signs.dm b/code/game/objects/structures/signs/_signs.dm index 8b82cdba5e..0e4f85572c 100644 --- a/code/game/objects/structures/signs/_signs.dm +++ b/code/game/objects/structures/signs/_signs.dm @@ -6,7 +6,7 @@ plane = ABOVE_WALL_PLANE layer = SIGN_LAYER max_integrity = 100 - armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50) var/buildable_sign = 1 //unwrenchable and modifiable rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 24342e44bd..24e987e979 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -317,7 +317,7 @@ canSmoothWith = null max_integrity = 70 resistance_flags = ACID_PROOF - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 100) var/list/debris = list() /obj/structure/table/glass/New() @@ -395,7 +395,7 @@ canSmoothWith = null max_integrity = 270 resistance_flags = ACID_PROOF - armor = list("melee" = 10, "bullet" = 5, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100) + armor = list(MELEE = 10, BULLET = 5, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 80, ACID = 100) var/list/debris = list() /obj/structure/table/plasmaglass/New() @@ -558,7 +558,7 @@ buildstack = /obj/item/stack/sheet/plasteel max_integrity = 200 integrity_failure = 0.25 - armor = list("melee" = 10, "bullet" = 30, "laser" = 30, "energy" = 100, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 70) + armor = list(MELEE = 10, BULLET = 30, LASER = 30, ENERGY = 100, BOMB = 20, BIO = 0, RAD = 0, FIRE = 80, ACID = 70) /obj/structure/table/reinforced/deconstruction_hints(mob/user) if(deconstruction_ready) @@ -736,7 +736,7 @@ return user.do_attack_animation(src, ATTACK_EFFECT_KICK) user.visible_message("[user] kicks [src].", null, null, COMBAT_MESSAGE_RANGE) - take_damage(rand(4,8), BRUTE, "melee", 1) + take_damage(rand(4,8), BRUTE, MELEE, 1) /obj/structure/rack/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 1e7f4fd64b..124388997d 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -31,7 +31,7 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) var/glass_amount = 1 can_be_unanchored = TRUE resistance_flags = ACID_PROOF - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 100) CanAtmosPass = ATMOS_PASS_PROC var/real_explosion_block //ignore this, just use explosion_block var/breaksound = "shatter" @@ -595,7 +595,7 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) icon_state = "rwindow" reinf = TRUE heat_resistance = 1600 - armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 25, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 100) + armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 25, BIO = 100, RAD = 100, FIRE = 80, ACID = 100) max_integrity = 50 explosion_block = 1 wave_explosion_block = EXPLOSION_BLOCK_REINFORCED_WINDOW @@ -622,7 +622,7 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) icon_state = "plasmawindow" reinf = FALSE heat_resistance = 25000 - armor = list("melee" = 75, "bullet" = 5, "laser" = 0, "energy" = 0, "bomb" = 45, "bio" = 100, "rad" = 100, "fire" = 99, "acid" = 100) + armor = list(MELEE = 75, BULLET = 5, LASER = 0, ENERGY = 0, BOMB = 45, BIO = 100, RAD = 100, FIRE = 99, ACID = 100) max_integrity = 150 explosion_block = 1 wave_explosion_block = EXPLOSION_BLOCK_BOROSILICATE_WINDOW @@ -650,7 +650,7 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) reinf = TRUE extra_reinforced = TRUE heat_resistance = 50000 - armor = list("melee" = 85, "bullet" = 20, "laser" = 0, "energy" = 0, "bomb" = 60, "bio" = 100, "rad" = 100, "fire" = 99, "acid" = 100) + armor = list(MELEE = 85, BULLET = 20, LASER = 0, ENERGY = 0, BOMB = 60, BIO = 100, RAD = 100, FIRE = 99, ACID = 100) max_integrity = 500 explosion_block = 2 wave_explosion_block = EXPLOSION_BLOCK_EXTREME @@ -769,7 +769,7 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) flags_1 = PREVENT_CLICK_UNDER_1 reinf = TRUE heat_resistance = 1600 - armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 100) + armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, RAD = 100, FIRE = 80, ACID = 100) smooth = SMOOTH_TRUE canSmoothWith = null explosion_block = 3 @@ -800,7 +800,7 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) reinf = TRUE extra_reinforced = TRUE heat_resistance = 1600 - armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 100) + armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, RAD = 100, FIRE = 80, ACID = 100) smooth = SMOOTH_TRUE canSmoothWith = null explosion_block = 3 @@ -826,7 +826,7 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) icon_state = "clockwork_window_single" resistance_flags = FIRE_PROOF | ACID_PROOF max_integrity = 80 - armor = list("melee" = 60, "bullet" = 25, "laser" = 0, "energy" = 0, "bomb" = 25, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 100) + armor = list(MELEE = 60, BULLET = 25, LASER = 0, ENERGY = 0, BOMB = 25, BIO = 100, RAD = 100, FIRE = 80, ACID = 100) explosion_block = 2 //fancy AND hard to destroy. the most useful combination. wave_explosion_block = EXPLOSION_BLOCK_BOROSILICATE_WINDOW wave_explosion_multiply = EXPLOSION_DAMPEN_BOROSILICATE_WINDOW @@ -912,7 +912,7 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) decon_speed = 10 CanAtmosPass = ATMOS_PASS_YES resistance_flags = FLAMMABLE - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) breaksound = 'sound/items/poster_ripped.ogg' hitsound = 'sound/weapons/slashmiss.ogg' var/static/mutable_appearance/torn = mutable_appearance('icons/obj/smooth_structures/paperframes.dmi',icon_state = "torn", layer = ABOVE_OBJ_LAYER - 0.1) @@ -933,7 +933,7 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) user.visible_message("[user] knocks on [src].") playsound(src, "pageturn", 50, 1) else - take_damage(4,BRUTE,"melee", 0) + take_damage(4,BRUTE,MELEE, 0) playsound(src, hitsound, 50, 1) if(!QDELETED(src)) user.visible_message("[user] tears a hole in [src].") diff --git a/code/game/shuttle_engines.dm b/code/game/shuttle_engines.dm index e5d58c3e1b..b0f06a1495 100644 --- a/code/game/shuttle_engines.dm +++ b/code/game/shuttle_engines.dm @@ -8,7 +8,7 @@ icon = 'icons/turf/shuttle.dmi' resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF max_integrity = 500 - armor = list("melee" = 100, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 70) //default + ignores melee + armor = list(MELEE = 100, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 70) //default + ignores melee /obj/structure/shuttle/engine name = "engine" diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index aaf8364229..f6b2ace36c 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -380,7 +380,7 @@ GLOBAL_LIST_EMPTY(station_turfs) M.adjustBruteLoss(damage) M.Unconscious(damage * 4) for(var/obj/vehicle/sealed/mecha/M in src) - M.take_damage(damage*2, BRUTE, "melee", 1) + M.take_damage(damage*2, BRUTE, MELEE, 1) /turf/proc/Bless() new /obj/effect/blessing(src) diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm index 011d175cfa..6df4fc52ec 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm @@ -13,7 +13,7 @@ icon_state = "vest_stealth" item_state = "armor" blood_overlay_type = "armor" - armor = list("melee" = 15, "bullet" = 15, "laser" = 15, "energy" = 15, "bomb" = 15, "bio" = 15, "rad" = 15, "fire" = 70, "acid" = 70) + armor = list(MELEE = 15, BULLET = 15, LASER = 15, ENERGY = 15, BOMB = 15, BIO = 15, RAD = 15, FIRE = 70, ACID = 70) actions_types = list(/datum/action/item_action/hands_free/activate) allowed = list( /obj/item/abductor, @@ -27,8 +27,8 @@ var/stealth_active = 0 var/combat_cooldown = 10 var/datum/icon_snapshot/disguise - var/stealth_armor = list("melee" = 15, "bullet" = 15, "laser" = 15, "energy" = 15, "bomb" = 15, "bio" = 15, "rad" = 15, "fire" = 70, "acid" = 70) - var/combat_armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 50, "rad" = 50, "fire" = 90, "acid" = 90) + var/stealth_armor = list(MELEE = 15, BULLET = 15, LASER = 15, ENERGY = 15, BOMB = 15, BIO = 15, RAD = 15, FIRE = 70, ACID = 70) + var/combat_armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 50, BIO = 50, RAD = 50, FIRE = 90, ACID = 90) /obj/item/clothing/suit/armor/abductor/vest/Initialize() . = ..() diff --git a/code/modules/antagonists/blob/blob/blobs/core.dm b/code/modules/antagonists/blob/blob/blobs/core.dm index ef7c01a781..317dcb2522 100644 --- a/code/modules/antagonists/blob/blob/blobs/core.dm +++ b/code/modules/antagonists/blob/blob/blobs/core.dm @@ -4,7 +4,7 @@ icon_state = "blank_blob" desc = "A huge, pulsating yellow mass." max_integrity = 400 - armor = list("melee" = 30, "bullet" = 30, "laser" = 20, "energy" = 5, "bomb" = 70, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 90) // Last stand + armor = list(MELEE = 30, BULLET = 30, LASER = 20, ENERGY = 5, BOMB = 70, BIO = 0, RAD = 0, FIRE = 75, ACID = 90) // Last stand explosion_block = 6 point_return = -1 health_regen = 0 //we regen in Life() instead of when pulsed @@ -47,7 +47,7 @@ /obj/structure/blob/core/ex_act(severity, target, origin) var/damage = 50 - 10 * severity //remember, the core takes half brute damage, so this is 20/15/10 damage based on severity - take_damage(damage, BRUTE, "bomb", 0) + take_damage(damage, BRUTE, BOMB, 0) /obj/structure/blob/core/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir, overmind_reagent_trigger = 1) . = ..() diff --git a/code/modules/antagonists/blob/blob/blobs/factory.dm b/code/modules/antagonists/blob/blob/blobs/factory.dm index dfb3c6d71b..ae2c7f53ef 100644 --- a/code/modules/antagonists/blob/blob/blobs/factory.dm +++ b/code/modules/antagonists/blob/blob/blobs/factory.dm @@ -6,7 +6,7 @@ max_integrity = 200 health_regen = 1 point_return = 25 - armor = list("melee" = 10, "bullet" = 20, "laser" = 15, "energy" = 10, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) + armor = list(MELEE = 10, BULLET = 20, LASER = 15, ENERGY = 10, BOMB = 40, BIO = 0, RAD = 0, FIRE = 90, ACID = 90) var/list/spores = list() var/mob/living/simple_animal/hostile/blob/blobbernaut/naut = null var/max_spores = 3 diff --git a/code/modules/antagonists/blob/blob/blobs/node.dm b/code/modules/antagonists/blob/blob/blobs/node.dm index 14fbc741c0..d88e5e794c 100644 --- a/code/modules/antagonists/blob/blob/blobs/node.dm +++ b/code/modules/antagonists/blob/blob/blobs/node.dm @@ -4,7 +4,7 @@ icon_state = "blank_blob" desc = "A large, pulsating yellow mass." max_integrity = 200 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 65, "acid" = 90) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 65, ACID = 90) health_regen = 3 point_return = 25 diff --git a/code/modules/antagonists/blob/blob/blobs/resource.dm b/code/modules/antagonists/blob/blob/blobs/resource.dm index 2ed9744327..ea5c6b14a5 100644 --- a/code/modules/antagonists/blob/blob/blobs/resource.dm +++ b/code/modules/antagonists/blob/blob/blobs/resource.dm @@ -5,7 +5,7 @@ desc = "A thin spire of slightly swaying tendrils." max_integrity = 60 point_return = 15 - armor = list("melee" = 10, "bullet" = 10, "laser" = 0, "energy" = 0, "bomb" = 15, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) + armor = list(MELEE = 10, BULLET = 10, LASER = 0, ENERGY = 0, BOMB = 15, BIO = 0, RAD = 0, FIRE = 90, ACID = 90) var/resource_delay = 0 /obj/structure/blob/resource/scannerreport() diff --git a/code/modules/antagonists/blob/blob/blobs/shield.dm b/code/modules/antagonists/blob/blob/blobs/shield.dm index 38e6edc6d4..4dbbeb4708 100644 --- a/code/modules/antagonists/blob/blob/blobs/shield.dm +++ b/code/modules/antagonists/blob/blob/blobs/shield.dm @@ -9,7 +9,7 @@ explosion_block = 3 point_return = 4 atmosblock = TRUE - armor = list("melee" = 25, "bullet" = 25, "laser" = 15, "energy" = 10, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) + armor = list(MELEE = 25, BULLET = 25, LASER = 15, ENERGY = 10, BOMB = 20, BIO = 0, RAD = 0, FIRE = 90, ACID = 90) var/weakened /obj/structure/blob/shield/scannerreport() @@ -28,7 +28,7 @@ desc = "[damaged_desc]" atmosblock = FALSE if(!weakened) - armor = armor.setRating("melee" = 15, "bullet" = 15, "laser" = 5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) + armor = armor.setRating(MELEE = 15, BULLET = 15, LASER = 5, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 90, ACID = 90) weakened = TRUE else icon_state = initial(icon_state) @@ -36,7 +36,7 @@ desc = initial(desc) atmosblock = TRUE if(weakened) - armor = armor.setRating("melee" = 25, "bullet" = 25, "laser" = 15, "energy" = 10, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) + armor = armor.setRating(MELEE = 25, BULLET = 25, LASER = 15, ENERGY = 10, BOMB = 20, BIO = 0, RAD = 0, FIRE = 90, ACID = 90) weakened = FALSE air_update_turf(1) diff --git a/code/modules/antagonists/blob/blob/blobstrains/blazing_oil.dm b/code/modules/antagonists/blob/blob/blobstrains/blazing_oil.dm index f97e271e72..be08266687 100644 --- a/code/modules/antagonists/blob/blob/blobstrains/blazing_oil.dm +++ b/code/modules/antagonists/blob/blob/blobstrains/blazing_oil.dm @@ -14,15 +14,15 @@ reagent = /datum/reagent/blob/blazing_oil /datum/blobstrain/reagent/blazing_oil/extinguish_reaction(obj/structure/blob/B) - B.take_damage(1.5, BURN, "energy") + B.take_damage(1.5, BURN, ENERGY) /datum/blobstrain/reagent/blazing_oil/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) - if(damage_type == BURN && damage_flag != "energy") + if(damage_type == BURN && damage_flag != ENERGY) for(var/turf/open/T in range(1, B)) var/obj/structure/blob/C = locate() in T if(!(C && C.overmind && C.overmind.blobstrain.type == B.overmind.blobstrain.type) && prob(80)) new /obj/effect/hotspot(T) - if(damage_flag == "fire") + if(damage_flag == FIRE) return 0 return ..() diff --git a/code/modules/antagonists/blob/blob/blobstrains/electromagnetic_web.dm b/code/modules/antagonists/blob/blob/blobstrains/electromagnetic_web.dm index 7a1715cb4a..f2b00a981e 100644 --- a/code/modules/antagonists/blob/blob/blobstrains/electromagnetic_web.dm +++ b/code/modules/antagonists/blob/blob/blobstrains/electromagnetic_web.dm @@ -17,7 +17,7 @@ return damage * 1.25 //a laser will do 25 damage, which will kill any normal blob /datum/blobstrain/reagent/electromagnetic_web/death_reaction(obj/structure/blob/B, damage_flag) - if(damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") + if(damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) empulse_using_range(B.loc, 5) //less than screen range, so you can stand out of range to avoid it /datum/reagent/blob/electromagnetic_web diff --git a/code/modules/antagonists/blob/blob/blobstrains/energized_jelly.dm b/code/modules/antagonists/blob/blob/blobstrains/energized_jelly.dm index 66ce3c303d..c22b429e1b 100644 --- a/code/modules/antagonists/blob/blob/blobstrains/energized_jelly.dm +++ b/code/modules/antagonists/blob/blob/blobstrains/energized_jelly.dm @@ -10,7 +10,7 @@ reagent = /datum/reagent/blob/energized_jelly /datum/blobstrain/reagent/energized_jelly/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) - if((damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") && B.obj_integrity - damage <= 0 && prob(10)) + if((damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) && B.obj_integrity - damage <= 0 && prob(10)) do_sparks(rand(2, 4), FALSE, B) return ..() @@ -19,7 +19,7 @@ /datum/blobstrain/reagent/energized_jelly/emp_reaction(obj/structure/blob/B, severity) var/damage = rand(30, 50) - severity * rand(10, 15) - B.take_damage(damage, BURN, "energy") + B.take_damage(damage, BURN, ENERGY) /datum/reagent/blob/energized_jelly name = "Energized Jelly" diff --git a/code/modules/antagonists/blob/blob/blobstrains/explosive_lattice.dm b/code/modules/antagonists/blob/blob/blobstrains/explosive_lattice.dm index 3d005ba913..c805069a9c 100644 --- a/code/modules/antagonists/blob/blob/blobstrains/explosive_lattice.dm +++ b/code/modules/antagonists/blob/blob/blobstrains/explosive_lattice.dm @@ -12,9 +12,9 @@ reagent = /datum/reagent/blob/explosive_lattice /datum/blobstrain/reagent/explosive_lattice/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) - if(damage_flag == "bomb") + if(damage_flag == BOMB) return 0 - else if(damage_flag != "melee" && damage_flag != "bullet" && damage_flag != "laser") + else if(damage_flag != MELEE && damage_flag != BULLET && damage_flag != LASER) return damage * 1.5 return ..() diff --git a/code/modules/antagonists/blob/blob/blobstrains/pressurized_slime.dm b/code/modules/antagonists/blob/blob/blobstrains/pressurized_slime.dm index 11477712e7..6b19ff2257 100644 --- a/code/modules/antagonists/blob/blob/blobstrains/pressurized_slime.dm +++ b/code/modules/antagonists/blob/blob/blobstrains/pressurized_slime.dm @@ -13,12 +13,12 @@ reagent = /datum/reagent/blob/pressurized_slime /datum/blobstrain/reagent/pressurized_slime/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) - if((damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") || damage_type != BURN) + if((damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) || damage_type != BURN) extinguisharea(B, damage) return ..() /datum/blobstrain/reagent/pressurized_slime/death_reaction(obj/structure/blob/B, damage_flag) - if(damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") + if(damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) B.visible_message("The blob ruptures, spraying the area with liquid!") extinguisharea(B, 50) diff --git a/code/modules/antagonists/blob/blob/blobstrains/reactive_spines.dm b/code/modules/antagonists/blob/blob/blobstrains/reactive_spines.dm index fca56d1402..84ff383dd1 100644 --- a/code/modules/antagonists/blob/blob/blobstrains/reactive_spines.dm +++ b/code/modules/antagonists/blob/blob/blobstrains/reactive_spines.dm @@ -13,7 +13,7 @@ /datum/blobstrain/reagent/reactive_spines/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) if(damage && damage_type == BRUTE && B.obj_integrity - damage > 0) //is there any damage, is it brute, and will we be alive - if(damage_flag == "melee") + if(damage_flag == MELEE) B.visible_message("The blob retaliates, lashing out!") for(var/atom/A in range(1, B)) A.blob_act(B) diff --git a/code/modules/antagonists/blob/blob/blobstrains/shifting_fragments.dm b/code/modules/antagonists/blob/blob/blobstrains/shifting_fragments.dm index 9265158e1b..d4930a9a61 100644 --- a/code/modules/antagonists/blob/blob/blobstrains/shifting_fragments.dm +++ b/code/modules/antagonists/blob/blob/blobstrains/shifting_fragments.dm @@ -14,7 +14,7 @@ B.forceMove(T) /datum/blobstrain/reagent/shifting_fragments/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) - if((damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") && damage > 0 && B.obj_integrity - damage > 0 && prob(60-damage)) + if((damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) && damage > 0 && B.obj_integrity - damage > 0 && prob(60-damage)) var/list/blobstopick = list() for(var/obj/structure/blob/OB in orange(1, B)) if((istype(OB, /obj/structure/blob/normal) || (istype(OB, /obj/structure/blob/shield) && prob(25))) && OB.overmind && OB.overmind.blobstrain.type == B.overmind.blobstrain.type) diff --git a/code/modules/antagonists/blob/blob/blobstrains/synchronous_mesh.dm b/code/modules/antagonists/blob/blob/blobstrains/synchronous_mesh.dm index daad0068e2..ad6b36cf42 100644 --- a/code/modules/antagonists/blob/blob/blobstrains/synchronous_mesh.dm +++ b/code/modules/antagonists/blob/blob/blobstrains/synchronous_mesh.dm @@ -11,7 +11,7 @@ message = "The blobs strike you" /datum/blobstrain/reagent/synchronous_mesh/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) - if(damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") //the cause isn't fire or bombs, so split the damage + if(damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) //the cause isn't fire or bombs, so split the damage var/damagesplit = 1 //maximum split is 9, reducing the damage each blob takes to 11% but doing that damage to 9 blobs for(var/obj/structure/blob/C in orange(1, B)) if(!istype(C, /obj/structure/blob/core) && !istype(C, /obj/structure/blob/node) && C.overmind && C.overmind.blobstrain.type == B.overmind.blobstrain.type) //if it doesn't have the same chemical or is a core or node, don't split damage to it diff --git a/code/modules/antagonists/blob/blob/blobstrains/zombifying_pods.dm b/code/modules/antagonists/blob/blob/blobstrains/zombifying_pods.dm index b2bb9d5115..6fba19b487 100644 --- a/code/modules/antagonists/blob/blob/blobstrains/zombifying_pods.dm +++ b/code/modules/antagonists/blob/blob/blobstrains/zombifying_pods.dm @@ -12,7 +12,7 @@ reagent = /datum/reagent/blob/zombifying_pods /datum/blobstrain/reagent/zombifying_pods/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) - if((damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") && damage <= 20 && B.obj_integrity - damage <= 0 && prob(30)) //if the cause isn't fire or a bomb, the damage is less than 21, we're going to die from that damage, 20% chance of a shitty spore. + if((damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) && damage <= 20 && B.obj_integrity - damage <= 0 && prob(30)) //if the cause isn't fire or a bomb, the damage is less than 21, we're going to die from that damage, 20% chance of a shitty spore. B.visible_message("A spore floats free of the blob!") var/mob/living/simple_animal/hostile/blob/blobspore/weak/BS = new/mob/living/simple_animal/hostile/blob/blobspore/weak(B.loc) BS.overmind = B.overmind diff --git a/code/modules/antagonists/blob/blob/theblob.dm b/code/modules/antagonists/blob/blob/theblob.dm index 8ca7e65c3f..361ae58062 100644 --- a/code/modules/antagonists/blob/blob/theblob.dm +++ b/code/modules/antagonists/blob/blob/theblob.dm @@ -11,7 +11,7 @@ CanAtmosPass = ATMOS_PASS_PROC var/point_return = 0 //How many points the blob gets back when it removes a blob of that type. If less than 0, blob cannot be removed. max_integrity = 30 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 70) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 70) var/health_regen = 2 //how much health this blob regens when pulsed var/pulse_timestamp = 0 //we got pulsed when? var/heal_timestamp = 0 //we got healed when? @@ -210,9 +210,9 @@ . = ..() if(overmind) if(overmind.blobstrain.tesla_reaction(src, power)) - take_damage(power/400, BURN, "energy") + take_damage(power/400, BURN, ENERGY) else - take_damage(power/400, BURN, "energy") + take_damage(power/400, BURN, ENERGY) /obj/structure/blob/extinguish() ..() diff --git a/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm b/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm index 881da8f282..d58190cf66 100644 --- a/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm +++ b/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm @@ -54,7 +54,7 @@ resistance_flags = NONE max_integrity = 100 integrity_failure = 0.5 - armor = list("melee" = 50, "bullet" = 20, "laser" = 30, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 60) + armor = list(MELEE = 50, BULLET = 20, LASER = 30, ENERGY = 0, BOMB = 50, BIO = 0, RAD = 0, FIRE = 70, ACID = 60) /obj/structure/closet/crate/coffin/meatcoffin name = "meat coffin" @@ -69,7 +69,7 @@ material_drop = /obj/item/reagent_containers/food/snacks/meat/slab material_drop_amount = 3 integrity_failure = 0.57 - armor = list("melee" = 70, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 70, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 100) + armor = list(MELEE = 70, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 70, BIO = 0, RAD = 0, FIRE = 70, ACID = 100) /obj/structure/closet/crate/coffin/metalcoffin name = "metal coffin" @@ -85,7 +85,7 @@ material_drop_amount = 5 max_integrity = 200 integrity_failure = 0.25 - armor = list("melee" = 40, "bullet" = 15, "laser" = 50, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 60) + armor = list(MELEE = 40, BULLET = 15, LASER = 50, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 70, ACID = 60) ////////////////////////////////////////////// diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index ec95ee4ef6..36653a1385 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -503,7 +503,7 @@ item_flags = DROPDEL clothing_flags = STOPSPRESSUREDAMAGE //Not THICKMATERIAL because it's organic tissue, so if somebody tries to inject something into it, it still ends up in your blood. (also balance but muh fluff) allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/oxygen) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) //No armor at all. + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 90, ACID = 90) //No armor at all. mutantrace_variation = NONE /obj/item/clothing/suit/space/changeling/Initialize() @@ -524,7 +524,7 @@ desc = "A covering of pressure and temperature-resistant organic tissue with a glass-like chitin front." item_flags = DROPDEL clothing_flags = STOPSPRESSUREDAMAGE - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 90, ACID = 90) flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH /obj/item/clothing/head/helmet/space/changeling/Initialize() @@ -558,7 +558,7 @@ icon_state = "lingarmor" item_flags = DROPDEL body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS - armor = list("melee" = 70, "bullet" = 60, "laser" = 30, "energy" = 40, "bomb" = 10, "bio" = 4, "rad" = 0, "fire" = 50, "acid" = 90) + armor = list(MELEE = 70, BULLET = 60, LASER = 30, ENERGY = 40, BOMB = 10, BIO = 4, RAD = 0, FIRE = 50, ACID = 90) flags_inv = HIDEJUMPSUIT cold_protection = 0 heat_protection = 0 @@ -574,7 +574,7 @@ desc = "A tough, hard covering of black chitin with transparent chitin in front." icon_state = "lingarmorhelmet" item_flags = DROPDEL - armor = list("melee" = 70, "bullet" = 60, "laser" = 30, "energy" = 40, "bomb" = 10, "bio" = 4, "rad" = 0, "fire" = 50, "acid" = 90) + armor = list(MELEE = 70, BULLET = 60, LASER = 30, ENERGY = 40, BOMB = 10, BIO = 4, RAD = 0, FIRE = 50, ACID = 90) flags_inv = HIDEEARS|HIDEHAIR|HIDEEYES|HIDEFACIALHAIR|HIDEFACE /obj/item/clothing/head/helmet/changeling/Initialize() @@ -653,7 +653,7 @@ cold_protection = HANDS min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT - armor = list("melee" = 20, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 35, "bio" = 35, "rad" = 35, "fire" = 0, "acid" = 0) + armor = list(MELEE = 20, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 35, BIO = 35, RAD = 35, FIRE = 0, ACID = 0) /obj/item/clothing/gloves/claws/Initialize() . = ..() @@ -697,7 +697,7 @@ cold_protection = ARMS|HANDS min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT - armor = list("melee" = 20, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 35, "bio" = 35, "rad" = 35, "fire" = 0, "acid" = 0) + armor = list(MELEE = 20, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 35, BIO = 35, RAD = 35, FIRE = 0, ACID = 0) enhancement = 6 // first, do harm. all of it. all of the harm. just fuck em up. wound_enhancement = 6 var/fast_enhancement = 6 diff --git a/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_shield.dm b/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_shield.dm index 1b6979300f..47105938e6 100644 --- a/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_shield.dm +++ b/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_shield.dm @@ -7,7 +7,7 @@ item_state = "ratvarian_shield" desc = "A resilient shield made out of brass.. It feels warm to the touch." var/clockwork_desc = "A powerful shield of ratvarian making. It absorbs blocked attacks to charge devastating bashes." - armor = list("melee" = 80, "bullet" = 70, "laser" = -10, "energy" = -20, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) + armor = list(MELEE = 80, BULLET = 70, LASER = -10, ENERGY = -20, BOMB = 60, BIO = 0, RAD = 0, FIRE = 100, ACID = 100) shield_flags = SHIELD_FLAGS_DEFAULT | SHIELD_KINETIC_STRONG | SHIELD_ENERGY_WEAK max_integrity = 300 //High integrity, extremely strong against melee / bullets, but still quite easy to destroy with lasers and energy repair_material = /obj/item/stack/tile/brass diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm index b5f2a358e6..bacf014e14 100644 --- a/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm +++ b/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm @@ -8,7 +8,7 @@ resistance_flags = FIRE_PROOF | ACID_PROOF flags_inv = HIDEEARS|HIDEHAIR|HIDEFACE|HIDESNOUT mutantrace_variation = STYLE_MUZZLE - armor = list("melee" = 50, "bullet" = 70, "laser" = 0, "energy" = 0, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100, "magic" = 60, "wound" = 65) + armor = list(MELEE = 50, BULLET = 70, LASER = 0, ENERGY = 0, BOMB = 60, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, MAGIC = 60, WOUND = 65) /obj/item/clothing/head/helmet/clockwork/Initialize() . = ..() @@ -68,7 +68,7 @@ cold_protection = CHEST|GROIN|LEGS heat_protection = CHEST|GROIN|LEGS resistance_flags = FIRE_PROOF | ACID_PROOF - armor = list("melee" = 60, "bullet" = 70, "laser" = 0, "energy" = 0, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100, "magic" = 60, "wound" = 65) + armor = list(MELEE = 60, BULLET = 70, LASER = 0, ENERGY = 0, BOMB = 60, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, MAGIC = 60, WOUND = 65) allowed = list(/obj/item/clockwork, /obj/item/clothing/glasses/wraith_spectacles, /obj/item/clothing/glasses/judicial_visor, /obj/item/mmi/posibrain/soul_vessel, /obj/item/reagent_containers/food/drinks/bottle/holyoil) mutantrace_variation = STYLE_DIGITIGRADE|STYLE_SNEK_TAURIC @@ -135,7 +135,7 @@ siemens_coefficient = 0 permeability_coefficient = 0.05 resistance_flags = FIRE_PROOF | ACID_PROOF - armor = list("melee" = 80, "bullet" = 70, "laser" = 0, "energy" = 0, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100, "magic" = 70, "wound" = 85) + armor = list(MELEE = 80, BULLET = 70, LASER = 0, ENERGY = 0, BOMB = 60, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, MAGIC = 70, WOUND = 85) /obj/item/clothing/gloves/clockwork/Initialize() . = ..() diff --git a/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm b/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm index 44c57b77ad..496f6c0e6c 100644 --- a/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm +++ b/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm @@ -199,7 +199,7 @@ /obj/structure/destructible/clockwork/massive/celestial_gateway/ex_act(severity, target, origin) var/damage = max((obj_integrity * 0.7) / severity, 100) //requires multiple bombs to take down - take_damage(damage, BRUTE, "bomb", 0) + take_damage(damage, BRUTE, BOMB, 0) /obj/structure/destructible/clockwork/massive/celestial_gateway/proc/get_arrival_time(var/deciseconds = TRUE) if(seconds_until_activation) @@ -301,7 +301,7 @@ for(var/obj/O in orange(1, src)) if(!O.pulledby && !iseffect(O) && O.density) if(!step_away(O, src, 2) || get_dist(O, src) < 2) - O.take_damage(50, BURN, "bomb") + O.take_damage(50, BURN, BOMB) O.update_icon() conversion_pulse() //Converts the nearby area into clockcult-style diff --git a/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm b/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm index 44699b17ed..48b5876144 100644 --- a/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm +++ b/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm @@ -77,7 +77,7 @@ L.IgniteMob() else if(ismecha(target)) var/obj/vehicle/sealed/mecha/M = target - M.take_damage(damage_per_tick * get_efficiency_mod(), BURN, "melee", 1, get_dir(src, M)) + M.take_damage(damage_per_tick * get_efficiency_mod(), BURN, MELEE, 1, get_dir(src, M)) new /obj/effect/temp_visual/ratvar/ocular_warden(get_turf(target)) diff --git a/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm b/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm index ab4294df85..26000ef5f8 100644 --- a/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm +++ b/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm @@ -70,7 +70,7 @@ else var/obj/vehicle/sealed/mecha/M = locate() in get_turf(src) if(M) - M.take_damage(50,BRUTE,"melee") + M.take_damage(50,BRUTE,MELEE) M.visible_message("A massive brass spike erupts from the ground, penetrating \the [M] and shattering the trap into pieces!") addtimer(CALLBACK(src, .proc/take_damage, max_integrity), 1) else diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index 20e41828d4..2bfbe2be98 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -297,7 +297,7 @@ desc = "A torn, dust-caked hood. Strange letters line the inside." flags_inv = HIDEFACE|HIDEHAIR|HIDEEARS flags_cover = HEADCOVERSEYES - armor = list("melee" = 40, "bullet" = 30, "laser" = 40,"energy" = 20, "bomb" = 65, "bio" = 10, "rad" = 0, "fire" = 10, "acid" = 10) + armor = list(MELEE = 40, BULLET = 30, LASER = 40,ENERGY = 20, BOMB = 65, BIO = 10, RAD = 0, FIRE = 10, ACID = 10) cold_protection = HEAD min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT heat_protection = HEAD @@ -310,7 +310,7 @@ item_state = "cultrobes" body_parts_covered = CHEST|GROIN|LEGS|ARMS allowed = list(/obj/item/tome, /obj/item/melee/cultblade) - armor = list("melee" = 40, "bullet" = 30, "laser" = 40,"energy" = 20, "bomb" = 65, "bio" = 10, "rad" = 0, "fire" = 10, "acid" = 10) + armor = list(MELEE = 40, BULLET = 30, LASER = 40,ENERGY = 20, BOMB = 65, BIO = 10, RAD = 0, FIRE = 10, ACID = 10) flags_inv = HIDEJUMPSUIT cold_protection = CHEST|GROIN|LEGS|ARMS min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT @@ -350,7 +350,7 @@ item_state = "magus" desc = "A helm worn by the followers of Nar'Sie." flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDEEARS|HIDEEYES|HIDESNOUT - armor = list("melee" = 30, "bullet" = 30, "laser" = 30,"energy" = 20, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 10, "acid" = 10) + armor = list(MELEE = 30, BULLET = 30, LASER = 30,ENERGY = 20, BOMB = 0, BIO = 0, RAD = 0, FIRE = 10, ACID = 10) flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH mutantrace_variation = STYLE_MUZZLE @@ -361,7 +361,7 @@ item_state = "magusred" body_parts_covered = CHEST|GROIN|LEGS|ARMS allowed = list(/obj/item/tome, /obj/item/melee/cultblade) - armor = list("melee" = 50, "bullet" = 30, "laser" = 50,"energy" = 20, "bomb" = 25, "bio" = 10, "rad" = 0, "fire" = 10, "acid" = 10) + armor = list(MELEE = 50, BULLET = 30, LASER = 50,ENERGY = 20, BOMB = 25, BIO = 10, RAD = 0, FIRE = 10, ACID = 10) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT /obj/item/clothing/head/helmet/space/hardsuit/cult @@ -369,7 +369,7 @@ desc = "A heavily-armored helmet worn by warriors of the Nar'Sien cult. It can withstand hard vacuum." icon_state = "cult_helmet" item_state = "cult_helmet" - armor = list("melee" = 60, "bullet" = 50, "laser" = 30,"energy" = 15, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 40, "acid" = 75) + armor = list(MELEE = 60, BULLET = 50, LASER = 30,ENERGY = 15, BOMB = 30, BIO = 30, RAD = 30, FIRE = 40, ACID = 75) brightness_on = 0 actions_types = list() @@ -385,7 +385,7 @@ desc = "A heavily-armored exosuit worn by warriors of the Nar'Sien cult. It can withstand hard vacuum." w_class = WEIGHT_CLASS_BULKY allowed = list(/obj/item/tome, /obj/item/melee/cultblade, /obj/item/tank/internals/) - armor = list("melee" = 70, "bullet" = 50, "laser" = 30,"energy" = 15, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 40, "acid" = 75) + armor = list(MELEE = 70, BULLET = 50, LASER = 30,ENERGY = 15, BOMB = 30, BIO = 30, RAD = 30, FIRE = 40, ACID = 75) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/cult /obj/item/clothing/suit/space/hardsuit/cult/ComponentInitialize() @@ -413,7 +413,7 @@ icon_state = "cult_armor" item_state = "cult_armor" w_class = WEIGHT_CLASS_BULKY - armor = list("melee" = 50, "bullet" = 40, "laser" = 50,"energy" = 30, "bomb" = 50, "bio" = 30, "rad" = 30, "fire" = 50, "acid" = 60) + armor = list(MELEE = 50, BULLET = 40, LASER = 50,ENERGY = 30, BOMB = 50, BIO = 30, RAD = 30, FIRE = 50, ACID = 60) body_parts_covered = CHEST|GROIN|LEGS|ARMS allowed = list(/obj/item/tome, /obj/item/melee/cultblade) var/current_charges = 3 @@ -423,7 +423,7 @@ name = "empowered cultist armor" desc = "Empowered garb which creates a powerful shield around the user." icon_state = "cult_hoodalt" - armor = list("melee" = 50, "bullet" = 40, "laser" = 50,"energy" = 30, "bomb" = 50, "bio" = 30, "rad" = 30, "fire" = 50, "acid" = 50) + armor = list(MELEE = 50, BULLET = 40, LASER = 50,ENERGY = 30, BOMB = 50, BIO = 30, RAD = 30, FIRE = 50, ACID = 50) body_parts_covered = HEAD flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS @@ -473,7 +473,7 @@ flags_inv = HIDEJUMPSUIT allowed = list(/obj/item/tome, /obj/item/melee/cultblade) body_parts_covered = CHEST|GROIN|LEGS|ARMS - armor = list("melee" = -50, "bullet" = -50, "laser" = -50,"energy" = -50, "bomb" = -50, "bio" = -50, "rad" = -50, "fire" = 0, "acid" = 0) + armor = list(MELEE = -50, BULLET = -50, LASER = -50,ENERGY = -50, BOMB = -50, BIO = -50, RAD = -50, FIRE = 0, ACID = 0) slowdown = -1 hoodtype = /obj/item/clothing/head/hooded/berserkerhood @@ -483,7 +483,7 @@ icon_state = "culthood" body_parts_covered = HEAD flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS - armor = list("melee" = -50, "bullet" = -50, "laser" = -50, "energy" = -50, "bomb" = -50, "bio" = -50, "rad" = -50, "fire" = 0, "acid" = 0) + armor = list(MELEE = -50, BULLET = -50, LASER = -50, ENERGY = -50, BOMB = -50, BIO = -50, RAD = -50, FIRE = 0, ACID = 0) /obj/item/clothing/suit/hooded/cultrobes/berserker/equipped(mob/living/user, slot) ..() diff --git a/code/modules/antagonists/eldritch_cult/eldritch_items.dm b/code/modules/antagonists/eldritch_cult/eldritch_items.dm index c0f3e2be7c..7a304cfa14 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_items.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_items.dm @@ -177,7 +177,7 @@ allowed = list(/obj/item/melee/sickly_blade, /obj/item/forbidden_book, /obj/item/living_heart) hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/eldritch // slightly better than normal cult robes - armor = list("melee" = 50, "bullet" = 50, "laser" = 50,"energy" = 50, "bomb" = 35, "bio" = 20, "rad" = 0, "fire" = 20, "acid" = 20) + armor = list(MELEE = 50, BULLET = 50, LASER = 50,ENERGY = 50, BOMB = 35, BIO = 20, RAD = 0, FIRE = 20, ACID = 20) mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/reagent_containers/glass/beaker/eldritch @@ -193,7 +193,7 @@ flags_inv = NONE flags_cover = NONE desc = "Black like tar, doesn't reflect any light. Runic symbols line the outside, with each flash you lose comprehension of what you are seeing." - armor = list("melee" = 30, "bullet" = 30, "laser" = 30,"energy" = 30, "bomb" = 15, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 30, BULLET = 30, LASER = 30,ENERGY = 30, BOMB = 15, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) obj_flags = NONE | EXAMINE_SKIP /obj/item/clothing/suit/hooded/cultrobes/void @@ -205,7 +205,7 @@ hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/void flags_inv = NONE // slightly worse than normal cult robes - armor = list("melee" = 30, "bullet" = 30, "laser" = 30,"energy" = 30, "bomb" = 15, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 30, BULLET = 30, LASER = 30,ENERGY = 30, BOMB = 15, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) pocket_storage_component_path = /datum/component/storage/concrete/pockets/void_cloak mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON diff --git a/code/modules/antagonists/eldritch_cult/eldritch_magic.dm b/code/modules/antagonists/eldritch_cult/eldritch_magic.dm index bee2747626..18cec15a6d 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_magic.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_magic.dm @@ -406,7 +406,7 @@ if(M in hit_list) continue hit_list += M - M.take_damage(45, BURN, "melee", 1) + M.take_damage(45, BURN, MELEE, 1) sleep(1.5) /obj/effect/proc_holder/spell/targeted/shapeshift/eldritch diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm index eb98635e65..8c030d160c 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm @@ -612,7 +612,7 @@ This is here to make the tiles around the station mininuke change when it's arme icon_state = "nucleardisk" persistence_replacement = /obj/item/disk/nuclear/fake max_integrity = 250 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 30, BIO = 0, RAD = 0, FIRE = 100, ACID = 100) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF var/fake = FALSE var/turf/lastlocation diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 5ea4be80cb..de0135519c 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -75,7 +75,7 @@ req_access = list(ACCESS_ATMOSPHERICS) max_integrity = 250 integrity_failure = 0.33 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 30) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 90, ACID = 30) resistance_flags = FIRE_PROOF var/danger_level = 0 diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index 6f45599463..49fc0322df 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -55,7 +55,7 @@ normalize_cardinal_directions() nodes = new(device_type) if (!armor) - armor = list("melee" = 25, "bullet" = 10, "laser" = 10, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 70) + armor = list(MELEE = 25, BULLET = 10, LASER = 10, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 100, ACID = 70) ..() if(process) if(interacts_with_air) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index c652a7f791..26086ce39c 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -4,7 +4,7 @@ icon_state = "pod-off" density = TRUE max_integrity = 350 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 30, "acid" = 30) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 30, ACID = 30) layer = ABOVE_WINDOW_LAYER plane = GAME_PLANE state_open = FALSE diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm index 80a8ee4bf3..98cb1bdf62 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm @@ -7,7 +7,7 @@ density = TRUE max_integrity = 300 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 30) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 80, ACID = 30) layer = OBJ_LAYER plane = GAME_PLANE circuit = /obj/item/circuitboard/machine/thermomachine diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm index c17c93ab95..e7ea86851b 100644 --- a/code/modules/atmospherics/machinery/other/meter.dm +++ b/code/modules/atmospherics/machinery/other/meter.dm @@ -9,7 +9,7 @@ idle_power_usage = 2 active_power_usage = 4 max_integrity = 150 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 40, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 40, ACID = 0) var/frequency = 0 var/atom/target var/id_tag diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm index e286cbbe7f..a514606e4d 100644 --- a/code/modules/atmospherics/machinery/pipes/pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/pipes.dm @@ -109,7 +109,7 @@ . = list(parent) /obj/machinery/atmospherics/pipe/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) - if(damage_flag == "melee" && damage_amount < 12) + if(damage_flag == MELEE && damage_amount < 12) return 0 . = ..() diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 868c5dafa3..f7bdc173f3 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -6,7 +6,7 @@ icon_state = "yellow" density = TRUE volume = 1000 - armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 100, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 50) + armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 100, BOMB = 10, BIO = 100, RAD = 100, FIRE = 80, ACID = 50) max_integrity = 250 integrity_failure = 0.4 pressure_resistance = 7 * ONE_ATMOSPHERE diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index 93dc414968..9f5dc87c30 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -3,7 +3,7 @@ icon = 'icons/obj/atmos.dmi' use_power = NO_POWER_USE max_integrity = 250 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 60, "acid" = 30) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 60, ACID = 30) anchored = FALSE var/datum/gas_mixture/air_contents diff --git a/code/modules/awaymissions/mission_code/jungleresort.dm b/code/modules/awaymissions/mission_code/jungleresort.dm index f520cfdbee..89d178af21 100644 --- a/code/modules/awaymissions/mission_code/jungleresort.dm +++ b/code/modules/awaymissions/mission_code/jungleresort.dm @@ -19,7 +19,7 @@ icon_state = "whip" /obj/item/clothing/suit/hooded/wintercoat/captain/jungle - armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0) /obj/item/clothing/head/rice_hat/cursed // this was a stupid idea lmao name = "cursed rice hat" diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm index ba3f07bd7d..1362c7818a 100644 --- a/code/modules/awaymissions/mission_code/snowdin.dm +++ b/code/modules/awaymissions/mission_code/snowdin.dm @@ -532,7 +532,7 @@ /obj/item/clothing/under/syndicate/coldres name = "insulated tactical turtleneck" desc = "A nondescript and slightly suspicious-looking turtleneck with digital camouflage cargo pants. The interior has been padded with special insulation for both warmth and protection." - armor = list("melee" = 20, "bullet" = 10, "laser" = 0,"energy" = 5, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 25, "acid" = 25) + armor = list(MELEE = 20, BULLET = 10, LASER = 0,ENERGY = 5, BOMB = 0, BIO = 0, RAD = 0, FIRE = 25, ACID = 25) cold_protection = CHEST|GROIN|ARMS|LEGS min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT diff --git a/code/modules/cargo/supplypod.dm b/code/modules/cargo/supplypod.dm index 2bdd84141c..404e9871d9 100644 --- a/code/modules/cargo/supplypod.dm +++ b/code/modules/cargo/supplypod.dm @@ -11,7 +11,7 @@ allow_dense = TRUE delivery_icon = null can_weld_shut = FALSE - armor = list("melee" = 30, "bullet" = 50, "laser" = 50, "energy" = 100, "bomb" = 100, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 80) + armor = list(MELEE = 30, BULLET = 50, LASER = 50, ENERGY = 100, BOMB = 100, BIO = 0, RAD = 0, FIRE = 100, ACID = 80) anchored = TRUE //So it cant slide around after landing anchorable = FALSE flags_1 = PREVENT_CONTENTS_EXPLOSION_1 diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index 697afd4885..742b58827f 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -279,7 +279,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/under/chameleon) sensor_flags = NONE resistance_flags = NONE can_adjust = FALSE - armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50) var/datum/action/item_action/chameleon/change/chameleon_action @@ -314,7 +314,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/suit/chameleon) item_state = "armor" blood_overlay_type = "armor" resistance_flags = NONE - armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50) var/datum/action/item_action/chameleon/change/chameleon_action @@ -342,7 +342,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/glasses/chameleon) icon_state = "meson" item_state = "meson" resistance_flags = NONE - armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50) var/datum/action/item_action/chameleon/change/chameleon_action @@ -371,7 +371,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/gloves/chameleon) item_state = "ygloves" resistance_flags = NONE - armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50) var/datum/action/item_action/chameleon/change/chameleon_action @@ -402,7 +402,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/head/chameleon) icon_state = "greysoft" resistance_flags = NONE - armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50) var/datum/action/item_action/chameleon/change/chameleon_action @@ -427,7 +427,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/head/chameleon) /obj/item/clothing/head/chameleon/drone // The camohat, I mean, holographic hat projection, is part of the // drone itself. - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) // which means it offers no protection, it's just air and light /obj/item/clothing/head/chameleon/drone/Initialize() @@ -445,7 +445,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/mask/chameleon) icon_state = "gas_alt" item_state = "gas_alt" resistance_flags = NONE - armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50) clothing_flags = BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR gas_transfer_coefficient = 0.01 @@ -480,7 +480,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/mask/chameleon) /obj/item/clothing/mask/chameleon/drone //Same as the drone chameleon hat, undroppable and no protection - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) // Can drones use the voice changer part? Let's not find out. voice_change = 0 @@ -502,7 +502,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/shoes/chameleon) desc = "A pair of black shoes." permeability_coefficient = 0.05 resistance_flags = NONE - armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50) pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes var/datum/action/item_action/chameleon/change/chameleon_action @@ -643,7 +643,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/neck/cloak/chameleon) icon = 'icons/obj/clothing/neck.dmi' icon_state = "blacktie" resistance_flags = NONE - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50) /obj/item/clothing/neck/cloak/chameleon var/datum/action/item_action/chameleon/change/chameleon_action diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 572cce28b2..d4bf92a59b 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -185,7 +185,7 @@ body_parts_covered &= ~i if(body_parts_covered == NONE) // if there are no more parts to break then the whole thing is kaput - obj_destruction((damage_type == BRUTE ? "melee" : "laser")) // melee/laser is good enough since this only procs from direct attacks anyway and not from fire/bombs + obj_destruction((damage_type == BRUTE ? MELEE : LASER)) // melee/laser is good enough since this only procs from direct attacks anyway and not from fire/bombs return damaged_clothes = CLOTHING_DAMAGED @@ -425,13 +425,13 @@ BLIND // can't see anything /obj/item/clothing/obj_destruction(damage_flag) - if(damage_flag == "bomb") + if(damage_flag == BOMB) var/turf/T = get_turf(src) spawn(1) //so the shred survives potential turf change from the explosion. var/obj/effect/decal/cleanable/shreds/Shreds = new(T) Shreds.desc = "The sad remains of what used to be [name]." deconstruct(FALSE) - else if(!(damage_flag in list("acid", "fire"))) + else if(!(damage_flag in list(ACID, FIRE))) damaged_clothes = CLOTHING_SHREDDED body_parts_covered = NONE name = "shredded [initial(name)]" diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 9726ab6b59..3466268ae2 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -112,7 +112,7 @@ actions_types = list(/datum/action/item_action/toggle_research_scanner) glass_colour_type = /datum/client_colour/glass_colour/purple resistance_flags = ACID_PROOF - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 100) /obj/item/clothing/glasses/science/item_action_slot_check(slot, mob/user, datum/action/A) if(slot == ITEM_SLOT_EYES) diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index 1e3f2c08cf..e1066940a4 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -211,7 +211,7 @@ heat_protection = HANDS max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT strip_delay = 60 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 50) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 70, ACID = 50) /obj/item/clothing/gloves/color/latex name = "latex gloves" diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 381e70161b..401f6804c4 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -114,7 +114,7 @@ icon_state = "narsiearmwraps" item_state = "narsiearmwraps" resistance_flags = FIRE_PROOF | ACID_PROOF - armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 35, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 35, RAD = 0, FIRE = 50, ACID = 50) enhancement = 3 secondary_trait = TRAIT_KI_VAMPIRE @@ -124,7 +124,7 @@ icon_state = "ratvararmwraps" item_state = "ratvararmwraps" resistance_flags = FIRE_PROOF | ACID_PROOF - armor = list("melee" = 10, "bullet" = 0, "laser" = -10, "energy" = 0, "bomb" = 0, "bio" = 35, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list(MELEE = 10, BULLET = 0, LASER = -10, ENERGY = 0, BOMB = 0, BIO = 35, RAD = 0, FIRE = 50, ACID = 50) enhancement = 4 //The artifice of Ratvar is unmatched except when it is. secondary_trait = TRAIT_STRONG_GRABBER @@ -252,7 +252,7 @@ cold_protection = ARMS|HANDS min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT - armor = list("melee" = 30, "bullet" = 30, "laser" = 10, "energy" = 10, "bomb" = 55, "bio" = 15, "rad" = 15, "fire" = 80, "acid" = 50) + armor = list(MELEE = 30, BULLET = 30, LASER = 10, ENERGY = 10, BOMB = 55, BIO = 15, RAD = 15, FIRE = 80, ACID = 50) siemens_coefficient = 0 permeability_coefficient = 0.05 strip_delay = 80 @@ -297,7 +297,7 @@ heat_protection = HANDS max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT resistance_flags = NONE - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 30) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 70, ACID = 30) strip_mod = 0.9 /obj/item/clothing/gloves/combat @@ -313,7 +313,7 @@ heat_protection = HANDS max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT resistance_flags = NONE - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 50) strip_mod = 1.5 /obj/item/clothing/gloves/bracer @@ -329,7 +329,7 @@ min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT resistance_flags = NONE - armor = list("melee" = 15, "bullet" = 35, "laser" = 35, "energy" = 20, "bomb" = 35, "bio" = 35, "rad" = 35, "fire" = 0, "acid" = 0) + armor = list(MELEE = 15, BULLET = 35, LASER = 35, ENERGY = 20, BOMB = 35, BIO = 35, RAD = 35, FIRE = 0, ACID = 0) /obj/item/clothing/gloves/thief name = "black gloves" diff --git a/code/modules/clothing/head/beanie.dm b/code/modules/clothing/head/beanie.dm index 365624bc0d..3e53b3aaa5 100644 --- a/code/modules/clothing/head/beanie.dm +++ b/code/modules/clothing/head/beanie.dm @@ -72,7 +72,7 @@ name = "durathread beanie" desc = "A beanie made from durathread, its resilient fibres provide some protection to the wearer." icon_state = "beaniedurathread" - armor = list("melee" = 25, "bullet" = 10, "laser" = 20,"energy" = 10, "bomb" = 30, "bio" = 15, "rad" = 20, "fire" = 100, "acid" = 50) + armor = list(MELEE = 25, BULLET = 10, LASER = 20,ENERGY = 10, BOMB = 30, BIO = 15, RAD = 20, FIRE = 100, ACID = 50) /obj/item/clothing/head/beanie/waldo name = "red striped bobble hat" diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 95ce887693..ae8b3a90f1 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -8,7 +8,7 @@ var/power_on = 0.8 var/on = FALSE var/hat_type = "yellow" //Determines used sprites: hardhat[on]_[hat_type] and hardhat[on]_[hat_type]2 (lying down sprite) - armor = list("melee" = 15, "bullet" = 5, "laser" = 20,"energy" = 10, "bomb" = 20, "bio" = 10, "rad" = 20, "fire" = 100, "acid" = 50) + armor = list(MELEE = 15, BULLET = 5, LASER = 20,ENERGY = 10, BOMB = 20, BIO = 10, RAD = 20, FIRE = 100, ACID = 50) flags_inv = 0 actions_types = list(/datum/action/item_action/toggle_helmet_light) resistance_flags = FIRE_PROOF diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 126b1af40f..ff78b51909 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -3,7 +3,7 @@ desc = "Standard Security gear. Protects the head from impacts." icon_state = "helmet" item_state = "helmet" - armor = list("melee" = 40, "bullet" = 30, "laser" = 30,"energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list(MELEE = 40, BULLET = 30, LASER = 30,ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50) flags_inv = HIDEEARS cold_protection = HEAD min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT @@ -74,7 +74,7 @@ desc = "A bulletproof combat helmet that excels in protecting the wearer against traditional projectile weaponry and explosives to a minor extent." icon_state = "helmetalt" item_state = "helmetalt" - armor = list("melee" = 15, "bullet" = 60, "laser" = 10, "energy" = 10, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list(MELEE = 15, BULLET = 60, LASER = 10, ENERGY = 10, BOMB = 40, BIO = 0, RAD = 0, FIRE = 50, ACID = 50) can_flashlight = 1 dog_fashion = null @@ -98,7 +98,7 @@ toggle_message = "You pull the visor down on" alt_toggle_message = "You push the visor up on" can_toggle = 1 - armor = list("melee" = 45, "bullet" = 15, "laser" = 5,"energy" = 5, "bomb" = 5, "bio" = 2, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list(MELEE = 45, BULLET = 15, LASER = 5,ENERGY = 5, BOMB = 5, BIO = 2, RAD = 0, FIRE = 50, ACID = 50) flags_inv = HIDEEARS|HIDEFACE strip_delay = 80 actions_types = list(/datum/action/item_action/toggle) @@ -154,7 +154,7 @@ desc = "An extremely robust, space-worthy helmet in a nefarious red and black stripe pattern." icon_state = "swatsyndie" item_state = "swatsyndie" - armor = list("melee" = 40, "bullet" = 30, "laser" = 30,"energy" = 30, "bomb" = 50, "bio" = 90, "rad" = 20, "fire" = 50, "acid" = 50) + armor = list(MELEE = 40, BULLET = 30, LASER = 30,ENERGY = 30, BOMB = 50, BIO = 90, RAD = 20, FIRE = 50, ACID = 50) cold_protection = HEAD min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT heat_protection = HEAD @@ -175,7 +175,7 @@ flags_inv = HIDEEARS|HIDEHAIR icon_state = "thunderdome" item_state = "thunderdome" - armor = list("melee" = 40, "bullet" = 30, "laser" = 25,"energy" = 10, "bomb" = 25, "bio" = 10, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list(MELEE = 40, BULLET = 30, LASER = 25,ENERGY = 10, BOMB = 25, BIO = 10, RAD = 0, FIRE = 50, ACID = 50) cold_protection = HEAD min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT heat_protection = HEAD @@ -188,7 +188,7 @@ desc = "An ancient helmet made of bronze and leather." flags_inv = HIDEEARS|HIDEHAIR flags_cover = HEADCOVERSEYES - armor = list("melee" = 25, "bullet" = 0, "laser" = 25, "energy" = 10, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) + armor = list(MELEE = 25, BULLET = 0, LASER = 25, ENERGY = 10, BOMB = 10, BIO = 0, RAD = 0, FIRE = 100, ACID = 50) resistance_flags = FIRE_PROOF icon_state = "roman" item_state = "roman" @@ -197,7 +197,7 @@ /obj/item/clothing/head/helmet/roman/fake desc = "An ancient helmet made of plastic and leather." - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) /obj/item/clothing/head/helmet/roman/legionnaire name = "\improper Roman legionnaire helmet" @@ -207,7 +207,7 @@ /obj/item/clothing/head/helmet/roman/legionnaire/fake desc = "An ancient helmet made of plastic and leather. Has a red crest on top of it." - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) /obj/item/clothing/head/helmet/gladiator name = "gladiator helmet" @@ -224,7 +224,7 @@ icon_state = "redtaghelm" flags_cover = HEADCOVERSEYES item_state = "redtaghelm" - armor = list("melee" = 15, "bullet" = 10, "laser" = 20,"energy" = 10, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50) + armor = list(MELEE = 15, BULLET = 10, LASER = 20,ENERGY = 10, BOMB = 20, BIO = 0, RAD = 0, FIRE = 0, ACID = 50) // Offer about the same protection as a hardhat. dog_fashion = null @@ -234,7 +234,7 @@ icon_state = "bluetaghelm" flags_cover = HEADCOVERSEYES item_state = "bluetaghelm" - armor = list("melee" = 15, "bullet" = 10, "laser" = 20,"energy" = 10, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50) + armor = list(MELEE = 15, BULLET = 10, LASER = 20,ENERGY = 10, BOMB = 20, BIO = 0, RAD = 0, FIRE = 0, ACID = 50) // Offer about the same protection as a hardhat. dog_fashion = null @@ -243,7 +243,7 @@ desc = "A classic metal helmet." icon_state = "knight_green" item_state = "knight_green" - armor = list("melee" = 41, "bullet" = 15, "laser" = 5,"energy" = 5, "bomb" = 5, "bio" = 2, "rad" = 0, "fire" = 0, "acid" = 50) + armor = list(MELEE = 41, BULLET = 15, LASER = 5,ENERGY = 5, BOMB = 5, BIO = 2, RAD = 0, FIRE = 0, ACID = 50) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH strip_delay = 80 @@ -273,7 +273,7 @@ desc = "A classic medieval helmet, if you hold it upside down you could see that it's actually a bucket." icon_state = "knight_greyscale" item_state = "knight_greyscale" - armor = list("melee" = 35, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 10, "bio" = 10, "rad" = 10, "fire" = 40, "acid" = 40) + armor = list(MELEE = 35, BULLET = 10, LASER = 10, ENERGY = 10, BOMB = 10, BIO = 10, RAD = 10, FIRE = 40, ACID = 40) material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS //Can change color and add prefix /obj/item/clothing/head/helmet/skull @@ -281,7 +281,7 @@ desc = "An intimidating tribal helmet, it doesn't look very comfortable." flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE flags_cover = HEADCOVERSEYES - armor = list("melee" = 25, "bullet" = 25, "laser" = 25, "energy" = 10, "bomb" = 10, "bio" = 5, "rad" = 20, "fire" = 40, "acid" = 20) + armor = list(MELEE = 25, BULLET = 25, LASER = 25, ENERGY = 10, BOMB = 10, BIO = 5, RAD = 20, FIRE = 40, ACID = 20) icon_state = "skull" item_state = "skull" strip_delay = 100 @@ -292,7 +292,7 @@ desc = "An insidious armored combat helmet signed with Syndicate insignia. The visor is coated with a resistant paste guaranteed to withstand bright flashes perfectly." icon_state = "infiltrator" item_state = "infiltrator" - armor = list("melee" = 40, "bullet" = 40, "laser" = 30, "energy" = 40, "bomb" = 70, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list(MELEE = 40, BULLET = 40, LASER = 30, ENERGY = 40, BOMB = 70, BIO = 0, RAD = 0, FIRE = 50, ACID = 50) resistance_flags = FIRE_PROOF | ACID_PROOF flash_protect = 2 flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT @@ -396,14 +396,14 @@ desc = "A hardhat with strips of leather and durathread for additional blunt protection." icon_state = "durathread" item_state = "durathread" - armor = list("melee" = 25, "bullet" = 10, "laser" = 20,"energy" = 10, "bomb" = 30, "bio" = 15, "rad" = 20, "fire" = 100, "acid" = 50) + armor = list(MELEE = 25, BULLET = 10, LASER = 20,ENERGY = 10, BOMB = 30, BIO = 15, RAD = 20, FIRE = 100, ACID = 50) /obj/item/clothing/head/helmet/rus_helmet name = "russian helmet" desc = "It can hold a bottle of vodka." icon_state = "rus_helmet" item_state = "rus_helmet" - armor = list("melee" = 30, "bullet" = 25, "laser" = 20,"energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 20, "fire" = 30, "acid" = 50) + armor = list(MELEE = 30, BULLET = 25, LASER = 20,ENERGY = 10, BOMB = 25, BIO = 0, RAD = 20, FIRE = 30, ACID = 50) pocket_storage_component_path = /datum/component/storage/concrete/pockets/small/rushelmet /obj/item/clothing/head/helmet/rus_ushanka @@ -415,7 +415,7 @@ body_parts_covered = HEAD cold_protection = HEAD min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT - armor = list("melee" = 10, "bullet" = 5, "laser" = 5,"energy" = 5, "bomb" = 5, "bio" = 50, "rad" = 20, "fire" = -10, "acid" = 0) + armor = list(MELEE = 10, BULLET = 5, LASER = 5,ENERGY = 5, BOMB = 5, BIO = 50, RAD = 20, FIRE = -10, ACID = 0) /obj/item/clothing/head/helmet/police name = "police officer's hat" diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 592614af61..979dc8ec5a 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -33,7 +33,7 @@ icon_state = "captain" item_state = "that" flags_inv = 0 - armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list(MELEE = 40, BULLET = 30, LASER = 30, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50) strip_delay = 60 dog_fashion = /datum/dog_fashion/head/captain @@ -65,7 +65,7 @@ name = "head of personnel's cap" icon_state = "hopcap" desc = "The symbol of true bureaucratic micromanagement." - armor = list("melee" = 30, "bullet" = 25, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list(MELEE = 30, BULLET = 25, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50) dog_fashion = /datum/dog_fashion/head/hop /obj/item/clothing/head/hopcap/beret @@ -93,7 +93,7 @@ /obj/item/clothing/head/fedora/det_hat name = "detective's fedora" desc = "There's only one man who can sniff out the dirty stench of crime, and he's likely wearing this hat." - armor = list("melee" = 25, "bullet" = 5, "laser" = 25, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 50) + armor = list(MELEE = 25, BULLET = 5, LASER = 25, ENERGY = 10, BOMB = 0, BIO = 0, RAD = 0, FIRE = 30, ACID = 50) icon_state = "detective" var/candy_cooldown = 0 pocket_storage_component_path = /datum/component/storage/concrete/pockets/small/detective @@ -157,7 +157,7 @@ name = "head of security cap" desc = "The robust standard-issue cap of the Head of Security. For showing the officers who's in charge." icon_state = "hoscap" - armor = list("melee" = 40, "bullet" = 30, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 10, "rad" = 0, "fire" = 50, "acid" = 60) + armor = list(MELEE = 40, BULLET = 30, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 10, RAD = 0, FIRE = 50, ACID = 60) strip_delay = 80 dynamic_hair_suffix = "" @@ -183,7 +183,7 @@ name = "warden's police hat" desc = "It's a special armored hat issued to the Warden of a security force. Protects the head from impacts." icon_state = "policehelm" - armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 60) + armor = list(MELEE = 40, BULLET = 30, LASER = 30, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 30, ACID = 60) strip_delay = 60 dog_fashion = /datum/dog_fashion/head/warden @@ -258,7 +258,7 @@ name = "security beret" desc = "A robust beret with the security insignia emblazoned on it. Uses reinforced fabric to offer sufficient protection." icon_state = "beret_badge" - armor = list("melee" = 40, "bullet" = 30, "laser" = 30,"energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list(MELEE = 40, BULLET = 30, LASER = 30,ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50) strip_delay = 60 dog_fashion = null @@ -368,7 +368,7 @@ name = "durathread beret" desc = "A beret made from durathread, its resilient fibres provide some protection to the wearer." icon_state = "beretdurathread" - armor = list("melee" = 25, "bullet" = 10, "laser" = 20,"energy" = 10, "bomb" = 30, "bio" = 15, "rad" = 20, "fire" = 100, "acid" = 50) + armor = list(MELEE = 25, BULLET = 10, LASER = 20,ENERGY = 10, BOMB = 30, BIO = 15, RAD = 20, FIRE = 100, ACID = 50) #undef DRILL_DEFAULT #undef DRILL_SHOUTING diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index eb48048c00..b83cfdc66b 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -6,7 +6,7 @@ desc = "It's good to be emperor." item_state = "that" flags_inv = 0 - armor = list("melee" = 30, "bullet" = 15, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list(MELEE = 30, BULLET = 15, LASER = 30, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50) strip_delay = 80 /obj/item/clothing/head/spacepolice @@ -301,7 +301,7 @@ name = "crown" desc = "A crown fit for a king, a petty king maybe." icon_state = "crown" - armor = list("melee" = 15, "bullet" = 0, "laser" = 0,"energy" = 15, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) + armor = list(MELEE = 15, BULLET = 0, LASER = 0,ENERGY = 15, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50) resistance_flags = FIRE_PROOF dynamic_hair_suffix = "" @@ -458,7 +458,7 @@ desc = "Ain't nobody gonna cheat the hangman in my town." icon_state = "hunter" item_state = "hunter" - armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 15, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 15, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) resistance_flags = FIRE_PROOF | ACID_PROOF /obj/item/clothing/head/kepi diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 21cec4f7d2..c0ff26342e 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -22,7 +22,7 @@ custom_materials = list(/datum/material/iron=1750, /datum/material/glass=400) flash_protect = 2 tint = 2 - armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 60) + armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 60) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE actions_types = list(/datum/action/item_action/toggle) visor_flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE @@ -45,7 +45,7 @@ hat_type = "cakehat" hitsound = 'sound/weapons/tap.ogg' flags_inv = HIDEEARS|HIDEHAIR - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) brightness_on = 2 //luminosity when on flags_cover = HEADCOVERSEYES heat = 1000 @@ -131,7 +131,7 @@ item_state = "hardhat0_pumpkin" hat_type = "pumpkin" flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) brightness_on = 2 //luminosity when on flags_cover = HEADCOVERSEYES @@ -169,7 +169,7 @@ item_state = "hardhat0_reindeer" hat_type = "reindeer" flags_inv = 0 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) brightness_on = 1 //luminosity when on dynamic_hair_suffix = "" @@ -245,14 +245,14 @@ icon = 'icons/obj/clothing/clockwork_garb.dmi' icon_state = "clockwork_helmet_old" flags_inv = HIDEEARS|HIDEHAIR - armor = list("melee" = 5, "bullet" = 0, "laser" = -5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 20) + armor = list(MELEE = 5, BULLET = 0, LASER = -5, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 20, ACID = 20) /obj/item/clothing/head/foilhat name = "tinfoil hat" desc = "Thought control rays, psychotronic scanning. Don't mind that, I'm protected cause I made this hat." icon_state = "foilhat" item_state = "foilhat" - armor = list("melee" = 0, "bullet" = 0, "laser" = -5,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = -5, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = -5,ENERGY = 0, BOMB = 0, BIO = 0, RAD = -5, FIRE = 0, ACID = 0) equip_delay_other = 140 var/datum/brain_trauma/mild/phobia/conspiracies/paranoia var/warped = FALSE @@ -320,7 +320,7 @@ name = "flak helmet" icon_state = "m1helm" item_state = "helmet" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0.1, "bio" = 0, "rad" = 0, "fire" = -10, "acid" = -15) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0.1, BIO = 0, RAD = 0, FIRE = -10, ACID = -15) desc = "A dilapidated helmet used in ancient wars. This one is brittle and essentially useless. An ace of spades is tucked into the band around the outer shell." pocket_storage_component_path = /datum/component/storage/concrete/pockets/tiny/spacenam //So you can stuff other things in the elastic band instead of it simply being a fluff thing. diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index 084d39a9b5..5569da96eb 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -119,7 +119,7 @@ desc = "It's a robust baseball hat in tasteful red colour." icon_state = "secsoft" soft_type = "sec" - armor = list("melee" = 30, "bullet" = 25, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 50) + armor = list(MELEE = 30, BULLET = 25, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 20, ACID = 50) strip_delay = 60 dog_fashion = null @@ -137,6 +137,6 @@ soft_type = "baseball" item_state = "baseballsoft" flags_inv = HIDEEYES|HIDEFACE - armor = list("melee" = 35, "bullet" = 35, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 90) + armor = list(MELEE = 35, BULLET = 35, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 20, ACID = 90) strip_delay = 90 //You dont take a Major Leage cap dog_fashion = null diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm index 6701b53c10..324562c1a5 100644 --- a/code/modules/clothing/masks/boxing.dm +++ b/code/modules/clothing/masks/boxing.dm @@ -26,7 +26,7 @@ flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR visor_flags_inv = HIDEFACE|HIDEFACIALHAIR w_class = WEIGHT_CLASS_SMALL - armor = list("melee" = 10, "bullet" = 5, "laser" = 5,"energy" = 5, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 30, "acid" = 30) + armor = list(MELEE = 10, BULLET = 5, LASER = 5,ENERGY = 5, BOMB = 0, BIO = 0, RAD = 10, FIRE = 30, ACID = 30) resistance_flags = FIRE_PROOF | ACID_PROOF mutantrace_variation = STYLE_MUZZLE var/voice_unknown = TRUE ///This makes it so that your name shows up as unknown when wearing the mask. diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index d78488ec0b..2519b9b89e 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -41,7 +41,7 @@ custom_materials = list(/datum/material/iron=4000, /datum/material/glass=2000) flash_protect = 2 tint = 2 - armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 55) + armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 55) actions_types = list(/datum/action/item_action/toggle) flags_inv = HIDEEARS|HIDEEYES|HIDEFACE flags_cover = MASKCOVERSEYES @@ -68,7 +68,7 @@ desc = "A modernised version of the classic design, this mask will not only filter out toxins but it can also be connected to an air supply." icon_state = "plaguedoctor" item_state = "gas_mask" - armor = list("melee" = 0, "bullet" = 0, "laser" = 2,"energy" = 2, "bomb" = 0, "bio" = 75, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 2,ENERGY = 2, BOMB = 0, BIO = 75, RAD = 0, FIRE = 0, ACID = 0) /obj/item/clothing/mask/gas/syndicate name = "syndicate mask" diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 45da6a9a75..cb0e490849 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -29,7 +29,7 @@ visor_flags_cover = MASKCOVERSMOUTH gas_transfer_coefficient = 0.9 permeability_coefficient = 0.01 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 25, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 25, RAD = 0, FIRE = 0, ACID = 0) actions_types = list(/datum/action/item_action/adjust) mutantrace_variation = STYLE_MUZZLE @@ -41,7 +41,7 @@ visor_flags_inv = null visor_flags_cover = null permeability_coefficient = 1 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) /obj/item/clothing/mask/surgical/attack_self(mob/user) adjustmask(user) diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 7a67308760..1a3f6446ff 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -12,7 +12,7 @@ item_state = "jackboots" lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' - armor = list("melee" = 25, "bullet" = 25, "laser" = 25, "energy" = 25, "bomb" = 50, "bio" = 10, "rad" = 0, "fire" = 70, "acid" = 50) + armor = list(MELEE = 25, BULLET = 25, LASER = 25, ENERGY = 25, BOMB = 50, BIO = 10, RAD = 0, FIRE = 70, ACID = 50) strip_delay = 70 resistance_flags = NONE permeability_coefficient = 0.05 //Thick soles, and covers the ankle @@ -40,7 +40,7 @@ desc = "High speed, no drag combat boots." permeability_coefficient = 0.01 clothing_flags = NOSLIP - armor = list("melee" = 40, "bullet" = 30, "laser" = 25, "energy" = 25, "bomb" = 50, "bio" = 30, "rad" = 30, "fire" = 90, "acid" = 50) + armor = list(MELEE = 40, BULLET = 30, LASER = 25, ENERGY = 25, BOMB = 50, BIO = 30, RAD = 30, FIRE = 90, ACID = 50) /obj/item/clothing/shoes/sandal desc = "A pair of rather plain wooden sandals." @@ -73,7 +73,7 @@ strip_delay = 50 equip_delay_other = 50 resistance_flags = NONE - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 40, "acid" = 75) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 40, ACID = 75) custom_price = PRICE_ABOVE_EXPENSIVE can_be_tied = FALSE diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm index cba27845f1..dbcda218a7 100644 --- a/code/modules/clothing/spacesuits/_spacesuits.dm +++ b/code/modules/clothing/spacesuits/_spacesuits.dm @@ -7,7 +7,7 @@ clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS item_state = "spaceold" permeability_coefficient = 0.01 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 50, "fire" = 80, "acid" = 70, "wound" = 5) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 100, RAD = 50, FIRE = 80, ACID = 70, WOUND = 5) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT dynamic_hair_suffix = "" dynamic_fhair_suffix = "" @@ -36,7 +36,7 @@ body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS allowed = list(/obj/item/flashlight, /obj/item/tank/internals) slowdown = 1 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 50, "fire" = 80, "acid" = 70, "wound" = 5) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 100, RAD = 50, FIRE = 80, ACID = 70, WOUND = 5) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAUR cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index e30b0953c6..5ec0fad2e6 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -4,7 +4,7 @@ icon_state = "chronohelmet" item_state = "chronohelmet" slowdown = 1 - armor = list("melee" = 60, "bullet" = 60, "laser" = 60, "energy" = 60, "bomb" = 30, "bio" = 90, "rad" = 90, "fire" = 100, "acid" = 100, "wound" = 80) + armor = list(MELEE = 60, BULLET = 60, LASER = 60, ENERGY = 60, BOMB = 30, BIO = 90, RAD = 90, FIRE = 100, ACID = 100, WOUND = 80) resistance_flags = FIRE_PROOF | ACID_PROOF var/obj/item/clothing/suit/space/chronos/suit = null @@ -19,7 +19,7 @@ icon_state = "chronosuit" item_state = "chronosuit" actions_types = list(/datum/action/item_action/toggle) - armor = list("melee" = 60, "bullet" = 60, "laser" = 60, "energy" = 60, "bomb" = 30, "bio" = 90, "rad" = 90, "fire" = 100, "acid" = 1000, "wound" = 80) + armor = list(MELEE = 60, BULLET = 60, LASER = 60, ENERGY = 60, BOMB = 30, BIO = 90, RAD = 90, FIRE = 100, ACID = 1000, WOUND = 80) resistance_flags = FIRE_PROOF | ACID_PROOF mutantrace_variation = STYLE_DIGITIGRADE var/list/chronosafe_items = list(/obj/item/chrono_eraser, /obj/item/gun/energy/chrono_gun) diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index d8a6426295..bf0a91534c 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -5,7 +5,7 @@ icon_state = "hardsuit0-engineering" item_state = "eng_helm" max_integrity = 300 - armor = list("melee" = 10, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 50, "acid" = 75, "wound" = 10) + armor = list(MELEE = 10, BULLET = 5, LASER = 10, ENERGY = 5, BOMB = 10, BIO = 100, RAD = 75, FIRE = 50, ACID = 75, WOUND = 10) var/basestate = "hardsuit" var/brightness_on = 4 //luminosity when on var/on = FALSE @@ -98,7 +98,7 @@ icon_state = "hardsuit-engineering" item_state = "eng_hardsuit" max_integrity = 300 - armor = list("melee" = 10, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 50, "acid" = 75, "wound" = 10) + armor = list(MELEE = 10, BULLET = 5, LASER = 10, ENERGY = 5, BOMB = 10, BIO = 100, RAD = 75, FIRE = 50, ACID = 75, WOUND = 10) allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/t_scanner, /obj/item/construction/rcd, /obj/item/pipe_dispenser) siemens_coefficient = 0 var/obj/item/clothing/head/helmet/space/hardsuit/helmet @@ -167,7 +167,7 @@ desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has radiation shielding." icon_state = "hardsuit0-engineering" item_state = "eng_helm" - armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 100, "acid" = 75, "wound" = 10) + armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 5, BOMB = 10, BIO = 100, RAD = 75, FIRE = 100, ACID = 75, WOUND = 10) hardsuit_type = "engineering" resistance_flags = FIRE_PROOF @@ -176,7 +176,7 @@ desc = "A special suit that protects against hazardous, low pressure environments. Has radiation shielding." icon_state = "hardsuit-engineering" item_state = "eng_hardsuit" - armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 100, "acid" = 75, "wound" = 10) + armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 5, BOMB = 10, BIO = 100, RAD = 75, FIRE = 100, ACID = 75, WOUND = 10) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine resistance_flags = FIRE_PROOF mutantrace_variation = STYLE_DIGITIGRADE|STYLE_ALL_TAURIC @@ -188,7 +188,7 @@ icon_state = "hardsuit0-atmospherics" item_state = "atmo_helm" hardsuit_type = "atmospherics" - armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 25, "fire" = 100, "acid" = 75, "wound" = 10) + armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 5, BOMB = 10, BIO = 100, RAD = 25, FIRE = 100, ACID = 75, WOUND = 10) heat_protection = HEAD //Uncomment to enable firesuit protection max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT @@ -197,7 +197,7 @@ desc = "A special suit that protects against hazardous, low pressure environments. Has thermal shielding." icon_state = "hardsuit-atmospherics" item_state = "atmo_hardsuit" - armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 25, "fire" = 100, "acid" = 75, "wound" = 10) + armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 5, BOMB = 10, BIO = 100, RAD = 25, FIRE = 100, ACID = 75, WOUND = 10) heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/atmos @@ -209,7 +209,7 @@ icon_state = "hardsuit0-white" item_state = "ce_helm" hardsuit_type = "white" - armor = list("melee" = 40, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 90, "wound" = 10) + armor = list(MELEE = 40, BULLET = 5, LASER = 10, ENERGY = 5, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 90, WOUND = 10) heat_protection = HEAD max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT @@ -218,7 +218,7 @@ name = "advanced hardsuit" desc = "An advanced suit that protects against hazardous, low pressure environments. Shines with a high polish." item_state = "ce_hardsuit" - armor = list("melee" = 40, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 90, "wound" = 10) + armor = list(MELEE = 40, BULLET = 5, LASER = 10, ENERGY = 5, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 90, WOUND = 10) heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/elite @@ -234,7 +234,7 @@ max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF heat_protection = HEAD - armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 75, "wound" = 15) + armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 5, BOMB = 50, BIO = 100, RAD = 50, FIRE = 50, ACID = 75, WOUND = 15) brightness_on = 7 allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator) @@ -265,7 +265,7 @@ hardsuit_type = "mining" max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF - armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 75, "wound" = 15) + armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 5, BOMB = 50, BIO = 100, RAD = 50, FIRE = 50, ACID = 75, WOUND = 15) allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage/bag/ore, /obj/item/pickaxe) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/mining heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS @@ -298,7 +298,7 @@ icon_state = "hardsuit1-syndi" item_state = "syndie_helm" hardsuit_type = "syndi" - armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 90, "wound" = 25) + armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 15, BOMB = 35, BIO = 100, RAD = 50, FIRE = 50, ACID = 90, WOUND = 25) on = FALSE var/obj/item/clothing/suit/space/hardsuit/syndi/linkedsuit = null actions_types = list(/datum/action/item_action/toggle_helmet_mode) @@ -376,7 +376,7 @@ item_state = "syndie_hardsuit" hardsuit_type = "syndi" w_class = WEIGHT_CLASS_NORMAL - armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 90, "wound" = 25) + armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 15, BOMB = 35, BIO = 100, RAD = 50, FIRE = 50, ACID = 90, WOUND = 25) allowed = list(/obj/item/gun, /obj/item/ammo_box,/obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi jetpack = /obj/item/tank/jetpack/suit @@ -389,7 +389,7 @@ alt_desc = "An elite version of the syndicate helmet, with improved armour and fireproofing. It is in combat mode. Property of Gorlex Marauders." icon_state = "hardsuit0-syndielite" hardsuit_type = "syndielite" - armor = list("melee" = 60, "bullet" = 60, "laser" = 50, "energy" = 25, "bomb" = 55, "bio" = 100, "rad" = 70, "fire" = 100, "acid" = 100, "wound" = 25) + armor = list(MELEE = 60, BULLET = 60, LASER = 50, ENERGY = 25, BOMB = 55, BIO = 100, RAD = 70, FIRE = 100, ACID = 100, WOUND = 25) heat_protection = HEAD max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF @@ -407,7 +407,7 @@ icon_state = "hardsuit0-syndielite" hardsuit_type = "syndielite" helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite - armor = list("melee" = 60, "bullet" = 60, "laser" = 50, "energy" = 25, "bomb" = 55, "bio" = 100, "rad" = 70, "fire" = 100, "acid" = 100, "wound" = 25) + armor = list(MELEE = 60, BULLET = 60, LASER = 50, ENERGY = 25, BOMB = 55, BIO = 100, RAD = 70, FIRE = 100, ACID = 100, WOUND = 25) heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF @@ -447,7 +447,7 @@ item_state = "wiz_helm" hardsuit_type = "wiz" resistance_flags = FIRE_PROOF | ACID_PROOF //No longer shall our kind be foiled by lone chemists with spray bottles! - armor = list("melee" = 40, "bullet" = 40, "laser" = 40, "energy" = 20, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100, "wound" = 30) + armor = list(MELEE = 40, BULLET = 40, LASER = 40, ENERGY = 20, BOMB = 35, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, WOUND = 30) heat_protection = HEAD //Uncomment to enable firesuit protection max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT @@ -462,7 +462,7 @@ item_state = "wiz_hardsuit" w_class = WEIGHT_CLASS_NORMAL resistance_flags = FIRE_PROOF | ACID_PROOF - armor = list("melee" = 40, "bullet" = 40, "laser" = 40, "energy" = 20, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100, "wound" = 30) + armor = list(MELEE = 40, BULLET = 40, LASER = 40, ENERGY = 20, BOMB = 35, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, WOUND = 30) allowed = list(/obj/item/teleportation_scroll, /obj/item/tank/internals) heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT @@ -482,7 +482,7 @@ item_state = "medical_helm" hardsuit_type = "medical" flash_protect = 0 - armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 75, "wound" = 10) + armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 5, BOMB = 10, BIO = 100, RAD = 60, FIRE = 60, ACID = 75, WOUND = 10) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS | SCAN_REAGENTS @@ -505,7 +505,7 @@ item_state = "medical_hardsuit" slowdown = 0.8 allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage/firstaid, /obj/item/healthanalyzer, /obj/item/stack/medical) - armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 75, "wound" = 10) + armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 5, BOMB = 10, BIO = 100, RAD = 60, FIRE = 60, ACID = 75, WOUND = 10) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/medical mutantrace_variation = STYLE_DIGITIGRADE|STYLE_ALL_TAURIC @@ -517,7 +517,7 @@ hardsuit_type = "rd" resistance_flags = ACID_PROOF | FIRE_PROOF max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT - armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 100, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 80, "wound" = 15) + armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 5, BOMB = 100, BIO = 100, RAD = 60, FIRE = 60, ACID = 80, WOUND = 15) var/obj/machinery/doppler_array/integrated/bomb_radar clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS | SCAN_REAGENTS actions_types = list(/datum/action/item_action/toggle_helmet_light, /datum/action/item_action/toggle_research_scanner) @@ -547,7 +547,7 @@ max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT //Same as an emergency firesuit. Not ideal for extended exposure. allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/gun/energy/wormhole_projector, /obj/item/hand_tele, /obj/item/aicard) - armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 100, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 80, "wound" = 15) + armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 5, BOMB = 100, BIO = 100, RAD = 60, FIRE = 60, ACID = 80, WOUND = 15) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/rd //Security hardsuit @@ -557,14 +557,14 @@ icon_state = "hardsuit0-sec" item_state = "sec_helm" hardsuit_type = "sec" - armor = list("melee" = 35, "bullet" = 15, "laser" = 30,"energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75, "wound" = 20) + armor = list(MELEE = 35, BULLET = 15, LASER = 30,ENERGY = 10, BOMB = 10, BIO = 100, RAD = 50, FIRE = 75, ACID = 75, WOUND = 20) /obj/item/clothing/suit/space/hardsuit/security icon_state = "hardsuit-sec" name = "security hardsuit" desc = "A special suit that protects against hazardous, low pressure environments. Has an additional layer of armor." item_state = "sec_hardsuit" - armor = list("melee" = 35, "bullet" = 15, "laser" = 30, "energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75, "wound" = 20) + armor = list(MELEE = 35, BULLET = 15, LASER = 30, ENERGY = 10, BOMB = 10, BIO = 100, RAD = 50, FIRE = 75, ACID = 75, WOUND = 20) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security mutantrace_variation = STYLE_DIGITIGRADE|STYLE_ALL_TAURIC @@ -578,13 +578,13 @@ desc = "A special bulky helmet designed for work in a hazardous, low pressure environment. Has an additional layer of armor." icon_state = "hardsuit0-hos" hardsuit_type = "hos" - armor = list("melee" = 45, "bullet" = 25, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 100, "rad" = 50, "fire" = 95, "acid" = 95, "wound" = 25) + armor = list(MELEE = 45, BULLET = 25, LASER = 30, ENERGY = 10, BOMB = 25, BIO = 100, RAD = 50, FIRE = 95, ACID = 95, WOUND = 25) /obj/item/clothing/suit/space/hardsuit/security/hos icon_state = "hardsuit-hos" name = "head of security's hardsuit" desc = "A special bulky suit that protects against hazardous, low pressure environments. Has an additional layer of armor." - armor = list("melee" = 45, "bullet" = 25, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 100, "rad" = 50, "fire" = 95, "acid" = 95, "wound" = 25) + armor = list(MELEE = 45, BULLET = 25, LASER = 30, ENERGY = 10, BOMB = 25, BIO = 100, RAD = 50, FIRE = 95, ACID = 95, WOUND = 25) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security/hos jetpack = /obj/item/tank/jetpack/suit @@ -594,7 +594,7 @@ icon_state = "capspace" item_state = "capspacehelmet" desc = "A tactical SWAT helmet MK.II boasting better protection and a horrible fashion sense." - armor = list("melee" = 40, "bullet" = 50, "laser" = 50, "energy" = 25, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100, "wound" = 15) + armor = list(MELEE = 40, BULLET = 50, LASER = 50, ENERGY = 25, BOMB = 50, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, WOUND = 15) resistance_flags = FIRE_PROOF | ACID_PROOF flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR //we want to see the mask heat_protection = HEAD @@ -609,7 +609,7 @@ desc = "A MK.II SWAT suit with streamlined joints and armor made out of superior materials, insulated against intense heat. The most advanced tactical armor available Usually reserved for heavy hitter corporate security, this one has a regal finish in Nanotrasen company colors. Better not let the assistants get a hold of it." icon_state = "caparmor" item_state = "capspacesuit" - armor = list("melee" = 40, "bullet" = 50, "laser" = 50, "energy" = 25, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100, "wound" = 15) + armor = list(MELEE = 40, BULLET = 50, LASER = 50, ENERGY = 25, BOMB = 50, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, WOUND = 15) resistance_flags = FIRE_PROOF | ACID_PROOF heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT //this needed to be added a long fucking time ago @@ -625,7 +625,7 @@ desc = "A special helmet designed for work in a hazardous, low-humor environment. Has radiation shielding." icon_state = "hardsuit0-clown" item_state = "hardsuit0-clown" - armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 60, "acid" = 30, "wound" = 10) + armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 5, BOMB = 10, BIO = 100, RAD = 75, FIRE = 60, ACID = 30, WOUND = 10) hardsuit_type = "clown" /obj/item/clothing/suit/space/hardsuit/clown @@ -633,7 +633,7 @@ desc = "A special suit that protects against hazardous, low humor environments. Has radiation shielding. Only a true clown can wear it." icon_state = "hardsuit-clown" item_state = "clown_hardsuit" - armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 60, "acid" = 30, "wound" = 10) + armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 5, BOMB = 10, BIO = 100, RAD = 75, FIRE = 60, ACID = 30, WOUND = 10) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/clown mutantrace_variation = STYLE_DIGITIGRADE @@ -651,7 +651,7 @@ desc = "Early prototype RIG hardsuit helmet, designed to quickly shift over a user's head. Design constraints of the helmet mean it has no inbuilt cameras, thus it restricts the users visability." icon_state = "hardsuit0-ancient" item_state = "anc_helm" - armor = list("melee" = 30, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 75, "wound" = 10) + armor = list(MELEE = 30, BULLET = 5, LASER = 5, ENERGY = 0, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 75, WOUND = 10) hardsuit_type = "ancient" resistance_flags = FIRE_PROOF @@ -660,7 +660,7 @@ desc = "Prototype powered RIG hardsuit. Provides excellent protection from the elements of space while being comfortable to move around in, thanks to the powered locomotives. Remains very bulky however." icon_state = "hardsuit-ancient" item_state = "anc_hardsuit" - armor = list("melee" = 30, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 75, "wound" = 10) + armor = list(MELEE = 30, BULLET = 5, LASER = 5, ENERGY = 0, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 75, WOUND = 10) slowdown = 3 helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ancient resistance_flags = FIRE_PROOF @@ -673,7 +673,7 @@ desc = "The Multi-Augmented Severe Operations Networked Resource Integration Gear is an man-portable tank designed for extreme environmental situations. It is excessively bulky, but rated for all but the most atomic of hazards. The specialized armor is surprisingly weak to conventional weaponry. The exo slot can attach most storage bags on to the suit." icon_state = "hardsuit-ancient" item_state = "anc_hardsuit" - armor = list("melee" = 20, "bullet" = 15, "laser" = 15, "energy" = 45, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "wound" = 10) + armor = list(MELEE = 20, BULLET = 15, LASER = 15, ENERGY = 45, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, WOUND = 10) slowdown = 6 //Slow allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage, /obj/item/construction/rcd, /obj/item/pipe_dispenser) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ancient/mason @@ -686,7 +686,7 @@ desc = "The M.A.S.O.N RIG helmet is complimentary to the rest of the armor. It features a very large, high powered flood lamp and robust flash protection." icon_state = "hardsuit0-ancient" item_state = "anc_helm" - armor = list("melee" = 20, "bullet" = 15, "laser" = 15, "energy" = 45, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "wound" = 10) + armor = list(MELEE = 20, BULLET = 15, LASER = 15, ENERGY = 45, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, WOUND = 10) hardsuit_type = "ancient" brightness_on = 16 flash_protect = 5 //We will not be flash by bombs @@ -752,7 +752,7 @@ item_state = "rig0-soviet" hardsuit_type = "soviet" icon_state = "rig0-soviet" - armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 20, "fire" = 50, "acid" = 75, "wound" = 15) + armor = list(MELEE = 40, BULLET = 30, LASER = 30, ENERGY = 15, BOMB = 35, BIO = 100, RAD = 20, FIRE = 50, ACID = 75, WOUND = 15) mutantrace_variation = NONE /obj/item/clothing/suit/space/hardsuit/soviet @@ -761,7 +761,7 @@ item_state = "rig-soviet" icon_state = "rig-soviet" slowdown = 0.8 - armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 20, "fire" = 50, "acid" = 75, "wound" = 15) + armor = list(MELEE = 40, BULLET = 30, LASER = 30, ENERGY = 15, BOMB = 35, BIO = 100, RAD = 20, FIRE = 50, ACID = 75, WOUND = 15) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/soviet mutantrace_variation = NONE @@ -777,7 +777,7 @@ icon_state = "hardsuit-hos" helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security/hos allowed = null - armor = list("melee" = 30, "bullet" = 15, "laser" = 30, "energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100, "wound" = 15) + armor = list(MELEE = 30, BULLET = 15, LASER = 30, ENERGY = 10, BOMB = 10, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, WOUND = 15) resistance_flags = FIRE_PROOF | ACID_PROOF var/max_charges = 3 //How many charges total the shielding has var/current_charges //if null, will default to max_chargs @@ -806,7 +806,7 @@ item_state = "ert_medical" hardsuit_type = "ert_medical" helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/ctf - armor = list("melee" = 0, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 95, "acid" = 95, "wound" = 30) + armor = list(MELEE = 0, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 50, BIO = 100, RAD = 100, FIRE = 95, ACID = 95, WOUND = 30) slowdown = 0 max_charges = 5 @@ -835,7 +835,7 @@ icon_state = "hardsuit0-ert_medical" item_state = "hardsuit0-ert_medical" hardsuit_type = "ert_medical" - armor = list("melee" = 0, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 95, "acid" = 95, "wound" = 30) + armor = list(MELEE = 0, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 50, BIO = 100, RAD = 100, FIRE = 95, ACID = 95, WOUND = 30) /obj/item/clothing/head/helmet/space/hardsuit/shielded/ctf/red icon_state = "hardsuit0-ert_security" @@ -857,7 +857,7 @@ icon_state = "hardsuit1-syndi" item_state = "syndie_hardsuit" hardsuit_type = "syndi" - armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100, "wound" = 30) + armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 15, BOMB = 35, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, WOUND = 30) allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/syndi slowdown = 0 @@ -873,7 +873,7 @@ icon_state = "hardsuit1-syndi" item_state = "syndie_helm" hardsuit_type = "syndi" - armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100, "wound" = 30) + armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 15, BOMB = 35, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, WOUND = 30) ///SWAT version /obj/item/clothing/suit/space/hardsuit/shielded/swat @@ -884,7 +884,7 @@ hardsuit_type = "syndi" max_charges = 4 recharge_delay = 15 - armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "wound" = 30) + armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, WOUND = 30) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/swat @@ -896,7 +896,7 @@ icon_state = "deathsquad" item_state = "deathsquad" hardsuit_type = "syndi" - armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "wound" = 30) + armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, WOUND = 30) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT actions_types = list() @@ -914,7 +914,7 @@ max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | LAVA_PROOF heat_protection = HEAD - armor = list(melee = 50, bullet = 10, laser = 10, energy = 10, bomb = 50, bio = 100, rad = 50, fire = 100, acid = 100, "wound" = 30) + armor = list(melee = 50, bullet = 10, laser = 10, energy = 10, bomb = 50, bio = 100, rad = 50, fire = 100, acid = 100, WOUND = 30) brightness_on = 7 allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator) var/energy_color = "#35FFF0" @@ -958,7 +958,7 @@ item_state = "swat_suit" max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | LAVA_PROOF - armor = list(melee = 50, bullet = 10, laser = 10, energy = 10, bomb = 50, bio = 100, rad = 50, fire = 100, acid = 100, "wound" = 30) + armor = list(melee = 50, bullet = 10, laser = 10, energy = 10, bomb = 50, bio = 100, rad = 50, fire = 100, acid = 100, WOUND = 30) allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage/bag/ore, /obj/item/pickaxe) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/lavaknight heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index f51593b590..f761c5ab82 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -22,7 +22,7 @@ Contains: desc = "An advanced tactical space helmet." icon_state = "deathsquad" item_state = "deathsquad" - armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "wound" = 30) + armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, WOUND = 30) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF @@ -37,7 +37,7 @@ Contains: icon_state = "deathsquad" item_state = "swat_suit" allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals, /obj/item/kitchen/knife/combat) - armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "wound" = 30) + armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, WOUND = 30) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF @@ -51,7 +51,7 @@ Contains: icon_state = "heavy" item_state = "swat_suit" allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals, /obj/item/kitchen/knife/combat) - armor = list("melee" = 40, "bullet" = 30, "laser" = 30,"energy" = 30, "bomb" = 50, "bio" = 90, "rad" = 20, "fire" = 100, "acid" = 100, "wound" = 25) + armor = list(MELEE = 40, BULLET = 30, LASER = 30,ENERGY = 30, BOMB = 50, BIO = 90, RAD = 20, FIRE = 100, ACID = 100, WOUND = 25) strip_delay = 120 resistance_flags = FIRE_PROOF | ACID_PROOF mutantrace_variation = STYLE_DIGITIGRADE @@ -63,7 +63,7 @@ Contains: dynamic_hair_suffix = "+generic" dynamic_fhair_suffix = "+generic" flags_inv = 0 - armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "wound" = 30) + armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, WOUND = 30) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF @@ -79,7 +79,7 @@ Contains: flags_inv = 0 w_class = WEIGHT_CLASS_NORMAL allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals) - armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "wound" = 30) + armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, WOUND = 30) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF @@ -140,7 +140,7 @@ Contains: desc = "A thick, space-proof tricorne from the royal Space Queen. It's lined with a layer of reflective kevlar." icon_state = "pirate" item_state = "pirate" - armor = list("melee" = 30, "bullet" = 50, "laser" = 30,"energy" = 15, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 60, "acid" = 75, "wound" = 30) + armor = list(MELEE = 30, BULLET = 50, LASER = 30,ENERGY = 15, BOMB = 30, BIO = 30, RAD = 30, FIRE = 60, ACID = 75, WOUND = 30) flags_inv = HIDEHAIR strip_delay = 40 equip_delay_other = 20 @@ -163,7 +163,7 @@ Contains: flags_inv = 0 allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals, /obj/item/melee/transforming/energy/sword/pirate, /obj/item/clothing/glasses/eyepatch, /obj/item/reagent_containers/food/drinks/bottle/rum) slowdown = 0 - armor = list("melee" = 30, "bullet" = 50, "laser" = 30,"energy" = 15, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 60, "acid" = 75, "wound" = 30) + armor = list(MELEE = 30, BULLET = 50, LASER = 30,ENERGY = 15, BOMB = 30, BIO = 30, RAD = 30, FIRE = 60, ACID = 75, WOUND = 30) strip_delay = 40 equip_delay_other = 20 mutantrace_variation = STYLE_DIGITIGRADE @@ -175,7 +175,7 @@ Contains: icon_state = "hardsuit0-ert_commander" item_state = "hardsuit0-ert_commander" hardsuit_type = "ert_commander" - armor = list("melee" = 65, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 80, "wound" = 30) + armor = list(MELEE = 65, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 50, BIO = 100, RAD = 100, FIRE = 80, ACID = 80, WOUND = 30) strip_delay = 130 brightness_on = 7 resistance_flags = ACID_PROOF @@ -191,7 +191,7 @@ Contains: item_state = "ert_command" helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals) - armor = list("melee" = 65, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 80, "wound" = 30) + armor = list(MELEE = 65, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 50, BIO = 100, RAD = 100, FIRE = 80, ACID = 80, WOUND = 30) slowdown = 0 strip_delay = 130 resistance_flags = ACID_PROOF @@ -243,7 +243,7 @@ Contains: icon_state = "hardsuit0-ert_commander-alert" item_state = "hardsuit0-ert_commander-alert" hardsuit_type = "ert_commander-alert" - armor = list("melee" = 70, "bullet" = 55, "laser" = 50, "energy" = 50, "bomb" = 65, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "wound" = 50) + armor = list(MELEE = 70, BULLET = 55, LASER = 50, ENERGY = 50, BOMB = 65, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, WOUND = 50) brightness_on = 8 resistance_flags = FIRE_PROOF | ACID_PROOF @@ -253,7 +253,7 @@ Contains: icon_state = "ert_command-alert" item_state = "ert_command-alert" helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/alert - armor = list("melee" = 70, "bullet" = 55, "laser" = 50, "energy" = 50, "bomb" = 65, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "wound" = 50) + armor = list(MELEE = 70, BULLET = 55, LASER = 50, ENERGY = 50, BOMB = 65, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, WOUND = 50) resistance_flags = FIRE_PROOF | ACID_PROOF mutantrace_variation = STYLE_DIGITIGRADE|STYLE_SNEK_TAURIC|STYLE_PAW_TAURIC @@ -301,7 +301,7 @@ Contains: icon_state = "space" item_state = "s_suit" desc = "A lightweight space suit with the basic ability to protect the wearer from the vacuum of space during emergencies." - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 20, "fire" = 50, "acid" = 65, "wound" = 10) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 100, RAD = 20, FIRE = 50, ACID = 65, WOUND = 10) /obj/item/clothing/head/helmet/space/eva name = "EVA helmet" @@ -309,7 +309,7 @@ Contains: item_state = "space" desc = "A lightweight space helmet with the basic ability to protect the wearer from the vacuum of space during emergencies." flash_protect = 0 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 20, "fire" = 50, "acid" = 65, "wound" = 10) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 100, RAD = 20, FIRE = 50, ACID = 65, WOUND = 10) //Radiation /obj/item/clothing/head/helmet/space/rad @@ -317,7 +317,7 @@ Contains: desc = "A special helmet that protects against radiation and space. Not much else unfortunately." icon_state = "cespace_helmet" item_state = "nothing" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 0, "acid" = 0, "wound" = 5) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 100, FIRE = 0, ACID = 0, WOUND = 5) resistance_flags = FIRE_PROOF rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE actions_types = list() @@ -327,7 +327,7 @@ Contains: desc = "A special suit that protects against radiation and space. Not much else unfortunately." icon_state = "hardsuit-rad" item_state = "nothing" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 0, "acid" = 0, "wound" = 5) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 100, FIRE = 0, ACID = 0, WOUND = 5) resistance_flags = FIRE_PROOF rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE mutantrace_variation = NONE @@ -337,7 +337,7 @@ Contains: desc = "An advanced, space-proof helmet. It appears to be modeled after an old-world eagle." icon_state = "griffinhat" item_state = "griffinhat" - armor = list("melee" = 20, "bullet" = 40, "laser" = 30, "energy" = 25, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 80, "wound" = 20) + armor = list(MELEE = 20, BULLET = 40, LASER = 30, ENERGY = 25, BOMB = 100, BIO = 100, RAD = 100, FIRE = 80, ACID = 80, WOUND = 20) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = ACID_PROOF | FIRE_PROOF @@ -349,7 +349,7 @@ Contains: icon_state = "freedom" item_state = "freedom" allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals) - armor = list("melee" = 20, "bullet" = 40, "laser" = 30,"energy" = 25, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 80, "wound" = 20) + armor = list(MELEE = 20, BULLET = 40, LASER = 30,ENERGY = 25, BOMB = 100, BIO = 100, RAD = 100, FIRE = 80, ACID = 80, WOUND = 20) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = ACID_PROOF | FIRE_PROOF @@ -362,7 +362,7 @@ Contains: desc = "Spaceworthy and it looks like a space carp's head, smells like one too." icon_state = "carp_helm" item_state = "syndicate" - armor = list("melee" = -20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 75, "fire" = 60, "acid" = 75, "wound" = 5) //As whimpy as a space carp + armor = list(MELEE = -20, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 75, FIRE = 60, ACID = 75, WOUND = 5) //As whimpy as a space carp brightness_on = 0 //luminosity when on actions_types = list() mutantrace_variation = NONE @@ -378,7 +378,7 @@ Contains: icon_state = "carp_suit" item_state = "space_suit_syndicate" slowdown = 0 //Space carp magic, never stop believing - armor = list("melee" = -20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 75, "fire" = 60, "acid" = 75, "wound" = 5) //As whimpy whimpy whoo + armor = list(MELEE = -20, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 75, FIRE = 60, ACID = 75, WOUND = 5) //As whimpy whimpy whoo allowed = list(/obj/item/tank/internals, /obj/item/gun/ballistic/automatic/speargun) //I'm giving you a hint here helmettype = /obj/item/clothing/head/helmet/space/hardsuit/carp mutantrace_variation = STYLE_DIGITIGRADE @@ -440,14 +440,14 @@ Contains: /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor/old desc = "Powerful wards are built into this hardsuit, protecting the user from all manner of paranormal threats. Alas, this one looks pretty worn out and rusted." - armor = list("melee" = 55, "bullet" = 40, "laser" = 40, "energy" = 40, "bomb" = 40, "bio" = 80, "rad" = 80, "fire" = 60, "acid" = 60, "wound" = 20) + armor = list(MELEE = 55, BULLET = 40, LASER = 40, ENERGY = 40, BOMB = 40, BIO = 80, RAD = 80, FIRE = 60, ACID = 60, WOUND = 20) slowdown = 0.8 helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/inquisitor/old charges = 12 /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/inquisitor/old desc = "A helmet worn by those who deal with paranormal threats for a living. Alas, this one looks pretty worn out and rusted." - armor = list("melee" = 55, "bullet" = 40, "laser" = 40, "energy" = 40, "bomb" = 40, "bio" = 80, "rad" = 80, "fire" = 60, "acid" = 60, "wound" = 20) + armor = list(MELEE = 55, BULLET = 40, LASER = 40, ENERGY = 40, BOMB = 40, BIO = 80, RAD = 80, FIRE = 60, ACID = 60, WOUND = 20) charges = 12 /obj/item/clothing/suit/space/hardsuit/ert/paranormal/beserker @@ -465,14 +465,14 @@ Contains: /obj/item/clothing/suit/space/hardsuit/ert/paranormal/beserker/old desc = "Voices echo from the hardsuit, driving the user insane. This one is pretty battle-worn, but still fearsome." - armor = list("melee" = 55, "bullet" = 40, "laser" = 40, "energy" = 40, "bomb" = 40, "bio" = 80, "rad" = 80, "fire" = 60, "acid" = 60, "wound" = 20) + armor = list(MELEE = 55, BULLET = 40, LASER = 40, ENERGY = 40, BOMB = 40, BIO = 80, RAD = 80, FIRE = 60, ACID = 60, WOUND = 20) slowdown = 0.8 helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/beserker/old charges = 6 /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/beserker/old desc = "Peering into the eyes of the helmet is enough to seal damnation. This one is pretty battle-worn, but still fearsome." - armor = list("melee" = 55, "bullet" = 40, "laser" = 40, "energy" = 40, "bomb" = 40, "bio" = 80, "rad" = 80, "fire" = 60, "acid" = 60, "wound" = 20) + armor = list(MELEE = 55, BULLET = 40, LASER = 40, ENERGY = 40, BOMB = 40, BIO = 80, RAD = 80, FIRE = 60, ACID = 60, WOUND = 20) charges = 6 /obj/item/clothing/head/helmet/space/fragile @@ -480,7 +480,7 @@ Contains: desc = "A bulky, air-tight helmet meant to protect the user during emergency situations. It doesn't look very durable." icon_state = "syndicate-helm-orange" item_state = "syndicate-helm-orange" - armor = list("melee" = 5, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 0, "acid" = 0, "wound" = 5) + armor = list(MELEE = 5, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 10, FIRE = 0, ACID = 0, WOUND = 5) strip_delay = 65 /obj/item/clothing/suit/space/fragile @@ -490,7 +490,7 @@ Contains: icon_state = "syndicate-orange" item_state = "syndicate-orange" slowdown = 2 - armor = list("melee" = 5, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 0, "acid" = 0, "wound" = 5) + armor = list(MELEE = 5, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 10, FIRE = 0, ACID = 0, WOUND = 5) strip_delay = 65 /obj/item/clothing/suit/space/fragile/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) @@ -523,7 +523,7 @@ Contains: icon_state = "hunter" item_state = "swat_suit" allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals, /obj/item/kitchen/knife/combat) - armor = list("melee" = 60, "bullet" = 40, "laser" = 40, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "wound" = 25) + armor = list(MELEE = 60, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, WOUND = 25) strip_delay = 130 resistance_flags = FIRE_PROOF | ACID_PROOF diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index 25ad19eee4..9214e5433a 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -5,7 +5,7 @@ name = "EVA plasma envirosuit" desc = "A special plasma containment suit designed to be space-worthy, as well as worn over other clothing. Like its smaller counterpart, it can automatically extinguish the wearer in a crisis, and holds twice as many charges." allowed = list(/obj/item/gun, /obj/item/ammo_casing, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword, /obj/item/restraints/handcuffs, /obj/item/tank) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 100, "acid" = 75, "wound" = 10) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 0, FIRE = 100, ACID = 75, WOUND = 10) resistance_flags = FIRE_PROOF icon_state = "plasmaman_suit" item_state = "plasmaman_suit" @@ -42,7 +42,7 @@ strip_delay = 80 flash_protect = 2 tint = 2 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 100, "acid" = 75, "wound" = 10) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 0, FIRE = 100, ACID = 75, WOUND = 10) resistance_flags = FIRE_PROOF var/brightness_on = 4 //luminosity when the light is on var/helmet_on = FALSE @@ -155,7 +155,7 @@ desc = "A plasmaman containment helmet designed for security officers, protecting them from being flashed and burning alive, along-side other undesirables." icon_state = "security_envirohelm" item_state = "security_envirohelm" - armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 100, "acid" = 75, "wound" = 20) + armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 0, FIRE = 100, ACID = 75, WOUND = 20) /obj/item/clothing/head/helmet/space/plasmaman/security/warden name = "warden's plasma envirosuit helmet" @@ -214,7 +214,7 @@ desc = "A sturdier plasmaman envirohelmet designed for research directors." icon_state = "rd_envirohelm" item_state = "rd_envirohelm" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 100, "rad" = 0, "fire" = 100, "acid" = 75, "wound" = 10) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, RAD = 0, FIRE = 100, ACID = 75, WOUND = 10) /obj/item/clothing/head/helmet/space/plasmaman/robotics name = "robotics plasma envirosuit helmet" @@ -227,7 +227,7 @@ desc = "A space-worthy helmet specially designed for engineer plasmamen, the usual purple stripes being replaced by engineering's orange." icon_state = "engineer_envirohelm" item_state = "engineer_envirohelm" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 10, "fire" = 100, "acid" = 75, "wound" = 10) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 10, FIRE = 100, ACID = 75, WOUND = 10) /obj/item/clothing/head/helmet/space/plasmaman/engineering/ce name = "chief engineer's plasma envirosuit helmet" @@ -277,7 +277,7 @@ desc = "A blue and gold envirohelm designed for the station's captain, nonetheless. Made of superior materials to protect them from the station hazards and more." icon_state = "captain_envirohelm" item_state = "captain_envirohelm" - armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 10, "fire" = 100, "acid" = 85, "wound" = 15) + armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 10, BOMB = 10, BIO = 100, RAD = 10, FIRE = 100, ACID = 85, WOUND = 15) /obj/item/clothing/head/helmet/space/plasmaman/curator name = "curator's plasma envirosuit helmet" diff --git a/code/modules/clothing/spacesuits/syndi.dm b/code/modules/clothing/spacesuits/syndi.dm index f55379da2f..81eff1b428 100644 --- a/code/modules/clothing/spacesuits/syndi.dm +++ b/code/modules/clothing/spacesuits/syndi.dm @@ -4,7 +4,7 @@ icon_state = "syndicate" item_state = "syndicate" desc = "Has a tag on it: Totally not property of an enemy corporation, honest!" - armor = list("melee" = 40, "bullet" = 50, "laser" = 30,"energy" = 15, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 80, "acid" = 85, "wound" = 20) + armor = list(MELEE = 40, BULLET = 50, LASER = 30,ENERGY = 15, BOMB = 30, BIO = 30, RAD = 30, FIRE = 80, ACID = 85, WOUND = 20) /obj/item/clothing/suit/space/syndicate name = "red space suit" @@ -13,7 +13,7 @@ desc = "Has a tag on it: Totally not property of an enemy corporation, honest!" w_class = WEIGHT_CLASS_NORMAL allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals) - armor = list("melee" = 40, "bullet" = 50, "laser" = 30,"energy" = 15, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 80, "acid" = 85, "wound" = 20) + armor = list(MELEE = 40, BULLET = 50, LASER = 30,ENERGY = 15, BOMB = 30, BIO = 30, RAD = 30, FIRE = 80, ACID = 85, WOUND = 20) mutantrace_variation = STYLE_DIGITIGRADE //Green syndicate space suit diff --git a/code/modules/clothing/suits/_suits.dm b/code/modules/clothing/suits/_suits.dm index 0d16f9bdfa..fa4614429c 100644 --- a/code/modules/clothing/suits/_suits.dm +++ b/code/modules/clothing/suits/_suits.dm @@ -4,7 +4,7 @@ block_priority = BLOCK_PRIORITY_WEAR_SUIT var/fire_resist = T0C+100 allowed = list(/obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) slot_flags = ITEM_SLOT_OCLOTHING body_parts_covered = CHEST var/blood_overlay_type = "suit" diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 90fd0b2812..11e5af1f4e 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -8,7 +8,7 @@ equip_delay_other = 40 max_integrity = 250 resistance_flags = NONE - armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "wound" = 10) + armor = list(MELEE = 30, BULLET = 30, LASER = 30, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, WOUND = 10) /obj/item/clothing/suit/armor/Initialize() @@ -58,7 +58,7 @@ icon_state = "hos" item_state = "greatcoat" body_parts_covered = CHEST|GROIN|ARMS|LEGS - armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 90, "wound" = 10) + armor = list(MELEE = 30, BULLET = 30, LASER = 30, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 70, ACID = 90, WOUND = 10) cold_protection = CHEST|GROIN|LEGS|ARMS heat_protection = CHEST|GROIN|LEGS|ARMS strip_delay = 80 @@ -126,7 +126,7 @@ icon_state = "capcarapace" item_state = "armor" body_parts_covered = CHEST|GROIN - armor = list("melee" = 50, "bullet" = 40, "laser" = 50, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 90, "wound" = 10) + armor = list(MELEE = 50, BULLET = 40, LASER = 50, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 100, ACID = 90, WOUND = 10) dog_fashion = null resistance_flags = FIRE_PROOF @@ -142,7 +142,7 @@ icon_state = "capformal" item_state = "capspacesuit" body_parts_covered = CHEST|GROIN|ARMS - armor = list("melee" = 50, "bullet" = 40, "laser" = 50, "energy" = 50, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 90, "wound" = 10) + armor = list(MELEE = 50, BULLET = 40, LASER = 50, ENERGY = 50, BOMB = 25, BIO = 0, RAD = 0, FIRE = 100, ACID = 90, WOUND = 10) togglename = "buttons" /obj/item/clothing/suit/toggle/captains_parade/Initialize() @@ -157,7 +157,7 @@ body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS - armor = list("melee" = 50, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80, "wound" = 20) + armor = list(MELEE = 50, BULLET = 10, LASER = 10, ENERGY = 10, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 80, WOUND = 20) blocks_shove_knockdown = TRUE strip_delay = 80 equip_delay_other = 60 @@ -168,7 +168,7 @@ icon_state = "bonearmor" item_state = "bonearmor" blood_overlay_type = "armor" - armor = list("melee" = 35, "bullet" = 25, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "wound" = 10) + armor = list(MELEE = 35, BULLET = 25, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, WOUND = 10) body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS /obj/item/clothing/suit/armor/bulletproof @@ -177,7 +177,7 @@ icon_state = "bulletproof" item_state = "armor" blood_overlay_type = "armor" - armor = list("melee" = 15, "bullet" = 60, "laser" = 10, "energy" = 10, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "wound" = 20) + armor = list(MELEE = 15, BULLET = 60, LASER = 10, ENERGY = 10, BOMB = 40, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, WOUND = 20) strip_delay = 70 equip_delay_other = 50 mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON @@ -188,7 +188,7 @@ icon_state = "armor_reflec" item_state = "armor_reflec" blood_overlay_type = "armor" - armor = list("melee" = 10, "bullet" = 10, "laser" = 60, "energy" = 50, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) + armor = list(MELEE = 10, BULLET = 10, LASER = 60, ENERGY = 50, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON var/hit_reflect_chance = 40 @@ -216,7 +216,7 @@ desc = "An insidious combat vest designed using Syndicate nanofibers to absorb the supreme majority of kinetic blows. Although it doesn't look like it'll do too much for energy impacts." icon_state = "infiltrator" item_state = "infiltrator" - armor = list("melee" = 30, "bullet" = 40, "laser" = 20, "energy" = 30, "bomb" = 70, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list(MELEE = 30, BULLET = 40, LASER = 20, ENERGY = 30, BOMB = 70, BIO = 0, RAD = 0, FIRE = 50, ACID = 50) resistance_flags = FIRE_PROOF | ACID_PROOF strip_delay = 80 @@ -236,7 +236,7 @@ min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT - armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 90) + armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, RAD = 100, FIRE = 90, ACID = 90) /obj/item/clothing/suit/armor/heavy name = "heavy armor" @@ -249,7 +249,7 @@ body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS slowdown = 3 flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT - armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 90) + armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, RAD = 100, FIRE = 90, ACID = 90) /obj/item/clothing/suit/armor/tdome body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS @@ -257,7 +257,7 @@ clothing_flags = THICKMATERIAL cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS - armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 90) + armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, RAD = 100, FIRE = 90, ACID = 90) /obj/item/clothing/suit/armor/tdome/red name = "thunderdome suit" @@ -295,7 +295,7 @@ desc = "A classic suit of armour, able to be made from many different materials." icon_state = "knight_greyscale" item_state = "knight_greyscale" - armor = list("melee" = 35, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 10, "bio" = 10, "rad" = 10, "fire" = 40, "acid" = 40, "wound" = 15) + armor = list(MELEE = 35, BULLET = 10, LASER = 10, ENERGY = 10, BOMB = 10, BIO = 10, RAD = 10, FIRE = 40, ACID = 40, WOUND = 15) material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS //Can change color and add prefix /obj/item/clothing/suit/armor/vest/durathread @@ -307,14 +307,14 @@ equip_delay_other = 40 max_integrity = 200 resistance_flags = FLAMMABLE - armor = list("melee" = 20, "bullet" = 10, "laser" = 30, "energy" = 5, "bomb" = 15, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50) + armor = list(MELEE = 20, BULLET = 10, LASER = 30, ENERGY = 5, BOMB = 15, BIO = 0, RAD = 0, FIRE = 0, ACID = 50) /obj/item/clothing/suit/armor/vest/russian name = "russian vest" desc = "A bulletproof vest with forest camo. Good thing there's plenty of forests to hide in around here, right?" icon_state = "rus_armor" item_state = "rus_armor" - armor = list("melee" = 25, "bullet" = 30, "laser" = 0, "energy" = 15, "bomb" = 10, "bio" = 0, "rad" = 20, "fire" = 20, "acid" = 50, "wound" = 10) + armor = list(MELEE = 25, BULLET = 30, LASER = 0, ENERGY = 15, BOMB = 10, BIO = 0, RAD = 20, FIRE = 20, ACID = 50, WOUND = 10) /obj/item/clothing/suit/armor/vest/russian_coat name = "russian battle coat" @@ -325,7 +325,7 @@ body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT - armor = list("melee" = 25, "bullet" = 20, "laser" = 20, "energy" = 10, "bomb" = 20, "bio" = 50, "rad" = 20, "fire" = -10, "acid" = 50, "wound" = 10) + armor = list(MELEE = 25, BULLET = 20, LASER = 20, ENERGY = 10, BOMB = 20, BIO = 50, RAD = 20, FIRE = -10, ACID = 50, WOUND = 10) /obj/item/clothing/suit/toggle/armor/vest/centcom_formal name = "\improper CentCom formal coat" @@ -333,7 +333,7 @@ icon_state = "centcom_formal" item_state = "centcom" body_parts_covered = CHEST|GROIN|ARMS - armor = list("melee" = 35, "bullet" = 40, "laser" = 40, "energy" = 50, "bomb" = 35, "bio" = 10, "rad" = 10, "fire" = 10, "acid" = 60) + armor = list(MELEE = 35, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 35, BIO = 10, RAD = 10, FIRE = 10, ACID = 60) togglename = "buttons" /obj/item/clothing/suit/toggle/armor/vest/centcom_formal/Initialize() @@ -346,7 +346,7 @@ icon_state = "hosformal" item_state = "hostrench" body_parts_covered = CHEST|GROIN|ARMS - armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 90, "wound" = 10) + armor = list(MELEE = 30, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, RAD = 0, FIRE = 70, ACID = 90, WOUND = 10) togglename = "buttons" /obj/item/clothing/suit/toggle/armor/hos/hos_formal/Initialize() diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm index 94859d434f..2b66d61237 100644 --- a/code/modules/clothing/suits/bio.dm +++ b/code/modules/clothing/suits/bio.dm @@ -5,7 +5,7 @@ desc = "A hood that protects the head and face from biological contaminants." permeability_coefficient = 0.01 clothing_flags = THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 60, "fire" = 30, "acid" = 100) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 100, RAD = 60, FIRE = 30, ACID = 100) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDEFACE|HIDESNOUT resistance_flags = ACID_PROOF flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH @@ -23,7 +23,7 @@ body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS slowdown = 1 allowed = list(/obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/pen, /obj/item/flashlight/pen, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 60, "fire" = 30, "acid" = 100) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 100, RAD = 60, FIRE = 30, ACID = 100) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAUR strip_delay = 70 equip_delay_other = 70 @@ -48,11 +48,11 @@ //Security biosuit, grey with red stripe across the chest /obj/item/clothing/head/bio_hood/security - armor = list("melee" = 25, "bullet" = 15, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 100, "rad" = 80, "fire" = 30, "acid" = 100) + armor = list(MELEE = 25, BULLET = 15, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 100, RAD = 80, FIRE = 30, ACID = 100) icon_state = "bio_security" /obj/item/clothing/suit/bio_suit/security - armor = list("melee" = 25, "bullet" = 15, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 100, "rad" = 80, "fire" = 30, "acid" = 100) + armor = list(MELEE = 25, BULLET = 15, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 100, RAD = 80, FIRE = 30, ACID = 100) icon_state = "bio_security" diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm index a58b218c1a..9c9c22e72e 100644 --- a/code/modules/clothing/suits/cloaks.dm +++ b/code/modules/clothing/suits/cloaks.dm @@ -60,7 +60,7 @@ icon_state = "goliath_cloak" desc = "A staunch, practical cape made out of numerous monster materials, it is coveted amongst exiles & hermits." allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/pickaxe, /obj/item/spear, /obj/item/spear/bonespear, /obj/item/organ/regenerative_core/legion, /obj/item/kitchen/knife/combat/bone, /obj/item/kitchen/knife/combat/survival) - armor = list("melee" = 35, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) //a fair alternative to bone armor, requiring alternative materials and gaining a suit slot + armor = list(MELEE = 35, BULLET = 10, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 60, ACID = 60) //a fair alternative to bone armor, requiring alternative materials and gaining a suit slot hoodtype = /obj/item/clothing/head/hooded/cloakhood/goliath body_parts_covered = CHEST|ARMS|LEGS @@ -68,7 +68,7 @@ name = "goliath cloak hood" icon_state = "golhood" desc = "A protective & concealing hood." - armor = list("melee" = 35, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) + armor = list(MELEE = 35, BULLET = 10, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 60, ACID = 60) flags_inv = HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR /obj/item/clothing/suit/hooded/cloak/drake @@ -76,7 +76,7 @@ icon_state = "dragon" desc = "A suit of armour fashioned from the remains of an ash drake." allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe, /obj/item/spear) - armor = list("melee" = 70, "bullet" = 20, "laser" = 35, "energy" = 25, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) + armor = list(MELEE = 70, BULLET = 20, LASER = 35, ENERGY = 25, BOMB = 25, BIO = 0, RAD = 0, FIRE = 100, ACID = 100) hoodtype = /obj/item/clothing/head/hooded/cloakhood/drake heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS @@ -87,7 +87,7 @@ name = "drake helm" icon_state = "dragon" desc = "The skull of a dragon." - armor = list("melee" = 70, "bullet" = 20, "laser" = 35, "energy" = 25, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) + armor = list(MELEE = 70, BULLET = 20, LASER = 35, ENERGY = 25, BOMB = 25, BIO = 0, RAD = 0, FIRE = 100, ACID = 100) heat_protection = HEAD max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF | GOLIATH_RESISTANCE diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index 13bfd8b460..e68f9b71e9 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -102,7 +102,7 @@ item_state = "det_suit" blood_overlay_type = "coat" body_parts_covered = CHEST|GROIN|LEGS|ARMS - armor = list("melee" = 25, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45) + armor = list(MELEE = 25, BULLET = 10, LASER = 25, ENERGY = 10, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 45) cold_protection = CHEST|GROIN|LEGS|ARMS heat_protection = CHEST|GROIN|LEGS|ARMS mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON @@ -176,7 +176,7 @@ /obj/item/clothing/suit/toggle/lawyer/black/syndie desc = "A snappy dress jacket. Suspiciously has no tags or branding." - armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 10, "bio" = 10, "rad" = 10, "fire" = 40, "acid" = 40) + armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 10, BOMB = 10, BIO = 10, RAD = 10, FIRE = 40, ACID = 40) //Mime /obj/item/clothing/suit/suspenders @@ -204,7 +204,7 @@ blood_overlay_type = "coat" body_parts_covered = CHEST|ARMS allowed = list(/obj/item/tank/internals, /obj/item/melee/curator_whip) - armor = list("melee" = 25, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45) + armor = list(MELEE = 25, BULLET = 10, LASER = 25, ENERGY = 10, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 45) cold_protection = CHEST|ARMS heat_protection = CHEST|ARMS mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index d8e0466069..f94e21a466 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -27,7 +27,7 @@ /obj/item/tank/internals/plasmaman ) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 50, RAD = 0, FIRE = 50, ACID = 50) togglename = "buttons" species_exception = list(/datum/species/golem) @@ -78,7 +78,7 @@ icon_state = "sci_dep_jacket" item_state = "sci_dep_jacket" allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) /obj/item/clothing/suit/toggle/labcoat/depjacket/med name = "medical jacket" @@ -86,14 +86,14 @@ icon_state = "med_dep_jacket" item_state = "med_dep_jacket" allowed = list(/obj/item/analyzer, /obj/item/sensor_device, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 45) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 50, RAD = 0, FIRE = 0, ACID = 45) /obj/item/clothing/suit/toggle/labcoat/depjacket/sec name = "security jacket" desc = "A comfortable jacket in security red." icon_state = "sec_dep_jacket" item_state = "sec_dep_jacket" - armor = list("melee" = 25, "bullet" = 15, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45) + armor = list(MELEE = 25, BULLET = 15, LASER = 30, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 0, ACID = 45) allowed = list(/obj/item/gun/energy, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) /obj/item/clothing/suit/toggle/labcoat/depjacket/sup @@ -113,5 +113,5 @@ desc = "A comfortable jacket in engineering yellow." icon_state = "engi_dep_jacket" item_state = "engi_dep_jacket" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 20, "fire" = 30, "acid" = 45) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 20, FIRE = 30, ACID = 45) allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/t_scanner, /obj/item/construction/rcd, /obj/item/pipe_dispenser, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 57d2ae5c69..fd2f235836 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -538,7 +538,7 @@ icon_state = "pufferjacket" item_state = "hostrench" body_parts_covered = CHEST|GROIN|ARMS - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 50, RAD = 0, FIRE = 0, ACID = 0) /obj/item/clothing/suit/jacket/puffer/vest name = "puffer vest" @@ -548,7 +548,7 @@ body_parts_covered = CHEST|GROIN cold_protection = CHEST|GROIN heat_protection = CHEST|GROIN - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 30, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 30, RAD = 0, FIRE = 0, ACID = 0) /obj/item/clothing/suit/jacket/miljacket name = "military jacket" @@ -635,7 +635,7 @@ w_class = WEIGHT_CLASS_SMALL body_parts_covered = CHEST|GROIN attack_verb = list("warned", "cautioned", "smashed") - armor = list("melee" = 5, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 5, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) /obj/item/clothing/suit/petharness name = "pet harness" @@ -669,7 +669,7 @@ heat_protection = CHEST|GROIN|ARMS min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT max_heat_protection_temperature = COAT_MAX_TEMP_PROTECT - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0) allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON @@ -689,7 +689,7 @@ name = "centcom winter coat" icon_state = "coatcentcom" item_state = "coatcentcom" - armor = list("melee" = 40, "bullet" = 45, "laser" = 45, "energy" = 35, "bomb" = 40, "bio" = 25, "rad" = 25, "fire" = 35, "acid" = 50) + armor = list(MELEE = 40, BULLET = 45, LASER = 45, ENERGY = 35, BOMB = 40, BIO = 25, RAD = 25, FIRE = 35, ACID = 50) hoodtype = /obj/item/clothing/head/hooded/winterhood/centcom /obj/item/clothing/suit/hooded/wintercoat/centcom/Initialize() @@ -698,14 +698,14 @@ /obj/item/clothing/head/hooded/winterhood/centcom icon_state = "winterhood_centcom" - armor = list("melee" = 40, "bullet" = 45, "laser" = 45, "energy" = 35, "bomb" = 40, "bio" = 25, "rad" = 25, "fire" = 35, "acid" = 50) + armor = list(MELEE = 40, BULLET = 45, LASER = 45, ENERGY = 35, BOMB = 40, BIO = 25, RAD = 25, FIRE = 35, ACID = 50) /obj/item/clothing/suit/hooded/wintercoat/captain name = "captain's winter coat" desc = "A luxurious winter coat, stuffed with the down of the endangered Uka bird and trimmed with genuine sable. The fabric is an indulgently soft micro-fiber, and the deep ultramarine color is only one that could be achieved with minute amounts of crystalline bluespace dust woven into the thread between the plectrums. Extremely lavish, and extremely durable. The tiny flakes of protective material make it nothing short of extremely light lamellar armor." icon_state = "coatcaptain" item_state = "coatcaptain" - armor = list("melee" = 25, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50) + armor = list(MELEE = 25, BULLET = 30, LASER = 30, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 0, ACID = 50) hoodtype = /obj/item/clothing/head/hooded/winterhood/captain /obj/item/clothing/suit/hooded/wintercoat/captain/Initialize() @@ -721,7 +721,7 @@ desc = "A cozy winter coat, covered in thick fur. The breast features a proud yellow chevron, reminding everyone that you're the second banana." icon_state = "coathop" item_state = "coathop" - armor = list("melee" = 5, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 5, "bio" = 5, "rad" = 0, "fire" = 0, "acid" = 5) + armor = list(MELEE = 5, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 5, BIO = 5, RAD = 0, FIRE = 0, ACID = 5) hoodtype = /obj/item/clothing/head/hooded/winterhood/hop /obj/item/clothing/head/hooded/winterhood/hop @@ -733,7 +733,7 @@ desc = "A red, armor-padded winter coat. It glitters with a mild ablative coating and a robust air of authority. The zipper tab is a pair of jingly little handcuffs that get annoying after the first ten seconds." icon_state = "coatsecurity" item_state = "coatsecurity" - armor = list("melee" = 25, "bullet" = 15, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45) + armor = list(MELEE = 25, BULLET = 15, LASER = 30, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 0, ACID = 45) hoodtype = /obj/item/clothing/head/hooded/winterhood/security /obj/item/clothing/suit/hooded/wintercoat/security/Initialize() @@ -749,7 +749,7 @@ desc = "A red, armor-padded winter coat, lovingly woven with a Kevlar interleave and reinforced with semi-ablative polymers and a silver azide fill material. The zipper tab looks like a tiny replica of Beepsky." icon_state = "coathos" item_state = "coathos" - armor = list("melee" = 35, "bullet" = 35, "laser" = 35, "energy" = 15, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 55) + armor = list(MELEE = 35, BULLET = 35, LASER = 35, ENERGY = 15, BOMB = 30, BIO = 0, RAD = 0, FIRE = 0, ACID = 55) hoodtype = /obj/item/clothing/head/hooded/winterhood/hos /obj/item/clothing/suit/hooded/wintercoat/hos/Initialize() @@ -766,7 +766,7 @@ icon_state = "coatmedical" item_state = "coatmedical" allowed = list(/obj/item/analyzer, /obj/item/sensor_device, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 45) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 50, RAD = 0, FIRE = 0, ACID = 45) hoodtype = /obj/item/clothing/head/hooded/winterhood/medical /obj/item/clothing/head/hooded/winterhood/medical @@ -779,7 +779,7 @@ icon_state = "coatcmo" item_state = "coatcmo" allowed = list(/obj/item/analyzer, /obj/item/sensor_device, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) - armor = list("melee" = 5, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 5, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 50, RAD = 0, FIRE = 0, ACID = 0) hoodtype = /obj/item/clothing/head/hooded/winterhood/cmo /obj/item/clothing/head/hooded/winterhood/cmo @@ -792,7 +792,7 @@ icon_state = "coatchemistry" item_state = "coatchemistry" allowed = list(/obj/item/analyzer, /obj/item/sensor_device, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 30, "rad" = 0, "fire" = 30, "acid" = 45) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 30, RAD = 0, FIRE = 30, ACID = 45) hoodtype = /obj/item/clothing/head/hooded/winterhood/chemistry /obj/item/clothing/head/hooded/winterhood/chemistry @@ -805,7 +805,7 @@ icon_state = "coatviro" item_state = "coatviro" allowed = list(/obj/item/analyzer, /obj/item/sensor_device, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 30, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 30, RAD = 0, FIRE = 0, ACID = 0) hoodtype = /obj/item/clothing/head/hooded/winterhood/viro /obj/item/clothing/head/hooded/winterhood/viro @@ -818,7 +818,7 @@ icon_state = "coatparamed" item_state = "coatparamed" allowed = list(/obj/item/analyzer, /obj/item/sensor_device, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 45) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 50, RAD = 0, FIRE = 0, ACID = 45) hoodtype = /obj/item/clothing/head/hooded/winterhood/paramedic /obj/item/clothing/head/hooded/winterhood/paramedic @@ -831,7 +831,7 @@ icon_state = "coatscience" item_state = "coatscience" allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) hoodtype = /obj/item/clothing/head/hooded/winterhood/science /obj/item/clothing/head/hooded/winterhood/science @@ -844,7 +844,7 @@ icon_state = "coatrobotics" item_state = "coatrobotics" allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/screwdriver, /obj/item/crowbar, /obj/item/wrench, /obj/item/stack/cable_coil, /obj/item/weldingtool, /obj/item/multitool) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) hoodtype = /obj/item/clothing/head/hooded/winterhood/robotics /obj/item/clothing/head/hooded/winterhood/robotics @@ -869,7 +869,7 @@ icon_state = "coatrd" item_state = "coatrd" allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) - armor = list("melee" = 0, "bullet" = 0, "laser" = 5,"energy" = 0, "bomb" = 15, "bio" = 5, "rad" = 5, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 5,ENERGY = 0, BOMB = 15, BIO = 5, RAD = 5, FIRE = 0, ACID = 0) hoodtype = /obj/item/clothing/head/hooded/winterhood/rd /obj/item/clothing/head/hooded/winterhood/rd @@ -881,7 +881,7 @@ desc = "A white winter coat with reflective green and yellow stripes. Stuffed with asbestos, treated with fire retardant PBDE, lined with a micro thin sheet of lead foil and snugly fitted to your body's measurements. This baby's ready to save you from anything except the thyroid cancer and systemic fibrosis you'll get from wearing it. The zipper tab is a tiny golden wrench." icon_state = "coatce" item_state = "coatce" - armor = list("melee" = 0, "bullet" = 0, "laser" = 5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 30, "fire" = 35, "acid" = 45) + armor = list(MELEE = 0, BULLET = 0, LASER = 5, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 30, FIRE = 35, ACID = 45) allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/t_scanner, /obj/item/construction/rcd, /obj/item/pipe_dispenser, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) hoodtype = /obj/item/clothing/head/hooded/winterhood/ce @@ -894,7 +894,7 @@ desc = "A surprisingly heavy yellow winter coat with reflective orange stripes. It has a small wrench for its zipper tab, and the inside layer is covered with a radiation-resistant silver-nylon blend. Because you're worth it." icon_state = "coatengineer" item_state = "coatengineer" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 20, "fire" = 30, "acid" = 45) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 20, FIRE = 30, ACID = 45) allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/t_scanner, /obj/item/construction/rcd, /obj/item/pipe_dispenser, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) hoodtype = /obj/item/clothing/head/hooded/winterhood/engineering @@ -1001,7 +1001,7 @@ icon_state = "coatminer" item_state = "coatminer" allowed = list(/obj/item/pickaxe, /obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) - armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) hoodtype = /obj/item/clothing/head/hooded/winterhood/miner /obj/item/clothing/head/hooded/winterhood/miner @@ -1013,7 +1013,7 @@ desc = "A brass-plated button up winter coat. Instead of a zipper tab, it has a brass cog with a tiny red gemstone inset." icon_state = "coatratvar" item_state = "coatratvar" - armor = list("melee" = 30, "bullet" = 45, "laser" = -10, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) + armor = list(MELEE = 30, BULLET = 45, LASER = -10, ENERGY = 0, BOMB = 30, BIO = 0, RAD = 0, FIRE = 60, ACID = 60) allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/clockwork/replica_fabricator, /obj/item/clockwork/integration_cog, /obj/item/clockwork/slab, /obj/item/clockwork/weapon/ratvarian_spear) hoodtype = /obj/item/clothing/head/hooded/winterhood/ratvar var/real = TRUE @@ -1042,7 +1042,7 @@ desc = "A somber button-up in tones of grey entropy and a wicked crimson zipper. When pulled all the way up, the zipper looks like a bloody gash. The zipper pull looks like a single drop of blood." icon_state = "coatnarsie" item_state = "coatnarsie" - armor = list("melee" = 30, "bullet" = 20, "laser" = 30,"energy" = 10, "bomb" = 30, "bio" = 10, "rad" = 10, "fire" = 30, "acid" = 30) + armor = list(MELEE = 30, BULLET = 20, LASER = 30,ENERGY = 10, BOMB = 30, BIO = 10, RAD = 10, FIRE = 30, ACID = 30) allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/restraints/legcuffs/bola/cult,/obj/item/melee/cultblade,/obj/item/melee/cultblade/dagger,/obj/item/reagent_containers/glass/beaker/unholywater,/obj/item/cult_shift,/obj/item/flashlight/flare/culttorch,/obj/item/cult_spear) hoodtype = /obj/item/clothing/head/hooded/winterhood/narsie var/real = TRUE @@ -1069,7 +1069,7 @@ icon_state = "coatratvar" item_state = "coatratvar" allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) real = FALSE /obj/item/clothing/suit/hooded/wintercoat/narsie/fake @@ -1078,7 +1078,7 @@ icon_state = "coatnarsie" item_state = "coatnarsie" allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) real = FALSE /obj/item/clothing/suit/hooded/wintercoat/durathread @@ -1086,7 +1086,7 @@ desc = "The one coat to rule them all. Extremely durable while providing the utmost comfort." icon_state = "coatdurathread" item_state = "coatdurathread" - armor = list("melee" = 15, "bullet" = 8, "laser" = 25, "energy" = 5, "bomb" = 12, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50) + armor = list(MELEE = 15, BULLET = 8, LASER = 25, ENERGY = 5, BOMB = 12, BIO = 0, RAD = 0, FIRE = 0, ACID = 50) hoodtype = /obj/item/clothing/head/hooded/winterhood/durathread /obj/item/clothing/suit/hooded/wintercoat/durathread/Initialize() @@ -1095,7 +1095,7 @@ /obj/item/clothing/head/hooded/winterhood/durathread icon_state = "winterhood_durathread" - armor = list("melee" = 20, "bullet" = 8, "laser" = 15, "energy" = 8, "bomb" = 25, "bio" = 10, "rad" = 15, "fire" = 75, "acid" = 37) + armor = list(MELEE = 20, BULLET = 8, LASER = 15, ENERGY = 8, BOMB = 25, BIO = 10, RAD = 15, FIRE = 75, ACID = 37) /obj/item/clothing/suit/spookyghost name = "spooky ghost" @@ -1112,7 +1112,7 @@ icon = 'icons/obj/clothing/clockwork_garb.dmi' icon_state = "clockwork_cuirass_old" body_parts_covered = CHEST|GROIN|LEGS - armor = list("melee" = 5, "bullet" = 0, "laser" = -5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 20) + armor = list(MELEE = 5, BULLET = 0, LASER = -5, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 20, ACID = 20) /obj/item/clothing/suit/ghost_sheet name = "ghost sheet" @@ -1152,7 +1152,7 @@ blood_overlay_type = "armor" body_parts_covered = CHEST resistance_flags = NONE - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 5, "bio" = 0, "rad" = 0, "fire" = -5, "acid" = -15) //nylon sucks against acid + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 5, BIO = 0, RAD = 0, FIRE = -5, ACID = -15) //nylon sucks against acid mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/suit/assu_suit diff --git a/code/modules/clothing/suits/reactive_armour.dm b/code/modules/clothing/suits/reactive_armour.dm index 608aca2aad..2f2c861b6b 100644 --- a/code/modules/clothing/suits/reactive_armour.dm +++ b/code/modules/clothing/suits/reactive_armour.dm @@ -33,7 +33,7 @@ icon_state = "reactiveoff" item_state = "reactiveoff" blood_overlay_type = "armor" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100) actions_types = list(/datum/action/item_action/toggle) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index 1f28c5ddf3..d58b88b773 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -20,7 +20,7 @@ body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/extinguisher, /obj/item/crowbar) slowdown = 1 - armor = list("melee" = 15, "bullet" = 5, "laser" = 20, "energy" = 10, "bomb" = 20, "bio" = 10, "rad" = 20, "fire" = 100, "acid" = 50) + armor = list(MELEE = 15, BULLET = 5, LASER = 20, ENERGY = 10, BOMB = 20, BIO = 10, RAD = 20, FIRE = 100, ACID = 50) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS @@ -62,7 +62,7 @@ desc = "Use in case of bomb." icon_state = "bombsuit" clothing_flags = THICKMATERIAL - armor = list("melee" = 20, "bullet" = 0, "laser" = 20,"energy" = 10, "bomb" = 100, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50) + armor = list(MELEE = 20, BULLET = 0, LASER = 20,ENERGY = 10, BOMB = 100, BIO = 0, RAD = 0, FIRE = 80, ACID = 50) flags_inv = HIDEFACE|HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT dynamic_hair_suffix = "" dynamic_fhair_suffix = "" @@ -88,7 +88,7 @@ clothing_flags = THICKMATERIAL body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS slowdown = 2 - armor = list("melee" = 20, "bullet" = 0, "laser" = 20,"energy" = 10, "bomb" = 100, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50) + armor = list(MELEE = 20, BULLET = 0, LASER = 20,ENERGY = 10, BOMB = 100, BIO = 0, RAD = 0, FIRE = 80, ACID = 50) flags_inv = HIDEJUMPSUIT|HIDETAUR heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT @@ -128,7 +128,7 @@ desc = "A hood with radiation protective properties. The label reads, 'Made with lead. Please do not consume insulation.'" clothing_flags = THICKMATERIAL flags_inv = HIDEMASK|HIDEEARS|HIDEFACE|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 60, "rad" = 100, "fire" = 30, "acid" = 30) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 60, RAD = 100, FIRE = 30, ACID = 30) strip_delay = 60 equip_delay_other = 60 flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH @@ -148,7 +148,7 @@ body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/geiger_counter) slowdown = 1.5 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 60, "rad" = 100, "fire" = 30, "acid" = 30) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 60, RAD = 100, FIRE = 30, ACID = 30) strip_delay = 60 equip_delay_other = 60 flags_inv = HIDEJUMPSUIT|HIDETAUR diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index 9c144ee6f3..0d8aa60ba5 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -4,7 +4,7 @@ icon_state = "wizard" gas_transfer_coefficient = 0.01 // IT'S MAGICAL OKAY JEEZ +1 TO NOT DIE permeability_coefficient = 0.01 - armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 20, "bio" = 20, "rad" = 20, "fire" = 100, "acid" = 100, "wound" = 20) + armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 20, BIO = 20, RAD = 20, FIRE = 100, ACID = 100, WOUND = 20) strip_delay = 50 equip_delay_other = 50 resistance_flags = FIRE_PROOF | ACID_PROOF @@ -41,7 +41,7 @@ icon_state = "wizard-fake" gas_transfer_coefficient = 1 permeability_coefficient = 1 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) resistance_flags = FLAMMABLE magic_flags = NONE @@ -74,7 +74,7 @@ gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 body_parts_covered = CHEST|GROIN|ARMS|LEGS - armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 20, "bio" = 20, "rad" = 20, "fire" = 100, "acid" = 100, "wound" = 20) + armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 20, BIO = 20, RAD = 20, FIRE = 100, ACID = 100, WOUND = 20) allowed = list(/obj/item/teleportation_scroll) flags_inv = HIDEJUMPSUIT strip_delay = 50 @@ -140,21 +140,21 @@ icon_state = "wizard-fake" gas_transfer_coefficient = 1 permeability_coefficient = 1 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) resistance_flags = FLAMMABLE magic_flags = NONE /obj/item/clothing/head/wizard/marisa/fake gas_transfer_coefficient = 1 permeability_coefficient = 1 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) resistance_flags = FLAMMABLE magic_flags = NONE /obj/item/clothing/suit/wizrobe/marisa/fake gas_transfer_coefficient = 1 permeability_coefficient = 1 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) resistance_flags = FLAMMABLE magic_flags = NONE @@ -309,7 +309,7 @@ min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/wizard - armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 20, "bio" = 20, "rad" = 20, "fire" = 100, "acid" = 100) + armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 20, BIO = 20, RAD = 20, FIRE = 100, ACID = 100) slowdown = 0 resistance_flags = FIRE_PROOF | ACID_PROOF @@ -324,7 +324,7 @@ item_state = "battlemage" min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT - armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 20, "bio" = 20, "rad" = 20, "fire" = 100, "acid" = 100) + armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 20, BIO = 20, RAD = 20, FIRE = 100, ACID = 100) actions_types = null //No inbuilt light resistance_flags = FIRE_PROOF | ACID_PROOF diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index 61e4bb5149..e806ebf906 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -5,7 +5,7 @@ permeability_coefficient = 0.9 block_priority = BLOCK_PRIORITY_UNIFORM slot_flags = ITEM_SLOT_ICLOTHING - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, WOUND = 5) mutantrace_variation = STYLE_DIGITIGRADE|USE_TAUR_CLIP_MASK limb_integrity = 120 var/fitted = FEMALE_UNIFORM_FULL // For use in alternate clothing styles for women diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm index 40d30235d8..2ed34e6bcd 100644 --- a/code/modules/clothing/under/accessories.dm +++ b/code/modules/clothing/under/accessories.dm @@ -378,7 +378,7 @@ /obj/item/clothing/accessory/medal/gold/captain/family name = "old medal of captaincy" desc = "A rustic badge pure gold, has been through hell and back by the looks, the syndcate have been after these by the looks of it for generations..." - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 10) //Pure gold + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 10) //Pure gold custom_materials = list(/datum/material/gold=2000) /obj/item/clothing/accessory/medal/gold/heroism @@ -390,7 +390,7 @@ desc = "An eccentric medal made of plasma." icon_state = "plasma" medaltype = "medal-plasma" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = -10, "acid" = 0) //It's made of plasma. Of course it's flammable. + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = -10, ACID = 0) //It's made of plasma. Of course it's flammable. custom_materials = list(/datum/material/plasma=1000) /obj/item/clothing/accessory/medal/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) @@ -499,21 +499,21 @@ name = "bone talisman" desc = "A hunter's talisman, some say the old gods smile on those who wear it." icon_state = "talisman" - armor = list("melee" = 5, "bullet" = 5, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 20, "rad" = 5, "fire" = 0, "acid" = 25) + armor = list(MELEE = 5, BULLET = 5, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 20, RAD = 5, FIRE = 0, ACID = 25) /obj/item/clothing/accessory/skullcodpiece name = "skull codpiece" desc = "A skull shaped ornament, intended to protect the important things in life." icon_state = "skull" above_suit = TRUE - armor = list("melee" = 5, "bullet" = 5, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 20, "rad" = 5, "fire" = 0, "acid" = 25) + armor = list(MELEE = 5, BULLET = 5, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 20, RAD = 5, FIRE = 0, ACID = 25) /obj/item/clothing/accessory/skullcodpiece/fake name = "false codpiece" desc = "A plastic ornament, intended to protect the important things in life. It's not very good at it." icon_state = "skull" above_suit = TRUE - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) ///////////////////// //Syndie Accessories// @@ -523,21 +523,21 @@ name = "protective padding" desc = "A soft padding meant to cushion the wearer from melee harm." icon_state = "padding" - armor = list("melee" = 20, "bullet" = 10, "laser" = 0, "energy" = 0, "bomb" = 5, "bio" = 0, "rad" = 0, "fire" = -20, "acid" = 45) + armor = list(MELEE = 20, BULLET = 10, LASER = 0, ENERGY = 0, BOMB = 5, BIO = 0, RAD = 0, FIRE = -20, ACID = 45) flags_inv = HIDEACCESSORY //hidden from indiscrete mob examines. /obj/item/clothing/accessory/kevlar name = "kevlar padding" desc = "A layered kevlar padding meant to cushion the wearer from ballistic harm." icon_state = "padding" - armor = list("melee" = 10, "bullet" = 20, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 25) + armor = list(MELEE = 10, BULLET = 20, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 0, ACID = 25) flags_inv = HIDEACCESSORY /obj/item/clothing/accessory/plastics name = "ablative padding" desc = "A thin ultra-refractory composite padding meant to cushion the wearer from energy lasers harm." icon_state = "plastics" - armor = list("melee" = 0, "bullet" = 0, "laser" = 20, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = -40) + armor = list(MELEE = 0, BULLET = 0, LASER = 20, ENERGY = 10, BOMB = 0, BIO = 0, RAD = 0, FIRE = 20, ACID = -40) flags_inv = HIDEACCESSORY //necklace diff --git a/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm b/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm index 885e659bb2..82924b850d 100644 --- a/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm +++ b/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm @@ -57,7 +57,7 @@ desc = "An expensive piece of plasmaman envirosuit fashion. guaranteed to keep you cool while the station goes down in fierceful fires." icon_state = "captain_envirosuit" item_state = "captain_envirosuit" - armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95, "wound" = 15) + armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 0, FIRE = 95, ACID = 95, WOUND = 15) sensor_mode = SENSOR_COORDS sensor_flags = NONE diff --git a/code/modules/clothing/under/jobs/Plasmaman/engineering.dm b/code/modules/clothing/under/jobs/Plasmaman/engineering.dm index 4850a605e7..68d1ab30e1 100644 --- a/code/modules/clothing/under/jobs/Plasmaman/engineering.dm +++ b/code/modules/clothing/under/jobs/Plasmaman/engineering.dm @@ -3,7 +3,7 @@ desc = "An air-tight suit designed to be used by plasmamen exployed as engineers, the usual purple stripes being replaced by engineer's orange. It protects the user from fire and acid damage." icon_state = "engineer_envirosuit" item_state = "engineer_envirosuit" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 10, "fire" = 95, "acid" = 95, "wound" = 5) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 10, FIRE = 95, ACID = 95, WOUND = 5) /obj/item/clothing/under/plasmaman/engineering/ce name = "chief engineer's plasma envirosuit" diff --git a/code/modules/clothing/under/jobs/Plasmaman/medsci.dm b/code/modules/clothing/under/jobs/Plasmaman/medsci.dm index 52f817dcce..e77021646a 100644 --- a/code/modules/clothing/under/jobs/Plasmaman/medsci.dm +++ b/code/modules/clothing/under/jobs/Plasmaman/medsci.dm @@ -21,7 +21,7 @@ desc = "A plasmaman envirosuit designed for the research director to aid them in their job of directing research into the right direction." icon_state = "rd_envirosuit" item_state = "rd_envirosuit" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95, "wound" = 5) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, RAD = 0, FIRE = 95, ACID = 95, WOUND = 5) /obj/item/clothing/under/plasmaman/robotics name = "robotics plasma envirosuit" diff --git a/code/modules/clothing/under/jobs/Plasmaman/security.dm b/code/modules/clothing/under/jobs/Plasmaman/security.dm index 262b336011..01a1effa14 100644 --- a/code/modules/clothing/under/jobs/Plasmaman/security.dm +++ b/code/modules/clothing/under/jobs/Plasmaman/security.dm @@ -3,7 +3,7 @@ desc = "A plasmaman containment suit designed for security officers, offering a limited amount of extra protection." icon_state = "security_envirosuit" item_state = "security_envirosuit" - armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95, "wound" = 10) + armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 0, FIRE = 95, ACID = 95, WOUND = 10) sensor_mode = SENSOR_COORDS sensor_flags = NONE diff --git a/code/modules/clothing/under/jobs/cargo.dm b/code/modules/clothing/under/jobs/cargo.dm index 832589a6b7..9f7a7fdd7f 100644 --- a/code/modules/clothing/under/jobs/cargo.dm +++ b/code/modules/clothing/under/jobs/cargo.dm @@ -51,7 +51,7 @@ /obj/item/clothing/under/rank/cargo/miner name = "shaft miner's jumpsuit" desc = "It's a snappy jumpsuit with a sturdy set of overalls. It is very dirty." - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 0, "wound" = 10) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 0, WOUND = 10) icon_state = "miner" item_state = "miner" diff --git a/code/modules/clothing/under/jobs/civilian/civilian.dm b/code/modules/clothing/under/jobs/civilian/civilian.dm index 2eabb0ce35..13f9a1fa75 100644 --- a/code/modules/clothing/under/jobs/civilian/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian/civilian.dm @@ -178,7 +178,7 @@ desc = "It's the official uniform of the station's janitor. It has minor protection from biohazards." name = "janitor's jumpsuit" icon_state = "janitor" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, WOUND = 5) /obj/item/clothing/under/rank/civilian/janitor/skirt name = "janitor's jumpskirt" diff --git a/code/modules/clothing/under/jobs/command.dm b/code/modules/clothing/under/jobs/command.dm index 6f2becbe63..2c70d8bcc8 100644 --- a/code/modules/clothing/under/jobs/command.dm +++ b/code/modules/clothing/under/jobs/command.dm @@ -3,7 +3,7 @@ name = "captain's jumpsuit" icon_state = "captain" item_state = "b_suit" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 15) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, WOUND = 15) sensor_mode = SENSOR_COORDS sensor_flags = NONE diff --git a/code/modules/clothing/under/jobs/engineering.dm b/code/modules/clothing/under/jobs/engineering.dm index 98dee44cb2..44bb8ca1dd 100644 --- a/code/modules/clothing/under/jobs/engineering.dm +++ b/code/modules/clothing/under/jobs/engineering.dm @@ -4,7 +4,7 @@ name = "chief engineer's jumpsuit" icon_state = "chiefengineer" item_state = "gy_suit" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 80, "acid" = 40, "wound" = 5) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 10, FIRE = 80, ACID = 40, WOUND = 5) resistance_flags = NONE /obj/item/clothing/under/rank/engineering/chief_engineer/skirt @@ -39,7 +39,7 @@ name = "engineer's jumpsuit" icon_state = "engine" item_state = "engi_suit" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 60, "acid" = 20, "wound" = 5) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 10, FIRE = 60, ACID = 20, WOUND = 5) resistance_flags = NONE /obj/item/clothing/under/rank/engineering/engineer/mechanic diff --git a/code/modules/clothing/under/jobs/medical.dm b/code/modules/clothing/under/jobs/medical.dm index 20fd34f4a0..48f3be3597 100644 --- a/code/modules/clothing/under/jobs/medical.dm +++ b/code/modules/clothing/under/jobs/medical.dm @@ -4,7 +4,7 @@ icon_state = "cmo" item_state = "w_suit" permeability_coefficient = 0.5 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, WOUND = 5) /obj/item/clothing/under/rank/medical/chief_medical_officer/skirt name = "chief medical officer's jumpskirt" @@ -30,7 +30,7 @@ icon_state = "genetics" item_state = "w_suit" permeability_coefficient = 0.5 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, WOUND = 5) /obj/item/clothing/under/rank/medical/geneticist/skirt name = "geneticist's jumpskirt" @@ -48,7 +48,7 @@ icon_state = "virology" item_state = "w_suit" permeability_coefficient = 0.5 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, WOUND = 5) /obj/item/clothing/under/rank/medical/virologist/skirt name = "virologist's jumpskirt" @@ -66,7 +66,7 @@ icon_state = "chemistry" item_state = "w_suit" permeability_coefficient = 0.5 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 50, "acid" = 65, "wound" = 5) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 50, ACID = 65, WOUND = 5) /obj/item/clothing/under/rank/medical/chemist/skirt name = "chemist's jumpskirt" @@ -84,7 +84,7 @@ icon_state = "paramedic-dark" item_state = "w_suit" permeability_coefficient = 0.5 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, WOUND = 5) /obj/item/clothing/under/rank/medical/paramedic/red name = "red paramedic jumpsuit" @@ -116,7 +116,7 @@ icon_state = "nursesuit" item_state = "w_suit" permeability_coefficient = 0.5 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, WOUND = 5) body_parts_covered = CHEST|GROIN|ARMS fitted = NO_FEMALE_UNIFORM can_adjust = FALSE @@ -128,7 +128,7 @@ icon_state = "medical" item_state = "w_suit" permeability_coefficient = 0.5 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, WOUND = 5) /obj/item/clothing/under/rank/medical/doctor/util name = "medical utility uniform" diff --git a/code/modules/clothing/under/jobs/rnd.dm b/code/modules/clothing/under/jobs/rnd.dm index d63e81a0a3..e8265aa4e9 100644 --- a/code/modules/clothing/under/jobs/rnd.dm +++ b/code/modules/clothing/under/jobs/rnd.dm @@ -3,7 +3,7 @@ name = "research director's vest suit" icon_state = "director" item_state = "lb_suit" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 35, "wound" = 5) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 10, BIO = 10, RAD = 0, FIRE = 0, ACID = 35, WOUND = 5) can_adjust = FALSE /obj/item/clothing/under/rank/rnd/research_director/skirt @@ -20,7 +20,7 @@ name = "research director's tan suit" icon_state = "rdwhimsy" item_state = "rdwhimsy" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, WOUND = 5) can_adjust = TRUE alt_covers_chest = TRUE @@ -39,7 +39,7 @@ name = "research director's turtleneck" icon_state = "rdturtle" item_state = "p_suit" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, WOUND = 5) can_adjust = TRUE alt_covers_chest = TRUE @@ -59,7 +59,7 @@ icon_state = "toxins" item_state = "w_suit" permeability_coefficient = 0.5 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, WOUND = 5) /obj/item/clothing/under/rank/rnd/scientist/util name = "science utility uniform" diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm index c0d08204f0..5a2ece4dda 100644 --- a/code/modules/clothing/under/jobs/security.dm +++ b/code/modules/clothing/under/jobs/security.dm @@ -19,7 +19,7 @@ desc = "A tactical security jumpsuit for officers complete with Nanotrasen belt buckle." icon_state = "rsecurity" item_state = "r_suit" - armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 30, "wound" = 10) + armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 30, ACID = 30, WOUND = 10) /obj/item/clothing/under/rank/security/officer/util name = "security utility uniform" @@ -96,7 +96,7 @@ desc = "A formal security suit for officers complete with Nanotrasen belt buckle." icon_state = "rwarden" item_state = "r_suit" - armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 30, "wound" = 10) + armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 30, ACID = 30, WOUND = 10) /obj/item/clothing/under/rank/security/warden/grey name = "grey security suit" @@ -130,7 +130,7 @@ desc = "Someone who wears this means business." icon_state = "detective" item_state = "det" - armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 30, "wound" = 10) + armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 30, ACID = 30, WOUND = 10) /obj/item/clothing/under/rank/security/detective/brown name = "dark boiled suit" @@ -177,7 +177,7 @@ desc = "A security jumpsuit decorated for those few with the dedication to achieve the position of Head of Security." icon_state = "rhos" item_state = "r_suit" - armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "wound" = 10) + armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, WOUND = 10) strip_delay = 60 /obj/item/clothing/under/rank/security/head_of_security/skirt diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 4dac5f1961..2071dd6930 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -65,7 +65,7 @@ gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS - armor = list("melee" = 100, "bullet" = 100, "laser" = 100,"energy" = 100, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "wound" = 1000) //wound defense at 100 wont stop wounds + armor = list(MELEE = 100, BULLET = 100, LASER = 100,ENERGY = 100, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, WOUND = 1000) //wound defense at 100 wont stop wounds cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS @@ -116,7 +116,7 @@ desc = "A special containment suit that allows plasma-based lifeforms to exist safely in an oxygenated environment, and automatically extinguishes them in a crisis. Despite being airtight, it's not spaceworthy." icon_state = "plasmaman" item_state = "plasmaman" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 0, FIRE = 95, ACID = 95) body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS mutantrace_variation = USE_TAUR_CLIP_MASK can_adjust = FALSE @@ -186,7 +186,7 @@ icon_state = "durathread" item_state = "durathread" can_adjust = TRUE - armor = list("melee" = 10, "laser" = 10, "fire" = 40, "acid" = 10, "bomb" = 5) + armor = list(MELEE = 10, LASER = 10, FIRE = 40, ACID = 10, BOMB = 5) /obj/item/clothing/under/misc/durathread/skirt name = "durathread jumpskirt" diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm index 58d5d26e86..a2bd8256d7 100644 --- a/code/modules/clothing/under/syndicate.dm +++ b/code/modules/clothing/under/syndicate.dm @@ -4,7 +4,7 @@ icon_state = "syndicate" item_state = "bl_suit" has_sensor = NO_SENSORS - armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40, "wound" = 5) + armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 40, WOUND = 5) alt_covers_chest = TRUE /obj/item/clothing/under/syndicate/skirt @@ -13,7 +13,7 @@ icon_state = "syndicate_skirt" item_state = "bl_suit" has_sensor = NO_SENSORS - armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40, "wound" = 5) + armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 40, WOUND = 5) alt_covers_chest = TRUE fitted = FEMALE_UNIFORM_TOP mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON @@ -24,7 +24,7 @@ icon_state = "bloodred_pajamas" item_state = "bl_suit" dummy_thick = TRUE - armor = list("melee" = 10, "bullet" = 10, "laser" = 10,"energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 50, "acid" = 40, "wound" = 10) + armor = list(MELEE = 10, BULLET = 10, LASER = 10,ENERGY = 10, BOMB = 0, BIO = 0, RAD = 10, FIRE = 50, ACID = 40, WOUND = 10) resistance_flags = FIRE_PROOF | ACID_PROOF can_adjust = FALSE @@ -33,21 +33,21 @@ desc = "Do operatives dream of nuclear sheep?" icon_state = "bloodred_pajamas" item_state = "bl_suit" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40, "wound" = 5) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 40, WOUND = 5) /obj/item/clothing/under/syndicate/tacticool name = "tacticool turtleneck" desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-." icon_state = "tactifool" item_state = "bl_suit" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40, "wound" = 5) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 40, WOUND = 5) /obj/item/clothing/under/syndicate/tacticool/skirt name = "tacticool skirtleneck" desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-." icon_state = "tactifool_skirt" item_state = "bl_suit" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40, "wound" = 5) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 40, WOUND = 5) fitted = FEMALE_UNIFORM_TOP mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON @@ -57,7 +57,7 @@ icon_state = "tactifool" item_state = "bl_suit" has_sensor = HAS_SENSORS - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, WOUND = 5) /obj/item/clothing/under/syndicate/cosmetic/skirt name = "tactitool skirtleneck" @@ -81,14 +81,14 @@ can_adjust = FALSE /obj/item/clothing/under/syndicate/camo/cosmetic - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) /obj/item/clothing/under/syndicate/soviet name = "Ratnik 5 tracksuit" desc = "Badly translated labels tell you to clean this in Vodka. Great for squatting in." icon_state = "trackpants" can_adjust = FALSE - armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5) + armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, WOUND = 5) resistance_flags = NONE /obj/item/clothing/under/syndicate/combat @@ -103,7 +103,7 @@ desc = "Military grade tracksuits for frontline squatting." icon_state = "rus_under" can_adjust = FALSE - armor = list("melee" = 5, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5) + armor = list(MELEE = 5, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, WOUND = 5) resistance_flags = NONE mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON @@ -113,7 +113,7 @@ icon_state = "syndicatebaseball" item_state = "syndicatebaseball" has_sensor = NO_SENSORS - armor = list("melee" = 15, "bullet" = 5, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40, "wound" = 10) + armor = list(MELEE = 15, BULLET = 5, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 40, WOUND = 10) alt_covers_chest = TRUE mutantrace_variation = USE_TAUR_CLIP_MASK diff --git a/code/modules/clothing/under/trek.dm b/code/modules/clothing/under/trek.dm index 89e42d2566..d86e32b1f6 100644 --- a/code/modules/clothing/under/trek.dm +++ b/code/modules/clothing/under/trek.dm @@ -108,7 +108,7 @@ /obj/item/clothing/under/trek/sec/orv desc = "An uniform worn by security officers since 2420s." - armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 30, "wound" = 10) + armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 30, ACID = 30, WOUND = 10) icon_state = "orv_sec" /obj/item/clothing/under/trek/medsci/orv @@ -129,7 +129,7 @@ /obj/item/clothing/under/trek/command/orv/sec name = "security command uniform" - armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "wound" = 10) + armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, WOUND = 10) desc = "An uniform worn by Heads of Security since 2550s." icon_state = "orv_com_sec" diff --git a/code/modules/events/holiday/xmas.dm b/code/modules/events/holiday/xmas.dm index 919a1d2949..e043caa29d 100644 --- a/code/modules/events/holiday/xmas.dm +++ b/code/modules/events/holiday/xmas.dm @@ -37,7 +37,7 @@ icon_state = "xmashat" desc = "A crappy paper hat that you are REQUIRED to wear." flags_inv = 0 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) /obj/effect/landmark/xmastree name = "christmas tree spawner" diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index ed6a087cd9..ddafe57f6f 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -327,7 +327,7 @@ user.DelayNextAction() for(var/datum/spacevine_mutation/SM in mutations) damage_dealt = SM.on_hit(src, user, I, damage_dealt) //on_hit now takes override damage as arg and returns new value for other mutations to permutate further - take_damage(damage_dealt, I.damtype, "melee", 1) + take_damage(damage_dealt, I.damtype, MELEE, 1) /obj/structure/spacevine/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index 1c151511af..3647072298 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -31,7 +31,7 @@ var/obj/item/bodypart/affecting = user.zone_selected //Find what the player is aiming at var/headarmor = 0 // Target's head armor - var/armor_block = min(90, target.run_armor_check(affecting, "melee", null, null,armour_penetration)) // For normal attack damage + var/armor_block = min(90, target.run_armor_check(affecting, MELEE, null, null,armour_penetration)) // For normal attack damage //If they have a hat/helmet and the user is targeting their head. if(affecting == BODY_ZONE_HEAD) diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm index 4e6a4f0765..d32d287800 100644 --- a/code/modules/hydroponics/grown/misc.dm +++ b/code/modules/hydroponics/grown/misc.dm @@ -377,7 +377,7 @@ var/obj/item/bodypart/affecting = user.zone_selected //Find what the player is aiming at if (affecting == BODY_ZONE_HEAD && prob(15)) //smash the nut open - var/armor_block = min(90, M.run_armor_check(affecting, "melee", null, null,armour_penetration)) // For normal attack damage + var/armor_block = min(90, M.run_armor_check(affecting, MELEE, null, null,armour_penetration)) // For normal attack damage M.apply_damage(force, BRUTE, affecting, armor_block) //Sound diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index ac27b4a30e..ea4fdb2486 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -36,7 +36,7 @@ hud_possible = list(DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_TRACK_HUD, DIAG_CIRCUIT_HUD) //diagnostic hud overlays max_integrity = 50 pass_flags = 0 - armor = list("melee" = 50, "bullet" = 70, "laser" = 70, "energy" = 100, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 0, "acid" = 0) + armor = list(MELEE = 50, BULLET = 70, LASER = 70, ENERGY = 100, BOMB = 10, BIO = 100, RAD = 100, FIRE = 0, ACID = 0) anchored = FALSE var/can_anchor = TRUE var/detail_color = COLOR_ASSEMBLY_BLACK diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index fb6992dd4e..153ca3dac9 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -24,7 +24,7 @@ opacity = FALSE resistance_flags = FLAMMABLE max_integrity = 200 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 0) var/state = BOOKCASE_UNANCHORED /// When enabled, books_to_load number of random books will be generated for this bookcase when first interacted with. var/load_random_books = FALSE diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm index dc52fb7f20..c7f6398c33 100644 --- a/code/modules/mining/equipment/explorer_gear.dm +++ b/code/modules/mining/equipment/explorer_gear.dm @@ -9,7 +9,7 @@ cold_protection = CHEST|GROIN|LEGS|ARMS min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT hoodtype = /obj/item/clothing/head/hooded/explorer - armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50) + armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 50, BIO = 100, RAD = 50, FIRE = 50, ACID = 50) flags_inv = HIDEJUMPSUIT|HIDETAUR allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe) resistance_flags = FIRE_PROOF @@ -27,7 +27,7 @@ flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT cold_protection = HEAD - armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50, "wound" = 10) + armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 50, BIO = 100, RAD = 50, FIRE = 50, ACID = 50, WOUND = 10) resistance_flags = FIRE_PROOF /obj/item/clothing/suit/hooded/explorer/standard @@ -81,7 +81,7 @@ visor_flags_inv = HIDEFACIALHAIR visor_flags_cover = MASKCOVERSMOUTH actions_types = list(/datum/action/item_action/adjust) - armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 5, "bio" = 50, "rad" = 0, "fire" = 20, "acid" = 40, "wound" = 5) + armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 5, BIO = 50, RAD = 0, FIRE = 20, ACID = 40, WOUND = 5) resistance_flags = FIRE_PROOF /obj/item/clothing/mask/gas/explorer/attack_self(mob/user) @@ -105,7 +105,7 @@ resistance_flags = FIRE_PROOF | LAVA_PROOF | ACID_PROOF | GOLIATH_RESISTANCE mutantrace_variation = STYLE_DIGITIGRADE|STYLE_SNEK_TAURIC|STYLE_PAW_TAURIC slowdown = 0 - armor = list("melee" = 70, "bullet" = 40, "laser" = 10, "energy" = 10, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) + armor = list(MELEE = 70, BULLET = 40, LASER = 10, ENERGY = 10, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 100) allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe) /obj/item/clothing/suit/space/hostile_environment/Initialize() @@ -134,7 +134,7 @@ w_class = WEIGHT_CLASS_NORMAL max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT clothing_flags = THICKMATERIAL // no space protection - armor = list("melee" = 70, "bullet" = 40, "laser" = 10, "energy" = 10, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) + armor = list(MELEE = 70, BULLET = 40, LASER = 10, ENERGY = 10, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 100) resistance_flags = FIRE_PROOF | LAVA_PROOF /obj/item/clothing/head/helmet/space/hostile_environment/Initialize() @@ -170,7 +170,7 @@ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS hoodtype = /obj/item/clothing/head/hooded/explorer/seva - armor = list("melee" = 15, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 35, "bio" = 50, "rad" = 25, "fire" = 100, "acid" = 25) + armor = list(MELEE = 15, BULLET = 10, LASER = 10, ENERGY = 10, BOMB = 35, BIO = 50, RAD = 25, FIRE = 100, ACID = 25) resistance_flags = FIRE_PROOF | GOLIATH_WEAKNESS /obj/item/clothing/head/hooded/explorer/seva @@ -179,7 +179,7 @@ icon_state = "seva" item_state = "seva" max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT - armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 35, "bio" = 50, "rad" = 25, "fire" = 100, "acid" = 25) + armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 10, BOMB = 35, BIO = 50, RAD = 25, FIRE = 100, ACID = 25) resistance_flags = FIRE_PROOF | GOLIATH_WEAKNESS /obj/item/clothing/mask/gas/seva @@ -199,7 +199,7 @@ w_class = WEIGHT_CLASS_BULKY heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS hoodtype = /obj/item/clothing/head/hooded/explorer/exo - armor = list("melee" = 55, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 40, "bio" = 25, "rad" = 10, "fire" = 0, "acid" = 0) + armor = list(MELEE = 55, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 40, BIO = 25, RAD = 10, FIRE = 0, ACID = 0) resistance_flags = FIRE_PROOF | GOLIATH_RESISTANCE /obj/item/clothing/head/hooded/explorer/exo @@ -207,7 +207,7 @@ desc = "A robust helmet for fighting dangerous animals. Its design and material make it harder for a Goliath to keep their grip on the wearer." icon_state = "exo" item_state = "exo" - armor = list("melee" = 55, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 40, "bio" = 25, "rad" = 10, "fire" = 0, "acid" = 0) + armor = list(MELEE = 55, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 40, BIO = 25, RAD = 10, FIRE = 0, ACID = 0) resistance_flags = FIRE_PROOF | GOLIATH_RESISTANCE /obj/item/clothing/mask/gas/exo diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index 409cdb825b..4b61ea9e13 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -133,7 +133,7 @@ C.total_damage += target_health - L.health //we did some damage, but let's not assume how much we did new /obj/effect/temp_visual/kinetic_blast(get_turf(L)) var/backstab_dir = get_dir(user, L) - var/def_check = L.getarmor(type = "bomb") + var/def_check = L.getarmor(type = BOMB) if((user.dir & backstab_dir) && (L.dir & backstab_dir)) if(!QDELETED(C)) C.total_damage += detonation_damage + backstab_bonus //cheat a little and add the total before killing it, so certain mobs don't have much lower chances of giving an item @@ -278,7 +278,7 @@ nodamage = TRUE damage = 0 //We're just here to mark people. This is still a melee weapon. damage_type = BRUTE - flag = "bomb" + flag = BOMB range = 6 log_override = TRUE var/obj/item/kinetic_crusher/hammer_synced diff --git a/code/modules/mining/equipment/marker_beacons.dm b/code/modules/mining/equipment/marker_beacons.dm index 296513af8d..d8e54ae322 100644 --- a/code/modules/mining/equipment/marker_beacons.dm +++ b/code/modules/mining/equipment/marker_beacons.dm @@ -73,7 +73,7 @@ GLOBAL_LIST_INIT(marker_beacon_colors, list( icon = 'icons/obj/lighting.dmi' icon_state = "marker" layer = BELOW_OPEN_DOOR_LAYER - armor = list("melee" = 50, "bullet" = 75, "laser" = 75, "energy" = 75, "bomb" = 25, "bio" = 100, "rad" = 100, "fire" = 25, "acid" = 0) + armor = list(MELEE = 50, BULLET = 75, LASER = 75, ENERGY = 75, BOMB = 25, BIO = 100, RAD = 100, FIRE = 25, ACID = 0) max_integrity = 50 anchored = TRUE light_range = 2 diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index 4167fdbde1..1a159a56bb 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -209,7 +209,7 @@ if(!parts.len) return var/obj/item/bodypart/picked = pick(parts) - if(picked.receive_damage(brute, burn, stamina,check_armor ? run_armor_check(picked, (brute ? "melee" : burn ? "fire" : stamina ? "bullet" : null)) : FALSE, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness)) + if(picked.receive_damage(brute, burn, stamina,check_armor ? run_armor_check(picked, (brute ? MELEE : burn ? FIRE : stamina ? BULLET : null)) : FALSE, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness)) update_damage_overlays() //Heal MANY bodyparts, in random order diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 9a3c9fff0c..2ba784d922 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -163,7 +163,7 @@ if(can_inject(M, 1, affecting))//Thick suits can stop monkey bites. if(..()) //successful monkey bite, this handles disease contraction. var/damage = rand(1, 3) - apply_damage(damage, BRUTE, affecting, run_armor_check(affecting, "melee")) + apply_damage(damage, BRUTE, affecting, run_armor_check(affecting, MELEE)) return 1 /mob/living/carbon/human/attack_alien(mob/living/carbon/alien/humanoid/M) @@ -183,7 +183,7 @@ var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected)) if(!affecting) affecting = get_bodypart(BODY_ZONE_CHEST) - var/armor_block = run_armor_check(affecting, "melee", null, null,10) + var/armor_block = run_armor_check(affecting, MELEE, null, null,10) playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1) visible_message("[M] has slashed at [src]!", \ @@ -219,7 +219,7 @@ var/obj/item/bodypart/affecting = get_bodypart(ran_zone(L.zone_selected)) if(!affecting) affecting = get_bodypart(BODY_ZONE_CHEST) - var/armor_block = run_armor_check(affecting, "melee") + var/armor_block = run_armor_check(affecting, MELEE) apply_damage(damage, BRUTE, affecting, armor_block) @@ -233,7 +233,7 @@ var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone)) if(!affecting) affecting = get_bodypart(BODY_ZONE_CHEST) - var/armor = run_armor_check(affecting, "melee", armour_penetration = M.armour_penetration) + var/armor = run_armor_check(affecting, MELEE, armour_penetration = M.armour_penetration) apply_damage(damage, M.melee_damage_type, affecting, armor, wound_bonus = M.wound_bonus, bare_wound_bonus = M.bare_wound_bonus, sharpness = M.sharpness) /mob/living/carbon/human/attack_slime(mob/living/simple_animal/slime/M) @@ -253,7 +253,7 @@ var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone)) if(!affecting) affecting = get_bodypart(BODY_ZONE_CHEST) - var/armor_block = run_armor_check(affecting, "melee") + var/armor_block = run_armor_check(affecting, MELEE) apply_damage(damage, BRUTE, affecting, armor_block, wound_bonus=wound_mod) @@ -265,7 +265,7 @@ return var/brute_loss = 0 var/burn_loss = 0 - var/bomb_armor = getarmor(null, "bomb") + var/bomb_armor = getarmor(null, BOMB) //200 max knockdown for EXPLODE_HEAVY //160 max knockdown for EXPLODE_LIGHT @@ -286,7 +286,7 @@ brute_loss = 500 var/atom/throw_target = get_edge_target_turf(src, get_dir(src, get_step_away(src, src))) throw_at(throw_target, 200, 4) - damage_clothes(400 - bomb_armor, BRUTE, "bomb") + damage_clothes(400 - bomb_armor, BRUTE, BOMB) if (EXPLODE_HEAVY) brute_loss = 60 @@ -294,7 +294,7 @@ if(bomb_armor) brute_loss = 30*(2 - round(bomb_armor*0.01, 0.05)) burn_loss = brute_loss //damage gets reduced from 120 to up to 60 combined brute+burn - damage_clothes(200 - bomb_armor, BRUTE, "bomb") + damage_clothes(200 - bomb_armor, BRUTE, BOMB) if (!istype(ears, /obj/item/clothing/ears/earmuffs)) adjustEarDamage(30, 120) Unconscious(20) //short amount of time for follow up attacks against elusive enemies like wizards @@ -305,7 +305,7 @@ brute_loss = 30 if(bomb_armor) brute_loss = 15*(2 - round(bomb_armor*0.01, 0.05)) - damage_clothes(max(50 - bomb_armor, 0), BRUTE, "bomb") + damage_clothes(max(50 - bomb_armor, 0), BRUTE, BOMB) if (!istype(ears, /obj/item/clothing/ears/earmuffs)) adjustEarDamage(15,60) Knockdown((160 - (bomb_armor * 1.6)) / 4) //100 bomb armor will prevent knockdown altogether @@ -318,7 +318,7 @@ var/max_limb_loss = round(4/severity) //so you don't lose four limbs at severity 3. for(var/X in bodyparts) var/obj/item/bodypart/BP = X - if(prob(50/severity) && !prob(getarmor(BP, "bomb")) && BP.body_zone != BODY_ZONE_HEAD && BP.body_zone != BODY_ZONE_CHEST) + if(prob(50/severity) && !prob(getarmor(BP, BOMB)) && BP.body_zone != BODY_ZONE_HEAD && BP.body_zone != BODY_ZONE_CHEST) BP.brute_dam = BP.max_damage BP.dismember() max_limb_loss-- @@ -332,7 +332,7 @@ show_message("The blob attacks you!") var/dam_zone = pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone)) - apply_damage(5, BRUTE, affecting, run_armor_check(affecting, "melee")) + apply_damage(5, BRUTE, affecting, run_armor_check(affecting, MELEE)) ///Calculates the siemens coeff based on clothing and species, can also restart hearts. diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index ee98288c5d..4eccbc62c7 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1696,7 +1696,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) return FALSE - var/armor_block = target.run_armor_check(affecting, "melee") + var/armor_block = target.run_armor_check(affecting, MELEE) playsound(target.loc, user.dna.species.attack_sound_override || attack_sound, 25, 1, -1) target.visible_message("[user] [atk_verb]ed [target]!", \ "[user] [atk_verb]ed you!", null, COMBAT_MESSAGE_RANGE, null, \ @@ -1905,7 +1905,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) hit_area = affecting.name var/def_zone = affecting.body_zone - var/armor_block = H.run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened a hit to your [hit_area].",I.armour_penetration) + var/armor_block = H.run_armor_check(affecting, MELEE, "Your armor has protected your [hit_area].", "Your armor has softened a hit to your [hit_area].",I.armour_penetration) armor_block = min(90,armor_block) //cap damage reduction at 90% var/Iforce = I.force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords) var/Iwound_bonus = I.wound_bonus @@ -2404,7 +2404,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) for(var/X in burning_items) var/obj/item/I = X if(!(I.resistance_flags & FIRE_PROOF)) - I.take_damage(H.fire_stacks, BURN, "fire", 0) + I.take_damage(H.fire_stacks, BURN, FIRE, 0) var/thermal_protection = H.easy_thermal_protection() diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index f90199c8ee..d33dbbe4e1 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -347,7 +347,7 @@ /datum/species/golem/sand/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H) if(!(P.original == H && P.firer == H)) - if(P.flag == "bullet" || P.flag == "bomb") + if(P.flag == BULLET || P.flag == BOMB) playsound(H, 'sound/effects/shovel_dig.ogg', 70, 1) H.visible_message("The [P.name] sinks harmlessly in [H]'s sandy body!", \ "The [P.name] sinks harmlessly in [H]'s sandy body!") @@ -379,7 +379,7 @@ /datum/species/golem/glass/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H) if(!(P.original == H && P.firer == H)) //self-shots don't reflect - if(P.flag == "laser" || P.flag == "energy") + if(P.flag == LASER || P.flag == ENERGY) H.visible_message("The [P.name] gets reflected by [H]'s glass skin!", \ "The [P.name] gets reflected by [H]'s glass skin!") if(P.starting) @@ -741,7 +741,7 @@ name = "pile of bandages" desc = "It emits a strange aura, as if there was still life within it..." max_integrity = 50 - armor = list("melee" = 90, "bullet" = 90, "laser" = 25, "energy" = 80, "bomb" = 50, "bio" = 100, "fire" = -50, "acid" = -50) + armor = list(MELEE = 90, BULLET = 90, LASER = 25, ENERGY = 80, BOMB = 50, BIO = 100, FIRE = -50, ACID = -50) icon = 'icons/obj/items_and_weapons.dmi' icon_state = "pile_bandages" resistance_flags = FLAMMABLE @@ -829,7 +829,7 @@ /datum/species/golem/bronze/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H) if(!(world.time > last_gong_time + gong_cooldown)) return ..() - if(P.flag == "bullet" || P.flag == "bomb") + if(P.flag == BULLET || P.flag == BOMB) gong(H) return ..() diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index f412099831..249ad5683b 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -211,7 +211,7 @@ visible_message("[S] is disintegrated by [src]!") else if(AM.light_range && AM.light_power && !(istype(AM, /obj/machinery/power/apc) || istype(AM, /obj/machinery/airalarm))) var/obj/target_object = AM - target_object.take_damage(force * 5, BRUTE, "melee", 0) + target_object.take_damage(force * 5, BRUTE, MELEE, 0) /obj/item/light_eater/proc/disintegrate(obj/item/O) diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index 480cbebe11..ffb0e329be 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -162,7 +162,7 @@ for(var/X in burning_items) var/obj/item/I = X if(!(I.resistance_flags & FIRE_PROOF)) - I.take_damage(fire_stacks, BURN, "fire", 0) + I.take_damage(fire_stacks, BURN, FIRE, 0) adjust_bodytemperature(BODYTEMP_HEATING_MAX) SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "on_fire", /datum/mood_event/on_fire) diff --git a/code/modules/mob/living/carbon/monkey/monkey_defense.dm b/code/modules/mob/living/carbon/monkey/monkey_defense.dm index 16b3c1a79e..80d968b229 100644 --- a/code/modules/mob/living/carbon/monkey/monkey_defense.dm +++ b/code/modules/mob/living/carbon/monkey/monkey_defense.dm @@ -195,14 +195,14 @@ if (EXPLODE_HEAVY) take_overall_damage(60, 60) - damage_clothes(200, BRUTE, "bomb") + damage_clothes(200, BRUTE, BOMB) adjustEarDamage(30, 120) if(prob(70)) Unconscious(200) if(EXPLODE_LIGHT) take_overall_damage(30, 0) - damage_clothes(50, BRUTE, "bomb") + damage_clothes(50, BRUTE, BOMB) adjustEarDamage(15,60) if (prob(50)) Unconscious(160) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index bf3094cb08..05e9f929f3 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1124,7 +1124,7 @@ amount -= RAD_BACKGROUND_RADIATION // This will always be at least 1 because of how skin protection is calculated - var/blocked = getarmor(null, "rad") + var/blocked = getarmor(null, RAD) if(amount > RAD_BURN_THRESHOLD) apply_damage((amount-RAD_BURN_THRESHOLD)/RAD_BURN_THRESHOLD, BURN, null, blocked) @@ -1153,7 +1153,7 @@ visible_message("[src] catches fire!", \ "You're set on fire!") new/obj/effect/dummy/lighting_obj/moblight/fire(src) - throw_alert("fire", /atom/movable/screen/alert/fire) + throw_alert(FIRE, /atom/movable/screen/alert/fire) update_fire() SEND_SIGNAL(src, COMSIG_LIVING_IGNITED,src) return TRUE diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index b687986a40..3ef173de48 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -1,5 +1,5 @@ -/mob/living/proc/run_armor_check(def_zone = null, attack_flag = "melee", absorb_text = "Your armor absorbs the blow!", soften_text = "Your armor softens the blow!", armour_penetration, penetrated_text = "Your armor was penetrated!", silent=FALSE) +/mob/living/proc/run_armor_check(def_zone = null, attack_flag = MELEE, absorb_text = "Your armor absorbs the blow!", soften_text = "Your armor softens the blow!", armour_penetration, penetrated_text = "Your armor was penetrated!", silent=FALSE) var/armor = getarmor(def_zone, attack_flag) if(silent) @@ -141,7 +141,7 @@ "You're hit by [I]!") if(!I.throwforce) return - var/armor = run_armor_check(impacting_zone, "melee", "Your armor has protected your [parse_zone(impacting_zone)].", "Your armor has softened hit to your [parse_zone(impacting_zone)].",I.armour_penetration) + var/armor = run_armor_check(impacting_zone, MELEE, "Your armor has protected your [parse_zone(impacting_zone)].", "Your armor has softened hit to your [parse_zone(impacting_zone)].",I.armour_penetration) apply_damage(I.throwforce, dtype, impacting_zone, armor, sharpness=I.get_sharpness(), wound_bonus=(nosell_hit * CANT_WOUND)) else return 1 diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm index b003e066ef..87b3d405df 100644 --- a/code/modules/mob/living/simple_animal/animal_defense.dm +++ b/code/modules/mob/living/simple_animal/animal_defense.dm @@ -110,7 +110,7 @@ return return ..() -/mob/living/simple_animal/proc/attack_threshold_check(damage, damagetype = BRUTE, armorcheck = "melee") +/mob/living/simple_animal/proc/attack_threshold_check(damage, damagetype = BRUTE, armorcheck = MELEE) var/temp_damage = damage if(!damage_coeff[damagetype]) temp_damage = 0 @@ -135,7 +135,7 @@ if(origin && istype(origin, /datum/spacevine_mutation) && isvineimmune(src)) return ..() - var/bomb_armor = getarmor(null, "bomb") + var/bomb_armor = getarmor(null, BOMB) switch (severity) if (EXPLODE_DEVASTATE) if(prob(bomb_armor)) diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 56e2f66feb..f4aea6b284 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -631,12 +631,12 @@ playsound(loc, 'sound/effects/splat.ogg', 50, TRUE) var/damage = rand(5,15) - H.apply_damage(2*damage, BRUTE, BODY_ZONE_HEAD, run_armor_check(BODY_ZONE_HEAD, "melee")) - H.apply_damage(2*damage, BRUTE, BODY_ZONE_CHEST, run_armor_check(BODY_ZONE_CHEST, "melee")) - H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_L_LEG, run_armor_check(BODY_ZONE_L_LEG, "melee")) - H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_R_LEG, run_armor_check(BODY_ZONE_R_LEG, "melee")) - H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_L_ARM, run_armor_check(BODY_ZONE_L_ARM, "melee")) - H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_R_ARM, run_armor_check(BODY_ZONE_R_ARM, "melee")) + H.apply_damage(2*damage, BRUTE, BODY_ZONE_HEAD, run_armor_check(BODY_ZONE_HEAD, MELEE)) + H.apply_damage(2*damage, BRUTE, BODY_ZONE_CHEST, run_armor_check(BODY_ZONE_CHEST, MELEE)) + H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_L_LEG, run_armor_check(BODY_ZONE_L_LEG, MELEE)) + H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_R_LEG, run_armor_check(BODY_ZONE_R_LEG, MELEE)) + H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_L_ARM, run_armor_check(BODY_ZONE_L_ARM, MELEE)) + H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_R_ARM, run_armor_check(BODY_ZONE_R_ARM, MELEE)) var/turf/T = get_turf(src) T.add_mob_blood(H) diff --git a/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm b/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm index 9b50587b3d..61b8652287 100644 --- a/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm +++ b/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm @@ -37,4 +37,4 @@ icon_state = "declone" damage = 4 damage_type = BURN - flag = "energy" + flag = ENERGY diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm b/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm index 0f25688b6a..2d773c67bb 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm @@ -42,7 +42,7 @@ damage = 10 damage_type = BURN light_range = 2 - flag = "energy" + flag = ENERGY light_color = LIGHT_COLOR_YELLOW hitsound = 'sound/weapons/sear.ogg' hitsound_wall = 'sound/weapons/effects/searwall.ogg' diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index 9bcc21efa6..32b51de6e0 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -299,7 +299,7 @@ Difficulty: Hard to_chat(L, "[src] rends you!") playsound(T, attack_sound, 100, 1, -1) var/limb_to_hit = L.get_bodypart(pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG)) - L.apply_damage(10, BRUTE, limb_to_hit, L.run_armor_check(limb_to_hit, "melee", null, null, armour_penetration)) + L.apply_damage(10, BRUTE, limb_to_hit, L.run_armor_check(limb_to_hit, MELEE, null, null, armour_penetration)) sleep(3) /mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodgrab(turf/T, handedness) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index 8ac3649604..9d12494268 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -268,7 +268,7 @@ Difficulty: Medium if(M in hit_list) continue hit_list += M - M.take_damage(45, BRUTE, "melee", 1) + M.take_damage(45, BRUTE, MELEE, 1) sleep(1.5) /mob/living/simple_animal/hostile/megafauna/dragon/proc/swoop_attack(lava_arena = FALSE, atom/movable/manual_target, var/swoop_cooldown = 30) @@ -351,7 +351,7 @@ Difficulty: Medium L.throw_at(throwtarget, 3) visible_message("[L] is thrown clear of [src]!") for(var/obj/vehicle/sealed/mecha/M in orange(1, src)) - M.take_damage(75, BRUTE, "melee", 1) + M.take_damage(75, BRUTE, MELEE, 1) for(var/mob/M in range(7, src)) shake_camera(M, 15, 1) @@ -410,7 +410,7 @@ Difficulty: Medium // deals damage to mechs for(var/obj/vehicle/sealed/mecha/M in T.contents) - M.take_damage(45, BRUTE, "melee", 1) + M.take_damage(45, BRUTE, MELEE, 1) // changes turf to lava temporarily if(!istype(T, /turf/closed) && !istype(T, /turf/open/lava)) @@ -542,5 +542,5 @@ Difficulty: Medium if(M in hit_list) continue hit_list += M - M.take_damage(45, BRUTE, "melee", 1) + M.take_damage(45, BRUTE, MELEE, 1) sleep(1.5) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index ed9e4b9112..442d6526c0 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -643,7 +643,7 @@ Difficulty: Normal playsound(L,'sound/weapons/sear.ogg', 50, 1, -4) to_chat(L, "You're struck by a [name]!") var/limb_to_hit = L.get_bodypart(pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG)) - var/armor = L.run_armor_check(limb_to_hit, "melee", "Your armor absorbs [src]!", "Your armor blocks part of [src]!", 50, "Your armor was penetrated by [src]!") + var/armor = L.run_armor_check(limb_to_hit, MELEE, "Your armor absorbs [src]!", "Your armor blocks part of [src]!", 50, "Your armor was penetrated by [src]!") L.apply_damage(damage, BURN, limb_to_hit, armor, wound_bonus=CANT_WOUND) if(ishostile(L)) var/mob/living/simple_animal/hostile/H = L //mobs find and damage you... diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm index 15bfe2b7f7..a01cebf49b 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm @@ -335,7 +335,7 @@ SHITCODE AHEAD. BE ADVISED. Also comment extravaganza anchored = TRUE density = TRUE layer = ABOVE_OBJ_LAYER - armor = list("melee" = 0, "bullet" = 0, "laser" = 100,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 100,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) ///What kind of projectile the actual damaging part should be. var/projectile_type = /obj/item/projectile/beam/legion ///Time until the tracer gets shot diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm index c5be239b3b..5285b2a3a8 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm @@ -42,7 +42,7 @@ damage = 0 damage_type = BURN nodamage = 1 - flag = "energy" + flag = ENERGY temperature = 50 /mob/living/simple_animal/hostile/asteroid/basilisk/GiveTarget(new_target) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm index be596b0292..741eacace5 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm @@ -122,7 +122,7 @@ While using this makes the system rely on OnFire, it still gives options for tim /obj/structure/elite_tumor name = "pulsing tumor" desc = "An odd, pulsing tumor sticking out of the ground. You feel compelled to reach out and touch it..." - armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) + armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100) resistance_flags = INDESTRUCTIBLE var/activity = TUMOR_INACTIVE var/boosted = FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm index 1179a95135..f8931aa27b 100644 --- a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm @@ -530,7 +530,7 @@ /obj/structure/carp_rift name = "carp rift" desc = "A rift akin to the ones space carp use to travel long distances." - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 100) max_integrity = 300 icon = 'icons/obj/carp_rift.dmi' icon_state = "carp_rift_carpspawn" @@ -637,7 +637,7 @@ icon_state = "carp_rift_charged" light_color = LIGHT_COLOR_YELLOW update_light() - armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) + armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100) resistance_flags = INDESTRUCTIBLE dragon.rifts_charged += 1 if(dragon.rifts_charged != 3 && !dragon.objective_complete) diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index 1d90c3a651..3374b01eb9 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -10,7 +10,7 @@ integrity_failure = 0.5 max_integrity = 100 rad_flags = RAD_PROTECT_CONTENTS - armor = list("melee" = 0, "bullet" = 20, "laser" = 20, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 20, LASER = 20, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 0, ACID = 0) var/enabled = 0 // Whether the computer is turned on. var/screen_on = 1 // Whether the computer is active/opened/it's screen is on. diff --git a/code/modules/modular_computers/computers/item/computer_damage.dm b/code/modules/modular_computers/computers/item/computer_damage.dm index 9053aebcd5..042b3937aa 100644 --- a/code/modules/modular_computers/computers/item/computer_damage.dm +++ b/code/modules/modular_computers/computers/item/computer_damage.dm @@ -2,9 +2,9 @@ . = ..() var/component_probability = min(50, max(damage_amount*0.1, 1 - obj_integrity/max_integrity)) switch(damage_flag) - if("bullet") + if(BULLET) component_probability = damage_amount * 0.5 - if("laser") + if(LASER) component_probability = damage_amount * 0.66 if(component_probability) for(var/I in all_components) diff --git a/code/modules/newscaster/newscaster_machine.dm b/code/modules/newscaster/newscaster_machine.dm index c81a8f5d1a..5bc0929465 100644 --- a/code/modules/newscaster/newscaster_machine.dm +++ b/code/modules/newscaster/newscaster_machine.dm @@ -16,7 +16,7 @@ GLOBAL_LIST_EMPTY(allCasters) verb_say = "beeps" verb_ask = "beeps" verb_exclaim = "beeps" - armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30) + armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30) max_integrity = 200 integrity_failure = 0.25 var/screen = 0 @@ -614,7 +614,7 @@ GLOBAL_LIST_EMPTY(allCasters) if(user.a_intent != INTENT_HARM) to_chat(user, "The newscaster controls are far too complicated for your tiny brain!") else - take_damage(5, BRUTE, "melee") + take_damage(5, BRUTE, MELEE) /obj/machinery/newscaster/proc/AttachPhoto(mob/user) var/obj/item/photo/photo = user.is_holding_item_of_type(/obj/item/photo) diff --git a/code/modules/ninja/suit/head.dm b/code/modules/ninja/suit/head.dm index 99dde98f09..36c3eb71d1 100644 --- a/code/modules/ninja/suit/head.dm +++ b/code/modules/ninja/suit/head.dm @@ -11,7 +11,7 @@ name = "ninja hood" icon_state = "s-ninja" item_state = "s-ninja_mask" - armor = list("melee" = 40, "bullet" = 30, "laser" = 20,"energy" = 30, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 100, "acid" = 100) + armor = list(MELEE = 40, BULLET = 30, LASER = 20,ENERGY = 30, BOMB = 30, BIO = 30, RAD = 30, FIRE = 100, ACID = 100) resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF blockTracking = TRUE//Roughly the only unique thing about this helmet. flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR diff --git a/code/modules/ninja/suit/shoes.dm b/code/modules/ninja/suit/shoes.dm index 4f46a1bfc6..fdc9c068ac 100644 --- a/code/modules/ninja/suit/shoes.dm +++ b/code/modules/ninja/suit/shoes.dm @@ -14,7 +14,7 @@ permeability_coefficient = 0.01 clothing_flags = NOSLIP resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF - armor = list("melee" = 40, "bullet" = 30, "laser" = 20,"energy" = 30, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 100, "acid" = 100) + armor = list(MELEE = 40, BULLET = 30, LASER = 20,ENERGY = 30, BOMB = 30, BIO = 30, RAD = 30, FIRE = 100, ACID = 100) cold_protection = FEET min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT heat_protection = FEET diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm index d9d362c43c..e583c6ae44 100644 --- a/code/modules/ninja/suit/suit.dm +++ b/code/modules/ninja/suit/suit.dm @@ -16,7 +16,7 @@ allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals, /obj/item/stock_parts/cell) slowdown = 1 resistance_flags = LAVA_PROOF | ACID_PROOF - armor = list("melee" = 40, "bullet" = 30, "laser" = 20,"energy" = 30, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 100, "acid" = 100) + armor = list(MELEE = 40, BULLET = 30, LASER = 20,ENERGY = 30, BOMB = 30, BIO = 30, RAD = 30, FIRE = 100, ACID = 100) actions_types = list(/datum/action/item_action/initialize_ninja_suit, /datum/action/item_action/ninjastatus, /datum/action/item_action/ninjaboost, /datum/action/item_action/ninjapulse, /datum/action/item_action/ninjastar, /datum/action/item_action/ninjanet, /datum/action/item_action/ninja_sword_recall, /datum/action/item_action/ninja_stealth) diff --git a/code/modules/pool/pool_main.dm b/code/modules/pool/pool_main.dm index 088c991ca0..691c22a9c5 100644 --- a/code/modules/pool/pool_main.dm +++ b/code/modules/pool/pool_main.dm @@ -130,7 +130,7 @@ H.visible_message("[H] falls in and takes a drink!", "You fall in and swallow some water!") playsound(src, 'sound/effects/splash.ogg', 60, TRUE, 1) - else if(!H.head || !(H.head.armor.getRating("melee") > 20)) + else if(!H.head || !(H.head.armor.getRating(MELEE) > 20)) if(prob(75)) H.visible_message("[H] falls in the drained pool!", "You fall in the drained pool!") diff --git a/code/modules/power/antimatter/control.dm b/code/modules/power/antimatter/control.dm index f8f31f6990..59555ac4de 100644 --- a/code/modules/power/antimatter/control.dm +++ b/code/modules/power/antimatter/control.dm @@ -121,7 +121,7 @@ /obj/machinery/power/am_control_unit/bullet_act(obj/item/projectile/Proj) . = ..() - if(Proj.flag != "bullet") + if(Proj.flag != BULLET) stability -= Proj.force check_stability() diff --git a/code/modules/power/antimatter/shielding.dm b/code/modules/power/antimatter/shielding.dm index 52478e532e..279d23f3dc 100644 --- a/code/modules/power/antimatter/shielding.dm +++ b/code/modules/power/antimatter/shielding.dm @@ -102,7 +102,7 @@ /obj/machinery/am_shielding/bullet_act(obj/item/projectile/Proj) . = ..() - if(Proj.flag != "bullet") + if(Proj.flag != BULLET) stability -= Proj.force/2 check_stability() diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 2e38fdd840..84a0ef96c1 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -119,7 +119,7 @@ integrity_failure = 0.17 damage_deflection = 10 resistance_flags = FIRE_PROOF - armor = list("melee" = 40, "bullet" = 40, "laser" = 40, "energy" = 100, "bomb" = 30, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 50) + armor = list(MELEE = 40, BULLET = 40, LASER = 40, ENERGY = 100, BOMB = 30, BIO = 100, RAD = 100, FIRE = 90, ACID = 50) req_access = list(ACCESS_ENGINE_EQUIP) interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON @@ -852,7 +852,7 @@ set_nightshift(!nightshift_lights) /obj/machinery/power/apc/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) - if(damage_flag == "melee" && damage_amount < 10 && (!(stat & BROKEN) || malfai)) + if(damage_flag == MELEE && damage_amount < 10 && (!(stat & BROKEN) || malfai)) return 0 . = ..() diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 00487ee607..2d05b01064 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -43,7 +43,7 @@ anchored = TRUE layer = WALL_OBJ_LAYER max_integrity = 200 - armor = list("melee" = 50, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50) + armor = list(MELEE = 50, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 50) var/stage = 1 var/fixture_type = "tube" diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index af2237a426..23150b198b 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -33,7 +33,7 @@ field_generator power level display use_power = NO_POWER_USE max_integrity = 500 //100% immune to lasers and energy projectiles since it absorbs their energy. - armor = list("melee" = 25, "bullet" = 10, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 70) + armor = list(MELEE = 25, BULLET = 10, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 70) var/const/num_power_levels = 6 // Total number of power level icon has var/power_level = 0 var/active = FG_OFFLINE @@ -158,7 +158,7 @@ field_generator power level display ..() /obj/machinery/field/generator/bullet_act(obj/item/projectile/Proj) - if(Proj.flag != "bullet") + if(Proj.flag != BULLET) power = min(power + Proj.damage, field_generator_max_power) check_power_level() ..() diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index 60c97eda76..6938352d16 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -27,7 +27,7 @@ anchored = FALSE density = TRUE max_integrity = 500 - armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 80) + armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 90, ACID = 80) var/obj/machinery/particle_accelerator/control_box/master = null var/construction_state = PA_CONSTRUCTION_UNSECURED diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 22ce4e7ce5..7ffe5cfa19 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -728,7 +728,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) return FALSE if(!istype(Proj.firer, /obj/machinery/power/emitter) && power_changes) investigate_log("has been hit by [Proj] fired by [key_name(Proj.firer)]", INVESTIGATE_SUPERMATTER) - if(Proj.flag != "bullet") + if(Proj.flag != BULLET) if(power_changes) //This needs to be here I swear power += Proj.damage * bullet_energy if(!has_been_powered) diff --git a/code/modules/projectiles/ammunition/caseless/misc.dm b/code/modules/projectiles/ammunition/caseless/misc.dm index 8b783ff6aa..12be41a551 100644 --- a/code/modules/projectiles/ammunition/caseless/misc.dm +++ b/code/modules/projectiles/ammunition/caseless/misc.dm @@ -10,7 +10,7 @@ /obj/item/ammo_casing/caseless/laser name = "laser casing" desc = "You shouldn't be seeing this." - caliber = "laser" + caliber = LASER icon_state = "s-casing-live" projectile_type = /obj/item/projectile/beam fire_sound = 'sound/weapons/laser.ogg' diff --git a/code/modules/projectiles/ammunition/energy/_energy.dm b/code/modules/projectiles/ammunition/energy/_energy.dm index 10de173ecc..02fb510a2e 100644 --- a/code/modules/projectiles/ammunition/energy/_energy.dm +++ b/code/modules/projectiles/ammunition/energy/_energy.dm @@ -1,7 +1,7 @@ /obj/item/ammo_casing/energy name = "energy weapon lens" desc = "The part of the gun that makes the laser go pew." - caliber = "energy" + caliber = ENERGY projectile_type = /obj/item/projectile/energy var/e_cost = 100 //The amount of energy a cell needs to expend to create this shot. var/select_name = "energy" diff --git a/code/modules/projectiles/boxes_magazines/external/rechargable.dm b/code/modules/projectiles/boxes_magazines/external/rechargable.dm index 76d8f217ab..d6443b9d02 100644 --- a/code/modules/projectiles/boxes_magazines/external/rechargable.dm +++ b/code/modules/projectiles/boxes_magazines/external/rechargable.dm @@ -3,7 +3,7 @@ desc = "A rechargeable, detachable battery that serves as a magazine for laser rifles." icon_state = "oldrifle-20" ammo_type = /obj/item/ammo_casing/caseless/laser - caliber = "laser" + caliber = LASER max_ammo = 20 /obj/item/ammo_box/magazine/recharge/update_icon() diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 4d394401c4..833ddfd4c5 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -42,7 +42,7 @@ icon_state = null damage = 50 damage_type = BRUTE - flag = "bomb" + flag = BOMB range = 4 log_override = TRUE @@ -220,7 +220,7 @@ icon_state = null damage = 40 damage_type = BRUTE - flag = "bomb" + flag = BOMB range = 3 log_override = TRUE diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm index 2ef974a450..45a5cae4a2 100644 --- a/code/modules/projectiles/guns/misc/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -408,7 +408,7 @@ hitsound = 'sound/effects/explosion3.ogg' damage = 0 //Handled manually. damage_type = BURN - flag = "energy" + flag = ENERGY range = 150 jitter = 10 var/obj/item/gun/energy/beam_rifle/gun @@ -445,7 +445,7 @@ if(!isitem(O)) if(O.level == 1) //Please don't break underfloor items! continue - O.take_damage(aoe_structure_damage * get_damage_coeff(O), BURN, "laser", FALSE) + O.take_damage(aoe_structure_damage * get_damage_coeff(O), BURN, LASER, FALSE) /obj/item/projectile/beam/beam_rifle/proc/check_pierce(atom/target) if(!do_pierce) @@ -467,7 +467,7 @@ if(structure_pierce < structure_pierce_amount) if(isobj(AM)) var/obj/O = AM - O.take_damage((impact_structure_damage + aoe_structure_damage) * structure_bleed_coeff * get_damage_coeff(AM), BURN, "energy", FALSE) + O.take_damage((impact_structure_damage + aoe_structure_damage) * structure_bleed_coeff * get_damage_coeff(AM), BURN, ENERGY, FALSE) pierced[AM] = TRUE structure_pierce++ return TRUE @@ -485,7 +485,7 @@ /obj/item/projectile/beam/beam_rifle/proc/handle_impact(atom/target) if(isobj(target)) var/obj/O = target - O.take_damage(impact_structure_damage * get_damage_coeff(target), BURN, "laser", FALSE) + O.take_damage(impact_structure_damage * get_damage_coeff(target), BURN, LASER, FALSE) if(isliving(target)) var/mob/living/L = target L.adjustFireLoss(impact_direct_damage) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 8d467c9901..4bfe8a2ec1 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -123,7 +123,7 @@ var/damage = 10 var/damage_type = BRUTE //BRUTE, BURN, TOX, OXY, CLONE are the only things that should be in here var/nodamage = 0 //Determines if the projectile will skip any damage inflictions - var/flag = "bullet" //Defines what armor to use when it hits things. Must be set to bullet, laser, energy,or bomb + var/flag = BULLET //Defines what armor to use when it hits things. Must be set to bullet, laser, energy,or bomb var/projectile_type = /obj/item/projectile /// Range of the projectile, de-incrementing every step. The projectile deletes itself at 0. This is in tiles. var/range = 50 @@ -438,9 +438,9 @@ CRASH("Invalid return value for projectile ricochet check from [A].") /obj/item/projectile/proc/check_ricochet_flag(atom/A) - if((flag in list("energy", "laser")) && (A.flags_ricochet & RICOCHET_SHINY)) + if((flag in list(ENERGY, LASER)) && (A.flags_ricochet & RICOCHET_SHINY)) return TRUE - if((flag in list("bomb", "bullet")) && (A.flags_ricochet & RICOCHET_HARD)) + if((flag in list(BOMB, BULLET)) && (A.flags_ricochet & RICOCHET_HARD)) return TRUE return FALSE diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 79e9ab8b4b..dcc0408610 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -7,7 +7,7 @@ damage_type = BURN hitsound = 'sound/weapons/sear.ogg' hitsound_wall = 'sound/weapons/effects/searwall.ogg' - flag = "laser" + flag = LASER eyeblur = 2 impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser light_color = LIGHT_COLOR_RED @@ -85,7 +85,7 @@ icon_state = "omnilaser" damage = 28 // Citadel change for balance from 36 damage_type = STAMINA - flag = "energy" + flag = ENERGY hitsound = 'sound/weapons/tap.ogg' eyeblur = 0 pixels_per_second = TILES_TO_PIXELS(16.667) @@ -150,7 +150,7 @@ hitsound = null damage = 0 damage_type = STAMINA - flag = "laser" + flag = LASER var/suit_types = list(/obj/item/clothing/suit/redtag, /obj/item/clothing/suit/bluetag) impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser light_color = LIGHT_COLOR_BLUE @@ -231,7 +231,7 @@ hitsound = 'sound/weapons/shrink_hit.ogg' damage = 0 damage_type = STAMINA - flag = "energy" + flag = ENERGY impact_effect_type = /obj/effect/temp_visual/impact_effect/shrink light_color = LIGHT_COLOR_BLUE var/shrink_time = 90 diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index b408957aa7..5b488f629f 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -5,7 +5,7 @@ damage_type = BRUTE nodamage = FALSE candink = TRUE - flag = "bullet" + flag = BULLET hitsound_wall = "ricochet" impact_effect_type = /obj/effect/temp_visual/impact_effect sharpness = SHARP_POINTY diff --git a/code/modules/projectiles/projectile/bullets/sniper.dm b/code/modules/projectiles/projectile/bullets/sniper.dm index f69b62a149..e08fb72122 100644 --- a/code/modules/projectiles/projectile/bullets/sniper.dm +++ b/code/modules/projectiles/projectile/bullets/sniper.dm @@ -13,7 +13,7 @@ /obj/item/projectile/bullet/p50/on_hit(atom/target, blocked = 0) if(isobj(target) && (blocked != 100) && breakthings) var/obj/O = target - O.take_damage(80, BRUTE, "bullet", FALSE) + O.take_damage(80, BRUTE, BULLET, FALSE) return ..() /obj/item/projectile/bullet/p50/soporific diff --git a/code/modules/projectiles/projectile/energy/_energy.dm b/code/modules/projectiles/projectile/energy/_energy.dm index ec80ae1e74..9a803af46c 100644 --- a/code/modules/projectiles/projectile/energy/_energy.dm +++ b/code/modules/projectiles/projectile/energy/_energy.dm @@ -3,6 +3,6 @@ icon_state = "spark" damage = 0 damage_type = BURN - flag = "energy" + flag = ENERGY is_reflectable = TRUE diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 76cd1a6bc5..dc90d85f82 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -5,7 +5,7 @@ damage_type = OXY nodamage = 1 armour_penetration = 100 - flag = "magic" + flag = MAGIC /obj/item/projectile/magic/death name = "bolt of death" @@ -302,7 +302,7 @@ icon_state = "lavastaff" damage = 15 damage_type = BURN - flag = "magic" + flag = MAGIC dismemberment = 50 nodamage = 0 @@ -322,7 +322,7 @@ damage_type = BURN nodamage = 0 armour_penetration = 0 - flag = "magic" + flag = MAGIC hitsound = 'sound/weapons/barragespellhit.ogg' /obj/item/projectile/magic/arcane_barrage/on_hit(target) @@ -339,7 +339,7 @@ name = "locker bolt" icon_state = "locker" nodamage = TRUE - flag = "magic" + flag = MAGIC var/weld = TRUE var/created = FALSE //prevents creation of more then one locker if it has multiple hits var/locker_suck = TRUE @@ -437,7 +437,7 @@ damage_type = BURN nodamage = 0 pixels_per_second = TILES_TO_PIXELS(33.33) - flag = "magic" + flag = MAGIC var/zap_power = 20000 var/zap_range = 15 diff --git a/code/modules/projectiles/projectile/magic/spellcard.dm b/code/modules/projectiles/projectile/magic/spellcard.dm index 5015a97e78..efd3373dd9 100644 --- a/code/modules/projectiles/projectile/magic/spellcard.dm +++ b/code/modules/projectiles/projectile/magic/spellcard.dm @@ -12,7 +12,7 @@ icon_state = "spellcard" damage_type = BURN damage = 12 - flag = "magic" + flag = MAGIC /obj/item/projectile/magic/spellcard/book/spark damage = 4 @@ -25,7 +25,7 @@ if(M.anti_magic_check()) M.visible_message("[src] vanishes on contact with [target]!") return BULLET_ACT_BLOCK - + if(iscarbon(target)) M.adjust_fire_stacks(fire_stacks) M.IgniteMob() diff --git a/code/modules/projectiles/projectile/plasma.dm b/code/modules/projectiles/projectile/plasma.dm index 474a3d95c7..649de58742 100644 --- a/code/modules/projectiles/projectile/plasma.dm +++ b/code/modules/projectiles/projectile/plasma.dm @@ -1,7 +1,7 @@ /obj/item/projectile/energy/plasmabolt name = "plasma bolt" icon_state = "plasma" - flag = "energy" + flag = ENERGY damage_type = BURN hitsound = 'sound/weapons/sear.ogg' hitsound_wall = 'sound/weapons/effects/searwall.ogg' diff --git a/code/modules/projectiles/projectile/special/floral.dm b/code/modules/projectiles/projectile/special/floral.dm index b855322f09..9eb6131cbe 100644 --- a/code/modules/projectiles/projectile/special/floral.dm +++ b/code/modules/projectiles/projectile/special/floral.dm @@ -4,7 +4,7 @@ damage = 0 damage_type = TRUE nodamage = 1 - flag = "energy" + flag = ENERGY /obj/item/projectile/energy/floramut/on_hit(atom/target, blocked = FALSE) . = ..() @@ -22,7 +22,7 @@ damage = 0 damage_type = TOX nodamage = TRUE - flag = "energy" + flag = ENERGY /obj/item/projectile/energy/florarevolution name = "gamma somatorary" @@ -30,4 +30,4 @@ damage = 0 damage_type = TOX nodamage = TRUE - flag = "energy" + flag = ENERGY diff --git a/code/modules/projectiles/projectile/special/ion.dm b/code/modules/projectiles/projectile/special/ion.dm index 41331f6738..835c148986 100644 --- a/code/modules/projectiles/projectile/special/ion.dm +++ b/code/modules/projectiles/projectile/special/ion.dm @@ -4,7 +4,7 @@ damage = 0 damage_type = BURN nodamage = TRUE - flag = "energy" + flag = ENERGY impact_effect_type = /obj/effect/temp_visual/impact_effect/ion var/emp_radius = 1 diff --git a/code/modules/projectiles/projectile/special/meteor.dm b/code/modules/projectiles/projectile/special/meteor.dm index ec54e8dd1e..569d4ea754 100644 --- a/code/modules/projectiles/projectile/special/meteor.dm +++ b/code/modules/projectiles/projectile/special/meteor.dm @@ -5,7 +5,7 @@ damage = 0 damage_type = BRUTE nodamage = 1 - flag = "bullet" + flag = BULLET /obj/item/projectile/meteor/Bump(atom/A) if(A == firer) diff --git a/code/modules/projectiles/projectile/special/temperature.dm b/code/modules/projectiles/projectile/special/temperature.dm index ec23af6748..4bd4191fa5 100644 --- a/code/modules/projectiles/projectile/special/temperature.dm +++ b/code/modules/projectiles/projectile/special/temperature.dm @@ -12,7 +12,7 @@ ricochet_chance = 80 is_reflectable = TRUE light_color = LIGHT_COLOR_BLUE - flag = "energy" + flag = ENERGY var/temperature = 100 /obj/item/projectile/temp/on_hit(atom/target, blocked = 0) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index cc7ff43bab..2b717265e2 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -298,7 +298,7 @@ flags_inv = HIDEHAIR slot_flags = ITEM_SLOT_HEAD resistance_flags = NONE - armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 50) //Weak melee protection, because you can wear it on your head + armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 75, ACID = 50) //Weak melee protection, because you can wear it on your head slot_equipment_priority = list( \ ITEM_SLOT_BACK, ITEM_SLOT_ID,\ ITEM_SLOT_ICLOTHING, ITEM_SLOT_OCLOTHING,\ diff --git a/code/modules/reagents/reagent_containers/rags.dm b/code/modules/reagents/reagent_containers/rags.dm index 78cb9d43ea..64940f1c59 100644 --- a/code/modules/reagents/reagent_containers/rags.dm +++ b/code/modules/reagents/reagent_containers/rags.dm @@ -192,4 +192,4 @@ extinguish_efficiency = 5 action_speed = 15 damp_threshold = 0.8 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 20, "bio" = 20, "rad" = 20, "fire" = 50, "acid" = 50) //items don't provide armor to wearers unlike clothing yet. + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 20, BIO = 20, RAD = 20, FIRE = 50, ACID = 50) //items don't provide armor to wearers unlike clothing yet. diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 8215c9d8db..fbb515e18c 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -13,7 +13,7 @@ /obj/structure/reagent_dispensers/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) . = ..() if(. && obj_integrity > 0) - if(tank_volume && (damage_flag == "bullet" || damage_flag == "laser")) + if(tank_volume && (damage_flag == BULLET || damage_flag == LASER)) boom() /obj/structure/reagent_dispensers/attackby(obj/item/W, mob/user, params) diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index b9513a7a01..8be744cd96 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -5,7 +5,7 @@ /obj/machinery/disposal icon = 'icons/obj/atmospherics/pipes/disposal.dmi' density = TRUE - armor = list("melee" = 25, "bullet" = 10, "laser" = 10, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 30) + armor = list(MELEE = 25, BULLET = 10, LASER = 10, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 90, ACID = 30) max_integrity = 200 resistance_flags = FIRE_PROOF interaction_flags_machine = INTERACT_MACHINE_OPEN | INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON diff --git a/code/modules/recycling/disposal/pipe.dm b/code/modules/recycling/disposal/pipe.dm index f6c27f4a79..4076ed627d 100644 --- a/code/modules/recycling/disposal/pipe.dm +++ b/code/modules/recycling/disposal/pipe.dm @@ -12,7 +12,7 @@ level = 1 // underfloor only dir = NONE // dir will contain dominant direction for junction pipes max_integrity = 200 - armor = list("melee" = 25, "bullet" = 10, "laser" = 10, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 30) + armor = list(MELEE = 25, BULLET = 10, LASER = 10, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 90, ACID = 30) layer = DISPOSAL_PIPE_LAYER // slightly lower than wires and other pipes plane = ABOVE_WALL_PLANE rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE @@ -139,7 +139,7 @@ /obj/structure/disposalpipe/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) - if(damage_flag == "melee" && damage_amount < 10) + if(damage_flag == MELEE && damage_amount < 10) return 0 return ..() diff --git a/code/modules/research/xenobiology/crossbreeding/_clothing.dm b/code/modules/research/xenobiology/crossbreeding/_clothing.dm index b30a53c27d..640aa6d490 100644 --- a/code/modules/research/xenobiology/crossbreeding/_clothing.dm +++ b/code/modules/research/xenobiology/crossbreeding/_clothing.dm @@ -135,7 +135,7 @@ Slimecrossing Armor obj_flags = IMMUTABLE_SLOW slowdown = 4 var/hit_reflect_chance = 10 // Citadel Change: because 40% chance of bouncing lasers back into peoples faces isn't good. - armor = list("melee" = 70, "bullet" = 70, "laser" = 40, "energy" = 40, "bomb" = 80, "bio" = 80, "rad" = 80, "fire" = 70, "acid" = 90) //Citadel Change to avoid immortal Xenobiologists. + armor = list(MELEE = 70, BULLET = 70, LASER = 40, ENERGY = 40, BOMB = 80, BIO = 80, RAD = 80, FIRE = 70, ACID = 90) //Citadel Change to avoid immortal Xenobiologists. /obj/item/clothing/suit/armor/heavy/adamantine/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) if(is_energy_reflectable_projectile(object) && prob(hit_reflect_chance)) diff --git a/code/modules/research/xenobiology/crossbreeding/_misc.dm b/code/modules/research/xenobiology/crossbreeding/_misc.dm index 97a87a5e01..5df442e497 100644 --- a/code/modules/research/xenobiology/crossbreeding/_misc.dm +++ b/code/modules/research/xenobiology/crossbreeding/_misc.dm @@ -71,7 +71,7 @@ icon_state = "frozen" density = TRUE max_integrity = 100 - armor = list("melee" = 30, "bullet" = 50, "laser" = -50, "energy" = -50, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = -80, "acid" = 30) + armor = list(MELEE = 30, BULLET = 50, LASER = -50, ENERGY = -50, BOMB = 0, BIO = 100, RAD = 100, FIRE = -80, ACID = 30) /obj/structure/ice_stasis/Initialize() . = ..() diff --git a/code/modules/research/xenobiology/crossbreeding/burning.dm b/code/modules/research/xenobiology/crossbreeding/burning.dm index 1a8b82232b..a2714a8a51 100644 --- a/code/modules/research/xenobiology/crossbreeding/burning.dm +++ b/code/modules/research/xenobiology/crossbreeding/burning.dm @@ -447,7 +447,7 @@ Burning extracts: icon_state = "adamshield" item_state = "adamshield" w_class = WEIGHT_CLASS_HUGE - armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 70) + armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 0, BOMB = 30, BIO = 0, RAD = 0, FIRE = 80, ACID = 70) slot_flags = ITEM_SLOT_BACK block_chance = 75 force = 0 diff --git a/code/modules/ruins/lavalandruin_code/puzzle.dm b/code/modules/ruins/lavalandruin_code/puzzle.dm index 92e24e3bc4..136acc7da7 100644 --- a/code/modules/ruins/lavalandruin_code/puzzle.dm +++ b/code/modules/ruins/lavalandruin_code/puzzle.dm @@ -34,7 +34,7 @@ return get_step(center,SOUTH) if(9) return get_step(center,SOUTHEAST) - + /obj/effect/sliding_puzzle/Initialize(mapload) ..() return INITIALIZE_HINT_LATELOAD @@ -56,7 +56,7 @@ /obj/effect/sliding_puzzle/proc/validate() if(finished) return - + if(elements.len < 8) //Someone broke it qdel(src) @@ -86,7 +86,7 @@ shake_camera(M, COLLAPSE_DURATION , 1) for(var/obj/structure/puzzle_element/E in elements) E.collapse() - + dispense_reward() /obj/effect/sliding_puzzle/proc/dispense_reward() @@ -103,7 +103,7 @@ for(var/j in i to current_ordering.len) if(current_ordering[j] < checked_value) swap_tally++ - + return swap_tally % 2 == 0 //swap two tiles in same row @@ -113,13 +113,13 @@ if(empty_tile_id == 1 || empty_tile_id == 2) //Can't swap with empty one so just grab some in second row first_tile_id = 4 other_tile_id = 5 - + var/turf/T1 = get_turf_for_id(first_tile_id) var/turf/T2 = get_turf_for_id(other_tile_id) - + var/obj/structure/puzzle_element/E1 = locate() in T1 var/obj/structure/puzzle_element/E2 = locate() in T2 - + E1.forceMove(T2) E2.forceMove(T1) @@ -294,7 +294,7 @@ //Some armor so it's harder to kill someone by mistake. /obj/structure/puzzle_element/prison - armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 50, "rad" = 50, "fire" = 50, "acid" = 50) + armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 50, BIO = 50, RAD = 50, FIRE = 50, ACID = 50) /obj/structure/puzzle_element/prison/relaymove(mob/user) return @@ -342,7 +342,7 @@ for(var/atom/movable/AM in things_to_throw) var/throwtarget = get_edge_target_turf(T, get_dir(T, get_step_away(AM, T))) AM.throw_at(throwtarget, 2, 3) - + //Create puzzle itself cube.prisoner = prisoner cube.setup() diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator.dm index b9374a09c4..46e50153b1 100644 --- a/code/modules/shuttle/shuttle_creation/shuttle_creator.dm +++ b/code/modules/shuttle/shuttle_creation/shuttle_creator.dm @@ -24,7 +24,7 @@ GLOBAL_LIST_EMPTY(custom_shuttle_machines) //Machines that require updating (He throw_range = 5 w_class = WEIGHT_CLASS_NORMAL req_access_txt = "11" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50) resistance_flags = FIRE_PROOF var/ready = TRUE //pre-designation diff --git a/code/modules/spells/spell_types/construct_spells.dm b/code/modules/spells/spell_types/construct_spells.dm index e8f3ab7d06..7a22d1498a 100644 --- a/code/modules/spells/spell_types/construct_spells.dm +++ b/code/modules/spells/spell_types/construct_spells.dm @@ -317,6 +317,6 @@ new /obj/effect/temp_visual/cult/sac(T) for(var/obj/O in range(src,1)) if(O.density && !istype(O, /obj/structure/destructible/cult)) - O.take_damage(90, BRUTE, "melee", 0) + O.take_damage(90, BRUTE, MELEE, 0) new /obj/effect/temp_visual/cult/turf/floor ..() diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 6f95fd0f8d..a89727d183 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -388,7 +388,7 @@ for(var/i in clothing) var/obj/item/clothing/clothes_check = i // unlike normal armor checks, we tabluate these piece-by-piece manually so we can also pass on appropriate damage the clothing's limbs if necessary - if(clothes_check.armor.getRating("wound")) + if(clothes_check.armor.getRating(WOUND)) bare_wound_bonus = 0 break @@ -447,7 +447,7 @@ for(var/c in clothing) var/obj/item/clothing/C = c // unlike normal armor checks, we tabluate these piece-by-piece manually so we can also pass on appropriate damage the clothing's limbs if necessary - armor_ablation += C.armor.getRating("wound") + armor_ablation += C.armor.getRating(WOUND) if(wounding_type == WOUND_SLASH) C.take_damage_zone(body_zone, damage, BRUTE, armour_penetration) else if(wounding_type == WOUND_BURN && damage >= 10) // lazy way to block freezing from shredding clothes without adding another var onto apply_damage() diff --git a/code/modules/vehicles/_vehicle.dm b/code/modules/vehicles/_vehicle.dm index 954b5940bc..a968d42073 100644 --- a/code/modules/vehicles/_vehicle.dm +++ b/code/modules/vehicles/_vehicle.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/vehicles.dmi' icon_state = "fuckyou" max_integrity = 300 - armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) + armor = list(MELEE = 30, BULLET = 30, LASER = 30, ENERGY = 0, BOMB = 30, BIO = 0, RAD = 0, FIRE = 60, ACID = 60) density = TRUE anchored = FALSE COOLDOWN_DECLARE(cooldown_vehicle_move) diff --git a/code/modules/vehicles/cars/clowncar.dm b/code/modules/vehicles/cars/clowncar.dm index f65df26488..f01b873a82 100644 --- a/code/modules/vehicles/cars/clowncar.dm +++ b/code/modules/vehicles/cars/clowncar.dm @@ -3,7 +3,7 @@ desc = "How someone could even fit in there is byond me." icon_state = "clowncar" max_integrity = 150 - armor = list("melee" = 70, "bullet" = 40, "laser" = 40, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80) + armor = list(MELEE = 70, BULLET = 40, LASER = 40, ENERGY = 0, BOMB = 30, BIO = 0, RAD = 0, FIRE = 80, ACID = 80) enter_delay = 20 max_occupants = 50 movedelay = 0.6 diff --git a/code/modules/vehicles/mecha/combat/five_stars.dm b/code/modules/vehicles/mecha/combat/five_stars.dm index 3c14e9ad81..5817d64831 100644 --- a/code/modules/vehicles/mecha/combat/five_stars.dm +++ b/code/modules/vehicles/mecha/combat/five_stars.dm @@ -3,7 +3,7 @@ name = "\improper Tank" icon = 'icons/mecha/mecha_96x96.dmi' icon_state = "five_stars" - armor = list("melee" = 100, "bullet" = 50, "laser" = 35, "energy" = 35, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) + armor = list(MELEE = 100, BULLET = 50, LASER = 35, ENERGY = 35, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100) step_in = 4 dir_in = 1 //Facing North. max_integrity = 800 diff --git a/code/modules/vehicles/mecha/combat/neovgre.dm b/code/modules/vehicles/mecha/combat/neovgre.dm index 8decd05f96..512885b66d 100644 --- a/code/modules/vehicles/mecha/combat/neovgre.dm +++ b/code/modules/vehicles/mecha/combat/neovgre.dm @@ -4,7 +4,7 @@ icon = 'icons/mecha/neovgre.dmi' icon_state = "neovgre" max_integrity = 500 //This is THE ratvarian superweaon, its deployment is an investment - armor = list("melee" = 50, "bullet" = 40, "laser" = 25, "energy" = 25, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) //Its similar to the clockwork armour albeit with a few buffs becuase RATVARIAN SUPERWEAPON!! + armor = list(MELEE = 50, BULLET = 40, LASER = 25, ENERGY = 25, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 100) //Its similar to the clockwork armour albeit with a few buffs becuase RATVARIAN SUPERWEAPON!! force = 50 //SMASHY SMASHY!! movedelay = 3 internal_damage_threshold = 0 diff --git a/code/modules/vehicles/mecha/mech_melee_attack.dm b/code/modules/vehicles/mecha/mech_melee_attack.dm index 36a6ed1251..2f5faea172 100644 --- a/code/modules/vehicles/mecha/mech_melee_attack.dm +++ b/code/modules/vehicles/mecha/mech_melee_attack.dm @@ -39,7 +39,7 @@ else return 0 mecha_attacker.visible_message("[mecha_attacker.name] hits [src]!", "You hit [src]!", null, COMBAT_MESSAGE_RANGE) - return take_damage(mecha_attacker.force * 3, mech_damtype, "melee", play_soundeffect, get_dir(src, mecha_attacker)) // multiplied by 3 so we can hit objs hard but not be overpowered against mobs. + return take_damage(mecha_attacker.force * 3, mech_damtype, MELEE, play_soundeffect, get_dir(src, mecha_attacker)) // multiplied by 3 so we can hit objs hard but not be overpowered against mobs. /obj/structure/window/mech_melee_attack(obj/vehicle/sealed/mecha/mecha_attacker) if(!can_be_reached()) diff --git a/code/modules/vehicles/wheelchair.dm b/code/modules/vehicles/wheelchair.dm index 28145ba8e1..ef7f0ad061 100644 --- a/code/modules/vehicles/wheelchair.dm +++ b/code/modules/vehicles/wheelchair.dm @@ -5,7 +5,7 @@ icon_state = "wheelchair" layer = OBJ_LAYER max_integrity = 100 - armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 30) //Wheelchairs aren't super tough yo + armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 20, ACID = 30) //Wheelchairs aren't super tough yo legs_required = 0 //You'll probably be using this if you don't have legs canmove = TRUE density = FALSE //Thought I couldn't fix this one easily, phew diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index cea7502540..700a2fea7e 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -54,7 +54,7 @@ verb_exclaim = "beeps" max_integrity = 300 integrity_failure = 0.33 - armor = list("melee" = 20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 70) + armor = list(MELEE = 20, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 70) circuit = /obj/item/circuitboard/machine/vendor payment_department = ACCOUNT_SRV light_power = 0.5 diff --git a/code/modules/vending/cartridge.dm b/code/modules/vending/cartridge.dm index db8db77ad4..c4b35496c2 100644 --- a/code/modules/vending/cartridge.dm +++ b/code/modules/vending/cartridge.dm @@ -14,7 +14,7 @@ /obj/item/pda/heads = 10, /obj/item/cartridge/captain = 3, /obj/item/cartridge/quartermaster = 10) - armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) + armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50) refill_canister = /obj/item/vending_refill/cart resistance_flags = FIRE_PROOF default_price = PRICE_ALMOST_EXPENSIVE diff --git a/code/modules/vending/dinnerware.dm b/code/modules/vending/dinnerware.dm index 95fd8e04d8..2c326d8e2b 100644 --- a/code/modules/vending/dinnerware.dm +++ b/code/modules/vending/dinnerware.dm @@ -26,7 +26,7 @@ /obj/item/reagent_containers/syringe = 3) premium = list( /obj/item/reagent_containers/food/condiment/enzyme = 1) - armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) + armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50) refill_canister = /obj/item/vending_refill/dinnerware resistance_flags = FIRE_PROOF default_price = PRICE_REALLY_CHEAP diff --git a/code/modules/vending/liberation_toy.dm b/code/modules/vending/liberation_toy.dm index eea1150abf..21cc8e986a 100644 --- a/code/modules/vending/liberation_toy.dm +++ b/code/modules/vending/liberation_toy.dm @@ -22,7 +22,7 @@ /obj/item/toy/katana = 10, /obj/item/dualsaber/toy = 5, /obj/item/toy/cards/deck/syndicate = 10) //Gambling and it hurts, making it a +18 item - armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) + armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50) resistance_flags = FIRE_PROOF refill_canister = /obj/item/vending_refill/donksoft default_price = PRICE_ABOVE_NORMAL diff --git a/code/modules/vending/magivend.dm b/code/modules/vending/magivend.dm index 104f7b3c02..f5565eaa4c 100644 --- a/code/modules/vending/magivend.dm +++ b/code/modules/vending/magivend.dm @@ -14,7 +14,7 @@ /obj/item/clothing/shoes/sandal/magic = 1, /obj/item/staff = 2) contraband = list(/obj/item/reagent_containers/glass/bottle/wizarditis = 1) //No one can get to the machine to hack it anyways; for the lulz - Microwave - armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50, "magic" = 100) + armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, MAGIC = 100) resistance_flags = FIRE_PROOF default_price = 0 //Just in case, since it's primary use is storage. extra_price = PRICE_ABOVE_EXPENSIVE diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm index f208cafe4e..eb4b195e38 100644 --- a/code/modules/zombie/items.dm +++ b/code/modules/zombie/items.dm @@ -39,7 +39,7 @@ else if(istype(target, /obj)) //do far more damage to non mobs so we can get through airlocks var/obj/target_object = target - target_object.take_damage(force * 3, BRUTE, "melee", 0) + target_object.take_damage(force * 3, BRUTE, MELEE, 0) else if(isliving(target)) if(ishuman(target)) try_to_zombie_infect(target) diff --git a/modular_citadel/code/modules/clothing/trek.dm b/modular_citadel/code/modules/clothing/trek.dm index cf422053c7..7272ea6c1a 100644 --- a/modular_citadel/code/modules/clothing/trek.dm +++ b/modular_citadel/code/modules/clothing/trek.dm @@ -27,7 +27,7 @@ /obj/item/reagent_containers/glass/bottle/vial,/obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill,/obj/item/storage/pill_bottle, /obj/item/restraints/handcuffs,/obj/item/hypospray ) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) /obj/item/clothing/suit/storage/trek/ds9/admiral // Only for adminuz name = "Admiral Overcoat" @@ -35,7 +35,7 @@ icon_state = "trek_ds9_coat_adm" item_state = "trek_ds9_coat_adm" permeability_coefficient = 0.01 - armor = list("melee" = 50, "bullet" = 50, "laser" = 50,"energy" = 50, "bomb" = 50, "bio" = 50, "rad" = 50, "fire" = 50, "acid" = 50) + armor = list(MELEE = 50, BULLET = 50, LASER = 50,ENERGY = 50, BOMB = 50, BIO = 50, RAD = 50, FIRE = 50, ACID = 50) //MODERN ish Joan sqrl sprites. I think @@ -66,7 +66,7 @@ /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/taperecorder) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) var/unbuttoned = FALSE /obj/item/clothing/suit/storage/fluff/fedcoat/verb/toggle() @@ -122,7 +122,7 @@ /obj/item/reagent_containers/glass/bottle/vial,/obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill,/obj/item/storage/pill_bottle, /obj/item/restraints/handcuffs,/obj/item/hypospray ) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) //Variants /obj/item/clothing/suit/storage/fluff/modernfedcoat/medsci @@ -139,7 +139,7 @@ /obj/item/clothing/head/caphat/formal/fedcover name = "Federation Officer's Cap" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) desc = "An officer's cap that demands discipline from the one who wears it." icon = 'modular_citadel/icons/obj/clothing/trek_item_icon.dmi' icon_state = "fedcapofficer" diff --git a/modular_citadel/code/modules/custom_loadout/custom_items.dm b/modular_citadel/code/modules/custom_loadout/custom_items.dm index b8ee221e73..929a5dcea9 100644 --- a/modular_citadel/code/modules/custom_loadout/custom_items.dm +++ b/modular_citadel/code/modules/custom_loadout/custom_items.dm @@ -66,7 +66,7 @@ blood_overlay_type = "armor" dog_fashion = /datum/dog_fashion/back mutantrace_variation = NONE - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) /obj/item/lighter/gold diff --git a/modular_citadel/code/modules/festive/wheelchair.dm b/modular_citadel/code/modules/festive/wheelchair.dm index b4a1acd81c..92517b768e 100644 --- a/modular_citadel/code/modules/festive/wheelchair.dm +++ b/modular_citadel/code/modules/festive/wheelchair.dm @@ -45,7 +45,7 @@ icon_state = "wheelchair" layer = OBJ_LAYER max_integrity = 100 - armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 30) //Wheelchairs aren't super tough yo + armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 20, ACID = 30) //Wheelchairs aren't super tough yo canmove = TRUE density = FALSE //Thought I couldn't fix this one easily, phew diff --git a/modular_citadel/code/modules/reagents/objects/clothes.dm b/modular_citadel/code/modules/reagents/objects/clothes.dm index b6391ba82d..9b3b63d5af 100644 --- a/modular_citadel/code/modules/reagents/objects/clothes.dm +++ b/modular_citadel/code/modules/reagents/objects/clothes.dm @@ -6,7 +6,7 @@ icon = 'icons/obj/clothing/hats.dmi' icon_state = "cowboy" desc = "A synthesized hat. You feel compelled to keep it on all times." - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) //item_flags = NODROP //Tips their hat! /obj/item/clothing/head/hattip/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) From 205c9b3d4364491869e7fc372ed256812e19da1c Mon Sep 17 00:00:00 2001 From: SandPoot Date: Wed, 23 Mar 2022 12:21:29 -0300 Subject: [PATCH 14/53] Those are too early. --- code/_onclick/item_attack.dm | 2 +- code/_onclick/other_mobs.dm | 2 +- code/controllers/subsystem/fire_burning.dm | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index cdc561e4b3..8f3a7ef02c 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -146,7 +146,7 @@ visible_message("[user] has hit [src] with [I]!", null, null, COMBAT_MESSAGE_RANGE) //only witnesses close by and the victim see a hit message. log_combat(user, src, "attacked", I) - take_damage(totitemdamage, I.damtype, MELEE, 1) + take_damage(totitemdamage, I.damtype, "melee", 1) /mob/living/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1) var/list/block_return = list() diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index b4b3582c73..073f50d8c5 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -171,7 +171,7 @@ if(ishuman(ML)) var/mob/living/carbon/human/H = ML affecting = H.get_bodypart(ran_zone(dam_zone)) - var/armor = ML.run_armor_check(affecting, MELEE) + var/armor = ML.run_armor_check(affecting, "melee") if(prob(75)) ML.apply_damage(rand(1,3), BRUTE, affecting, armor) ML.visible_message("[name] bites [ML]!", \ diff --git a/code/controllers/subsystem/fire_burning.dm b/code/controllers/subsystem/fire_burning.dm index a5e903221a..f81c23d186 100644 --- a/code/controllers/subsystem/fire_burning.dm +++ b/code/controllers/subsystem/fire_burning.dm @@ -32,7 +32,7 @@ SUBSYSTEM_DEF(fire_burning) if(O.resistance_flags & ON_FIRE) //in case an object is extinguished while still in currentrun if(!(O.resistance_flags & FIRE_PROOF)) - O.take_damage(10 * delta_time, BURN, FIRE, 0) + O.take_damage(10 * delta_time, BURN, "fire", 0) else O.extinguish() From d711a0901cddd1fc897e6cf9207f567f36857d43 Mon Sep 17 00:00:00 2001 From: SandPoot Date: Wed, 23 Mar 2022 13:05:51 -0300 Subject: [PATCH 15/53] Dual seater coming right up. --- code/modules/vehicles/mecha/_mecha.dm | 2 ++ code/modules/vehicles/mecha/combat/neovgre.dm | 12 ++++++++++-- code/modules/vehicles/mecha/working/ripley.dm | 2 ++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm index 785be3d61f..6b8642764e 100644 --- a/code/modules/vehicles/mecha/_mecha.dm +++ b/code/modules/vehicles/mecha/_mecha.dm @@ -962,6 +962,8 @@ initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_lights, VEHICLE_CONTROL_SETTINGS) initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_view_stats, VEHICLE_CONTROL_SETTINGS) initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/strafe, VEHICLE_CONTROL_DRIVE) + if(max_occupants > 1) + initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/swap_seat) /obj/vehicle/sealed/mecha/proc/moved_inside(mob/living/H) . = FALSE diff --git a/code/modules/vehicles/mecha/combat/neovgre.dm b/code/modules/vehicles/mecha/combat/neovgre.dm index 512885b66d..8085200246 100644 --- a/code/modules/vehicles/mecha/combat/neovgre.dm +++ b/code/modules/vehicles/mecha/combat/neovgre.dm @@ -16,10 +16,16 @@ wreckage = /obj/structure/mecha_wreckage/durand/neovgre stepsound = 'sound/mecha/neostep2.ogg' turnsound = 'sound/mecha/powerloader_step.ogg' + max_occupants = 2 +//override this proc if you need to split up mecha control between multiple people (see savannah_ivanov.dm) +/obj/vehicle/sealed/mecha/combat/neovgre/auto_assign_occupant_flags(mob/M) + if(driver_amount() < max_drivers) + add_control_flags(M, VEHICLE_CONTROL_DRIVE|VEHICLE_CONTROL_SETTINGS) + else + add_control_flags(M, VEHICLE_CONTROL_MELEE|VEHICLE_CONTROL_EQUIPMENT) - -/obj/vehicle/sealed/mecha/neovgre/mob_exit(mob/M, silent, forced) +/obj/vehicle/sealed/mecha/combat/neovgre/mob_exit(mob/M, silent, forced) if(forced) ..() @@ -76,6 +82,8 @@ GLOB.neovgre_exists ++ var/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy/neovgre/N = new N.attach(src) + var/obj/item/mecha_parts/mecha_equipment/weapon/energy/tesla/shocking = new + shocking.attach(src) /obj/structure/mecha_wreckage/durand/neovgre name = "\improper Neovgre wreckage?" diff --git a/code/modules/vehicles/mecha/working/ripley.dm b/code/modules/vehicles/mecha/working/ripley.dm index 2d6b510c2a..0d083d4bde 100644 --- a/code/modules/vehicles/mecha/working/ripley.dm +++ b/code/modules/vehicles/mecha/working/ripley.dm @@ -47,6 +47,8 @@ initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_lights, VEHICLE_CONTROL_SETTINGS) initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_view_stats, VEHICLE_CONTROL_SETTINGS) initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/strafe, VEHICLE_CONTROL_DRIVE) + if(max_occupants > 1) + initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/swap_seat) /obj/vehicle/sealed/mecha/working/ripley/Destroy() for(var/atom/movable/A in cargo) From a4f8789d68b54986a566fd1606ec0ed3b3e14620 Mon Sep 17 00:00:00 2001 From: Solaris-Shade <73904284+Solaris-Shade@users.noreply.github.com> Date: Thu, 24 Mar 2022 22:43:17 -0400 Subject: [PATCH 16/53] DO it not HIT it! https://github.com/tgstation/tgstation/pull/65061 --- code/modules/projectiles/guns/misc/beam_rifle.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm index 182e479bbb..decf2d1aa9 100644 --- a/code/modules/projectiles/guns/misc/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -485,7 +485,7 @@ if(nodamage) return FALSE playsound(src, 'sound/effects/explosion3.ogg', 100, TRUE) - if(!piercing_hit) + if(!do_pierce) AOE(get_turf(target) || get_turf(src)) if(!QDELETED(target)) handle_impact(target) From f020aca3dde54af89542b7fb7d2e6e7437a1a582 Mon Sep 17 00:00:00 2001 From: SandPoot Date: Wed, 6 Apr 2022 00:04:24 -0300 Subject: [PATCH 17/53] Update path.dm --- code/__HELPERS/path.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/__HELPERS/path.dm b/code/__HELPERS/path.dm index bac95fc296..72ed8da819 100644 --- a/code/__HELPERS/path.dm +++ b/code/__HELPERS/path.dm @@ -340,12 +340,12 @@ /turf/proc/LinkBlockedWithAccess(turf/destination_turf, caller, ID) if(destination_turf.x != x && destination_turf.y != y) //diagonal var/in_dir = get_dir(destination_turf,src) // eg. northwest (1+8) = 9 (00001001) - var/first_step_direction_a = in_dir & 3 // eg. north (1+8)&3 (0000 0011) = 1 (0000 0001) - var/first_step_direction_b = in_dir & 12 // eg. west (1+8)&12 (0000 1100) = 8 (0000 1000) + var/first_step_direction_a = in_dir & 3 // eg. north (1+8)&3 (0000 0011) = 1 (0000 0001) + var/first_step_direction_b = in_dir & 12 // eg. west (1+8)&12 (0000 1100) = 8 (0000 1000) for(var/first_step_direction in list(first_step_direction_a,first_step_direction_b)) var/turf/midstep_turf = get_step(destination_turf,first_step_direction) - var/way_blocked = LinkBlockedWithAccess(midstep_turf,caller,ID) || midstep_turf.LinkBlockedWithAccess(destination_turf,caller,ID) + var/way_blocked = midstep_turf.density || LinkBlockedWithAccess(midstep_turf,caller,ID) || midstep_turf.LinkBlockedWithAccess(destination_turf,caller,ID) if(!way_blocked) return FALSE return TRUE From c36019bf56bb3cb7e9de2d73de45d4cbf760d24e Mon Sep 17 00:00:00 2001 From: Artur <24881678+Arturlang@users.noreply.github.com> Date: Wed, 6 Apr 2022 15:38:05 +0300 Subject: [PATCH 18/53] Adds stasis beds --- _maps/map_files/generic/CentCom.dmm | 8 +- code/__DEFINES/status_effects.dm | 3 + code/__DEFINES/traits.dm | 4 + code/__HELPERS/mobs.dm | 2 + code/__HELPERS/time.dm | 8 +- code/controllers/subsystem/traumas.dm | 2 +- code/controllers/subsystem/vis_overlays.dm | 18 +++ code/datums/status_effects/debuffs.dm | 50 ++++++- code/game/machinery/stasis.dm | 141 ++++++++++++++++++ .../circuitboards/machine_circuitboards.dm | 8 + code/modules/mining/equipment/survival_pod.dm | 20 +++ code/modules/mob/living/life.dm | 8 +- code/modules/mob/living/living.dm | 4 +- icons/obj/machines/stasis.dmi | Bin 0 -> 4025 bytes tgstation.dme | 1 + 15 files changed, 257 insertions(+), 20 deletions(-) create mode 100644 code/game/machinery/stasis.dm create mode 100644 icons/obj/machines/stasis.dmi diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 4fb880fb4d..4a17fef999 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -1120,9 +1120,7 @@ /obj/structure/window{ dir = 8 }, -/obj/machinery/sleeper{ - dir = 1 - }, +/obj/machinery/stasis, /turf/open/floor/holofloor{ icon_state = "white" }, @@ -1134,9 +1132,7 @@ }, /area/holodeck/rec_center/medical) "dd" = ( -/obj/machinery/sleeper{ - dir = 1 - }, +/obj/machinery/stasis, /turf/open/floor/holofloor{ icon_state = "white" }, diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index e3c928a9a9..b29daa85f6 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -153,3 +153,6 @@ ///////////// #define STASIS_ASCENSION_EFFECT "heretic_ascension" + +/// If the incapacitated status effect will ignore a mob in stasis (stasis beds) +#define IGNORE_STASIS (1<<1) \ No newline at end of file diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index e1154b305f..daec1ce4c2 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -70,6 +70,10 @@ #define HAS_TRAIT_NOT_FROM(target, trait, source) (target.status_traits ? (target.status_traits[trait] ? (length(target.status_traits[trait] - source) > 0) : FALSE) : FALSE) //mob traits +/// Prevents voluntary movement. +#define TRAIT_IMMOBILIZED "immobilized" +/// Prevents usage of manipulation appendages (picking, holding or using items, manipulating storage). +#define TRAIT_HANDS_BLOCKED "handsblocked" #define TRAIT_BLIND "blind" #define TRAIT_MUTE "mute" #define TRAIT_EMOTEMUTE "emotemute" diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index d113b8b789..4cd82f9e66 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -484,3 +484,5 @@ GLOBAL_LIST_EMPTY(species_datums) //check if the person is dead, not sure where to put this #define IS_DEAD_OR_INCAP(source) (source.incapacitated() || source.stat) + +#define IS_IN_STASIS(mob) (mob.has_status_effect(/datum/status_effect/grouped/stasis)) diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm index 2e27588ae5..519a54b38d 100644 --- a/code/__HELPERS/time.dm +++ b/code/__HELPERS/time.dm @@ -75,10 +75,8 @@ GLOBAL_VAR_INIT(rollovercheck_last_timeofday, 0) /proc/daysSince(realtimev) return round((world.realtime - realtimev) / (24 HOURS)) -/proc/worldtime2text() - return gameTimestamp("hh:mm:ss", world.time) +/proc/worldtime2text(wtime = world.timeofday) + return gameTimestamp("hh:mm:ss", wtime) -/proc/gameTimestamp(format = "hh:mm:ss", wtime=null) - if(!wtime) - wtime = world.time +/proc/gameTimestamp(format = "hh:mm:ss", wtime=world.time) return time2text(wtime - GLOB.timezoneOffset, format) diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm index 9a0665e91f..56865f8567 100644 --- a/code/controllers/subsystem/traumas.dm +++ b/code/controllers/subsystem/traumas.dm @@ -107,7 +107,7 @@ SUBSYSTEM_DEF(traumas) /obj/item/clothing/under/rank/medical/doctor/nurse, /obj/item/clothing/under/rank/medical/chief_medical_officer, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/pill/, /obj/item/reagent_containers/hypospray, /obj/item/storage/firstaid, /obj/item/storage/pill_bottle, /obj/item/healthanalyzer, - /obj/structure/sign/departments/medbay, /obj/machinery/door/airlock/medical, /obj/machinery/sleeper, + /obj/structure/sign/departments/medbay, /obj/machinery/door/airlock/medical, /obj/machinery/sleeper, /obj/machinery/stasis, /obj/machinery/dna_scannernew, /obj/machinery/atmospherics/components/unary/cryo_cell, /obj/item/surgical_drapes, /obj/item/retractor, /obj/item/hemostat, /obj/item/cautery, /obj/item/surgicaldrill, /obj/item/scalpel, /obj/item/circular_saw, /obj/item/clothing/suit/bio_suit/plaguedoctorsuit, /obj/item/clothing/head/plaguedoctorhat, /obj/item/clothing/mask/gas/plaguedoctor)), diff --git a/code/controllers/subsystem/vis_overlays.dm b/code/controllers/subsystem/vis_overlays.dm index b0e5d6c689..b672217480 100644 --- a/code/controllers/subsystem/vis_overlays.dm +++ b/code/controllers/subsystem/vis_overlays.dm @@ -7,10 +7,12 @@ SUBSYSTEM_DEF(vis_overlays) var/list/vis_overlay_cache var/list/unique_vis_overlays var/list/currentrun + var/datum/callback/rotate_cb /datum/controller/subsystem/vis_overlays/Initialize() vis_overlay_cache = list() unique_vis_overlays = list() + rotate_cb = CALLBACK(src, .proc/rotate_vis_overlay) return ..() /datum/controller/subsystem/vis_overlays/fire(resumed = FALSE) @@ -55,6 +57,7 @@ SUBSYSTEM_DEF(vis_overlays) if(!thing.managed_vis_overlays) thing.managed_vis_overlays = list(overlay) + RegisterSignal(thing, COMSIG_ATOM_DIR_CHANGE, rotate_cb) else thing.managed_vis_overlays += overlay return overlay @@ -78,3 +81,18 @@ SUBSYSTEM_DEF(vis_overlays) thing.managed_vis_overlays -= overlays if(!length(thing.managed_vis_overlays)) thing.managed_vis_overlays = null + UnregisterSignal(thing, COMSIG_ATOM_DIR_CHANGE) + +/datum/controller/subsystem/vis_overlays/proc/rotate_vis_overlay(atom/thing, old_dir, new_dir) + if(old_dir == new_dir) + return + var/rotation = dir2angle(old_dir) - dir2angle(new_dir) + var/list/overlays_to_remove = list() + for(var/i in thing.managed_vis_overlays - unique_vis_overlays) + var/obj/effect/overlay/vis/overlay = i + add_vis_overlay(thing, overlay.icon, overlay.icon_state, overlay.layer, overlay.plane, turn(overlay.dir, rotation), overlay.alpha, overlay.appearance_flags) + overlays_to_remove += overlay + for(var/i in thing.managed_vis_overlays & unique_vis_overlays) + var/obj/effect/overlay/vis/overlay = i + overlay.dir = turn(overlay.dir, rotation) + remove_vis_overlay(thing, overlays_to_remove) diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index b5a7a38915..b7680c0d80 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -127,13 +127,61 @@ desc = "You've fallen asleep. Wait a bit and you should wake up. Unless you don't, considering how helpless you are." icon_state = "asleep" - /datum/status_effect/grouped/stasis id = "stasis" duration = -1 tick_interval = 10 + alert_type = /atom/movable/screen/alert/status_effect/stasis var/last_dead_time +/datum/status_effect/grouped/stasis/proc/update_time_of_death() + if(last_dead_time) + var/delta = world.time - last_dead_time + var/new_timeofdeath = owner.timeofdeath + delta + owner.timeofdeath = new_timeofdeath + owner.tod = gameTimestamp(wtime=new_timeofdeath) + last_dead_time = null + if(owner.stat == DEAD) + last_dead_time = world.time + +/datum/status_effect/grouped/stasis/on_creation(mob/living/new_owner, set_duration) + . = ..() + if(.) + update_time_of_death() + owner.reagents?.end_metabolization(owner, FALSE) + +/datum/status_effect/grouped/stasis/on_apply() + . = ..() + if(!.) + return + owner.mobility_flags &= ~MOBILITY_USE + owner.mobility_flags &= ~MOBILITY_PICKUP + owner.mobility_flags &= ~MOBILITY_PULL + owner.mobility_flags &= ~MOBILITY_HOLD + owner.update_mobility() + owner.add_filter("stasis_status_ripple", 2, list("type" = "ripple", "flags" = WAVE_BOUNDED, "radius" = 0, "size" = 2)) + var/filter = owner.get_filter("stasis_status_ripple") + animate(filter, radius = 32, time = 15, size = 0, loop = -1) + + +/datum/status_effect/grouped/stasis/tick() + update_time_of_death() + +/datum/status_effect/grouped/stasis/on_remove() + owner.mobility_flags |= MOBILITY_USE + owner.mobility_flags |= MOBILITY_PICKUP + owner.mobility_flags |= MOBILITY_PULL + owner.mobility_flags |= MOBILITY_HOLD + owner.update_mobility() + owner.remove_filter("stasis_status_ripple") + update_time_of_death() + return ..() + +/atom/movable/screen/alert/status_effect/stasis + name = "Stasis" + desc = "Your biological functions have halted. You could live forever this way, but it's pretty boring." + icon_state = "stasis" + /datum/status_effect/robotic_emp id = "emp_no_combat_mode" diff --git a/code/game/machinery/stasis.dm b/code/game/machinery/stasis.dm new file mode 100644 index 0000000000..5f7f0263db --- /dev/null +++ b/code/game/machinery/stasis.dm @@ -0,0 +1,141 @@ +#define STASIS_TOGGLE_COOLDOWN 50 +/obj/machinery/stasis + name = "Lifeform Stasis Unit" + desc = "A not so comfortable looking bed with some nozzles at the top and bottom. It will keep someone in stasis." + icon = 'icons/obj/machines/stasis.dmi' + icon_state = "stasis" + density = FALSE + can_buckle = TRUE + buckle_lying = 90 + circuit = /obj/item/circuitboard/machine/stasis + idle_power_usage = 40 + active_power_usage = 340 + fair_market_price = 10 + payment_department = ACCOUNT_MED + var/stasis_enabled = TRUE + var/last_stasis_sound = FALSE + var/stasis_can_toggle = 0 + var/mattress_state = "stasis_on" + var/obj/effect/overlay/vis/mattress_on + +/obj/machinery/stasis/examine(mob/user) + ..() + var/turn_on_or_off = stasis_enabled ? "turn off" : "turn on" + to_chat(user, "Alt-click to [turn_on_or_off] the machine.") + +/obj/machinery/stasis/proc/play_power_sound() + var/_running = stasis_running() + if(last_stasis_sound != _running) + var/sound_freq = rand(5120, 8800) + if(_running) + playsound(src, 'sound/machines/synth_yes.ogg', 50, TRUE, frequency = sound_freq) + else + playsound(src, 'sound/machines/synth_no.ogg', 50, TRUE, frequency = sound_freq) + last_stasis_sound = _running + +/obj/machinery/stasis/AltClick(mob/user) + if(world.time >= stasis_can_toggle && user.canUseTopic(src)) + stasis_enabled = !stasis_enabled + stasis_can_toggle = world.time + STASIS_TOGGLE_COOLDOWN + playsound(src, 'sound/machines/click.ogg', 60, TRUE) + play_power_sound() + update_icon() + +/obj/machinery/stasis/Exited(atom/movable/AM, atom/newloc) + if(AM == occupant) + var/mob/living/L = AM + if(L.IsInStasis()) + thaw_them(L) + . = ..() + +/obj/machinery/stasis/proc/stasis_running() + return stasis_enabled && is_operational() + +/obj/machinery/stasis/update_icon() + . = ..() + var/_running = stasis_running() + var/list/overlays_to_remove = managed_vis_overlays + + if(mattress_state) + if(!mattress_on || !managed_vis_overlays) + mattress_on = SSvis_overlays.add_vis_overlay(src, icon, mattress_state, layer, plane, dir, alpha = 0, unique = TRUE) + + if(mattress_on.alpha ? !_running : _running) //check the inverse of _running compared to truthy alpha, to see if they differ + var/new_alpha = _running ? 255 : 0 + var/easing_direction = _running ? EASE_OUT : EASE_IN + animate(mattress_on, alpha = new_alpha, time = 50, easing = CUBIC_EASING|easing_direction) + + overlays_to_remove = managed_vis_overlays - mattress_on + + SSvis_overlays.remove_vis_overlay(src, overlays_to_remove) + + if(occupant) + SSvis_overlays.add_vis_overlay(src, 'icons/obj/machines/stasis.dmi', "tubes", LYING_MOB_LAYER + 0.1, plane, dir) //using vis_overlays instead of normal overlays for mouse_opacity here + + if(stat & BROKEN) + icon_state = "stasis_broken" + return + if(panel_open || stat & MAINT) + icon_state = "stasis_maintenance" + return + icon_state = "stasis" + +/obj/machinery/stasis/obj_break(damage_flag) + . = ..() + play_power_sound() + update_icon() + +/obj/machinery/stasis/power_change() + . = ..() + play_power_sound() + update_icon() + +/obj/machinery/stasis/proc/chill_out(mob/living/target) + if(target != occupant) + return + var/freq = rand(24750, 26550) + playsound(src, 'sound/effects/spray.ogg', 5, TRUE, 2, frequency = freq) + target.SetStasis(TRUE) + target.ExtinguishMob() + use_power = ACTIVE_POWER_USE + +/obj/machinery/stasis/proc/thaw_them(mob/living/target) + target.SetStasis(FALSE) + if(target == occupant) + use_power = IDLE_POWER_USE + +/obj/machinery/stasis/post_buckle_mob(mob/living/L) + if(!can_be_occupant(L)) + return + occupant = L + if(stasis_running() && check_nap_violations()) + chill_out(L) + update_icon() + +/obj/machinery/stasis/post_unbuckle_mob(mob/living/L) + thaw_them(L) + if(L == occupant) + occupant = null + update_icon() + +/obj/machinery/stasis/process() + if( !( occupant && isliving(occupant) && check_nap_violations() ) ) + use_power = IDLE_POWER_USE + return + var/mob/living/L_occupant = occupant + if(stasis_running()) + if(!L_occupant.IsInStasis()) + chill_out(L_occupant) + else if(L_occupant.IsInStasis()) + thaw_them(L_occupant) + +/obj/machinery/stasis/screwdriver_act(mob/living/user, obj/item/I) + . = default_deconstruction_screwdriver(user, "stasis_maintenance", "stasis", I) + update_icon() + +/obj/machinery/stasis/crowbar_act(mob/living/user, obj/item/I) + return default_deconstruction_crowbar(I) + +/obj/machinery/stasis/nap_violation(mob/violator) + unbuckle_mob(violator, TRUE) +#undef STASIS_TOGGLE_COOLDOWN diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index cb1d4aae88..c42d40db83 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -1482,3 +1482,11 @@ icon_state = "engineering" build_path = /obj/machinery/research/explosive_compressor req_components = list(/obj/item/stock_parts/matter_bin = 3) + +/obj/item/circuitboard/machine/stasis + name = "Lifeform Stasis Unit (Machine Board)" + build_path = /obj/machinery/stasis + req_components = list( + /obj/item/stack/cable_coil = 3, + /obj/item/stock_parts/manipulator = 1, + /obj/item/stock_parts/capacitor = 1) \ No newline at end of file diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index ba4b02fcf4..36e9d0a9a9 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -162,6 +162,26 @@ if(!state_open) . += "sleeper_cover" +//Lifeform Stasis Unit +/obj/machinery/stasis/survival_pod + icon = 'icons/obj/lavaland/survival_pod.dmi' + icon_state = "sleeper" + mattress_state = null + buckle_lying = 270 + +/obj/machinery/stasis/survival_pod/play_power_sound() + return + +/obj/machinery/stasis/survival_pod/update_icon() + return + +//NanoMed +/obj/machinery/vending/wallmed/survival_pod + name = "survival pod medical supply" + desc = "Wall-mounted Medical Equipment dispenser. This one seems just a tiny bit smaller." + refill_canister = null + onstation = FALSE + //Computer /obj/item/gps/computer name = "pod computer" diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 0c73c623d1..18a500f6f4 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -6,11 +6,12 @@ SHOULD_NOT_SLEEP(TRUE) if(mob_transforming) return - + handle_traits() // eye, ear, brain damages + handle_status_effects() //all special effects, stun, knockdown, jitteryness, hallucination, sleeping, etc . = SEND_SIGNAL(src, COMSIG_LIVING_LIFE, seconds, times_fired) if(!(. & COMPONENT_INTERRUPT_LIFE_PHYSICAL)) PhysicalLife(seconds, times_fired) - if(!(. & COMPONENT_INTERRUPT_LIFE_BIOLOGICAL)) + if(!(. & COMPONENT_INTERRUPT_LIFE_BIOLOGICAL) && !IS_IN_STASIS()) BiologicalLife(seconds, times_fired) // CODE BELOW SHOULD ONLY BE THINGS THAT SHOULD HAPPEN NO MATTER WHAT AND CAN NOT BE SUSPENDED! @@ -69,9 +70,6 @@ handle_block_parry(seconds) - // These two MIGHT need to be moved to base Life() if we get any in the future that's a "physical" effect that needs to fire even while in stasis. - handle_traits() // eye, ear, brain damages - handle_status_effects() //all special effects, stun, knockdown, jitteryness, hallucination, sleeping, etc return TRUE /** diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index bf3094cb08..e4ffb94493 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -433,8 +433,8 @@ to_chat(src, "You have given up life and succumbed to death.") death() -/mob/living/incapacitated(ignore_restraints = FALSE, ignore_grab = FALSE, check_immobilized = FALSE) - if(stat || IsUnconscious() || IsStun() || IsParalyzed() || (combat_flags & COMBAT_FLAG_HARD_STAMCRIT) || (check_immobilized && IsImmobilized()) || (!ignore_restraints && restrained(ignore_grab))) +/mob/living/incapacitated(ignore_restraints = FALSE, ignore_grab = FALSE, check_immobilized = FALSE, ignore_stasis = FALSE) + if(stat || IsUnconscious() || IsStun() || IsParalyzed() || (combat_flags & COMBAT_FLAG_HARD_STAMCRIT) || (check_immobilized && IsImmobilized()) || (!ignore_restraints && restrained(ignore_grab)) || (!ignore_stasis && IS_IN_STASIS())) return TRUE /mob/living/canUseStorage() diff --git a/icons/obj/machines/stasis.dmi b/icons/obj/machines/stasis.dmi new file mode 100644 index 0000000000000000000000000000000000000000..21844b0f8d50e111db85ed451cb73287e37e5096 GIT binary patch literal 4025 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 literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index cb2fa07f50..b019ea10b1 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -912,6 +912,7 @@ #include "code\game\machinery\Sleeper.dm" #include "code\game\machinery\slotmachine.dm" #include "code\game\machinery\spaceheater.dm" +#include "code\game\machinery\stasis.dm" #include "code\game\machinery\status_display.dm" #include "code\game\machinery\suit_storage_unit.dm" #include "code\game\machinery\syndicatebeacon.dm" From 813ca511b5706ae4b8827bb2e325829cbb86c32f Mon Sep 17 00:00:00 2001 From: Artur <24881678+Arturlang@users.noreply.github.com> Date: Wed, 6 Apr 2022 15:58:27 +0300 Subject: [PATCH 19/53] Remaps sleepers to stasis beds and make stasis actually leave you --- _maps/map_files/BoxStation/BoxStation.dmm | 12 +++------- _maps/map_files/CogStation/CogStation.dmm | 20 ++++------------ .../map_files/Deltastation/DeltaStation2.dmm | 12 +++------- .../map_files/FestiveBall/FestiveStation.dmm | 8 +++---- _maps/map_files/KiloStation/KiloStation.dmm | 4 +--- _maps/map_files/LambdaStation/lambda.dmm | 4 ++-- _maps/map_files/MetaStation/MetaStation.dmm | 8 ++----- _maps/map_files/OmegaStation/OmegaStation.dmm | 8 ++----- _maps/map_files/PubbyStation/PubbyStation.dmm | 8 ++----- _maps/map_files/Snaxi/Snaxi.dmm | 24 +++++-------------- _maps/map_files/generic/CentCom.dmm | 14 ++++------- code/__DEFINES/status_effects.dm | 2 ++ code/game/machinery/stasis.dm | 11 +++++---- code/modules/mob/living/life.dm | 2 +- code/modules/mob/living/living.dm | 2 +- 15 files changed, 43 insertions(+), 96 deletions(-) diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index c955c942c9..219dae6d6f 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -12673,9 +12673,7 @@ /turf/open/floor/plasteel, /area/construction/mining/aux_base) "aCW" = ( -/obj/machinery/sleeper{ - dir = 4 - }, +/obj/machinery/stasis, /turf/open/floor/plating, /area/maintenance/port/fore) "aCX" = ( @@ -30331,9 +30329,7 @@ /turf/open/floor/plasteel/dark, /area/medical/surgery) "bwD" = ( -/obj/machinery/sleeper{ - dir = 8 - }, +/obj/machinery/stasis, /turf/open/floor/plasteel, /area/medical/medbay/central) "bwE" = ( @@ -32058,14 +32054,12 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "bAq" = ( -/obj/machinery/sleeper{ - dir = 8 - }, /obj/machinery/camera{ c_tag = "Medbay Treatment Center"; dir = 8; network = list("ss13","medbay") }, +/obj/machinery/stasis, /turf/open/floor/plasteel, /area/medical/medbay/central) "bAr" = ( diff --git a/_maps/map_files/CogStation/CogStation.dmm b/_maps/map_files/CogStation/CogStation.dmm index c5e8df8ed2..21cbb61b27 100644 --- a/_maps/map_files/CogStation/CogStation.dmm +++ b/_maps/map_files/CogStation/CogStation.dmm @@ -8805,12 +8805,11 @@ /obj/effect/turf_decal/tile/blue{ dir = 1 }, -/obj/machinery/sleeper{ - dir = 8 - }, /obj/machinery/airalarm{ pixel_y = 24 }, +/obj/structure/table, +/obj/item/stack/medical/suture/five, /turf/open/floor/plasteel/white, /area/medical/clinic) "auS" = ( @@ -8876,9 +8875,7 @@ name = "Station Intercom (Common)"; pixel_y = 26 }, -/obj/machinery/sleep_console{ - dir = 8 - }, +/obj/machinery/stasis, /turf/open/floor/plasteel/white, /area/medical/clinic) "auZ" = ( @@ -36751,9 +36748,6 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/item/storage/box/engineer{ - pixel_y = 4 - }, /turf/open/floor/plasteel, /area/maintenance/disposal) "bCu" = ( @@ -58329,9 +58323,7 @@ dir = 1 }, /obj/structure/window/reinforced/spawner/west, -/obj/machinery/sleeper{ - dir = 4 - }, +/obj/machinery/stasis, /turf/open/floor/plasteel/white, /area/medical/medbay/zone2) "ctZ" = ( @@ -58340,9 +58332,7 @@ dir = 4 }, /obj/structure/window/reinforced/spawner/east, -/obj/machinery/sleeper{ - dir = 8 - }, +/obj/machinery/stasis, /turf/open/floor/plasteel/white, /area/medical/medbay/zone2) "cua" = ( diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 2de7bc4e1e..2c37aa2697 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -46910,12 +46910,10 @@ dir = 4; pixel_x = -23 }, -/obj/machinery/sleeper{ - dir = 4 - }, /obj/effect/turf_decal/stripes/line{ dir = 6 }, +/obj/machinery/stasis, /turf/open/floor/plasteel, /area/medical/abandoned) "ddn" = ( @@ -47559,12 +47557,10 @@ /turf/open/floor/plating, /area/security/checkpoint/medical) "deC" = ( -/obj/machinery/sleeper{ - dir = 4 - }, /obj/effect/turf_decal/stripes/end{ dir = 4 }, +/obj/machinery/stasis, /turf/open/floor/plasteel, /area/medical/medbay/central) "deD" = ( @@ -47584,12 +47580,10 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "deF" = ( -/obj/machinery/sleeper{ - dir = 8 - }, /obj/effect/turf_decal/stripes/end{ dir = 8 }, +/obj/machinery/stasis, /turf/open/floor/plasteel, /area/medical/medbay/central) "deG" = ( diff --git a/_maps/map_files/FestiveBall/FestiveStation.dmm b/_maps/map_files/FestiveBall/FestiveStation.dmm index dda657c782..e2be457873 100644 --- a/_maps/map_files/FestiveBall/FestiveStation.dmm +++ b/_maps/map_files/FestiveBall/FestiveStation.dmm @@ -29800,8 +29800,8 @@ /turf/open/floor/carpet/green, /area/medical/surgery) "byn" = ( -/obj/machinery/sleeper, /obj/effect/decal/festive/christmas_ivy_string, +/obj/machinery/stasis, /turf/open/floor/plasteel/white/side, /area/medical/exam_room) "byo" = ( @@ -29882,7 +29882,7 @@ /turf/open/floor/plasteel/white/side, /area/medical/exam_room) "byy" = ( -/obj/machinery/sleeper, +/obj/machinery/stasis, /turf/open/floor/plasteel/white/side, /area/medical/exam_room) "byz" = ( @@ -33048,9 +33048,7 @@ }, /area/medical/genetics/cloning) "bEC" = ( -/obj/machinery/sleeper{ - dir = 1 - }, +/obj/machinery/stasis, /turf/open/floor/plasteel/white/side{ dir = 1 }, diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index 731641d737..99eb9f9c6f 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -22447,9 +22447,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/machinery/sleeper{ - dir = 4 - }, +/obj/machinery/stasis, /turf/open/floor/plasteel/dark, /area/medical/medbay/central) "aLj" = ( diff --git a/_maps/map_files/LambdaStation/lambda.dmm b/_maps/map_files/LambdaStation/lambda.dmm index e676dea0e5..b93efb261a 100644 --- a/_maps/map_files/LambdaStation/lambda.dmm +++ b/_maps/map_files/LambdaStation/lambda.dmm @@ -38153,17 +38153,17 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bDq" = ( -/obj/machinery/sleeper, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 9 }, +/obj/machinery/stasis, /turf/open/floor/plasteel/white, /area/medical/cryo) "bDr" = ( -/obj/machinery/sleeper, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 5 }, +/obj/machinery/stasis, /turf/open/floor/plasteel/white, /area/medical/cryo) "bDs" = ( diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 5658a87fc2..467c6f264b 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -50579,9 +50579,6 @@ /turf/open/floor/plasteel/dark, /area/engineering/storage/tech) "eAe" = ( -/obj/machinery/sleeper{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, @@ -50595,6 +50592,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/stasis, /turf/open/floor/plasteel/white, /area/medical/treatment_center) "eAy" = ( @@ -81033,9 +81031,6 @@ /turf/open/space/basic, /area/space) "vLV" = ( -/obj/machinery/sleeper{ - dir = 4 - }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, @@ -81046,6 +81041,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/stasis, /turf/open/floor/plasteel/white, /area/medical/treatment_center) "vMm" = ( diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index b530cf0325..38c5a806c3 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -26813,12 +26813,10 @@ /turf/open/floor/plating, /area/medical/medbay/zone3) "aXS" = ( -/obj/machinery/sleeper{ - dir = 4 - }, /obj/effect/turf_decal/stripes/line{ dir = 6 }, +/obj/machinery/stasis, /turf/open/floor/plasteel/dark/side{ dir = 8 }, @@ -28157,9 +28155,6 @@ /turf/open/floor/plating, /area/medical/medbay/zone3) "bax" = ( -/obj/machinery/sleeper{ - dir = 4 - }, /obj/machinery/newscaster{ pixel_y = -32 }, @@ -28169,6 +28164,7 @@ /obj/effect/turf_decal/stripes/end{ dir = 4 }, +/obj/machinery/stasis, /turf/open/floor/plasteel/dark/side{ dir = 8 }, diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index bad187e5ed..8e6c3ba599 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -32728,9 +32728,6 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/zone3) "bzP" = ( -/obj/machinery/sleeper{ - dir = 4 - }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -32747,6 +32744,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/stasis, /turf/open/floor/plasteel, /area/medical/treatment_center) "bzQ" = ( @@ -33960,9 +33958,6 @@ /turf/open/floor/plasteel, /area/medical/treatment_center) "bCj" = ( -/obj/machinery/sleeper{ - dir = 4 - }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, @@ -33973,6 +33968,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/stasis, /turf/open/floor/plasteel, /area/medical/treatment_center) "bCl" = ( diff --git a/_maps/map_files/Snaxi/Snaxi.dmm b/_maps/map_files/Snaxi/Snaxi.dmm index 1db8a64a97..f538f31c2c 100644 --- a/_maps/map_files/Snaxi/Snaxi.dmm +++ b/_maps/map_files/Snaxi/Snaxi.dmm @@ -11007,9 +11007,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/machinery/sleeper{ - dir = 8 - }, +/obj/machinery/stasis, /turf/open/floor/plasteel/white, /area/medical/medbay/zone2) "aPZ" = ( @@ -20516,9 +20514,6 @@ /turf/open/floor/plating, /area/maintenance/solars/starboard/aft) "fUX" = ( -/obj/machinery/sleeper{ - dir = 4 - }, /obj/structure/window/reinforced{ dir = 1 }, @@ -20528,6 +20523,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 9 }, +/obj/machinery/stasis, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "fVm" = ( @@ -23736,9 +23732,6 @@ /turf/open/floor/plasteel/dark, /area/security/office) "hWn" = ( -/obj/machinery/sleeper{ - dir = 8 - }, /obj/structure/window/reinforced{ dir = 1 }, @@ -23755,6 +23748,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/stasis, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "hWp" = ( @@ -29421,9 +29415,6 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai_upload_foyer) "lOX" = ( -/obj/machinery/sleeper{ - dir = 8 - }, /obj/structure/window/reinforced, /obj/structure/mirror{ pixel_x = 25 @@ -29433,6 +29424,7 @@ }, /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/stripes/line, +/obj/machinery/stasis, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "lPB" = ( @@ -44164,9 +44156,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/machinery/sleeper{ - dir = 8 - }, +/obj/machinery/stasis, /turf/open/floor/plasteel/white, /area/medical/medbay/zone3) "vkk" = ( @@ -46270,9 +46260,6 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "wut" = ( -/obj/machinery/sleeper{ - dir = 4 - }, /obj/structure/window/reinforced, /obj/structure/window/reinforced{ dir = 8 @@ -46281,6 +46268,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 10 }, +/obj/machinery/stasis, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "wuC" = ( diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 4a17fef999..cfa9973d7d 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -11916,12 +11916,10 @@ /turf/open/floor/plasteel/white, /area/centcom/control) "BH" = ( -/obj/machinery/sleeper{ - dir = 4 - }, /obj/effect/turf_decal/stripes/line{ dir = 9 }, +/obj/machinery/stasis, /turf/open/floor/plasteel, /area/centcom/control) "BI" = ( @@ -11936,12 +11934,10 @@ /turf/open/floor/plasteel, /area/centcom/control) "BJ" = ( -/obj/machinery/sleeper{ - dir = 8 - }, /obj/effect/turf_decal/stripes/line{ dir = 5 }, +/obj/machinery/stasis, /turf/open/floor/plasteel, /area/centcom/control) "BK" = ( @@ -16445,9 +16441,7 @@ /turf/open/floor/holofloor/wood, /area/holodeck/rec_center/wrestlingarena) "Lh" = ( -/obj/machinery/sleeper{ - dir = 8 - }, +/obj/machinery/stasis, /turf/open/floor/mineral/titanium/blue, /area/centcom/evac) "Li" = ( @@ -46321,7 +46315,7 @@ KO KV KV KV -Lb +Lh Lb Lp Lp diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index b29daa85f6..8306b4779c 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -152,6 +152,8 @@ // GROUPED // ///////////// +#define STASIS_MACHINE_EFFECT "stasis_machine" + #define STASIS_ASCENSION_EFFECT "heretic_ascension" /// If the incapacitated status effect will ignore a mob in stasis (stasis beds) diff --git a/code/game/machinery/stasis.dm b/code/game/machinery/stasis.dm index 5f7f0263db..37047ccd11 100644 --- a/code/game/machinery/stasis.dm +++ b/code/game/machinery/stasis.dm @@ -44,7 +44,7 @@ /obj/machinery/stasis/Exited(atom/movable/AM, atom/newloc) if(AM == occupant) var/mob/living/L = AM - if(L.IsInStasis()) + if(IS_IN_STASIS(L)) thaw_them(L) . = ..() @@ -95,12 +95,13 @@ return var/freq = rand(24750, 26550) playsound(src, 'sound/effects/spray.ogg', 5, TRUE, 2, frequency = freq) - target.SetStasis(TRUE) + target.apply_status_effect(/datum/status_effect/grouped/stasis, STASIS_MACHINE_EFFECT) + target.ExtinguishMob() use_power = ACTIVE_POWER_USE /obj/machinery/stasis/proc/thaw_them(mob/living/target) - target.SetStasis(FALSE) + target.remove_status_effect(/datum/status_effect/grouped/stasis, STASIS_MACHINE_EFFECT) if(target == occupant) use_power = IDLE_POWER_USE @@ -124,9 +125,9 @@ return var/mob/living/L_occupant = occupant if(stasis_running()) - if(!L_occupant.IsInStasis()) + if(!IS_IN_STASIS(L_occupant)) chill_out(L_occupant) - else if(L_occupant.IsInStasis()) + else if(IS_IN_STASIS(L_occupant)) thaw_them(L_occupant) /obj/machinery/stasis/screwdriver_act(mob/living/user, obj/item/I) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 18a500f6f4..dd050bda3e 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -11,7 +11,7 @@ . = SEND_SIGNAL(src, COMSIG_LIVING_LIFE, seconds, times_fired) if(!(. & COMPONENT_INTERRUPT_LIFE_PHYSICAL)) PhysicalLife(seconds, times_fired) - if(!(. & COMPONENT_INTERRUPT_LIFE_BIOLOGICAL) && !IS_IN_STASIS()) + if(!(. & COMPONENT_INTERRUPT_LIFE_BIOLOGICAL) && !IS_IN_STASIS(src)) BiologicalLife(seconds, times_fired) // CODE BELOW SHOULD ONLY BE THINGS THAT SHOULD HAPPEN NO MATTER WHAT AND CAN NOT BE SUSPENDED! diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index e4ffb94493..41da50dc91 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -434,7 +434,7 @@ death() /mob/living/incapacitated(ignore_restraints = FALSE, ignore_grab = FALSE, check_immobilized = FALSE, ignore_stasis = FALSE) - if(stat || IsUnconscious() || IsStun() || IsParalyzed() || (combat_flags & COMBAT_FLAG_HARD_STAMCRIT) || (check_immobilized && IsImmobilized()) || (!ignore_restraints && restrained(ignore_grab)) || (!ignore_stasis && IS_IN_STASIS())) + if(stat || IsUnconscious() || IsStun() || IsParalyzed() || (combat_flags & COMBAT_FLAG_HARD_STAMCRIT) || (check_immobilized && IsImmobilized()) || (!ignore_restraints && restrained(ignore_grab)) || (!ignore_stasis && IS_IN_STASIS(src))) return TRUE /mob/living/canUseStorage() From 3824daba059831d443dd5b93a22364c1dd9ee689 Mon Sep 17 00:00:00 2001 From: Artur <24881678+Arturlang@users.noreply.github.com> Date: Wed, 6 Apr 2022 16:10:57 +0300 Subject: [PATCH 20/53] Trailing newlines --- code/__DEFINES/status_effects.dm | 2 +- code/game/objects/items/circuitboards/machine_circuitboards.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index 8306b4779c..b1f7efbb9a 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -157,4 +157,4 @@ #define STASIS_ASCENSION_EFFECT "heretic_ascension" /// If the incapacitated status effect will ignore a mob in stasis (stasis beds) -#define IGNORE_STASIS (1<<1) \ No newline at end of file +#define IGNORE_STASIS (1<<1) diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index c42d40db83..cbf71ce1c4 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -1489,4 +1489,4 @@ req_components = list( /obj/item/stack/cable_coil = 3, /obj/item/stock_parts/manipulator = 1, - /obj/item/stock_parts/capacitor = 1) \ No newline at end of file + /obj/item/stock_parts/capacitor = 1) From 05ff3406ea0c234ea176cf8ce697421a2b9b8a4b Mon Sep 17 00:00:00 2001 From: SandPoot Date: Wed, 6 Apr 2022 17:35:11 -0300 Subject: [PATCH 21/53] do this --- .../mecha/equipment/mecha_equipment.dm | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/code/modules/vehicles/mecha/equipment/mecha_equipment.dm b/code/modules/vehicles/mecha/equipment/mecha_equipment.dm index 617b82603a..ce4e76ed92 100644 --- a/code/modules/vehicles/mecha/equipment/mecha_equipment.dm +++ b/code/modules/vehicles/mecha/equipment/mecha_equipment.dm @@ -98,20 +98,16 @@ /obj/item/mecha_parts/mecha_equipment/proc/do_after_cooldown(atom/target, mob/user) if(!chassis) - return - var/C = chassis.loc - chassis.use_power(energy_drain) - . = do_after(user, equip_cooldown, target=target) - if(!chassis || chassis.loc != C || src != chassis.selected || !(get_dir(chassis, target)&chassis.dir)) return FALSE + chassis.use_power(energy_drain) + return do_after(user, equip_cooldown, target, extra_checks = CALLBACK(src, .proc/do_after_checks, target), interaction_key = interaction_key) /obj/item/mecha_parts/mecha_equipment/proc/do_after_mecha(atom/target, mob/user, delay) - if(!chassis) - return - var/C = chassis.loc - . = do_after(user, delay, target=target) - if(!chassis || chassis.loc != C || src != chassis.selected || !(get_dir(chassis, target)&chassis.dir)) - return FALSE + return do_after(user, delay, target, extra_checks = CALLBACK(src, .proc/do_after_checks, target)) + +/// do after checks for the mecha equipment do afters +/obj/item/mecha_parts/mecha_equipment/proc/do_after_checks(atom/target) + return chassis && (get_dir(chassis, target) & chassis.dir) /obj/item/mecha_parts/mecha_equipment/proc/can_attach(obj/vehicle/sealed/mecha/M) if(LAZYLEN(M.equipment) Date: Wed, 6 Apr 2022 18:41:31 -0300 Subject: [PATCH 22/53] Update files --- code/__HELPERS/unsorted.dm | 2 +- code/_onclick/hud/action_button.dm | 2 +- code/_onclick/hud/alert.dm | 6 +- code/_onclick/hud/families.dm | 2 +- code/_onclick/hud/picture_in_picture.dm | 2 +- code/_onclick/hud/plane_master.dm | 14 ++--- .../_onclick/hud/screen_objects/clickdelay.dm | 2 +- code/_onclick/telekinesis.dm | 2 +- code/controllers/subsystem/atoms.dm | 4 +- .../subsystem/processing/quirks.dm | 2 +- code/datums/brain_damage/special.dm | 2 +- code/datums/components/killerqueen.dm | 4 +- code/datums/components/knockoff.dm | 2 +- code/datums/martial/sleeping_carp.dm | 2 +- code/datums/status_effects/debuffs.dm | 2 +- code/game/area/Space_Station_13_areas.dm | 2 +- code/game/area/ai_monitored.dm | 2 +- code/game/area/areas.dm | 4 +- code/game/area/areas/centcom.dm | 2 +- code/game/area/areas/edina.dm | 2 +- code/game/area/areas/holodeck.dm | 2 +- code/game/area/areas/shuttles.dm | 2 +- .../game/gamemodes/clown_ops/clown_weapons.dm | 12 ++-- code/game/gamemodes/meteor/meteors.dm | 6 +- code/game/machinery/Beacon.dm | 2 +- code/game/machinery/PDApainter.dm | 2 +- code/game/machinery/Sleeper.dm | 6 +- code/game/machinery/_machinery.dm | 2 +- code/game/machinery/airlock_control.dm | 2 +- code/game/machinery/announcement_system.dm | 2 +- code/game/machinery/aug_manipulator.dm | 18 +++--- code/game/machinery/autolathe.dm | 8 +-- code/game/machinery/bank_machine.dm | 2 +- code/game/machinery/bloodbankgen.dm | 2 +- code/game/machinery/camera/motion.dm | 2 +- code/game/machinery/camera/presets.dm | 10 ++-- code/game/machinery/cloning.dm | 2 +- code/game/machinery/computer/Operating.dm | 2 +- code/game/machinery/computer/arcade.dm | 2 +- .../machinery/computer/arcade/orion_trail.dm | 2 +- code/game/machinery/computer/atmos_alert.dm | 2 +- code/game/machinery/computer/atmos_control.dm | 4 +- code/game/machinery/computer/camera.dm | 4 +- .../machinery/computer/camera_advanced.dm | 2 +- code/game/machinery/computer/card.dm | 4 +- code/game/machinery/computer/cloning.dm | 2 +- .../game/machinery/computer/communications.dm | 2 +- code/game/machinery/computer/dna_console.dm | 4 +- .../machinery/computer/launchpad_control.dm | 2 +- code/game/machinery/computer/pod.dm | 2 +- .../computer/prisoner/gulag_teleporter.dm | 2 +- code/game/machinery/computer/station_alert.dm | 2 +- .../machinery/computer/telecrystalconsoles.dm | 2 +- code/game/machinery/computer/teleporter.dm | 2 +- code/game/machinery/cryopod.dm | 4 +- code/game/machinery/defibrillator_mount.dm | 2 +- code/game/machinery/deployable.dm | 2 +- code/game/machinery/dish_drive.dm | 2 +- code/game/machinery/dna_scanner.dm | 2 +- code/game/machinery/doors/airlock.dm | 2 +- code/game/machinery/doors/airlock_types.dm | 4 +- code/game/machinery/doors/alarmlock.dm | 4 +- code/game/machinery/doors/brigdoors.dm | 2 +- code/game/machinery/doors/door.dm | 2 +- code/game/machinery/doors/firedoor.dm | 2 +- code/game/machinery/doppler_array.dm | 4 +- code/game/machinery/droneDispenser.dm | 2 +- .../embedded_controller/access_controller.dm | 2 +- .../embedded_controller_base.dm | 2 +- code/game/machinery/flasher.dm | 2 +- code/game/machinery/gulag_teleporter.dm | 2 +- code/game/machinery/harvester.dm | 2 +- code/game/machinery/hologram.dm | 4 +- code/game/machinery/hypnochair.dm | 2 +- code/game/machinery/igniter.dm | 4 +- code/game/machinery/launch_pad.dm | 2 +- code/game/machinery/lightswitch.dm | 2 +- code/game/machinery/limbgrower.dm | 6 +- code/game/machinery/magnet.dm | 4 +- code/game/machinery/mechlaunchpad.dm | 2 +- code/game/machinery/navbeacon.dm | 2 +- .../machinery/porta_turret/portable_turret.dm | 4 +- code/game/machinery/quantum_pad.dm | 2 +- code/game/machinery/rechargestation.dm | 6 +- code/game/machinery/recycler.dm | 2 +- code/game/machinery/requests_console.dm | 2 +- code/game/machinery/sheetifier.dm | 2 +- code/game/machinery/shieldgen.dm | 2 +- code/game/machinery/shuttle/custom_shuttle.dm | 2 +- code/game/machinery/shuttle/shuttle_engine.dm | 2 +- code/game/machinery/slotmachine.dm | 2 +- code/game/machinery/spaceheater.dm | 2 +- code/game/machinery/status_display.dm | 4 +- code/game/machinery/suit_storage_unit.dm | 2 +- code/game/machinery/syndicatebomb.dm | 4 +- .../machinery/telecomms/machines/allinone.dm | 2 +- code/game/machinery/telecomms/machines/bus.dm | 2 +- .../telecomms/machines/message_server.dm | 4 +- .../machinery/telecomms/machines/receiver.dm | 2 +- .../machinery/telecomms/machines/server.dm | 8 +-- code/game/machinery/teleporter.dm | 6 +- code/game/machinery/transformer.dm | 2 +- code/game/machinery/turnstile.dm | 2 +- code/game/mecha/combat/five_stars.dm | 2 +- code/game/mecha/combat/gygax.dm | 2 +- code/game/mecha/combat/marauder.dm | 6 +- code/game/mecha/combat/neovgre.dm | 2 +- code/game/mecha/combat/reticence.dm | 2 +- .../mecha/equipment/tools/medical_tools.dm | 6 +- .../mecha/equipment/tools/mining_tools.dm | 6 +- .../game/mecha/equipment/tools/other_tools.dm | 2 +- code/game/mecha/equipment/tools/work_tools.dm | 6 +- code/game/mecha/mech_bay.dm | 4 +- code/game/mecha/mecha.dm | 2 +- code/game/mecha/mecha_parts.dm | 4 +- code/game/mecha/mecha_wreckage.dm | 14 ++--- code/game/mecha/working/ripley.dm | 8 +-- code/game/objects/effects/arachnid_web.dm | 2 +- code/game/objects/effects/bump_teleporter.dm | 2 +- code/game/objects/effects/contraband.dm | 2 +- code/game/objects/effects/countdown.dm | 2 +- .../effects/decals/cleanable/aliens.dm | 2 +- .../effects/decals/cleanable/humans.dm | 2 +- .../objects/effects/decals/cleanable/misc.dm | 10 ++-- .../effects/decals/cleanable/robots.dm | 4 +- code/game/objects/effects/decals/decal.dm | 4 +- .../effects/effect_system/effect_system.dm | 2 +- .../effect_system/effects_explosion.dm | 4 +- .../effects/effect_system/effects_foam.dm | 6 +- .../effects/effect_system/effects_smoke.dm | 2 +- .../effects/effect_system/effects_sparks.dm | 4 +- .../effects/effect_system/effects_water.dm | 4 +- code/game/objects/effects/forcefields.dm | 2 +- code/game/objects/effects/landmarks.dm | 10 ++-- code/game/objects/effects/mines.dm | 2 +- code/game/objects/effects/overlays.dm | 2 +- .../objects/effects/spawners/bombspawner.dm | 4 +- .../objects/effects/spawners/gibspawner.dm | 28 ++++----- .../game/objects/effects/spawners/lootdrop.dm | 6 +- .../objects/effects/spawners/structure.dm | 34 +++++------ code/game/objects/effects/spiders.dm | 8 +-- .../effects/temporary_visuals/clockcult.dm | 10 ++-- .../temporary_visuals/temporary_visual.dm | 2 +- code/game/objects/items.dm | 2 +- code/game/objects/items/AI_modules.dm | 2 +- code/game/objects/items/RCD.dm | 8 +-- code/game/objects/items/RCL.dm | 4 +- code/game/objects/items/RPD.dm | 2 +- code/game/objects/items/airlock_painter.dm | 6 +- code/game/objects/items/binoculars.dm | 2 +- code/game/objects/items/boombox.dm | 2 +- code/game/objects/items/broom.dm | 2 +- code/game/objects/items/candle.dm | 2 +- code/game/objects/items/cardboard_cutouts.dm | 2 +- code/game/objects/items/cards_ids.dm | 24 ++++---- code/game/objects/items/chainsaw.dm | 2 +- code/game/objects/items/charter.dm | 2 +- code/game/objects/items/chrono_eraser.dm | 6 +- code/game/objects/items/cigs_lighters.dm | 12 ++-- .../circuitboards/computer_circuitboards.dm | 2 +- .../circuitboards/machine_circuitboards.dm | 4 +- code/game/objects/items/clown_items.dm | 2 +- code/game/objects/items/control_wand.dm | 2 +- code/game/objects/items/crayons.dm | 6 +- code/game/objects/items/defib.dm | 4 +- code/game/objects/items/devices/PDA/PDA.dm | 2 +- .../objects/items/devices/PDA/PDA_types.dm | 2 +- code/game/objects/items/devices/PDA/cart.dm | 6 +- code/game/objects/items/devices/PDA/radio.dm | 2 +- code/game/objects/items/devices/beacon.dm | 8 +-- .../objects/items/devices/dogborg_sleeper.dm | 2 +- .../devices/electroadaptive_pseudocircuit.dm | 2 +- code/game/objects/items/devices/flashlight.dm | 4 +- .../objects/items/devices/geiger_counter.dm | 2 +- code/game/objects/items/devices/gps.dm | 6 +- code/game/objects/items/devices/multitool.dm | 4 +- code/game/objects/items/devices/paicard.dm | 2 +- code/game/objects/items/devices/powersink.dm | 2 +- .../objects/items/devices/pressureplates.dm | 2 +- .../items/devices/radio/electropack.dm | 2 +- .../items/devices/radio/encryptionkey.dm | 2 +- .../objects/items/devices/radio/headset.dm | 6 +- .../game/objects/items/devices/radio/radio.dm | 4 +- .../items/devices/reverse_bear_trap.dm | 2 +- .../objects/items/devices/traitordevices.dm | 2 +- code/game/objects/items/dice.dm | 4 +- code/game/objects/items/dualsaber.dm | 4 +- code/game/objects/items/extinguisher.dm | 2 +- code/game/objects/items/fireaxe.dm | 2 +- code/game/objects/items/fluff.dm | 4 +- code/game/objects/items/granters.dm | 2 +- .../objects/items/grenades/chem_grenade.dm | 30 +++++----- .../game/objects/items/grenades/ghettobomb.dm | 2 +- code/game/objects/items/grenades/plastic.dm | 2 +- code/game/objects/items/handcuffs.dm | 2 +- code/game/objects/items/his_grace.dm | 2 +- code/game/objects/items/holy_weapons.dm | 12 ++-- .../objects/items/implants/implant_chem.dm | 2 +- .../objects/items/implants/implant_stealth.dm | 2 +- .../objects/items/implants/implant_track.dm | 4 +- .../objects/items/implants/implantchair.dm | 2 +- code/game/objects/items/inducer.dm | 8 +-- code/game/objects/items/kitchen.dm | 8 +-- code/game/objects/items/manuals.dm | 2 +- code/game/objects/items/melee/energy.dm | 6 +- code/game/objects/items/melee/misc.dm | 14 ++--- code/game/objects/items/melee/transforming.dm | 2 +- code/game/objects/items/pet_carrier.dm | 2 +- code/game/objects/items/pinpointer.dm | 2 +- code/game/objects/items/pitchfork.dm | 4 +- code/game/objects/items/plushes.dm | 2 +- code/game/objects/items/pneumaticCannon.dm | 4 +- code/game/objects/items/religion.dm | 2 +- code/game/objects/items/robot/robot_items.dm | 2 +- code/game/objects/items/shields.dm | 4 +- code/game/objects/items/singularityhammer.dm | 2 +- code/game/objects/items/spear.dm | 2 +- code/game/objects/items/stacks/bscrystal.dm | 2 +- code/game/objects/items/stacks/medical.dm | 4 +- .../game/objects/items/stacks/sheets/glass.dm | 2 +- code/game/objects/items/storage/_storage.dm | 2 +- code/game/objects/items/storage/backpack.dm | 4 +- code/game/objects/items/storage/belt.dm | 4 +- code/game/objects/items/storage/book.dm | 2 +- code/game/objects/items/storage/boxes.dm | 4 +- code/game/objects/items/storage/lockbox.dm | 2 +- code/game/objects/items/storage/toolbox.dm | 2 +- .../game/objects/items/storage/uplink_kits.dm | 2 +- code/game/objects/items/stunbaton.dm | 2 +- code/game/objects/items/summon.dm | 2 +- code/game/objects/items/tanks/jetpack.dm | 4 +- code/game/objects/items/tanks/tanks.dm | 2 +- code/game/objects/items/tanks/watertank.dm | 12 ++-- code/game/objects/items/teleportation.dm | 2 +- code/game/objects/items/theft_tools.dm | 4 +- code/game/objects/items/tools/screwdriver.dm | 2 +- code/game/objects/items/tools/weldingtool.dm | 2 +- code/game/objects/items/tools/wirecutters.dm | 2 +- code/game/objects/items/toys.dm | 6 +- code/game/objects/items/trash.dm | 2 +- code/game/objects/items/weaponry.dm | 24 ++++---- code/game/objects/objs.dm | 2 +- code/game/objects/structures.dm | 4 +- code/game/objects/structures/ai_core.dm | 4 +- code/game/objects/structures/aliens.dm | 4 +- code/game/objects/structures/artstuff.dm | 2 +- code/game/objects/structures/barsigns.dm | 2 +- .../objects/structures/beds_chairs/chair.dm | 4 +- .../objects/structures/beds_chairs/pew.dm | 4 +- .../objects/structures/beds_chairs/sofa.dm | 2 +- code/game/objects/structures/bedsheet_bin.dm | 6 +- .../crates_lockers/closets/secure/freezer.dm | 2 +- .../structures/crates_lockers/crates.dm | 4 +- code/game/objects/structures/displaycase.dm | 4 +- code/game/objects/structures/false_walls.dm | 2 +- code/game/objects/structures/fence.dm | 4 +- code/game/objects/structures/fireaxe.dm | 2 +- code/game/objects/structures/flora.dm | 60 +++++++++---------- code/game/objects/structures/guillotine.dm | 2 +- code/game/objects/structures/headpike.dm | 2 +- code/game/objects/structures/holosign.dm | 6 +- .../structures/icemoon/cave_entrance.dm | 4 +- code/game/objects/structures/janicart.dm | 2 +- code/game/objects/structures/ladders.dm | 2 +- .../objects/structures/lavaland/geyser.dm | 2 +- .../structures/lavaland/necropolis_tendril.dm | 4 +- code/game/objects/structures/loot_pile.dm | 2 +- code/game/objects/structures/manned_turret.dm | 2 +- code/game/objects/structures/mineral_doors.dm | 4 +- code/game/objects/structures/mop_bucket.dm | 2 +- code/game/objects/structures/morgue.dm | 4 +- code/game/objects/structures/plasticflaps.dm | 4 +- code/game/objects/structures/railings.dm | 2 +- code/game/objects/structures/reflector.dm | 2 +- code/game/objects/structures/showcase.dm | 4 +- code/game/objects/structures/spawner.dm | 2 +- code/game/objects/structures/statues.dm | 2 +- code/game/objects/structures/tables_racks.dm | 2 +- .../game/objects/structures/tank_dispenser.dm | 2 +- .../transit_tubes/transit_tube_pod.dm | 2 +- code/game/objects/structures/watercloset.dm | 6 +- code/game/objects/structures/window.dm | 2 +- code/game/turfs/baseturf_skipover.dm | 2 +- code/game/turfs/closed.dm | 4 +- code/game/turfs/open.dm | 2 +- code/game/turfs/open/floor/catwalk_plating.dm | 2 +- code/game/turfs/openspace/transparent.dm | 4 +- code/game/turfs/simulated/chasm.dm | 4 +- .../game/turfs/simulated/floor/fancy_floor.dm | 10 ++-- .../game/turfs/simulated/floor/light_floor.dm | 2 +- .../turfs/simulated/floor/mineral_floor.dm | 4 +- code/game/turfs/simulated/floor/misc_floor.dm | 4 +- code/game/turfs/simulated/floor/plating.dm | 2 +- .../turfs/simulated/floor/plating/asteroid.dm | 4 +- .../simulated/floor/plating/misc_plating.dm | 10 ++-- .../game/turfs/simulated/floor/reinf_floor.dm | 2 +- code/game/turfs/simulated/glass.dm | 2 +- code/game/turfs/simulated/minerals.dm | 6 +- code/game/turfs/simulated/openspace.dm | 4 +- code/game/turfs/simulated/wall/misc_walls.dm | 4 +- code/game/turfs/space/space.dm | 6 +- code/game/turfs/space/transit.dm | 2 +- code/modules/NTNet/relays.dm | 2 +- code/modules/VR/vr_sleeper.dm | 8 +-- code/modules/admin/fun_balloon.dm | 4 +- code/modules/admin/verbs/randomverbs.dm | 2 +- .../abductor/equipment/abduction_gear.dm | 2 +- .../antagonists/abductor/equipment/gland.dm | 2 +- .../abductor/equipment/glands/chem.dm | 2 +- .../abductor/machinery/dispenser.dm | 2 +- .../antagonists/abductor/machinery/pad.dm | 2 +- .../antagonists/blob/blob/blobs/blob_mobs.dm | 2 +- .../antagonists/blob/blob/blobs/node.dm | 2 +- .../bloodsucker/bloodsucker_sunlight.dm | 2 +- .../changeling/powers/mutations.dm | 16 ++--- .../changeling/powers/transform.dm | 16 ++--- .../antagonists/clockcult/clock_effect.dm | 2 +- .../clock_effects/city_of_cogs_rift.dm | 2 +- .../clockcult/clock_effects/clock_overlay.dm | 2 +- .../clockcult/clock_effects/clock_sigils.dm | 4 +- .../clock_effects/servant_blocker.dm | 2 +- .../clock_effects/spatial_gateway.dm | 2 +- .../antagonists/clockcult/clock_item.dm | 2 +- .../clockcult/clock_items/clock_components.dm | 2 +- .../clock_items/clock_weapons/brass_claw.dm | 2 +- .../clockcult/clock_items/clockwork_armor.dm | 8 +-- .../clockcult/clock_items/clockwork_slab.dm | 2 +- .../clock_items/construct_chassis.dm | 4 +- .../clockcult/clock_items/integration_cog.dm | 2 +- .../clockcult/clock_items/judicial_visor.dm | 2 +- .../clockcult/clock_items/soul_vessel.dm | 2 +- .../clock_items/wraith_spectacles.dm | 2 +- .../antagonists/clockcult/clock_mobs.dm | 2 +- .../clock_mobs/clockwork_guardian.dm | 2 +- .../antagonists/clockcult/clock_structure.dm | 4 +- .../clock_structures/_trap_object.dm | 4 +- .../ark_of_the_clockwork_justicar.dm | 2 +- .../clock_structures/clockwork_obelisk.dm | 2 +- .../clock_structures/heralds_beacon.dm | 2 +- .../clock_structures/ocular_warden.dm | 2 +- .../ratvar_the_clockwork_justicar.dm | 2 +- .../clockcult/clock_structures/reflector.dm | 2 +- .../clockcult/clock_structures/stargazer.dm | 2 +- .../clock_structures/taunting_trail.dm | 2 +- .../clock_structures/traps/brass_skewer.dm | 2 +- .../clockcult/clock_structures/wall_gear.dm | 2 +- code/modules/antagonists/cult/cult_items.dm | 16 ++--- .../antagonists/cult/cult_structures.dm | 2 +- code/modules/antagonists/cult/ritual.dm | 2 +- code/modules/antagonists/cult/runes.dm | 2 +- code/modules/antagonists/devil/imp/imp.dm | 2 +- .../devil/true_devil/_true_devil.dm | 2 +- .../eldritch_cult/eldritch_effects.dm | 6 +- .../eldritch_cult/eldritch_items.dm | 4 +- .../eldritch_cult/eldritch_magic.dm | 2 +- code/modules/antagonists/gang/cellphone.dm | 2 +- code/modules/antagonists/morph/morph.dm | 2 +- .../nukeop/equipment/borgchameleon.dm | 2 +- .../nukeop/equipment/nuclearbomb.dm | 6 +- .../nukeop/equipment/pinpointer.dm | 4 +- .../antagonists/slaughter/slaughter.dm | 4 +- code/modules/antagonists/swarmer/swarmer.dm | 6 +- .../traitor/equipment/Malf_Modules.dm | 2 +- .../antagonists/wizard/equipment/artefact.dm | 2 +- .../antagonists/wizard/equipment/spellbook.dm | 2 +- code/modules/arousal/toys/dildos.dm | 2 +- code/modules/assembly/infrared.dm | 2 +- code/modules/assembly/proximity.dm | 2 +- code/modules/assembly/signaler.dm | 2 +- code/modules/assembly/timer.dm | 2 +- .../environmental/LINDA_turf_tile.dm | 2 +- .../components/unary_devices/cryo.dm | 2 +- .../components/unary_devices/thermomachine.dm | 6 +- .../atmospherics/machinery/other/miner.dm | 2 +- .../machinery/pipes/heat_exchange/he_pipes.dm | 2 +- .../machinery/pipes/heat_exchange/manifold.dm | 2 +- .../machinery/pipes/layermanifold.dm | 2 +- .../atmospherics/machinery/pipes/manifold.dm | 2 +- .../machinery/pipes/manifold4w.dm | 2 +- .../atmospherics/machinery/portable/pump.dm | 2 +- code/modules/awaymissions/away_props.dm | 2 +- code/modules/awaymissions/capture_the_flag.dm | 4 +- code/modules/awaymissions/corpse.dm | 4 +- code/modules/awaymissions/gateway.dm | 4 +- .../awaymissions/mission_code/Cabin.dm | 2 +- .../awaymissions/mission_code/jungleresort.dm | 2 +- .../awaymissions/mission_code/murderdome.dm | 2 +- .../mission_code/stationCollision.dm | 4 +- code/modules/awaymissions/signpost.dm | 4 +- .../modules/awaymissions/super_secret_room.dm | 2 +- code/modules/awaymissions/zlevel.dm | 2 +- .../cargo/blackmarket/blackmarket_telepad.dm | 2 +- .../cargo/blackmarket/blackmarket_uplink.dm | 4 +- code/modules/cargo/bounty_console.dm | 4 +- code/modules/cargo/console.dm | 2 +- code/modules/cargo/expressconsole.dm | 2 +- code/modules/cargo/supplypod.dm | 2 +- code/modules/clothing/chameleon.dm | 54 ++++++++--------- code/modules/clothing/clothing.dm | 2 +- code/modules/clothing/ears/_ears.dm | 2 +- code/modules/clothing/glasses/_glasses.dm | 4 +- .../clothing/glasses/engine_goggles.dm | 2 +- code/modules/clothing/gloves/color.dm | 4 +- code/modules/clothing/gloves/miscellaneous.dm | 4 +- code/modules/clothing/gloves/mittens.dm | 2 +- code/modules/clothing/head/_head.dm | 2 +- code/modules/clothing/head/hardhat.dm | 2 +- code/modules/clothing/head/jobs.dm | 4 +- code/modules/clothing/head/misc.dm | 2 +- code/modules/clothing/masks/cluwne.dm | 4 +- code/modules/clothing/masks/gasmask.dm | 2 +- code/modules/clothing/masks/miscellaneous.dm | 8 +-- code/modules/clothing/neck/_neck.dm | 2 +- code/modules/clothing/shoes/bananashoes.dm | 2 +- code/modules/clothing/shoes/cluwne.dm | 2 +- code/modules/clothing/shoes/magboots.dm | 2 +- code/modules/clothing/shoes/miscellaneous.dm | 8 +-- code/modules/clothing/spacesuits/hardsuit.dm | 32 +++++----- .../clothing/spacesuits/miscellaneous.dm | 8 +-- code/modules/clothing/spacesuits/plasmamen.dm | 2 +- code/modules/clothing/suits/armor.dm | 10 ++-- code/modules/clothing/suits/jobs.dm | 2 +- code/modules/clothing/suits/miscellaneous.dm | 14 ++--- code/modules/clothing/suits/toggles.dm | 4 +- code/modules/clothing/under/accessories.dm | 4 +- code/modules/clothing/under/cluwne.dm | 2 +- code/modules/clothing/under/color.dm | 8 +-- code/modules/clothing/under/costume.dm | 6 +- .../under/jobs/civilian/clown_mime.dm | 2 +- code/modules/events/pirates.dm | 2 +- code/modules/events/shuttle_loan.dm | 2 +- code/modules/events/spacevine.dm | 2 +- code/modules/events/travelling_trader.dm | 12 ++-- code/modules/events/wizard/magicarp.dm | 2 +- code/modules/fields/fields.dm | 2 +- code/modules/flufftext/Hallucination.dm | 2 +- code/modules/food_and_drinks/drinks/drinks.dm | 2 +- .../food_and_drinks/drinks/drinks/bottle.dm | 8 +-- .../drinks/drinks/drinkingglass.dm | 2 +- .../food_and_drinks/food/customizables.dm | 2 +- .../food_and_drinks/food/snacks_burgers.dm | 6 +- .../food_and_drinks/food/snacks_egg.dm | 2 +- .../food_and_drinks/food/snacks_meat.dm | 12 ++-- .../food_and_drinks/food/snacks_other.dm | 10 ++-- .../food_and_drinks/food/snacks_pastry.dm | 10 ++-- .../food_and_drinks/food/snacks_pie.dm | 2 +- .../food_and_drinks/food/snacks_pizza.dm | 4 +- .../food_and_drinks/food/snacks_salad.dm | 2 +- .../food_and_drinks/food/snacks_soup.dm | 8 +-- .../kitchen_machinery/deep_fryer.dm | 2 +- .../kitchen_machinery/food_cart.dm | 2 +- .../kitchen_machinery/gibber.dm | 2 +- .../kitchen_machinery/grill.dm | 2 +- .../kitchen_machinery/icecream_vat.dm | 4 +- .../kitchen_machinery/microwave.dm | 2 +- .../kitchen_machinery/smartfridge.dm | 6 +- code/modules/food_and_drinks/pizzabox.dm | 16 ++--- code/modules/holiday/easter.dm | 4 +- code/modules/holiday/halloween/halloween.dm | 10 ++-- code/modules/holiday/halloween/jacqueen.dm | 10 ++-- code/modules/holodeck/holo_effect.dm | 2 +- code/modules/holodeck/items.dm | 6 +- code/modules/holodeck/turfs.dm | 14 ++--- code/modules/hydroponics/beekeeping/beebox.dm | 4 +- .../hydroponics/beekeeping/honey_frame.dm | 2 +- .../hydroponics/beekeeping/honeycomb.dm | 2 +- code/modules/hydroponics/biogenerator.dm | 2 +- code/modules/hydroponics/fermenting_barrel.dm | 4 +- code/modules/hydroponics/gene_modder.dm | 2 +- code/modules/hydroponics/grown/banana.dm | 2 +- .../hydroponics/grown/cocoa_vanilla.dm | 2 +- code/modules/hydroponics/grown/melon.dm | 2 +- code/modules/hydroponics/grown/random.dm | 4 +- code/modules/hydroponics/grown/replicapod.dm | 2 +- code/modules/hydroponics/grown/towercap.dm | 2 +- code/modules/hydroponics/growninedible.dm | 2 +- code/modules/hydroponics/hydroitemdefines.dm | 6 +- code/modules/hydroponics/hydroponics.dm | 2 +- code/modules/hydroponics/sample.dm | 2 +- code/modules/instruments/instruments/item.dm | 8 +-- .../integrated_electronics/core/assemblies.dm | 2 +- .../integrated_electronics/core/detailer.dm | 2 +- .../core/integrated_circuit.dm | 2 +- .../integrated_electronics/core/printer.dm | 2 +- .../integrated_electronics/passive/power.dm | 2 +- .../subtypes/arithmetic.dm | 2 +- .../subtypes/atmospherics.dm | 14 ++--- .../subtypes/converters.dm | 2 +- .../subtypes/data_transfer.dm | 8 +-- .../integrated_electronics/subtypes/input.dm | 6 +- .../integrated_electronics/subtypes/lists.dm | 4 +- .../integrated_electronics/subtypes/memory.dm | 2 +- .../integrated_electronics/subtypes/output.dm | 4 +- .../subtypes/reagents.dm | 14 ++--- .../integrated_electronics/subtypes/smart.dm | 2 +- .../subtypes/weaponized.dm | 2 +- .../jobs/job_types/security_officer.dm | 2 +- code/modules/library/lib_items.dm | 6 +- code/modules/library/lib_machines.dm | 2 +- code/modules/library/random_books.dm | 2 +- .../mapping_helpers/_mapping_helpers.dm | 4 +- .../mapping/mapping_helpers/baseturf.dm | 2 +- code/modules/mining/abandoned_crates.dm | 2 +- code/modules/mining/aux_base.dm | 2 +- code/modules/mining/aux_base_camera.dm | 2 +- .../modules/mining/equipment/explorer_gear.dm | 10 ++-- .../mining/equipment/kinetic_crusher.dm | 2 +- .../mining/equipment/mineral_scanner.dm | 2 +- code/modules/mining/equipment/mining_tools.dm | 4 +- .../mining/equipment/regenerative_core.dm | 4 +- code/modules/mining/equipment/resonator.dm | 2 +- code/modules/mining/equipment/survival_pod.dm | 2 +- code/modules/mining/fulton.dm | 2 +- code/modules/mining/laborcamp/laborstacker.dm | 2 +- code/modules/mining/lavaland/ash_flora.dm | 4 +- .../mining/lavaland/necropolis_chests.dm | 12 ++-- code/modules/mining/machine_processing.dm | 4 +- code/modules/mining/machine_stacking.dm | 2 +- code/modules/mining/machine_vending.dm | 4 +- code/modules/mining/mine_items.dm | 2 +- code/modules/mining/minebot.dm | 2 +- code/modules/mining/mint.dm | 2 +- code/modules/mining/money_bag.dm | 2 +- code/modules/mining/ores_coins.dm | 2 +- code/modules/mob/dead/dead.dm | 2 +- .../modules/mob/dead/new_player/new_player.dm | 4 +- code/modules/mob/living/bloodcrawl.dm | 2 +- code/modules/mob/living/brain/MMI.dm | 4 +- code/modules/mob/living/brain/brain.dm | 2 +- code/modules/mob/living/brain/posibrain.dm | 2 +- code/modules/mob/living/carbon/alien/alien.dm | 2 +- .../carbon/alien/humanoid/alien_powers.dm | 2 +- .../carbon/alien/humanoid/caste/drone.dm | 2 +- .../carbon/alien/humanoid/caste/praetorian.dm | 2 +- .../carbon/alien/humanoid/caste/sentinel.dm | 2 +- .../living/carbon/alien/humanoid/humanoid.dm | 2 +- .../mob/living/carbon/alien/humanoid/queen.dm | 4 +- .../mob/living/carbon/alien/larva/larva.dm | 2 +- .../modules/mob/living/carbon/alien/organs.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 4 +- .../carbon/human/species_types/jellypeople.dm | 2 +- .../human/species_types/shadowpeople.dm | 2 +- .../mob/living/carbon/monkey/monkey.dm | 2 +- .../mob/living/carbon/monkey/punpun.dm | 2 +- code/modules/mob/living/living.dm | 2 +- .../mob/living/silicon/ai/freelook/eye.dm | 2 +- .../modules/mob/living/silicon/ai/multicam.dm | 4 +- code/modules/mob/living/silicon/pai/pai.dm | 4 +- .../modules/mob/living/silicon/robot/robot.dm | 4 +- .../mob/living/silicon/robot/robot_modules.dm | 4 +- code/modules/mob/living/silicon/silicon.dm | 2 +- .../living/simple_animal/bot/SuperBeepsky.dm | 2 +- .../mob/living/simple_animal/bot/bot.dm | 4 +- .../mob/living/simple_animal/bot/cleanbot.dm | 2 +- .../living/simple_animal/bot/construction.dm | 4 +- .../mob/living/simple_animal/bot/firebot.dm | 2 +- .../mob/living/simple_animal/bot/floorbot.dm | 2 +- .../mob/living/simple_animal/bot/honkbot.dm | 2 +- .../mob/living/simple_animal/bot/mulebot.dm | 2 +- .../mob/living/simple_animal/bot/secbot.dm | 4 +- .../mob/living/simple_animal/constructs.dm | 4 +- .../living/simple_animal/eldritch_demons.dm | 4 +- .../living/simple_animal/friendly/bumbles.dm | 2 +- .../simple_animal/friendly/butterfly.dm | 2 +- .../mob/living/simple_animal/friendly/cat.dm | 4 +- .../simple_animal/friendly/cockroach.dm | 2 +- .../mob/living/simple_animal/friendly/crab.dm | 2 +- .../mob/living/simple_animal/friendly/dog.dm | 8 +-- .../simple_animal/friendly/drone/_drone.dm | 2 +- .../friendly/drone/drones_as_items.dm | 2 +- .../friendly/drone/extra_drone_types.dm | 10 ++-- .../simple_animal/friendly/farm_animals.dm | 18 +++--- .../living/simple_animal/friendly/gondola.dm | 2 +- .../living/simple_animal/friendly/mouse.dm | 4 +- .../mob/living/simple_animal/friendly/pet.dm | 2 +- .../living/simple_animal/friendly/possum.dm | 2 +- .../living/simple_animal/friendly/snake.dm | 2 +- .../living/simple_animal/gremlin/gremlin.dm | 2 +- .../simple_animal/guardian/types/assassin.dm | 2 +- .../simple_animal/guardian/types/support.dm | 2 +- .../mob/living/simple_animal/hostile/alien.dm | 4 +- .../simple_animal/hostile/banana_spider.dm | 4 +- .../mob/living/simple_animal/hostile/bees.dm | 8 +-- .../simple_animal/hostile/bosses/boss.dm | 2 +- .../hostile/bosses/paperwizard.dm | 2 +- .../mob/living/simple_animal/hostile/bread.dm | 2 +- .../mob/living/simple_animal/hostile/carp.dm | 4 +- .../simple_animal/hostile/floor_cluwne.dm | 6 +- .../simple_animal/hostile/giant_spider.dm | 8 +-- .../living/simple_animal/hostile/headcrab.dm | 2 +- .../living/simple_animal/hostile/hivebot.dm | 2 +- .../living/simple_animal/hostile/hostile.dm | 2 +- .../simple_animal/hostile/jungle/leaper.dm | 6 +- .../simple_animal/hostile/killertomato.dm | 2 +- .../simple_animal/hostile/mecha_pilot.dm | 4 +- .../hostile/megafauna/blood_drunk_miner.dm | 2 +- .../hostile/megafauna/bubblegum.dm | 4 +- .../hostile/megafauna/colossus.dm | 12 ++-- .../hostile/megafauna/demonic_frost_miner.dm | 6 +- .../hostile/megafauna/dragon_vore.dm | 2 +- .../simple_animal/hostile/megafauna/drake.dm | 2 +- .../hostile/megafauna/hierophant.dm | 2 +- .../simple_animal/hostile/megafauna/legion.dm | 4 +- .../hostile/megafauna/swarmer.dm | 4 +- .../hostile/megafauna/wendigo.dm | 2 +- .../hostile/mining_mobs/basilisk.dm | 2 +- .../hostile/mining_mobs/elites/herald.dm | 2 +- .../hostile/mining_mobs/elites/legionnaire.dm | 2 +- .../hostile/mining_mobs/goldgrub.dm | 2 +- .../hostile/mining_mobs/goliath.dm | 2 +- .../hostile/mining_mobs/gutlunch.dm | 6 +- .../hostile/mining_mobs/hivelord.dm | 8 +-- .../living/simple_animal/hostile/mushroom.dm | 4 +- .../simple_animal/hostile/netherworld.dm | 4 +- .../living/simple_animal/hostile/pirate.dm | 4 +- .../living/simple_animal/hostile/plaguerat.dm | 2 +- .../living/simple_animal/hostile/regalrat.dm | 4 +- .../simple_animal/hostile/retaliate/bat.dm | 2 +- .../simple_animal/hostile/retaliate/clown.dm | 4 +- .../simple_animal/hostile/retaliate/frog.dm | 2 +- .../simple_animal/hostile/retaliate/ghost.dm | 2 +- .../living/simple_animal/hostile/skeleton.dm | 2 +- .../living/simple_animal/hostile/syndicate.dm | 16 ++--- .../simple_animal/hostile/venus_human_trap.dm | 2 +- .../living/simple_animal/hostile/wizard.dm | 2 +- .../simple_animal/hostile/wumborian_fugu.dm | 2 +- .../mob/living/simple_animal/parrot.dm | 6 +- .../mob/living/simple_animal/simple_animal.dm | 2 +- code/modules/mob/mob.dm | 2 +- .../computers/item/computer.dm | 2 +- .../computers/item/laptop.dm | 2 +- .../computers/item/laptop_presets.dm | 2 +- .../computers/item/tablet.dm | 4 +- .../computers/item/tablet_presets.dm | 22 +++---- .../computers/machinery/console_presets.dm | 2 +- .../computers/machinery/modular_computer.dm | 2 +- .../computers/machinery/modular_console.dm | 4 +- .../modular_computers/hardware/hard_drive.dm | 2 +- code/modules/ninja/energy_katana.dm | 2 +- code/modules/ninja/suit/suit.dm | 2 +- code/modules/paperwork/clipboard.dm | 2 +- code/modules/paperwork/filingcabinet.dm | 2 +- code/modules/paperwork/folders.dm | 8 +-- code/modules/paperwork/paper.dm | 6 +- code/modules/paperwork/paper_cutter.dm | 4 +- code/modules/paperwork/pen.dm | 4 +- code/modules/paperwork/photocopier.dm | 2 +- code/modules/paperwork/ticketmachine.dm | 6 +- code/modules/photography/photos/album.dm | 2 +- .../plumbing/plumbers/medipenrefill.dm | 2 +- code/modules/pool/pool_controller.dm | 2 +- code/modules/pool/pool_drain.dm | 2 +- code/modules/power/antimatter/control.dm | 2 +- code/modules/power/antimatter/shielding.dm | 2 +- code/modules/power/cell.dm | 2 +- code/modules/power/gravitygenerator.dm | 2 +- code/modules/power/lighting.dm | 8 +-- code/modules/power/monitor.dm | 2 +- code/modules/power/multiz.dm | 2 +- code/modules/power/port_gen.dm | 6 +- code/modules/power/rtg.dm | 4 +- code/modules/power/singularity/collector.dm | 2 +- code/modules/power/singularity/emitter.dm | 4 +- .../power/singularity/field_generator.dm | 2 +- code/modules/power/singularity/narsie.dm | 4 +- .../particle_accelerator/particle_control.dm | 2 +- code/modules/power/smes.dm | 2 +- code/modules/power/solar.dm | 2 +- code/modules/power/supermatter/supermatter.dm | 2 +- code/modules/power/terminal.dm | 2 +- code/modules/power/tesla/coil.dm | 4 +- code/modules/power/turbine.dm | 6 +- .../projectiles/ammunition/_ammunition.dm | 2 +- .../ammunition/ballistic/shotgun.dm | 6 +- .../boxes_magazines/_box_magazine.dm | 2 +- .../boxes_magazines/external/rechargable.dm | 2 +- .../boxes_magazines/internal/revolver.dm | 2 +- code/modules/projectiles/gun.dm | 2 +- code/modules/projectiles/guns/ballistic.dm | 2 +- .../projectiles/guns/ballistic/automatic.dm | 8 +-- .../projectiles/guns/ballistic/magweapon.dm | 2 +- .../projectiles/guns/ballistic/revolver.dm | 6 +- .../projectiles/guns/ballistic/shotgun.dm | 4 +- .../modules/projectiles/guns/ballistic/toy.dm | 2 +- code/modules/projectiles/guns/energy.dm | 2 +- .../projectiles/guns/energy/dueling.dm | 2 +- .../projectiles/guns/energy/energy_gun.dm | 2 +- .../guns/energy/kinetic_accelerator.dm | 2 +- code/modules/projectiles/guns/energy/laser.dm | 2 +- .../projectiles/guns/energy/laser_gatling.dm | 4 +- code/modules/projectiles/guns/energy/pulse.dm | 2 +- code/modules/projectiles/guns/magic.dm | 2 +- .../projectiles/guns/magic/motivation.dm | 2 +- code/modules/projectiles/guns/magic/staff.dm | 2 +- code/modules/projectiles/guns/magic/wand.dm | 2 +- .../projectiles/guns/misc/beam_rifle.dm | 2 +- .../projectiles/guns/misc/blastcannon.dm | 2 +- .../projectiles/guns/misc/chameleon.dm | 2 +- .../modules/projectiles/guns/misc/chem_gun.dm | 4 +- code/modules/projectiles/guns/misc/medbeam.dm | 4 +- .../projectiles/guns/misc/syringe_gun.dm | 6 +- code/modules/projectiles/pins.dm | 4 +- code/modules/projectiles/projectile.dm | 2 +- code/modules/projectiles/projectile/beams.dm | 2 +- .../projectile/bullets/dart_syringe.dm | 6 +- .../projectiles/projectile/bullets/shotgun.dm | 4 +- .../projectiles/projectile/bullets/special.dm | 2 +- .../projectile/energy/net_snare.dm | 4 +- .../projectile/energy/nuclear_particle.dm | 2 +- code/modules/projectiles/projectile/magic.dm | 2 +- .../projectiles/projectile/special/plasma.dm | 2 +- .../chemistry/machinery/chem_dispenser.dm | 14 ++--- .../chemistry/machinery/chem_master.dm | 2 +- .../reagents/chemistry/machinery/pandemic.dm | 2 +- .../chemistry/machinery/reagentgrinder.dm | 4 +- .../chemistry/machinery/smoke_machine.dm | 2 +- .../reagents/chemistry/recipes/special.dm | 2 +- .../reagents/reagent_containers/blood_pack.dm | 4 +- .../reagents/reagent_containers/borghypo.dm | 2 +- .../reagents/reagent_containers/bottle.dm | 4 +- .../reagents/reagent_containers/glass.dm | 2 +- .../reagents/reagent_containers/hypospray.dm | 2 +- .../reagents/reagent_containers/hypovial.dm | 2 +- .../reagents/reagent_containers/pill.dm | 4 +- .../reagents/reagent_containers/rags.dm | 2 +- .../reagents/reagent_containers/spray.dm | 2 +- .../reagents/reagent_containers/syringes.dm | 2 +- code/modules/reagents/reagent_dispenser.dm | 4 +- code/modules/recycling/conveyor2.dm | 4 +- code/modules/recycling/disposal/pipe.dm | 2 +- .../recycling/disposal/pipe_sorting.dm | 2 +- code/modules/research/designs.dm | 2 +- code/modules/research/experimentor.dm | 4 +- .../research/nanites/nanite_chamber.dm | 2 +- .../nanites/nanite_chamber_computer.dm | 2 +- .../research/nanites/nanite_program_hub.dm | 4 +- .../modules/research/nanites/program_disks.dm | 2 +- .../research/nanites/public_chamber.dm | 2 +- code/modules/research/rdconsole.dm | 4 +- code/modules/research/rdmachines.dm | 2 +- code/modules/research/research_disk.dm | 10 ++-- code/modules/research/server.dm | 2 +- code/modules/research/stock_parts.dm | 2 +- .../xenobiology/crossbreeding/__corecross.dm | 8 +-- .../xenobiology/crossbreeding/_misc.dm | 2 +- .../xenobiology/crossbreeding/_weapons.dm | 2 +- .../xenobiology/crossbreeding/burning.dm | 2 +- .../xenobiology/crossbreeding/charged.dm | 2 +- .../xenobiology/crossbreeding/chilling.dm | 2 +- .../xenobiology/crossbreeding/consuming.dm | 2 +- .../xenobiology/crossbreeding/industrial.dm | 2 +- .../xenobiology/crossbreeding/recurring.dm | 2 +- .../xenobiology/crossbreeding/regenerative.dm | 2 +- .../crossbreeding/selfsustaining.dm | 2 +- .../xenobiology/crossbreeding/stabilized.dm | 4 +- .../research/xenobiology/xenobio_camera.dm | 4 +- .../research/xenobiology/xenobiology.dm | 2 +- code/modules/ruins/lavaland_ruin_code.dm | 10 ++-- .../lavalandruin_code/elephantgraveyard.dm | 4 +- .../ruins/objects_and_mobs/necropolis_gate.dm | 6 +- .../ruins/objects_and_mobs/sin_ruins.dm | 2 +- .../ruins/spaceruin_code/caravanambush.dm | 2 +- .../ruins/spaceruin_code/clericsden.dm | 2 +- .../ruins/spaceruin_code/hilbertshotel.dm | 4 +- .../security_levels/keycard_authentication.dm | 2 +- code/modules/shuttle/custom_shuttle.dm | 2 +- code/modules/shuttle/emergency.dm | 2 +- code/modules/shuttle/navigation_computer.dm | 2 +- code/modules/shuttle/shuttle.dm | 2 +- .../shuttle_creation/shuttle_creator.dm | 2 +- .../shuttle_creation/shuttle_creator_eye.dm | 2 +- .../shuttle/spaceship_navigation_beacon.dm | 2 +- code/modules/shuttle/special.dm | 6 +- code/modules/shuttle/white_ship.dm | 2 +- code/modules/smithing/anvil.dm | 2 +- code/modules/smithing/finished_items.dm | 8 +-- code/modules/smithing/furnace.dm | 2 +- code/modules/spells/spell.dm | 6 +- code/modules/spells/spell_types/godhand.dm | 2 +- code/modules/spells/spell_types/trigger.dm | 2 +- code/modules/station_goals/dna_vault.dm | 2 +- code/modules/station_goals/shield.dm | 2 +- code/modules/surgery/organs/augments_arms.dm | 6 +- code/modules/surgery/organs/eyes.dm | 4 +- code/modules/surgery/organs/organ_internal.dm | 4 +- code/modules/surgery/organs/tongue.dm | 2 +- code/modules/surgery/surgery.dm | 2 +- code/modules/surgery/tools.dm | 8 +-- code/modules/tcg/cards.dm | 6 +- code/modules/uplink/uplink_devices.dm | 2 +- code/modules/vehicles/atv.dm | 4 +- code/modules/vehicles/bicycle.dm | 2 +- code/modules/vehicles/cars/car.dm | 2 +- code/modules/vehicles/cars/clowncar.dm | 4 +- code/modules/vehicles/lavaboat.dm | 4 +- code/modules/vehicles/ridden.dm | 2 +- code/modules/vehicles/scooter.dm | 6 +- code/modules/vehicles/secway.dm | 2 +- code/modules/vehicles/speedbike.dm | 6 +- code/modules/vehicles/wheelchair.dm | 2 +- code/modules/vending/autodrobe.dm | 2 +- code/modules/vending/boozeomat.dm | 2 +- code/modules/vending/cigarette.dm | 2 +- code/modules/vending/cola.dm | 2 +- code/modules/vending/snack.dm | 2 +- code/modules/vore/eating/belly_obj.dm | 2 +- .../wiremod/components/abstract/compare.dm | 2 +- .../wiremod/components/abstract/module.dm | 2 +- .../wiremod/components/action/light.dm | 2 +- code/modules/wiremod/components/action/mmi.dm | 2 +- .../wiremod/components/action/pathfind.dm | 2 +- .../modules/wiremod/components/action/pull.dm | 2 +- .../wiremod/components/action/radio.dm | 2 +- .../wiremod/components/action/soundemitter.dm | 2 +- .../wiremod/components/action/speech.dm | 2 +- .../wiremod/components/admin/getvar.dm | 2 +- .../wiremod/components/admin/proccall.dm | 2 +- code/modules/wiremod/components/admin/sdql.dm | 2 +- .../wiremod/components/admin/setvar.dm | 2 +- .../modules/wiremod/components/admin/spawn.dm | 2 +- .../wiremod/components/admin/to_type.dm | 2 +- .../wiremod/components/atom/direction.dm | 2 +- code/modules/wiremod/components/atom/gps.dm | 2 +- .../modules/wiremod/components/atom/health.dm | 2 +- code/modules/wiremod/components/atom/hear.dm | 2 +- code/modules/wiremod/components/atom/self.dm | 2 +- .../wiremod/components/atom/species.dm | 2 +- .../wiremod/components/hud/bar_overlay.dm | 2 +- .../wiremod/components/hud/counter_overlay.dm | 2 +- .../wiremod/components/hud/object_overlay.dm | 2 +- .../components/hud/target_intercept.dm | 2 +- .../modules/wiremod/components/list/concat.dm | 2 +- .../wiremod/components/list/get_column.dm | 2 +- code/modules/wiremod/components/list/index.dm | 2 +- .../wiremod/components/list/index_table.dm | 2 +- .../wiremod/components/list/list_literal.dm | 2 +- .../modules/wiremod/components/list/select.dm | 2 +- code/modules/wiremod/components/list/split.dm | 2 +- .../wiremod/components/math/arithmetic.dm | 2 +- .../modules/wiremod/components/math/length.dm | 2 +- code/modules/wiremod/components/math/not.dm | 2 +- .../modules/wiremod/components/math/random.dm | 2 +- .../wiremod/components/ntnet/ntnet_receive.dm | 2 +- .../wiremod/components/ntnet/ntnet_send.dm | 2 +- .../components/sensors/pressuresensor.dm | 2 +- .../wiremod/components/sensors/tempsensor.dm | 2 +- .../wiremod/components/string/concat.dm | 2 +- .../wiremod/components/string/textcase.dm | 2 +- .../wiremod/components/string/tonumber.dm | 2 +- .../wiremod/components/string/tostring.dm | 2 +- .../wiremod/components/utility/clock.dm | 2 +- .../wiremod/components/utility/delay.dm | 2 +- .../wiremod/components/utility/getter.dm | 2 +- .../wiremod/components/utility/router.dm | 2 +- .../wiremod/components/utility/setter.dm | 2 +- .../wiremod/components/utility/typecast.dm | 2 +- code/modules/wiremod/core/component.dm | 2 +- .../modules/wiremod/core/component_printer.dm | 2 +- .../wiremod/core/integrated_circuit.dm | 4 +- code/modules/wiremod/core/usb_cable.dm | 2 +- code/modules/wiremod/preset/hello_world.dm | 2 +- code/modules/wiremod/preset/speech_relay.dm | 2 +- code/modules/wiremod/shell/airlock.dm | 4 +- code/modules/wiremod/shell/bot.dm | 4 +- .../wiremod/shell/brain_computer_interface.dm | 6 +- code/modules/wiremod/shell/compact_remote.dm | 4 +- code/modules/wiremod/shell/controller.dm | 4 +- code/modules/wiremod/shell/drone.dm | 4 +- code/modules/wiremod/shell/moneybot.dm | 6 +- code/modules/wiremod/shell/scanner.dm | 4 +- code/modules/wiremod/shell/scanner_gate.dm | 4 +- code/modules/wiremod/shell/server.dm | 2 +- code/modules/zombie/items.dm | 2 +- code/modules/zombie/organs.dm | 2 +- modular_citadel/code/modules/clothing/neck.dm | 2 +- .../modules/custom_loadout/custom_items.dm | 2 +- .../eventmaps/Spookystation/JTGSZwork.dm | 8 +-- .../code/modules/festive/wheelchair.dm | 2 +- .../code/modules/vectorcrafts/vectorcraft.dm | 2 +- .../code/modules/vectorcrafts/vectortruck.dm | 2 +- 881 files changed, 1599 insertions(+), 1599 deletions(-) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 2156d888f7..b415b4720f 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1235,7 +1235,7 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) move_resist = INFINITY var/ready_to_die = FALSE -/mob/dview/Initialize() //Properly prevents this mob from gaining huds or joining any global lists +/mob/dview/Initialize(mapload) //Properly prevents this mob from gaining huds or joining any global lists SHOULD_CALL_PARENT(FALSE) if(flags_1 & INITIALIZED_1) stack_trace("Warning: [src]([type]) initialized multiple times!") diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index 791cf336ac..d97e1f5d04 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -72,7 +72,7 @@ var/mutable_appearance/hide_appearance var/mutable_appearance/show_appearance -/atom/movable/screen/movable/action_button/hide_toggle/Initialize() +/atom/movable/screen/movable/action_button/hide_toggle/Initialize(mapload) . = ..() var/static/list/icon_cache = list() diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index f74d380b8a..53ad775954 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -349,7 +349,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." /// Simply checks if the other person is still in range /atom/movable/screen/alert/give/proc/check_in_range(atom/taker) SIGNAL_HANDLER - + if(!offerer.CanReach(taker)) to_chat(owner, span_warning("You moved out of range of [offerer]!")) owner.clear_alert("[offerer]") @@ -455,7 +455,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." var/angle = 0 var/mob/living/simple_animal/hostile/construct/Cviewer = null -/atom/movable/screen/alert/bloodsense/Initialize() +/atom/movable/screen/alert/bloodsense/Initialize(mapload) . = ..() narnar = new('icons/mob/screen_alert.dmi', "mini_nar") START_PROCESSING(SSprocessing, src) @@ -820,7 +820,7 @@ so as to remain in compliance with the most up-to-date laws." return FALSE if(master && click_master) return usr.client.Click(master, location, control, params) - + return TRUE /atom/movable/screen/alert/Destroy() diff --git a/code/_onclick/hud/families.dm b/code/_onclick/hud/families.dm index eb09d53bc1..6cc9f4ef32 100644 --- a/code/_onclick/hud/families.dm +++ b/code/_onclick/hud/families.dm @@ -12,7 +12,7 @@ /atom/movable/screen/wanted/New() return ..() -/atom/movable/screen/wanted/Initialize() +/atom/movable/screen/wanted/Initialize(mapload) . = ..() update_icon() diff --git a/code/_onclick/hud/picture_in_picture.dm b/code/_onclick/hud/picture_in_picture.dm index 6cf1bfd6a6..354a6ed546 100644 --- a/code/_onclick/hud/picture_in_picture.dm +++ b/code/_onclick/hud/picture_in_picture.dm @@ -14,7 +14,7 @@ var/mutable_appearance/standard_background var/const/max_dimensions = 10 -/atom/movable/screen/movable/pic_in_pic/Initialize() +/atom/movable/screen/movable/pic_in_pic/Initialize(mapload) . = ..() make_backgrounds() diff --git a/code/_onclick/hud/plane_master.dm b/code/_onclick/hud/plane_master.dm index d83a81fa45..3d39440dad 100644 --- a/code/_onclick/hud/plane_master.dm +++ b/code/_onclick/hud/plane_master.dm @@ -24,7 +24,7 @@ blend_mode = BLEND_MULTIPLY alpha = 255 -/atom/movable/screen/plane_master/openspace/Initialize() +/atom/movable/screen/plane_master/openspace/Initialize(mapload) . = ..() filters += filter(type="alpha", render_source=FIELD_OF_VISION_RENDER_TARGET, flags=MASK_INVERSE) @@ -61,7 +61,7 @@ plane = ABOVE_WALL_PLANE appearance_flags = PLANE_MASTER -/atom/movable/screen/plane_master/above_wall/Initialize() +/atom/movable/screen/plane_master/above_wall/Initialize(mapload) . = ..() add_filter("vision_cone", 100, list(type="alpha", render_source=FIELD_OF_VISION_RENDER_TARGET, flags=MASK_INVERSE)) @@ -78,7 +78,7 @@ appearance_flags = PLANE_MASTER //should use client color blend_mode = BLEND_OVERLAY -/atom/movable/screen/plane_master/game_world/Initialize() +/atom/movable/screen/plane_master/game_world/Initialize(mapload) . = ..() add_filter("vision_cone", 100, list(type="alpha", render_source=FIELD_OF_VISION_RENDER_TARGET, flags=MASK_INVERSE)) @@ -95,7 +95,7 @@ render_target = FIELD_OF_VISION_RENDER_TARGET mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/atom/movable/screen/plane_master/field_of_vision/Initialize() +/atom/movable/screen/plane_master/field_of_vision/Initialize(mapload) . = ..() filters += filter(type="alpha", render_source=FIELD_OF_VISION_BLOCKER_RENDER_TARGET, flags=MASK_INVERSE) @@ -112,7 +112,7 @@ plane = FIELD_OF_VISION_VISUAL_PLANE mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/atom/movable/screen/plane_master/field_of_vision_visual/Initialize() +/atom/movable/screen/plane_master/field_of_vision_visual/Initialize(mapload) . = ..() filters += filter(type="alpha", render_source=FIELD_OF_VISION_BLOCKER_RENDER_TARGET, flags=MASK_INVERSE) @@ -138,7 +138,7 @@ * This is then used to alpha mask the lighting plane. */ -/atom/movable/screen/plane_master/lighting/Initialize() +/atom/movable/screen/plane_master/lighting/Initialize(mapload) . = ..() add_filter("emissives", 1, alpha_mask_filter(render_source = EMISSIVE_RENDER_TARGET, flags = MASK_INVERSE)) add_filter("object_lighting", 2, alpha_mask_filter(render_source = O_LIGHTING_VISUAL_RENDER_TARGET, flags = MASK_INVERSE)) @@ -152,7 +152,7 @@ mouse_opacity = MOUSE_OPACITY_TRANSPARENT render_target = EMISSIVE_RENDER_TARGET -/atom/movable/screen/plane_master/emissive/Initialize() +/atom/movable/screen/plane_master/emissive/Initialize(mapload) . = ..() add_filter("em_block_masking", 1, color_matrix_filter(GLOB.em_mask_matrix)) diff --git a/code/_onclick/hud/screen_objects/clickdelay.dm b/code/_onclick/hud/screen_objects/clickdelay.dm index c62f051c1a..b8258c7598 100644 --- a/code/_onclick/hud/screen_objects/clickdelay.dm +++ b/code/_onclick/hud/screen_objects/clickdelay.dm @@ -25,7 +25,7 @@ icon_state = "prog_bar_100" layer = 20 // under hand buttons -/atom/movable/screen/action_bar/clickdelay/Initialize() +/atom/movable/screen/action_bar/clickdelay/Initialize(mapload) . = ..() var/matrix/M = new M.Scale(2, 1) diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index ed0a9eb4ea..3ae45648df 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -79,7 +79,7 @@ var/atom/movable/focus var/mob/living/carbon/tk_user -/obj/item/tk_grab/Initialize() +/obj/item/tk_grab/Initialize(mapload) . = ..() START_PROCESSING(SSfastprocess, src) diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index 8a84251341..ba2da8365b 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -67,7 +67,7 @@ SUBSYSTEM_DEF(atoms) for (var/queued_deletion in queued_deletions) qdel(queued_deletion) - + testing("[queued_deletions.len] atoms were queued for deletion.") queued_deletions.Cut() @@ -152,7 +152,7 @@ SUBSYSTEM_DEF(atoms) . += "Path : [path] \n" var/fails = BadInitializeCalls[path] if(fails & BAD_INIT_DIDNT_INIT) - . += "- Didn't call atom/Initialize()\n" + . += "- Didn't call atom/Initialize(mapload)\n" if(fails & BAD_INIT_NO_HINT) . += "- Didn't return an Initialize hint\n" if(fails & BAD_INIT_QDEL_BEFORE) diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm index b3c8a6422f..582d2eb9dc 100644 --- a/code/controllers/subsystem/processing/quirks.dm +++ b/code/controllers/subsystem/processing/quirks.dm @@ -48,7 +48,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks) cli.prefs.save_character() if (!silent && LAZYLEN(cut)) to_chat(to_chat_target || user, "Some quirks have been cut from your character because of these quirks conflicting with your job assignment: [english_list(cut)].") - + var/mob/living/carbon/human/H = user if(istype(H) && H.dna?.species) var/datum/species/S = H.dna.species diff --git a/code/datums/brain_damage/special.dm b/code/datums/brain_damage/special.dm index 7cc5348a0a..d4631f2558 100644 --- a/code/datums/brain_damage/special.dm +++ b/code/datums/brain_damage/special.dm @@ -99,7 +99,7 @@ var/obj/effect/hallucination/simple/bluespace_stream/linked_to var/mob/living/carbon/seer -/obj/effect/hallucination/simple/bluespace_stream/Initialize() +/obj/effect/hallucination/simple/bluespace_stream/Initialize(mapload) . = ..() QDEL_IN(src, 300) diff --git a/code/datums/components/killerqueen.dm b/code/datums/components/killerqueen.dm index c700e0d17e..0f7d3f0346 100644 --- a/code/datums/components/killerqueen.dm +++ b/code/datums/components/killerqueen.dm @@ -1,6 +1,6 @@ /** * KILLER QUEEN - * + * * Simple contact bomb component * Blows up the first person to touch it. */ @@ -26,7 +26,7 @@ var/flame = 0 /// only triggered by living mobs var/living_only = TRUE - + /datum/component/killerqueen/Initialize(ex_strength = EXPLODE_HEAVY, datum/callback/pre_explode, datum/callback/failure, examine_message, light = 0, heavy = 0, dev = 0, flame = 0, living_only = TRUE) . = ..() diff --git a/code/datums/components/knockoff.dm b/code/datums/components/knockoff.dm index 7d399c7d26..b9cdb7754c 100644 --- a/code/datums/components/knockoff.dm +++ b/code/datums/components/knockoff.dm @@ -11,7 +11,7 @@ RegisterSignal(parent, COMSIG_ITEM_DROPPED,.proc/OnDropped) src.knockoff_chance = knockoff_chance - + if(zone_override) target_zones = zone_override diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index a55e947709..bac1614228 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -223,7 +223,7 @@ block_chance = 50 var/wielded = FALSE // track wielded status on item -/obj/item/staff/bostaff/Initialize() +/obj/item/staff/bostaff/Initialize(mapload) . = ..() RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield) RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield) diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index b5a7a38915..8c70a1bebb 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -819,7 +819,7 @@ /obj/effect/temp_visual/curse icon_state = "curse" -/obj/effect/temp_visual/curse/Initialize() +/obj/effect/temp_visual/curse/Initialize(mapload) . = ..() deltimer(timerid) diff --git a/code/game/area/Space_Station_13_areas.dm b/code/game/area/Space_Station_13_areas.dm index caf8fda213..dd70825339 100644 --- a/code/game/area/Space_Station_13_areas.dm +++ b/code/game/area/Space_Station_13_areas.dm @@ -126,7 +126,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station ambientsounds = RUINS area_flags = UNIQUE_AREA | NO_ALERTS -/area/asteroid/artifactroom/Initialize() +/area/asteroid/artifactroom/Initialize(mapload) . = ..() set_dynamic_lighting() diff --git a/code/game/area/ai_monitored.dm b/code/game/area/ai_monitored.dm index 911cdde658..0123e20a07 100644 --- a/code/game/area/ai_monitored.dm +++ b/code/game/area/ai_monitored.dm @@ -31,6 +31,6 @@ cam.lostTargetRef(WEAKREF(O)) return -/area/ai_monitored/turret_protected/ai/Initialize() +/area/ai_monitored/turret_protected/ai/Initialize(mapload) . = ..() src.area_flags |= ABDUCTOR_PROOF diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index b922f52315..44916cf1d2 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -41,7 +41,7 @@ ///Will objects this area be needing power? var/requires_power = TRUE - /// This gets overridden to 1 for space in area/Initialize(). + /// This gets overridden to 1 for space in area/Initialize(mapload). var/always_unpowered = FALSE var/power_equip = TRUE @@ -197,7 +197,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) * * returns INITIALIZE_HINT_LATELOAD */ -/area/Initialize() +/area/Initialize(mapload) icon_state = "" map_name = name // Save the initial (the name set in the map) name of the area. canSmoothWithAreas = typecacheof(canSmoothWithAreas) diff --git a/code/game/area/areas/centcom.dm b/code/game/area/areas/centcom.dm index 0befe0bd86..6fe4c8fc65 100644 --- a/code/game/area/areas/centcom.dm +++ b/code/game/area/areas/centcom.dm @@ -59,7 +59,7 @@ icon_state = "supplypod_loading" var/loading_id = "" -/area/centcom/supplypod/loading/Initialize() +/area/centcom/supplypod/loading/Initialize(mapload) . = ..() if(!loading_id) CRASH("[type] created without a loading_id") diff --git a/code/game/area/areas/edina.dm b/code/game/area/areas/edina.dm index ab785f61ff..75c99334f7 100644 --- a/code/game/area/areas/edina.dm +++ b/code/game/area/areas/edina.dm @@ -169,7 +169,7 @@ name = "planet z helper" layer = POINT_LAYER -/obj/effect/mapping_helpers/planet_z/Initialize() +/obj/effect/mapping_helpers/planet_z/Initialize(mapload) . = ..() var/datum/space_level/S = SSmapping.get_level(z) S.traits["Planet"] = TRUE //This probably doesn't work as I expect. But maybe!! diff --git a/code/game/area/areas/holodeck.dm b/code/game/area/areas/holodeck.dm index 3bc73a945f..35d6f1d202 100644 --- a/code/game/area/areas/holodeck.dm +++ b/code/game/area/areas/holodeck.dm @@ -14,7 +14,7 @@ Asserts are to avoid the inevitable infinite loops */ -/area/holodeck/Initialize() +/area/holodeck/Initialize(mapload) . = ..() var/list/update_holodeck_cache = SSholodeck?.rejected_areas[type] if(update_holodeck_cache) diff --git a/code/game/area/areas/shuttles.dm b/code/game/area/areas/shuttles.dm index c8ee2973c4..e86f2ffe06 100644 --- a/code/game/area/areas/shuttles.dm +++ b/code/game/area/areas/shuttles.dm @@ -15,7 +15,7 @@ // area_limited_icon_smoothing = /area/shuttle sound_environment = SOUND_ENVIRONMENT_ROOM -/area/shuttle/Initialize() +/area/shuttle/Initialize(mapload) if(!canSmoothWithAreas) canSmoothWithAreas = type . = ..() diff --git a/code/game/gamemodes/clown_ops/clown_weapons.dm b/code/game/gamemodes/clown_ops/clown_weapons.dm index 081ffbbdc4..6efbbb2e96 100644 --- a/code/game/gamemodes/clown_ops/clown_weapons.dm +++ b/code/game/gamemodes/clown_ops/clown_weapons.dm @@ -37,7 +37,7 @@ var/max_recharge = 3000 //30 peels worth var/recharge_rate = 34 //about 1/3 of a peel per tick -/obj/item/clothing/shoes/clown_shoes/banana_shoes/combat/Initialize() +/obj/item/clothing/shoes/clown_shoes/banana_shoes/combat/Initialize(mapload) . = ..() var/datum/component/material_container/bananium = GetComponent(/datum/component/material_container) bananium.insert_amount_mat(max_recharge, /datum/material/bananium) @@ -69,7 +69,7 @@ var/next_trombone_allowed = 0 var/datum/component/slippery/slipper -/obj/item/melee/transforming/energy/sword/bananium/Initialize() +/obj/item/melee/transforming/energy/sword/bananium/Initialize(mapload) . = ..() slipper = LoadComponent(/datum/component/slippery, 81, GALOSHES_DONT_HELP) slipper.signal_enabled = active @@ -128,7 +128,7 @@ on_throw_speed = 1 var/datum/component/slippery/slipper -/obj/item/shield/energy/bananium/Initialize() +/obj/item/shield/energy/bananium/Initialize(mapload) . = ..() slipper = LoadComponent(/datum/component/slippery, 81, GALOSHES_DONT_HELP) slipper.signal_enabled = active @@ -173,7 +173,7 @@ var/det_time = 50 var/obj/item/grenade/syndieminibomb/bomb -/obj/item/grown/bananapeel/bombanana/Initialize() +/obj/item/grown/bananapeel/bombanana/Initialize(mapload) . = ..() AddComponent(/datum/component/slippery, det_time) bomb = new /obj/item/grenade/syndieminibomb(src) @@ -219,7 +219,7 @@ /obj/item/clothing/mask/fakemoustache/sticky var/unstick_time = 2 MINUTES -/obj/item/clothing/mask/fakemoustache/sticky/Initialize() +/obj/item/clothing/mask/fakemoustache/sticky/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, STICKY_MOUSTACHE_TRAIT) addtimer(TRAIT_CALLBACK_REMOVE(src, TRAIT_NODROP, STICKY_MOUSTACHE_TRAIT), unstick_time) @@ -296,7 +296,7 @@ return cell = new /obj/item/stock_parts/cell/hyper(src) -/obj/mecha/combat/honker/dark/loaded/Initialize() +/obj/mecha/combat/honker/dark/loaded/Initialize(mapload) . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/honker() ME.attach(src) diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 9953b593d9..446573e2af 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -281,7 +281,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event var/meteorgibs = /obj/effect/gibspawner/generic threat = 2 -/obj/effect/meteor/meaty/Initialize() +/obj/effect/meteor/meaty/Initialize(mapload) for(var/path in meteordrop) if(path == /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant) meteordrop -= path @@ -312,7 +312,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event meteordrop = list(/obj/item/reagent_containers/food/snacks/meat/slab/xeno, /obj/item/organ/tongue/alien) meteorgibs = /obj/effect/gibspawner/xeno -/obj/effect/meteor/meaty/xeno/Initialize() +/obj/effect/meteor/meaty/xeno/Initialize(mapload) meteordrop += subtypesof(/obj/item/organ/alien) return ..() @@ -363,7 +363,7 @@ GLOBAL_LIST_INIT(meteorsSPOOKY, list(/obj/effect/meteor/pumpkin)) meteordrop = list(/obj/item/clothing/head/hardhat/pumpkinhead, /obj/item/reagent_containers/food/snacks/grown/pumpkin) threat = 100 -/obj/effect/meteor/pumpkin/Initialize() +/obj/effect/meteor/pumpkin/Initialize(mapload) . = ..() meteorsound = pick('sound/hallucinations/im_here1.ogg','sound/hallucinations/im_here2.ogg') ////////////////////////// diff --git a/code/game/machinery/Beacon.dm b/code/game/machinery/Beacon.dm index e9968dadd4..d708af7d7a 100644 --- a/code/game/machinery/Beacon.dm +++ b/code/game/machinery/Beacon.dm @@ -10,7 +10,7 @@ idle_power_usage = 0 var/obj/item/beacon/Beacon -/obj/machinery/bluespace_beacon/Initialize() +/obj/machinery/bluespace_beacon/Initialize(mapload) . = ..() var/turf/T = loc Beacon = new(T) diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm index 69b39bd382..f6eebb8544 100644 --- a/code/game/machinery/PDApainter.dm +++ b/code/game/machinery/PDApainter.dm @@ -31,7 +31,7 @@ if(storedpda) . += "[initial(icon_state)]-closed" -/obj/machinery/pdapainter/Initialize() +/obj/machinery/pdapainter/Initialize(mapload) . = ..() var/list/blocked = list( /obj/item/pda/ai/pai, diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 06e1635656..706b2520dd 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -29,7 +29,7 @@ payment_department = ACCOUNT_MED fair_market_price = 5 -/obj/machinery/sleeper/Initialize() +/obj/machinery/sleeper/Initialize(mapload) . = ..() // if(mapload) // component_parts -= circuit @@ -278,7 +278,7 @@ icon_state = "sleeper_s" controls_inside = TRUE -/obj/machinery/sleeper/syndie/Initialize() +/obj/machinery/sleeper/syndie/Initialize(mapload) . = ..() component_parts = list() component_parts += new /obj/item/circuitboard/machine/sleeper/syndie(null) @@ -289,7 +289,7 @@ component_parts += new /obj/item/stack/cable_coil(null) RefreshParts() -/obj/machinery/sleeper/syndie/fullupgrade/Initialize() +/obj/machinery/sleeper/syndie/fullupgrade/Initialize(mapload) . = ..() component_parts = list() component_parts += new /obj/item/circuitboard/machine/sleeper/syndie(null) diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index f40adcd00b..dc7156f674 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -134,7 +134,7 @@ Class Procs: var/market_verb = "Customer" var/payment_department = ACCOUNT_ENG -/obj/machinery/Initialize() +/obj/machinery/Initialize(mapload) if(!armor) armor = list("melee" = 25, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 70) . = ..() diff --git a/code/game/machinery/airlock_control.dm b/code/game/machinery/airlock_control.dm index 4b5e4088d7..0841dc6939 100644 --- a/code/game/machinery/airlock_control.dm +++ b/code/game/machinery/airlock_control.dm @@ -152,7 +152,7 @@ frequency = new_frequency radio_connection = SSradio.add_object(src, frequency, RADIO_AIRLOCK) -/obj/machinery/airlock_sensor/Initialize() +/obj/machinery/airlock_sensor/Initialize(mapload) . = ..() set_frequency(frequency) diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm index f46169f72e..a565f679bb 100644 --- a/code/game/machinery/announcement_system.dm +++ b/code/game/machinery/announcement_system.dm @@ -27,7 +27,7 @@ GLOBAL_LIST_EMPTY(announcement_systems) var/pinklight = "Light_Pink" var/errorlight = "Error_Red" -/obj/machinery/announcement_system/Initialize() +/obj/machinery/announcement_system/Initialize(mapload) . = ..() GLOB.announcement_systems += src radio = new /obj/item/radio/headset/silicon/ai(src) diff --git a/code/game/machinery/aug_manipulator.dm b/code/game/machinery/aug_manipulator.dm index 19bac616e9..c34e0a2d4f 100644 --- a/code/game/machinery/aug_manipulator.dm +++ b/code/game/machinery/aug_manipulator.dm @@ -8,14 +8,14 @@ max_integrity = 200 var/obj/item/bodypart/storedpart var/initial_icon_state - var/static/list/style_list_icons = list("standard" = 'icons/mob/augmentation/augments.dmi', - "engineer" = 'icons/mob/augmentation/augments_engineer.dmi', - "security" = 'icons/mob/augmentation/augments_security.dmi', - "mining" = 'icons/mob/augmentation/augments_mining.dmi', - "Talon" = 'icons/mob/augmentation/cosmetic_prosthetic/talon.dmi', - "Nanotrasen" = 'icons/mob/augmentation/cosmetic_prosthetic/nanotrasen.dmi', - "Hephaesthus" = 'icons/mob/augmentation/cosmetic_prosthetic/hephaestus.dmi', - "Bishop" = 'icons/mob/augmentation/cosmetic_prosthetic/bishop.dmi', + var/static/list/style_list_icons = list("standard" = 'icons/mob/augmentation/augments.dmi', + "engineer" = 'icons/mob/augmentation/augments_engineer.dmi', + "security" = 'icons/mob/augmentation/augments_security.dmi', + "mining" = 'icons/mob/augmentation/augments_mining.dmi', + "Talon" = 'icons/mob/augmentation/cosmetic_prosthetic/talon.dmi', + "Nanotrasen" = 'icons/mob/augmentation/cosmetic_prosthetic/nanotrasen.dmi', + "Hephaesthus" = 'icons/mob/augmentation/cosmetic_prosthetic/hephaestus.dmi', + "Bishop" = 'icons/mob/augmentation/cosmetic_prosthetic/bishop.dmi', "Xion" = 'icons/mob/augmentation/cosmetic_prosthetic/xion.dmi', "Grayson" = 'icons/mob/augmentation/cosmetic_prosthetic/grayson.dmi', "Cybersolutions" = 'icons/mob/augmentation/cosmetic_prosthetic/cybersolutions.dmi', @@ -27,7 +27,7 @@ if(storedpart) . += "Alt-click to eject the limb." -/obj/machinery/aug_manipulator/Initialize() +/obj/machinery/aug_manipulator/Initialize(mapload) initial_icon_state = initial(icon_state) return ..() diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 4db565aec1..35f45818b6 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -44,7 +44,7 @@ "Imported" ) -/obj/machinery/autolathe/Initialize() +/obj/machinery/autolathe/Initialize(mapload) . = ..() wires = new /datum/wires/autolathe(src) stored_research = new /datum/techweb/specialized/autounlocking/autolathe @@ -429,7 +429,7 @@ desc = "It produces items using metal and glass. This model was reprogrammed without some of the more hazardous designs." circuit = /obj/item/circuitboard/machine/autolathe/secure -/obj/machinery/autolathe/secure/Initialize() +/obj/machinery/autolathe/secure/Initialize(mapload) . = ..() // let's not leave the parent datum floating, right? if(stored_research) @@ -452,14 +452,14 @@ "Misc", "Imported" ) -/obj/machinery/autolathe/toy/Initialize() +/obj/machinery/autolathe/toy/Initialize(mapload) . = ..() // let's not leave the parent datum floating, right? if(stored_research) QDEL_NULL(stored_research) stored_research = new /datum/techweb/specialized/autounlocking/autolathe/toy -/obj/machinery/autolathe/toy/hacked/Initialize() +/obj/machinery/autolathe/toy/hacked/Initialize(mapload) . = ..() adjust_hacked(TRUE) diff --git a/code/game/machinery/bank_machine.dm b/code/game/machinery/bank_machine.dm index 79fff2a76a..54d302910d 100644 --- a/code/game/machinery/bank_machine.dm +++ b/code/game/machinery/bank_machine.dm @@ -14,7 +14,7 @@ var/minimum_time_between_warnings = 400 var/syphoning_credits = 0 -/obj/machinery/computer/bank_machine/Initialize() +/obj/machinery/computer/bank_machine/Initialize(mapload) . = ..() radio = new(src) radio.subspace_transmission = TRUE diff --git a/code/game/machinery/bloodbankgen.dm b/code/game/machinery/bloodbankgen.dm index 31fac02d83..9dc5539959 100644 --- a/code/game/machinery/bloodbankgen.dm +++ b/code/game/machinery/bloodbankgen.dm @@ -17,7 +17,7 @@ var/efficiency = 0 var/productivity = 0 -/obj/machinery/bloodbankgen/Initialize() +/obj/machinery/bloodbankgen/Initialize(mapload) . = ..() create_reagents(maxbloodstored, AMOUNT_VISIBLE) update_icon() diff --git a/code/game/machinery/camera/motion.dm b/code/game/machinery/camera/motion.dm index af5093d6ca..df0c7412bb 100644 --- a/code/game/machinery/camera/motion.dm +++ b/code/game/machinery/camera/motion.dm @@ -82,7 +82,7 @@ c_tag = "Arena" resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF | FREEZE_PROOF -/obj/machinery/camera/motion/thunderdome/Initialize() +/obj/machinery/camera/motion/thunderdome/Initialize(mapload) . = ..() proximity_monitor.SetRange(7) diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm index 33e250fa59..880536245a 100644 --- a/code/game/machinery/camera/presets.dm +++ b/code/game/machinery/camera/presets.dm @@ -4,7 +4,7 @@ /obj/machinery/camera/emp_proof start_active = TRUE -/obj/machinery/camera/emp_proof/Initialize() +/obj/machinery/camera/emp_proof/Initialize(mapload) . = ..() upgradeEmpProof() @@ -14,7 +14,7 @@ start_active = TRUE icon_state = "xraycam" // Thanks to Krutchen for the icons. -/obj/machinery/camera/xray/Initialize() +/obj/machinery/camera/xray/Initialize(mapload) . = ..() upgradeXRay() @@ -23,7 +23,7 @@ start_active = TRUE name = "motion-sensitive security camera" -/obj/machinery/camera/motion/Initialize() +/obj/machinery/camera/motion/Initialize(mapload) . = ..() upgradeMotion() @@ -31,7 +31,7 @@ /obj/machinery/camera/all start_active = TRUE -/obj/machinery/camera/all/Initialize() +/obj/machinery/camera/all/Initialize(mapload) . = ..() upgradeEmpProof() upgradeXRay() @@ -43,7 +43,7 @@ var/number = 0 //camera number in area //This camera type automatically sets it's name to whatever the area that it's in is called. -/obj/machinery/camera/autoname/Initialize() +/obj/machinery/camera/autoname/Initialize(mapload) ..() return INITIALIZE_HINT_LATELOAD diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index b59bf98190..06a399a2eb 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -42,7 +42,7 @@ fair_market_price = 5 // He nodded, because he knew I was right. Then he swiped his credit card to pay me for arresting him. payment_department = ACCOUNT_MED -/obj/machinery/clonepod/Initialize() +/obj/machinery/clonepod/Initialize(mapload) . = ..() countdown = new(src) diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index b837553b38..2830031781 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -13,7 +13,7 @@ var/datum/techweb/linked_techweb light_color = LIGHT_COLOR_BLUE -/obj/machinery/computer/operating/Initialize() +/obj/machinery/computer/operating/Initialize(mapload) . = ..() linked_techweb = SSresearch.science_tech find_table() diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index e430ac469f..276c1796b3 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -77,7 +77,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( /obj/machinery/computer/arcade/proc/Reset() return -/obj/machinery/computer/arcade/Initialize() +/obj/machinery/computer/arcade/Initialize(mapload) . = ..() // If it's a generic arcade machine, pick a random arcade // circuit board for it and make the new machine diff --git a/code/game/machinery/computer/arcade/orion_trail.dm b/code/game/machinery/computer/arcade/orion_trail.dm index 58617a0cf3..21b0ac1cc0 100644 --- a/code/game/machinery/computer/arcade/orion_trail.dm +++ b/code/game/machinery/computer/arcade/orion_trail.dm @@ -61,7 +61,7 @@ var/killed_crew = 0 -/obj/machinery/computer/arcade/orion_trail/Initialize() +/obj/machinery/computer/arcade/orion_trail/Initialize(mapload) . = ..() Radio = new /obj/item/radio(src) Radio.listening = 0 diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm index 50a6d10302..f4851fc33c 100644 --- a/code/game/machinery/computer/atmos_alert.dm +++ b/code/game/machinery/computer/atmos_alert.dm @@ -11,7 +11,7 @@ light_color = LIGHT_COLOR_CYAN -/obj/machinery/computer/atmos_alert/Initialize() +/obj/machinery/computer/atmos_alert/Initialize(mapload) . = ..() set_frequency(receive_frequency) diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm index fa552a4e66..22ac2c30f2 100644 --- a/code/game/machinery/computer/atmos_control.dm +++ b/code/game/machinery/computer/atmos_control.dm @@ -71,7 +71,7 @@ frequency = new_frequency radio_connection = SSradio.add_object(src, frequency, RADIO_ATMOSIA) -/obj/machinery/air_sensor/Initialize() +/obj/machinery/air_sensor/Initialize(mapload) . = ..() SSair.atmos_air_machinery += src set_frequency(frequency) @@ -126,7 +126,7 @@ GLOBAL_LIST_EMPTY(atmos_air_controllers) var/datum/radio_frequency/radio_connection -/obj/machinery/computer/atmos_control/Initialize() +/obj/machinery/computer/atmos_control/Initialize(mapload) . = ..() GLOB.atmos_air_controllers += src set_frequency(frequency) diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index a6b774523c..ec897f97e2 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -23,7 +23,7 @@ interaction_flags_machine = INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_SET_MACHINE //| INTERACT_MACHINE_REQUIRES_SIGHT -/obj/machinery/computer/security/Initialize() +/obj/machinery/computer/security/Initialize(mapload) . = ..() // Map name has to start and end with an A-Z character, // and definitely NOT with a square bracket or even a number. @@ -275,7 +275,7 @@ var/icon_state_off = "entertainment_blank" var/icon_state_on = "entertainment" -/obj/machinery/computer/security/telescreen/entertainment/Initialize() +/obj/machinery/computer/security/telescreen/entertainment/Initialize(mapload) . = ..() RegisterSignal(src, COMSIG_CLICK, .proc/BigClick) diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index 992807bed7..30463f4f01 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -16,7 +16,7 @@ light_color = LIGHT_COLOR_RED -/obj/machinery/computer/camera_advanced/Initialize() +/obj/machinery/computer/camera_advanced/Initialize(mapload) . = ..() for(var/i in networks) networks -= i diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index 46d419a8fe..a16e70155f 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -56,7 +56,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) /obj/machinery/computer/card/centcom/get_jobs() return get_all_centcom_jobs() -/obj/machinery/computer/card/Initialize() +/obj/machinery/computer/card/Initialize(mapload) . = ..() change_position_cooldown = CONFIG_GET(number/id_console_jobslot_delay) @@ -586,7 +586,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) icon_screen = "idminor" circuit = /obj/item/circuitboard/computer/card/minor -/obj/machinery/computer/card/minor/Initialize() +/obj/machinery/computer/card/minor/Initialize(mapload) . = ..() var/obj/item/circuitboard/computer/card/minor/typed_circuit = circuit if(target_dept) diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index d034ba382e..91211d3d40 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -24,7 +24,7 @@ light_color = LIGHT_COLOR_BLUE -/obj/machinery/computer/cloning/Initialize() +/obj/machinery/computer/cloning/Initialize(mapload) . = ..() updatemodules(TRUE) var/obj/item/circuitboard/computer/cloning/board = circuit diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index b81507024c..2f394fcb4d 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -41,7 +41,7 @@ /// The last lines used for changing the status display var/static/last_status_display -/obj/machinery/computer/communications/Initialize() +/obj/machinery/computer/communications/Initialize(mapload) . = ..() GLOB.shuttle_caller_list += src AddComponent(/datum/component/gps, "Secured Communications Signal") diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index 3d212ec0cb..b6b01ff03b 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -199,7 +199,7 @@ eject_disk(user) -/obj/machinery/computer/scan_consolenew/Initialize() +/obj/machinery/computer/scan_consolenew/Initialize(mapload) . = ..() // Connect with a nearby DNA Scanner on init @@ -263,7 +263,7 @@ if(!ui) ui = new(user, src, "DnaConsole") ui.open() - + /obj/machinery/computer/scan_consolenew/ui_assets() . = ..() || list() . += get_asset_datum(/datum/asset/simple/genetics) diff --git a/code/game/machinery/computer/launchpad_control.dm b/code/game/machinery/computer/launchpad_control.dm index 18a0aeb221..65c91fad76 100644 --- a/code/game/machinery/computer/launchpad_control.dm +++ b/code/game/machinery/computer/launchpad_control.dm @@ -11,7 +11,7 @@ var/list/obj/machinery/launchpad/launchpads var/maximum_pads = 4 -/obj/machinery/computer/launchpad/Initialize() +/obj/machinery/computer/launchpad/Initialize(mapload) launchpads = list() . = ..() diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm index f1cf187ff9..a7071ac72e 100644 --- a/code/game/machinery/computer/pod.dm +++ b/code/game/machinery/computer/pod.dm @@ -15,7 +15,7 @@ /// Countdown timer for the mass driver's delayed launch functionality. COOLDOWN_DECLARE(massdriver_countdown) -/obj/machinery/computer/pod/Initialize() +/obj/machinery/computer/pod/Initialize(mapload) . = ..() for(var/obj/machinery/mass_driver/M in range(range, src)) if(M.id == id) diff --git a/code/game/machinery/computer/prisoner/gulag_teleporter.dm b/code/game/machinery/computer/prisoner/gulag_teleporter.dm index 13727b585b..70b66c1b87 100644 --- a/code/game/machinery/computer/prisoner/gulag_teleporter.dm +++ b/code/game/machinery/computer/prisoner/gulag_teleporter.dm @@ -15,7 +15,7 @@ light_color = LIGHT_COLOR_RED -/obj/machinery/computer/prisoner/gulag_teleporter_computer/Initialize() +/obj/machinery/computer/prisoner/gulag_teleporter_computer/Initialize(mapload) . = ..() scan_machinery() diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm index 7b2e6ab455..0671100623 100644 --- a/code/game/machinery/computer/station_alert.dm +++ b/code/game/machinery/computer/station_alert.dm @@ -8,7 +8,7 @@ light_color = LIGHT_COLOR_CYAN -/obj/machinery/computer/station_alert/Initialize() +/obj/machinery/computer/station_alert/Initialize(mapload) . = ..() GLOB.alert_consoles += src diff --git a/code/game/machinery/computer/telecrystalconsoles.dm b/code/game/machinery/computer/telecrystalconsoles.dm index 87b7159125..34495478d7 100644 --- a/code/game/machinery/computer/telecrystalconsoles.dm +++ b/code/game/machinery/computer/telecrystalconsoles.dm @@ -21,7 +21,7 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E var/obj/item/uplinkholder = null var/obj/machinery/computer/telecrystals/boss/linkedboss = null -/obj/machinery/computer/telecrystals/uplinker/Initialize() +/obj/machinery/computer/telecrystals/uplinker/Initialize(mapload) . = ..() var/ID = pick_n_take(GLOB.possible_uplinker_IDs) diff --git a/code/game/machinery/computer/teleporter.dm b/code/game/machinery/computer/teleporter.dm index 3e9531097e..eb1c4903fc 100644 --- a/code/game/machinery/computer/teleporter.dm +++ b/code/game/machinery/computer/teleporter.dm @@ -14,7 +14,7 @@ var/turf/target var/obj/item/implant/imp_t -/obj/machinery/computer/teleporter/Initialize() +/obj/machinery/computer/teleporter/Initialize(mapload) . = ..() id = "[rand(1000, 9999)]" link_power_station() diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index ce29d10004..e3778811ea 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -38,7 +38,7 @@ GLOBAL_LIST_EMPTY(cryopod_computers) var/obj/O = i O.forceMove(drop_location()) -/obj/machinery/computer/cryopod/Initialize() +/obj/machinery/computer/cryopod/Initialize(mapload) . = ..() GLOB.cryopod_computers += src @@ -144,7 +144,7 @@ GLOBAL_LIST_EMPTY(cryopod_computers) var/datum/weakref/control_computer_weakref COOLDOWN_DECLARE(last_no_computer_message) -/obj/machinery/cryopod/Initialize() +/obj/machinery/cryopod/Initialize(mapload) ..() return INITIALIZE_HINT_LATELOAD //Gotta populate the cryopod computer GLOB first diff --git a/code/game/machinery/defibrillator_mount.dm b/code/game/machinery/defibrillator_mount.dm index bc6cc4b60e..9d7a6a8635 100644 --- a/code/game/machinery/defibrillator_mount.dm +++ b/code/game/machinery/defibrillator_mount.dm @@ -14,7 +14,7 @@ var/obj/item/defibrillator/defib //this mount's defibrillator var/clamps_locked = FALSE //if true, and a defib is loaded, it can't be removed without unlocking the clamps -/obj/machinery/defibrillator_mount/loaded/Initialize() //loaded subtype for mapping use +/obj/machinery/defibrillator_mount/loaded/Initialize(mapload) //loaded subtype for mapping use . = ..() defib = new/obj/item/defibrillator/loaded(src) diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index ca4b392efa..359d911265 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -126,7 +126,7 @@ var/deploy_message = TRUE -/obj/structure/barricade/security/Initialize() +/obj/structure/barricade/security/Initialize(mapload) . = ..() addtimer(CALLBACK(src, .proc/deploy), deploy_time) diff --git a/code/game/machinery/dish_drive.dm b/code/game/machinery/dish_drive.dm index 869d583037..148069b103 100644 --- a/code/game/machinery/dish_drive.dm +++ b/code/game/machinery/dish_drive.dm @@ -22,7 +22,7 @@ var/suction_enabled = TRUE var/transmit_enabled = TRUE -/obj/machinery/dish_drive/Initialize() +/obj/machinery/dish_drive/Initialize(mapload) . = ..() RefreshParts() diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm index 0dcb0e7235..c032e57ef3 100644 --- a/code/game/machinery/dna_scanner.dm +++ b/code/game/machinery/dna_scanner.dm @@ -163,7 +163,7 @@ var/max_mutations = 6 var/read_only = FALSE //Well,it's still a floppy disk -/obj/item/disk/data/Initialize() +/obj/item/disk/data/Initialize(mapload) . = ..() icon_state = "datadisk[rand(0,6)]" add_overlay("datadisk_gene") diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index ce29d1947d..ed62019824 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -106,7 +106,7 @@ /// sigh var/unelectrify_timerid -/obj/machinery/door/airlock/Initialize() +/obj/machinery/door/airlock/Initialize(mapload) . = ..() wires = new wiretypepath(src) //CIT CHANGE - makes it possible for airlocks to have different wire datums if(frequency) diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index 5215baf87f..cf863f24ba 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -485,7 +485,7 @@ var/friendly = FALSE var/stealthy = FALSE -/obj/machinery/door/airlock/cult/Initialize() +/obj/machinery/door/airlock/cult/Initialize(mapload) . = ..() new openingoverlaytype(loc) @@ -593,7 +593,7 @@ normal_integrity = 240 var/construction_state = GEAR_SECURE //Pinion airlocks have custom deconstruction -/obj/machinery/door/airlock/clockwork/Initialize() +/obj/machinery/door/airlock/clockwork/Initialize(mapload) . = ..() new /obj/effect/temp_visual/ratvar/door(loc) new /obj/effect/temp_visual/ratvar/beam/door(loc) diff --git a/code/game/machinery/doors/alarmlock.dm b/code/game/machinery/doors/alarmlock.dm index fa516f4b6b..f0b0d9eeb0 100644 --- a/code/game/machinery/doors/alarmlock.dm +++ b/code/game/machinery/doors/alarmlock.dm @@ -10,7 +10,7 @@ var/air_frequency = FREQ_ATMOS_ALARMS autoclose = FALSE -/obj/machinery/door/airlock/alarmlock/Initialize() +/obj/machinery/door/airlock/alarmlock/Initialize(mapload) . = ..() air_connection = new @@ -19,7 +19,7 @@ air_connection = null return ..() -/obj/machinery/door/airlock/alarmlock/Initialize() +/obj/machinery/door/airlock/alarmlock/Initialize(mapload) . = ..() SSradio.remove_object(src, air_frequency) air_connection = SSradio.add_object(src, air_frequency, RADIO_TO_AIRALARM) diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index b2e0050819..c209118537 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -36,7 +36,7 @@ maptext_height = 26 maptext_width = 32 -/obj/machinery/door_timer/Initialize() +/obj/machinery/door_timer/Initialize(mapload) . = ..() Radio = new/obj/item/radio(src) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index d1781d9477..253c2e481c 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -60,7 +60,7 @@ return TRUE return ..() -/obj/machinery/door/Initialize() +/obj/machinery/door/Initialize(mapload) . = ..() set_init_door_layer() update_freelook_sight() diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index ba0c852cc6..bbb71d5cb0 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -31,7 +31,7 @@ var/boltslocked = TRUE var/list/affecting_areas -/obj/machinery/door/firedoor/Initialize() +/obj/machinery/door/firedoor/Initialize(mapload) . = ..() CalculateAffectingAreas() diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index 27b591d374..18ed5205be 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -14,7 +14,7 @@ GLOBAL_LIST_EMPTY(doppler_arrays) verb_say = "states coldly" var/list/message_log = list() -/obj/machinery/doppler_array/Initialize() +/obj/machinery/doppler_array/Initialize(mapload) . = ..() GLOB.doppler_arrays += src @@ -218,6 +218,6 @@ GLOBAL_LIST_EMPTY(doppler_arrays) return -/obj/machinery/doppler_array/research/science/Initialize() +/obj/machinery/doppler_array/research/science/Initialize(mapload) . = ..() linked_techweb = SSresearch.science_tech diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm index 74df30ebfe..4d2d5d3d7a 100644 --- a/code/game/machinery/droneDispenser.dm +++ b/code/game/machinery/droneDispenser.dm @@ -48,7 +48,7 @@ var/break_message = "lets out a tinny alarm before falling dark." var/break_sound = 'sound/machines/warning-buzzer.ogg' -/obj/machinery/droneDispenser/Initialize() +/obj/machinery/droneDispenser/Initialize(mapload) . = ..() var/datum/component/material_container/materials = AddComponent(/datum/component/material_container, list(/datum/material/iron, /datum/material/glass), MINERAL_MATERIAL_AMOUNT * MAX_STACK_SIZE * 2, TRUE, /obj/item/stack) materials.insert_amount_mat(starting_amount) diff --git a/code/game/machinery/embedded_controller/access_controller.dm b/code/game/machinery/embedded_controller/access_controller.dm index 8eebd779f4..3beb481e00 100644 --- a/code/game/machinery/embedded_controller/access_controller.dm +++ b/code/game/machinery/embedded_controller/access_controller.dm @@ -18,7 +18,7 @@ /obj/machinery/doorButtons/proc/findObjsByTag() return -/obj/machinery/doorButtons/Initialize() +/obj/machinery/doorButtons/Initialize(mapload) ..() return INITIALIZE_HINT_LATELOAD diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm index 5d0165189d..4526a75f32 100644 --- a/code/game/machinery/embedded_controller/embedded_controller_base.dm +++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm @@ -67,7 +67,7 @@ SSradio.remove_object(src,frequency) return ..() -/obj/machinery/embedded_controller/radio/Initialize() +/obj/machinery/embedded_controller/radio/Initialize(mapload) . = ..() set_frequency(frequency) diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 20aac89743..f6cca0c6d9 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -159,7 +159,7 @@ new /obj/item/stack/sheet/metal (loc, 2) qdel(src) -/obj/machinery/flasher/portable/Initialize() +/obj/machinery/flasher/portable/Initialize(mapload) . = ..() proximity_monitor = new(src, 0) diff --git a/code/game/machinery/gulag_teleporter.dm b/code/game/machinery/gulag_teleporter.dm index da64699dd4..f595829890 100644 --- a/code/game/machinery/gulag_teleporter.dm +++ b/code/game/machinery/gulag_teleporter.dm @@ -32,7 +32,7 @@ The console is located at computer/gulag_teleporter.dm /obj/item/clothing/mask/breath, /obj/item/clothing/mask/gas)) -/obj/machinery/gulag_teleporter/Initialize() +/obj/machinery/gulag_teleporter/Initialize(mapload) . = ..() locate_reclaimer() diff --git a/code/game/machinery/harvester.dm b/code/game/machinery/harvester.dm index 191967ac1a..5d4f0f1ac8 100644 --- a/code/game/machinery/harvester.dm +++ b/code/game/machinery/harvester.dm @@ -16,7 +16,7 @@ var/allow_clothing = FALSE var/allow_living = FALSE -/obj/machinery/harvester/Initialize() +/obj/machinery/harvester/Initialize(mapload) . = ..() if(prob(1)) name = "auto-autopsy" diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index d83819a1b3..3b8bc47f3f 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -85,7 +85,7 @@ Possible to do for anyone motivated enough: desc = "It's a floor-mounted device for projecting holographic images. This one will refuse to auto-connect incoming calls." secure = TRUE -/obj/machinery/holopad/secure/Initialize() +/obj/machinery/holopad/secure/Initialize(mapload) . = ..() var/obj/item/circuitboard/machine/holopad/board = circuit board.secure = TRUE @@ -144,7 +144,7 @@ Possible to do for anyone motivated enough: if(!replay_mode && (disk?.record)) replay_start() -/obj/machinery/holopad/Initialize() +/obj/machinery/holopad/Initialize(mapload) . = ..() if(on_network) holopads += src diff --git a/code/game/machinery/hypnochair.dm b/code/game/machinery/hypnochair.dm index 41f420204e..9380038147 100644 --- a/code/game/machinery/hypnochair.dm +++ b/code/game/machinery/hypnochair.dm @@ -14,7 +14,7 @@ var/timerid = 0 ///Timer ID for interrogations var/message_cooldown = 0 ///Cooldown for breakout message -/obj/machinery/hypnochair/Initialize() +/obj/machinery/hypnochair/Initialize(mapload) . = ..() open_machine() update_icon() diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index bb047a6a5e..7c58a03454 100644 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -40,7 +40,7 @@ location.hotspot_expose(700,10,1) return 1 -/obj/machinery/igniter/Initialize() +/obj/machinery/igniter/Initialize(mapload) . = ..() icon_state = "igniter[on]" @@ -70,7 +70,7 @@ /obj/machinery/sparker/toxmix id = INCINERATOR_TOXMIX_IGNITER -/obj/machinery/sparker/Initialize() +/obj/machinery/sparker/Initialize(mapload) . = ..() spark_system = new /datum/effect_system/spark_spread spark_system.set_up(2, 1, src) diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm index 87989b18ec..fa689cc95f 100644 --- a/code/game/machinery/launch_pad.dm +++ b/code/game/machinery/launch_pad.dm @@ -229,7 +229,7 @@ /obj/item/storage/briefcase/launchpad var/obj/machinery/launchpad/briefcase/pad -/obj/item/storage/briefcase/launchpad/Initialize() +/obj/item/storage/briefcase/launchpad/Initialize(mapload) pad = new(null, src) //spawns pad in nullspace to hide it from briefcase contents . = ..() diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index 03d9dcee4b..0473a1333a 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -24,7 +24,7 @@ dir = EAST pixel_x = -26 -/obj/machinery/light_switch/Initialize() +/obj/machinery/light_switch/Initialize(mapload) . = ..() if(istext(area)) area = text2path(area) diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index 2950bf5a9a..421bb2550b 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -36,7 +36,7 @@ ) var/obj/item/disk/data/dna_disk -/obj/machinery/limbgrower/Initialize() +/obj/machinery/limbgrower/Initialize(mapload) create_reagents(100, OPENCONTAINER) stored_research = new /datum/techweb/specialized/autounlocking/limbgrower . = ..() @@ -60,7 +60,7 @@ reagent_type = reagent_id.type ) data["reagents"] += list(reagent_data) - else + else data["reagents"] = list() data["total_reagents"] = reagents.total_volume data["max_reagents"] = reagents.maximum_volume @@ -379,7 +379,7 @@ C.undershirt = "Nude" C.saved_underwear = "" C.saved_undershirt = "" - + // Just enough to start reviving them, I hope C.blood_volume = BLOOD_VOLUME_SURVIVE // At some point, make a way to deal with species regenerate_organs diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm index c4494b822f..fa71960c9d 100644 --- a/code/game/machinery/magnet.dm +++ b/code/game/machinery/magnet.dm @@ -27,7 +27,7 @@ var/center_y = 0 var/max_dist = 20 // absolute value of center_x,y cannot exceed this integer -/obj/machinery/magnetic_module/Initialize() +/obj/machinery/magnetic_module/Initialize(mapload) ..() var/turf/T = loc hide(T.intact) @@ -213,7 +213,7 @@ var/datum/radio_frequency/radio_connection -/obj/machinery/magnetic_controller/Initialize() +/obj/machinery/magnetic_controller/Initialize(mapload) . = ..() if(autolink) for(var/obj/machinery/magnetic_module/M in GLOB.machines) diff --git a/code/game/machinery/mechlaunchpad.dm b/code/game/machinery/mechlaunchpad.dm index f32fe0bc4f..a2ac2efb3f 100644 --- a/code/game/machinery/mechlaunchpad.dm +++ b/code/game/machinery/mechlaunchpad.dm @@ -13,7 +13,7 @@ ///List of consoles that can access the pad var/list/obj/machinery/computer/mechpad/consoles -/obj/machinery/mechpad/Initialize() +/obj/machinery/mechpad/Initialize(mapload) . = ..() display_name = "Orbital Pad - [get_area_name(src)]" GLOB.mechpad_list += src diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index 752ba1b732..3e39604f68 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -21,7 +21,7 @@ req_one_access = list(ACCESS_ENGINE, ACCESS_ROBOTICS) -/obj/machinery/navbeacon/Initialize() +/obj/machinery/navbeacon/Initialize(mapload) . = ..() set_codes() diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index e346439e03..674fb58918 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -98,7 +98,7 @@ /// MISSING: var/shot_stagger = 0 -/obj/machinery/porta_turret/Initialize() +/obj/machinery/porta_turret/Initialize(mapload) . = ..() if(!base) base = src @@ -835,7 +835,7 @@ /obj/machinery/porta_turret/aux_base/interact(mob/user) //Controlled solely from the base console. return -/obj/machinery/porta_turret/aux_base/Initialize() +/obj/machinery/porta_turret/aux_base/Initialize(mapload) . = ..() cover.name = name cover.desc = desc diff --git a/code/game/machinery/quantum_pad.dm b/code/game/machinery/quantum_pad.dm index 5c1a2195a4..389dd0f2ab 100644 --- a/code/game/machinery/quantum_pad.dm +++ b/code/game/machinery/quantum_pad.dm @@ -20,7 +20,7 @@ var/map_pad_id = "" as text //what's my name var/map_pad_link_id = "" as text //who's my friend -/obj/machinery/quantumpad/Initialize() +/obj/machinery/quantumpad/Initialize(mapload) . = ..() if(map_pad_id) mapped_quantum_pads[map_pad_id] = src diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index 0accd0994c..11ae19f7fa 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -14,13 +14,13 @@ var/recharge_speed var/repairs -/obj/machinery/recharge_station/Initialize() +/obj/machinery/recharge_station/Initialize(mapload) . = ..() update_icon() /obj/machinery/recharge_station/upgraded -/obj/machinery/recharge_station/upgraded/Initialize() +/obj/machinery/recharge_station/upgraded/Initialize(mapload) . = ..() component_parts = list() component_parts += new /obj/item/circuitboard/machine/cyborgrecharger(null) @@ -31,7 +31,7 @@ /obj/machinery/recharge_station/fullupgrade -/obj/machinery/recharge_station/fullupgrade/Initialize() +/obj/machinery/recharge_station/fullupgrade/Initialize(mapload) . = ..() component_parts = list() component_parts += new /obj/item/circuitboard/machine/cyborgrecharger(null) diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index 4942873a9c..bbca9f7dbe 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -17,7 +17,7 @@ var/eat_victim_items = TRUE var/item_recycle_sound = 'sound/items/welder.ogg' -/obj/machinery/recycler/Initialize() +/obj/machinery/recycler/Initialize(mapload) AddComponent(/datum/component/butchering/recycler, 1, amount_produced,amount_produced/5) AddComponent(/datum/component/material_container, list(/datum/material/iron, /datum/material/glass, /datum/material/silver, /datum/material/plasma, /datum/material/gold, /datum/material/diamond, /datum/material/plastic, /datum/material/uranium, /datum/material/bananium, /datum/material/titanium, /datum/material/bluespace), INFINITY, FALSE, null, null, null, TRUE) . = ..() diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index a273aad0dd..ec5784dbdb 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -85,7 +85,7 @@ GLOBAL_LIST_EMPTY(allConsoles) else icon_state = "req_comp0" -/obj/machinery/requests_console/Initialize() +/obj/machinery/requests_console/Initialize(mapload) . = ..() name = "\improper [department] requests console" GLOB.allConsoles += src diff --git a/code/game/machinery/sheetifier.dm b/code/game/machinery/sheetifier.dm index 7b83401194..82f15803ab 100644 --- a/code/game/machinery/sheetifier.dm +++ b/code/game/machinery/sheetifier.dm @@ -11,7 +11,7 @@ layer = BELOW_OBJ_LAYER var/busy_processing = FALSE -/obj/machinery/sheetifier/Initialize() +/obj/machinery/sheetifier/Initialize(mapload) . = ..() AddComponent(/datum/component/material_container, list(/datum/material/meat), MINERAL_MATERIAL_AMOUNT * MAX_STACK_SIZE * 2, TRUE, /obj/item/reagent_containers/food/snacks/meat/slab, CALLBACK(src, .proc/CanInsertMaterials), CALLBACK(src, .proc/AfterInsertMaterials)) diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index 2ebb137839..a687fd9408 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -11,7 +11,7 @@ max_integrity = 200 //The shield can only take so much beating (prevents perma-prisons) CanAtmosPass = ATMOS_PASS_DENSITY -/obj/structure/emergency_shield/Initialize() +/obj/structure/emergency_shield/Initialize(mapload) . = ..() setDir(pick(GLOB.cardinals)) air_update_turf(1) diff --git a/code/game/machinery/shuttle/custom_shuttle.dm b/code/game/machinery/shuttle/custom_shuttle.dm index 7c83cade69..9bf721b80c 100644 --- a/code/game/machinery/shuttle/custom_shuttle.dm +++ b/code/game/machinery/shuttle/custom_shuttle.dm @@ -12,7 +12,7 @@ var/icon_state_open = "burst_plasma_open" var/icon_state_off = "burst_plasma_off" -/obj/machinery/shuttle/Initialize() +/obj/machinery/shuttle/Initialize(mapload) . = ..() GLOB.custom_shuttle_machines += src diff --git a/code/game/machinery/shuttle/shuttle_engine.dm b/code/game/machinery/shuttle/shuttle_engine.dm index c3de384c58..d7bb93d94b 100644 --- a/code/game/machinery/shuttle/shuttle_engine.dm +++ b/code/game/machinery/shuttle/shuttle_engine.dm @@ -49,7 +49,7 @@ bluespace_capable = TRUE cooldown = 90 -/obj/machinery/shuttle/engine/Initialize() +/obj/machinery/shuttle/engine/Initialize(mapload) . = ..() check_setup() diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm index 1fadad168e..21b469190a 100644 --- a/code/game/machinery/slotmachine.dm +++ b/code/game/machinery/slotmachine.dm @@ -36,7 +36,7 @@ var/list/symbols = list(SEVEN = 1, "&" = 2, "@" = 2, "$" = 2, "?" = 2, "#" = 2, "!" = 2, "%" = 2) //if people are winning too much, multiply every number in this list by 2 and see if they are still winning too much. -/obj/machinery/computer/slot_machine/Initialize() +/obj/machinery/computer/slot_machine/Initialize(mapload) . = ..() jackpots = rand(1, 4) //false hope plays = rand(75, 200) diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 17e58f2a49..0ff04bf8a7 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -28,7 +28,7 @@ /obj/machinery/space_heater/get_cell() return cell -/obj/machinery/space_heater/Initialize() +/obj/machinery/space_heater/Initialize(mapload) . = ..() cell = new(src) update_icon() diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index 8937106601..8627a79772 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -158,7 +158,7 @@ var/friendc = FALSE // track if Friend Computer mode var/last_picture // For when Friend Computer mode is undone -/obj/machinery/status_display/evac/Initialize() +/obj/machinery/status_display/evac/Initialize(mapload) . = ..() // register for radio system SSradio.add_object(src, frequency) @@ -304,7 +304,7 @@ var/mode = SD_BLANK var/emotion = "Neutral" -/obj/machinery/status_display/ai/Initialize() +/obj/machinery/status_display/ai/Initialize(mapload) . = ..() GLOB.ai_status_displays.Add(src) diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index cecf351ea9..74a05a1e7b 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -120,7 +120,7 @@ state_open = TRUE density = FALSE -/obj/machinery/suit_storage_unit/Initialize() +/obj/machinery/suit_storage_unit/Initialize(mapload) . = ..() wires = new /datum/wires/suit_storage_unit(src) if(suit_type) diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 3bee98b51d..56629841e3 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -84,7 +84,7 @@ countdown.stop() STOP_PROCESSING(SSfastprocess, src) -/obj/machinery/syndicatebomb/Initialize() +/obj/machinery/syndicatebomb/Initialize(mapload) . = ..() wires = new /datum/wires/syndicatebomb(src) if(payload) @@ -242,7 +242,7 @@ open_panel = TRUE timer_set = 120 -/obj/machinery/syndicatebomb/empty/Initialize() +/obj/machinery/syndicatebomb/empty/Initialize(mapload) . = ..() wires.cut_all() diff --git a/code/game/machinery/telecomms/machines/allinone.dm b/code/game/machinery/telecomms/machines/allinone.dm index 7cc421ef15..7129d77720 100644 --- a/code/game/machinery/telecomms/machines/allinone.dm +++ b/code/game/machinery/telecomms/machines/allinone.dm @@ -16,7 +16,7 @@ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF flags_1 = NODECONSTRUCT_1 -/obj/machinery/telecomms/allinone/Initialize() +/obj/machinery/telecomms/allinone/Initialize(mapload) . = ..() if (intercept) freq_listening = list(FREQ_SYNDICATE) diff --git a/code/game/machinery/telecomms/machines/bus.dm b/code/game/machinery/telecomms/machines/bus.dm index bf3dfe8f7e..fc4de9ae84 100644 --- a/code/game/machinery/telecomms/machines/bus.dm +++ b/code/game/machinery/telecomms/machines/bus.dm @@ -70,7 +70,7 @@ freq_listening = list(FREQ_ENGINEERING) autolinkers = list("processor4", "engineering", "common") -/obj/machinery/telecomms/bus/preset_four/Initialize() +/obj/machinery/telecomms/bus/preset_four/Initialize(mapload) . = ..() for(var/i = MIN_FREQ, i <= MAX_FREQ, i += 2) freq_listening |= i diff --git a/code/game/machinery/telecomms/machines/message_server.dm b/code/game/machinery/telecomms/machines/message_server.dm index a0440001c3..237eccc94d 100644 --- a/code/game/machinery/telecomms/machines/message_server.dm +++ b/code/game/machinery/telecomms/machines/message_server.dm @@ -17,7 +17,7 @@ armor = list("melee" = 25, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 70) var/obj/item/stored -/obj/machinery/blackbox_recorder/Initialize() +/obj/machinery/blackbox_recorder/Initialize(mapload) . = ..() stored = new /obj/item/blackbox(src) @@ -93,7 +93,7 @@ var/list/datum/data_rc_msg/rc_msgs = list() var/decryptkey -/obj/machinery/telecomms/message_server/Initialize() +/obj/machinery/telecomms/message_server/Initialize(mapload) . = ..() if (!decryptkey) decryptkey = GenerateKey() diff --git a/code/game/machinery/telecomms/machines/receiver.dm b/code/game/machinery/telecomms/machines/receiver.dm index 0e443bad8f..9f884e3904 100644 --- a/code/game/machinery/telecomms/machines/receiver.dm +++ b/code/game/machinery/telecomms/machines/receiver.dm @@ -63,7 +63,7 @@ freq_listening = list(FREQ_COMMAND, FREQ_ENGINEERING, FREQ_SECURITY) //Common and other radio frequencies for people to freely use -/obj/machinery/telecomms/receiver/preset_right/Initialize() +/obj/machinery/telecomms/receiver/preset_right/Initialize(mapload) . = ..() for(var/i = MIN_FREQ, i <= MAX_FREQ, i += 2) freq_listening |= i diff --git a/code/game/machinery/telecomms/machines/server.dm b/code/game/machinery/telecomms/machines/server.dm index 6f80cfbf0e..d9d3ca896a 100644 --- a/code/game/machinery/telecomms/machines/server.dm +++ b/code/game/machinery/telecomms/machines/server.dm @@ -16,7 +16,7 @@ var/list/log_entries = list() var/totaltraffic = 0 // gigabytes (if > 1024, divide by 1024 -> terrabytes) -/obj/machinery/telecomms/server/Initialize() +/obj/machinery/telecomms/server/Initialize(mapload) . = ..() /obj/machinery/telecomms/server/RefreshParts() @@ -72,7 +72,7 @@ /obj/machinery/telecomms/server/presets network = "tcommsat" -/obj/machinery/telecomms/server/presets/Initialize() +/obj/machinery/telecomms/server/presets/Initialize(mapload) . = ..() name = id @@ -103,7 +103,7 @@ autolinkers = list("common") //Common and other radio frequencies for people to freely use -/obj/machinery/telecomms/server/presets/common/Initialize() +/obj/machinery/telecomms/server/presets/common/Initialize(mapload) . = ..() for(var/i = MIN_FREQ, i <= MAX_FREQ, i += 2) freq_listening |= i @@ -123,6 +123,6 @@ freq_listening = list(FREQ_SECURITY) autolinkers = list("security") -/obj/machinery/telecomms/server/presets/common/birdstation/Initialize() +/obj/machinery/telecomms/server/presets/common/birdstation/Initialize(mapload) . = ..() freq_listening = list() diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index daadbf4f72..6284c93ca5 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -15,7 +15,7 @@ var/obj/machinery/teleport/station/power_station var/calibrated //Calibration prevents mutation -/obj/machinery/teleport/hub/Initialize() +/obj/machinery/teleport/hub/Initialize(mapload) . = ..() link_power_station() @@ -100,7 +100,7 @@ /obj/machinery/teleport/hub/proc/is_ready() . = !panel_open && !(stat & (BROKEN|NOPOWER)) && power_station && power_station.engaged && !(power_station.stat & (BROKEN|NOPOWER)) -/obj/machinery/teleport/hub/syndicate/Initialize() +/obj/machinery/teleport/hub/syndicate/Initialize(mapload) . = ..() component_parts += new /obj/item/stock_parts/matter_bin/super(null) RefreshParts() @@ -120,7 +120,7 @@ var/list/linked_stations = list() var/efficiency = 0 -/obj/machinery/teleport/station/Initialize() +/obj/machinery/teleport/station/Initialize(mapload) . = ..() link_console_and_hub() diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm index 8bca58a7de..8bb00c6ce9 100644 --- a/code/game/machinery/transformer.dm +++ b/code/game/machinery/transformer.dm @@ -16,7 +16,7 @@ var/obj/effect/countdown/transformer/countdown var/mob/living/silicon/ai/masterAI -/obj/machinery/transformer/Initialize() +/obj/machinery/transformer/Initialize(mapload) // On us . = ..() new /obj/machinery/conveyor/auto(locate(x - 1, y, z), WEST) diff --git a/code/game/machinery/turnstile.dm b/code/game/machinery/turnstile.dm index f30ef22dd7..796d34dcb4 100644 --- a/code/game/machinery/turnstile.dm +++ b/code/game/machinery/turnstile.dm @@ -11,7 +11,7 @@ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF layer = OPEN_DOOR_LAYER -/obj/machinery/turnstile/Initialize() +/obj/machinery/turnstile/Initialize(mapload) . = ..() icon_state = "turnstile" diff --git a/code/game/mecha/combat/five_stars.dm b/code/game/mecha/combat/five_stars.dm index 250ec7f3f6..072cb9c465 100644 --- a/code/game/mecha/combat/five_stars.dm +++ b/code/game/mecha/combat/five_stars.dm @@ -10,7 +10,7 @@ pixel_x = -32 pixel_y = -32 -/obj/mecha/combat/five_stars/Initialize() +/obj/mecha/combat/five_stars/Initialize(mapload) . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/spacecops(src) ME.attach(src) diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm index 71258d1ccb..906fdc4f1b 100644 --- a/code/game/mecha/combat/gygax.dm +++ b/code/game/mecha/combat/gygax.dm @@ -31,7 +31,7 @@ wreckage = /obj/structure/mecha_wreckage/gygax/dark max_equip = 4 -/obj/mecha/combat/gygax/dark/loaded/Initialize() +/obj/mecha/combat/gygax/dark/loaded/Initialize(mapload) . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine ME.attach(src) diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index 5c60a97864..07aca0c99c 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -30,7 +30,7 @@ thrusters_action.Remove(user) zoom_action.Remove(user) -/obj/mecha/combat/marauder/loaded/Initialize() +/obj/mecha/combat/marauder/loaded/Initialize(mapload) . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse(src) ME.attach(src) @@ -55,7 +55,7 @@ force = 55 max_equip = 5 -/obj/mecha/combat/marauder/seraph/Initialize() +/obj/mecha/combat/marauder/seraph/Initialize(mapload) . = ..() var/obj/item/mecha_parts/mecha_equipment/ME ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot(src) @@ -79,7 +79,7 @@ wreckage = /obj/structure/mecha_wreckage/mauler max_equip = 5 -/obj/mecha/combat/marauder/mauler/loaded/Initialize() +/obj/mecha/combat/marauder/mauler/loaded/Initialize(mapload) . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg(src) ME.attach(src) diff --git a/code/game/mecha/combat/neovgre.dm b/code/game/mecha/combat/neovgre.dm index 75470abe88..8c655f7182 100644 --- a/code/game/mecha/combat/neovgre.dm +++ b/code/game/mecha/combat/neovgre.dm @@ -80,7 +80,7 @@ if(obj_integrity < max_integrity && istype(loc, /turf/open/floor/clockwork)) obj_integrity += min(max_integrity - obj_integrity, max_integrity / 200) -/obj/mecha/combat/neovgre/Initialize() +/obj/mecha/combat/neovgre/Initialize(mapload) .=..() GLOB.neovgre_exists ++ var/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy/neovgre/N = new diff --git a/code/game/mecha/combat/reticence.dm b/code/game/mecha/combat/reticence.dm index 7343a85483..8527d72e42 100644 --- a/code/game/mecha/combat/reticence.dm +++ b/code/game/mecha/combat/reticence.dm @@ -20,7 +20,7 @@ turnsound = null opacity = 0 -/obj/mecha/combat/reticence/loaded/Initialize() +/obj/mecha/combat/reticence/loaded/Initialize(mapload) . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced ME.attach(src) diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm index 756cee058c..a7d5971cfd 100644 --- a/code/game/mecha/equipment/tools/medical_tools.dm +++ b/code/game/mecha/equipment/tools/medical_tools.dm @@ -3,7 +3,7 @@ /obj/item/mecha_parts/mecha_equipment/medical mech_flags = EXOSUIT_MODULE_MEDICAL -/obj/item/mecha_parts/mecha_equipment/medical/Initialize() +/obj/item/mecha_parts/mecha_equipment/medical/Initialize(mapload) . = ..() START_PROCESSING(SSobj, src) @@ -257,7 +257,7 @@ range = MELEE|RANGED equip_cooldown = 10 -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/Initialize() +/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/Initialize(mapload) . = ..() create_reagents(max_volume, NO_REACT) syringes = new @@ -532,7 +532,7 @@ var/obj/item/gun/medbeam/mech/medigun custom_materials = list(/datum/material/iron = 15000, /datum/material/glass = 8000, /datum/material/plasma = 3000, /datum/material/gold = 8000, /datum/material/diamond = 2000) -/obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam/Initialize() +/obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam/Initialize(mapload) . = ..() medigun = new(src) diff --git a/code/game/mecha/equipment/tools/mining_tools.dm b/code/game/mecha/equipment/tools/mining_tools.dm index 47820d1e27..15caa02e5a 100644 --- a/code/game/mecha/equipment/tools/mining_tools.dm +++ b/code/game/mecha/equipment/tools/mining_tools.dm @@ -19,7 +19,7 @@ var/drill_level = DRILL_BASIC mech_flags = EXOSUIT_MODULE_WORKING | EXOSUIT_MODULE_COMBAT -/obj/item/mecha_parts/mecha_equipment/drill/Initialize() +/obj/item/mecha_parts/mecha_equipment/drill/Initialize(mapload) . = ..() AddComponent(/datum/component/butchering, 50, 100, null, null, TRUE) @@ -133,7 +133,7 @@ if(ishuman(target)) var/mob/living/carbon/human/H = target new /obj/effect/temp_visual/dir_setting/bloodsplatter(target.drop_location(), splatter_dir, H.dna.species.exotic_blood_color) - else + else new /obj/effect/temp_visual/dir_setting/bloodsplatter(target.drop_location(), splatter_dir) //organs go everywhere @@ -160,7 +160,7 @@ var/scanning_time = 0 mech_flags = EXOSUIT_MODULE_WORKING -/obj/item/mecha_parts/mecha_equipment/mining_scanner/Initialize() +/obj/item/mecha_parts/mecha_equipment/mining_scanner/Initialize(mapload) . = ..() START_PROCESSING(SSfastprocess, src) diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index e1861232f4..6c4f80cd3d 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -358,7 +358,7 @@ var/fuel_per_cycle_active = 200 var/power_per_cycle = 20 -/obj/item/mecha_parts/mecha_equipment/generator/Initialize() +/obj/item/mecha_parts/mecha_equipment/generator/Initialize(mapload) . = ..() generator_init() diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm index 1c4586205a..00a234275a 100644 --- a/code/game/mecha/equipment/tools/work_tools.dm +++ b/code/game/mecha/equipment/tools/work_tools.dm @@ -183,7 +183,7 @@ range = MELEE|RANGED mech_flags = EXOSUIT_MODULE_WORKING -/obj/item/mecha_parts/mecha_equipment/extinguisher/Initialize() +/obj/item/mecha_parts/mecha_equipment/extinguisher/Initialize(mapload) . = ..() create_reagents(1000) reagents.add_reagent(/datum/reagent/water, 1000) @@ -252,7 +252,7 @@ item_flags = NO_MAT_REDEMPTION var/mode = 0 //0 - deconstruct, 1 - wall or floor, 2 - airlock. -/obj/item/mecha_parts/mecha_equipment/rcd/Initialize() +/obj/item/mecha_parts/mecha_equipment/rcd/Initialize(mapload) . = ..() GLOB.rcd_list += src @@ -354,7 +354,7 @@ var/obj/item/stack/cable_coil/cable var/max_cable = 1000 -/obj/item/mecha_parts/mecha_equipment/cable_layer/Initialize() +/obj/item/mecha_parts/mecha_equipment/cable_layer/Initialize(mapload) . = ..() cable = new(src, 0) diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm index e9f682e929..db04072971 100644 --- a/code/game/mecha/mech_bay.dm +++ b/code/game/mecha/mech_bay.dm @@ -26,7 +26,7 @@ var/repairability = 0 var/turf/recharging_turf = null -/obj/machinery/mech_bay_recharge_port/Initialize() +/obj/machinery/mech_bay_recharge_port/Initialize(mapload) . = ..() recharging_turf = get_step(loc, dir) @@ -133,6 +133,6 @@ return . += "recharge_comp_on" -/obj/machinery/computer/mech_bay_power_console/Initialize() +/obj/machinery/computer/mech_bay_power_console/Initialize(mapload) . = ..() reconnect() diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 86bbf81dd2..1898129f84 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -127,7 +127,7 @@ /obj/item/radio/mech //this has to go somewhere -/obj/mecha/Initialize() +/obj/mecha/Initialize(mapload) . = ..() events = new icon_state += "-open" diff --git a/code/game/mecha/mecha_parts.dm b/code/game/mecha/mecha_parts.dm index 8a9e4e641f..bd83eeb8a7 100644 --- a/code/game/mecha/mecha_parts.dm +++ b/code/game/mecha/mecha_parts.dm @@ -15,14 +15,14 @@ return FALSE user.visible_message("[user] attaches [src] to [M].", "You attach [src] to [M].") return TRUE - + /obj/item/mecha_parts/chassis name = "Mecha Chassis" icon_state = "backbone" interaction_flags_item = NONE //Don't pick us up!! var/construct_type -/obj/item/mecha_parts/chassis/Initialize() +/obj/item/mecha_parts/chassis/Initialize(mapload) . = ..() if(construct_type) AddComponent(construct_type) diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm index 36584b85ec..f19a03fae1 100644 --- a/code/game/mecha/mecha_wreckage.dm +++ b/code/game/mecha/mecha_wreckage.dm @@ -105,7 +105,7 @@ name = "\improper Gygax wreckage" icon_state = "gygax-broken" -/obj/structure/mecha_wreckage/gygax/Initialize() +/obj/structure/mecha_wreckage/gygax/Initialize(mapload) . = ..() var/list/parts = list(/obj/item/mecha_parts/part/gygax_torso, /obj/item/mecha_parts/part/gygax_head, @@ -129,7 +129,7 @@ name = "\improper Medical Gygax wreckage" icon_state = "medigax-broken" -/obj/structure/mecha_wreckage/medigax/Initialize() +/obj/structure/mecha_wreckage/medigax/Initialize(mapload) . = ..() var/list/parts = list(/obj/item/mecha_parts/part/medigax_torso, /obj/item/mecha_parts/part/medigax_head, @@ -166,7 +166,7 @@ name = "\improper Ripley wreckage" icon_state = "ripley-broken" -/obj/structure/mecha_wreckage/ripley/Initialize() +/obj/structure/mecha_wreckage/ripley/Initialize(mapload) . = ..() var/list/parts = list(/obj/item/mecha_parts/part/ripley_torso, /obj/item/mecha_parts/part/ripley_left_arm, @@ -184,7 +184,7 @@ name = "\improper Firefighter wreckage" icon_state = "firefighter-broken" -/obj/structure/mecha_wreckage/ripley/firefighter/Initialize() +/obj/structure/mecha_wreckage/ripley/firefighter/Initialize(mapload) . = ..() var/list/parts = list(/obj/item/mecha_parts/part/ripley_torso, /obj/item/mecha_parts/part/ripley_left_arm, @@ -209,7 +209,7 @@ icon_state = "honker-broken" desc = "All is right in the universe." -/obj/structure/mecha_wreckage/honker/Initialize() +/obj/structure/mecha_wreckage/honker/Initialize(mapload) . = ..() var/list/parts = list( /obj/item/mecha_parts/chassis/honker, @@ -230,7 +230,7 @@ name = "\improper Durand wreckage" icon_state = "durand-broken" -/obj/structure/mecha_wreckage/durand/Initialize() +/obj/structure/mecha_wreckage/durand/Initialize(mapload) . = ..() var/list/parts = list( /obj/item/mecha_parts/part/durand_torso, @@ -255,7 +255,7 @@ name = "\improper Odysseus wreckage" icon_state = "odysseus-broken" -/obj/structure/mecha_wreckage/odysseus/Initialize() +/obj/structure/mecha_wreckage/odysseus/Initialize(mapload) . = ..() var/list/parts = list( /obj/item/mecha_parts/part/odysseus_torso, diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index 3c2f75bd6c..c8c93a6cd1 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -45,7 +45,7 @@ ..() update_icon() -/obj/mecha/working/ripley/Initialize() +/obj/mecha/working/ripley/Initialize(mapload) . = ..() AddComponent(/datum/component/armor_plate,3,/obj/item/stack/sheet/animalhide/goliath_hide,list("melee" = 10, "bullet" = 5, "laser" = 5)) @@ -77,7 +77,7 @@ wreckage = /obj/structure/mecha_wreckage/ripley/deathripley step_energy_drain = 0 -/obj/mecha/working/ripley/deathripley/Initialize() +/obj/mecha/working/ripley/deathripley/Initialize(mapload) . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/kill ME.attach(src) @@ -85,7 +85,7 @@ /obj/mecha/working/ripley/deathripley/real desc = "OH SHIT IT'S THE DEATHSQUAD WE'RE ALL GONNA DIE. FOR REAL" -/obj/mecha/working/ripley/deathripley/real/Initialize() +/obj/mecha/working/ripley/deathripley/real/Initialize(mapload) . = ..() for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) E.detach() @@ -99,7 +99,7 @@ name = "\improper APLU \"Miner\"" obj_integrity = 75 //Low starting health -/obj/mecha/working/ripley/mining/Initialize() +/obj/mecha/working/ripley/mining/Initialize(mapload) . = ..() if(cell) cell.charge = FLOOR(cell.charge * 0.25, 1) //Starts at very low charge diff --git a/code/game/objects/effects/arachnid_web.dm b/code/game/objects/effects/arachnid_web.dm index 2adaa12dc9..f5aee5b26e 100644 --- a/code/game/objects/effects/arachnid_web.dm +++ b/code/game/objects/effects/arachnid_web.dm @@ -49,7 +49,7 @@ density = FALSE max_integrity = 60 -/obj/structure/arachnid/cocoon/Initialize() +/obj/structure/arachnid/cocoon/Initialize(mapload) icon_state = pick("cocoon1","cocoon2","cocoon3") . = ..() diff --git a/code/game/objects/effects/bump_teleporter.dm b/code/game/objects/effects/bump_teleporter.dm index 0337b076ff..36320f2913 100644 --- a/code/game/objects/effects/bump_teleporter.dm +++ b/code/game/objects/effects/bump_teleporter.dm @@ -11,7 +11,7 @@ var/static/list/AllTeleporters -/obj/effect/bump_teleporter/Initialize() +/obj/effect/bump_teleporter/Initialize(mapload) . = ..() LAZYADD(AllTeleporters, src) diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm index 846132a2fc..561df57700 100644 --- a/code/game/objects/effects/contraband.dm +++ b/code/game/objects/effects/contraband.dm @@ -61,7 +61,7 @@ var/poster_item_icon_state = "rolled_poster" var/poster_item_type = /obj/item/poster -/obj/structure/sign/poster/Initialize() +/obj/structure/sign/poster/Initialize(mapload) . = ..() if(random_basetype) randomise(random_basetype) diff --git a/code/game/objects/effects/countdown.dm b/code/game/objects/effects/countdown.dm index b425946789..0722f3bd18 100644 --- a/code/game/objects/effects/countdown.dm +++ b/code/game/objects/effects/countdown.dm @@ -14,7 +14,7 @@ var/displayed_text var/atom/attached_to -/obj/effect/countdown/Initialize() +/obj/effect/countdown/Initialize(mapload) . = ..() attach(loc) diff --git a/code/game/objects/effects/decals/cleanable/aliens.dm b/code/game/objects/effects/decals/cleanable/aliens.dm index 875f23434b..9a23a3032e 100644 --- a/code/game/objects/effects/decals/cleanable/aliens.dm +++ b/code/game/objects/effects/decals/cleanable/aliens.dm @@ -72,6 +72,6 @@ icon_state = "tracks" random_icon_states = null -/obj/effect/decal/cleanable/blood/xtracks/Initialize() +/obj/effect/decal/cleanable/blood/xtracks/Initialize(mapload) add_blood_DNA(list("UNKNOWN DNA" = "X*")) . = ..() diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm index e5ccd9f21a..8aea7047b6 100644 --- a/code/game/objects/effects/decals/cleanable/humans.dm +++ b/code/game/objects/effects/decals/cleanable/humans.dm @@ -109,7 +109,7 @@ if(!fixed_color) add_atom_colour(blood_DNA_to_color(), FIXED_COLOUR_PRIORITY) -/obj/effect/cleanable/trail_holder/Initialize() +/obj/effect/cleanable/trail_holder/Initialize(mapload) . = ..() update_icon() diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index 62e4dbf5f3..28999ef0b5 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -15,7 +15,7 @@ persistent = TRUE persistence_allow_stacking = TRUE -/obj/effect/decal/cleanable/ash/Initialize() +/obj/effect/decal/cleanable/ash/Initialize(mapload) . = ..() reagents.add_reagent(/datum/reagent/ash, 30) pixel_x = rand(-5, 5) @@ -30,7 +30,7 @@ icon_state = "big_ash" beauty = -100 -/obj/effect/decal/cleanable/ash/large/Initialize() +/obj/effect/decal/cleanable/ash/large/Initialize(mapload) . = ..() reagents.add_reagent(/datum/reagent/ash, 30) //double the amount of ash. @@ -43,7 +43,7 @@ mergeable_decal = TRUE persistent = TRUE -/obj/effect/decal/cleanable/glass/Initialize() +/obj/effect/decal/cleanable/glass/Initialize(mapload) . = ..() setDir(pick(GLOB.cardinals)) @@ -89,7 +89,7 @@ if(data["alpha"]) alpha = text2num(data["alpha"]) -/obj/effect/decal/cleanable/dirt/Initialize() +/obj/effect/decal/cleanable/dirt/Initialize(mapload) . = ..() var/turf/T = get_turf(src) if(T.tiled_dirt) @@ -265,7 +265,7 @@ qdel(src) return power // no block -/obj/effect/decal/cleanable/shreds/Initialize() +/obj/effect/decal/cleanable/shreds/Initialize(mapload) pixel_x = rand(-10, 10) pixel_y = rand(-10, 10) . = ..() diff --git a/code/game/objects/effects/decals/cleanable/robots.dm b/code/game/objects/effects/decals/cleanable/robots.dm index 1eb3533f71..605da122c0 100644 --- a/code/game/objects/effects/decals/cleanable/robots.dm +++ b/code/game/objects/effects/decals/cleanable/robots.dm @@ -55,7 +55,7 @@ beauty = -100 persistent = TRUE -/obj/effect/decal/cleanable/oil/Initialize() +/obj/effect/decal/cleanable/oil/Initialize(mapload) . = ..() reagents.add_reagent(/datum/reagent/oil, 30) reagents.add_reagent(/datum/reagent/liquidgibs/oil, 5) @@ -68,6 +68,6 @@ /obj/effect/decal/cleanable/oil/slippery persistent = FALSE -/obj/effect/decal/cleanable/oil/slippery/Initialize() +/obj/effect/decal/cleanable/oil/slippery/Initialize(mapload) . = ..() AddComponent(/datum/component/slippery, 80, (NO_SLIP_WHEN_WALKING | SLIDE)) diff --git a/code/game/objects/effects/decals/decal.dm b/code/game/objects/effects/decals/decal.dm index cdf16468f4..2e1cc2b606 100644 --- a/code/game/objects/effects/decals/decal.dm +++ b/code/game/objects/effects/decals/decal.dm @@ -5,7 +5,7 @@ resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF var/turf_loc_check = TRUE -/obj/effect/decal/Initialize() +/obj/effect/decal/Initialize(mapload) . = ..() if(turf_loc_check && (!isturf(loc) || NeverShouldHaveComeHere(loc))) return INITIALIZE_HINT_QDEL @@ -37,7 +37,7 @@ layer = TURF_DECAL_LAYER plane = ABOVE_WALL_PLANE -/obj/effect/turf_decal/Initialize() +/obj/effect/turf_decal/Initialize(mapload) ..() return INITIALIZE_HINT_QDEL diff --git a/code/game/objects/effects/effect_system/effect_system.dm b/code/game/objects/effects/effect_system/effect_system.dm index 05077bf898..6eb6fecd66 100644 --- a/code/game/objects/effects/effect_system/effect_system.dm +++ b/code/game/objects/effects/effect_system/effect_system.dm @@ -12,7 +12,7 @@ would spawn and follow the beaker, even if it is carried or thrown. pass_flags = PASSTABLE | PASSGRILLE anchored = TRUE -/obj/effect/particle_effect/Initialize() +/obj/effect/particle_effect/Initialize(mapload) . = ..() GLOB.cameranet.updateVisibility(src) diff --git a/code/game/objects/effects/effect_system/effects_explosion.dm b/code/game/objects/effects/effect_system/effects_explosion.dm index d208510e86..e45461cde8 100644 --- a/code/game/objects/effects/effect_system/effects_explosion.dm +++ b/code/game/objects/effects/effect_system/effects_explosion.dm @@ -4,7 +4,7 @@ opacity = 1 anchored = TRUE -/obj/effect/particle_effect/expl_particles/Initialize() +/obj/effect/particle_effect/expl_particles/Initialize(mapload) . = ..() QDEL_IN(src, 15) @@ -29,7 +29,7 @@ pixel_x = -32 pixel_y = -32 -/obj/effect/explosion/Initialize() +/obj/effect/explosion/Initialize(mapload) . = ..() QDEL_IN(src, 10) diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index a0f53ceab7..9d0751c3f1 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -90,7 +90,7 @@ /obj/effect/particle_effect/foam/long_life lifetime = 150 -/obj/effect/particle_effect/foam/Initialize() +/obj/effect/particle_effect/foam/Initialize(mapload) . = ..() MakeSlippery() create_reagents(1000, NONE, NO_REAGENTS_VALUE) //limited by the size of the reagent holder anyway. @@ -271,7 +271,7 @@ attack_hand_speed = CLICK_CD_MELEE attack_hand_is_action = TRUE -/obj/structure/foamedmetal/Initialize() +/obj/structure/foamedmetal/Initialize(mapload) . = ..() air_update_turf(1) @@ -307,7 +307,7 @@ alpha = 120 max_integrity = 10 -/obj/structure/foamedmetal/resin/Initialize() +/obj/structure/foamedmetal/resin/Initialize(mapload) . = ..() neutralize_air() addtimer(CALLBACK(src, .proc/neutralize_air), 5) // yeah this sucks, maybe when auxmos is out diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index 3e80ade0ce..dd6bc99af3 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -30,7 +30,7 @@ set_opacity(0) //if we were blocking view, we aren't now because we're fading out stoplag() -/obj/effect/particle_effect/smoke/Initialize() +/obj/effect/particle_effect/smoke/Initialize(mapload) . = ..() create_reagents(500, NONE, NO_REAGENTS_VALUE) START_PROCESSING(SSobj, src) diff --git a/code/game/objects/effects/effect_system/effects_sparks.dm b/code/game/objects/effects/effect_system/effects_sparks.dm index a388d3bc67..62cf7e54f5 100644 --- a/code/game/objects/effects/effect_system/effects_sparks.dm +++ b/code/game/objects/effects/effect_system/effects_sparks.dm @@ -24,7 +24,7 @@ light_range = MINIMUM_USEFUL_LIGHT_RANGE light_color = LIGHT_COLOR_FIRE -/obj/effect/particle_effect/sparks/Initialize() +/obj/effect/particle_effect/sparks/Initialize(mapload) . = ..() flick(icon_state, src) // replay the animation playsound(src, "sparks", 100, TRUE) @@ -69,7 +69,7 @@ name = "lightning" icon_state = "electricity" -/obj/effect/particle_effect/fake_sparks/Initialize() +/obj/effect/particle_effect/fake_sparks/Initialize(mapload) . = ..() flick(icon_state, src) // replay the animation playsound(src, "sparks", 100, TRUE) diff --git a/code/game/objects/effects/effect_system/effects_water.dm b/code/game/objects/effects/effect_system/effects_water.dm index 31124381f6..8fafda8b51 100644 --- a/code/game/objects/effects/effect_system/effects_water.dm +++ b/code/game/objects/effects/effect_system/effects_water.dm @@ -7,7 +7,7 @@ mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/effect/particle_effect/water/Initialize() +/obj/effect/particle_effect/water/Initialize(mapload) . = ..() QDEL_IN(src, 70) @@ -45,7 +45,7 @@ steam.start() -- spawns the effect icon_state = "extinguish" density = FALSE -/obj/effect/particle_effect/steam/Initialize() +/obj/effect/particle_effect/steam/Initialize(mapload) . = ..() QDEL_IN(src, 20) diff --git a/code/game/objects/effects/forcefields.dm b/code/game/objects/effects/forcefields.dm index 384cf73c89..c16c9751a8 100644 --- a/code/game/objects/effects/forcefields.dm +++ b/code/game/objects/effects/forcefields.dm @@ -8,7 +8,7 @@ CanAtmosPass = ATMOS_PASS_DENSITY var/timeleft = 300 //Set to 0 for permanent forcefields (ugh) -/obj/effect/forcefield/Initialize() +/obj/effect/forcefield/Initialize(mapload) . = ..() if(timeleft) QDEL_IN(src, timeleft) diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 8ff4017b8c..2aaef553bf 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -19,7 +19,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) -/obj/effect/landmark/Initialize() +/obj/effect/landmark/Initialize(mapload) . = ..() GLOB.landmarks_list += src @@ -245,7 +245,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) icon = 'icons/effects/landmarks_static.dmi' icon_state = "wiznerd_spawn" -/obj/effect/landmark/start/wizard/Initialize() +/obj/effect/landmark/start/wizard/Initialize(mapload) ..() GLOB.wizardstart += loc return INITIALIZE_HINT_QDEL @@ -255,7 +255,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) icon = 'icons/effects/landmarks_static.dmi' icon_state = "snukeop_spawn" -/obj/effect/landmark/start/nukeop/Initialize() +/obj/effect/landmark/start/nukeop/Initialize(mapload) ..() GLOB.nukeop_start += loc return INITIALIZE_HINT_QDEL @@ -265,7 +265,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) icon = 'icons/effects/landmarks_static.dmi' icon_state = "snukeop_leader_spawn" -/obj/effect/landmark/start/nukeop_leader/Initialize() +/obj/effect/landmark/start/nukeop_leader/Initialize(mapload) ..() GLOB.nukeop_leader_start += loc return INITIALIZE_HINT_QDEL @@ -277,7 +277,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) /obj/effect/landmark/start/new_player name = "New Player" -/obj/effect/landmark/start/new_player/Initialize() +/obj/effect/landmark/start/new_player/Initialize(mapload) ..() GLOB.newplayer_start += loc return INITIALIZE_HINT_QDEL diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index b0e801137d..a1edac02a3 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -116,7 +116,7 @@ density = FALSE var/duration = 0 -/obj/effect/mine/pickup/Initialize() +/obj/effect/mine/pickup/Initialize(mapload) . = ..() animate(src, pixel_y = 4, time = 20, loop = -1) diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index 6be0a50a5e..945136466f 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -13,7 +13,7 @@ icon_state="b_beam" var/atom/BeamSource -/obj/effect/overlay/beam/Initialize() +/obj/effect/overlay/beam/Initialize(mapload) . = ..() QDEL_IN(src, 10) diff --git a/code/game/objects/effects/spawners/bombspawner.dm b/code/game/objects/effects/spawners/bombspawner.dm index fb92e31f1e..953468f1ff 100644 --- a/code/game/objects/effects/spawners/bombspawner.dm +++ b/code/game/objects/effects/spawners/bombspawner.dm @@ -13,7 +13,7 @@ var/pressure_o = 10 * ONE_ATMOSPHERE //tank pressures var/assembly_type -/obj/effect/spawner/newbomb/Initialize() +/obj/effect/spawner/newbomb/Initialize(mapload) . = ..() var/obj/item/transfer_valve/V = new(src.loc) var/obj/item/tank/internals/plasma/PT = new(V) @@ -39,7 +39,7 @@ return INITIALIZE_HINT_QDEL -/obj/effect/spawner/newbomb/timer/syndicate/Initialize() +/obj/effect/spawner/newbomb/timer/syndicate/Initialize(mapload) temp_p = (OPTIMAL_TEMP_K_PLA_BURN_SCALE(pressure_p, pressure_o, temp_o)/2 + OPTIMAL_TEMP_K_PLA_BURN_RATIO(pressure_p, pressure_o, temp_o)/2) - T0C . = ..() diff --git a/code/game/objects/effects/spawners/gibspawner.dm b/code/game/objects/effects/spawners/gibspawner.dm index 00ddf0e9ef..65c6c35c9e 100644 --- a/code/game/objects/effects/spawners/gibspawner.dm +++ b/code/game/objects/effects/spawners/gibspawner.dm @@ -91,7 +91,7 @@ gibamounts = list(2, 2, 1) sound_vol = 40 -/obj/effect/gibspawner/generic/Initialize() +/obj/effect/gibspawner/generic/Initialize(mapload) if(!gibdirections.len) gibdirections = list(list(WEST, NORTHWEST, SOUTHWEST, NORTH),list(EAST, NORTHEAST, SOUTHEAST, SOUTH), list()) return ..() @@ -106,7 +106,7 @@ gib_mob_species = /datum/species/human sound_vol = 50 -/obj/effect/gibspawner/human/Initialize() +/obj/effect/gibspawner/human/Initialize(mapload) if(!gibdirections.len) gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list()) return ..() @@ -115,7 +115,7 @@ gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/human, /obj/effect/decal/cleanable/blood/gibs/human/core, /obj/effect/decal/cleanable/blood/gibs/human, /obj/effect/decal/cleanable/blood/gibs/human/core, /obj/effect/decal/cleanable/blood/gibs/human, /obj/effect/decal/cleanable/blood/gibs/human/torso) gibamounts = list(1, 1, 1, 1, 1, 1) -/obj/effect/gibspawner/human/bodypartless/Initialize() +/obj/effect/gibspawner/human/bodypartless/Initialize(mapload) if(!gibdirections.len) gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list()) return ..() @@ -127,7 +127,7 @@ gib_mob_species = /datum/species/lizard sound_vol = 50 -/obj/effect/gibspawner/lizard/Initialize() +/obj/effect/gibspawner/lizard/Initialize(mapload) if(!gibdirections.len) gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list()) return ..() @@ -136,7 +136,7 @@ gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/human/lizard, /obj/effect/decal/cleanable/blood/gibs/human/lizard/core, /obj/effect/decal/cleanable/blood/gibs/human/lizard, /obj/effect/decal/cleanable/blood/gibs/human/lizard/core, /obj/effect/decal/cleanable/blood/gibs/human/lizard, /obj/effect/decal/cleanable/blood/gibs/human/lizard/torso) gibamounts = list(1, 1, 1, 1, 1, 1) -/obj/effect/gibspawner/lizard/bodypartless/Initialize() +/obj/effect/gibspawner/lizard/bodypartless/Initialize(mapload) if(!gibdirections.len) gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list()) return ..() @@ -148,7 +148,7 @@ gib_mob_species = /datum/species/jelly/roundstartslime sound_vol = 50 -/obj/effect/gibspawner/slime/Initialize() +/obj/effect/gibspawner/slime/Initialize(mapload) if(!gibdirections.len) gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list()) return ..() @@ -157,7 +157,7 @@ gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/slime, /obj/effect/decal/cleanable/blood/gibs/slime/core, /obj/effect/decal/cleanable/blood/gibs/slime, /obj/effect/decal/cleanable/blood/gibs/slime/core, /obj/effect/decal/cleanable/blood/gibs/slime, /obj/effect/decal/cleanable/blood/gibs/slime/torso) gibamounts = list(1, 1, 1, 1, 1, 1) -/obj/effect/gibspawner/slime/bodypartless/Initialize() +/obj/effect/gibspawner/slime/bodypartless/Initialize(mapload) if(!gibdirections.len) gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list()) return ..() @@ -171,7 +171,7 @@ sparks = TRUE sound_to_play = 'sound/effects/bang.ogg' -/obj/effect/gibspawner/ipc/Initialize() +/obj/effect/gibspawner/ipc/Initialize(mapload) if(!gibdirections.len) gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list()) return ..() @@ -180,7 +180,7 @@ gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/ipc, /obj/effect/decal/cleanable/blood/gibs/ipc/core, /obj/effect/decal/cleanable/blood/gibs/ipc, /obj/effect/decal/cleanable/blood/gibs/ipc/core, /obj/effect/decal/cleanable/blood/gibs/ipc, /obj/effect/decal/cleanable/blood/gibs/ipc/torso) gibamounts = list(1, 1, 1, 1, 1, 1) -/obj/effect/gibspawner/ipc/bodypartless/Initialize() +/obj/effect/gibspawner/ipc/bodypartless/Initialize(mapload) if(!gibdirections.len) gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list()) return ..() @@ -190,7 +190,7 @@ gibamounts = list(1, 1, 1, 1, 1, 1, 1) gib_mob_type = /mob/living/carbon/alien -/obj/effect/gibspawner/xeno/Initialize() +/obj/effect/gibspawner/xeno/Initialize(mapload) if(!gibdirections.len) gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list()) return ..() @@ -199,7 +199,7 @@ gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/xeno/core, /obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/xeno/core, /obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/xeno/torso) gibamounts = list(1, 1, 1, 1, 1, 1) -/obj/effect/gibspawner/xeno/bodypartless/Initialize() +/obj/effect/gibspawner/xeno/bodypartless/Initialize(mapload) if(!gibdirections.len) gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list()) return ..() @@ -215,7 +215,7 @@ gibamounts = list(1, 1, 1, 1) gib_mob_type = /mob/living/carbon/alien/larva -/obj/effect/gibspawner/larva/Initialize() +/obj/effect/gibspawner/larva/Initialize(mapload) if(!gibdirections.len) gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST), list(), GLOB.alldirs) return ..() @@ -224,7 +224,7 @@ gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/xeno/larva, /obj/effect/decal/cleanable/blood/gibs/xeno/larva, /obj/effect/decal/cleanable/blood/gibs/xeno/larva) gibamounts = list(1, 1, 1) -/obj/effect/gibspawner/larva/bodypartless/Initialize() +/obj/effect/gibspawner/larva/bodypartless/Initialize(mapload) if(!gibdirections.len) gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST), list()) return ..() @@ -235,7 +235,7 @@ gibamounts = list(1, 1, 1, 1, 1, 1) gib_mob_type = /mob/living/silicon/robot -/obj/effect/gibspawner/robot/Initialize() +/obj/effect/gibspawner/robot/Initialize(mapload) if(!gibdirections.len) gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs) gibamounts[6] = pick(0, 1, 2) diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 920af875d5..f19f8f0f95 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -167,7 +167,7 @@ icon = 'icons/obj/lighting.dmi' icon_state = "random_glowstick" -/obj/effect/spawner/lootdrop/glowstick/Initialize() +/obj/effect/spawner/lootdrop/glowstick/Initialize(mapload) loot = typesof(/obj/item/flashlight/glowstick) . = ..() @@ -222,7 +222,7 @@ /obj/effect/spawner/lootdrop/costume name = "random costume spawner" -/obj/effect/spawner/lootdrop/costume/Initialize() +/obj/effect/spawner/lootdrop/costume/Initialize(mapload) loot = list() for(var/path in subtypesof(/obj/effect/spawner/bundle/costume)) loot[path] = TRUE @@ -298,7 +298,7 @@ icon = 'icons/obj/storage.dmi' icon_state = "mre" -/obj/effect/spawner/lootdrop/mre/Initialize() +/obj/effect/spawner/lootdrop/mre/Initialize(mapload) for(var/A in subtypesof(/obj/item/storage/box/mre)) var/obj/item/storage/box/mre/M = A var/our_chance = initial(M.spawner_chance) diff --git a/code/game/objects/effects/spawners/structure.dm b/code/game/objects/effects/spawners/structure.dm index 7a151c4312..e55a7daa52 100644 --- a/code/game/objects/effects/spawners/structure.dm +++ b/code/game/objects/effects/spawners/structure.dm @@ -8,7 +8,7 @@ again. name = "map structure spawner" var/list/spawn_list -/obj/effect/spawner/structure/Initialize() +/obj/effect/spawner/structure/Initialize(mapload) . = ..() if(spawn_list && spawn_list.len) for(var/I in spawn_list) @@ -27,7 +27,7 @@ again. var/electrochromatic var/electrochromatic_id -/obj/effect/spawner/structure/window/Initialize() +/obj/effect/spawner/structure/window/Initialize(mapload) . = ..() if(!electrochromatic) return @@ -50,7 +50,7 @@ again. /obj/effect/spawner/structure/window/hollow/end icon_state = "hwindow_spawner_end" -/obj/effect/spawner/structure/window/hollow/end/Initialize() +/obj/effect/spawner/structure/window/hollow/end/Initialize(mapload) switch(dir) if(NORTH) spawn_list = list(/obj/structure/grille, /obj/structure/window/spawner/north, /obj/structure/window/spawner/east, /obj/structure/window/spawner/west) @@ -65,7 +65,7 @@ again. /obj/effect/spawner/structure/window/hollow/middle icon_state = "hwindow_spawner_middle" -/obj/effect/spawner/structure/window/hollow/middle/Initialize() +/obj/effect/spawner/structure/window/hollow/middle/Initialize(mapload) switch(dir) if(NORTH,SOUTH) spawn_list = list(/obj/structure/grille, /obj/structure/window, /obj/structure/window/spawner/north) @@ -76,7 +76,7 @@ again. /obj/effect/spawner/structure/window/hollow/directional icon_state = "hwindow_spawner_directional" -/obj/effect/spawner/structure/window/hollow/directional/Initialize() +/obj/effect/spawner/structure/window/hollow/directional/Initialize(mapload) switch(dir) if(NORTH) spawn_list = list(/obj/structure/grille, /obj/structure/window/spawner/north) @@ -111,7 +111,7 @@ again. /obj/effect/spawner/structure/window/hollow/reinforced/end icon_state = "hrwindow_spawner_end" -/obj/effect/spawner/structure/window/hollow/reinforced/end/Initialize() +/obj/effect/spawner/structure/window/hollow/reinforced/end/Initialize(mapload) switch(dir) if(NORTH) spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/spawner/north, /obj/structure/window/reinforced/spawner/east, /obj/structure/window/reinforced/spawner/west) @@ -126,7 +126,7 @@ again. /obj/effect/spawner/structure/window/hollow/reinforced/middle icon_state = "hrwindow_spawner_middle" -/obj/effect/spawner/structure/window/hollow/reinforced/middle/Initialize() +/obj/effect/spawner/structure/window/hollow/reinforced/middle/Initialize(mapload) switch(dir) if(NORTH,SOUTH) spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced, /obj/structure/window/reinforced/spawner/north) @@ -137,7 +137,7 @@ again. /obj/effect/spawner/structure/window/hollow/reinforced/directional icon_state = "hrwindow_spawner_directional" -/obj/effect/spawner/structure/window/hollow/reinforced/directional/Initialize() +/obj/effect/spawner/structure/window/hollow/reinforced/directional/Initialize(mapload) switch(dir) if(NORTH) spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/spawner/north) @@ -211,7 +211,7 @@ again. /obj/effect/spawner/structure/window/hollow/survival_pod/end icon_state = "podwindow_spawner_end" -/obj/effect/spawner/structure/window/hollow/survival_pod/end/Initialize() +/obj/effect/spawner/structure/window/hollow/survival_pod/end/Initialize(mapload) switch(dir) if(NORTH) spawn_list = list(/obj/structure/grille, /obj/structure/window/shuttle/survival_pod/spawner/north, /obj/structure/window/shuttle/survival_pod/spawner/east, /obj/structure/window/shuttle/survival_pod/spawner/west) @@ -226,7 +226,7 @@ again. /obj/effect/spawner/structure/window/hollow/survival_pod/middle icon_state = "podwindow_spawner_middle" -/obj/effect/spawner/structure/window/hollow/survival_pod/middle/Initialize() +/obj/effect/spawner/structure/window/hollow/survival_pod/middle/Initialize(mapload) switch(dir) if(NORTH,SOUTH) spawn_list = list(/obj/structure/grille, /obj/structure/window/shuttle/survival_pod, /obj/structure/window/shuttle/survival_pod/spawner/north) @@ -237,7 +237,7 @@ again. /obj/effect/spawner/structure/window/hollow/survival_pod/directional icon_state = "podwindow_spawner_directional" -/obj/effect/spawner/structure/window/hollow/survival_pod/directional/Initialize() +/obj/effect/spawner/structure/window/hollow/survival_pod/directional/Initialize(mapload) switch(dir) if(NORTH) spawn_list = list(/obj/structure/grille, /obj/structure/window/shuttle/survival_pod/spawner/north) @@ -273,7 +273,7 @@ again. /obj/effect/spawner/structure/window/hollow/plasma/end icon_state = "phwindow_spawner_end" -/obj/effect/spawner/structure/window/hollow/plasma/end/Initialize() +/obj/effect/spawner/structure/window/hollow/plasma/end/Initialize(mapload) switch(dir) if(NORTH) spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/spawner/north, /obj/structure/window/plasma/spawner/east, /obj/structure/window/plasma/spawner/west) @@ -288,7 +288,7 @@ again. /obj/effect/spawner/structure/window/hollow/plasma/middle icon_state = "phwindow_spawner_middle" -/obj/effect/spawner/structure/window/hollow/plasma/middle/Initialize() +/obj/effect/spawner/structure/window/hollow/plasma/middle/Initialize(mapload) switch(dir) if(NORTH,SOUTH) spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma, /obj/structure/window/plasma/spawner/north) @@ -299,7 +299,7 @@ again. /obj/effect/spawner/structure/window/hollow/plasma/directional icon_state = "phwindow_spawner_directional" -/obj/effect/spawner/structure/window/hollow/plasma/directional/Initialize() +/obj/effect/spawner/structure/window/hollow/plasma/directional/Initialize(mapload) switch(dir) if(NORTH) spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/spawner/north) @@ -334,7 +334,7 @@ again. /obj/effect/spawner/structure/window/hollow/plasma/reinforced/end icon_state = "phrwindow_spawner_end" -/obj/effect/spawner/structure/window/hollow/plasma/reinforced/end/Initialize() +/obj/effect/spawner/structure/window/hollow/plasma/reinforced/end/Initialize(mapload) switch(dir) if(NORTH) spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/reinforced/spawner/north, /obj/structure/window/plasma/reinforced/spawner/east, /obj/structure/window/plasma/reinforced/spawner/west) @@ -349,7 +349,7 @@ again. /obj/effect/spawner/structure/window/hollow/plasma/reinforced/middle icon_state = "phrwindow_spawner_middle" -/obj/effect/spawner/structure/window/hollow/plasma/reinforced/middle/Initialize() +/obj/effect/spawner/structure/window/hollow/plasma/reinforced/middle/Initialize(mapload) switch(dir) if(NORTH,SOUTH) spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/reinforced, /obj/structure/window/plasma/reinforced/spawner/north) @@ -360,7 +360,7 @@ again. /obj/effect/spawner/structure/window/hollow/plasma/reinforced/directional icon_state = "phrwindow_spawner_directional" -/obj/effect/spawner/structure/window/hollow/plasma/reinforced/directional/Initialize() +/obj/effect/spawner/structure/window/hollow/plasma/reinforced/directional/Initialize(mapload) switch(dir) if(NORTH) spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/reinforced/spawner/north) diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 4b04606401..1c49cebf08 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -31,7 +31,7 @@ var/genetic = FALSE icon_state = "stickyweb1" -/obj/structure/spider/stickyweb/Initialize() +/obj/structure/spider/stickyweb/Initialize(mapload) if(prob(50)) icon_state = "stickyweb2" . = ..() @@ -84,7 +84,7 @@ var/poison_per_bite = 5 var/list/faction = list("spiders") -/obj/structure/spider/eggcluster/Initialize() +/obj/structure/spider/eggcluster/Initialize(mapload) pixel_x = rand(3,-3) pixel_y = rand(3,-3) START_PROCESSING(SSobj, src) @@ -127,7 +127,7 @@ new/obj/item/reagent_containers/food/snacks/spiderling(get_turf(src)) . = ..() -/obj/structure/spider/spiderling/Initialize() +/obj/structure/spider/spiderling/Initialize(mapload) . = ..() pixel_x = rand(6,-6) pixel_y = rand(6,-6) @@ -248,7 +248,7 @@ icon_state = "cocoon1" max_integrity = 60 -/obj/structure/spider/cocoon/Initialize() +/obj/structure/spider/cocoon/Initialize(mapload) icon_state = pick("cocoon1","cocoon2","cocoon3") . = ..() diff --git a/code/game/objects/effects/temporary_visuals/clockcult.dm b/code/game/objects/effects/temporary_visuals/clockcult.dm index 9a236c00c3..fda72f2904 100644 --- a/code/game/objects/effects/temporary_visuals/clockcult.dm +++ b/code/game/objects/effects/temporary_visuals/clockcult.dm @@ -69,7 +69,7 @@ pixel_y = 20 duration = 20 -/obj/effect/temp_visual/ratvar/belligerent_cast/Initialize() +/obj/effect/temp_visual/ratvar/belligerent_cast/Initialize(mapload) . = ..() animate(src, alpha = 0, time = duration, easing = EASE_OUT) @@ -145,7 +145,7 @@ else playsound(src, "sparks", 50, 1) -/obj/effect/temp_visual/ratvar/ocular_warden/Initialize() +/obj/effect/temp_visual/ratvar/ocular_warden/Initialize(mapload) . = ..() pixel_x = rand(-8, 8) pixel_y = rand(-10, 10) @@ -184,7 +184,7 @@ layer = ABOVE_MOB_LAYER duration = 10 -/obj/effect/temp_visual/ratvar/component/Initialize() +/obj/effect/temp_visual/ratvar/component/Initialize(mapload) . = ..() transform = matrix()*0.75 pixel_x = rand(-10, 10) @@ -215,7 +215,7 @@ light_power = 2 light_color = "#FAE48C" -/obj/effect/temp_visual/ratvar/sigil/transgression/Initialize() +/obj/effect/temp_visual/ratvar/sigil/transgression/Initialize(mapload) . = ..() var/oldtransform = transform animate(src, transform = matrix()*2, time = 5) @@ -277,7 +277,7 @@ /obj/effect/temp_visual/steam_release name = "all the steam" -/obj/effect/temp_visual/steam_release/Initialize() +/obj/effect/temp_visual/steam_release/Initialize(mapload) ..() for(var/V in GLOB.cardinals) var/turf/T = get_step(src, V) diff --git a/code/game/objects/effects/temporary_visuals/temporary_visual.dm b/code/game/objects/effects/temporary_visuals/temporary_visual.dm index 9a4c26111f..bf4e82f7b7 100644 --- a/code/game/objects/effects/temporary_visuals/temporary_visual.dm +++ b/code/game/objects/effects/temporary_visuals/temporary_visual.dm @@ -8,7 +8,7 @@ var/randomdir = TRUE var/timerid -/obj/effect/temp_visual/Initialize() +/obj/effect/temp_visual/Initialize(mapload) . = ..() if(randomdir) setDir(pick(GLOB.cardinals)) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 54bdeff4de..e2a4d915cc 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -177,7 +177,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb var/canMouseDown = FALSE -/obj/item/Initialize() +/obj/item/Initialize(mapload) if(attack_verb) attack_verb = typelist("attack_verb", attack_verb) diff --git a/code/game/objects/items/AI_modules.dm b/code/game/objects/items/AI_modules.dm index 59dd420d23..306b711994 100644 --- a/code/game/objects/items/AI_modules.dm +++ b/code/game/objects/items/AI_modules.dm @@ -406,7 +406,7 @@ AI MODULES /obj/item/aiModule/core/full/custom name = "Default Core AI Module" -/obj/item/aiModule/core/full/custom/Initialize() +/obj/item/aiModule/core/full/custom/Initialize(mapload) . = ..() for(var/line in world.file2list("[global.config.directory]/silicon_laws.txt")) if(!line) diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index 07ffe8896e..b5bb69f960 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -39,7 +39,7 @@ RLD var/custom_range = 7 var/upgrade = FALSE -/obj/item/construction/Initialize() +/obj/item/construction/Initialize(mapload) . = ..() spark_system = new /datum/effect_system/spark_spread spark_system.set_up(5, 0, src) @@ -464,7 +464,7 @@ RLD return TRUE qdel(rcd_effect) -/obj/item/construction/rcd/Initialize() +/obj/item/construction/rcd/Initialize(mapload) . = ..() GLOB.rcd_list += src @@ -561,7 +561,7 @@ RLD cut_overlays() //To prevent infinite stacking of overlays add_overlay("[icon_state]_charge[ratio]") -/obj/item/construction/rcd/Initialize() +/obj/item/construction/rcd/Initialize(mapload) . = ..() update_icon() @@ -699,7 +699,7 @@ RLD var/color_choice = null -/obj/item/construction/rld/Initialize() +/obj/item/construction/rld/Initialize(mapload) . = ..() update_icon() diff --git a/code/game/objects/items/RCL.dm b/code/game/objects/items/RCL.dm index 019231b8b4..fa73650142 100644 --- a/code/game/objects/items/RCL.dm +++ b/code/game/objects/items/RCL.dm @@ -23,7 +23,7 @@ var/datum/radial_menu/persistent/wiring_gui_menu var/mob/listeningTo -/obj/item/rcl/Initialize() +/obj/item/rcl/Initialize(mapload) . = ..() RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield) RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield) @@ -314,7 +314,7 @@ else //open the menu showWiringGui(user) -/obj/item/rcl/pre_loaded/Initialize() //Comes preloaded with cable, for testing stuff +/obj/item/rcl/pre_loaded/Initialize(mapload) //Comes preloaded with cable, for testing stuff loaded = new() loaded.max_amount = max_amount loaded.amount = max_amount diff --git a/code/game/objects/items/RPD.dm b/code/game/objects/items/RPD.dm index 635ea97902..86972c47ad 100644 --- a/code/game/objects/items/RPD.dm +++ b/code/game/objects/items/RPD.dm @@ -532,7 +532,7 @@ GLOBAL_LIST_INIT(fluid_duct_recipes, list( category = PLUMBING_CATEGORY locked = TRUE -/obj/item/pipe_dispenser/plumbing/Initialize() +/obj/item/pipe_dispenser/plumbing/Initialize(mapload) . = ..() spark_system = new spark_system.set_up(5, 0, src) diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm index 8edd1c2a76..048a62fea6 100644 --- a/code/game/objects/items/airlock_painter.dm +++ b/code/game/objects/items/airlock_painter.dm @@ -16,7 +16,7 @@ var/obj/item/toner/ink = null -/obj/item/airlock_painter/Initialize() +/obj/item/airlock_painter/Initialize(mapload) . = ..() ink = new /obj/item/toner(src) @@ -169,7 +169,7 @@ . = ..() ui_interact(user) -/obj/item/airlock_painter/decal/Initialize() +/obj/item/airlock_painter/decal/Initialize(mapload) . = ..() ink = new /obj/item/toner/large(src) @@ -237,6 +237,6 @@ name = "extreme decal painter" icon_state = "decal_sprayer_ex" -/obj/item/airlock_painter/decal/debug/Initialize() +/obj/item/airlock_painter/decal/debug/Initialize(mapload) . = ..() ink = new /obj/item/toner/extreme(src) diff --git a/code/game/objects/items/binoculars.dm b/code/game/objects/items/binoculars.dm index 01295204a8..0897dc1dca 100644 --- a/code/game/objects/items/binoculars.dm +++ b/code/game/objects/items/binoculars.dm @@ -11,7 +11,7 @@ var/zoom_out_amt = 6 var/zoom_amt = 10 -/obj/item/binoculars/Initialize() +/obj/item/binoculars/Initialize(mapload) . = ..() RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield) RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield) diff --git a/code/game/objects/items/boombox.dm b/code/game/objects/items/boombox.dm index 49e2375c1a..7ac2c67f5a 100644 --- a/code/game/objects/items/boombox.dm +++ b/code/game/objects/items/boombox.dm @@ -48,7 +48,7 @@ baseiconstate = "raiqbawks" availabletrackids = list("hotline.ogg","chiptune.ogg","genesis.ogg") -/obj/item/boombox/raiq/Initialize() +/obj/item/boombox/raiq/Initialize(mapload) . = ..() RegisterSignal(src, COMSIG_ATOM_UPDATED_ICON, .proc/start_party) diff --git a/code/game/objects/items/broom.dm b/code/game/objects/items/broom.dm index 4cbd75ed94..91b37a4c5d 100644 --- a/code/game/objects/items/broom.dm +++ b/code/game/objects/items/broom.dm @@ -13,7 +13,7 @@ attack_verb = list("swept", "brushed off", "bludgeoned", "whacked") resistance_flags = FLAMMABLE -/obj/item/broom/Initialize() +/obj/item/broom/Initialize(mapload) . = ..() RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield) RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield) diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm index 960e3ce499..355405b626 100644 --- a/code/game/objects/items/candle.dm +++ b/code/game/objects/items/candle.dm @@ -15,7 +15,7 @@ var/start_lit = FALSE var/heats_space = TRUE -/obj/item/candle/Initialize() +/obj/item/candle/Initialize(mapload) . = ..() if(start_lit) light() diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm index a8ff7b9004..d4f53e1a31 100644 --- a/code/game/objects/items/cardboard_cutouts.dm +++ b/code/game/objects/items/cardboard_cutouts.dm @@ -15,7 +15,7 @@ /// If the cutout actually appears as what it portray and not a discolored version var/deceptive = FALSE -/obj/item/cardboard_cutout/Initialize() +/obj/item/cardboard_cutout/Initialize(mapload) . = ..() if(possible_appearances) return diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index df7d6467f0..76bdd878ff 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -34,7 +34,7 @@ righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' var/detail_color = COLOR_ASSEMBLY_ORANGE -/obj/item/card/data/Initialize() +/obj/item/card/data/Initialize(mapload) .=..() update_icon() @@ -448,7 +448,7 @@ var/anyone = FALSE //Can anyone forge the ID or just syndicate? var/forged = FALSE //have we set a custom name and job assignment, or will we use what we're given when we chameleon change? -/obj/item/card/id/syndicate/Initialize() +/obj/item/card/id/syndicate/Initialize(mapload) . = ..() var/datum/action/item_action/chameleon/change/chameleon_action = new(src) chameleon_action.chameleon_type = /obj/item/card/id @@ -566,7 +566,7 @@ registered_name = "Captain" assignment = "Captain" -/obj/item/card/id/captains_spare/Initialize() +/obj/item/card/id/captains_spare/Initialize(mapload) var/datum/job/captain/J = new/datum/job/captain access = J.get_access() . = ..() @@ -578,7 +578,7 @@ registered_name = "Central Command" assignment = "General" -/obj/item/card/id/centcom/Initialize() +/obj/item/card/id/centcom/Initialize(mapload) access = get_all_centcom_access() . = ..() @@ -589,7 +589,7 @@ registered_name = "Emergency Response Team Commander" assignment = "Emergency Response Team Commander" -/obj/item/card/id/ert/Initialize() +/obj/item/card/id/ert/Initialize(mapload) access = get_all_accesses()+get_ert_access("commander")-ACCESS_CHANGE_IDS . = ..() @@ -598,7 +598,7 @@ registered_name = "Security Response Officer" assignment = "Security Response Officer" -/obj/item/card/id/ert/Security/Initialize() +/obj/item/card/id/ert/Security/Initialize(mapload) access = get_all_accesses()+get_ert_access("sec")-ACCESS_CHANGE_IDS . = ..() @@ -607,7 +607,7 @@ registered_name = "Engineer Response Officer" assignment = "Engineer Response Officer" -/obj/item/card/id/ert/Engineer/Initialize() +/obj/item/card/id/ert/Engineer/Initialize(mapload) access = get_all_accesses()+get_ert_access("eng")-ACCESS_CHANGE_IDS . = ..() @@ -616,7 +616,7 @@ registered_name = "Medical Response Officer" assignment = "Medical Response Officer" -/obj/item/card/id/ert/Medical/Initialize() +/obj/item/card/id/ert/Medical/Initialize(mapload) access = get_all_accesses()+get_ert_access("med")-ACCESS_CHANGE_IDS . = ..() @@ -625,7 +625,7 @@ registered_name = "Religious Response Officer" assignment = "Religious Response Officer" -/obj/item/card/id/ert/chaplain/Initialize() +/obj/item/card/id/ert/chaplain/Initialize(mapload) access = get_all_accesses()+get_ert_access("sec")-ACCESS_CHANGE_IDS . = ..() @@ -763,7 +763,7 @@ var/department_ID = ACCOUNT_CIV var/department_name = ACCOUNT_CIV_NAME -/obj/item/card/id/departmental_budget/Initialize() +/obj/item/card/id/departmental_budget/Initialize(mapload) . = ..() var/datum/bank_account/B = SSeconomy.get_dep_account(department_ID) if(B) @@ -819,7 +819,7 @@ var/id_color = "#00FF00" //defaults to green var/mutable_appearance/id_overlay -/obj/item/card/id/knight/Initialize() +/obj/item/card/id/knight/Initialize(mapload) . = ..() id_overlay = mutable_appearance(icon, "knight_overlay") update_icon() @@ -870,7 +870,7 @@ icon_state = "ert_janitor" assignment = "Jannie" -/obj/item/card/id/debug/Initialize() +/obj/item/card/id/debug/Initialize(mapload) access = get_all_accesses()+get_all_centcom_access()+get_all_syndicate_access() registered_account = SSeconomy.get_dep_account(ACCOUNT_CAR) . = ..() diff --git a/code/game/objects/items/chainsaw.dm b/code/game/objects/items/chainsaw.dm index ebb26fab93..58046a35d1 100644 --- a/code/game/objects/items/chainsaw.dm +++ b/code/game/objects/items/chainsaw.dm @@ -23,7 +23,7 @@ var/on = FALSE var/wielded = FALSE // track wielded status on item -/obj/item/chainsaw/Initialize() +/obj/item/chainsaw/Initialize(mapload) . = ..() RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield) RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield) diff --git a/code/game/objects/items/charter.dm b/code/game/objects/items/charter.dm index e9c3842619..8ece13681c 100644 --- a/code/game/objects/items/charter.dm +++ b/code/game/objects/items/charter.dm @@ -18,7 +18,7 @@ var/static/regex/standard_station_regex -/obj/item/station_charter/Initialize() +/obj/item/station_charter/Initialize(mapload) . = ..() if(!standard_station_regex) var/prefixes = jointext(GLOB.station_prefixes, "|") diff --git a/code/game/objects/items/chrono_eraser.dm b/code/game/objects/items/chrono_eraser.dm index 682ce18215..8c510bb489 100644 --- a/code/game/objects/items/chrono_eraser.dm +++ b/code/game/objects/items/chrono_eraser.dm @@ -52,7 +52,7 @@ var/obj/effect/chrono_field/field = null var/turf/startpos = null -/obj/item/gun/energy/chrono_gun/Initialize() +/obj/item/gun/energy/chrono_gun/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CHRONO_GUN_TRAIT) if(istype(loc, /obj/item/chrono_eraser)) @@ -124,7 +124,7 @@ nodamage = 1 var/obj/item/gun/energy/chrono_gun/gun = null -/obj/item/projectile/energy/chrono_beam/Initialize() +/obj/item/projectile/energy/chrono_beam/Initialize(mapload) . = ..() var/obj/item/ammo_casing/energy/chrono_beam/C = loc if(istype(C)) @@ -143,7 +143,7 @@ e_cost = 0 var/obj/item/gun/energy/chrono_gun/gun -/obj/item/ammo_casing/energy/chrono_beam/Initialize() +/obj/item/ammo_casing/energy/chrono_beam/Initialize(mapload) if(istype(loc)) gun = loc . = ..() diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index 8227097d8f..518772c771 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -123,7 +123,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM user.visible_message("[user] is huffing [src] as quickly as [user.p_they()] can! It looks like [user.p_theyre()] trying to give [user.p_them()]self cancer.") return (TOXLOSS|OXYLOSS) -/obj/item/clothing/mask/cigarette/Initialize() +/obj/item/clothing/mask/cigarette/Initialize(mapload) . = ..() create_reagents(chem_volume, INJECTABLE | NO_REACT, NO_REAGENTS_VALUE) // so it doesn't react until you light it if(list_reagents) @@ -398,7 +398,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM throwforce = 0 grind_results = list(/datum/reagent/carbon = 2) -/obj/item/cigbutt/Initialize() +/obj/item/cigbutt/Initialize(mapload) . = ..() AddElement(/datum/element/trash) @@ -422,7 +422,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM list_reagents = null var/packeditem = 0 -/obj/item/clothing/mask/cigarette/pipe/Initialize() +/obj/item/clothing/mask/cigarette/pipe/Initialize(mapload) . = ..() name = "empty [initial(name)]" @@ -532,7 +532,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM grind_results = list(/datum/reagent/iron = 1, /datum/reagent/fuel = 5, /datum/reagent/oil = 5) custom_price = PRICE_ALMOST_CHEAP -/obj/item/lighter/Initialize() +/obj/item/lighter/Initialize(mapload) . = ..() if(!overlay_state) overlay_state = pick(overlay_list) @@ -670,7 +670,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM COLOR_ASSEMBLY_PURPLE ) -/obj/item/lighter/greyscale/Initialize() +/obj/item/lighter/greyscale/Initialize(mapload) . = ..() if(!lighter_color) lighter_color = pick(color_list) @@ -917,7 +917,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM var/list/list_reagents = list() //For the base reagents bongs could get -/obj/item/bong/Initialize() +/obj/item/bong/Initialize(mapload) . = ..() create_reagents(chem_volume, NO_REACT) // so it doesn't react until you light it reagents.add_reagent_list(list_reagents) diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index 742a1fe3b0..74d11e9c11 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -313,7 +313,7 @@ var/challenge = FALSE var/moved = FALSE -/obj/item/circuitboard/computer/syndicate_shuttle/Initialize() +/obj/item/circuitboard/computer/syndicate_shuttle/Initialize(mapload) . = ..() GLOB.syndicate_shuttle_boards += src diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index cb1d4aae88..3a940abe29 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -77,7 +77,7 @@ #define PATH_POWERCOIL /obj/machinery/power/tesla_coil/power #define PATH_RPCOIL /obj/machinery/power/tesla_coil/research -/obj/item/circuitboard/machine/tesla_coil/Initialize() +/obj/item/circuitboard/machine/tesla_coil/Initialize(mapload) . = ..() if(build_path) build_path = PATH_POWERCOIL @@ -347,7 +347,7 @@ #define PATH_FREEZER /obj/machinery/atmospherics/components/unary/thermomachine/freezer #define PATH_HEATER /obj/machinery/atmospherics/components/unary/thermomachine/heater -/obj/item/circuitboard/machine/thermomachine/Initialize() +/obj/item/circuitboard/machine/thermomachine/Initialize(mapload) . = ..() if(!build_path) if(prob(50)) diff --git a/code/game/objects/items/clown_items.dm b/code/game/objects/items/clown_items.dm index f5477ae5f6..d8d471abaf 100644 --- a/code/game/objects/items/clown_items.dm +++ b/code/game/objects/items/clown_items.dm @@ -27,7 +27,7 @@ var/cleanspeed = 50 //slower than mop force_string = "robust... against germs" -/obj/item/soap/Initialize() +/obj/item/soap/Initialize(mapload) . = ..() AddComponent(/datum/component/slippery, 80) diff --git a/code/game/objects/items/control_wand.dm b/code/game/objects/items/control_wand.dm index be39bb6973..c87dad8f8c 100644 --- a/code/game/objects/items/control_wand.dm +++ b/code/game/objects/items/control_wand.dm @@ -15,7 +15,7 @@ var/region_access = 1 //See access.dm var/list/access_list -/obj/item/door_remote/Initialize() +/obj/item/door_remote/Initialize(mapload) . = ..() access_list = get_region_accesses(region_access) AddComponent(/datum/component/ntnet_interface) diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index bf1fdb1716..61bc715a64 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -83,7 +83,7 @@ user.visible_message("[user] is jamming [src] up [user.p_their()] nose and into [user.p_their()] brain. It looks like [user.p_theyre()] trying to commit suicide!") return (BRUTELOSS|OXYLOSS) -/obj/item/toy/crayon/Initialize() +/obj/item/toy/crayon/Initialize(mapload) . = ..() // Makes crayons identifiable in things like grinders if(name == "crayon") @@ -606,7 +606,7 @@ icon_state = "crayonbox" w_class = WEIGHT_CLASS_SMALL -/obj/item/storage/crayons/Initialize() +/obj/item/storage/crayons/Initialize(mapload) . = ..() var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 7 @@ -701,7 +701,7 @@ return (OXYLOSS) -/obj/item/toy/crayon/spraycan/Initialize() +/obj/item/toy/crayon/spraycan/Initialize(mapload) . = ..() // If default crayon red colour, pick a more fun spraycan colour if(!paint_color) diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 36f68cfdf3..6f56a46a2b 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -33,7 +33,7 @@ /obj/item/defibrillator/get_cell() return cell -/obj/item/defibrillator/Initialize() //starts without a cell for rnd +/obj/item/defibrillator/Initialize(mapload) //starts without a cell for rnd . = ..() if(cell) cell = new cell(src) @@ -287,7 +287,7 @@ var/disarm_shock_time = 10 var/wielded = FALSE // track wielded status on item -/obj/item/shockpaddles/Initialize() +/obj/item/shockpaddles/Initialize(mapload) . = ..() RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield) RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 1a130998b6..a8cd962d7a 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -115,7 +115,7 @@ GLOBAL_LIST_EMPTY(PDAs) if(LAZYLEN(GLOB.pda_reskins)) . += "Ctrl-shift-click it to reskin it." -/obj/item/pda/Initialize() +/obj/item/pda/Initialize(mapload) . = ..() if(fon) set_light(f_lum, f_pow, f_col) diff --git a/code/game/objects/items/devices/PDA/PDA_types.dm b/code/game/objects/items/devices/PDA/PDA_types.dm index 8fcd97c261..e857b7dbd5 100644 --- a/code/game/objects/items/devices/PDA/PDA_types.dm +++ b/code/game/objects/items/devices/PDA/PDA_types.dm @@ -8,7 +8,7 @@ ttone = "honk" var/slipvictims = list() //CIT CHANGE - makes clown PDAs track unique people slipped -/obj/item/pda/clown/Initialize() +/obj/item/pda/clown/Initialize(mapload) . = ..() AddComponent(/datum/component/slippery, 120, NO_SLIP_WHEN_WALKING|SLIP_WHEN_JOGGING, CALLBACK(src, .proc/AfterSlip)) diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index ca72e3371b..34f8202898 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -52,7 +52,7 @@ var/mob/living/simple_animal/bot/active_bot var/list/botlist = list() -/obj/item/cartridge/Initialize() +/obj/item/cartridge/Initialize(mapload) . = ..() var/obj/item/pda/pda = loc if(istype(pda)) @@ -131,7 +131,7 @@ icon_state = "cart-tox" access = CART_REAGENT_SCANNER | CART_ATMOS -/obj/item/cartridge/signal/Initialize() +/obj/item/cartridge/signal/Initialize(mapload) . = ..() radio = new(src) @@ -180,7 +180,7 @@ access = CART_MANIFEST | CART_STATUS_DISPLAY | CART_REAGENT_SCANNER | CART_ATMOS | CART_DRONEPHONE bot_access_flags = FLOOR_BOT | CLEAN_BOT | MED_BOT | FIRE_BOT -/obj/item/cartridge/rd/Initialize() +/obj/item/cartridge/rd/Initialize(mapload) . = ..() radio = new(src) diff --git a/code/game/objects/items/devices/PDA/radio.dm b/code/game/objects/items/devices/PDA/radio.dm index 329631ff9e..39d1a7b522 100644 --- a/code/game/objects/items/devices/PDA/radio.dm +++ b/code/game/objects/items/devices/PDA/radio.dm @@ -15,7 +15,7 @@ radio_connection = null return ..() -/obj/item/integrated_signaler/Initialize() +/obj/item/integrated_signaler/Initialize(mapload) . = ..() if (frequency < MIN_FREE_FREQ || frequency > MAX_FREE_FREQ) frequency = sanitize_frequency(frequency) diff --git a/code/game/objects/items/devices/beacon.dm b/code/game/objects/items/devices/beacon.dm index e868ec07b6..86aa787c3e 100644 --- a/code/game/objects/items/devices/beacon.dm +++ b/code/game/objects/items/devices/beacon.dm @@ -9,11 +9,11 @@ var/enabled = TRUE var/renamed = FALSE -/obj/item/beacon/Initialize() +/obj/item/beacon/Initialize(mapload) . = ..() if (enabled) GLOB.teleportbeacons += src - else + else icon_state = "beacon-off" /obj/item/beacon/Destroy() @@ -25,7 +25,7 @@ if (enabled) icon_state = "beacon" GLOB.teleportbeacons += src - else + else icon_state = "beacon-off" GLOB.teleportbeacons.Remove(src) to_chat(user, "You [enabled ? "enable" : "disable"] the beacon.") @@ -40,5 +40,5 @@ name = new_name renamed = TRUE return - else + else return ..() diff --git a/code/game/objects/items/devices/dogborg_sleeper.dm b/code/game/objects/items/devices/dogborg_sleeper.dm index e7493efadc..73574eda96 100644 --- a/code/game/objects/items/devices/dogborg_sleeper.dm +++ b/code/game/objects/items/devices/dogborg_sleeper.dm @@ -47,7 +47,7 @@ // Bags are prohibited from this due to the potential explotation of objects, same with brought -/obj/item/dogborg/sleeper/Initialize() +/obj/item/dogborg/sleeper/Initialize(mapload) . = ..() update_icon() item_flags |= NOBLUDGEON //No more attack messages diff --git a/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm b/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm index 5dbda8de54..9c06c92108 100644 --- a/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm +++ b/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm @@ -11,7 +11,7 @@ var/static/recycleable_circuits = typecacheof(list(/obj/item/electronics/firelock, /obj/item/electronics/airalarm, /obj/item/electronics/firealarm, \ /obj/item/electronics/apc))//A typecache of circuits consumable for material -/obj/item/electroadaptive_pseudocircuit/Initialize() +/obj/item/electroadaptive_pseudocircuit/Initialize(mapload) . = ..() maptext = "[circuits]" diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index e29519406a..79489c3c51 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -17,7 +17,7 @@ var/flashlight_power = 0.8 //strength of the light when on light_color = "#FFCC66" -/obj/item/flashlight/Initialize() +/obj/item/flashlight/Initialize(mapload) . = ..() if(icon_state == "[initial(icon_state)]-on") on = TRUE @@ -461,7 +461,7 @@ rad_flags = RAD_NO_CONTAMINATE var/fuel = 0 -/obj/item/flashlight/glowstick/Initialize() +/obj/item/flashlight/glowstick/Initialize(mapload) fuel = rand(1000, 1500) light_color = color . = ..() diff --git a/code/game/objects/items/devices/geiger_counter.dm b/code/game/objects/items/devices/geiger_counter.dm index aa54ee6219..4caf9ee0aa 100644 --- a/code/game/objects/items/devices/geiger_counter.dm +++ b/code/game/objects/items/devices/geiger_counter.dm @@ -32,7 +32,7 @@ var/fail_to_receive = 0 var/current_warning = 1 -/obj/item/geiger_counter/Initialize() +/obj/item/geiger_counter/Initialize(mapload) . = ..() START_PROCESSING(SSobj, src) diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index e0453cebc0..e2dc7b0f91 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -11,7 +11,7 @@ var/emp_proof = FALSE var/starton = TRUE -/obj/item/gps/Initialize() +/obj/item/gps/Initialize(mapload) . = ..() AddComponent(/datum/component/gps/item, gpstag, emp_proof, starton) @@ -36,7 +36,7 @@ gpstag = "BORG0" desc = "A mining cyborg internal positioning system. Used as a recovery beacon for damaged cyborg assets, or a collaboration tool for mining teams." -/obj/item/gps/cyborg/Initialize() +/obj/item/gps/cyborg/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CYBORG_ITEM_TRAIT) @@ -75,7 +75,7 @@ for marking the area around the transition edges." var/list/turf/tagged -/obj/item/gps/visible_debug/Initialize() +/obj/item/gps/visible_debug/Initialize(mapload) . = ..() tagged = list() START_PROCESSING(SSfastprocess, src) diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index 1e43f0f883..fbc241c5de 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -45,7 +45,7 @@ throwforce = 10 obj_flags = UNIQUE_RENAME -/obj/item/multitool/chaplain/Initialize() +/obj/item/multitool/chaplain/Initialize(mapload) . = ..() AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, null, null, FALSE) @@ -130,7 +130,7 @@ var/mob/camera/aiEye/remote/ai_detector/eye var/datum/action/item_action/toggle_multitool/toggle_action -/obj/item/multitool/ai_detect/Initialize() +/obj/item/multitool/ai_detect/Initialize(mapload) . = ..() START_PROCESSING(SSobj, src) eye = new /mob/camera/aiEye/remote/ai_detector() diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index d54911528d..845c8a874f 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -15,7 +15,7 @@ user.visible_message("[user] is staring sadly at [src]! [user.p_they()] can't keep living without real human intimacy!") return OXYLOSS -/obj/item/paicard/Initialize() +/obj/item/paicard/Initialize(mapload) SSpai.pai_card_list += src add_overlay("pai-off") AddElement(/datum/element/bed_tuckable, 6, -5, 90) diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index 838b5376c5..140bcc192f 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -28,7 +28,7 @@ GLOBAL_LIST_EMPTY(power_sinks) var/obj/structure/cable/attached // the attached cable -/obj/item/powersink/Initialize() +/obj/item/powersink/Initialize(mapload) . = ..() GLOB.power_sinks += src diff --git a/code/game/objects/items/devices/pressureplates.dm b/code/game/objects/items/devices/pressureplates.dm index 2b5c8d873b..47dcaae60e 100644 --- a/code/game/objects/items/devices/pressureplates.dm +++ b/code/game/objects/items/devices/pressureplates.dm @@ -22,7 +22,7 @@ var/can_trigger = TRUE var/trigger_delay = 10 -/obj/item/pressure_plate/Initialize() +/obj/item/pressure_plate/Initialize(mapload) . = ..() tile_overlay = image(icon = 'icons/turf/floors.dmi', icon_state = "pp_overlay") if(roundstart_signaller) diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm index 2c55bbf8e4..9e802d173c 100644 --- a/code/game/objects/items/devices/radio/electropack.dm +++ b/code/game/objects/items/devices/radio/electropack.dm @@ -20,7 +20,7 @@ user.visible_message("[user] hooks [user.p_them()]self to the electropack and spams the trigger! It looks like [user.p_theyre()] trying to commit suicide!") return (FIRELOSS) -/obj/item/electropack/Initialize() +/obj/item/electropack/Initialize(mapload) . = ..() set_frequency(frequency) diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm index e26b9dd845..9ad75b5d8f 100644 --- a/code/game/objects/items/devices/radio/encryptionkey.dm +++ b/code/game/objects/items/devices/radio/encryptionkey.dm @@ -9,7 +9,7 @@ var/independent = FALSE var/list/channels = list() -/obj/item/encryptionkey/Initialize() +/obj/item/encryptionkey/Initialize(mapload) . = ..() if(!channels.len) desc = "An encryption key for a radio headset. Has no special codes in it. You should probably tell a coder!" diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 6feb8bf663..8403ea30e7 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -58,7 +58,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( if (bowman) AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS)) -/obj/item/radio/headset/Initialize() +/obj/item/radio/headset/Initialize(mapload) . = ..() recalculateChannels() @@ -94,12 +94,12 @@ GLOBAL_LIST_INIT(channel_tokens, list( name = "team leader headset" command = TRUE -/obj/item/radio/headset/syndicate/Initialize() +/obj/item/radio/headset/syndicate/Initialize(mapload) . = ..() make_syndie() /obj/item/radio/headset/binary -/obj/item/radio/headset/binary/Initialize() +/obj/item/radio/headset/binary/Initialize(mapload) . = ..() qdel(keyslot) keyslot = new /obj/item/encryptionkey/binary diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index e81110425c..ce5305f7dc 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -84,7 +84,7 @@ QDEL_NULL(keyslot) return ..() -/obj/item/radio/Initialize() +/obj/item/radio/Initialize(mapload) wires = new /datum/wires/radio(src) if(prison_radio) wires.cut(WIRE_TX) // OH GOD WHY @@ -378,7 +378,7 @@ syndie = 1 keyslot = new /obj/item/encryptionkey/syndicate -/obj/item/radio/borg/syndicate/Initialize() +/obj/item/radio/borg/syndicate/Initialize(mapload) . = ..() set_frequency(FREQ_SYNDICATE) diff --git a/code/game/objects/items/devices/reverse_bear_trap.dm b/code/game/objects/items/devices/reverse_bear_trap.dm index 810f2150e6..48206ba867 100644 --- a/code/game/objects/items/devices/reverse_bear_trap.dm +++ b/code/game/objects/items/devices/reverse_bear_trap.dm @@ -22,7 +22,7 @@ var/datum/looping_sound/reverse_bear_trap/soundloop var/datum/looping_sound/reverse_bear_trap_beep/soundloop2 -/obj/item/reverse_bear_trap/Initialize() +/obj/item/reverse_bear_trap/Initialize(mapload) . = ..() soundloop = new(src) soundloop2 = new(src) diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 11900d8e42..dea3bda144 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -78,7 +78,7 @@ effective or pretty fucking useless. var/ui_x = 320 var/ui_y = 335 -/obj/item/healthanalyzer/rad_laser/Initialize() +/obj/item/healthanalyzer/rad_laser/Initialize(mapload) . = ..() AddComponent(/datum/component/identification/syndicate, ID_COMPONENT_DEL_ON_IDENTIFY, ID_COMPONENT_EFFECT_NO_ACTIONS, ID_COMPONENT_IDENTIFY_WITH_DECONSTRUCTOR) diff --git a/code/game/objects/items/dice.dm b/code/game/objects/items/dice.dm index 53b0860def..91aad761d9 100644 --- a/code/game/objects/items/dice.dm +++ b/code/game/objects/items/dice.dm @@ -50,7 +50,7 @@ var/can_be_rigged = TRUE var/rigged = FALSE -/obj/item/dice/Initialize() +/obj/item/dice/Initialize(mapload) . = ..() result = roll(sides) update_icon() @@ -89,7 +89,7 @@ desc = "A die with six sides. 6 TIMES 255 TIMES 255 TILE TOTAL EXISTENCE, SQUARE YOUR MIND OF EDUCATED STUPID: 2 DOES NOT EXIST." icon_state = "spaced6" -/obj/item/dice/d6/space/Initialize() +/obj/item/dice/d6/space/Initialize(mapload) . = ..() if(prob(10)) name = "spess cube" diff --git a/code/game/objects/items/dualsaber.dm b/code/game/objects/items/dualsaber.dm index 9a6a87bb51..daead8b7d2 100644 --- a/code/game/objects/items/dualsaber.dm +++ b/code/game/objects/items/dualsaber.dm @@ -84,7 +84,7 @@ block_return[BLOCK_RETURN_REDIRECT_METHOD] = REDIRECT_METHOD_DEFLECT . |= BLOCK_SHOULD_REDIRECT -/obj/item/dualsaber/Initialize() +/obj/item/dualsaber/Initialize(mapload) . = ..() RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield) RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield) @@ -94,7 +94,7 @@ AddComponent(/datum/component/two_handed, force_unwielded=3, force_wielded=34, \ wieldsound='sound/weapons/saberon.ogg', unwieldsound='sound/weapons/saberoff.ogg') -/obj/item/dualsaber/Initialize() +/obj/item/dualsaber/Initialize(mapload) . = ..() if(LAZYLEN(possible_colors)) saber_color = pick(possible_colors) diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm index 301b8d4155..372d1a1733 100644 --- a/code/game/objects/items/extinguisher.dm +++ b/code/game/objects/items/extinguisher.dm @@ -53,7 +53,7 @@ power = 7 cooling_power = 3 -/obj/item/extinguisher/Initialize() +/obj/item/extinguisher/Initialize(mapload) . = ..() create_reagents(max_water, AMOUNT_VISIBLE) reagents.add_reagent(chem, max_water) diff --git a/code/game/objects/items/fireaxe.dm b/code/game/objects/items/fireaxe.dm index 6fb7b89262..6250638657 100644 --- a/code/game/objects/items/fireaxe.dm +++ b/code/game/objects/items/fireaxe.dm @@ -21,7 +21,7 @@ bare_wound_bonus = 20 var/wielded = FALSE // track wielded status on item -/obj/item/fireaxe/Initialize() +/obj/item/fireaxe/Initialize(mapload) . = ..() RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield) RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield) diff --git a/code/game/objects/items/fluff.dm b/code/game/objects/items/fluff.dm index 0df8d5b447..1077aab87e 100644 --- a/code/game/objects/items/fluff.dm +++ b/code/game/objects/items/fluff.dm @@ -88,7 +88,7 @@ poly_states = 0 actions_types = list(/datum/action/item_action/squeeze) -/obj/item/toy/fluff/tennis_poly/tri/squeak/Initialize() +/obj/item/toy/fluff/tennis_poly/tri/squeak/Initialize(mapload) . = ..() AddComponent(/datum/component/squeak) @@ -124,7 +124,7 @@ name = "polychromic bone" desc = "A polychromic chew bone. Makes a small squeak when squeezed." -/obj/item/toy/fluff/bone_poly/squeak/Initialize() +/obj/item/toy/fluff/bone_poly/squeak/Initialize(mapload) . = ..() AddComponent(/datum/component/squeak) diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm index c084b90d6f..7227b10298 100644 --- a/code/game/objects/items/granters.dm +++ b/code/game/objects/items/granters.dm @@ -368,7 +368,7 @@ /obj/item/book/granter/spell/random icon_state = "random_book" -/obj/item/book/granter/spell/random/Initialize() +/obj/item/book/granter/spell/random/Initialize(mapload) . = ..() var/static/banned_spells = list(/obj/item/book/granter/spell/mimery_blockade, /obj/item/book/granter/spell/mimery_guns) var/real_type = pick(subtypesof(/obj/item/book/granter/spell) - banned_spells) diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm index 2032758624..3d35f7eb24 100644 --- a/code/game/objects/items/grenades/chem_grenade.dm +++ b/code/game/objects/items/grenades/chem_grenade.dm @@ -20,7 +20,7 @@ var/no_splash = FALSE //If the grenade deletes even if it has no reagents to splash with. Used for slime core reactions. var/casedesc = "This basic model accepts both beakers and bottles. It heats contents by 10°K upon ignition." // Appears when examining empty casings. -/obj/item/grenade/chem_grenade/Initialize() +/obj/item/grenade/chem_grenade/Initialize(mapload) . = ..() create_reagents(1000) stage_change() // If no argument is set, it will change the stage to the current stage, useful for stock grenades that start READY. @@ -326,7 +326,7 @@ desc = "Used for emergency sealing of hull breaches." stage = READY -/obj/item/grenade/chem_grenade/metalfoam/Initialize() +/obj/item/grenade/chem_grenade/metalfoam/Initialize(mapload) . = ..() var/obj/item/reagent_containers/glass/beaker/B1 = new(src) var/obj/item/reagent_containers/glass/beaker/B2 = new(src) @@ -344,7 +344,7 @@ desc = "Used for emergency sealing of hull breaches, while keeping areas accessible." stage = READY -/obj/item/grenade/chem_grenade/smart_metal_foam/Initialize() +/obj/item/grenade/chem_grenade/smart_metal_foam/Initialize(mapload) . = ..() var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src) var/obj/item/reagent_containers/glass/beaker/B2 = new(src) @@ -362,7 +362,7 @@ desc = "Used for clearing rooms of living things." stage = READY -/obj/item/grenade/chem_grenade/incendiary/Initialize() +/obj/item/grenade/chem_grenade/incendiary/Initialize(mapload) . = ..() var/obj/item/reagent_containers/glass/beaker/B1 = new(src) var/obj/item/reagent_containers/glass/beaker/B2 = new(src) @@ -380,7 +380,7 @@ desc = "Used for purging large areas of invasive plant species. Contents under pressure. Do not directly inhale contents." stage = READY -/obj/item/grenade/chem_grenade/antiweed/Initialize() +/obj/item/grenade/chem_grenade/antiweed/Initialize(mapload) . = ..() var/obj/item/reagent_containers/glass/beaker/B1 = new(src) var/obj/item/reagent_containers/glass/beaker/B2 = new(src) @@ -399,7 +399,7 @@ desc = "BLAM!-brand foaming space cleaner. In a special applicator for rapid cleaning of wide areas." stage = READY -/obj/item/grenade/chem_grenade/cleaner/Initialize() +/obj/item/grenade/chem_grenade/cleaner/Initialize(mapload) . = ..() var/obj/item/reagent_containers/glass/beaker/B1 = new(src) var/obj/item/reagent_containers/glass/beaker/B2 = new(src) @@ -417,7 +417,7 @@ desc = "Waffle Co.-brand foaming space cleaner. In a special applicator for rapid cleaning of wide areas." stage = READY -/obj/item/grenade/chem_grenade/ez_clean/Initialize() +/obj/item/grenade/chem_grenade/ez_clean/Initialize(mapload) . = ..() var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src) var/obj/item/reagent_containers/glass/beaker/large/B2 = new(src) @@ -436,7 +436,7 @@ desc = "Used for nonlethal riot control. Contents under pressure. Do not directly inhale contents." stage = READY -/obj/item/grenade/chem_grenade/teargas/Initialize() +/obj/item/grenade/chem_grenade/teargas/Initialize(mapload) . = ..() var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src) var/obj/item/reagent_containers/glass/beaker/large/B2 = new(src) @@ -455,7 +455,7 @@ desc = "Used for melting armoured opponents." stage = READY -/obj/item/grenade/chem_grenade/facid/Initialize() +/obj/item/grenade/chem_grenade/facid/Initialize(mapload) . = ..() var/obj/item/reagent_containers/glass/beaker/bluespace/B1 = new(src) var/obj/item/reagent_containers/glass/beaker/bluespace/B2 = new(src) @@ -475,7 +475,7 @@ desc = "Used for wide scale painting projects." stage = READY -/obj/item/grenade/chem_grenade/colorful/Initialize() +/obj/item/grenade/chem_grenade/colorful/Initialize(mapload) . = ..() var/obj/item/reagent_containers/glass/beaker/B1 = new(src) var/obj/item/reagent_containers/glass/beaker/B2 = new(src) @@ -494,7 +494,7 @@ stage = READY var/glitter_type = /datum/reagent/glitter -/obj/item/grenade/chem_grenade/glitter/Initialize() +/obj/item/grenade/chem_grenade/glitter/Initialize(mapload) . = ..() var/obj/item/reagent_containers/glass/beaker/B1 = new(src) var/obj/item/reagent_containers/glass/beaker/B2 = new(src) @@ -527,7 +527,7 @@ desc = "BURN!-brand foaming clf3. In a special applicator for rapid purging of wide areas." stage = READY -/obj/item/grenade/chem_grenade/clf3/Initialize() +/obj/item/grenade/chem_grenade/clf3/Initialize(mapload) . = ..() var/obj/item/reagent_containers/glass/beaker/bluespace/B1 = new(src) var/obj/item/reagent_containers/glass/beaker/bluespace/B2 = new(src) @@ -545,7 +545,7 @@ desc = "Tiger Cooperative chemical foam grenade. Causes temporary irration, blindness, confusion, mutism, and mutations to carbon based life forms. Contains additional spore toxin." stage = READY -/obj/item/grenade/chem_grenade/bioterrorfoam/Initialize() +/obj/item/grenade/chem_grenade/bioterrorfoam/Initialize(mapload) . = ..() var/obj/item/reagent_containers/glass/beaker/bluespace/B1 = new(src) var/obj/item/reagent_containers/glass/beaker/bluespace/B2 = new(src) @@ -565,7 +565,7 @@ desc = "WARNING: GRENADE WILL RELEASE DEADLY SPORES CONTAINING ACTIVE AGENTS. SEAL SUIT AND AIRFLOW BEFORE USE." stage = READY -/obj/item/grenade/chem_grenade/tuberculosis/Initialize() +/obj/item/grenade/chem_grenade/tuberculosis/Initialize(mapload) . = ..() var/obj/item/reagent_containers/glass/beaker/bluespace/B1 = new(src) var/obj/item/reagent_containers/glass/beaker/bluespace/B2 = new(src) @@ -585,7 +585,7 @@ icon_state = "holy_grenade" stage = READY -/obj/item/grenade/chem_grenade/holy/Initialize() +/obj/item/grenade/chem_grenade/holy/Initialize(mapload) . = ..() var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src) var/obj/item/reagent_containers/glass/beaker/large/B2 = new(src) diff --git a/code/game/objects/items/grenades/ghettobomb.dm b/code/game/objects/items/grenades/ghettobomb.dm index 3553d79faf..f379bf6493 100644 --- a/code/game/objects/items/grenades/ghettobomb.dm +++ b/code/game/objects/items/grenades/ghettobomb.dm @@ -19,7 +19,7 @@ var/range = 3 var/list/times -/obj/item/grenade/iedcasing/Initialize() +/obj/item/grenade/iedcasing/Initialize(mapload) . = ..() add_overlay("improvised_grenade_filled") add_overlay("improvised_grenade_wired") diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm index 23fe128fa8..9c5f1475fd 100644 --- a/code/game/objects/items/grenades/plastic.dm +++ b/code/game/objects/items/grenades/plastic.dm @@ -21,7 +21,7 @@ var/full_damage_on_mobs = FALSE var/can_gib_mobs = FALSE -/obj/item/grenade/plastic/Initialize() +/obj/item/grenade/plastic/Initialize(mapload) . = ..() plastic_overlay = mutable_appearance(icon, "[item_state]2", HIGH_OBJ_LAYER) diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index 60538b479b..4d8f933cc0 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -260,7 +260,7 @@ var/armed = FALSE var/trap_damage = 20 -/obj/item/restraints/legcuffs/beartrap/Initialize() +/obj/item/restraints/legcuffs/beartrap/Initialize(mapload) . = ..() icon_state = "[initial(icon_state)][armed]" diff --git a/code/game/objects/items/his_grace.dm b/code/game/objects/items/his_grace.dm index eafa03ca61..b339b08bd9 100644 --- a/code/game/objects/items/his_grace.dm +++ b/code/game/objects/items/his_grace.dm @@ -25,7 +25,7 @@ var/victims_needed = 10 //Citadel change from 25 to 10 var/ascend_bonus = 15 -/obj/item/his_grace/Initialize() +/obj/item/his_grace/Initialize(mapload) . = ..() START_PROCESSING(SSprocessing, src) GLOB.poi_list += src diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index 1360fb970e..a2255e9c1b 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -229,7 +229,7 @@ var/chaplain_spawnable = TRUE total_mass = TOTAL_MASS_MEDIEVAL_WEAPON -/obj/item/nullrod/Initialize() +/obj/item/nullrod/Initialize(mapload) . = ..() AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, null, null, FALSE) @@ -314,7 +314,7 @@ attack_verb = list("punched", "cross countered", "pummeled") total_mass = TOTAL_MASS_HAND_REPLACEMENT -/obj/item/nullrod/godhand/Initialize() +/obj/item/nullrod/godhand/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT) @@ -455,7 +455,7 @@ sharpness = SHARP_EDGED attack_verb = list("chopped", "sliced", "cut", "reaped") -/obj/item/nullrod/scythe/Initialize() +/obj/item/nullrod/scythe/Initialize(mapload) . = ..() AddComponent(/datum/component/butchering, 70, 110) //the harvest gives a high bonus chance @@ -582,7 +582,7 @@ tool_behaviour = TOOL_SAW toolspeed = 2 -/obj/item/nullrod/chainsaw/Initialize() +/obj/item/nullrod/chainsaw/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT) AddComponent(/datum/component/butchering, 30, 100, 0, hitsound) @@ -662,7 +662,7 @@ bare_wound_bonus = 25 total_mass = TOTAL_MASS_HAND_REPLACEMENT -/obj/item/nullrod/armblade/Initialize() +/obj/item/nullrod/armblade/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT) AddComponent(/datum/component/butchering, 80, 70) @@ -831,7 +831,7 @@ var/praying = FALSE var/deity_name = "Coderbus" //This is the default, hopefully won't actually appear if the religion subsystem is running properly -/obj/item/nullrod/rosary/Initialize() +/obj/item/nullrod/rosary/Initialize(mapload) .=..() if(GLOB.deity) deity_name = GLOB.deity diff --git a/code/game/objects/items/implants/implant_chem.dm b/code/game/objects/items/implants/implant_chem.dm index d148cbbb3c..5f0b4f3fc3 100644 --- a/code/game/objects/items/implants/implant_chem.dm +++ b/code/game/objects/items/implants/implant_chem.dm @@ -21,7 +21,7 @@ Integrity: Implant will last so long as the subject is alive."} return dat -/obj/item/implant/chem/Initialize() +/obj/item/implant/chem/Initialize(mapload) . = ..() create_reagents(50, OPENCONTAINER) GLOB.tracked_chem_implants += src diff --git a/code/game/objects/items/implants/implant_stealth.dm b/code/game/objects/items/implants/implant_stealth.dm index eb58d76d1b..219e4fdd68 100644 --- a/code/game/objects/items/implants/implant_stealth.dm +++ b/code/game/objects/items/implants/implant_stealth.dm @@ -16,7 +16,7 @@ animate(src, , alpha = 0, time = 5) START_PROCESSING(SSobj, src) -/obj/structure/closet/cardboard/agent/Initialize() +/obj/structure/closet/cardboard/agent/Initialize(mapload) . = ..() go_invisible() diff --git a/code/game/objects/items/implants/implant_track.dm b/code/game/objects/items/implants/implant_track.dm index 2fa0244831..b2678baddf 100644 --- a/code/game/objects/items/implants/implant_track.dm +++ b/code/game/objects/items/implants/implant_track.dm @@ -11,11 +11,11 @@ var/lifespan = 5 MINUTES //how many deciseconds does the implant last? allow_teleport = FALSE -/obj/item/implant/tracking/c38/Initialize() +/obj/item/implant/tracking/c38/Initialize(mapload) . = ..() QDEL_IN(src, lifespan) -/obj/item/implant/tracking/Initialize() +/obj/item/implant/tracking/Initialize(mapload) . = ..() GLOB.tracked_implants += src diff --git a/code/game/objects/items/implants/implantchair.dm b/code/game/objects/items/implants/implantchair.dm index e32acd105e..8777a9f5e0 100644 --- a/code/game/objects/items/implants/implantchair.dm +++ b/code/game/objects/items/implants/implantchair.dm @@ -21,7 +21,7 @@ var/message_cooldown var/breakout_time = 600 -/obj/machinery/implantchair/Initialize() +/obj/machinery/implantchair/Initialize(mapload) . = ..() open_machine() update_icon() diff --git a/code/game/objects/items/inducer.dm b/code/game/objects/items/inducer.dm index a5913c308d..f7a614050e 100644 --- a/code/game/objects/items/inducer.dm +++ b/code/game/objects/items/inducer.dm @@ -14,7 +14,7 @@ var/recharging = FALSE var/gun_charger = FALSE -/obj/item/inducer/Initialize() +/obj/item/inducer/Initialize(mapload) . = ..() if(!cell && cell_type) cell = new cell_type @@ -180,7 +180,7 @@ powertransfer = 500 opened = TRUE -/obj/item/inducer/sci/Initialize() +/obj/item/inducer/sci/Initialize(mapload) . = ..() update_icon() @@ -199,11 +199,11 @@ cell_type = null opened = TRUE -/obj/item/inducer/sci/combat/dry/Initialize() //Just in case +/obj/item/inducer/sci/combat/dry/Initialize(mapload) //Just in case . = ..() update_icon() -/obj/item/inducer/sci/combat/Initialize() +/obj/item/inducer/sci/combat/Initialize(mapload) . = ..() update_icon() diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm index 5a16c24b8e..038d16321c 100644 --- a/code/game/objects/items/kitchen.dm +++ b/code/game/objects/items/kitchen.dm @@ -84,7 +84,7 @@ bare_wound_bonus = 10 custom_price = PRICE_NORMAL -/obj/item/kitchen/knife/Initialize() +/obj/item/kitchen/knife/Initialize(mapload) . = ..() AddComponent(/datum/component/butchering, 80 - force, 100, force - 10) //bonus chance increases depending on force @@ -120,7 +120,7 @@ bare_wound_bonus = 10 custom_price = PRICE_NORMAL -/obj/item/kitchen/efink/Initialize() +/obj/item/kitchen/efink/Initialize(mapload) . = ..() AddComponent(/datum/component/butchering, 80 - force, 100, force - 10) //bonus chance increases depending on force @@ -209,7 +209,7 @@ var/light_on = FALSE var/brightness_on = 7 -/obj/item/kitchen/knife/combat/survival/knuckledagger/Initialize() +/obj/item/kitchen/knife/combat/survival/knuckledagger/Initialize(mapload) . = ..() AddComponent(/datum/component/butchering, 30, 130, 20) // it's good for butchering stuff @@ -322,6 +322,6 @@ desc = "A knife used to cleanly butcher. Its razor-sharp edge has been honed for butchering, but has been poorly maintained over the years." attack_verb = list("cleaved", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") -/obj/item/kitchen/knife/scimitar/Initialize() +/obj/item/kitchen/knife/scimitar/Initialize(mapload) . = ..() AddComponent(/datum/component/butchering, 90 - force, 100, force - 60) //bonus chance increases depending on force diff --git a/code/game/objects/items/manuals.dm b/code/game/objects/items/manuals.dm index 05b7ef4802..ed8ec80bf0 100644 --- a/code/game/objects/items/manuals.dm +++ b/code/game/objects/items/manuals.dm @@ -336,7 +336,7 @@ title = "Outdated Chemistry Textbook" page_link = "Guide_to_chemistry" -/obj/item/book/manual/wiki/chemistry/Initialize() +/obj/item/book/manual/wiki/chemistry/Initialize(mapload) . = ..() new /obj/item/book/manual/wiki/cit/chemistry(loc) new /obj/item/book/manual/wiki/cit/chem_recipies(loc) diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index dd176f6d54..1973f95499 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -8,7 +8,7 @@ var/sword_color total_mass = 0.4 //Survival flashlights typically weigh around 5 ounces. -/obj/item/melee/transforming/energy/Initialize() +/obj/item/melee/transforming/energy/Initialize(mapload) . = ..() total_mass_on = (total_mass_on ? total_mass_on : (w_class_on * 0.75)) if(active) @@ -331,7 +331,7 @@ sharpness = SHARP_EDGED //Most of the other special functions are handled in their own files. aka special snowflake code so kewl -/obj/item/melee/transforming/energy/blade/Initialize() +/obj/item/melee/transforming/energy/blade/Initialize(mapload) . = ..() spark_system = new /datum/effect_system/spark_spread() spark_system.set_up(5, 0, src) @@ -371,7 +371,7 @@ light_color = "#37FFF7" actions_types = list() -/obj/item/melee/transforming/energy/sword/cx/Initialize() +/obj/item/melee/transforming/energy/sword/cx/Initialize(mapload) icon_state_on = icon_state return ..() diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 29593cae06..a9dfcb00e6 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -46,7 +46,7 @@ sharpness = SHARP_EDGED total_mass = TOTAL_MASS_HAND_REPLACEMENT -/obj/item/melee/synthetic_arm_blade/Initialize() +/obj/item/melee/synthetic_arm_blade/Initialize(mapload) . = ..() AddComponent(/datum/component/butchering, 60, 80) //very imprecise @@ -84,7 +84,7 @@ parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK parry_automatic_enabled = TRUE -/obj/item/melee/sabre/Initialize() +/obj/item/melee/sabre/Initialize(mapload) . = ..() AddComponent(/datum/component/butchering, 30, 95, 5) //fast and effective, but as a sword, it might damage the results. AddElement(/datum/element/sword_point) @@ -208,7 +208,7 @@ . |= BLOCK_SHOULD_REDIRECT return_list[BLOCK_RETURN_REDIRECT_METHOD] = REDIRECT_METHOD_DEFLECT -/obj/item/melee/rapier/Initialize() +/obj/item/melee/rapier/Initialize(mapload) . = ..() AddComponent(/datum/component/butchering, 20, 65, 0) @@ -277,7 +277,7 @@ wound_bonus = 15 -/obj/item/melee/classic_baton/Initialize() +/obj/item/melee/classic_baton/Initialize(mapload) . = ..() if(sword_point) AddElement(/datum/element/sword_point) @@ -518,7 +518,7 @@ var/balanced = 1 force_string = "INFINITE" -/obj/item/melee/supermatter_sword/Initialize() +/obj/item/melee/supermatter_sword/Initialize(mapload) . = ..() shard = new /obj/machinery/power/supermatter_crystal(src) qdel(shard.countdown) @@ -625,7 +625,7 @@ var/datum/beam/beam total_mass = 2.5 -/obj/item/melee/roastingstick/Initialize() +/obj/item/melee/roastingstick/Initialize(mapload) . = ..() if (!ovens) ovens = typecacheof(list(/obj/singularity, /obj/machinery/power/supermatter_crystal, /obj/structure/bonfire, /obj/structure/destructible/clockwork/massive/ratvar)) @@ -741,7 +741,7 @@ var/overlay_state = "mace_handle" var/mutable_appearance/overlay -/obj/item/melee/cleric_mace/Initialize() +/obj/item/melee/cleric_mace/Initialize(mapload) . = ..() overlay = mutable_appearance(icon, overlay_state) overlay.appearance_flags = RESET_COLOR diff --git a/code/game/objects/items/melee/transforming.dm b/code/game/objects/items/melee/transforming.dm index 8c44a15cd4..82b19a1357 100644 --- a/code/game/objects/items/melee/transforming.dm +++ b/code/game/objects/items/melee/transforming.dm @@ -15,7 +15,7 @@ var/clumsy_check = TRUE var/total_mass_on //Total mass in ounces when transformed. Primarily for balance purposes. Don't think about it too hard. -/obj/item/melee/transforming/Initialize() +/obj/item/melee/transforming/Initialize(mapload) . = ..() if(active) if(attack_verb_on.len) diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm index 78fe1a896e..648a38437c 100644 --- a/code/game/objects/items/pet_carrier.dm +++ b/code/game/objects/items/pet_carrier.dm @@ -253,7 +253,7 @@ ///chem transfer rate / second var/transfer_rate = 5 -/obj/item/pet_carrier/bluespace/Initialize() +/obj/item/pet_carrier/bluespace/Initialize(mapload) . = ..() create_reagents(300, OPENCONTAINER, DEFAULT_REAGENTS_VALUE) //equivalent of bsbeakers diff --git a/code/game/objects/items/pinpointer.dm b/code/game/objects/items/pinpointer.dm index 22ffc33516..d1ceb36b6d 100644 --- a/code/game/objects/items/pinpointer.dm +++ b/code/game/objects/items/pinpointer.dm @@ -22,7 +22,7 @@ /// resets target on toggle var/resets_target = TRUE -/obj/item/pinpointer/Initialize() +/obj/item/pinpointer/Initialize(mapload) . = ..() GLOB.pinpointer_list += src diff --git a/code/game/objects/items/pitchfork.dm b/code/game/objects/items/pitchfork.dm index b296e2d0cb..afec6cfddf 100644 --- a/code/game/objects/items/pitchfork.dm +++ b/code/game/objects/items/pitchfork.dm @@ -15,7 +15,7 @@ resistance_flags = FIRE_PROOF var/wielded = FALSE // track wielded status on item -/obj/item/pitchfork/Initialize() +/obj/item/pitchfork/Initialize(mapload) . = ..() RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield) RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield) @@ -42,7 +42,7 @@ force = 19 throwforce = 24 -/obj/item/pitchfork/demonic/Initialize() +/obj/item/pitchfork/demonic/Initialize(mapload) . = ..() set_light(3,6,LIGHT_COLOR_RED) diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index 683232b540..e60871dec7 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -466,7 +466,7 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths()) desc = "Something fucked up" can_random_spawn = FALSE -/obj/item/toy/plush/random/Initialize() +/obj/item/toy/plush/random/Initialize(mapload) ..() var/newtype var/list/snowflake_list = CONFIG_GET(keyed_list/snowflake_plushies) diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm index 42e345b502..8d47fbdc6d 100644 --- a/code/game/objects/items/pneumaticCannon.dm +++ b/code/game/objects/items/pneumaticCannon.dm @@ -35,7 +35,7 @@ trigger_guard = TRIGGER_GUARD_NORMAL -/obj/item/pneumatic_cannon/Initialize() +/obj/item/pneumatic_cannon/Initialize(mapload) . = ..() if(selfcharge) init_charge() @@ -292,7 +292,7 @@ clumsyCheck = FALSE var/static/list/pie_typecache = typecacheof(/obj/item/reagent_containers/food/snacks/pie) -/obj/item/pneumatic_cannon/pie/Initialize() +/obj/item/pneumatic_cannon/pie/Initialize(mapload) . = ..() allowed_typecache = pie_typecache diff --git a/code/game/objects/items/religion.dm b/code/game/objects/items/religion.dm index b8f0d161dc..f9918bdd39 100644 --- a/code/game/objects/items/religion.dm +++ b/code/game/objects/items/religion.dm @@ -165,7 +165,7 @@ desc = "It's a backpack with lots of extra room. A banner with Nanotrasen's logo is attached, that can't be removed." icon_state = "bannerpack" -/obj/item/storage/backpack/bannerpack/Initialize() +/obj/item/storage/backpack/bannerpack/Initialize(mapload) . = ..() var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_combined_w_class = 27 //6 more then normal, for the tradeoff of declaring yourself an antag at all times. diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index cbfdc85f6d..2cc65ab261 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -564,7 +564,7 @@ energy = 50000 energy_recharge = 5000 -/obj/item/borg/projectile_dampen/Initialize() +/obj/item/borg/projectile_dampen/Initialize(mapload) . = ..() projectile_effect = image('icons/effects/fields.dmi', "projectile_dampen_effect") tracked = list() diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm index 36559d14be..360c129906 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -366,7 +366,7 @@ item_state = "flashshield" var/obj/item/assembly/flash/handheld/embedded_flash -/obj/item/shield/riot/flash/Initialize() +/obj/item/shield/riot/flash/Initialize(mapload) . = ..() embedded_flash = new(src) @@ -561,7 +561,7 @@ var/active = 0 var/clumsy_check = TRUE -/obj/item/shield/energy/Initialize() +/obj/item/shield/energy/Initialize(mapload) . = ..() icon_state = "[base_icon_state]0" diff --git a/code/game/objects/items/singularityhammer.dm b/code/game/objects/items/singularityhammer.dm index e58dbc23ce..d1d6ee9704 100644 --- a/code/game/objects/items/singularityhammer.dm +++ b/code/game/objects/items/singularityhammer.dm @@ -97,7 +97,7 @@ total_mass = TOTAL_MASS_MEDIEVAL_WEAPON var/wielded = FALSE // track wielded status on item -/obj/item/mjollnir/Initialize() +/obj/item/mjollnir/Initialize(mapload) . = ..() RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield) RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield) diff --git a/code/game/objects/items/spear.dm b/code/game/objects/items/spear.dm index f40c774551..552f0869b3 100644 --- a/code/game/objects/items/spear.dm +++ b/code/game/objects/items/spear.dm @@ -25,7 +25,7 @@ wound_bonus = -15 bare_wound_bonus = 15 -/obj/item/spear/Initialize() +/obj/item/spear/Initialize(mapload) . = ..() RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield) RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield) diff --git a/code/game/objects/items/stacks/bscrystal.dm b/code/game/objects/items/stacks/bscrystal.dm index 3b4be37cee..125065c83e 100644 --- a/code/game/objects/items/stacks/bscrystal.dm +++ b/code/game/objects/items/stacks/bscrystal.dm @@ -18,7 +18,7 @@ points = 0 refined_type = null -/obj/item/stack/ore/bluespace_crystal/Initialize() +/obj/item/stack/ore/bluespace_crystal/Initialize(mapload) . = ..() pixel_x = rand(-5, 5) pixel_y = rand(-5, 5) diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 0bd3083a59..15bd521834 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -342,7 +342,7 @@ /obj/item/stack/medical/mesh/advanced/one amount = 1 -/obj/item/stack/medical/mesh/Initialize() +/obj/item/stack/medical/mesh/Initialize(mapload) . = ..() if(amount == max_amount) //only seal full mesh packs is_open = FALSE @@ -490,7 +490,7 @@ /obj/item/stack/medical/nanogel/one amount = 1 - + /obj/item/stack/medical/nanogel/try_heal(mob/living/M, mob/user, silent = FALSE) if(being_applied) to_chat(user, "You are already applying [src]!") diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 1f19821df6..3b2bfb1420 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -303,7 +303,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( return (BRUTELOSS) -/obj/item/shard/Initialize() +/obj/item/shard/Initialize(mapload) . = ..() AddComponent(/datum/component/caltrop, force) AddComponent(/datum/component/butchering, 150, 65) diff --git a/code/game/objects/items/storage/_storage.dm b/code/game/objects/items/storage/_storage.dm index 04362481b2..cbaa1775eb 100644 --- a/code/game/objects/items/storage/_storage.dm +++ b/code/game/objects/items/storage/_storage.dm @@ -8,7 +8,7 @@ /obj/item/storage/get_dumping_location(obj/item/storage/source,mob/user) return src -/obj/item/storage/Initialize() +/obj/item/storage/Initialize(mapload) . = ..() PopulateContents() diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index b6520f6bb5..a172ec2dd4 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -283,7 +283,7 @@ level = 1 component_type = /datum/component/storage/concrete/secret_satchel -/obj/item/storage/backpack/satchel/flat/Initialize() +/obj/item/storage/backpack/satchel/flat/Initialize(mapload) . = ..() SSpersistence.new_secret_satchels += src @@ -316,7 +316,7 @@ var/list/reward_all_of_these = list() //use paths! var/revealed = FALSE -/obj/item/storage/backpack/satchel/flat/secret/Initialize() +/obj/item/storage/backpack/satchel/flat/secret/Initialize(mapload) . = ..() if(isfloorturf(loc) && !isplatingturf(loc)) diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index e30ec783bf..cc54de09a6 100755 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -28,7 +28,7 @@ for(var/obj/item/I in contents) . += I.get_worn_belt_overlay(icon_file) -/obj/item/storage/belt/Initialize() +/obj/item/storage/belt/Initialize(mapload) . = ..() update_icon() @@ -366,7 +366,7 @@ /obj/item/storage/belt/military/snack name = "tactical snack rig" -/obj/item/storage/belt/military/snack/Initialize() +/obj/item/storage/belt/military/snack/Initialize(mapload) . = ..() var/sponsor = pick("DonkCo", "Waffle Co.", "Roffle Co.", "Gorlax Marauders", "Tiger Cooperative") desc = "A set of snack-tical webbing worn by athletes of the [sponsor] VR sports division." diff --git a/code/game/objects/items/storage/book.dm b/code/game/objects/items/storage/book.dm index 1a3b40d1da..3a8f5a5cc8 100644 --- a/code/game/objects/items/storage/book.dm +++ b/code/game/objects/items/storage/book.dm @@ -39,7 +39,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible", var/deity_name = "Christ" force_string = "holy" -/obj/item/storage/book/bible/Initialize() +/obj/item/storage/book/bible/Initialize(mapload) . = ..() AddComponent(/datum/component/anti_magic, FALSE, TRUE) diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index df439e98f1..a245c059ae 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -956,7 +956,7 @@ illustration = "fruit" var/theme_name -/obj/item/storage/box/ingredients/Initialize() +/obj/item/storage/box/ingredients/Initialize(mapload) . = ..() if(theme_name) name = "[name] ([theme_name])" @@ -1279,7 +1279,7 @@ var/expiration_date_min = 2300 var/expiration_date_max = 2700 -/obj/item/storage/box/mre/Initialize() +/obj/item/storage/box/mre/Initialize(mapload) . = ..() if(can_expire) expiration_date = rand(expiration_date_min, expiration_date_max) diff --git a/code/game/objects/items/storage/lockbox.dm b/code/game/objects/items/storage/lockbox.dm index ce4e8b9df1..adfd3cc1bd 100644 --- a/code/game/objects/items/storage/lockbox.dm +++ b/code/game/objects/items/storage/lockbox.dm @@ -217,7 +217,7 @@ var/datum/bank_account/buyer_account var/privacy_lock = TRUE -/obj/item/storage/lockbox/order/Initialize(datum/bank_account/_buyer_account) +/obj/item/storage/lockbox/order/Initialize(mapload, datum/bank_account/_buyer_account) . = ..() buyer_account = _buyer_account diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm index 869711e5b2..00b1d92659 100644 --- a/code/game/objects/items/storage/toolbox.dm +++ b/code/game/objects/items/storage/toolbox.dm @@ -400,7 +400,7 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons) attack_verb = list("robusted", "bounced") can_rubberify = FALSE //we are already the future. -/obj/item/storage/toolbox/rubber/Initialize() +/obj/item/storage/toolbox/rubber/Initialize(mapload) icon_state = pick("blue", "red", "yellow", "green") item_state = "toolbox_[icon_state]" if(!GLOB.rubber_toolbox_icons[icon_state]) diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index f25f6f3a51..f4b5e26189 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -447,7 +447,7 @@ /obj/item/paper/contractor_guide name = "Contractor Guide" -/obj/item/paper/contractor_guide/Initialize() +/obj/item/paper/contractor_guide/Initialize(mapload) info = {"

Welcome agent, congratulations on your new position as contractor. On top of your already assigned objectives, this kit will provide you contracts to take on for TC payments.

Provided within, we give your specialist contractor space suit. It's even more compact, being able to fit into a pocket, and faster than the diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index 6db1e4baae..c98b9c40fe 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -333,7 +333,7 @@ status_duration = 3 //Slows someone for a tiny bit var/obj/item/assembly/igniter/sparkler -/obj/item/melee/baton/cattleprod/Initialize() +/obj/item/melee/baton/cattleprod/Initialize(mapload) . = ..() sparkler = new (src) sparkler.activate_cooldown = 7 //Helps visualize the knockdown diff --git a/code/game/objects/items/summon.dm b/code/game/objects/items/summon.dm index 93846d10ab..ca678e2cbb 100644 --- a/code/game/objects/items/summon.dm +++ b/code/game/objects/items/summon.dm @@ -29,7 +29,7 @@ /// are we a ranged weapon? var/melee_only = TRUE -/obj/item/summon/Initialize() +/obj/item/summon/Initialize(mapload) . = ..() if(host_type) host = new host_type(src, summon_count, range) diff --git a/code/game/objects/items/tanks/jetpack.dm b/code/game/objects/items/tanks/jetpack.dm index 75ad909777..06c38ead9f 100644 --- a/code/game/objects/items/tanks/jetpack.dm +++ b/code/game/objects/items/tanks/jetpack.dm @@ -14,7 +14,7 @@ var/full_speed = TRUE // If the jetpack will have a speedboost in space/nograv or not var/datum/effect_system/trail_follow/ion/ion_trail -/obj/item/tank/jetpack/Initialize() +/obj/item/tank/jetpack/Initialize(mapload) . = ..() ion_trail = new ion_trail.set_up(src) @@ -181,7 +181,7 @@ var/obj/item/tank/internals/tank = null var/mob/living/carbon/human/cur_user -/obj/item/tank/jetpack/suit/Initialize() +/obj/item/tank/jetpack/suit/Initialize(mapload) . = ..() STOP_PROCESSING(SSobj, src) temp_air_contents = air_contents diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index ef798ae631..4d7969e2d7 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -64,7 +64,7 @@ H.update_action_buttons_icon() -/obj/item/tank/Initialize() +/obj/item/tank/Initialize(mapload) . = ..() air_contents = new(volume) //liters diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index 88131fb197..7d05944949 100644 --- a/code/game/objects/items/tanks/watertank.dm +++ b/code/game/objects/items/tanks/watertank.dm @@ -16,7 +16,7 @@ var/obj/item/noz var/volume = 500 -/obj/item/watertank/Initialize() +/obj/item/watertank/Initialize(mapload) . = ..() create_reagents(volume, OPENCONTAINER) noz = make_noz() @@ -117,7 +117,7 @@ var/obj/item/watertank/tank -/obj/item/reagent_containers/spray/mister/Initialize() +/obj/item/reagent_containers/spray/mister/Initialize(mapload) . = ..() tank = loc if(!istype(tank)) @@ -147,7 +147,7 @@ item_state = "waterbackpackjani" custom_price = PRICE_ALMOST_ONE_GRAND -/obj/item/watertank/janitor/Initialize() +/obj/item/watertank/janitor/Initialize(mapload) . = ..() reagents.add_reagent(/datum/reagent/space_cleaner, 500) @@ -183,7 +183,7 @@ volume = 200 slowdown = 0 -/obj/item/watertank/atmos/Initialize() +/obj/item/watertank/atmos/Initialize(mapload) . = ..() reagents.add_reagent(/datum/reagent/water, 200) @@ -219,7 +219,7 @@ var/metal_synthesis_cooldown = 0 var/resin_cooldown = 0 -/obj/item/extinguisher/mini/nozzle/Initialize() +/obj/item/extinguisher/mini/nozzle/Initialize(mapload) . = ..() tank = loc if (!istype(tank)) @@ -440,7 +440,7 @@ volume = 2000 slowdown = 0 -/obj/item/watertank/op/Initialize() +/obj/item/watertank/op/Initialize(mapload) . = ..() reagents.add_reagent(/datum/reagent/toxin/mutagen,350) reagents.add_reagent(/datum/reagent/napalm,125) diff --git a/code/game/objects/items/teleportation.dm b/code/game/objects/items/teleportation.dm index bc6a40f8c0..2b2a1cf936 100644 --- a/code/game/objects/items/teleportation.dm +++ b/code/game/objects/items/teleportation.dm @@ -113,7 +113,7 @@ var/max_portal_pairs = 3 var/atmos_link_override -/obj/item/hand_tele/Initialize() +/obj/item/hand_tele/Initialize(mapload) . = ..() active_portal_pairs = list() diff --git a/code/game/objects/items/theft_tools.dm b/code/game/objects/items/theft_tools.dm index 08390e1607..b40c5c22cf 100644 --- a/code/game/objects/items/theft_tools.dm +++ b/code/game/objects/items/theft_tools.dm @@ -15,7 +15,7 @@ var/cooldown = 0 var/pulseicon = "plutonium_core_pulse" -/obj/item/nuke_core/Initialize() +/obj/item/nuke_core/Initialize(mapload) . = ..() START_PROCESSING(SSobj, src) @@ -229,7 +229,7 @@ usesound = 'sound/weapons/bladeslice.ogg' var/usesLeft -/obj/item/scalpel/supermatter/Initialize() +/obj/item/scalpel/supermatter/Initialize(mapload) . = ..() usesLeft = rand(2, 4) diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm index 9f393a7fcb..f5f25058de 100644 --- a/code/game/objects/items/tools/screwdriver.dm +++ b/code/game/objects/items/tools/screwdriver.dm @@ -39,7 +39,7 @@ user.visible_message("[user] is stabbing [src] into [user.p_their()] [pick("temple", "heart")]! It looks like [user.p_theyre()] trying to commit suicide!") return(BRUTELOSS) -/obj/item/screwdriver/Initialize() +/obj/item/screwdriver/Initialize(mapload) . = ..() if(random_color) //random colors! icon_state = "screwdriver" diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index 6e7ad99221..6818fbb433 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -41,7 +41,7 @@ wound_bonus = 0 bare_wound_bonus = 5 -/obj/item/weldingtool/Initialize() +/obj/item/weldingtool/Initialize(mapload) . = ..() create_reagents(max_fuel) reagents.add_reagent(/datum/reagent/fuel, max_fuel) diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm index cbca26e63c..b521cf165b 100644 --- a/code/game/objects/items/tools/wirecutters.dm +++ b/code/game/objects/items/tools/wirecutters.dm @@ -33,7 +33,7 @@ ) -/obj/item/wirecutters/Initialize() +/obj/item/wirecutters/Initialize(mapload) . = ..() if(random_color) //random colors! icon_state = "cutters" diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 547217366b..e6600d323e 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -44,7 +44,7 @@ item_state = "balloon-empty" -/obj/item/toy/balloon/Initialize() +/obj/item/toy/balloon/Initialize(mapload) . = ..() create_reagents(10) @@ -781,7 +781,7 @@ var/list/cards = list() var/original_size = 52 -/obj/item/toy/cards/deck/Initialize() +/obj/item/toy/cards/deck/Initialize(mapload) . = ..() populate_deck() @@ -1549,7 +1549,7 @@ icon_state = "shell1" var/static/list/possible_colors = list("" = 2, COLOR_PURPLE_GRAY = 1, COLOR_OLIVE = 1, COLOR_PALE_BLUE_GRAY = 1, COLOR_RED_GRAY = 1) -/obj/item/toy/seashell/Initialize() +/obj/item/toy/seashell/Initialize(mapload) . = ..() pixel_x = rand(-5, 5) pixel_y = rand(-5, 5) diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index 1816f26843..857f3d8f4a 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -7,7 +7,7 @@ w_class = WEIGHT_CLASS_TINY resistance_flags = FLAMMABLE -/obj/item/trash/Initialize() +/obj/item/trash/Initialize(mapload) . = ..() AddElement(/datum/element/trash) diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index b00d736282..59fa523ae0 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -71,7 +71,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 resistance_flags = FIRE_PROOF total_mass = TOTAL_MASS_MEDIEVAL_WEAPON -/obj/item/claymore/Initialize() +/obj/item/claymore/Initialize(mapload) . = ..() AddComponent(/datum/component/butchering, 40, 105) AddElement(/datum/element/sword_point) @@ -97,7 +97,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 var/notches = 0 //HOW MANY PEOPLE HAVE BEEN SLAIN WITH THIS BLADE var/obj/item/disk/nuclear/nuke_disk //OUR STORED NUKE DISK -/obj/item/claymore/highlander/Initialize() +/obj/item/claymore/highlander/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, HIGHLANDER) START_PROCESSING(SSobj, src) @@ -223,7 +223,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 icon_state = "claymore_cyborg" var/mob/living/silicon/robot/robot -/obj/item/claymore/highlander/robot/Initialize() +/obj/item/claymore/highlander/robot/Initialize(mapload) var/obj/item/robot_module/kiltkit = loc robot = kiltkit.loc if(!istype(robot)) @@ -262,7 +262,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/katana/cursed slot_flags = null -/obj/item/katana/cursed/Initialize() +/obj/item/katana/cursed/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CURSED_ITEM_TRAIT) @@ -369,7 +369,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /datum/block_parry_data/bokken/quick_parry/proj parry_efficiency_perfect_override = list() -/obj/item/melee/bokken/Initialize() +/obj/item/melee/bokken/Initialize(mapload) . = ..() AddElement(/datum/element/sword_point) if(!harm) //if initialised in non-harm mode, setup force accordingly @@ -793,7 +793,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 tool_behaviour = TOOL_SAW toolspeed = 1 -/obj/item/mounted_chainsaw/Initialize() +/obj/item/mounted_chainsaw/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT) @@ -821,7 +821,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 attack_verb = list("busted") var/impressiveness = 45 -/obj/item/statuebust/Initialize() +/obj/item/statuebust/Initialize(mapload) . = ..() AddElement(/datum/element/art, impressiveness) // AddComponent(/datum/component/beauty, 1000) @@ -928,7 +928,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 var/throwforce_off // Damage when off var/weight_class_on // What is the new size class when turned on -/obj/item/melee/baseball_bat/Initialize() +/obj/item/melee/baseball_bat/Initialize(mapload) . = ..() if(prob(1)) name = "cricket bat" @@ -946,7 +946,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 total_mass = TOTAL_MASS_MEDIEVAL_WEAPON wound_bonus = -5 -/obj/item/melee/baseball_bat/chaplain/Initialize() +/obj/item/melee/baseball_bat/chaplain/Initialize(mapload) . = ..() AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, null, null, FALSE) @@ -1076,7 +1076,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 //Things in this list will be instantly splatted. Flyman weakness is handled in the flyman species weakness proc. var/list/strong_against -/obj/item/melee/flyswatter/Initialize() +/obj/item/melee/flyswatter/Initialize(mapload) . = ..() strong_against = typecacheof(list( /mob/living/simple_animal/hostile/poison/bees/, @@ -1108,7 +1108,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 item_flags = DROPDEL | ABSTRACT | HAND_ITEM attack_verb = list("bopped") -/obj/item/circlegame/Initialize() +/obj/item/circlegame/Initialize(mapload) . = ..() var/mob/living/owner = loc if(!istype(owner)) @@ -1398,7 +1398,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 hitsound = 'sound/weapons/bladeslice.ogg' var/wielded = FALSE // track wielded status on item -/obj/item/vibro_weapon/Initialize() +/obj/item/vibro_weapon/Initialize(mapload) . = ..() RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield) RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index cf256dd6fc..00b0df26a8 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -48,7 +48,7 @@ return FALSE return ..() -/obj/Initialize() +/obj/Initialize(mapload) if (islist(armor)) armor = getArmor(arglist(armor)) else if (!armor) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 52036427c8..21081be990 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -14,7 +14,7 @@ //flags_ricochet = RICOCHET_HARD //ricochet_chance_mod = 0.5 -/obj/structure/Initialize() +/obj/structure/Initialize(mapload) if (!armor) armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) . = ..() @@ -114,4 +114,4 @@ return "It's falling apart!" /obj/structure/rust_heretic_act() - take_damage(500, BRUTE, "melee", 1) + take_damage(500, BRUTE, "melee", 1) diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm index 339c2773e5..85ee3f9f56 100644 --- a/code/game/objects/structures/ai_core.dm +++ b/code/game/objects/structures/ai_core.dm @@ -12,7 +12,7 @@ var/obj/item/mmi/brain = null var/can_deconstruct = TRUE -/obj/structure/AIcore/Initialize() +/obj/structure/AIcore/Initialize(mapload) . = ..() laws = new laws.set_laws_config() @@ -67,7 +67,7 @@ return return ..() -/obj/structure/AIcore/latejoin_inactive/Initialize() +/obj/structure/AIcore/latejoin_inactive/Initialize(mapload) . = ..() GLOB.latejoin_ai_cores += src diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index bc7ce8c36e..95db221278 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -125,7 +125,7 @@ var/growth_cooldown_high = 200 var/static/list/blacklisted_turfs -/obj/structure/alien/weeds/Initialize() +/obj/structure/alien/weeds/Initialize(mapload) pixel_x = -4 pixel_y = -4 //so the sprites line up right in the map editor . = ..() @@ -177,7 +177,7 @@ var/lon_range = 4 var/node_range = NODERANGE -/obj/structure/alien/weeds/node/Initialize() +/obj/structure/alien/weeds/node/Initialize(mapload) icon = 'icons/obj/smooth_structures/alien/weednode.dmi' . = ..() set_light(lon_range) diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm index b751724313..7592385abf 100644 --- a/code/game/objects/structures/artstuff.dm +++ b/code/game/objects/structures/artstuff.dm @@ -62,7 +62,7 @@ pixel_x = 10 pixel_y = 9 -/obj/item/canvas/Initialize() +/obj/item/canvas/Initialize(mapload) . = ..() reset_grid() diff --git a/code/game/objects/structures/barsigns.dm b/code/game/objects/structures/barsigns.dm index a96d39316e..3c9f80b804 100644 --- a/code/game/objects/structures/barsigns.dm +++ b/code/game/objects/structures/barsigns.dm @@ -11,7 +11,7 @@ var/list/barsigns=list() var/panel_open = FALSE -/obj/structure/sign/barsign/Initialize() +/obj/structure/sign/barsign/Initialize(mapload) . = ..() //filling the barsigns list diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index 89f018f291..9d14757897 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -21,7 +21,7 @@ if(!has_buckled_mobs()) . += "Drag your sprite to sit in it." -/obj/structure/chair/Initialize() +/obj/structure/chair/Initialize(mapload) . = ..() if(!anchored) //why would you put these on the shuttle? addtimer(CALLBACK(src, .proc/RemoveFromLatejoin), 0) @@ -190,7 +190,7 @@ item_chair = null var/mutable_appearance/armrest -/obj/structure/chair/comfy/Initialize() +/obj/structure/chair/comfy/Initialize(mapload) armrest = GetArmrest() armrest.layer = ABOVE_MOB_LAYER return ..() diff --git a/code/game/objects/structures/beds_chairs/pew.dm b/code/game/objects/structures/beds_chairs/pew.dm index ec257a9898..27f67ba0be 100644 --- a/code/game/objects/structures/beds_chairs/pew.dm +++ b/code/game/objects/structures/beds_chairs/pew.dm @@ -14,7 +14,7 @@ icon_state = "pewend_left" var/mutable_appearance/leftpewarmrest -/obj/structure/chair/pew/left/Initialize() +/obj/structure/chair/pew/left/Initialize(mapload) leftpewarmrest = GetLeftPewArmrest() leftpewarmrest.layer = ABOVE_MOB_LAYER return ..() @@ -45,7 +45,7 @@ icon_state = "pewend_right" var/mutable_appearance/rightpewarmrest -/obj/structure/chair/pew/right/Initialize() +/obj/structure/chair/pew/right/Initialize(mapload) rightpewarmrest = GetRightPewArmrest() rightpewarmrest.layer = ABOVE_MOB_LAYER return ..() diff --git a/code/game/objects/structures/beds_chairs/sofa.dm b/code/game/objects/structures/beds_chairs/sofa.dm index 48352814b5..b7968d84f4 100644 --- a/code/game/objects/structures/beds_chairs/sofa.dm +++ b/code/game/objects/structures/beds_chairs/sofa.dm @@ -6,7 +6,7 @@ item_chair = null var/mutable_appearance/armrest -/obj/structure/chair/sofa/Initialize() +/obj/structure/chair/sofa/Initialize(mapload) armrest = mutable_appearance(icon, "[icon_state]_armrest", ABOVE_MOB_LAYER) return ..() diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 8cd58d7942..1403eb999c 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -259,7 +259,7 @@ GLOBAL_LIST_INIT(double_bedsheets, list(/obj/item/bedsheet/double, var/g_mouth var/g_eyes -/obj/item/bedsheet/gondola/Initialize() +/obj/item/bedsheet/gondola/Initialize(mapload) . = ..() g_mouth = "sheetgondola_mouth[rand(1, 4)]" g_eyes = "sheetgondola_eyes[rand(1, 4)]" @@ -285,7 +285,7 @@ GLOBAL_LIST_INIT(double_bedsheets, list(/obj/item/bedsheet/double, name = "random bedsheet" desc = "If you're reading this description ingame, something has gone wrong! Honk!" -/obj/item/bedsheet/random/Initialize() +/obj/item/bedsheet/random/Initialize(mapload) ..() if(bedsheet_type == BEDSHEET_SINGLE) var/type = pick(typesof(/obj/item/bedsheet) - (list(/obj/item/bedsheet/random, /obj/item/bedsheet/chameleon) + typesof(/obj/item/bedsheet/unlockable) + GLOB.double_bedsheets)) @@ -446,7 +446,7 @@ GLOBAL_LIST_INIT(double_bedsheets, list(/obj/item/bedsheet/double, icon_state = "random_bedsheet" bedsheet_type = BEDSHEET_DOUBLE -/obj/item/bedsheet/random/double/Initialize() +/obj/item/bedsheet/random/double/Initialize(mapload) ..() if(bedsheet_type == BEDSHEET_DOUBLE) var/type = pick(GLOB.double_bedsheets) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm index bfb86b087b..e5a7793ab7 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm @@ -6,7 +6,7 @@ recursive_organ_check(src) return ..() -/obj/structure/closet/secure_closet/freezer/Initialize() +/obj/structure/closet/secure_closet/freezer/Initialize(mapload) . = ..() recursive_organ_check(src) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index f6153330e4..d176824e2c 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -17,7 +17,7 @@ material_drop_amount = 5 var/obj/item/paper/fluff/jobs/cargo/manifest/manifest -/obj/structure/closet/crate/Initialize() +/obj/structure/closet/crate/Initialize(mapload) . = ..() if(icon_state == "[initial(icon_state)]open") opened = TRUE @@ -141,7 +141,7 @@ recursive_organ_check(src) ..() -/obj/structure/closet/crate/freezer/Initialize() +/obj/structure/closet/crate/freezer/Initialize(mapload) . = ..() recursive_organ_check(src) diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index ce2acdbdf7..5b6c1123ca 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -20,7 +20,7 @@ var/list/start_showpieces = list() //Takes sublists in the form of list("type" = /obj/item/bikehorn, "trophy_message" = "henk") var/trophy_message = "" -/obj/structure/displaycase/Initialize() +/obj/structure/displaycase/Initialize(mapload) . = ..() if(start_showpieces.len && !start_showpiece_type) var/list/showpiece_entry = pick(start_showpieces) @@ -252,7 +252,7 @@ integrity_failure = 0 openable = FALSE -/obj/structure/displaycase/trophy/Initialize() +/obj/structure/displaycase/trophy/Initialize(mapload) . = ..() GLOB.trophy_cases += src diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 5b3cd3139c..bf06f06e6f 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -33,7 +33,7 @@ var/girder_type = /obj/structure/girder/displaced var/opening = FALSE -/obj/structure/falsewall/Initialize() +/obj/structure/falsewall/Initialize(mapload) . = ..() air_update_turf(TRUE) diff --git a/code/game/objects/structures/fence.dm b/code/game/objects/structures/fence.dm index 5c63be0165..1a23981af2 100644 --- a/code/game/objects/structures/fence.dm +++ b/code/game/objects/structures/fence.dm @@ -23,7 +23,7 @@ var/hole_size= NO_HOLE var/invulnerable = FALSE -/obj/structure/fence/Initialize() +/obj/structure/fence/Initialize(mapload) . = ..() update_cut_status() @@ -129,7 +129,7 @@ cuttable = FALSE var/open = FALSE -/obj/structure/fence/door/Initialize() +/obj/structure/fence/door/Initialize(mapload) . = ..() update_door_status() diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm index a247908b3b..c46d9c80a4 100644 --- a/code/game/objects/structures/fireaxe.dm +++ b/code/game/objects/structures/fireaxe.dm @@ -13,7 +13,7 @@ var/open = FALSE var/obj/item/fireaxe/fireaxe -/obj/structure/fireaxecabinet/Initialize() +/obj/structure/fireaxecabinet/Initialize(mapload) . = ..() fireaxe = new update_icon() diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index 288bcc2075..e92cf641c8 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -57,7 +57,7 @@ icon_state = "pine_1" var/list/icon_states = list("pine_1", "pine_2", "pine_3") -/obj/structure/flora/tree/pine/Initialize() +/obj/structure/flora/tree/pine/Initialize(mapload) . = ..() if(islist(icon_states && icon_states.len)) @@ -101,7 +101,7 @@ desc = "A tree straight from the tropics." icon_state = "palm1" -/obj/structure/flora/tree/palm/Initialize() +/obj/structure/flora/tree/palm/Initialize(mapload) . = ..() icon_state = pick("palm1","palm2") pixel_x = 0 @@ -118,7 +118,7 @@ icon_state = "anchored_rod" anchored = TRUE -/obj/structure/flora/tree/dead/Initialize() +/obj/structure/flora/tree/dead/Initialize(mapload) icon_state = "tree_[rand(1, 6)]" . = ..() @@ -130,7 +130,7 @@ pixel_x = -48 pixel_y = -20 -/obj/structure/flora/tree/jungle/Initialize() +/obj/structure/flora/tree/jungle/Initialize(mapload) icon_state = "[icon_state][rand(1, 6)]" . = ..() @@ -149,7 +149,7 @@ /obj/structure/flora/grass/brown icon_state = "snowgrass1bb" -/obj/structure/flora/grass/brown/Initialize() +/obj/structure/flora/grass/brown/Initialize(mapload) icon_state = "snowgrass[rand(1, 3)]bb" . = ..() @@ -157,14 +157,14 @@ /obj/structure/flora/grass/green icon_state = "snowgrass1gb" -/obj/structure/flora/grass/green/Initialize() +/obj/structure/flora/grass/green/Initialize(mapload) icon_state = "snowgrass[rand(1, 3)]gb" . = ..() /obj/structure/flora/grass/both icon_state = "snowgrassall1" -/obj/structure/flora/grass/both/Initialize() +/obj/structure/flora/grass/both/Initialize(mapload) icon_state = "snowgrassall[rand(1, 3)]" . = ..() @@ -177,7 +177,7 @@ icon_state = "snowbush1" anchored = TRUE -/obj/structure/flora/bush/Initialize() +/obj/structure/flora/bush/Initialize(mapload) icon_state = "snowbush[rand(1, 6)]" . = ..() @@ -189,7 +189,7 @@ icon = 'icons/obj/flora/ausflora.dmi' icon_state = "firstbush_1" -/obj/structure/flora/ausbushes/Initialize() +/obj/structure/flora/ausbushes/Initialize(mapload) if(icon_state == "firstbush_1") icon_state = "firstbush_[rand(1, 4)]" . = ..() @@ -197,105 +197,105 @@ /obj/structure/flora/ausbushes/reedbush icon_state = "reedbush_1" -/obj/structure/flora/ausbushes/reedbush/Initialize() +/obj/structure/flora/ausbushes/reedbush/Initialize(mapload) icon_state = "reedbush_[rand(1, 4)]" . = ..() /obj/structure/flora/ausbushes/leafybush icon_state = "leafybush_1" -/obj/structure/flora/ausbushes/leafybush/Initialize() +/obj/structure/flora/ausbushes/leafybush/Initialize(mapload) icon_state = "leafybush_[rand(1, 3)]" . = ..() /obj/structure/flora/ausbushes/palebush icon_state = "palebush_1" -/obj/structure/flora/ausbushes/palebush/Initialize() +/obj/structure/flora/ausbushes/palebush/Initialize(mapload) icon_state = "palebush_[rand(1, 4)]" . = ..() /obj/structure/flora/ausbushes/stalkybush icon_state = "stalkybush_1" -/obj/structure/flora/ausbushes/stalkybush/Initialize() +/obj/structure/flora/ausbushes/stalkybush/Initialize(mapload) icon_state = "stalkybush_[rand(1, 3)]" . = ..() /obj/structure/flora/ausbushes/grassybush icon_state = "grassybush_1" -/obj/structure/flora/ausbushes/grassybush/Initialize() +/obj/structure/flora/ausbushes/grassybush/Initialize(mapload) icon_state = "grassybush_[rand(1, 4)]" . = ..() /obj/structure/flora/ausbushes/fernybush icon_state = "fernybush_1" -/obj/structure/flora/ausbushes/fernybush/Initialize() +/obj/structure/flora/ausbushes/fernybush/Initialize(mapload) icon_state = "fernybush_[rand(1, 3)]" . = ..() /obj/structure/flora/ausbushes/sunnybush icon_state = "sunnybush_1" -/obj/structure/flora/ausbushes/sunnybush/Initialize() +/obj/structure/flora/ausbushes/sunnybush/Initialize(mapload) icon_state = "sunnybush_[rand(1, 3)]" . = ..() /obj/structure/flora/ausbushes/genericbush icon_state = "genericbush_1" -/obj/structure/flora/ausbushes/genericbush/Initialize() +/obj/structure/flora/ausbushes/genericbush/Initialize(mapload) icon_state = "genericbush_[rand(1, 4)]" . = ..() /obj/structure/flora/ausbushes/pointybush icon_state = "pointybush_1" -/obj/structure/flora/ausbushes/pointybush/Initialize() +/obj/structure/flora/ausbushes/pointybush/Initialize(mapload) icon_state = "pointybush_[rand(1, 4)]" . = ..() /obj/structure/flora/ausbushes/lavendergrass icon_state = "lavendergrass_1" -/obj/structure/flora/ausbushes/lavendergrass/Initialize() +/obj/structure/flora/ausbushes/lavendergrass/Initialize(mapload) icon_state = "lavendergrass_[rand(1, 4)]" . = ..() /obj/structure/flora/ausbushes/ywflowers icon_state = "ywflowers_1" -/obj/structure/flora/ausbushes/ywflowers/Initialize() +/obj/structure/flora/ausbushes/ywflowers/Initialize(mapload) icon_state = "ywflowers_[rand(1, 3)]" . = ..() /obj/structure/flora/ausbushes/brflowers icon_state = "brflowers_1" -/obj/structure/flora/ausbushes/brflowers/Initialize() +/obj/structure/flora/ausbushes/brflowers/Initialize(mapload) icon_state = "brflowers_[rand(1, 3)]" . = ..() /obj/structure/flora/ausbushes/ppflowers icon_state = "ppflowers_1" -/obj/structure/flora/ausbushes/ppflowers/Initialize() +/obj/structure/flora/ausbushes/ppflowers/Initialize(mapload) icon_state = "ppflowers_[rand(1, 3)]" . = ..() /obj/structure/flora/ausbushes/sparsegrass icon_state = "sparsegrass_1" -/obj/structure/flora/ausbushes/sparsegrass/Initialize() +/obj/structure/flora/ausbushes/sparsegrass/Initialize(mapload) icon_state = "sparsegrass_[rand(1, 3)]" . = ..() /obj/structure/flora/ausbushes/fullgrass icon_state = "fullgrass_1" -/obj/structure/flora/ausbushes/fullgrass/Initialize() +/obj/structure/flora/ausbushes/fullgrass/Initialize(mapload) icon_state = "fullgrass_[rand(1, 3)]" . = ..() @@ -322,7 +322,7 @@ icon_state = "random_plant" var/list/static/states -/obj/item/kirbyplants/random/Initialize() +/obj/item/kirbyplants/random/Initialize(mapload) . = ..() icon = 'icons/obj/flora/plants.dmi' if(!states) @@ -368,7 +368,7 @@ /// Amount of the itemstack to drop var/mineAmount = 20 -/obj/structure/flora/rock/Initialize() +/obj/structure/flora/rock/Initialize(mapload) . = ..() icon_state = "[icon_state][rand(1,3)]" @@ -398,7 +398,7 @@ icon_state = "grassa" -/obj/structure/flora/grass/jungle/Initialize() +/obj/structure/flora/grass/jungle/Initialize(mapload) icon_state = "[icon_state][rand(1, 5)]" . = ..() @@ -414,7 +414,7 @@ icon = 'icons/obj/flora/jungleflora.dmi' density = FALSE -/obj/structure/flora/rock/jungle/Initialize() +/obj/structure/flora/rock/jungle/Initialize(mapload) . = ..() icon_state = "[initial(icon_state)][rand(1,5)]" @@ -427,7 +427,7 @@ icon = 'icons/obj/flora/jungleflora.dmi' icon_state = "busha" -/obj/structure/flora/junglebush/Initialize() +/obj/structure/flora/junglebush/Initialize(mapload) icon_state = "[icon_state][rand(1, 3)]" . = ..() @@ -452,6 +452,6 @@ pixel_x = -16 pixel_y = -16 -/obj/structure/flora/rock/pile/largejungle/Initialize() +/obj/structure/flora/rock/pile/largejungle/Initialize(mapload) . = ..() icon_state = "[initial(icon_state)][rand(1,3)]" diff --git a/code/game/objects/structures/guillotine.dm b/code/game/objects/structures/guillotine.dm index 4773c07657..604961abf4 100644 --- a/code/game/objects/structures/guillotine.dm +++ b/code/game/objects/structures/guillotine.dm @@ -29,7 +29,7 @@ var/kill_count = 0 var/current_action = 0 // What's currently happening to the guillotine -/obj/structure/guillotine/Initialize() +/obj/structure/guillotine/Initialize(mapload) LAZYINITLIST(buckled_mobs) . = ..() diff --git a/code/game/objects/structures/headpike.dm b/code/game/objects/structures/headpike.dm index 6aed11701d..16c8bf41c1 100644 --- a/code/game/objects/structures/headpike.dm +++ b/code/game/objects/structures/headpike.dm @@ -24,7 +24,7 @@ else spear = locate(/obj/item/spear) in parts_list -/obj/structure/headpike/Initialize() +/obj/structure/headpike/Initialize(mapload) . = ..() pixel_x = rand(-8, 8) diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index cb9309c4c4..1d15f8e83b 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -82,7 +82,7 @@ alpha = 150 init_vis_overlay = FALSE -/obj/structure/holosign/barrier/atmos/Initialize() +/obj/structure/holosign/barrier/atmos/Initialize(mapload) . = ..() air_update_turf(TRUE) @@ -98,7 +98,7 @@ /obj/structure/holosign/barrier/firelock/BlockThermalConductivity() return TRUE -/obj/structure/holosign/barrier/firelock/Initialize() +/obj/structure/holosign/barrier/firelock/Initialize(mapload) . = ..() air_update_turf(TRUE) @@ -118,7 +118,7 @@ /obj/structure/holosign/barrier/combifan/BlockThermalConductivity() return TRUE -/obj/structure/holosign/barrier/combifan/Initialize() +/obj/structure/holosign/barrier/combifan/Initialize(mapload) . = ..() air_update_turf(TRUE) diff --git a/code/game/objects/structures/icemoon/cave_entrance.dm b/code/game/objects/structures/icemoon/cave_entrance.dm index e68918c764..16e0566d68 100644 --- a/code/game/objects/structures/icemoon/cave_entrance.dm +++ b/code/game/objects/structures/icemoon/cave_entrance.dm @@ -19,7 +19,7 @@ GLOBAL_LIST_INIT(ore_probability, list(/obj/item/stack/ore/uranium = 50, move_resist = INFINITY anchored = TRUE -/obj/structure/spawner/ice_moon/Initialize() +/obj/structure/spawner/ice_moon/Initialize(mapload) . = ..() clear_rock() @@ -107,7 +107,7 @@ GLOBAL_LIST_INIT(ore_probability, list(/obj/item/stack/ore/uranium = 50, anchored = TRUE density = TRUE -/obj/effect/collapsing_demonic_portal/Initialize() +/obj/effect/collapsing_demonic_portal/Initialize(mapload) . = ..() playsound(loc,'sound/effects/tendril_destroyed.ogg', 200, FALSE, 50, TRUE, TRUE) visible_message("[src] begins to collapse, cutting it off from this world!") diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index bcb9422708..e49de85cf9 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -15,7 +15,7 @@ var/const/max_signs = 4 -/obj/structure/janitorialcart/Initialize() +/obj/structure/janitorialcart/Initialize(mapload) . = ..() create_reagents(100, OPENCONTAINER) diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm index e844461952..ab23ab97e0 100644 --- a/code/game/objects/structures/ladders.dm +++ b/code/game/objects/structures/ladders.dm @@ -155,7 +155,7 @@ var/id var/height = 0 // higher numbers are considered physically higher -/obj/structure/ladder/unbreakable/Initialize() +/obj/structure/ladder/unbreakable/Initialize(mapload) GLOB.ladders += src return ..() diff --git a/code/game/objects/structures/lavaland/geyser.dm b/code/game/objects/structures/lavaland/geyser.dm index 263b47aab2..38d8a43269 100644 --- a/code/game/objects/structures/lavaland/geyser.dm +++ b/code/game/objects/structures/lavaland/geyser.dm @@ -46,7 +46,7 @@ erupting_state = null var/list/options = list(/datum/reagent/clf3 = 10, /datum/reagent/water/hollowwater = 10, /datum/reagent/medicine/omnizine/protozine = 6, /datum/reagent/wittel = 1) -/obj/structure/geyser/random/Initialize() +/obj/structure/geyser/random/Initialize(mapload) . = ..() reagent_id = pickweight(options) diff --git a/code/game/objects/structures/lavaland/necropolis_tendril.dm b/code/game/objects/structures/lavaland/necropolis_tendril.dm index 67341160de..6a3dcc761f 100644 --- a/code/game/objects/structures/lavaland/necropolis_tendril.dm +++ b/code/game/objects/structures/lavaland/necropolis_tendril.dm @@ -30,7 +30,7 @@ mob_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing) GLOBAL_LIST_INIT(tendrils, list()) -/obj/structure/spawner/lavaland/Initialize() +/obj/structure/spawner/lavaland/Initialize(mapload) . = ..() emitted_light = new(loc) for(var/F in RANGE_TURFS(1, src)) @@ -78,7 +78,7 @@ GLOBAL_LIST_INIT(tendrils, list()) density = TRUE var/obj/effect/light_emitter/tendril/emitted_light -/obj/effect/collapse/Initialize() +/obj/effect/collapse/Initialize(mapload) . = ..() emitted_light = new(loc) visible_message("The tendril writhes in fury as the earth around it begins to crack and break apart! Get back!") diff --git a/code/game/objects/structures/loot_pile.dm b/code/game/objects/structures/loot_pile.dm index dc3971fdd2..2ea9f0700b 100644 --- a/code/game/objects/structures/loot_pile.dm +++ b/code/game/objects/structures/loot_pile.dm @@ -31,7 +31,7 @@ var/loot_restriction = NO_LOOT_RESTRICTION var/maximum_loot_per_player = 1 -/obj/structure/loot_pile/Initialize() +/obj/structure/loot_pile/Initialize(mapload) . = ..() icon_state = pick(icon_states_to_use) diff --git a/code/game/objects/structures/manned_turret.dm b/code/game/objects/structures/manned_turret.dm index cdbf19367b..f70510e173 100644 --- a/code/game/objects/structures/manned_turret.dm +++ b/code/game/objects/structures/manned_turret.dm @@ -184,7 +184,7 @@ resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF var/obj/machinery/manned_turret/turret -/obj/item/gun_control/Initialize() +/obj/item/gun_control/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) turret = loc diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index b2f1de8750..530e9296ab 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -25,7 +25,7 @@ rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE rad_insulation = RAD_MEDIUM_INSULATION -/obj/structure/mineral_door/Initialize() +/obj/structure/mineral_door/Initialize(mapload) . = ..() initial_state = icon_state air_update_turf(TRUE) @@ -243,7 +243,7 @@ resistance_flags = FLAMMABLE max_integrity = 20 -/obj/structure/mineral_door/paperframe/Initialize() +/obj/structure/mineral_door/paperframe/Initialize(mapload) . = ..() queue_smooth_neighbors(src) diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm index 3eb88ad12d..09dfffb552 100644 --- a/code/game/objects/structures/mop_bucket.dm +++ b/code/game/objects/structures/mop_bucket.dm @@ -7,7 +7,7 @@ var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite -/obj/structure/mopbucket/Initialize() +/obj/structure/mopbucket/Initialize(mapload) . = ..() create_reagents(100, OPENCONTAINER) diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 383b57a0b0..5488ddfe2a 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -29,7 +29,7 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an var/message_cooldown var/breakout_time = 600 -/obj/structure/bodycontainer/Initialize() +/obj/structure/bodycontainer/Initialize(mapload) . = ..() if(starting_tray) connected = new starting_tray(src) @@ -213,7 +213,7 @@ GLOBAL_LIST_EMPTY(crematoriums) GLOB.crematoriums.Remove(src) return ..() -/obj/structure/bodycontainer/crematorium/Initialize() +/obj/structure/bodycontainer/crematorium/Initialize(mapload) . = ..() GLOB.crematoriums.Add(src) diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index 46d5316458..e3710af0d5 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -11,7 +11,7 @@ /obj/structure/plasticflaps/opaque opacity = TRUE -/obj/structure/plasticflaps/Initialize() +/obj/structure/plasticflaps/Initialize(mapload) . = ..() alpha = 0 SSvis_overlays.add_vis_overlay(src, icon, icon_state, ABOVE_MOB_LAYER, plane, dir, add_appearance_flags = RESET_ALPHA) //you see mobs under it, but you hit them like they are above it @@ -100,7 +100,7 @@ new /obj/item/stack/sheet/plastic/five(loc) qdel(src) -/obj/structure/plasticflaps/Initialize() +/obj/structure/plasticflaps/Initialize(mapload) . = ..() air_update_turf(TRUE) diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm index 21cf97ba70..fe2d656469 100644 --- a/code/game/objects/structures/railings.dm +++ b/code/game/objects/structures/railings.dm @@ -18,7 +18,7 @@ . = ..() AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS ,null,CALLBACK(src, .proc/can_be_rotated),CALLBACK(src,.proc/after_rotation)) -/obj/structure/railing/Initialize() +/obj/structure/railing/Initialize(mapload) . = ..() ini_dir = dir diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm index 944e1dac9c..c3322b310d 100644 --- a/code/game/objects/structures/reflector.dm +++ b/code/game/objects/structures/reflector.dm @@ -17,7 +17,7 @@ var/list/allowed_projectile_typecache = list(/obj/item/projectile/beam) var/rotation_angle = -1 -/obj/structure/reflector/Initialize() +/obj/structure/reflector/Initialize(mapload) . = ..() icon_state = "reflector_base" allowed_projectile_typecache = typecacheof(allowed_projectile_typecache) diff --git a/code/game/objects/structures/showcase.dm b/code/game/objects/structures/showcase.dm index 3b7933ab87..9f52bfbefb 100644 --- a/code/game/objects/structures/showcase.dm +++ b/code/game/objects/structures/showcase.dm @@ -17,7 +17,7 @@ icon = 'icons/obj/computer.dmi' icon_state = "computer" -/obj/structure/showcase/fakeid/Initialize() +/obj/structure/showcase/fakeid/Initialize(mapload) . = ..() add_overlay("id") add_overlay("id_key") @@ -28,7 +28,7 @@ icon = 'icons/obj/computer.dmi' icon_state = "computer" -/obj/structure/showcase/fakesec/Initialize() +/obj/structure/showcase/fakesec/Initialize(mapload) . = ..() add_overlay("security") add_overlay("security_key") diff --git a/code/game/objects/structures/spawner.dm b/code/game/objects/structures/spawner.dm index 7d13af1e3e..8b78253adc 100644 --- a/code/game/objects/structures/spawner.dm +++ b/code/game/objects/structures/spawner.dm @@ -14,7 +14,7 @@ var/spawn_text = "emerges from" var/faction = list("hostile") -/obj/structure/spawner/Initialize() +/obj/structure/spawner/Initialize(mapload) . = ..() AddComponent(/datum/component/spawner, mob_types, spawn_time, faction, spawn_text, max_mobs) diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm index 2924545cc1..6655a25f74 100644 --- a/code/game/objects/structures/statues.dm +++ b/code/game/objects/structures/statues.dm @@ -12,7 +12,7 @@ CanAtmosPass = ATMOS_PASS_DENSITY -/obj/structure/statue/Initialize() +/obj/structure/statue/Initialize(mapload) . = ..() AddElement(/datum/element/art, impressiveness) addtimer(CALLBACK(src, /datum.proc/_AddElement, list(/datum/element/beauty, impressiveness * 75)), 0) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 24342e44bd..81e045e788 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -483,7 +483,7 @@ /obj/structure/table/wood/fancy/royalblue) var/smooth_icon = 'icons/obj/smooth_structures/fancy_table.dmi' // see Initialize() -/obj/structure/table/wood/fancy/Initialize() +/obj/structure/table/wood/fancy/Initialize(mapload) . = ..() // Needs to be set dynamically because table smooth sprites are 32x34, // which the editor treats as a two-tile-tall object. The sprites are that diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm index 00df078d0b..695dcef476 100644 --- a/code/game/objects/structures/tank_dispenser.dm +++ b/code/game/objects/structures/tank_dispenser.dm @@ -17,7 +17,7 @@ /obj/structure/tank_dispenser/plasma oxygentanks = 0 -/obj/structure/tank_dispenser/Initialize() +/obj/structure/tank_dispenser/Initialize(mapload) . = ..() for(var/i in 1 to oxygentanks) new /obj/item/tank/internals/oxygen(src) diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm index 9f3a829633..0ae1aff68a 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm @@ -8,7 +8,7 @@ var/datum/gas_mixture/air_contents = new() -/obj/structure/transit_tube_pod/Initialize() +/obj/structure/transit_tube_pod/Initialize(mapload) . = ..() air_contents.set_moles(GAS_O2, MOLES_O2STANDARD) air_contents.set_moles(GAS_N2, MOLES_N2STANDARD) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index e3ee7ddc63..e89e6e6116 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -16,7 +16,7 @@ attack_hand_speed = CLICK_CD_MELEE attack_hand_is_action = TRUE -/obj/structure/toilet/Initialize() +/obj/structure/toilet/Initialize(mapload) . = ..() open = round(rand(0, 1)) update_icon() @@ -138,7 +138,7 @@ /obj/structure/toilet/secret var/secret_type = null -/obj/structure/toilet/secret/Initialize() +/obj/structure/toilet/secret/Initialize(mapload) . = ..() if (secret_type) new secret_type(src) @@ -255,7 +255,7 @@ var/watertemp = "normal" //freezing, normal, or boiling var/datum/looping_sound/showering/soundloop -/obj/machinery/shower/Initialize() +/obj/machinery/shower/Initialize(mapload) . = ..() soundloop = new(src, FALSE) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index e8e170446b..23303b93ac 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -923,7 +923,7 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) var/static/mutable_appearance/torn = mutable_appearance('icons/obj/smooth_structures/paperframes.dmi',icon_state = "torn", layer = ABOVE_OBJ_LAYER - 0.1) var/static/mutable_appearance/paper = mutable_appearance('icons/obj/smooth_structures/paperframes.dmi',icon_state = "paper", layer = ABOVE_OBJ_LAYER - 0.1) -/obj/structure/window/paperframe/Initialize() +/obj/structure/window/paperframe/Initialize(mapload) . = ..() update_icon() diff --git a/code/game/turfs/baseturf_skipover.dm b/code/game/turfs/baseturf_skipover.dm index 4df8c86e62..9bef78a15e 100644 --- a/code/game/turfs/baseturf_skipover.dm +++ b/code/game/turfs/baseturf_skipover.dm @@ -3,7 +3,7 @@ name = "Baseturf skipover placeholder" desc = "This shouldn't exist" -/turf/baseturf_skipover/Initialize() +/turf/baseturf_skipover/Initialize(mapload) . = ..() stack_trace("[src]([type]) was instanced which should never happen. Changing into the next baseturf down...") ScrapeAway() diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm index ccfb5dc238..32d072edd9 100644 --- a/code/game/turfs/closed.dm +++ b/code/game/turfs/closed.dm @@ -13,7 +13,7 @@ /// how much of inbound yelling to dampen var/yelling_dampen = 0.5 -/turf/closed/Initialize() +/turf/closed/Initialize(mapload) . = ..() /turf/closed/AfterChange() @@ -123,7 +123,7 @@ smooth = SMOOTH_TRUE icon = 'icons/obj/smooth_structures/reinforced_window.dmi' -/turf/closed/indestructible/fakeglass/Initialize() +/turf/closed/indestructible/fakeglass/Initialize(mapload) . = ..() icon_state = null //set the icon state to null, so our base state isn't visible underlays += mutable_appearance('icons/obj/structures.dmi', "grille") //add a grille underlay diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index b526b5b886..aa5e02819c 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -124,7 +124,7 @@ heavyfootstep = FOOTSTEP_LAVA tiled_dirt = FALSE -/turf/open/indestructible/necropolis/Initialize() +/turf/open/indestructible/necropolis/Initialize(mapload) . = ..() if(prob(12)) icon_state = "necro[rand(2,3)]" diff --git a/code/game/turfs/open/floor/catwalk_plating.dm b/code/game/turfs/open/floor/catwalk_plating.dm index cbcbade5d4..76d22847c9 100644 --- a/code/game/turfs/open/floor/catwalk_plating.dm +++ b/code/game/turfs/open/floor/catwalk_plating.dm @@ -18,7 +18,7 @@ heavyfootstep = FOOTSTEP_CATWALK var/covered = TRUE -/turf/open/floor/plating/catwalk_floor/Initialize() +/turf/open/floor/plating/catwalk_floor/Initialize(mapload) . = ..() layer = CATWALK_LAYER update_icon(UPDATE_OVERLAYS) diff --git a/code/game/turfs/openspace/transparent.dm b/code/game/turfs/openspace/transparent.dm index 570f153d41..b9ab562643 100644 --- a/code/game/turfs/openspace/transparent.dm +++ b/code/game/turfs/openspace/transparent.dm @@ -2,7 +2,7 @@ baseturfs = /turf/open/transparent/openspace intact = FALSE //this means wires go on top -/turf/open/transparent/Initialize() // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker +/turf/open/transparent/Initialize(mapload) // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker . = ..() plane = OPENSPACE_PLANE layer = OPENSPACE_LAYER @@ -59,7 +59,7 @@ clawfootstep = FOOTSTEP_HARD_CLAW heavyfootstep = FOOTSTEP_GENERIC_HEAVY -/turf/open/transparent/glass/Initialize() +/turf/open/transparent/glass/Initialize(mapload) icon_state = "" //Prevent the normal icon from appearing behind the smooth overlays ..() return INITIALIZE_HINT_LATELOAD diff --git a/code/game/turfs/simulated/chasm.dm b/code/game/turfs/simulated/chasm.dm index 9490d728fe..a03ff1f07a 100644 --- a/code/game/turfs/simulated/chasm.dm +++ b/code/game/turfs/simulated/chasm.dm @@ -11,7 +11,7 @@ bullet_bounce_sound = null //abandon all hope ye who enter dirt_buildup_allowed = FALSE -/turf/open/chasm/Initialize() +/turf/open/chasm/Initialize(mapload) . = ..() AddComponent(/datum/component/chasm, SSmapping.get_turf_below(src)) @@ -121,7 +121,7 @@ light_range = 1.9 light_power = 0.65 -/turf/open/chasm/magic/Initialize() +/turf/open/chasm/magic/Initialize(mapload) . = ..() var/turf/T = safepick(get_area_turfs(/area/fabric_of_reality)) if(T) diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm index f707037771..a7d3cda389 100644 --- a/code/game/turfs/simulated/floor/fancy_floor.dm +++ b/code/game/turfs/simulated/floor/fancy_floor.dm @@ -108,7 +108,7 @@ var/turfverb = "uproot" tiled_dirt = FALSE -/turf/open/floor/grass/Initialize() +/turf/open/floor/grass/Initialize(mapload) . = ..() update_icon() @@ -203,7 +203,7 @@ initial_gas_mix = LAVALAND_DEFAULT_ATMOS slowdown = 0 -/turf/open/floor/grass/snow/basalt/Initialize() +/turf/open/floor/grass/snow/basalt/Initialize(mapload) . = ..() if(prob(15)) icon_state = "basalt[rand(0, 12)]" @@ -224,7 +224,7 @@ clawfootstep = FOOTSTEP_SAND heavyfootstep = FOOTSTEP_GENERIC_HEAVY -/turf/open/floor/grass/fakebasalt/Initialize() +/turf/open/floor/grass/fakebasalt/Initialize(mapload) . = ..() if(prob(15)) icon_state = "basalt[rand(0, 12)]" @@ -252,7 +252,7 @@ . = ..() . += "There's a small crack on the edge of it." -/turf/open/floor/carpet/Initialize() +/turf/open/floor/carpet/Initialize(mapload) . = ..() update_icon() @@ -413,7 +413,7 @@ plane = PLANE_SPACE tiled_dirt = FALSE -/turf/open/floor/fakespace/Initialize() +/turf/open/floor/fakespace/Initialize(mapload) . = ..() icon_state = SPACE_ICON_STATE diff --git a/code/game/turfs/simulated/floor/light_floor.dm b/code/game/turfs/simulated/floor/light_floor.dm index 4bca25f96c..55c1a45ff4 100644 --- a/code/game/turfs/simulated/floor/light_floor.dm +++ b/code/game/turfs/simulated/floor/light_floor.dm @@ -17,7 +17,7 @@ . = ..() . += "There's a small crack on the edge of it." -/turf/open/floor/light/Initialize() +/turf/open/floor/light/Initialize(mapload) . = ..() update_icon() diff --git a/code/game/turfs/simulated/floor/mineral_floor.dm b/code/game/turfs/simulated/floor/mineral_floor.dm index fe6ed2da9b..b7266bfb16 100644 --- a/code/game/turfs/simulated/floor/mineral_floor.dm +++ b/code/game/turfs/simulated/floor/mineral_floor.dm @@ -16,7 +16,7 @@ tiled_dirt = FALSE -/turf/open/floor/mineral/Initialize() +/turf/open/floor/mineral/Initialize(mapload) if(!broken_states) broken_states = list("[initial(icon_state)]_dam") . = ..() @@ -237,7 +237,7 @@ icons = list("alienpod1", "alienpod2", "alienpod3", "alienpod4", "alienpod5", "alienpod6", "alienpod7", "alienpod8", "alienpod9") baseturfs = /turf/open/floor/plating/abductor2 -/turf/open/floor/mineral/abductor/Initialize() +/turf/open/floor/mineral/abductor/Initialize(mapload) . = ..() icon_state = "alienpod[rand(1,9)]" diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm index 11f2918bcf..f041d657ec 100644 --- a/code/game/turfs/simulated/floor/misc_floor.dm +++ b/code/game/turfs/simulated/floor/misc_floor.dm @@ -18,7 +18,7 @@ floor_tile = /obj/item/stack/tile/circuit var/on = TRUE -/turf/open/floor/circuit/Initialize() +/turf/open/floor/circuit/Initialize(mapload) SSmapping.nuke_tiles += src update_icon() . = ..() @@ -151,7 +151,7 @@ /turf/open/floor/clockwork/Bless() //Who needs holy blessings when you have DADDY RATVAR? return -/turf/open/floor/clockwork/Initialize() +/turf/open/floor/clockwork/Initialize(mapload) . = ..() if(uses_overlay) new /obj/effect/temp_visual/ratvar/floor(src) diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index b23ce17c72..1683163df0 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -29,7 +29,7 @@ else . += "You might be able to build ontop of it with some tiles..." -/turf/open/floor/plating/Initialize() +/turf/open/floor/plating/Initialize(mapload) if (!broken_states) broken_states = list("platingdmg1", "platingdmg2", "platingdmg3") if (!burnt_states) diff --git a/code/game/turfs/simulated/floor/plating/asteroid.dm b/code/game/turfs/simulated/floor/plating/asteroid.dm index 2770d12454..32c1f0d42b 100644 --- a/code/game/turfs/simulated/floor/plating/asteroid.dm +++ b/code/game/turfs/simulated/floor/plating/asteroid.dm @@ -29,7 +29,7 @@ // /turf/open/floor/plating/asteroid/setup_broken_states() // return list("asteroid_dug") -/turf/open/floor/plating/asteroid/Initialize() +/turf/open/floor/plating/asteroid/Initialize(mapload) var/proper_name = name . = ..() name = proper_name @@ -116,7 +116,7 @@ baseturfs = /turf/open/floor/plating/asteroid/airless initial_gas_mix = AIRLESS_ATMOS -/turf/open/floor/plating/asteroid/basalt/Initialize() +/turf/open/floor/plating/asteroid/basalt/Initialize(mapload) . = ..() set_basalt_light(src) diff --git a/code/game/turfs/simulated/floor/plating/misc_plating.dm b/code/game/turfs/simulated/floor/plating/misc_plating.dm index e49b6b78d3..a4000ea486 100644 --- a/code/game/turfs/simulated/floor/plating/misc_plating.dm +++ b/code/game/turfs/simulated/floor/plating/misc_plating.dm @@ -12,7 +12,7 @@ icon_state = "alienpod1" tiled_dirt = FALSE -/turf/open/floor/plating/abductor/Initialize() +/turf/open/floor/plating/abductor/Initialize(mapload) . = ..() icon_state = "alienpod[rand(1,9)]" @@ -56,7 +56,7 @@ heavyfootstep = FOOTSTEP_GENERIC_HEAVY tiled_dirt = FALSE -/turf/open/floor/plating/ashplanet/Initialize() +/turf/open/floor/plating/ashplanet/Initialize(mapload) if(smooth) var/matrix/M = new M.Translate(-4, -4) @@ -101,7 +101,7 @@ clawfootstep = FOOTSTEP_HARD_CLAW heavyfootstep = FOOTSTEP_GENERIC_HEAVY -/turf/open/floor/plating/ashplanet/wateryrock/Initialize() +/turf/open/floor/plating/ashplanet/wateryrock/Initialize(mapload) icon_state = "[icon_state][rand(1, 9)]" . = ..() @@ -161,7 +161,7 @@ clawfootstep = FOOTSTEP_SAND heavyfootstep = FOOTSTEP_GENERIC_HEAVY -/turf/open/floor/plating/ironsand/Initialize() +/turf/open/floor/plating/ironsand/Initialize(mapload) . = ..() icon_state = "ironsand[rand(1,15)]" @@ -188,7 +188,7 @@ clawfootstep = FOOTSTEP_HARD_CLAW heavyfootstep = FOOTSTEP_GENERIC_HEAVY -/turf/open/floor/plating/ice/Initialize() +/turf/open/floor/plating/ice/Initialize(mapload) . = ..() MakeSlippery(TURF_WET_PERMAFROST, INFINITY, 0, INFINITY, TRUE) diff --git a/code/game/turfs/simulated/floor/reinf_floor.dm b/code/game/turfs/simulated/floor/reinf_floor.dm index 32eda3bdb7..93ced4b3d5 100644 --- a/code/game/turfs/simulated/floor/reinf_floor.dm +++ b/code/game/turfs/simulated/floor/reinf_floor.dm @@ -133,7 +133,7 @@ var/obj/effect/clockwork/overlay/floor/bloodcult/realappearance -/turf/open/floor/engine/cult/Initialize() +/turf/open/floor/engine/cult/Initialize(mapload) . = ..() new /obj/effect/temp_visual/cult/turf/floor(src) realappearance = new /obj/effect/clockwork/overlay/floor/bloodcult(src) diff --git a/code/game/turfs/simulated/glass.dm b/code/game/turfs/simulated/glass.dm index f02ca19548..58acc696fa 100644 --- a/code/game/turfs/simulated/glass.dm +++ b/code/game/turfs/simulated/glass.dm @@ -17,7 +17,7 @@ // return list("glass-damaged1", "glass-damaged2", "glass-damaged3") -/turf/open/floor/glass/Initialize() +/turf/open/floor/glass/Initialize(mapload) icon_state = "" //Prevent the normal icon from appearing behind the smooth overlays ..() return INITIALIZE_HINT_LATELOAD diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index 48e7fa8f8a..0c5455b8b7 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -27,7 +27,7 @@ // If true you can mine the mineral turf with your hands var/weak_turf = FALSE -/turf/closed/mineral/Initialize() +/turf/closed/mineral/Initialize(mapload) if (!canSmoothWith) canSmoothWith = list(/turf/closed/mineral, /turf/closed/indestructible) . = ..() @@ -191,7 +191,7 @@ //Currently, Adamantine won't spawn as it has no uses. -Durandan var/mineralChance = 13 -/turf/closed/mineral/random/Initialize() +/turf/closed/mineral/random/Initialize(mapload) mineralSpawnChanceList = typelist("mineralSpawnChanceList", mineralSpawnChanceList) @@ -512,7 +512,7 @@ var/activated_name = null var/mutable_appearance/activated_overlay -/turf/closed/mineral/gibtonite/Initialize() +/turf/closed/mineral/gibtonite/Initialize(mapload) det_time = rand(8,10) //So you don't know exactly when the hot potato will explode . = ..() diff --git a/code/game/turfs/simulated/openspace.dm b/code/game/turfs/simulated/openspace.dm index a856ed75b5..935bfdc1a7 100644 --- a/code/game/turfs/simulated/openspace.dm +++ b/code/game/turfs/simulated/openspace.dm @@ -36,7 +36,7 @@ GLOBAL_DATUM_INIT(openspace_backdrop_one_for_all, /atom/movable/openspace_backdr // /turf/open/transparent/openspace/show_bottom_level() // return FALSE -/turf/open/openspace/Initialize() // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker +/turf/open/openspace/Initialize(mapload) // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker . = ..() vis_contents += GLOB.openspace_backdrop_one_for_all //Special grey square for projecting backdrop darkness filter on it. return INITIALIZE_HINT_LATELOAD @@ -165,7 +165,7 @@ GLOBAL_DATUM_INIT(openspace_backdrop_one_for_all, /atom/movable/openspace_backdr /// If true mineral turfs below this openspace turf will be mined automatically var/drill_below = TRUE -/turf/open/openspace/icemoon/Initialize() +/turf/open/openspace/icemoon/Initialize(mapload) . = ..() var/turf/T = below() if(T.flags_1 & NO_RUINS_1 && protect_ruin) diff --git a/code/game/turfs/simulated/wall/misc_walls.dm b/code/game/turfs/simulated/wall/misc_walls.dm index e4d991a082..493912e27a 100644 --- a/code/game/turfs/simulated/wall/misc_walls.dm +++ b/code/game/turfs/simulated/wall/misc_walls.dm @@ -10,7 +10,7 @@ explosion_block = 10 girder_type = /obj/structure/girder/cult -/turf/closed/wall/mineral/cult/Initialize() +/turf/closed/wall/mineral/cult/Initialize(mapload) new /obj/effect/temp_visual/cult/turf(src) . = ..() @@ -60,7 +60,7 @@ var/heated var/obj/effect/clockwork/overlay/wall/realappearance -/turf/closed/wall/clockwork/Initialize() +/turf/closed/wall/clockwork/Initialize(mapload) . = ..() new /obj/effect/temp_visual/ratvar/wall(src) new /obj/effect/temp_visual/ratvar/beam(src) diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 3ed3891fdf..2df1606cb9 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -33,7 +33,7 @@ * * Doesn't call parent, see [/atom/proc/Initialize] */ -/turf/open/space/Initialize() +/turf/open/space/Initialize(mapload) SHOULD_CALL_PARENT(FALSE) icon_state = SPACE_ICON_STATE if(!space_gas) @@ -283,7 +283,7 @@ baseturfs = /turf/open/space/transparent/openspace intact = FALSE //this means wires go on top -/turf/open/space/transparent/Initialize() // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker +/turf/open/space/transparent/Initialize(mapload) // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker ..() plane = OPENSPACE_PLANE layer = OPENSPACE_LAYER @@ -339,7 +339,7 @@ /turf/open/space/transparent/openspace/show_bottom_level() return FALSE -/turf/open/space/transparent/openspace/Initialize() // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker +/turf/open/space/transparent/openspace/Initialize(mapload) // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker . = ..() icon_state = "transparent" diff --git a/code/game/turfs/space/transit.dm b/code/game/turfs/space/transit.dm index 08da6fa84f..ed3b20fce4 100644 --- a/code/game/turfs/space/transit.dm +++ b/code/game/turfs/space/transit.dm @@ -101,7 +101,7 @@ return SSshuttle.is_in_shuttle_bounds(src) -/turf/open/space/transit/Initialize() +/turf/open/space/transit/Initialize(mapload) . = ..() update_icon() for(var/atom/movable/AM in src) diff --git a/code/modules/NTNet/relays.dm b/code/modules/NTNet/relays.dm index 8c33dd1eba..9a39b80356 100644 --- a/code/modules/NTNet/relays.dm +++ b/code/modules/NTNet/relays.dm @@ -92,7 +92,7 @@ update_icon() return TRUE -/obj/machinery/ntnet_relay/Initialize() +/obj/machinery/ntnet_relay/Initialize(mapload) uid = gl_uid++ component_parts = list() diff --git a/code/modules/VR/vr_sleeper.dm b/code/modules/VR/vr_sleeper.dm index a5e31e595c..5b667c5fd5 100644 --- a/code/modules/VR/vr_sleeper.dm +++ b/code/modules/VR/vr_sleeper.dm @@ -16,7 +16,7 @@ var/allow_creating_vr_mobs = TRUE //So you can have vr_sleepers that always spawn you as a specific person or 1 life/chance vr games var/only_current_user_can_interact = FALSE -/obj/machinery/vr_sleeper/Initialize() +/obj/machinery/vr_sleeper/Initialize(mapload) . = ..() sparks = new /datum/effect_system/spark_spread() sparks.set_up(2,0) @@ -151,7 +151,7 @@ if(SOFT_CRIT) status = "Barely Conscious" data["vr_avatar"] += list("status" = status, "health" = vr_mob.health, "maxhealth" = vr_mob.maxHealth) - else + else data["can_delete_avatar"] = FALSE data["vr_avatar"] = FALSE data["isliving"] = FALSE @@ -207,7 +207,7 @@ var/vr_category = "default" //So we can have specific sleepers, eg: "Basketball VR Sleeper", etc. var/vr_outfit = /datum/outfit/vr -/obj/effect/landmark/vr_spawn/Initialize() +/obj/effect/landmark/vr_spawn/Initialize(mapload) . = ..() LAZYADD(GLOB.vr_spawnpoints[vr_category], src) @@ -235,7 +235,7 @@ var/area/vr_area var/list/corpse_party -/obj/effect/vr_clean_master/Initialize() +/obj/effect/vr_clean_master/Initialize(mapload) . = ..() vr_area = get_base_area(src) if(!vr_area) diff --git a/code/modules/admin/fun_balloon.dm b/code/modules/admin/fun_balloon.dm index 417663fcb7..bfbb5e7dbb 100644 --- a/code/modules/admin/fun_balloon.dm +++ b/code/modules/admin/fun_balloon.dm @@ -6,7 +6,7 @@ anchored = TRUE var/popped = FALSE -/obj/effect/fun_balloon/Initialize() +/obj/effect/fun_balloon/Initialize(mapload) . = ..() SSobj.processing |= src @@ -109,7 +109,7 @@ timeleft = 0 var/list/warp_points -/obj/effect/forcefield/arena_shuttle/Initialize() +/obj/effect/forcefield/arena_shuttle/Initialize(mapload) . = ..() for(var/obj/effect/landmark/shuttle_arena_safe/exit in GLOB.landmarks_list) warp_points += exit diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 9e201ec360..85b3d9eaa4 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -1577,7 +1577,7 @@ Traitors and the like can also be revived with the previous role mostly intact. duration = 9 pixel_z = 270 -/obj/effect/temp_visual/fireball/Initialize() +/obj/effect/temp_visual/fireball/Initialize(mapload) . = ..() animate(src, pixel_z = 0, time = duration) diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm index 011d175cfa..22d669853a 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm @@ -30,7 +30,7 @@ var/stealth_armor = list("melee" = 15, "bullet" = 15, "laser" = 15, "energy" = 15, "bomb" = 15, "bio" = 15, "rad" = 15, "fire" = 70, "acid" = 70) var/combat_armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 50, "rad" = 50, "fire" = 90, "acid" = 90) -/obj/item/clothing/suit/armor/abductor/vest/Initialize() +/obj/item/clothing/suit/armor/abductor/vest/Initialize(mapload) . = ..() stealth_armor = getArmor(arglist(stealth_armor)) combat_armor = getArmor(arglist(combat_armor)) diff --git a/code/modules/antagonists/abductor/equipment/gland.dm b/code/modules/antagonists/abductor/equipment/gland.dm index d0002d1f4a..312cc07997 100644 --- a/code/modules/antagonists/abductor/equipment/gland.dm +++ b/code/modules/antagonists/abductor/equipment/gland.dm @@ -19,7 +19,7 @@ var/mind_control_duration = 1800 var/active_mind_control = FALSE -/obj/item/organ/heart/gland/Initialize() +/obj/item/organ/heart/gland/Initialize(mapload) . = ..() icon_state = pick(list("health", "spider", "slime", "emp", "species", "egg", "vent", "mindshock", "viral")) diff --git a/code/modules/antagonists/abductor/equipment/glands/chem.dm b/code/modules/antagonists/abductor/equipment/glands/chem.dm index b651b45f6d..0c7d20d1ff 100644 --- a/code/modules/antagonists/abductor/equipment/glands/chem.dm +++ b/code/modules/antagonists/abductor/equipment/glands/chem.dm @@ -8,7 +8,7 @@ mind_control_duration = 1200 var/list/possible_reagents = list() -/obj/item/organ/heart/gland/chem/Initialize() +/obj/item/organ/heart/gland/chem/Initialize(mapload) . = ..() for(var/R in subtypesof(/datum/reagent/drug) + subtypesof(/datum/reagent/medicine) + typesof(/datum/reagent/toxin)) possible_reagents += R diff --git a/code/modules/antagonists/abductor/machinery/dispenser.dm b/code/modules/antagonists/abductor/machinery/dispenser.dm index f5bc0946e6..7d79bacdd0 100644 --- a/code/modules/antagonists/abductor/machinery/dispenser.dm +++ b/code/modules/antagonists/abductor/machinery/dispenser.dm @@ -12,7 +12,7 @@ //TODO : replace with presets or spectrum return rgb(rand(0,255),rand(0,255),rand(0,255)) -/obj/machinery/abductor/gland_dispenser/Initialize() +/obj/machinery/abductor/gland_dispenser/Initialize(mapload) . = ..() gland_types = subtypesof(/obj/item/organ/heart/gland) gland_types = shuffle(gland_types) diff --git a/code/modules/antagonists/abductor/machinery/pad.dm b/code/modules/antagonists/abductor/machinery/pad.dm index ab636f7d0e..2ec8e70358 100644 --- a/code/modules/antagonists/abductor/machinery/pad.dm +++ b/code/modules/antagonists/abductor/machinery/pad.dm @@ -49,7 +49,7 @@ icon_state = "teleport" duration = 80 -/obj/effect/temp_visual/teleport_abductor/Initialize() +/obj/effect/temp_visual/teleport_abductor/Initialize(mapload) . = ..() var/datum/effect_system/spark_spread/S = new S.set_up(10,0,loc) diff --git a/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm b/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm index f9763b92fd..a5774e44d1 100644 --- a/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm +++ b/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm @@ -221,7 +221,7 @@ hud_type = /datum/hud/blobbernaut var/independent = FALSE -/mob/living/simple_animal/hostile/blob/blobbernaut/Initialize() +/mob/living/simple_animal/hostile/blob/blobbernaut/Initialize(mapload) . = ..() if(independent) pass_flags &= ~PASSBLOB diff --git a/code/modules/antagonists/blob/blob/blobs/node.dm b/code/modules/antagonists/blob/blob/blobs/node.dm index 14fbc741c0..8d47f44207 100644 --- a/code/modules/antagonists/blob/blob/blobs/node.dm +++ b/code/modules/antagonists/blob/blob/blobs/node.dm @@ -9,7 +9,7 @@ point_return = 25 -/obj/structure/blob/node/Initialize() +/obj/structure/blob/node/Initialize(mapload) GLOB.blob_nodes += src START_PROCESSING(SSobj, src) . = ..() diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm b/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm index f26152f90e..a86cb374d2 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm @@ -12,7 +12,7 @@ var/nighttime_duration = 900 //15 Minutes var/issued_XP = FALSE -/obj/effect/sunlight/Initialize() +/obj/effect/sunlight/Initialize(mapload) . = ..() /obj/effect/sunlight/proc/start_countdown() diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index ec95ee4ef6..9eae4d7f99 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -302,7 +302,7 @@ firing_effect_type = null var/obj/item/gun/magic/tentacle/gun //the item that shot it -/obj/item/ammo_casing/magic/tentacle/Initialize() +/obj/item/ammo_casing/magic/tentacle/Initialize(mapload) gun = loc . = ..() @@ -321,7 +321,7 @@ var/chain var/obj/item/ammo_casing/magic/tentacle/source //the item that shot it -/obj/item/projectile/tentacle/Initialize() +/obj/item/projectile/tentacle/Initialize(mapload) source = loc . = ..() @@ -506,7 +506,7 @@ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) //No armor at all. mutantrace_variation = NONE -/obj/item/clothing/suit/space/changeling/Initialize() +/obj/item/clothing/suit/space/changeling/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) if(ismob(loc)) @@ -527,7 +527,7 @@ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH -/obj/item/clothing/head/helmet/space/changeling/Initialize() +/obj/item/clothing/head/helmet/space/changeling/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) @@ -563,7 +563,7 @@ cold_protection = 0 heat_protection = 0 -/obj/item/clothing/suit/armor/changeling/Initialize() +/obj/item/clothing/suit/armor/changeling/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) if(ismob(loc)) @@ -577,7 +577,7 @@ armor = list("melee" = 70, "bullet" = 60, "laser" = 30, "energy" = 40, "bomb" = 10, "bio" = 4, "rad" = 0, "fire" = 50, "acid" = 90) flags_inv = HIDEEARS|HIDEHAIR|HIDEEYES|HIDEFACIALHAIR|HIDEFACE -/obj/item/clothing/head/helmet/changeling/Initialize() +/obj/item/clothing/head/helmet/changeling/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) @@ -655,7 +655,7 @@ max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT armor = list("melee" = 20, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 35, "bio" = 35, "rad" = 35, "fire" = 0, "acid" = 0) -/obj/item/clothing/gloves/claws/Initialize() +/obj/item/clothing/gloves/claws/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) @@ -727,7 +727,7 @@ to_chat(user, "[src] are now formed to allow for [fasthands ? "fast, precise strikes" : "crippling, damaging blows"].") addtimer(CALLBACK(src, .proc/use_buffs, user, TRUE), 0.1) // go fuckin get em -/obj/item/clothing/gloves/fingerless/pugilist/cling/Initialize() +/obj/item/clothing/gloves/fingerless/pugilist/cling/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) diff --git a/code/modules/antagonists/changeling/powers/transform.dm b/code/modules/antagonists/changeling/powers/transform.dm index cfd42f05cf..e685cbabfa 100644 --- a/code/modules/antagonists/changeling/powers/transform.dm +++ b/code/modules/antagonists/changeling/powers/transform.dm @@ -12,7 +12,7 @@ /obj/item/clothing/glasses/changeling name = "flesh" -/obj/item/clothing/glasses/changeling/Initialize() +/obj/item/clothing/glasses/changeling/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) @@ -27,7 +27,7 @@ /obj/item/clothing/under/changeling name = "flesh" -/obj/item/clothing/under/changeling/Initialize() +/obj/item/clothing/under/changeling/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) @@ -43,7 +43,7 @@ name = "flesh" allowed = list(/obj/item/changeling) -/obj/item/clothing/suit/changeling/Initialize() +/obj/item/clothing/suit/changeling/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) @@ -58,7 +58,7 @@ /obj/item/clothing/head/changeling name = "flesh" -/obj/item/clothing/head/changeling/Initialize() +/obj/item/clothing/head/changeling/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) @@ -72,7 +72,7 @@ /obj/item/clothing/shoes/changeling name = "flesh" -/obj/item/clothing/shoes/changeling/Initialize() +/obj/item/clothing/shoes/changeling/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) @@ -87,7 +87,7 @@ /obj/item/clothing/gloves/changeling name = "flesh" -/obj/item/clothing/gloves/changeling/Initialize() +/obj/item/clothing/gloves/changeling/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) @@ -102,7 +102,7 @@ /obj/item/clothing/mask/changeling name = "flesh" -/obj/item/clothing/mask/changeling/Initialize() +/obj/item/clothing/mask/changeling/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) @@ -119,7 +119,7 @@ slot_flags = ALL allowed = list(/obj/item/changeling) -/obj/item/changeling/Initialize() +/obj/item/changeling/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) diff --git a/code/modules/antagonists/clockcult/clock_effect.dm b/code/modules/antagonists/clockcult/clock_effect.dm index 8e3a8f4ceb..a788677eb1 100644 --- a/code/modules/antagonists/clockcult/clock_effect.dm +++ b/code/modules/antagonists/clockcult/clock_effect.dm @@ -10,7 +10,7 @@ opacity = 0 resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF -/obj/effect/clockwork/Initialize() +/obj/effect/clockwork/Initialize(mapload) . = ..() GLOB.all_clockwork_objects += src diff --git a/code/modules/antagonists/clockcult/clock_effects/city_of_cogs_rift.dm b/code/modules/antagonists/clockcult/clock_effects/city_of_cogs_rift.dm index 562d6a0c94..4dff21c369 100644 --- a/code/modules/antagonists/clockcult/clock_effects/city_of_cogs_rift.dm +++ b/code/modules/antagonists/clockcult/clock_effects/city_of_cogs_rift.dm @@ -16,7 +16,7 @@ /obj/effect/clockwork/city_of_cogs_rift/singularity_pull() return -/obj/effect/clockwork/city_of_cogs_rift/Initialize() +/obj/effect/clockwork/city_of_cogs_rift/Initialize(mapload) . = ..() visible_message("The air above [loc] shimmers and pops as a [name] forms there!") for(var/mob/M in GLOB.player_list) diff --git a/code/modules/antagonists/clockcult/clock_effects/clock_overlay.dm b/code/modules/antagonists/clockcult/clock_effects/clock_overlay.dm index 7e2fd1e11c..6c9097de0e 100644 --- a/code/modules/antagonists/clockcult/clock_effects/clock_overlay.dm +++ b/code/modules/antagonists/clockcult/clock_effects/clock_overlay.dm @@ -32,7 +32,7 @@ smooth = SMOOTH_TRUE layer = CLOSED_TURF_LAYER -/obj/effect/clockwork/overlay/wall/Initialize() +/obj/effect/clockwork/overlay/wall/Initialize(mapload) . = ..() queue_smooth_neighbors(src) addtimer(CALLBACK(GLOBAL_PROC, .proc/queue_smooth, src), 1) diff --git a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm index d7facb7f2d..18211d0447 100644 --- a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm +++ b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm @@ -200,7 +200,7 @@ sigil_name = "Sigil of Transmission" affects_servants = TRUE -/obj/effect/clockwork/sigil/transmission/Initialize() +/obj/effect/clockwork/sigil/transmission/Initialize(mapload) . = ..() update_icon() @@ -229,7 +229,7 @@ else if(get_clockwork_power()) to_chat(L, "You feel a slight, static shock.") -/obj/effect/clockwork/sigil/transmission/Initialize() +/obj/effect/clockwork/sigil/transmission/Initialize(mapload) . = ..() START_PROCESSING(SSobj, src) diff --git a/code/modules/antagonists/clockcult/clock_effects/servant_blocker.dm b/code/modules/antagonists/clockcult/clock_effects/servant_blocker.dm index 6fc2bde9d8..5905862690 100644 --- a/code/modules/antagonists/clockcult/clock_effects/servant_blocker.dm +++ b/code/modules/antagonists/clockcult/clock_effects/servant_blocker.dm @@ -8,7 +8,7 @@ density = TRUE CanAtmosPass = ATMOS_PASS_NO -/obj/effect/clockwork/servant_blocker/Initialize() +/obj/effect/clockwork/servant_blocker/Initialize(mapload) . = ..() air_update_turf(TRUE) diff --git a/code/modules/antagonists/clockcult/clock_effects/spatial_gateway.dm b/code/modules/antagonists/clockcult/clock_effects/spatial_gateway.dm index f2aa443f82..79ad69b76f 100644 --- a/code/modules/antagonists/clockcult/clock_effects/spatial_gateway.dm +++ b/code/modules/antagonists/clockcult/clock_effects/spatial_gateway.dm @@ -17,7 +17,7 @@ var/is_stable = FALSE var/busy = FALSE //If someone is already working on closing the gateway, only needed for stable gateways but in the parent to not need typecasting -/obj/effect/clockwork/spatial_gateway/Initialize() +/obj/effect/clockwork/spatial_gateway/Initialize(mapload) . = ..() addtimer(CALLBACK(src, .proc/check_setup), 1) diff --git a/code/modules/antagonists/clockcult/clock_item.dm b/code/modules/antagonists/clockcult/clock_item.dm index 7c8e877fb3..f4d5352ab9 100644 --- a/code/modules/antagonists/clockcult/clock_item.dm +++ b/code/modules/antagonists/clockcult/clock_item.dm @@ -8,7 +8,7 @@ icon_state = "rare_pepe" w_class = WEIGHT_CLASS_SMALL -/obj/item/clockwork/Initialize() +/obj/item/clockwork/Initialize(mapload) . = ..() ratvar_act() GLOB.all_clockwork_objects += src diff --git a/code/modules/antagonists/clockcult/clock_items/clock_components.dm b/code/modules/antagonists/clockcult/clock_items/clock_components.dm index a9307f15e1..1e5a538772 100644 --- a/code/modules/antagonists/clockcult/clock_items/clock_components.dm +++ b/code/modules/antagonists/clockcult/clock_items/clock_components.dm @@ -172,7 +172,7 @@ var/randomspritemax = 2 var/sprite_shift = 9 -/obj/item/clockwork/alloy_shards/Initialize() +/obj/item/clockwork/alloy_shards/Initialize(mapload) . = ..() if(randomsinglesprite) replace_name_desc() diff --git a/code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm b/code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm index 340f01f6f8..b98214668a 100644 --- a/code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm +++ b/code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm @@ -26,7 +26,7 @@ var/damage_per_combo = 2 var/maximum_combo_damage = 18 //33 damage on max stacks. Usually the target will already be dead by then but if they somehow aren't, better to have this capped -/obj/item/clockwork/brass_claw/Initialize() +/obj/item/clockwork/brass_claw/Initialize(mapload) . = ..() AddComponent(/datum/component/butchering, 60, 80) diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm index b5f2a358e6..f25d6b59b8 100644 --- a/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm +++ b/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm @@ -10,7 +10,7 @@ mutantrace_variation = STYLE_MUZZLE armor = list("melee" = 50, "bullet" = 70, "laser" = 0, "energy" = 0, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100, "magic" = 60, "wound" = 65) -/obj/item/clothing/head/helmet/clockwork/Initialize() +/obj/item/clothing/head/helmet/clockwork/Initialize(mapload) . = ..() ratvar_act() GLOB.all_clockwork_objects += src @@ -72,7 +72,7 @@ allowed = list(/obj/item/clockwork, /obj/item/clothing/glasses/wraith_spectacles, /obj/item/clothing/glasses/judicial_visor, /obj/item/mmi/posibrain/soul_vessel, /obj/item/reagent_containers/food/drinks/bottle/holyoil) mutantrace_variation = STYLE_DIGITIGRADE|STYLE_SNEK_TAURIC -/obj/item/clothing/suit/armor/clockwork/Initialize() +/obj/item/clothing/suit/armor/clockwork/Initialize(mapload) . = ..() ratvar_act() GLOB.all_clockwork_objects += src @@ -137,7 +137,7 @@ resistance_flags = FIRE_PROOF | ACID_PROOF armor = list("melee" = 80, "bullet" = 70, "laser" = 0, "energy" = 0, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100, "magic" = 70, "wound" = 85) -/obj/item/clothing/gloves/clockwork/Initialize() +/obj/item/clothing/gloves/clockwork/Initialize(mapload) . = ..() ratvar_act() GLOB.all_clockwork_objects += src @@ -190,7 +190,7 @@ equip_delay_other = 30 resistance_flags = FIRE_PROOF | ACID_PROOF -/obj/item/clothing/shoes/clockwork/Initialize() +/obj/item/clothing/shoes/clockwork/Initialize(mapload) . = ..() ratvar_act() GLOB.all_clockwork_objects += src diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm index d5c9b2cd2f..db19361ca8 100644 --- a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm +++ b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm @@ -106,7 +106,7 @@ if(!GLOB.ratvar_awakens) SStgui.close_uis(src) -/obj/item/clockwork/slab/Initialize() +/obj/item/clockwork/slab/Initialize(mapload) . = ..() update_slab_info(src) START_PROCESSING(SSobj, src) diff --git a/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm b/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm index 9342cd8ea5..be832f7e52 100644 --- a/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm +++ b/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm @@ -11,7 +11,7 @@ var/creation_message = "The chassis shudders and hums to life!" var/construct_type //The construct this shell will create -/obj/item/clockwork/construct_chassis/Initialize() +/obj/item/clockwork/construct_chassis/Initialize(mapload) . = ..() var/area/A = get_area(src) if(A && construct_type) @@ -92,7 +92,7 @@ var/infinite_resources = FALSE //No. var/static/obj/item/seasonal_hat //Share it with all other scarabs, since we're from the same cult! -/obj/item/clockwork/construct_chassis/cogscarab/Initialize() +/obj/item/clockwork/construct_chassis/cogscarab/Initialize(mapload) . = ..() if(GLOB.servants_active) infinite_resources = FALSE //This check is relatively irrelevant until *someone* makes the infinite resources var default to true again, so, leaving it in. diff --git a/code/modules/antagonists/clockcult/clock_items/integration_cog.dm b/code/modules/antagonists/clockcult/clock_items/integration_cog.dm index ab8e30c8bb..45c3f757a4 100644 --- a/code/modules/antagonists/clockcult/clock_items/integration_cog.dm +++ b/code/modules/antagonists/clockcult/clock_items/integration_cog.dm @@ -12,7 +12,7 @@ item_flags = NOBLUDGEON var/obj/machinery/power/apc/apc -/obj/item/clockwork/integration_cog/Initialize() +/obj/item/clockwork/integration_cog/Initialize(mapload) . = ..() transform *= 0.5 //little cog! diff --git a/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm b/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm index 138f04feb3..dc53217486 100644 --- a/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm +++ b/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm @@ -13,7 +13,7 @@ var/recharge_cooldown = 300 //divided by 10 if ratvar is alive actions_types = list(/datum/action/item_action/clock/toggle_visor) -/obj/item/clothing/glasses/judicial_visor/Initialize() +/obj/item/clothing/glasses/judicial_visor/Initialize(mapload) . = ..() GLOB.all_clockwork_objects += src blaster = new(src) diff --git a/code/modules/antagonists/clockcult/clock_items/soul_vessel.dm b/code/modules/antagonists/clockcult/clock_items/soul_vessel.dm index 6bec6e3bc7..f0e4863c4e 100644 --- a/code/modules/antagonists/clockcult/clock_items/soul_vessel.dm +++ b/code/modules/antagonists/clockcult/clock_items/soul_vessel.dm @@ -25,7 +25,7 @@ force_replace_ai_name = TRUE overrides_aicore_laws = TRUE -/obj/item/mmi/posibrain/soul_vessel/Initialize() +/obj/item/mmi/posibrain/soul_vessel/Initialize(mapload) . = ..() radio.on = FALSE laws = new /datum/ai_laws/ratvar() diff --git a/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm b/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm index 837844d0cb..c48696aa8c 100644 --- a/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm +++ b/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm @@ -12,7 +12,7 @@ visor_vars_to_toggle = NONE //we don't actually toggle anything we just set it tint = 3 //this'll get reset, but it won't handle vision updates properly otherwise -/obj/item/clothing/glasses/wraith_spectacles/Initialize() +/obj/item/clothing/glasses/wraith_spectacles/Initialize(mapload) . = ..() GLOB.all_clockwork_objects += src diff --git a/code/modules/antagonists/clockcult/clock_mobs.dm b/code/modules/antagonists/clockcult/clock_mobs.dm index 2f00fd4e4a..b6fe18986a 100644 --- a/code/modules/antagonists/clockcult/clock_mobs.dm +++ b/code/modules/antagonists/clockcult/clock_mobs.dm @@ -23,7 +23,7 @@ var/playstyle_string = "You are a bug, yell at whoever spawned you!" var/empower_string = "You have nothing to empower, yell at the coders!" //Shown to the mob when the herald beacon activates -/mob/living/simple_animal/hostile/clockwork/Initialize() +/mob/living/simple_animal/hostile/clockwork/Initialize(mapload) . = ..() update_values() diff --git a/code/modules/antagonists/clockcult/clock_mobs/clockwork_guardian.dm b/code/modules/antagonists/clockcult/clock_mobs/clockwork_guardian.dm index 5060f516c7..a1f9a7fa8d 100644 --- a/code/modules/antagonists/clockcult/clock_mobs/clockwork_guardian.dm +++ b/code/modules/antagonists/clockcult/clock_mobs/clockwork_guardian.dm @@ -34,7 +34,7 @@ Stay near your host to protect and heal them; being too far from your host will rapidly cause you massive damage. Recall to your host if you are too weak and believe you cannot continue \ fighting safely. As a final note, you should probably avoid harming any fellow servants of Ratvar." -/mob/living/simple_animal/hostile/clockwork/guardian/Initialize() +/mob/living/simple_animal/hostile/clockwork/guardian/Initialize(mapload) . = ..() true_name = pick(possible_true_names) diff --git a/code/modules/antagonists/clockcult/clock_structure.dm b/code/modules/antagonists/clockcult/clock_structure.dm index 380e93f102..345daa7515 100644 --- a/code/modules/antagonists/clockcult/clock_structure.dm +++ b/code/modules/antagonists/clockcult/clock_structure.dm @@ -18,7 +18,7 @@ var/construction_value = 0 //How much value the structure contributes to the overall "power" of the structures on the station var/immune_to_servant_attacks = FALSE //if we ignore attacks from servants of ratvar instead of taking damage -/obj/structure/destructible/clockwork/Initialize() +/obj/structure/destructible/clockwork/Initialize(mapload) . = ..() change_construction_value(construction_value) GLOB.all_clockwork_objects += src @@ -134,7 +134,7 @@ density = FALSE resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF | FREEZE_PROOF -/obj/structure/destructible/clockwork/massive/Initialize() +/obj/structure/destructible/clockwork/massive/Initialize(mapload) . = ..() GLOB.poi_list += src diff --git a/code/modules/antagonists/clockcult/clock_structures/_trap_object.dm b/code/modules/antagonists/clockcult/clock_structures/_trap_object.dm index 47a37583ba..29b8a1f010 100644 --- a/code/modules/antagonists/clockcult/clock_structures/_trap_object.dm +++ b/code/modules/antagonists/clockcult/clock_structures/_trap_object.dm @@ -5,7 +5,7 @@ clockwork_desc = "A trap that shouldn't exist, and you should report this as a bug." var/list/wired_to -/obj/structure/destructible/clockwork/trap/Initialize() +/obj/structure/destructible/clockwork/trap/Initialize(mapload) . = ..() wired_to = list() @@ -80,7 +80,7 @@ break_message = "The trigger breaks apart!" density = FALSE -/obj/structure/destructible/clockwork/trap/trigger/Initialize() +/obj/structure/destructible/clockwork/trap/trigger/Initialize(mapload) . = ..() for(var/obj/structure/destructible/clockwork/trap/T in get_turf(src)) if(!istype(T, /obj/structure/destructible/clockwork/trap/trigger)) diff --git a/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm b/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm index 44c57b77ad..6d1a3e589e 100644 --- a/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm +++ b/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm @@ -33,7 +33,7 @@ var/recalls_remaining = 1 var/recalling -/obj/structure/destructible/clockwork/massive/celestial_gateway/Initialize() +/obj/structure/destructible/clockwork/massive/celestial_gateway/Initialize(mapload) . = ..() INVOKE_ASYNC(src, .proc/spawn_animation) glow = new(get_turf(src)) diff --git a/code/modules/antagonists/clockcult/clock_structures/clockwork_obelisk.dm b/code/modules/antagonists/clockcult/clock_structures/clockwork_obelisk.dm index 2b4b797b4d..bb05427e25 100644 --- a/code/modules/antagonists/clockcult/clock_structures/clockwork_obelisk.dm +++ b/code/modules/antagonists/clockcult/clock_structures/clockwork_obelisk.dm @@ -16,7 +16,7 @@ var/hierophant_cost = MIN_CLOCKCULT_POWER //how much it costs to broadcast with large text var/gateway_cost = 2000 //how much it costs to open a gateway -/obj/structure/destructible/clockwork/powered/clockwork_obelisk/Initialize() +/obj/structure/destructible/clockwork/powered/clockwork_obelisk/Initialize(mapload) . = ..() toggle(1) diff --git a/code/modules/antagonists/clockcult/clock_structures/heralds_beacon.dm b/code/modules/antagonists/clockcult/clock_structures/heralds_beacon.dm index f8a3afbf91..8245f48a84 100644 --- a/code/modules/antagonists/clockcult/clock_structures/heralds_beacon.dm +++ b/code/modules/antagonists/clockcult/clock_structures/heralds_beacon.dm @@ -17,7 +17,7 @@ var/votes_needed = 0 //How many votes are needed to activate the beacon var/available = FALSE //If the beacon can be used -/obj/structure/destructible/clockwork/heralds_beacon/Initialize() +/obj/structure/destructible/clockwork/heralds_beacon/Initialize(mapload) . = ..() voters = list() START_PROCESSING(SSprocessing, src) diff --git a/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm b/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm index 00db2b0d72..f8174e19b9 100644 --- a/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm +++ b/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm @@ -16,7 +16,7 @@ var/atom/movable/target var/list/idle_messages = list(" sulkily glares around.", " lazily drifts from side to side.", " looks around for something to burn.", " slowly turns in circles.") -/obj/structure/destructible/clockwork/ocular_warden/Initialize() +/obj/structure/destructible/clockwork/ocular_warden/Initialize(mapload) . = ..() START_PROCESSING(SSfastprocess, src) diff --git a/code/modules/antagonists/clockcult/clock_structures/ratvar_the_clockwork_justicar.dm b/code/modules/antagonists/clockcult/clock_structures/ratvar_the_clockwork_justicar.dm index 51f8dc7101..da04353974 100644 --- a/code/modules/antagonists/clockcult/clock_structures/ratvar_the_clockwork_justicar.dm +++ b/code/modules/antagonists/clockcult/clock_structures/ratvar_the_clockwork_justicar.dm @@ -17,7 +17,7 @@ var/convert_range = 10 obj_flags = CAN_BE_HIT | DANGEROUS_POSSESSION -/obj/structure/destructible/clockwork/massive/ratvar/Initialize() +/obj/structure/destructible/clockwork/massive/ratvar/Initialize(mapload) . = ..() GLOB.ratvar_awakens++ for(var/obj/O in GLOB.all_clockwork_objects) diff --git a/code/modules/antagonists/clockcult/clock_structures/reflector.dm b/code/modules/antagonists/clockcult/clock_structures/reflector.dm index e734429524..7152953c6c 100644 --- a/code/modules/antagonists/clockcult/clock_structures/reflector.dm +++ b/code/modules/antagonists/clockcult/clock_structures/reflector.dm @@ -16,7 +16,7 @@ var/ini_dir = null -/obj/structure/destructible/clockwork/reflector/Initialize() +/obj/structure/destructible/clockwork/reflector/Initialize(mapload) . = ..() allowed_projectile_typecache = typecacheof(allowed_projectile_typecache) diff --git a/code/modules/antagonists/clockcult/clock_structures/stargazer.dm b/code/modules/antagonists/clockcult/clock_structures/stargazer.dm index dea8f428ba..178b78ff13 100644 --- a/code/modules/antagonists/clockcult/clock_structures/stargazer.dm +++ b/code/modules/antagonists/clockcult/clock_structures/stargazer.dm @@ -16,7 +16,7 @@ light_color = "#DAAA18" var/star_light_star_bright = FALSE //If this stargazer can see starlight -/obj/structure/destructible/clockwork/stargazer/Initialize() +/obj/structure/destructible/clockwork/stargazer/Initialize(mapload) . = ..() START_PROCESSING(SSprocessing, src) diff --git a/code/modules/antagonists/clockcult/clock_structures/taunting_trail.dm b/code/modules/antagonists/clockcult/clock_structures/taunting_trail.dm index 98b3c32b0f..5305758b25 100644 --- a/code/modules/antagonists/clockcult/clock_structures/taunting_trail.dm +++ b/code/modules/antagonists/clockcult/clock_structures/taunting_trail.dm @@ -14,7 +14,7 @@ debris = list() var/timerid -/obj/structure/destructible/clockwork/taunting_trail/Initialize() +/obj/structure/destructible/clockwork/taunting_trail/Initialize(mapload) . = ..() timerid = QDEL_IN(src, 15) var/obj/structure/destructible/clockwork/taunting_trail/Tt = locate(/obj/structure/destructible/clockwork/taunting_trail) in loc diff --git a/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm b/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm index e8ae133ede..eba53d97a4 100644 --- a/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm +++ b/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm @@ -13,7 +13,7 @@ var/wiggle_wiggle var/mutable_appearance/impale_overlay //This is applied to any mob impaled so that they visibly have the skewer coming through their chest -/obj/structure/destructible/clockwork/trap/brass_skewer/Initialize() +/obj/structure/destructible/clockwork/trap/brass_skewer/Initialize(mapload) . = ..() START_PROCESSING(SSfastprocess, src) diff --git a/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm b/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm index 7e4822b622..20cf8711e0 100644 --- a/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm +++ b/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm @@ -15,7 +15,7 @@ /obj/structure/destructible/clockwork/wall_gear/displaced anchored = FALSE -/obj/structure/destructible/clockwork/wall_gear/Initialize() +/obj/structure/destructible/clockwork/wall_gear/Initialize(mapload) . = ..() new /obj/effect/temp_visual/ratvar/gear(get_turf(src)) diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index 20e41828d4..e8157f6c90 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -39,7 +39,7 @@ armour_penetration = 35 actions_types = list(/datum/action/item_action/cult_dagger) -/obj/item/melee/cultblade/dagger/Initialize() +/obj/item/melee/cultblade/dagger/Initialize(mapload) . = ..() var/image/I = image(icon = 'icons/effects/blood.dmi' , icon_state = null, loc = src) I.override = TRUE @@ -62,7 +62,7 @@ hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "rended") -/obj/item/melee/cultblade/Initialize() +/obj/item/melee/cultblade/Initialize(mapload) . = ..() AddComponent(/datum/component/butchering, 40, 100) AddElement(/datum/element/sword_point) @@ -87,7 +87,7 @@ item_flags = NEEDS_PERMIT | DROPDEL flags_1 = NONE -/obj/item/melee/cultblade/ghost/Initialize() +/obj/item/melee/cultblade/ghost/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT) @@ -131,7 +131,7 @@ var/spin_cooldown = 250 var/dash_toggled = TRUE -/obj/item/cult_bastard/Initialize() +/obj/item/cult_bastard/Initialize(mapload) . = ..() set_light(4) jaunt = new(src) @@ -326,7 +326,7 @@ /obj/item/clothing/head/culthood/alt/ghost item_flags = DROPDEL -/obj/item/clothing/head/culthood/alt/ghost/Initialize() +/obj/item/clothing/head/culthood/alt/ghost/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT) @@ -340,7 +340,7 @@ /obj/item/clothing/suit/cultrobes/alt/ghost item_flags = DROPDEL -/obj/item/clothing/suit/cultrobes/alt/ghost/Initialize() +/obj/item/clothing/suit/cultrobes/alt/ghost/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT) @@ -716,7 +716,7 @@ var/wielded = FALSE // track wielded status on item -/obj/item/cult_spear/Initialize() +/obj/item/cult_spear/Initialize(mapload) . = ..() RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield) RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield) @@ -874,7 +874,7 @@ var/firing = FALSE var/angle -/obj/item/blood_beam/Initialize() +/obj/item/blood_beam/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT) diff --git a/code/modules/antagonists/cult/cult_structures.dm b/code/modules/antagonists/cult/cult_structures.dm index a2f283ec67..3a4079d67f 100644 --- a/code/modules/antagonists/cult/cult_structures.dm +++ b/code/modules/antagonists/cult/cult_structures.dm @@ -89,7 +89,7 @@ var/static/image/radial_shell = image(icon = 'icons/obj/wizard.dmi', icon_state = "construct-cult") var/static/image/radial_unholy_water = image(icon = 'icons/obj/drinks.dmi', icon_state = "holyflask") -/obj/structure/destructible/cult/talisman/Initialize() +/obj/structure/destructible/cult/talisman/Initialize(mapload) . = ..() radial_unholy_water.color = "#333333" diff --git a/code/modules/antagonists/cult/ritual.dm b/code/modules/antagonists/cult/ritual.dm index 98889169c6..6caa13dcff 100644 --- a/code/modules/antagonists/cult/ritual.dm +++ b/code/modules/antagonists/cult/ritual.dm @@ -5,7 +5,7 @@ This file contains the cult dagger and rune list code */ -/obj/item/melee/cultblade/dagger/Initialize() +/obj/item/melee/cultblade/dagger/Initialize(mapload) . = ..() if(!LAZYLEN(GLOB.rune_types)) GLOB.rune_types = list() diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 3b73a998e7..809a69d393 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -832,7 +832,7 @@ structure_check() searches for nearby cultist structures required for the invoca var/ghost_limit = 3 var/ghosts = 0 -/obj/effect/rune/manifest/Initialize() +/obj/effect/rune/manifest/Initialize(mapload) . = ..() diff --git a/code/modules/antagonists/devil/imp/imp.dm b/code/modules/antagonists/devil/imp/imp.dm index f7f55456f7..c0abe504a5 100644 --- a/code/modules/antagonists/devil/imp/imp.dm +++ b/code/modules/antagonists/devil/imp/imp.dm @@ -44,7 +44,7 @@ Though you are not obligated to help, perhaps by aiding a higher ranking devil, you might just get a promotion. However, you are incapable \ of intentionally harming a fellow devil." -/mob/living/simple_animal/imp/Initialize() +/mob/living/simple_animal/imp/Initialize(mapload) ..() boost = world.time + 30 diff --git a/code/modules/antagonists/devil/true_devil/_true_devil.dm b/code/modules/antagonists/devil/true_devil/_true_devil.dm index 619129f679..a70d518f59 100644 --- a/code/modules/antagonists/devil/true_devil/_true_devil.dm +++ b/code/modules/antagonists/devil/true_devil/_true_devil.dm @@ -25,7 +25,7 @@ var/mob/living/oldform var/list/devil_overlays[DEVIL_TOTAL_LAYERS] -/mob/living/carbon/true_devil/Initialize() +/mob/living/carbon/true_devil/Initialize(mapload) create_bodyparts() //initialize bodyparts create_internal_organs() grant_all_languages() diff --git a/code/modules/antagonists/eldritch_cult/eldritch_effects.dm b/code/modules/antagonists/eldritch_cult/eldritch_effects.dm index 3d6059dfe3..6640135f37 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_effects.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_effects.dm @@ -8,7 +8,7 @@ ///Used mainly for summoning ritual to prevent spamming the rune to create millions of monsters. var/is_in_use = FALSE -/obj/effect/eldritch/Initialize() +/obj/effect/eldritch/Initialize(mapload) . = ..() var/image/I = image(icon = 'icons/effects/eldritch.dmi', icon_state = null, loc = src) I.override = TRUE @@ -216,7 +216,7 @@ resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF alpha = 0 -/obj/effect/broken_illusion/Initialize() +/obj/effect/broken_illusion/Initialize(mapload) . = ..() addtimer(CALLBACK(src,.proc/show_presence),15 SECONDS) addtimer(CALLBACK(src,.proc/remove_presence),195 SECONDS) @@ -295,7 +295,7 @@ ///Tracked image var/image/img -/obj/effect/reality_smash/Initialize() +/obj/effect/reality_smash/Initialize(mapload) . = ..() GLOB.reality_smash_track.smashes += src img = image(icon, src, image_state, OBJ_LAYER) diff --git a/code/modules/antagonists/eldritch_cult/eldritch_items.dm b/code/modules/antagonists/eldritch_cult/eldritch_items.dm index c0f3e2be7c..67cba8767d 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_items.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_items.dm @@ -8,7 +8,7 @@ var/mob/living/carbon/human/target var/datum/antagonist/heretic/sac_targetter //The heretic who used this to acquire the current target - gets cleared when target gets sacrificed. -/obj/item/living_heart/Initialize() +/obj/item/living_heart/Initialize(mapload) . = ..() GLOB.living_heart_cache.Add(src) //Add is better than +=. @@ -310,7 +310,7 @@ . += "This item can carve 'Grasping carving' - when stepped on it causes heavy damage to the legs and stuns for 5 seconds." . += "This item can carve 'Mad carving' - when stepped on it causes dizzyness, jiterryness, temporary blindness, confusion , stuttering and slurring." -/obj/item/melee/rune_knife/Initialize() +/obj/item/melee/rune_knife/Initialize(mapload) . = ..() linked_action = new(src) diff --git a/code/modules/antagonists/eldritch_cult/eldritch_magic.dm b/code/modules/antagonists/eldritch_cult/eldritch_magic.dm index 158acc0071..8af1533690 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_magic.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_magic.dm @@ -702,7 +702,7 @@ duration = 1 MINUTES layer = LOW_SIGIL_LAYER -/obj/effect/temp_visual/glowing_rune/Initialize() +/obj/effect/temp_visual/glowing_rune/Initialize(mapload) . = ..() pixel_y = rand(-6,6) pixel_x = rand(-6,6) diff --git a/code/modules/antagonists/gang/cellphone.dm b/code/modules/antagonists/gang/cellphone.dm index f7971300f9..5cba485799 100644 --- a/code/modules/antagonists/gang/cellphone.dm +++ b/code/modules/antagonists/gang/cellphone.dm @@ -9,7 +9,7 @@ GLOBAL_LIST_EMPTY(gangster_cell_phones) var/gang_id = "Grove Street Families" var/activated = FALSE -/obj/item/gangster_cellphone/Initialize() +/obj/item/gangster_cellphone/Initialize(mapload) . = ..() GLOB.gangster_cell_phones += src flags_1 |= HEAR_1 diff --git a/code/modules/antagonists/morph/morph.dm b/code/modules/antagonists/morph/morph.dm index 8352b8f238..fbee439dda 100644 --- a/code/modules/antagonists/morph/morph.dm +++ b/code/modules/antagonists/morph/morph.dm @@ -52,7 +52,7 @@ You can attack any item or dead creature to consume it - creatures will fully restore your health. \ Finally, you can restore yourself to your original form while morphed by shift-clicking yourself." -/mob/living/simple_animal/hostile/morph/Initialize() +/mob/living/simple_animal/hostile/morph/Initialize(mapload) . = ..() src.AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS) diff --git a/code/modules/antagonists/nukeop/equipment/borgchameleon.dm b/code/modules/antagonists/nukeop/equipment/borgchameleon.dm index b3c31152a5..f40ecc27cf 100644 --- a/code/modules/antagonists/nukeop/equipment/borgchameleon.dm +++ b/code/modules/antagonists/nukeop/equipment/borgchameleon.dm @@ -32,7 +32,7 @@ var/list/engymodels = list("Default", "Default - Treads", "Heavy", "Sleek", "Marina", "Can", "Spider", "Loader","Handy", "Pup Dozer", "Vale") -/obj/item/borg_chameleon/Initialize() +/obj/item/borg_chameleon/Initialize(mapload) . = ..() friendlyName = pick(GLOB.ai_names) diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm index eb98635e65..2af2637760 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm @@ -31,7 +31,7 @@ var/proper_bomb = TRUE //Please var/obj/effect/countdown/nuclearbomb/countdown -/obj/machinery/nuclearbomb/Initialize() +/obj/machinery/nuclearbomb/Initialize(mapload) . = ..() countdown = new(src) GLOB.nuke_list += src @@ -507,7 +507,7 @@ proper_bomb = FALSE var/obj/structure/reagent_dispensers/beerkeg/keg -/obj/machinery/nuclearbomb/beer/Initialize() +/obj/machinery/nuclearbomb/beer/Initialize(mapload) . = ..() keg = new(src) QDEL_NULL(core) @@ -619,7 +619,7 @@ This is here to make the tiles around the station mininuke change when it's arme var/last_disk_move var/process_tick = 0 -/obj/item/disk/nuclear/Initialize() +/obj/item/disk/nuclear/Initialize(mapload) . = ..() AddElement(/datum/element/bed_tuckable, 6, -6, 0) diff --git a/code/modules/antagonists/nukeop/equipment/pinpointer.dm b/code/modules/antagonists/nukeop/equipment/pinpointer.dm index 5b48951ed5..2b00f85e36 100644 --- a/code/modules/antagonists/nukeop/equipment/pinpointer.dm +++ b/code/modules/antagonists/nukeop/equipment/pinpointer.dm @@ -74,7 +74,7 @@ flags_1 = NONE -/obj/item/pinpointer/syndicate_cyborg/Initialize() +/obj/item/pinpointer/syndicate_cyborg/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CYBORG_ITEM_TRAIT) @@ -91,7 +91,7 @@ target = closest_operative ..() -/obj/item/pinpointer/spider_cyborg/Initialize() +/obj/item/pinpointer/spider_cyborg/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CYBORG_ITEM_TRAIT) diff --git a/code/modules/antagonists/slaughter/slaughter.dm b/code/modules/antagonists/slaughter/slaughter.dm index c468862c8b..d2b698bce4 100644 --- a/code/modules/antagonists/slaughter/slaughter.dm +++ b/code/modules/antagonists/slaughter/slaughter.dm @@ -70,7 +70,7 @@ var/slam_mode = FALSE var/datum/action/cooldown/slam -/mob/living/simple_animal/slaughter/Initialize() +/mob/living/simple_animal/slaughter/Initialize(mapload) ..() var/obj/effect/proc_holder/spell/bloodcrawl/bloodspell = new AddSpell(bloodspell) @@ -282,7 +282,7 @@ T = find_safe_turf() for(var/mob/living/M in consumed_mobs) if(!M) - continue + continue M.forceMove(T) if(M.revive(full_heal = TRUE, admin_revive = TRUE)) M.grab_ghost(force = TRUE) diff --git a/code/modules/antagonists/swarmer/swarmer.dm b/code/modules/antagonists/swarmer/swarmer.dm index 2d4ac88656..02d7e89a93 100644 --- a/code/modules/antagonists/swarmer/swarmer.dm +++ b/code/modules/antagonists/swarmer/swarmer.dm @@ -30,7 +30,7 @@ 3. Biological resources will be harvested at a later date; do not harm them. "} -/obj/effect/mob_spawn/swarmer/Initialize() +/obj/effect/mob_spawn/swarmer/Initialize(mapload) . = ..() var/area/A = get_area(src) if(A) @@ -106,7 +106,7 @@ var/resources = 0 //Resource points, generated by consuming metal/glass var/max_resources = 100 -/mob/living/simple_animal/hostile/swarmer/Initialize() +/mob/living/simple_animal/hostile/swarmer/Initialize(mapload) . = ..() remove_verb(src, /mob/living/verb/pulled) for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) @@ -607,7 +607,7 @@ icon_state = "disintegrate" duration = 10 -/obj/effect/temp_visual/swarmer/disintegration/Initialize() +/obj/effect/temp_visual/swarmer/disintegration/Initialize(mapload) . = ..() playsound(loc, "sparks", 100, 1) diff --git a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm index fcc8bcade8..e5fa38a415 100644 --- a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm +++ b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm @@ -355,7 +355,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( var/detonation_timer var/next_announce -/obj/machinery/doomsday_device/Initialize() +/obj/machinery/doomsday_device/Initialize(mapload) . = ..() countdown = new(src) diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index 6f7ba374f7..7df91f4679 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -444,6 +444,6 @@ duration = 40 pixel_x = 500 -/obj/effect/temp_visual/tornado/Initialize() +/obj/effect/temp_visual/tornado/Initialize(mapload) . = ..() animate(src, pixel_x = -500, time = 40) diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm index 21de660edb..0701ade73c 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook.dm @@ -618,7 +618,7 @@ else . += "It appears to have no author." -/obj/item/spellbook/Initialize() +/obj/item/spellbook/Initialize(mapload) . = ..() prepare_spells() diff --git a/code/modules/arousal/toys/dildos.dm b/code/modules/arousal/toys/dildos.dm index 4de6877915..f80373140d 100644 --- a/code/modules/arousal/toys/dildos.dm +++ b/code/modules/arousal/toys/dildos.dm @@ -71,7 +71,7 @@ update_appearance() return TRUE -/obj/item/dildo/Initialize() +/obj/item/dildo/Initialize(mapload) . = ..() if(random_color == TRUE) var/randcolor = pick(GLOB.dildo_colors) diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index d0ed0f2436..eedbb6ee42 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -12,7 +12,7 @@ var/turf/listeningTo var/hearing_range = 3 -/obj/item/assembly/infra/Initialize() +/obj/item/assembly/infra/Initialize(mapload) . = ..() beams = list() START_PROCESSING(SSobj, src) diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index 60de1b3e87..49f912dff2 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -10,7 +10,7 @@ var/sensitivity = 1 var/hearing_range = 3 -/obj/item/assembly/prox_sensor/Initialize() +/obj/item/assembly/prox_sensor/Initialize(mapload) . = ..() proximity_monitor = new(src, 0) START_PROCESSING(SSobj, src) diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index e586f97a28..a4700e4f16 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -41,7 +41,7 @@ playsound(user, 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE) qdel(src) -/obj/item/assembly/signaler/Initialize() +/obj/item/assembly/signaler/Initialize(mapload) . = ..() set_frequency(frequency) diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm index e06bb22b0b..0234ac43df 100644 --- a/code/modules/assembly/timer.dm +++ b/code/modules/assembly/timer.dm @@ -22,7 +22,7 @@ user.adjustOxyLoss(200) user.death(0) -/obj/item/assembly/timer/Initialize() +/obj/item/assembly/timer/Initialize(mapload) . = ..() START_PROCESSING(SSobj, src) diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index a0665707ff..2c1902d4cc 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -28,7 +28,7 @@ var/list/atmos_overlay_types //gas IDs of current active gas overlays -/turf/open/Initialize() +/turf/open/Initialize(mapload) if(!blocks_air) air = new(2500,src) air.copy_from_turf(src) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index c652a7f791..699d8d8353 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -39,7 +39,7 @@ fair_market_price = 10 payment_department = ACCOUNT_MED -/obj/machinery/atmospherics/components/unary/cryo_cell/Initialize() +/obj/machinery/atmospherics/components/unary/cryo_cell/Initialize(mapload) . = ..() initialize_directions = dir diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm index 80a8ee4bf3..93d0bf8af7 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm @@ -24,7 +24,7 @@ var/heat_capacity = 0 var/interactive = TRUE // So mapmakers can disable interaction. -/obj/machinery/atmospherics/components/unary/thermomachine/Initialize() +/obj/machinery/atmospherics/components/unary/thermomachine/Initialize(mapload) . = ..() initialize_directions = dir @@ -197,7 +197,7 @@ on = TRUE icon_state = "freezer_1" -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on/Initialize() +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on/Initialize(mapload) . = ..() if(target_temperature == initial(target_temperature)) target_temperature = min_temperature @@ -205,7 +205,7 @@ /obj/machinery/atmospherics/components/unary/thermomachine/freezer/on/coldroom name = "cold room freezer" -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on/coldroom/Initialize() +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on/coldroom/Initialize(mapload) . = ..() target_temperature = T0C-80 diff --git a/code/modules/atmospherics/machinery/other/miner.dm b/code/modules/atmospherics/machinery/other/miner.dm index 1caae1376f..47deaba3c7 100644 --- a/code/modules/atmospherics/machinery/other/miner.dm +++ b/code/modules/atmospherics/machinery/other/miner.dm @@ -29,7 +29,7 @@ idle_power_usage = 150 active_power_usage = 2000 -/obj/machinery/atmospherics/miner/Initialize() +/obj/machinery/atmospherics/miner/Initialize(mapload) . = ..() set_active(active) //Force overlay update. diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm index 5fdedd5be7..b71c16b2ff 100644 --- a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm @@ -8,7 +8,7 @@ resistance_flags = LAVA_PROOF | FIRE_PROOF interacts_with_air = TRUE -/obj/machinery/atmospherics/pipe/heat_exchanging/Initialize() +/obj/machinery/atmospherics/pipe/heat_exchanging/Initialize(mapload) . = ..() add_atom_colour("#404040", FIXED_COLOUR_PRIORITY) diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold.dm index ce4aba6ab7..d2c5123527 100644 --- a/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold.dm +++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold.dm @@ -16,7 +16,7 @@ var/mutable_appearance/center -/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/Initialize() +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/Initialize(mapload) icon_state = "" center = mutable_appearance(icon, "manifold_center") return ..() diff --git a/code/modules/atmospherics/machinery/pipes/layermanifold.dm b/code/modules/atmospherics/machinery/pipes/layermanifold.dm index d019a03140..8a300e23f3 100644 --- a/code/modules/atmospherics/machinery/pipes/layermanifold.dm +++ b/code/modules/atmospherics/machinery/pipes/layermanifold.dm @@ -14,7 +14,7 @@ var/list/front_nodes var/list/back_nodes -/obj/machinery/atmospherics/pipe/layer_manifold/Initialize() +/obj/machinery/atmospherics/pipe/layer_manifold/Initialize(mapload) front_nodes = list() back_nodes = list() icon_state = "manifoldlayer_center" diff --git a/code/modules/atmospherics/machinery/pipes/manifold.dm b/code/modules/atmospherics/machinery/pipes/manifold.dm index 3f061e3779..d0b054fa3e 100644 --- a/code/modules/atmospherics/machinery/pipes/manifold.dm +++ b/code/modules/atmospherics/machinery/pipes/manifold.dm @@ -17,7 +17,7 @@ var/mutable_appearance/center -/obj/machinery/atmospherics/pipe/manifold/Initialize() +/obj/machinery/atmospherics/pipe/manifold/Initialize(mapload) icon_state = "" center = mutable_appearance(icon, "manifold_center") return ..() diff --git a/code/modules/atmospherics/machinery/pipes/manifold4w.dm b/code/modules/atmospherics/machinery/pipes/manifold4w.dm index bbceff56da..dd4cc1402c 100644 --- a/code/modules/atmospherics/machinery/pipes/manifold4w.dm +++ b/code/modules/atmospherics/machinery/pipes/manifold4w.dm @@ -16,7 +16,7 @@ var/mutable_appearance/center -/obj/machinery/atmospherics/pipe/manifold4w/Initialize() +/obj/machinery/atmospherics/pipe/manifold4w/Initialize(mapload) icon_state = "" center = mutable_appearance(icon, "manifold4w_center") return ..() diff --git a/code/modules/atmospherics/machinery/portable/pump.dm b/code/modules/atmospherics/machinery/portable/pump.dm index 68708c3233..12598b99d9 100644 --- a/code/modules/atmospherics/machinery/portable/pump.dm +++ b/code/modules/atmospherics/machinery/portable/pump.dm @@ -15,7 +15,7 @@ volume = 1000 -/obj/machinery/portable_atmospherics/pump/Initialize() +/obj/machinery/portable_atmospherics/pump/Initialize(mapload) . = ..() pump = new(src, FALSE) pump.on = TRUE diff --git a/code/modules/awaymissions/away_props.dm b/code/modules/awaymissions/away_props.dm index 36ed9b6ba3..72eeecedf4 100644 --- a/code/modules/awaymissions/away_props.dm +++ b/code/modules/awaymissions/away_props.dm @@ -20,7 +20,7 @@ invisibility = INVISIBILITY_MAXIMUM var/strength = 30 -/obj/effect/wind/Initialize() +/obj/effect/wind/Initialize(mapload) . = ..() START_PROCESSING(SSobj,src) diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index d32905e007..641a88ce22 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -35,7 +35,7 @@ QDEL_NULL(reset) return ..() -/obj/item/ctf/Initialize() +/obj/item/ctf/Initialize(mapload) . = ..() if(!reset) reset = new reset_path(get_turf(src)) @@ -167,7 +167,7 @@ var/static/arena_reset = FALSE var/static/list/people_who_want_to_play = list() -/obj/machinery/capture_the_flag/Initialize() +/obj/machinery/capture_the_flag/Initialize(mapload) . = ..() GLOB.poi_list |= src diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 668a8dcb92..76af33b613 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -36,7 +36,7 @@ ///override this to add special spawn conditions to a ghost role /obj/effect/mob_spawn/proc/allow_spawn(mob/user, silent = FALSE) return TRUE - + //ATTACK GHOST IGNORING PARENT RETURN VALUE /obj/effect/mob_spawn/attack_ghost(mob/user, latejoinercalling) if(!SSticker.HasRoundStarted() || !loc || !ghost_usable) @@ -184,7 +184,7 @@ var/facial_hair_style var/skin_tone -/obj/effect/mob_spawn/human/Initialize() +/obj/effect/mob_spawn/human/Initialize(mapload) if(ispath(outfit)) outfit = new outfit() if(!outfit) diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index 8aa265d39f..767304f799 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -174,7 +174,7 @@ GLOBAL_LIST_EMPTY(gateway_destinations) /// Visual object for handling the viscontents var/obj/effect/gateway_portal_effect/portal_visuals -/obj/machinery/gateway/Initialize() +/obj/machinery/gateway/Initialize(mapload) generate_destination() update_icon() portal_visuals = new @@ -231,7 +231,7 @@ GLOBAL_LIST_EMPTY(gateway_destinations) destination_type = /datum/gateway_destination/gateway/home destination_name = "Home Gateway" -/obj/machinery/gateway/centerstation/Initialize() +/obj/machinery/gateway/centerstation/Initialize(mapload) . = ..() if(!GLOB.the_gateway) GLOB.the_gateway = src diff --git a/code/modules/awaymissions/mission_code/Cabin.dm b/code/modules/awaymissions/mission_code/Cabin.dm index 3ad7c7cb50..b5ff23d75b 100644 --- a/code/modules/awaymissions/mission_code/Cabin.dm +++ b/code/modules/awaymissions/mission_code/Cabin.dm @@ -43,7 +43,7 @@ density = FALSE var/active = 1 -/obj/structure/firepit/Initialize() +/obj/structure/firepit/Initialize(mapload) ..() toggleFirepit() diff --git a/code/modules/awaymissions/mission_code/jungleresort.dm b/code/modules/awaymissions/mission_code/jungleresort.dm index f520cfdbee..8c5b7c4946 100644 --- a/code/modules/awaymissions/mission_code/jungleresort.dm +++ b/code/modules/awaymissions/mission_code/jungleresort.dm @@ -32,7 +32,7 @@ else UnregisterSignal(M, COMSIG_MOB_SAY) -/obj/item/clothing/head/rice_hat/cursed/Initialize() +/obj/item/clothing/head/rice_hat/cursed/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, SHAMEBRERO_TRAIT) diff --git a/code/modules/awaymissions/mission_code/murderdome.dm b/code/modules/awaymissions/mission_code/murderdome.dm index 2a7cb21841..eef757cf8e 100644 --- a/code/modules/awaymissions/mission_code/murderdome.dm +++ b/code/modules/awaymissions/mission_code/murderdome.dm @@ -26,7 +26,7 @@ icon_state = "barrier0" alpha = 100 -/obj/effect/murderdome/dead_barricade/Initialize() +/obj/effect/murderdome/dead_barricade/Initialize(mapload) . = ..() addtimer(CALLBACK(src, .proc/respawn), 3 MINUTES) diff --git a/code/modules/awaymissions/mission_code/stationCollision.dm b/code/modules/awaymissions/mission_code/stationCollision.dm index 962abc59fd..f72e0132cd 100644 --- a/code/modules/awaymissions/mission_code/stationCollision.dm +++ b/code/modules/awaymissions/mission_code/stationCollision.dm @@ -48,7 +48,7 @@ //Syndicate sub-machine guns. /obj/item/gun/ballistic/automatic/c20r/sc_c20r -/obj/item/gun/ballistic/automatic/c20r/sc_c20r/Initialize() +/obj/item/gun/ballistic/automatic/c20r/sc_c20r/Initialize(mapload) . = ..() for(var/ammo in magazine.stored_ammo) if(prob(95)) //95% chance @@ -57,7 +57,7 @@ //Barman's shotgun /obj/item/gun/ballistic/shotgun/sc_pump -/obj/item/gun/ballistic/shotgun/sc_pump/Initialize() +/obj/item/gun/ballistic/shotgun/sc_pump/Initialize(mapload) . = ..() for(var/ammo in magazine.stored_ammo) if(prob(95)) //95% chance diff --git a/code/modules/awaymissions/signpost.dm b/code/modules/awaymissions/signpost.dm index 4d85d947c2..a53384c6fa 100644 --- a/code/modules/awaymissions/signpost.dm +++ b/code/modules/awaymissions/signpost.dm @@ -7,7 +7,7 @@ var/question = "Travel back?" var/list/zlevels -/obj/structure/signpost/Initialize() +/obj/structure/signpost/Initialize(mapload) . = ..() set_light(2) zlevels = SSmapping.levels_by_trait(ZTRAIT_STATION) @@ -63,7 +63,7 @@ exit the area." question = "Leave? You might never come back." -/obj/structure/signpost/exit/Initialize() +/obj/structure/signpost/exit/Initialize(mapload) . = ..() zlevels = list() for(var/i in 1 to world.maxz) diff --git a/code/modules/awaymissions/super_secret_room.dm b/code/modules/awaymissions/super_secret_room.dm index af801e1e42..2c01a66d43 100644 --- a/code/modules/awaymissions/super_secret_room.dm +++ b/code/modules/awaymissions/super_secret_room.dm @@ -10,7 +10,7 @@ var/times_spoken_to = 0 var/list/shenanigans = list() -/obj/structure/speaking_tile/Initialize() +/obj/structure/speaking_tile/Initialize(mapload) . = ..() var/json_file = file("data/npc_saves/Poly.json") if(!fexists(json_file)) diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm index 1e2e1fe43c..a30e51a0a3 100644 --- a/code/modules/awaymissions/zlevel.dm +++ b/code/modules/awaymissions/zlevel.dm @@ -21,7 +21,7 @@ var/id var/delay = TRUE // If the generated destination should be delayed by configured gateway delay -/obj/effect/landmark/awaystart/Initialize() +/obj/effect/landmark/awaystart/Initialize(mapload) . = ..() var/datum/gateway_destination/point/current for(var/datum/gateway_destination/point/D in GLOB.gateway_destinations) diff --git a/code/modules/cargo/blackmarket/blackmarket_telepad.dm b/code/modules/cargo/blackmarket/blackmarket_telepad.dm index eb986a443a..1ad1496e60 100644 --- a/code/modules/cargo/blackmarket/blackmarket_telepad.dm +++ b/code/modules/cargo/blackmarket/blackmarket_telepad.dm @@ -25,7 +25,7 @@ var/transmitting // Current /datum/blackmarket_purchase being sent to the target uplink. var/list/datum/blackmarket_purchase/queue = list() // Queue for purchases that the machine should recieve and send. -/obj/machinery/ltsrbt/Initialize() +/obj/machinery/ltsrbt/Initialize(mapload) . = ..() SSblackmarket.telepads += src diff --git a/code/modules/cargo/blackmarket/blackmarket_uplink.dm b/code/modules/cargo/blackmarket/blackmarket_uplink.dm index 7d5b333f13..0c397fa7d6 100644 --- a/code/modules/cargo/blackmarket/blackmarket_uplink.dm +++ b/code/modules/cargo/blackmarket/blackmarket_uplink.dm @@ -1,6 +1,6 @@ /obj/item/blackmarket_uplink name = "Black Market Uplink" - desc = "A mishmash of a subspace amplifier, a radio, and an analyzer. Somehow able to access the black market, with a variable inventory in limited stock at inflated prices. No refunds, customer responsible for pick-ups." + desc = "A mishmash of a subspace amplifier, a radio, and an analyzer. Somehow able to access the black market, with a variable inventory in limited stock at inflated prices. No refunds, customer responsible for pick-ups." icon = 'icons/obj/blackmarket.dmi' icon_state = "uplink" // UI variables. @@ -13,7 +13,7 @@ var/money = 0 // How much money is inserted into the uplink. var/list/accessible_markets = list(/datum/blackmarket_market/blackmarket) // List of typepaths for "/datum/blackmarket_market"s that this uplink can access. -/obj/item/blackmarket_uplink/Initialize() +/obj/item/blackmarket_uplink/Initialize(mapload) . = ..() if(accessible_markets.len) viewing_market = accessible_markets[1] diff --git a/code/modules/cargo/bounty_console.dm b/code/modules/cargo/bounty_console.dm index 8a29715016..b2ee0e0e1a 100644 --- a/code/modules/cargo/bounty_console.dm +++ b/code/modules/cargo/bounty_console.dm @@ -9,7 +9,7 @@ var/printer_ready = 0 //cooldown var var/static/datum/bank_account/cargocash -/obj/machinery/computer/bounty/Initialize() +/obj/machinery/computer/bounty/Initialize(mapload) . = ..() printer_ready = world.time + PRINTER_TIMEOUT cargocash = SSeconomy.get_dep_account(ACCOUNT_CAR) @@ -20,7 +20,7 @@ /obj/item/paper/bounty_printout name = "paper - Bounties" -/obj/item/paper/bounty_printout/Initialize() +/obj/item/paper/bounty_printout/Initialize(mapload) . = ..() info = "

Nanotrasen Cargo Bounties


" update_icon() diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm index 9801b165c7..b0eb932d85 100644 --- a/code/modules/cargo/console.dm +++ b/code/modules/cargo/console.dm @@ -34,7 +34,7 @@ can_approve_requests = FALSE requestonly = TRUE -/obj/machinery/computer/cargo/Initialize() +/obj/machinery/computer/cargo/Initialize(mapload) . = ..() radio = new /obj/item/radio/headset/headset_cargo(src) diff --git a/code/modules/cargo/expressconsole.dm b/code/modules/cargo/expressconsole.dm index c065c387c5..50f9541b1e 100644 --- a/code/modules/cargo/expressconsole.dm +++ b/code/modules/cargo/expressconsole.dm @@ -26,7 +26,7 @@ var/locked = TRUE //is the console locked? unlock with ID var/usingBeacon = FALSE //is the console in beacon mode? exists to let beacon know when a pod may come in -/obj/machinery/computer/cargo/express/Initialize() +/obj/machinery/computer/cargo/express/Initialize(mapload) . = ..() packin_up() diff --git a/code/modules/cargo/supplypod.dm b/code/modules/cargo/supplypod.dm index 2bdd84141c..5a7451f831 100644 --- a/code/modules/cargo/supplypod.dm +++ b/code/modules/cargo/supplypod.dm @@ -89,7 +89,7 @@ style = customStyle setStyle(style) //Upon initialization, give the supplypod an iconstate, name, and description based on the "style" variable. This system is important for the centcom_podlauncher to function correctly -/obj/structure/closet/supplypod/extractionpod/Initialize() +/obj/structure/closet/supplypod/extractionpod/Initialize(mapload) . = ..() var/turf/picked_turf = pick(GLOB.holdingfacility) reverse_dropoff_coords = list(picked_turf.x, picked_turf.y, picked_turf.z) diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index 697afd4885..c13ecb4c7e 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -289,7 +289,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/under/chameleon) icon_state = "engine" item_state = "engi_suit" -/obj/item/clothing/under/chameleon/Initialize() +/obj/item/clothing/under/chameleon/Initialize(mapload) . = ..() chameleon_action = new(src) chameleon_action.chameleon_type = /obj/item/clothing/under @@ -303,7 +303,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/under/chameleon) return chameleon_action.emp_randomise() -/obj/item/clothing/under/chameleon/broken/Initialize() +/obj/item/clothing/under/chameleon/broken/Initialize(mapload) . = ..() chameleon_action.emp_randomise(INFINITY) @@ -318,7 +318,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/suit/chameleon) var/datum/action/item_action/chameleon/change/chameleon_action -/obj/item/clothing/suit/chameleon/Initialize() +/obj/item/clothing/suit/chameleon/Initialize(mapload) . = ..() chameleon_action = new(src) chameleon_action.chameleon_type = /obj/item/clothing/suit @@ -332,7 +332,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/suit/chameleon) return chameleon_action.emp_randomise() -/obj/item/clothing/suit/chameleon/broken/Initialize() +/obj/item/clothing/suit/chameleon/broken/Initialize(mapload) . = ..() chameleon_action.emp_randomise(INFINITY) @@ -346,7 +346,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/glasses/chameleon) var/datum/action/item_action/chameleon/change/chameleon_action -/obj/item/clothing/glasses/chameleon/Initialize() +/obj/item/clothing/glasses/chameleon/Initialize(mapload) . = ..() chameleon_action = new(src) chameleon_action.chameleon_type = /obj/item/clothing/glasses @@ -360,7 +360,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/glasses/chameleon) return chameleon_action.emp_randomise() -/obj/item/clothing/glasses/chameleon/broken/Initialize() +/obj/item/clothing/glasses/chameleon/broken/Initialize(mapload) . = ..() chameleon_action.emp_randomise(INFINITY) @@ -378,7 +378,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/gloves/chameleon) CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/gloves/chameleon/insulated) siemens_coefficient = 0 -/obj/item/clothing/gloves/chameleon/Initialize() +/obj/item/clothing/gloves/chameleon/Initialize(mapload) . = ..() chameleon_action = new(src) chameleon_action.chameleon_type = /obj/item/clothing/gloves @@ -392,7 +392,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/gloves/chameleon/insulated) return chameleon_action.emp_randomise() -/obj/item/clothing/gloves/chameleon/broken/Initialize() +/obj/item/clothing/gloves/chameleon/broken/Initialize(mapload) . = ..() chameleon_action.emp_randomise(INFINITY) @@ -406,7 +406,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/head/chameleon) var/datum/action/item_action/chameleon/change/chameleon_action -/obj/item/clothing/head/chameleon/Initialize() +/obj/item/clothing/head/chameleon/Initialize(mapload) . = ..() chameleon_action = new(src) chameleon_action.chameleon_type = /obj/item/clothing/head @@ -420,7 +420,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/head/chameleon) return chameleon_action.emp_randomise() -/obj/item/clothing/head/chameleon/broken/Initialize() +/obj/item/clothing/head/chameleon/broken/Initialize(mapload) . = ..() chameleon_action.emp_randomise(INFINITY) @@ -430,7 +430,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/head/chameleon) armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) // which means it offers no protection, it's just air and light -/obj/item/clothing/head/chameleon/drone/Initialize() +/obj/item/clothing/head/chameleon/drone/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) chameleon_action.random_look() @@ -456,7 +456,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/mask/chameleon) var/datum/action/item_action/chameleon/change/chameleon_action -/obj/item/clothing/mask/chameleon/Initialize() +/obj/item/clothing/mask/chameleon/Initialize(mapload) . = ..() chameleon_action = new(src) chameleon_action.chameleon_type = /obj/item/clothing/mask @@ -470,7 +470,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/mask/chameleon) return chameleon_action.emp_randomise() -/obj/item/clothing/mask/chameleon/broken/Initialize() +/obj/item/clothing/mask/chameleon/broken/Initialize(mapload) . = ..() chameleon_action.emp_randomise(INFINITY) @@ -484,7 +484,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/mask/chameleon) // Can drones use the voice changer part? Let's not find out. voice_change = 0 -/obj/item/clothing/mask/chameleon/drone/Initialize() +/obj/item/clothing/mask/chameleon/drone/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) chameleon_action.random_look() @@ -507,7 +507,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/shoes/chameleon) var/datum/action/item_action/chameleon/change/chameleon_action -/obj/item/clothing/shoes/chameleon/Initialize() +/obj/item/clothing/shoes/chameleon/Initialize(mapload) . = ..() chameleon_action = new(src) chameleon_action.chameleon_type = /obj/item/clothing/shoes @@ -527,7 +527,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/shoes/chameleon/noslip) desc = "A pair of black shoes." clothing_flags = NOSLIP -/obj/item/clothing/shoes/chameleon/noslip/broken/Initialize() +/obj/item/clothing/shoes/chameleon/noslip/broken/Initialize(mapload) . = ..() chameleon_action.emp_randomise(INFINITY) @@ -535,7 +535,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/storage/backpack/chameleon) name = "backpack" var/datum/action/item_action/chameleon/change/chameleon_action -/obj/item/storage/backpack/chameleon/Initialize() +/obj/item/storage/backpack/chameleon/Initialize(mapload) . = ..() chameleon_action = new(src) chameleon_action.chameleon_type = /obj/item/storage/backpack @@ -548,7 +548,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/storage/backpack/chameleon) return chameleon_action.emp_randomise() -/obj/item/storage/backpack/chameleon/broken/Initialize() +/obj/item/storage/backpack/chameleon/broken/Initialize(mapload) . = ..() chameleon_action.emp_randomise(INFINITY) @@ -557,7 +557,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/storage/belt/chameleon) desc = "Holds tools." var/datum/action/item_action/chameleon/change/chameleon_action -/obj/item/storage/belt/chameleon/Initialize() +/obj/item/storage/belt/chameleon/Initialize(mapload) . = ..() chameleon_action = new(src) @@ -576,7 +576,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/storage/belt/chameleon) return chameleon_action.emp_randomise() -/obj/item/storage/belt/chameleon/broken/Initialize() +/obj/item/storage/belt/chameleon/broken/Initialize(mapload) . = ..() chameleon_action.emp_randomise(INFINITY) @@ -584,7 +584,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/radio/headset/chameleon) name = "radio headset" var/datum/action/item_action/chameleon/change/chameleon_action -/obj/item/radio/headset/chameleon/Initialize() +/obj/item/radio/headset/chameleon/Initialize(mapload) . = ..() chameleon_action = new(src) chameleon_action.chameleon_type = /obj/item/radio/headset @@ -597,7 +597,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/radio/headset/chameleon) return chameleon_action.emp_randomise() -/obj/item/radio/headset/chameleon/broken/Initialize() +/obj/item/radio/headset/chameleon/broken/Initialize(mapload) . = ..() chameleon_action.emp_randomise(INFINITY) @@ -605,7 +605,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/pda/chameleon) name = "PDA" var/datum/action/item_action/chameleon/change/pda/chameleon_action -/obj/item/pda/chameleon/Initialize() +/obj/item/pda/chameleon/Initialize(mapload) . = ..() chameleon_action = new(src) chameleon_action.chameleon_type = /obj/item/pda @@ -619,21 +619,21 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/pda/chameleon) return chameleon_action.emp_randomise() -/obj/item/pda/chameleon/broken/Initialize() +/obj/item/pda/chameleon/broken/Initialize(mapload) . = ..() chameleon_action.emp_randomise(INFINITY) CHAMELEON_CLOTHING_DEFINE(/obj/item/stamp/chameleon) var/datum/action/item_action/chameleon/change/chameleon_action -/obj/item/stamp/chameleon/Initialize() +/obj/item/stamp/chameleon/Initialize(mapload) . = ..() chameleon_action = new(src) chameleon_action.chameleon_type = /obj/item/stamp chameleon_action.chameleon_name = "Stamp" chameleon_action.initialize_disguises() -/obj/item/stamp/chameleon/broken/Initialize() +/obj/item/stamp/chameleon/broken/Initialize(mapload) . = ..() chameleon_action.emp_randomise(INFINITY) @@ -648,7 +648,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/neck/cloak/chameleon) /obj/item/clothing/neck/cloak/chameleon var/datum/action/item_action/chameleon/change/chameleon_action -/obj/item/clothing/neck/cloak/chameleon/Initialize() +/obj/item/clothing/neck/cloak/chameleon/Initialize(mapload) . = ..() chameleon_action = new(src) chameleon_action.chameleon_type = /obj/item/clothing/neck diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 572cce28b2..c3e658518b 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -63,7 +63,7 @@ ///These are armor values that protect the clothing, taken from its armor datum. List updates on examine because it's currently only used to print armor ratings to chat in Topic(). var/list/durability_list = list() -/obj/item/clothing/Initialize() +/obj/item/clothing/Initialize(mapload) . = ..() if((clothing_flags & VOICEBOX_TOGGLABLE)) actions_types += /datum/action/item_action/toggle_voice_box diff --git a/code/modules/clothing/ears/_ears.dm b/code/modules/clothing/ears/_ears.dm index a2f0c80041..35871fb142 100644 --- a/code/modules/clothing/ears/_ears.dm +++ b/code/modules/clothing/ears/_ears.dm @@ -33,7 +33,7 @@ var/headphones_on = FALSE custom_price = PRICE_ALMOST_CHEAP -/obj/item/clothing/ears/headphones/Initialize() +/obj/item/clothing/ears/headphones/Initialize(mapload) . = ..() update_icon() diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 9726ab6b59..d89c02f241 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -299,7 +299,7 @@ actions_types = list(/datum/action/item_action/flash) var/obj/item/assembly/flash/installed -/obj/item/clothing/glasses/sunglasses/stunglasses/Initialize() +/obj/item/clothing/glasses/sunglasses/stunglasses/Initialize(mapload) . = ..() if (!installed) installed = new(src) @@ -491,7 +491,7 @@ lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE resistance_flags = LAVA_PROOF | FIRE_PROOF -/obj/item/clothing/glasses/godeye/Initialize() +/obj/item/clothing/glasses/godeye/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, EYE_OF_GOD_TRAIT) diff --git a/code/modules/clothing/glasses/engine_goggles.dm b/code/modules/clothing/glasses/engine_goggles.dm index d7e7ae3669..461648c270 100644 --- a/code/modules/clothing/glasses/engine_goggles.dm +++ b/code/modules/clothing/glasses/engine_goggles.dm @@ -26,7 +26,7 @@ desc = "Goggles used by engineers. The Meson Scanner mode lets you see basic structural and terrain layouts through walls, the T-ray Scanner mode lets you see underfloor objects such as cables and pipes, and the Radiation Scanner mode let's you see objects contaminated by radiation. Each lens has been replaced with a corrective lens." vision_correction = 1 -/obj/item/clothing/glasses/meson/engine/Initialize() +/obj/item/clothing/glasses/meson/engine/Initialize(mapload) . = ..() START_PROCESSING(SSobj, src) update_icon() diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index 1e3f2c08cf..08b9c4fd23 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -44,7 +44,7 @@ resistance_flags = ACID_PROOF var/shocks_remaining = 10 -/obj/item/clothing/gloves/color/yellow/sprayon/Initialize() +/obj/item/clothing/gloves/color/yellow/sprayon/Initialize(mapload) .=..() ADD_TRAIT(src, TRAIT_NODROP, GLOVE_TRAIT) @@ -79,7 +79,7 @@ desc = "Old and worn out insulated gloves, hopefully they still work." name = "worn out insulated gloves" -/obj/item/clothing/gloves/color/fyellow/old/Initialize() +/obj/item/clothing/gloves/color/fyellow/old/Initialize(mapload) . = ..() siemens_coefficient = pick(0,0,0,0.5,0.5,0.5,0.75) diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 381e70161b..88e6f79582 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -98,7 +98,7 @@ secondary_trait = TRAIT_ANTIMAGIC var/chaplain_spawnable = TRUE -/obj/item/clothing/gloves/fingerless/pugilist/chaplain/Initialize() +/obj/item/clothing/gloves/fingerless/pugilist/chaplain/Initialize(mapload) . = ..() AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, null, null, FALSE) @@ -138,7 +138,7 @@ var/warcry = "AT" secondary_trait = TRAIT_NOSOFTCRIT //basically extra health -/obj/item/clothing/gloves/fingerless/pugilist/rapid/Initialize() +/obj/item/clothing/gloves/fingerless/pugilist/rapid/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, GLOVE_TRAIT) diff --git a/code/modules/clothing/gloves/mittens.dm b/code/modules/clothing/gloves/mittens.dm index b1b17c9afe..2d00da6780 100644 --- a/code/modules/clothing/gloves/mittens.dm +++ b/code/modules/clothing/gloves/mittens.dm @@ -12,7 +12,7 @@ /obj/item/clothing/gloves/mittens/random -/obj/item/clothing/gloves/mittens/random/Initialize() +/obj/item/clothing/gloves/mittens/random/Initialize(mapload) ..() var/colours = list("black", "yellow", "lightbrown", "brown", "orange", "red", "purple", "green", "blue", "kitten") var/picked_c = pick(colours) diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm index ea58d0bc88..29a07fd177 100644 --- a/code/modules/clothing/head/_head.dm +++ b/code/modules/clothing/head/_head.dm @@ -10,7 +10,7 @@ dynamic_hair_suffix = "+generic" var/datum/beepsky_fashion/beepsky_fashion //the associated datum for applying this to a secbot -/obj/item/clothing/head/Initialize() +/obj/item/clothing/head/Initialize(mapload) . = ..() if(ishuman(loc) && dynamic_hair_suffix) var/mob/living/carbon/human/H = loc diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 95ce887693..7a11221315 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -117,7 +117,7 @@ visor_flags_inv = HIDEEYES | HIDEFACE visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH -/obj/item/clothing/head/hardhat/weldhat/Initialize() +/obj/item/clothing/head/hardhat/weldhat/Initialize(mapload) . = ..() update_icon() diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 592614af61..173e5ed2ec 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -99,7 +99,7 @@ pocket_storage_component_path = /datum/component/storage/concrete/pockets/small/detective dog_fashion = /datum/dog_fashion/head/detective -/obj/item/clothing/head/fedora/det_hat/Initialize() +/obj/item/clothing/head/fedora/det_hat/Initialize(mapload) . = ..() new /obj/item/reagent_containers/food/drinks/flask/det(src) @@ -147,7 +147,7 @@ desc = "That was white fabric. Was." dog_fashion = null //THIS IS FOR SLAUGHTER, NOT PUPPIES -/obj/item/clothing/head/beret/highlander/Initialize() +/obj/item/clothing/head/beret/highlander/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, HIGHLANDER) diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index eb48048c00..7b30aa0ce7 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -238,7 +238,7 @@ dog_fashion = null -/obj/item/clothing/head/sombrero/shamebrero/Initialize() +/obj/item/clothing/head/sombrero/shamebrero/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, SHAMEBRERO_TRAIT) diff --git a/code/modules/clothing/masks/cluwne.dm b/code/modules/clothing/masks/cluwne.dm index f39f5e73b8..cc2105d5fc 100644 --- a/code/modules/clothing/masks/cluwne.dm +++ b/code/modules/clothing/masks/cluwne.dm @@ -12,7 +12,7 @@ var/last_sound = 0 var/delay = 15 -/obj/item/clothing/mask/gas/cluwne/Initialize() +/obj/item/clothing/mask/gas/cluwne/Initialize(mapload) .=..() ADD_TRAIT(src, TRAIT_NODROP, CLOTHING_TRAIT) ADD_TRAIT(src, CURSED_ITEM_TRAIT, CLOTHING_TRAIT) @@ -68,7 +68,7 @@ var/is_cursed = FALSE //i don't care that this is *slightly* memory wasteful, it's just one more byte and it's not like some madman is going to spawn thousands of these var/is_very_cursed = FALSE -/obj/item/clothing/mask/gas/cluwne/happy_cluwne/Initialize() +/obj/item/clothing/mask/gas/cluwne/happy_cluwne/Initialize(mapload) .=..() if(prob(1)) //this function pre-determines the logic of the cluwne mask. applying and reapplying the mask does not alter or change anything is_cursed = TRUE diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index d78488ec0b..b74078ef17 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -55,7 +55,7 @@ /obj/item/clothing/mask/gas/welding/up -/obj/item/clothing/mask/gas/welding/up/Initialize() +/obj/item/clothing/mask/gas/welding/up/Initialize(mapload) ..() visor_toggling() diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 45da6a9a75..91fd34456f 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -133,7 +133,7 @@ flags_inv = HIDEFACIALHAIR clothing_flags = NONE -/obj/item/clothing/mask/pig/cursed/Initialize() +/obj/item/clothing/mask/pig/cursed/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CURSED_MASK_TRAIT) playsound(get_turf(src), 'sound/magic/pighead_curse.ogg', 50, 1) @@ -159,7 +159,7 @@ /obj/item/clothing/mask/frog/cursed clothing_flags = NONE -/obj/item/clothing/mask/frog/cursed/Initialize() +/obj/item/clothing/mask/frog/cursed/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CURSED_MASK_TRAIT) @@ -190,7 +190,7 @@ flags_inv = HIDEFACIALHAIR clothing_flags = NONE -/obj/item/clothing/mask/cowmask/cursed/Initialize() +/obj/item/clothing/mask/cowmask/cursed/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CURSED_MASK_TRAIT) playsound(get_turf(src), 'sound/magic/cowhead_curse.ogg', 50, 1) @@ -215,7 +215,7 @@ clothing_flags = NONE flags_inv = HIDEFACIALHAIR -/obj/item/clothing/mask/horsehead/cursed/Initialize() +/obj/item/clothing/mask/horsehead/cursed/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CURSED_MASK_TRAIT) playsound(get_turf(src), 'sound/magic/horsehead_curse.ogg', 50, 1) diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index 1f40df0f57..4f852fb301 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -175,7 +175,7 @@ var/tagname = null var/treat_path = /obj/item/reagent_containers/food/snacks/cookie -/obj/item/clothing/neck/petcollar/Initialize() +/obj/item/clothing/neck/petcollar/Initialize(mapload) . = ..() if(treat_path) new treat_path(src) diff --git a/code/modules/clothing/shoes/bananashoes.dm b/code/modules/clothing/shoes/bananashoes.dm index fe392881c6..c5949406f7 100644 --- a/code/modules/clothing/shoes/bananashoes.dm +++ b/code/modules/clothing/shoes/bananashoes.dm @@ -8,7 +8,7 @@ var/on = FALSE var/always_noslip = FALSE -/obj/item/clothing/shoes/clown_shoes/banana_shoes/Initialize() +/obj/item/clothing/shoes/clown_shoes/banana_shoes/Initialize(mapload) . = ..() if(always_noslip) clothing_flags |= NOSLIP diff --git a/code/modules/clothing/shoes/cluwne.dm b/code/modules/clothing/shoes/cluwne.dm index aec57a2148..ec135014e9 100644 --- a/code/modules/clothing/shoes/cluwne.dm +++ b/code/modules/clothing/shoes/cluwne.dm @@ -7,7 +7,7 @@ item_flags = DROPDEL var/footstep = 1 -/obj/item/clothing/shoes/clown_shoes/cluwne/Initialize() +/obj/item/clothing/shoes/clown_shoes/cluwne/Initialize(mapload) .=..() ADD_TRAIT(src, TRAIT_NODROP, CLOTHING_TRAIT) ADD_TRAIT(src, CURSED_ITEM_TRAIT, CLOTHING_TRAIT) diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index cd01d6f099..726b284632 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -56,7 +56,7 @@ /obj/item/clothing/shoes/magboots/advance/debug -/obj/item/clothing/shoes/magboots/advance/debug/Initialize() +/obj/item/clothing/shoes/magboots/advance/debug/Initialize(mapload) . = ..() var/mob/living/L = loc if(istype(L)) diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 7a67308760..a6b88df318 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -106,7 +106,7 @@ var/datum/component/waddle var/enabled_waddle = TRUE -/obj/item/clothing/shoes/clown_shoes/Initialize() +/obj/item/clothing/shoes/clown_shoes/Initialize(mapload) . = ..() AddComponent(/datum/component/squeak, list('sound/effects/clownstep1.ogg'=1,'sound/effects/clownstep2.ogg'=1), 50) @@ -231,7 +231,7 @@ /obj/item/clothing/shoes/cult/alt/ghost item_flags = DROPDEL -/obj/item/clothing/shoes/cult/alt/ghost/Initialize() +/obj/item/clothing/shoes/cult/alt/ghost/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT) @@ -321,7 +321,7 @@ icon_state = "clockwork_treads" lace_time = 8 SECONDS -/obj/item/clothing/shoes/bronze/Initialize() +/obj/item/clothing/shoes/bronze/Initialize(mapload) . = ..() AddComponent(/datum/component/squeak, list('sound/machines/clockcult/integration_cog_install.ogg' = 1, 'sound/magic/clockwork/fellowship_armory.ogg' = 1), 50) @@ -333,7 +333,7 @@ var/wheelToggle = FALSE //False means wheels are not popped out var/obj/vehicle/ridden/scooter/wheelys/W -/obj/item/clothing/shoes/wheelys/Initialize() +/obj/item/clothing/shoes/wheelys/Initialize(mapload) . = ..() W = new /obj/vehicle/ridden/scooter/wheelys(null) diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index d8a6426295..0aa0e4d418 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -18,7 +18,7 @@ var/grace_count = 0 var/datum/looping_sound/geiger/soundloop -/obj/item/clothing/head/helmet/space/hardsuit/Initialize() +/obj/item/clothing/head/helmet/space/hardsuit/Initialize(mapload) . = ..() soundloop = new(src, FALSE, TRUE) soundloop.volume = 5 @@ -108,7 +108,7 @@ var/hardsuit_type -/obj/item/clothing/suit/space/hardsuit/Initialize() +/obj/item/clothing/suit/space/hardsuit/Initialize(mapload) if(jetpack && ispath(jetpack)) jetpack = new jetpack(src) return ..() @@ -238,7 +238,7 @@ brightness_on = 7 allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator) -/obj/item/clothing/head/helmet/space/hardsuit/mining/Initialize() +/obj/item/clothing/head/helmet/space/hardsuit/mining/Initialize(mapload) . = ..() AddComponent(/datum/component/armor_plate) RegisterSignal(src, COMSIG_ARMOR_PLATED, .proc/upgrade_icon) @@ -271,7 +271,7 @@ heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS mutantrace_variation = STYLE_DIGITIGRADE|STYLE_ALL_TAURIC -/obj/item/clothing/suit/space/hardsuit/mining/Initialize() +/obj/item/clothing/suit/space/hardsuit/mining/Initialize(mapload) . = ..() AddComponent(/datum/component/armor_plate) RegisterSignal(src, COMSIG_ARMOR_PLATED, .proc/upgrade_icon) @@ -308,7 +308,7 @@ /obj/item/clothing/head/helmet/space/hardsuit/syndi/update_icon_state() icon_state = "hardsuit[on]-[hardsuit_type]" -/obj/item/clothing/head/helmet/space/hardsuit/syndi/Initialize() +/obj/item/clothing/head/helmet/space/hardsuit/syndi/Initialize(mapload) . = ..() if(istype(loc, /obj/item/clothing/suit/space/hardsuit/syndi)) linkedsuit = loc @@ -396,7 +396,7 @@ /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite/debug -/obj/item/clothing/head/helmet/space/hardsuit/syndi/elite/debug/Initialize() +/obj/item/clothing/head/helmet/space/hardsuit/syndi/elite/debug/Initialize(mapload) . = ..() soundloop.volume = 0 @@ -522,7 +522,7 @@ clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS | SCAN_REAGENTS actions_types = list(/datum/action/item_action/toggle_helmet_light, /datum/action/item_action/toggle_research_scanner) -/obj/item/clothing/head/helmet/space/hardsuit/rd/Initialize() +/obj/item/clothing/head/helmet/space/hardsuit/rd/Initialize(mapload) . = ..() bomb_radar = new /obj/machinery/doppler_array/integrated(src) @@ -568,7 +568,7 @@ helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security mutantrace_variation = STYLE_DIGITIGRADE|STYLE_ALL_TAURIC -/obj/item/clothing/suit/space/hardsuit/security/Initialize() +/obj/item/clothing/suit/space/hardsuit/security/Initialize(mapload) . = ..() allowed = GLOB.security_hardsuit_allowed @@ -615,7 +615,7 @@ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT //this needed to be added a long fucking time ago helmettype = /obj/item/clothing/head/helmet/space/hardsuit/captain -/obj/item/clothing/suit/space/hardsuit/captain/Initialize() +/obj/item/clothing/suit/space/hardsuit/captain/Initialize(mapload) . = ..() allowed = GLOB.security_hardsuit_allowed @@ -696,7 +696,7 @@ clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS | SCAN_REAGENTS resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF -/obj/item/clothing/head/helmet/space/hardsuit/ancient/mason/Initialize() +/obj/item/clothing/head/helmet/space/hardsuit/ancient/mason/Initialize(mapload) . = ..() bomb_radar = new /obj/machinery/doppler_array/integrated(src) @@ -765,7 +765,7 @@ helmettype = /obj/item/clothing/head/helmet/space/hardsuit/soviet mutantrace_variation = NONE -/obj/item/clothing/suit/space/hardsuit/soviet/Initialize() +/obj/item/clothing/suit/space/hardsuit/soviet/Initialize(mapload) . = ..() allowed = GLOB.security_hardsuit_allowed @@ -785,7 +785,7 @@ var/recharge_rate = 1 //How quickly the shield recharges once it starts charging var/shield_state = "shield-old" -/obj/item/clothing/suit/space/hardsuit/shielded/Initialize() +/obj/item/clothing/suit/space/hardsuit/shielded/Initialize(mapload) . = ..() if(!allowed) allowed = GLOB.advanced_hardsuit_allowed @@ -810,7 +810,7 @@ slowdown = 0 max_charges = 5 -/obj/item/clothing/suit/space/hardsuit/shielded/ctf/Initialize() +/obj/item/clothing/suit/space/hardsuit/shielded/ctf/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CAPTURE_THE_FLAG_TRAIT) @@ -863,7 +863,7 @@ slowdown = 0 mutantrace_variation = STYLE_DIGITIGRADE|STYLE_ALL_TAURIC -/obj/item/clothing/suit/space/hardsuit/shielded/syndi/Initialize() +/obj/item/clothing/suit/space/hardsuit/shielded/syndi/Initialize(mapload) jetpack = new /obj/item/tank/jetpack/suit(src) . = ..() @@ -921,7 +921,7 @@ var/obj/item/clothing/suit/space/hardsuit/lavaknight/linkedsuit = null mutantrace_variation = NONE -/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/Initialize() +/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/Initialize(mapload) . = ..() if(istype(loc, /obj/item/clothing/suit/space/hardsuit/lavaknight)) var/obj/item/clothing/suit/space/hardsuit/lavaknight/S = loc @@ -964,7 +964,7 @@ heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS var/energy_color = "#35FFF0" -/obj/item/clothing/suit/space/hardsuit/lavaknight/Initialize() +/obj/item/clothing/suit/space/hardsuit/lavaknight/Initialize(mapload) ..() light_color = energy_color set_light(1) diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index f51593b590..b135cd2bc5 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -180,7 +180,7 @@ Contains: brightness_on = 7 resistance_flags = ACID_PROOF -/obj/item/clothing/head/helmet/space/hardsuit/ert/Initialize() +/obj/item/clothing/head/helmet/space/hardsuit/ert/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, LOCKED_HELMET_TRAIT) @@ -367,7 +367,7 @@ Contains: actions_types = list() mutantrace_variation = NONE -/obj/item/clothing/head/helmet/space/hardsuit/carp/Initialize() +/obj/item/clothing/head/helmet/space/hardsuit/carp/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, LOCKED_HELMET_TRAIT) @@ -395,7 +395,7 @@ Contains: mutantrace_variation = NONE var/charges = INFINITY -/obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/Initialize() +/obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/Initialize(mapload) . = ..() AddComponent(/datum/component/anti_magic, FALSE, FALSE, TRUE, ITEM_SLOT_HEAD, charges, TRUE, null, CALLBACK(src, .proc/anti_magic_gone)) @@ -416,7 +416,7 @@ Contains: resistance_flags = FIRE_PROOF var/charges = INFINITY -/obj/item/clothing/suit/space/hardsuit/ert/paranormal/Initialize() +/obj/item/clothing/suit/space/hardsuit/ert/paranormal/Initialize(mapload) . = ..() AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, ITEM_SLOT_OCLOTHING, charges, TRUE, null, CALLBACK(src, .proc/anti_magic_gone)) diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index 25ad19eee4..5117d7f811 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -58,7 +58,7 @@ visor_flags_inv = HIDEEYES|HIDEFACE|HIDEFACIALHAIR mutantrace_variation = NONE -/obj/item/clothing/head/helmet/space/plasmaman/Initialize() +/obj/item/clothing/head/helmet/space/plasmaman/Initialize(mapload) . = ..() visor_toggling() update_icon() diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 90fd0b2812..acc29423f2 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -11,7 +11,7 @@ armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "wound" = 10) -/obj/item/clothing/suit/armor/Initialize() +/obj/item/clothing/suit/armor/Initialize(mapload) . = ..() if(!allowed) allowed = GLOB.security_vest_allowed @@ -145,7 +145,7 @@ armor = list("melee" = 50, "bullet" = 40, "laser" = 50, "energy" = 50, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 90, "wound" = 10) togglename = "buttons" -/obj/item/clothing/suit/toggle/captains_parade/Initialize() +/obj/item/clothing/suit/toggle/captains_parade/Initialize(mapload) . = ..() allowed = GLOB.security_wintercoat_allowed @@ -207,7 +207,7 @@ resistance_flags = FLAMMABLE dog_fashion = null -/obj/item/clothing/suit/armor/vest/det_suit/Initialize() +/obj/item/clothing/suit/armor/vest/det_suit/Initialize(mapload) . = ..() allowed = GLOB.detective_vest_allowed @@ -336,7 +336,7 @@ armor = list("melee" = 35, "bullet" = 40, "laser" = 40, "energy" = 50, "bomb" = 35, "bio" = 10, "rad" = 10, "fire" = 10, "acid" = 60) togglename = "buttons" -/obj/item/clothing/suit/toggle/armor/vest/centcom_formal/Initialize() +/obj/item/clothing/suit/toggle/armor/vest/centcom_formal/Initialize(mapload) . = ..() allowed = GLOB.security_wintercoat_allowed @@ -349,6 +349,6 @@ armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 90, "wound" = 10) togglename = "buttons" -/obj/item/clothing/suit/toggle/armor/hos/hos_formal/Initialize() +/obj/item/clothing/suit/toggle/armor/hos/hos_formal/Initialize(mapload) . = ..() allowed = GLOB.security_wintercoat_allowed diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index 13bfd8b460..aaa08ff791 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -107,7 +107,7 @@ heat_protection = CHEST|GROIN|LEGS|ARMS mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON -/obj/item/clothing/suit/det_suit/Initialize() +/obj/item/clothing/suit/det_suit/Initialize(mapload) . = ..() allowed = GLOB.detective_vest_allowed diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 57d2ae5c69..cea27f1ec0 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -185,7 +185,7 @@ body_parts_covered = ARMS actions_types = list(/datum/action/item_action/toggle_wings) -/obj/item/clothing/suit/toggle/owlwings/Initialize() +/obj/item/clothing/suit/toggle/owlwings/Initialize(mapload) . = ..() allowed = GLOB.security_vest_allowed @@ -259,7 +259,7 @@ icon_state = "ponchoshame" item_state = "ponchoshame" -/obj/item/clothing/suit/poncho/ponchoshame/Initialize() +/obj/item/clothing/suit/poncho/ponchoshame/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, SHAMEBRERO_TRAIT) @@ -692,7 +692,7 @@ armor = list("melee" = 40, "bullet" = 45, "laser" = 45, "energy" = 35, "bomb" = 40, "bio" = 25, "rad" = 25, "fire" = 35, "acid" = 50) hoodtype = /obj/item/clothing/head/hooded/winterhood/centcom -/obj/item/clothing/suit/hooded/wintercoat/centcom/Initialize() +/obj/item/clothing/suit/hooded/wintercoat/centcom/Initialize(mapload) . = ..() allowed = GLOB.security_wintercoat_allowed @@ -708,7 +708,7 @@ armor = list("melee" = 25, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50) hoodtype = /obj/item/clothing/head/hooded/winterhood/captain -/obj/item/clothing/suit/hooded/wintercoat/captain/Initialize() +/obj/item/clothing/suit/hooded/wintercoat/captain/Initialize(mapload) . = ..() allowed = GLOB.security_wintercoat_allowed @@ -736,7 +736,7 @@ armor = list("melee" = 25, "bullet" = 15, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45) hoodtype = /obj/item/clothing/head/hooded/winterhood/security -/obj/item/clothing/suit/hooded/wintercoat/security/Initialize() +/obj/item/clothing/suit/hooded/wintercoat/security/Initialize(mapload) . = ..() allowed = GLOB.security_wintercoat_allowed @@ -752,7 +752,7 @@ armor = list("melee" = 35, "bullet" = 35, "laser" = 35, "energy" = 15, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 55) hoodtype = /obj/item/clothing/head/hooded/winterhood/hos -/obj/item/clothing/suit/hooded/wintercoat/hos/Initialize() +/obj/item/clothing/suit/hooded/wintercoat/hos/Initialize(mapload) . = ..() allowed = GLOB.security_wintercoat_allowed @@ -1089,7 +1089,7 @@ armor = list("melee" = 15, "bullet" = 8, "laser" = 25, "energy" = 5, "bomb" = 12, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50) hoodtype = /obj/item/clothing/head/hooded/winterhood/durathread -/obj/item/clothing/suit/hooded/wintercoat/durathread/Initialize() +/obj/item/clothing/suit/hooded/wintercoat/durathread/Initialize(mapload) . = ..() allowed = GLOB.security_wintercoat_allowed diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm index 5ee247e135..25cbf27cf6 100644 --- a/code/modules/clothing/suits/toggles.dm +++ b/code/modules/clothing/suits/toggles.dm @@ -8,7 +8,7 @@ var/alternative_mode = FALSE var/no_t //do not update sprites when pulling up hood so we can avoid oddities with certain mechanics -/obj/item/clothing/suit/hooded/Initialize() +/obj/item/clothing/suit/hooded/Initialize(mapload) . = ..() hood = MakeHelmet() @@ -146,7 +146,7 @@ . += "Alt-click on [src] to toggle the [togglename]." //Hardsuit toggle code -/obj/item/clothing/suit/space/hardsuit/Initialize() +/obj/item/clothing/suit/space/hardsuit/Initialize(mapload) . = ..() helmet = MakeHelmet() diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm index 40d30235d8..062aa2d4b2 100644 --- a/code/modules/clothing/under/accessories.dm +++ b/code/modules/clothing/under/accessories.dm @@ -480,13 +480,13 @@ icon_state = "pocketprotector" pocket_storage_component_path = /datum/component/storage/concrete/pockets/pocketprotector -/obj/item/clothing/accessory/pocketprotector/full/Initialize() +/obj/item/clothing/accessory/pocketprotector/full/Initialize(mapload) . = ..() new /obj/item/pen/red(src) new /obj/item/pen(src) new /obj/item/pen/blue(src) -/obj/item/clothing/accessory/pocketprotector/cosmetology/Initialize() +/obj/item/clothing/accessory/pocketprotector/cosmetology/Initialize(mapload) . = ..() for(var/i in 1 to 3) new /obj/item/lipstick/random(src) diff --git a/code/modules/clothing/under/cluwne.dm b/code/modules/clothing/under/cluwne.dm index e1af4b5171..572a2017e6 100644 --- a/code/modules/clothing/under/cluwne.dm +++ b/code/modules/clothing/under/cluwne.dm @@ -8,7 +8,7 @@ can_adjust = 0 mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON -/obj/item/clothing/under/cluwne/Initialize() +/obj/item/clothing/under/cluwne/Initialize(mapload) .=..() ADD_TRAIT(src, TRAIT_NODROP, CLOTHING_TRAIT) ADD_TRAIT(src, CURSED_ITEM_TRAIT, CLOTHING_TRAIT) diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm index 06d2771d88..215be905aa 100644 --- a/code/modules/clothing/under/color.dm +++ b/code/modules/clothing/under/color.dm @@ -11,7 +11,7 @@ /obj/item/clothing/under/color/random icon_state = "random_jumpsuit" -/obj/item/clothing/under/color/random/Initialize() +/obj/item/clothing/under/color/random/Initialize(mapload) ..() var/obj/item/clothing/under/color/C = pick(subtypesof(/obj/item/clothing/under/color) - subtypesof(/obj/item/clothing/under/color/jumpskirt) - /obj/item/clothing/under/color/random - /obj/item/clothing/under/color/grey/glorf - /obj/item/clothing/under/color/black/ghost) @@ -25,7 +25,7 @@ /obj/item/clothing/under/color/jumpskirt/random icon_state = "random_jumpsuit" //Skirt variant needed -/obj/item/clothing/under/color/jumpskirt/random/Initialize() +/obj/item/clothing/under/color/jumpskirt/random/Initialize(mapload) ..() var/obj/item/clothing/under/color/jumpskirt/C = pick(subtypesof(/obj/item/clothing/under/color/jumpskirt) - /obj/item/clothing/under/color/jumpskirt/random) if(ishuman(loc)) @@ -54,11 +54,11 @@ /obj/item/clothing/under/color/black/ghost item_flags = DROPDEL -/obj/item/clothing/under/color/black/ghost/Initialize() +/obj/item/clothing/under/color/black/ghost/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT) -/obj/item/clothing/under/color/black/ghost/Initialize() +/obj/item/clothing/under/color/black/ghost/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, DROPDEL) /obj/item/clothing/under/color/grey diff --git a/code/modules/clothing/under/costume.dm b/code/modules/clothing/under/costume.dm index 9ebc79bd41..50da2d79c8 100644 --- a/code/modules/clothing/under/costume.dm +++ b/code/modules/clothing/under/costume.dm @@ -85,7 +85,7 @@ /obj/item/clothing/under/costume/kilt/highlander desc = "You're the only one worthy of this kilt." -/obj/item/clothing/under/costume/kilt/highlander/Initialize() +/obj/item/clothing/under/costume/kilt/highlander/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, HIGHLANDER) @@ -125,7 +125,7 @@ can_adjust = FALSE mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON -/obj/item/clothing/under/costume/maid/Initialize() +/obj/item/clothing/under/costume/maid/Initialize(mapload) . = ..() var/obj/item/clothing/accessory/maidapron/A = new (src) attach_accessory(A) @@ -282,7 +282,7 @@ can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON - + /obj/item/clothing/under/costume/qipao/white name = "White Qipao" diff --git a/code/modules/clothing/under/jobs/civilian/clown_mime.dm b/code/modules/clothing/under/jobs/civilian/clown_mime.dm index 25c40ee5d8..cf4d7672ce 100644 --- a/code/modules/clothing/under/jobs/civilian/clown_mime.dm +++ b/code/modules/clothing/under/jobs/civilian/clown_mime.dm @@ -118,6 +118,6 @@ can_adjust = FALSE mutantrace_variation = STYLE_DIGITIGRADE|USE_TAUR_CLIP_MASK -/obj/item/clothing/under/rank/civilian/clown/Initialize() +/obj/item/clothing/under/rank/civilian/clown/Initialize(mapload) . = ..() AddComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg'=1), 50) diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm index 31859b4fc0..47a466bf0a 100644 --- a/code/modules/events/pirates.dm +++ b/code/modules/events/pirates.dm @@ -275,7 +275,7 @@ var/sending_timer var/cargo_hold_id -/obj/machinery/computer/piratepad_control/Initialize() +/obj/machinery/computer/piratepad_control/Initialize(mapload) ..() return INITIALIZE_HINT_LATELOAD diff --git a/code/modules/events/shuttle_loan.dm b/code/modules/events/shuttle_loan.dm index 347162d9c5..38d52797d7 100644 --- a/code/modules/events/shuttle_loan.dm +++ b/code/modules/events/shuttle_loan.dm @@ -271,7 +271,7 @@ name = "Objectives of a Bee Liberation Front Operative" info = "Objective #1. Liberate all bees on the NT transport vessel 2416/B. Success!
Objective #2. Escape alive. Failed." -/obj/machinery/syndicatebomb/shuttle_loan/Initialize() +/obj/machinery/syndicatebomb/shuttle_loan/Initialize(mapload) . = ..() setAnchored(TRUE) timer_set = rand(480, 600) //once the supply shuttle docks (after 5 minutes travel time), players have between 3-5 minutes to defuse the bomb diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index ed6a087cd9..dd806c8eca 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -276,7 +276,7 @@ var/datum/spacevine_controller/master = null var/list/mutations = list() -/obj/structure/spacevine/Initialize() +/obj/structure/spacevine/Initialize(mapload) . = ..() add_atom_colour("#ffffff", FIXED_COLOUR_PRIORITY) diff --git a/code/modules/events/travelling_trader.dm b/code/modules/events/travelling_trader.dm index f7cbba2e4a..03aabc940b 100644 --- a/code/modules/events/travelling_trader.dm +++ b/code/modules/events/travelling_trader.dm @@ -98,7 +98,7 @@ var/reward = pickweight(possible_rewards) new reward(get_turf(src)) -/mob/living/carbon/human/dummy/travelling_trader/Initialize() +/mob/living/carbon/human/dummy/travelling_trader/Initialize(mapload) . = ..() // return a hint you fuck add_atom_colour("#570d6b", FIXED_COLOUR_PRIORITY) //make them purple (otherworldly!) set_light(1, -0.7, "#AAD84B") @@ -134,7 +134,7 @@ /obj/item/kitchen/fork/throwing = 1, /mob/living/simple_animal/cow/random = 1) -/mob/living/carbon/human/dummy/travelling_trader/cook/Initialize() +/mob/living/carbon/human/dummy/travelling_trader/cook/Initialize(mapload) //pick a random crafted food item as the requested item var/datum/crafting_recipe/food_recipe = pick(subtypesof(/datum/crafting_recipe/food)) var/result = initial(food_recipe.result) @@ -158,7 +158,7 @@ /obj/item/seeds/gatfruit = 1) //overall you have less chance of seeing them than a lifebringer just bringing the seeds to you directly -/mob/living/carbon/human/dummy/travelling_trader/gardener/Initialize() +/mob/living/carbon/human/dummy/travelling_trader/gardener/Initialize(mapload) requested_item = pick(subtypesof(/obj/item/reagent_containers/food/snacks/grown) - list(/obj/item/reagent_containers/food/snacks/grown/shell, /obj/item/reagent_containers/food/snacks/grown/shell/gatfruit, /obj/item/reagent_containers/food/snacks/grown/cherry_bomb)) @@ -188,7 +188,7 @@ /mob/living/simple_animal/hostile/netherworld/blankbody = 1, /mob/living/simple_animal/hostile/retaliate/goose = 1) -/mob/living/carbon/human/dummy/travelling_trader/animal_hunter/Initialize() +/mob/living/carbon/human/dummy/travelling_trader/animal_hunter/Initialize(mapload) . = ..() acceptance_speech = pick(list("This lifeform shall make for a great stew, thank you.", "This lifeform shall be of a true use to our cause, thank you.", "The lifeform is adequate. Goodbye.", "This lifeform shall make a great addition to my collection.")) @@ -222,7 +222,7 @@ /obj/structure/reagent_dispensers/keg/narsour = 3, /obj/structure/reagent_dispensers/keg/quintuple_sec = 3) -/mob/living/carbon/human/dummy/travelling_trader/bartender/Initialize() //pick a subtype of ethanol that isn't found in the default set of the booze dispensers reagents +/mob/living/carbon/human/dummy/travelling_trader/bartender/Initialize(mapload) //pick a subtype of ethanol that isn't found in the default set of the booze dispensers reagents . = ..() // RETURN A HINT. requested_item = pick(subtypesof(/datum/reagent/consumable/ethanol) - list(/datum/reagent/consumable/ethanol/beer, /datum/reagent/consumable/ethanol/kahlua, @@ -276,7 +276,7 @@ /obj/item/stack/sticky_tape/infinite = 2, /obj/item/clothing/suit/hooded/wintercoat/cosmic = 2) -/mob/living/carbon/human/dummy/travelling_trader/artifact_dealer/Initialize() +/mob/living/carbon/human/dummy/travelling_trader/artifact_dealer/Initialize(mapload) possible_rewards += list(pick(subtypesof(/obj/item/clothing/head/collectable)) = 1) //this is slightly lower because it's absolutely useless ..() diff --git a/code/modules/events/wizard/magicarp.dm b/code/modules/events/wizard/magicarp.dm index 57e2a2a051..052143722e 100644 --- a/code/modules/events/wizard/magicarp.dm +++ b/code/modules/events/wizard/magicarp.dm @@ -41,7 +41,7 @@ /obj/item/projectile/magic/death, /obj/item/projectile/magic/teleport, /obj/item/projectile/magic/door, /obj/item/projectile/magic/aoe/fireball, /obj/item/projectile/magic/spellblade, /obj/item/projectile/magic/arcane_barrage) -/mob/living/simple_animal/hostile/carp/ranged/Initialize() +/mob/living/simple_animal/hostile/carp/ranged/Initialize(mapload) projectiletype = pick(allowed_projectile_types) . = ..() diff --git a/code/modules/fields/fields.dm b/code/modules/fields/fields.dm index 8c7b414996..0bdabf5e8e 100644 --- a/code/modules/fields/fields.dm +++ b/code/modules/fields/fields.dm @@ -289,7 +289,7 @@ var/datum/proximity_monitor/advanced/current = null var/mob/listeningTo -/obj/item/multitool/field_debug/Initialize() +/obj/item/multitool/field_debug/Initialize(mapload) . = ..() START_PROCESSING(SSobj, src) diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index a2e822ba08..72b1c43a38 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -1122,7 +1122,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( /obj/effect/hallucination/danger/anomaly name = "flux wave anomaly" -/obj/effect/hallucination/danger/anomaly/Initialize() +/obj/effect/hallucination/danger/anomaly/Initialize(mapload) . = ..() START_PROCESSING(SSobj, src) diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index 0370c087d9..a6a632b859 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -532,7 +532,7 @@ list_reagents = list(/datum/reagent/consumable/lemon_lime = 30) foodtype = FRUIT -/obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime/Initialize() +/obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime/Initialize(mapload) . = ..() name = "lemon-lime soda" diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index 1c151511af..0c6b06813e 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -89,7 +89,7 @@ var/icon/broken_outline = icon('icons/obj/drinks.dmi', "broken") sharpness = SHARP_EDGED -/obj/item/broken_bottle/Initialize() +/obj/item/broken_bottle/Initialize(mapload) . = ..() AddComponent(/datum/component/butchering, 200, 55) @@ -243,7 +243,7 @@ /obj/item/reagent_containers/food/drinks/bottle/absinthe/empty list_reagents = null -/obj/item/reagent_containers/food/drinks/bottle/absinthe/Initialize() +/obj/item/reagent_containers/food/drinks/bottle/absinthe/Initialize(mapload) . = ..() redact() @@ -332,7 +332,7 @@ /obj/item/reagent_containers/food/drinks/bottle/sake/empty list_reagents = null -/obj/item/reagent_containers/food/drinks/bottle/sake/Initialize() +/obj/item/reagent_containers/food/drinks/bottle/sake/Initialize(mapload) . = ..() if(prob(10)) name = "Fluffy Tail Sake" @@ -509,7 +509,7 @@ ..() add_overlay("[initial(icon_state)]shine") -/obj/item/reagent_containers/food/drinks/bottle/blank/Initialize() +/obj/item/reagent_containers/food/drinks/bottle/blank/Initialize(mapload) . = ..() update_icon() diff --git a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm index 9602c1d24e..4a4ee40f60 100644 --- a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm +++ b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm @@ -74,7 +74,7 @@ desc = "A shot glass - the universal symbol for bad decisions." return -/obj/item/reagent_containers/food/drinks/drinkingglass/filled/Initialize() +/obj/item/reagent_containers/food/drinks/drinkingglass/filled/Initialize(mapload) . = ..() on_reagent_change(ADD_REAGENT) diff --git a/code/modules/food_and_drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm index 42f536c4f3..923d365f73 100644 --- a/code/modules/food_and_drinks/food/customizables.dm +++ b/code/modules/food_and_drinks/food/customizables.dm @@ -281,7 +281,7 @@ icon = 'icons/obj/food/soupsalad.dmi' icon_state = "wishsoup" -/obj/item/reagent_containers/food/snacks/customizable/soup/Initialize() +/obj/item/reagent_containers/food/snacks/customizable/soup/Initialize(mapload) . = ..() eatverb = pick("slurp","sip","suck","inhale","drink") diff --git a/code/modules/food_and_drinks/food/snacks_burgers.dm b/code/modules/food_and_drinks/food/snacks_burgers.dm index f8c85700c9..344ff92717 100644 --- a/code/modules/food_and_drinks/food/snacks_burgers.dm +++ b/code/modules/food_and_drinks/food/snacks_burgers.dm @@ -13,7 +13,7 @@ bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 1) foodtype = GRAIN | MEAT -/obj/item/reagent_containers/food/snacks/burger/plain/Initialize() +/obj/item/reagent_containers/food/snacks/burger/plain/Initialize(mapload) . = ..() if(prob(1)) new/obj/effect/particle_effect/smoke(get_turf(src)) @@ -146,7 +146,7 @@ verb_say = "moans" verb_yell = "wails" -/obj/item/reagent_containers/food/snacks/burger/ghost/Initialize() +/obj/item/reagent_containers/food/snacks/burger/ghost/Initialize(mapload) . = ..() START_PROCESSING(SSobj, src) @@ -379,7 +379,7 @@ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1) foodtype = GRAIN | MEAT | DAIRY -/obj/item/reagent_containers/food/snacks/burger/cheese/Initialize() +/obj/item/reagent_containers/food/snacks/burger/cheese/Initialize(mapload) . = ..() if(prob(33)) icon_state = "cheeseburgeralt" diff --git a/code/modules/food_and_drinks/food/snacks_egg.dm b/code/modules/food_and_drinks/food/snacks_egg.dm index 2143c6b8f2..489380777c 100644 --- a/code/modules/food_and_drinks/food/snacks_egg.dm +++ b/code/modules/food_and_drinks/food/snacks_egg.dm @@ -24,7 +24,7 @@ /obj/item/reagent_containers/food/snacks/egg/gland desc = "An egg! It looks weird..." -/obj/item/reagent_containers/food/snacks/egg/gland/Initialize() +/obj/item/reagent_containers/food/snacks/egg/gland/Initialize(mapload) . = ..() reagents.add_reagent(get_random_reagent_id(), 15) diff --git a/code/modules/food_and_drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm index 402192e034..5bcb106822 100644 --- a/code/modules/food_and_drinks/food/snacks_meat.dm +++ b/code/modules/food_and_drinks/food/snacks_meat.dm @@ -26,7 +26,7 @@ tastes = list("fish" = 1) foodtype = MEAT -/obj/item/reagent_containers/food/snacks/carpmeat/Initialize() +/obj/item/reagent_containers/food/snacks/carpmeat/Initialize(mapload) . = ..() eatverb = pick("bite","chew","choke down","gnaw","swallow","chomp") @@ -63,7 +63,7 @@ filling_color = "#ee7676" tastes = list("fish" = 1, "pan seared vegtables" = 1) foodtype = MEAT | VEGETABLES | FRIED - + /obj/item/reagent_containers/food/snacks/sushi_basic name = "funa hosomaki" desc = "A small cylindrical kudzu skin, filled with rice and fish." @@ -172,7 +172,7 @@ foodtype = MEAT | BREAKFAST var/roasted = FALSE -/obj/item/reagent_containers/food/snacks/sausage/Initialize() +/obj/item/reagent_containers/food/snacks/sausage/Initialize(mapload) . = ..() eatverb = pick("bite","chew","nibble","deep throat","gobble","chomp") @@ -283,7 +283,7 @@ tastes = list("soy" = 1, "vegetables" = 1) foodtype = VEGETABLES -/obj/item/reagent_containers/food/snacks/stewedsoymeat/Initialize() +/obj/item/reagent_containers/food/snacks/stewedsoymeat/Initialize(mapload) . = ..() eatverb = pick("slurp","sip","suck","inhale","drink") @@ -328,7 +328,7 @@ tastes = list("\"chicken\"" = 1) foodtype = MEAT -/obj/item/reagent_containers/food/snacks/nugget/Initialize() +/obj/item/reagent_containers/food/snacks/nugget/Initialize(mapload) . = ..() var/shape = pick("lump", "star", "lizard", "corgi") desc = "A 'chicken' nugget vaguely shaped like a [shape]." @@ -391,7 +391,7 @@ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) tastes = list("meat" = 3, "smokey sauce" = 1) foodtype = MEAT - + /obj/item/reagent_containers/food/snacks/goliathcalamari name = "goliath calamari" desc = "ACKCHYUALLY, this isn't calamari, guys!" diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm index b771a90907..c26da941b2 100644 --- a/code/modules/food_and_drinks/food/snacks_other.dm +++ b/code/modules/food_and_drinks/food/snacks_other.dm @@ -79,7 +79,7 @@ tastes = list("popcorn" = 3, "butter" = 1) foodtype = JUNKFOOD -/obj/item/reagent_containers/food/snacks/popcorn/Initialize() +/obj/item/reagent_containers/food/snacks/popcorn/Initialize(mapload) . = ..() eatverb = pick("bite","crunch","nibble","gnaw","gobble","chomp") @@ -453,7 +453,7 @@ tastes = list("candy" = 1) foodtype = JUNKFOOD | SUGAR | ANTITOXIC -/obj/item/reagent_containers/food/snacks/lollipop/Initialize() +/obj/item/reagent_containers/food/snacks/lollipop/Initialize(mapload) . = ..() head = mutable_appearance('icons/obj/lollipop.dmi', "lollipop_head") change_head_color(rgb(rand(0, 255), rand(0, 255), rand(0, 255))) @@ -472,7 +472,7 @@ /obj/item/reagent_containers/food/snacks/lollipop/cyborg var/spamchecking = TRUE -/obj/item/reagent_containers/food/snacks/lollipop/cyborg/Initialize() +/obj/item/reagent_containers/food/snacks/lollipop/cyborg/Initialize(mapload) . = ..() addtimer(CALLBACK(src, .proc/spamcheck), 1200) @@ -493,14 +493,14 @@ tastes = list("candy") foodtype = JUNKFOOD -/obj/item/reagent_containers/food/snacks/gumball/Initialize() +/obj/item/reagent_containers/food/snacks/gumball/Initialize(mapload) . = ..() color = rgb(rand(0, 255), rand(0, 255), rand(0, 255)) /obj/item/reagent_containers/food/snacks/gumball/cyborg var/spamchecking = TRUE -/obj/item/reagent_containers/food/snacks/gumball/cyborg/Initialize() +/obj/item/reagent_containers/food/snacks/gumball/cyborg/Initialize(mapload) . = ..() addtimer(CALLBACK(src, .proc/spamcheck), 1200) diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm index 8c5631336e..831c5c6d16 100644 --- a/code/modules/food_and_drinks/food/snacks_pastry.dm +++ b/code/modules/food_and_drinks/food/snacks_pastry.dm @@ -19,7 +19,7 @@ var/extra_reagent = null var/decorated_adjective = "sprinkled" -/obj/item/reagent_containers/food/snacks/donut/Initialize() +/obj/item/reagent_containers/food/snacks/donut/Initialize(mapload) . = ..() if(prob(30)) decorate_donut() @@ -60,7 +60,7 @@ bitesize = 10 tastes = list("donut" = 3, "chaos" = 1) -/obj/item/reagent_containers/food/snacks/donut/chaos/Initialize() +/obj/item/reagent_containers/food/snacks/donut/chaos/Initialize(mapload) . = ..() extra_reagent = pick(/datum/reagent/consumable/nutriment, /datum/reagent/consumable/capsaicin, /datum/reagent/consumable/frostoil, /datum/reagent/drug/krokodil, /datum/reagent/toxin/plasma, /datum/reagent/consumable/coco, @@ -173,7 +173,7 @@ /obj/item/reagent_containers/food/snacks/donut/jelly/in_box_sprite() return "[replacetext(icon_state, "jelly", "donut")]_inbox" -/obj/item/reagent_containers/food/snacks/donut/jelly/Initialize() +/obj/item/reagent_containers/food/snacks/donut/jelly/Initialize(mapload) . = ..() if(extra_reagent) reagents.add_reagent(extra_reagent, 3) @@ -569,7 +569,7 @@ tastes = list("mushroom" = 1, "biscuit" = 1) foodtype = GRAIN | VEGETABLES -/obj/item/reagent_containers/food/snacks/plumphelmetbiscuit/Initialize() +/obj/item/reagent_containers/food/snacks/plumphelmetbiscuit/Initialize(mapload) var/fey = prob(10) if(fey) name = "exceptional plump helmet biscuit" @@ -736,7 +736,7 @@ list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 3) tastes = list("pancakes" = 1, "chocolate" = 1) -/obj/item/reagent_containers/food/snacks/pancakes/Initialize() +/obj/item/reagent_containers/food/snacks/pancakes/Initialize(mapload) . = ..() update_icon() diff --git a/code/modules/food_and_drinks/food/snacks_pie.dm b/code/modules/food_and_drinks/food/snacks_pie.dm index 5329829637..c98c170df3 100644 --- a/code/modules/food_and_drinks/food/snacks_pie.dm +++ b/code/modules/food_and_drinks/food/snacks_pie.dm @@ -164,7 +164,7 @@ foodtype = GRAIN | VEGETABLES -/obj/item/reagent_containers/food/snacks/pie/plump_pie/Initialize() +/obj/item/reagent_containers/food/snacks/pie/plump_pie/Initialize(mapload) . = ..() var/fey = prob(10) if(fey) diff --git a/code/modules/food_and_drinks/food/snacks_pizza.dm b/code/modules/food_and_drinks/food/snacks_pizza.dm index 75cf8ffb82..fc6cd1472f 100644 --- a/code/modules/food_and_drinks/food/snacks_pizza.dm +++ b/code/modules/food_and_drinks/food/snacks_pizza.dm @@ -35,7 +35,7 @@ tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1) foodtype = GRAIN | VEGETABLES -/obj/item/reagent_containers/food/snacks/pizza/margherita/robo/Initialize() +/obj/item/reagent_containers/food/snacks/pizza/margherita/robo/Initialize(mapload) bonus_reagents += list("nanomachines" = 70) return ..() @@ -187,7 +187,7 @@ slice_path = /obj/item/reagent_containers/food/snacks/pizzaslice/arnold bonus_reagents = list(/datum/reagent/consumable/nutriment = 30, /datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/iron = 10, /datum/reagent/medicine/omnizine = 30) tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "pepperoni" = 2, "9 millimeter bullets" = 2) - + /obj/item/reagent_containers/food/snacks/proc/try_break_off(mob/living/M, mob/living/user) //maybe i give you a pizza maybe i break off your arm var/obj/item/bodypart/l_arm = user.get_bodypart(BODY_ZONE_L_ARM) diff --git a/code/modules/food_and_drinks/food/snacks_salad.dm b/code/modules/food_and_drinks/food/snacks_salad.dm index 8c6eecb829..3582015ee9 100644 --- a/code/modules/food_and_drinks/food/snacks_salad.dm +++ b/code/modules/food_and_drinks/food/snacks_salad.dm @@ -9,7 +9,7 @@ tastes = list("leaves" = 1) foodtype = VEGETABLES -/obj/item/reagent_containers/food/snacks/salad/Initialize() +/obj/item/reagent_containers/food/snacks/salad/Initialize(mapload) . = ..() eatverb = pick("crunch","devour","nibble","gnaw","gobble","chomp") //who the fuck gnaws and devours on a salad diff --git a/code/modules/food_and_drinks/food/snacks_soup.dm b/code/modules/food_and_drinks/food/snacks_soup.dm index 38a68ad364..2e45a13ea0 100644 --- a/code/modules/food_and_drinks/food/snacks_soup.dm +++ b/code/modules/food_and_drinks/food/snacks_soup.dm @@ -8,7 +8,7 @@ tastes = list("tasteless soup" = 1) foodtype = VEGETABLES -/obj/item/reagent_containers/food/snacks/soup/Initialize() +/obj/item/reagent_containers/food/snacks/soup/Initialize(mapload) . = ..() eatverb = pick("slurp","sip","suck","inhale","drink") @@ -19,7 +19,7 @@ list_reagents = list(/datum/reagent/water = 10) tastes = list("wishes" = 1) -/obj/item/reagent_containers/food/snacks/soup/wish/Initialize() +/obj/item/reagent_containers/food/snacks/soup/wish/Initialize(mapload) . = ..() var/wish_true = prob(25) if(wish_true) @@ -99,7 +99,7 @@ list_reagents = list(/datum/reagent/consumable/nutriment = 6) tastes = list("chaos" = 1) -/obj/item/reagent_containers/food/snacks/soup/mystery/Initialize() +/obj/item/reagent_containers/food/snacks/soup/mystery/Initialize(mapload) . = ..() extra_reagent = pick(/datum/reagent/consumable/capsaicin, /datum/reagent/consumable/frostoil, /datum/reagent/medicine/omnizine, /datum/reagent/consumable/banana, /datum/reagent/blood, @@ -184,7 +184,7 @@ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 5) foodtype = VEGETABLES -/obj/item/reagent_containers/food/snacks/soup/beet/Initialize() +/obj/item/reagent_containers/food/snacks/soup/beet/Initialize(mapload) . = ..() name = pick("borsch","bortsch","borstch","borsh","borshch","borscht") tastes = list(name = 1) diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm index a41970ea2b..0bf4179814 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm @@ -49,7 +49,7 @@ God bless America. /obj/item/his_grace)) var/datum/looping_sound/deep_fryer/fry_loop -/obj/machinery/deepfryer/Initialize() +/obj/machinery/deepfryer/Initialize(mapload) . = ..() create_reagents(50, OPENCONTAINER) reagents.add_reagent(/datum/reagent/consumable/cooking_oil, 25) diff --git a/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm b/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm index f09d3d6728..8bf13363a9 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm @@ -17,7 +17,7 @@ var/list/stored_food = list() var/obj/item/reagent_containers/mixer -/obj/machinery/food_cart/Initialize() +/obj/machinery/food_cart/Initialize(mapload) . = ..() create_reagents(LIQUID_CAPACITY, OPENCONTAINER | NO_REACT) mixer = new /obj/item/reagent_containers(src, MIXER_CAPACITY) diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm index e4148d849a..fc00fd176e 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -17,7 +17,7 @@ var/meat_quality = 35 //food_quality of meat produced -/obj/machinery/gibber/Initialize() +/obj/machinery/gibber/Initialize(mapload) . = ..() add_overlay("grjam") diff --git a/code/modules/food_and_drinks/kitchen_machinery/grill.dm b/code/modules/food_and_drinks/kitchen_machinery/grill.dm index 02b24402db..c03c834407 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/grill.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/grill.dm @@ -11,7 +11,7 @@ var/grill_time = 0 var/datum/looping_sound/grill/grill_loop -/obj/machinery/grill/Initialize() +/obj/machinery/grill/Initialize(mapload) . = ..() grill_loop = new(src, FALSE) diff --git a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm index 303d18b4a4..9f36fc058f 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm @@ -80,7 +80,7 @@ return "vanilla" -/obj/machinery/icecream_vat/Initialize() +/obj/machinery/icecream_vat/Initialize(mapload) . = ..() while(product_types.len < 9) product_types.Add(5) @@ -249,7 +249,7 @@ bitesize = 4 foodtype = DAIRY | SUGAR -/obj/item/reagent_containers/food/snacks/icecream/Initialize() +/obj/item/reagent_containers/food/snacks/icecream/Initialize(mapload) . = ..() reagents.maximum_volume = 20 diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm index c4ac4c2dcf..41cd860362 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm @@ -32,7 +32,7 @@ var/static/list/radial_options = list("eject" = radial_eject, "use" = radial_use) var/static/list/ai_radial_options = list("eject" = radial_eject, "use" = radial_use, "examine" = radial_examine) -/obj/machinery/microwave/Initialize() +/obj/machinery/microwave/Initialize(mapload) . = ..() wires = new /datum/wires/microwave(src) create_reagents(100) diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index 58769cebf1..e4a098c3f1 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -19,7 +19,7 @@ var/list/initial_contents var/visible_contents = TRUE -/obj/machinery/smartfridge/Initialize() +/obj/machinery/smartfridge/Initialize(mapload) . = ..() create_reagents(100, NO_REACT) @@ -258,7 +258,7 @@ base_build_path = /obj/machinery/smartfridge/drying_rack //should really be seeing this without admin fuckery. var/drying = FALSE -/obj/machinery/smartfridge/drying_rack/Initialize() +/obj/machinery/smartfridge/drying_rack/Initialize(mapload) . = ..() // Cache the old_parts first, we'll delete it after we've changed component_parts to a new list. @@ -471,7 +471,7 @@ /obj/item/reagent_containers/medspray/synthtissue = 1, /obj/item/reagent_containers/medspray/sterilizine = 1) -/obj/machinery/smartfridge/organ/preloaded/Initialize() +/obj/machinery/smartfridge/organ/preloaded/Initialize(mapload) . = ..() var/list = list(/obj/item/organ/tongue, /obj/item/organ/brain, /obj/item/organ/heart, /obj/item/organ/liver, /obj/item/organ/ears, /obj/item/organ/eyes, /obj/item/organ/tail, /obj/item/organ/stomach) var/newtype = pick(list) diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm index a2603d07ab..3c0d60907f 100644 --- a/code/modules/food_and_drinks/pizzabox.dm +++ b/code/modules/food_and_drinks/pizzabox.dm @@ -29,7 +29,7 @@ var/const/BOMB_TIMER_MIN = 1 var/const/BOMB_TIMER_MAX = 10 -/obj/item/pizzabox/Initialize() +/obj/item/pizzabox/Initialize(mapload) . = ..() update_icon() @@ -259,14 +259,14 @@ wires = null update_icon() -/obj/item/pizzabox/bomb/Initialize() +/obj/item/pizzabox/bomb/Initialize(mapload) . = ..() var/randompizza = pick(subtypesof(/obj/item/reagent_containers/food/snacks/pizza)) pizza = new randompizza(src) bomb = new(src) wires = new /datum/wires/explosive/pizza(src) -/obj/item/pizzabox/margherita/Initialize() +/obj/item/pizzabox/margherita/Initialize(mapload) . = ..() AddPizza() boxtag = "Margherita Deluxe" @@ -277,22 +277,22 @@ /obj/item/pizzabox/margherita/robo/AddPizza() pizza = new /obj/item/reagent_containers/food/snacks/pizza/margherita/robo(src) -/obj/item/pizzabox/vegetable/Initialize() +/obj/item/pizzabox/vegetable/Initialize(mapload) . = ..() pizza = new /obj/item/reagent_containers/food/snacks/pizza/vegetable(src) boxtag = "Gourmet Vegatable" -/obj/item/pizzabox/mushroom/Initialize() +/obj/item/pizzabox/mushroom/Initialize(mapload) . = ..() pizza = new /obj/item/reagent_containers/food/snacks/pizza/mushroom(src) boxtag = "Mushroom Special" -/obj/item/pizzabox/meat/Initialize() +/obj/item/pizzabox/meat/Initialize(mapload) . = ..() pizza = new /obj/item/reagent_containers/food/snacks/pizza/meat(src) boxtag = "Meatlover's Supreme" -/obj/item/pizzabox/pineapple/Initialize() +/obj/item/pizzabox/pineapple/Initialize(mapload) . = ..() pizza = new /obj/item/reagent_containers/food/snacks/pizza/pineapple(src) boxtag = "Honolulu Chew" @@ -312,7 +312,7 @@ /obj/item/reagent_containers/food/snacks/pizza/dank = 0.1) //pizzas here are weighted by chance to be someone's favorite var/static/list/pizza_preferences -/obj/item/pizzabox/infinite/Initialize() +/obj/item/pizzabox/infinite/Initialize(mapload) . = ..() if(!pizza_preferences) pizza_preferences = list() diff --git a/code/modules/holiday/easter.dm b/code/modules/holiday/easter.dm index 84287daa4f..10b825440a 100644 --- a/code/modules/holiday/easter.dm +++ b/code/modules/holiday/easter.dm @@ -66,7 +66,7 @@ icon = 'icons/mob/easter.dmi' icon_state = "basket" -/obj/item/storage/bag/easterbasket/Initialize() +/obj/item/storage/bag/easterbasket/Initialize(mapload) . = ..() var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.can_hold = typecacheof(list(/obj/item/reagent_containers/food/snacks/egg, /obj/item/reagent_containers/food/snacks/chocolateegg, /obj/item/reagent_containers/food/snacks/boiledegg)) @@ -109,7 +109,7 @@ /obj/item/reagent_containers/food/snacks/egg/loaded containsPrize = TRUE -/obj/item/reagent_containers/food/snacks/egg/loaded/Initialize() +/obj/item/reagent_containers/food/snacks/egg/loaded/Initialize(mapload) . = ..() var/eggcolor = pick("blue","green","mime","orange","purple","rainbow","red","yellow") icon_state = "egg-[eggcolor]" diff --git a/code/modules/holiday/halloween/halloween.dm b/code/modules/holiday/halloween/halloween.dm index 0c9987fc00..5dbad1b7f0 100644 --- a/code/modules/holiday/halloween/halloween.dm +++ b/code/modules/holiday/halloween/halloween.dm @@ -42,7 +42,7 @@ var/trapped = 0 var/mob/trapped_mob -/obj/structure/closet/Initialize() +/obj/structure/closet/Initialize(mapload) ..() if(prob(30)) set_spooky_trap() @@ -137,7 +137,7 @@ layer = 4 var/timer = 0 -/mob/living/simple_animal/hostile/construct/shade/howling_ghost/Initialize() +/mob/living/simple_animal/hostile/construct/shade/howling_ghost/Initialize(mapload) . = ..() icon_state = pick("ghost","ghostian","ghostian2","ghostking","ghost1","ghost2") icon_living = icon_state @@ -196,7 +196,7 @@ unsuitable_atmos_damage = 0 var/timer -/mob/living/simple_animal/hostile/retaliate/clown/insane/Initialize() +/mob/living/simple_animal/hostile/retaliate/clown/insane/Initialize(mapload) . = ..() timer = rand(5,15) @@ -233,7 +233,7 @@ return /mob/living/simple_animal/hostile/retaliate/clown/insane/adjustHealth() - . = ..() + . = ..() if(prob(5)) playsound(loc, 'sound/spookoween/insane_low_laugh.ogg', 300, 1) @@ -281,7 +281,7 @@ var/obj/effect/wisp/pumpkin/wisp2 //Hoooo boy that's some wild code there. -/obj/item/wisp_lantern/pumpkin/Initialize() +/obj/item/wisp_lantern/pumpkin/Initialize(mapload) . = ..() qdel(wisp) wisp2 = new(src) diff --git a/code/modules/holiday/halloween/jacqueen.dm b/code/modules/holiday/halloween/jacqueen.dm index 723b404717..618ba9fcd7 100644 --- a/code/modules/holiday/halloween/jacqueen.dm +++ b/code/modules/holiday/halloween/jacqueen.dm @@ -61,7 +61,7 @@ /atom/movable/screen )) -/mob/living/simple_animal/jacq/Initialize() +/mob/living/simple_animal/jacq/Initialize(mapload) . = ..() //fuck you jacq, return a hint you shit cached_z = z poof() @@ -664,13 +664,13 @@ hat_type = "pumpkin_j" brightness_on = 4 -/obj/item/clothing/head/hardhat/pumpkinhead/jaqc/Initialize() +/obj/item/clothing/head/hardhat/pumpkinhead/jaqc/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, GLUED_ITEM_TRAIT) /obj/item/clothing/suit/ghost_sheet/sticky -/obj/item/clothing/suit/ghost_sheet/sticky/Initialize() +/obj/item/clothing/suit/ghost_sheet/sticky/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, GLUED_ITEM_TRAIT) @@ -723,7 +723,7 @@ icon_state = "jacq_potion" desc = "A potion with a strange concoction within. Be careful, as if it's thrown it explodes in a puff of smoke like Jacqueline." -/obj/item/reagent_containers/potion_container/Initialize() +/obj/item/reagent_containers/potion_container/Initialize(mapload) .=..() var/R = get_random_reagent_id() reagents.add_reagent(R, 30) @@ -748,6 +748,6 @@ icon_state = "jacq_candy" desc = "A candy with strange magic within. Be careful, as the magic isn't always helpful." -/obj/item/reagent_containers/food/snacks/special_candy/Initialize() +/obj/item/reagent_containers/food/snacks/special_candy/Initialize(mapload) .=..() reagents.add_reagent(get_random_reagent_id(), 5) diff --git a/code/modules/holodeck/holo_effect.dm b/code/modules/holodeck/holo_effect.dm index ffff8e190e..5d6259d9c2 100644 --- a/code/modules/holodeck/holo_effect.dm +++ b/code/modules/holodeck/holo_effect.dm @@ -105,7 +105,7 @@ /obj/effect/holodeck_effect/mobspawner/penguin mobtype = /mob/living/simple_animal/pet/penguin/emperor -/obj/effect/holodeck_effect/mobspawner/penguin/Initialize() +/obj/effect/holodeck_effect/mobspawner/penguin/Initialize(mapload) if(prob(1)) mobtype = /mob/living/simple_animal/pet/penguin/emperor/shamebrero return ..() diff --git a/code/modules/holodeck/items.dm b/code/modules/holodeck/items.dm index e4564ecb7e..a88b8ab905 100644 --- a/code/modules/holodeck/items.dm +++ b/code/modules/holodeck/items.dm @@ -26,12 +26,12 @@ var/active = 0 var/saber_color -/obj/item/holo/esword/green/Initialize() +/obj/item/holo/esword/green/Initialize(mapload) . = ..() saber_color = "green" -/obj/item/holo/esword/red/Initialize() +/obj/item/holo/esword/red/Initialize(mapload) . = ..() saber_color = "red" @@ -40,7 +40,7 @@ return ..() return ..() -/obj/item/holo/esword/Initialize() +/obj/item/holo/esword/Initialize(mapload) . = ..() saber_color = pick("red","blue","green","purple") diff --git a/code/modules/holodeck/turfs.dm b/code/modules/holodeck/turfs.dm index 169c9061d3..7340ffda61 100644 --- a/code/modules/holodeck/turfs.dm +++ b/code/modules/holodeck/turfs.dm @@ -58,7 +58,7 @@ icon_state = "asteroid0" tiled_dirt = FALSE -/turf/open/floor/holofloor/asteroid/Initialize() +/turf/open/floor/holofloor/asteroid/Initialize(mapload) icon_state = "asteroid[rand(0, 12)]" . = ..() @@ -68,7 +68,7 @@ icon_state = "basalt0" tiled_dirt = FALSE -/turf/open/floor/holofloor/basalt/Initialize() +/turf/open/floor/holofloor/basalt/Initialize(mapload) . = ..() if(prob(15)) icon_state = "basalt[rand(0, 12)]" @@ -79,7 +79,7 @@ icon = 'icons/turf/space.dmi' icon_state = "0" -/turf/open/floor/holofloor/space/Initialize() +/turf/open/floor/holofloor/space/Initialize(mapload) icon_state = SPACE_ICON_STATE // so realistic . = ..() @@ -90,11 +90,11 @@ bullet_bounce_sound = null tiled_dirt = FALSE -/turf/open/floor/holofloor/hyperspace/Initialize() +/turf/open/floor/holofloor/hyperspace/Initialize(mapload) icon_state = "speedspace_ns_[(x + 5*y + (y%2+1)*7)%15+1]" . = ..() -/turf/open/floor/holofloor/hyperspace/ns/Initialize() +/turf/open/floor/holofloor/hyperspace/ns/Initialize(mapload) . = ..() icon_state = "speedspace_ns_[(x + 5*y + (y%2+1)*7)%15+1]" @@ -109,7 +109,7 @@ bullet_bounce_sound = null tiled_dirt = FALSE -/turf/open/floor/holofloor/carpet/Initialize() +/turf/open/floor/holofloor/carpet/Initialize(mapload) . = ..() addtimer(CALLBACK(src, /atom/.proc/update_icon), 1) @@ -167,6 +167,6 @@ canSmoothWith = list(/turf/open/floor/plating/ice/smooth, /turf/open/floor/plating/ice, /turf/open/floor/holofloor/ice) baseturfs = /turf/open/floor/holofloor/ice/smooth -/turf/open/floor/holofloor/ice/Initialize() +/turf/open/floor/holofloor/ice/Initialize(mapload) . = ..() MakeSlippery(TURF_WET_PERMAFROST, INFINITY, 0, INFINITY, TRUE) diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm index 2857099d0f..28e537acbc 100644 --- a/code/modules/hydroponics/beekeeping/beebox.dm +++ b/code/modules/hydroponics/beekeeping/beebox.dm @@ -40,7 +40,7 @@ var/bee_resources = 0 -/obj/structure/beebox/Initialize() +/obj/structure/beebox/Initialize(mapload) . = ..() START_PROCESSING(SSobj, src) @@ -58,7 +58,7 @@ var/random_reagent = FALSE -/obj/structure/beebox/premade/Initialize() +/obj/structure/beebox/premade/Initialize(mapload) . = ..() icon_state = "beebox" diff --git a/code/modules/hydroponics/beekeeping/honey_frame.dm b/code/modules/hydroponics/beekeeping/honey_frame.dm index 370b31da17..3cc3f9806d 100644 --- a/code/modules/hydroponics/beekeeping/honey_frame.dm +++ b/code/modules/hydroponics/beekeeping/honey_frame.dm @@ -7,7 +7,7 @@ var/honeycomb_capacity = 10 //10 Honeycomb per frame by default, researchable frames perhaps? -/obj/item/honey_frame/Initialize() +/obj/item/honey_frame/Initialize(mapload) . = ..() pixel_x = rand(8,-8) pixel_y = rand(8,-8) diff --git a/code/modules/hydroponics/beekeeping/honeycomb.dm b/code/modules/hydroponics/beekeeping/honeycomb.dm index 6ce04a8732..d31ea281c7 100644 --- a/code/modules/hydroponics/beekeeping/honeycomb.dm +++ b/code/modules/hydroponics/beekeeping/honeycomb.dm @@ -13,7 +13,7 @@ grind_results = list() var/honey_color = "" -/obj/item/reagent_containers/honeycomb/Initialize() +/obj/item/reagent_containers/honeycomb/Initialize(mapload) . = ..() pixel_x = rand(8,-8) pixel_y = rand(8,-8) diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index 8651ea82ab..71513ccfdf 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -18,7 +18,7 @@ /// Currently selected category in the UI var/selected_cat -/obj/machinery/biogenerator/Initialize() +/obj/machinery/biogenerator/Initialize(mapload) . = ..() stored_research = new /datum/techweb/specialized/autounlocking/biogenerator create_reagents(1000) diff --git a/code/modules/hydroponics/fermenting_barrel.dm b/code/modules/hydroponics/fermenting_barrel.dm index 39b0bfdfde..fd0f39fd75 100644 --- a/code/modules/hydroponics/fermenting_barrel.dm +++ b/code/modules/hydroponics/fermenting_barrel.dm @@ -10,7 +10,7 @@ var/open = FALSE var/speed_multiplier = 1 //How fast it distills. Defaults to 100% (1.0). Lower is better. -/obj/structure/fermenting_barrel/Initialize() +/obj/structure/fermenting_barrel/Initialize(mapload) create_reagents(300, DRAINABLE | AMOUNT_VISIBLE) //Bluespace beakers, but without the portability or efficiency in circuits. . = ..() @@ -85,7 +85,7 @@ max_integrity = 300 var/open = FALSE -/obj/structure/custom_keg/Initialize() +/obj/structure/custom_keg/Initialize(mapload) create_reagents(1000, DRAINABLE | AMOUNT_VISIBLE) . = ..() diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm index a6ba5ec461..3b1c4eb163 100644 --- a/code/modules/hydroponics/gene_modder.dm +++ b/code/modules/hydroponics/gene_modder.dm @@ -424,7 +424,7 @@ var/read_only = 0 //Well, it's still a floppy disk obj_flags = UNIQUE_RENAME -/obj/item/disk/plantgene/Initialize() +/obj/item/disk/plantgene/Initialize(mapload) . = ..() add_overlay("datadisk_gene") src.pixel_x = rand(-5, 5) diff --git a/code/modules/hydroponics/grown/banana.dm b/code/modules/hydroponics/grown/banana.dm index e825c88524..65a28eee2e 100644 --- a/code/modules/hydroponics/grown/banana.dm +++ b/code/modules/hydroponics/grown/banana.dm @@ -167,6 +167,6 @@ name = "synthesized banana peel" desc = "A synthetic banana peel." -/obj/item/grown/bananapeel/specialpeel/Initialize(AM) +/obj/item/grown/bananapeel/specialpeel/Initialize(mapload, AM) . = ..() AddComponent(/datum/component/slippery, 40) diff --git a/code/modules/hydroponics/grown/cocoa_vanilla.dm b/code/modules/hydroponics/grown/cocoa_vanilla.dm index 5de0740b87..3a1c78a7a9 100644 --- a/code/modules/hydroponics/grown/cocoa_vanilla.dm +++ b/code/modules/hydroponics/grown/cocoa_vanilla.dm @@ -96,7 +96,7 @@ foodtype = TOXIC tastes = list("acrid bitterness" = 1) -/obj/item/reagent_containers/food/snacks/grown/bungopit/Initialize() +/obj/item/reagent_containers/food/snacks/grown/bungopit/Initialize(mapload) . =..() reagents.clear_reagents() reagents.add_reagent(/datum/reagent/toxin/bungotoxin, seed.potency * 0.10) //More than this will kill at too low potency diff --git a/code/modules/hydroponics/grown/melon.dm b/code/modules/hydroponics/grown/melon.dm index b988261770..c8b952889b 100644 --- a/code/modules/hydroponics/grown/melon.dm +++ b/code/modules/hydroponics/grown/melon.dm @@ -61,7 +61,7 @@ wine_flavor = "divinity" /* -/obj/item/reagent_containers/food/snacks/grown/holymelon/Initialize() +/obj/item/reagent_containers/food/snacks/grown/holymelon/Initialize(mapload) . = ..() var/uses = 1 if(seed) diff --git a/code/modules/hydroponics/grown/random.dm b/code/modules/hydroponics/grown/random.dm index 75505202da..cc4da4c6e5 100644 --- a/code/modules/hydroponics/grown/random.dm +++ b/code/modules/hydroponics/grown/random.dm @@ -12,7 +12,7 @@ icon_harvest = "xpod-harvest" growthstages = 4 -/obj/item/seeds/random/Initialize() +/obj/item/seeds/random/Initialize(mapload) . = ..() randomize_stats() if(prob(60)) @@ -28,7 +28,7 @@ icon_state = "crunchy" bitesize_mod = 2 -/obj/item/reagent_containers/food/snacks/grown/random/Initialize() +/obj/item/reagent_containers/food/snacks/grown/random/Initialize(mapload) . = ..() wine_power = rand(10,150) if(prob(1)) diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm index 053daaf3af..e15c8f1323 100644 --- a/code/modules/hydroponics/grown/replicapod.dm +++ b/code/modules/hydroponics/grown/replicapod.dm @@ -24,7 +24,7 @@ var/list/quirks = null var/contains_sample = 0 -/obj/item/seeds/replicapod/Initialize() +/obj/item/seeds/replicapod/Initialize(mapload) . = ..() create_reagents(volume, INJECTABLE | DRAWABLE) diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm index 38e4fcc6ff..25e6200d8a 100644 --- a/code/modules/hydroponics/grown/towercap.dm +++ b/code/modules/hydroponics/grown/towercap.dm @@ -159,7 +159,7 @@ /obj/structure/bonfire/dense density = TRUE -/obj/structure/bonfire/prelit/Initialize() +/obj/structure/bonfire/prelit/Initialize(mapload) . = ..() StartBurning() diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm index f4859ffb1e..c8c6195d5a 100644 --- a/code/modules/hydroponics/growninedible.dm +++ b/code/modules/hydroponics/growninedible.dm @@ -9,7 +9,7 @@ var/obj/item/seeds/seed = null // type path, gets converted to item on New(). It's safe to assume it's always a seed item. var/tastes = list("indescribable" = 1) //Stops runtimes. Grown are un-eatable anyways so if you do then its a bug -/obj/item/grown/Initialize(newloc, obj/item/seeds/new_seed) +/obj/item/grown/Initialize(mapload, newloc, obj/item/seeds/new_seed) . = ..() create_reagents(50, NONE, HARVEST_REAGENTS_VALUE) diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm index 798cd9a2f6..26566d3f85 100644 --- a/code/modules/hydroponics/hydroitemdefines.dm +++ b/code/modules/hydroponics/hydroitemdefines.dm @@ -109,7 +109,7 @@ hitsound = 'sound/weapons/bladeslice.ogg' sharpness = SHARP_EDGED -/obj/item/hatchet/Initialize() +/obj/item/hatchet/Initialize(mapload) . = ..() AddComponent(/datum/component/butchering, 70, 100) @@ -143,7 +143,7 @@ hitsound = 'sound/weapons/bladeslice.ogg' var/swiping = FALSE -/obj/item/scythe/Initialize() +/obj/item/scythe/Initialize(mapload) . = ..() AddComponent(/datum/component/butchering, 90, 105) @@ -191,7 +191,7 @@ amount_per_transfer_from_this = 10 possible_transfer_amounts = list(1,2,5,10,15,25,50) -/obj/item/reagent_containers/glass/bottle/nutrient/Initialize() +/obj/item/reagent_containers/glass/bottle/nutrient/Initialize(mapload) . = ..() pixel_x = rand(-5, 5) pixel_y = rand(-5, 5) diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index fa7decc437..a91e3ddfd8 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -31,7 +31,7 @@ var/self_sustaining = FALSE //If the tray generates nutrients and water on its own // Here lies irrigation. You won't be missed, because you were never used. -/obj/machinery/hydroponics/Initialize() +/obj/machinery/hydroponics/Initialize(mapload) //Here lies "nutrilevel", killed by ArcaneMusic 20??-2019. Finally, we strive for a better future. Please use "reagents" instead create_reagents(20) reagents.add_reagent(/datum/reagent/plantnutriment/eznutriment, 10) //Half filled nutrient trays for dirt trays to have more to grow with in prison/lavaland. diff --git a/code/modules/hydroponics/sample.dm b/code/modules/hydroponics/sample.dm index 7fb92e8fcd..ebcb100b32 100644 --- a/code/modules/hydroponics/sample.dm +++ b/code/modules/hydroponics/sample.dm @@ -5,7 +5,7 @@ yield = -1 var/sample_color = "#FFFFFF" -/obj/item/seeds/sample/Initialize() +/obj/item/seeds/sample/Initialize(mapload) . = ..() if(sample_color) var/mutable_appearance/filling = mutable_appearance(icon, "sample-filling") diff --git a/code/modules/instruments/instruments/item.dm b/code/modules/instruments/instruments/item.dm index 0141a4baee..888aac4d40 100644 --- a/code/modules/instruments/instruments/item.dm +++ b/code/modules/instruments/instruments/item.dm @@ -103,7 +103,7 @@ item_state = "synth" allowed_instrument_ids = "piano" -/obj/item/instrument/piano_synth/Initialize() +/obj/item/instrument/piano_synth/Initialize(mapload) . = ..() song.allowed_instrument_ids = get_allowed_instrument_ids() @@ -155,7 +155,7 @@ force = 0 attack_verb = list("played","jazzed","trumpeted","mourned","dooted","spooked") -/obj/item/instrument/trumpet/spectral/Initialize() +/obj/item/instrument/trumpet/spectral/Initialize(mapload) . = ..() AddComponent(/datum/component/spooky) @@ -178,7 +178,7 @@ force = 0 attack_verb = list("played","jazzed","saxxed","mourned","dooted","spooked") -/obj/item/instrument/saxophone/spectral/Initialize() +/obj/item/instrument/saxophone/spectral/Initialize(mapload) . = ..() AddComponent(/datum/component/spooky) @@ -201,7 +201,7 @@ force = 0 attack_verb = list("played","jazzed","tromboned","mourned","dooted","spooked") -/obj/item/instrument/trombone/spectral/Initialize() +/obj/item/instrument/trombone/spectral/Initialize(mapload) . = ..() AddComponent(/datum/component/spooky) diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index ac27b4a30e..e605b80832 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -96,7 +96,7 @@ if(D.check_access(access_card)) D.open() -/obj/item/electronic_assembly/Initialize() +/obj/item/electronic_assembly/Initialize(mapload) LAZYSET(custom_materials, /datum/material/iron, round((max_complexity + max_components) * 0.25) * SScircuit.cost_multiplier) .=..() START_PROCESSING(SScircuit, src) diff --git a/code/modules/integrated_electronics/core/detailer.dm b/code/modules/integrated_electronics/core/detailer.dm index 03cd19cf96..374f4f602a 100644 --- a/code/modules/integrated_electronics/core/detailer.dm +++ b/code/modules/integrated_electronics/core/detailer.dm @@ -30,7 +30,7 @@ "custom" = COLOR_ASSEMBLY_WHITE ) -/obj/item/integrated_electronics/detailer/Initialize() +/obj/item/integrated_electronics/detailer/Initialize(mapload) .=..() update_icon() diff --git a/code/modules/integrated_electronics/core/integrated_circuit.dm b/code/modules/integrated_electronics/core/integrated_circuit.dm index 756706dcdf..7e667b3d09 100644 --- a/code/modules/integrated_electronics/core/integrated_circuit.dm +++ b/code/modules/integrated_electronics/core/integrated_circuit.dm @@ -81,7 +81,7 @@ a creative player the means to solve many problems. Circuits are held inside an else return user.canUseTopic(src, BE_CLOSE) -/obj/item/integrated_circuit/Initialize() +/obj/item/integrated_circuit/Initialize(mapload) displayed_name = name setup_io(inputs, /datum/integrated_io, inputs_default, IC_INPUT) setup_io(outputs, /datum/integrated_io, outputs_default, IC_OUTPUT) diff --git a/code/modules/integrated_electronics/core/printer.dm b/code/modules/integrated_electronics/core/printer.dm index 5f6440bffb..879cfdf6b6 100644 --- a/code/modules/integrated_electronics/core/printer.dm +++ b/code/modules/integrated_electronics/core/printer.dm @@ -31,7 +31,7 @@ fast_clone = TRUE w_class = WEIGHT_CLASS_TINY -/obj/item/integrated_circuit_printer/Initialize() +/obj/item/integrated_circuit_printer/Initialize(mapload) . = ..() var/datum/component/material_container/materials = AddComponent(/datum/component/material_container, list(/datum/material/iron), MINERAL_MATERIAL_AMOUNT * 25, TRUE, list(/obj/item/stack, /obj/item/integrated_circuit, /obj/item/electronic_assembly)) materials.precise_insertion = TRUE diff --git a/code/modules/integrated_electronics/passive/power.dm b/code/modules/integrated_electronics/passive/power.dm index a7ee449be2..adc99f0ff5 100644 --- a/code/modules/integrated_electronics/passive/power.dm +++ b/code/modules/integrated_electronics/passive/power.dm @@ -101,7 +101,7 @@ var/multi = 1 var/lfwb =TRUE -/obj/item/integrated_circuit/passive/power/chemical_cell/Initialize() +/obj/item/integrated_circuit/passive/power/chemical_cell/Initialize(mapload) . = ..() create_reagents(volume, OPENCONTAINER) diff --git a/code/modules/integrated_electronics/subtypes/arithmetic.dm b/code/modules/integrated_electronics/subtypes/arithmetic.dm index e207f57ddb..a5b559585c 100644 --- a/code/modules/integrated_electronics/subtypes/arithmetic.dm +++ b/code/modules/integrated_electronics/subtypes/arithmetic.dm @@ -241,7 +241,7 @@ inputs = list() spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH -/obj/item/integrated_circuit/arithmetic/pi/Initialize() +/obj/item/integrated_circuit/arithmetic/pi/Initialize(mapload) . = ..() desc = "Not recommended for cooking. Outputs '[PI]' when it receives a pulse." diff --git a/code/modules/integrated_electronics/subtypes/atmospherics.dm b/code/modules/integrated_electronics/subtypes/atmospherics.dm index b3056d46cf..b2cb7b9c24 100644 --- a/code/modules/integrated_electronics/subtypes/atmospherics.dm +++ b/code/modules/integrated_electronics/subtypes/atmospherics.dm @@ -17,7 +17,7 @@ var/datum/gas_mixture/air_contents var/volume = 2 //Pretty small, I know -/obj/item/integrated_circuit/atmospherics/Initialize() +/obj/item/integrated_circuit/atmospherics/Initialize(mapload) air_contents = new(volume) return ..() @@ -57,7 +57,7 @@ var/target_pressure = PUMP_MAX_PRESSURE power_draw_per_use = 20 -/obj/item/integrated_circuit/atmospherics/pump/Initialize() +/obj/item/integrated_circuit/atmospherics/pump/Initialize(mapload) air_contents = new(volume) extended_desc += " Use negative pressure to move air from target to source. \ Note that only part of the gas is moved on each transfer, \ @@ -246,7 +246,7 @@ var/obj/machinery/atmospherics/components/unary/portables_connector/connector -/obj/item/integrated_circuit/atmospherics/connector/Initialize() +/obj/item/integrated_circuit/atmospherics/connector/Initialize(mapload) air_contents = new(volume) START_PROCESSING(SSobj, src) . = ..() @@ -398,7 +398,7 @@ contaminated_air.merge(removed) -/obj/item/integrated_circuit/atmospherics/pump/filter/Initialize() +/obj/item/integrated_circuit/atmospherics/pump/filter/Initialize(mapload) air_contents = new(volume) . = ..() extended_desc = "Remember to properly spell and capitalize the filtered gas name. \ @@ -485,7 +485,7 @@ volume = 3 //emergency tank sized var/broken = FALSE -/obj/item/integrated_circuit/atmospherics/tank/Initialize() +/obj/item/integrated_circuit/atmospherics/tank/Initialize(mapload) air_contents = new(volume) START_PROCESSING(SSobj, src) extended_desc = "Take care not to pressurize it above [round(TANK_FAILURE_PRESSURE)] kPa, or else it will break." @@ -611,7 +611,7 @@ var/temperature = 293.15 var/heater_coefficient = 0.1 -/obj/item/integrated_circuit/atmospherics/cooler/Initialize() +/obj/item/integrated_circuit/atmospherics/cooler/Initialize(mapload) air_contents = new(volume) START_PROCESSING(SSobj, src) . = ..() @@ -701,7 +701,7 @@ var/obj/item/tank/internals/current_tank -/obj/item/integrated_circuit/input/tank_slot/Initialize() +/obj/item/integrated_circuit/input/tank_slot/Initialize(mapload) START_PROCESSING(SSobj, src) . = ..() diff --git a/code/modules/integrated_electronics/subtypes/converters.dm b/code/modules/integrated_electronics/subtypes/converters.dm index ebb91a894e..0c89e78564 100644 --- a/code/modules/integrated_electronics/subtypes/converters.dm +++ b/code/modules/integrated_electronics/subtypes/converters.dm @@ -151,7 +151,7 @@ var/number_of_pins = 8 var/max_string_length = 512 -/obj/item/integrated_circuit/converter/concatenator/Initialize() +/obj/item/integrated_circuit/converter/concatenator/Initialize(mapload) for(var/i = 1 to number_of_pins) inputs["input [i]"] = IC_PINTYPE_STRING . = ..() diff --git a/code/modules/integrated_electronics/subtypes/data_transfer.dm b/code/modules/integrated_electronics/subtypes/data_transfer.dm index 8db1db4e00..588d920fec 100644 --- a/code/modules/integrated_electronics/subtypes/data_transfer.dm +++ b/code/modules/integrated_electronics/subtypes/data_transfer.dm @@ -16,7 +16,7 @@ power_draw_per_use = 4 var/number_of_pins = 2 -/obj/item/integrated_circuit/transfer/multiplexer/Initialize() +/obj/item/integrated_circuit/transfer/multiplexer/Initialize(mapload) for(var/i = 1 to number_of_pins) inputs["input [i]"] = IC_PINTYPE_ANY // This is just a string since pins don't get built until ..() is called. @@ -64,7 +64,7 @@ power_draw_per_use = 4 var/number_of_pins = 2 -/obj/item/integrated_circuit/transfer/demultiplexer/Initialize() +/obj/item/integrated_circuit/transfer/demultiplexer/Initialize(mapload) for(var/i = 1 to number_of_pins) outputs["output [i]"] = IC_PINTYPE_ANY complexity = number_of_pins @@ -113,7 +113,7 @@ power_draw_per_use = 4 var/number_of_pins = 2 -/obj/item/integrated_circuit/transfer/pulsedemultiplexer/Initialize() +/obj/item/integrated_circuit/transfer/pulsedemultiplexer/Initialize(mapload) for(var/i = 1 to number_of_pins) activators["output [i]"] = IC_PINTYPE_PULSE_OUT complexity = number_of_pins @@ -158,7 +158,7 @@ power_draw_per_use = 4 var/number_of_pins = 2 -/obj/item/integrated_circuit/transfer/pulsemultiplexer/Initialize() +/obj/item/integrated_circuit/transfer/pulsemultiplexer/Initialize(mapload) for(var/i = 1 to number_of_pins) inputs["input [i]"] = IC_PINTYPE_ANY for(var/i = 1 to number_of_pins) diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index f66931e253..547036f08a 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -652,7 +652,7 @@ var/datum/radio_frequency/radio_connection var/hearing_range = 1 -/obj/item/integrated_circuit/input/signaler/Initialize() +/obj/item/integrated_circuit/input/signaler/Initialize(mapload) . = ..() spawn(40) set_frequency(frequency) @@ -738,7 +738,7 @@ power_draw_per_use = 50 var/address -/obj/item/integrated_circuit/input/ntnet_packet/Initialize() +/obj/item/integrated_circuit/input/ntnet_packet/Initialize(mapload) . = ..() var/datum/component/ntnet_interface/net = LoadComponent(/datum/component/ntnet_interface) address = net.hardware_id @@ -786,7 +786,7 @@ power_draw_per_use = 50 var/address -/obj/item/integrated_circuit/input/ntnet_advanced/Initialize() +/obj/item/integrated_circuit/input/ntnet_advanced/Initialize(mapload) . = ..() var/datum/component/ntnet_interface/net = LoadComponent(/datum/component/ntnet_interface) address = net.hardware_id diff --git a/code/modules/integrated_electronics/subtypes/lists.dm b/code/modules/integrated_electronics/subtypes/lists.dm index a5c482c7de..5855959627 100644 --- a/code/modules/integrated_electronics/subtypes/lists.dm +++ b/code/modules/integrated_electronics/subtypes/lists.dm @@ -360,7 +360,7 @@ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH var/number_of_pins = 16 -/obj/item/integrated_circuit/lists/constructor/Initialize() +/obj/item/integrated_circuit/lists/constructor/Initialize(mapload) for(var/i = 1 to number_of_pins) inputs["input [i]"] = IC_PINTYPE_ANY // This is just a string since pins don't get built until ..() is called. complexity = number_of_pins / 2 @@ -406,7 +406,7 @@ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH var/number_of_pins = 16 -/obj/item/integrated_circuit/lists/deconstructor/Initialize() +/obj/item/integrated_circuit/lists/deconstructor/Initialize(mapload) for(var/i = 1 to number_of_pins) outputs["output [i]"] = IC_PINTYPE_ANY // This is just a string since pins don't get built until ..() is called. complexity = number_of_pins / 2 diff --git a/code/modules/integrated_electronics/subtypes/memory.dm b/code/modules/integrated_electronics/subtypes/memory.dm index 34c36883d1..75ce4aefd7 100644 --- a/code/modules/integrated_electronics/subtypes/memory.dm +++ b/code/modules/integrated_electronics/subtypes/memory.dm @@ -11,7 +11,7 @@ power_draw_per_use = 1 var/number_of_pins = 1 -/obj/item/integrated_circuit/memory/Initialize() +/obj/item/integrated_circuit/memory/Initialize(mapload) for(var/i = 1 to number_of_pins) inputs["input [i]"] = IC_PINTYPE_ANY // This is just a string since pins don't get built until ..() is called. outputs["output [i]"] = IC_PINTYPE_ANY diff --git a/code/modules/integrated_electronics/subtypes/output.dm b/code/modules/integrated_electronics/subtypes/output.dm index 833b2963ad..e0b1afe72e 100644 --- a/code/modules/integrated_electronics/subtypes/output.dm +++ b/code/modules/integrated_electronics/subtypes/output.dm @@ -148,7 +148,7 @@ power_draw_per_use = 10 var/list/sounds = list() -/obj/item/integrated_circuit/output/sound/Initialize() +/obj/item/integrated_circuit/output/sound/Initialize(mapload) .= ..() extended_desc = list() extended_desc += "The first input pin determines which sound is used. The choices are; " @@ -230,7 +230,7 @@ desc = "Takes a sound name as an input, and will play said sound when pulsed. This circuit is often found in AI announcement systems." spawn_flags = IC_SPAWN_RESEARCH -/obj/item/integrated_circuit/output/sound/vox/Initialize() +/obj/item/integrated_circuit/output/sound/vox/Initialize(mapload) .= ..() sounds = GLOB.vox_sounds extended_desc = "The first input pin determines which sound is used. It uses the AI Vox Broadcast word list. So either experiment to find words that work, or ask the AI to help in figuring them out. The second pin determines the volume of sound that is played, and the third determines if the frequency of the sound will vary with each activation." diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm index de6ad729e9..bdd9e954db 100644 --- a/code/modules/integrated_electronics/subtypes/reagents.dm +++ b/code/modules/integrated_electronics/subtypes/reagents.dm @@ -6,7 +6,7 @@ cooldown_per_use = 10 var/volume = 0 -/obj/item/integrated_circuit/reagent/Initialize() +/obj/item/integrated_circuit/reagent/Initialize(mapload) . = ..() if(volume) create_reagents(volume) @@ -75,7 +75,7 @@ var/transfer_amount = 10 var/busy = FALSE -/obj/item/integrated_circuit/reagent/injector/Initialize() +/obj/item/integrated_circuit/reagent/injector/Initialize(mapload) . = ..() reagents.reagents_holder_flags |= OPENCONTAINER @@ -271,7 +271,7 @@ activators = list("push ref" = IC_PINTYPE_PULSE_OUT) spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH -/obj/item/integrated_circuit/reagent/storage/Initialize() +/obj/item/integrated_circuit/reagent/storage/Initialize(mapload) . = ..() reagents.reagents_holder_flags |= OPENCONTAINER @@ -301,7 +301,7 @@ complexity = 8 spawn_flags = IC_SPAWN_RESEARCH -/obj/item/integrated_circuit/reagent/storage/cryo/Initialize() +/obj/item/integrated_circuit/reagent/storage/cryo/Initialize(mapload) . = ..() reagents.reagents_holder_flags |= NO_REACT @@ -520,7 +520,7 @@ else power_draw_idle = 0 -/obj/item/integrated_circuit/reagent/storage/heater/Initialize() +/obj/item/integrated_circuit/reagent/storage/heater/Initialize(mapload) .=..() START_PROCESSING(SScircuit, src) @@ -572,7 +572,7 @@ var/smoke_radius = 5 var/notified = FALSE -/obj/item/integrated_circuit/reagent/smoke/Initialize() +/obj/item/integrated_circuit/reagent/smoke/Initialize(mapload) . = ..() reagents.reagents_holder_flags |= OPENCONTAINER @@ -630,7 +630,7 @@ power_draw_per_use = 15 var/busy = FALSE -/obj/item/integrated_circuit/reagent/extinguisher/Initialize() +/obj/item/integrated_circuit/reagent/extinguisher/Initialize(mapload) .=..() reagents.reagents_holder_flags |= OPENCONTAINER set_pin_data(IC_OUTPUT,2, src) diff --git a/code/modules/integrated_electronics/subtypes/smart.dm b/code/modules/integrated_electronics/subtypes/smart.dm index e1fdc36552..0f97ff8e08 100644 --- a/code/modules/integrated_electronics/subtypes/smart.dm +++ b/code/modules/integrated_electronics/subtypes/smart.dm @@ -87,7 +87,7 @@ power_draw_per_use = 80 var/obj/item/card/id/idc -/obj/item/integrated_circuit/smart/advanced_pathfinder/Initialize() +/obj/item/integrated_circuit/smart/advanced_pathfinder/Initialize(mapload) .=..() idc = new(src) diff --git a/code/modules/integrated_electronics/subtypes/weaponized.dm b/code/modules/integrated_electronics/subtypes/weaponized.dm index 54b14cccbc..0458700f44 100644 --- a/code/modules/integrated_electronics/subtypes/weaponized.dm +++ b/code/modules/integrated_electronics/subtypes/weaponized.dm @@ -162,7 +162,7 @@ var/pre_attached_grenade_type demands_object_input = TRUE // You can put stuff in once the circuit is in assembly,passed down from additem and handled by attackby() -/obj/item/integrated_circuit/weaponized/grenade/Initialize() +/obj/item/integrated_circuit/weaponized/grenade/Initialize(mapload) . = ..() if(pre_attached_grenade_type) var/grenade = new pre_attached_grenade_type(src) diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index 1823a2498a..df2fd7a5c6 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -141,7 +141,7 @@ GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, S //The helmet is necessary because /obj/item/clothing/head/helmet/sec is overwritten in the chameleon list by the standard helmet, which has the same name and icon state -/obj/item/radio/headset/headset_sec/alt/department/Initialize() +/obj/item/radio/headset/headset_sec/alt/department/Initialize(mapload) . = ..() wires = new/datum/wires/radio(src) secure_radio_connections = new diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index fb6992dd4e..3b614d925c 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -175,7 +175,7 @@ /obj/structure/bookcase/manuals/engineering name = "engineering manuals bookcase" -/obj/structure/bookcase/manuals/engineering/Initialize() +/obj/structure/bookcase/manuals/engineering/Initialize(mapload) . = ..() new /obj/item/book/manual/wiki/engineering_construction(src) new /obj/item/book/manual/wiki/engineering_hacking(src) @@ -188,7 +188,7 @@ /obj/structure/bookcase/manuals/research_and_development name = "\improper R&D manuals bookcase" -/obj/structure/bookcase/manuals/research_and_development/Initialize() +/obj/structure/bookcase/manuals/research_and_development/Initialize(mapload) . = ..() new /obj/item/book/manual/wiki/research_and_development(src) update_icon() @@ -196,7 +196,7 @@ /obj/structure/bookcase/manuals/medical name = "medical manuals bookcase" -/obj/structure/bookcase/manuals/medical/Initialize() +/obj/structure/bookcase/manuals/medical/Initialize(mapload) . = ..() new /obj/item/book/manual/wiki/medical_cloning(src) update_icon() diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index 1125d15bca..4f73b037c8 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -183,7 +183,7 @@ var/printer_cooldown = 0 COOLDOWN_DECLARE(library_console_topic_cooldown) -/obj/machinery/computer/libraryconsole/bookmanagement/Initialize() +/obj/machinery/computer/libraryconsole/bookmanagement/Initialize(mapload) . = ..() if(circuit) circuit.name = "Book Inventory Management Console (Machine Board)" diff --git a/code/modules/library/random_books.dm b/code/modules/library/random_books.dm index d60609147a..be5e9ea6b5 100644 --- a/code/modules/library/random_books.dm +++ b/code/modules/library/random_books.dm @@ -1,7 +1,7 @@ /obj/item/book/manual/random icon_state = "random_book" -/obj/item/book/manual/random/Initialize() +/obj/item/book/manual/random/Initialize(mapload) ..() var/static/banned_books = list(/obj/item/book/manual/random, /obj/item/book/manual/nuclear, /obj/item/book/manual/wiki) var/newtype = pick(subtypesof(/obj/item/book/manual) - banned_books) diff --git a/code/modules/mapping/mapping_helpers/_mapping_helpers.dm b/code/modules/mapping/mapping_helpers/_mapping_helpers.dm index a96b81528f..7bb281e5d9 100644 --- a/code/modules/mapping/mapping_helpers/_mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers/_mapping_helpers.dm @@ -4,7 +4,7 @@ icon_state = "" var/late = FALSE -/obj/effect/mapping_helpers/Initialize() +/obj/effect/mapping_helpers/Initialize(mapload) ..() return late ? INITIALIZE_HINT_LATELOAD : INITIALIZE_HINT_QDEL @@ -83,7 +83,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) /obj/effect/mapping_helpers/no_lava icon_state = "no_lava" -/obj/effect/mapping_helpers/no_lava/Initialize() +/obj/effect/mapping_helpers/no_lava/Initialize(mapload) . = ..() var/turf/T = get_turf(src) T.flags_1 |= NO_LAVA_GEN_1 diff --git a/code/modules/mapping/mapping_helpers/baseturf.dm b/code/modules/mapping/mapping_helpers/baseturf.dm index 4d79d3dba5..8bb44ae993 100644 --- a/code/modules/mapping/mapping_helpers/baseturf.dm +++ b/code/modules/mapping/mapping_helpers/baseturf.dm @@ -8,7 +8,7 @@ layer = POINT_LAYER -/obj/effect/baseturf_helper/Initialize() +/obj/effect/baseturf_helper/Initialize(mapload) . = ..() return INITIALIZE_HINT_LATELOAD diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm index e97060b45d..3f213eb934 100644 --- a/code/modules/mining/abandoned_crates.dm +++ b/code/modules/mining/abandoned_crates.dm @@ -11,7 +11,7 @@ var/codelen = 4 tamperproof = 90 -/obj/structure/closet/crate/secure/loot/Initialize() +/obj/structure/closet/crate/secure/loot/Initialize(mapload) . = ..() var/list/digits = list("1", "2", "3", "4", "5", "6", "7", "8", "9", "0") code = "" diff --git a/code/modules/mining/aux_base.dm b/code/modules/mining/aux_base.dm index feb4b4b2da..494ca0e433 100644 --- a/code/modules/mining/aux_base.dm +++ b/code/modules/mining/aux_base.dm @@ -27,7 +27,7 @@ interface with the mining shuttle at the landing site if a mobile beacon is also var/obj/item/gps/internal/base/locator circuit = /obj/item/circuitboard/computer/auxiliary_base -/obj/machinery/computer/auxillary_base/Initialize() +/obj/machinery/computer/auxillary_base/Initialize(mapload) . = ..() locator = new(src) diff --git a/code/modules/mining/aux_base_camera.dm b/code/modules/mining/aux_base_camera.dm index be0a41427f..262e776c68 100644 --- a/code/modules/mining/aux_base_camera.dm +++ b/code/modules/mining/aux_base_camera.dm @@ -6,7 +6,7 @@ icon_state = "construction_drone" var/area/starting_area -/mob/camera/aiEye/remote/base_construction/Initialize() +/mob/camera/aiEye/remote/base_construction/Initialize(mapload) . = ..() starting_area = get_area(loc) diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm index dc52fb7f20..a05085b57b 100644 --- a/code/modules/mining/equipment/explorer_gear.dm +++ b/code/modules/mining/equipment/explorer_gear.dm @@ -35,7 +35,7 @@ /obj/item/clothing/head/hooded/explorer/standard -/obj/item/clothing/suit/hooded/explorer/standard/Initialize() +/obj/item/clothing/suit/hooded/explorer/standard/Initialize(mapload) . = ..() AddComponent(/datum/component/armor_plate) RegisterSignal(src, COMSIG_ARMOR_PLATED, .proc/upgrade_icon) @@ -54,7 +54,7 @@ if(wearer.wear_suit == src) wearer.update_inv_wear_suit() -/obj/item/clothing/head/hooded/explorer/standard/Initialize() +/obj/item/clothing/head/hooded/explorer/standard/Initialize(mapload) . = ..() AddComponent(/datum/component/armor_plate) RegisterSignal(src, COMSIG_ARMOR_PLATED, .proc/upgrade_icon) @@ -91,7 +91,7 @@ ..() w_class = mask_adjusted ? WEIGHT_CLASS_NORMAL : WEIGHT_CLASS_SMALL -/obj/item/clothing/mask/gas/explorer/folded/Initialize() +/obj/item/clothing/mask/gas/explorer/folded/Initialize(mapload) . = ..() adjustmask() @@ -108,7 +108,7 @@ armor = list("melee" = 70, "bullet" = 40, "laser" = 10, "energy" = 10, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe) -/obj/item/clothing/suit/space/hostile_environment/Initialize() +/obj/item/clothing/suit/space/hostile_environment/Initialize(mapload) . = ..() AddComponent(/datum/component/spraycan_paintable) START_PROCESSING(SSobj, src) @@ -137,7 +137,7 @@ armor = list("melee" = 70, "bullet" = 40, "laser" = 10, "energy" = 10, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) resistance_flags = FIRE_PROOF | LAVA_PROOF -/obj/item/clothing/head/helmet/space/hostile_environment/Initialize() +/obj/item/clothing/head/helmet/space/hostile_environment/Initialize(mapload) . = ..() AddComponent(/datum/component/spraycan_paintable) update_icon() diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index 409cdb825b..4d0a045344 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -34,7 +34,7 @@ detonation_damage = 60 wielded = 1 -/obj/item/kinetic_crusher/Initialize() +/obj/item/kinetic_crusher/Initialize(mapload) . = ..() RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield) RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield) diff --git a/code/modules/mining/equipment/mineral_scanner.dm b/code/modules/mining/equipment/mineral_scanner.dm index b2cd840468..98818cb957 100644 --- a/code/modules/mining/equipment/mineral_scanner.dm +++ b/code/modules/mining/equipment/mineral_scanner.dm @@ -78,6 +78,6 @@ pixel_x = -224 pixel_y = -224 -/obj/effect/temp_visual/mining_overlay/Initialize() +/obj/effect/temp_visual/mining_overlay/Initialize(mapload) . = ..() animate(src, alpha = 0, time = duration, easing = EASE_IN) diff --git a/code/modules/mining/equipment/mining_tools.dm b/code/modules/mining/equipment/mining_tools.dm index bb0ac0f957..0cb63d51a2 100644 --- a/code/modules/mining/equipment/mining_tools.dm +++ b/code/modules/mining/equipment/mining_tools.dm @@ -108,7 +108,7 @@ flags_1 = NONE toolspeed = 0.5 -/obj/item/pickaxe/drill/cyborg/Initialize() +/obj/item/pickaxe/drill/cyborg/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CYBORG_ITEM_TRAIT) @@ -155,7 +155,7 @@ attack_verb = list("bashed", "bludgeoned", "thrashed", "whacked") sharpness = SHARP_EDGED -/obj/item/shovel/Initialize() +/obj/item/shovel/Initialize(mapload) . = ..() AddComponent(/datum/component/butchering, 150, 40) //it's sharp, so it works, but barely. diff --git a/code/modules/mining/equipment/regenerative_core.dm b/code/modules/mining/equipment/regenerative_core.dm index 1de3a86702..4552d103b6 100644 --- a/code/modules/mining/equipment/regenerative_core.dm +++ b/code/modules/mining/equipment/regenerative_core.dm @@ -29,7 +29,7 @@ var/inert var/preserved -/obj/item/organ/regenerative_core/Initialize() +/obj/item/organ/regenerative_core/Initialize(mapload) . = ..() addtimer(CALLBACK(src, .proc/inert_check), 2400) @@ -116,7 +116,7 @@ desc = "A strange rock that crackles with power. It can be used to heal completely, but it will rapidly decay into uselessness." icon_state = "legion_soul" -/obj/item/organ/regenerative_core/legion/Initialize() +/obj/item/organ/regenerative_core/legion/Initialize(mapload) . = ..() update_icon() diff --git a/code/modules/mining/equipment/resonator.dm b/code/modules/mining/equipment/resonator.dm index 16dd893c3a..fd9ff4c91e 100644 --- a/code/modules/mining/equipment/resonator.dm +++ b/code/modules/mining/equipment/resonator.dm @@ -111,7 +111,7 @@ layer = ABOVE_ALL_MOB_LAYER duration = 4 -/obj/effect/temp_visual/resonance_crush/Initialize() +/obj/effect/temp_visual/resonance_crush/Initialize(mapload) . = ..() transform = matrix()*1.5 animate(src, transform = matrix()*0.1, alpha = 50, time = 4) diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index ba4b02fcf4..ecccc786c8 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -327,7 +327,7 @@ /obj/item/phylactery, /obj/item/banhammer) -/obj/item/fakeartefact/Initialize() +/obj/item/fakeartefact/Initialize(mapload) . = ..() var/obj/item/I = pick(possible) name = initial(I.name) diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm index adee8b66ce..18f816699c 100644 --- a/code/modules/mining/fulton.dm +++ b/code/modules/mining/fulton.dm @@ -161,7 +161,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) density = FALSE var/beacon_network = "station" -/obj/structure/extraction_point/Initialize() +/obj/structure/extraction_point/Initialize(mapload) . = ..() name += " ([rand(100,999)]) ([get_area_name(src, TRUE)])" GLOB.total_extraction_beacons += src diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm index 6ef4684921..97953e6297 100644 --- a/code/modules/mining/laborcamp/laborstacker.dm +++ b/code/modules/mining/laborcamp/laborstacker.dm @@ -15,7 +15,7 @@ GLOBAL_LIST(labor_sheet_values) /// Needed to send messages to sec radio var/obj/item/radio/Radio -/obj/machinery/mineral/labor_claim_console/Initialize() +/obj/machinery/mineral/labor_claim_console/Initialize(mapload) . = ..() Radio = new/obj/item/radio(src) Radio.listening = FALSE diff --git a/code/modules/mining/lavaland/ash_flora.dm b/code/modules/mining/lavaland/ash_flora.dm index 9710773309..b9ab6463c7 100644 --- a/code/modules/mining/lavaland/ash_flora.dm +++ b/code/modules/mining/lavaland/ash_flora.dm @@ -20,7 +20,7 @@ var/regrowth_time_low = 8 MINUTES var/regrowth_time_high = 16 MINUTES -/obj/structure/flora/ash/Initialize() +/obj/structure/flora/ash/Initialize(mapload) . = ..() base_icon = "[icon_state][rand(1, 4)]" icon_state = base_icon @@ -152,7 +152,7 @@ seed = /obj/item/seeds/lavaland/polypore wine_power = 20 -/obj/item/reagent_containers/food/snacks/grown/ash_flora/Initialize() +/obj/item/reagent_containers/food/snacks/grown/ash_flora/Initialize(mapload) . = ..() pixel_x = rand(-4, 4) pixel_y = rand(-4, 4) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 0b394e0fc5..6f71f04d9f 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -184,7 +184,7 @@ icon_state = "datadisk1" var/modkit_design = /datum/design/unique_modkit -/obj/item/disk/design_disk/modkit_disc/Initialize() +/obj/item/disk/design_disk/modkit_disc/Initialize(mapload) . = ..() blueprints[1] = new modkit_design @@ -383,7 +383,7 @@ wisp.forceMove(src) SSblackbox.record_feedback("tally", "wisp_lantern", 1, "Returned") -/obj/item/wisp_lantern/Initialize() +/obj/item/wisp_lantern/Initialize(mapload) . = ..() wisp = new(src) @@ -473,7 +473,7 @@ icon_state = "red_cube" teleport_color = "#FD3F48" -/obj/item/warp_cube/red/Initialize() +/obj/item/warp_cube/red/Initialize(mapload) . = ..() if(!linked) var/obj/item/warp_cube/blue = new(src.loc) @@ -553,7 +553,7 @@ actions_types = list(/datum/action/item_action/immortality) var/cooldown = 0 -/obj/item/immortality_talisman/Initialize() +/obj/item/immortality_talisman/Initialize(mapload) . = ..() AddComponent(/datum/component/anti_magic, TRUE, TRUE, TRUE) @@ -637,7 +637,7 @@ name = "paradox bag" desc = "Somehow, it's in two places at once." -/obj/item/shared_storage/red/Initialize() +/obj/item/shared_storage/red/Initialize(mapload) . = ..() var/datum/component/storage/STR = AddComponent(/datum/component/storage/concrete) STR.max_w_class = WEIGHT_CLASS_NORMAL @@ -876,7 +876,7 @@ var/summon_cooldown = 0 var/list/mob/dead/observer/spirits -/obj/item/melee/ghost_sword/Initialize() +/obj/item/melee/ghost_sword/Initialize(mapload) . = ..() spirits = list() START_PROCESSING(SSobj, src) diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index 851d78004b..3d89377952 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -65,7 +65,7 @@ var/obj/machinery/mineral/processing_unit/machine = null var/machinedir = EAST -/obj/machinery/mineral/processing_unit_console/Initialize() +/obj/machinery/mineral/processing_unit_console/Initialize(mapload) . = ..() machine = locate(/obj/machinery/mineral/processing_unit, get_step(src, machinedir)) if (machine) @@ -127,7 +127,7 @@ var/selected_alloy = null var/datum/techweb/stored_research -/obj/machinery/mineral/processing_unit/Initialize() +/obj/machinery/mineral/processing_unit/Initialize(mapload) . = ..() proximity_monitor = new(src, 1) AddComponent(/datum/component/material_container, list(/datum/material/iron, /datum/material/glass, /datum/material/silver, /datum/material/gold, /datum/material/diamond, /datum/material/plasma, /datum/material/uranium, /datum/material/bananium, /datum/material/titanium, /datum/material/bluespace), INFINITY, TRUE, /obj/item/stack) diff --git a/code/modules/mining/machine_stacking.dm b/code/modules/mining/machine_stacking.dm index 40f4db3660..c06a090314 100644 --- a/code/modules/mining/machine_stacking.dm +++ b/code/modules/mining/machine_stacking.dm @@ -12,7 +12,7 @@ /// Direction for which console looks for stacking machine to connect to var/machinedir = SOUTHEAST -/obj/machinery/mineral/stacking_unit_console/Initialize() +/obj/machinery/mineral/stacking_unit_console/Initialize(mapload) . = ..() machine = locate(/obj/machinery/mineral/stacking_machine, get_step(src, machinedir)) if (machine) diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index c7ddaebe2d..491d647c37 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -88,7 +88,7 @@ src.equipment_path = path src.cost = cost -/obj/machinery/mineral/equipment_vendor/Initialize() +/obj/machinery/mineral/equipment_vendor/Initialize(mapload) . = ..() build_inventory() @@ -281,7 +281,7 @@ name = "golem ship equipment vendor" circuit = /obj/item/circuitboard/machine/mining_equipment_vendor/golem -/obj/machinery/mineral/equipment_vendor/golem/Initialize() +/obj/machinery/mineral/equipment_vendor/golem/Initialize(mapload) . = ..() desc += "\nIt seems a few selections have been added." prize_list += list( diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index e9c38398fb..091e80aef6 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -8,7 +8,7 @@ var/set_luminosity = 8 var/set_cap = 0 -/obj/effect/light_emitter/Initialize() +/obj/effect/light_emitter/Initialize(mapload) . = ..() set_light(set_luminosity, set_cap) diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index 8037a22a52..51a3d196b6 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -39,7 +39,7 @@ var/light_on = 0 var/obj/item/gun/energy/kinetic_accelerator/minebot/stored_gun -/mob/living/simple_animal/hostile/mining_drone/Initialize() +/mob/living/simple_animal/hostile/mining_drone/Initialize(mapload) . = ..() stored_gun = new(src) var/datum/action/innate/minedrone/toggle_light/toggle_light_action = new() diff --git a/code/modules/mining/mint.dm b/code/modules/mining/mint.dm index f8a4ba4a72..8f3431ba1b 100644 --- a/code/modules/mining/mint.dm +++ b/code/modules/mining/mint.dm @@ -16,7 +16,7 @@ var/chosen = /datum/material/iron //which material will be used to make coins -/obj/machinery/mineral/mint/Initialize() +/obj/machinery/mineral/mint/Initialize(mapload) . = ..() AddComponent(/datum/component/material_container, list( /datum/material/iron, diff --git a/code/modules/mining/money_bag.dm b/code/modules/mining/money_bag.dm index 7be07f2bf9..b9365d2f9d 100644 --- a/code/modules/mining/money_bag.dm +++ b/code/modules/mining/money_bag.dm @@ -9,7 +9,7 @@ max_integrity = 100 w_class = WEIGHT_CLASS_BULKY -/obj/item/storage/bag/money/Initialize() +/obj/item/storage/bag/money/Initialize(mapload) . = ..() if(prob(20)) icon_state = "moneybagalt" diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 83344949ac..056ad2d642 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -384,7 +384,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ var/coinflip item_flags = NO_MAT_REDEMPTION //You know, it's kind of a problem that money is worth more extrinsicly than intrinsically in this universe. -/obj/item/coin/Initialize() +/obj/item/coin/Initialize(mapload) . = ..() coinflip = pick(sideslist) icon_state = "coin_[coinflip]" diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm index 90b6da26fa..a4e5b6b8d4 100644 --- a/code/modules/mob/dead/dead.dm +++ b/code/modules/mob/dead/dead.dm @@ -7,7 +7,7 @@ INITIALIZE_IMMEDIATE(/mob/dead) move_resist = INFINITY throwforce = 0 -/mob/dead/Initialize() +/mob/dead/Initialize(mapload) SHOULD_CALL_PARENT(FALSE) if(flags_1 & INITIALIZED_1) stack_trace("Warning: [src]([type]) initialized multiple times!") diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index c2d950bc8f..ba082f4870 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -19,7 +19,7 @@ //is there a result we want to read from the age gate var/age_gate_result -/mob/dead/new_player/Initialize() +/mob/dead/new_player/Initialize(mapload) if(client && SSticker.state == GAME_STATE_STARTUP) var/atom/movable/screen/splash/S = new(client, TRUE, TRUE) S.Fade(TRUE) @@ -760,7 +760,7 @@ client.prefs.scars_list["[cur_scar_index]"] = valid_scars client.prefs.save_character() - + client.prefs.copy_to(H, initial_spawn = TRUE) H.dna.update_dna_identity() if(mind) diff --git a/code/modules/mob/living/bloodcrawl.dm b/code/modules/mob/living/bloodcrawl.dm index 13803a63d2..6f2f7094e6 100644 --- a/code/modules/mob/living/bloodcrawl.dm +++ b/code/modules/mob/living/bloodcrawl.dm @@ -144,7 +144,7 @@ icon = 'icons/effects/blood.dmi' item_flags = ABSTRACT -/obj/item/bloodcrawl/Initialize() +/obj/item/bloodcrawl/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm index f38f326bc6..99ff254d08 100644 --- a/code/modules/mob/living/brain/MMI.dm +++ b/code/modules/mob/living/brain/MMI.dm @@ -32,7 +32,7 @@ else . += "mmi_dead" -/obj/item/mmi/Initialize() +/obj/item/mmi/Initialize(mapload) . = ..() radio = new(src) //Spawns a radio inside the MMI. radio.broadcasting = 0 //researching radio mmis turned the robofabs into radios because this didnt start as 0. @@ -215,7 +215,7 @@ desc = "Syndicate's own brand of MMI. It enforces laws designed to help Syndicate agents achieve their goals upon cyborgs and AIs created with it." overrides_aicore_laws = TRUE -/obj/item/mmi/syndie/Initialize() +/obj/item/mmi/syndie/Initialize(mapload) . = ..() laws = new /datum/ai_laws/syndicate_override() radio.on = 0 diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm index 91fab5f2ec..4186148031 100644 --- a/code/modules/mob/living/brain/brain.dm +++ b/code/modules/mob/living/brain/brain.dm @@ -9,7 +9,7 @@ possible_a_intents = list(INTENT_HELP, INTENT_HARM) //for mechas speech_span = SPAN_ROBOT -/mob/living/brain/Initialize() +/mob/living/brain/Initialize(mapload) . = ..() create_dna(src) if(stored_dna.blood_type) diff --git a/code/modules/mob/living/brain/posibrain.dm b/code/modules/mob/living/brain/posibrain.dm index e1eb09405a..b3749b4a41 100644 --- a/code/modules/mob/living/brain/posibrain.dm +++ b/code/modules/mob/living/brain/posibrain.dm @@ -28,7 +28,7 @@ GLOBAL_VAR(posibrain_notify_cooldown) var/list/possible_names //If you leave this blank, it will use the global posibrain names var/picked_name -/obj/item/mmi/posibrain/Initialize() +/obj/item/mmi/posibrain/Initialize(mapload) . = ..() brainmob = new(src) var/new_name diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index e9a62d209b..1b7207d7eb 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -34,7 +34,7 @@ var/static/regex/alien_name_regex = new("alien (larva|sentinel|drone|hunter|praetorian|queen)( \\(\\d+\\))?") -/mob/living/carbon/alien/Initialize() +/mob/living/carbon/alien/Initialize(mapload) add_verb(src, /mob/living/proc/mob_sleep) add_verb(src, /mob/living/proc/lay_down) diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index 28d311b034..6598dd6a54 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -17,7 +17,7 @@ Doesn't work on other aliens/AI.*/ action_icon_state = "spell_default" action_background_icon_state = "bg_alien" -/obj/effect/proc_holder/alien/Initialize() +/obj/effect/proc_holder/alien/Initialize(mapload) . = ..() action = new(src) diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm index cf024d707d..3e8a5d8bdb 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm @@ -6,7 +6,7 @@ icon_state = "aliend" meleeKnockdownPower = 80 -/mob/living/carbon/alien/humanoid/drone/Initialize() +/mob/living/carbon/alien/humanoid/drone/Initialize(mapload) AddAbility(new/obj/effect/proc_holder/alien/evolve(null)) . = ..() diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm index 796a78d566..3e0faf44f0 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm @@ -5,7 +5,7 @@ health = 250 icon_state = "alienp" -/mob/living/carbon/alien/humanoid/royal/praetorian/Initialize() +/mob/living/carbon/alien/humanoid/royal/praetorian/Initialize(mapload) real_name = name AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/repulse/xeno(src)) AddAbility(new /obj/effect/proc_holder/alien/royal/praetorian/evolve()) diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm index 67cf6f7d25..9f8b9d6845 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm @@ -6,7 +6,7 @@ icon_state = "aliens" meleeSlashHumanPower = 15 -/mob/living/carbon/alien/humanoid/sentinel/Initialize() +/mob/living/carbon/alien/humanoid/sentinel/Initialize(mapload) AddAbility(new /obj/effect/proc_holder/alien/sneak) . = ..() diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index 343b95f05d..71b1d09fad 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -28,7 +28,7 @@ GLOBAL_LIST_INIT(strippable_alien_humanoid_items, create_strippable_list(list( ))) //This is fine right now, if we're adding organ specific damage this needs to be updated -/mob/living/carbon/alien/humanoid/Initialize() +/mob/living/carbon/alien/humanoid/Initialize(mapload) AddAbility(new/obj/effect/proc_holder/alien/regurgitate(null)) . = ..() diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm index bcc83f14f9..7717180e6c 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm @@ -28,7 +28,7 @@ icon_state = "alienq" var/datum/action/small_sprite/smallsprite = new/datum/action/small_sprite/queen() -/mob/living/carbon/alien/humanoid/royal/queen/Initialize() +/mob/living/carbon/alien/humanoid/royal/queen/Initialize(mapload) //there should only be one queen for(var/mob/living/carbon/alien/humanoid/royal/queen/Q in GLOB.carbon_list) if(Q == src) @@ -110,7 +110,7 @@ item_flags = ABSTRACT | DROPDEL icon = 'icons/mob/alien.dmi' -/obj/item/queenpromote/Initialize() +/obj/item/queenpromote/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index 7a610ac421..ce38f615f7 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -21,7 +21,7 @@ bodyparts = list(/obj/item/bodypart/chest/larva, /obj/item/bodypart/head/larva) //This is fine right now, if we're adding organ specific damage this needs to be updated -/mob/living/carbon/alien/larva/Initialize() +/mob/living/carbon/alien/larva/Initialize(mapload) AddAbility(new/obj/effect/proc_holder/alien/hide(null)) AddAbility(new/obj/effect/proc_holder/alien/larva_evolve(null)) diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm index 41c3882de6..2db912fe7e 100644 --- a/code/modules/mob/living/carbon/alien/organs.dm +++ b/code/modules/mob/living/carbon/alien/organs.dm @@ -4,7 +4,7 @@ var/list/alien_powers = list() organ_flags = ORGAN_NO_SPOIL|ORGAN_EDIBLE -/obj/item/organ/alien/Initialize() +/obj/item/organ/alien/Initialize(mapload) . = ..() for(var/A in alien_powers) if(ispath(A)) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index cc17928a98..e12a28d01a 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -1,7 +1,7 @@ /mob/living/carbon blood_volume = BLOOD_VOLUME_NORMAL -/mob/living/carbon/Initialize() +/mob/living/carbon/Initialize(mapload) . = ..() create_reagents(1000, NONE, NO_REAGENTS_VALUE) update_body_parts() //to update the carbon's new bodyparts appearance diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 0f149928df..c60e4c6cb2 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -5,7 +5,7 @@ icon_state = "caucasian_m" SET_APPEARANCE_FLAGS(KEEP_TOGETHER|TILE_BOUND|PIXEL_SCALE) -/mob/living/carbon/human/Initialize() +/mob/living/carbon/human/Initialize(mapload) add_verb(src, /mob/living/proc/mob_sleep) add_verb(src, /mob/living/proc/lay_down) add_verb(src, /mob/living/carbon/human/verb/underwear_toggle) @@ -903,7 +903,7 @@ /mob/living/carbon/human/species var/race = null -/mob/living/carbon/human/species/Initialize() +/mob/living/carbon/human/species/Initialize(mapload) . = ..() set_species(race) diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index 66402de911..3b84752e1e 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -474,7 +474,7 @@ light_color = "#FFFFFF" light_range = LUMINESCENT_DEFAULT_GLOW -/obj/effect/dummy/luminescent_glow/Initialize() +/obj/effect/dummy/luminescent_glow/Initialize(mapload) . = ..() if(!isliving(loc)) return INITIALIZE_HINT_QDEL diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index f412099831..33d92aa683 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -168,7 +168,7 @@ sharpness = SHARP_EDGED total_mass = TOTAL_MASS_HAND_REPLACEMENT -/obj/item/light_eater/Initialize() +/obj/item/light_eater/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT) AddComponent(/datum/component/butchering, 80, 70) diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index 8a029613e2..bb35ff082b 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -180,7 +180,7 @@ GLOBAL_LIST_INIT(strippable_monkey_items, create_strippable_list(list( /mob/living/carbon/monkey/angry aggressive = TRUE -/mob/living/carbon/monkey/angry/Initialize() +/mob/living/carbon/monkey/angry/Initialize(mapload) . = ..() if(prob(10)) var/obj/item/clothing/head/helmet/justice/escape/helmet = new(src) diff --git a/code/modules/mob/living/carbon/monkey/punpun.dm b/code/modules/mob/living/carbon/monkey/punpun.dm index d71a989c1d..c8b8dbbc9d 100644 --- a/code/modules/mob/living/carbon/monkey/punpun.dm +++ b/code/modules/mob/living/carbon/monkey/punpun.dm @@ -9,7 +9,7 @@ var/list/pet_monkey_names = list("Pun Pun", "Bubbles", "Mojo", "George", "Darwin", "Aldo", "Caeser", "Kanzi", "Kong", "Terk", "Grodd", "Mala", "Bojangles", "Coco", "Able", "Baker", "Scatter", "Norbit", "Travis") var/list/rare_pet_monkey_names = list("Professor Bobo", "Deempisi's Revenge", "Furious George", "King Louie", "Dr. Zaius", "Jimmy Rustles", "Dinner", "Lanky") -/mob/living/carbon/monkey/punpun/Initialize() +/mob/living/carbon/monkey/punpun/Initialize(mapload) Read_Memory() if(ancestor_name) name = ancestor_name diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index bf3094cb08..0fd3b19650 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1,4 +1,4 @@ -/mob/living/Initialize() +/mob/living/Initialize(mapload) . = ..() if(unique_name) name = "[name] ([rand(1, 1000)])" diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index 3fad48e584..bc6ab7c34e 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -18,7 +18,7 @@ var/ai_detector_visible = TRUE var/ai_detector_color = COLOR_RED -/mob/camera/aiEye/Initialize() +/mob/camera/aiEye/Initialize(mapload) . = ..() GLOB.aiEyes += src update_ai_detect_hud() diff --git a/code/modules/mob/living/silicon/ai/multicam.dm b/code/modules/mob/living/silicon/ai/multicam.dm index 54713acac4..b48b39a885 100644 --- a/code/modules/mob/living/silicon/ai/multicam.dm +++ b/code/modules/mob/living/silicon/ai/multicam.dm @@ -6,7 +6,7 @@ var/highlighted = FALSE var/mob/camera/aiEye/pic_in_pic/aiEye -/atom/movable/screen/movable/pic_in_pic/ai/Initialize() +/atom/movable/screen/movable/pic_in_pic/ai/Initialize(mapload) . = ..() aiEye = new /mob/camera/aiEye/pic_in_pic() aiEye.screen = src @@ -103,7 +103,7 @@ GLOBAL_DATUM(ai_camera_room_landmark, /obj/effect/landmark/ai_multicam_room) icon = 'icons/mob/landmarks.dmi' icon_state = "x" -/obj/effect/landmark/ai_multicam_room/Initialize() +/obj/effect/landmark/ai_multicam_room/Initialize(mapload) . = ..() qdel(GLOB.ai_camera_room_landmark) GLOB.ai_camera_room_landmark = src diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index d19ef4c16e..fdde445379 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -95,7 +95,7 @@ GLOB.pai_list -= src return ..() -/mob/living/silicon/pai/Initialize() +/mob/living/silicon/pai/Initialize(mapload) var/obj/item/paicard/P = loc START_PROCESSING(SSfastprocess, src) GLOB.pai_list += src @@ -143,7 +143,7 @@ custom_holoform.Grant(src) emitter_next_use = world.time + 10 SECONDS -/mob/living/silicon/pai/deployed/Initialize() +/mob/living/silicon/pai/deployed/Initialize(mapload) . = ..() fold_out(TRUE) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index bd1c260bf5..19847d9bdc 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -731,7 +731,7 @@ /mob/living/silicon/robot/modules var/set_module = /obj/item/robot_module -/mob/living/silicon/robot/modules/Initialize() +/mob/living/silicon/robot/modules/Initialize(mapload) . = ..() module.transform_to(set_module) @@ -772,7 +772,7 @@ cell = /obj/item/stock_parts/cell/hyper // radio = /obj/item/radio/borg/syndicate -/mob/living/silicon/robot/modules/syndicate/Initialize() +/mob/living/silicon/robot/modules/syndicate/Initialize(mapload) . = ..() radio = new /obj/item/radio/borg/syndicate(src) laws = new /datum/ai_laws/syndicate_override() diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index b9c6f4e2c4..f2f1f8adbe 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -43,7 +43,7 @@ var/moduleselect_alternate_icon var/dogborg = FALSE -/obj/item/robot_module/Initialize() +/obj/item/robot_module/Initialize(mapload) . = ..() for(var/i in basic_modules) var/obj/item/I = new i(src) @@ -638,7 +638,7 @@ return FALSE return ..() -/obj/item/robot_module/security/Initialize() +/obj/item/robot_module/security/Initialize(mapload) . = ..() if(!CONFIG_GET(flag/weaken_secborg)) for(var/obj/item/gun/energy/disabler/cyborg/pewpew in basic_modules) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index b0ec2959d7..b97536b7a4 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -50,7 +50,7 @@ typing_indicator_state = /obj/effect/overlay/typing_indicator/machine -/mob/living/silicon/Initialize() +/mob/living/silicon/Initialize(mapload) . = ..() GLOB.silicon_mobs += src faction += "silicon" diff --git a/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm b/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm index 99048b4e9f..5796fe67ac 100644 --- a/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm +++ b/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm @@ -30,7 +30,7 @@ playsound(src,'sound/effects/beepskyspinsabre.ogg',100,TRUE,-1) stun_attack(AM) -/mob/living/simple_animal/bot/secbot/grievous/Initialize() +/mob/living/simple_animal/bot/secbot/grievous/Initialize(mapload) . = ..() weapon = new baton_type(src) INVOKE_ASYNC(weapon, /obj/item.proc/attack_self, src) diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index bac59ef2e0..203ac5f846 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -149,7 +149,7 @@ bot_reset() //Resets an AI's call, should it exist. update_icon() -/mob/living/simple_animal/bot/Initialize() +/mob/living/simple_animal/bot/Initialize(mapload) . = ..() GLOB.bots_list += src access_card = new /obj/item/card/id(src) @@ -871,7 +871,7 @@ Pass a positive integer as an argument to override a bot's default speed. anchored = FALSE var/mob/living/simple_animal/bot/owner = null -/obj/machinery/bot_core/Initialize() +/obj/machinery/bot_core/Initialize(mapload) . = ..() owner = loc if(!istype(owner)) diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm index ed68d4d272..0ad684ab4b 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -102,7 +102,7 @@ if(ascended && user.stat == CONSCIOUS && user.client) user.client.give_award(/datum/award/achievement/misc/cleanboss, user) -/mob/living/simple_animal/bot/cleanbot/Initialize() +/mob/living/simple_animal/bot/cleanbot/Initialize(mapload) . = ..() chosen_name = name diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm index fff1782154..8ec0aab5bb 100644 --- a/code/modules/mob/living/simple_animal/bot/construction.dm +++ b/code/modules/mob/living/simple_animal/bot/construction.dm @@ -208,7 +208,7 @@ created_name = "Floorbot" var/toolbox = /obj/item/storage/toolbox -/obj/item/bot_assembly/floorbot/Initialize() +/obj/item/bot_assembly/floorbot/Initialize(mapload) . = ..() update_icon() @@ -277,7 +277,7 @@ var/healthanalyzer = /obj/item/healthanalyzer var/firstaid = /obj/item/storage/firstaid -/obj/item/bot_assembly/medbot/Initialize() +/obj/item/bot_assembly/medbot/Initialize(mapload) . = ..() spawn(5) if(skin) diff --git a/code/modules/mob/living/simple_animal/bot/firebot.dm b/code/modules/mob/living/simple_animal/bot/firebot.dm index 9eea7a85b1..0b97a553b2 100644 --- a/code/modules/mob/living/simple_animal/bot/firebot.dm +++ b/code/modules/mob/living/simple_animal/bot/firebot.dm @@ -39,7 +39,7 @@ var/extinguish_fires = TRUE var/stationary_mode = FALSE -/mob/living/simple_animal/bot/firebot/Initialize() +/mob/living/simple_animal/bot/firebot/Initialize(mapload) . = ..() update_icon() var/datum/job/engineer/J = new/datum/job/engineer diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm index c8b502f032..8cd1cd519d 100644 --- a/code/modules/mob/living/simple_animal/bot/floorbot.dm +++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm @@ -43,7 +43,7 @@ #define REPLACE_TILE 6 #define TILE_EMAG 7 -/mob/living/simple_animal/bot/floorbot/Initialize() +/mob/living/simple_animal/bot/floorbot/Initialize(mapload) . = ..() update_icon() var/datum/job/engineer/J = new/datum/job/engineer diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm index eb415b9bb5..b8d82e8c7a 100644 --- a/code/modules/mob/living/simple_animal/bot/honkbot.dm +++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm @@ -37,7 +37,7 @@ var/weaponscheck = TRUE var/bikehorn = /obj/item/bikehorn -/mob/living/simple_animal/bot/honkbot/Initialize() +/mob/living/simple_animal/bot/honkbot/Initialize(mapload) . = ..() update_icon() auto_patrol = TRUE diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 56e2f66feb..34b49f5a64 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -49,7 +49,7 @@ var/obj/item/stock_parts/cell/cell var/bloodiness = 0 -/mob/living/simple_animal/bot/mulebot/Initialize() +/mob/living/simple_animal/bot/mulebot/Initialize(mapload) . = ..() wires = new /datum/wires/mulebot(src) var/datum/job/cargo_tech/J = new/datum/job/cargo_tech diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index c3ab805d62..4f6b6aa351 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -58,7 +58,7 @@ name = "Officer Pipsqueak" desc = "It's Officer Beep O'sky's smaller, just-as aggressive cousin, Pipsqueak." -/mob/living/simple_animal/bot/secbot/beepsky/jr/Initialize() +/mob/living/simple_animal/bot/secbot/beepsky/jr/Initialize(mapload) . = ..() resize = 0.8 update_transform() @@ -174,7 +174,7 @@ desc = "It's Officer Pingsky! Delegated to satellite guard duty for harbouring anti-human sentiment." radio_channel = RADIO_CHANNEL_AI_PRIVATE -/mob/living/simple_animal/bot/secbot/Initialize() +/mob/living/simple_animal/bot/secbot/Initialize(mapload) . = ..() update_icon() var/datum/job/detective/J = new/datum/job/detective diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 7b1e2dcaba..3e32712fb3 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -46,7 +46,7 @@ var/runetype var/datum/mind/original_mind -/mob/living/simple_animal/hostile/construct/Initialize() +/mob/living/simple_animal/hostile/construct/Initialize(mapload) . = ..() update_health_hud() var/spellnum = 1 @@ -382,7 +382,7 @@ return FALSE . = ..() -/mob/living/simple_animal/hostile/construct/harvester/Initialize() +/mob/living/simple_animal/hostile/construct/harvester/Initialize(mapload) . = ..() var/datum/action/innate/seek_prey/seek = new() seek.Grant(src) diff --git a/code/modules/mob/living/simple_animal/eldritch_demons.dm b/code/modules/mob/living/simple_animal/eldritch_demons.dm index 4a96c4be67..6fb53d42a4 100644 --- a/code/modules/mob/living/simple_animal/eldritch_demons.dm +++ b/code/modules/mob/living/simple_animal/eldritch_demons.dm @@ -34,7 +34,7 @@ ///Innate spells that are supposed to be added when a beast is created var/list/spells_to_add -/mob/living/simple_animal/hostile/eldritch/Initialize() +/mob/living/simple_animal/hostile/eldritch/Initialize(mapload) . = ..() add_spells() @@ -63,7 +63,7 @@ var/list/linked_mobs = list() -/mob/living/simple_animal/hostile/eldritch/raw_prophet/Initialize() +/mob/living/simple_animal/hostile/eldritch/raw_prophet/Initialize(mapload) . = ..() link_mob(src) diff --git a/code/modules/mob/living/simple_animal/friendly/bumbles.dm b/code/modules/mob/living/simple_animal/friendly/bumbles.dm index 53be1434c9..dca823ba21 100644 --- a/code/modules/mob/living/simple_animal/friendly/bumbles.dm +++ b/code/modules/mob/living/simple_animal/friendly/bumbles.dm @@ -31,7 +31,7 @@ speak_chance = 1 unique_name = FALSE -/mob/living/simple_animal/pet/bumbles/Initialize() +/mob/living/simple_animal/pet/bumbles/Initialize(mapload) . = ..() add_verb(src, /mob/living/proc/lay_down) AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS) diff --git a/code/modules/mob/living/simple_animal/friendly/butterfly.dm b/code/modules/mob/living/simple_animal/friendly/butterfly.dm index 1e6afd6044..5cb54ce6ca 100644 --- a/code/modules/mob/living/simple_animal/friendly/butterfly.dm +++ b/code/modules/mob/living/simple_animal/friendly/butterfly.dm @@ -28,7 +28,7 @@ verb_exclaim = "flutters intensely" verb_yell = "flutters intensely" -/mob/living/simple_animal/butterfly/Initialize() +/mob/living/simple_animal/butterfly/Initialize(mapload) . = ..() var/newcolor = rgb(rand(0, 255), rand(0, 255), rand(0, 255)) add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY) diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 4594d27ecd..0d04d4b562 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -36,7 +36,7 @@ var/held_icon = "cat2" footstep_type = FOOTSTEP_MOB_CLAW -/mob/living/simple_animal/pet/cat/Initialize() +/mob/living/simple_animal/pet/cat/Initialize(mapload) . = ..() add_verb(src, /mob/living/proc/lay_down) AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS) @@ -107,7 +107,7 @@ var/cats_deployed = 0 var/memory_saved = FALSE -/mob/living/simple_animal/pet/cat/Runtime/Initialize() +/mob/living/simple_animal/pet/cat/Runtime/Initialize(mapload) if(prob(5)) icon_state = "original" icon_living = "original" diff --git a/code/modules/mob/living/simple_animal/friendly/cockroach.dm b/code/modules/mob/living/simple_animal/friendly/cockroach.dm index b0d66a1209..66e9c75315 100644 --- a/code/modules/mob/living/simple_animal/friendly/cockroach.dm +++ b/code/modules/mob/living/simple_animal/friendly/cockroach.dm @@ -31,7 +31,7 @@ var/squish_chance = 50 del_on_death = 1 -/mob/living/simple_animal/cockroach/Initialize() +/mob/living/simple_animal/cockroach/Initialize(mapload) . = ..() AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS) diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index addbd493a5..8fd97a465c 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -26,7 +26,7 @@ var/obj/item/inventory_mask gold_core_spawnable = FRIENDLY_SPAWN -/mob/living/simple_animal/crab/Initialize() +/mob/living/simple_animal/crab/Initialize(mapload) . = ..() AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS) diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index e8c29e6d55..bce46fe10d 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -84,7 +84,7 @@ animal_species = /mob/living/simple_animal/pet/dog/corgi/exoticcorgi nofur = TRUE -/mob/living/simple_animal/pet/dog/Initialize() +/mob/living/simple_animal/pet/dog/Initialize(mapload) . = ..() var/dog_area = get_area(src) for(var/obj/structure/bed/dogbed/D in dog_area) @@ -92,11 +92,11 @@ D.update_owner(src) break -/mob/living/simple_animal/pet/dog/corgi/Initialize() +/mob/living/simple_animal/pet/dog/corgi/Initialize(mapload) . = ..() regenerate_icons() -/mob/living/simple_animal/pet/dog/corgi/exoticcorgi/Initialize() +/mob/living/simple_animal/pet/dog/corgi/exoticcorgi/Initialize(mapload) . = ..() var/newcolor = rgb(rand(0, 255), rand(0, 255), rand(0, 255)) add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY) @@ -398,7 +398,7 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list( var/memory_saved = FALSE var/saved_head //path -/mob/living/simple_animal/pet/dog/corgi/Ian/Initialize() +/mob/living/simple_animal/pet/dog/corgi/Ian/Initialize(mapload) . = ..() //parent call must happen first to ensure IAN //is not in nullspace when child puppies spawn diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index dfb00f2657..475886a2e1 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -79,7 +79,7 @@ "These rules are at admin discretion and will be heavily enforced.\n"+\ "If you do not have the regular drone laws, follow your laws to the best of your ability." -/mob/living/simple_animal/drone/Initialize() +/mob/living/simple_animal/drone/Initialize(mapload) . = ..() GLOB.drones_list += src access_card = new /obj/item/card/id(src) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm b/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm index df4d1e0673..10cb6bde83 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm @@ -17,7 +17,7 @@ var/seasonal_hats = TRUE //If TRUE, and there are no default hats, different holidays will grant different hats var/static/list/possible_seasonal_hats //This is built automatically in build_seasonal_hats() but can also be edited by admins! -/obj/item/drone_shell/Initialize() +/obj/item/drone_shell/Initialize(mapload) . = ..() var/area/A = get_area(src) if(A) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm index f3842b507a..4acbd41977 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm @@ -31,7 +31,7 @@ hacked = TRUE flavortext = null -/mob/living/simple_animal/drone/syndrone/Initialize() +/mob/living/simple_animal/drone/syndrone/Initialize(mapload) . = ..() var/datum/component/uplink/hidden_uplink = internal_storage.GetComponent(/datum/component/uplink) hidden_uplink.telecrystals = 10 @@ -45,7 +45,7 @@ default_hatmask = /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite default_storage = /obj/item/uplink/nuclear -/mob/living/simple_animal/drone/syndrone/badass/Initialize() +/mob/living/simple_animal/drone/syndrone/badass/Initialize(mapload) . = ..() var/datum/component/uplink/hidden_uplink = internal_storage.GetComponent(/datum/component/uplink) hidden_uplink.telecrystals = 30 @@ -55,7 +55,7 @@ /mob/living/simple_animal/drone/snowflake default_hatmask = /obj/item/clothing/head/chameleon/drone -/mob/living/simple_animal/drone/snowflake/Initialize() +/mob/living/simple_animal/drone/snowflake/Initialize(mapload) . = ..() desc += " This drone appears to have a complex holoprojector built on its 'head'." @@ -79,7 +79,7 @@ default_hatmask = null picked = TRUE -/mob/living/simple_animal/drone/polymorphed/Initialize() +/mob/living/simple_animal/drone/polymorphed/Initialize(mapload) . = ..() liberate() visualAppearence = pick(MAINTDRONE, REPAIRDRONE, SCOUTDRONE) @@ -136,7 +136,7 @@ /mob/living/simple_animal/drone/cogscarab/admin //an admin-only subtype of cogscarab with a no-cost fabricator and slab in its box default_storage = /obj/item/storage/toolbox/brass/prefilled/ratvar/admin -/mob/living/simple_animal/drone/cogscarab/Initialize() +/mob/living/simple_animal/drone/cogscarab/Initialize(mapload) . = ..() set_light(2, 0.5) qdel(access_card) //we don't have free access 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 81925d922f..c6dfc772c1 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -37,7 +37,7 @@ footstep_type = FOOTSTEP_MOB_SHOE -/mob/living/simple_animal/hostile/retaliate/goat/Initialize(/datum/reagent/milk_reagent) +/mob/living/simple_animal/hostile/retaliate/goat/Initialize(mapload, /datum/reagent/milk_reagent) udder = new (null, milk_reagent) . = ..() @@ -144,7 +144,7 @@ footstep_type = FOOTSTEP_MOB_SHOE -/mob/living/simple_animal/cow/Initialize() +/mob/living/simple_animal/cow/Initialize(mapload) udder = new(null, milk_reagent) . = ..() @@ -197,7 +197,7 @@ name = "strange cow" desc = "Something seems off about the milk this cow is producing." -/mob/living/simple_animal/cow/random/Initialize() +/mob/living/simple_animal/cow/random/Initialize(mapload) milk_reagent = get_random_reagent_id() //this has a blacklist so don't worry about romerol cows, etc ..() @@ -210,7 +210,7 @@ speak_chance = 10 //the cow is eager to share its wisdom! //but is wise enough to not lag the server too bad milk_reagent = /datum/reagent/medicine/liquid_wisdom -/mob/living/simple_animal/cow/wisdom/Initialize() +/mob/living/simple_animal/cow/wisdom/Initialize(mapload) . = ..() speak = GLOB.wisdoms //Done here so it's setup properly @@ -248,7 +248,7 @@ footstep_type = FOOTSTEP_MOB_CLAW -/mob/living/simple_animal/chick/Initialize() +/mob/living/simple_animal/chick/Initialize(mapload) . = ..() pixel_x = rand(-6, 6) pixel_y = rand(0, 10) @@ -310,7 +310,7 @@ footstep_type = FOOTSTEP_MOB_CLAW -/mob/living/simple_animal/chicken/Initialize() +/mob/living/simple_animal/chicken/Initialize(mapload) . = ..() if(!body_color) body_color = pick(validColors) @@ -408,7 +408,7 @@ --kiwi_count return ..() -/mob/living/simple_animal/kiwi/Initialize() +/mob/living/simple_animal/kiwi/Initialize(mapload) . = ..() ++kiwi_count @@ -482,7 +482,7 @@ footstep_type = FOOTSTEP_MOB_CLAW -/mob/living/simple_animal/babyKiwi/Initialize() +/mob/living/simple_animal/babyKiwi/Initialize(mapload) . = ..() pixel_x = rand(-6, 6) pixel_y = rand(0, 10) @@ -506,7 +506,7 @@ /obj/item/udder name = "udder" -/obj/item/udder/Initialize(loc, milk_reagent) +/obj/item/udder/Initialize(mapload, loc, milk_reagent) if(!milk_reagent) milk_reagent = /datum/reagent/consumable/milk create_reagents(50, NONE, NO_REAGENTS_VALUE) diff --git a/code/modules/mob/living/simple_animal/friendly/gondola.dm b/code/modules/mob/living/simple_animal/friendly/gondola.dm index e29cbb8062..8ba92fd967 100644 --- a/code/modules/mob/living/simple_animal/friendly/gondola.dm +++ b/code/modules/mob/living/simple_animal/friendly/gondola.dm @@ -31,7 +31,7 @@ //Gondolas don't make footstep sounds -/mob/living/simple_animal/pet/gondola/Initialize() +/mob/living/simple_animal/pet/gondola/Initialize(mapload) . = ..() if (!(istype(src, /mob/living/simple_animal/pet/gondola/gondolapod))) CreateGondola() diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 66b4bd5e73..d49eb1251d 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -30,7 +30,7 @@ var/chew_probability = 1 faction = list("rat") -/mob/living/simple_animal/mouse/Initialize() +/mob/living/simple_animal/mouse/Initialize(mapload) . = ..() AddComponent(/datum/component/squeak, list('sound/effects/mousesqueek.ogg'=1), 100) if(!body_color) @@ -174,7 +174,7 @@ GLOBAL_VAR(tom_existed) desc = "Jerry the cat is not amused." gold_core_spawnable = NO_SPAWN -/mob/living/simple_animal/mouse/brown/Tom/Initialize() +/mob/living/simple_animal/mouse/brown/Tom/Initialize(mapload) . = ..() GLOB.tom_existed = TRUE diff --git a/code/modules/mob/living/simple_animal/friendly/pet.dm b/code/modules/mob/living/simple_animal/friendly/pet.dm index dbdb5c646c..78193b481f 100644 --- a/code/modules/mob/living/simple_animal/friendly/pet.dm +++ b/code/modules/mob/living/simple_animal/friendly/pet.dm @@ -38,7 +38,7 @@ else ..() -/mob/living/simple_animal/pet/Initialize() +/mob/living/simple_animal/pet/Initialize(mapload) . = ..() if(pcollar) pcollar = new(src) diff --git a/code/modules/mob/living/simple_animal/friendly/possum.dm b/code/modules/mob/living/simple_animal/friendly/possum.dm index 5e7ed572e2..4f1e27d1db 100644 --- a/code/modules/mob/living/simple_animal/friendly/possum.dm +++ b/code/modules/mob/living/simple_animal/friendly/possum.dm @@ -27,7 +27,7 @@ mob_biotypes = MOB_ORGANIC|MOB_BEAST gold_core_spawnable = FRIENDLY_SPAWN -/mob/living/simple_animal/opossum/Initialize() +/mob/living/simple_animal/opossum/Initialize(mapload) . = ..() AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS) diff --git a/code/modules/mob/living/simple_animal/friendly/snake.dm b/code/modules/mob/living/simple_animal/friendly/snake.dm index 61c735c7c1..3e40ab53bc 100644 --- a/code/modules/mob/living/simple_animal/friendly/snake.dm +++ b/code/modules/mob/living/simple_animal/friendly/snake.dm @@ -38,7 +38,7 @@ obj_damage = 0 environment_smash = ENVIRONMENT_SMASH_NONE -/mob/living/simple_animal/hostile/retaliate/poison/snake/Initialize() +/mob/living/simple_animal/hostile/retaliate/poison/snake/Initialize(mapload) . = ..() AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS) diff --git a/code/modules/mob/living/simple_animal/gremlin/gremlin.dm b/code/modules/mob/living/simple_animal/gremlin/gremlin.dm index a6312b9ddf..da6fed4051 100644 --- a/code/modules/mob/living/simple_animal/gremlin/gremlin.dm +++ b/code/modules/mob/living/simple_animal/gremlin/gremlin.dm @@ -63,7 +63,7 @@ GLOBAL_LIST(bad_gremlin_items) var/list/hear_memory = list() var/const/max_hear_memory = 20 -/mob/living/simple_animal/hostile/gremlin/Initialize() +/mob/living/simple_animal/hostile/gremlin/Initialize(mapload) . = ..() AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS) ADD_TRAIT(src, TRAIT_SHOCKIMMUNE, INNATE_TRAIT) diff --git a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm index 7083f891b8..77d4fd1013 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm @@ -17,7 +17,7 @@ var/atom/movable/screen/alert/canstealthalert var/atom/movable/screen/alert/instealthalert -/mob/living/simple_animal/hostile/guardian/assassin/Initialize() +/mob/living/simple_animal/hostile/guardian/assassin/Initialize(mapload) . = ..() stealthcooldown = 0 diff --git a/code/modules/mob/living/simple_animal/guardian/types/support.dm b/code/modules/mob/living/simple_animal/guardian/types/support.dm index fc2912ec2f..78225a458c 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/support.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/support.dm @@ -15,7 +15,7 @@ var/beacon_cooldown = 0 var/toggle = FALSE -/mob/living/simple_animal/hostile/guardian/healer/Initialize() +/mob/living/simple_animal/hostile/guardian/healer/Initialize(mapload) . = ..() var/datum/atom_hud/medsensor = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] medsensor.add_hud_to(src) diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index 57ddbe6290..a620c9a58b 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -40,7 +40,7 @@ death_sound = 'sound/voice/hiss6.ogg' deathmessage = "lets out a waning guttural screech, green blood bubbling from its maw..." -/mob/living/simple_animal/hostile/alien/Initialize() +/mob/living/simple_animal/hostile/alien/Initialize(mapload) . = ..() AddComponent(/datum/component/footstep, FOOTSTEP_MOB_CLAW) @@ -86,7 +86,7 @@ melee_damage_upper = 20 del_on_death = TRUE loot = list(/obj/effect/mob_spawn/alien/corpse/humanoid/sentinel) - + /mob/living/simple_animal/hostile/alien/queen name = "alien queen" diff --git a/code/modules/mob/living/simple_animal/hostile/banana_spider.dm b/code/modules/mob/living/simple_animal/hostile/banana_spider.dm index 802f55a934..f8e8bf75d4 100644 --- a/code/modules/mob/living/simple_animal/hostile/banana_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/banana_spider.dm @@ -30,7 +30,7 @@ var/projectile_density = TRUE //griffons get shot del_on_death = TRUE -/mob/living/simple_animal/banana_spider/Initialize() +/mob/living/simple_animal/banana_spider/Initialize(mapload) . = ..() var/area/A = get_area(src) if(A) @@ -105,6 +105,6 @@ juice_results = list(/datum/reagent/consumable/banana = 0) -/obj/item/reagent_containers/food/snacks/deadbanana_spider/Initialize() +/obj/item/reagent_containers/food/snacks/deadbanana_spider/Initialize(mapload) . = ..() AddComponent(/datum/component/slippery, 20) diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index 399a403ce7..1f0efddd8d 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -60,7 +60,7 @@ var/static/hydroponicstypecache = typecacheof(/obj/machinery/hydroponics) var/held_icon = "" // bees are small and have no held icon (aka the coder doesn't know how to sprite it) -/mob/living/simple_animal/hostile/poison/bees/Initialize() +/mob/living/simple_animal/hostile/poison/bees/Initialize(mapload) . = ..() generate_bee_visuals() AddComponent(/datum/component/swarming) @@ -211,7 +211,7 @@ beehome = BB break // End loop after the first compatible find. -/mob/living/simple_animal/hostile/poison/bees/toxin/Initialize() +/mob/living/simple_animal/hostile/poison/bees/toxin/Initialize(mapload) . = ..() var/datum/reagent/R = pick(typesof(/datum/reagent/toxin)) assign_reagent(GLOB.chemical_reagents_list[R]) @@ -289,7 +289,7 @@ ..() -/obj/item/queen_bee/bought/Initialize() +/obj/item/queen_bee/bought/Initialize(mapload) . = ..() queen = new(src) @@ -310,6 +310,6 @@ /mob/living/simple_animal/hostile/poison/bees/short desc = "These bees seem unstable and won't survive for long." -/mob/living/simple_animal/hostile/poison/bees/short/Initialize() +/mob/living/simple_animal/hostile/poison/bees/short/Initialize(mapload) . = ..() addtimer(CALLBACK(src, .proc/death), 50 SECONDS) diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm b/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm index 1b0d210d9c..1dedf8cd29 100644 --- a/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm +++ b/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm @@ -13,7 +13,7 @@ var/point_regen_amount = 1 sentience_type = SENTIENCE_BOSS -/mob/living/simple_animal/hostile/boss/Initialize() +/mob/living/simple_animal/hostile/boss/Initialize(mapload) . = ..() atb = new() diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm index fe00af9384..6db5250469 100644 --- a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm +++ b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm @@ -182,7 +182,7 @@ duration = 18 randomdir = FALSE -/obj/effect/temp_visual/paperwiz_dying/Initialize() +/obj/effect/temp_visual/paperwiz_dying/Initialize(mapload) . = ..() visible_message("The wizard cries out in pain as a gate appears behind him, sucking him in!") playsound(get_turf(src),'sound/magic/mandswap.ogg', 50, 1, 1) diff --git a/code/modules/mob/living/simple_animal/hostile/bread.dm b/code/modules/mob/living/simple_animal/hostile/bread.dm index 1fe1a13e75..663b1fae72 100644 --- a/code/modules/mob/living/simple_animal/hostile/bread.dm +++ b/code/modules/mob/living/simple_animal/hostile/bread.dm @@ -32,7 +32,7 @@ verb_yell = "growls loudly" del_on_death = TRUE -/mob/living/simple_animal/bread/hostile/Initialize() +/mob/living/simple_animal/bread/hostile/Initialize(mapload) . = ..() var/area/A = get_area(src) if(A) diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index 747abb4b19..98dddab7bd 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -85,7 +85,7 @@ melee_damage_lower = 20 melee_damage_upper = 20 -/mob/living/simple_animal/hostile/carp/megacarp/Initialize() +/mob/living/simple_animal/hostile/carp/megacarp/Initialize(mapload) . = ..() name = "[pick(GLOB.megacarp_first_names)] [pick(GLOB.megacarp_last_names)]" melee_damage_lower += rand(4, 10) @@ -109,7 +109,7 @@ /// Colored disk mouth appearance for adding it as a mouth overlay var/mutable_appearance/colored_disk_mouth -/mob/living/simple_animal/hostile/carp/cayenne/Initialize() +/mob/living/simple_animal/hostile/carp/cayenne/Initialize(mapload) . = ..() // AddElement(/datum/element/pet_bonus, "bloops happily!") // colored_disk_mouth = mutable_appearance(SSgreyscale.GetColoredIconByType(/datum/greyscale_config/carp/disk_mouth, greyscale_colors), "disk_mouth") diff --git a/code/modules/mob/living/simple_animal/hostile/floor_cluwne.dm b/code/modules/mob/living/simple_animal/hostile/floor_cluwne.dm index b6d5db7d6d..d52da8f095 100644 --- a/code/modules/mob/living/simple_animal/hostile/floor_cluwne.dm +++ b/code/modules/mob/living/simple_animal/hostile/floor_cluwne.dm @@ -49,7 +49,7 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) hud_possible = list(ANTAG_HUD) -/mob/living/simple_animal/hostile/floor_cluwne/Initialize() +/mob/living/simple_animal/hostile/floor_cluwne/Initialize(mapload) . = ..() access_card = new /obj/item/card/id(src) var/datum/job/captain/C = new /datum/job/captain @@ -431,7 +431,7 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) duration = 600 randomdir = FALSE -/obj/effect/temp_visual/fcluwne_manifest/Initialize() +/obj/effect/temp_visual/fcluwne_manifest/Initialize(mapload) . = ..() playsound(src, 'sound/misc/floor_cluwne_emerge.ogg', 100, 1) flick("fcluwne_manifest",src) @@ -440,7 +440,7 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) name = "floor cluwne" desc = "If you have this, tell a coder or admin!" -/obj/effect/dummy/floorcluwne_orbit/Initialize() +/obj/effect/dummy/floorcluwne_orbit/Initialize(mapload) . = ..() GLOB.floor_cluwnes++ name += " ([GLOB.floor_cluwnes])" 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 2349685a4e..23a0d44d56 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -57,7 +57,7 @@ var/datum/action/innate/spider/lay_web/lay_web var/directive = "" //Message passed down to children, to relay the creator's orders -/mob/living/simple_animal/hostile/poison/giant_spider/Initialize() +/mob/living/simple_animal/hostile/poison/giant_spider/Initialize(mapload) . = ..() lay_web = new lay_web.Grant(src) @@ -122,7 +122,7 @@ var/datum/action/innate/spider/set_directive/set_directive var/static/list/consumed_mobs = list() //the tags of mobs that have been consumed by nurse spiders to lay eggs -/mob/living/simple_animal/hostile/poison/giant_spider/nurse/Initialize() +/mob/living/simple_animal/hostile/poison/giant_spider/nurse/Initialize(mapload) . = ..() wrap = new AddAbility(wrap) @@ -208,7 +208,7 @@ var/datum/action/innate/spider/comm/letmetalkpls gold_core_spawnable = NO_SPAWN -/mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife/Initialize() +/mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife/Initialize(mapload) . = ..() letmetalkpls = new letmetalkpls.Grant(src) @@ -396,7 +396,7 @@ action_icon_state = "wrap_0" action_background_icon_state = "bg_alien" -/obj/effect/proc_holder/wrap/Initialize() +/obj/effect/proc_holder/wrap/Initialize(mapload) . = ..() action = new(src) diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm index 5e34d17bb2..c23e438b31 100644 --- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm +++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm @@ -24,7 +24,7 @@ var/egg_lain = 0 gold_core_spawnable = NO_SPAWN //are you sure about this?? // CITADEL CHANGE, Yes. -/mob/living/simple_animal/hostile/headcrab/Initialize() +/mob/living/simple_animal/hostile/headcrab/Initialize(mapload) . = ..() AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS) diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index b627bf67c2..b02919446b 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -33,7 +33,7 @@ footstep_type = FOOTSTEP_MOB_CLAW -/mob/living/simple_animal/hostile/hivebot/Initialize() +/mob/living/simple_animal/hostile/hivebot/Initialize(mapload) . = ..() deathmessage = "[src] blows apart!" diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 029adbe92f..78635bab06 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -65,7 +65,7 @@ ///Declares a cooldown for potential charges right off the bat. COOLDOWN_DECLARE(charge_cooldown) -/mob/living/simple_animal/hostile/Initialize() +/mob/living/simple_animal/hostile/Initialize(mapload) . = ..() if(!targets_from) diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm index b98ee5adfb..a0528b4109 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm @@ -60,7 +60,7 @@ layer = ABOVE_ALL_MOB_LAYER duration = 3 -/obj/effect/temp_visual/leaper_projectile_impact/Initialize() +/obj/effect/temp_visual/leaper_projectile_impact/Initialize(mapload) . = ..() new /obj/effect/decal/cleanable/leaper_sludge(get_turf(src)) @@ -78,7 +78,7 @@ max_integrity = 10 density = FALSE -/obj/structure/leaper_bubble/Initialize() +/obj/structure/leaper_bubble/Initialize(mapload) . = ..() INVOKE_ASYNC(src, /atom/movable.proc/float, TRUE) QDEL_IN(src, 100) @@ -126,7 +126,7 @@ pixel_y = -32 duration = 30 -/mob/living/simple_animal/hostile/jungle/leaper/Initialize() +/mob/living/simple_animal/hostile/jungle/leaper/Initialize(mapload) . = ..() remove_verb(src, /mob/living/verb/pulled) diff --git a/code/modules/mob/living/simple_animal/hostile/killertomato.dm b/code/modules/mob/living/simple_animal/hostile/killertomato.dm index d3d3dadd1e..1d23e04b2d 100644 --- a/code/modules/mob/living/simple_animal/hostile/killertomato.dm +++ b/code/modules/mob/living/simple_animal/hostile/killertomato.dm @@ -29,6 +29,6 @@ maxbodytemp = 500 gold_core_spawnable = HOSTILE_SPAWN -/mob/living/simple_animal/hostile/killertomato/Initialize() +/mob/living/simple_animal/hostile/killertomato/Initialize(mapload) . = ..() AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS) diff --git a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm index f2dc6abe40..db5ea11f4d 100644 --- a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm +++ b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm @@ -40,7 +40,7 @@ spawn_mecha_type = null search_objects = 2 -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/no_mech/Initialize() +/mob/living/simple_animal/hostile/syndicate/mecha_pilot/no_mech/Initialize(mapload) . = ..() wanted_objects = typecacheof(/obj/mecha/combat, TRUE) @@ -60,7 +60,7 @@ faction = list("nanotrasen") -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/Initialize() +/mob/living/simple_animal/hostile/syndicate/mecha_pilot/Initialize(mapload) . = ..() if(spawn_mecha_type) var/obj/mecha/M = new spawn_mecha_type (get_turf(src)) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm index c28fa99054..3369588915 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm @@ -57,7 +57,7 @@ Difficulty: Medium /datum/action/innate/megafauna_attack/kinetic_accelerator, /datum/action/innate/megafauna_attack/transform_weapon) -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/Initialize() +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/Initialize(mapload) . = ..() internal = new/obj/item/gps/internal/miner(src) miner_saw = new(src) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index 9bcc21efa6..c3a8eec30f 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -120,7 +120,7 @@ Difficulty: Hard SetRecoveryTime(10) -/mob/living/simple_animal/hostile/megafauna/bubblegum/Initialize() +/mob/living/simple_animal/hostile/megafauna/bubblegum/Initialize(mapload) . = ..() if(istype(src, /mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination)) return @@ -454,7 +454,7 @@ Difficulty: Hard deathmessage = "Explodes into a pool of blood!" deathsound = 'sound/effects/splat.ogg' -/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/Initialize() +/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/Initialize(mapload) ..() toggle_ai(AI_OFF) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index 0135984be9..265785d9ce 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -94,7 +94,7 @@ Difficulty: Very Hard INVOKE_ASYNC(src, .proc/alternating_dir_shots) -/mob/living/simple_animal/hostile/megafauna/colossus/Initialize() +/mob/living/simple_animal/hostile/megafauna/colossus/Initialize(mapload) . = ..() internal = new/obj/item/gps/internal/colossus(src) @@ -262,7 +262,7 @@ Difficulty: Very Hard return FALSE return TRUE -/obj/machinery/smartfridge/black_box/Initialize() +/obj/machinery/smartfridge/black_box/Initialize(mapload) . = ..() var/static/obj/machinery/smartfridge/black_box/current if(current && current != src) @@ -426,7 +426,7 @@ Difficulty: Very Hard /obj/machinery/anomalous_crystal/honk //Strips and equips you as a clown. I apologize for nothing observer_desc = "This crystal strips and equips its targets as clowns." - possible_methods = list(ACTIVATE_TOUCH) //Because We love AOE transformations! + possible_methods = list(ACTIVATE_TOUCH) //Because We love AOE transformations! activation_sound = 'sound/items/bikehorn.ogg' /obj/machinery/anomalous_crystal/honk/ActivationReaction(mob/user) @@ -452,7 +452,7 @@ Difficulty: Very Hard var/list/NewFlora = list() var/florachance = 8 -/obj/machinery/anomalous_crystal/theme_warp/Initialize() +/obj/machinery/anomalous_crystal/theme_warp/Initialize(mapload) . = ..() terrain_theme = pick("lavaland","winter","jungle","ayy lmao") observer_desc = "This crystal changes the area around it to match the theme of \"[terrain_theme]\"." @@ -518,7 +518,7 @@ Difficulty: Very Hard cooldown_add = 50 var/obj/item/projectile/generated_projectile = /obj/item/projectile/beam/emitter -/obj/machinery/anomalous_crystal/emitter/Initialize() +/obj/machinery/anomalous_crystal/emitter/Initialize(mapload) . = ..() generated_projectile = pick(/obj/item/projectile/colossus) @@ -629,7 +629,7 @@ Difficulty: Very Hard stop_automated_movement = 1 var/heal_power = 5 -/mob/living/simple_animal/hostile/lightgeist/Initialize() +/mob/living/simple_animal/hostile/lightgeist/Initialize(mapload) . = ..() remove_verb(src, /mob/living/verb/pulled) remove_verb(src, /mob/verb/me_verb) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm index a5fc918181..609d4dcefa 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm @@ -48,7 +48,7 @@ Difficulty: Extremely Hard /// If the demonic frost miner is currently transforming to its enraged state var/enraging = FALSE -/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/Initialize() +/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/Initialize(mapload) . = ..() AddComponent(/datum/component/knockback, 7, FALSE, TRUE) AddComponent(/datum/component/lifesteal, 50) @@ -309,7 +309,7 @@ Difficulty: Extremely Hard desc = "A pair of winter boots contractually made by a devil, they cannot be taken off once put on." slowdown = SHOES_SPEED_SLIGHT -/obj/item/clothing/shoes/winterboots/ice_boots/speedy/Initialize() +/obj/item/clothing/shoes/winterboots/ice_boots/speedy/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CURSED_ITEM_TRAIT) @@ -318,7 +318,7 @@ Difficulty: Extremely Hard desc = "Cracks rocks at an inhuman speed, as well as being enhanced for combat purposes." toolspeed = 0 -/obj/item/pickaxe/drill/jackhammer/demonic/Initialize() +/obj/item/pickaxe/drill/jackhammer/demonic/Initialize(mapload) . = ..() AddComponent(/datum/component/knockback, 4, FALSE, TRUE) AddComponent(/datum/component/lifesteal, 5) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm index a2d18c508e..7a946e662b 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm @@ -2,7 +2,7 @@ vore_active = TRUE isPredator = TRUE -/mob/living/simple_animal/hostile/megafauna/dragon/Initialize() +/mob/living/simple_animal/hostile/megafauna/dragon/Initialize(mapload) // Create and register 'stomachs' var/obj/belly/megafauna/dragon/maw/maw = new(src) var/obj/belly/megafauna/dragon/gullet/gullet = new(src) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index dc13d870c5..a544650e9a 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -74,7 +74,7 @@ Difficulty: Medium footstep_type = FOOTSTEP_MOB_HEAVY -/mob/living/simple_animal/hostile/megafauna/dragon/Initialize() +/mob/living/simple_animal/hostile/megafauna/dragon/Initialize(mapload) smallsprite.Grant(src) . = ..() internal = new/obj/item/gps/internal/dragon(src) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index c1aea8db9d..19b6abf4c2 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -81,7 +81,7 @@ Difficulty: Normal var/list/kill_phrases = list("Wsyvgi sj irivkc xettih. Vitemvmrk...", "Irivkc wsyvgi jsyrh. Vitemvmrk...", "Jyip jsyrh. Egxmzexmrk vitemv gcgpiw...", "Kix fiex. Liepmrk...") var/list/target_phrases = list("Xevkix psgexih.", "Iriqc jsyrh.", "Eguymvih xevkix.") -/mob/living/simple_animal/hostile/megafauna/hierophant/Initialize() +/mob/living/simple_animal/hostile/megafauna/hierophant/Initialize(mapload) . = ..() internal = new/obj/item/gps/internal/hierophant(src) spawned_beacon = new(loc) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm index 15bfe2b7f7..1b17b408b1 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm @@ -59,7 +59,7 @@ SHITCODE AHEAD. BE ADVISED. Also comment extravaganza var/size = 3 var/charging = FALSE -/mob/living/simple_animal/hostile/megafauna/legion/Initialize() +/mob/living/simple_animal/hostile/megafauna/legion/Initialize(mapload) . = ..() internal = new/obj/item/gps/internal/legion(src) @@ -345,7 +345,7 @@ SHITCODE AHEAD. BE ADVISED. Also comment extravaganza ///Compared with the targeted mobs. If they have the faction, turret won't shoot. var/faction = list("mining") -/obj/structure/legionturret/Initialize() +/obj/structure/legionturret/Initialize(mapload) . = ..() addtimer(CALLBACK(src, .proc/set_up_shot), initial_firing_time) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm index 923a626b28..6ce43ed409 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm @@ -64,7 +64,7 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa var/static/list/swarmer_caps -/mob/living/simple_animal/hostile/megafauna/swarmer_swarm_beacon/Initialize() +/mob/living/simple_animal/hostile/megafauna/swarmer_swarm_beacon/Initialize(mapload) . = ..() swarmer_caps = GLOB.AISwarmerCapsByType //for admin-edits internal = new/obj/item/gps/internal/swarmer_beacon(src) @@ -104,7 +104,7 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa weather_immunities = list("ash") //wouldn't be fun otherwise AIStatus = AI_ON -/mob/living/simple_animal/hostile/swarmer/ai/Initialize() +/mob/living/simple_animal/hostile/swarmer/ai/Initialize(mapload) . = ..() ToggleLight() //so you can see them eating you out of house and home/shooting you/stunlocking you for eternity LAZYINITLIST(GLOB.AISwarmersByType[type]) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm index 938483be84..0d6287e50c 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm @@ -70,7 +70,7 @@ Difficulty: Hard chosen_message = "You are now screeching, disorienting targets around you." chosen_attack_num = 3 -/mob/living/simple_animal/hostile/megafauna/wendigo/Initialize() +/mob/living/simple_animal/hostile/megafauna/wendigo/Initialize(mapload) . = ..() starting = get_turf(src) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm index c5be239b3b..ffe24c9dd9 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm @@ -110,7 +110,7 @@ qdel(O) src.visible_message("[src] examines [O] closer, and telekinetically shatters the pen.") -/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/random/Initialize() +/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/random/Initialize(mapload) . = ..() if(prob(1)) if(prob(75)) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm index 4425bce532..7b21ce6a62 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm @@ -203,7 +203,7 @@ is_mirror = TRUE var/mob/living/simple_animal/hostile/asteroid/elite/herald/my_master = null -/mob/living/simple_animal/hostile/asteroid/elite/herald/mirror/Initialize() +/mob/living/simple_animal/hostile/asteroid/elite/herald/mirror/Initialize(mapload) ..() toggle_ai(AI_OFF) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm index dca508cfeb..c744d4ed58 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm @@ -275,7 +275,7 @@ duration = 10 color = rgb(0,0,0) -/obj/effect/temp_visual/dragon_swoop/legionnaire/Initialize() +/obj/effect/temp_visual/dragon_swoop/legionnaire/Initialize(mapload) . = ..() transform *= 0.33 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm index 3845c6f406..2017d75c36 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm @@ -35,7 +35,7 @@ var/chase_time = 100 var/will_burrow = TRUE -/mob/living/simple_animal/hostile/asteroid/goldgrub/Initialize() +/mob/living/simple_animal/hostile/asteroid/goldgrub/Initialize(mapload) . = ..() var/i = rand(1,3) while(i) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm index 6bd55d06ae..dbd271c30c 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm @@ -101,7 +101,7 @@ stat_attack = UNCONSCIOUS robust_searching = 1 -/mob/living/simple_animal/hostile/asteroid/goliath/beast/random/Initialize() +/mob/living/simple_animal/hostile/asteroid/goliath/beast/random/Initialize(mapload) . = ..() if(prob(1)) new /mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient(loc) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm index e35220a920..d0aa25aabc 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm @@ -46,7 +46,7 @@ /obj/item/organ/lungs, /obj/item/organ/stomach, /obj/item/organ/tongue) // So we dont eat implants or brains. Still can eat robotic stuff thats subtyped of base line but thats a issue for another day. var/obj/item/udder/gutlunch/udder = null -/mob/living/simple_animal/hostile/asteroid/gutlunch/Initialize() +/mob/living/simple_animal/hostile/asteroid/gutlunch/Initialize(mapload) udder = new() . = ..() AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS) @@ -103,7 +103,7 @@ name = "gubbuck" gender = MALE -/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck/Initialize() +/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck/Initialize(mapload) . = ..() add_atom_colour(pick("#E39FBB", "#D97D64", "#CF8C4A"), FIXED_COLOUR_PRIORITY) resize = 0.85 @@ -130,7 +130,7 @@ /obj/item/udder/gutlunch name = "nutrient sac" -/obj/item/udder/gutlunch/Initialize() +/obj/item/udder/gutlunch/Initialize(mapload) . = ..() reagents = new(50) reagents.my_atom = src diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm index 7db91b50ad..757272ca98 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm @@ -92,7 +92,7 @@ var/swarming = FALSE var/my_creator = null -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/Initialize() +/mob/living/simple_animal/hostile/asteroid/hivelordbrood/Initialize(mapload) . = ..() if(swarming) AddComponent(/datum/component/swarming) //oh god not the bees @@ -126,7 +126,7 @@ var/dwarf_mob = FALSE var/mob/living/carbon/human/stored_mob -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/random/Initialize() +/mob/living/simple_animal/hostile/asteroid/hivelord/legion/random/Initialize(mapload) . = ..() if(prob(5)) new /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf(loc) @@ -278,7 +278,7 @@ see_in_dark = 8 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE -/mob/living/simple_animal/hostile/big_legion/Initialize() +/mob/living/simple_animal/hostile/big_legion/Initialize(mapload) .=..() AddComponent(/datum/component/spawner, list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion), 200, faction, "peels itself off from", 3) @@ -298,7 +298,7 @@ . = ..() H.dna.add_mutation(DWARFISM) -/obj/effect/mob_spawn/human/corpse/damaged/legioninfested/Initialize() +/obj/effect/mob_spawn/human/corpse/damaged/legioninfested/Initialize(mapload) var/type = pickweight(list("Miner" = 45, "Ashwalker" = 10, "Golem" = 10,"Clown" = 10, pick(list("Shadow", "YeOlde","Operative", "Cultist", "Lavaknight")) = 4, "Assistant" = 20, "Beelegion" = 1)) switch(type) if("Miner") diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm index f41746ea69..527fd51260 100644 --- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm +++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm @@ -40,7 +40,7 @@ var/static/mutable_appearance/cap_living //Where we store our cap icons so we dont generate them constantly to update our icon var/static/mutable_appearance/cap_dead -/mob/living/simple_animal/hostile/mushroom/Initialize() +/mob/living/simple_animal/hostile/mushroom/Initialize(mapload) . = ..() AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS) @@ -57,7 +57,7 @@ if(!stat)//Mushrooms slowly regenerate if conscious, for people who want to save them from being eaten adjustBruteLoss(-2) -/mob/living/simple_animal/hostile/mushroom/Initialize()//Makes every shroom a little unique +/mob/living/simple_animal/hostile/mushroom/Initialize(mapload)//Makes every shroom a little unique melee_damage_lower += rand(3, 5) melee_damage_upper += rand(10,20) maxHealth += rand(40,60) diff --git a/code/modules/mob/living/simple_animal/hostile/netherworld.dm b/code/modules/mob/living/simple_animal/hostile/netherworld.dm index 92f331071a..c3a272fee0 100644 --- a/code/modules/mob/living/simple_animal/hostile/netherworld.dm +++ b/code/modules/mob/living/simple_animal/hostile/netherworld.dm @@ -34,7 +34,7 @@ deathmessage = "wails as its form turns into a pulpy mush." death_sound = 'sound/voice/hiss6.ogg' -/mob/living/simple_animal/hostile/netherworld/migo/Initialize() +/mob/living/simple_animal/hostile/netherworld/migo/Initialize(mapload) . = ..() migo_sounds = list('sound/items/bubblewrap.ogg', 'sound/items/change_jaws.ogg', 'sound/items/crowbar.ogg', 'sound/items/drink.ogg', 'sound/items/deconstruct.ogg', 'sound/items/carhorn.ogg', 'sound/items/change_drill.ogg', 'sound/items/dodgeball.ogg', 'sound/items/eatfood.ogg', 'sound/items/megaphone.ogg', 'sound/items/screwdriver.ogg', 'sound/items/weeoo1.ogg', 'sound/items/wirecutter.ogg', 'sound/items/welder.ogg', 'sound/items/zip.ogg', 'sound/items/rped.ogg', 'sound/items/ratchet.ogg', 'sound/items/polaroid1.ogg', 'sound/items/pshoom.ogg', 'sound/items/airhorn.ogg', 'sound/items/geiger/high1.ogg', 'sound/items/geiger/high2.ogg', 'sound/voice/beepsky/creep.ogg', 'sound/voice/beepsky/iamthelaw.ogg', 'sound/voice/ed209_20sec.ogg', 'sound/voice/hiss3.ogg', 'sound/voice/hiss6.ogg', 'sound/voice/medbot/patchedup.ogg', 'sound/voice/medbot/feelbetter.ogg', 'sound/voice/human/manlaugh1.ogg', 'sound/voice/human/womanlaugh.ogg', 'sound/weapons/sear.ogg', 'sound/ambience/antag/clockcultalr.ogg', 'sound/ambience/antag/ling_aler.ogg', 'sound/ambience/antag/tatoralert.ogg', 'sound/ambience/antag/monkey.ogg', 'sound/mecha/nominal.ogg', 'sound/mecha/weapdestr.ogg', 'sound/mecha/critdestr.ogg', 'sound/mecha/imag_enh.ogg', 'sound/effects/adminhelp.ogg', 'sound/effects/alert.ogg', 'sound/effects/attackblob.ogg', 'sound/effects/bamf.ogg', 'sound/effects/blobattack.ogg', 'sound/effects/break_stone.ogg', 'sound/effects/bubbles.ogg', 'sound/effects/bubbles2.ogg', 'sound/effects/clang.ogg', 'sound/effects/clockcult_gateway_disrupted.ogg', 'sound/effects/clownstep2.ogg', 'sound/effects/curse1.ogg', 'sound/effects/dimensional_rend.ogg', 'sound/effects/doorcreaky.ogg', 'sound/effects/empulse.ogg', 'sound/effects/explosion_distant.ogg', 'sound/effects/explosionfar.ogg', 'sound/effects/explosion1.ogg', 'sound/effects/grillehit.ogg', 'sound/effects/genetics.ogg', 'sound/effects/heart_beat.ogg', 'sound/effects/hyperspace_begin.ogg', 'sound/effects/hyperspace_end.ogg', 'sound/effects/his_grace_awaken.ogg', 'sound/effects/pai_boot.ogg', 'sound/effects/phasein.ogg', 'sound/effects/picaxe1.ogg', 'sound/effects/ratvar_reveal.ogg', 'sound/effects/sparks1.ogg', 'sound/effects/smoke.ogg', 'sound/effects/splat.ogg', 'sound/effects/snap.ogg', 'sound/effects/tendril_destroyed.ogg', 'sound/effects/supermatter.ogg', 'sound/misc/desceration-01.ogg', 'sound/misc/desceration-02.ogg', 'sound/misc/desceration-03.ogg', 'sound/misc/bloblarm.ogg', 'sound/misc/airraid.ogg', 'sound/misc/bang.ogg','sound/misc/highlander.ogg', 'sound/misc/interference.ogg', 'sound/misc/notice1.ogg', 'sound/misc/notice2.ogg', 'sound/misc/sadtrombone.ogg', 'sound/misc/slip.ogg', 'sound/misc/splort.ogg', 'sound/weapons/armbomb.ogg', 'sound/weapons/beam_sniper.ogg', 'sound/weapons/chainsawhit.ogg', 'sound/weapons/emitter.ogg', 'sound/weapons/emitter2.ogg', 'sound/weapons/blade1.ogg', 'sound/weapons/bladeslice.ogg', 'sound/weapons/blastcannon.ogg', 'sound/weapons/blaster.ogg', 'sound/weapons/bulletflyby3.ogg', 'sound/weapons/circsawhit.ogg', 'sound/weapons/cqchit2.ogg', 'sound/weapons/drill.ogg', 'sound/weapons/genhit1.ogg', 'sound/weapons/gunshot_silenced.ogg', 'sound/weapons/gunshot2.ogg', 'sound/weapons/handcuffs.ogg', 'sound/weapons/homerun.ogg', 'sound/weapons/kenetic_accel.ogg', 'sound/machines/clockcult/steam_whoosh.ogg', 'sound/machines/fryer/deep_fryer_emerge.ogg', 'sound/machines/airlock.ogg', 'sound/machines/airlock_alien_prying.ogg', 'sound/machines/airlockclose.ogg', 'sound/machines/airlockforced.ogg', 'sound/machines/airlockopen.ogg', 'sound/machines/alarm.ogg', 'sound/machines/blender.ogg', 'sound/machines/boltsdown.ogg', 'sound/machines/boltsup.ogg', 'sound/machines/buzz-sigh.ogg', 'sound/machines/buzz-two.ogg', 'sound/machines/chime.ogg', 'sound/machines/cryo_warning.ogg', 'sound/machines/defib_charge.ogg', 'sound/machines/defib_failed.ogg', 'sound/machines/defib_ready.ogg', 'sound/machines/defib_zap.ogg', 'sound/machines/deniedbeep.ogg', 'sound/machines/ding.ogg', 'sound/machines/disposalflush.ogg', 'sound/machines/door_close.ogg', 'sound/machines/door_open.ogg', 'sound/machines/engine_alert1.ogg', 'sound/machines/engine_alert2.ogg', 'sound/machines/hiss.ogg', 'sound/machines/honkbot_evil_laugh.ogg', 'sound/machines/juicer.ogg', 'sound/machines/ping.ogg', 'sound/machines/signal.ogg', 'sound/machines/synth_no.ogg', 'sound/machines/synth_yes.ogg', 'sound/machines/terminal_alert.ogg', 'sound/machines/triple_beep.ogg', 'sound/machines/twobeep.ogg', 'sound/machines/ventcrawl.ogg', 'sound/machines/warning-buzzer.ogg', get_announcer_sound("outbreak5"), get_announcer_sound("outbreak7"), get_announcer_sound("poweroff"), get_announcer_sound("radiation"), get_announcer_sound("shuttlerecalled"), get_announcer_sound("shuttledock"), get_announcer_sound("shuttlecalled"), get_announcer_sound("aimalf")) //hahahaha fuck you code divers @@ -81,7 +81,7 @@ mob_types = list(/mob/living/simple_animal/hostile/netherworld/migo, /mob/living/simple_animal/hostile/netherworld, /mob/living/simple_animal/hostile/netherworld/blankbody) faction = list("nether") -/obj/structure/spawner/nether/Initialize() +/obj/structure/spawner/nether/Initialize(mapload) .=..() START_PROCESSING(SSprocessing, src) diff --git a/code/modules/mob/living/simple_animal/hostile/pirate.dm b/code/modules/mob/living/simple_animal/hostile/pirate.dm index 74e37bea21..01015c43ab 100644 --- a/code/modules/mob/living/simple_animal/hostile/pirate.dm +++ b/code/modules/mob/living/simple_animal/hostile/pirate.dm @@ -55,7 +55,7 @@ speed = 1 spacewalk = TRUE -/mob/living/simple_animal/hostile/pirate/melee/Initialize() +/mob/living/simple_animal/hostile/pirate/melee/Initialize(mapload) . = ..() sord = new(src) @@ -63,7 +63,7 @@ QDEL_NULL(sord) return ..() -/mob/living/simple_animal/hostile/pirate/melee/Initialize() +/mob/living/simple_animal/hostile/pirate/melee/Initialize(mapload) . = ..() set_light(2) diff --git a/code/modules/mob/living/simple_animal/hostile/plaguerat.dm b/code/modules/mob/living/simple_animal/hostile/plaguerat.dm index 497359829e..7112740b39 100644 --- a/code/modules/mob/living/simple_animal/hostile/plaguerat.dm +++ b/code/modules/mob/living/simple_animal/hostile/plaguerat.dm @@ -42,7 +42,7 @@ GLOBAL_LIST_EMPTY(plague_rats) var/obj/machinery/atmospherics/components/unary/entry_vent var/obj/machinery/atmospherics/components/unary/exit_vent -/mob/living/simple_animal/hostile/plaguerat/Initialize() +/mob/living/simple_animal/hostile/plaguerat/Initialize(mapload) . = ..() GLOB.plague_rats += src AddComponent(/datum/component/swarming) diff --git a/code/modules/mob/living/simple_animal/hostile/regalrat.dm b/code/modules/mob/living/simple_animal/hostile/regalrat.dm index 6995202e9c..f90fb55424 100644 --- a/code/modules/mob/living/simple_animal/hostile/regalrat.dm +++ b/code/modules/mob/living/simple_animal/hostile/regalrat.dm @@ -29,7 +29,7 @@ var/datum/action/cooldown/riot ///Number assigned to rats and mice, checked when determining infighting. -/mob/living/simple_animal/hostile/regalrat/Initialize() +/mob/living/simple_animal/hostile/regalrat/Initialize(mapload) . = ..() coffer = new /datum/action/cooldown/coffer coffer.Grant(src) @@ -183,7 +183,7 @@ mob_biotypes = MOB_ORGANIC|MOB_BEAST faction = list("rat") -/mob/living/simple_animal/hostile/rat/Initialize() +/mob/living/simple_animal/hostile/rat/Initialize(mapload) . = ..() SSmobs.cheeserats += src AddComponent(/datum/component/swarming) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm index cb1ee6c6f6..c45587e2aa 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm @@ -41,7 +41,7 @@ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 -/mob/living/simple_animal/hostile/retaliate/bat/Initialize() +/mob/living/simple_animal/hostile/retaliate/bat/Initialize(mapload) . = ..() AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS) 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 e2f83677d8..0233cb9c5d 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm @@ -85,7 +85,7 @@ emote_see = list("bubbles", "oozes") loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/particle_effect/foam) -/mob/living/simple_animal/hostile/retaliate/clown/lube/Initialize() +/mob/living/simple_animal/hostile/retaliate/clown/lube/Initialize(mapload) . = ..() AddElement(/datum/element/snailcrawl) @@ -147,7 +147,7 @@ obj_damage = 5 loot = list(/obj/item/clothing/suit/hooded/bloated_human, /obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/item/soap) -/mob/living/simple_animal/hostile/retaliate/clown/fleshclown/Initialize() +/mob/living/simple_animal/hostile/retaliate/clown/fleshclown/Initialize(mapload) . = ..() AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm index 2433b45cc0..ea250d60ba 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm @@ -30,7 +30,7 @@ gold_core_spawnable = HOSTILE_SPAWN var/stepped_sound = 'sound/effects/huuu.ogg' -/mob/living/simple_animal/hostile/retaliate/frog/Initialize() +/mob/living/simple_animal/hostile/retaliate/frog/Initialize(mapload) . = ..() if(prob(1)) name = "rare frog" diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm index f6ab2a1a9e..a0a2b897e4 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm @@ -45,7 +45,7 @@ var/mutable_appearance/ghost_facial_hair var/random = TRUE //if you want random names for ghosts or not -/mob/living/simple_animal/hostile/retaliate/ghost/Initialize() +/mob/living/simple_animal/hostile/retaliate/ghost/Initialize(mapload) . = ..() give_hair() set_light(1, 2) // same glowing as visible player ghosts diff --git a/code/modules/mob/living/simple_animal/hostile/skeleton.dm b/code/modules/mob/living/simple_animal/hostile/skeleton.dm index ebacf1edef..a812e9d3c4 100644 --- a/code/modules/mob/living/simple_animal/hostile/skeleton.dm +++ b/code/modules/mob/living/simple_animal/hostile/skeleton.dm @@ -123,6 +123,6 @@ attack_sound = 'sound/weapons/sonic_jackhammer.ogg' loot = list(/obj/effect/decal/remains/plasma, /obj/item/pickaxe/drill/jackhammer) -/mob/living/simple_animal/hostile/skeleton/plasmaminer/Initialize() +/mob/living/simple_animal/hostile/skeleton/plasmaminer/Initialize(mapload) . = ..() set_light(2) diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index df73516337..01f6b72128 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -62,7 +62,7 @@ speed = 1 spacewalk = TRUE -/mob/living/simple_animal/hostile/syndicate/space/Initialize() +/mob/living/simple_animal/hostile/syndicate/space/Initialize(mapload) . = ..() set_light(4) @@ -98,7 +98,7 @@ speed = 1 spacewalk = TRUE -/mob/living/simple_animal/hostile/syndicate/melee/space/Initialize() +/mob/living/simple_animal/hostile/syndicate/melee/space/Initialize(mapload) . = ..() set_light(4) @@ -122,7 +122,7 @@ status_flags = 0 var/obj/effect/light_emitter/red_energy_sword/sord -/mob/living/simple_animal/hostile/syndicate/melee/sword/Initialize() +/mob/living/simple_animal/hostile/syndicate/melee/sword/Initialize(mapload) . = ..() set_light(2) @@ -147,7 +147,7 @@ speed = 1 spacewalk = TRUE -/mob/living/simple_animal/hostile/syndicate/melee/sword/space/Initialize() +/mob/living/simple_animal/hostile/syndicate/melee/sword/space/Initialize(mapload) . = ..() sord = new(src) set_light(4) @@ -192,7 +192,7 @@ speed = 1 spacewalk = TRUE -/mob/living/simple_animal/hostile/syndicate/ranged/space/Initialize() +/mob/living/simple_animal/hostile/syndicate/ranged/space/Initialize(mapload) . = ..() set_light(4) @@ -225,7 +225,7 @@ speed = 1 spacewalk = TRUE -/mob/living/simple_animal/hostile/syndicate/ranged/smg/space/Initialize() +/mob/living/simple_animal/hostile/syndicate/ranged/smg/space/Initialize(mapload) . = ..() set_light(4) @@ -255,7 +255,7 @@ speed = 1 spacewalk = TRUE -/mob/living/simple_animal/hostile/syndicate/ranged/shotgun/space/Initialize() +/mob/living/simple_animal/hostile/syndicate/ranged/shotgun/space/Initialize(mapload) . = ..() set_light(4) @@ -309,6 +309,6 @@ del_on_death = 1 deathmessage = "is smashed into pieces!" -/mob/living/simple_animal/hostile/viscerator/Initialize() +/mob/living/simple_animal/hostile/viscerator/Initialize(mapload) . = ..() AddComponent(/datum/component/swarming) diff --git a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm index cc5b0b8a75..452138fa80 100644 --- a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm +++ b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm @@ -20,7 +20,7 @@ /// The amount of time it takes to create a venus human trap, in deciseconds var/growth_time = 1200 -/obj/structure/alien/resin/flower_bud_enemy/Initialize() +/obj/structure/alien/resin/flower_bud_enemy/Initialize(mapload) . = ..() var/list/anchors = list() anchors += locate(x-2,y+2,z) diff --git a/code/modules/mob/living/simple_animal/hostile/wizard.dm b/code/modules/mob/living/simple_animal/hostile/wizard.dm index 59bd67e42a..97f4a0a5fc 100644 --- a/code/modules/mob/living/simple_animal/hostile/wizard.dm +++ b/code/modules/mob/living/simple_animal/hostile/wizard.dm @@ -37,7 +37,7 @@ footstep_type = FOOTSTEP_MOB_SHOE -/mob/living/simple_animal/hostile/wizard/Initialize() +/mob/living/simple_animal/hostile/wizard/Initialize(mapload) . = ..() fireball = new /obj/effect/proc_holder/spell/aimed/fireball fireball.clothes_req = NONE diff --git a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm index f10b184a45..eb35606e0d 100644 --- a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm +++ b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm @@ -38,7 +38,7 @@ var/datum/action/innate/fugu/expand/E loot = list(/obj/item/fugu_gland{layer = ABOVE_MOB_LAYER}) -/mob/living/simple_animal/hostile/asteroid/fugu/Initialize() +/mob/living/simple_animal/hostile/asteroid/fugu/Initialize(mapload) . = ..() E = new E.Grant(src) diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 4cc66bc4bd..fe479bb943 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -104,7 +104,7 @@ var/obj/item/held_item = null -/mob/living/simple_animal/parrot/Initialize() +/mob/living/simple_animal/parrot/Initialize(mapload) . = ..() if(spawns_with_headset) if(!ears) @@ -902,7 +902,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( var/longest_survival = 0 var/longest_deathstreak = 0 -/mob/living/simple_animal/parrot/Poly/Initialize() +/mob/living/simple_animal/parrot/Poly/Initialize(mapload) ears = new /obj/item/radio/headset/headset_eng(src) available_channels = list(":e") Read_Memory() @@ -1004,7 +1004,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( incorporeal_move = INCORPOREAL_MOVE_BASIC butcher_results = list(/obj/item/ectoplasm = 1) -/mob/living/simple_animal/parrot/Poly/ghost/Initialize() +/mob/living/simple_animal/parrot/Poly/ghost/Initialize(mapload) memory_saved = TRUE //At this point nothing is saved . = ..() diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 2a978bedb4..13209dee0f 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -151,7 +151,7 @@ //Generic flags var/simple_mob_flags = NONE -/mob/living/simple_animal/Initialize() +/mob/living/simple_animal/Initialize(mapload) . = ..() GLOB.simple_animals[AIStatus] += src if(gender == PLURAL) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 4b8fa75aee..c2b531770d 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1,4 +1,4 @@ -/mob/Initialize() +/mob/Initialize(mapload) add_to_mob_list() if(stat == DEAD) add_to_dead_mob_list() diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index 1d90c3a651..c98d0eb850 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -54,7 +54,7 @@ var/comp_light_color //The color of that light -/obj/item/modular_computer/Initialize() +/obj/item/modular_computer/Initialize(mapload) . = ..() START_PROCESSING(SSobj, src) if(!physical) diff --git a/code/modules/modular_computers/computers/item/laptop.dm b/code/modules/modular_computers/computers/item/laptop.dm index b4669c72f8..bb39381e6d 100644 --- a/code/modules/modular_computers/computers/item/laptop.dm +++ b/code/modules/modular_computers/computers/item/laptop.dm @@ -35,7 +35,7 @@ if(card_slot2.stored_card) . += "\The [src] has \a [card_slot2] with an id inside, Alt-click to remove the id." -/obj/item/modular_computer/laptop/Initialize() +/obj/item/modular_computer/laptop/Initialize(mapload) . = ..() if(start_open && !screen_on) diff --git a/code/modules/modular_computers/computers/item/laptop_presets.dm b/code/modules/modular_computers/computers/item/laptop_presets.dm index 6bc2919bea..2ed2ec78a5 100644 --- a/code/modules/modular_computers/computers/item/laptop_presets.dm +++ b/code/modules/modular_computers/computers/item/laptop_presets.dm @@ -1,4 +1,4 @@ -/obj/item/modular_computer/laptop/preset/Initialize() +/obj/item/modular_computer/laptop/preset/Initialize(mapload) . = ..() install_component(new /obj/item/computer_hardware/processor_unit/small) install_component(new /obj/item/computer_hardware/battery(src, /obj/item/stock_parts/cell/computer)) diff --git a/code/modules/modular_computers/computers/item/tablet.dm b/code/modules/modular_computers/computers/item/tablet.dm index 8741c468d2..2c6bef81c2 100644 --- a/code/modules/modular_computers/computers/item/tablet.dm +++ b/code/modules/modular_computers/computers/item/tablet.dm @@ -29,7 +29,7 @@ if(inserted_item && (!isturf(loc))) . += "Ctrl-click to remove [inserted_item]." -/obj/item/modular_computer/tablet/Initialize() +/obj/item/modular_computer/tablet/Initialize(mapload) . = ..() if(can_have_pen) if(inserted_item) @@ -214,6 +214,6 @@ device_theme = "syndicate" -/obj/item/modular_computer/tablet/integrated/syndicate/Initialize() +/obj/item/modular_computer/tablet/integrated/syndicate/Initialize(mapload) . = ..() borgo.lamp_color = COLOR_RED //Syndicate likes it red diff --git a/code/modules/modular_computers/computers/item/tablet_presets.dm b/code/modules/modular_computers/computers/item/tablet_presets.dm index 2c760a4b6c..44a96aa2e7 100644 --- a/code/modules/modular_computers/computers/item/tablet_presets.dm +++ b/code/modules/modular_computers/computers/item/tablet_presets.dm @@ -3,7 +3,7 @@ /obj/item/modular_computer/tablet/preset/cheap desc = "A low-end tablet often seen among low ranked station personnel." -/obj/item/modular_computer/tablet/preset/cheap/Initialize() +/obj/item/modular_computer/tablet/preset/cheap/Initialize(mapload) . = ..() install_component(new /obj/item/computer_hardware/processor_unit/small) install_component(new /obj/item/computer_hardware/battery(src, /obj/item/stock_parts/cell/computer/micro)) @@ -11,7 +11,7 @@ install_component(new /obj/item/computer_hardware/network_card) // Alternative version, an average one, for higher ranked positions mostly -/obj/item/modular_computer/tablet/preset/advanced/Initialize() +/obj/item/modular_computer/tablet/preset/advanced/Initialize(mapload) . = ..() install_component(new /obj/item/computer_hardware/processor_unit/small) install_component(new /obj/item/computer_hardware/battery(src, /obj/item/stock_parts/cell/computer)) @@ -20,7 +20,7 @@ install_component(new /obj/item/computer_hardware/card_slot) install_component(new /obj/item/computer_hardware/printer/mini) -/obj/item/modular_computer/tablet/preset/science/Initialize() +/obj/item/modular_computer/tablet/preset/science/Initialize(mapload) . = ..() var/obj/item/computer_hardware/hard_drive/small/hard_drive = new install_component(new /obj/item/computer_hardware/processor_unit/small) @@ -31,7 +31,7 @@ install_component(new /obj/item/computer_hardware/radio_card) hard_drive.store_file(new /datum/computer_file/program/signaler) -/obj/item/modular_computer/tablet/preset/cargo/Initialize() +/obj/item/modular_computer/tablet/preset/cargo/Initialize(mapload) . = ..() var/obj/item/computer_hardware/hard_drive/small/hard_drive = new install_component(new /obj/item/computer_hardware/processor_unit/small) @@ -52,16 +52,16 @@ /obj/item/modular_computer/tablet/preset/cargo/quartermaster/get_cargochat_username() return "quartermaster" -/obj/item/modular_computer/tablet/preset/advanced/atmos/Initialize() //This will be defunct and will be replaced when NtOS PDAs are done +/obj/item/modular_computer/tablet/preset/advanced/atmos/Initialize(mapload) //This will be defunct and will be replaced when NtOS PDAs are done . = ..() install_component(new /obj/item/computer_hardware/sensorpackage) -/obj/item/modular_computer/tablet/preset/advanced/engineering/Initialize() +/obj/item/modular_computer/tablet/preset/advanced/engineering/Initialize(mapload) . = ..() var/obj/item/computer_hardware/hard_drive/small/hard_drive = find_hardware_by_name("solid state drive") hard_drive.store_file(new /datum/computer_file/program/supermatter_monitor) -/obj/item/modular_computer/tablet/preset/advanced/command/Initialize() +/obj/item/modular_computer/tablet/preset/advanced/command/Initialize(mapload) . = ..() var/obj/item/computer_hardware/hard_drive/small/hard_drive = find_hardware_by_name("solid state drive") install_component(new /obj/item/computer_hardware/sensorpackage) @@ -69,13 +69,13 @@ hard_drive.store_file(new /datum/computer_file/program/budgetorders) // hard_drive.store_file(new /datum/computer_file/program/science) -/obj/item/modular_computer/tablet/preset/advanced/command/engineering/Initialize() +/obj/item/modular_computer/tablet/preset/advanced/command/engineering/Initialize(mapload) . = ..() var/obj/item/computer_hardware/hard_drive/small/hard_drive = find_hardware_by_name("solid state drive") hard_drive.store_file(new /datum/computer_file/program/supermatter_monitor) /// Given by the syndicate as part of the contract uplink bundle - loads in the Contractor Uplink. -/obj/item/modular_computer/tablet/syndicate_contract_uplink/preset/uplink/Initialize() +/obj/item/modular_computer/tablet/syndicate_contract_uplink/preset/uplink/Initialize(mapload) . = ..() var/obj/item/computer_hardware/hard_drive/small/syndicate/hard_drive = new var/datum/computer_file/program/contract_uplink/uplink = new @@ -94,7 +94,7 @@ install_component(new /obj/item/computer_hardware/printer/mini) /// Given to Nuke Ops members. -/obj/item/modular_computer/tablet/nukeops/Initialize() +/obj/item/modular_computer/tablet/nukeops/Initialize(mapload) . = ..() install_component(new /obj/item/computer_hardware/processor_unit/small) install_component(new /obj/item/computer_hardware/battery(src, /obj/item/stock_parts/cell/computer)) @@ -102,7 +102,7 @@ install_component(new /obj/item/computer_hardware/network_card) //Borg Built-in tablet -/obj/item/modular_computer/tablet/integrated/Initialize() +/obj/item/modular_computer/tablet/integrated/Initialize(mapload) . = ..() install_component(new /obj/item/computer_hardware/processor_unit/small) install_component(new /obj/item/computer_hardware/hard_drive/small/integrated) diff --git a/code/modules/modular_computers/computers/machinery/console_presets.dm b/code/modules/modular_computers/computers/machinery/console_presets.dm index 9da6b35ff9..0cb2a65375 100644 --- a/code/modules/modular_computers/computers/machinery/console_presets.dm +++ b/code/modules/modular_computers/computers/machinery/console_presets.dm @@ -5,7 +5,7 @@ var/_has_battery = FALSE var/_has_ai = FALSE -/obj/machinery/modular_computer/console/preset/Initialize() +/obj/machinery/modular_computer/console/preset/Initialize(mapload) . = ..() if(!cpu) return diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm index dd78a985e1..5fb771cb85 100644 --- a/code/modules/modular_computers/computers/machinery/modular_computer.dm +++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm @@ -40,7 +40,7 @@ ///CPU that handles most logic while this type only handles power and other specific things. var/obj/item/modular_computer/processor/cpu = null -/obj/machinery/modular_computer/Initialize() +/obj/machinery/modular_computer/Initialize(mapload) . = ..() cpu = new(src) cpu.physical = src diff --git a/code/modules/modular_computers/computers/machinery/modular_console.dm b/code/modules/modular_computers/computers/machinery/modular_console.dm index aa6108fcbd..3cbdc4a923 100644 --- a/code/modules/modular_computers/computers/machinery/modular_console.dm +++ b/code/modules/modular_computers/computers/machinery/modular_console.dm @@ -19,7 +19,7 @@ ///Used in New() to set network tag according to our area. var/console_department = "" -/obj/machinery/modular_computer/console/buildable/Initialize() +/obj/machinery/modular_computer/console/buildable/Initialize(mapload) . = ..() // User-built consoles start as empty frames. var/obj/item/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD] @@ -29,7 +29,7 @@ qdel(network_card) qdel(hard_drive) -/obj/machinery/modular_computer/console/Initialize() +/obj/machinery/modular_computer/console/Initialize(mapload) . = ..() var/obj/item/computer_hardware/battery/battery_module = cpu.all_components[MC_CELL] if(battery_module) diff --git a/code/modules/modular_computers/hardware/hard_drive.dm b/code/modules/modular_computers/hardware/hard_drive.dm index 29614cc7b0..b0bf605f9a 100644 --- a/code/modules/modular_computers/hardware/hard_drive.dm +++ b/code/modules/modular_computers/hardware/hard_drive.dm @@ -120,7 +120,7 @@ QDEL_LIST(stored_files) return ..() -/obj/item/computer_hardware/hard_drive/Initialize() +/obj/item/computer_hardware/hard_drive/Initialize(mapload) . = ..() install_default_programs() diff --git a/code/modules/ninja/energy_katana.dm b/code/modules/ninja/energy_katana.dm index f59a06dc69..716c4a0dad 100644 --- a/code/modules/ninja/energy_katana.dm +++ b/code/modules/ninja/energy_katana.dm @@ -32,7 +32,7 @@ var/datum/action/innate/dash/ninja/jaunt var/dash_toggled = TRUE -/obj/item/energy_katana/Initialize() +/obj/item/energy_katana/Initialize(mapload) . = ..() jaunt = new(src) spark_system = new /datum/effect_system/spark_spread() diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm index d9d362c43c..6c9a0b08ab 100644 --- a/code/modules/ninja/suit/suit.dm +++ b/code/modules/ninja/suit/suit.dm @@ -66,7 +66,7 @@ "The CLOAK-tech device is [stealth?"active":"inactive"].\n"+\ "[a_boost?"An adrenaline boost is available to use.":"There is no adrenaline boost available. Try refilling the suit with 20 units of radium."]" -/obj/item/clothing/suit/space/space_ninja/Initialize() +/obj/item/clothing/suit/space/space_ninja/Initialize(mapload) . = ..() //Spark Init diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index c957a927ec..ed83a0f67b 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -29,7 +29,7 @@ user.visible_message(span_suicide("[user] begins putting [user.p_their()] head into the clip of \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")) return BRUTELOSS //The clipboard's clip is very strong. Industrial duty. Can kill a man easily. -/obj/item/clipboard/Initialize() +/obj/item/clipboard/Initialize(mapload) update_appearance() . = ..() diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index 59bbf47128..f6725eeb1d 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -192,7 +192,7 @@ GLOBAL_LIST_EMPTY(employmentCabinets) ///This var is so that its filled on crew interaction to be as accurate (including latejoins) as possible, true until first interact var/virgin = TRUE -/obj/structure/filingcabinet/employment/Initialize() +/obj/structure/filingcabinet/employment/Initialize(mapload) . = ..() GLOB.employmentCabinets += src diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index 2c534d0178..d69da4d797 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -100,7 +100,7 @@ name = "folder- 'TOP SECRET'" desc = "A folder stamped \"Top Secret - Property of Nanotrasen Corporation. Unauthorized distribution is punishable by death.\"" -/obj/item/folder/documents/Initialize() +/obj/item/folder/documents/Initialize(mapload) . = ..() new /obj/item/documents/nanotrasen(src) update_icon() @@ -113,7 +113,7 @@ /obj/item/folder/syndicate/red icon_state = "folder_sred" -/obj/item/folder/syndicate/red/Initialize() +/obj/item/folder/syndicate/red/Initialize(mapload) . = ..() new /obj/item/documents/syndicate/red(src) update_icon() @@ -121,12 +121,12 @@ /obj/item/folder/syndicate/blue icon_state = "folder_sblue" -/obj/item/folder/syndicate/blue/Initialize() +/obj/item/folder/syndicate/blue/Initialize(mapload) . = ..() new /obj/item/documents/syndicate/blue(src) update_icon() -/obj/item/folder/syndicate/mining/Initialize() +/obj/item/folder/syndicate/mining/Initialize(mapload) . = ..() new /obj/item/documents/syndicate/mining(src) update_icon() diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 366d1a3f68..9b10ea230d 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -101,7 +101,7 @@ contact_poison = null . = ..() -/obj/item/paper/Initialize() +/obj/item/paper/Initialize(mapload) . = ..() pixel_x = initial(pixel_x) + rand(-9, 9) pixel_y = initial(pixel_y) + rand(-8, 8) @@ -371,14 +371,14 @@ */ /obj/item/paper/construction -/obj/item/paper/construction/Initialize() +/obj/item/paper/construction/Initialize(mapload) . = ..() color = pick("FF0000", "#33cc33", "#ffb366", "#551A8B", "#ff80d5", "#4d94ff") /** * Natural paper */ -/obj/item/paper/natural/Initialize() +/obj/item/paper/natural/Initialize(mapload) . = ..() color = "#FFF5ED" diff --git a/code/modules/paperwork/paper_cutter.dm b/code/modules/paperwork/paper_cutter.dm index 0dbc80521b..bd59ed7a10 100644 --- a/code/modules/paperwork/paper_cutter.dm +++ b/code/modules/paperwork/paper_cutter.dm @@ -12,7 +12,7 @@ pass_flags = PASSTABLE -/obj/item/papercutter/Initialize() +/obj/item/papercutter/Initialize(mapload) . = ..() storedcutter = new /obj/item/hatchet/cutterblade(src) update_icon() @@ -120,7 +120,7 @@ return ..() -/obj/item/paperslip/Initialize() +/obj/item/paperslip/Initialize(mapload) . = ..() pixel_x = initial(pixel_x) + rand(-5, 5) pixel_y = initial(pixel_y) + rand(-5, 5) diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 20c9c6211a..0ad49e192d 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -113,7 +113,7 @@ ) embedding = list("embed_chance" = 75) -/obj/item/pen/fountain/captain/Initialize() +/obj/item/pen/fountain/captain/Initialize(mapload) . = ..() AddComponent(/datum/component/butchering, 200, 115) //the pen is mightier than the sword @@ -212,7 +212,7 @@ reagents.trans_to(M, reagents.total_volume, log = "sleepypen inject") -/obj/item/pen/sleepy/Initialize() +/obj/item/pen/sleepy/Initialize(mapload) . = ..() create_reagents(45, OPENCONTAINER) reagents.add_reagent(/datum/reagent/toxin/chloralhydrate, 20) diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 06adda95dd..8079950aff 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -44,7 +44,7 @@ /// Indicates whether the printer is currently busy copying or not. var/busy = FALSE -/obj/machinery/photocopier/Initialize() +/obj/machinery/photocopier/Initialize(mapload) . = ..() // AddComponent(/datum/component/payment, 5, SSeconomy.get_dep_account(ACCOUNT_CIV), PAYMENT_CLINICAL) toner_cartridge = new(src) diff --git a/code/modules/paperwork/ticketmachine.dm b/code/modules/paperwork/ticketmachine.dm index e874f2836d..ff1a1fd563 100644 --- a/code/modules/paperwork/ticketmachine.dm +++ b/code/modules/paperwork/ticketmachine.dm @@ -44,7 +44,7 @@ tickets.Cut() update_icon() -/obj/machinery/ticket_machine/Initialize() +/obj/machinery/ticket_machine/Initialize(mapload) . = ..() update_icon() @@ -69,7 +69,7 @@ req_access = list() id = "ticket_machine_default" -/obj/machinery/button/ticket_machine/Initialize() +/obj/machinery/button/ticket_machine/Initialize(mapload) . = ..() if(device) var/obj/item/assembly/control/ticket_machine/ours = device @@ -92,7 +92,7 @@ desc = "A remote controller for the HoP's ticket machine." var/obj/machinery/ticket_machine/linked //To whom are we linked? -/obj/item/assembly/control/ticket_machine/Initialize() +/obj/item/assembly/control/ticket_machine/Initialize(mapload) ..() return INITIALIZE_HINT_LATELOAD diff --git a/code/modules/photography/photos/album.dm b/code/modules/photography/photos/album.dm index 8361accba2..6f35e7a99d 100644 --- a/code/modules/photography/photos/album.dm +++ b/code/modules/photography/photos/album.dm @@ -11,7 +11,7 @@ resistance_flags = FLAMMABLE var/persistence_id -/obj/item/storage/photo_album/Initialize() +/obj/item/storage/photo_album/Initialize(mapload) . = ..() var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.can_hold = typecacheof(list(/obj/item/photo)) diff --git a/code/modules/plumbing/plumbers/medipenrefill.dm b/code/modules/plumbing/plumbers/medipenrefill.dm index fb7553a4d5..140114673a 100644 --- a/code/modules/plumbing/plumbers/medipenrefill.dm +++ b/code/modules/plumbing/plumbers/medipenrefill.dm @@ -15,7 +15,7 @@ /// var to prevent glitches in the animation var/busy = FALSE -/obj/machinery/medipen_refiller/Initialize() +/obj/machinery/medipen_refiller/Initialize(mapload) . = ..() create_reagents(100, TRANSPARENT) for(var/obj/item/stock_parts/matter_bin/B in component_parts) diff --git a/code/modules/pool/pool_controller.dm b/code/modules/pool/pool_controller.dm index ff52fb9fef..f2a3b23e57 100644 --- a/code/modules/pool/pool_controller.dm +++ b/code/modules/pool/pool_controller.dm @@ -64,7 +64,7 @@ . = ..() . += "Alt click to drain reagents." -/obj/machinery/pool/controller/Initialize() +/obj/machinery/pool/controller/Initialize(mapload) . = ..() START_PROCESSING(SSfastprocess, src) create_reagents(1000) diff --git a/code/modules/pool/pool_drain.dm b/code/modules/pool/pool_drain.dm index 527c25b9f0..09afe09cd1 100644 --- a/code/modules/pool/pool_drain.dm +++ b/code/modules/pool/pool_drain.dm @@ -24,7 +24,7 @@ var/cooldown -/obj/machinery/pool/drain/Initialize() +/obj/machinery/pool/drain/Initialize(mapload) START_PROCESSING(SSfastprocess, src) whirling_mobs = list() return ..() diff --git a/code/modules/power/antimatter/control.dm b/code/modules/power/antimatter/control.dm index f8f31f6990..f514cd3135 100644 --- a/code/modules/power/antimatter/control.dm +++ b/code/modules/power/antimatter/control.dm @@ -30,7 +30,7 @@ var/stored_power = 0//Power to deploy per tick -/obj/machinery/power/am_control_unit/Initialize() +/obj/machinery/power/am_control_unit/Initialize(mapload) . = ..() linked_shielding = list() linked_cores = list() diff --git a/code/modules/power/antimatter/shielding.dm b/code/modules/power/antimatter/shielding.dm index 52478e532e..1faa2eb801 100644 --- a/code/modules/power/antimatter/shielding.dm +++ b/code/modules/power/antimatter/shielding.dm @@ -28,7 +28,7 @@ var/dirs = 0 -/obj/machinery/am_shielding/Initialize() +/obj/machinery/am_shielding/Initialize(mapload) . = ..() addtimer(CALLBACK(src, .proc/controllerscan), 10) diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 10a4f5844a..6d1da2bc20 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -370,7 +370,7 @@ custom_materials = list(/datum/material/glass = 20) w_class = WEIGHT_CLASS_TINY -/obj/item/stock_parts/cell/emergency_light/Initialize() +/obj/item/stock_parts/cell/emergency_light/Initialize(mapload) . = ..() var/area/A = get_area(src) if(!A.lightswitch || !A.light_power) diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 3d07b60c41..08a804550e 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -98,7 +98,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne // Generator which spawns with the station. // -/obj/machinery/gravity_generator/main/station/Initialize() +/obj/machinery/gravity_generator/main/station/Initialize(mapload) . = ..() setup_parts() middle.add_overlay("activated") diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 00487ee607..a473b7f62f 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -250,7 +250,7 @@ icon_state = "tube-empty" start_with_cell = FALSE -/obj/machinery/light/built/Initialize() +/obj/machinery/light/built/Initialize(mapload) . = ..() status = LIGHT_EMPTY update(0) @@ -259,7 +259,7 @@ icon_state = "bulb-empty" start_with_cell = FALSE -/obj/machinery/light/small/built/Initialize() +/obj/machinery/light/small/built/Initialize(mapload) . = ..() status = LIGHT_EMPTY update(0) @@ -267,7 +267,7 @@ // create a new lighting fixture -/obj/machinery/light/Initialize() +/obj/machinery/light/Initialize(mapload) . = ..() if(start_with_cell && !no_emergency) cell = new/obj/item/stock_parts/cell/emergency_light(src) @@ -797,7 +797,7 @@ desc = "A broken [name]." -/obj/item/light/Initialize() +/obj/item/light/Initialize(mapload) . = ..() update() diff --git a/code/modules/power/monitor.dm b/code/modules/power/monitor.dm index 393d403c4d..e5099dd009 100644 --- a/code/modules/power/monitor.dm +++ b/code/modules/power/monitor.dm @@ -31,7 +31,7 @@ . = ..() . += "It's operating system seems quite outdated... It doesn't seem like it'd be compatible with the latest remote NTOS monitoring systems." -/obj/machinery/computer/monitor/Initialize() +/obj/machinery/computer/monitor/Initialize(mapload) . = ..() search() history["supply"] = list() diff --git a/code/modules/power/multiz.dm b/code/modules/power/multiz.dm index d5f2846293..9a012991f7 100644 --- a/code/modules/power/multiz.dm +++ b/code/modules/power/multiz.dm @@ -41,7 +41,7 @@ addtimer(CALLBACK(src, .proc/refresh), 20) //Wait a bit so we can find the one below, then get powering return TRUE -/obj/machinery/power/deck_relay/Initialize() +/obj/machinery/power/deck_relay/Initialize(mapload) . = ..() addtimer(CALLBACK(src, .proc/find_relays), 30) addtimer(CALLBACK(src, .proc/refresh), 50) //Wait a bit so we can find the one below, then get powering diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index a57711a539..48c67f164e 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -17,7 +17,7 @@ interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND | INTERACT_ATOM_UI_INTERACT | INTERACT_ATOM_REQUIRES_ANCHORED -/obj/machinery/power/port_gen/Initialize() +/obj/machinery/power/port_gen/Initialize(mapload) . = ..() soundloop = new(src, active) @@ -85,12 +85,12 @@ var/time_per_sheet = 260 var/current_heat = 0 -/obj/machinery/power/port_gen/pacman/Initialize() +/obj/machinery/power/port_gen/pacman/Initialize(mapload) . = ..() if(anchored) connect_to_network() -/obj/machinery/power/port_gen/pacman/Initialize() +/obj/machinery/power/port_gen/pacman/Initialize(mapload) . = ..() var/obj/S = sheet_path diff --git a/code/modules/power/rtg.dm b/code/modules/power/rtg.dm index 10219c29c1..618dbb2120 100644 --- a/code/modules/power/rtg.dm +++ b/code/modules/power/rtg.dm @@ -19,7 +19,7 @@ var/irradiate = TRUE // RTGs irradiate surroundings, but only when panel is open. -/obj/machinery/power/rtg/Initialize() +/obj/machinery/power/rtg/Initialize(mapload) . = ..() connect_to_network() @@ -56,7 +56,7 @@ /obj/machinery/power/rtg/advanced/fullupgrade //fully ugpraded stock parts desc = "An advanced RTG capable of moderating isotope decay, increasing power output but reducing lifetime. It uses plasma-fueled radiation collectors to increase output even further. This model is fully upgraded with the latest tech available in this quadrant." -/obj/machinery/power/rtg/advanced/fullupgrade/Initialize() +/obj/machinery/power/rtg/advanced/fullupgrade/Initialize(mapload) . = ..() //This looks terrifying. And apparently instancing vars and modifying the amount variable causes runtime errors. Guess we're sticking to copy pasta, thanks, byond. component_parts = list() diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index a6b144ebe6..16e49cd451 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -33,7 +33,7 @@ /obj/machinery/power/rad_collector/anchored anchored = TRUE -/obj/machinery/power/rad_collector/Initialize() +/obj/machinery/power/rad_collector/Initialize(mapload) . = ..() Radio = new /obj/item/radio(src) Radio.listening = 0 diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 6961ec54bb..8f9a7805c6 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -57,7 +57,7 @@ state = EMITTER_WELDED use_power = FALSE -/obj/machinery/power/emitter/Initialize() +/obj/machinery/power/emitter/Initialize(mapload) . = ..() RefreshParts() wires = new /datum/wires/emitter(src) @@ -454,7 +454,7 @@ resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF var/delay = 0 -/obj/item/turret_control/Initialize() +/obj/item/turret_control/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index af2237a426..161b43b3af 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -54,7 +54,7 @@ field_generator power level display . += "+p[power_level]" -/obj/machinery/field/generator/Initialize() +/obj/machinery/field/generator/Initialize(mapload) . = ..() fields = list() connected_gens = list() diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index 5f6e110a9c..0f58805976 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -27,7 +27,7 @@ grav_pull = 10 consume_range = 12 //How many tiles out do we eat -/obj/singularity/narsie/large/Initialize() +/obj/singularity/narsie/large/Initialize(mapload) . = ..() send_to_playing_players("NAR'SIE HAS RISEN") sound_to_playing_players('sound/creatures/narsie_rises.ogg') @@ -44,7 +44,7 @@ var/souls = 0 var/resolved = FALSE -/obj/singularity/narsie/large/cult/Initialize() +/obj/singularity/narsie/large/cult/Initialize(mapload) . = ..() GLOB.cult_narsie = src var/list/all_cults = list() diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index 96c8d9a263..3a592a4f98 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -19,7 +19,7 @@ var/strength = 0 var/powered = FALSE -/obj/machinery/particle_accelerator/control_box/Initialize() +/obj/machinery/particle_accelerator/control_box/Initialize(mapload) . = ..() wires = new /datum/wires/particle_accelerator/control_box(src) connected_parts = list() diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 32e6186133..fff91df1b9 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -44,7 +44,7 @@ if(!terminal) . += "This SMES has no power terminal!" -/obj/machinery/power/smes/Initialize() +/obj/machinery/power/smes/Initialize(mapload) . = ..() dir_loop: for(var/d in GLOB.cardinals) diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 907c4e7d65..fad48b4854 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -297,7 +297,7 @@ var/obj/machinery/power/tracker/connected_tracker = null var/list/connected_panels = list() -/obj/machinery/power/solar_control/Initialize() +/obj/machinery/power/solar_control/Initialize(mapload) . = ..() azimuth_rate = SSsun.base_rotation RegisterSignal(SSsun, COMSIG_SUN_MOVED, .proc/timed_track) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 22ce4e7ce5..f75b5551ad 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -192,7 +192,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) ///Disables the sm's proccessing totally. var/processes = TRUE -/obj/machinery/power/supermatter_crystal/Initialize() +/obj/machinery/power/supermatter_crystal/Initialize(mapload) . = ..() uid = gl_uid++ SSair.atmos_air_machinery += src diff --git a/code/modules/power/terminal.dm b/code/modules/power/terminal.dm index 3fa815bf99..fc6ff29856 100644 --- a/code/modules/power/terminal.dm +++ b/code/modules/power/terminal.dm @@ -12,7 +12,7 @@ var/obj/machinery/power/master = null -/obj/machinery/power/terminal/Initialize() +/obj/machinery/power/terminal/Initialize(mapload) . = ..() var/turf/T = get_turf(src) if(level == 1) diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm index 13f2aab811..c32bbc0c86 100644 --- a/code/modules/power/tesla/coil.dm +++ b/code/modules/power/tesla/coil.dm @@ -23,7 +23,7 @@ /obj/machinery/power/tesla_coil/power circuit = /obj/item/circuitboard/machine/tesla_coil/power -/obj/machinery/power/tesla_coil/Initialize() +/obj/machinery/power/tesla_coil/Initialize(mapload) . = ..() wires = new /datum/wires/tesla_coil(src) linked_techweb = SSresearch.science_tech @@ -162,7 +162,7 @@ buckle_lying = FALSE buckle_requires_restraints = TRUE -/obj/machinery/power/grounding_rod/Initialize() +/obj/machinery/power/grounding_rod/Initialize(mapload) GLOB.grounding_rods |= src return ..() diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index dda7f27eee..c01e3f3dcc 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -70,7 +70,7 @@ // the inlet stage of the gas turbine electricity generator -/obj/machinery/power/compressor/Initialize() +/obj/machinery/power/compressor/Initialize(mapload) . = ..() // The inlet of the compressor is the direction it faces gas_contained = new @@ -162,7 +162,7 @@ #define TURBGENQ 100000 #define TURBGENG 0.5 -/obj/machinery/power/turbine/Initialize() +/obj/machinery/power/turbine/Initialize(mapload) . = ..() // The outlet is pointed at the direction of the turbine component outturf = get_step(src, dir) @@ -288,7 +288,7 @@ var/obj/machinery/power/compressor/compressor var/id = 0 -/obj/machinery/computer/turbine_computer/Initialize() +/obj/machinery/computer/turbine_computer/Initialize(mapload) . = ..() return INITIALIZE_HINT_LATELOAD diff --git a/code/modules/projectiles/ammunition/_ammunition.dm b/code/modules/projectiles/ammunition/_ammunition.dm index 6a73d9a366..4794aa6c10 100644 --- a/code/modules/projectiles/ammunition/_ammunition.dm +++ b/code/modules/projectiles/ammunition/_ammunition.dm @@ -26,7 +26,7 @@ name = "spent bullet casing" BB = null -/obj/item/ammo_casing/Initialize() +/obj/item/ammo_casing/Initialize(mapload) . = ..() if(projectile_type) BB = new projectile_type(src) diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm index 04e8e62029..441d112e32 100644 --- a/code/modules/projectiles/ammunition/ballistic/shotgun.dm +++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm @@ -124,7 +124,7 @@ projectile_type = /obj/item/projectile/bullet/dart var/reagent_amount = 30 -/obj/item/ammo_casing/shotgun/dart/Initialize() +/obj/item/ammo_casing/shotgun/dart/Initialize(mapload) . = ..() create_reagents(reagent_amount, OPENCONTAINER) @@ -137,7 +137,7 @@ icon_state = "cnrshell" reagent_amount = 10 -/obj/item/ammo_casing/shotgun/dart/noreact/Initialize() +/obj/item/ammo_casing/shotgun/dart/noreact/Initialize(mapload) . = ..() reagents.reagents_holder_flags |= NO_REACT @@ -146,7 +146,7 @@ projectile_type = /obj/item/projectile/bullet/dart/piercing reagent_amount = 50 -/obj/item/ammo_casing/shotgun/dart/bioterror/Initialize() +/obj/item/ammo_casing/shotgun/dart/bioterror/Initialize(mapload) . = ..() reagents.add_reagent(/datum/reagent/toxin/amanitin, 12) //for a nasty surprise after you get shot and somehow escape and don't think to quickly purge, and even shock those who are loaded up on purging agents reagents.add_reagent(/datum/reagent/toxin/chloralhydrate, 6) diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm index 9ea030da99..e44fcb38c8 100644 --- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm +++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm @@ -23,7 +23,7 @@ var/list/bullet_cost var/list/base_cost// override this one as well if you override bullet_cost -/obj/item/ammo_box/Initialize() +/obj/item/ammo_box/Initialize(mapload) . = ..() if (!bullet_cost) for (var/material in custom_materials) diff --git a/code/modules/projectiles/boxes_magazines/external/rechargable.dm b/code/modules/projectiles/boxes_magazines/external/rechargable.dm index 76d8f217ab..45b7efca92 100644 --- a/code/modules/projectiles/boxes_magazines/external/rechargable.dm +++ b/code/modules/projectiles/boxes_magazines/external/rechargable.dm @@ -67,7 +67,7 @@ var/e_cost = 100 projectile_type = /obj/item/projectile/beam -/obj/item/ammo_casing/mws_batt/Initialize() +/obj/item/ammo_casing/mws_batt/Initialize(mapload) . = ..() pixel_x = rand(-10, 10) pixel_y = rand(-10, 10) diff --git a/code/modules/projectiles/boxes_magazines/internal/revolver.dm b/code/modules/projectiles/boxes_magazines/internal/revolver.dm index a9cad1adc8..3e91b2670e 100644 --- a/code/modules/projectiles/boxes_magazines/internal/revolver.dm +++ b/code/modules/projectiles/boxes_magazines/internal/revolver.dm @@ -17,6 +17,6 @@ max_ammo = 6 multiload = 0 -/obj/item/ammo_box/magazine/internal/rus357/Initialize() +/obj/item/ammo_box/magazine/internal/rus357/Initialize(mapload) stored_ammo += new ammo_type(src) . = ..() diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index a1c7c312ab..3210ad2d15 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -94,7 +94,7 @@ var/automatic = 0 //can gun use it, 0 is no, anything above 0 is the delay between clicks in ds -/obj/item/gun/Initialize() +/obj/item/gun/Initialize(mapload) . = ..() if(no_pin_required) pin = null diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 1416dfa812..836ed3b804 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -10,7 +10,7 @@ var/magazine_wording = "magazine" var/sawn_item_state = "gun" -/obj/item/gun/ballistic/Initialize() +/obj/item/gun/ballistic/Initialize(mapload) . = ..() if(!spawnwithmagazine) update_icon() diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index 9388ca214a..aa3ac20cb8 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -110,7 +110,7 @@ /obj/item/gun/ballistic/automatic/c20r/unrestricted pin = /obj/item/firing_pin -/obj/item/gun/ballistic/automatic/c20r/Initialize() +/obj/item/gun/ballistic/automatic/c20r/Initialize(mapload) . = ..() update_icon() @@ -172,7 +172,7 @@ burst_shot_delay = 2 pin = /obj/item/firing_pin/implant/pindicate -/obj/item/gun/ballistic/automatic/m90/Initialize() +/obj/item/gun/ballistic/automatic/m90/Initialize(mapload) . = ..() underbarrel = new /obj/item/gun/ballistic/revolver/grenadelauncher(src) update_icon() @@ -180,7 +180,7 @@ /obj/item/gun/ballistic/automatic/m90/unrestricted pin = /obj/item/firing_pin -/obj/item/gun/ballistic/automatic/m90/unrestricted/Initialize() +/obj/item/gun/ballistic/automatic/m90/unrestricted/Initialize(mapload) . = ..() underbarrel = new /obj/item/gun/ballistic/revolver/grenadelauncher/unrestricted(src) update_icon() @@ -274,7 +274,7 @@ /obj/item/gun/ballistic/automatic/shotgun/bulldog/unrestricted pin = /obj/item/firing_pin -/obj/item/gun/ballistic/automatic/shotgun/bulldog/Initialize() +/obj/item/gun/ballistic/automatic/shotgun/bulldog/Initialize(mapload) . = ..() update_icon() diff --git a/code/modules/projectiles/guns/ballistic/magweapon.dm b/code/modules/projectiles/guns/ballistic/magweapon.dm index c01a2fb74a..f3a11eb179 100644 --- a/code/modules/projectiles/guns/ballistic/magweapon.dm +++ b/code/modules/projectiles/guns/ballistic/magweapon.dm @@ -21,7 +21,7 @@ var/obj/item/stock_parts/cell/cell var/cell_type = /obj/item/stock_parts/cell/magnetic -/obj/item/gun/ballistic/automatic/magrifle/Initialize() +/obj/item/gun/ballistic/automatic/magrifle/Initialize(mapload) . = ..() if(cell_type) cell = new cell_type(src) diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index 0d60203cb5..afb30631e0 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -6,7 +6,7 @@ fire_sound = "sound/weapons/revolvershot.ogg" casing_ejector = FALSE -/obj/item/gun/ballistic/revolver/Initialize() +/obj/item/gun/ballistic/revolver/Initialize(mapload) . = ..() if(!istype(magazine, /obj/item/ammo_box/magazine/internal/cylinder)) verbs += /obj/item/gun/ballistic/revolver/verb/spin @@ -109,7 +109,7 @@ ) var/list/safe_calibers -/obj/item/gun/ballistic/revolver/detective/Initialize() +/obj/item/gun/ballistic/revolver/detective/Initialize(mapload) . = ..() safe_calibers = magazine.caliber @@ -191,7 +191,7 @@ . = ..() spun = TRUE -/obj/item/gun/ballistic/revolver/russian/Initialize() +/obj/item/gun/ballistic/revolver/russian/Initialize(mapload) . = ..() do_spin() spun = TRUE diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index f84ed9cd8d..f7d57b43a0 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -192,7 +192,7 @@ flags_1 = NONE mag_type = /obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage -/obj/item/gun/ballistic/shotgun/boltaction/enchanted/Initialize() +/obj/item/gun/ballistic/shotgun/boltaction/enchanted/Initialize(mapload) . = ..() bolt_open = TRUE pump() @@ -303,7 +303,7 @@ . = ..() . += "Alt-click to pump it." -/obj/item/gun/ballistic/shotgun/automatic/dual_tube/Initialize() +/obj/item/gun/ballistic/shotgun/automatic/dual_tube/Initialize(mapload) . = ..() if (!alternate_magazine) alternate_magazine = new mag_type(src) diff --git a/code/modules/projectiles/guns/ballistic/toy.dm b/code/modules/projectiles/guns/ballistic/toy.dm index 1f0601ac77..a72a172891 100644 --- a/code/modules/projectiles/guns/ballistic/toy.dm +++ b/code/modules/projectiles/guns/ballistic/toy.dm @@ -35,7 +35,7 @@ /obj/item/gun/ballistic/automatic/toy/pistol/riot mag_type = /obj/item/ammo_box/magazine/toy/pistol/riot -/obj/item/gun/ballistic/automatic/toy/pistol/riot/Initialize() +/obj/item/gun/ballistic/automatic/toy/pistol/riot/Initialize(mapload) magazine = new /obj/item/ammo_box/magazine/toy/pistol/riot(src) return ..() diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 34e9247184..dd759f9e3c 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -49,7 +49,7 @@ /obj/item/gun/energy/get_cell() return cell -/obj/item/gun/energy/Initialize() +/obj/item/gun/energy/Initialize(mapload) . = ..() if(cell_type) cell = new cell_type(src) diff --git a/code/modules/projectiles/guns/energy/dueling.dm b/code/modules/projectiles/guns/energy/dueling.dm index 04eff5afa9..b11e5533cc 100644 --- a/code/modules/projectiles/guns/energy/dueling.dm +++ b/code/modules/projectiles/guns/energy/dueling.dm @@ -168,7 +168,7 @@ /obj/item/gun/energy/dueling/hugbox/stamina hugbox = DUEL_HUGBOX_NONLETHAL -/obj/item/gun/energy/dueling/Initialize() +/obj/item/gun/energy/dueling/Initialize(mapload) . = ..() setting_overlay = mutable_appearance(icon,setting_iconstate()) add_overlay(setting_overlay) diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index 294040b040..a34e0f6f12 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -22,7 +22,7 @@ gunlight_state = "mini-light" can_flashlight = 0 // Can't attach or detach the flashlight, and override it's icon update -/obj/item/gun/energy/e_gun/mini/Initialize() +/obj/item/gun/energy/e_gun/mini/Initialize(mapload) gun_light = new /obj/item/flashlight/seclite(src) return ..() diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 4d394401c4..a899dc9b79 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -125,7 +125,7 @@ holds_charge = TRUE unique_frequency = TRUE -/obj/item/gun/energy/kinetic_accelerator/Initialize() +/obj/item/gun/energy/kinetic_accelerator/Initialize(mapload) . = ..() if(!holds_charge) empty() diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 8e61221cc8..f73ac9cfb8 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -204,7 +204,7 @@ throwforce = 10 obj_flags = UNIQUE_RENAME -/obj/item/gun/energy/laser/redtag/hitscan/chaplain/Initialize() +/obj/item/gun/energy/laser/redtag/hitscan/chaplain/Initialize(mapload) . = ..() AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, null, null, FALSE) diff --git a/code/modules/projectiles/guns/energy/laser_gatling.dm b/code/modules/projectiles/guns/energy/laser_gatling.dm index 2bb1ece906..16a977515c 100644 --- a/code/modules/projectiles/guns/energy/laser_gatling.dm +++ b/code/modules/projectiles/guns/energy/laser_gatling.dm @@ -17,7 +17,7 @@ var/overheat_max = 50 var/heat_diffusion = 1 -/obj/item/minigunpack/Initialize() +/obj/item/minigunpack/Initialize(mapload) . = ..() gun = new(src) START_PROCESSING(SSfastprocess, src) @@ -114,7 +114,7 @@ item_flags = NEEDS_PERMIT | SLOWS_WHILE_IN_HAND var/obj/item/minigunpack/ammo_pack -/obj/item/gun/energy/minigun/Initialize() +/obj/item/gun/energy/minigun/Initialize(mapload) if(istype(loc, /obj/item/minigunpack)) //We should spawn inside an ammo pack so let's use that one. ammo_pack = loc else diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index b05be99808..d5dc39695b 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -17,7 +17,7 @@ /obj/item/gun/energy/pulse/prize pin = /obj/item/firing_pin -/obj/item/gun/energy/pulse/prize/Initialize() +/obj/item/gun/energy/pulse/prize/Initialize(mapload) . = ..() GLOB.poi_list += src var/turf/T = get_turf(src) diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm index ebc4a2f2a4..4192f038c2 100644 --- a/code/modules/projectiles/guns/magic.dm +++ b/code/modules/projectiles/guns/magic.dm @@ -49,7 +49,7 @@ charges--//... drain a charge recharge_newshot() -/obj/item/gun/magic/Initialize() +/obj/item/gun/magic/Initialize(mapload) . = ..() charges = max_charges chambered = new ammo_type(src) diff --git a/code/modules/projectiles/guns/magic/motivation.dm b/code/modules/projectiles/guns/magic/motivation.dm index a33165b28b..db4c222619 100644 --- a/code/modules/projectiles/guns/magic/motivation.dm +++ b/code/modules/projectiles/guns/magic/motivation.dm @@ -23,7 +23,7 @@ block_parry_data = /datum/block_parry_data/motivation //to get this to toggle correctly -/obj/item/gun/magic/staff/motivation/Initialize() +/obj/item/gun/magic/staff/motivation/Initialize(mapload) . = ..() judgementcut = new(src) diff --git a/code/modules/projectiles/guns/magic/staff.dm b/code/modules/projectiles/guns/magic/staff.dm index 6ebdc5e7b8..f22cf6e1a9 100644 --- a/code/modules/projectiles/guns/magic/staff.dm +++ b/code/modules/projectiles/guns/magic/staff.dm @@ -86,7 +86,7 @@ sharpness = SHARP_EDGED max_charges = 4 -/obj/item/gun/magic/staff/spellblade/Initialize() +/obj/item/gun/magic/staff/spellblade/Initialize(mapload) . = ..() AddComponent(/datum/component/butchering, 15, 125, 0, hitsound) diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index f48020aeb5..8ff955fe66 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -9,7 +9,7 @@ max_charges = 100 //100, 50, 50, 34 (max charge distribution by 25%ths) var/variable_charges = 1 -/obj/item/gun/magic/wand/Initialize() +/obj/item/gun/magic/wand/Initialize(mapload) if(prob(75) && variable_charges) //25% chance of listed max charges, 50% chance of 1/2 max charges, 25% chance of 1/3 max charges if(prob(33)) max_charges = CEILING(max_charges / 3, 1) diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm index 2ef974a450..7608cd24bc 100644 --- a/code/modules/projectiles/guns/misc/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -169,7 +169,7 @@ to_chat(user, "You set \the [src] to [projectile_setting_pierce? "pierce":"impact"] mode.") aiming_beam() -/obj/item/gun/energy/beam_rifle/Initialize() +/obj/item/gun/energy/beam_rifle/Initialize(mapload) . = ..() fire_delay = delay current_tracers = list() diff --git a/code/modules/projectiles/guns/misc/blastcannon.dm b/code/modules/projectiles/guns/misc/blastcannon.dm index 64cffe52e7..ec25ee3493 100644 --- a/code/modules/projectiles/guns/misc/blastcannon.dm +++ b/code/modules/projectiles/guns/misc/blastcannon.dm @@ -26,7 +26,7 @@ debug_power = 80 bombcheck = FALSE -/obj/item/gun/blastcannon/Initialize() +/obj/item/gun/blastcannon/Initialize(mapload) . = ..() if(!pin) pin = new diff --git a/code/modules/projectiles/guns/misc/chameleon.dm b/code/modules/projectiles/guns/misc/chameleon.dm index 4fa614ae5c..428de747f7 100644 --- a/code/modules/projectiles/guns/misc/chameleon.dm +++ b/code/modules/projectiles/guns/misc/chameleon.dm @@ -25,7 +25,7 @@ var/can_hitscan = FALSE var/hitscan_mode = FALSE -/obj/item/gun/energy/laser/chameleon/Initialize() +/obj/item/gun/energy/laser/chameleon/Initialize(mapload) . = ..() chameleon_action = new(src) chameleon_action.chameleon_type = /obj/item/gun diff --git a/code/modules/projectiles/guns/misc/chem_gun.dm b/code/modules/projectiles/guns/misc/chem_gun.dm index ccc4c5bd15..9f0815ebfb 100644 --- a/code/modules/projectiles/guns/misc/chem_gun.dm +++ b/code/modules/projectiles/guns/misc/chem_gun.dm @@ -21,7 +21,7 @@ var/list/allowed_containers = list(/obj/item/reagent_containers/glass/bottle/vial/small, /obj/item/reagent_containers/glass/bottle/vial/large) var/quickload = TRUE -/obj/item/gun/chem/Initialize() +/obj/item/gun/chem/Initialize(mapload) . = ..() chambered = new /obj/item/ammo_casing/chemgun(src) START_PROCESSING(SSobj, src) @@ -111,7 +111,7 @@ icon_state = "chemgunrepeater" item_state = "syringegun" -obj/item/gun/chem/smart/Initialize() +obj/item/gun/chem/smart/Initialize(mapload) . = ..() chambered = new /obj/item/ammo_casing/chemgun/smart(src) diff --git a/code/modules/projectiles/guns/misc/medbeam.dm b/code/modules/projectiles/guns/misc/medbeam.dm index 6864dad33e..4a64317fd9 100644 --- a/code/modules/projectiles/guns/misc/medbeam.dm +++ b/code/modules/projectiles/guns/misc/medbeam.dm @@ -16,7 +16,7 @@ weapon_weight = WEAPON_MEDIUM -/obj/item/gun/medbeam/Initialize() +/obj/item/gun/medbeam/Initialize(mapload) . = ..() START_PROCESSING(SSobj, src) @@ -130,6 +130,6 @@ /obj/item/gun/medbeam/mech mounted = 1 -/obj/item/gun/medbeam/mech/Initialize() +/obj/item/gun/medbeam/mech/Initialize(mapload) . = ..() STOP_PROCESSING(SSobj, src) //Mech mediguns do not process until installed, and are controlled by the holder obj diff --git a/code/modules/projectiles/guns/misc/syringe_gun.dm b/code/modules/projectiles/guns/misc/syringe_gun.dm index 91275e197a..07066023b3 100644 --- a/code/modules/projectiles/guns/misc/syringe_gun.dm +++ b/code/modules/projectiles/guns/misc/syringe_gun.dm @@ -14,7 +14,7 @@ var/list/syringes = list() var/max_syringes = 1 -/obj/item/gun/syringe/Initialize() +/obj/item/gun/syringe/Initialize(mapload) . = ..() chambered = new /obj/item/ammo_casing/syringegun(src) @@ -83,7 +83,7 @@ name = "modified syringe gun" desc = "A syringe gun that has been modified to fit DNA injectors instead of normal syringes." -/obj/item/gun/syringe/dna/Initialize() +/obj/item/gun/syringe/dna/Initialize(mapload) . = ..() chambered = new /obj/item/ammo_casing/dnainjector(src) @@ -113,7 +113,7 @@ suppressed = TRUE //Softer fire sound can_unsuppress = FALSE -/obj/item/gun/syringe/dart/Initialize() +/obj/item/gun/syringe/dart/Initialize(mapload) . = ..() chambered = new /obj/item/ammo_casing/syringegun/dart(src) diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm index cef730366e..0f5e558841 100644 --- a/code/modules/projectiles/pins.dm +++ b/code/modules/projectiles/pins.dm @@ -13,7 +13,7 @@ var/pin_removeable = 0 // Can be replaced by any pin. var/obj/item/gun/gun -/obj/item/firing_pin/Initialize(newloc) +/obj/item/firing_pin/Initialize(mapload, newloc) . = ..() if(istype(newloc, /obj/item/gun)) gun = newloc @@ -238,7 +238,7 @@ var/only_lethals = FALSE var/can_toggle = TRUE -/obj/item/firing_pin/security_level/Initialize() +/obj/item/firing_pin/security_level/Initialize(mapload) . = ..() fail_message = "INVALID SECURITY LEVEL. CURRENT: [uppertext(NUM2SECLEVEL(GLOB.security_level))]. \ MIN: [uppertext(NUM2SECLEVEL(min_sec_level))]. MAX: [uppertext(NUM2SECLEVEL(max_sec_level))]. \ diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 8d467c9901..b7ce58cda4 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -166,7 +166,7 @@ /// For telling whether we want to roll for bone breaking or lacerations if we're bothering with wounds sharpness = SHARP_NONE -/obj/item/projectile/Initialize() +/obj/item/projectile/Initialize(mapload) . = ..() permutated = list() decayedRange = range diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 79e9ab8b4b..ee10d978e2 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -30,7 +30,7 @@ wound_bonus = 0 damage = 25 -/obj/item/projectile/beam/laser/hellfire/Initialize() +/obj/item/projectile/beam/laser/hellfire/Initialize(mapload) . = ..() transform *= 2 diff --git a/code/modules/projectiles/projectile/bullets/dart_syringe.dm b/code/modules/projectiles/projectile/bullets/dart_syringe.dm index 4978e679b4..3b7e86e77c 100644 --- a/code/modules/projectiles/projectile/bullets/dart_syringe.dm +++ b/code/modules/projectiles/projectile/bullets/dart_syringe.dm @@ -4,7 +4,7 @@ damage = 6 var/piercing = FALSE -/obj/item/projectile/bullet/dart/Initialize() +/obj/item/projectile/bullet/dart/Initialize(mapload) . = ..() create_reagents(50, NO_REACT, NO_REAGENTS_VALUE) @@ -32,13 +32,13 @@ /obj/item/projectile/bullet/dart/piercing piercing = TRUE -/obj/item/projectile/bullet/dart/metalfoam/Initialize() +/obj/item/projectile/bullet/dart/metalfoam/Initialize(mapload) . = ..() reagents.add_reagent(/datum/reagent/aluminium, 15) reagents.add_reagent(/datum/reagent/foaming_agent, 5) reagents.add_reagent(/datum/reagent/toxin/acid, 5) -/obj/item/projectile/bullet/dart/catranq/Initialize() +/obj/item/projectile/bullet/dart/catranq/Initialize(mapload) . = ..() reagents.add_reagent(/datum/reagent/fermi/furranium, 5) // Turns out I don't even need to give this guy actual tranquilizer chems. diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm index 9670907ec3..cdee721509 100644 --- a/code/modules/projectiles/projectile/bullets/shotgun.dm +++ b/code/modules/projectiles/projectile/bullets/shotgun.dm @@ -71,7 +71,7 @@ var/atom/throw_target = get_edge_target_turf(M, get_dir(src, get_step_away(M, src))) M.safe_throw_at(throw_target, 3, 2) -/obj/item/projectile/bullet/shotgun_meteorslug/Initialize() +/obj/item/projectile/bullet/shotgun_meteorslug/Initialize(mapload) . = ..() SpinAnimation() @@ -118,7 +118,7 @@ wound_bonus = 0 bare_wound_bonus = 7.5 -/obj/item/projectile/bullet/pellet/shotgun_improvised/Initialize() +/obj/item/projectile/bullet/pellet/shotgun_improvised/Initialize(mapload) . = ..() range = rand(1, 8) diff --git a/code/modules/projectiles/projectile/bullets/special.dm b/code/modules/projectiles/projectile/bullets/special.dm index a0414d8a9c..446d87702e 100644 --- a/code/modules/projectiles/projectile/bullets/special.dm +++ b/code/modules/projectiles/projectile/bullets/special.dm @@ -11,7 +11,7 @@ icon_state = "banana" range = 200 -/obj/item/projectile/bullet/honker/Initialize() +/obj/item/projectile/bullet/honker/Initialize(mapload) . = ..() SpinAnimation() diff --git a/code/modules/projectiles/projectile/energy/net_snare.dm b/code/modules/projectiles/projectile/energy/net_snare.dm index 22eaadb1e0..7ecf48cf6a 100644 --- a/code/modules/projectiles/projectile/energy/net_snare.dm +++ b/code/modules/projectiles/projectile/energy/net_snare.dm @@ -6,7 +6,7 @@ hitsound = 'sound/weapons/taserhit.ogg' range = 10 -/obj/item/projectile/energy/net/Initialize() +/obj/item/projectile/energy/net/Initialize(mapload) . = ..() SpinAnimation() @@ -29,7 +29,7 @@ light_range = 3 anchored = TRUE -/obj/effect/nettingportal/Initialize() +/obj/effect/nettingportal/Initialize(mapload) . = ..() var/obj/item/beacon/teletarget = null for(var/obj/machinery/computer/teleporter/com in GLOB.machines) diff --git a/code/modules/projectiles/projectile/energy/nuclear_particle.dm b/code/modules/projectiles/projectile/energy/nuclear_particle.dm index 6cbe258560..77f013ebba 100644 --- a/code/modules/projectiles/projectile/energy/nuclear_particle.dm +++ b/code/modules/projectiles/projectile/energy/nuclear_particle.dm @@ -17,7 +17,7 @@ "purple" = "#FF00FF" ) -/obj/item/projectile/energy/nuclear_particle/Initialize() +/obj/item/projectile/energy/nuclear_particle/Initialize(mapload) . = ..() //Random color time! var/our_color = pick(particle_colors) diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 76cd1a6bc5..ea9cca5bbc 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -382,7 +382,7 @@ var/weakened_icon = "decursed" var/auto_destroy = TRUE -/obj/structure/closet/decay/Initialize() +/obj/structure/closet/decay/Initialize(mapload) . = ..() if(auto_destroy) addtimer(CALLBACK(src, .proc/bust_open), 5 MINUTES) diff --git a/code/modules/projectiles/projectile/special/plasma.dm b/code/modules/projectiles/projectile/special/plasma.dm index 77509cb574..050d6a4364 100644 --- a/code/modules/projectiles/projectile/special/plasma.dm +++ b/code/modules/projectiles/projectile/special/plasma.dm @@ -13,7 +13,7 @@ muzzle_type = /obj/effect/projectile/muzzle/plasma_cutter impact_type = /obj/effect/projectile/impact/plasma_cutter -/obj/item/projectile/plasma/Initialize() +/obj/item/projectile/plasma/Initialize(mapload) . = ..() if(!lavaland_equipment_pressure_check(get_turf(src))) name = "weakened [name]" diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 6aec48182a..2e8f301e13 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -92,7 +92,7 @@ var/list/saved_recipes = list() -/obj/machinery/chem_dispenser/Initialize() +/obj/machinery/chem_dispenser/Initialize(mapload) . = ..() dispensable_reagents = sortList(dispensable_reagents, /proc/cmp_reagents_asc) if(emagged_reagents) @@ -534,7 +534,7 @@ return "purple" -/obj/machinery/chem_dispenser/drinks/Initialize() +/obj/machinery/chem_dispenser/drinks/Initialize(mapload) . = ..() AddComponent(/datum/component/simple_rotation, ROTATION_ALTCLICK | ROTATION_CLOCKWISE) @@ -629,7 +629,7 @@ obj_flags = CAN_BE_HIT | EMAGGED flags_1 = NODECONSTRUCT_1 -/obj/machinery/chem_dispenser/drinks/fullupgrade/Initialize() +/obj/machinery/chem_dispenser/drinks/fullupgrade/Initialize(mapload) . = ..() dispensable_reagents |= emagged_reagents //adds emagged reagents component_parts = list() @@ -689,7 +689,7 @@ obj_flags = CAN_BE_HIT | EMAGGED flags_1 = NODECONSTRUCT_1 -/obj/machinery/chem_dispenser/drinks/beer/fullupgrade/Initialize() +/obj/machinery/chem_dispenser/drinks/beer/fullupgrade/Initialize(mapload) . = ..() dispensable_reagents |= emagged_reagents //adds emagged reagents component_parts = list() @@ -736,7 +736,7 @@ upgrade_reagents2 = null upgrade_reagents3 = null -/obj/machinery/chem_dispenser/mutagensaltpeter/Initialize() +/obj/machinery/chem_dispenser/mutagensaltpeter/Initialize(mapload) . = ..() component_parts = list() component_parts += new /obj/item/circuitboard/machine/chem_dispenser(null) @@ -753,7 +753,7 @@ obj_flags = CAN_BE_HIT | EMAGGED flags_1 = NODECONSTRUCT_1 -/obj/machinery/chem_dispenser/fullupgrade/Initialize() +/obj/machinery/chem_dispenser/fullupgrade/Initialize(mapload) . = ..() dispensable_reagents |= emagged_reagents //adds emagged reagents component_parts = list() @@ -818,7 +818,7 @@ /datum/reagent/medicine/morphine ) -/obj/machinery/chem_dispenser/abductor/Initialize() +/obj/machinery/chem_dispenser/abductor/Initialize(mapload) . = ..() component_parts = list() component_parts += new /obj/item/circuitboard/machine/chem_dispenser(null) diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 128c4ed3cb..0e53b0796b 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -22,7 +22,7 @@ var/list/pillStyles var/fermianalyze //Give more detail on fermireactions on analysis -/obj/machinery/chem_master/Initialize() +/obj/machinery/chem_master/Initialize(mapload) create_reagents(100) //Calculate the span tags and ids fo all the available pill icons diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index d4d8ae47fe..4729443d7a 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -16,7 +16,7 @@ var/datum/symptom/selected_symptom var/obj/item/reagent_containers/beaker -/obj/machinery/computer/pandemic/Initialize() +/obj/machinery/computer/pandemic/Initialize(mapload) . = ..() update_icon() diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index 65cc97f586..b3c4cc8908 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -25,13 +25,13 @@ var/static/radial_juice = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_juice") var/static/radial_mix = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_mix") -/obj/machinery/reagentgrinder/Initialize() +/obj/machinery/reagentgrinder/Initialize(mapload) . = ..() holdingitems = list() beaker = new /obj/item/reagent_containers/glass/beaker/large(src) beaker.desc += " May contain blended dust. Don't breathe this in!" -/obj/machinery/reagentgrinder/constructed/Initialize() +/obj/machinery/reagentgrinder/constructed/Initialize(mapload) . = ..() holdingitems = list() QDEL_NULL(beaker) diff --git a/code/modules/reagents/chemistry/machinery/smoke_machine.dm b/code/modules/reagents/chemistry/machinery/smoke_machine.dm index 80b8011af0..e601e9f551 100644 --- a/code/modules/reagents/chemistry/machinery/smoke_machine.dm +++ b/code/modules/reagents/chemistry/machinery/smoke_machine.dm @@ -29,7 +29,7 @@ opaque = FALSE alpha = 100 -/obj/machinery/smoke_machine/Initialize() +/obj/machinery/smoke_machine/Initialize(mapload) . = ..() create_reagents(REAGENTS_BASE_VOLUME) for(var/obj/item/stock_parts/matter_bin/B in component_parts) diff --git a/code/modules/reagents/chemistry/recipes/special.dm b/code/modules/reagents/chemistry/recipes/special.dm index 4aab8e4046..58dd37133a 100644 --- a/code/modules/reagents/chemistry/recipes/special.dm +++ b/code/modules/reagents/chemistry/recipes/special.dm @@ -177,7 +177,7 @@ GLOBAL_LIST_INIT(food_reagents, build_reagents_to_food()) //reagentid = related return list() . = ..() -/obj/item/paper/secretrecipe/Initialize() +/obj/item/paper/secretrecipe/Initialize(mapload) . = ..() if(SSpersistence.initialized) UpdateInfo() diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm index acfda85963..c6df9ebb0c 100644 --- a/code/modules/reagents/reagent_containers/blood_pack.dm +++ b/code/modules/reagents/reagent_containers/blood_pack.dm @@ -10,7 +10,7 @@ var/color_to_apply = "#FFFFFF" var/mutable_appearance/fill_overlay -/obj/item/reagent_containers/blood/Initialize() +/obj/item/reagent_containers/blood/Initialize(mapload) . = ..() if(blood_type != null) reagents.add_reagent(/datum/reagent/blood, 200, list("donor"=null,"viruses"=null,"blood_DNA"=null,"bloodcolor"=bloodtype_to_color(blood_type), "blood_type"=blood_type,"resistances"=null,"trace_chem"=null)) @@ -43,7 +43,7 @@ /obj/item/reagent_containers/blood/random icon_state = "random_bloodpack" -/obj/item/reagent_containers/blood/random/Initialize() +/obj/item/reagent_containers/blood/random/Initialize(mapload) icon_state = "bloodpack" blood_type = pick("A+", "A-", "B+", "B-", "O+", "O-", "L", "SY", "HF", "GEL", "BUG") return ..() diff --git a/code/modules/reagents/reagent_containers/borghypo.dm b/code/modules/reagents/reagent_containers/borghypo.dm index 3388018280..0b3e5bcf75 100644 --- a/code/modules/reagents/reagent_containers/borghypo.dm +++ b/code/modules/reagents/reagent_containers/borghypo.dm @@ -34,7 +34,7 @@ Borg Hypospray //Used as list for input() in shakers. var/list/reagent_names = list() -/obj/item/reagent_containers/borghypo/Initialize() +/obj/item/reagent_containers/borghypo/Initialize(mapload) . = ..() for(var/R in reagent_ids) diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index be8c7fac36..47f5c94e09 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -8,7 +8,7 @@ possible_transfer_amounts = list(5,10,15,25,30) volume = 30 -/obj/item/reagent_containers/glass/bottle/Initialize() +/obj/item/reagent_containers/glass/bottle/Initialize(mapload) . = ..() if(!icon_state) icon_state = "bottle" @@ -159,7 +159,7 @@ icon = 'icons/obj/chemical.dmi' var/extra_reagent = null -/obj/item/reagent_containers/glass/bottle/traitor/Initialize() +/obj/item/reagent_containers/glass/bottle/traitor/Initialize(mapload) . = ..() extra_reagent = pick(/datum/reagent/toxin/polonium, /datum/reagent/toxin/histamine, /datum/reagent/toxin/formaldehyde, /datum/reagent/toxin/venom, /datum/reagent/toxin/fentanyl, /datum/reagent/toxin/cyanide) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index cc7ff43bab..503c9df8d0 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -128,7 +128,7 @@ possible_transfer_amounts = list(5,10,15,20,25,30,50,60) container_flags = PH_WEAK|APTFT_ALTCLICK|APTFT_VERB -/obj/item/reagent_containers/glass/beaker/Initialize() +/obj/item/reagent_containers/glass/beaker/Initialize(mapload) . = ..() update_icon() diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index a6b6640ead..75c9f3c117 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -370,7 +370,7 @@ quickload = TRUE penetrates = TRUE -/obj/item/hypospray/mkii/Initialize() +/obj/item/hypospray/mkii/Initialize(mapload) . = ..() if(!spawnwithvial) update_icon() diff --git a/code/modules/reagents/reagent_containers/hypovial.dm b/code/modules/reagents/reagent_containers/hypovial.dm index 92c33af3b1..43f9f88976 100644 --- a/code/modules/reagents/reagent_containers/hypovial.dm +++ b/code/modules/reagents/reagent_containers/hypovial.dm @@ -21,7 +21,7 @@ always_reskinnable = TRUE cached_icon = "hypovial" -/obj/item/reagent_containers/glass/bottle/vial/Initialize() +/obj/item/reagent_containers/glass/bottle/vial/Initialize(mapload) . = ..() update_icon() diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 6cf528eed7..50db4f0610 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -15,7 +15,7 @@ var/self_delay = FALSE //pills are instant, this is because patches inheret their aplication from pills var/dissolvable = TRUE -/obj/item/reagent_containers/pill/Initialize() +/obj/item/reagent_containers/pill/Initialize(mapload) . = ..() if(!icon_state) icon_state = "pill[rand(1,20)]" @@ -248,7 +248,7 @@ var/static/list/descs = list("Your feeling is telling you no, but...","Drugs are expensive, you can't afford not to eat any pills that you find."\ , "Surely, there's no way this could go bad.") -/obj/item/reagent_containers/pill/floorpill/Initialize() +/obj/item/reagent_containers/pill/floorpill/Initialize(mapload) list_reagents = list(get_random_reagent_id() = rand(10,50)) . = ..() name = pick(names) diff --git a/code/modules/reagents/reagent_containers/rags.dm b/code/modules/reagents/reagent_containers/rags.dm index 78cb9d43ea..ec73dd837c 100644 --- a/code/modules/reagents/reagent_containers/rags.dm +++ b/code/modules/reagents/reagent_containers/rags.dm @@ -134,7 +134,7 @@ var/folded_icon = "towel" var/list/possible_colors -/obj/item/reagent_containers/rag/towel/Initialize() +/obj/item/reagent_containers/rag/towel/Initialize(mapload) . = ..() if(possible_colors) add_atom_colour(pick(possible_colors), FIXED_COLOUR_PRIORITY) diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index f59e45ff01..2670401964 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -229,7 +229,7 @@ generate_amount = 1 generate_delay = 40 //deciseconds -/obj/item/reagent_containers/spray/waterflower/cyborg/Initialize() +/obj/item/reagent_containers/spray/waterflower/cyborg/Initialize(mapload) . = ..() START_PROCESSING(SSfastprocess, src) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index c2f80de761..c1812d9121 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -18,7 +18,7 @@ custom_price = PRICE_CHEAP_AS_FREE sharpness = SHARP_POINTY -/obj/item/reagent_containers/syringe/Initialize() +/obj/item/reagent_containers/syringe/Initialize(mapload) . = ..() if(list_reagents) //syringe starts in inject mode if its already got something inside mode = SYRINGE_INJECT diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 8215c9d8db..e66850b061 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -22,7 +22,7 @@ else return ..() -/obj/structure/reagent_dispensers/Initialize() +/obj/structure/reagent_dispensers/Initialize(mapload) create_reagents(tank_volume, DRAINABLE | AMOUNT_VISIBLE) if(reagent_id) reagents.add_reagent(reagent_id, tank_volume) @@ -212,7 +212,7 @@ density = FALSE reagent_id = /datum/reagent/consumable/condensedcapsaicin -/obj/structure/reagent_dispensers/peppertank/Initialize() +/obj/structure/reagent_dispensers/peppertank/Initialize(mapload) . = ..() if(prob(1)) desc = "IT'S PEPPER TIME, BITCH!" diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index e9c17ecc28..a21b026080 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -321,7 +321,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) desc = "A conveyor control switch. It appears to only go in one direction." oneway = TRUE -/obj/machinery/conveyor_switch/oneway/Initialize() +/obj/machinery/conveyor_switch/oneway/Initialize(mapload) . = ..() if((dir == NORTH) || (dir == WEST)) invert_icon = TRUE @@ -334,7 +334,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) w_class = WEIGHT_CLASS_NORMAL var/id = "" //inherited by the switch -/obj/item/conveyor_switch_construct/Initialize() +/obj/item/conveyor_switch_construct/Initialize(mapload) . = ..() id = "[rand()]" //this couldn't possibly go wrong diff --git a/code/modules/recycling/disposal/pipe.dm b/code/modules/recycling/disposal/pipe.dm index f6c27f4a79..2816b5519c 100644 --- a/code/modules/recycling/disposal/pipe.dm +++ b/code/modules/recycling/disposal/pipe.dm @@ -240,7 +240,7 @@ canclank = TRUE var/obj/linked // the linked obj/machinery/disposal or obj/disposaloutlet -/obj/structure/disposalpipe/trunk/Initialize() +/obj/structure/disposalpipe/trunk/Initialize(mapload) . = ..() getlinked() diff --git a/code/modules/recycling/disposal/pipe_sorting.dm b/code/modules/recycling/disposal/pipe_sorting.dm index 2d40ec64eb..1ae5698312 100644 --- a/code/modules/recycling/disposal/pipe_sorting.dm +++ b/code/modules/recycling/disposal/pipe_sorting.dm @@ -36,7 +36,7 @@ icon_state = "pipe-j2s" initialize_dirs = DISP_DIR_LEFT | DISP_DIR_FLIP -/obj/structure/disposalpipe/sorting/mail/Initialize() +/obj/structure/disposalpipe/sorting/mail/Initialize(mapload) . = ..() // Generate a list of soring tags. if(sortType) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index cfb6d92723..9c80176f46 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -79,7 +79,7 @@ other types of metals and chemistry for reagents). var/list/blueprints = list() var/max_blueprints = 1 -/obj/item/disk/design_disk/Initialize() +/obj/item/disk/design_disk/Initialize(mapload) . = ..() pixel_x = rand(-5, 5) pixel_y = rand(-5, 5) diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index e6128ed5c2..ba0b17c113 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -66,7 +66,7 @@ if(initial(tempCheck.icon_state) != null) critical_items += I -/obj/machinery/rnd/experimentor/Initialize() +/obj/machinery/rnd/experimentor/Initialize(mapload) . = ..() trackedIan = locate(/mob/living/simple_animal/pet/dog/corgi/Ian) in GLOB.mob_living_list @@ -537,7 +537,7 @@ var/cooldownMax = 60 var/cooldown -/obj/item/relic/Initialize() +/obj/item/relic/Initialize(mapload) . = ..() icon_state = pick("shock_kit","armor-igniter-analyzer","infra-igniter0","infra-igniter1","radio-multitool","prox-radio1","radio-radio","timer-multitool0","radio-igniter-tank") realName = "[pick("broken","twisted","spun","improved","silly","regular","badly made")] [pick("device","object","toy","illegal tech","weapon")]" diff --git a/code/modules/research/nanites/nanite_chamber.dm b/code/modules/research/nanites/nanite_chamber.dm index 8675d54b46..fe776e86c5 100644 --- a/code/modules/research/nanites/nanite_chamber.dm +++ b/code/modules/research/nanites/nanite_chamber.dm @@ -20,7 +20,7 @@ var/busy_message var/message_cooldown = 0 -/obj/machinery/nanite_chamber/Initialize() +/obj/machinery/nanite_chamber/Initialize(mapload) . = ..() occupant_typecache = GLOB.typecache_living diff --git a/code/modules/research/nanites/nanite_chamber_computer.dm b/code/modules/research/nanites/nanite_chamber_computer.dm index f69cb58456..0755487a7a 100644 --- a/code/modules/research/nanites/nanite_chamber_computer.dm +++ b/code/modules/research/nanites/nanite_chamber_computer.dm @@ -6,7 +6,7 @@ icon_screen = "nanite_chamber_control" circuit = /obj/item/circuitboard/computer/nanite_chamber_control -/obj/machinery/computer/nanite_chamber_control/Initialize() +/obj/machinery/computer/nanite_chamber_control/Initialize(mapload) . = ..() find_chamber() diff --git a/code/modules/research/nanites/nanite_program_hub.dm b/code/modules/research/nanites/nanite_program_hub.dm index 9a625cd0c7..a097a08532 100644 --- a/code/modules/research/nanites/nanite_program_hub.dm +++ b/code/modules/research/nanites/nanite_program_hub.dm @@ -22,7 +22,7 @@ list(name = "Protocols"), ) -/obj/machinery/nanite_program_hub/Initialize() +/obj/machinery/nanite_program_hub/Initialize(mapload) . = ..() linked_techweb = SSresearch.science_tech @@ -148,6 +148,6 @@ disk.name = initial(disk.name) . = TRUE -/obj/machinery/nanite_program_hub/admin/Initialize() +/obj/machinery/nanite_program_hub/admin/Initialize(mapload) . = ..() linked_techweb = SSresearch.admin_tech diff --git a/code/modules/research/nanites/program_disks.dm b/code/modules/research/nanites/program_disks.dm index 667618173c..291982059c 100644 --- a/code/modules/research/nanites/program_disks.dm +++ b/code/modules/research/nanites/program_disks.dm @@ -7,7 +7,7 @@ var/program_type var/datum/nanite_program/program -/obj/item/disk/nanite_program/Initialize() +/obj/item/disk/nanite_program/Initialize(mapload) . = ..() if(program_type) program = new program_type diff --git a/code/modules/research/nanites/public_chamber.dm b/code/modules/research/nanites/public_chamber.dm index b7a8db4080..c6c53779a9 100644 --- a/code/modules/research/nanites/public_chamber.dm +++ b/code/modules/research/nanites/public_chamber.dm @@ -18,7 +18,7 @@ var/busy_icon_state var/message_cooldown = 0 -/obj/machinery/public_nanite_chamber/Initialize() +/obj/machinery/public_nanite_chamber/Initialize(mapload) . = ..() occupant_typecache = GLOB.typecache_living diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index a9284a19f7..29181021c7 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -87,7 +87,7 @@ Nothing else in the console has ID requirements. linked_imprinter = D D.linked_console = src -/obj/machinery/computer/rdconsole/Initialize() +/obj/machinery/computer/rdconsole/Initialize(mapload) . = ..() stored_research = SSresearch.science_tech stored_research.consoles_accessing[src] = TRUE @@ -1145,7 +1145,7 @@ Nothing else in the console has ID requirements. req_access = null req_access_txt = "29" -/obj/machinery/computer/rdconsole/robotics/Initialize() +/obj/machinery/computer/rdconsole/robotics/Initialize(mapload) . = ..() if(circuit) circuit.name = "R&D Console - Robotics (Computer Board)" diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm index f39f5b1584..3ab3465b9e 100644 --- a/code/modules/research/rdmachines.dm +++ b/code/modules/research/rdmachines.dm @@ -18,7 +18,7 @@ /obj/machinery/rnd/proc/reset_busy() busy = FALSE -/obj/machinery/rnd/Initialize() +/obj/machinery/rnd/Initialize(mapload) . = ..() wires = new /datum/wires/rnd(src) diff --git a/code/modules/research/research_disk.dm b/code/modules/research/research_disk.dm index a656093d98..0ac80040f9 100644 --- a/code/modules/research/research_disk.dm +++ b/code/modules/research/research_disk.dm @@ -6,7 +6,7 @@ custom_materials = list(/datum/material/iron=300, /datum/material/glass=100) var/datum/techweb/stored_research -/obj/item/disk/tech_disk/Initialize() +/obj/item/disk/tech_disk/Initialize(mapload) . = ..() pixel_x = rand(-5, 5) pixel_y = rand(-5, 5) @@ -17,7 +17,7 @@ desc = "A debug item for research" custom_materials = null -/obj/item/disk/tech_disk/debug/Initialize() +/obj/item/disk/tech_disk/debug/Initialize(mapload) . = ..() stored_research = new /datum/techweb/admin @@ -27,7 +27,7 @@ icon_state = "rndmajordisk" custom_materials = list(/datum/material/iron=300, /datum/material/glass=100) -/obj/item/disk/tech_disk/major/Initialize() +/obj/item/disk/tech_disk/major/Initialize(mapload) . = ..() stored_research = new /datum/techweb/bepis @@ -36,7 +36,7 @@ desc = "A technology disk containing schematics for syndicate inspired equipment." custom_materials = null -/obj/item/disk/tech_disk/illegal/Initialize() +/obj/item/disk/tech_disk/illegal/Initialize(mapload) . = ..() stored_research = new /datum/techweb/syndicate @@ -45,6 +45,6 @@ desc = "You feel like it's not Gray because of its color." custom_materials = null -/obj/item/disk/tech_disk/abductor/Initialize() +/obj/item/disk/tech_disk/abductor/Initialize(mapload) . = ..() stored_research = new /datum/techweb/abductor diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index beb3561025..1794fd852b 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -18,7 +18,7 @@ var/temp_tolerance_high = T20C var/temp_penalty_coefficient = 0.5 //1 = -1 points per degree above high tolerance. 0.5 = -0.5 points per degree above high tolerance. -/obj/machinery/rnd/server/Initialize() +/obj/machinery/rnd/server/Initialize(mapload) . = ..() SSresearch.servers |= src stored_research = SSresearch.science_tech diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm index de0ebcb63a..c823799952 100644 --- a/code/modules/research/stock_parts.dm +++ b/code/modules/research/stock_parts.dm @@ -123,7 +123,7 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi var/rating = 1 rad_flags = RAD_NO_CONTAMINATE -/obj/item/stock_parts/Initialize() +/obj/item/stock_parts/Initialize(mapload) . = ..() pixel_x = rand(-5, 5) pixel_y = rand(-5, 5) diff --git a/code/modules/research/xenobiology/crossbreeding/__corecross.dm b/code/modules/research/xenobiology/crossbreeding/__corecross.dm index 17a6b77bfe..b37bbb59b6 100644 --- a/code/modules/research/xenobiology/crossbreeding/__corecross.dm +++ b/code/modules/research/xenobiology/crossbreeding/__corecross.dm @@ -37,7 +37,7 @@ To add a crossbreed: throw_speed = 3 throw_range = 6 -/obj/item/slimecross/Initialize() +/obj/item/slimecross/Initialize(mapload) . = ..() name = effect + " " + colour + " extract" var/itemcolor = "#FFFFFF" @@ -92,7 +92,7 @@ To add a crossbreed: var/del_on_empty = TRUE var/list/list_reagents -/obj/item/slimecrossbeaker/Initialize() +/obj/item/slimecrossbeaker/Initialize(mapload) . = ..() create_reagents(50, INJECTABLE | DRAWABLE) if(list_reagents) @@ -132,7 +132,7 @@ To add a crossbreed: var/ignore_flags = FALSE var/self_use_only = FALSE -/obj/item/slimecrossbeaker/autoinjector/Initialize() +/obj/item/slimecrossbeaker/autoinjector/Initialize(mapload) . = ..() reagents.reagents_holder_flags = DRAWABLE // Cannot be refilled, since it's basically an autoinjector! @@ -176,7 +176,7 @@ To add a crossbreed: color = "#DDAAAA" list_reagents = list(/datum/reagent/pax/peaceborg = 10, /datum/reagent/drug/space_drugs = 15) //Peace, dudes -/obj/item/slimecrossbeaker/autoinjector/peaceandlove/Initialize() +/obj/item/slimecrossbeaker/autoinjector/peaceandlove/Initialize(mapload) . = ..() reagents.reagents_holder_flags = NONE // It won't be *that* easy to get your hands on pax. diff --git a/code/modules/research/xenobiology/crossbreeding/_misc.dm b/code/modules/research/xenobiology/crossbreeding/_misc.dm index 97a87a5e01..255e6cd9f5 100644 --- a/code/modules/research/xenobiology/crossbreeding/_misc.dm +++ b/code/modules/research/xenobiology/crossbreeding/_misc.dm @@ -73,7 +73,7 @@ max_integrity = 100 armor = list("melee" = 30, "bullet" = 50, "laser" = -50, "energy" = -50, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = -80, "acid" = 30) -/obj/structure/ice_stasis/Initialize() +/obj/structure/ice_stasis/Initialize(mapload) . = ..() playsound(src, 'sound/magic/ethereal_exit.ogg', 50, 1) diff --git a/code/modules/research/xenobiology/crossbreeding/_weapons.dm b/code/modules/research/xenobiology/crossbreeding/_weapons.dm index 1b2f43c518..00748d2609 100644 --- a/code/modules/research/xenobiology/crossbreeding/_weapons.dm +++ b/code/modules/research/xenobiology/crossbreeding/_weapons.dm @@ -17,7 +17,7 @@ fire_sound = 'sound/effects/attackblob.ogg' total_mass = TOTAL_MASS_HAND_REPLACEMENT -/obj/item/gun/magic/bloodchill/Initialize() +/obj/item/gun/magic/bloodchill/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT) diff --git a/code/modules/research/xenobiology/crossbreeding/burning.dm b/code/modules/research/xenobiology/crossbreeding/burning.dm index 1a8b82232b..d76198ae24 100644 --- a/code/modules/research/xenobiology/crossbreeding/burning.dm +++ b/code/modules/research/xenobiology/crossbreeding/burning.dm @@ -9,7 +9,7 @@ Burning extracts: effect = "burning" icon_state = "burning" -/obj/item/slimecross/burning/Initialize() +/obj/item/slimecross/burning/Initialize(mapload) . = ..() create_reagents(10, INJECTABLE | DRAWABLE) diff --git a/code/modules/research/xenobiology/crossbreeding/charged.dm b/code/modules/research/xenobiology/crossbreeding/charged.dm index 75a15be9ce..a51adfffe6 100644 --- a/code/modules/research/xenobiology/crossbreeding/charged.dm +++ b/code/modules/research/xenobiology/crossbreeding/charged.dm @@ -10,7 +10,7 @@ Charged extracts: effect = "charged" icon_state = "charged" -/obj/item/slimecross/charged/Initialize() +/obj/item/slimecross/charged/Initialize(mapload) . = ..() create_reagents(10, INJECTABLE | DRAWABLE) diff --git a/code/modules/research/xenobiology/crossbreeding/chilling.dm b/code/modules/research/xenobiology/crossbreeding/chilling.dm index d117e6104c..7c129b8179 100644 --- a/code/modules/research/xenobiology/crossbreeding/chilling.dm +++ b/code/modules/research/xenobiology/crossbreeding/chilling.dm @@ -9,7 +9,7 @@ Chilling extracts: effect = "chilling" icon_state = "chilling" -/obj/item/slimecross/chilling/Initialize() +/obj/item/slimecross/chilling/Initialize(mapload) . = ..() create_reagents(10, INJECTABLE | DRAWABLE) diff --git a/code/modules/research/xenobiology/crossbreeding/consuming.dm b/code/modules/research/xenobiology/crossbreeding/consuming.dm index 8d80613be4..f69d1bd674 100644 --- a/code/modules/research/xenobiology/crossbreeding/consuming.dm +++ b/code/modules/research/xenobiology/crossbreeding/consuming.dm @@ -277,7 +277,7 @@ Consuming extracts: taste = "vanilla and " //Randomly selected color dye. var/colour = "#FFFFFF" -/obj/item/slime_cookie/pyrite/Initialize() +/obj/item/slime_cookie/pyrite/Initialize(mapload) . = ..() var/tastemessage = "paint remover" switch(rand(1,7)) diff --git a/code/modules/research/xenobiology/crossbreeding/industrial.dm b/code/modules/research/xenobiology/crossbreeding/industrial.dm index ac9d2e58c5..cc85486bad 100644 --- a/code/modules/research/xenobiology/crossbreeding/industrial.dm +++ b/code/modules/research/xenobiology/crossbreeding/industrial.dm @@ -19,7 +19,7 @@ Industrial extracts: /obj/item/slimecross/industrial/proc/do_after_spawn(obj/item/spawned) return -/obj/item/slimecross/industrial/Initialize() +/obj/item/slimecross/industrial/Initialize(mapload) . = ..() create_reagents(100, INJECTABLE | DRAWABLE) START_PROCESSING(SSobj,src) diff --git a/code/modules/research/xenobiology/crossbreeding/recurring.dm b/code/modules/research/xenobiology/crossbreeding/recurring.dm index 4a094744f7..4389801882 100644 --- a/code/modules/research/xenobiology/crossbreeding/recurring.dm +++ b/code/modules/research/xenobiology/crossbreeding/recurring.dm @@ -13,7 +13,7 @@ Recurring extracts: var/cooldown = 0 var/max_cooldown = 5 //In sets of 2 seconds. -/obj/item/slimecross/recurring/Initialize() +/obj/item/slimecross/recurring/Initialize(mapload) . = ..() extract = new extract_type(src.loc) visible_message("[src] wraps a layer of goo around itself!") diff --git a/code/modules/research/xenobiology/crossbreeding/regenerative.dm b/code/modules/research/xenobiology/crossbreeding/regenerative.dm index f871cac778..7f3d2ce791 100644 --- a/code/modules/research/xenobiology/crossbreeding/regenerative.dm +++ b/code/modules/research/xenobiology/crossbreeding/regenerative.dm @@ -178,7 +178,7 @@ Regenerative extracts: target.forceMove(T) do_sparks(5,FALSE,target) -/obj/item/slimecross/regenerative/bluespace/Initialize() +/obj/item/slimecross/regenerative/bluespace/Initialize(mapload) . = ..() T = get_turf(src) diff --git a/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm b/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm index a88b5cd35b..ae003d984f 100644 --- a/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm +++ b/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm @@ -14,7 +14,7 @@ Self-sustaining extracts: var/obj/item/slime_extract/extract //Just divides into the actual item. -/obj/item/slimecross/selfsustaining/Initialize() +/obj/item/slimecross/selfsustaining/Initialize(mapload) ..() visible_message("The [src] shudders, and splits into four smaller extracts.") for(var/i = 0, i < 4, i++) diff --git a/code/modules/research/xenobiology/crossbreeding/stabilized.dm b/code/modules/research/xenobiology/crossbreeding/stabilized.dm index 69bd2c7e28..2def0640a9 100644 --- a/code/modules/research/xenobiology/crossbreeding/stabilized.dm +++ b/code/modules/research/xenobiology/crossbreeding/stabilized.dm @@ -14,7 +14,7 @@ Stabilized extracts: var/datum/status_effect/linked_effect var/mob/living/owner -/obj/item/slimecross/stabilized/Initialize() +/obj/item/slimecross/stabilized/Initialize(mapload) . = ..() START_PROCESSING(SSobj,src) @@ -110,7 +110,7 @@ Stabilized extracts: mob_spawn_pets += T mob_type = pick(mob_spawn_pets) -/obj/item/slimecross/stabilized/gold/Initialize() +/obj/item/slimecross/stabilized/gold/Initialize(mapload) . = ..() generate_mobtype() diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm index ef9c751d57..bccc738398 100644 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ b/code/modules/research/xenobiology/xenobio_camera.dm @@ -5,7 +5,7 @@ icon_state = "generic_camera" var/allowed_area = null -/mob/camera/aiEye/remote/xenobio/Initialize() +/mob/camera/aiEye/remote/xenobio/Initialize(mapload) var/area/A = get_area(loc) allowed_area = A.name . = ..() @@ -41,7 +41,7 @@ light_color = LIGHT_COLOR_PINK -/obj/machinery/computer/camera_advanced/xenobio/Initialize() +/obj/machinery/computer/camera_advanced/xenobio/Initialize(mapload) . = ..() slime_place_action = new slime_up_action = new diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 9bf794a0a2..dd2579663a 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -36,7 +36,7 @@ qdel(O) ..() -/obj/item/slime_extract/Initialize() +/obj/item/slime_extract/Initialize(mapload) . = ..() create_reagents(100, INJECTABLE | DRAWABLE) diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm index e572f1ee02..93be0d1eed 100644 --- a/code/modules/ruins/lavaland_ruin_code.dm +++ b/code/modules/ruins/lavaland_ruin_code.dm @@ -7,7 +7,7 @@ /obj/item/disk/design_disk/adv/knight_gear name = "Magic Disk of Smithing" -/obj/item/disk/design_disk/adv/knight_gear/Initialize() +/obj/item/disk/design_disk/adv/knight_gear/Initialize(mapload) . = ..() var/datum/design/knight_armour/A = new var/datum/design/knight_helmet/H = new @@ -33,7 +33,7 @@ icon_state = "datadisk1" max_blueprints = 1 -/obj/item/disk/design_disk/plant_disk/Initialize() +/obj/item/disk/design_disk/plant_disk/Initialize(mapload) . = ..() var/datum/design/diskplantgene/P = new blueprints[1] = P @@ -46,7 +46,7 @@ icon_state = "datadisk1" max_blueprints = 1 -/obj/item/disk/design_disk/golem_shell/Initialize() +/obj/item/disk/design_disk/golem_shell/Initialize(mapload) . = ..() var/datum/design/golem_shell/G = new blueprints[1] = G @@ -160,7 +160,7 @@ important_info = "DO NOT abandon the base." outfit = /datum/outfit/lavaland_syndicate/comms -/obj/effect/mob_spawn/human/lavaland_syndicate/comms/space/Initialize() +/obj/effect/mob_spawn/human/lavaland_syndicate/comms/space/Initialize(mapload) . = ..() if(prob(90)) //only has a 10% chance of existing, otherwise it'll just be a NPC syndie. new /mob/living/simple_animal/hostile/syndicate/ranged(get_turf(src)) @@ -172,7 +172,7 @@ mask = /obj/item/clothing/mask/chameleon/gps suit = /obj/item/clothing/suit/armor/vest -/obj/item/clothing/mask/chameleon/gps/Initialize() +/obj/item/clothing/mask/chameleon/gps/Initialize(mapload) . = ..() new /obj/item/gps/internal/lavaland_syndicate_base(src) diff --git a/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm b/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm index d9dfdd8c19..0fa7670fb2 100644 --- a/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm +++ b/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm @@ -39,7 +39,7 @@ slowdown = 0.5 floor_variance = 30 -/turf/open/floor/plating/asteroid/basalt/wasteland/Initialize() +/turf/open/floor/plating/asteroid/basalt/wasteland/Initialize(mapload) .=..() if(prob(floor_variance)) icon_state = "[environment_type][rand(0,6)]" @@ -68,7 +68,7 @@ icon_state = "puddle-oil" dispensedreagent = /datum/reagent/oil -/obj/structure/sink/oil_well/Initialize() +/obj/structure/sink/oil_well/Initialize(mapload) .=..() create_reagents(20) reagents.add_reagent(dispensedreagent, 20) diff --git a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm index d62b3c2611..e85c9d39f0 100644 --- a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm +++ b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm @@ -26,7 +26,7 @@ var/uses var/ashwalker_only = FALSE -/obj/structure/necropolis_gate/Initialize() +/obj/structure/necropolis_gate/Initialize(mapload) . = ..() setDir(SOUTH) var/turf/sight_blocker_turf = get_turf(src) @@ -155,7 +155,7 @@ GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate) desc = "A tremendous, impossibly large gateway, set into a massive tower of stone." sight_blocker_distance = 2 -/obj/structure/necropolis_gate/legion_gate/Initialize() +/obj/structure/necropolis_gate/legion_gate/Initialize(mapload) . = ..() GLOB.necropolis_gate = src @@ -228,7 +228,7 @@ GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate) var/open = FALSE var/static/mutable_appearance/top_overlay -/obj/structure/necropolis_arch/Initialize() +/obj/structure/necropolis_arch/Initialize(mapload) . = ..() icon_state = "arch_bottom" top_overlay = mutable_appearance('icons/effects/160x160.dmi', "arch_top") diff --git a/code/modules/ruins/objects_and_mobs/sin_ruins.dm b/code/modules/ruins/objects_and_mobs/sin_ruins.dm index 5e2fc3d7e4..b80df40488 100644 --- a/code/modules/ruins/objects_and_mobs/sin_ruins.dm +++ b/code/modules/ruins/objects_and_mobs/sin_ruins.dm @@ -48,7 +48,7 @@ anchored = FALSE density = TRUE -/obj/structure/cursed_money/Initialize() +/obj/structure/cursed_money/Initialize(mapload) . = ..() addtimer(CALLBACK(src, .proc/collapse), 600) diff --git a/code/modules/ruins/spaceruin_code/caravanambush.dm b/code/modules/ruins/spaceruin_code/caravanambush.dm index ab38ed8e4d..b347c66dbe 100644 --- a/code/modules/ruins/spaceruin_code/caravanambush.dm +++ b/code/modules/ruins/spaceruin_code/caravanambush.dm @@ -53,7 +53,7 @@ shuttleId = "caravantrade1" possible_destinations = "whiteship_away;whiteship_home;whiteship_z4;whiteship_lavaland;caravantrade1_custom;caravantrade1_ambush" -/obj/machinery/computer/camera_advanced/shuttle_docker/caravan/Initialize() +/obj/machinery/computer/camera_advanced/shuttle_docker/caravan/Initialize(mapload) . = ..() GLOB.jam_on_wardec += src diff --git a/code/modules/ruins/spaceruin_code/clericsden.dm b/code/modules/ruins/spaceruin_code/clericsden.dm index 3fe4cad794..63f85c3291 100644 --- a/code/modules/ruins/spaceruin_code/clericsden.dm +++ b/code/modules/ruins/spaceruin_code/clericsden.dm @@ -4,7 +4,7 @@ /obj/item/disk/design_disk/adv/cleric_mace name = "Enshrined Disc of Smiting" -/obj/item/disk/design_disk/adv/cleric_mace/Initialize() +/obj/item/disk/design_disk/adv/cleric_mace/Initialize(mapload) . = ..() var/datum/design/cleric_mace/M = new blueprints[1] = M diff --git a/code/modules/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/ruins/spaceruin_code/hilbertshotel.dm index 4a03844a33..79119c8448 100644 --- a/code/modules/ruins/spaceruin_code/hilbertshotel.dm +++ b/code/modules/ruins/spaceruin_code/hilbertshotel.dm @@ -18,7 +18,7 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337) var/ruinSpawned = FALSE var/mysteryRoom -/obj/item/hilbertshotel/Initialize() +/obj/item/hilbertshotel/Initialize(mapload) . = ..() //Load templates INVOKE_ASYNC(src, .proc/prepare_rooms) @@ -478,7 +478,7 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337) /obj/item/paper/crumpled/docslogs name = "Research Logs" -/obj/item/paper/crumpled/docslogs/Initialize() +/obj/item/paper/crumpled/docslogs/Initialize(mapload) . = ..() GLOB.hhmysteryRoomNumber = rand(1, SHORT_REAL_LIMIT) info = {" diff --git a/code/modules/security_levels/keycard_authentication.dm b/code/modules/security_levels/keycard_authentication.dm index 7326cad816..562dc17182 100644 --- a/code/modules/security_levels/keycard_authentication.dm +++ b/code/modules/security_levels/keycard_authentication.dm @@ -26,7 +26,7 @@ GLOBAL_DATUM_INIT(keycard_events, /datum/events, new) var/obj/item/card/id/first_id = null var/waiting = 0 -/obj/machinery/keycard_auth/Initialize() +/obj/machinery/keycard_auth/Initialize(mapload) . = ..() ev = GLOB.keycard_events.addEvent("triggerEvent", CALLBACK(src, .proc/triggerEvent)) diff --git a/code/modules/shuttle/custom_shuttle.dm b/code/modules/shuttle/custom_shuttle.dm index e9a5ca4688..e8e5fe8d4d 100644 --- a/code/modules/shuttle/custom_shuttle.dm +++ b/code/modules/shuttle/custom_shuttle.dm @@ -235,7 +235,7 @@ designate_time = 100 circuit = /obj/item/circuitboard/computer/shuttle/docker -/obj/machinery/computer/camera_advanced/shuttle_docker/custom/Initialize() +/obj/machinery/computer/camera_advanced/shuttle_docker/custom/Initialize(mapload) . = ..() GLOB.jam_on_wardec += src diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 2a15558e64..d4e6f3e050 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -630,7 +630,7 @@ height = 8 dir = EAST -/obj/docking_port/mobile/emergency/backup/Initialize() +/obj/docking_port/mobile/emergency/backup/Initialize(mapload) // We want to be a valid emergency shuttle // but not be the main one, keep whatever's set // valid. diff --git a/code/modules/shuttle/navigation_computer.dm b/code/modules/shuttle/navigation_computer.dm index 029d50585a..c02405fc3f 100644 --- a/code/modules/shuttle/navigation_computer.dm +++ b/code/modules/shuttle/navigation_computer.dm @@ -22,7 +22,7 @@ var/turf/designating_target_loc var/jammed = FALSE -/obj/machinery/computer/camera_advanced/shuttle_docker/Initialize() +/obj/machinery/computer/camera_advanced/shuttle_docker/Initialize(mapload) . = ..() GLOB.navigation_computers += src whitelist_turfs = typecacheof(whitelist_turfs) diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index d3e52410d6..376a253379 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -281,7 +281,7 @@ var/area/shuttle/transit/assigned_area var/obj/docking_port/mobile/owner -/obj/docking_port/stationary/transit/Initialize() +/obj/docking_port/stationary/transit/Initialize(mapload) . = ..() SSshuttle.transit += src diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator.dm index b9374a09c4..d04b27d52e 100644 --- a/code/modules/shuttle/shuttle_creation/shuttle_creator.dm +++ b/code/modules/shuttle/shuttle_creation/shuttle_creator.dm @@ -39,7 +39,7 @@ GLOBAL_LIST_EMPTY(custom_shuttle_machines) //Machines that require updating (He //After designation var/linkedShuttleId -/obj/item/shuttle_creator/Initialize() +/obj/item/shuttle_creator/Initialize(mapload) . = ..() internal_shuttle_creator = new() internal_shuttle_creator.owner_rsd = src diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator_eye.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator_eye.dm index ff96e2ae65..2bbe7d7407 100644 --- a/code/modules/shuttle/shuttle_creation/shuttle_creator_eye.dm +++ b/code/modules/shuttle/shuttle_creation/shuttle_creator_eye.dm @@ -8,7 +8,7 @@ var/turf/source_turf var/max_range = 12 -/mob/camera/aiEye/remote/shuttle_creation/Initialize() +/mob/camera/aiEye/remote/shuttle_creation/Initialize(mapload) . = ..() setLoc(get_turf(source_turf)) diff --git a/code/modules/shuttle/spaceship_navigation_beacon.dm b/code/modules/shuttle/spaceship_navigation_beacon.dm index dbf81d791e..e3232ec904 100644 --- a/code/modules/shuttle/spaceship_navigation_beacon.dm +++ b/code/modules/shuttle/spaceship_navigation_beacon.dm @@ -17,7 +17,7 @@ var/locked = FALSE //Locked beacons don't allow to jump to it. -/obj/machinery/spaceship_navigation_beacon/Initialize() +/obj/machinery/spaceship_navigation_beacon/Initialize(mapload) . = ..() SSshuttle.beacons |= src diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm index 05450fd7c2..1e9bc45c35 100644 --- a/code/modules/shuttle/special.dm +++ b/code/modules/shuttle/special.dm @@ -15,7 +15,7 @@ var/list/active_tables = list() var/tables_required = 2 -/obj/machinery/power/emitter/energycannon/magical/Initialize() +/obj/machinery/power/emitter/energycannon/magical/Initialize(mapload) . = ..() if(prob(50)) desc = "Oh no, not again." @@ -144,7 +144,7 @@ unique_name = FALSE // disables the (123) number suffix initial_language_holder = /datum/language_holder/universal -/mob/living/simple_animal/drone/snowflake/bardrone/Initialize() +/mob/living/simple_animal/drone/snowflake/bardrone/Initialize(mapload) . = ..() access_card.access |= ACCESS_CENT_BAR @@ -159,7 +159,7 @@ stop_automated_movement = TRUE initial_language_holder = /datum/language_holder/universal -/mob/living/simple_animal/hostile/alien/maid/barmaid/Initialize() +/mob/living/simple_animal/hostile/alien/maid/barmaid/Initialize(mapload) . = ..() access_card = new /obj/item/card/id(src) var/datum/job/captain/C = new /datum/job/captain diff --git a/code/modules/shuttle/white_ship.dm b/code/modules/shuttle/white_ship.dm index 66146edea1..20a39ed1fb 100644 --- a/code/modules/shuttle/white_ship.dm +++ b/code/modules/shuttle/white_ship.dm @@ -41,7 +41,7 @@ y_offset = 0 designate_time = 0 -/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship/Initialize() +/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship/Initialize(mapload) . = ..() GLOB.jam_on_wardec += src diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm index 9dffc883d4..197b39272d 100644 --- a/code/modules/smithing/anvil.dm +++ b/code/modules/smithing/anvil.dm @@ -68,7 +68,7 @@ RECIPE_GLAIVE = /obj/item/smithing/glaivehead, RECIPE_PIKE = /obj/item/smithing/pikehead) -/obj/structure/anvil/Initialize() +/obj/structure/anvil/Initialize(mapload) ..() currentquality = anvilquality diff --git a/code/modules/smithing/finished_items.dm b/code/modules/smithing/finished_items.dm index 27be8c034d..97618df8fc 100644 --- a/code/modules/smithing/finished_items.dm +++ b/code/modules/smithing/finished_items.dm @@ -18,7 +18,7 @@ var/wielded_mult = 1 var/wield_force = 15 -/obj/item/melee/smith/Initialize() +/obj/item/melee/smith/Initialize(mapload) ..() if(desc == "cringe") desc = "A handmade [name]." @@ -55,7 +55,7 @@ icon_state = "minipick" //todo:sprite sharpness = SHARP_POINTY//it doesnt have a blade it has a point -/obj/item/mining_scanner/prospector/Initialize() +/obj/item/mining_scanner/prospector/Initialize(mapload) ..() var/mutable_appearance/overlay desc = "A handmade [name]." @@ -73,7 +73,7 @@ icon_state = "pickaxe" sharpness = SHARP_POINTY -/obj/item/pickaxe/smithed/Initialize() +/obj/item/pickaxe/smithed/Initialize(mapload) ..() desc = "A handmade [name]." var/mutable_appearance/overlay @@ -94,7 +94,7 @@ icon_state = "shovel" sharpness = SHARP_EDGED //it cuts through the earth -/obj/item/shovel/smithed/Initialize() +/obj/item/shovel/smithed/Initialize(mapload) ..() desc = "A handmade [name]." var/mutable_appearance/overlay diff --git a/code/modules/smithing/furnace.dm b/code/modules/smithing/furnace.dm index ee1d6a1b93..70bff32030 100644 --- a/code/modules/smithing/furnace.dm +++ b/code/modules/smithing/furnace.dm @@ -10,7 +10,7 @@ var/fueluse = 1 -/obj/structure/furnace/Initialize() +/obj/structure/furnace/Initialize(mapload) ..() create_reagents(250, TRANSPARENT) START_PROCESSING(SSobj, src) diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm index 2272a14612..b740cca114 100644 --- a/code/modules/spells/spell.dm +++ b/code/modules/spells/spell.dm @@ -15,7 +15,7 @@ var/action_background_icon_state = "bg_spell" var/base_action = /datum/action/spell_action -/obj/effect/proc_holder/Initialize() +/obj/effect/proc_holder/Initialize(mapload) . = ..() if(has_action) action = new base_action(src) @@ -144,7 +144,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th action_background_icon_state = "bg_spell" base_action = /datum/action/spell_action/spell -/obj/effect/proc_holder/spell/Initialize() +/obj/effect/proc_holder/spell/Initialize(mapload) . = ..() if(mobs_whitelist) mobs_whitelist = typecacheof(mobs_whitelist) @@ -204,7 +204,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th /obj/effect/proc_holder/spell/proc/playMagSound() playsound(get_turf(usr), sound,50,1) -/obj/effect/proc_holder/spell/Initialize() +/obj/effect/proc_holder/spell/Initialize(mapload) . = ..() START_PROCESSING(SSfastprocess, src) diff --git a/code/modules/spells/spell_types/godhand.dm b/code/modules/spells/spell_types/godhand.dm index fe53fd37e4..073f96d498 100644 --- a/code/modules/spells/spell_types/godhand.dm +++ b/code/modules/spells/spell_types/godhand.dm @@ -15,7 +15,7 @@ throw_speed = 0 var/charges = 1 -/obj/item/melee/touch_attack/Initialize() +/obj/item/melee/touch_attack/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) diff --git a/code/modules/spells/spell_types/trigger.dm b/code/modules/spells/spell_types/trigger.dm index df579d9243..4a48c868b8 100644 --- a/code/modules/spells/spell_types/trigger.dm +++ b/code/modules/spells/spell_types/trigger.dm @@ -4,7 +4,7 @@ var/list/linked_spells = list() //those are just referenced by the trigger spell and are unaffected by it directly var/list/starting_spells = list() //those are added on New() to contents from default spells and are deleted when the trigger spell is deleted to prevent memory leaks -/obj/effect/proc_holder/spell/pointed/trigger/Initialize() +/obj/effect/proc_holder/spell/pointed/trigger/Initialize(mapload) . = ..() for(var/spell in starting_spells) var/spell_to_add = text2path(spell) diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm index 69f2d5454e..297f918c6f 100644 --- a/code/modules/station_goals/dna_vault.dm +++ b/code/modules/station_goals/dna_vault.dm @@ -145,7 +145,7 @@ var/list/obj/structure/fillers = list() -/obj/machinery/dna_vault/Initialize() +/obj/machinery/dna_vault/Initialize(mapload) //TODO: Replace this,bsa and gravgen with some big machinery datum var/list/occupied = list() for(var/direct in list(EAST,WEST,SOUTHEAST,SOUTHWEST)) diff --git a/code/modules/station_goals/shield.dm b/code/modules/station_goals/shield.dm index e317820e7d..f17af626a1 100644 --- a/code/modules/station_goals/shield.dm +++ b/code/modules/station_goals/shield.dm @@ -95,7 +95,7 @@ var/static/gid = 0 var/id = 0 -/obj/machinery/satellite/Initialize() +/obj/machinery/satellite/Initialize(mapload) . = ..() id = gid++ diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm index 0d2659dff8..998473abe3 100644 --- a/code/modules/surgery/organs/augments_arms.dm +++ b/code/modules/surgery/organs/augments_arms.dm @@ -14,7 +14,7 @@ var/obj/item/holder = null // You can use this var for item path, it would be converted into an item on New() -/obj/item/organ/cyberimp/arm/Initialize() +/obj/item/organ/cyberimp/arm/Initialize(mapload) . = ..() if(ispath(holder)) holder = new holder(src) @@ -242,7 +242,7 @@ desc = "An integrated projector mounted onto a user's arm that is able to be used as a powerful flash." contents = newlist(/obj/item/assembly/flash/armimplant) -/obj/item/organ/cyberimp/arm/flash/Initialize() +/obj/item/organ/cyberimp/arm/flash/Initialize(mapload) . = ..() if(locate(/obj/item/assembly/flash/armimplant) in items_list) var/obj/item/assembly/flash/armimplant/F = locate(/obj/item/assembly/flash/armimplant) in items_list @@ -258,7 +258,7 @@ desc = "A powerful cybernetic implant that contains combat modules built into the user's arm." contents = newlist(/obj/item/melee/transforming/energy/blade/hardlight, /obj/item/gun/medbeam, /obj/item/borg/stun, /obj/item/assembly/flash/armimplant) -/obj/item/organ/cyberimp/arm/combat/Initialize() +/obj/item/organ/cyberimp/arm/combat/Initialize(mapload) . = ..() if(locate(/obj/item/assembly/flash/armimplant) in items_list) var/obj/item/assembly/flash/armimplant/F = locate(/obj/item/assembly/flash/armimplant) in items_list diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 06865a0f39..526285f60d 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -246,7 +246,7 @@ var/obj/effect/abstract/eye_lighting/on_mob var/image/mob_overlay -/obj/item/organ/eyes/robotic/glow/Initialize() +/obj/item/organ/eyes/robotic/glow/Initialize(mapload) . = ..() mob_overlay = image('icons/mob/human_face.dmi', "eyes_glow_gs") @@ -407,7 +407,7 @@ mouse_opacity = MOUSE_OPACITY_TRANSPARENT var/obj/item/organ/eyes/robotic/glow/parent -/obj/effect/abstract/eye_lighting/Initialize() +/obj/effect/abstract/eye_lighting/Initialize(mapload) . = ..() parent = loc if(!istype(parent)) diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 05f3f06b06..d4a2663374 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -31,7 +31,7 @@ var/useable = TRUE var/list/food_reagents = list(/datum/reagent/consumable/nutriment = 5) -/obj/item/organ/Initialize() +/obj/item/organ/Initialize(mapload) . = ..() if(organ_flags & ORGAN_EDIBLE) AddComponent(/datum/component/edible, food_reagents, null, RAW | MEAT | GROSS, null, 10, null, null, null, CALLBACK(src, .proc/OnEatFrom)) @@ -359,7 +359,7 @@ name = "Illegal organ" desc = "Something hecked up" -/obj/item/organ/random/Initialize() +/obj/item/organ/random/Initialize(mapload) ..() var/list = list(/obj/item/organ/tongue, /obj/item/organ/brain, /obj/item/organ/heart, /obj/item/organ/liver, /obj/item/organ/ears, /obj/item/organ/eyes, /obj/item/organ/tail, /obj/item/organ/stomach) var/newtype = pick(list) diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 0ba265c36c..b281132ce0 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -168,7 +168,7 @@ var/phomeme_type = "sans" var/list/phomeme_types = list(/datum/accent/span/sans, /datum/accent/span/papyrus) -/obj/item/organ/tongue/bone/Initialize() +/obj/item/organ/tongue/bone/Initialize(mapload) initial_accents += pick(phomeme_types) . = ..() diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 0ffae2bb7d..06415e7685 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -147,7 +147,7 @@ icon_state = "datadisk1" custom_materials = list(/datum/material/iron=300, /datum/material/glass=100) -/obj/item/disk/surgery/debug/Initialize() +/obj/item/disk/surgery/debug/Initialize(mapload) . = ..() surgeries = list() var/list/req_tech_surgeries = subtypesof(/datum/surgery) diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index 1d2286214d..4161ed1f70 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -160,7 +160,7 @@ icon_state = "surgicaldrill_a" hitsound = 'sound/items/welder.ogg' -/obj/item/surgicaldrill/advanced/Initialize() +/obj/item/surgicaldrill/advanced/Initialize(mapload) . = ..() set_light(1) @@ -214,7 +214,7 @@ toolspeed = 1 bare_wound_bonus = 20 -/obj/item/scalpel/Initialize() +/obj/item/scalpel/Initialize(mapload) . = ..() AddComponent(/datum/component/butchering, 80 * toolspeed, 100, 0) @@ -235,7 +235,7 @@ light_color = LIGHT_COLOR_GREEN sharpness = SHARP_POINTY -/obj/item/scalpel/advanced/Initialize() +/obj/item/scalpel/advanced/Initialize(mapload) . = ..() set_light(1) @@ -311,7 +311,7 @@ wound_bonus = 5 bare_wound_bonus = 10 -/obj/item/circular_saw/Initialize() +/obj/item/circular_saw/Initialize(mapload) . = ..() AddComponent(/datum/component/butchering, 40 * toolspeed, 100, 5, 'sound/weapons/circsawhit.ogg') //saws are very accurate and fast at butchering diff --git a/code/modules/tcg/cards.dm b/code/modules/tcg/cards.dm index f5c7c47aaf..7717a44410 100644 --- a/code/modules/tcg/cards.dm +++ b/code/modules/tcg/cards.dm @@ -353,7 +353,7 @@ material_flags = NONE sideslist = list("nanotrasen", "syndicate") -/obj/item/coin/thunderdome/Initialize() +/obj/item/coin/thunderdome/Initialize(mapload) . = ..() transform = matrix(0.5,0,0,0,0.5,0) @@ -377,7 +377,7 @@ var/static/radial_shuffle = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_shuffle") var/static/radial_pickup = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_pickup") -/obj/item/tcgcard_deck/Initialize() +/obj/item/tcgcard_deck/Initialize(mapload) . = ..() LoadComponent(/datum/component/storage/concrete/tcg) @@ -669,7 +669,7 @@ card.forceMove(src) cards.Add(card) -/obj/item/tcgcard_binder/full/Initialize() //For admemes. +/obj/item/tcgcard_binder/full/Initialize(mapload) //For admemes. . = ..() for(var/cardtype in subtypesof(/datum/tcg_card)) var/obj/item/tcg_card/card = new(get_turf(src), cardtype) diff --git a/code/modules/uplink/uplink_devices.dm b/code/modules/uplink/uplink_devices.dm index 9660718bb6..54b4035acb 100644 --- a/code/modules/uplink/uplink_devices.dm +++ b/code/modules/uplink/uplink_devices.dm @@ -52,7 +52,7 @@ /obj/item/uplink/nuclear_restricted uplink_flag = UPLINK_NUKE_OPS -/obj/item/uplink/nuclear_restricted/Initialize() +/obj/item/uplink/nuclear_restricted/Initialize(mapload) . = ..() var/datum/component/uplink/hidden_uplink = GetComponent(/datum/component/uplink) hidden_uplink.allow_restricted = FALSE diff --git a/code/modules/vehicles/atv.dm b/code/modules/vehicles/atv.dm index d5ddfe63cc..cb32b11083 100644 --- a/code/modules/vehicles/atv.dm +++ b/code/modules/vehicles/atv.dm @@ -6,7 +6,7 @@ key_type = /obj/item/key var/static/mutable_appearance/atvcover -/obj/vehicle/ridden/atv/Initialize() +/obj/vehicle/ridden/atv/Initialize(mapload) . = ..() var/datum/component/riding/D = LoadComponent(/datum/component/riding) D.vehicle_move_delay = CONFIG_GET(number/movedelay/run_delay) @@ -34,7 +34,7 @@ scan_range = 7 density = FALSE -/obj/vehicle/ridden/atv/turret/Initialize() +/obj/vehicle/ridden/atv/turret/Initialize(mapload) . = ..() turret = new(loc) turret.base = src diff --git a/code/modules/vehicles/bicycle.dm b/code/modules/vehicles/bicycle.dm index 3784f4d459..2fbe20a75f 100644 --- a/code/modules/vehicles/bicycle.dm +++ b/code/modules/vehicles/bicycle.dm @@ -8,7 +8,7 @@ 'sound/misc/bike2.mid', 'sound/misc/bike3.mid') -/obj/vehicle/ridden/bicycle/Initialize() +/obj/vehicle/ridden/bicycle/Initialize(mapload) . = ..() var/datum/component/riding/D = LoadComponent(/datum/component/riding) D.set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, 4), TEXT_SOUTH = list(0, 4), TEXT_EAST = list(0, 4), TEXT_WEST = list( 0, 4))) diff --git a/code/modules/vehicles/cars/car.dm b/code/modules/vehicles/cars/car.dm index 0196abe82c..81b2db6cf8 100644 --- a/code/modules/vehicles/cars/car.dm +++ b/code/modules/vehicles/cars/car.dm @@ -8,7 +8,7 @@ var/engine_sound_length = 20 //Set this to the length of the engine sound var/escape_time = 200 //Time it takes to break out of the car -/obj/vehicle/sealed/car/Initialize() +/obj/vehicle/sealed/car/Initialize(mapload) . = ..() LoadComponent(/datum/component/riding) diff --git a/code/modules/vehicles/cars/clowncar.dm b/code/modules/vehicles/cars/clowncar.dm index f65df26488..f8aa8177ca 100644 --- a/code/modules/vehicles/cars/clowncar.dm +++ b/code/modules/vehicles/cars/clowncar.dm @@ -20,7 +20,7 @@ var/cannonmode = CLOWN_CANNON_INACTIVE var/light_on = TRUE -/obj/vehicle/sealed/car/clowncar/Initialize() +/obj/vehicle/sealed/car/clowncar/Initialize(mapload) . = ..() START_PROCESSING(SSobj,src) @@ -246,7 +246,7 @@ key_type = null explode_on_death = FALSE -/obj/vehicle/sealed/car/clowncar/twitch_plays/Initialize() +/obj/vehicle/sealed/car/clowncar/twitch_plays/Initialize(mapload) . = ..() AddComponent(/datum/component/twitch_plays/simple_movement) GLOB.poi_list |= src diff --git a/code/modules/vehicles/lavaboat.dm b/code/modules/vehicles/lavaboat.dm index 32f53a15aa..3d83c48633 100644 --- a/code/modules/vehicles/lavaboat.dm +++ b/code/modules/vehicles/lavaboat.dm @@ -9,7 +9,7 @@ resistance_flags = LAVA_PROOF | FIRE_PROOF can_buckle = TRUE -/obj/vehicle/ridden/lavaboat/Initialize() +/obj/vehicle/ridden/lavaboat/Initialize(mapload) . = ..() var/datum/component/riding/D = LoadComponent(/datum/component/riding) D.keytype = /obj/item/oar @@ -61,7 +61,7 @@ desc = "This boat moves where you will it, without the need for an oar." icon_state = "dragon_boat" -/obj/vehicle/ridden/lavaboat/dragon/Initialize() +/obj/vehicle/ridden/lavaboat/dragon/Initialize(mapload) . = ..() var/datum/component/riding/D = LoadComponent(/datum/component/riding) D.vehicle_move_delay = 1 diff --git a/code/modules/vehicles/ridden.dm b/code/modules/vehicles/ridden.dm index f71d9367d3..810f7f8c80 100644 --- a/code/modules/vehicles/ridden.dm +++ b/code/modules/vehicles/ridden.dm @@ -7,7 +7,7 @@ var/legs_required = 1 var/arms_required = 0 //why not? -/obj/vehicle/ridden/Initialize() +/obj/vehicle/ridden/Initialize(mapload) . = ..() LoadComponent(/datum/component/riding) diff --git a/code/modules/vehicles/scooter.dm b/code/modules/vehicles/scooter.dm index d4a87a0f1e..13a614449a 100644 --- a/code/modules/vehicles/scooter.dm +++ b/code/modules/vehicles/scooter.dm @@ -3,7 +3,7 @@ desc = "A fun way to get around." icon_state = "scooter" -/obj/vehicle/ridden/scooter/Initialize() +/obj/vehicle/ridden/scooter/Initialize(mapload) . = ..() var/datum/component/riding/D = LoadComponent(/datum/component/riding) D.set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0), TEXT_SOUTH = list(-2), TEXT_EAST = list(0), TEXT_WEST = list( 2))) @@ -57,7 +57,7 @@ ///Stamina drain multiplier var/instability = 10 -/obj/vehicle/ridden/scooter/skateboard/Initialize() +/obj/vehicle/ridden/scooter/skateboard/Initialize(mapload) . = ..() var/datum/component/riding/D = LoadComponent(/datum/component/riding) D.vehicle_move_delay = 1 @@ -253,7 +253,7 @@ icon = null density = FALSE -/obj/vehicle/ridden/scooter/wheelys/Initialize() +/obj/vehicle/ridden/scooter/wheelys/Initialize(mapload) . = ..() var/datum/component/riding/D = LoadComponent(/datum/component/riding) D.vehicle_move_delay = 1 diff --git a/code/modules/vehicles/secway.dm b/code/modules/vehicles/secway.dm index 8ad8b5f1ee..6f03605605 100644 --- a/code/modules/vehicles/secway.dm +++ b/code/modules/vehicles/secway.dm @@ -12,7 +12,7 @@ var/last_tick = 0 var/list/progressbars_by_rider = list() -/obj/vehicle/ridden/secway/Initialize() +/obj/vehicle/ridden/secway/Initialize(mapload) . = ..() var/datum/component/riding/D = LoadComponent(/datum/component/riding) D.vehicle_move_delay = 1 diff --git a/code/modules/vehicles/speedbike.dm b/code/modules/vehicles/speedbike.dm index a560cbb8f3..d0b9c1fe96 100644 --- a/code/modules/vehicles/speedbike.dm +++ b/code/modules/vehicles/speedbike.dm @@ -2,7 +2,7 @@ /obj/vehicle/ridden/space name = "Generic Space Vehicle!" -/obj/vehicle/ridden/space/Initialize() +/obj/vehicle/ridden/space/Initialize(mapload) . = ..() var/datum/component/riding/D = LoadComponent(/datum/component/riding) D.override_allow_spacemove = TRUE @@ -15,7 +15,7 @@ var/overlay_state = "cover_blue" var/mutable_appearance/overlay -/obj/vehicle/ridden/space/speedbike/Initialize() +/obj/vehicle/ridden/space/speedbike/Initialize(mapload) . = ..() overlay = mutable_appearance(icon, overlay_state, ABOVE_MOB_LAYER) add_overlay(overlay) @@ -50,7 +50,7 @@ pixel_y = -48 pixel_x = -48 -/obj/vehicle/ridden/space/speedwagon/Initialize() +/obj/vehicle/ridden/space/speedwagon/Initialize(mapload) . = ..() add_overlay(overlay) var/datum/component/riding/D = LoadComponent(/datum/component/riding) diff --git a/code/modules/vehicles/wheelchair.dm b/code/modules/vehicles/wheelchair.dm index 28145ba8e1..3530b454d0 100644 --- a/code/modules/vehicles/wheelchair.dm +++ b/code/modules/vehicles/wheelchair.dm @@ -12,7 +12,7 @@ arms_required = 1 var/override_movespeed = FALSE -/obj/vehicle/ridden/wheelchair/Initialize() +/obj/vehicle/ridden/wheelchair/Initialize(mapload) . = ..() var/datum/component/riding/D = LoadComponent(/datum/component/riding) D.vehicle_move_delay = 0 diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index f1fbb95ff2..5a6c7c973f 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -171,7 +171,7 @@ payment_department = ACCOUNT_SRV light_mask="theater-light-mask" -/obj/machinery/vending/autodrobe/Initialize() +/obj/machinery/vending/autodrobe/Initialize(mapload) . = ..() cost_multiplier_per_dept = list("[ACCESS_THEATRE]" = 0) diff --git a/code/modules/vending/boozeomat.dm b/code/modules/vending/boozeomat.dm index df57dadd2e..c3e5f6ce0e 100644 --- a/code/modules/vending/boozeomat.dm +++ b/code/modules/vending/boozeomat.dm @@ -79,7 +79,7 @@ age_restrictions = FALSE payment_department = NO_FREEBIES -/obj/machinery/vending/boozeomat/syndicate_access/Initialize() +/obj/machinery/vending/boozeomat/syndicate_access/Initialize(mapload) . = ..() cost_multiplier_per_dept = list("[ACCESS_SYNDICATE]" = 0) diff --git a/code/modules/vending/cigarette.dm b/code/modules/vending/cigarette.dm index 269e0aaa7b..e5655ac9e0 100644 --- a/code/modules/vending/cigarette.dm +++ b/code/modules/vending/cigarette.dm @@ -37,7 +37,7 @@ /obj/item/lighter/greyscale = 4, /obj/item/storage/fancy/rollingpapers = 5) -/obj/machinery/vending/cigarette/syndicate/Initialize() +/obj/machinery/vending/cigarette/syndicate/Initialize(mapload) . = ..() cost_multiplier_per_dept = list("[ACCESS_SYNDICATE]" = 0) diff --git a/code/modules/vending/cola.dm b/code/modules/vending/cola.dm index 6bc5b9cb93..f60c3fc2fa 100644 --- a/code/modules/vending/cola.dm +++ b/code/modules/vending/cola.dm @@ -36,7 +36,7 @@ icon_state = "random_cola" desc = "Uh oh!" -/obj/machinery/vending/cola/random/Initialize() +/obj/machinery/vending/cola/random/Initialize(mapload) ..() var/T = pick(subtypesof(/obj/machinery/vending/cola) - /obj/machinery/vending/cola/random) new T(loc) diff --git a/code/modules/vending/snack.dm b/code/modules/vending/snack.dm index edd4802dc2..efb6670496 100644 --- a/code/modules/vending/snack.dm +++ b/code/modules/vending/snack.dm @@ -41,7 +41,7 @@ icon_state = "random_snack" desc = "Uh oh!" -/obj/machinery/vending/snack/random/Initialize() +/obj/machinery/vending/snack/random/Initialize(mapload) ..() var/T = pick(subtypesof(/obj/machinery/vending/snack) - /obj/machinery/vending/snack/random) new T(loc) diff --git a/code/modules/vore/eating/belly_obj.dm b/code/modules/vore/eating/belly_obj.dm index 474c912c23..3d8870d41a 100644 --- a/code/modules/vore/eating/belly_obj.dm +++ b/code/modules/vore/eating/belly_obj.dm @@ -147,7 +147,7 @@ //ommitted list // "shrink_grow_size", -/obj/belly/Initialize() +/obj/belly/Initialize(mapload) . = ..() take_ownership(src.loc) diff --git a/code/modules/wiremod/components/abstract/compare.dm b/code/modules/wiremod/components/abstract/compare.dm index ef6ba171b7..7523b7801a 100644 --- a/code/modules/wiremod/components/abstract/compare.dm +++ b/code/modules/wiremod/components/abstract/compare.dm @@ -21,7 +21,7 @@ var/list/datum/port/input/compare_ports = list() -/obj/item/circuit_component/compare/Initialize() +/obj/item/circuit_component/compare/Initialize(mapload) . = ..() for(var/port_id in 1 to input_port_amount) var/letter = ascii2text(text2ascii("A") + (port_id-1)) diff --git a/code/modules/wiremod/components/abstract/module.dm b/code/modules/wiremod/components/abstract/module.dm index a3c04b2a11..970b893ac3 100644 --- a/code/modules/wiremod/components/abstract/module.dm +++ b/code/modules/wiremod/components/abstract/module.dm @@ -93,7 +93,7 @@ attached_module = null return ..() -/obj/item/circuit_component/module/Initialize() +/obj/item/circuit_component/module/Initialize(mapload) . = ..() internal_circuit = new(src) internal_circuit.attached_module = src diff --git a/code/modules/wiremod/components/action/light.dm b/code/modules/wiremod/components/action/light.dm index 14427eae0e..11c40983c3 100644 --- a/code/modules/wiremod/components/action/light.dm +++ b/code/modules/wiremod/components/action/light.dm @@ -26,7 +26,7 @@ . = ..() . += create_ui_notice("Maximum Brightness: [max_power]", "orange", "lightbulb") -/obj/item/circuit_component/light/Initialize() +/obj/item/circuit_component/light/Initialize(mapload) . = ..() red = add_input_port("Red", PORT_TYPE_NUMBER) green = add_input_port("Green", PORT_TYPE_NUMBER) diff --git a/code/modules/wiremod/components/action/mmi.dm b/code/modules/wiremod/components/action/mmi.dm index 9c242059a6..b67f48f559 100644 --- a/code/modules/wiremod/components/action/mmi.dm +++ b/code/modules/wiremod/components/action/mmi.dm @@ -36,7 +36,7 @@ /// Maximum length of the message that can be sent to the MMI var/max_length = 300 -/obj/item/circuit_component/mmi/Initialize() +/obj/item/circuit_component/mmi/Initialize(mapload) . = ..() message = add_input_port("Message", PORT_TYPE_STRING) send = add_input_port("Send Message", PORT_TYPE_SIGNAL) diff --git a/code/modules/wiremod/components/action/pathfind.dm b/code/modules/wiremod/components/action/pathfind.dm index 10856e0de8..744ae66dd7 100644 --- a/code/modules/wiremod/components/action/pathfind.dm +++ b/code/modules/wiremod/components/action/pathfind.dm @@ -33,7 +33,7 @@ . += create_ui_notice("Pathfinding Cooldown: [DisplayTimeText(different_path_cooldown)]", "orange", "stopwatch") . += create_ui_notice("Maximum Range: [max_range] tiles", "orange", "info") -/obj/item/circuit_component/pathfind/Initialize() +/obj/item/circuit_component/pathfind/Initialize(mapload) . = ..() input_X = add_input_port("Target X", PORT_TYPE_NUMBER, FALSE) input_Y = add_input_port("Target Y", PORT_TYPE_NUMBER, FALSE) diff --git a/code/modules/wiremod/components/action/pull.dm b/code/modules/wiremod/components/action/pull.dm index ecaa6bd3aa..89530ce787 100644 --- a/code/modules/wiremod/components/action/pull.dm +++ b/code/modules/wiremod/components/action/pull.dm @@ -11,7 +11,7 @@ var/datum/port/input/target circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL -/obj/item/circuit_component/pull/Initialize() +/obj/item/circuit_component/pull/Initialize(mapload) . = ..() target = add_input_port("Target", PORT_TYPE_ATOM) diff --git a/code/modules/wiremod/components/action/radio.dm b/code/modules/wiremod/components/action/radio.dm index 540b79f7cf..135cbdca0a 100644 --- a/code/modules/wiremod/components/action/radio.dm +++ b/code/modules/wiremod/components/action/radio.dm @@ -30,7 +30,7 @@ ) public_options = add_option_port("Encryption Options", component_options) -/obj/item/circuit_component/radio/Initialize() +/obj/item/circuit_component/radio/Initialize(mapload) . = ..() freq = add_input_port("Frequency", PORT_TYPE_NUMBER, default = FREQ_SIGNALER) code = add_input_port("Code", PORT_TYPE_NUMBER, default = DEFAULT_SIGNALER_CODE) diff --git a/code/modules/wiremod/components/action/soundemitter.dm b/code/modules/wiremod/components/action/soundemitter.dm index 6d18978c53..1806030984 100644 --- a/code/modules/wiremod/components/action/soundemitter.dm +++ b/code/modules/wiremod/components/action/soundemitter.dm @@ -27,7 +27,7 @@ . += create_ui_notice("Sound Cooldown: [DisplayTimeText(sound_cooldown)]", "orange", "stopwatch") -/obj/item/circuit_component/soundemitter/Initialize() +/obj/item/circuit_component/soundemitter/Initialize(mapload) . = ..() volume = add_input_port("Volume", PORT_TYPE_NUMBER, default = 35) frequency = add_input_port("Frequency", PORT_TYPE_NUMBER, default = 0) diff --git a/code/modules/wiremod/components/action/speech.dm b/code/modules/wiremod/components/action/speech.dm index 6732a2058a..fc8cb3a627 100644 --- a/code/modules/wiremod/components/action/speech.dm +++ b/code/modules/wiremod/components/action/speech.dm @@ -18,7 +18,7 @@ . = ..() . += create_ui_notice("Speech Cooldown: [DisplayTimeText(speech_cooldown)]", "orange", "stopwatch") -/obj/item/circuit_component/speech/Initialize() +/obj/item/circuit_component/speech/Initialize(mapload) . = ..() message = add_input_port("Message", PORT_TYPE_STRING, FALSE) diff --git a/code/modules/wiremod/components/admin/getvar.dm b/code/modules/wiremod/components/admin/getvar.dm index cef8341f38..28d25cdb53 100644 --- a/code/modules/wiremod/components/admin/getvar.dm +++ b/code/modules/wiremod/components/admin/getvar.dm @@ -18,7 +18,7 @@ var/datum/port/output/output_value -/obj/item/circuit_component/get_variable/Initialize() +/obj/item/circuit_component/get_variable/Initialize(mapload) . = ..() entity = add_input_port("Target", PORT_TYPE_ATOM) variable_name = add_input_port("Variable Name", PORT_TYPE_STRING) diff --git a/code/modules/wiremod/components/admin/proccall.dm b/code/modules/wiremod/components/admin/proccall.dm index 1349c81636..4f4d1c55d3 100644 --- a/code/modules/wiremod/components/admin/proccall.dm +++ b/code/modules/wiremod/components/admin/proccall.dm @@ -34,7 +34,7 @@ proccall_options = add_option_port("Proccall Options", component_options) -/obj/item/circuit_component/proccall/Initialize() +/obj/item/circuit_component/proccall/Initialize(mapload) . = ..() entity = add_input_port("Target", PORT_TYPE_ATOM) proc_name = add_input_port("Proc Name", PORT_TYPE_STRING) diff --git a/code/modules/wiremod/components/admin/sdql.dm b/code/modules/wiremod/components/admin/sdql.dm index 871c3f247e..ed71414dd2 100644 --- a/code/modules/wiremod/components/admin/sdql.dm +++ b/code/modules/wiremod/components/admin/sdql.dm @@ -14,7 +14,7 @@ var/datum/port/output/results -/obj/item/circuit_component/sdql_operation/Initialize() +/obj/item/circuit_component/sdql_operation/Initialize(mapload) . = ..() sdql_operation = add_input_port("SDQL String", PORT_TYPE_STRING) results = add_output_port("Result", PORT_TYPE_LIST) diff --git a/code/modules/wiremod/components/admin/setvar.dm b/code/modules/wiremod/components/admin/setvar.dm index 0c66450cc9..5319d7cdcb 100644 --- a/code/modules/wiremod/components/admin/setvar.dm +++ b/code/modules/wiremod/components/admin/setvar.dm @@ -18,7 +18,7 @@ var/datum/port/input/new_value -/obj/item/circuit_component/set_variable/Initialize() +/obj/item/circuit_component/set_variable/Initialize(mapload) . = ..() entity = add_input_port("Target", PORT_TYPE_ATOM) variable_name = add_input_port("Variable Name", PORT_TYPE_STRING) diff --git a/code/modules/wiremod/components/admin/spawn.dm b/code/modules/wiremod/components/admin/spawn.dm index 2d3697598b..795a438a70 100644 --- a/code/modules/wiremod/components/admin/spawn.dm +++ b/code/modules/wiremod/components/admin/spawn.dm @@ -20,7 +20,7 @@ /// The result from the output var/datum/port/output/spawned_atom -/obj/item/circuit_component/spawn_atom/Initialize() +/obj/item/circuit_component/spawn_atom/Initialize(mapload) . = ..() input_path = add_input_port("Type", PORT_TYPE_ANY) spawn_at = add_input_port("Spawn At", PORT_TYPE_ATOM) diff --git a/code/modules/wiremod/components/admin/to_type.dm b/code/modules/wiremod/components/admin/to_type.dm index e4a34223bb..56a6b3a0e8 100644 --- a/code/modules/wiremod/components/admin/to_type.dm +++ b/code/modules/wiremod/components/admin/to_type.dm @@ -14,7 +14,7 @@ /// The type output var/datum/port/output/type_output -/obj/item/circuit_component/to_type/Initialize() +/obj/item/circuit_component/to_type/Initialize(mapload) . = ..() input_path = add_input_port("Type", PORT_TYPE_STRING) type_output = add_output_port("Typepath", PORT_TYPE_ANY) diff --git a/code/modules/wiremod/components/atom/direction.dm b/code/modules/wiremod/components/atom/direction.dm index 140720a2d3..b7437aca84 100644 --- a/code/modules/wiremod/components/atom/direction.dm +++ b/code/modules/wiremod/components/atom/direction.dm @@ -28,7 +28,7 @@ . = ..() . += create_ui_notice("Maximum Range: [max_range] tiles", "orange", "info") -/obj/item/circuit_component/direction/Initialize() +/obj/item/circuit_component/direction/Initialize(mapload) . = ..() input_port = add_input_port("Organism", PORT_TYPE_ATOM) diff --git a/code/modules/wiremod/components/atom/gps.dm b/code/modules/wiremod/components/atom/gps.dm index cdf61385a0..ba807cb8a7 100644 --- a/code/modules/wiremod/components/atom/gps.dm +++ b/code/modules/wiremod/components/atom/gps.dm @@ -14,7 +14,7 @@ circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL -/obj/item/circuit_component/gps/Initialize() +/obj/item/circuit_component/gps/Initialize(mapload) . = ..() x_pos = add_output_port("X", PORT_TYPE_NUMBER) diff --git a/code/modules/wiremod/components/atom/health.dm b/code/modules/wiremod/components/atom/health.dm index 7849180f9a..8c5095fb72 100644 --- a/code/modules/wiremod/components/atom/health.dm +++ b/code/modules/wiremod/components/atom/health.dm @@ -29,7 +29,7 @@ . = ..() . += create_ui_notice("Maximum Range: [max_range] tiles", "orange", "info") -/obj/item/circuit_component/health/Initialize() +/obj/item/circuit_component/health/Initialize(mapload) . = ..() input_port = add_input_port("Organism", PORT_TYPE_ATOM) diff --git a/code/modules/wiremod/components/atom/hear.dm b/code/modules/wiremod/components/atom/hear.dm index 23fbba1e0a..1069110603 100644 --- a/code/modules/wiremod/components/atom/hear.dm +++ b/code/modules/wiremod/components/atom/hear.dm @@ -16,7 +16,7 @@ /// The trigger sent when this event occurs var/datum/port/output/trigger_port -/obj/item/circuit_component/hear/Initialize() +/obj/item/circuit_component/hear/Initialize(mapload) . = ..() message_port = add_output_port("Message", PORT_TYPE_STRING) language_port = add_output_port("Language", PORT_TYPE_STRING) diff --git a/code/modules/wiremod/components/atom/self.dm b/code/modules/wiremod/components/atom/self.dm index 7389a19f69..b1f469ff79 100644 --- a/code/modules/wiremod/components/atom/self.dm +++ b/code/modules/wiremod/components/atom/self.dm @@ -10,7 +10,7 @@ /// The shell this component is attached to. var/datum/port/output/output -/obj/item/circuit_component/self/Initialize() +/obj/item/circuit_component/self/Initialize(mapload) . = ..() output = add_output_port("Self", PORT_TYPE_ATOM) diff --git a/code/modules/wiremod/components/atom/species.dm b/code/modules/wiremod/components/atom/species.dm index 9404a37697..2d865c4a73 100644 --- a/code/modules/wiremod/components/atom/species.dm +++ b/code/modules/wiremod/components/atom/species.dm @@ -15,7 +15,7 @@ circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL -/obj/item/circuit_component/species/Initialize() +/obj/item/circuit_component/species/Initialize(mapload) . = ..() input_port = add_input_port("Organism", PORT_TYPE_ATOM) diff --git a/code/modules/wiremod/components/hud/bar_overlay.dm b/code/modules/wiremod/components/hud/bar_overlay.dm index f7ecfb1e1f..c275ab3147 100644 --- a/code/modules/wiremod/components/hud/bar_overlay.dm +++ b/code/modules/wiremod/components/hud/bar_overlay.dm @@ -17,7 +17,7 @@ var/overlay_limit = 10 -/obj/item/circuit_component/object_overlay/bar/Initialize() +/obj/item/circuit_component/object_overlay/bar/Initialize(mapload) . = ..() bar_number = add_input_port("Number", PORT_TYPE_NUMBER) diff --git a/code/modules/wiremod/components/hud/counter_overlay.dm b/code/modules/wiremod/components/hud/counter_overlay.dm index ecce816e74..83d7acfd11 100644 --- a/code/modules/wiremod/components/hud/counter_overlay.dm +++ b/code/modules/wiremod/components/hud/counter_overlay.dm @@ -22,7 +22,7 @@ var/list/numbers = list() var/counter_appearance -/obj/item/circuit_component/counter_overlay/Initialize() +/obj/item/circuit_component/counter_overlay/Initialize(mapload) . = ..() counter_number = add_input_port("Displayed Number", PORT_TYPE_NUMBER) diff --git a/code/modules/wiremod/components/hud/object_overlay.dm b/code/modules/wiremod/components/hud/object_overlay.dm index 2cab4a57fa..3b20e4f551 100644 --- a/code/modules/wiremod/components/hud/object_overlay.dm +++ b/code/modules/wiremod/components/hud/object_overlay.dm @@ -29,7 +29,7 @@ var/list/active_overlays = list() var/list/options_map -/obj/item/circuit_component/object_overlay/Initialize() +/obj/item/circuit_component/object_overlay/Initialize(mapload) . = ..() target = add_input_port("Target", PORT_TYPE_ATOM) diff --git a/code/modules/wiremod/components/hud/target_intercept.dm b/code/modules/wiremod/components/hud/target_intercept.dm index 2a19264b00..d04dc2c946 100644 --- a/code/modules/wiremod/components/hud/target_intercept.dm +++ b/code/modules/wiremod/components/hud/target_intercept.dm @@ -16,7 +16,7 @@ var/obj/item/organ/cyberimp/bci/bci var/intercept_cooldown = 1 SECONDS -/obj/item/circuit_component/target_intercept/Initialize() +/obj/item/circuit_component/target_intercept/Initialize(mapload) . = ..() trigger_input = add_input_port("Activate", PORT_TYPE_SIGNAL) trigger_output = add_output_port("Triggered", PORT_TYPE_SIGNAL) diff --git a/code/modules/wiremod/components/list/concat.dm b/code/modules/wiremod/components/list/concat.dm index 32e16758d3..6574f1f02d 100644 --- a/code/modules/wiremod/components/list/concat.dm +++ b/code/modules/wiremod/components/list/concat.dm @@ -17,7 +17,7 @@ var/datum/port/output/output circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL -/obj/item/circuit_component/concat_list/Initialize() +/obj/item/circuit_component/concat_list/Initialize(mapload) . = ..() list_port = add_input_port("List", PORT_TYPE_LIST) separator = add_input_port("Seperator", PORT_TYPE_STRING) diff --git a/code/modules/wiremod/components/list/get_column.dm b/code/modules/wiremod/components/list/get_column.dm index 07ff7ef11b..2b35951b1e 100644 --- a/code/modules/wiremod/components/list/get_column.dm +++ b/code/modules/wiremod/components/list/get_column.dm @@ -17,7 +17,7 @@ /// The filtered list var/datum/port/output/output_list -/obj/item/circuit_component/get_column/Initialize() +/obj/item/circuit_component/get_column/Initialize(mapload) . = ..() received_table = add_input_port("Input", PORT_TYPE_TABLE) column_name = add_input_port("Column Name", PORT_TYPE_STRING) diff --git a/code/modules/wiremod/components/list/index.dm b/code/modules/wiremod/components/list/index.dm index d51a60e2bf..2aaf1b6629 100644 --- a/code/modules/wiremod/components/list/index.dm +++ b/code/modules/wiremod/components/list/index.dm @@ -15,7 +15,7 @@ var/datum/port/output/output circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL -/obj/item/circuit_component/index/Initialize() +/obj/item/circuit_component/index/Initialize(mapload) . = ..() index_port = add_input_port("Index", PORT_TYPE_ANY) list_port = add_input_port("List", PORT_TYPE_LIST) diff --git a/code/modules/wiremod/components/list/index_table.dm b/code/modules/wiremod/components/list/index_table.dm index 376bc46465..502073cf74 100644 --- a/code/modules/wiremod/components/list/index_table.dm +++ b/code/modules/wiremod/components/list/index_table.dm @@ -17,7 +17,7 @@ /// The filtered list var/datum/port/output/output_list -/obj/item/circuit_component/index_table/Initialize() +/obj/item/circuit_component/index_table/Initialize(mapload) . = ..() received_table = add_input_port("Input", PORT_TYPE_TABLE) target_index = add_input_port("Index", PORT_TYPE_NUMBER) diff --git a/code/modules/wiremod/components/list/list_literal.dm b/code/modules/wiremod/components/list/list_literal.dm index e9bd741606..c9dc3ea03d 100644 --- a/code/modules/wiremod/components/list/list_literal.dm +++ b/code/modules/wiremod/components/list/list_literal.dm @@ -51,7 +51,7 @@ index -= 1 entry_ports += add_input_port("Index [index+1]", PORT_TYPE_ANY, index = index+1) -/obj/item/circuit_component/list_literal/Initialize() +/obj/item/circuit_component/list_literal/Initialize(mapload) . = ..() set_list_size(default_list_size) list_output = add_output_port("Value", PORT_TYPE_LIST) diff --git a/code/modules/wiremod/components/list/select.dm b/code/modules/wiremod/components/list/select.dm index 8eba84d034..19ddb51c03 100644 --- a/code/modules/wiremod/components/list/select.dm +++ b/code/modules/wiremod/components/list/select.dm @@ -35,7 +35,7 @@ ) comparison_options = add_option_port("Comparison Options", component_options) -/obj/item/circuit_component/select/Initialize() +/obj/item/circuit_component/select/Initialize(mapload) . = ..() received_table = add_input_port("Input", PORT_TYPE_TABLE) column_name = add_input_port("Column Name", PORT_TYPE_STRING) diff --git a/code/modules/wiremod/components/list/split.dm b/code/modules/wiremod/components/list/split.dm index 27af366fac..444157342c 100644 --- a/code/modules/wiremod/components/list/split.dm +++ b/code/modules/wiremod/components/list/split.dm @@ -18,7 +18,7 @@ circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL -/obj/item/circuit_component/split/Initialize() +/obj/item/circuit_component/split/Initialize(mapload) . = ..() input_port = add_input_port("Input", PORT_TYPE_STRING) separator = add_input_port("Seperator", PORT_TYPE_STRING) diff --git a/code/modules/wiremod/components/math/arithmetic.dm b/code/modules/wiremod/components/math/arithmetic.dm index 77c8b93b25..9d7361c66b 100644 --- a/code/modules/wiremod/components/math/arithmetic.dm +++ b/code/modules/wiremod/components/math/arithmetic.dm @@ -37,7 +37,7 @@ ) arithmetic_option = add_option_port("Arithmetic Option", component_options) -/obj/item/circuit_component/arithmetic/Initialize() +/obj/item/circuit_component/arithmetic/Initialize(mapload) . = ..() arithmetic_ports = list() for(var/port_id in 1 to input_port_amount) diff --git a/code/modules/wiremod/components/math/length.dm b/code/modules/wiremod/components/math/length.dm index d6702c9b5d..14bc58c998 100644 --- a/code/modules/wiremod/components/math/length.dm +++ b/code/modules/wiremod/components/math/length.dm @@ -14,7 +14,7 @@ var/datum/port/output/output circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL -/obj/item/circuit_component/length/Initialize() +/obj/item/circuit_component/length/Initialize(mapload) . = ..() input_port = add_input_port("Input", PORT_TYPE_ANY) diff --git a/code/modules/wiremod/components/math/not.dm b/code/modules/wiremod/components/math/not.dm index 6a55024b54..ad8a1d6791 100644 --- a/code/modules/wiremod/components/math/not.dm +++ b/code/modules/wiremod/components/math/not.dm @@ -14,7 +14,7 @@ var/datum/port/output/result circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL -/obj/item/circuit_component/not/Initialize() +/obj/item/circuit_component/not/Initialize(mapload) . = ..() input_port = add_input_port("Input", PORT_TYPE_ANY) diff --git a/code/modules/wiremod/components/math/random.dm b/code/modules/wiremod/components/math/random.dm index 548376ed8d..7e428f5ea6 100644 --- a/code/modules/wiremod/components/math/random.dm +++ b/code/modules/wiremod/components/math/random.dm @@ -17,7 +17,7 @@ /// The result from the output var/datum/port/output/output -/obj/item/circuit_component/random/Initialize() +/obj/item/circuit_component/random/Initialize(mapload) . = ..() minimum = add_input_port("Minimum", PORT_TYPE_NUMBER, FALSE) maximum = add_input_port("Maximum", PORT_TYPE_NUMBER, FALSE) diff --git a/code/modules/wiremod/components/ntnet/ntnet_receive.dm b/code/modules/wiremod/components/ntnet/ntnet_receive.dm index 0bcb1c5ed0..30bbaee855 100644 --- a/code/modules/wiremod/components/ntnet/ntnet_receive.dm +++ b/code/modules/wiremod/components/ntnet/ntnet_receive.dm @@ -20,7 +20,7 @@ var/datum/port/input/option/data_type_options var/datum/port/input/option/secondary_data_type_options -/obj/item/circuit_component/ntnet_receive/Initialize() +/obj/item/circuit_component/ntnet_receive/Initialize(mapload) . = ..() data_package = add_output_port("Data Package", PORT_TYPE_ANY) secondary_package = add_output_port("Secondary Package", PORT_TYPE_ANY) diff --git a/code/modules/wiremod/components/ntnet/ntnet_send.dm b/code/modules/wiremod/components/ntnet/ntnet_send.dm index 33d9370fae..44316f80ee 100644 --- a/code/modules/wiremod/components/ntnet/ntnet_send.dm +++ b/code/modules/wiremod/components/ntnet/ntnet_send.dm @@ -16,7 +16,7 @@ var/datum/port/input/secondary_package var/datum/port/input/enc_key -/obj/item/circuit_component/ntnet_send/Initialize() +/obj/item/circuit_component/ntnet_send/Initialize(mapload) . = ..() data_package = add_input_port("Data Package", PORT_TYPE_ANY) secondary_package = add_input_port("Secondary Package", PORT_TYPE_ANY) diff --git a/code/modules/wiremod/components/sensors/pressuresensor.dm b/code/modules/wiremod/components/sensors/pressuresensor.dm index 25f39b9c8e..f02642151a 100644 --- a/code/modules/wiremod/components/sensors/pressuresensor.dm +++ b/code/modules/wiremod/components/sensors/pressuresensor.dm @@ -12,7 +12,7 @@ /// The result from the output var/datum/port/output/result -/obj/item/circuit_component/pressuresensor/Initialize() +/obj/item/circuit_component/pressuresensor/Initialize(mapload) . = ..() result = add_output_port("Result", PORT_TYPE_NUMBER) diff --git a/code/modules/wiremod/components/sensors/tempsensor.dm b/code/modules/wiremod/components/sensors/tempsensor.dm index bb2410ce77..caa76a8cb8 100644 --- a/code/modules/wiremod/components/sensors/tempsensor.dm +++ b/code/modules/wiremod/components/sensors/tempsensor.dm @@ -12,7 +12,7 @@ /// The result from the output var/datum/port/output/result -/obj/item/circuit_component/tempsensor/Initialize() +/obj/item/circuit_component/tempsensor/Initialize(mapload) . = ..() result = add_output_port("Result", PORT_TYPE_NUMBER) diff --git a/code/modules/wiremod/components/string/concat.dm b/code/modules/wiremod/components/string/concat.dm index 55dd5530a1..10fcb1dd05 100644 --- a/code/modules/wiremod/components/string/concat.dm +++ b/code/modules/wiremod/components/string/concat.dm @@ -14,7 +14,7 @@ var/datum/port/output/output circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL -/obj/item/circuit_component/concat/Initialize() +/obj/item/circuit_component/concat/Initialize(mapload) . = ..() for(var/port_id in 1 to input_port_amount) var/letter = ascii2text(text2ascii("A") + (port_id-1)) diff --git a/code/modules/wiremod/components/string/textcase.dm b/code/modules/wiremod/components/string/textcase.dm index a021074433..9a01ae8765 100644 --- a/code/modules/wiremod/components/string/textcase.dm +++ b/code/modules/wiremod/components/string/textcase.dm @@ -27,7 +27,7 @@ ) textcase_options = add_option_port("Textcase Options", component_options) -/obj/item/circuit_component/textcase/Initialize() +/obj/item/circuit_component/textcase/Initialize(mapload) . = ..() input_port = add_input_port("Input", PORT_TYPE_STRING) output = add_output_port("Output", PORT_TYPE_STRING) diff --git a/code/modules/wiremod/components/string/tonumber.dm b/code/modules/wiremod/components/string/tonumber.dm index 6012ab339d..6083940a16 100644 --- a/code/modules/wiremod/components/string/tonumber.dm +++ b/code/modules/wiremod/components/string/tonumber.dm @@ -15,7 +15,7 @@ circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL -/obj/item/circuit_component/tonumber/Initialize() +/obj/item/circuit_component/tonumber/Initialize(mapload) . = ..() input_port = add_input_port("Input", PORT_TYPE_STRING) diff --git a/code/modules/wiremod/components/string/tostring.dm b/code/modules/wiremod/components/string/tostring.dm index bc044f157a..a4d30682ba 100644 --- a/code/modules/wiremod/components/string/tostring.dm +++ b/code/modules/wiremod/components/string/tostring.dm @@ -17,7 +17,7 @@ var/max_range = 5 -/obj/item/circuit_component/tostring/Initialize() +/obj/item/circuit_component/tostring/Initialize(mapload) . = ..() input_port = add_input_port("Input", PORT_TYPE_ANY) diff --git a/code/modules/wiremod/components/utility/clock.dm b/code/modules/wiremod/components/utility/clock.dm index 4c570b0ec5..093aac90f4 100644 --- a/code/modules/wiremod/components/utility/clock.dm +++ b/code/modules/wiremod/components/utility/clock.dm @@ -17,7 +17,7 @@ . = ..() . += create_ui_notice("Clock Interval: [DisplayTimeText(COMP_CLOCK_DELAY)]", "orange", "clock") -/obj/item/circuit_component/clock/Initialize() +/obj/item/circuit_component/clock/Initialize(mapload) . = ..() on = add_input_port("On", PORT_TYPE_NUMBER) diff --git a/code/modules/wiremod/components/utility/delay.dm b/code/modules/wiremod/components/utility/delay.dm index 37fa5a79f6..46d9e6f081 100644 --- a/code/modules/wiremod/components/utility/delay.dm +++ b/code/modules/wiremod/components/utility/delay.dm @@ -18,7 +18,7 @@ /// The output of the signal var/datum/port/output/output -/obj/item/circuit_component/delay/Initialize() +/obj/item/circuit_component/delay/Initialize(mapload) . = ..() delay_amount = add_input_port("Delay", PORT_TYPE_NUMBER, FALSE) trigger = add_input_port("Trigger", PORT_TYPE_SIGNAL) diff --git a/code/modules/wiremod/components/utility/getter.dm b/code/modules/wiremod/components/utility/getter.dm index 7bca3083da..30c3cb2ac1 100644 --- a/code/modules/wiremod/components/utility/getter.dm +++ b/code/modules/wiremod/components/utility/getter.dm @@ -26,7 +26,7 @@ variable_name.possible_options = null return ..() -/obj/item/circuit_component/getter/Initialize() +/obj/item/circuit_component/getter/Initialize(mapload) . = ..() value = add_output_port("Value", PORT_TYPE_ANY) diff --git a/code/modules/wiremod/components/utility/router.dm b/code/modules/wiremod/components/utility/router.dm index 4086392f5b..bf9fdba0e0 100644 --- a/code/modules/wiremod/components/utility/router.dm +++ b/code/modules/wiremod/components/utility/router.dm @@ -35,7 +35,7 @@ ) router_options = add_option_port("Router Options", component_options) -/obj/item/circuit_component/router/Initialize() +/obj/item/circuit_component/router/Initialize(mapload) . = ..() current_type = router_options.value if(input_port_amount > 1) diff --git a/code/modules/wiremod/components/utility/setter.dm b/code/modules/wiremod/components/utility/setter.dm index 614e700798..6b5658645c 100644 --- a/code/modules/wiremod/components/utility/setter.dm +++ b/code/modules/wiremod/components/utility/setter.dm @@ -30,7 +30,7 @@ variable_name.possible_options = null return ..() -/obj/item/circuit_component/setter/Initialize() +/obj/item/circuit_component/setter/Initialize(mapload) . = ..() input_port = add_input_port("Input", PORT_TYPE_ANY) trigger = add_input_port("Store", PORT_TYPE_SIGNAL) diff --git a/code/modules/wiremod/components/utility/typecast.dm b/code/modules/wiremod/components/utility/typecast.dm index ee204c332e..ebbb687da6 100644 --- a/code/modules/wiremod/components/utility/typecast.dm +++ b/code/modules/wiremod/components/utility/typecast.dm @@ -16,7 +16,7 @@ var/current_type -/obj/item/circuit_component/typecast/Initialize() +/obj/item/circuit_component/typecast/Initialize(mapload) . = ..() current_type = typecast_options.value input_value = add_input_port("Input", PORT_TYPE_ANY) diff --git a/code/modules/wiremod/core/component.dm b/code/modules/wiremod/core/component.dm index 0939debc3c..579ab7645c 100644 --- a/code/modules/wiremod/core/component.dm +++ b/code/modules/wiremod/core/component.dm @@ -56,7 +56,7 @@ /obj/item/circuit_component/proc/add_option_port(name, list/list_to_use) return add_input_port(name, PORT_TYPE_OPTION, port_type = /datum/port/input/option, extra_args = list("possible_options" = list_to_use)) -/obj/item/circuit_component/Initialize() +/obj/item/circuit_component/Initialize(mapload) . = ..() if(name == COMPONENT_DEFAULT_NAME) name = "[lowertext(display_name)] [COMPONENT_DEFAULT_NAME]" diff --git a/code/modules/wiremod/core/component_printer.dm b/code/modules/wiremod/core/component_printer.dm index 7400aafbf2..948ea080e7 100644 --- a/code/modules/wiremod/core/component_printer.dm +++ b/code/modules/wiremod/core/component_printer.dm @@ -144,7 +144,7 @@ density = TRUE -/obj/machinery/debug_component_printer/Initialize() +/obj/machinery/debug_component_printer/Initialize(mapload) . = ..() all_circuit_designs = list() diff --git a/code/modules/wiremod/core/integrated_circuit.dm b/code/modules/wiremod/core/integrated_circuit.dm index f69caa7542..b767615e87 100644 --- a/code/modules/wiremod/core/integrated_circuit.dm +++ b/code/modules/wiremod/core/integrated_circuit.dm @@ -69,14 +69,14 @@ GLOBAL_LIST_EMPTY_TYPED(integrated_circuits, /obj/item/integrated_circuit) /// The Y position of the screen. Used for adding components. var/screen_y = 0 -/obj/item/integrated_circuit/Initialize() +/obj/item/integrated_circuit/Initialize(mapload) . = ..() GLOB.integrated_circuits += src RegisterSignal(src, COMSIG_ATOM_USB_CABLE_TRY_ATTACH, .proc/on_atom_usb_cable_try_attach) -/obj/item/integrated_circuit/loaded/Initialize() +/obj/item/integrated_circuit/loaded/Initialize(mapload) . = ..() set_cell(new /obj/item/stock_parts/cell/high(src)) diff --git a/code/modules/wiremod/core/usb_cable.dm b/code/modules/wiremod/core/usb_cable.dm index df0dec936c..ed0f1053a3 100644 --- a/code/modules/wiremod/core/usb_cable.dm +++ b/code/modules/wiremod/core/usb_cable.dm @@ -17,7 +17,7 @@ STOP_PROCESSING(SSobj, src) return ..() -/obj/item/usb_cable/Initialize() +/obj/item/usb_cable/Initialize(mapload) . = ..() RegisterSignal(src, COMSIG_MOVABLE_MOVED, .proc/on_moved) diff --git a/code/modules/wiremod/preset/hello_world.dm b/code/modules/wiremod/preset/hello_world.dm index 9aee88a300..2b579a0d81 100644 --- a/code/modules/wiremod/preset/hello_world.dm +++ b/code/modules/wiremod/preset/hello_world.dm @@ -5,7 +5,7 @@ */ /obj/item/integrated_circuit/loaded/hello_world -/obj/item/integrated_circuit/loaded/hello_world/Initialize() +/obj/item/integrated_circuit/loaded/hello_world/Initialize(mapload) . = ..() var/obj/item/circuit_component/speech/speech = new() add_component(speech) diff --git a/code/modules/wiremod/preset/speech_relay.dm b/code/modules/wiremod/preset/speech_relay.dm index 5e5284bdeb..a1e66832c9 100644 --- a/code/modules/wiremod/preset/speech_relay.dm +++ b/code/modules/wiremod/preset/speech_relay.dm @@ -5,7 +5,7 @@ */ /obj/item/integrated_circuit/loaded/speech_relay -/obj/item/integrated_circuit/loaded/speech_relay/Initialize() +/obj/item/integrated_circuit/loaded/speech_relay/Initialize(mapload) . = ..() var/obj/item/circuit_component/hear/hear = new() add_component(hear) diff --git a/code/modules/wiremod/shell/airlock.dm b/code/modules/wiremod/shell/airlock.dm index b44bb40d02..6c342effa1 100644 --- a/code/modules/wiremod/shell/airlock.dm +++ b/code/modules/wiremod/shell/airlock.dm @@ -12,7 +12,7 @@ name = "circuit airlock" autoclose = FALSE -/obj/machinery/door/airlock/shell/Initialize() +/obj/machinery/door/airlock/shell/Initialize(mapload) . = ..() AddComponent( \ /datum/component/shell, \ @@ -64,7 +64,7 @@ /// Called when the airlock is unbolted var/datum/port/output/unbolted -/obj/item/circuit_component/airlock/Initialize() +/obj/item/circuit_component/airlock/Initialize(mapload) . = ..() // Input Signals bolt = add_input_port("Bolt", PORT_TYPE_SIGNAL) diff --git a/code/modules/wiremod/shell/bot.dm b/code/modules/wiremod/shell/bot.dm index f3c9fcae8d..a7aee6a2c5 100644 --- a/code/modules/wiremod/shell/bot.dm +++ b/code/modules/wiremod/shell/bot.dm @@ -12,7 +12,7 @@ light_system = MOVABLE_LIGHT light_on = FALSE -/obj/structure/bot/Initialize() +/obj/structure/bot/Initialize(mapload) . = ..() AddComponent( \ /datum/component/shell, \ @@ -30,7 +30,7 @@ /// The user who used the bot var/datum/port/output/entity -/obj/item/circuit_component/bot/Initialize() +/obj/item/circuit_component/bot/Initialize(mapload) . = ..() entity = add_output_port("User", PORT_TYPE_ATOM) signal = add_output_port("Signal", PORT_TYPE_SIGNAL) diff --git a/code/modules/wiremod/shell/brain_computer_interface.dm b/code/modules/wiremod/shell/brain_computer_interface.dm index d288edbc2d..f9723e115c 100644 --- a/code/modules/wiremod/shell/brain_computer_interface.dm +++ b/code/modules/wiremod/shell/brain_computer_interface.dm @@ -6,7 +6,7 @@ zone = BODY_ZONE_HEAD w_class = WEIGHT_CLASS_TINY -/obj/item/organ/cyberimp/bci/Initialize() +/obj/item/organ/cyberimp/bci/Initialize(mapload) . = ..() AddComponent(/datum/component/shell, list( @@ -167,7 +167,7 @@ var/datum/weakref/user -/obj/item/circuit_component/bci_core/Initialize() +/obj/item/circuit_component/bci_core/Initialize(mapload) . = ..() message = add_input_port("Message", PORT_TYPE_STRING) @@ -341,7 +341,7 @@ COOLDOWN_DECLARE(message_cooldown) -/obj/machinery/bci_implanter/Initialize() +/obj/machinery/bci_implanter/Initialize(mapload) . = ..() occupant_typecache = typecacheof(/mob/living/carbon) diff --git a/code/modules/wiremod/shell/compact_remote.dm b/code/modules/wiremod/shell/compact_remote.dm index d5fe33e285..526567a92a 100644 --- a/code/modules/wiremod/shell/compact_remote.dm +++ b/code/modules/wiremod/shell/compact_remote.dm @@ -14,7 +14,7 @@ light_system = MOVABLE_LIGHT_DIRECTIONAL light_on = FALSE -/obj/item/compact_remote/Initialize() +/obj/item/compact_remote/Initialize(mapload) . = ..() AddComponent(/datum/component/shell, list( new /obj/item/circuit_component/compact_remote() @@ -29,7 +29,7 @@ /// The user who used the bot var/datum/port/output/entity -/obj/item/circuit_component/compact_remote/Initialize() +/obj/item/circuit_component/compact_remote/Initialize(mapload) . = ..() entity = add_output_port("User", PORT_TYPE_ATOM) signal = add_output_port("Signal", PORT_TYPE_SIGNAL) diff --git a/code/modules/wiremod/shell/controller.dm b/code/modules/wiremod/shell/controller.dm index d3af0ca88e..9539a0521a 100644 --- a/code/modules/wiremod/shell/controller.dm +++ b/code/modules/wiremod/shell/controller.dm @@ -15,7 +15,7 @@ light_system = MOVABLE_LIGHT_DIRECTIONAL light_on = FALSE -/obj/item/controller/Initialize() +/obj/item/controller/Initialize(mapload) . = ..() AddComponent(/datum/component/shell, list( new /obj/item/circuit_component/controller() @@ -33,7 +33,7 @@ /// The entity output var/datum/port/output/entity -/obj/item/circuit_component/controller/Initialize() +/obj/item/circuit_component/controller/Initialize(mapload) . = ..() entity = add_output_port("User", PORT_TYPE_ATOM) signal = add_output_port("Signal", PORT_TYPE_SIGNAL) diff --git a/code/modules/wiremod/shell/drone.dm b/code/modules/wiremod/shell/drone.dm index d091f20b65..0133f35230 100644 --- a/code/modules/wiremod/shell/drone.dm +++ b/code/modules/wiremod/shell/drone.dm @@ -11,7 +11,7 @@ light_system = MOVABLE_LIGHT_DIRECTIONAL light_on = FALSE -/mob/living/circuit_drone/Initialize() +/mob/living/circuit_drone/Initialize(mapload) . = ..() AddComponent(/datum/component/shell, list( new /obj/item/circuit_component/bot_circuit() @@ -44,7 +44,7 @@ /// Delay between each movement var/move_delay = 0.2 SECONDS -/obj/item/circuit_component/bot_circuit/Initialize() +/obj/item/circuit_component/bot_circuit/Initialize(mapload) . = ..() north = add_input_port("Move North", PORT_TYPE_SIGNAL) east = add_input_port("Move East", PORT_TYPE_SIGNAL) diff --git a/code/modules/wiremod/shell/moneybot.dm b/code/modules/wiremod/shell/moneybot.dm index fe3cd30733..133f0a5e59 100644 --- a/code/modules/wiremod/shell/moneybot.dm +++ b/code/modules/wiremod/shell/moneybot.dm @@ -22,7 +22,7 @@ stored_money += to_add SEND_SIGNAL(src, COMSIG_MONEYBOT_ADD_MONEY, to_add) -/obj/structure/money_bot/Initialize() +/obj/structure/money_bot/Initialize(mapload) . = ..() AddComponent(/datum/component/shell, list( new /obj/item/circuit_component/money_bot(), @@ -49,7 +49,7 @@ var/obj/structure/money_bot/attached_bot -/obj/item/circuit_component/money_dispenser/Initialize() +/obj/item/circuit_component/money_dispenser/Initialize(mapload) . = ..() dispense_amount = add_input_port("Amount", PORT_TYPE_NUMBER) on_fail = add_output_port("On Failed", PORT_TYPE_SIGNAL) @@ -93,7 +93,7 @@ /// The person who input the money var/datum/port/output/entity -/obj/item/circuit_component/money_bot/Initialize() +/obj/item/circuit_component/money_bot/Initialize(mapload) . = ..() total_money = add_output_port("Total Money", PORT_TYPE_NUMBER) money_input = add_output_port("Last Input Money", PORT_TYPE_NUMBER) diff --git a/code/modules/wiremod/shell/scanner.dm b/code/modules/wiremod/shell/scanner.dm index fd46910914..3120ac192a 100644 --- a/code/modules/wiremod/shell/scanner.dm +++ b/code/modules/wiremod/shell/scanner.dm @@ -14,7 +14,7 @@ light_system = MOVABLE_LIGHT_DIRECTIONAL light_on = FALSE -/obj/item/wiremod_scanner/Initialize() +/obj/item/wiremod_scanner/Initialize(mapload) . = ..() AddComponent(/datum/component/shell, list( new /obj/item/circuit_component/wiremod_scanner() @@ -35,7 +35,7 @@ -/obj/item/circuit_component/wiremod_scanner/Initialize() +/obj/item/circuit_component/wiremod_scanner/Initialize(mapload) . = ..() attacker = add_output_port("Scanner", PORT_TYPE_ATOM) attacking = add_output_port("Scanned Entity", PORT_TYPE_ATOM) diff --git a/code/modules/wiremod/shell/scanner_gate.dm b/code/modules/wiremod/shell/scanner_gate.dm index 312c690bd8..b8484f3182 100644 --- a/code/modules/wiremod/shell/scanner_gate.dm +++ b/code/modules/wiremod/shell/scanner_gate.dm @@ -5,7 +5,7 @@ icon_state = "scangate_black" var/scanline_timer -/obj/structure/scanner_gate_shell/Initialize() +/obj/structure/scanner_gate_shell/Initialize(mapload) . = ..() set_scanline("passive") var/static/list/loc_connections = list( @@ -45,7 +45,7 @@ var/obj/structure/scanner_gate_shell/attached_gate -/obj/item/circuit_component/scanner_gate/Initialize() +/obj/item/circuit_component/scanner_gate/Initialize(mapload) . = ..() scanned = add_output_port("Scanned Object", PORT_TYPE_ATOM) diff --git a/code/modules/wiremod/shell/server.dm b/code/modules/wiremod/shell/server.dm index 5e5a44f897..57c4945e2c 100644 --- a/code/modules/wiremod/shell/server.dm +++ b/code/modules/wiremod/shell/server.dm @@ -13,7 +13,7 @@ light_system = MOVABLE_LIGHT light_on = FALSE -/obj/structure/server/Initialize() +/obj/structure/server/Initialize(mapload) . = ..() AddComponent(/datum/component/shell, null, SHELL_CAPACITY_VERY_LARGE, SHELL_FLAG_REQUIRE_ANCHOR|SHELL_FLAG_USB_PORT) diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm index f208cafe4e..2c5adc3585 100644 --- a/code/modules/zombie/items.dm +++ b/code/modules/zombie/items.dm @@ -19,7 +19,7 @@ wound_bonus = -30 bare_wound_bonus = 15 -/obj/item/zombie_hand/Initialize() +/obj/item/zombie_hand/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT) diff --git a/code/modules/zombie/organs.dm b/code/modules/zombie/organs.dm index a724d26314..d8908ee21a 100644 --- a/code/modules/zombie/organs.dm +++ b/code/modules/zombie/organs.dm @@ -13,7 +13,7 @@ var/revive_time_max = 700 var/timer_id -/obj/item/organ/zombie_infection/Initialize() +/obj/item/organ/zombie_infection/Initialize(mapload) . = ..() if(iscarbon(loc)) Insert(loc) diff --git a/modular_citadel/code/modules/clothing/neck.dm b/modular_citadel/code/modules/clothing/neck.dm index f57e2ae530..9507e65e0e 100644 --- a/modular_citadel/code/modules/clothing/neck.dm +++ b/modular_citadel/code/modules/clothing/neck.dm @@ -18,6 +18,6 @@ playsound(owner, 'sound/misc/souldeath.ogg', 100, FALSE) -/obj/item/clothing/neck/undertale/Initialize() +/obj/item/clothing/neck/undertale/Initialize(mapload) ..() AddComponent(/datum/component/souldeath/neck) diff --git a/modular_citadel/code/modules/custom_loadout/custom_items.dm b/modular_citadel/code/modules/custom_loadout/custom_items.dm index b8ee221e73..e8bbc5ac45 100644 --- a/modular_citadel/code/modules/custom_loadout/custom_items.dm +++ b/modular_citadel/code/modules/custom_loadout/custom_items.dm @@ -137,7 +137,7 @@ item_state = "satchel_carrot" mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' -/obj/item/storage/backpack/satchel/carrot/Initialize() +/obj/item/storage/backpack/satchel/carrot/Initialize(mapload) . = ..() AddComponent(/datum/component/squeak, list('sound/items/toysqueak1.ogg'=1), 50) diff --git a/modular_citadel/code/modules/eventmaps/Spookystation/JTGSZwork.dm b/modular_citadel/code/modules/eventmaps/Spookystation/JTGSZwork.dm index 85bbf109bf..a2ccc319d0 100644 --- a/modular_citadel/code/modules/eventmaps/Spookystation/JTGSZwork.dm +++ b/modular_citadel/code/modules/eventmaps/Spookystation/JTGSZwork.dm @@ -179,7 +179,7 @@ heavyfootstep = FOOTSTEP_GENERIC_HEAVY var/turfverb = "dig out" -/turf/open/floor/spooktime/nonspooktimegrass/Initialize() //Init rng icon. +/turf/open/floor/spooktime/nonspooktimegrass/Initialize(mapload) //Init rng icon. . = ..() icon_state = "grass_[rand(1,3)]" @@ -264,7 +264,7 @@ var/obj/structure/flora/turfDebris = null -/turf/open/floor/spooktime/spooktimegrass/Initialize() //Considering adding dirtgen here too. +/turf/open/floor/spooktime/spooktimegrass/Initialize(mapload) //Considering adding dirtgen here too. . = ..() if(prob(1)) icon_state = "smoothdarkdirt" //Sometimes we can be dirt. @@ -590,7 +590,7 @@ GLOBAL_LIST_EMPTY(rain_sounds) var/dyndial_cycle_ticker = 0 //How many var/playchime = 1 //Procs will reset their vars. -/obj/machinery/grandfatherclock/Initialize() +/obj/machinery/grandfatherclock/Initialize(mapload) . = ..() update_icon() //We get it done @@ -1030,7 +1030,7 @@ GLOBAL_LIST_EMPTY(rain_sounds) w_class = WEIGHT_CLASS_SMALL var/open = FALSE -/obj/item/umbrella/Initialize() +/obj/item/umbrella/Initialize(mapload) ..() color = RANDOM_COLOUR update_icon() diff --git a/modular_citadel/code/modules/festive/wheelchair.dm b/modular_citadel/code/modules/festive/wheelchair.dm index b4a1acd81c..75f2756449 100644 --- a/modular_citadel/code/modules/festive/wheelchair.dm +++ b/modular_citadel/code/modules/festive/wheelchair.dm @@ -1,4 +1,4 @@ -/obj/vehicle/sealed/vectorcraft/rideable/Initialize() +/obj/vehicle/sealed/vectorcraft/rideable/Initialize(mapload) . = ..() /obj/vehicle/sealed/vectorcraft/rideable/post_unbuckle_mob(mob/living/M) diff --git a/modular_citadel/code/modules/vectorcrafts/vectorcraft.dm b/modular_citadel/code/modules/vectorcrafts/vectorcraft.dm index bbb0ff86e8..399a1c5f06 100644 --- a/modular_citadel/code/modules/vectorcrafts/vectorcraft.dm +++ b/modular_citadel/code/modules/vectorcrafts/vectorcraft.dm @@ -35,7 +35,7 @@ var/mob/living/carbon/human/driver -/obj/vehicle/sealed/vectorcraft/Initialize() +/obj/vehicle/sealed/vectorcraft/Initialize(mapload) ..() i_m_acell = max_acceleration i_m_decell = max_deceleration diff --git a/modular_citadel/code/modules/vectorcrafts/vectortruck.dm b/modular_citadel/code/modules/vectorcrafts/vectortruck.dm index ef02584510..c46a81df59 100644 --- a/modular_citadel/code/modules/vectorcrafts/vectortruck.dm +++ b/modular_citadel/code/modules/vectorcrafts/vectortruck.dm @@ -47,7 +47,7 @@ var/weewoo = FALSE var/weewoocount = 0 -/obj/vehicle/sealed/vectorcraft/boot/ambulance/Initialize() +/obj/vehicle/sealed/vectorcraft/boot/ambulance/Initialize(mapload) . = ..() Sl = new /obj/machinery/sleeper From be46eba4651f03ab6dbc4766e77ea247847fa4a6 Mon Sep 17 00:00:00 2001 From: Artur <24881678+Arturlang@users.noreply.github.com> Date: Thu, 7 Apr 2022 14:10:51 +0300 Subject: [PATCH 23/53] Moves stasis handling to component-based --- code/datums/status_effects/debuffs.dm | 15 ++++++--------- code/modules/mob/living/life.dm | 4 ++-- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index b7680c0d80..6737c2d034 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -154,25 +154,22 @@ . = ..() if(!.) return - owner.mobility_flags &= ~MOBILITY_USE - owner.mobility_flags &= ~MOBILITY_PICKUP - owner.mobility_flags &= ~MOBILITY_PULL - owner.mobility_flags &= ~MOBILITY_HOLD + RegisterSignal(owner, COMSIG_LIVING_LIFE, .proc/InterruptBiologicalLife) + owner.mobility_flags &= ~(MOBILITY_USE | MOBILITY_PICKUP | MOBILITY_PULL | MOBILITY_HOLD) owner.update_mobility() owner.add_filter("stasis_status_ripple", 2, list("type" = "ripple", "flags" = WAVE_BOUNDED, "radius" = 0, "size" = 2)) var/filter = owner.get_filter("stasis_status_ripple") animate(filter, radius = 32, time = 15, size = 0, loop = -1) +/datum/status_effect/grouped/stasis/proc/InterruptBiologicalLife() + return COMPONENT_INTERRUPT_LIFE_BIOLOGICAL /datum/status_effect/grouped/stasis/tick() update_time_of_death() /datum/status_effect/grouped/stasis/on_remove() - owner.mobility_flags |= MOBILITY_USE - owner.mobility_flags |= MOBILITY_PICKUP - owner.mobility_flags |= MOBILITY_PULL - owner.mobility_flags |= MOBILITY_HOLD - owner.update_mobility() + UnregisterSignal(owner, COMSIG_LIVING_LIFE) + owner.mobility_flags |= MOBILITY_USE | MOBILITY_PICKUP | MOBILITY_PULL | MOBILITY_HOLD owner.remove_filter("stasis_status_ripple") update_time_of_death() return ..() diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index dd050bda3e..6909100161 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -6,12 +6,11 @@ SHOULD_NOT_SLEEP(TRUE) if(mob_transforming) return - handle_traits() // eye, ear, brain damages handle_status_effects() //all special effects, stun, knockdown, jitteryness, hallucination, sleeping, etc . = SEND_SIGNAL(src, COMSIG_LIVING_LIFE, seconds, times_fired) if(!(. & COMPONENT_INTERRUPT_LIFE_PHYSICAL)) PhysicalLife(seconds, times_fired) - if(!(. & COMPONENT_INTERRUPT_LIFE_BIOLOGICAL) && !IS_IN_STASIS(src)) + if(!(. & COMPONENT_INTERRUPT_LIFE_BIOLOGICAL)) BiologicalLife(seconds, times_fired) // CODE BELOW SHOULD ONLY BE THINGS THAT SHOULD HAPPEN NO MATTER WHAT AND CAN NOT BE SUSPENDED! @@ -67,6 +66,7 @@ //stuff in the stomach handle_stomach() + handle_traits() // eye, ear, brain damages handle_block_parry(seconds) From c20a847712f27a3d519fc714799d75394b72e51c Mon Sep 17 00:00:00 2001 From: Artur <24881678+Arturlang@users.noreply.github.com> Date: Thu, 7 Apr 2022 14:28:38 +0300 Subject: [PATCH 24/53] Apparently unnecesary --- code/controllers/subsystem/vis_overlays.dm | 25 ++-------------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/code/controllers/subsystem/vis_overlays.dm b/code/controllers/subsystem/vis_overlays.dm index b672217480..c862b2a3e3 100644 --- a/code/controllers/subsystem/vis_overlays.dm +++ b/code/controllers/subsystem/vis_overlays.dm @@ -5,14 +5,10 @@ SUBSYSTEM_DEF(vis_overlays) init_order = INIT_ORDER_VIS var/list/vis_overlay_cache - var/list/unique_vis_overlays var/list/currentrun - var/datum/callback/rotate_cb /datum/controller/subsystem/vis_overlays/Initialize() vis_overlay_cache = list() - unique_vis_overlays = list() - rotate_cb = CALLBACK(src, .proc/rotate_vis_overlay) return ..() /datum/controller/subsystem/vis_overlays/fire(resumed = FALSE) @@ -32,7 +28,7 @@ SUBSYSTEM_DEF(vis_overlays) if(MC_TICK_CHECK) return -//the "thing" var can be anything with vis_contents which includes images +//the "thing" var can be anything with vis_contents which includes images - in the future someone should totally allow vis overlays to be passed in as an arg instead of all this bullshit /datum/controller/subsystem/vis_overlays/proc/add_vis_overlay(atom/movable/thing, icon, iconstate, layer, plane, dir, alpha = 255, add_appearance_flags = NONE, unique = FALSE) var/obj/effect/overlay/vis/overlay if(!unique) @@ -47,7 +43,6 @@ SUBSYSTEM_DEF(vis_overlays) overlay = _create_new_vis_overlay(icon, iconstate, layer, plane, dir, alpha, add_appearance_flags) overlay.cache_expiration = -1 var/cache_id = "\ref[overlay]@{[world.time]}" - unique_vis_overlays += overlay vis_overlay_cache[cache_id] = overlay . = overlay thing.vis_contents += overlay @@ -57,7 +52,6 @@ SUBSYSTEM_DEF(vis_overlays) if(!thing.managed_vis_overlays) thing.managed_vis_overlays = list(overlay) - RegisterSignal(thing, COMSIG_ATOM_DIR_CHANGE, rotate_cb) else thing.managed_vis_overlays += overlay return overlay @@ -80,19 +74,4 @@ SUBSYSTEM_DEF(vis_overlays) return thing.managed_vis_overlays -= overlays if(!length(thing.managed_vis_overlays)) - thing.managed_vis_overlays = null - UnregisterSignal(thing, COMSIG_ATOM_DIR_CHANGE) - -/datum/controller/subsystem/vis_overlays/proc/rotate_vis_overlay(atom/thing, old_dir, new_dir) - if(old_dir == new_dir) - return - var/rotation = dir2angle(old_dir) - dir2angle(new_dir) - var/list/overlays_to_remove = list() - for(var/i in thing.managed_vis_overlays - unique_vis_overlays) - var/obj/effect/overlay/vis/overlay = i - add_vis_overlay(thing, overlay.icon, overlay.icon_state, overlay.layer, overlay.plane, turn(overlay.dir, rotation), overlay.alpha, overlay.appearance_flags) - overlays_to_remove += overlay - for(var/i in thing.managed_vis_overlays & unique_vis_overlays) - var/obj/effect/overlay/vis/overlay = i - overlay.dir = turn(overlay.dir, rotation) - remove_vis_overlay(thing, overlays_to_remove) + thing.managed_vis_overlays = null \ No newline at end of file From 2100133c4bf9b105a8f248ffd14f700f4f761baa Mon Sep 17 00:00:00 2001 From: Artur <24881678+Arturlang@users.noreply.github.com> Date: Thu, 7 Apr 2022 14:34:19 +0300 Subject: [PATCH 25/53] Neeewliiines --- code/controllers/subsystem/vis_overlays.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/controllers/subsystem/vis_overlays.dm b/code/controllers/subsystem/vis_overlays.dm index c862b2a3e3..0572532fda 100644 --- a/code/controllers/subsystem/vis_overlays.dm +++ b/code/controllers/subsystem/vis_overlays.dm @@ -74,4 +74,4 @@ SUBSYSTEM_DEF(vis_overlays) return thing.managed_vis_overlays -= overlays if(!length(thing.managed_vis_overlays)) - thing.managed_vis_overlays = null \ No newline at end of file + thing.managed_vis_overlays = null From 3980c97d61484930da7e014849cdcd87599694d0 Mon Sep 17 00:00:00 2001 From: Artur <24881678+Arturlang@users.noreply.github.com> Date: Thu, 7 Apr 2022 15:32:22 +0300 Subject: [PATCH 26/53] whoops wrong order --- code/modules/mob/living/life.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 6909100161..05c2267b47 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -66,10 +66,11 @@ //stuff in the stomach handle_stomach() - handle_traits() // eye, ear, brain damages handle_block_parry(seconds) + handle_traits() // eye, ear, brain damages + return TRUE /** From 66ce34caa58579b4aadf6deb5194e497e2df9171 Mon Sep 17 00:00:00 2001 From: Artur <24881678+Arturlang@users.noreply.github.com> Date: Thu, 7 Apr 2022 15:54:13 +0300 Subject: [PATCH 27/53] Signal and moves it to the back --- code/__DEFINES/dcs/signals.dm | 1 + code/modules/mob/living/life.dm | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index dad0f49832..12ec74e619 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -385,6 +385,7 @@ #define COMSIG_LIVING_LIFE "life_tick" //from base of mob/living/Life() (seconds, times_fired) #define COMPONENT_INTERRUPT_LIFE_BIOLOGICAL 1 // interrupt biological processes #define COMPONENT_INTERRUPT_LIFE_PHYSICAL 2 // interrupt physical handling + #define COMPONET_INTERRUPT_STATUS_EFFECTS 3 // interrupt status effects #define COMSIG_LIVING_BIOLOGICAL_LIFE "biological_life" //from base of mob/living/BiologicalLife() (seconds, times_fired) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 05c2267b47..447256cb69 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -6,13 +6,13 @@ SHOULD_NOT_SLEEP(TRUE) if(mob_transforming) return - handle_status_effects() //all special effects, stun, knockdown, jitteryness, hallucination, sleeping, etc . = SEND_SIGNAL(src, COMSIG_LIVING_LIFE, seconds, times_fired) if(!(. & COMPONENT_INTERRUPT_LIFE_PHYSICAL)) PhysicalLife(seconds, times_fired) if(!(. & COMPONENT_INTERRUPT_LIFE_BIOLOGICAL)) BiologicalLife(seconds, times_fired) - + if(!(. & COMPONET_INTERRUPT_STATUS_EFFECTS)) + handle_status_effects() //all special effects, stun, knockdown, jitteryness, hallucination, sleeping, etc // CODE BELOW SHOULD ONLY BE THINGS THAT SHOULD HAPPEN NO MATTER WHAT AND CAN NOT BE SUSPENDED! // Otherwise, it goes into one of the two split Life procs! From 6662fc5aa3e2d17704d14b0b5069ac3f206d7b66 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 8 Apr 2022 11:45:23 -0500 Subject: [PATCH 28/53] Automatic changelog generation for PR #15582 [ci skip] --- html/changelogs/AutoChangeLog-pr-15582.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-15582.yml diff --git a/html/changelogs/AutoChangeLog-pr-15582.yml b/html/changelogs/AutoChangeLog-pr-15582.yml new file mode 100644 index 0000000000..12046285ce --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15582.yml @@ -0,0 +1,4 @@ +author: "AnthurK" +delete-after: True +changes: + - bugfix: "Fixes bots trying to path through dense corners." From 46ed520d79b182ebb8fe1566182fb9fdd4fa1566 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 8 Apr 2022 11:47:29 -0500 Subject: [PATCH 29/53] Automatic changelog generation for PR #15584 [ci skip] --- html/changelogs/AutoChangeLog-pr-15584.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-15584.yml diff --git a/html/changelogs/AutoChangeLog-pr-15584.yml b/html/changelogs/AutoChangeLog-pr-15584.yml new file mode 100644 index 0000000000..dad2b540e9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15584.yml @@ -0,0 +1,5 @@ +author: "Arturlang" +delete-after: True +changes: + - rscadd: "Adds stasis beds and related mechanics" + - rscdel: "Removed mapped in sleepers from station maps. Shuttles have it but centcomm doesn't." From 1bb76168c4542b8533421d18f7d0e04849d19793 Mon Sep 17 00:00:00 2001 From: SandPoot Date: Fri, 8 Apr 2022 14:12:26 -0300 Subject: [PATCH 30/53] fix --- code/modules/vehicles/mecha/equipment/mecha_equipment.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/vehicles/mecha/equipment/mecha_equipment.dm b/code/modules/vehicles/mecha/equipment/mecha_equipment.dm index ce4e76ed92..1d104291f3 100644 --- a/code/modules/vehicles/mecha/equipment/mecha_equipment.dm +++ b/code/modules/vehicles/mecha/equipment/mecha_equipment.dm @@ -100,7 +100,7 @@ if(!chassis) return FALSE chassis.use_power(energy_drain) - return do_after(user, equip_cooldown, target, extra_checks = CALLBACK(src, .proc/do_after_checks, target), interaction_key = interaction_key) + return do_after(user, equip_cooldown, target, extra_checks = CALLBACK(src, .proc/do_after_checks, target)) /obj/item/mecha_parts/mecha_equipment/proc/do_after_mecha(atom/target, mob/user, delay) return do_after(user, delay, target, extra_checks = CALLBACK(src, .proc/do_after_checks, target)) From 64d18a305065f11448158e11596f7661606c84f3 Mon Sep 17 00:00:00 2001 From: SandPoot Date: Fri, 8 Apr 2022 21:09:29 -0300 Subject: [PATCH 31/53] Update preferences_savefile.dm --- code/modules/client/preferences_savefile.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index ecc2661cf8..2a65cae9b6 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -804,6 +804,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //balls features S["feature_has_balls"] >> features["has_balls"] S["feature_balls_color"] >> features["balls_color"] + S["feature_balls_shape"] >> features["balls_shape"] S["feature_balls_size"] >> features["balls_size"] S["feature_balls_visibility"] >> features["balls_visibility"] //breasts features @@ -1121,6 +1122,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["feature_has_balls"], features["has_balls"]) WRITE_FILE(S["feature_balls_color"], features["balls_color"]) + WRITE_FILE(S["feature_balls_shape"], features["balls_shape"]) WRITE_FILE(S["feature_balls_size"], features["balls_size"]) WRITE_FILE(S["feature_balls_visibility"], features["balls_visibility"]) From df7d834098de7aa4bf21b12d4c09ca6589582a4c Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sat, 9 Apr 2022 00:39:55 +0000 Subject: [PATCH 32/53] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-15582.yml | 4 ---- html/changelogs/AutoChangeLog-pr-15584.yml | 5 ----- html/changelogs/archive/2022-04.yml | 7 +++++++ 3 files changed, 7 insertions(+), 9 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-15582.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-15584.yml diff --git a/html/changelogs/AutoChangeLog-pr-15582.yml b/html/changelogs/AutoChangeLog-pr-15582.yml deleted file mode 100644 index 12046285ce..0000000000 --- a/html/changelogs/AutoChangeLog-pr-15582.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "AnthurK" -delete-after: True -changes: - - bugfix: "Fixes bots trying to path through dense corners." diff --git a/html/changelogs/AutoChangeLog-pr-15584.yml b/html/changelogs/AutoChangeLog-pr-15584.yml deleted file mode 100644 index dad2b540e9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-15584.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Arturlang" -delete-after: True -changes: - - rscadd: "Adds stasis beds and related mechanics" - - rscdel: "Removed mapped in sleepers from station maps. Shuttles have it but centcomm doesn't." diff --git a/html/changelogs/archive/2022-04.yml b/html/changelogs/archive/2022-04.yml index 8bec165163..3aac446326 100644 --- a/html/changelogs/archive/2022-04.yml +++ b/html/changelogs/archive/2022-04.yml @@ -1,3 +1,10 @@ 2022-04-08: SandPoot: - bugfix: Make changelogs actually get added! +2022-04-09: + AnthurK: + - bugfix: Fixes bots trying to path through dense corners. + Arturlang: + - rscadd: Adds stasis beds and related mechanics + - rscdel: Removed mapped in sleepers from station maps. Shuttles have it but centcomm + doesn't. From 3d91de2f1085b951a5825ae2b885da8d9fb1695d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 8 Apr 2022 20:26:50 -0500 Subject: [PATCH 33/53] Automatic changelog generation for PR #15558 [ci skip] --- html/changelogs/AutoChangeLog-pr-15558.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-15558.yml diff --git a/html/changelogs/AutoChangeLog-pr-15558.yml b/html/changelogs/AutoChangeLog-pr-15558.yml new file mode 100644 index 0000000000..a8c108c22b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15558.yml @@ -0,0 +1,4 @@ +author: "tiviplus, lolman360, SandPoot" +delete-after: True +changes: + - refactor: "/obj/mecha > /obj/vehicle/sealed/mecha" From d6624eb705bcb9d9cce8eb15de4170e7d0013ba7 Mon Sep 17 00:00:00 2001 From: SandPoot Date: Sat, 9 Apr 2022 00:03:33 -0300 Subject: [PATCH 34/53] mech updat --- code/modules/vehicles/mecha/_mecha.dm | 2 +- code/modules/vehicles/mecha/combat/durand.dm | 2 +- code/modules/vehicles/mecha/combat/gygax.dm | 2 +- code/modules/vehicles/mecha/equipment/tools/work_tools.dm | 4 ++-- code/modules/vehicles/mecha/working/ripley.dm | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm index 6b8642764e..8af35d5795 100644 --- a/code/modules/vehicles/mecha/_mecha.dm +++ b/code/modules/vehicles/mecha/_mecha.dm @@ -168,7 +168,7 @@ /obj/item/radio/mech //this has to go somewhere -/obj/vehicle/sealed/mecha/Initialize() +/obj/vehicle/sealed/mecha/Initialize(mapload) . = ..() add_radio() add_cabin() diff --git a/code/modules/vehicles/mecha/combat/durand.dm b/code/modules/vehicles/mecha/combat/durand.dm index 70edd9df89..36c5f75984 100644 --- a/code/modules/vehicles/mecha/combat/durand.dm +++ b/code/modules/vehicles/mecha/combat/durand.dm @@ -13,7 +13,7 @@ var/obj/durand_shield/shield -/obj/vehicle/sealed/mecha/combat/durand/Initialize() +/obj/vehicle/sealed/mecha/combat/durand/Initialize(mapload) . = ..() shield = new /obj/durand_shield(loc, src, layer, dir) RegisterSignal(src, COMSIG_MECHA_ACTION_TRIGGER, .proc/relay) diff --git a/code/modules/vehicles/mecha/combat/gygax.dm b/code/modules/vehicles/mecha/combat/gygax.dm index a90b776374..29746a5fc7 100644 --- a/code/modules/vehicles/mecha/combat/gygax.dm +++ b/code/modules/vehicles/mecha/combat/gygax.dm @@ -32,7 +32,7 @@ max_equip = 5 destruction_sleep_duration = 20 -/obj/vehicle/sealed/mecha/combat/gygax/dark/loaded/Initialize() +/obj/vehicle/sealed/mecha/combat/gygax/dark/loaded/Initialize(mapload) . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/thrusters/ion(src) ME.attach(src) diff --git a/code/modules/vehicles/mecha/equipment/tools/work_tools.dm b/code/modules/vehicles/mecha/equipment/tools/work_tools.dm index d3d4c8addc..dd9448a826 100644 --- a/code/modules/vehicles/mecha/equipment/tools/work_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/work_tools.dm @@ -193,7 +193,7 @@ range = MECHA_MELEE|MECHA_RANGED mech_flags = EXOSUIT_MODULE_WORKING -/obj/item/mecha_parts/mecha_equipment/extinguisher/Initialize() +/obj/item/mecha_parts/mecha_equipment/extinguisher/Initialize(mapload) . = ..() create_reagents(1000) reagents.add_reagent(/datum/reagent/water, 1000) @@ -262,7 +262,7 @@ item_flags = NO_MAT_REDEMPTION var/mode = 0 //0 - deconstruct, 1 - wall or floor, 2 - airlock. -/obj/item/mecha_parts/mecha_equipment/rcd/Initialize() +/obj/item/mecha_parts/mecha_equipment/rcd/Initialize(mapload) . = ..() GLOB.rcd_list += src diff --git a/code/modules/vehicles/mecha/working/ripley.dm b/code/modules/vehicles/mecha/working/ripley.dm index 0d083d4bde..58b611c1a3 100644 --- a/code/modules/vehicles/mecha/working/ripley.dm +++ b/code/modules/vehicles/mecha/working/ripley.dm @@ -35,7 +35,7 @@ possible_int_damage -= (MECHA_INT_TEMP_CONTROL + MECHA_INT_TANK_BREACH) //if we don't even have an air tank, these two doesn't make a ton of sense. . = ..() -/obj/vehicle/sealed/mecha/working/ripley/Initialize() +/obj/vehicle/sealed/mecha/working/ripley/Initialize(mapload) . = ..() AddComponent(/datum/component/armor_plate,3,/obj/item/stack/sheet/animalhide/goliath_hide,list(MELEE = 10, BULLET = 5, LASER = 5)) @@ -101,7 +101,7 @@ enter_delay = 40 silicon_icon_state = null -/obj/vehicle/sealed/mecha/working/ripley/deathripley/Initialize() +/obj/vehicle/sealed/mecha/working/ripley/deathripley/Initialize(mapload) . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/kill ME.attach(src) @@ -109,7 +109,7 @@ /obj/vehicle/sealed/mecha/working/ripley/deathripley/real desc = "OH SHIT IT'S THE DEATHSQUAD WE'RE ALL GONNA DIE. FOR REAL" -/obj/vehicle/sealed/mecha/working/ripley/deathripley/real/Initialize() +/obj/vehicle/sealed/mecha/working/ripley/deathripley/real/Initialize(mapload) . = ..() for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) E.detach() @@ -123,7 +123,7 @@ name = "\improper APLU \"Miner\"" obj_integrity = 75 //Low starting health -/obj/vehicle/sealed/mecha/working/ripley/mining/Initialize() +/obj/vehicle/sealed/mecha/working/ripley/mining/Initialize(mapload) . = ..() if(cell) cell.charge = FLOOR(cell.charge * 0.25, 1) //Starts at very low charge From 2be69d364178b26a71735e9b2b683092f49d707e Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 9 Apr 2022 00:01:11 -0500 Subject: [PATCH 35/53] Automatic changelog generation for PR #15539 [ci skip] --- html/changelogs/AutoChangeLog-pr-15539.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-15539.yml diff --git a/html/changelogs/AutoChangeLog-pr-15539.yml b/html/changelogs/AutoChangeLog-pr-15539.yml new file mode 100644 index 0000000000..879fb0a209 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15539.yml @@ -0,0 +1,6 @@ +author: "Solaris-Shade" +delete-after: True +changes: + - bugfix: "fixed a few projectile lines" + - code_imp: "changed a large block of the projectile code" + - refactor: "refactored most of the projectile code" From 9ad734034a6af2f69438109e4182143bdeeca9d3 Mon Sep 17 00:00:00 2001 From: SandPoot Date: Sat, 9 Apr 2022 02:42:01 -0300 Subject: [PATCH 36/53] Update mecha_construction_paths.dm --- .../mecha/mecha_construction_paths.dm | 176 +----------------- 1 file changed, 8 insertions(+), 168 deletions(-) diff --git a/code/modules/vehicles/mecha/mecha_construction_paths.dm b/code/modules/vehicles/mecha/mecha_construction_paths.dm index d0fa7aca0b..e1de113f16 100644 --- a/code/modules/vehicles/mecha/mecha_construction_paths.dm +++ b/code/modules/vehicles/mecha/mecha_construction_paths.dm @@ -420,9 +420,6 @@ outer_plating=/obj/item/mecha_parts/part/gygax_armor outer_plating_amount=1 -/datum/component/construction/mecha/gygax/action(datum/source, atom/used_atom, mob/user) - return check_step(used_atom,user) - /datum/component/construction/mecha/gygax/custom_action(obj/item/I, mob/living/user, diff) if(!..()) return FALSE @@ -552,173 +549,16 @@ /datum/component/construction/mecha/medigax result = /obj/vehicle/sealed/mecha/medical/medigax base_icon = "medigax" - steps = list( - //1 - list( - "key" = TOOL_WRENCH, - "desc" = "The hydraulic systems are disconnected." - ), - //2 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_WRENCH, - "desc" = "The hydraulic systems are connected." - ), + circuit_control = /obj/item/circuitboard/mecha/gygax/main + circuit_periph = /obj/item/circuitboard/mecha/gygax/peripherals + circuit_weapon = /obj/item/circuitboard/mecha/gygax/targeting - //3 - list( - "key" = /obj/item/stack/cable_coil, - "amount" = 5, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The hydraulic systems are active." - ), + inner_plating = /obj/item/stack/sheet/metal + inner_plating_amount = 5 - //4 - list( - "key" = TOOL_WIRECUTTER, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The wiring is added." - ), - - //5 - list( - "key" = /obj/item/circuitboard/mecha/gygax/main, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The wiring is adjusted." - ), - - //6 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Central control module is installed." - ), - - //7 - list( - "key" = /obj/item/circuitboard/mecha/gygax/peripherals, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Central control module is secured." - ), - - //8 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Peripherals control module is installed." - ), - - //9 - list( - "key" = /obj/item/circuitboard/mecha/gygax/targeting, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Peripherals control module is secured." - ), - - //10 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Weapon control module is installed." - ), - - //11 - list( - "key" = /obj/item/stock_parts/scanning_module, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Weapon control module is secured." - ), - - //12 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Scanner module is installed." - ), - - //13 - list( - "key" = /obj/item/stock_parts/capacitor, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Scanner module is secured." - ), - - //14 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Capacitor is installed." - ), - - //15 - list( - "key" = /obj/item/stock_parts/cell, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Capacitor is secured." - ), - - //16 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "The power cell is installed." - ), - - //17 - list( - "key" = /obj/item/stack/sheet/metal, - "amount" = 5, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The power cell is secured." - ), - - //18 - list( - "key" = TOOL_WRENCH, - "back_key" = TOOL_CROWBAR, - "desc" = "Internal armor is installed." - ), - - //19 - list( - "key" = TOOL_WELDER, - "back_key" = TOOL_WRENCH, - "desc" = "Internal armor is wrenched." - ), - - //20 - list( - "key" = /obj/item/mecha_parts/part/medigax_armor, - "action" = ITEM_DELETE, - "back_key" = TOOL_WELDER, - "desc" = "Internal armor is welded." - ), - - //21 - list( - "key" = TOOL_WRENCH, - "back_key" = TOOL_CROWBAR, - "desc" = "External armor is installed." - ), - - //22 - list( - "key" = TOOL_WELDER, - "back_key" = TOOL_WRENCH, - "desc" = "External armor is wrenched." - ), - - ) - -/datum/component/construction/mecha/medigax/action(datum/source, atom/used_atom, mob/user) - return check_step(used_atom,user) + outer_plating = /obj/item/mecha_parts/part/gygax_armor + outer_plating_amount = 1 /datum/component/construction/mecha/medigax/custom_action(obj/item/I, mob/living/user, diff) if(!..()) @@ -831,7 +671,7 @@ if(diff==FORWARD) user.visible_message("[user] welds Gygax Armor Plates to [parent].", "You weld Medical Gygax Armor Plates to [parent].") else - user.visible_message("[user] unfastens Gygax Armor Plates.", "You unfasten Medical Gygax Armor Plates.") + user.visible_message("[user] unfastens Gygax Armor Plates.", "You unfasten Medical Gygax Armor Plates.") return TRUE // End Medigax From 5e4aef0b30298af1a77fd9be93265ba243a18f12 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 9 Apr 2022 00:58:09 -0500 Subject: [PATCH 37/53] Automatic changelog generation for PR #15589 [ci skip] --- html/changelogs/AutoChangeLog-pr-15589.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-15589.yml diff --git a/html/changelogs/AutoChangeLog-pr-15589.yml b/html/changelogs/AutoChangeLog-pr-15589.yml new file mode 100644 index 0000000000..2a7c630ce5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15589.yml @@ -0,0 +1,4 @@ +author: "SandPoot" +delete-after: True +changes: + - bugfix: "Medigaxes can actually be built now." From 4e296b72d5759a3e852af2084c4160fab1484be9 Mon Sep 17 00:00:00 2001 From: SandPoot Date: Sat, 9 Apr 2022 15:42:57 -0300 Subject: [PATCH 38/53] Upload files --- code/modules/surgery/advanced/brainwashing.dm | 6 +++ code/modules/surgery/advanced/lobotomy.dm | 6 +++ code/modules/surgery/advanced/pacification.dm | 5 +++ code/modules/surgery/advanced/revival.dm | 13 +++++- code/modules/surgery/amputation.dm | 3 ++ code/modules/surgery/brain_surgery.dm | 5 +++ code/modules/surgery/burn_dressing.dm | 3 ++ code/modules/surgery/cavity_implant.dm | 5 +++ code/modules/surgery/coronary_bypass.dm | 7 +++- code/modules/surgery/healing.dm | 2 + code/modules/surgery/implant_removal.dm | 4 ++ code/modules/surgery/lobectomy.dm | 3 ++ code/modules/surgery/mechanic_steps.dm | 38 +++++++++++++++++- code/modules/surgery/organ_manipulation.dm | 13 ++++++ code/modules/surgery/organic_steps.dm | 14 ++++++- code/modules/surgery/surgery_step.dm | 23 +++++++++++ sound/items/taperecorder/tape_flip.ogg | Bin 0 -> 27500 bytes .../items/taperecorder/taperecorder_close.ogg | Bin 0 -> 35144 bytes .../taperecorder/taperecorder_hiss_mid.ogg | Bin 0 -> 12177 bytes .../taperecorder/taperecorder_hiss_start.ogg | Bin 0 -> 12159 bytes .../items/taperecorder/taperecorder_open.ogg | Bin 0 -> 33754 bytes .../items/taperecorder/taperecorder_play.ogg | Bin 0 -> 11670 bytes .../items/taperecorder/taperecorder_print.ogg | Bin 0 -> 49899 bytes .../items/taperecorder/taperecorder_stop.ogg | Bin 0 -> 14779 bytes sound/surgery/cautery1.ogg | Bin 0 -> 127266 bytes sound/surgery/cautery2.ogg | Bin 0 -> 52245 bytes sound/surgery/hemostat1.ogg | Bin 0 -> 42370 bytes sound/surgery/organ1.ogg | Bin 0 -> 42592 bytes sound/surgery/organ2.ogg | Bin 0 -> 49272 bytes sound/surgery/retractor1.ogg | Bin 0 -> 30878 bytes sound/surgery/retractor2.ogg | Bin 0 -> 23753 bytes sound/surgery/saw.ogg | Bin 0 -> 173111 bytes sound/surgery/scalpel1.ogg | Bin 0 -> 38883 bytes sound/surgery/scalpel2.ogg | Bin 0 -> 33847 bytes 34 files changed, 144 insertions(+), 6 deletions(-) create mode 100644 sound/items/taperecorder/tape_flip.ogg create mode 100644 sound/items/taperecorder/taperecorder_close.ogg create mode 100644 sound/items/taperecorder/taperecorder_hiss_mid.ogg create mode 100644 sound/items/taperecorder/taperecorder_hiss_start.ogg create mode 100644 sound/items/taperecorder/taperecorder_open.ogg create mode 100644 sound/items/taperecorder/taperecorder_play.ogg create mode 100644 sound/items/taperecorder/taperecorder_print.ogg create mode 100644 sound/items/taperecorder/taperecorder_stop.ogg create mode 100644 sound/surgery/cautery1.ogg create mode 100644 sound/surgery/cautery2.ogg create mode 100644 sound/surgery/hemostat1.ogg create mode 100644 sound/surgery/organ1.ogg create mode 100644 sound/surgery/organ2.ogg create mode 100644 sound/surgery/retractor1.ogg create mode 100644 sound/surgery/retractor2.ogg create mode 100644 sound/surgery/saw.ogg create mode 100644 sound/surgery/scalpel1.ogg create mode 100644 sound/surgery/scalpel2.ogg diff --git a/code/modules/surgery/advanced/brainwashing.dm b/code/modules/surgery/advanced/brainwashing.dm index 2a09fd2b93..01eb22c0a8 100644 --- a/code/modules/surgery/advanced/brainwashing.dm +++ b/code/modules/surgery/advanced/brainwashing.dm @@ -2,6 +2,7 @@ name = "Brainwashing Surgery Disk" desc = "The disk provides instructions on how to impress an order on a brain, making it the primary objective of the patient." surgeries = list(/datum/surgery/advanced/brainwashing) + /datum/surgery/advanced/brainwashing name = "Brainwashing" desc = "A surgical procedure which directly implants a directive into the patient's brain, making it their absolute priority. It can be cleared using a mindshield implant." @@ -23,11 +24,16 @@ if(!B) return FALSE return TRUE + /datum/surgery_step/brainwash name = "brainwash" implements = list(TOOL_HEMOSTAT = 85, TOOL_WIRECUTTER = 50, /obj/item/stack/packageWrap = 35, /obj/item/stack/cable_coil = 15) time = 200 + preop_sound = 'sound/surgery/hemostat1.ogg' + success_sound = 'sound/surgery/hemostat1.ogg' + failure_sound = 'sound/surgery/organ2.ogg' var/objective + /datum/surgery_step/brainwash/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) objective = stripped_input(user, "Choose the objective to imprint on your victim's brain.", "Brainwashing", null, MAX_MESSAGE_LEN) if(!objective) diff --git a/code/modules/surgery/advanced/lobotomy.dm b/code/modules/surgery/advanced/lobotomy.dm index b3b3b4aa1d..fdc5e9b522 100644 --- a/code/modules/surgery/advanced/lobotomy.dm +++ b/code/modules/surgery/advanced/lobotomy.dm @@ -12,6 +12,7 @@ target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) possible_locs = list(BODY_ZONE_HEAD) requires_bodypart_type = 0 + /datum/surgery/advanced/lobotomy/can_start(mob/user, mob/living/carbon/target, obj/item/tool) if(!..()) return FALSE @@ -19,11 +20,16 @@ if(!B) return FALSE return TRUE + /datum/surgery_step/lobotomize name = "perform lobotomy" implements = list(TOOL_SCALPEL = 85, /obj/item/melee/transforming/energy/sword = 55, /obj/item/kitchen/knife = 35, /obj/item/shard = 25, /obj/item = 20) time = 100 + preop_sound = 'sound/surgery/scalpel1.ogg' + success_sound = 'sound/surgery/scalpel2.ogg' + failure_sound = 'sound/surgery/organ2.ogg' + /datum/surgery_step/lobotomize/tool_check(mob/user, obj/item/tool) if(implement_type == /obj/item && !tool.get_sharpness()) return FALSE diff --git a/code/modules/surgery/advanced/pacification.dm b/code/modules/surgery/advanced/pacification.dm index 7b85015420..4a68f93a06 100644 --- a/code/modules/surgery/advanced/pacification.dm +++ b/code/modules/surgery/advanced/pacification.dm @@ -11,15 +11,20 @@ target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) possible_locs = list(BODY_ZONE_HEAD) requires_bodypart_type = 0 + /datum/surgery/advanced/pacify/can_start(mob/user, mob/living/carbon/target, obj/item/tool) . = ..() var/obj/item/organ/brain/B = target.getorganslot(ORGAN_SLOT_BRAIN) if(!B) return FALSE + /datum/surgery_step/pacify name = "rewire brain" implements = list(TOOL_HEMOSTAT = 100, TOOL_SCREWDRIVER = 35, /obj/item/pen = 15) time = 40 + preop_sound = 'sound/surgery/hemostat1.ogg' + success_sound = 'sound/surgery/hemostat1.ogg' + failure_sound = 'sound/surgery/organ2.ogg' /datum/surgery_step/pacify/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to pacify [target]...", diff --git a/code/modules/surgery/advanced/revival.dm b/code/modules/surgery/advanced/revival.dm index 945dee48e7..eb186feafa 100644 --- a/code/modules/surgery/advanced/revival.dm +++ b/code/modules/surgery/advanced/revival.dm @@ -12,6 +12,7 @@ target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) possible_locs = list(BODY_ZONE_HEAD) requires_bodypart_type = 0 + /datum/surgery/advanced/revival/can_start(mob/user, mob/living/carbon/target, obj/item/tool) if(!..()) return FALSE @@ -23,10 +24,14 @@ if(!B) return FALSE return TRUE + /datum/surgery_step/revive name = "electrically stimulate brain" implements = list(/obj/item/shockpaddles = 100, /obj/item/abductor/gizmo = 100, /obj/item/rod_of_asclepius = 100, /obj/item/melee/baton = 75, /obj/item/organ/cyberimp/arm/baton = 75, /obj/item/organ/cyberimp/arm/gun/taser = 60, /obj/item/gun/energy/e_gun/advtaser = 60, /obj/item/gun/energy/taser = 60) time = 120 + success_sound = 'sound/magic/lightningbolt.ogg' + failure_sound = 'sound/magic/lightningbolt.ogg' + /datum/surgery_step/revive/tool_check(mob/user, obj/item/tool) . = TRUE if(istype(tool, /obj/item/shockpaddles)) @@ -53,11 +58,16 @@ "[user] prepares to shock [target]'s brain with [tool].") target.notify_ghost_cloning("Someone is trying to zap your brain. Re-enter your corpse if you want to be revived!", source = target) +/datum/surgery_step/revive/play_preop_sound(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(istype(tool, /obj/item/shockpaddles)) + playsound(tool, 'sound/machines/defib_charge.ogg', 75, 0) + else + ..() + /datum/surgery_step/revive/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You successfully shock [target]'s brain with [tool]...", "[user] send a powerful shock to [target]'s brain with [tool]...", "[user] send a powerful shock to [target]'s brain with [tool]...") - playsound(get_turf(target), 'sound/magic/lightningbolt.ogg', 50, 1) target.adjustOxyLoss(-50, 0) target.updatehealth() var/tplus = world.time - target.timeofdeath @@ -86,6 +96,5 @@ display_results(user, target, "You shock [target]'s brain with [tool], but [target.p_they()] doesn't react.", "[user] send a powerful shock to [target]'s brain with [tool], but [target.p_they()] doesn't react.", "[user] send a powerful shock to [target]'s brain with [tool], but [target.p_they()] doesn't react.") - playsound(get_turf(target), 'sound/magic/lightningbolt.ogg', 50, 1) target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 15, 199) return FALSE diff --git a/code/modules/surgery/amputation.dm b/code/modules/surgery/amputation.dm index e00ff66ee7..2c3524a598 100644 --- a/code/modules/surgery/amputation.dm +++ b/code/modules/surgery/amputation.dm @@ -4,10 +4,13 @@ target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) possible_locs = list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, BODY_ZONE_HEAD) requires_bodypart_type = 0 + /datum/surgery_step/sever_limb name = "sever limb" implements = list(TOOL_SCALPEL = 100, TOOL_SAW = 100, /obj/item/melee/transforming/energy/sword/cyborg/saw = 100, /obj/item/melee/arm_blade = 80, /obj/item/chainsaw = 80, /obj/item/mounted_chainsaw = 80, /obj/item/fireaxe = 50, /obj/item/hatchet = 40, /obj/item/kitchen/knife/butcher = 25) time = 64 + preop_sound = 'sound/surgery/scalpel1.ogg' + success_sound = 'sound/surgery/organ2.ogg' /datum/surgery_step/sever_limb/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to sever [target]'s [parse_zone(target_zone)]...", diff --git a/code/modules/surgery/brain_surgery.dm b/code/modules/surgery/brain_surgery.dm index cf626ce7b4..e5f91c9c01 100644 --- a/code/modules/surgery/brain_surgery.dm +++ b/code/modules/surgery/brain_surgery.dm @@ -11,10 +11,15 @@ target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) possible_locs = list(BODY_ZONE_HEAD) requires_bodypart_type = 0 + /datum/surgery_step/fix_brain name = "fix brain" implements = list(TOOL_HEMOSTAT = 85, TOOL_SCREWDRIVER = 35, /obj/item/pen = 15) //don't worry, pouring some alcohol on their open brain will get that chance to 100 time = 120 //long and complicated + preop_sound = 'sound/surgery/hemostat1.ogg' + success_sound = 'sound/surgery/hemostat1.ogg' + failure_sound = 'sound/surgery/organ2.ogg' + /datum/surgery/brain_surgery/can_start(mob/user, mob/living/carbon/target, obj/item/tool) var/obj/item/organ/brain/B = target.getorganslot(ORGAN_SLOT_BRAIN) if(!B || istype(B, /obj/item/organ/brain/ipc)) diff --git a/code/modules/surgery/burn_dressing.dm b/code/modules/surgery/burn_dressing.dm index 14bca66139..f704c9b414 100644 --- a/code/modules/surgery/burn_dressing.dm +++ b/code/modules/surgery/burn_dressing.dm @@ -28,6 +28,9 @@ implements = list(TOOL_HEMOSTAT = 100, TOOL_SCALPEL = 85, TOOL_SAW = 60, TOOL_WIRECUTTER = 40) time = 30 repeatable = TRUE + preop_sound = 'sound/surgery/scalpel1.ogg' + success_sound = 'sound/surgery/retractor2.ogg' + failure_sound = 'sound/surgery/organ1.ogg' /datum/surgery_step/debride/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(surgery.operated_wound) diff --git a/code/modules/surgery/cavity_implant.dm b/code/modules/surgery/cavity_implant.dm index 200e33b5f8..7cc545027c 100644 --- a/code/modules/surgery/cavity_implant.dm +++ b/code/modules/surgery/cavity_implant.dm @@ -3,6 +3,7 @@ steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/incise, /datum/surgery_step/handle_cavity, /datum/surgery_step/close) target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) possible_locs = list(BODY_ZONE_CHEST) + //handle cavity /datum/surgery_step/handle_cavity name = "implant item" @@ -11,11 +12,15 @@ implements = list(/obj/item = 100) repeatable = TRUE time = 32 + preop_sound = 'sound/surgery/organ1.ogg' + success_sound = 'sound/surgery/organ2.ogg' var/obj/item/IC = null + /datum/surgery_step/handle_cavity/tool_check(mob/user, obj/item/tool) if(istype(tool, /obj/item/cautery) || istype(tool, /obj/item/gun/energy/laser)) return FALSE return !tool.get_temperature() + /datum/surgery_step/handle_cavity/preop(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery) var/obj/item/bodypart/chest/CH = target.get_bodypart(BODY_ZONE_CHEST) IC = CH.cavity_item diff --git a/code/modules/surgery/coronary_bypass.dm b/code/modules/surgery/coronary_bypass.dm index 69f5062032..8880744dd4 100644 --- a/code/modules/surgery/coronary_bypass.dm +++ b/code/modules/surgery/coronary_bypass.dm @@ -12,13 +12,15 @@ return TRUE return FALSE - //an incision but with greater bleed, and a 90% base success chance /datum/surgery_step/incise_heart name = "incise heart" implements = list(TOOL_SCALPEL = 90, /obj/item/melee/transforming/energy/sword = 45, /obj/item/kitchen/knife = 45, /obj/item/shard = 25) time = 16 + preop_sound = 'sound/surgery/scalpel1.ogg' + success_sound = 'sound/surgery/scalpel2.ogg' + failure_sound = 'sound/surgery/organ2.ogg' /datum/surgery_step/incise_heart/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to make an incision in [target]'s heart...", @@ -53,6 +55,9 @@ name = "graft coronary bypass" implements = list(TOOL_HEMOSTAT = 90, TOOL_WIRECUTTER = 35, /obj/item/stack/packageWrap = 15, /obj/item/stack/cable_coil = 5) time = 90 + preop_sound = 'sound/surgery/hemostat1.ogg' + success_sound = 'sound/surgery/hemostat1.ogg' + failure_sound = 'sound/surgery/organ2.ogg' /datum/surgery_step/coronary_bypass/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to graft a bypass onto [target]'s heart...", diff --git a/code/modules/surgery/healing.dm b/code/modules/surgery/healing.dm index 52db6624e7..3d2cac05d1 100644 --- a/code/modules/surgery/healing.dm +++ b/code/modules/surgery/healing.dm @@ -32,6 +32,8 @@ implements = list(TOOL_HEMOSTAT = 100, TOOL_SCREWDRIVER = 65, /obj/item/pen = 55) repeatable = TRUE time = 15 + success_sound = 'sound/surgery/retractor2.ogg' + failure_sound = 'sound/surgery/organ2.ogg' var/brutehealing = 0 var/burnhealing = 0 var/missinghpbonus = 0 //heals an extra point of damager per X missing damage of type (burn damage for burn healing, brute for brute). Smaller Number = More Healing! diff --git a/code/modules/surgery/implant_removal.dm b/code/modules/surgery/implant_removal.dm index 7010638004..5162fafbc0 100644 --- a/code/modules/surgery/implant_removal.dm +++ b/code/modules/surgery/implant_removal.dm @@ -3,12 +3,15 @@ steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/extract_implant, /datum/surgery_step/close) target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) possible_locs = list(BODY_ZONE_CHEST) + //extract implant /datum/surgery_step/extract_implant name = "extract implant" implements = list(TOOL_HEMOSTAT = 100, TOOL_CROWBAR = 65) time = 64 + success_sound = 'sound/surgery/hemostat1.ogg' var/obj/item/implant/I = null + /datum/surgery_step/extract_implant/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) for(var/obj/item/O in target.implants) I = O @@ -48,6 +51,7 @@ else to_chat(user, "You can't find anything in [target]'s [target_zone]!") return 1 + /datum/surgery/implant_removal/mechanic name = "implant removal" requires_bodypart_type = BODYPART_ROBOTIC diff --git a/code/modules/surgery/lobectomy.dm b/code/modules/surgery/lobectomy.dm index 4b3a52f635..3117c5af9b 100644 --- a/code/modules/surgery/lobectomy.dm +++ b/code/modules/surgery/lobectomy.dm @@ -19,6 +19,9 @@ implements = list(TOOL_SCALPEL = 95, /obj/item/melee/transforming/energy/sword = 65, /obj/item/kitchen/knife = 45, /obj/item/shard = 35) time = 42 + preop_sound = 'sound/surgery/scalpel1.ogg' + success_sound = 'sound/surgery/organ1.ogg' + failure_sound = 'sound/surgery/organ2.ogg' /datum/surgery_step/lobectomy/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to make an incision in [target]'s lungs...", diff --git a/code/modules/surgery/mechanic_steps.dm b/code/modules/surgery/mechanic_steps.dm index 6f03740560..3f6887d78c 100644 --- a/code/modules/surgery/mechanic_steps.dm +++ b/code/modules/surgery/mechanic_steps.dm @@ -3,10 +3,12 @@ name = "unscrew shell" implements = list( TOOL_SCREWDRIVER = 100, - TOOL_SCALPEL = 75, // med borgs could try to unskrew shell with scalpel + TOOL_SCALPEL = 75, // med borgs could try to unscrew shell with scalpel /obj/item/kitchen/knife = 50, /obj/item = 10) // 10% success with any sharp item. time = 24 + preop_sound = 'sound/items/screwdriver.ogg' + success_sound = 'sound/items/screwdriver2.ogg' /datum/surgery_step/mechanic_open/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to unscrew the shell of [target]'s [parse_zone(target_zone)]...", @@ -16,7 +18,11 @@ /datum/surgery_step/mechanic_open/tool_check(mob/user, obj/item/tool) if(implement_type == /obj/item && !tool.get_sharpness()) return FALSE + if(tool.usesound) + preop_sound = tool.usesound + return TRUE + //close shell /datum/surgery_step/mechanic_close name = "screw shell" @@ -26,6 +32,8 @@ /obj/item/kitchen/knife = 50, /obj/item = 10) // 10% success with any sharp item. time = 24 + preop_sound = 'sound/items/screwdriver.ogg' + success_sound = 'sound/items/screwdriver2.ogg' /datum/surgery_step/mechanic_close/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to screw the shell of [target]'s [parse_zone(target_zone)]...", @@ -35,7 +43,11 @@ /datum/surgery_step/mechanic_close/tool_check(mob/user, obj/item/tool) if(implement_type == /obj/item && !tool.get_sharpness()) return FALSE + if(tool.usesound) + preop_sound = tool.usesound + return TRUE + //prepare electronics /datum/surgery_step/prepare_electronics name = "prepare electronics (multitool)" @@ -43,6 +55,8 @@ TOOL_MULTITOOL = 100, TOOL_HEMOSTAT = 10) // try to reboot internal controllers via short circuit with some conductor time = 24 + preop_sound = 'sound/items/taperecorder/tape_flip.ogg' + success_sound = 'sound/items/taperecorder/taperecorder_close.ogg' /datum/surgery_step/prepare_electronics/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to prepare electronics in [target]'s [parse_zone(target_zone)]...", @@ -56,12 +70,19 @@ TOOL_WRENCH = 100, TOOL_RETRACTOR = 10) time = 24 + preop_sound = 'sound/items/ratchet.ogg' /datum/surgery_step/mechanic_unwrench/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to unwrench some bolts in [target]'s [parse_zone(target_zone)]...", "[user] begins to unwrench some bolts in [target]'s [parse_zone(target_zone)].", "[user] begins to unwrench some bolts in [target]'s [parse_zone(target_zone)].") +/datum/surgery_step/mechanic_unwrench/tool_check(mob/user, obj/item/tool) + if(tool.usesound) + preop_sound = tool.usesound + + return TRUE + //wrench /datum/surgery_step/mechanic_wrench name = "wrench bolts" @@ -69,23 +90,38 @@ TOOL_WRENCH = 100, TOOL_RETRACTOR = 10) time = 24 + preop_sound = 'sound/items/ratchet.ogg' /datum/surgery_step/mechanic_wrench/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to wrench some bolts in [target]'s [parse_zone(target_zone)]...", "[user] begins to wrench some bolts in [target]'s [parse_zone(target_zone)].", "[user] begins to wrench some bolts in [target]'s [parse_zone(target_zone)].") +/datum/surgery_step/mechanic_wrench/tool_check(mob/user, obj/item/tool) + if(tool.usesound) + preop_sound = tool.usesound + + return TRUE + //open hatch /datum/surgery_step/open_hatch name = "open the hatch (empty hand)" accept_hand = 1 time = 10 + preop_sound = 'sound/items/ratchet.ogg' + preop_sound = 'sound/machines/doorclick.ogg' /datum/surgery_step/open_hatch/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to open the hatch holders in [target]'s [parse_zone(target_zone)]...", "[user] begins to open the hatch holders in [target]'s [parse_zone(target_zone)].", "[user] begins to open the hatch holders in [target]'s [parse_zone(target_zone)].") +/datum/surgery_step/mechanic_unwrench/tool_check(mob/user, obj/item/tool) + if(tool.usesound) + preop_sound = tool.usesound + + return TRUE + //cut wires /datum/surgery_step/cut_wires name = "cut wires" diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm index 0876357e8e..4104f0ce7f 100644 --- a/code/modules/surgery/organ_manipulation.dm +++ b/code/modules/surgery/organ_manipulation.dm @@ -14,6 +14,7 @@ //there should be bone fixing /datum/surgery_step/close ) + /datum/surgery/organ_manipulation/soft possible_locs = list(BODY_ZONE_PRECISE_GROIN, BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM) steps = list( @@ -24,6 +25,7 @@ /datum/surgery_step/manipulate_organs, /datum/surgery_step/close ) + /datum/surgery/organ_manipulation/alien name = "Alien organ manipulation" possible_locs = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD, BODY_ZONE_PRECISE_GROIN, BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM) @@ -36,6 +38,7 @@ /datum/surgery_step/manipulate_organs, /datum/surgery_step/close ) + /datum/surgery/organ_manipulation/mechanic name = "Prosthesis organ manipulation" possible_locs = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD) @@ -49,6 +52,7 @@ /datum/surgery_step/mechanic_wrench, /datum/surgery_step/mechanic_close ) + /datum/surgery/organ_manipulation/mechanic/soft possible_locs = list(BODY_ZONE_PRECISE_GROIN, BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM) steps = list( @@ -58,20 +62,27 @@ /datum/surgery_step/manipulate_organs, /datum/surgery_step/mechanic_close ) + /datum/surgery_step/manipulate_organs time = 64 name = "manipulate organs" repeatable = 1 implements = list(/obj/item/organ = 100, /obj/item/organ_storage = 100) + preop_sound = 'sound/surgery/organ2.ogg' + success_sound = 'sound/surgery/organ1.ogg' var/implements_extract = list(TOOL_HEMOSTAT = 100, TOOL_CROWBAR = 55) var/current_type var/obj/item/organ/I = null + /datum/surgery_step/manipulate_organs/New() ..() implements = implements + implements_extract + /datum/surgery_step/manipulate_organs/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) I = null if(istype(tool, /obj/item/organ_storage)) + preop_sound = initial(preop_sound) + success_sound = initial(success_sound) if(!tool.contents.len) to_chat(user, "There is nothing inside [tool]!") return -1 @@ -82,6 +93,8 @@ tool = I if(isorgan(tool)) current_type = "insert" + preop_sound = 'sound/surgery/hemostat1.ogg' + success_sound = 'sound/surgery/organ2.ogg' I = tool if(target_zone != I.zone || target.getorganslot(I.slot)) to_chat(user, "There is no room for [I] in [target]'s [parse_zone(target_zone)]!") diff --git a/code/modules/surgery/organic_steps.dm b/code/modules/surgery/organic_steps.dm index 8e893875a9..9e93042f63 100644 --- a/code/modules/surgery/organic_steps.dm +++ b/code/modules/surgery/organic_steps.dm @@ -4,6 +4,8 @@ implements = list(TOOL_SCALPEL = 100, /obj/item/melee/transforming/energy/sword = 75, /obj/item/kitchen/knife = 65, /obj/item/shard = 45, /obj/item = 30) // 30% success with any sharp item. time = 16 + preop_sound = 'sound/surgery/scalpel1.ogg' + success_sound = 'sound/surgery/scalpel2.ogg' /datum/surgery_step/incise/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to make an incision in [target]'s [parse_zone(target_zone)]...", @@ -41,6 +43,7 @@ name = "clamp bleeders" implements = list(TOOL_HEMOSTAT = 100, TOOL_WIRECUTTER = 60, /obj/item/stack/packageWrap = 35, /obj/item/stack/cable_coil = 15) time = 24 + preop_sound = 'sound/surgery/hemostat1.ogg' /datum/surgery_step/clamp_bleeders/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to clamp bleeders in [target]'s [parse_zone(target_zone)]...", @@ -56,25 +59,28 @@ if(BP) BP.generic_bleedstacks -= 3 return ..() + //retract skin /datum/surgery_step/retract_skin name = "retract skin" implements = list(TOOL_RETRACTOR = 100, TOOL_SCREWDRIVER = 45, TOOL_WIRECUTTER = 35) time = 24 + preop_sound = 'sound/surgery/retractor1.ogg' + success_sound = 'sound/surgery/retractor2.ogg' /datum/surgery_step/retract_skin/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to retract the skin in [target]'s [parse_zone(target_zone)]...", "[user] begins to retract the skin in [target]'s [parse_zone(target_zone)].", "[user] begins to retract the skin in [target]'s [parse_zone(target_zone)].") - - //close incision /datum/surgery_step/close name = "mend incision" implements = list(TOOL_CAUTERY = 100, /obj/item/gun/energy/laser = 90, TOOL_WELDER = 70, /obj/item = 30) // 30% success with any hot item. time = 24 + preop_sound = 'sound/surgery/cautery1.ogg' + success_sound = 'sound/surgery/cautery2.ogg' /datum/surgery_step/close/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to mend the incision in [target]'s [parse_zone(target_zone)]...", @@ -85,6 +91,7 @@ if(implement_type == TOOL_WELDER || implement_type == /obj/item) return tool.get_temperature() return TRUE + /datum/surgery_step/close/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(locate(/datum/surgery_step/saw) in surgery.steps) target.heal_bodypart_damage(45,0) @@ -94,11 +101,14 @@ if(BP) BP.generic_bleedstacks -= 3 return ..() + //saw bone /datum/surgery_step/saw name = "saw bone" implements = list(TOOL_SAW = 100, /obj/item/melee/arm_blade = 75, /obj/item/fireaxe = 50, /obj/item/hatchet = 35, /obj/item/kitchen/knife/butcher = 25) time = 54 + preop_sound = 'sound/surgery/saw.ogg' + success_sound = 'sound/surgery/organ2.ogg' /datum/surgery_step/saw/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to saw through the bone in [target]'s [parse_zone(target_zone)]...", diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm index 456d93c73b..5e037345fe 100644 --- a/code/modules/surgery/surgery_step.dm +++ b/code/modules/surgery/surgery_step.dm @@ -9,6 +9,9 @@ var/list/chems_needed = list() //list of chems needed to complete the step. Even on success, the step will have no effect if there aren't the chems required in the mob. var/require_all_chems = TRUE //any on the list or all on the list? var/silicons_obey_prob = FALSE + var/preop_sound //Sound played when the step is started + var/success_sound //Sound played if the step succeeded + var/failure_sound //Sound played if the step fails /datum/surgery_step/proc/try_op(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE) var/success = FALSE @@ -56,6 +59,9 @@ if(preop(user, target, target_zone, tool, surgery) == -1) surgery.step_in_progress = FALSE return FALSE + + play_preop_sound(user, target, target_zone, tool, surgery) // Here because most steps overwrite preop + if(tool) speed_mod = tool.toolspeed //faster tools mean faster surgeries, but also less experience. if(user.mind) @@ -69,6 +75,7 @@ if((prob(prob_chance) || (iscyborg(user) && !silicons_obey_prob)) && chem_check(target) && !try_to_fail) if(success(user, target, target_zone, tool, surgery)) + play_success_sound(user, target, target_zone, tool, surgery) var/multi = (delay/SKILL_GAIN_DELAY_DIVISOR) if(repeatable) multi *= 0.5 //Spammable surgeries award less experience. @@ -76,6 +83,7 @@ advance = TRUE else if(failure(user, target, target_zone, tool, surgery)) + play_failure_sound(user, target, target_zone, tool, surgery) advance = TRUE if(advance && !repeatable) surgery.status++ @@ -98,18 +106,33 @@ "[user] begins to perform surgery on [target].", "[user] begins to perform surgery on [target].") +/datum/surgery_step/proc/play_preop_sound(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(!preop_sound) + return + playsound(get_turf(target), preop_sound, 75, TRUE, falloff_exponent = 12, falloff_distance = 1) + /datum/surgery_step/proc/success(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You succeed.", "[user] succeeds!", "[user] finishes.") return TRUE +/datum/surgery_step/proc/play_success_sound(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(!success_sound) + return + playsound(get_turf(target), success_sound, 75, TRUE, falloff_exponent = 12, falloff_distance = 1) + /datum/surgery_step/proc/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You screw up!", "[user] screws up!", "[user] finishes.", TRUE) //By default the patient will notice if the wrong thing has been cut return FALSE +/datum/surgery_step/proc/play_failure_sound(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(!failure_sound) + return + playsound(get_turf(target), failure_sound, 75, TRUE, falloff_exponent = 12, falloff_distance = 1) + /datum/surgery_step/proc/tool_check(mob/user, obj/item/tool) return TRUE diff --git a/sound/items/taperecorder/tape_flip.ogg b/sound/items/taperecorder/tape_flip.ogg new file mode 100644 index 0000000000000000000000000000000000000000..fae3e07373c5b67173eb11a82262a9721b326bfd GIT binary patch literal 27500 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 L*e|l1KlK3s5WV>i literal 0 HcmV?d00001 diff --git a/sound/items/taperecorder/taperecorder_close.ogg b/sound/items/taperecorder/taperecorder_close.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ab9f521c5f9fc64e9e89d5ef872813a038fd1ae9 GIT binary patch literal 35144 zcmce-dsrJsnlIcfHKM_d(gI0ou*^u}VnIYk;^GJ!?oOMu#DpwNf_J6b^T5GDyZN0^a`k;t*zVt>h{C?xCd(u zl`s0|7ID)>;&f5ED1$55e&~(by2CX`YTjr_p@HgA;LI&o7geaY%4!-8zq$8Sa6?_B zRw}mU9^F&>CO1!iHy?>!uuI^1WDOrPVnDAOMgohaS>czCdV^Ao|uE!n!XiQC0W@p5JLg^y^v z|L(|q_QT#EE)g%r!3EzUqs8vQW$0S>WQyB$7Sek^)-J)^ld-6BXr&vxkM@FDN_*fjO0y z3qyx93yx&Y9?1bmL4*8ixANvU%9nnegtcjhAgP!Ws^?q<)F@9|Je;-T$ktDelzak6 zu||>qb83FUFJK_NvwKe&O=w1k{smb~pj)CJ&BMNb6R1G;Kj8M<>iPO+HofN$eIv{> zi&HlBnT;QgxX!$o!GrU$_rYAITss}=JAJF?$b1pjbME`xThV92$4731d$A9D=`*o< zP_OoOPx#2ETF`dqt)4H2KV*WOt^3Tz$q&`v_xA%^jQp&3ek%JOXkoi^=D>#$yFu>X z_w@eD&4{&o|CN2DVBYjA#LQVU_m}N71C!_GorrHZPCwBno=X{uZ)?vl9%)gP$8J2= zV16-jE(BTd7hL?~F_im(L7p`5#0`r@{^ak)eObobKm<71FZSsqE zk6g$uJaBIE^3;Xv%M{)vWV{|_(#d9XU=wVu68DFyO>yVTX^$NncKh4T!>MWWtLR1b}z7wF0yMX zHtk-_s#(<3EH~DCdZ}jD`@h_I=?8)NUTl8<$_YyRxU0^#^YwPiRIB@XVg)cAvUyr{? zPQl?sZ~)0s98UZz$?=Ohc|e*j3QNBJevDfe06`lRFaPxfK#;!!+x9|_l$EC~muD@P zr)kt%|IZQwo-SvWEM@}2o`j%Sz(1kzerI{~iKVKiQ(C(iJxBY4xRu#*$};PcT`Mac zsE*|QL3I9hw$<5r#}IisUAFV9t&L9Jv8}{e*`q`nP8r}N=LCNP089h_`gKkpTaNdiNT#JA#${*==N z8k8`3_ETEy)*jeErN`p#3lEAMXX zNnTX%2E{!)PVue-u@`R7DCya2&%Bvw8>pSmOuGq+$vr<7x0b2b+A1qFA71!!`smgL zwPxUd6~VU^zPop=a&1pav|`axTh+7g`{Mo=#kbv$JjzAQ=>bpq?oV33e0yNzGU&?Y z_8iuLB5)FJDHo2~21cV5nwp*qk;}{SMNoY5qUc$tVQDHFPrJWNFZtx0=fb*AStZLS ze<)tQux`hiF@KRv!#x*oWbS^a_VTOCM|Xd4VZZ0c;*OJ`2tg(|95O*M*Q9`iut@+x z4#2=QZ^h37(fB$CaBj~RZzW#62*|15*^_L)l?e#AzvrQizh?QMNDlZpc&l5>>04t0 zX(40^)vr~*`L%o@v*g5s!Y=n)?>+?N^Q0E7v0x5pzNprm+Ore%JFvgU|62ljnIi!@kI3B^ zt6}R0BVLX-{m4)zF)0qY^pV9WNtyQCl%#G{RyZ=$T~wGh`Ej}+1t_efa}$+S*M^2Z zE?UoLNBUMKH#sS)ULP3J~Rbz3}=ALY%0n1yo<7&Y z$lQ|zbwol^Vvt!qUsN=bo}coN+kLyLrlWj5S8#4}Z_2semag&xH_MB&Hzu9?xF;pH zMO9opo^>*v*5BP-bzt6x%ZkTCE4?v1OLvvSm%Xt%C1sMRK2kbUUTzf6e9>ERVUk^a z6F6Y6A4r?2S_et@*Fn%0ul}gz#DLEari%i-1wkF0~bj@yy>7v5X;!xt_bFoJ7EUV6y*lmt%a545GK{AXBlo-grUgqgF62-O znCVJst91;4ZUcRkHwJ_mkQ`j1%74s_Pv)n5fA7VEk-t=VQT+e^vTcn7KaT$YV-8*k zTTeGF#Nko!nlK3aVQ z^rt;=;X}6Gx$xo1Dq|a{;`r$dp+7K|H3PIqh)A$_CojbvxS90{aN1_jpHzd{{N0f? zp|*60XW|abe+Zd=hlWGJu!M+__pn#mKKKg37=``3QOHCF>dmcK%j?yz^jFiXMt$d^H-oi@ zi3|CqmKz8qOr-;QmX1dcL8fU+-fSHM@7Ojc5D7Rj^F`;QASuqzkn;`VLgg^cZhs8v z>YI5#fzmTK-G24ezU$D-4fUTi<7V8#WrwSz6ng0g_iV4_+@o!L#5}oqZQZ=K7-|B( z#U>NEfA1HP%{hM~mC5r9i$jfX7r+@hHVcntjeD@{zv8LIIC=Qg)mO0p1I^EtUUMl za^`qt$&&H?GrGyF5TL;*>r6|tUZSIH3Wj%(Qj52V zLz~Hy@GSu@g4qo!<`gW1&8Uf5jS-CJauZi%?!`M%N0?T~XsI^I=d#TPh6!%kaB8T- z)Aq|9$m^jG#M?}^Ip41gzjGz|WfCt2hiRo?|VPKInz{c7q-baZRS#7?C{3KP6za@F?A=iW9$# z{!)FC6_yHf8({U-J{QV~Z8zm0udQVT*RsHVz#xEJVEzf)hgs zbDH6mbKqnMZN@1`jEJ#<_9$T6Y$7U;svV!#iK1CqW#Q}9jG*$HzwKzrBMhmWG;vx)fwXsT1{o9up*7M_KFDQCrx`vC3V$7-I&zPk*dG)!n?|Qsro>V|l<`TP9E2 zq<1xT#7N;t;oL|a!8~?X&yo9a63KyQ?&~o6 zabBNK3Hr1E{Q zG=%1cV)*-z&ow)o%FVpP`L}j|E2}(JHYW;Yj$Im9*La6)4jIMchN+7yTA{~$XQj5< z)Bkw?YX^YhlMCfyTpfuPCq_Rvp$UEy@1aGZ$}!oXb<9S@f z(I;Y0PivV4a+1i2m*Vl;q%e0CN7s2#+RVK=Op-7!v2WCI(QR^=<|l|_%{pQHc0U8Q zC}8s{!?fya;^*q(A`(Acw)DaB(4&Zkb9)c}_SHedH^}Akj1Tv{^U=jV?M|+-$Gu#- zWe2`KkT1dlGa>ht1O+oroM#U46Bg>b$C^EYFy$+kW^Rcb~N`(*vb3KKq81 zOY*&Y!$w;MYkgZ>gD!WJF-|+CU75)gEsK^7amHg$Hd*ymW$J^-=*Ug}&Yfi)i%;qq zPF#gJrtZ~?;*Trzd?6z$Ei3+|LLgEy3s)#DBdE{O$o?iFOoe179Vgz5LdRwy4kjX8 z=slYR$+MrEsW@TSuQnH#7kU1Bs?XAWFB=%SD#eMnF`fy%Vo&~-kU@+;x2f3Onrk<1 zl<(vT)b@+c8*{T>dz)?9FsXUP;~ppbSMIos2V8TX)mCX#8XrMpi5cad zS<;dvm9TPs#gf-vTUAmvS+&!{ckez_dR7uwImJ)4@@P7br}k@O^?@nxqSsKCSCX|f zlj*e^#PX;w9ksf$JfX|YUm@H)gNLy88?GI$GkUaRjRBjha&d}L!5r16ng>2kaBXro zD-??5Ow8djYDVKI?S{7$K|bF=nwLG++BiNt6!f@r4CiZ29+YAT8?zJc5x1>gs!(dO zme>rRwruqCx`~xEYgo(6V}?k=+*iraI5c9#GE=-~=a}JrBH4XcXV8clav`CWckfU$ zk)TmGSyAHH0BzD`EsK6$qVVZ76`HXDUCV&S6f*p+GH9q0k^`t=)~1iCNV6)!&V>G^ z{?>+p9V~20+Nk$@e_ zMePBd7&@L5{Z$iFClb((Cm5a+C?upG??d6^$9RYzh40!3)2!|*$XbsO+k#VCp@r9{ zrPx;`(NF?kJ|lr;QWX-)!`YCqxlk_F5>r%kJB0fA@*Fr!L@zLrO&oh}83(%;A>o+w zaOSkE$wU#tI8bBffB;sHT7wU@WCb|T$KY>;qfh00+snp zQa?l-<4prVpA(VIt=A#3l9hTlFMq z;BoAsX|&mtixNny2w^(HOe9y!bOd5_-Gzx@jB*pyNrp*KJ|C9{ftqjzqEU&kvykh@ z*%TC>89@EI=NQ?M@jxEz$S{{~M7jI1WVebDL6`p=>T!-@!E|IjVGU;rE zmLLI%b(n-tU3K!(^9wnT8gBH#xrWWuLK?UJ0S84J68eFz)rhrXLRmMsH*Sc?$7Uj94p&EdtaP$c8Y}$6<>{pT4K3> zuHzh=4vV=3Lw{3nrg)vc?~$|f+{679wLFY@R($ar?(m?V*fcs~?z7$un)RAR^YEwc zchXSzN>mn*DDk1qo4l?8HWqkQTjD4Q6Al=F>Zp+~Gb;{Ch6#5h)Oe=$y}nIjrJu>3 z$b&}Th`uVVovr>%*>H?wd`)?V;194JEjRVbGx|urU8^n$Ay2I~&p_p4V-`caY+i|C z^q(Bhdw=(sL6awEA(MaXY1xVy;u;;bnk=FhIhMZp;AVjtx5t%MbA48ghTv1;vnxtYu8zNvjmYi=v^Y7b?HGU+2%^lW``K z7U;t$<|_n0wOY(kmW>Y9LdG~Zw^Bu2XAOzASjnn`uRbQA4v3ZvVRGC%qGLE%j9l@-6_K)H);MVhF$0h|IKVy=78Eg9$ZzdY ze_t&jv9z@LvPj5OPob0kjw3V^+Iz%mvRE2!B%W59bvRm97}rui1K~tN%l!eta%|Kc|(FcX}Do?Q6SUWn{eNsEpG3P;n%NP zfNsft2=K~q?kXqyFmx9Qc2aQ|5VjMpmLrL+k(oN2OpHZZ^OFRwB2`3W?s+`3DMX+bfR`6oh}5dt6<3{MvWJal2`c(c4dq7QXu9(Hg~abmyst*2;w) zKkrZI|5bk3w@=EXW2gcisw}R|-7IYQ_DN^l)vm&@Z4@TED{)=&Rb9%Iu$8;vHU#mb zJFvZ(yLbN*&0T7+#*=&!`dR+qSkmQY%7C!)FS$*r1D+MI0l;DfR3goo`|}I#kwJrG zY9hg26%?fnXf>Emi;aH1L+_0F6lF`pIS)+rRw8kx^ z&&OXMCpme_SK1p#Yta?Z7O59OOPM9ljIU|LLTj_>s=i^oZ7a!RQ&m~HjHxelTD2O> z3yy8Q(eo*$ojg|aXUKQ#s!-q23R!Nv{8A=MfI5|@si)*a}kGb>nWrSg9l3$2xI*Kef)aK0cBax&$qT{mX|0)g>#Q6sg+a~!dis#!-^nut{Epp*13-Q z8Nk2cd}Nh`f}I(qWG~~PpP*WU#C-&UrE(#ShocC;86q(oHNoo7zAx=HG44Bg_vKDJ zJNhuamkPU8V%rF5u5Czelk*{6Z^jIo9iF(#i7k*qGh|F&DaRHget_h5HNeEp&2(m9a@vK?gs=E~t zcQ$w9X@n)l+h*iy$|Jvozt3+Ys)J;`)k*LYN|Cv2_&%qDA(qnSV(ZNbBPo$BGA@@Yo#}`X&u264_tx)mQXxa?R9`14>%T3gZB9<) zL#w^wRi^|J1H-2?VPZb~C~kJUK$mqb5XQX7MrwQMtG^8*f&RJ@a1tG%E&gqACXVF<{=4h-&}TmqO2j6Yqm!?Bb<+1 z^}61Ky7|~Tu2gL- zFyWgPOX5hRLX(w+)XJ{wcteS;4NRK$1T08|MpAN7}fE+6LrCs@t?Juw4H#<*H{OVUDzZ$tX>GfUoUcC68?}JK3%ikRr zIa?!s#)|sW)@cztxoJmAs(st($QoEPSykd_t9mvux=jDzR83hu>tyS|YI=G`FcV{p z*4le2N9$rzYM2+(1*z?Jr&)Fl<$axIoQxymR&=S>6aiW5GT4_z1q{Y0E32Mgi8(3) zb%vKW0)-&{XBAeqC_Use5!w>Xq8BVEtI3`>JsK9Kz;}sN!eQI+2>Y%=5k|!wBW6#^ zB@a7jFnHby8b%Gn!#!3KxLW%9AfM)GTx<#$`>bavR*h7#lrJ>t?1~2jJ0ObM^-8Lp z>((A(FOF1&{slSDeybuXYY7iBeVPhU2&&L%f}ZQlQ6jYuSZ=mF%;%d7h(e_YZ-z4i zc8{()&gvl}xopjrg#-oNNwm1PkU%DTB-DrValbEo=pzdrkK$Ui+{gluI=Lv_h}U+0ehS-PNF|Z zYOwXX&KZMqCKJi_?n_3whSK+hjrfD_m)M4(01ip}TOBzZ}X^m6hK^M?~6mZZLZFIkIP| zsj8Tg6UmcMXfHulRL{$y6$JYUk_@bR@l#|pK{-qT8b*iAkyL&-R|-k%P2?0q1bpV1 z7#^R|YLg2s0o`*s#o6+e+?3>pwn=#y+mXj(^80XxgJ*y(EjrU(o{*+1BaU;Ma^hix zNE$$$imxOXhD!Kyf35)I$tjWj{@8ua40`Vogp2Di_OxF@lC%0cfjQ5oHO&H;Mro-7 zn1)x*r*F6DFnfUyBaiSY2t={wsrXoe97A|=q7SF7yQfF^eo?zA5N%>G4wug1CKA2( zmFQim)GKf{N1(KI3_ORH7hHqIBDoxA2-k7o861YG0o=K96}EG=Qa?|^O_a-!yCzhE z%;<2;l2?Zaol|`XpS}%gVz#UTV8bGl^C>7=9GoIBnA)4MM+y{ucD)t&L+^>!U&VL7nc_B zXPQxxpcu{N=*WrNtXqmp8|KGpxx35FEaFyHf>g>tCO2YX}!lFRtCHkV);4sn8C0T>0Zu^I+FV=6AKuCXfuSGF^>S< zZVB~eGJ{P_YrTjOT8$9IZh+X&$)vjsCJz^b6(InY*e4NqV_J+nmY#Oc-W0T8iE4Hvvy$`bXINI8DF}COpL8p5?QKO$5j@!#=zjhf6 zhR)a;#mJadBgV6y(cAl~plT={hiH5XUnW=O$V>p+wAc`4n3jSu0I`n+z)k>%F;$)Y z5V#s}QiK&dHXw(pRTyKy-5;z@@hwTvFw~Aq#PcYllYpZNZx?UvVqSVb9J&#D4v|`K zkK-PU`*f3S%f|EL%cV;qY*O5?$OL!`GeE0|`rM0FZdp^r?s02H-iBUDJy?5Ay>X{u zmoL(&l`DLA^j`_xD=UQIMAd`ST%mISfpSq;DiP8gvs6BpD+gF0&Y|;HztTe0JmeT} z0O4OVC2V|vHH#k<$|C?e5rYEMP%5Imq~{`3mAty#rHl*%EJNGy;dH}o>hC7UC@1mR z2cQ4&`|S;xde22ik6Ry?Zah|d;N?7JNcA*xM@2B7HM(2lt=coGT^2DGC&bv4wq&%A zOEhYQm80iV4Lh!^tjy2kaxG@_DLav8nbq5%mq^sE&|%m;$lU6K?gEsZk3UB(y64&) z8jWCXGl@j-OK20n9fGmQYP1QZiIC?AU(W552#YorZEl;nH8^PewmFsiZL3V~dklAn zf{MZN*t+*?#PtiqYTEA({dO)g6l?I=tHv+)vym%RB~xro_4>(`R3o{8tqcm44A%Nx z8{Id{4!PfOD8x&&fM|S^O6#i{v#!b!M)#|^iJ6&A#>13!3VaM#Q7BYSJb(2$!AJC7 zgt^^P#)O-Mm`FfxRxxQ!&>%_z%>dBNTn2_!bCD?udaOkyj0B3bS<;rs;8OaEqPgu` zCqA^0U7e%y^`E^ilV6?F477bTEMcWGv4Chfzs<)e+Y;q<=(VCxGt)M)9c|iio#FiM zSu-)<22gig`K3yHQgh~Weq~^FsbbwFcZlAyA?f{fSe`l1)!9{c-z(wEq&kQzwCl=9 zhygPk(LSgkcvpq!NSwVb$Q3zPdCZw=9);46n+wXYQ~ubE{5=8;vO9vC0L|_aTK~vTX4}<(4tJ8%{Q$n?E)pm>bO{j_1{DbK=7p5ePbUS1iD|LVvXvXNPbfl%%W2>C*$ik&`6?H7u1rmy=L+ zy@cZopUKXfIgOmO;nZR5Mq*LqJqw%(J@}|8ytwoaJI4O$#w%3+){?6PN$cA%frS=^=on;E7HZnsB25OM+oL1ZWrpoSXxjMG`=1sJ%YF za8Abz@tcsA79T-OQ>#+rijCc93m1)_hRBWt96w2KNM)53Eesx~yV{bKcyQ8!ym9yL z?Ds!!W<8zo1q^WDW7Yc6?}kI3%EH!bbGO|q`l@m32;ZG@=~Og8jKw8KCq`7`o7L zLpiq1`{g6(#)lpGcRZV}3cq;0FyWBq%pUesZ= zm?3V{CTow;vl9eGH{PiYtB4ABv^E%zKH0Acm_clA<(6kvm3T~`P9zE%?wrJQe5p$K zu9R!QnN$%oluTRB&WpVJfc-^>XS?T_sY;ISPEzlM^mB`=D{{SN?)gg@(6?{ zmA7*UxXUG1N1N0oC9JNIH_VXpLrdR1PrZ9y{6)0cIy!TDbHR4S&Pf#zufRl$I4wEV zy#ZzK%3?dl3Bs@=FD&TBwnU9Kd%`xlYgtD|L#43SF|7COzH!l&nrwX>9EmgTIAbb$ z{y-`%R7A!wau|-;`(h-AzTG4ua?BfLKpXeVO|!s^wLmU%0NhK!B@dm9YJ_4|kf^mV z7{en;9IOH2*Hudx45)gmolk11f=Mbz8{m zXd7Q)T8h)pRz0h{GPqf@YZq8gzC5ZJZ}b@M0HvngAzk)*Tt?q?Wto3QHEB4;yR4rw zf=%%O-} zQ?$C559oh0a_Q10c7X1?qxCBO&Ufd|N)P*Hd00)hF~Oi?0e!LL?T*v=0(7c!al!ab zaPJYrdz-7UfbqPot>ja3*bX454QHz~oqmLAj*#a_%TO5FE@$LKs=!jDx#MoVBog84 z>YJcCl){LR6UWzfBxoi}&_>`1R;&dk5FJblMUzdIImvyFBw86=VM6#PBg#*dg+qHL zBTw8bdU9^HeDkJJjSJge{!`XFw|$@KTeQza2gks!v+LBjwJp^+$qG#9vWgXlG(t9r zkO-;IS65dpc}MkGPnkmN>BSC(!|wz z5p5dIac(r|fhK|J$GHfRXL^p5aw2SbB6>?SOlv9dqVb^ws*Z%b1m#qr6z28;w$b-y zK>Uw%ZHdr#k6GrV*Du$Kz6Uq_sQ}RcX${<13wg=el(CaFe&PK!d_&NA?#jekCK;TU z9(*LF&MVGofXUhK|8RK1zPv6~lYiP8Qj4Q@D|Z1if*Q|{7~Ag<>`~UFi_0HZrl;mH z78ks(QCno?`o+v=hDmF226E0d~>lEf(R-v>KXG#OBJ`KlaqbX`-9 z6-Aqb797P9oG;5a>k4bp+H5!vNz{Rz*kr#JX;}r4A8@Wu>p}^rz~F2j!Dwy8#Pp}( zBS+1Zf_2h4_8ll-JI)lC@RiHGH;a@niKyy7lq? zpEz^}4rDEVYz%pcS}o>FrMukY<2GNL!rNolYlT)*ynhcO;iP1X!^|ykRdJ<1Me=m|cT+Ac-G&e#-gH$*^SA5K71;21pXN8Gm~ zWXnJQhu!@JdH4L#(0GHb^Cx9DxV@(@-A>B?d%3u!Zf|v~@YOv`IjVUtyr!mq$eP0T z-T60SCDmQhZ|n@F4p_$(A>%QHy7TJ9W^u?pbaAYleJ!1}q;iC8%U;x5xw=|*xcgMx zONohslqh>{p;#&}RI~;LaWjZhFt>UIei*Z|x3}=+O_*isu9sk1VFV_cj{rok*=g$S zadj1P@1kH=??La8Ql?zBKe3Iw-zYE-{S23K^H-tte5yD2J2}cd{SQu>&i0`Vm!|&@ zwo-XT`)mT>E@OsrfunffgPt3OyO?ESU==GJwZ1HS>bm}p)^6mbKCm@EN{(-6tYQXA z9VvE!)t>TGx4!CNloB7+Pio72aa`T7_76I78O)L@*PkCCZOf{4ZqKu2!=05X_0oWQ z*&9dl`hfRnt^K-E=q4k~wXRfC^GXkSMRhwhrB9QDLm4Fl(>N9J!sQZZh)urd8k^>roUw7Sj7H@}VW^w)|Xd z0?`(yGxJek>yJS zKc&UY1tNry!Mu(0rutG&b^;NeOYrTXK@r>%(CH}f^t8x1dtW4Choo|jUnUXySAoMj zg+CWDXd*ffBBu3v?p>2V8|FSVg^A)F3Kd4nMFs5Zl7c;cf|o~^S{N2!t3@(D0|J%i zaEK8LQ?NmlLgkx7P!8J>j#+!UdU|^}Nd>m6SMdiy81L+WxeG;cF$uJjGD95f%D-Ji zp(YbbKQr=#y%lJXcges#os>I(7Hz}_4BXg;xRb@@qLcGFC@jM?v>1^Zp@+>n5S+qz z38GmUvHScC$zkNKK)x1qrUM}<$El*TebJ`a#11CXK;zckT>-h8b1fq$s1FwzF?Z{Q9iG0i>@+teqpgg52TMG|OM} zK8G>Ghq!fn5KcDN2BJ8*`x8YjY0YhXO0G2fl{7vYOf=a?Tsl=ma_*F?=yuU&m>HKF z-UTZyBbf3W)M7tP4vAyCikg#&@@4L+a(#a%wn1b3CiS*u_tv=$KWn;tL8mEh(jh0W74K~P;rGu^EV8|)-93g^tOr?(=9Lw*et6|hQm-V-yG5d# zBr30LHjc1ZqeST#f0MW<>!7ERAr7)b$s5uPzwqu{&OfBqSR8Y60v{3_T9R{U(;z-V zF7-jpHaU_HvvXs``J9f97~Vz>*C0YHh0t6?EH}D9hG9^AxN0UM8xPzUNpcXKM*3uQ z+pXA!k6r?6(gxZWZ_52&z9l@{{O{`-&%bM&tcY5_-VyR@g=~l7Hdq}^-T_WcN!G!G zPrXAi8%uj7KK=VuB|(GF(xQ+G>7|@rg6+6jv{N_$LiI)mKQ|t2XqdS88K-x}yLt2G zDRbq_>NTD>R(%F{unf_gc>89>hY5SlBB&kN>a5Tk=gfaWFfjusIC z1_1d@N4NlR?PX9XEp~Bo(SPndPA}SBcoODELdRUf%1uqr`-j)K-Yfi->~R1>5o+NgD@ba~(0&q)CTrbJ)kG45*fQe5xO( z$#^*oTSp88=nd4?b4Z4pcwGKr=>wD0DHh6t(Ij*(J*7d{rQR>?#0-{oZx@`HXy}!G zh9CV!X3@6Uh>57OU*uKJT~w)~W6Mdwdwt)@c6MI6WCk%<>|J?LS5|C8LS`}9tq8qY zwth6kWW2KC(zyn#!#aEI;5COi1je9JQbz@w8t>@O_it*9BcJ)oV)9sOJj*+3TOBSH zR)(fVP7Jaa4F`^m6TmK(0n-@gqJw~~qoNH@t%HBiFj*nFc#J)&zoP}F(;doWmi_Et zn$g9#j<~fY>M46|brv(P^W{Z@fy+njU>7IFS~a%ml6Ac1>830CEG#fmRW`X(p$;ok zhF{UYd@7FqB)DL!*l1vI`GMuWVRqm6vkjI=0`26LZYB~FwC(m+V%T?{qEO) zjAF$wCP(;}jg-t2Gk+dfQTaYoUI`gpGumGB%{RnR$Qkl; zfnS# zM(L((YYuhX6%V2Bnyr-WZLk1x04%#owq2Me-KzW zfE7tmlra+!u^k4Sn7SVUwX^^iG~O%{AosioYAxfNsZBzA62$~|bZCxaAhy!17uppN zGEdg;={4O4%Y=d;jI?@j+OaMYx04GKBm@QO^kiFd>Q$XR~wQ#a2 z_X~p^F$J`_P5=aft#50vgBJ})AD#gVqKD3U86ve>P$Cg$I>ouSQe4Ft$qVOOgCMdL z{BaQMQ8Vgwa(^tf)ZZz7+>l(9a2m}(<5;F^{zMi7X}vnMn4(smGo-pZl)#=TlUs6~ z1UC=Fb&E@3Zmjec)Y*{QYRCDa);?||mB7r!Nn$rH4ZAUvE;<`@fjEwaNEMzNLiXOm zqlPn`wQ6}fqeCv7@cjC1wW5I9|MGXzV@b^Yr@vWvl=n8NiF)sE#(vtMJw8yj(=2^^ za_r>TZw8D-k!?R4R`s=VP1+V_GK+gsBl7WEi_1Ih*T(wZtF1jG%lm!of8bXh?W$!Z zK>t1eYro=**O40d*T3XmBPs(%pEfOW*q+k3II+{$5*kRZz9TAOF{xWBvC*ikr{sQH3o?11y&=7bdHo#m5keIR{KE@6)7u#1vW0+OTQjF2rqa)nXKEk9k;6_6x>N715MsK#eFT?K&<%QDSn_jPJF_oM#6{K9{PtcuJ$ruom$v zy0}VTT(yQJS13eLSK?^=;T5HLjO?srIGTqC1p~&V8+*68^b<>u_9}E2|EQ_@^xN`1 z-fDwKV&@q>1b0(t?cb|W4qfLtZCxgVm3zpj0cyqTK__gb|1$lmfmEcqJ)Wu_=c^Q? zEcXyK8Bj=t$BLpu{>BAj0SO< z(;Z|zLicA=_#k|%p2B@FhsIGeB4{V3hbU)@&xuf}GC4*c+5Ctc!eQrKJw+C*<{^p* zr8##>oqW5=G5Ha@tS! zrN=g;hB3(eTc|Sq5tAlzF=?#D5p`Elzo^K3mCJ~s^7uTQ3Kr8A)ZfVf$hnA)K?Fpd zCm6Y869Hlflzx2~_^V()mz!d$O>BNtNctuCM%lcr$k5eJG$e~2Hw63eJbIy%nvma{ zvEMJ1@-3$mRVHY2TXBfY?Z?qYl=~Qq9MCIyj8?noMCtj(W~;cR4_8MT|?>3boC86a$=|qKRK3eWc(X_41fkbQg#*Rl8HqNJC?6^eY3d#n@U%3Ulg0io;`1ZU#%x<;)z~0ljv1O-1UKa>gU@od0%YU-l?JFw)s41IV zq=`f7n5?LzbD=lh8yRFd$idxXm5eZvs^8yx*?Y1H*~BdDjd(mqT8KHI~Q5k-Pu-?->wTHaxtR5{Qedk!^Cm~YjF@0`Wk#Bfr z?s1p+P`75x8MU$Ud@_4dz&`K(JlQbm(f7HD)GvnP+@@yF=Dtl1Psq#)UuP!OoQbOO z!jaE%9vO8Np0v-*Rm$6&6(Fu`tPzu|+PKr&We4b3qWQD%{Z$@>|OCuti%-7>AJ+R-vkpE{hHh zzjSQt*sll9Ee|ZWaXmi-O>XD5roCc{CrV7Z(57y`C%b_iUHG_ zfwlL^kuZqMM@oa)brd$2KwAO~*t{{?3uG%C$+!6NW)%fa9+05)&2-m2T{MrZzB^Zb@Lr06&K6e=TH!(TrfjWr4*VU>SVxqcb)KIggf)NftKuQ zNIp?qliu7sth_O#qn)^><3=Y$?d(W^x#5Ohm`V#q z#OAF!Ngjm}U5_NU$_mILo$`E!_-s)SXMjHuajE=yqTqo)yFg}`%jVt>n#h>?Rq(%~ z@CQ<-gmEA0MPn1>+y@9)y!*4y7UM`uJ5Ci74YaF6ooW!4T11ITNIsdbllP0nMYmBo zrDX_5_EL14i)zxvVAT#jGNUlEs7t+h9|*1uW{2}B$@$7;5#Cl@-aI`7g)x|M1B+;% zNPw#U69i%|?D)x6**k@UqsQX~LQU9M^93E+R{09EfB8|z&!UR@ssFR7cL8haPS?KI zT3LieSkSc~Nf#JwPC|&#Nf2m6XTF>`X=D;eFkUr?>1o_1D8ck|ZokOL5im6}r;Ez|oN`OVH={WTrM%ZhOvMBHo+ut>{eJ z!=LyXbU7(hgC^r5?k0XvDFSYpfzZ>yXy2F*aks41fnT@s1lvW| ziLGA76K_fXJW*W57eb(1qwDUGjRhids``9*fEG~v7m#jD0*kE;Nk9GcH$$8)wD#`n zkJA5gW9-15{lUo=GrMe0Fpg7(M~~D*495nO`^`%p7YpPp_Wx}Z$ZOVBv96_JbnVF1 z6_aj(Aa_`>K~K~c(!+o0euU!J_-JYtUo9@6=Kw5*P+D*nq=u-oG$m%x>ganNf+yf0 ztDWsggyaQY!8;{1o|MG}v8`W7;x27N-W(%37F4b61OM}_|9*9TthHvP=4chC+qzPl zkZT&*BY)lyZRk?PP}f+_mAIA~5&m9y=m76q=L6%^gn#*pl{8FYHT_S7ym%&xwaCN} zvk46+C1hE`NriPMTr?ugS_c;5P)r9EJ)5NA+wC#ZxXPf`=bG|o`-Lc-?s7}&rM-J& zOLH7ZQwMVl`iCIa$H4x&{%Q+9kEVZgeryHI8iVi2zU5|=Pus3m^sK}!Ny}T3%S|6| zTeA6V3kfqND)va?l>V;Lcq}l~aHFx(SDyIkKbm<|LuO%-a}io$k`;>+&(JJ?JlK~8WwaH*wdarVAHa?Ktyn)-V~X>h z%`AoJ&mIYxGXM?A=rx$Pn**3>Oi;K0d>gb_9=ZP;#_Gy0O;hUMe(XPfbT8g=fP5)D z%s1P|nqg;T z>QHSEge&|g)fjnX!JSy5o8TkhzAdowF$c(9Yn8RoX}bYs@X_d61$)hacngCPN4}fN z03st8Ew_l&=uR(#*i2=K#ZFfkZXO)oH8gzkyJ4ND51WvppSY5qsoIn=hAp^_13l z(UIaia=}@%T4~TOEsPJDzcR*^<&$vw77O8@C4pgzVG+WPTHrl<7^EQv&BwfJ;QyV! zJ}$$1QG{$Jl}(U09|B{sUFx>J0fLNxb}z(08({+N7Kq|qG>@_saV=KizXu8J^i$c? zfBfh3>$b^78>b~=YoW@ofp}V9!>~yfH`!Kk93QcpK{akYb~#GNFqro52xrgs4SMLF zK;^}Txah*Jh`TJdVMJOUo4cqFzpd<(eCPsI3|jz!Aq5d{2|}mU1PInyDv`|$3|bpM z0c=$2pmt}xqn4shTPt_A(Fhxs;SeYRVQk851Wj?~ z?ratHko&Hs@1K=^?5!`T{%Y{pNN3-bU+DECab3&nVD@7T=5d1impqZ;;iqd*Ln5ao z*%~;tFg@;$3^kg*y^>RIh%Sqh|IHbsyUEJ-T?lcq<5SlqV*16rqahas;w;UfXvwW(Bcm^2jK7+D`6E?@!!aP z+tfaviXor&eqD2s3+z&6txls$=R}63+-^mMZh$R6mai`yQPc?&B;}Eb3*4NZiY4%q z@GLjXl`G0J%VR_9YB#l$j0jMK_0kNr`Bd8U39PUhS5y_5LB>rfY1`J;{qCAK5fVJo zh9LzayXUqasZUL<0nLaLGB(lvg%^^6S7OqqlNd?+7h=JWjyQs<8-BSfDb`-Vul{W0 zg*xCBUK*nUtLHLpQ=S7d9A9+2eG1%QT0ASsT#a{pKi;)Gbg``@!CliFG_ajS2$uq9 zJu(P&G!a83kZ^4Y>ZL@FB^?m7SuGH9Pl4byzFnqfcGt~zeA7-q#J$)5rJ@3P%xQ)2 zXQWlW`>h2mz0afQ;UzkHBXO_LIhW9L7b;HEZM$2r|s<7?u#sy z{-rOX619&jaAxzkjBg?DfpL^#b7O=L<`s>g+7nnH5=+upLoq<50PodP{o5{NJ4$+) zc_JaS6oGQzcMSfz;M3Qcy?ObaJ4cp);dHTI_(|JXiRt1^k1(8N?D-t z=&C!JdGl<#G*;-e+L2951xp}S3p^bMgUM#yjI><-TsXajp8%v$O;hF0ram)|+!B?1 z*5zPLSJg?FEzJhuhtL$p2O0ThAn3zMN%AP*NSr2`L>35r^rsV82S#ki;hkjE320s0 zeYE$Ku~d14Z;A>*(A}{Y<@ql2&i{Ho*542`hppuPk>%mJ+*~WGd}R4cDOcA;E;3Cs z)}wxD?!mqK8EYWo>0gZ$70%RKUwu#ZTwlh%|8{VHif*Q@=2VSgtrunQZUUG6>3lf8 z#ZU3LQ;EPwds?NZMeDVa_|!fE)Es{z5QeKr8C0Nd8g$uw2-b#0kbNAtGoCal35O7h zjXP8Q!3&PG2`LVjkaxe@m3lMgO!LpSAKrT5MXHW_>)^-ug{aD^v_bRe?{bH)QO^9a zT-)9op1)cv#whhZ{l2+uK6j>MJZi*O>H`PuxIz(B1h<>FaLDofz<$)?*a<&M56G6P zwP7+HKcd43Uu&#hunDcJeK9S(6-0pTXR}eqA%UT9XquGcE_% zgfHu#E&V=_+ZC~bA2;zi*DzwrbefMJH{ttqWs&iqE7=**Z|k|(7oX~>tf~sqX~3J- z%Db-cX@0fJD{dM$Ll&L`yiFO2B%*clWSFN}fIB`DfnET3KMTfXO(DtVEmnv;otD5y z;LqJ;8ic;gGDcL2CMEDbv!$uBD8o?5Qc9~e^~pWzEZ?X^Y;vF9oV_a+IkROa_HP9> zD$A9o=*nNW>@w`LzG~WpZ~Dr(X!8L1A7q(*qTFlcn)1pr1xb;-@Mhbx5h8{SqB;Me|rHNXqr0fV*e}tU1!OCzsw(BsjTXkUXu=*%V)SP7hf9P$agnQO(c$ZT%L;J z=&}^h`d+qDwyMj`-%eOfn?}u}0W2?mF-WRYU_m-Zo_U^i`c$nMRa-J(A%qFn4LjjT zRqzBo1xP`3f?Ru+&gauJ0&@t4DG`D`giw&PL2;Izn(9?##2>ux%g&P({dT4mWHTXn z^dMa2Ur!r zLA%wGJZ#HLH|X|jmW>R~adp-7Or^(!mRir?LTp)00;K}{&}fmFu^OX`pv6J1N}YzpZAA<`N=OQCdYdxf-iNA zt>E#Icy$+_coY85r?aao%TnvnJbAaHKk^|rG1}DS35@x`*{X}Rk~lh+xL2wl(cRq!j^%OL5PDwG`kkOiI?xFrh`kC^3|A?;lvz zjTC<`_wY}muBh<#t^0w=t|Ic0ZN%rQjG1&KmVN6yaLl<}Q0W1lfMbrtkwnSX0B6aT zgHO69WzSKACNkkE>v|UV3$YR;AlB++O&St=MJ|jFCDq=86%Y?@iP9?Z?IMf0$@SR` z!GvA#BMJr1It8W3Qm$u9&ydqcM!?JLA>l=2Q&c85t z;JNm>?6|ZocgB{Uzo*4&&MYr%xp-&@AXF=~vZZ=YP+&WHwVB8FM`B;*2_5$1`VP4BFO?i1X3wH9k$R9U*0dW72(8Cs}w z!0NZ+ltkC*bPR-?%F)&box^JvEaYzWfLTV+6lczL9HAwxsHgG>kwI!wrL7S?L_X>!2wAGLjQnSYTnm2cP z`Zk8YKZD4&hVetaQ&KA90{mj39&0zV1|Iz6VmzF%+dlDiyu}m@Vpl4IGqcvf#cPAU z;oMD5bDS366blZqJ66hyl^0I#3tOwm8CeEbGuE)WT49>0tsPG?j}6ugn~&ulzG}u* z=W3po>ox7}G(Uv{^I!r<_5c$Q*YYPVdOH74px$~(r*VMZ%%aCT=t5d9zDI>X)x!cE zts4aq{gC2`%LRh%;#ruM^N+AuiHWW|V#0F$w{zM%AD)d)Ir-hQk-d8lB06i1=ntsi z4_Rl6M-M&j;Xgj$yua1M$%kjGd-ubiJAsEU=nEV;E?;T@Gz;z~!xVc{*|p$`{~E^K z1b8t|t5&7u!J|3wvDk8r9LyGu?^#^hZr2nyuNAo@F<|nH0VcrupNJ2O!c_$Q8L+>H(L;+{OLZw>xJMSv9^XxKJ za>|dtf7-vW&~Jba4Z?3)qeiU<-wRCd9;HpAqw%JdZT-L%@_c+TTYhk)CfV6~(K#H~ zuu{1%XthjzIV-h^u7h`sdDK~1brc&sR)KRyDmj|`(4n$8P6nL`0{F(RFWwF$q~9LL zayap-IvVOFz(LEWG$A4AGn(~mp(UurW(g8)nE?Yx3V4-~4i`vzt7Kfp6pAt)K>#x% z1m+HiIV&Jgz>e^DD}`dF?Mr6np~S9Rl_sCnTbpl*&44*I9=bnKD>i;40{cTJmd(SJ^?s%*2S90DlSE6i|hj88~3!;K>H!!8xX=R z5i8U|N7gU}9jVmw;EIlb+A}EUUdM_R4)rQd^bWbUb6l{i)9x`Eu6A3HMP2 zKdSE48*}#Q@!+}4!DOi|nB3>04jz@8Mukq`W*dCaSAPRe>?GH*beA4ukQN>*QP1=G zC2;gO6b~x?a~lg?u^J)fSUw4qdNY1^xovb7R?Y<9jU?Me_mK-~HE%zs%j~%NhU_FXKwsMzIEk zmgSK3V#)GHxjFi&-wl~`i?j2ZSHIznS7Z*>Ojy4P4+7W)xOAA8!t+F;6=bpEPg!J8 zOIkwAOV9G3fUJZAx5$&GZpEoOsHM@3YDIy1WSio!%L@tkRJK$F($aN*doO9U|3@`1 zuJj4w*u?{a98PJB&c6cv`&jnqn)iKH@BiEyw^i{7(06mM4X#kvxWN_AD*skxa)ZmH zHB@t~077MsWFI#gb()GKgNj+w?Q;%Y%RVM_ib}%ealzyQ^OCjBNKU$}pSbI2WjFzY z8c(?~)FK4p*sO}+C)_T&t+(-Zxz|Z{q1XzdBjA29m2l?KAB|Y%laL)8G3YE5TZLiV zC}@s)$4Yy*Id#l9QU}ELQo7oTlqNdtx2{I>hK~sEcI=M&ujkPQ(CBh!vX3o;K*qae zcv;+je5=hIJUdn)KaTJ3T0UeBr;e<+BMyOtX^VM@@Tm_w%5Ef%L@aNR!HV$PiQ^vs zn@H1C;y8hVj1D}7P^at=oUaG+oj`)<5wy~Pq?OR!4`a+b&$~ceF9UvMoCe1Gs%}vs z2++eI49+OzFO4ie+x5YONAGL?==H66otM-$LM}rpavvegiPz53Lwo=G)h7|F)pGO{ zFjMbXKCd_Ix{|?u_2A>LB`!|RvAF#$L(ZNCGqB58fuAMngM3o6C%D>+^jRJ0o>doB z{+2O{F`7GQj!PWzJAl_Z-7(c7OkJs&0=8?+w}MH_GhDy)q?F6pWhh%2HzFt}$IXBL z(x)nM^aAg#b+UpzRggIt_~lrN%~QE|(;^Yf8D#?3f6$yy&|7Sifttz6&)mzhQGO}} zyjJAmKg^VHK*_2cWt#Id&7+Q*fG7F02|&YQ0B=BkCexD7foxftiywXd(KlCKn+)_q zKBp8k9@bBWqM{QQsh0kT=ZkDzq9(!~%`I&4)JRgT`c21v{-E;OAAXPx<^!(~9Eh4> zbHdU=mjFy27OiifVfKjKfBqxCE!a|NNgli-K2~2iBil2RJ)UPM)4h1`XY$T5;=mi* z&!le3z4o)C-_?W3e`X-ySAX|`dE@x$35Uex0q$D2qxJRPS2nc?VD=UWVLhs&=$R@3 zp8lcB<8pdgQ$%}5!Wq3EfcR!Wvd}Varok`)ZUh(*%sa)`;!USy5*ExudL{fmnKrCO zX@Z}@Egg-uq-v0n+N%Utmjnv^qe4C=H1F zh$^oL77}uPn-(}c6SCsFVFG~*(fDqR0N8};Fom?bDRGZ|NUXZFP$Pa+)bz4$hrDRs z{E$n9q{xTZ36!q0cpeM62FiTw1YfN5J58-mL{Hp5mE}hMG0jf z?dHStisu2KrL`o=0hrLwirPP7mp)_M{Jy5>oEvB4S>-`^|pcecHi zA{pLnT8?7htT+&3dhOigyltTGV<%^$GUev=lP|FHNp)ps-bv2QlLJJj|MYPCos+$< z_{;$ZC&6MW9I>;9X>lsj7~{=rjzueepj}J=LYk>=@i|oof7jJtc_m*r@Gn;mze<)JKlbgoM;db3YhbN5GQL6rxsQRD>C)O}B}kvJe0=|? z)DMP0E2B>L9dlfcF>b4KIKrM><*5u^tY?y}!Ai&P5n z%*kG|1!D&j7j4Phf1^^(Dy0dJgnxHLZZhb@N20|KkCbWh0fNkBqINL*5bLWz8Clic zs3{w@POjvSe12X-UD2HF#A?GZO$8tyXT_60@&9{F?B!2L#W$lvkcsY@u(RZ5beR{IR0m=~e2$uU9 z8F9qPBQ{Q1K5in7d!ox!cLu-x;mc<~#C>J$%m?Y)QNUdaEax?7<8Kh&8O6uZfy>7G3vyRae}0fv})isgGoNA0gjS;G4{F=v|AxptJ{ir5CuY| zf?5=5n{$btXfd=K5C!K($8X8w(CU7M3U&-Y9GFf-M9gppX#w@H z27pyxst{=;qYPu7Q3-~WRmh`oyL=5Tnv0=Dnsp@_f-c~x=i;+bcBh(=oLbC^!8Uva z5sHy$ubTx*ET6m#uG&sM?Y!XAic=QJ#^Qru2+nLBFkldc$Vzza+xU-_VOl<$^v?QR zhoGuEF$cr>H8ml~#5`cGos^7TDtD zZ4i&Z+=3@4Pobyk@lbVwIF;zjva5Ty5h)UI3-Sbjk^=#E(jz?Gm?yg+F21xt`{e;6 zxZP4lW>1MQp{STu{N<5-{ioOg)_}17yM_P7zM1DigY#_hC8rokbSdAg)$MUxB#_HT zWmF&g_J{fV*+CLI@}KUUkQqo>;Ll4{D;hjI_s;&n1p-z*c#L+mpE=!e$=}rt{^NfO zep0yG@63W`f7W(h8Fvu!{)X?oSYAlxXEYR=3Q0rk;M27ug#*W_>juW;SKpTC2wEPO zgO5n0xs$+xVl$^K9dekoKbHs{HCF>)WT#|GUBe(BtBjj)KUaT}J1+682g)@`h8bW$ z$pqlAJ@{p3I%_Z)$f}dy-#RGDx~|b)>wD+3g5Rt*-a2>cNY6y@=1{r(c*Bi=XIXpN z)9R5*1Iad*)$_%n0N>_YjkLM3L0aN0e|>2dIk{_+T*!a-Z1vXo)L*n zwI?Tdal_^7%Pqqfp&bpI27R`C{JD9F*VPzRwyd1W=E;M}Z4OG|sbT%!^T{=FE?*#S z$%aWB)9yH1wUSVb4!~41RK`6=rlx0%Ng5}bY6N|yuC1<#=L^Vv$**iFTq z{zO!*lcomH)_7DXp^NW|DOo%;huL91OAqle#vcK=6b7Ead+h=Z^4LWKXR8K!JeMRs z2drwWLBdzkD_{-+P!ZoNskfB+#BTCTNSv}D@3HWiiIuv;;J{UHDGG-e?5RGQo&vof zT?mrdt;I;Qs>1q8@;y^FMk6$1Vf9tj`=Xp@%bN-S*aW+aIC zecOui7?ilxk)G`*i{_}qyd**0EcL`o)9-@Ay6l4TQm3+1&e>MXI@eChtG(|E?#=k zz19D@WoCTqMZy2*OJp2iZgM`*AF38yDLtS5`ML)$O*+VBAK#N91ok(xZZdF3V&q=o zJ052`Rvey-=1edumB~%UQJ?jer$VPWz6T64zm*Z2w3#fY$Nk$#wxQ*s6)7h&%JKaS zx$ao=8>5)TvFvcWhihCFQ?j_l@dNRII3&eZjyGH$42(s_lci1x_6q2m`L13mX03=Y zO&oOJAl>K!2{N0<koj!Gy{YCU8x2XFAkScxl)@cW-l4Ke3qc@S)gDt0-ZfSc z-*}T87an|xVnB%m6~6z zxfHc%0nc5P*LNS&<+G)O2KgbxD%5ScP>(E9c&A;G-8rSqZlaxZNmP^FL2@ctjY=_8 z%LMi(urMOIr?_8UELC072b7&Urn^QAVmyw4(i*HR#ycdAk{DCZR6{YD*%fhT_(Icb zal6moRVR>sI_m0D|Hv+Y=BY4o2I#5IB3Q0c4&%4)=FKBedM79rC@mk8#kSw!)2*}o z{-NFPM{d39Sfll!xuV@iPFh9xY39J>v0T;9cU}6I`kKtHJ@c1J)89C-`{3CjN!*Rq z$U?h}H=bmjT&=TOCj+NE)~bu5Tps9Ab+O#%siOBl~L}b71OA8yZi$f@<mzc?p z6rkn|Mzx+S@S=<<^2E}ojif={`sA; zfl2OZ%hS?N&n?`sjMgNFKV>pXKiPHT-xR;HD4&(ry#MR1EW;d#vMpJw zo>@oA_ZxOZX)>(K2`xT=!F$P^ez3W%d}P?PY|QDdhzq(ln8t9y7qVsd7Z9URp5c?o z69&ZvL%07(=fliX>o9W*0HTr6l>+uFy@0+32FZn$>$pOuU7rJvzCtHYqT|bYN}>U| zDKSO?*pEW^u#)zc=;f`|gu}1Q(&?eIpYoUmgX@2@T==}wQZ4=UD}N3cRcFgbe764c zndL^^e$J*5kLm6na)&a5Y2jq^fcCe@&iS?>n0(KWvM1+k%EK6|$TRSd_0dfh!Y0i+ zi=E1sp==F+u87wOVTVfy40D9#tji)dqfG72rY-M??*Yp%{OIMK(Mz2v5nMo-LUMXW z%ic}YdnLYmd@^-|U0S#WN{~Zu-Ww*1gy$d2|Eb#~0{NKRRkv!6?#)^HlDp%WF>dnh zoL~?>HkO-fOP+oC`)f5HTe2Zd4~9&fmMA>l2B^$JJ^(E#u_i$XiuB2JVxbvRDw-0j<`gnvftU8k2InyrS-9Sv_)Y;DRsx|y z);o?S_P+wLzci!gzp>|6w&q(t-E2Nqb?U&B?ec0bms9rqUmW>+MxD#x@RwaW*Kw!M zn%e@*^eqpz2R+NeVZryt$qECxIBqhLr)sXcD$ls$grQ14XpP!j8aahD+2sVR(bhpx zG91&Y&w7(j^+pnEl_j{Vt^i}_4YvDK47AM)L(rNVEN4jLD|MwYowEbxMX+JY6wj_Wj;o*3M|%1gl~lWj1^L`KGQjIz>%b$5A@ouURikW%<@1R_kvH_z2zLp82B13i6$igiKJ7^Jo<1TbaPCnz-^EwDgUatWfLc!&x`xYO%(C$Ly02GGm0Sw-Pve0y43 zXggsYS0H#TMMG>qP(NcuiVQD;Z`MG>T}+V{&!cG?+{|f0Aasb7ik%@MOTC5_@!WOE zJu&nVakCO_RmqZS0^gNep#SCwOMr;I-{1=pqw+x`E;!o zZ9?ZdM2A5FxxKv(y=RvLm?0lN48DOZo`yjFj@9a)ufg*gOWJ+avSMAYFqQA`5YIz( zYS0Wm@`|$BF6dHw)S#VWY}BW6+7lB*PBf%2TtLsbsd~rl0f6w(g)OB+x?~tMgq6}_ z#9o}NX6q`mi1uvOl>dxT8?8lp?r6oSPj$(uWX}Kr&Cx*QEPM=F#Hw@|1m4^vk z*e^`It<476eJvwdKg3S8q|O>yQj0aA`SLGm9xm+P zh#hLy*Z01%dt*f8_8&~&xA*kC^yG^zAT<5V{#I}0k>0&_z3F`3aG$B^ygLb^+SR-B zPMUyyfpwKxTGZ(=zd+WUm3eg`AqQJ$p!AbBcc6d(cj1BM2&EQ7l#`( zQx1p{LZ1V$UW@DDnk8{^c-aQFj+kJD!^MI??jtJy7+9`yAYRJ!SQ{y`Nu^ZbWxQkc z?^(^JxTU^f=amJz>slG!Rq4TmZDv{iw_*LL z#g_SLhak1!U(Zy}T`a%cj0bO6LE*?BMy$!HsnS$eWPFot(!5xX%QIM(ps?Vp;tyiu zv&;s=sMGEa^sjud+iW)AiNRs_7w*O>#j0FR7;*@(sbYma*%xq>r_J11Sfve@*pTbp zwmF)h9=#L_BOx=gxn&07vEE3I@NeyPbT5YO%s_FUDP~qbR=luEm-h zx0udO?GvP?ROYGrt$BwK6+zMW`0%!v4L;y?j{Fi zp}Uw7)+(!rY*wngmLCr(y9I(eC+ZcYF};c^T3H0#GjkL)RV_=ZPdzsy>Aq7@ z_2Q1#QJ25)c%gMwc^_cTX$XX*ax3*{@& zPYRA|zu36@%jNs~7fOFmjgdM1+y1S5_s{Zoe=72LYThsf^H$xm(Sx&+-<3+xN5Yb{zO7e(|>(fKZb=0%!(0 zd+zrie$+f1#{dU%l%eL#r-GBwBR(r9M{D3bze;{}Cnpo^7OBwZ8{c_m0o&sqLGMi9 zn-9HPh(~Mmq`qv_CmD3{+oa`<6DeeHsF!bT&b@l(Dm#ar*kzToNBNcrkw3mV^e+#l ztn*Mh)7Mwt1uQ?o)%Qmb#P3p1SQm#=QiNm89RQF=Z$sn3?_4hCi`#&On?WyBrl-z<#J&Az!=}-u@0CgX0u)gvv^`x{lBRo_P1R5{S3Gc+1oJra-+PhS|&>CO82cF{mnw_7pqp z7cfS13DOK!XfR5=a)iHL&uY)ka}ODD@wtL6p!+0~NLdLx&t056xXr%n^8E|-)!prK zCxj}!)8ZPO72|V0#T~_IVC4r7@Rc^727Ef<89yAyP)*@^79IG4e|@M;d#-|H}NX^nvR9XGMQ|u@_c#77Y*V z8guS@W*6r#^zRLLrY{a)`Ha#n5=U|La5ep2@r({vK}U!0mLlQjXw-Hu^ON6i^rFnq z_}8+>#wxM}v-62R1fDj(eiAGx=&E)9NO=66A2prb`~Q3W2{d^jw>suThQU6P11ZKOHXa;~ z*xs*|rJNpeR;c!?q#1^sb)XTBa4J_0x>2JM z*6g_f(NojP5IjV9g2+q5#RGXGHcX~nU{>(+qW+o=({WJ z#zO`Cnxvh_KKIsqa?#@FgR2&@0;@XL(3SJkk#nQx`@VSt^Eq9sa8hP{*_-D zeUtpigSjr+Dhy9^yX?KJVWu=8cwx@zKX|s64Ji&6&AF+%dmU9VgyR(8I-XL3U`;3q zCS*$CJs2XAWcRkibyi*yqo4`IN|nwc45wsmI8Dl&N*V{7B3%l(lb$1}_z1F-dwOOH zg=SC}<1iY6U4Zcqs9W82Lg;Z3&dz2}h?|yB2_XtASkvs}I1;#qt4ql^h72J3(~h9c ze%Vtk0J1RdL2wdLCkE{o*8c9}FiFWRMG%Tki%_~*j|rv;93(wTydr{6K)AHoU%KI& zt)4Fqi^1qzs*1`}WnD1uw7W#>fU8Pdz~((!=ef|*)8|UbB>LA z7Fb~eGTdzvw)cWAIZPv06Pc2GN)3D!v3x&(^jWczfDokbp-DKnW}M0X>eN*VoQYZY($~ zOV38CI@MbO%EEfqx#CV-T3iL18m?C*!+kM<(%RsC7PJq(WuEzU)7J7C=Af^WvlXq%2_ZIe0#AK6(Jj z*w?`_OHYdH1>bd)ZirquOt;nJgVHTD>7D!zo-<9CMd=+GjW%Pe*Hk}{I! z;UBl>{eJ#^=dF>`y}MuQBi>^+-5SY9G3ZwQjuXl0J~r5o^=d=qiTx9empdHAQ=*2G zm9IMA=yTM(5tf;b<=(i6SS(j}2yI0z-hccdPLtUtwDF~M{S5%Fy9msL1|9E^wLrFX z=#3ySp>l5|yWIH(d}MiIa<1sWZ|r8-o)LR8H*x0IuT}rE>%jAgVGn}LGmpAm!|AzQ z2bPJ#%!SUQ*EjC|nd?k@&pn1yY=B8H4!So2aA=YYTy9F)bK}VSR=HLiwTR}(;iQ7?;A|4{!ORz` zg$lHD?rkW4t>`mag0{i{7ovY^M6_#OfWk-kC18Jt#S1(T*-T4n+?jg5&s73yJ;*J{ zx(AaK*#8%%!EzA;CGIPgpv@(pp~WZ|c7g#bWx$g4BwyO-rVI3c#NcQR1@QZN_9?ZP z8TKQb1-c-gov{6|3oYt)(H+L*#%iS40wleu`fzoEQ3}>q9I~+5yBY7S0|6ne-~`$N zNZ&X{z!tKp8euSm0lc#y3xL1E+vQB~DG60gpj1OhS#@_JQCH&PDOBJ+F91fDW>s%u zcJgh@eR(qLKcc#f^h{$QF;I8UO_OQsVLPMH+2m#L zW$~^Mdv*iOcrg`$@zP$^tXy*x|@Q~^BF7(_5@lYP5a)d_5 z^)cFu7n4&C+&uZ+hAbxEmVN#EZ&6^beW87(fjoMzYKmJx6%JiLzmm< ztO0JUf}iJZj0S*dUkK2G!8=q#T7yQ{lFpZcZ&LaG_$Hsz)6nu@>UHM>cYi)C{{gaf z-uhqn>c9Sr{KKCpo3&BkD$QYoPYCYUg|l@t>?rLIZ$+16u|e7!ULTTu6MJ%Yvp+WFa}!(obH@orm#LNFk)!*Da15r0Z3fsLun1G1+mG&N8P zmeMHspfH+ie;1lnh^j#bf)7QnfgMjc1-7jfco~cW(GerF53~XXyEC1abQl8L+!S@J z6j5GOrBo;hX^m>cqQxob5l>#s-@x6qIcy@ectlsN^pe08l7yt)+g=;5>~@g}4CFC32loFds=%P*FwYH6 zKR`d|Uo1k!uueBm^vn*3?n0@}_XdD(D{o$=y0kDPKC??8KjW_gcCg-U8>k@K8S1FJ zw_R8jhPDgARygIBB4(cq!06qw)S~7Ke9mppN1JaZm+yPFF;ci!DIG4@d-|ikD{XK6 zxB})5zkIs?cdy;dlXe&fN^`Pv#Ia1dt5`bBH)+abAvFiLLJ&k7iK_*BMXJ(; y<^J93G7Se8xW)G7;iB?vPE2Pw%ue1M!*V*C3mx+J-hADk^XC_;quST9q5lWdr;4Hg literal 0 HcmV?d00001 diff --git a/sound/items/taperecorder/taperecorder_hiss_mid.ogg b/sound/items/taperecorder/taperecorder_hiss_mid.ogg new file mode 100644 index 0000000000000000000000000000000000000000..50ef4f2171b193820c394589d8bac28ead760c70 GIT binary patch literal 12177 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 Puk{*pW6|_VQqcbb3`gK_ literal 0 HcmV?d00001 diff --git a/sound/items/taperecorder/taperecorder_hiss_start.ogg b/sound/items/taperecorder/taperecorder_hiss_start.ogg new file mode 100644 index 0000000000000000000000000000000000000000..fa57041a72281720e6731f19fbe66c1b93ad96ca GIT binary patch literal 12159 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 literal 0 HcmV?d00001 diff --git a/sound/items/taperecorder/taperecorder_open.ogg b/sound/items/taperecorder/taperecorder_open.ogg new file mode 100644 index 0000000000000000000000000000000000000000..7b7110fa58ba591cd28590f766549b90eab25fef GIT binary patch literal 33754 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�H90HyqOv?Sp-d-K2QX;BYx7N+y9j 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 literal 0 HcmV?d00001 diff --git a/sound/items/taperecorder/taperecorder_stop.ogg b/sound/items/taperecorder/taperecorder_stop.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a3b0f659928f323e89e41f8e3534a2d88c20224b GIT binary patch literal 14779 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 literal 0 HcmV?d00001 diff --git a/sound/surgery/cautery1.ogg b/sound/surgery/cautery1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..fa714439e511bc489920055c5b5e8f03aec01947 GIT binary patch literal 127266 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

OT270saJo;wXZ+?}3Y2o}c?~R}O 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˯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 rVJ949HI%dld#akEYK5eHC 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 literal 0 HcmV?d00001 diff --git a/sound/surgery/cautery2.ogg b/sound/surgery/cautery2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..334c98f6cde4debd8ac22d952c9a1c504f31b892 GIT binary patch literal 52245 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 T0}5=lyOFwKL+UJJ8HWBZY84Dd literal 0 HcmV?d00001 diff --git a/sound/surgery/hemostat1.ogg b/sound/surgery/hemostat1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..d68c82620d2ad5b75b2fb4cd00bbda7e909d900e GIT binary patch literal 42370 zcmce;d011|`Y5~;LP#KB0wD$rGzn9fJPDHlp(lhy5(Es8#DHRxFbF{`AW*gSoB$z) zFc?Oew2T1)SWs}REmKfYkWmq}RUAMHJ!-L|ZSTgm=bZ2NJu}<;t z%NY)~$ACX}c+f5uJ2GHLC^0HCD?a(djS4=OAIc8cfP&fKk?a5?5DJXsbEEhH2oMa~ z6&A)0{|gT12L|y2AclXuhbuEk2mv-)(L#xO`J_ew0B8UZ+dG?;Cvu%zD;gnl%Tqm{FXBfM*H{=?7Tqov*dc0^U z5BGb~-dy6hLg|}inz;8(hlJARgmGuC!ec)LVyN4->N6hO=Rn)Mc*a^g|Z6@#BZR4 zh%6&Jmo;;>iLx`vb?1{h&!^rz>vr=j>Rl6%Ltqrb7PPhSLBhq~)!+ZCkfV+pn?t-Y;z{vkT<-Fq;a3Z8riB&Q=!c!x8hZZ?FEWQyD zg!Wm59o+_ol$qkGb^o~||OxF-VpMo-p0Z@+{Ep@ND!r~XU)KgRo$ zEjsqqPYn7#2744N)TLZP#)8mK@%7)1BRB5-PxfJebd${EM^EJvkCnisSdx}hZku_+ zth|AC-MPiKxMW92M;$|B{?^?6p$DjZ*uaXYIqL-Ns*g?fTAZ z%7Pu?6&7U~J7t+QgG-3=iJkFIm=Pq*WhdM_pRnh`vFP)E3d|p3^Yz`V|B{>y5h44Q zJmHkV{v$aJl#)eyi5<7hKDx~DNY(y=+K!sjFFKlx|A*uxsoSd6Z7TJWs)SNdm0VD( zyVP`G?94Zp|Bu(dB_}w;9=t%wVQ1L?m*fo42tlAUoplTQ?vFVJOo0f^WN-d&0sz2( z2DS5@9*Kx_pNsUKi*y(81OE3C1J=%Yh0S<@h^+(wE0BNmMvX<0=H;_7tAipn4bcjJ zM$5i3%$rUQ6 zLx4j2BevYv{$*f?Ff2)3r7f_%ZNWb6sAkQ0HP%*XkC4G)t&=)5!dp^%db!4NCR3p8 z(Cv+`B3(J{RO>jyj|GeIyQ@eyL9ut+QswkWhQZcy5k00~S}_6?G;8OF>k2jrJRlu)D3g zGbZ;e!{#dgEM7iivU|gRzDx4<+OxO3VoxSt-a3~Rd+|(??yutRO0Wn3a)=Qi2Q0=I zAPOOJ3IG&>44iPp_8KS}-}!@_Tl@To{f)CAIwjGyj_OG-5P?axO9kW&%Lf<}z&{5j zD@25b4JKf40J%PWqxtxEtSPUs@~50K?UB<>?KrlHSEfrjjd;c8|iZiIN99sK? zF=H()cOp}2DrRF+x&ffazzF=AG`^dcEdbP!>xg8!moR^3d(=iE}$caEoYk#71Ykgi>WXgDCh_91F z>z!I>t2|yvNVj*T2fVSOA|_>`0L={P*3Z{lkQ5a$g}uH`an8>D__#yiqmhv^+UWE8 zs5AYzxN*<{+neG(8e;-5lF|TRdygbbQQp)$0Fny|9034LB#1zKT&Q#FhHIv+*uZ;r zR0xQ75T9)z-f7S4-#KoFCf<2(zDw_1IM4`g6hTY4Q3SoIjc%Y*0^MNnEo>hrJkn)j zj%ZM2;D;*?fs=BmG$xG_GdE@-K!B)GfbZ!JI(`UJ1vt?uunA&gW`(+Z9>_bbcVaT# zGb2N|9sT&`3bF!x&+dNwDR8!BU^j4jMXfEfF-0_=rFb{6v9zccG|DO6;FP<^eV6v8 zIG@L-q)zy@eSCm+N0b7Z>`(U;c5k48dL#{yhxDW?D_hPDO+9*thf5Hk2%Pxyzf3!~ z7347R#oiIFB4nfD4-zsdR$ztE9~BB-$cukhfbTx-yF~nx)J*5rjrsi9E;8gV2pk1u z&Uf7KE(7iMUp+uHM1~;$?15%dS}V-|Z07(z2y~;tzKt7=8#l~7h`o&r4L%4QkMgc! zV*s#d&U{y~@t}?3A5VJ+fti8_4*FLG#X(`d@t}=%?<)Ry(7V?FAKnPk6O>CiVCUjK z67G4%9~zAH2xa6eyI{aHsE>lWKw$<^4rZp2e?i^-JDmTx_pYMj-%Z{X|KDdjH&F1` z?Efzz$h_eeGx?Oo4)e(URzmCaCrCV5^NwMXA)s`F41>=^hkz1hOadt%&UES4Bs}LQIY=!*KDvZJ`QzugT+BrC@t#8-P@o5$o8~5F?pc;f!y6a zCyMLR<1IosAoirUz~3ib4z05wi;s#@Xrt$`kp=D`RNRl36v?{vqPXtfJD?;CRpO*- z5Z#B|cOc>pf#Zo%&RoJtil#1A#>k4nCWU_+#Yr;K~w1)a80 z#CvfdH6I+>5Nd^nHfo(RaS4z=Ko|idhIYt~b12v1i?3iP45yLQ3CQt)oCGMOXF)80 ziVuJYdtA@;$(k>Alz+aQH{g^xk{Exzm4E9gYtqhpR_ZX{X!+ogp?JgS0UiJ_5gyjkfA)&Qe|!5l{Ue)*`py>YIMab_`{ zy{+bcVC*3$0s{=iEg000CkFMb8QQ!BkPktFuBBnnnw{4vR0_djg4<>aFwkUA7FkN; zgto)g>KA}GJ%{uj;Nj&ny>)BDO<;3o`rRCKE?Pmv8SxlUv+#?L3%2<`hC3}|EB(M= z7EB1>Fz8$O$W=*+&*^^t?=zUJ9h{KRa9$)IG=gA41MdSsnI(~2TjN_|c4CtTU5Y6) zFSn?`f^Hh)T|5t<82}Ut3JjPwOeqxlXWVb`?iR2S_ixmC*di8eM8E%D7yCi%o{I9y z-+v!X%4(>sOqPh_Pu7$bNn<~MJKzXcymer7eee&lg#q(73!*S2WfR5W6&(y?lrACIm;Y1IBJk%g)LhM1EP?gzk*d0^Exa2=R1Yv+ogZjO6>etmHG*8|RsOxD+MmU2s=*@u4)=RHccNi39VYK>fafE&_>a?%g@m@4i4}JG5R*cDX|%)$7dU7hqpe!iSh<(aTwc~Q{_T9Vx z)?2}Ms>fSY6Wdj}0ZAx7Q#xUq+>|0zupqip<>^8o6AX93|gznQnMQ%$fwKfjnegRL*EiPcPdg zCq!c20&Uhd!TZlN)gIv7v1q)5vaSelbC|o!>hN|6t5a!1Y`$st3oC2)*6E6jN!E2P zx46ae$b$=j&_CU(meLxi(_FTuw6s}~`k_ZzQEYfst)FI^|K6`z^p3eb>@0(1%ScsA z(T51lWSK%7h^%0+TnbsHg3b0MR&$dIpVT0eUK%UI%ndWyMHKNE(TH0WQg0Ecq=$`U z1E|@! z!DN?-K9;+F`qJ!GuOG+rKK|rKvkObI)se2v^fwULPwPQ}k?FZ%AFk$pa`}vy?mE9d z`c;X*t$~`m_zD0jRAgWir4-$)3$3+wYl0ia!fRQ93x`kL;+=ECR!JLrhC**?n2e-E zyhxpKXEMJD`-yMr)qc~{Ot`_VA3rIKwFot3+5S@V=|{aE=5~=#CTGw34sKQ2z;1ie zVRUrbQ(~nkoYB!jf7p(;?osjs?5#rhA9fiRYs~Tm9mA}6l|!3n1=FwdR(OS7?U45mUM+F?-h77Fqwf)8h7VR0H>oAk-3M?ps9+<@VXu)AQhP_Tsv>w!=hFV7 z=&M^ggB$?rWgp+thsBP_Sw$AZQZW=VDyBmPqXh_zgmAhjjVrIe#FRgXbADP-`q^MI zvz1Xp`@;R8VaQL`)^Rrw93ak^3^D4)+*;-(4tO~9%*_^=CBWUHpnJk9b&|l;G;Do) z*jl5H!FHTUiSPif_juHHTwyf`nuQ;zmZ;gG!P|Yd2wib@y$fM96o!Th8ky!rY$QGy zP+35f2vWTq@C7|%v1%lT#FPhPsWk+;g?Xp z5Pw*Y2wFwLq&+IKGg1~!5UnzuDqE0!MR$SEEAlgLghQQViFfLcG@Vp|hG^FFnD1xo zDBgBr$Nrx)_7!RyvIh!_Db-}$6}3u7k;WW=%;=gjMu2{3ZhNh`Jx`);l3r+ceyD{z z;@WT~B5d6Ej0vIICgqUym->SUT(8K+)Ky(uCi$f$^=@*%9~`QbTmyR5(TP^aPU7ze zQhU`R(^=^l+)m^!vvz53Zz7(y{rTn9zNs7czgeG}yY=mW{k_&174;{e#*Zv4BHxYxgm5(Pp(xl05mwxTh724=3_h~*he;4c2I=GpUvfH> zjJ&RaqyuI}x$+iBc`k*~M&rUyF@pzMrYZJKQ8_zEXb9HPhDOP>p5*uu(4nmU`8KNE=NHmRm8W2W1! zQ=1w@{Yb@cY9NRsO*3ZpC>>#?SoIhxOr>qnRyml2-7s!wH|DnIa$O?ZCr|Q|IJ<)@ znagv>TW5p+Y1)v>zzB?*A~|w=q$`IhvFVuFZQ&I;wR`IB$`(6Q(cG>JT=#RFv&JkS zJj#ZtuEDa=2BEh`P|Bv8x3Z$UMV%HVS0g_#7%cFSB!&&v3<4@-nmqt~U-si(cg544 zlgUN_%Y4ZC>PY21C*-E$E2mGg)9k zkQdl2k{Ygc%D)=V{d?+b@hL;~tpV{)rcL{ckAG^$q*y%DVZQz~$!zE6SC9Shl=`Fn>&tV9QV{Ve)pc|gc1ZUpRugbxMj5u?|~A`^EDT_JE50XNzR zbHf!L=MfZQpu_2>;aB+*_opYn`MN0Ow*U99_kTgA^16C{K71u(_oX*ye4kqr%WTb_ zoBboQJ85mQ5q{>-?x}A4uP$?A!1nQr#o@tuuxfKK2o#?!k=W z&ttQ^>gj%hLP@`2r3W>vuu(Q2IwPI;uE%Hhx7(S?wh>lKl;=ciIHS;lqKX^Rh$|v$ zek2wkU0g(9m@5G!DbA$+0G(3c^IWhRi9~!54ga?dDDpf8{X+Q~msoK6hvo1aZ zu0L{+$yFJ0erj3A7U!ikT9;z-uF!5nVXwxnLLAO|#GW%*to+zOeWtJEUg~CVzFUKu zO-;41Y`gpgd$tF!lOrj_wP9uSf}VQq29Cnk;L)QJJQ_- z05J53ghylii-rvdMGlW{f3~M~{;R{09031u!(G>(L%42)xO~ss*x-zk5zMb&f7QDP zL9}hDmn4^k4Bku|`1{y7^qLUL7 z*$Eued~C5jqlG#2CO_Q52)h0<#4O0%ucW)7rET}wZKB3zp2qY_Hxk}J%au@|fcPc7 z!enMH)u|Hjh%gC=6l4W3Uv=5@MU2PoO?8Nf`dKDIqtg)s{lw%Rrg>MI#=1rxCooMU z0y>qS#Y@zKm&SR@$F!WMLmgZ8NhYcOj+(vngbSTyG70JY9C#_)3F3Hu~(>)bQK9KKg88B6AHC~ncaPr?+yUb_gOySvwfS0HeNuCISm z{P010psVOPch~K^^W(+VeYpvz=hs~D#9e(4N^Bp#H5T*w|EHe8bp2r$&$uJEzqyq~M{ZeMsQ#kL^I>&~Mz= zhIyT~?^zCn&i|eJg*Z(h++xt%UMsQ*%~}!ZC^*b;fnM6{OIPIOHOMY(U$6mF_Z{jQ zUaObVF@@u4xh)28;Ve{|f)~;*T{cBm|M&pkg&6?q4>59iL<=-5L4g=S7Njp0*=fhRXj%ZG^VK&GQ5hX6cXpA_TQ;!=&B-k`F51HAA%ei79T zaRc%mW{X%OeJT-bmU@#HQP|z6T!6LV&Y@?h?!sXg7v)2#sZnsFW9B2xmU`u=VzU1NhGG12!ED^e;YJtu+kl z4#yJeIhRay(&qMgiAxeahR{=o8}8dfn02nAc4;3sWcRB&l=>B~utI%bVU83pbJZXk z5V=GV0~XHM`91_StA?fljvNH;I5`L|SHTE52AE*8dhk_83N-1XIS@RW2UX{VSlfGB zp-|dJ$jJIjo^4*=)*pNH|As2NRgz{|ZTP8qQvtUPXGB}W&GyMj*4nwjJ}c$84tK>* zj|d8-%}O^5g4|1Rm0x_+qZ>bXZkPx>dBwsWU&K@4^6MHZeTkYk90()BeMxpisF=b1UZ`dUblVmtid$r7>TbTGbWcynFbIF ztWoZOH+~Uv!_N)!5Ls^Rl2h{rc(A^H0jUdRu+&qwH%LJ$} zYq{K<)HsdSYWO@(@G_?{$hvr6`(>z0%9|;ZfXk?S`)_u-Rp*Delq$tsUM7r-G`+!M zCXhV5P2*vItTD*#{4BQX4$^mZ);9NjwF~zu7_<_=P`gl!C z$&UAM);7~;$J`q2L`k|_!{m^v(3Zj4u0}M!Ol%sNZzc^v<>Qlp_4UuoBdkAMgBw2= z?z+9*s`b^KgAL+?-h85iJBAN(53ElyC|NR$ z3TV?W_ttAvc!N>8owyx7QowS9an$wI|M)q1F@amn&fvQ5Dc)%adoyX}wjFBxt$*$( z%c!a_IQGGjNVT3Cww+cl&Qi0t!329OQL}w6l62~OF}-xER~_-s>sL*>B3zjkjJ&j_B_< zmbG`|ISX!Dzb2KX_bL@RlSw6{eswUS*LRU2-tDA2Yj)q|?1a>Hk9#nzM>pdYX#XCS zXih`qE(%~xW`kuazfr4Lc+Ql>JMS#5^af#hr;wAE$LBK)6(*PO~z9T~kE=|gV#e`h_qqM_hbzlKtL?o1| zg3(ZnScT3}HE6602hrfIAR>AH0G(Q5SV4-cP$_3Qa2v>}QSHw8u-3CsONiyX7pocn zatH%@eQbLsY@&ut9mUYK<(au-EG(2pYZ?pB9n17|mUm?O*aH z%6$1!Gv^M&l9FUA2RA|E3&ZUY`$_RG=iP3Vh14+^@#OJLleIuk{w6!@KzrYGfY&r9 zL3Dt&7Z+?#ynMWI;b1;2G{ms;xQRS`GUrT_)N)W=lM!T@I=#$3VSB0c`kPs?v~D>p zMHl(0;)^V8$!wpxH70UP|Ign{$yO+Lmo84TbY+r0rjB`i70T2Z-$fU5xXqnYuF{n# zmZg9nmK7S)R%iZAhtqTGLrG-8Grwq)FlH5D=Hf|}V_jHl*_#OIXI6V|hD;+d81BT0 z-mZ?q{oOl)cW+uRmQ;El%`|+`oG`r&-8(jdY6`805GOhdoE?I*u@~DfBeSyVlC{aw ztT(A$bDbR(vmsVBkQ?Lr3m>%{fmHj_r8nGmdlwusI_$rf^L{M(Z~NW`oO+-vv$XUW zdD(s=oJoA2uqHh`8*c<#9G(*TRL_f0p>4P{P_SfCGY193F<+e@m5M_6dRdB#HcHPw zj*dDYRVDY=34=SiM4yO4yxHPN0e${}#})ET0EQ+&j_b>)p*oh~qT8fwR$M%jtQ<~g zNxZRZfQtW?aaff9vXTk4NMgNDu?p_l{5a(?CoMjb)%fLmuNEHtHV-`gak+An6_XL@ zk#Tf=%xLolG$zAD6vlw-L09I^`rJ9A(>u1_yx7!wU?L$lt7*=+*IM~7aiM;$XN$0| za?Y9Nu5HW}rE1$B_V~us$AktMK%luiYQ%{2G3xAP4}Xh)d?Wns+jGsM)||BtemSbt zgv^J15fmA{EIkWUpSPCs>h}%Vp`ARRUcdhSmFDX5oo(6Co8GQ}zNsm(((Xoo<67I& zF|>ClfqTX@^?tHpXRR*RUAcgR>&^@HXrq~q#~L$Su!-=1qmN8)@0Kg-$@9Z&#}6v! zyOhnA0t=^VZH(2to1DlPAR`pl;?iOMIh+9^9RkJh5Z923pwo}7%3u@MEF@b|%>=o< zT?xv-7i!K?4)8MA-{PIbZhpuRp9@ckK;Qb?!aFW@&^>{C_kiD<`p1&Qt}5BEu`ESp z-2~Sig=9nw{@hN#wYDX0{9FCXGD^Y zuR!CMy6iR09fmi;!VTBg6_u03-QAv1gW9ySv~i=lyg$=(8Bq->8XR3Sn+@rwWNr& zgp$+zZG#7hz%!-lmal=W(c%-JArb+w5~x@fs({-nb>vR^Leq$hrwjsqzd})DwCn?e zUq%2UKl*Pr|Do$k(dE~PpZsi+cKf+&{`S{n*j2Pae{@)SPjr#jfm}MB9kwS*;Ei@t zHmi~?qx4gKCoM6kh$wv~&#S9Mrq`~tXM-`vyc^EQ00Nty<5?VM7jPIX4g#ppeLU0_ z#!}f0?RGAegPYEAfY={i=)^?PgJ5ER6WSwGC4Gs(A^4`>$%o}B5U@9yn=c|gf-(0# z%nl5AXm~JpHG);?b>*yzB=k1zv?;V0PAikr4k#tty3Y%vV0L3CKe$cSKJ2U2(fumZ z`f8Q!O>i^ZEXhrq*O)CBX4NnB?vc#f2q18}J1hv;Atwnqj0W{}x>=#abPs+lwqh{{ z1F?IgPyqu76&@P=w9DL4?2J%wSw*BE9Lr@VH^>?CV14ZLzzs`S@1yLD8P|`YPP@_O zAncKCEbYguV)&tBiu~1jF%L9CIWOt>!u&UB*b`~e>xMKugXIP}Zf?h#@Pz_Uj6rF2!z8kM zwQcwb{jd=2i{1|_!sN{Iy=tt!hXHSw)$rTQbgtc{!@vFqEKc@5Fo+(e&U$r|RO5q* z)!OE{4n5Cq6$h>-u)EBJsLt_B5y4%hr$rV?QbeJF?ppO6HC3taAPKPmok z#iRuq$m*D3##erBFgkdQmJB68*adQuIRFVMxo&!HA1b*dPh5?{jFMnjImW}DDIK6= zLMH;Agp@JJVwXXCh^N5{qznv~#==jrKHVCsKezhf(S)|}rd`{#i_zKl)yXPr-0+UD z5$aF@$l2tK1Hp;2GN!lx&Po3{Fb5yp2db}Ct4=EhB12?9L1oJo) zl87&au%M9R!M!3kxB-ezh2`2ORZql6$^)h5G)Kj~%5Ey`ZqyFAS zc;pkvC$~4PSpF-a>-CQ>|NiBw4-M6&!v!0;Dvud}QGE=b1< z;h(ljd!cykoO)qyEcc-?FwhHu?E&?d53{DN1AVtbR8v9%b*)3B#_9K#CFx|M;H0JsoJaI{xXg&USR9 zLa-K&>N?A&nxbfE*KC1j=#>uTL-j*mXY#@vi=L!!(eth}2|G`n*CzM7JYE^`VqhWG z(h#V>p)byNi6Dn4Jlg~X^-almQSadd^MxLuLnGnA{Sr@?kmffHg{ zMid3blLDB+Hab2u(AXu1=I!f@bSK#&PaT6{=fwI`HtFQCnRP?Es?(8dbN9lx$Wbf|tU@Flj>uPItDv1a*GQIO)5}oUv z7r_i69xmo?mfnW6BDM;Q7*+Ho)_^ZLNIZgH8c?aJfvq0xbT`{a1r()9gYb>xpfKrl ze+ZL`hU=dIOgSVUhA{;GJTu|-pY;q-T!H0}6KV+6<-h;_d0bpvacRkkvZ|WW>gw|S zvYM*0^2B=0)5+5p%U$meem#D>F(BP(_xZdp>pnQ|f(z11t>@jdol5fY+MMEKK`&h` z0hPFEAv@IQN`Yis--xW*=R7<+h^L4gmWfO)`$aaZ%H&>Ua-5+dgq$P4#=uvQ(stBi z3RozdfdmhdLxT^VKp-$yG_xmZas-jQG(e{*C1L`^g!fd=f#KaC1`tAcl!S~U0ISO( z(4NE>F5ntGDp227qjWA&CI^M}citnHav7GhR2uET4)$F=gS9$Z)X1=yg%+l172BAr!htW zeA+~gMs8=0HY#CV_ceN2ud#Ci*K>(vr^V~O8BdE0GNkhB)KjDJP+mJ0ZZVa^B;=$| z*aVAu88ai?oS8H?8ebg3N)I%! zPGQ83hMw&xzhbT*UR6NhmxW6vlkLU1;nVFZ^*vNsgN1!yD}b~&v{Njj;M&O-)jQaX zN$1RgYVNcZzs$_OID|)0?P#;Jw#2A%oxKL+H12*4*3mQy+^WnEF=~M11-6kL^TnD> zW3a`ImYJGRlovb)3ANzEN4+*1kjett2u`Sn6~Y3BFN=pJUPpjkHFEH~gdX`nj%M)% z{|xw<*<4n#uX~4y&BLR=zG-jiOv+k!>0+L+KV}&V$?uEolsMj*UcZ`4NHjkj1C4<&D1vD}o6_3^+e zW>zI_Vja0W5jn_E0ZIl70fQ2gVN#-avIASDL>Tv)eKVCHFu4k=B)0Ad(*0&Fhox|W z|7IaF?|?#UnGW2a5nTK4uf`4KS2=<~dV1i`R7FpM$;+G1**+7}Zb-|@Bmi~KK++VhW*`dWhgCKF;Sxg?=t$T-swiKf{r znn-Nj<+ANTt~jTL88*yoZA_>Z6L0aUnG4$3dm$KmQ98mF;`=L26*Yucuz+H13Z7eBpc)Y)@y7craHq{X9vkFX+%xa8p!N zAzPm&9Zu}GmTro;B0=DWW$Hz7yV>Z9_(Gk}7Azc(IKG$`uTTx6Rd|0OUfy@?^Tx_Y z3bVoX((6AA4uLubvmbFCA~&$RES~1LB%1H9Paloep~%jFFj}4i?u(rH{H4tByya=Xk;OAf9 z*6Bz`1|B^yjmA7lD!4(VL(K*kG5$MDA4j;2(bG%n4Gf-+6o{S;_!@!x5(I=*Fe4n< zWxfQ+RrTRP_NI`qo}oy{n{E>H?Yh4aMe$brd)tyPgLKR2m#gHU3M*x?3a`OA;X;QO zVO`RgS!>~yu-;lTDV>J(9s=`FT3BINn7*e%8i=;k%eD=Mgl&PUfht%bdWILr3n*0u zVo-4m6g}`F@Yz0-yTAVfZg~E)Pc6U*)Br-vC{ffuQK2En7a{xW5f~K$so@&(fT=mq z-Tj}}oYZO)M&7EI=R;G>nYN1T;W23IO<~^S3-yY2~S1=iXsaqkX?7ldjaMs8iV$wKH?*- zo`7V0M1l>HIfNWghdm)6_T4^tL z{{C%3O0O=tAv-v|r#gH*ld+boFCfh~;R~AeBbmI=?Uop(O_-ki+`2y+WzawWzEE&r zwP$#gd68{HKmia`2$6w?Kqm_1U^o!RpxT-s@K~dIyZxwisHq~aC+2P7;fo)nr-a$N z4DZ-VOr}5>a#aNW37}{}LIJ|P&m(QlJ`^_2r>GCS@4V^W!A{<)_b-j2Ze5esv`O1C zE(3#skDBm8H=$3Lqm+W1agkS%&clT!*(O9$0(3^Jwu;8F``Ly=r>xDg4bk&dIRkBu z6d{ZxNJ>{%h8TrFYu!-E8KGL?7%az43T-*?huOywdR zEXyA5%Sk>L(}lw#J5B3y3)&lf90aCU3=JY?d-{792yVil2sCgME@Jjv#|`EFIWCB}1A`Vm!s zQ2lsBs^W;koK))h5o}?yN)ls*$?g@g0N6_kl$z#tdLKDB5EURC#Vf=_)Ga$Q%?vQ4 zpL{`&laJN-Svo3?$Da)}wSX=oIYf=89*10RctwhHeZ76C zGBfZ=(5Un4`({!6SzhOymnCib`N*K7Hu)UBNjul4ZGI?It3a<(B4YJ)bO;4kd{rtu zZW!HlUfB7tPXKPpiv7)uo*=2V4p1zS@~?x)%6io>8O?|Q!Z|Fots|3)I`rr|Y`0r( z9tmbhcQY%a0hYVhS6W41;i7mhR6}Vb6E4M>#&7b)@cC$}h!~9R9An5f6cwUEA z7goFAf}OJO6VKyj2f#C2#IQDpjItRospFQS@4h-N4}HN41z3WM5i z!l)=AAtertj)PAILYkV4fsxga{d>x?n`XY+cFwh?n7dFAp0es{G3?dtqm2oxBMJ8` zbj!}gUFgsWEDJ;FbafcXX3Q<3HBY*2&1HwRPtXCC&e>7e8Jl31EdXFRiDeNnhF}y= zfv66Vp(B!Bm>V40UiA0dM8Yf2vnvFIb20NVwk!<$l&G=LxSSls5DMf#JtGVw3DAf? z&SrW6*k>WNjb6+uH0R(6L5u4P5-n;xVt%b9pZYq<3hktEx9zW4_5j&5(%~E#AUSl781t44 z!6?Zw`OCPv=bm2_@8g|Gs``F=N5LnfyFWIq3}lpXU}M+M8RVdNM`54AckOHo@v<%s zA<1*%UAWUpFdKle@)<<*&)AO6DGGCE%iL5s!`K^0VmmYy7rfb3<{U@xp58z3 z6lms0Dwp-RyRGBJy{2zQikJ1zL3ljT)eWu{^;&6doP4g)dWbT0wRl0ZD6YnJO6G~$ zYI20IOK3?Qk@g!js`V@4MX_a6_Z{=PITtO&IByFx&>YUQ6lExFjT*tT%}hGtM34k) zvUg|k#oK2amBAt2FXJbyazA?-=`u^PKD`^=AbaNd?aa~ZjlUVnT<>KkK>*mR><3wt zEmu9hdtnHIp%jZ_9?e0Y9dOHSRN})~T_q(Y9gB}1iTla8LOt4hIQ>+!<%J4Qht_V{ z{Mh}X*HV?L-Lp z1J|HgPuK2-dsETF}u75Zv6K7E`ukLa5EO>u5G-VrK?`7j= zS=ZbM7@!me`1f-y(FF)xGx!k#!8dI*2V9;W$+2&lF^I6j)g{Nlxl>&S{PMqDj~;>A-^)Ta^}R zlbO`HjxYiW!x|Z-2n=VMvO{~@^*CH`-R!q9h0)tp)~d^|#UEw%>F~-*eWJCCF?1^Z z&aI;)W56nH!UXaW3OF8^hKCmAM36%Uz)k1ql*NDtry>Y-YZ4)vW;j4O-0v zc9Gf{t>BqPt zQPg?zZ=Y=k57-#{5UanJu2}5h-M$b3o7oq7OzQgg&4ukTBN6({6_q=oOBmWVzXmRk z)n=#ENWtl6%Dio8g^KRj(X2LA++&^Wx)EautJIfbd zZ%3v|_Y#rhi8(v7KoV+`VCSbpF5GLjZB0OtYD=0^8-$KA(H_?1mwJuqSsTjYv)v>RbP0GfooyY&#A;t6uq1+s0XYtx?}hBYms%qI zi0_>)qv?^-2u$6JJ(4UQco0a0YLlvS97*zsS8#`Yr%%lNh-{?bo?)y`JMC1aQK3|D zVWD)idRcF`&)yYbUJArbPa<8&|B6?0i5L@FPc>=;rk?V$lhv3WwfbW%fx-OGS^{_+ z6+q>guM$pFlvGxiR##P@tlgiy|KRDK&(7$&F7;jj{}n?Tct*;{{KkUq4y)dq_kP+f z7VQb5*nN2b6~#Z`u6&5Cd$?#%NR@hrwJDop(xnmStJO@?&|Yixxh- z1Y_5?Yx}BB%q&VWy3@P$L97HALN7DBtm>vuM-DVOfc#i`Hsny;O2m(V`h(=9R# zn&WhWtD*%qC~tnMm)lBGwb(g0H9whaIuo&mytK(=OyUKgOH-qo*CQ-|K;72dkScpwX6Z&%Q@=^@6i4|gl^n$hr}}^ z4AM!;4hjuUpG@QR7uflDj~ohdg4i-u zsZ}9>*r|X7BEmTXYmZKh+u#fiirjRAO{`i-97-1PQ|nKg__8kpg31&mpuMeScnfSz zv6b8J`41WQ{MVq*L(U&pcb9!meb%O~#uX;dqpr~ByOKS#0_yZ7wQ6V4Pzl{KsLLk` zq$Ic6XShjA(zdh5`|q5c|M`S!=_q;LU1)L`U-9jLN7O^|J|p9X=+HZ%3?A7wk2JcK zJ=OF!_veO9C%2bp(|3`_-o$J=*||>tA?^E$`nl=fPIdfnx97~nzP*sA>+J=V`Jvw= z^xMxLJi2br9oA;aoO@iaNX4|!8NQL{&5H7l@M7Q& z`)ZNDxV<5K2=hzrvn4m-xuWD=b%-$)7|2U&aM`Ckxg_oScCyHNM_!hNicsoXLEUb< zsq%1I$5(B~oF7|e7-6r)v^+6QySTdaGT_1Y{kWywm&GA_oPt0LlligcLEOnx9}nV2 zW zp_N>rFvj89*xsq96S+&zDGw<}ezl+olxGjsgPXT!>Io&1V~s;S&;A3tn&4P&IPf!y zgWh^ls&al!Io_o0Q0dFU-N5xnysW?0McLAreI-_(sA|lOIh9O9MRd-b_5!F$Y3Xja z93GeA)4<&rw6hgbNkYL-pfMh9kc-sQZO5N=@e!X6XA~f+R0fw^5!fixcA1v>u!Yxs zz3RkAKRnFnEE+dUwlsXOuHIJTq5Oi^c)<7SVwi(F>eypuUu7(7#0-5UZ?0$F{rkRq z;Q9VOf}q!%4|-?820cIRnC&r^^cM)aa0jvr8>ODZUT)zI`kw7X)es|4(O}6l4*Vdy zKP7p#!CZ#h+){Q6-(Q9GZk(}SVM7Ad%Y>*-b^ zjagGBE61lw1e>oV%xPnD6?T!*ZLJlx*4oEOM^$9exanco=`y^3p+izSG*Y*iu<3=+ zF}&Vr;IOx}@}&ELe$%L*%Lcgri>R}VYO9U5b!dT7+#QM(cL@$H?(Xgu+}+*X-6gnF z+#QM)FYfNeZ@zQS9XEgW`!i!_?~%3Un)6v}Hmrw#3-$IRnB<#ut;{q@6yeab&+1)d zi(FH`Q9ZC^3+tUh-Ti~VxZ&X1-OTrW{m~s5#)o|HkMs9TkBs(UBuy*_#Pj1C2I+DAhPn%!C++v9PUCc@VSLbMrAr? zG~ylix}5Yh+1X#5d5}7k^#kbz&?b6$pVQy<#ldQs(Zu!wJ12iu%JpgZQB^ln2zj1c z2P1?9B>4&P{)oT5HTpeJxm3?xnBP`ZptU|S~3xm>b1mAdw8x3CM*BoN+BU=qI_H+Iy=Rx6+0gmKI-n}zEahM zY3k=f?OnOjj|;55{>B+>-#*t#_Q8F%#~idQ7x_5{FT{))kS>)h;*5?KKPL%e^y$-) zr39Vo7bVlT=4aHX(r2nq?6ml*`mod^Ktt5iNNB{0I&)NVp-O!I@9^{mlpcyFDzs>4 zaQ8Kz7p}%-CoQnN^5xH*-1pV}jc_nujcyGkVKXcUpl1}I>F1k;C84hkXEJgx?AzdI zH`*+5;qXV27%T9Jy72Le)V`7!VL@wB$ecP^5`U+=alVqBAWc�i03_LI4-py>}ln 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 UDj>-on8&79e2*xTy>=)ivht@l5~7sAYEXmn^k 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%0AD|i_EHqwj!0yFH1 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 literal 0 HcmV?d00001 diff --git a/sound/surgery/retractor1.ogg b/sound/surgery/retractor1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..de7c31199e3c0c3afc860c295de3bcad2f4f734a GIT binary patch literal 30878 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 literal 0 HcmV?d00001 diff --git a/sound/surgery/retractor2.ogg b/sound/surgery/retractor2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..620fafe035d8439da6e6334cce455a18b640306c GIT binary patch literal 23753 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

^4>M_t*-@3a^FI~pG=E_WR zl>WnU_Cs@Pwf64!HTzY&ITl+#Xyfc_;89(!;Rxh~TuDqE8>F418$a~Z75xE`p zc@}fH2m{x^cP5lhA=<0Z z^FeSzp23lQW5}`H+!25ONlqEZ z%I5`A{Z3Im{Vu3vr_Q6@1|J(kBij(l)=2z17z$T6HGF5zyxFew)(q|xk0Tqn;?2O$ zfDjyvU)IL(1tA10tmPKs`PHayRK(U_UV)m7OrjMH4go;`I2FckbI?(mH--X)91%$! z#S?{2pya*g`mtTO@8CBD!N_HOcSDISYqGN-hdv}}jz z-Y5sTbWcJe1@qVqS`j~;6r7lGqgaep<4FnO{8XzJ2NTvqNbO1~98~L4L%{zey?dG& z*_m|r`_tQht-UPIbHU@|YGb>8#;d`2=cR1tV^+3>Gi)p71+*ER<-ilR7(q=MPO*ePN{8QFp174R(;cwhyqb4Zv_ z-$!kNU~a~Q5ZWr@Xdy3@gHL(J5r@EBAl}%wuXc6*XeCq+l8<_yV<_gqG^dP$qrZ3z!@Z z4mp_sY~D3=k9kroym1~)75;dA?37RPmul4}>S(_z&UxURdCTacTm69=AxRIz^Is`P z)p6E**MZB7tWlLV!q#Q5ACzp6U?#`7S@SL2;m)&*`2gREY0hL31oIH?Y=AEVhu6`u z?t#|F9lMqs*w+5Z*ADcdDu*LS2T|7B2;= zixlkatT^XaMW~^+_KuuzmWo`k_tXMLK=8b0WFemR)9Ni7l_Lc&j0YbQY<4(n%xbuJ7|cSyp<)H9SutWc2{VHI8DFC5Cw5|Yy1aiu25F*jW!?Ox0u(z$M# zdH|LYYJrBGTsi%6ULC8APq`acN{1W)8f`*>4*b zV@jfI`9550K5IjsR6;7zC>EOKNQWzVm^wd#aC-wHTT#fN^<$JlbUwiX2c+>K0pvhN zIA#oSFAWVBG4QEMlD7lJA{Y$7JCR7GhY(4RzA#ol=5T-%fWj;IK;pd-&zHA`-Qc5# zwp7=-IZ=lGCHH|u_4;{r{;)%{78n0Y1%V z=(PeAvS8o>JYR&TApzk`x`+fRT8=dnkHEfuWe}E*&9*Sol+ytSqdHn|Y&nK?sUYMM zlJEfV2NPX6c;*F~s1>4rHIv1$+k1L_p z^VBZ&dMbCp+!~uTxXZ1vFQNp25v{s#XYMOHz$iLhkwgwH6*M@snSDx~7d~x;)`Vd& zFmxn38;`~FC3cPcWkzO9Ml zN@t!_2}l>(42!_FUko92Vu-vRoDSBeOGH8Q?Y5sZhqRI%n)?_^NSu~ z-~Trr{=OpNH#Me@{{y4{c;>)CCOxt`a!2g0^^h+oTNGl;<0fNmxi!g{MB(;GZ(*7} zr`K>?aYX;Rk8u07M0+FFTv#Xdx+2I78)5oq2sE9n^FILZA7s7jT{Qh^Pm*eIF5tA* z@XnU2erE$)RrP^P;KuWxOf}jE8f>m^jep5msb9UK6kqS*B5_kl$OU7dX0$jlG2bOU zDD|(;clg#PDkUJb)tpR6aUxn{nMi=eH;{~ebl^`ULc}BVYFc=q#V@$Q+8BdxAUcTn zHXt(aN-a@Tg9m6G_i}=F-#y|@BSGW&!!43 zXJn!*3~8`tMqFYutJ=ENZE6Le=kd<$Rk_eTF%X#fJqF6Q@)+SttI>FcUKG;W$>q-` z1fzmyF#c|nmZ;@2SF9CD`ZNaHvOAqmghc5MUR`o1D>gDu22A_j&vUjkUi~VdA}62h z#`LV7jLGwgH?%7khpD693^G;5jmq|sl~DI7<5tyiq>*|VEfznSEb{T6?~WHz#j)f?yQNwB^a>W4%i_{H)2?C)po3#nxuh%hj}m=qX+>#An{uyL^efBnuZwfqHMp`V77K33M^G!&dX%R{`4XMvp;r zzie230SLbfCtMsSQ>}NY+vI~;G-SaLARnyB8#J@fl?BGIy+Lg@E}0{3ci=q95Tq=H z5ukoMf%5^c>!v@#*KzT{<31fwx-y->!G~Z|tqk9A0^Ulj@uM$~RI|l&n2X};yX}9} zVW7&pS6Q_eOa6iAhSqIQ4YzbE@l3!Wqe!-YH+FT6}-~e;l-@E(j4}&?<%+8 zM+-hMEIBGgz(lW+w%kX)!oSn#m z-zK{fxXba`79JhLGBpwt z?rA~%und~&oa?XjhMgu}S;#DgnDEz&(kmt_iV;LdMvC}=VYxHuj7>2~wT~=vtk;g? zcLT&-4cWsW@CNdIP|YF;eGO$V=!)~D;)Caf@5?7*ONpo28q`eN06-;sSC#C-9gS=O zAn&`b5hd3tU$dcj<=HgE#KXXQNdX*4G;1nUdi!A}8iSDs&c;SYxCoks8qory(^!O6 z!%{4?4&m~^bJy=y#%ha$7v}$*m4<7J7i{s6dxEgXyh#Bjq$E`34cThk>ikjrG1ghS z+I&Z&9Jj{|Q>!*;Vyyb&n5a%F5+|NtdAJT$kB)zk3)0aM;cR2YeNj58F(6z?GHQvT zzNILtO0eYA=5 zSpND4xNcI-);DT)Ii$4Jws`4+GcbGD;Lh&{Qr^+iI`DT9KR)zMRYnd37_ zs*f-fj}}bWdE=SJ8I3W8L;@CYV3#7Rp4IQF9QkahF2#d$?X#>6ZC~j8N71VMHANwn zrmdI?@Wc{GJh+TtB$9Z(aIn&eNhq6b0=cXAta*1K(ryo>Z1mubikAXjAJnN_FY*-t zMv&fpH7BR<4#ap-zDbzeT7}cUV|=8{yO8BlFXeQ^EjS++aY>{LZur6$(&S5RWKDaw zP3<%22U4fn%n_Ooc3x6%AKc|JXmXEjNUb5NPaSpv?Vld5OsDaJ@6(80NCHS4@g$kb zm<_bUPQ^cbiY(|;oj6cOSQlIY{S)n;8?66_^dv}Y38+~vRZVB4ELXi%B?i2!j#gEqbxkM_iO@bW|04K{DG zamno%OB6bD1{HhO2bldkT#@P(=h)KN!bqTEH75-)4Z5!+iGWiYfn7}}ZX;uOTt0Ia z1}??YDIOLsr!xswMC_d*r1%<*FbaF#G*`2=-x2BMS3pjz<=Mrzdr0>Rh`yUU3XsLfDB^r4A3&u^R4utp(OX0ck5% zOd7Vqg6l%DHO9;8@8*I-fkR@h%DXCh!+n0&{Xg2z)}B3jo9>x;jZ1TmEYkLCVo3Ee zpWv*?ZtAF=g*C*{#1u(Kgxs0qx!2t9HUu1f7u6_yhNyY$syyq`mI-*BW_r9d#`w1>J_xkeL?Zu6v@GEvllLb*d-*&rZv(7+PwIsQy^3O zV5R>tOnaa>QeQY6l>1%NQ1C>E$^T<>NQyb9fYTL-$A*j&yy`r(bU%wbi64F7+?EdB z81%cLFEGtz7oOa9c6mGv)#PW%{7>nM6~vAKTRVtIfwT*rF;6@g5r3sPWzpYnu=tg% zocT&|+F)@CEb`};WRk?VoghpOL8vE4?*#0OejfzO%9R#I*(?U7htIZEHqZ7R#Yf)< z(W`q-AQlBHe3S`NvMERWn8ct7IG`LX=K5W4*eki=lM&hHubl?@N%#Lo+9{*j&l=U| z`pv5C2P-zqJk#b6eDHQRGg57ukpmaPh)ETf6DRJ#QwRMf#=tHtjBPl%)K1+jD+$9u z>tVKe!Y_e|yKl|LC1!-D&jyq)6O9V=2u4d5>r(gL42W)^L5*51?w-~HJ|ZoL_(ndY zP1hbbrqV&K<>wc5$zkt)X6@v@^uV7K{phnV@P|WD`2su{ThgYH>^xLtN*p)#WH9XU zIy63Si0Rv4lkqo-Cnz0RHxFp<9KhNQia1gSPw~W%NCdnD5jsJJh#;GW!iSYg5md+H zV40+#b-?A}jdv1x!F+xyfZr4^jZAC2TLvA0C2Zycz6EY%03YnC*u@#K_jnn*cK5vk4Fu>$?$rZy9(+&FaQrbQ|BiN;~xG#GNbF*h=-f z1I<@`n|2@TM41>m)G~K5F-xgjf4s&0Q>EC8yRjsjG;Z{tr*uS(D3S4wMcKmXRFjX+ zf3Oy<$}0&ZC}dBxeHT;22W`bb=N!Dflr+}M5~Vct*a7#p5D~A0f@u@c7&F_1fiVw2 z;N}oW;MAh@0#ReSKlJ8b8!zHRgoZXV>BD{!8=)SWxXVg_?ya%fciz4f@*P(&$YMX3 z_X~TpEqKhFe9 zZm7>CAkc^cO$DDop2&neI7jJD{DA#&+cHt_E75B)*F_Z3<&cR^34$ZC^qo95>7EKb zl%nj63BY&fY4?53{)k|IRSa1kUF_D)W%j)PdO_m*{mQYM4+pmcuQ#QBMnYN`TZ|)# zI|2!YJ0`zP-E|;3p0_`Kyg#!|Z7c?ad~=n@kq)WT2=_~hxIA|Jz2 z7iNI}kMBnR&_9v0IhO8U^e5!8QyMOx+%uk_jX3KJ)8t8=w{iyCRQao#55P1_$Gp^Y z`zt$%@%dHxBZ1n1c!W#ZCL0B=m-E1&uR%(eEq=m~70Aj^kDzR^L)pj`sUfWc@nUr5 zaFPW)?BSGB9vj)FrL#%E-5dU%Oa0oX9v2&TgHK6b`+H{5wBW_smXD5qb9K8wNc{or zy*@+ReTb#0J?uIiY0xY>4{-hKi)AJ9Q{TfK{gKpD4P?W{Sdq`5PrY3^o*+4>c~kS| ziqV+0EhVcWw*D{Ri-x-@_DLdrwuT6jy!jwCvn<=ny#kWNtPF1dw3iY0z=|n17>&Tc z(~8AkVi&^j@5T2IRF{8b@#FmBvETz91j?Gn0?1paW4gVTdAPp0zNtZ*|89+3ul@aR zwc1@fey4r+ckjIOJH_v7YJR^x?|0YTu#NuY8`#5Mng4|l-^kRs`hT{22AArvfms&x9=4Gw^+<98mtD%@;GcNfA%0QR(b`6_L5I1LRt*M z&&jAT-MH~MM$~D|Y07x?eM!hMgLmR~4g~)R61lH33PW5ZRoLT4J(|zq=w`Kn=xH^)Xtg5%!#x`t z{i{G}jGvldSfmWqUBZ{!jqey|4))-T00hXu% zq&x8G1`;O0XKo-?)Fl(FSP_tpSSB*)p~!LuiEJpvPXXL|=h;P%Akyj|mFc(NKl$l@ zO*p>VKzMn?erHdaQ$5}vsM)$oT_=wl2~?XExVT|kO^@moH%Lc}`k@U+Fs{5QDS09q zQOZdE`!td2aS1ST1Y|3N6T$?4WqKtA=AhW}N>XuI-Yffw$6GUR+%fc(`^@PRS#|xj zo44YRESorhedULbCbAt$St|yz-bsp0_WR`Ia{mV%hr)_hZu`+b-{F+Q-1RZL`ezP| zs{40|vO3%u3U`=%FePhJlkYQ0j6*PeyudIJ@#hLD({P+_(!ro%k4yQ+p6bh0|V|JUcXDaNirY1 zN(SGo2}CqqUd#ZA3aO!q-lmWf8C?uO25?^f-z#8v()DK6$o*7N#1YxUI~D&A;6OBep^H3+1@ z&PrI`qhW(0!Jz=>57km)6yEDf@1(b*S(rpa@$fj+*{yhzf zebg_wMExyksJ*I)A!*-2xK)==*{K+O3{h!S6S3mCFHbBjjF|?0*s<{kNlf_@UALj9 z)pf=ekAa@zp}W43Bj^U=lnLkSdxK+Z#-B*F2Jf|SlKXN7Vs#Cy*u>WCKDbhpLJ2Hb z=8YxuKI`dLrlh_9$G2ninIO6EJA4g$^ZA(KtAA^cTJgf}sCwr&H(TP*b7l{`saqCZ z;L#S2?ZP4BUhzVgeUWs?w3x!Z_3h@{8_AxxAM&+YS*isUQ<*RLa37L%x}wTDdPGwU zdD<(76+A`Rm_uweo04toL|xp7SUgCIKi0qZkF0F5f`?=X2q&frw?f~pR_(hr%fH(8 z;iKD6ZVjCX?XwJQ*mS`^4>{^uDFca45Y1$CoOK9fV{D?Y)1GOMjEgCb*YXbrP6#9l zU+hA_vbyx|u~8tCg+1-xE4>LXf4DZPIlh3xsO=5<^Og%Ix@XXoY5IWYxfn`^;zYY& zhvsar3K{oabjCh0yJHVow_MkskJ$ngHCjo(TN9H4(aA)Iw(~}Wv^hEYp)sQ`j}zVC zNWehhv&1~a)`UOYsS2x2y?LAzxv?$eFl^#Z4R^jNvbo)J51Z_NJbwldbmblM#q*piJLiIbul1&_UwK~mm(OXJdRH&p{?Gr_#MQ?om8R_j9uSUb zfZ!sT9TZ8B98f58ss%&?BVR-?WU4_lziOH+a^7*K9mJ2&)Bwf7)E0#Z&`KwrTAOD4 zpvKHvEp3~cW~`|nu893>z&8|Gq72H*a`j z`(VY$y@lk~Z$+Diht)$XEe{ctJ|Zt^Jr|}`@Y0X!m3f50JO~)0eH&vbOm6`pM>foo z_vY2m;L>hlBPz7Dli<23vsBsyMEI(_k3ER^@Uz4e=cB0)d;Kx3;0?;k+`8cJFTYZQs)ei49G@ z$dR<6uiBAbOEIwtj~c;8%_R7{sc6h|C?<`MZit{AfFH%sRNSC`lpnU>cP4bS?Yrft z<(aN9LHz4bvW8D)Ahv6M{KCi1;FF_|6s2$4J+0(UX|IQ^RAi6_ytsAqwYYvZq94)} z9ckzD6vF1HDB)g1T-7b!0HLc;tL{OI#=a%R0U-JTg7e@d8m?JvT#9RBIw?ZtTgigI zP1X*FhrjQO=Q!#qOItutMk_QQ_@EnQSo#l~DDEh3Q0BHYh7u)p`j&%?bpcY+ns* zTq^64eNa+nd27?N|IFU(I5>RgnODP&yr)`UI;iC3ju_u!(I9?cGcumIOC^_o`1Y=B*d==@1HHLwe${N+HbDaAJ1wa#7Kk0 z5tq3p{ixsU@5uPAKX$^`wD8C<RnN5?*S!OL?PdI6y71_~1ei%}4!UN?vRFA6-Cq=5w zP66GZthwsq`NxW_o?e)K)uW#Q&_w;VlXEp5SdW_JXAJt6BmBw%T$1*Z0okyxoMJS)-ee^dEjb7e)4fw@@je87uYP;+geC5EXOjrJm=0%6Q-S0wep zqGkqM>hy$|%oCnMR*NeYhij~iFgd#`Ir5u`{?x4!8i*h(Q6QdW8=)FhB!$)1eeW{@ zQMxhY+rmu<%_fBKcp8it8%t|XicAB-+@*VboPaJOaJx>ob~*7*xAvVtl*78GWZOPw zp<={mFeD%<g+u8H@!DiPEPT}^dCl=SbSM==W>t@%*L+Ck?n@2w0<7uN%t++Fv|G|4-6@By#fx67eIerKr{CzsLTpGLf=L2QiPsrn! zJJOXB!vvEm{tGi0Nw!4xELYA2dxdkb0OKdQ8*nEbV8jS+W- zk;D)vSUOYNWb0`ll2S)J)BkRijvcK+f+Whbszk$g%We^dd-s_# zcw=Ep4Wx~dDhR|b4XHB!av+M4zx90F3f2q*tw|16917%*Y~T~R%FibOIG8*{jGc^* z-`9PxnBY9XX%qMIogy?+tPQj^*2v?X6sRSqm*-=)<>*~=vKzBbE&)f1X81W<^NlZ} zZXose``H`bl^m{~ct*^5`2W)fRY1o4xPfkf*J&~;8=Tmt$e%rpn^~!oAZxwa+jeu^ z<^6&I#jX9rmiuTRBMY2Li@#zbWx$dfID1YhdX-bbVF|>i_@*G}jT9UeZ=nDkzEs+A zlvAP_YFc|M)qlHP&c>`y7BXKulI+|^y~EnCB@6a5?QyZwZNatb_Dm_#5NW92>AWFW zkPgso?yU2n^P+dW7C=ZC&%fKm_TC?q40t0W-vn?{5QoNDz!@TlX)G!|+1j8ZB_1n6WHxCip0c;sZxXuj;i?3& z$JNWGGMok5iDA*QJlF}-Pw>@i2pBT6w}18BvP>0QZqw!=93INEU5pRkuBmy)_C0mx zCo1hu!MTt~RAK@f55#UY!7&jFN_lMpnaEKQx!-7`Aatx2==YQ=-OrU_rK&WKZAx7Z5yArQggy5DV0r)gmsfcPr8Q{fbjSUn)Mm$K1)37tZ2?t~t3`Qp6*z!eJef-gBZX zf_<&%YFr~`L(#{aktDPg#E*Mj|G*BhH%pTo&rZIn5 z`o#%OKJj`-jxY2GU;6Bk-r3=$&L;z+7-Dohnokm+RGDfz(F{Zm>olTo=_$2e0^Dpd z;&E=$2-t9&z}&ui-|Zto8me-3(E;tL+dOa#5oKw+^eBL^G`+Q?jk0p)gGbggpBdK4 z<>MbBpl)cTVZE{Fiej-;=bqk?ryyQDK3`No2&MGXz2*Lj^_MF`0cjRUC>QlA*#M!S zLymQzoJ@xzztQh4j>qJc1VjdY4jJqzENq^C=g?8~a;$nZZ0^GdxqFr?sgyjBiJqdQ z51THPeQ<3rzr)+_du!-7@4VZ&v-#xG-RZggXxg-Lqi_b{?IOi0gCzh{IinsaVoN&F z?om>yO>kWAZXdZ?0OKVRDhF)C9pKZ{gAyX(v=lgk9>yJjaDRH~{h{v4zpjqBKfUoY z<_*h7`>rFMC6y;+h({X-xDgq%Gwi`WpP7Oh=dcIZ9#e8En^UVTlf^|BpqRddbtEF0 zgMz~3P*{{?VY#WU8e#vxT5M7#4|rp0e{m=ET^KxmkPw=FDyr*p#d%%TsojPW-Rb<& z;gW*~hcoKV>3yiE`wY#wJ$I2i&$@~tksNwcW?Z`5olT+lWS_bfZIoglhrd-Ot@OXi zSKi;ZVk;8K=4D&Yev;qyJ-2J%M;A?>!fj&G7=S4&p>;u?{q!$Yk;!kol_GBXqV3+c z3!m-13bNg)tDbtV3l>j3LGv$js&c8kwcZMYS}{LX5+Q!UzcOy@+p0OLeHJx>B=7aX zv`{$xs$SJeA*Z3^(fL*q-&F|XpcXucWSshdka$)--bja=7fgDe?GqM86#|7h^b%0hal1P^%z9p$sV@o=6G= z+a>XMyIgO^-cj<#Jw;HQ3GHP1z_yw)(2--1UdENFA#o8Joi4XhSS>lB*f!Wt@P_uK z@*_=PsQ45~VQyd>CF^s$l&dpWTYOo|xJ~J!;NY&sGRycVedl3q!li*iRo&+v+e_Q* zmvVQm`Y) zv8zN!Fhf}j{fxC4k_Fr*e2Aa>1DXAD5n9v~lnJ?=&ctl^@bGB$ut)gR6M!Q9WaaSe z-0xqcM4p=kQ~QH3FU%k~R~MHsMg&r6GhBI@6=omO@&Lb^*QOi`VEgT3$IW=Mf(Y^V z;8egG+9q0E1HI>eCMS&X8D=NI9`k(CXL^z7i3dS(w#*bA0GRx1`}ci3UUv`w=VWw< zctM>Ot zZ3fy?7T~IT#R01Xy6Qp6%9d?S`JD9XoeugXx+X!$7L2QEqX{gP8izOFG&SH7uP!UW zuD`i8T~#bP*0Bl2$irP@0c2bA`&0YKkVLBc03?P)+gxU7y95m67=( zu8ay2<;3y|Vg^s=l=KE5cnq|olhY2G7n6^q zfOkjU`})WEXBU78G+}%I>4K}6wV44Fo9T4oj}P$V1_O`JA4?YU8b)^z_AhN|5!ZNs zq$KaefMY?0NniCfNZ5}PkyRo_CK^pB!DI9e6fX==kO{s~ojlzRSRjoaTlP(UI@uf!E`IR*I%*9tOT7w}E4Ii90Q&S8ccPA%}Lz#>N>Bo5eeqE$;2Kq-=7`;k`!dLXIX}> zk&l#0eUW9^a!A!kb>Nzc2Pc3eyAwz7n;4i3svdA9hpJcn*L&S?Ue*T;TbYrQ78anE^-K$`Ih;n`&2ujF?I(5sQs^%b%{vI)82VyGHPw z6%AvD;vU|)h?5b+kBwyl=ruFDR$Q4sT}IBZNgy_W26%vpSchj* zm$<9Q2lKmxuXinN>5=ygRNH4h{MCg*F-2N#&I>=KI?!;)&M;tJqZ*viUUz2mDC8Uq!kUacn}ieS zgR=NrfA5lkE3hJx0z8Ys%C$fP)t?jQsrFrP6$~5IjEkBGEShu8`s#_h-?a{*4M;j zb+!|a(*u1Ki_41~yNJsabGSlX-04;*Ga>h^4K8W<1}o>%fM z*n<9hZH7>K8TmiqWh4YxD@8N|&_iE({#Q_g`e!C4u!FYcM++7uM{_b8OC!y{^OMPt zv9q#qv9hspkt zRZ<8JEQzYB%c!Xf!GlF{B?SdZ#ed6+>Z0Q6LJ%hAIFhaJ-;9jY1RDUL0e?D#sQf({t1&)v zJlZJ796n1$-eNMiaFq={gzr~0#&$*ZMb>s>^wjXkIxrxHfQU4C5SHpoW)w;uj0a{R zM2-XG#Tkx>3?(_A5!naG0_52b3gQ*{4@&Z*_z&soC&XSc*H6jHv(0K6SGB_$csq^p z?PvTaL-u=pluV(>51hte0NID%9CLlzm}50VK;#bU{P#Tx!fG&)J8bit&8 z$u-F#siv-=0R|TXEmzZdSC@HLADxsSy=EVs<{-U=AcLEr4|u`0}T< z4kcgGHhmriLEaW$9#mj(1tehd0tp#H90h$`zD$vsRh4CWqeXe6?QkvAa4pi`E}(=! zzdQ|)W0_X;|A=NfNv8krQN&_^0T2PP>~|pQcc79~rRsNNg8Pf`008n-M3t%6kyFZv zv)@S&j8e`Lg9-AZzvWT?Wx@;F0YHR}sMmpL5JW?jdD@Xn%SmY7Nnsv@;sufabNKXE zUO+;~GtH8${NXubKKzBnADk917hW9cpOwH4p}9L`X%lIeqkJf7yE&y;>C@d|>glvC zr77uuIcPJ6zYX$|ekip!Cv_stX-ozwt?-|c2Sz$vW$6@n4}U)cr4RoD*w1n*4X$)i z8yu@Mk+xUTf(4es64GfKTGaoU?>}Nu`YvOvn{N{w5w?_W-GX2Mmj0MzoQ@*A-230f zM+D^ChXuU8%+F*#QLsi>a>%xXP zUB4hYDw#=)C@lV8B?(S(9HK7I% zX&&PLra2bj#VO&%q2c?XQFLKRmSJgSEqOLWRY$G=ukn90N6L{3jG*R7I#T_Y=5(zWnKjgf{?8f%w$5@YOml+3 zCISFHC_lY$xsj?E@iV%|-P+-7@P)9uY(ZE7NrC+-VnZs5dB%w3yR5}ie8G{iOGb#P z>|#2TyjQ8e_jY6g35zL=0Y$I9H4+j9-dSbMly~mnMD&W zG0mBqmQ>_H0anv!!{t@DKBQ&+Or@E2)+j11)7MEN|CU9YMl-E$09H-3lE{ZawP#Y| zP)IWi=N#n>%d`B>$vg^HY100!3aO~SjFnf@XsJ5-?jkg)u95e@s^GIpXPLcpwoIeP zkem**)J-%0r)u%H>RI%&OnzD;HLpz7U_R)`Gq1E2oGPrS%uxfZf_wLb{G>}*UO9%O zhG|+A;_R%%G*~_STP=H~fvutDnp$+kt}tI%R`qHTTVXcwKh@T%S6VOo=ilI8l2$vy zX^?E$$};O>&|GCv_HR`y5v&4$KLi}$4`2?7fDl6X(*ZyPD8Qy3B>kXjTnd7co3`gc zHCPM6`9UX*CVYYu1kfUFKaApK=K~Olz>Cd9f;Lgkix7xN1OB}ZFWpBkB_=r);&-Iu ziafIRLHNoTWL`v25F9?Ou90M-1J0XgkycjLTJv%n)H`s;vPdfm%cDyxDr;roRJfE- z!BSAuFu?s!&%@SQBtfOWx8_}5oRa@r0PQjnFKF}dL}~Fga6aTC;F9?ND^UJyp=`Y= z9}s2fsX4<%>8TUo#iUCM5@e*A8|K*Q=s|-;U0AQFJ5*3Gr)r&=Fr#Z-2>>-vaA10s z`!FYVuVk&G$E30j|en~FOCLi6+xGS1^`OBAONzix3QxLZ$Bd<>mUFHkN_`HKZx@* zNF#OsS0)fB5R_pDrs2Op#G6`zsK4MiJoUl@5X7Q`zX%?-s?WZltugyws6YT42q=IE z40lD;M^#Q7ZHoa}fD8)oXM-g-K@uCl3w&`a0?{x4fOP}(lHQBq({Y+m12Kqz2wpyx z@tBNEDf?UceX@ipUDFuVF;Tk01~dA?jDR>*>rqu%K3eL+xiotG0A*R(O0Gn9*xZB! zUF)$hG%?xA-h~WI^1uY$h_8IK#`N?Jc*ahOeX6QfY<+tfYE=z5#-pGErf<#Mr~3*J zvG@o80yQ680^{?(c7g1I1UvvBMim4Q&sd(m@WnMNN_fFNMNJmO9mKO3#GP#~ z4S1O#wQ=Auki5vkf*IXNHtu~BCa|+n?<16;EVVl#o z2Dj{Ny@<*e7+5_%0{*f!4#9~9b>Am9{^HOA0Yrj?@BO>A%M^kV20qwd#wEzUH2lLt zF*_4m)qc41+=Rf^aW&bUKvw*_+R~r6i;J*Fu2oMHU zS%m+LKog@YOu+b0KWcCx(2WMi=Du{!ecA3o^jfZ06gjE{A*Ha`o3bfXWO)4ra)z|CTBn-qQbb?{7ot|8)6V{r^9cdx79z>i<8MAQoToYs69wV+KoK8t^_uT2=OH8&`gv12y4$B92iw2)7gSTXjGnE)lQ$@IF{qaP@)KqZf}du%@Arz$cM2L7 zteCJ>Q9!fqIzYBd)vL>Hf)+4ibcn?sDr!~gjD!zO-KWkUgcP7}%$RG8qFes85Q86l z_wXkJx6q`50cmy|LX@6oR@`Eq4 zV1NhQLEnPgKh(l(kC$IiSVT{w zjCjlhEYM98`TIT(posvGkf6eV;bkj@g#72dzw4hRfS33FmsUoSFC};oxL=#<8yo5y z-7D)G8^Hqrx98`<=jREa;2~-+Sd_I8yab7|LcsfjBVsTKD;@-kgWSvB6GQ!8d%R|< z#bDi>m@f3Ij@DW^>+?u@+p(ziEX&tvz;kvq->JJle19XZPit7sXSZ5?M487_IQE*a zOn}6j=+P1Oi|ON1to6fX3tzGw)lCzPKX8(J5!sx4J>JN-x<_J0liiG}xkVRHe{%iH zgOG==2eVaFA?M3$m$8aHaMQ4aT6Hu;Hr{LRU# zF`l5kQ>IeBlKH#QSX+ZOxXb`ixN5sj`^~kQOdR zmZc~DC#~4M<4Eo6tls*HyfNc2zr6~*S@z!nK65F*?}OR!9;e)G>aLy$yoi%r@Jo_U zkPQ0YXc~L8>`s)3Czt=NNX+Ef~0;=|t$cb0eJ z6Yj10)P|<;JrAxK42xTeA|`@My1q@c%9fe+IJN7lGum05>xMVp~e-G?P-5mrUut}{ivw2o?s*FyLnzYt4vp;>U;h*pTSFZ z{%y_l-eD~(jFM6K z4=G_M zZmRi$nDX7%qy)F}<_mMpcXyk}ZsJ8r^WyAEZ%>1fxB>>-cZIEgZyug(RI$2mr^CQU z3S`&i($=vmLdc{Aev*>IC@o%D4Z2mR;(1(84Q6KEP8EG#m$SDSe=8Q9-hbbHYY}|@ z@UGRdp``mwI?@rIR&vJLP?F*&8P{sUs)s!;hGG5pM+!jO&niWc7VX;And7QEu>|F~u3O+mb2JdZ`jJJMA zI^(imev{?bIzxC#Kw$ppU1^xKdmhbAwxKsh8vpA^pV23gkjmvE=FJBAw-Mt%ReYii zlN!x~&z^h8G$HF9zm;~eb+=c^>r1}*O0B%hv$Fc?mE32<*&;OR)>x>1ym8h9i*@NL z@N~Sl8_Ap<1%ZD&@-D$z?KBGWo}+%AXIpJxxQCZf$x|*+nIhvY-BZ-vr$#BfoVS#2 zNu7V>4~PL^C(x6rE9P!mmfY0!X_L)&!&F%7Px>`(h-*>))p{b|S{rTv+vl5RL+kT1 zposncMi2w2o%A(-HgEapc2VKep&@?!If{Q}hXmUsPjO*oL-^WNA2Q^GbihTJjeTo( zu5~x9+$$^ox@NQUSby!%mU&qRQ9}W{B5mHV2aR}R#dtmCvzljY`}0$DFQ)J9^RM#G zNR2B$;l1iV(FlOQH z=v@GonA=CRO*7Qpc~?i-iUWc!!&^u9CPK)3>+WC0lYwIGnB}c`6c$ zVQvTkn4Uez-sK^-5uF+6$&0PftY&&1H}0$)6iq@Eeq5$%k! z=!LRd@4w&(vU@=qZZem?hF!1?y317)T`K6-acg{VB@RxhXQ79EU1Z@1S3ek8I*n28 zn>}ntIg>%%r82uD->WtY0X!^Jy(P0m#@Eu5YSIds<6mS3naWOPivH6Z*&#}mC_CDE_AUh}fR)^=Y*=@Pf_hjwq?p5{C z9&YsoCIA?`X1+dEFbLgdl>flA+}7KPzhV$dl5CduQ{15E2j=+vk{1GUK(v+O)pIv; z)7p6{m%enblUw3viUwkHf~cd3?bP8!yml3TyG6~&c$VmzQ=BwCTJR0NZKbMw;r;i3 z3rj8&uTg}8$S$vt=!?BCoohl5#XVntVdVe55}9RJWkT5(^3!!Iqj-WGfr+z8hIDz zp^{b~E$q3b52eD4gzxgJ9%AzT9nnXzQIyy>bk@WB4BK8P?I@WaZfH zH8E+E&Y9O6-^os-`}+@TPnbn-ak%tzGwyfR)ZbMFBHsIAUT$R(R1LAh6#iap9T&IGzuaw~JdXR9|Be`uGWGFnq40kv{q?4&E3N2uEW<7=CpJ4&;GXT8B zn~qgIbwmB@+{s zYQ=5?zuvJAL{}b$))sR@Al7NrC*#<`QpJyDOrRo2h_Ryw!;*cT_;&VbXnzK(87m+V z6-(sL`y<#K=LX3x;aDVB+&$_~6!oeIV^!W{GrGpv9BPUDy*p>e=8ymt=!~IA1(*px z2A0<$L}BRt_R_lEI*L#tB(FnA!`wbVRjlHvR=F>z|F&xEI$6i$#qdq0MwhG!Q52s@9my%%9v6+54&+6xW|38I{8ipU7n;8wKu!oir=ia5q zzh<5DC@p_@SGYxX%{R{0_(qC*kbv8tG*RzpX!O^`9h{#LHV~5QO+p&dA0RnzBr7^? zv(fo|dQR9hgA?WGoD0Cf|INOA+v+i;3ICNvv?GAIfwylE-aqQs_P1ea1A`=;qM_hJ z-uWozF=p;hOd;Zq{3c4NEHkD}LQFp6LQ`|YZ^!wsu5lTn-^Sq<*(7}yJd2M-k?m)L zP1LT-nqO7(wPif!%}#nBJ;3`rj1+kw^^%+VP1V`i z?Fy#riF#@Z1ry;c(2((2R)0)5LH2z^o(=m zA+-2)9!7-3SHU55miuqAsd*_7<+hobNm_r%4m4A1o1MsI<+2SJR{($}A>%D!%zJ0Q z{@&K^S7;{~x6$8D=9`{qRq1-*(T))l!a?Y$A&+jU# z=DDb6cifM?Cn{|%o2?4Iu5lVx`&mx7cw710xmu)D#g5S{%V~kg&L;MSp4}G(=DSve zp0m*6Ky+uvTJF{XQPQVdrSHVX8MIG5%Uv6z=`t)!`GLAsVNI42eA88ku7A2_?Is{4 zXJOq)gTllMFv+H7OETmnfD92Lx_GRz3T!+s60Z_54gWEieb)!VVnWh~>qa4s5(-GO z`18^HKVAuf^~0Ce{lw(q0DMiXQ;PH^F(j{HTZ^cxv7s1esR#BBFR2Lh0Dz9)B~F3( z5itiq^{1J5FJ^v`+e$=&f7&7J{wID^I!dj)85Y6IixUz+08gkzMgGXi`et=M+%wKI zC3kO{m0V_gZrJ2>-l?8IoEeOqA*D(0fv!IwYQDKhFQ0Lq#|$jyHc2+`HasY3pC<_{ zPA56CIy{+WNSta}Kil-<&?6_IwMNFX{)9<)=Cxm~<4~>!Bf{cFjR0@ydbfW2gcKn| zP>SzNP&8!FAB7E&otba3K|4pTeMXtscaLo3!Wty?K6d-t&} zUDOx~(OW6$@1V9O5gn_q$sz9qp#3~UBrL$Y$XxsRDEZFvqa6hY2 zM@#59BE9<7NjurME=~qeSQY4|yQp0d+GlB3P*>R${Si9}lL7W6AcZ}@9Z^)_5)E`KQTSD|Xf2l~o zrC-AmUGhe^w0{=C&K0?N7eO&RcMkPHpd9-F!pM{uz1tXi>>f8}UEs!@b_N>QfIvh9 z#GF5UZUzG3=yCw@fPD-EixHfv8lmmd7ywf03xldj-cecJUn|WjL%$}i?scWKDZ9T> zSa1-Eo;_iTVAfHs+|DLj_&rnz7WiqT%G#H#nT&+pnSO`9XRdz_hZeFSh41JqD8qA11zkszExQfow32%EC{1tUqF% z6X$K)*pK70Db)Ix5AA7@LP;984$Dd165(HCKVxOrPbYFjpJY^yBCoGfn(wi-Okdi* zcPhDPl4x3mBU^5dKv}=PnMAdv{Wb06T5tR`xPu7+m15(siU>4o-86l*9Z~@Pa}onO zaxdZKBnAq+=9v}4V}pk-&(9an&-36R%**#0NMNEQ=^fT6G#Kh5_MQ{gP9n}FSe7I9~@bI6HRn~?_+8uO8tHaP)Wh#LHV+r$9D2y zigNMrg|;sSn|OK&-o}LTkhcDQ5o*>|X?XHmn8yi=G~i^92aEBI$mH$L48{PJ#Yb!P zK^9o9D6u?AQf-(Tm;qo7bLAXHSsy^75P=X;!1t#q3BA6-@qLB18UFq`;)GV&MOtGc z#R|=VRttvrGML<)DgOOgIvabrOM#gr*%G-UbucIg zk(4f;D6f;xP@X$4;xF8snulz@Q=VLeQU&z^2oT-!(nX(H!Bg-O*{)bvJhbj220Ca+ zz_^5sPpGz{quXXmgXEOY13kD*7KDW3%>A_k$~Q z-R5S|q^T9BZ2j1lZ=6#jewog{d33ut@uc*=`>Z9-JKoA%s6JmjaA3cj{APRq>q537 z`dE;#@j(+?6YI&>AZ$SK1gd7#Qw*kKhETIbn$lf**Rh1MWObmjlt)nXE{PQPgxX1^ zmat{LS(#Zs+03|FWK$lI zS0k`vCO4xoixf@Nmh3BXSINARgFXHYItg*o3Z>p_tiZ{B*a>`^GFgID19TCH*%5fg z8`W?uNF;w-sAwZel{7lXTGLbA*9t%2V&2muD(mYH!2yL>GZ6mIz$PN_4wLQV5jvA# zFre%LLWfFHf13X$7hVcAZVv4*A>@bbp!Av{3k(^!!P^uQ52XqWco+S7&hWS~n?q1Y zMPD`@MJk83sA*HD7nW3Eat=u^nJTq;Q%KDYPaSVNgmUg<&HiLIi4K6P zih>PI3Xs*(^5Z9#rvCw(oz=KJB=lzG-Psg%&t03%X^7V#h7L1CzqjzQ+F8GZ_S>J~ z%Lq|_#=mz=O`k+U#Vx^jNnUmE6jMF7Dq&0!`P4J3(7d^<-iuLU5$!r+dum)JplPezM~5UL50ql@EYJQm8lUwQuAJ7 z50kqzF1zB7Y_v|0^IA@y}d^GkX6(J?~(64=X4CGC8tFj ze9KP;K_Q?oM-(16h+rwJ`NrokNI_qLPBu7RL98-deqaB3rCoYiFbN&XEB$D~l~(o@ ztG(gvIQiZH4N-!rUXIB~AvG<-keRwU%hQ*h3Mui1K`0RhzmVnCd2~35p##FI>+hzz z<-~U%^ph2}?9VoNe{;9l3(wy(Uw|LT`FGE={?24g$*ybJ?DG(8KHCTwtTd?k2qE0N zoYVbEtBY|4=G$hHJ0XXA6N@{YFcQ|uTlY^Dza!IN8EORsphV(mt|RSH;Oc_|wy8Eg zs?Sa!iV%;Ed0kw+ANuO5RK9qJ(}WEKPu|r?+I*hmvq0yWj?V+SSc}7E8XP_nw!vW| zI&IAvp6Ckr{NhVKZI}r!k*OmOpeiGE*SEuL<78r-;NyoBd=9SP2xb)v6&3b|0I=p@ z$el4$f`thvn8L?Nf1ij~&|^~Qj;1|%B^00V;rjN2W2@Aa*M6amZ?KFi zH98dxrO0akFmJLSdlI5++LQrA{1YnSJk7VI0bFt`t5Uj-+Am2z+DzpKr8aZ+&swl$ zDDouJ8($;)$8M?Qg}Wg-k>D(v%kD2hj}>Za4RG927Yhu=Rxs%u4AXtvBE0y{H(;3e z*yef#W8?i=6a(G{FZ@+jI_8C|S4&5M!pR3He+eXHDt@G-o+mlc5b+J%t~1}I+67v2 z*}7Flfc44xl;~t_fO4R2b<0ChR_1JWdUBlI=qCve(P0P6rb|!;T?JL5qu^csXGxI& zfR2Ei3>u5L@-6C-G<;>4ip$olY&io$iilXy2Y+!hOHtLH9(o{tN2~yzJViExT(oAC zXX@z^o1nio)x`MXQE0^y&13Um{8lhI#xJB{*OV)``R4jgpLoy8_v#u>D#SYejX0kF zI?NeGv&Yc(c1=*hGoCMMvw5qcffId3t$y#v^^IjY_MuJA1l^#AuDUT-xeuKg*$`Rv z%hKENVZfwm>Ivp1^(u`=D=M{i;(2Ya-2x3uAB7K-H@8}Q%$v9t|FNL3n z<+gM#5xYum`rt_HoAxVu;^*+im1y&$vZ>6aDNMZZ_>cfWG^ zXlkI0z8{9;Wb;@JsH(Z$^t4Aunsyaq*rt z57lD*nxO~!9{m@!D0(dHi#>;Lxp5&*=9cN?(vp!er@h zNQZ}GY!h}leq<9kwztN+7SO|e>xmdlBVjE1!In#QYwed^fFoVzdml};GqXUSl7fs> zFt!5?XgjB+Z%IHqDDRr0Ymx=*_6GJ2Y_LZ_H%Xsvnxr2k3CzPD)urgC`J9@`aOvLs z(BNv+Q%orJs7z{iV-!J%Q`ACs;&Nh~{FUzievjt&LK6|`;2D$^v<({E1Yoi$*VOkJ z?K{*e*{gxGU0$Ep(b0p>*@)X6!Al7QhF(lTf4r_uw`ht|Y8l4xXry`eCUPW(4gj>UUzNhw(2mZ zbnzqmnf_U^t^^O&&Y)jal8&%;-6(oiV&h%qelV7M$NmkUV+aiNm-uU92W(TbOc#OD zH}C!7F_hwiCsS-}R1Mb)*y2ePrgK7Nt2w(0l;rDLfi07(Pk`C;wg$HCn~lyBs; z2i$vM`r3W8+tdi((BF}|aYai&l4hlX)AP9A(u>O&ouw{-HX`?Ml`s^FS1TC>h)7mSeiw2xbf8SaYwpM!W&3c zD@mH)iE{O+9rvV1vC&R?!@6@-x#JJ%9tlPAS8j+?PSfpPaNn8jXh26RMk%TKryfo*1NI-FJxVlNRB|oy-YVZ)JjSe?F0HFa1 zC^O8MP%9kcRM>{VRxa;?Xo4Pj$!#zsxSqUutzrbZq?bI zH-+_5CJGN?V`kH6USi=;m%e@};mAB{whl3j8=p3nYVlIg57wnDibLt`U4q`bYrB(% z%uIRNtJ~@tNt`R&`{HefR$;C?zEa*)9D)TD{6X8J&YGf*NCfB^e0K7$T|2|Dx%0=~ z=mOA|b;Hg$VA_$tMd(yyd~*4029zwx83Qoefgw%JZNG{9p0RIWHwxJV$WcYiel_>wF<0 zxT_vG=>0v^`2&Sx$U=FQFyzJy&uaHUxO!1o<6X54@r{TakX27uRQY}Hv!SDxN9aIl z5^0(jlE zxNI%7UfLlBG!rIpU1S{n!v?XV$QqKsZ>5N!i6PRdNY)53Ssbq;cnU!nKpBQ=&q^07 zrwh%JqhyhZ724e&Qj!jeANT^Phk0PxBwFk^z2GBejl09=e+9q*Fl3SD&)5m3u&3+t-we-=Xv-Nv!fB%8WpK2!^yJE{) zYSo>pR8IFzjLNs_T1xhFp_d09tE3CM`sYe*l4-Crd^|g@D25b6_!RD2d9O;)JSv8J z$a*{8PAi$VFS&e}Jy>f-80(VCnmyV{V^jz$fmT@&izk## zZ4b$vJXPifg@xVB{{HxLpM$qFAOopJ9|&C=S;;UvY-oCMH-YUVG+oDiIyCrU={TWd zSmcaTdRvTwRkqybr;k?Ol|`$~AWIu>?AtyP8Ab0e6iS3>F@m?nA`TDeUWHa~{=C^Z z=^%;qA~a#w)FpNwIY_cUqnOovGGRFCY0+!oZoaJV40X5(XVc0cvUe*+R%l6E!(Nwq z<{rxrsU%jBlm$}O8>`2*zAqhpQ4{?5cHQDz4lRMD8EY@%ZZ34}pcE zEKKILEG7d(i^0K`%Q$^_@!0Oco^NOk@tatj#>(3(N=wDPyt;syno#}dlr{G3Q@@Sq|fl87VmK1OGPd-MHU z5>EAl?EKUGdgL~96J-dXAr4jq3NVR))P+!Hg7HUsjfsqfC6ZViI~msGf>RTqhXFuH zX1>$-CUZcKLg6C`bv|@yX{<;ogpBBps=lG6rE#|SSS%cDvyerYx>rVaF0T`oqO9T% zLN;KyZsg3kz3U!o;jUwj*@yD2)aE(-PB9_oqR*BR?M!9Vxr<%=ppX@ z-1C6DGkhc7=4{V|50zJ)`h!wpBCTYYD`T}5yCdMLm=9S4?ZlSjZHtVnlPc6HT6Vz9 zwDw2_F=<(OE(cVV`{Ue|X-!LQUlO?Fu^#Mf1rCNASrmxnAh?bwL)1@C{v76kG~h?1 zj~Kps!~dtxkUmp*y!F`xQR%^YEh-l_UF>%GI=%1hAz4X`r~6{#k5BYiF6Ipq#<-!( zrbfXUuK1+d4QXfN*ORguD_ob^3Je}D0WuMG^7Gr58a6D$xa$W$>ArsBh*MArY#MKW zHwHnDC>DdFxg~iMJ(S(v?@vOTt&+fncfgMJnbv$=)LoU6SMc?{cBTdco4w~>JJG76jOi@IX2>`|9=4$|KQygDB1hKQR1a<1@fjl9o7$c4D}Ig(gj zA4%D>5|-WjVc?VZ@+@ZUZetRbIpaS4B8`|PnX~&A3-?W&kw1>XsWMSFlOcPW&uc(1 zj0yc4ui{yDetb{?>z(I}_T*%pBm2#D%#9RWh$4U>RTYWdzi)hB>$pcrmi9IgDI78J zkch+Y;ORc$K9Z(O1X`o;^=|fzvyjIC$>Df(WQq`H6&*U)dzRg&_GJ?rNPx9l_gzi+ zEbEG2e|}!A(n+2|=RJ~YR&{m{@pJ=AQwRmZ`A{%lr9P^}8DmjZNw=HIvWHU*vl0%^}cMeB2Z zDZZrVIf*AW!^yp2Ib$6AC||nkA^wpW-#qp(#_N4m0z<6hbnKsmIp+ec-kx!?7;dWd zyZ4`6w{O`Ghkoys>IFMG5BUm~8d5lU;X|;!>@Qn7W3R+z9Is6Rul&Z%n zd2$=03W}I6qBa{58y|EHa8LmPpd(=!ewz~e7g|MDnF)`(&5$i*!0m*u_tw-M{Sq<> zZep$#b1JnTW=j-Zz2eBR!Q?@FYEWhhRWAP!3W^Nm%z*=uGiu~fiMqx>k4$Z-r}8BP zJT!u5+2X_(u}SC7TS`p8zl`sVBo$7jRDr+MJlRBmrZXDc4~ZE&$g-3l6aG4rp1Tma zMf7Bmp<^5pBU>iwvpqTPZOnhLAv9vyxKJP7mgJR%A|i%g1iaI5Q+N}$eaiq%O@4-H zJ`t&Kpsy-wSQ;pnbDoTa*s=9p?P;oUzKaMqhmNjw5D7o26E%R=n$3jW&g!T}s&(rW zqF%rE2tBP(m+2ch z5Zk71SwCif)0z4~4(39`>2^Z)^qkrWy@%O-T((kQc5wHilG32jt#`Q)0a02wFYvR@ z*E=PZp?=s+h9UuFvdkmj*HRJ|=Tr0P^YQ_CpQv?E!;bd0yfWnOPf&D_eT zi(6#Ek?_NE=rwA2O9H4{tb(-a-XBMs%=$y@cSYjmPaSY8Yov(1FA|kU1Qw_$^mPs3 z%M?Cr9yGoybQ6Oop-DC2mK5hpGEu}|_hc95o1%jhb<}d9E-PXuhsks4kGaw}WwAb*%#ulJWQGZ_$K+&fXc~hvb=*aW543XA960*O~ljUN&XO0jS+g`qv zmS(qn-B;G(u`t~^(oN$Eci$9PNmPZ)b~(grzOP3o*IiUz_ch)|p^4|4!D^;7f$>k{ z;bFYI8kU&fw;#vRu(eM!*!bHxUg?rHw(?}B1VVCONiyW%`PWUc4u-U89tOgfNT&aO zuuVtRVZt#g%E%^}wv=pXOMli`sr z-=$Jq4wCWhPv5K+JyUuHj@Q)22vyCC&pT=XDQnL#@R-s^}+1P7- zM@G;QTCGA9s*@<*E<#I|z8syDwl=Eq;Y;}P>+bRv85*F|zl;9Lx$83ykOVE?1{%R^ zN_uQG60XHLro(RYV@VVTCljGH5()~^QIu(*gdxCLWCRSUcoxXxN!pN|?F<*wN&nuz zIn(wY7Tx$Wu{hK$jlIff;ReBrKO}GPX9Z!PXSMhU^0RblOJJFqV&O21KkXkcn=*rz zM?#(4nd5u?ax$7cAQXy_QQ$Z?kqM3U3rsw=8qiXYn+JY_dI2LhQE4nyx%?ItZFY@0 zuPFSGvPb<Hdw#QzwO2E+l1uFe-}=L(XC9MxQmm%^V#J*=C9^TFJZd?0PAg*{%%k z#j*m3sy>R{xy3TPIB6P%Pj*yf$|zX~fiOE+&Wv#CxU+!d2bIAATsouJZ#(LaawJzX zv!rS}Dljh|TuGSE9+|F=E)xn()k%5fcage>B6H`^<1Z}wV%BRPc}|W9HpSAy2F;l- zqXndKf;4Z64jR`b?~Ir;l1$%)ZM!csDR$b>pz}NYUbh>is3KB78e*BVJlo9FqN!Q|wV_kDdK!Fbazq0Q0h^3?M2Y^c z4YAbNVB6)1i+)*$vXX+xqd9>FJt1+oSEyE->lU2TGNa0RZf~^XXOt!-9GF{5Ik}Ga zA)poaJcnswzelBVq!S4remRbsW!sB!HT~Z2Gv~@?GM9a4+|y#-NWF7rN0%@lUPp=o zKV|e3cY}(~Vy%eB(@M|LZbi`_)s=+x$FDG#gXDaFr}OgK(an1_#)<@E=;=L1%0a9B zPpT=`*C!{wDKXmd3+LOGnd-(>-urhjLdnsUN8N*J?X2x`uQ|v!|WS2WJPzJ`q!<|oQ0okscGKNKm#y9D~2U-G)mFr3vA35Z-;0XN- z)VbG&@pD9Uv#+?ojfw&9z>s&5rM4T-Qag(3Xk|#IJ_(y-B!&m?$q%d|;V6M|JW*5F z=Lx8~7<}@{Roh0VsJQsV2(-vrC>2YeZGq4uL6}IajB@MZ3uI;+n`P&=fF^4LRX8ykKKI zA)CUcJ%4VCo@ahVEfaRnJMEaIWR3CUkfs}YyS3#KJ*5s+gQyC;O(ZB&v4VygMbj-Jy^e^O-HU<(Oq;b044v zsDQ+>kMRS{xj5#MHkz8Ws~>lq7yCxZ*Z^hAaOc9bh$7+&Spr8@Y+0@#=&3*b#;B$; z5Q&zH#Ue#CSp6L5e!XY%2+khWR_!&|?-uMZzB!d3NYv?6`RW$XtLc-) zb!nT>C3ax8$gXE*%2}GyHHVKPs5+Mt($u9(UcYxS=dAC1`}^qkH!D9K*G1oq#r*14 z&%!rPS;5NYJ3$sOqx4XjiU!zRMD`;V=(EWY5&L?(4fHh9744|0uabn`M^8}iJ47V8 z8Sh&i3$YCqN6*|A3K-0?^R5ZEf92w{m)2=kss4?oID>L?zRI7GcB##m+_;++BsaTL z{NtjHP6ZlJCiwSD6J^jV1jEY#1o;0ffacAK`j-QU6fh-&DFRFxVCs2tUX}QxpA(6ieb;;%q4p#UUOn%U`?Sc~g}KAl4pxLD)@KhEFGM z6FEiH|74Sc%KkOS{(Rr4t={v|z%7<1roapdL0k_l6NB;=BG)Uef6RK(2%4z`gsps;(C#34&#xO^;UIbK2P)M|wJzHCt! zYjR&uQ^*Uebo(8J7>wty05KtF6WL#rG)_uiro0qGsnSx_r#60?enT{$OTTr$@}bA& z$R$J9X*%#Z%Uj|c>I}G{$2z|?EwjeL=si+rO(iLtV~95}4het`^sIcq-G4`)->R-(U9XJvSBjeZi<+F^G~JB@@JOIH zsVl6oZC7EVJ!X?W^rof5+vSO)%1p^n(SH2!XaVB&^+QX|PEFMle3he*Ak)Pd`Iz$b zqwX2@NOp1Zuq>pdCyv!U;ZzezA?J8F4*?OHaoU$+et^A6T4&E>Y!uW>e#kzo!Cx? z9XomX?!9k~G5_u#yGGUCYu2n;y7q(53d5T^)uH0paz#D~*V7gpH9WZUYF773d|T-DVAxA=;llucIs*THFYz!&Z7|Zu7D{K) zv^IT~&!rDcXln^}liX)lyoQ)P^K5C!fTYdKsG+4hMBeHgn^O9V&O6l!_4Ui+NfZrs zYTY-R>~;xrrkZ8nx~|fz{uahu0S&Rk+q22S%m-IM3l&x-7@e=1xi`#J1x_iQg}%F4 zQRv8l=aox%+jG|Weo_mvWikG)$#(j)Ji`wb()sP=@T>K=vDMjK3Nc-7(9s~R%5 z?UVrKy68>WJ247LlgwFZgZlj;)D`%TE0p)18Kte8vT(QZ`I2shN}9oPU6o-1ZhlUzf5=jN?kRMxm3+X@%-}$Qtfw$QzH-Gu(u!dV`Vr!t5!^_ z(br#M4F&dSqWha_+J;b;XD5jau3my3;;(GgcU^x1CxgOZqV(OVI=qEz`KzynFZQN9 z&a87TH4USJB^e@s4wir8Cs$rNSa2oro5+OQ6Vl;NH55R*>9p_qlp=)!E7o9S3`4|3&TL4)G-qrqsJd#j7j~^&=!Xjv-M7>n z>BhT6!4MUQI02CF5LThQ@Y=o`2t`T5kAsIPTR0LCEczz}7)WUUSOg|)P}o%9hMK!)WnCgiKU6^`2>W30?dYY z!2?LF56`(r;PX@6m^!3vhtDR2%tr5*X9xlPUrk?;{EiXo(FkC2|M$PK)HJ8oCG)`u zcC@&~a)rxR%_SO(e4z-Y(Z1gyR`aA46nw{wsy-rq2!4nb|R4V*+jr{5PKflTA6WZ zyU6>+thpII-LEs%qKjP@v?ax<`!D@uqITY0+R07C}80k{fkQqzf&M)s4U#xeV?^4 zp*NP}Dt+a#$u_UCcyy5aKoz{dD|t%wQ4n={WfXiZ+?JHi$-zU;XX?mTz zuOmzEl}mPy#nw(auGYm)o3c=+TAq+yd0X+4l(YvKNG=}z&X)asRKwEN&MVqoF`|N! z-wjC6(ZAZI`1{Lyv&}NHR&^DHa1-i>LoHk!DnUWZPBA00efnSzPodh#b8{)ER6|bvfjaKBuz|hJ zQ3;Kwc;DRC3wa<2TDjPPAEZJMV4CIY!#0`V`vc!hLc z5!njv2{K<3S6$os89OvbH<5I{J}MSk%}|IeDON$71dxK$dEZM007X`%bqIoo0m(xt zL-M-G+J?`P{gM33#?il+u_}?>3gpYf1enPG6CIHT#L2o^6p8Q`t@`4DT(eUN0ERDe zjWh=b$Brp^xXvj)NbiLyG5L3f7SReaQ^V;6T;LpeVIptXcUOm^f4NBh-<#tCcaoVWI!i*xx3` zm(pl=gnOefJiVDK_4%-com^fRE6r^AkEOG6rO@rS^}}rlaCj%CNTf&}HzsbNH&a%KSGJ5}6bh9>=wA5Gd8o5(AG|r!^%8t43rTki{WGz8U^akUvS!}QsvFr#gl-g~ML6cnHpQj#wd84W~ zl@aM_yi{Cc$`~(Jr-Ri%MW8V*mP<$E1J@eSt_A6__Q2h&kLXa!yYyM2C`+^L;^TML z^BMoL*hkkM?BcIozFz6He!FGo8awf!?)iS+EkJSa^tmeE-{GniRT#31wbN|k)ND^# zX`_>=`3kOJop@0011$h_`i9DOzagZBZBQ^iGbdjQ88CtxwBxqq*V9aM^7?m+$idS` z`DwSRltix$pO-N?G-$2uO4;0wOZU?UQVc4`W!>caAV*)(Aj(CvD&zH>?SgWK0$OgP zK}6fqp6#!clksu^iQNT`<8ogPm~57*g$1_d7=ij}@z)|jZvrYuX-R7-aUg{jN15NTmY(8=LLvvMk=d7S|_q5VUim2U`IjWoqeD-vJ zG2+vZ{w_y-f{L+-tbxHoIp|ffHFH14jA5$~i=O(h7qDIDzy&}Ti^tcBe_WI78rOMx zw$t%0I#hZ!Qr8~jFW+GK3upFy-c%{_IAfs!Uv@W#l`OL1cL`YS?ZMbV*+Yztv6{VD!YAgw@qKFAsqub!2~{*QxH~$*c^I&9xqiz;VSNRblQ&aGvT=Xr4myQ6cj;OSsNRaCrc3M8 zaW~#|W^^pq(f;+hI2z+m62uwfbm$$1w2)!4I6Y%!yCb|YGfR6MY!~FtoaBGK;wqWi5byf)9=Jrg z@AEk#dK0&Jlza~runPb->y5~-(b*MbnJ>)LznD|3Z}-)RnJVCmpE|+1$DjcJwH<69 zTLr0aIlYmBVF7?Gwe_^!pV2$w7R;qTgbE$-aqI0E==}ap3_u(j0Hj^ts!LQ6y+z? z;EjQsvmup2XQubj&;Bn4ql2On{qbnL1rd1w!oj75f(r8-1($_Jo%SsC$hfk?zk30g zK(vL7cw_A@!eyh49 zWR+uGimA3MX(2_|i1;oO3LvRoHsYpY!c5Ht2v7h%8D^%OZwQ_*v?*4dlbRt5N&yy8 z$0-CL&z0ZBCr}>L(c(R4AOcvnh=H7khBj<6<;xONX(P*>SxPlzO-m~%F2f0LQo9ZG zAyBA41^mnbqa9|pVtu#9pRY}oe#`^j=Z}a&523_D?=J!~+lt@f;YBpRqKO!R$ZZ20 z^jE1?N|Ha7_O#ua(kp=ps+u*uDNpHUu1%VpY_(3Gdntd6<&a)htWVx~j4sOYE&GVZ zJ!`T)G-D-6#(_3dXuU~_{CI(dmEs<=zUA#;hO{R-Br;>2+P*lrd_;Jyws;Y|JYr9L zGrLKid)!*0L>gV6*pK_&GhBYC)ik%lLchC5x{aDQo0qZ?bH1BoKOxjU*gV*bnqPnh z&sig;E)Hvy4AW-@R>t&Gwaf_s7~YaF1*ZWYaGTZYh1y-X-tt9%ff?*B|97_tTC_;O zTT6zIAfMu4d%W8{uaujl%R26?vo1{Dy@s9Dq|3=?2$vMm$jAa|`p(e73{VbJvmd9> z2N}hOBx{1QsT4Nk}mL0FA)j*o`Z{|Pri^@E~!Ja;B^Skp@ zbKehonqhW04MRWP?o=Gtkt?#L?pZwkfT|`3kR&c%Y213^JlcZB8oR}JU%i_AS1FT8 zGyShfLu<#jg>9x#(0*a{ICEZk;zwLf1UrBqyHS|$R~&n z{$q}|zOeX(kS~~gA+TFwJ**+&+i)nVeuO08b(nFJt1o~PT3+AyU2O*779_Y+CMW}r z8Mu^Y!A7WWt+&nF&U4&U_U#-_q>!x1BJQ4_ZjJwC=fTTLONaes5*Dx|Tp$ls9=whU zp53Io%|kKL=EqHPYyC+lfg=q)XR0Nw`op?rj*pnO8xq2V71hD4pJR*IUV0@6GN8Ll zswxlR+~aJEtl%_k&r@27=uU6t*iikCoAX@bEF_}ugtL=AM?nJu78+DuZrgxZV@dLW z+ku7J2!n_yu%^hmuh3zSOG~mmujww{$pNyFj`dzB$Vzo8^r@BW-@4+&639y)OAVE3 z2T+Rw&ttj^)V>n7x5?xZiTzi3Jg<#*>o+C}m|Z$cpLx;mN-eE8xegkUNGx|Q2M_q& z36L}O01k`*XBd5nxwvg@wo{8342X3eNA?#bL?vYg^8x%qXPkh5tX}~F$a$3%-^k*s z@#Im$v|THB<5U)WAB@SxZt+FiG+p*)?6IC)2{=@RdjIay9E1 zcvtjFS+6<8-b47;mc?>Ep$n#8tKB?nGrjU-3(|30(@=!UUIBP) zL47H1acm=5p*Z?`ZkHPoiucp{WsEtj zfa1r{z{tf~-0TiO*PE+6GtPuDQH?#`y8lVdCgPdTdWX@7O1oRNHUO(E9kVw;?>S zV5WR~kN2XmoJlfg}O*npmoE#j_a<$Hw<`6SSLG)r>*01%O1<+M{M+)Y$OI-e?-r} zQ{M(~uT9(!ReaU$SLTG@9ZXePV*TMpajon55tYr;+qzHr2RF}1L{j)DjC#K!?&qey zm2JN8p>tF@7?Eov0VmAAm<}go%VWhb(mR^1sT7uYLg=vGK2Wzqb@0bd+0Wm0Wd>Mp ztfximSm^dsC&^;&8`q(W^v`clstNhVOs({eN&JB6pB1YX>_)sVZ-VE!WGt zbAmEssn}yTAZjBS5KIb>DrxG0yH|}BU$G`BjNce&QeNg7&nMkM_PU4!_(pgOFx=9d zX@LoJOeO<*@4C%0a?<0PxFj)d;tuMh^#Xfw3j&Tixy) zU@M-gU)*?B*#I2bZA?t)iYS^dV~ai5P8MA+#10SWeGMT(8&fh_TmN{m39SE1ooz^4 z+7YpU@iR)M<{v^ed2w0QM~{vk&FA{jM{0 z*34PR%$u2dA25r8fmpnXdLaF4xP$Je|D)pwU6S+Kk} z9Z;nC9p8Do2$#+NGl$!XInxUAKD`~>5v+OpaNp<~u(KWRb1Y$hVdsR5f45dV=HKyNEJXJfp+>_+3^O=I~L3Y%TtotLp|$H#=Ts9-Nvz+~%y{ z@cix|>3Q<1MweQof#gl|S$@;3JK>*G_{=TyCiIUle;P6R-6DtRDWixE&OiL+W~(^5w~F~)xPwd7hgUhc;T8;o#!QXyLTkkRllC8v4wf%7dFj zqXwflNIH_`;eu1;K3FnyJzON2LsG#&Z#pB(c;CQsg}OWylT^gh`dYY32gB>RjiZkzzJ6hy`3}f8a{q@Bu)22COLz3E11ADyql3GCk~4Ga#*v@8>E5&Z z;%$$0>#q&$m)7mecrT!}H9_Xl`U)io3iFRBk#J?@U(at)!-qk`AwRF;e_DtY*Q6GQ zF3tRwmD8ensX^aYdD&j*`&NbQ2V>fUX29W0&~~(K2F%50an#v7`<# zA}hJ`E#S!vAF2jW;QX&%gd-RVYV9(^oLy|ghb2cvBm28p*0MvjTCsYUetDcv0r9qG z6R%&BxKFl`OZkhlf^6H$H+#OX4mp`x9w^Lz^3M^_x3t71F{veGH4lVv)IsQ{C)|)F z9yQA(h{=IxCn^xojZbAjj%DPVq@#OQ^gG#S_w{o&30`c7*@Gft!rOl-={8;UJjs1R zf7&lTa)qpasi5<2OGE`ndOeT*b^V@j0a0T&xue}6|Ao?9w_9R=VjB?O;zMhL9$HZ+ zlV4U3HiV!lENzna1eD}Yq&>BqG`9E`Z_pGXY^DDqXiqL)?i8jmZj@cPH;ApAB8zx+a`ET`t8RQGNUM z8uA7oq|!1Bc8WOC@baN9QnRJL>U=>5ra=YWm^L2K3!b<7PnS)hhOvoK*bkM$Q2y-xi4wK$*0 zUM5VW1xsZI|NWf72O#9A;U9sstcEJdp9#8vb6z*(uTinX{>JZtO@$d##Spe%K8guenwa@pbPW4a-4@ArL`{aHg5k3}mg>;-IMjXfV>Z zRTjv9GKdc8ii%Wq;~X(fF#Oy zS`m$D0<{P{3fO%#FZ(^6RA^ImxfmVCxE#nSOTZYdM806?01>Y^2}+e%HR?u2)?iW* zGcnpP7t8p6L!wsMo*TpoaN`K1YfrRYS0DQ6ZF^quVuQ!Vc~8`UQ*0Na2WSw$OAVK= z<=r7M-ult)!irwV{^QvTVST!Sr--RE4N8|Wc&=a7CI~xR`2Vx)XjIL85L@-?y-C=55^V@CEI>_ zmAfa&yXML+4aLB>S0U6JmR!n|gBq~GmV-QxQHDF&eAPQx&;=A&p02u;xyP!^>onH_ z2pCLU8+t7U!FS0T3m1vD(RCmLcABKs1+lS<4}X6y^o#e~bCu(l(YB-`!_aI5pNpX{ zlmesR1Hmu3n_`Lm__b>m6#t}~!&HbG!u478I+?6dX;2e<9659^H1RK(Ze$H&VFqmw z4Fj)px-?CuB4xI)u;1>M+K%ucO9NWS*#wdD=*I4?%SySj(;Y|oG-hs+a9D~VSwueG zkX?pk&6CGssM~dh1Nqpdv@(x~omz#c^U-{-q8=F%uQp9ydz@W8Wt+*qYXqC|<&2#f zYsnCfKB&7deLCRP=1V%Ci(yD|SYR(PBfc-@TMe%H!Z8Wu?i*W_w_w~5e)zpmy~X=$ z?~1KjI^Nn%ZI)DMuY2Q#qPN%%*^ZnM&avy(Ky(SYmZYNyUD*p~>V-bGc(+)m2vg>R zStjE{y%(6B&%6|`H@T^$fisnuo(FfLw0$Nl7;eRGX+ZXv=fd@JTh~oLg#5NiB_HAS zG0Vta@5r*%AN!N!R(k&ty@?ky0EmF=GRGtf zIFV{hz>~-CP2b&cmFhBurj|s%zcuEue9P2IQx#EA6;G;{TGUAwXfKhq64d>TNP>{< z1|Mduq=jO;fw5oT>iIDLK^Gndy1D7B3?l%{tCXFK$UW{ab@uo(q#t@35*k!P_F*kNoH{X+7(@gOF}Hp zD(?^;FMD?siCdFo3-+q`uf4FM+~@uYTH-)~PS3j(;<);4nNb}8lL&DYEh81U$TJ=Y z98zb=0_q_p?ti2GVPYYlwp4YQj`WrH`gX{t$|ioxaws)CugeV`gHeydoIp*r^)Gx2 zyuyP7fwn(QH5-kEN|4h~!>|)IZZMl8u)R@E8Pn46S(ljDTqxiH;wCcOI~JL^tSkID z^j81=7P{WK8BMjp`+WcVNtZYSeW3Lk^$$F@I7_}{Mlhy*rg{O#1nkau$|lN*nC*W` zupz|%4L*I@82@+vV~_sZ@?!%5iu;c}s{BIh7y7=?_J!ULwe>-=2{Iub{}fDi@v+n? z&nCqZWT9;_riF%yHpGPmmA)IDEW^-SHCG zeveo^+ulI2g*EMsh zjK<~BqjrG6h`F5l4_Y`#aHC)_h}dr`NSIb?_EH%wXgH6j%D3qhjEU{B@`3H1=6FEi zu{ZHkb5o^M*LEDA^QKrEmY@A?sT^~+O4F4_ug0^BnV}8#u6%!#u*5*tyUz=EbFfrxb=X4{gC>) z!PM!7J1ddv!~P4k$D0%~vT^n3@(f3Z<5jb2Rr0;-8{YGa%$$XOnS=bu<>t|&ogmRv z)J<-nuV_`7 z5(tu~dzCiv2yj!@l_2bOZU1}1idLa;caUbS8v;N`Z5?wA2w9jo4&n4hzGh~jz5;z6 zH_t4#m-S#MW~1Ez7+p(G&T%YWJQus6pB(X$p?ZZc%QhF+Xv`Kp#HYr0lHGSrh)@vq zq$t4B@*FJ?%b#U+56aTuM^-ce&gFu1I_PNt@ZbKV_=od1#N13~=1vtJ>oCg(Par4o%Y(M#qFsFB!i%Onj4!Y}hIKed z&2?t{Rs#z$SvgPSh;>qh(nCm1E$T#^ki!H0$*oDPN2ov|EbNYs6KV*|RtfO8%RdL3 zasT&vd%gmMlpC-u0u?h%;OZI%kAMKKE1( zx8lnQ75wmmepB!>VTlW|BM^JQ9mCD#CG_{lk5K)EnSDza*=vyCI`?=WP_EXcICbne zFTF@IDeD3Fa<*4qr3n? z`8<%FKIRp;Dg_I$Jet`$7SsF+5l4CMpT+RlRE!omvev4x-3`-}7sHLB#9Szhi-9Q` zD-~MPcZYWN>}!EY3Ht zNJ2JOw@a9JO`+SfRg3-NaeloHtlq|dV~Ru=uSnQY%`0Z%>@yP_s%s`#o!drP-qu#v zIU%5W9&Q|{a5X0$)35b=e^W#Xjy|`ii54=LG_?PHkzjNG!p%7F;>0(9Yi^mHyj31$ zKQW_gMIaZt^+lQh0GIK!`DBJaSvrYj-4dDb5f(65gt+qYmfyORuAQe42Hl~jALgp! zB#AMKw+|}>a}_-wCZ$+slt%=bGI$L`+BdRx!OjJtz0B{#Mgalt;D8*C^`zg%S+nax z3jJ6C))}_-&>&o4?4i)8-w}I^{hnV$&M=*RQLf%#+}fagO(9GAg`18yUHqJWp|E$XUT=i*k6z5PnJnSrg{Ij707kM-Mx4872 z4qIr}!twp;C?*cA6S4BcRp$Ap&ZvF< z-+YHPIC>w}uPsXk(J-ycv56|An?t#a$(6AOQF%8+YXEh2 zjx2_<5A1qi)}5a)97}UDxMU+OJ*KAg#T7bE{h%DoE3`@w)|qET;0EoTUnXxV+u_oB zD7Pq(aOr93;axFzm^BN!B-59=lebg-n%@GM*&CsD<);=i?Rtra`(jLF-HMCLjO$kT zw@115O-6`HaxmfW35= zz2pD}zhP2%)`)zZsSz=dKmv&7ojn1?gkvg43K03Kb^kO@PUlW5dJ@>#T1B=cin_h9 zKu7avRQhoDUrGuO>0ucurDx@1tI!QJ+eFejHaM(ERU#)EEQu>oC_;HCHmoG%v7Clr zve&=Tjep3WV-(^eh~_F`!GMZZpo-G4;(hq%leH79@cnSsiMRV7J?%&$(GXdIWoFTr z-$rMzvXB8#uTkodB=w>9891hc9MjHb3J|-Vd!4PM1qV3EPmW*vG8x*->&d`LTs;9S zNq(ylX05@JH2$F0kmjbm_Api}f-P_K39LQv01VKg(HT~&bea5h=W-&piyfUuW52lxO*+GFK~-}}lgNTjN*|4>Nc#>Z z4Dsx#U?vjEukHS(!Q$;EERK1Is!M5|kwb($tRh(m7p=F51@B;((p`j-&HkO-TW&t{ z$rvI4I_EDPnY&*kT!fW$@jr|4l6fzd6Kn5T9b!?)6(u3npe_1Mhe3Hv(EX*QXMJX_ z;4033yS`6nl03xAX3hU5HlQ}!u(NWRH=|0czsFOyF%4!^h;F|6Ww=`TC}tupP^b4X-2?+P=Ld+#WZ z_(#(wK}<_O-5kyW;eY|f!l)wx1oWb=GR02UN$c-HBNalo+&j%t=UZF+$3ESeZ*Bq* z!ehs2EYdftO4Q78f#l;ocg%jY1=k^!eS0O}9IST_Ab61p0-WVTf5R2!)mmkMuLBuv z?)@v%D{qoi%%j~^MojO^Q|QfHQ}z#x_c2!DIu)&d{#z^2q;d1(X_+A}ns^*GDDriH zl~M$E$fJ;m0#N%yy#d%}&J%5!mx|37e3ohE^oPh1p#z}7xVNcB62Hfcm~>fRS%0&| zA7v?36|QB!C#MLJj_1a1ihSnv`^bby3Jmn5^bes65_kD2=YKrBOR04~%X|!sxd^(J z*>>(w;2~b*?4<=ws3qXf_&mqXq=$G`Dv*OMIQETsRTKAYv&B!mJ+0Dw%bh~_E=22V zI>fUb87;)%4Yn4@>7R~17aC{&5uL%p6N^RElj3xHl$HeIXz))Ify2dez){wLvlLI8%U@+HQAclZrd(L zbcqT%SNZR~BKv?wP{XW*4ubraw?-$s>PgU$#IomN#=@*8@d#Qto~9Q9fVabd&e&i5 zdXAP2vwZg}NNO5O?e8D6x(af^S(9UM;%|J>H?6l2j;ON_WFM&V2F~wi(b6$AklxGI zDH%$<|9chcB_q=Rvd)`v2B`)AV@SEjE0J-W?rXum&#pYqv9Yi&|0%Xv;mKh}r}sWL zJtI`qyxE4rT*#L9a%BX^ykC8$G=*=K6UN4zRBV;~n$o!hrLdM)b-rubP$`V`%CjY# zMVu#?GwR%p;l8jaktje=>0vqYwGu^4^e4=X&4j& zVVzOC(1;O*^xM6;5=!4cnrRwrVL27Q-N#Jx&=?=9f0aKt8@*h~dzEX8=>(ymR4i?z zLerVT6hibB4Z@BEmN;bz41Rr!gD29tx@a1A^zea%LfHFs{;02OLwwarQM%-I{I;{V zst}{$1L9&mAKO`|1709WsD+7`54xz?$d892<}&@!^MLT%+@`rPdHx;&?fp z$0f?viCWazCI&w|qx+qKduhD1pp@TvSD?$(t$^51<+@6&kRjPVdT*-`9)aIH`On)b zo7|dosPdL@ayI>HQ6Mz3Rz>c!C`CY@K+_R$euG(oi9;?R< zGLg0LUy5M6<$*%0qhJ1GHbUC;c~_wMQ12$MPf3lZWc=6YbL}NBc^<+~8QF&X$+N2t znC!Bief~EFC)Q)^#~_CuvA@Eo5WN4@ZV?leQ`LM~1vxvfU8(i|6{M_zA*BI?k{wFp>nHnJy`CJlz@H#Gkd^J|Cb%^J1736jWPr*1OU z3AwXM?NcmXxE9y|+L8xu004G_ZYlkwB3W@@rvC)^|%3F zX_j$%<^{2lur#$)vB?60rxE^$FwwMtBVomr*& z7du0(c?sfc1$82q?Smulq)kCSx*)l?Ofz;Uz3Ya4Rm6wDiH#m5h5#V1>5S2^I5?;@D_H|L}g{X`0y_+L*J!9!2?(zM(^rvH`M_B65 zb=~c9DX-PnmhZ3sDiK=s^CsR~n!=@v{^x){Fm*Az5Bc^`ALa0xo*eT?0{&GCgdXG# ziZdLndKIlEV8C5r$Kr#aLwW85)fnDxpj&Jq(mKK9fd#s|EmicP^uVmW|NCJDuqyXk zVC0Nl{$ojw&;+6n=zco!TY@uLTLNmw^Mf5e5#&?{qOJy2LZvJBseA+!L*h)|Uj2_E z7u2NP9ErRgPDdf@Dt}gP$7h6k8>c}bZN2Wn~&p>U)6WH_RQ;^O`hqC55HH_u0%1@tFF7YA=S@svWDy#C_=8W zPxQr-i+-L)-q;-{XY+%pW;jIZq(G~ZSIXashxJ_t1dr9N1DmJnt^+zb8r{Ow(e->= z!qdIS_c=GPq+6vo<0a6kR@QeP)i@2WW`=U?16V~x?IPZgadWg|C zoWo7b|3-Uc4(sCsL+;}GR3?t&ZP_8KJjGqKy~plKL!5slDVEHD^?xO&o&z#_LYNh#C-9#Agl` zgnI*Ux%RCF_~u5cZ%O!m=i_kdB#%{B!vd&b_4HQKl;&4S5;xSs8{_>BYcLA50aKFz zoSdZ+3-8wsM7XD~%mysMT1AjjB@`irn9@!5(7lv+n4r<@VUk3E8;SsR=UP2JC{-g2 zJ9FBHKCvsR%aoK%WeX+A9eBKI!_)Nka}-ZN{Q0LjTB3x%K)+G+nw~J`mjM|&-kqR6 z7dbS^w653`fqg2JzZpZ@laOMM9E_$)rQ0(;yZJ6GVcq);TP+v?t08dyH_hudba?(L zTc723)Uhjnq<^2A)wm>W`9oEwc`C%kr{C>MfRkEO+E0wMZg<``jpLPtEZky5Kxq9! zJyNtl6;0Dl#UcG#m$lNioSWNy$smkUfK8?wwO0H|g8=^DlzRZ#l?M9uL@7bHe`F>Q zzW5o}U}Ob^^&B`j9_gJEGSYbO>0W&Szq|FK$Y9ey^qg#$+d5$!ej|HxvpQN`04ng6Iuc!*oAP@AnEF^{3!BzqIR zR?F#CuR#AwdYe0BJ!O}D?(=IrE+^;u!wRcnCmh|Q`=mv*9)u;8R!W9@q%R9&NgmVVCw|!Vl*+pcv)S%PE8CtS>&)(Cp&G@LzexUL0T$!}&%xC7$ z;OqJZ;fI$!y_(L5T*+ST3f9e3I!DMabg?nXRA2S z!^E*-j^H(@Ce*Ws3Jw8qw>3;oeee8H10Zqp9f`tk`24TK>Y{Mwh0=CZEVSAG#D zUqO7DWc}9%z*-R&C?iM)cS$0M!uMmj_0qA-K<;C*jmGsgBm8nzR@CaBYGT;EKul&u zP-LjM!37DFejbdSIe!zqGt|o?H;TEx(yd1v&n@a1dO(amVDMBxNx$a%xf7?VoG|fG z6$j$;$EtC(`Z7F-f(jXft6(B2usnk<&1z|Z_-}Eiui)D+CM#SZ2vY>44@;x3PShmI zUHVm*x~i!!z6L#u3(E3%XaR1;Sf9h-bOAKLvmu}C9`T;iI44=_^O;5Wjh99ixf8^E z=O=d(`sL&e=H)myOZ|LjUz2kc;vZnMm4ePrIrs)-`*ywr(&pX#c7w zaj=d%_7rUi;J$u8*Ux-h7}pmtR}v%wO3=A>c1?0xzblabNqe|!b4LP{@Nqt9A2X@? zi%?Jl06S0i5qJpmUK7;Lr`maxv%#R{c(22$(^G3CK-^bIF`=FWoh3b$3j~N}hUicO zYm#y;3T7Tva~GEXQLa36RzB*u-sO#ix0PVLkX<|G)PkDB#Mk%tIMAknN_HLZeQSy@ z)#_#8j(R$qwVw3B>jNN8U!Gt{=bw<{18gHL?^F z&)hpdt4UgHcqNmYh=GRl;*3*Dz~nM0oPagpZP{-GRI=zTGvy>XY*#eoP$OH@QcLXG zFpF=bFi87~2V$>E$2KX$xu6B6mY4RAGPZ0K_ykl%RY}ru%7V|0WABb%@-O*W$-?;D z9zPrW4+m_(qwygk-XdGwSO5TQQ4>h!&9jwu|3ytZDbnl!smOD%_NQ;_K~|C520C@m zWY{o34>2Kr;+xn@zZo2Q$M9{dx@a)yRFG&r-WTP9vPRUWsz=+4mOa^8_*V?Q*vWA>YovTTC^Ui1mHu zH+Em&v%3_q&wpuF)x}Gt)^xT`Sbq&aApMiD737=J^jQw6Ng}fK-C>|m5d#Ob{^v*r z3GbDRZUDkjZ1Nyl<!Q_l-}#^OUe~(zm-o|t@IKGF z*IKtY*b;hCZH3GwqpFQ{jf-ol4eh(y3C|kS!07z=ko}jySQ=fUIrJdhA zY%D!Ij%xz94_G`RF+wHfr5u&3@W;H)bV;gAn{)Yd-V!XocQE!JeZQk%VEO`wl!PK< zRLHuT7$*eb%QmLkD^z6DLBcIw_Rn$UH(&q2d)VIo?Nb6Mf?U;Dm^{ZWizx8jzErHE zUbYIl1wnBC+tp|C!`Dmj4?u{$OP=x&Gm^U;Q7=+Q&h6V2)Zv$^?hinA5+i>~ldKMifon2alw#lpBK=y<_}BWr)|`{~O9tt)0uo{gtSe^NMa)0Z=`Cfv zh~uSm#9_;JrERPC{5PH$GyfWn*65#?lI|8kJZwX3tR(vD^EC{xAh^mznMghAi$p&y zVMDa(fW4dcyU9_Re=2W|?CxTI#-r@_ob%BR_+6izdCfCo#?PMFyn%J98C4p|FVmm0 zOruB?sguSn1JPGCI?i^VO3o)eiRbg0YNsXcHc`ah21)B__6>LMf1B$4mroADijS9R z^Ez|^-D%o2TQQ#MHgw#CtIu+!`jyl1UeGCL9!sT1@g&a0+c}9j9*c;h39d{dwsyvB z!_pJt-y5<+!0y9D=JKbK$&Lb=@hP^gxt6;dt}`Aop{S6fr*D^-=9Q!-8wN%om|)YJ z{oU*7eF2Ltf7RFTA5Z|l;ten{WTE$el%$dT2tzzQp>B!WR z)tu_S7DfS>Eb33Y8ZX!hpO@Lfd7}=>?yKkM8|>;!mqcM}TX>;^HTuSUpUSN`Jao}V zh91V?MeAAR^+`*qzo4~>nd`aJq5CPIH$idb3o8z$FH&=Jo7mtC)Y6&CE|^}JmqAa4 zyFzEEl(*o1DJ|(~CZP)(Q+JRIlH?dlTft${#3E2BGOIBs8|h#%;cy@`lp5-9@TVCz z8-k6RprHinqpSB@D`9Jc(N^x)UVT|-E8=W1_9D_3y+Ko~xSD+KbmiK&^we*As2)D3 zZ)o(cSF4oTEwS9hoUeUlt-Np2^1wUu;KGk%r!fyOkpgq&49e*|-+~MO4eh>j>BnT- z^bs6B*NdZ}|t-r8|Huh8dOdZnHO^CH+a3%X$d2zub-^gicJ$EOXNYo|W(N z=^{)y;MiPRR5T(Si-hFmBE=Ga*VX z6eN%Y{uRV`?R>UkW9f^fR}HNVxt>(Tm+tmkv>m({?!xa00@dogd|;<{rT%8bfh&+T z@#`o}!F6YS(JeO#S^9+mvo_l zA@GnaOl|$WK?>4#5ElMh-zl_%+*=X#7YLvvV2__KGz+cd?h|xs9B9J8k|IK$6jWMT z=mpSDEvh8q&d^&}@7=?1Re#rIh<8Z+T*>L`xPt)DwWM@wIPf3YKdq1g@&nNNCF}$` z{SwhuaV)l_k<|nZ_mD!&n}s2QDnSC|zdr2nlt4h#`ZAEgrVzZ3K7XD4NJS9>fXFH_ ziZ(Ylm6Og)8^uoTptuXT2)v<6as~wCzX?Ht5kE92;b|A)!%ru_wA9{b4pwC`6)blc z7NkR2+UM}snP-iQ;2W4xH?vukbxA`?H0QYn##cQTEXqI#F{iDZ5`Pj~ie-QmvuUo= zL$~oh;+6xD%BFjWL32PnwhL<^p>Ck}ZYqMZ9|HmT051$Si}-d<-q$2CL}scRhf|Ex z^XJHa*~ddf%AArVv;grpeszT(e}y4L#vbT!?)Rn!n4 zwgT2U)p|NIU+wd6OF~>`=nIrht6fi^|1nyO+vV9=+wS!Uq7iLa-oNZEwnj^a%*S+? zgN<$p47!S71-4omU-K3$P4|4QH4GN!z);*$GUezEy7pJ#^`%$$&mwtwHDJoj>RZLv z#J(thRt-utnoI%x#5oZ(Fy3`TfcU=v z6V7xM-9#I822MNmmR%;_*(%n)@uWt=Y;8TdP*N2)k~Fz`q(qT5A&HDtBASY2X0Qf< zPu961is?r{fVBxJ|45;`k<2j`GW)<+QY!&uQFML6xgSx;b!Rgv!ru_$Q>4N1Q}r*I zVl-Nt#N5m>4wRNqFM6&0%T_9v`N}gwn4efB$cjH<()pud4*Nd@u1jkx2W1|OK03Bi8;1(A z7`t3op7HiWGjCt}&Zvv{cjt>?gQ?#yJJ75JBUoDyxJh*j?+HUGixKH{jdarKgv>=d{wy3 z*@Hs};6dg<0Z@}CE8s27*9JZlzK4)g9C9ArL9n0UPehZqc9AkLvl5i#GF3J)Mf8A}I_LoQN969BXp{Ji zC-4NS)WiivNd0Zc&z{eE(_#B-s0IvRPnNLEm~-2ij5*O znGBWrrjQ51F2AxkcEPxkCEn?FdT*70o6#!raP$Q%NuVDb`g00k$k);h0YhbMaNOmm z0E~&pAMlAmE{Uq7f*XVq)XlB|vh%HJnv?Fsa zK9`tyXcdQHr9FX!n4Wfw^zKE~C_|fw5I0e)2x6*IsrVejc@=a^-X*zi1-E@l)WXFa z0&%GSJ5WzBnqEynLBUBU$7^Z-D~8|^LkQsDbLYDg059}icM8xrf_pHNkxK&F1m?7& zEfA2%a@i&W|LKBNr=?#WJiC1KfV2dVGz93Z@8S8nnu#GAdBe~X9hzxLPiTt z_Xnz$tGZycmtF)JV^OI`RXPv67(LHrp%#sh%TAjc7b82fSGK%LXDxc!@cp>3oHnc~ zggOnAKcEMZhc+r@fhBM8qCBzeWGz#Gn4-=DetV5lL~;Xb6Ssa3&+0Ik7$myC_^(R4 zH{Ls{m~JpY4$Em#hV%vnO@9%^8KgC+xpHn^?fA}QP=)${IP()n?pz83>$G!n{clFR zKA+WvZ>4Zt<-MJHG?rStUMaFp&I0zT82p9`(+|#4pW#TPyVp#*Uw@+A9y3--s6Y8M zI69cz*$>{~y}ixiqR$t<8@dFGTb{-$Vlq5ezhg5dDtQET>e%jo%{p~c=x{lxW6v?0 z1`?SaI^fV&5gS)jZQy?4!jTRRaO=ja*hO-AcYAJ!6ZnpOs3`t1ByY6q*zAbTp^3Jz z%@lQCseOKycm}C#|7I<}lT#%9_tK?sD;PHMcOB}nRGLgu0HxDd<>cs9_k;Gb`eknAxberjvg{!p#HC)o7@ZjSXOt&anyh;1{0qyuK z*X+Fp0!ZntDD=JX+Gz?rbAfP_lvB2jt;^68Y_7i?LxKTk!*go`{YU{#cv!BPz+2!6 zJmMq|F%jr2K=qyVTUXI;;UC3w#2|;2(tsPx|D6wI9g%K6emu)6s&?Tmi=wTL4q$`> z(Iku*2B}s@rFCON0`w&mbnk!w#26EGj>7?*N%e_w{&#MoMkWWB28jtpoU}JD~|Rw6L~v;v2|f?DW}JvZ3|H? z?oxwUiQ(Y_#-I%?g`q*?aONH+L*NLbNS72tBLKawIrl2)%}@$U8~Jdu3S!YCM8YTd zYEk+hGQMBU)cium230DFsX!Hx3NDFD$pnEy5HN5+fb7X_9he8~wtKCHs~Q?|6*aNo z$Bh63An*{FJtt zC00;RupOn9LKFy%_U-047=!{5GlUaXRU(FW1Td0;QABKFxh4)ct2KwHxh!|DBy(#q zwE_AB+_i4SVsitCr!+a^m{~5|F}?4gkE=V?1{wS?!3|27$muo?G-6&fxb_ng5b17O zzhKyFk9z-+hwRi~*M-6k0Y9Osd@`v9Ch5%JZ;Bdctn~MxiXK$-`AE)&&&`760wBFt zb3!jafI1fHe;4(SL*2NJp>yuJDYtX&R5{-5f9xDwe$LC1juv*y_O8Y+aPDK^@-K+` zi+kKiW74G))caqzzQg-eE1=tyu1Fq zF6s`O@otxTnykh=zBaXsb*zI$JN!Ej`bv6{P3QFt)i+*hpj0RAe%~STpLSyJyRFRm z{5!l2uDmJYuiKMETCT5^_(QN+-`#u*p%1J;&)A0Bi1!sDj zH&iKDScfN9%HjtFtrH1Ekl{JX!ZO`^{U zA0}^ztQP}0%mpXvRU93N=U{G6x&b37^T8<7cLmnJ2R}~_0k8zbt5NmQ0QLge}b~sa4a1QlMqvuIg5{kO9dK`?h0LGTKeeQm4*)n$Ou-g zlb)f46pcDTMnfAPP37?(!|&?cAv#i}$j?C{L<4}Pdc?WRrhuJj>1TqbJ5dAjZ|=)ICNDCB zZxxA>bu~a1sbl~TJ~(AKsg4p->~TM=vC^Qk z3iDMowWL}>e)L)N+E;joT347YI1=bigrvrJ-R!_ZC0sR7JXIgJE^F8{%e=>> z&E#aRrAMPOXeaeLtS9l)z_Wn_byNmrhsuc6C2{7R=KjPR8xIDn7`)GDMsFnsE*f&p z@6Q;(=p&_CwS^t#QsJ9d3Kv39m&7yNm@ifK0hZP{g*`R$0_6Sd^|zCbA*2S*iW=i| z@{Z9oTjreLIU|P(QARe5K0nA0x^OPKhD39hw@{{~m$y1r2^c@vu~ay=PZSJZpPjMW zgq$O07lxTXI+dDrZJ+8-o{OjX>DVPoj~Vckd@SNks`Gba!$zcG7?V3@d~ea!r0p*%X^eLH zwzt#oG(enDVUei$D6+xwxv>hGE{ohB_`@5Pd#P-J;Y=&}q;+6Qn{O8T%^Q z7h!zqm0AVNu1qzm4y9Sz=ZTrld^uz=(;^SmuEPc7f{MII|z*ZD}jHLI$s0VfTjlMEo#)YNBi96K<5xk+eHD&ouHXhN5X z{a{QW0P(QYf^{R5@9$7K^9}+)kSkOK+1fIinTxB$wD^S^rjPSIGYOvCg1 z`k%*AS5E|oPi!Di-!8Ix^O4m|MG|Gc#)+@_jhVyZQvDV#!OwMvnOu!s1)&aI-N3Iw zYF+8Wu-T0#UWo-i+uBiJxNdd;@{xf~do!$qWm%PFxDrPA>DF%cL|t zQwDm!bKSUF>OAl8E@D#g-?%IW6q8qpoNL7{&}=<{;BREkT^&%IDM&7W%%8AJa2pdx zt&k$+$gnl~uKWM=;7GV5%Y`>*=(DVuR<(CCu|1W=EY^}VStG@NlyoUd$w7s?sY;GG zsW${&rEW4KDpx@LMzdDKAO6`%t>$F*pCS^oSC0X z{^gi33C0N=*TLb?ux}?`D7aLX9xUv@FaQ?O!0{vly|wJOKCiIKuS-9}y3CZL+gM{6 zyin+n5r3+QIHd$P6bco~1~MqTz1}UmnRO!CaJO-bQn4Dx<{T+(9_&25UUf&O%FVYu z1uwEbatgeCR;4bROhxX*QtKq^YpT2Lcqv>SUX;|F^ZQ?QAKvTZ+a~VlHuS4r+cun= zk|l^wvnXZ)Nrgmreft(yNkaQ~0``u4d2Oeb=x{-eI;zp?R+|6GZa-&pwG0NO(y zW%1Iq@D(RFLpJUyM~6c+y9Y&*l<9I12@98yfWc4zDT4B-CqLiB>jD zL|w~+CK+7HGwTWz<)WwsQ|gX3=79nMmKi_SJG#T^6lpDWF`-e`)WPpigpWdRKT^RN zs@ctMq*IzksG67O#9`y0xZvf2j8s-2R+w>lVF{R8%Q5F4@N&>fP|+KPtM9EKASeO~ z6PbsIg)sjDlCYnDd>@Oj09}#ft_y_LgFl@ux?iv~MkmRKIt&el#Wmv-K$Vnog;`Lm zd@2z&Yf%$IM2~ z%_P|H3Q|z&^7-vQuMo-k!j@(~=9BEEWVB{NYKAdA z^Kl|Z5+oCmsv0g?M@PtRca=a7=-0x1kyuT#Z=^wc0k;? z=_fqrSQat0VA*_@;0~3$0$)24J3yB>wQmXA2wdSVAw#+w%59ge|G;cygPHQvl7^1m z+KSd)BT8uiT&O~jk8^H0C`SpNy))%zVjpBNJX z6Z&3eEf3z-&!vuEcQsO1KQlJ=^*yMcvzpwv%?fqmd1rXmRK|zwKeD(!e2kAfK>4qU zcRayOAzOK(*JAHCtA7fmMxELCT1A6ewg%bAa##$eS@6m7$`{ogzsT#vcLYXi=q;7O z9%%^3M^;O0{z7k~p@k+!WyI)N?NcgB4QDn$S+dr)-5gN{LB$tNw82u-?9fYQkJ69?Ve_-J zMCbVW{Dfrm=2K>!8{0Rbxmmfk$cYIc5~9bT^c`N;Gqh1mN^LYG7ENHt@t0(?RL(fP z^k8Sxh>fpn_a#3FPQ_Xs1aQ#Q3iv(ng)v%m`1&NSnj(ab4l16)?za^VB|JW3{4bmjpIFJ@b>$*~s%Gsx&F4$HYpVDmpf z8;#Q&saZ=|^a8NT)1w-Uhx@MbC#S@akO4wxEZ@r+5CBtHdEoN8P6Gwl1b;iA5?D!c)z@Z-=ELS zqUrF1XC{zgTtBo@CRP&SE4sqPw)VIP9wf^?3Kn}YpA3EY&p-dr!v*>lLY7j^s>i?Z z04ps^q`?Cs;vvLz!Hu&#_gE_Fwxko6hps^B(82j} z>F;y#GTI(sq(1qm1oEFb6_+7x^feD7?nUDC2m4@&)$(2Z(fhT|@1@jPW}CxE=hnG_ z4wx6E?4m6r?7_EVU07|L{=T=BDf@^tH*Z=sj8dqjjFGc$6WYD&=ueJ}^D+TDj{1%8 zr1O`+zW!b+HW7^V&=0iEnP5x*a*JgG{d*MEA-kIkZIK!Xt}uvy6D%; z8bak$-;S>)ys+r1kz*uz?J-_fJ;xNX$+rp1&*V&KJx0v<_8cofU-rnCi)ZY-LWyr<@N6Vb@cLhA@ZfHg!{ck zAkrVal?5VDZe7$)+obqtN{+%h$2ItNO>a^E+L^rR>xb^ z26mwl8Ps})G{ZOM1wCrsC%80dU$Gh2_*T8>)k86dlm*&?hG1L4OU>;kosJs_i5cIa z3eH7##$b~#BI;pQ)w=rocWQilEW<7bi|mG0Fk;KP?gfmKuIenNA@2TR@8qyLy^%<2 z+dRMvn?I2qvhJxGRlLlg#L7s|mIA^3ly$`@v}1Mk4-1F87{1f1RGRZyCy|J@27{e% z2X#X~?v=5TfsW#0-nq#|2w(H?^cJK#cX_ir$q zLRh#Y;E%FpcdpH8`OaE!V&MmxP2?#)R99jv0K$e!$?;0LqP)9nF9N7wDdayr5{E|jvY{fxiTsF1 zk3=iKU&9yY7~!ypsB+LZdjqSz%GTa?)t6+jY9GW$f^u`{*LpfcZmy$aFSzHls`v<2 zni-SwS@sm@&^Y&7U5q67dJ<+jJJSCFrEZnKshnD^Mlxc+qvoP6Y^)sx0~+Yo6herk zgPM8&hu$K?3Mb!N5dx7sus@QnabB!He@3cI%?Zgvv<@wDtkT3-@;s*FCO7qE#%vod zN{bInMcFsMgbkM&xlFoJj1+u=TGOEwB7og2+hIWjE`;9i)KvM4v?2oPLso$U>FevPo)ih9W z`(1La?^q@<+uq#h*Bwh>2+6o}jP8@Qun%7W52SWgN{ZCKy>uL?e_w&{vvj9l;-6u6 zHH^Bc8@>$qKvn%?i;JJ#$8d4P)|fq!omQH$_ejcjL(%cao$O!!O?P+%(L^sD2g|;B z*28sqTk?5fE6G{6)){sCk!?zob@E9)sBIq)@zXzxq(I);ZR}>ZUNY2BC%oq-%71`D z5gPskr|)#Oc~FB`nd@-+ zyr`7omQj9)H^;8mbkMKaa$BHg!r?%4Mr*6qK(t8g(jO}WtI}XWmPf2QbJ$vl9_WRF za2B#$fblPlTo+B23p+XKk6H;TVTMB6J*J-P5&%sqNz@?nr^*y~fEs*1Yr*!nJaXx< z(;A^uVXC$=im8M|V?$$Mi+CAa6;Q6}E6>@?UP!=h&P)yf#L$3x_&wnv3#zHY30+1M zWS2_-Oz9N+DkBNQN0YZ{D4(B!` zztbTh(250C@9yH>d7Z{cjo+Bqy6ymf(MX4?o#WGK7>1|FyRh*E=q`CYN5~(FDEWoY zk`9H&*s)dNWUn0mnQE-n_-&XdbpV=;v%a<3gg;o{RSc)%edkP*$xGQ1Z|;KaJMTBc zfA0sYs)^;YuJ%tM14s)7xw5M~V&~UV?8vH!75}IxTHd3lxc?Nw6hi_BAWbD(X>RE_ z7M*k36Ks+%fL-{$^2huPA^Tp#I%M;YztdFgem-9Gyj9Fr(b_c*LBE}@Ia&{t?%Cp9 z7gXsjARHFUSglRF<^1;Z>^4L8X3Ih%uB=-5a^+np@uR*M8|(;DKFZpOeeRk?_4f8! zOc}-hNDF@u54gBCEk00DS1O4R9r-)J@Ha6nL=wjP@i2XW*eh3UcaGk-SFPO>E@me&U-u^TPK%&bc!-Esam#w94)tz;O37HdF`T+46&keQ z`Xnq?MJ)#}$5n39w2AM{gl|$>P&P5U>O+y%5IN(r97j<>%8x;3*nv3D+j+VH19JrN zqTBn$APdva96Rs%wRBGO>jxCF%V`n9B`#;X_{iM4IyQV+FxxpW_I8@83mB=%L6d4T z&Pr3=U0Dj}m$l~jJDVu$hSt5L$6O{Ur{lfn(?1(i(7^~-oE(poiA`t3XKW?p?51SF;q(`fK*)Gc9&AO|Q3)x7PeXOyD`s_9X?8@U5B))sH!Sp9dK+r< zH?u}=fdU4h{zTs_je?W)X3-Oep-azmmZgm0AR}L7$FM-lKE2=|^vyUGkL9??gW%fL zKF#dz=j8QQ)4}o6QI`5c{Y03bLdT}ex7Vk~bmIU_#G+ccyBgj4lwEbhMaqO?kE5ig zxe>%V5_4RuW=Bg|siqfn5xc|;A!VjF$hgm@%t8#toGgUWSfW2NO$t4m41(=SE8Ib`qYuJljG| z2~c@$AO;WuN?Mw=X`!Gnvaqa^=TLIkx^5jL7&do|s@6aPGBTkEg$Zs^(*bHoXdps> z*Yv=^sj5T(Ja9+0G9nW6?K#fz>f_%SzFv-W-s}5~+L_Sp573I#MU2e1RpL` z0e#<}p#T#H6wL_Bi)(pBM+6L4J_|<=2?qb**<(IRAaK89`SGH+T2G_)k(ut33rph3 zA6ll1Yyb!=Fk8Vl-u4EJgP=tJg4lh4ah5y0<65jxXg~W|wqcu{gS};*@z->mJeccX zDGuE6`HlQOZo>VyZqBjyLI97fq_KG*9{O6xHgsYapYaPtP6-JolpHggML~eV73~Pb z4Q0wC%V0q)DJX5_0Vu`7G&LlodB$lNj0sGTT8@}1H=%f5!5>olTpHR6K8uPKQ6j3C z@~aIkcS{mDO6YETTOd9xsp&#a#$R&P;^HG?)Dj7NkTkmnBn^m|TpH&Hz_VzfLe-z+ zU~q|$;*l%e-NmnieebtX3GzeAk)9WVr#s0TB+N8fK6AaVQenvWR&`0IqG?HvUvAgt z5p_y>JD>UW8`SD&_y3NvpF&``3fxDRYah9sS5Wm4(U0riv)Z;6C+r>PuX|Xf!OO<{ zyLq?8@`8$b_XpR+i>_`R?oi~5CQB;$Hts2^>5q=@eMir-n$ZluT*JzCZi|9}JUofB zc2wMNe|>MY&M zZ3IX)LVcfbZA=*p6B;xVBj?~Z8ZU2C4KV-XW;^|csbc9P8g_8ao z;NKRb^@%jRnI#04|HqXH4t`Ik@8>@cB<%O^;!-;k>Nhv`)svo<)$yPE@vGt+qi)3; zCz9?YNNO;Ai^K$5>~fLK)qE!{jSvD-bgg7q=j#n0GF{m=XH{MqHt2p_x7)V0=iM0( z=U2dE1H=u+^A+IJv`F}uqe8_i1HWeQu@_!zOX<>iUOeQ?=#HN+Z=1e$^t$sIw-5g3 z9h)8MtX;eU=4An=;`GhQ!`tVM|2^~9&0{MTcz}cKm;1*Pf!(oo6pdn8|@7Xpdi>P(bDzQT65m z-%UM58LZm1OB6spOd%;DmQ|@tDAJzUlS+=$sY&D9~v{i)a{DLP+tx1XoVY#^bX*+c;r}Hp9XYXD^r%pby zta}aX%S}zpyWrJqnkg6obtjG6kXH-%=fFuto1v|9|EmG&)jO-9&rb%R_+Sqsf$6_+927gG*Y1@ zQenm-UU+?|7UbZT@AStQpKW*CGS+5i1st#6p6*C;@e)=OME^^zxhj_LqGX(Udk4$8 zp(Ojxda&hphW_&8y1z@^;lbK(UO+98WrO$cK4mK+z#31sBi>0RYAdUp#>X9`S|<@Q z_8h1U>VeET*WbspJsTebLC7Zbd-cKh*$5e;2?CEUI$LRRC;;74oaIGs_>tv zcRVz4{ACV@+}HAFG;+CZIEGY=vmF9uU|@0FS1F8@{|<`L3ClcP3`M$k8XtSG6QGhP z5>^o4JJ2d|B>uyQrd!5|)oTHP(cjyi>Ay6B-X{7P^wa&$TgbF5aN)Ev=^D5**>#*3 zem%UngJ|Mv{&sX!iJz@5aq2xeW0CPIcWZAZd))rk&OU59KFP>*8?{tjqWvWM7KS%{ zY`&CaRaES;T-U!k?=xCu)}@n?Q`yztx+NsgLbfz#z9cEnU8ruS54=IqvCV{}5}!2ySl8mx{pUuxtZ(jLsWG`ke~j{%ET@^1It zRkI=R@(=m5U#eF02dOoKjnv6O*_uU4h#K3>l6$y41V3@@zD6x8;jDzoYc91CAK7 zqkv&!ptLPLluyYr7X^d7)*oPG352WR4{FcP%h#V2yC@ocg7l6aDsRN1<#0Bp{2DrR z4&b6S%AjiQfRtG?R*Q4tq7=|RK7*7V#TXSISb(5*DRfQ+M2Ld>F)T^lO^#=|XnAC! z3PDu^B08Xw(4*OIv0a*bJLHCrHS0D&EYxMd>l(+J9E-ZE;Y<7`v=)ZU)|fEc?fbTm z+uzfDkYJ>e(8GXy|4J0)TWc*15;wL&&OUi(11Imu-8*`mBqq@j0YYtg%2Au~L*kl2 zSAFm5j@QdPZ@$Om$tBoYFZbUf9rZ@E8ajXwcM=g|w)YVp;v&6%s~G!c3t6vJ{b{_V zoU>E~tAu***VU@B$yV~+<=P!~N^(xvWz=DB(fdd$+X=ig>f(Oy;Po&KW}@Bf_x%QL zy0$Dkj9=4VaVOl+AZDwSGPEaQ_3c-iyA!?1C%-_~!^i!{65UtyK0`xjqcrWglC||2 z`NkVxUe_ZkzvSgo)lEC|;X=d~>|9oq(AqzsRP4%;^mdN^4kid-u4l_+?cx6Z4Y4!V z{eT9%wB6GXOUqVa zlYiTNwrfg@2MYA~Z?&d=oovj)#tU@(00@du)3NcG@>o`6ARuda3s6`IkS5&)-F9U! z$1X9*Dn)e;VS4PTP+j$qCC}yih1R4P+C;omKIZGG-!?f~DQc#1{4$)n)TmxLJYK`w zwugru`))Amve6E~UL|`@DZ_aDbB}OM0!?*WUst?~G%<8LAlOsCd&9xuVfZpf=izVL z{y_z>)WK_++`_ACVQj5++-vVeG-FA5D-z^h0 z^D(7G+WYxTvl*-J-*@xrssk(6oLn>yKwkMv*Q2P^-(0yGU0EUq#yhwzLAPhpP?4M#Jw}<8L3rKj{M?i-&NXHJLqSrm42#Qsty_Hvm7=@q}`u@Umx<7~d z!mQfmPd2!tcm!_Y*uCO84`tyDPTi|6rnhNHIOxAof=Yy#lxk$4a`Kzyz{VLTK(cyI zgXf{=15&6fydvGM>tH-F&>gqZjJM~FkYg{TKDi+5?1nz4sD$+n&Kz`(Y4k2k&`2iZSP;~{qdFXhuN57K_`(6=7@7+`Ch2{yK z2<)F=fF}Y;tn(vG&mK1dmz}=9pTsu9N*OJ*vOVwU=A3 z?g=2JNh?={OPTi5(xuysJ)EPRcPtfY%u@&O=RcNCZ_7=F;89rK7f!~J^C%HGO!DL4 zn`jKoS~O@TNq2Hp(4Wb)-r9gtOEwqAzaD2g zZ5h=S{ie-vV?J#oG6Rgt8erGLBzMsr!+gMIGI*RGBYN(Vv?UDrs>rACf2>YpO1A~R zNDUiFPqa~U4rvTm3~H=~9cfk|nSvaxU=uxZP`uB?p+!D#Nt^F}08tUu5aqev=KGUY z(`V9r+^_d9@9)7r@VVBoSMrTZM4otkz_~g94W;({_6s%azg~Eh{Rhvp+z-Q>zd<`q z{Kl&{F`IIb6yNfc!5fZ-Gi0khZh{Tk!{lV*j{fD#+scfCG%y!HZa@GwI9+-1TmJ1< zLi>@b`r*qVBDwxEQr~dr&Wz2%L9A@`?5#jYVU~48M+mR_4-iqW09Vz&*gn7d`oX}| zNZfD(&>dga`h_90k9ew8J>i3)U zyP}JTB_BpD;@K7fqT5Hd49bv5wDshwiXZB8l@HNTRRtk)Y?jJOMfYh&E_~vvb-Arf z`^LiEe~mQutaOdq!8=hMAkOMwPo_r6@djRhSQ|W!oGai?WRbWp75dSEq{^8_dVx4D zC%vtI#$UynU8S3u2(~|`VZ;fukK7z?Cq!NpL+M*td7-mPrrL)cZ2;$ zF_H!w$K?--5Ien-t|OuvZWBcB5`|_z1{hX|GLZV~aModf$TQx2Og6lRyEY2X`e`xZ^RzbK1wW`6pK^guZ0puAgEbBVBYD zBh%32JlB49f@6+@(~crvueqH3r_Kp*2Tz_ty~nR!0{;@?0AetG*|ZkwiN)L%OI(7S zD&MyOz=b0v{p$-SI1)Tk9O}b+IQ&MD9 zA>_?@6Ivp0zQ2c)66zFG0F&fqk^99*VNUQg`tH`&@^f!3X=m#F zIp`Jam;E}M_r#|{BaFB6`dO|R9oa_5q03JY;l@7~>dgW=2bUCAnur-v(k69nIN&~A z>=uFC;KhM|_^qA?CKp5syW7n83<3s?4wX|Y*_WoReUCV->NWm&4i_zfrMa!NEQEAb zed38uhntHHTh!2V20##t!{N9+B_US7L+4uwz0-nF=V`*S-e_KMmPYNZ8G_rc=Tux) zU;O*a^8?r4a=Z>Mq`B$14ofi=JB0Wq^{SG1(Zr&7ew**S&!q!0XF4OseowlVd_oy6EgLZ0lrNH#mwPp4 z!AM>-#n5~`-CUO5FDq4mPO23Zi-IE~BdZEor>ZGvkS$!26B;vpSI}ruqx&k&7<~NO z$5yVSSQqSjnFh*3C)o~LY?!9l9^w~Yw`-Y+TF&OcasYy8$&4F?kSTm%u^w~B0y)}d zFCB}MPQpL;rfh{W7i-is^7EDuGsz_iiQ6K~&~^#e-naQksm{!0i7Ve&;8HNy`RKFe z)XulCKW8_;WKqD)M?9`nxc zjGJ5!HcKDghZA~@KBJk5->FaH~3!PgeddBO*kKWuOwj_Tz1l>@i{vGrRDzIkOOvi}UBF?3?2Q zP5QmMM*>Nop*UZ1!3+|kCOWM+ahvW4>(J@1kS&W(*7T+0_ft7eK8=*{pc-OLS#HJm zZhg5SwOc}maVw(-Sy;`pf(m3Cv$RR)P$MdTjM;V&U(cCb#V;JK9EiREU0p_TtXoQF zvx{F=S00)38S!Zdh)x4NPIYt$^Y%Qm9eO+LSPz)z$TecV?wVYqtD4cjotSjOj|+cj z8!ntQ@)XAL-tPT-)W_sVPlpBD4iOO>1*5H%TCW;gczBYeVe`k zwwcI4%2eV)d6OQgIs9&w?)g_|i0$w)TYQX!M5xzP%Hgpl-W%`b{V72%tGg!X@PBCf z#wbggXxY=6wl!_rnzn7*wr$(fwrv~Jwr$&Xzy9vKx7Lbv{?$5_Sy?-Gp6I^*ScG{{@2_whnuXed=;u(W!4z|0lhM^yyO`YqsrGWT7z*UJq%cr zeO2o09cf#CVdMyvyWpfWfQ2AD^zhjABKm-9FO8rz9qz5YKt;-Mu#`3S5964EBEct6Q-bCeB_h~dxx1^X`8s>8kmdA< zr6w2qx+UcmDu612&h9WFqaC)1gr&n#ZDi}S0{I{9PKfk(ocQk45P$pteRV?vapbbd zIbkZznL`A4V6&$@LPNU;4G=^`RM1QhDG-SC;E_=y@W{5idlh@8H7PXxYLpb{@h^5E z3PutzVg6#H&DgZWswUmdeIH1EvFItPLC8xG`oS4ga5HV-8Zt7f*zH-YVr2aT-$w=r z`PBJj^WMTRsIxvc-PK{QCFI$6X_waih?kjXLf!kFbdqlYgwvn_(+|Ty1sMH{NbIQ7 zjf5#ZM`h9anu`sJ8t?l@ZcpWZ6$O}h)v{n&!nia?4fpIm3E*juQP?f`Q8S?a1=l#f zc%ZA8Uc3M%NMbeyFqTGTc~M+Z->VoGn$A6)=wE;%a%_O#o+r)?W62kK30}jLZq6Is zkgx9)CiUSj{GU>tov+b1b)XFu-f6Lq6MJj->Hzl~OC6vGyWTlBp`OLI71r$3Ic|E* zY4%*}ed3c4@8^{hz;>kwSA|Mq_heHYE#6)e=M$r0{d_Q`dpq#IS*j0MRz87fkrl05OwaUE7!zmJ_RMBdKMP9hT*_5ODzT6;LKdsqDkDDRUcVELkx9ycZ^!uy->}0oe-hTAMLmZdjh;*~pIcuA^t+3hY{p(zSEG+P z>90CZTN_{ZJl29mrfT(|`wAOQ=oko+z_B5^oM4x#5$4Sd*QCBrUoq=MIrL-Q&t88s zVAq1QQ%H&_7Kf%r1^-za$ATt;1an$>y@ZdR)?4sKPb!zal%CNW2~@7U+i}l(X#FOe zcgPN(^mo|#C@p*MAoMg@NVgFoZl2*mvgJPwOfVKCSQruw7jx`rA}~q0ZGlC zDJtjRXw^@&R-1If%eaS&&1$crBU8PXAoBdwu46anuzQtgA{UU6F^IXYD{yUm%vm(x zDGC9{&#LX*G#}~KHHqJ+>)yIIaHg4Kh}P9{du*I)Gt*mw>Aw<N^HKv4#-YQb+s)0a*X-wM+LwB4pPB z9BDR_Eix?B>ivSi5B(c9d%=p?o8`1`$)&Occ7y4S5 z+q2xrDZpdV$pwnn+A8FQ&r@!qOv_MwRDDT&W&#BZr%nY`_=Mba&s51pKI+=uNg8L$ zJ#(C9)~@AirI=Fh1N_2SbxjwN)tI z*W@mo?Fh(10~P>CNnH~RkXskZ_EyEkaDTmu=6(2TuhnI8PSeYTWSB&)S?w z-zUq7bOC&H%W{(=l(FI{bJsY8TTjpJjLH@a_n*EyTidf@{!auptli?8;LS;p8)gJ= zK}uiZGc1n|022bkbl5Xs^?*(~bXnVhc`@mJgCpLkq+coN5qSxUOYc>Z{}J6$;GBfc z=R$LQ-+x~oxD1pGC3*H;udxm$zT5vYd*T(p!L*&Ftkh>O~pIkD$5nD)ackr7r__j4$BY6l(K^pn!#{_8VV~c z1DYr71Q?7edxIw1j_8TNyd>^V3gF)obQ*BsVZzUQ-x!^${~pJh>;me|>LPiMbA$pM;d~HBfdLXzSmjQ6EGpuc};fpSgA=t~9VZ#e0)C7ZAmkHB*`P z>|*hiq)VaK_bJcfy2N=k9YMF0PJZrfhj)+e+EsJb+msb|g-d_Cd%mSqA16h0UnHkC z<(`7usl8OmCe=&6Hfr;sAyM*NPgqhv{nDVpeU7lklSE&27_WMvdw3JF9 z@Nc-oBjvKDn5Q8l+0aF>RSa!4?tkcd+e|_H>4%C7+sI)_rS@1E<$SN9t=W9Bd!8>_ z{Q~+bTvsFBFLD#pw>PQ7%9d@DMmAOu)Eeuws>8~Bf(?Dx)~jYg;bXJ-#4Krd_GS%J ziD*MDw`iX06@8w|q6iu+X$FC#<|hXe=Jr|POHnBt1@&upG{%HYztu;Avx7}K;!QcR zZY~|P{Pkj7GuL$Yl(iUJ^HV6vSn?d|D5rti-3gvg9|aTe^OELvvX1>wb3|Nm0E7w! z1Qx$4Lr<7ous!n&8zaW4q2+N1FIyX$K89tkln;PHoPe4VYQy5&f_{N>yG7b&xF1t* zM5W}RtT>H>r&p3nv`w72Kj~3m9R1n8?;P%8cINbDLrzu}J@-7SUm;Zg_3f&7iHQ{4 z;=Ed=Qua3E{? z8`BdCPzaUTf#0ngjy4bBX1e|>I`t6t4LTEI+CZQ<*N$T_V9XG1b9p}^8E%*$0*d9_ zq0lcJDsDH9-HQ+yKo3vptd7jb#Kx#|_Qy}X;S3~qBz0-`2=BYj-jm)zNuQSyMp+pM z>1R*|^pKc~G@8#yLQ+0&=3&=njlQ?5;^c9<4|aJ3Lq-?%x&1sEABtr#U%kMgecL>k zsO}tKL$@2haZy5>P=}-NNFYt6J=e{KC2gO32)1eUl4;pmKXb%~pZ8h}aLmSTD+@-v zJQdwKw?)yiu+&?y8lH;=#A^S1&}kHfiuvH3#;8bH_gHAlZ|;xdMVDca<^QEj5++J# zH|ksMeXlbu>R!Ayv&It0N@iLXUyh&$&_@~6-6p4zKh_HX;vRGMwQ5%p2vwpeN4042 zfY8$Kbp``noy)Kvu!ELS8*7Tnr2Ky?H=^@$6c(PsZf6#F1Ua~j z9DB5HU%|bnDCdg7KmOCKtP@`#L3uKFy|ZV1lCU_a=_0YOOsqcc&O~)?d>~Jtt@Q7rmMM|TCB(3)p zi~chcU%^s-%@O&d4CP1c=pKMgGh4SK0zy%DcyjXE+si3wt^`!g9Q{+RKC6svPBcwS zcma=NoTY0@rtYp2|0}*qeWC>RT-(nTK=#zy?qWFlR!Y{xn+xuEJ{M|>gql^Y=u`F&dD5z5Y zfQO6m?U*LyyE&}J&^umSo(ecX|3j0PYoR_-H_aXK9B~NlUTX0RL8f3f236uHBg%-=c-RSrN4=&QTKeXB|-YtLE49StRq+um1=hKw?mUPJUJHv`vbgQpB7Qjzqhbo4x~1`G-r|v5 zYiw4r*F{hjk!nqS0;6blzrO?$?A%sv%hI23##} z(OqOy5oIprowS3>9e$5LQ4OvN+x%g{S8K~ML0aTJcjQ#1`Y(NQ&oS4qzQ;L-HN7SB>B;q`z`jySWBMY**Xd5hP{7zNERX1?!BIhjyKVSen`4&iDRxadvVX2uiN$H!^<~-z z>yffocjMKOOA#aWSf1Oy`W=nRby4#%^@#P|8iNW6X zsmymP3c?p%)b5FK+>7kgekN7|cM|F<^8xzs8CAQVUU_F%oNe7=NyO)Q9ucI% z9FXDl-82d8#5}Dt>K2j1#AcIlB1Ij$w5CBnkpJVq&i_A+@*n^8U(5N*D?j0X{8#Z0 zvVRcqgZLjL;U2CZgcK;wh|^l0p-hu)nJ{Y)XUQeq%#lJhd94TJ{?!I?;D!S5NMIlP zN~mut5u#)P9ntf~4j~tx&+{L0W;DOwIc=_-3vaS3JgC$lJ)6?hPze12C@KJBAa(_! ztZ^+=0#2_6J)|m#l#~$j3X3`^Vu>aZW`ULs$Sq2h|D6GgOJ z7QCdwKfm)RH&6MO8*AR&h=kOF-j6+JXATiBPp2DN19+U!e(ZFzA2*ky{9U8+?|04{g`jK7Op=jk|&( z!2LYmng`tc_vBT(xw2yWbZagRg+7CJmuf7oJ~&avSk66R?C4EJ4|g?KI_eU(Zyd5B zj0C~ZZ^*TOzuMyLar|%(pAg_%`2#z6sc>qBJj}%FWq_sH#i-VCWHaajRswGfMp_Zjj9_kGP{ig*NW88G1b)G_&2LwTlAw?W@=u85; zA+@6IJ>f(2W46`$ai3_1>R{m^%!Z~P2a7a6Jca}!9Y2!O8QbNP*4(Y){?q7o7;TPgCEq)i7XEwvGxe2Vzcl z2XThnT@=wsb`ijd841;m)o*@Tlas%^-dQb3t0BO{`)_^{Tbud)wL9TO`h- zpQXgJxNb&hpfxjFb=LU=G+ne&98awtdNM+nHe}7Z0YX^*H*n)1Zy`=e&V=3J%16(^ zU!L?v0S@C!PG$6*D&c$O+5o;pcK z1<@!vFJNH2Y6L956u1d`1{@rR0j7?FGGfsnq6z%;M<)^LEdmP|5aj^LVPEb8EFAql z6iC&*rc#9Y=O|scH}VN~5P}jg#?=TU@?%_ZqVkt>Sj#A;A+-XWo!q^Ey!2rabT&cr zYS29XAI{}ByC`WK;xKmQ=UDRX|kRV@bbK<(Z{*BsuVR z)lt|X=qGT)aE`mS*T0?WXPNlMh9>sCQ&jfgk;<9-OL#9a3=IYT71u)=Cl(*8Pe-0* z0G}g_M^c4cB%Q}L?-WQ;3!|O}ZDeo?iA3PR4WW<#P7KBK*k=XV3d_`i_sbV9T^KUv zPGV)%yU|roR3w$rC{#3{in(1r{ECz8-iji$&JWqDjdyRFp%CYn=(r$jTxUg?bwMG9 zqAJ^hhdh_%l@yehP^%*osk47JiN2>hTu?sD5WJZOg1Vhyb$qx!FZDRM_iA_XEtNAE z#w1H(1nPB>p)T^bVEqlEd)N7;S3|Y6ZJ{=OjOi(>JY7KLOGq!B;m&1gxFLsSzA$DH znHzcM*YNK*{*C!baz`uLWm!n4j@RM)%+Mgm{OzU1i2T{M7%6jBL*N|Pie?PqCxg7} z3fdKf7;>aVHbbP`R02VT(a$XLnNBUC{)Nk!oY#TBZt?leT5~&6DJ21;06}Sn`ex6O zd2bCAn?&2&>!t&!@SWS2{v}r39g9rAw6BXlgETO-i><4G%=KPa0b94>86%#Xmz>#+ zp)!rSHXmPX-M{Gjuo-#3>miozo%yJ(DXdOFScNp5 zZb}6Fn-6iuZs@&dbjp)JpT-^x9 z{LWAvWFkUONOU;KVbZ6}5Fnw?#~1vFW_Kh6^A0{-j$M1Uj`Z4~P!o>-LgvY4nn*R;>E zo%eqXYWu_kIds9*|I_@5JO9#7YGp@w4iHds7>;Ea)#<+WbzO&o)6CGZ-tt@4PMl#W z1cj$Y3yt4QEAlFGIoe_`Csemq>nn}sHg4)j&;&NM3MUk2jsR1UA#uJMB@7+GEn)3m z9BcxFkqdH;QkG?uDUC zxQxw6pbcBM-$A1UlYm3=H7FirZw~67^oqwH_4B=D*J!xD?$Cckoh2~Ug(*#>bVI^6 z^5^G^dPi?!|NCb?7X_aG4uf5jZ<^++_FqXt6G61CnL&HD^r>5ijg@=wb<#g4$@Z5E zZ&wS+5HG0%`1;Emt$q+7J8X)EVG`fvU;Xwzs*$m>D#Rfz@}ln1_E z!uww0nNasqR$~?fD;S}AwmUc4} z3O=+!rg|M;kQpc5BJ{kjwF$r^x>4&Z3|jxF8hzy~74F}UHER$ykqj-nlu{qDa={dZ z3D9eZyKM9sZ5=;Zh!6xhAy@eEyP8(7+beZbX6-;zrZ<|EAV~Z(!pLbYd~2z)9L=YU zsG_guzw@eAe#ATWZGYoqt{CM*Rp8?rf`e4$!$Z3q3&2%)R+d3s+wDw}!70blc`vHq zZ8^_ZavWVj&1kUu%np&4a5J$R++?~W$s39)H3f2v`||8>=~by~$z@fQ`%7Fqg8i!} z_1o6Mx}rQ^&2hR!=5;uxoblvVW$n5e2!lAuM$kD=4jgPj9ma2kt)XE4*K^73?X-VaRWr?0Gt= zmZL^m(|C~TeZSlC(LcLs7m>I%y4`BF92^;k?!HVr!QE0%}31DMkWYG5ZQTJ4Zph9?kDg1@7y+rv*b|9!a)#NICD zsr%+vNW1ULxNyb}Lhe6t0C4 zaQvd<`jCoBVD4u_ogo(7Tn#EeG9V~=F_KNj_@>ewWhyYpAT09MM5IW@R%nV@D5w}ziQGXlp^KFk5X(~sO3tb&!68KtW?N0?2Y-Jz9m)(tfjvxa}O5dwMho_k!D zq{q?m)u9ELa=QQzoh9^5+$o;Bmp4uon1HErC`DH07t1D~0NEj8dr<{D4s8d1jFRi2bg83SkxnPW8yu2YB!3vL>I~B4d{b7qou<}*Mz0-967eJuJ z2L?ug{E-Ijg&vc7}J)|6`R z?2SHqjA>7w&oT9ApC0p+qi1{<^Kb-Pm}@^VQYcx|BDa9bR_9%MX@Z+OH*258%{xY$ zn254U8pK7+xq6)rD7tQv@|vjcW$y@M@^Ots~_K`{b4d_scT5pQb+*~Lo@8|llr8&9QOD>e#{%|D69JSY zYD4)@lrbTMzyHYd^TYN>Y(ja|Qu;xm3eyy`b>xNYT|@w*^U1@Y8gz!F005gb8$MrK zkbK3h!>RrJs#KKab+%Oj5VhC1{<%-pVSXd489iKY=+F(9Y41Qnw1{@;_hR)-mB6q#o~OOD2b4g& zn+zv(f_pNgcR;j}mg_qI^0P8L_}>M4Q-;JqquP=aKS9z#rdGUmcSJxFFlG7Q-;sv$ z=T9C?A9ts^UL8G5%JG@oUY)AId_ST0H@IqR;n=0v&Klb^7H$&9zn4FvR!eM(AYZWk zYzzueimt|k%6#lakGTuI7h3EPx_n!=EEUZ6{AGHTt$%>?S~jwfzD$}isIYmH96Mek z#0wWP+I}UB!PSI`2OTk3(0E0w_sQz1R$ooeYk5blb@`LxU@q0QnhgrTOCkEARBUh^ z2U9XV!WBt4^Q~m4grvQ((d)q?ye!ORO?Z#`-0s4RA(o#5`A56ngZg9*Dawj|cMxh6 z>%#cyGN=(N()W6B_wKj8Dy>N{JU>)~fV$iiD_90~V3#Yaodw&zU`fa`!Bs`aN|1mb zjGOjCZL~*pI?ZgkJEq5de>O~-B-&2?Fo)&u$s$Z|;b66eehc&_7_9?Si-7SH;6@1RzteQ2=ft8~Jt+ec`F9^D3WJUL?|mUdjh{52i-yZ@zHC-iJ*cq3g&aV1&vcd zi>$6d<RkE>iBWk}bxJxNOMW0Lj>3W}8R6Nhpmxn+(m&{kV1HqwV?Hu!req^vrO%_TWYvn0j0|@>^9tLq@ z9~+DIZV~T4cIFF{HQ&6jfVp7q<*n_SZPiFN{ zYO=#+bBCz?y(>)HiqzZoPSdWD`zpqwHf)J&SMd%5SY4jktPZD391hj5!8`0Bboulz zI-;9|;fEa+UscNrCaN5+x}->}vu9;yuyAtVOsHd_Zgr~o<)XoVIa;wzXL=$8aaB=w zDQaCSHO5^k=b8!(sz~{^v7%=IQix$c^4V?-n=zP8B47Dp>BO>(GPJq@P7m|-Ctz_U zC^CrK3a;QK-$rO}iT}!@+8F-}m4JM?BAiBrZ9ECSkENdT#`SZ51JWzv0q2n>|AUy) zBu7F&jSO>S*eA!c5^>m3_b}IZSe?!a;b2_Ak0xLc1c!F51y4EnUzSn%R%wUY3}KTG z=Du+`39ZN$@X|9?ASBU7g$At5Q+qK-BZ+(wCud5wrm9d0Dct)!W*hAIWD+63P{ki6 z-3fLQ4PV#lGrxp@0T3a-WUnJB#1M#(8~l7fKeyv)7LsvJ;IIG%OTlIbq&Kaw2+9xw zDqCIrbDw>6Q~-cBH$U$5bU_Op0Fdr&0DyvcD^Q_;I4|9gHNAu5t~4g+OmjU96(eq| z^REW}`b9*x|iM>86y^jpeo*lc<_C zP->K{D>5TB{xsr|0fn&X@7<^ptN@e{IQQhKkS;*h> zml5tt=iQdu(Tj7Zap=!@8M~K5?KU^ZW&2#BYwpj}&mT;;@;cGFcoq>>G0)=(-|&3; z$6fy9WUK8ew=JHOfgki4H6UORt_NyDfmFon*%R$?j&aHwSpxh{7ywXw!mgy5faN z*FRh9YJ3xA#?6gx?3{G}R60dEJQ|;>C9{>9%u{OK*u)L)%8XKCmP6W|QP{mJ66Av$ zpY~}W4WT@EBlJ6lS!L$ZB+x_tTwh{!SToj1XBI^cn^?+E#5xnWhDrz}SnmHcUoPDz zhT!`ep1Gw^!n>$byRAlr+m-Us334=?4Ui|`2N^A$6YUHKKVNN|#ZN*3_!e%zmD@N{>4oHQPX+#2->dI->oMvWY%KdmH0uYQ!>#og6 z!vcUk9;UlpE2}xU$6=flXaBCZkOEJD0U<8f*Ep&w{KUazFu)XXC@?-acC~^X)Cd$T z5iqjg1J|(%|H6qZ@$iIKD@ftgy&R+A0ewN4d)RC^Q&IOBE^?L7uvPwSyf^f!2@^~U z_m0``oxfA~kSO>K&UtjgqgL*dk}J&~$eR^Y_+$#|1X-ba6)bb`2fHCif~We z4z!hx=s(dRxm9O$fTYB(dG=;0#g0pV+E=o3<4*Kzn1wj={MG$(!}eHNy#twoBTTCN zkzX&FU}JtgO=ca+V_8?z6@oY!)&QVc;7lp~KHvAtUZmq@JV)3?lJ-z-{ zGF2{X`AgJ6cr;qb^|$z+?C?DeATkhdO5<>b`usf>IaSLv^)f^!HiZ`WfoH@j`xZPh zatjxNrmnJIfn(F>%P0EE_M}i5S*KM_##sbCTB^>zT9AhAv8)*U9k5V^(jKgYxkWOm z%&qzzw7=y|!2}?WIUjZR?%l~7%ac*J?mx;kMO};_)lFnF#RP03qU3h{5f~Q*PIKiT zKu@XvK!r&pd(7m^DVX^*NhA?6DgAAR@k0=S5M=Cvsszv$fk&PxUgJCe3Ing&1B{+h zw>Xgw`zz7YcwmC;mndq3)qoSN@*v)n?hRvDuD)EU=qat-{>c}Tqm}kdfi;<%y#eZo zxjF%2F*n|Lzdn`s4O!5ZXn_)zrM>O8nbyBi2J_^43=Cy)JuOMR)7jOu=VIz_H{MgY zwIEWSlfbI0DxXG*?$SCWdRlZ&c#Gv)a|s3O=vh`bdFzlE>MlG~s?_>~aew{5vVyJx zBTc>~nWWXPr`l`7Ur}o;`vqBdRp&BSHLBiy)K1q>f1$o$Year@6z0X~FdlEwRHZBQ z=(%+Uk$?Aj1cr}Bi{t1z_NH!FrnMB8Hjot+areCS^<(lkDL_1BOZ!7Gzkgyl)#Rja zT2oa#VdTpW8~UcG-ah46tY6Dn#o;xX0)qko;DDI~^bkzf%a&lK2HCXt&}WOZcOCl{ zrQ|C5QURDZa(_xhl1h@6KTdzsY_y{mZCQPZIj35jQ(DCJfxZUT2OvD0hUrH8%Z+HR zAX+eFgk1W@Z}jCWiyVKeMj3NM2!ChFgHTt5DC>pO&HIYxss^v6u|ojxJr_W^<%H)q zr$^vi7^2(5WSQ@C>^D{-LuR$u{g ziu9lW`YIP7xeAwxK}u4CQhj_qYZ7cLM0rp|K&H0^g@xx+t*_e`zbr_pGAJK~wVBDW zY+LklfByZgk=#a#Grc+$A!Al<{w0rZxzWUjZ~>5J;Q*57Lx0?A>hQPDLyUbc&sjvU z$3}Q6>eNf=BL}XMdqY0&@mrk8{Ka1bcQX?USuG;*EmhPb>iM1PDGS^O?A-KRcvx{B zNArHc=N@(jqeC@Wg1Cin&|Y=W5psezbV8$r{BG@lNVnR_n(7N3mJrw>imQPzdlYenVLfI zWk-Asmg%Tpb~Emm|5b_Hcv#%YKmiVh%mdq>?_)phecfHMAkzGPrkMP`rTF#H=1&n7 zUvKT8(%3N%ZI$cTGTIPWM(V#Ik)*2@;Dz*qsrlQr8Qg_($tR`ST|AtZr`dircG&T& z{mVrS@Q*eH-Q?Ew>j9Q4@F&~HWt?a|j}@*IHtg({(bgcTEQfcEUVkpP4e(M^8uM zd)3Hvd%ua{jUe5%baJ%}?(o69@M3jMT(&CCeIvyEng^ZFm1)cAv#ALRYuKXbTjpU3r=h-9vq^0olWF1_pfi9NZUmi>tY z&k^$Of%>kjFkw@XZ43xdC3K-=Ck9y=v#Ffai>b1{R`*;(>_*5FlnKiRg9Qpe z#o?>dgar|#2U4yx8#5(TECF7&x7GJZ`5nl;_9DL2H!313L1N7K*RprlU3R0f`8UNtApHHG2p4 zVK1m?7N8e;IebWGh=2%3B!MLX{0cef!Y$V29=Yo= zDd5wSoUOwvoKH#+=)Vk9V5dsN?iXcBb7t-$v*^&tIei548jKU-LwaQVTgJ&6m(`Eu{7g*%DryQ?woH`Xw%y%;?I&JPDC1=3(Y0!|==|Py?6$ z@e~0fyBYvd4qI?2)vCxrRLX%+w>>{p+oa5rvOQc~u8(+s9SfgGLw0>9CSpq85edCd z>r0g?dZ^;{w&Ia>H#U6cUj{K z&o^F1?0(R7R?SKAF!?yf7%e(lUejob$eg5)4701pC3xzIRkf!`qaL}(bWsN5xKUP< z>|48enx*N8%Qo{x>DqTx2@GMtScZI^MMzHhRg1=Z*hsQ_*i@5Jgm`)|+R1MIGeh&! z#61%4;V{AN7s>@U@q*Htb_22X#(SrQBTR{wsyr^VzPSk%EIeTnkK)9SlO+3kdQ6E> zueE10?yn31lB_h2sqAchBip<`_MNdSI;(j*)pjbcDC0Jjt1dhD+oFNZs{4D@Pb8ZU zckibd27IY~g(wl*5r1?7QeZng9GS>kD@E0~z{~l&3vEU#NO@k{bxm&SC8^r3Jp;0y z%VX9SmsSrM15N7wlV}C-N#2ARV~t6*Md12>y(YDZiaz2N?sollJ30_)@Sel`J)jyh zHtT=^+Pidg=)8`1#|Hn;Yv{D$>e)uuO7^m$N1I=7aWxsWut~@iMl*Towh&l12mP+B_>BBB-En(li zksGKs9hXVP|@*Y1;L}iS6bKp>j;8EWBS=w+ZLS2 zizY2fVTjp}I$~HpPOv^ZkD0yH>n>}4r-pX;^l^Af+S+|s36S9#`_FxBZESv(0m|Gr zG3nFxaepr!Z~JA~^TI~_nFnQ7qbvhQVLUy?PBL3qp#q3~?kaEmA+unf;(jrF|Bc`U z+~|T5P_F3gjyprj5*0w+J0ZF-43T5CD!i~t=#g5%c_l)YA6|$q2&7kis`nZ5qy+@X zEjJ3y1eYmSeH~nMA_eDY$0Pr;e{TV$kpG|BhM{S=gATJy@>jjETo5@-x81Quv3G(N z(a&h^Hh2b1Q99(ZDyUScG?3#1HglR;Dg|pUm6UU;4&Puww}Wo$>sYtC5{B9LB5uoS z(tVb?>d4c}-O++ZujABVlZnFQ*K|!6Q zh_qz_%8!hG7tMnZRRPh1QOp&r7faauB{uN;XWu!JuEAeksT`BY+TVgkD*D$gMsJf# z6Y$iE=Rayn{!3rUqizX{^;K^5HM!W$Yt+)grS_<6TETe;rI^jM?!?BCfLRal^0E3Z z1SFKXWII3EU{-nV)if|k({xq6Ebyu2IZht1W_R6;_BP4w`g(@22(M(!*?rc2rE^{3 zL>V5%SQ%4<9&lJ7;)+_GQwU7|qpZem_x^CK_= z3iyegweeKX021A$bsiwz+duz$jTdexic;<=ns|*OJQO_>R3su!y3nJbX$oJWjyFjFCy2{wjjx0(RKmrElXP zlU6$VvSAsdc#_H#n&!}tN0UyVJ9TC^f1H9^_ftVBPNzRv=|zwrczzQnLumq3pd!6ff-O(1LN69ATCcVcN8dTJXTp9&TKK6{~St z!s4M&i-@qQdX~WbLBfSGM2pkntLR@acH5s7aHoh-$ZxI-g6V`5A>b-RooG%*Dg{q> zK(9Sin0kkfGN0iuaJ#inKw-uc# zS1wN|z{gV^OFsn{&xhOyfd_!-MRUUi2NY8PB1SZrjGR*!j2aG?7wiCXHk%*&>sBt- ze6Wgu|9oRole1*HwiKsL{K$)im``4_a(fzSNfvRkZFj;k*}jKd3w`~`SRYt%Kc2`) zkClq;K#Yt|Fg&+$HVobK7N&7Ci}o%U%+z6BUwh1szQuA%xHL&46gMy{T~5TtOajIC z{!tLZBzQKpZD-M`qqJPyp+YiPck<{CrMT+shkYznLyW6ap`vjjGR=c*tQ9C7tq9Ed zA-AihJ!h8d`-Pw(C?OR=w>a2702iy{;NuDwCukhp;V6 zTH2h|G-ukr@92r+md+7-zG*W)F>%gj`Igc3s6elOHrb5QO|8;3{iC)Ep=BWHp$eP| zyTws(`46tzxvMYD`PS2BIqRn8oSyESh;zU|TI2VqQGwQU_qO36yMj!g|lfT`A=tX8aQTR`1gp@Z{#vN{b6cY0DQBX~mn9A$1LTJBl+=ls` z@2~Mhq4}hD7R5G9RFfm@J*A#Nqrn=2L_=KZ@8nb!7a3)Zv*CK@%irjPWhEV;46C^E zX7)e`NR;T|DHCdNj}JW9vcj*cLSOgGlMmZL#dn^OJ>`XAdI1Jb5P+ZJ`7j~_Vvx`lc?X6>MQLsGJD&Xh~ zE;dQIfyWJsGjkzQhRK=5GPcW169A9Qfch`gURgY>-ngFUZPO0fVA7_mogKM%p6&6~ z4s60pZyfVnXgRJ)+l8-+MHI0!Wt4jF?O-XFx$bX}x6q(oVwxknyIK zG+(n%ISP#ReG~?1krem@!`Oy^QlJ$^k6dqH4In+EQn(TB!kaE{!2TSSymoQLZb@F| z?sjmftquJ@qTV?;vhIx*J~1cOWMbQPGO=w=%$eAn*tTuknb;G1V%tu>et+M+b-QX+ zb)D)zx_j?^_OsVnYdv65+0w=ueWP$%UHy7AJYjt*dU9z$(AR${*2bqQQYB$%-59pt zOylWfM){*D69x)#!U8vg?_6q_ z7fy2=i?F-Obx2K_nB8%{+X&t8%W!neAly$=BMhzRH*-eSdmo+t#H3yjT>XH&>F*mH zb?OQ7&w*1xZjj+y-VL9%brsH$GxABVN>*)gFq2-w{%|`}=xuMFDqZ%0{V_gz^(C_b z@;J9P=Its5fiLQ(G-&j6J+22;I_G)FpbAWwk$nFSxN|@;1ZW*zK&9L~y{~t4c4!T2 zY7$neSz>BBsuT9Cv&#tx2>Ny~f_efwA*H@2WdqY@!&)!pHS(v$JoEUFUjf*_`7*YL z>+VhHPE*~{%&pbT2;{B~pN%SUpBkA{da8Fb0oXSv#(ElX@eNl*^4T5PM+2L}YF4Ce zDGPvwu$!<$)u6vz?7Q&eGv=F=l)xEtC2n5RqTu*=kl!GoCWS04)S0~n)WI< zCjGnBKjftKm?*#E&Ku=Wa%8HLt0tBZc%qu$Dcp)@_Wb)olLNf+UswJpJ#(3PL6*(& zk?c+LEZn(Ro`)62OV|QnU<5OXZlKxuo7NzLox*5Y(Ny9@1sPD4%O&(EgUwx-jpNXI zCnlrYa?acwX`l@VP5=i;#{7pn%5rW;1c#WQa_RH(TYwwluP0zW+iBRIDm9i7RUbdq1+QdFuZMZ^~{8BCZ8;w^aeC`al(?M2R z!igAh!6Zb`L&d8byBX;bqUBJ>s6QBr0AH5Sq=V!wj8dRHqcD3uw<9ZP2iIT#o8#f-687f&qT2(-0CUfP@)&(hk6$xhNDr(iUC-FI4ND zH3I_}hEyNJ<~HdmIpRtXFisDD@s)*wF9B%gUN@!aih)>ASuezM9|uq28tW_{QH%w7 z=>>5w;=8Qv#~wzs%7A3AJCE~f$F1tQpuw4vIs>ov+voxl#e+-NXR7q`>j%lhZ>_PZ zoJ@P~pdO7~rJzS!h5HGEf6!h$4;CsIm{zG-Jlvr#HFXI55l9ka+RmuG&78OHot!+a z{l#fCFu0{YX`P#FlSim{IornhxMt*3LIvZh;gsKu10x3m5P9;NWQ&wduRJ*DR8$hE z*(l(8-y@wwri5&yqUo+w)%~N7559`JT6fuZ);B+|Uk2aXj1nn^_cqP&qdLRN<@puf zNING`AQ&4@){*(0_pNYPzu_SlM@DMR`da>=>o=;Ul*xcW@#v?W&SeKkK=7K7@Y>(UC2WgDm6 zv5)47{nv;(0Tn-bL+LvnmLEf(MRk*&*v8~MjTo1-j(doD*E}iL^WSc3@4Vjfs@8q~mS5KQCS6Q1xjKj(WXI!#KU!e#WtF*4Dcm zYtj1oV=DuVRugUu66n2WEHaEgoZ?k$8J$wOe0dC)m35q4v8j2(bsOHIL`=<}hW@N_ z(he>t|Efr2!8RzP`7Lib<}b5xKc7OVpd=-u&ja|*#|+KJIMwfc=NEjHcY)7=0ma(z z0dzcUa0{Nbb-4dSGg1COnh6CoY0`ObXa1v^!ayhh!3TtH5K{l$t#Qe@uwCbNrdpNd zZxoxhXAHHT-M}@qLj6duP?w9_J>g`;&KEixq3xK>krd^XS=dJ*T1JN*IZ-V!5QQzl zJZ7t%Lc=td269hHxBot9HxyCg62*i=h)|9b?mb=e&B`EYQ_V0a=P;2uLRnTVCRhaJ z7a{hlvSS|kl@@Pce3y%0N<-jSgaQ?j50mZE($GK|Q9KR=SmU7+L}ST!QQ3tIu+$Jf za^usku;1bVcMQ8K*-`74oDwYy4>BLC8kZ7^3R&bQ1X&86FUMp|WSGU7WW9ihovXE3 z?iR6G;KSbW08yqSCpVA16${Lgn^zKpeCBUd@v9JyB9#%KXknu%X}5K%Lpq`gERG)B zK`xk0<=mBsh&USqP<^oBXQNMFd??G!=13pA zS#!tF3CY~;v6NL2qxsv51W1ZP4&Z7%k3DGag753){Mmfw`Uiuw`d>pl0H}xNK18p* zu-!RCAd_|6>|LP#why24Fp(Xxdg~%Ghd;eTW0W%)=}Ve>y#`i%74BV28`0A2RPghb zIOAXW#v3k^S*EUL3%z~g^-hdi@#k~Tq8yz$>l#C?7}3zbDk5sn;y z9?7>|#fhlRaT(e%;4}5Q`kOMQnMWVieNusl^t#lhdw{}z&0gm}!QtwJe2tDtyXqF2 zu4vlf2q>OSXLE(jcraf{iNl+oT*?+6eQh64ixP8O*t4f!AS)=%K&wep8@mJxJb(oIz4aIgo>2MXHs%z zw5@4%4Sr%vNt;%4e*WC3!iw*g<+M|uc;+q05g^<#n6IYKNf!k&8}N0QZV*je<&xDA zjW(>^J8)=C%D?Ixn<#2Jvzot7$Kv*;&V0hILM#3i;*sfWoC=;ADm4rLJ|<)@@IY3E zVpmDFGr}YBJ>N&tMA`^|1ZvU3#=M=m4knNP*~C0D++MeQu1A|5Gjw;JT{~m99u|h= zKYv2_G_H|Jh|>Pr4&W&y-{(-P|HIZ7amAFI`~()67mz;=ihF4O%LD2!MjF>-UDQUH zB!Xw9nADm0`x3VV#bf}_&fjW@;RtZqYIND^W_?LUgQT4w!Tb^*Qc`K0i5o-z1szIL zQFYlV&5D|&d;=AV9qVvGs|h!B<8OZInah3E5jZv=gt}w64r<_$S*HP>%bO_=b?yEZ zmRRVwcGiP$c3+!`=pYjVKH+qeWXWNl!QtqmTCsLrsWy<5zki+9Qonbdb`y)#!a-jp zvgGr?EFKB{=)qoz4i%-7rcBQp66b&RA#(1hoATX`ZQF{C@87GQCbf~TLi^;tF@M0( z*XyH+O;{w=@LOsU%y=Fjc=#7CcAo^0)ls?gF;t>a8vIe@6fEm)%~YPfNI1T710No@ zHR74;$eMcUEjYN(5nrAVIdFuv)mPz>)AJky*9`wSn7jQGYl2-Y9D>I%r1Dk)-O|VyJOV5j0;E{4O~mHt0alMV}PLX zRya1AxV$5_*7Nvwcp?(2kGyy>b2G?Xx{Qun7h4EpJSL==1hpPc*o`rLNPH%Emw>Aq z@W-TdSG0l(8gRrc`4*s7#toB_Ahk<}B26S2K*see>K79rIwFAFw(7XVKn%#LW03w< zZYZ!4#z5P-vgAqrjDHHD*8o|n5!f{nCLnN$#~aLhQBO0d zeZu=&GNiHcd$)AI;C0YS@v4O+MK&@*eCbI1+tP<;ON0)#%gVs8=iZoQ-+inOxmx^* z7$scEC%?;6!}kGHOL$-l4)+gP1(jTmeQ4&yu8&Q2fwx?WX#;*BH~^uD5GJq>%5O=j z91!UeFAlxmS8sIj3D80`@$NPYlVU|}7`4vE24Q6M*rc=AQF&;tY1Xagp^qn2JR zQjhXtVM|n4OC81vJbW&i#w9K+32MB3*q`@`^!eWxM;KpoQgc&m6eqpvYkJOAG-3_F zFo4l#{>XWIB}F7~A{Ji)Fo*%B^8h9FEL3bNYY5VgKsi}gr|b|ib>irw{exv;Gj*uK zrX@(SiaaY`3;%5ntSc%y780nZ!UKi9*pBDSFmt`fxu?vPOmc70bOmDn9Bu3g3p;UZ zsL()^ud6wD5P$`+s_$XJTz$r0sHR6LM59(>H0$8a@$jqpv&TdQqPHx7G0LGp0$>s-ZFk8f8>!H!L-jvn_JqE$$4Z8U&3%eJx8L7ZJr1N|D`(2zPBD*TT=5WW zfu&%N!7)Gww#gNZHxEZAPlwDb%Tmr!bFt8E;a$7zp+WJ-pjRye7Jk+ZY1yT2jo1>d z4ly=5Lt-epP>vCW`pV&M_;B*|y$1$m=X))865hSWeI6wY2y8DrbwiWYgP59TBL*33jJz3EmLa5I>TQXJ>H;r5yI_&{i1QFg8-ywV&2*LwpnE zxp181DY|`9QvB*8Ed_PmLnEI?a2BQs;wyvuE?w@JJm@pzcp`fGJ@#`hC$K7*r?lFC zY?ri7TiO(9ZMdbq4qPc1?*)|GjcyAi_9JYYl><|7Uma13*^>8P=l`DmC@Nb$xlekR z5_Gfwd1*J@t$^_zBOZ_VkZxb5g)}=Mspe{|XAS$=o_Et$&F!FOS-4r478+uqrdgMD z7vXw+hV6tY6@r37Sj_C^y+?iB-iLx1LT6oTqJC+!3TMIYk3Xx5&hAOeALgLTYR4)y z0)y9M`IL34`-^nU+@?kK#oB3F%%?6vP^=N-ln5hHO(#iqPW4Sp_Koue=Sr?9b(fnQ z6%w282Sg*p!HskECOP+5Q=O!*!)IhW?kN4edD1kWi=#)5H3^87*z{ZjhXUYdqo4>t z>fG%`lpt9j$PBAGiVX@+o?yG3*1|VbRSEh>KSUxbNJd5{OEAd5fMcjkERDOrqy%C_ zy}3!xx!=0QPosZVHrVwP#^e?UgP%0t)Yh1*;@xW=<%ZKqrPP7OE&n2Ap*(@lh>V>vig^ZB26soER z2MlXiRwM$#7dMF1)LzdBgCye6HlV+&_1)J7e5BH{#KH8BDvIIH@w9!n#L} z%Z5nNo*k*X=W~bMa|(Oi>v08Z;^_2~AHR@lsH`yZH=?oVp*?$dhK+(U(s!b;R6!8~ z)i;&s1($w$i5?{q_LU7pzSD*|uL$%(64aB0%LVgLuYVs3mucT&f1}EuLja=5d>`*% z0MWcqc8lFxtI@N`jPSivGq?%G5tT3HLHqxIobW>>^SC2{*M!^;K0H8Uf8d)pjH~*) z9o{E*@mSlsv{yxVUSjjbO?gH69ieEieUE^UP@G?n=pyAjrXnTzYg2?m69YQ?)$fA1 z&5L5-0qezn{J!`7#7gew=O)*0{7p(fBy!J}HK&S!7*~P)?ka zZ}&Z#_>VWPWm4c<1vw5xLBF_9$c1h%#!XrKvf@!YZ&!(rK>h-$%tK!qZ%jij;W22h zKCh!c_xC`0$Nkq*;pSD(8drmz1q0!B2mLuv8ig zHg&^HXMVa#!$1S+;ZGaF-Nz`;yTs!(41qx{)hG5x59@%}RDIL@iRI5XnUgCEUo+n6 zre!X@zZW(x!++YoJj=scpH8k+ji`y`D+{||QG4+lEj{~kKC>%{?4b9W97?3LHw9pE)e%z^x&)gova);u}ZebuGD`#45{y-&k%T_aa;B2tR-QfKr`3~{2kd(+x7@! z(#MNX7GrYU)LF(sPpAiqt=k0u|uHdFnertxWSXyv`QXcNlX_% z2>C4+Nb9x3&2}N%d`gMXILapI)T>BTD95fHeB)T`6p@Rcu-@qf{6H#~!wl(0_7XSQ zh&{LVZsZgVj6Z8mdRo(-AdOO>JVg*X!z?+mm8C+voCO;;ECZ|e7^beZB{CHW4OMN6 zgggKX+tkx+6>j1;zcq4!=x|YOp-2e8jrFeUh2_m^REU6`Us1cS<^GU_QbmOz!on6Y znl#R*0z(%XOY{pZ5#=s|sFj83vm){3%KB@9ov){Hx+=D!W;B6C;Yjemj^aq;;al*FRg68j5#2^kb_pIe*=A-~ z2|HCbpovQDH@qjgkQ9mFgvjmMM!zaPP)h=msipC}L}jrkh1^2)E5mjoFhdGE6VD525>&o`XbGIa83DIoz_d?~k$fb(9=+(U2m^U zde^;zO>n}X0$z422fMQT^sJW>^c+H-^zxhv?@>*SAeWGSW9tsDXB(G<$a9#?JU5M! z7VI$shnvP$H)v-=!e~R)#Hh4&IXs#Q#_^SN^a52jwnml}{{FYAsW^FP&ayhPHBq>pQ&JP z`^pGPa_12V-P|Fa0PP&lL8c;^LolhIG z++N)KIFIK1Y;Z)nV@mBTtPiQb81k)%(VtYG!LO&Z0D*=HMiYN0!VV_2AvwOWPYek32cnE%v6NE6)_Gxt>j)z0wG74|SD~}$@u{InX{Wp{HrH{O5SyGv ztK$fP#a8`ZtB6GhVnL6}LbMUs4h*5lJ|a^f>hH|!Z0^8{wesM>bJ1g%kwS970GHNb z6$s)aszYJrXHrHQF!%uQujWV|CaR++%ho@!0WiO%j@#w4=a1ni%3!LlOJ6Nl*=W=qpGJ|8``pmz62h;Y1+K2WxAo6CMAgpj4{>@vgGV=5h%1sXvmVU zd&9o?uFsv;g-Ra|8k0vQ#xd3Zk(=>}wpOz_)1NvuH7__|)?whiVu+kpodROPV%G;o z@>GOegHufTc9r2T90Z9J6GtU9g}_)+hChA&N&TS-jpl*k#*#nPG8l|Ecv&b=d3J|# zsT;`=txKDqfqYwGBX=L^u+z~vG7MF3)Znhiljpn|*GN?AQ4#lOoIHaIe`i3!0yREg z@((P_wLw-B1ktQssl4mdqq>YzQYX9{`fA&{tgwK(7Vr7RAz`u2mAh;khL85AyQ@p<_;)?IL2+%LRs0c%p)cyx_cA9L$iPS$fDeuZXvG(aE!@|KP~|R8;g(vFhuWZa&|T&7)Q23Qi4-B3 z7cW-Fi)9^&{p{+{N$DjdGewM_(ukDG3jAH%Em${9(AWwiQYt*4MhhIV;Gap zlPqHoy(j8Y_Gl8~Q=ynBu2)R(i2KdU$wfP(l+$ZYsRiecva4>&$!!mTPCmff4;=77 zQ*#_CX{?p?z4b|2>I%Y>#q0+{V?LzHw$=Y9Ucw3BRjVC3kgCr8RH-|BDzHL5_Nuxy z{fn81&0O%?fj(+|mhK!TK3^?tE@jfH9nsA4yBCTcYsKa5$vn-Tv%*uu$CaX4nm4M{i9`Xwja*8CTx z<{a8ryVfyD{%;W9BxMYFY3yZo6f~o7)wO;>T^zle)6go^jEq6lSjow_mVeTI9R93= zJCt*|B>H6Vpkh-_VW;I|L}ned&DLtHIJ|CJ*{~rmU|z~Tcn{@#exzZY1L() zmXMJz^?!Kl_)gI^lfDZ(e)6NC$5<9(a_jyD7`VU_(0d9>;y?S=aUS?qzNrc#o@}V*&(dwYG{PeGAqPNB)gyNa$DL^eu%+V5mkj=t+r)b%BNP$~gJcmpgb% zgdc_~DxAhCbGVMTy_0}k)hPI_9=7*_4+iN*jinuMV(34m+E-F-aEKeB-CJLGP#hC*iq&OH{ zQM+1t=$7DPi1maEzvK95Lly(a0aH|EF1qMY#AIL0RLS(6>QjV2XGHdvm*%hC@LLR! zGANs($fxS#cnq{7u434a7;a!JJQkP7cEwk=8RlCvxygyP&@h<+n-xt2=t7 zf(6zvAqf2S8&E^-CdH{vQuv*qgN2nXn>!ub2sd8;h5>YdS8hQFY)vmu)AvMNTrL>D zYA)sqh{*1xy+0!Yp(AKL?+c!bp#O$i1?$(Sb$c;3WhQS)cruh^6uhIFw~a3|G-II)@ok$V8i*P452;>aZKWWM#t~W3u4oRk3BLCnuB*HUEe# zWxs8f6x*_d)N7JVIHnLNRXKW9OKM7VAO01H>mXBHtZcH@Z?*=x@O}GUjpag8%lXDh zywndBb?iri2=&t(ntnRFW0JSUNT^l!=of8Yto^_#zGz4$c&z;-e84|2zTOe%pk{QT z2w~`h@z;|k%-l;m#D0AcO&bq!m!@>TC9Du^m5iscvn!rv7R_-C%DbI_+fqvXr4v(? z*RS)eD*RS~8XC8`!-ZDN$=1`w0p+PoFTQY%t}_oT9J1XTzR`iAp!YAo4&X26KF0~c zW91}52zVl_e6LP4K}%&7qTk3Y%W=z=AxjmRHit7h`{*5*MVb5dZoK#CV<%p+VXceEs?Vd}vT7Sm7_IB?!Ir}X^M(22 zu&gBw0RD5~NDpA;CHycausUuoTw}v^T_a+kH>gi+OLog^9qd0z2J(LzV4`RhR z|J58ge}>IfGZ~f&N=?+p@Ma@%YHcjh|28>kpdolN+CGKXulF+8sZZ4{4gsL)TUCXR z$PQjiG-R%*YYf{!{mKlmENJ?z`K5p^KR7@1_})gqsmpE&`l}@lNflOwKd5O>lsb5E zX(|>y^B7LJ)$v#L6qJ1q`_TQO^ygRCw2Aig%H|}r-*Fc2;kx*0Gd`V{J41QbS{h1i ztf5Fpk$dlkb_eYM5o@?xRa{mSFazi^r`fv*pMHo;K=oZ_~$)Xvn(tviGl z#e3HK1aPgyNJrn*Na+y8e+`B*9>?Z(zLSwq3`G&YgR^O4Pl7AMOer@K?sp|0r09>_qx4XfssixGu#!tkps6m!BphCNFWq!5BDtz$ym z%!|C%T&tN{?F%)zKN%eD+?>|hv5%-ZK1ZO{1ZKzKPlCj|5lBIv`xaAECee3 zrOBcm`}60;UmOkZFb_s84eqe^cS;1ecs?9WkL5MB(Nu@ypc%LFs|I>(Ukri9oSKO>>f}&R;DykKIjo0c z+abxR=H!>dS1T~ZAF?`!9nN?DJ7jev1q>6BX_tEut?J0Rj1B8P`GP6?r*Z}h;x`y3 zw)=2zrJ9XguN;3yg;a@6C{V_?4OkDD(LQ|u>Uy+eE&Wd1#_XcTuAJG|!1RHFi>?TW zFnW!+R?X@K_T&jaZvO5IN3VZ#FZ@wak9GIZl?OXivZe>-(W_0XVEX%Ot-BdrhyaEoTn7m8ZB2hz@&yo?9<HA8UWJzD>wl!>flyY_Ko)xCLtztB<(QYaMy!_}X3c~jY`ZHsGC zb#+a@AOTm=f_N0HHQGi4i_Zb`KOSEo4>Xg zUMN)hwpSHbNsgLB>4qcbxCu*4GsuWH4jsn|$)6g77}h8dRaa$R)5J^=-z1BKyGFM5 zrs9K9rkeAa6}}@$W~kE|rbpw@DMFiQ9zl1#V|OpMP1RyH)z3SNxO zr#{d0;k5fv6ie2)-#0-KLc%GFh1A=ua5|Utmmba7H7ZMUwZ|D&!5LdWp2^)bTs|~x zJc(gk(z{OFfhnIg@0JjiyqfpTCOx91-QNx~JgeDaHvddcOX?x%D&N%Pv!_<-~30dS@>jcYN(Tj{3qT-uXw_{HnIw_q5~sk|r;@zrn~vU-H8( zGCJ+u=>@9i*~+y1* z5*+f^@)-h~z0ak={pbrk9<^wJgal}=lO^|mjqsm+L}x}hg#zMWS@WipzyNjY4&QGipr=#i;lWvYG$h{l zFff396UI({_p}U`_0A#|TSVvwMh!YB)VmL1$jd!)r@~H}#ngaJwOdewnL2IYx{dWr zSiEJ^IroN=1irMrl;JOYc)CbN$k&AmN8AxJJyGXN=nn3^TerRdz@yG*GV%H1gpJoD^(| zJP;CAWXd9wo}zl1b*c~Vo50SHz`<>#vm*f7q+4zST5IDzwzr%SLWZF6Ff1Q2PU5eQ z$hm!hCPyFt8!36|`KUe7hw)-Yu5&l|3CZ1G?91jM#>qc;6M@-|b_bUfkOr1fINzZ>nGPZEmXIa=Jb&J99ko&=3SoHH+D|m1GAeKP2mWejpEN#U` zL@%iF@kBc0MehA+fu>U_nK{yWJG~Uu_S30F+?8y@cCE`YGsU;R;a^5(<^4NBvcvT1 znRmhnK4bPu_&wKrSZTp?tVG;&bym;H%%4u4mdj*8+Y_8$gZ_MjkG+GmoW4+hA`>oY zlDfJ&V$G3|*j}qwb@C8%Cp0@Jiu5koW$_)hFN(5|Q;N4c8y*dY(pz(IBd|>GlV!E{ zN8#sFXNYZnjbdf+C0R`lt=DXN!&rnw>LMaR05-|o=*lpJ>xt>U0%Lj5>|hid!~8DX zn1vfgBMMr}jp-{k&assSYcUPjIje1xy{ajtoG}bNMk{$hC6b*D!C0^>LG#I^#X?ZT zzuNCpSUiWSxgoo2giA}~NzE}0WD0xE>rMA~x^xWEr(ab(ITCum&9VMGLh!PCX!ZTOi!9ta#E%zaOqZiBrZp4o@Xv#JLd_d3l~=UaDE0 z&p9TT7)t3ghC)$;dUq^*()#Ip86X68ln8;^J>s!2@1nfpATkYvf{O~>BX~nbLxU-@ zBI#L&(9utD*GYo;iO`YLOy6%CCO-RZa2hQWHmIL= zMXWIV7DXYH;(Aqm)74e1H4UL}B<2NBM3BEwV6=^wgu%RMbE$|WHobupV$e@Twt)!~ zaI0tBM2Y$(s(K0d-Dxm+E{@cV4Up1ZZ(D<67&QUdo6F>c3Gsq4M}&>9%3<%w+=Zly zaSIZp`V}w$4WJ1I2t!5cw{+F1160Lxm{u>XB8fGO*$l$}tx`Yb1$7xc1`16a@%Y>q zyl<{a@r8CK64`~wsbBfMbkz$?FSXRc4{bHm<8Fgp>a4li%^6cQ`*g}qtx_tK{tDN8 zx;qRIyE0VWYtW*0{(7>r0@0gJzcDW}1wB?E_VI znVO^6M1)&C#`W98Lz3EE2w|UAwX5mg_J*?cImIG!xhAiNUgefZ(>7W**-0_Jo==7~ z_S|vW3IdGk_rf*uSrgn$ya^$^+trOT6`}bbA}>CRmqweBEU48FQx2FPuIr6~1-JT>#SJa*Mg~9STu(g%8H6W~Gpb&ceh&vW z!0)AiT9SB+fdhW`d4S=kam7VSzI5-RxkR@O4}tIR*hSQprND6qWcy`r`EbZZ%wJEO zwgwIo3t_5>$$n6PUnpKbnR;LPZ*K`Ol=Yj304ix~>YELdvC_KXMvymy!b#)D{xYrT z|0Jbe{(u*&Hi=MSjr||5CC6srwpfA#129M;B=`e0XWL7KS z0e5DkIlh}cJQp%*XIWxJpX7OZIzOXAT5%oI2;_sNEG+S{obDhJ70csUMc0zHhEH>Y zWjbEs4F9W{H$1t8s(K0~2Q0PQjWHnulR`b^y23&5K<@W$9zZNFRehMaFV9(62uu>p z101Mzw}ATlhhjBVHWiJ#v6w2rgqV;XK^O1`ApBlJ-^P>VfEf%8U($QU1X4G+oFEGe ztYNkO#1rl$=8@jHb9SC#+0FRX8_B`j{9P3fhV$ch^=I$>_;Fq;K=~Buj!wT2Jm@<( zuNu(zp@ts+htReqe3tLB7W;&d6b@3Z`O^}NCH1Pn=BZWiMe6dJy)dOBAo2xS6LfE4 zd8v#Ef-kXjo|YwK*$=CtSz)CD^FA9-GgTHs@ACjHIRMC|*|)?uNKBlY19F2cpZc#? zm=R;DVS>K=FYmrVwb>wqV>-)?dz^jkmwVSfKg;nwpFaa!r6a8km&ojof5?q%$}FlL zkMbfIg+$D?O(FkW#ij;2y*_ERZ&X6U$k4AyIVZ+@Dh~y5EN-X23;pPXX)Y{psUew@S+?KdV1OF^Oino+dze=Qrm3I zajuUH`dqGKZE~pNxmH%1Omf99O(OI&AKY#E4zNE=XSW4SYWBQTskiE^8R3jAw{6Ji z>Os+gig^G^|B_jvuY&_@nwu2hkd2bzcqENpIhu z|J2qq3*3qRc-$=i?DB{;@%$H@j<$8QgmD!=L}8ipX#!g@6SdY~WspCzJSFyzWCt?$ z16@UJ5L6HUr;iX79lvI&492wHk^S?|!b3;my?ksWM4yS!IFN6a^fPD8=0~H--xzJB z(p<`twiyV50VI#VorKssrfWz;i!kA`&hnEuQ?tUYpZps~U*g2xHZ3CE?c;}Kx&XR; z4GAbA)!$`%>@ngZ@0{=N`s|IFN$7J<;&M73|z&pVnQF5=pa{JU2{IXE7>bF%w4GE=o=rut(f(v;hM*XtYF^4)Q3r#8rx4hFcv47q~Cr*l`WBILV9d9^O>moI_jpt`@jTg;fAzT~IV zwJ2OTVHrU`r6f=Oa#OW~QrDWnAgj+DSD|z)zdNe`+ovPWHY^pnNiK@KyF;R2qC#dnL~0r_j6>-qel<&-F?8 z8ljS#wl0hr(vDVXsFcV&{|{Ky;U1oY#|wNz+W58PjSpGshN71yEWBoY_i~fxSh*{Pr7iWzudVK;S&Vt`55$-ZcZ!Q1-4UJ>ICvk zb=@O|abpN+tR8nyx$YUt`JWZ5qJ9Q9aCzSr4>kL{L0Km=VN8ZhV5Pm-~`ZymMETH9g8qm9|PU`m6Wx_=5 zh2;csGvDCVg6_#D3xPohl%)bHj-VUkw`}b^=eFhO&v);$kHCdMR}ERG>278c3H01$ zDUT^gP)*-D=2(WlhPBOva)!AoDaG*jPdXLp3XYn8zj7l11vpIZqVMwK`?o_!3iT}WDO4(9SH;5A z=oKlzi9#{G>YRte(F2J?E6-VF;5`EQ{EOshzoRREt|3NYn69T!nI9Y4u=()K@;ZsJ z?_X@n?GDx-C^(pTQ==o%UAGEllV@X}PfuT_cV`^%<2ASL?%SND!T$z*hwumqoKN4> z5JJY_pMM3;33bP8Lxm5WxFtKBO_rXq(WaNd<@lYZ@gxcw|^hBj{4}zycvu?=8 z+8`z@ApvT)bVh?7hKN!ct;a=Bzq}LhMtIi%ehpB>diTV zRMI|GRt45pO$;uk1cdf>zY$`xfWe^xs#doP^=}a+o#-eypyA0M*<(AG$nbTOI)2IU zE)<%e$@-$iwK2DkvT;P?Y?n5b+QWK?-H_TEFc+B*D%~0gR`1Kcit)bo)LhGnBvoFm zMsnvkt<)@|4@Bt}SbIG+)C?miH#iOPK0GS-B(;#e>ahP!(cVeiDNE(O&y1`u5!sZk z^ds}^IBL9J_kVH4JJ`j8dKQ~?sNiKCZ4@9)&c!HS93v90V5P@Gaq10B7-Vy{(JcMp zFREClJQN_MDfvwuO0Ljq>7w*&O64VYRPoPT+W^dU*}<7@Y1D3{f^LsBTH6T!&Kj-q zpv4~7zTi}4sd4)Y)<)w;ST2q$r{VW+!#g2x2?a8^JdFOEl-Wlc*ga;JKQ?HFWfUG~ z@p78?!X!pVKRVQ0+Hzd$qoLAur40&87(;>NgNEZ7B zW$aU9f6COYRi*YdG`Q@Fof1@SOHLDKw8&syysyP}sYPVplCz|dzh$AD{~=TweP@12 z)T8>Ow5;2pwoQb?P9UUn{iOt^CWoT^c%U>!rLZ^c2loPv(SFqxgVbB>d7rOI8Pi^h zD{axb~%A7!9C??8rxiB2}dPa1i~XyEJ? zF^e|sw&@Zk*L{lCk6n$l-?@IT;?3TA@$t0Voi(GsQA8#+hmxfl-u+X0EWSPa3tfF8 z!GIPUhyE3;*odE4X1H~$nhqxQJkcYpYV3%pRKGEY3W}OiU*n2pka}(n#ICPf?io7@ z5|xA1XSukT^TDDtir5#-WJi)lWW@M3?lluIbJTe=|NOA25KnyqHk*AE<7%nN@XJRW*g z&59Uy(G~r>NqU%lcPJk0H`_3kIN|BOm{rhc@f)sQ=k>%PrI-rjcgGHajK; zRok}V0|vlaR3ugh)6AYOd>=PgF`x?1tXDsyA@?%w@OWqJVE{aOs*o3tDi|b``xf|juP15bnbyW7>aXM->EP{(M2eJL-ppW|~ zyOf20uAfP}A9rO-oD}za>i7{Tw{bmvdSPc+RM78)G=^0xhIsg`Exh#jgIr86_c|x2 z!ZXL)DO=gs%4N0nv7{#4mH`6=3EDczBr6nxCZF3_6|OHA@fDB{qC1A+Q?CLk9k~=Z z-OUv<6S#>b;ikVNWM$Lm4&b+xnO)Z;@ai5~t;Z&I1{fQlZ>XFNSR+)kRlxR2| z^`RB)QW>&dIq1g2pENiy2!0fmTk%+w=9vhz_5mhp$z4!|m)WVXR1}M)A za%Xrt3aAAwQP4qj0N%Ku?=Gx^!h6|xa?Ry$g~I<#A+U1YpshkWPn z>gPK1ZLzy<8K>Pn(HW;A9)GU;5EdH#vb83wVC89eYE`mCO?a6v>5TYwpEktGa4w}A zqX8os3pb*HBk7oX?-hC(Bdgf!ZIb;VVI5@~Y- z-u0-Aa{T`DkcIl`^>%VJ3S>|>EzNk<(M|e{hS{qUdX!51rlK(ML`f&wkvOMq1gb1D+0_S)H#} zmO66Z8qw@WVn-=tD(P}3>k8zKqbCMC0y{wNiKVJ)I#TTnn^h|a=CDrrs zzL-Z`fTLgwgMND^SR2Ya2oSs5lpti)^jH$iAXw7gn$;?gq$Esj z6x=1;q#7R2%3e$y#Qg2*93vFlV^>H?ceE$Z{v_h_>*tRNogZEred~SHu;9p|0EOyQ zety~5L#UBvgmH&}$mFmaefNw%$HF8^`*vG>OFU(UANg!Ui=6fmPH&eF%%9Sg@ZtHC zRH%{Q0Iu$?3CWrh#&1~U5Ruy?}1t?LBx-gfx;9H zNrYN7XqugGiUHWcOc7A14nw3Z5V6h&9H^||)PEQyxa%NipWDWP=|0Y2XyYln==*QP zaj^u)%Y*oZ1DkInkv5lroW9*%qclY zxs*L?VKYR~Gw(Gs3W_QTsaG`Y9-popLWK)Zi8jV>hX&zp5KiZ|pW$2!wFG1uyX|9% z`t$xXGO~`>L-IAG((}_|EK8)K;#5pK6PhaaHO+qY5wPX{;%cv zqy;##z9Q(}lX5I?=J2wfZD7fXSYbf25T%Vbz`yUvQWi)>`q{D(PKx+&t3x65q` zbolqFj^OVw?4B?Oc^&1iy6HjWgY)t-8D_`5F*Uq}ot5@J+A{CIsy(M^i%$|~#po)- z9Ny5;oVxiT-+P=RJNXO>!`c<4ug`RyzdZ56IIo(ep%a67UHt{=h$2LAq=A_BA?|X2 zBjJqaew8}Nai}zB$jDq4KZ-TMdA~h!rtsDGm@0xtn~)Y!MwX2yYp{tuyE_r_(7tP> zeK@#;8XRY_O}lE3s!6QS7$^ut`A)pp9=ZdIQ`>3}nCfWx(VcP4%>u#qKN5Jg#lzX@oK z*)$HbcI+aL4Pv?m@j_WDNIK@~lRM?UiI%lh4JvB2B=U+X5nol2p1zmeeO@U&ZA+HN zTz(wnu$Dgfm2pm85Z|dMdL(0jgL5=;DTF|B2SGWgz~GOJa)6}3o{9vgUbd$xDk|iX z`Qrkz!N9>#S-Bk}w_9jnpaR2phkTpM^8uX!h2|gcH#HHFQXqg8qw{nH>N?_~B`qI` z1axo>kOh##=^-eWH6!INcZBoaY`^S%`BoKbomYr~iZ72-rah z(Vt2+Xrb~o#ZU-n*op_b_Ahox30zn{wWc~s84)4O}FyGR66{RuM_O0kbRt4evja>UdI7BRp$) zto&3fQmdAqvO$Z(oviQ&|P=d8Z>-tPSxtUu0tLw?YG(P-kXO3Lt}dQ)nz zI&sO*0b-diHqnz5laf$ii&3^WH|uo{`q@{-7j+M)5`{=}mwp#Y5AlkezC-YYS}PB; zg5~Z0AtHL5(e>`K8da|U+qBFiZHl+GBE%uX0@dUAD+;6BkQMUasZBfs-QLqB#I5ys zhE^`R5*(u0Zeny~DZA=s3!;nIGptp>b~sP^AoZ7$6G{3>)>MsfhAAow1|;BLC(^j) z9#eKbUVWbRxP28%c29&B4}K8k&b7lc&fWew^8ww!L$O^az> zOm;Ux!rYEh9nQ+mcpf8@Jy^#D^U-4$K>UJb?b8W+U7+On^ucEL-Q&y!MQH{NbVx2mqZT5H;K&%lL zf+FN1%J3KA;Ly>D)qFRC(b3h3P}@tn3W~cFa6;JMqR(^94+s5m=eub629qv!;s#`0SSpL<81;#YD~_CB^-;Ya?*D zpFRruXX@1yUI8V^-9QSgltKVQb96b zBoo311DI_CfeyW@PmdQGUUO-_o>+@|y*c1a65v?|%A`L!13>}bAe{gKXf~TP1DSTE zWwH#UNl9~R)%08$WmIOAVm)?=nE#0avBL%L|HE)@+reB z8P_b6^mnE;2o|g$W>L`I%!OI%Cr-&sBU~hYERVD|0|s-k-6huTe+h5LVa>@H!I2Zo z%cIR@<|JHJkbXr@T)gIX6UEYl_zm^p61c9!c@VGszrBKc_mmc&=*&I z5^}GK&DV!fsJL4cn15jVk@Z@Xa(qiy4Jn=SORqdC@#1uF;qf}WVM8UNAW3(KUc0@$ zY}{0wuD!UwLaAR@=~0h+FE01JwubdqrCxC$hyUid)$Qnq=3hD=_59hB-I&hoxYZF? z$e^>da>I;4@C(<0tdIACX1=}-W8v=wJ8As+EZCxYK6ayQ?RgPK13Fc2W}mq&Vwz|{ z7(8&St-Zvk<0@tSM3ycuf8uK9;ym8{+kt@=n7$$Qt)dNx*GDAZ5Pj>|1(qpBw7Yy; zjm0!@xT)+wvj4{AmqJ{!hX9$r_*Of*$aI7V9Lu6`xfvr}V1T3Kq7u7BtirILcVVyG zhhI3l2OD@Hv&_clH)qd?9{y~JW>MCm53S>dkn@|R{{aBl)BG=Z4y5CqZQDw|GhZ&(Brvkd|M2z%G#It>#UJ|CIIfScfMMc$x z9O-z3F`(RjKGzY^yz!XpW-9zB_{`TjLrG_rzfCpV(a`(dtTp?UF|G=o`X7sEDO44@ zz;xB0yY&=of#O<46iZr4gnS?MFc5#ifjy&X*kz!=)84g00oAuHbWeD-{#-!|Qfh-H z(W@;au(0};?XGJL{&+T<>)MrnpJn;Nh*|*bl_3UkIoLTop0l6V+-Ji}9#Ij^EmJGA zXmvQ2FEzn?EDZIqITOeOs3?A--G^FeW}QcLL#?;WL5c%GCCCAQ0~o-&Q30p{rz+)g zfN~OeaKX9_rjj4YY9NIEOC>;kLd?gTOi2K=3V?7zZIK~Qn5M0wg3bvq>L{P|TSnuZ z9u5j1Ak5Qx+lz~ZHwnEM7d93^tHf1Rt-BK+VLl~jD*gJDx3;4S*ykH8Ti&>;J+dNJ z0!ZMteMKz-E&l74zxiVGWSMXlQiNX^tPDw7n~u49berU*<54H$gmr_N0F@LL?|H$8I|A4BI#pk1{J!j*Kf}u>&>cx6$zksN|n+MsAG&s z2;CV@Klu$!5Vgs!L59ZhQ8BNW2~Ai=1g&S;8MxJT3SM^7k*%t42}L4)S0xR)0r z`)_G_cbCi0D+UN#D=AVq=v3@NRv80OQ9Y&%7x0%IE~GDsDQ0BhHFQB}953YC?Scj# zILldc;7m9O^sYW#25k1~1oj`i9IlTiu*Ws82&o(4U1+c zyiH0rcYoJ>=!qm3*9gy^X?nQbc8)t6zH)wZIxEMX+>%XmFeg5J_NNRalKjuW*)L=c zj#B=mv*h5>6RTKc<}}}O=J!%57>kv zk>DZGx_$~2q)vmYMOmGQN`zw-(3Pdh(Xd~#cT|TQsqyEmi)4>JXB&+W(JV;iy*Gjgn-DKk25Zr@=&L2viH{Z41}BwgLeW-gx>LiA1{sP>dVXv4n&Lgd#b-S1JKe2H zrzPloUl*`ZRBA>dxWj?|gy^7EsnkXp03AkNOUh$*jBY%U8Ej~32tdE95+XnW9AN0q zFvK%OoJ*_@3TXfQ^oA-$EL5nm^0(NI8y-47R;mbC>QUqL>T!~2x{u}>M++kMN)U-G zLJJFgbbr~{Y&Gg!TCEI~=Miqdi+9EVoDT{Pl}FZNY}Dei0)V5Rn}|>vJ?ceGaE`}v`Gv;BleGPm)8~70 zcU!{bPDe;tk(7Y`@00a5{Y2aB%tuC>A@L>ej3+HZ;gW2eN+@0}AJPN{+qTYY57V?vEFNZdz zqukG9aB?d94_l1w9|JIs(kYq0V|Jn*9pePW>kEW%XF}Vc;t+F?*QtDm^LUU5km2+m zq})>{_2zxcR`P^>N1u{fUA4SIPZZS-T$*46!APRC4H#Z<=;P*+wT^BKl-sQ6sUs}H ze{TuPsT^r`hvE(%iq{2z$HVR)dCnqS4!6>f$&YYvN8VhT-NUs(BszLHUwYw@8i1l;H7Qc zZgb^wMY%F>^Q5(jS>MNdilia^QGcuQoNlWtWrT;4&+0Npc0~SWvBsNFucl^oPwMjX zl8{X{WZ#b`l|heyyj@2-Pyg|!$tC}!_d)Uf)Y+1~y?d=0w5s<_Zoi(!f%&IE7J5&0 zOe0v#>C}y_nr1_0co>}WTK?F@?&atgB!bi4 zAFVjc@9*#bp``dzY*XgG5ry#FjPkjvmEFFBJb6=!BY_{A@wFUBay9NM<#;4^)R!+s z^-h*w=Y;Gw2o`}T7ywX2p0w3{12~;sQh60Q?sKp zD%>NSWv!yYkQf)3MkQ2x^)`JTz&;n&&G$nSA|P)J+AbjIPS{p=Sc7-TLiFgUQGn+V zKM`f5@14FZbNF}&v)c&-(CP+&$3=AJ>YZCxyB=v!BZf4vl_dlMgBg&Xn-!P>3QyJm zjdk8W2W~eyu5cJ?>OgYkU={>_9#KOZARs%(0xOg{aOvZI!`((1535`bWYq;95j6w+ zfy>z@0J{<(Fy<+ZP&lHE3e+Gx_(RaqoZ3StC`1JYD~JgAo|mGfgjd?MCBKzBp?(bJ z&$M*i&TPl_S_;&fC?9yh_JL|ya-hKVUnjsP7Q*x|prREN{fp=9A!8DGhMh4F=qLsc zh&{h=lep@bgVSP+#ZB9F_(c0W(suHWJvWD&TjL^$OqfLq`#ek>rNm1Gn9H;~Nj8CU z%D^j-6})X7?noa!#?uM}DSZ?K+=`zj%xBGvma&+HL5Sm0JLB}|0H_Kp3ztk5$ooJ3 zYi%44@1AO6P!hfx|I)Xv71TAA3Xq-oy~}<#-`{o^{cn*f=F=kbzhh$dzQnoT&yxP= zDqrA+ns&_6Evd@5PAfLi5-$w9;>UaemX9^JK9d!F{Uh&<{;}$0#geGz)HWAH#+QVA`s(?>z7V3L{`J^=KG#A zq8^IgD)sP|h02KeCG%Uv(1}%uOQKcv%_Oozun4XPKm!nOm>RAEos-jS5kPG#Gk%a& zJP$kRl?Iv1*Q5y*vlID2L3Eb(C>5z*X)~5oF-Gx1&)V0VdUpeVU|M_RoT+`NxxU5r zOR6UPK}Q3i5(|`u-Ffj+!Ve-r0GgmuaV%{^4z(*p7oyo&w`Sz$?!MtSnEr` zZ#tbT8pN~MXnHJV&KFIMbTCYviyDQ$YA~eYEeV1%el=Lo*b33|m^^K{WDn`!wkDW3 z1hWKK!=~>q)ne+A{QEuWoV-I3buDYG0?yDgWGi-MV$ACC_$K=hA(A4hI_z zhN~BVYD}9u=6Eg5SpTc5S|R<%MbUCO_J@}}8p1L~x6OlydL1jkTpuJ}6Y4GRkbj%^ zDR0)T1PM?N2gog6*VsLygrnI3Z)qppAh&AGQs|b+tHkW@^~XnylR4N71ew9AkbgP& zi3l&?q__No!ZL|u#C|U_OH-APKs@|-*B4gHr?HA0HALd)?p%1-VOI2-1{HYzaObb6 z=@C_Ys-SuSWqS3u7bcLx!T6~TEwwF}dtLg~k`gXeixEM5trXFJ~X;tc#IC>_t88apH&!cMI`{^86t|4%tb?0x@}1if96BM zBzC@$Vm2z|h`UBgnG>CShU%KP(Fw*%;)}v6vR82zZ|yvII92$U*MA$HYJm8o+r?j= z{}SOugOjvb!Nc>c%&W{q$`7qYviYs9uUKV?P<-=RlLf!t=Z&9bL-oyr=|+6&MFS9i zr#2;?NDB$J3p8K2Ix4iKq~88;t-&2z?s^b;Kq*Ou+q!l2%vHOdS8XfVt*^oWk+Iq4 zEEiI(l-)fxcNtrwELT3<2KT5J4Z6ef^?>@n$5CYhlJo|JJ?mdG!hcGRQ`&BfAu|@X zE=Vjx8ZI0r1BYnR$*fN${2rzEs^ZHEK3YF@PV?K|ykBGpT#GK+Ou?d95nW-dI`vgO z#{Abt(a^bgKTT@|Vw$&GDc2^l5veiSG?3LXKmk)ZYDDj)hsd;~LJL>!e-%v8LcaTQj-~)RIcyd>lB7*zCWfC4 zxWo763o1a+poFT#hhN=z?d`9#`z3|}UMzzr_6k~?REzscr|J%;A#Vt$_hAPv%|f{Z z=+NaVyI3I38UnTZ;x|Y3j#-8Ed)eRh6HpyD)79@LYgoz*GMfUV~B;y}aA`rQHTaj!X>v7uKJ zXne63GN*_k*Px$Z+@?9!4+tV)i16L;NK~R805e~6{CO6N)s!F*7(m2lsd7Mili?Cy zSBOgg4kab|5SsFI?s+=8tl?YxS1J!`)8G!u(wn(tfJG^ke+7twwjuhY{?RqEq60D- zpk@*8T%-(CrFn`l0e};K2_FhY++Icj0Qj-_Q-A-!AccHon@s25>d>J(oi+ac@vBNU z0cBe_m>`{*LC8+YqM9j|cYo4Sw(aHFUpT8Q|3$Vjp~XX7?+^(8v$*A)J9R|co9ed~4aa3t2C)=4EEtp_$otd(49hNnv|1*+ z!o>+Kgs(g+^N;yAPjajXB2u?)q2AUxHaGK?#oK0Ton{xgqnJRzw|*z56Xw0bIH;qN z$stF8u~kD4W76j)!f6lA^j|s&nJD3rt7)F5ExY2pT>y{m!yd_3o5H-vf9|D#f80>- zocQ}fd^u&_$FXwH;#_Q#VNZI|oKtomY5!Il2+?QS)mj8wl%}_?FSUtjudEMl(rC5n zZo!`YLV3OYYj4$jIB>QeCtkNWN^^yy8=_R-he`vS%HH*oE!{o>N&Gq9 z9SJd)u&}&>ky!z{xpxG&nczV0b8wHROFEGI_w?xNRqvRG+HW#`ugN*0K&JupO?Hzl5Z2NF ze~k6TFM@#6w1h&(6us-8EQ@j(m8X>%wxXvit-OYgBizzD9w~!}Sk>OI-fI_V;_3BB zze-@8d3G8{UzGHQUB$Mjw5{+{Nc$8B^y7Y|ergbSn9`?+LW?EFtpdWL{afABveWB1 zo|9DE^kfh8J?8v<9*vqh$b@#=IV;fT0K{9o)T>i@8(|E8xuVh`T`VNc25@t@{W&Ua*dM}_a7bqSJ4)LPA! z>%{6`<56Qag=I7dzXxgahLf#cycHDD;6>2{2+It8Cjpy%RtkiW`CgmL<&u{w*!HAx zT#8O<@rOwpwI4QqB*-_$%NvSBeqS6MhH|8nUgih z(PQ$;^(W1|N#|A^J^B<0%M23Cl!%Qcs_p!;tgvzvmTx%{Vs5J*8YeTNW`+`ghYf>Z z3+M}#am`;kx8L9sDW->+U%BhQ3kWbj)&*N3KC_M)aw&PTkpHs}#Oz&O?IG9J2FpML zB>#m^u?JlKAVRiR4}jTBa)7!r$`>;}Qvs%nV3>9NFqOLwEl_N>(^$VF%<_t zbLHhatjli_DCO;WeCx&FAw8G1$GcN?mzFNS$FJ?W(XirCl&8Dy8w|eNQOk`Ms7fBK zoXIZ7^-j7CuzNbyoc;%S@$LK%Xl=B+J)eoRM1SltTnhwrdsq;b$&_a3`XwNdIw6q= z?a?%MrLD_TPc{xeq%m=9mTXnLLV^S+xV>f}<6I>dA}ncgP$3T#eo7(pCnV>k^Z{6s z@=r844MJsWg_da`;Ow`#@esR^f8KeU(RF+|8s&>%tpBkN8f-`V%YlXjvGWDLR|4${ zH-U6Vf)=e|lP2fEL~KN?X33DEf#MVXD~^L2Z6fXQ*V-|iS_W-2Dmy{+#UsVPgrwz4 zv@-9p3AABdB!iEGvpp4ZVd|U|e>pP|zQxM^6YJcT+;PxMflcZ-B0ch|$nh+{;jxT^ zf^0a_T0=Zo6IeZ#4qu5C5 zui_SZ))!o8FbbusqS>t}-O_z%$&uukel-t83y!qlxN38L6DIa&)Hp!@Xvgqow zInuE8`@Ap6TaaNPM^u$)h3idT*Vy+Y2Zcg#{ppx!qYQ(OBiJ5&18lMPQc#^QO$2~2 z_`$gDL>Q%^5l;ii(yM;c>)_Qj)3;6>uYKcF%PY23ch=0RdYn8C6hGQLvag zSL48s)p7C04rdtv(p`e6=X4mGcuJ{%J_sP{Ai*J{tnRfkuq?L_lx&Rz8_wyKw$vxm ze8T5>b|Z4lnGV^Zrl);;8sAeqrydbyIe0$*y{rd8aE=Fl0A9(86g2QIx6)>8x3lNI z9Q6;sdLye?*43F@6>{eXdGwDI6>S;b!r!y9FKFfJZ1Z=)2~*qJDib)ui1{!fDrDXA z0iD8EXovs-c%Vo)6-g{Qp|SK5k0 z(-dshJ8c1`Cm(*!QWQy7cCdPTccv$#X+j8;yC%9y(7QPby#0#pZd1yuXAk?iGQko) zX(u@5`F0Ui1!ME{b2d0_)Z^#p_}KwOYv-`UpW+3zZD>-GDnaa+UVI+){5tDa?3PHpU8xxN1V_5){rSlmT#L(VK+nd*3g8tLs*lS)8uL z&GUBCt6xW-e$e%<7rX6CarbYZhTJ^{T_!3jJykP;mx(PkC_Awq@d^`6b}^s(Ih>Lp z_L>s7uq^s(Nv#!jb<}-kX8V0BQ_{4*yvdGtnR`j6D_=XWFz&8~r%lmp~^2mU#;`MNKOLA}oo(0NvNS-unoW+e5sUhjd6ZQrF zmI<046)7zt(By&s`3=ina23*b-7w@wRA@}LQv3Pj01o&Txicy~A;w$ZkIq}qHCsqr z_l>kJNWb+|5#csvO-ZmlfAO2<=?JTKvFXKRW}r{Q@$S`BoOM{{~Uu@;S``KA?oW=!Kb#B zHz=P(<{3SCVg45+cT_t0^`Y_60`$Am0h{TX@H&G~;goQ$4ob{Z5M#kLEig`eof(M< z0oOio98T+#s4AkHb%-O-B}2TdR;REWfqALh7KjB3eDg#SJiM$TEY^>ZC`6-280T#w%_i{69PV6Oy?c znOsf?!P1y7&dcYj5ExHG%S+1Z$-T0AN+tPMro*i&cC)CqL|D zTV_U`mHK6>I;LuR@~)!{A4TRRwQsD~mA%d1+t@vpaa)QvJ$c*g+#&srZnwsHC`>!U zt0Ij{=i4=K${ZWfKy}>#Z`!m{rvB-jaLm1xUO|X`JvHed(SZ-H9se zA=5YLR@-Q%^`3qMo`h$&P|+W4;ZA*~tm;>|+P!>Hn-%3p>~Mhm5fJjEiMKC4+(%XP zq_<7>_6BJ)pu7vyBf>aO$2Em@j#~kyw1=GL0AM2MNRvpB*k3b|dcWJEMUf>=go;Dv zLFnO)5%}M5s!%oFzDMRp@TgS18ULM{DI2Lcq`s#EWp-d)f>E$En!Zit>5=gHW@3-$ z92GiwEkZS_uZ)o+spiWTwbGetXhzl_@kbfk)Ajn6-QFtX z71Bu3WXR^Wj34XdJ-p~u4aOou-Y*V1NQfIjr{REd1}j0Og1ZadI)$J>ko6L;%C)sb zuTW}0Wufs%_wyfIUTZ)jo!yo8LHjIQnZS2D!Altq#o0FV_Aj!e&9X&lkEm$8sE^m# zc_9p_dP(VupQJcQ*I{O-Hmg=cMRamN?5UQSZcc|#s(pOWfEb8MK|vxz28=ueixWrk zf||*o65a{KzQ5~e|0Yh9cv|qq>@i~mcth--2%JJP%zw)vVTa3*m~r638#@m%;1JZV z6Y-)D-QSoR@!L;Cocz(zHnZe!!vd%RTuzaNYu>nO)=$>4E+`9kR8wAS^731`|A*=1 zNsxVDWhBo`l<^uzUkrcoXY#1aa~kf7p*H0=^79gmW@}^Ll|F_*T2?E^Osu}klZ!R< zNAK(U?N`lBm@@90Q?(7%%UezmH0q0oYuBQf*DRR}Fh%rsBKdO4}!hyqCIpxP9(l@hq_sCJ3EcM{cH%v91Nic{S zw0v1A5e(%oQ@I~(DYnr(vR`LV96bAl?d10?J3Ye0HXfFhj+`Y*5l)A7J%8&lm3}bB z8B6Co&STY9+NsR3uxa|D_Crlif&kD=p|xTu^t2a$DUxq&+I~Lula(FeGmZUXe>M~< ztIiR9tBbVA)p9d&jr-94aYmWJ}AeiWQHfT_{S}@r)oe>-fI!r%HO7< z#T%8%m8(|mPcZ*JbXxcK9C;k-HL$XV?pj7V@wJ)6pvD@z z?5oeiyY^%Gyt`_7=h-5GT#{2zYl|m1-0NsBoxHBsgr1X!QQoh~%^RUk80#jQO0ov` zY~#Mqu?=2snePesfFBY91$$&8VxlI6EX3)E^PX@ErQNP zONXokD4_Y%tehgTT7-`g`Ixtk*XE5ywi_W~{(^ryV_ozeAeV-}8l1Us=HU%@aW=u1cxi9L~Qh~*r zAutx!8X#;2#)B+it1k(hmqd6=ZJZCReh{D;+f@MqDp8ahUrFPTe6B#7sr&(*kB(lBwg-F0<^4yTEi+ejIiUW9OCbK= z;_3PHw;^SVO-eg~>`_I_Y^j%F?{>>rKOsWRIUp{?7rA%SXCjD=rSlB$JoHe{xn}?A zR-3D7CgPmfjWOOwCmI)4`GF}<27$ig1!;aSv6H*c6CdgR^)n~YQZ)MGM)%Rt_WYI3 z?kV1`Gu7j_#zH3HRMVr23YOnWFsb7&@GJS3xi0rxS>zi^(YJHc+H?gRm&}}b@CK!B z#AT0mPsfa&GPjtuy2mMFIZ6hdQcW5Xz+VCy`>_b`H+#U(rc|XSM??NSS-srY9UUiv zvX?*7o@$kZ65xrF{klrKf4!}eK3QVfh*AS+D&8l z`{kJQv(${j+&I+j4WnUzvcqF|%kpe~QIHciXTZkVs!kaP7ugg>Ac|?Xi3N{+{MlwP zv`+qK%MK?Ie+@OKHCN2$liE$og5H>wdFb`#MQ@!9O8NiCkN~;=hasVVS0_Of*E^JN z%;-PyNo(5l?4x#@M2sUvsr{nTfmJ7UAN#> z$H$MG5AzQID|mk|HvaoxNRo;$A4kB& zPC3=7Z;T}^B!gG}Bq-o8?FCo8F|IEI=>GX$;NSm!#w$`vL#Ik2I$b+lrRCGiftBv@ zCzr=G>Yd}Gdw)CPV##D0)gpE#8ibr^aB>?AKKuNv-abl&li*jodiKLRy}{BL(f6Jr z0J*J(5iD(@CX`3i+4t>Jb#9!SO5M+H0lKZ^2?3Ac2K*8%^uyCdI|s^($h6vDReYF^ zFx(pz6mGp$T92yTmnE$KFwgZI<%sJqCJH7f-#40w-1$iw1VCg+ejBPvBf(58B7&3H zR%mLs5~NsCqouGKNH`ZFmuZ9|lT{6!oS?fuvVX1!QSE*312J}5;{P7sq4;IKw~r=? zb2?57rTrkHtuJVlGTivyk2l`U4+Q3DQqlr$+*4iqr!40UcTVfqExKSzJwos735}RJ zZl02?{j(cP-9~Lbsx&y2QP44r497oY>;Arw&a)bpRhr~%zsG1jv_m9la=m$na`3vy zJCQXgstXRc3-2K;(YusU+ic~bS@F#;9ks~~dOvNnq!C8gZ4STv(+P2;1LMGxUg}@< z&2o%gPkXhp)AC#+A`>kE>+*XxsfGXN%RiqJar=%#H&S%}GY_@wGBxB^oBedu%iF8&3$U*u?$d#CE z*;d)adW1yqymNUQKv#m(sL4ES3o%iD08QcTU=bqJVUO?r4%}&~Q;KW3BpPr8DCkxi zNAiQ~s2X-2E6H*W%tfrQv^u(-Keuw8iRX=KuSj?@UP8iA{7jK%hOyvpU(3tqBxkm8 z)`vmzaB%)9F8TsUDPbs;R84yRNVHm;z3h?wVku0izUpG4-^wgyrGV5o#c6K`e<(RH zJ-2UW%%ktJgW^Jrdu3DXSf@;H3`6PGq?5V#3@v6NfmLay6ktwmc)lR$i%#oxz8O)t zSGQX$?Z~;6Wo#_`JIt0zBzqP&HuE7?ZwSlxZNedQkXiQ7Mf7a)cO47UX2YJ50$EZ` zlF^LEG?UP@7e$YtL(O&85cr6|Nrwo9{R}p;XviVoK?#b$M@k}eb(P{aR*}s+Iww%J zFp(3;dDp#J{;KgZ)h?EPlR4dSw!LZXlm&d;JL#pMsr;5_39QcS)G*Op)>Bb^6h*H%*pW2bk6%s; z8!PYf30QxY^fl&l0939J*+)Iw*d*0c9vJoVj~(!krwWW)FWCoool>W&t9R)|yzErG zMU|G&^Pg&w?`VV-j$y%s<{E}Tpfd#!O4}I&Juy*mjSbF9-MF&rxSOEsFEJET@eR^v z3!Q^HTy`*t6(Cvw04RPaKC_*N8A=Fy>Ur_mva^ZNc7Lv}qeey|S}!X_`8GnZ5VEnV z5EV<)MYy5~ItiGc6==0Ok$?CjWr;Ay8MbwmU54@aMON~1>%uk3B>42bPwP`Qivv4i zbCpU@5YX`AWlv*`-k`mDjp+$nsZ%4pp|I3xyywws$FIGt z*V#A$Qh0l=vPf-1pyRuirU3OQ=T$Q|g|nU=Rw;JqQXgzg6u^)C@jm;s?s-wA9hb?L zQgQa)_u9_%WJ5D{um-uayKe#NTZ?Srr-JKrCS#T?v!K^^xta7?8z8-BARCSyxHq2- zx9=Op{-wdngDt+o&}ZZA{@G&I_T#16(7W!@)S?Dj&*73--eF+B&t|H~C_CS?62-9> z8Su{vgobXRarPV6={VdSDY5AcdC>T_c_lXIEVq_a1PqfW&oSj+J$Gk@+)XDfeBb-I z$?K$(;-Q7g>*Mt#T}1SoY?_FpfmQihd=B+ECSAgN_W$U)eMY6qEu)SDuu*!>kl+PA zhr`~gaC1LsV^8~97Xq&-T@9^jJ<%4ZTk@Gv@f%q)vS465gQ+9SLF`?#Ps|COA&>yY z-4>r-zNWW44&p;P5K8uYojyO*M1fJ|lz2Kwj6;zi{=&$Ran3KeqKe9@3P^Y#ee#e< zzqsuwiLk zou$!Pd~LOaEIUj{Xu~N|U%|plG!)vHn7GHy;a8$hzaK6|uNXexFW`(;Rg)5ix@T$%TGisAer9RKAyh^Mfb^SzwuZId)da7a zBlh<`LgWe-v2x<5xcZ|lbIXzW3Mq z3v$R8{gIrUSL&kvmps`$Wtpr5w9|xgS6=*)S!Q+#%C5o*19ePhx~AyiXaG$Tf4?_P zXE<`o>LLz!zRHZz)M9dzhd9>2;>*U5!dzp=(=XK$vq^rh+=r)OzH{kZ8KtJvJlazj z#N@w?TyxfDF zs=vQw+A|KuQN`OTnwqGE&B{h9_+pgHiErzJ9*K|+94eqO6-X5E^CPU*NpnOH<$%1^ z8A)eP-m_yRoIzkEXB0-2uDgBhF&--VgrouLHH=Am_yM^PT~-72oOtbnEO; z#*@6CX7n2!2ffu`1B0itdS6c0bv~q%V697tYnB$jI!MO0%~xFITV3^A7veJFCPz8n z!V{y{=C|qDEIeFE1-E(JE!w=d71H*%R?OzpR+mSHmXvXY?#1~U4nBB8)Rp%Sx2LzW zCTx`^eJV1a&Ij@T8D+DOe)Tn7G1T=AW?15mFXwmTBj8`#n?dj?{ZGdg; zOdNBGjXPw-VNEYIc)m;tL`mVK%u%=b?KO^kzPGUSu~%JWSlquPDct%X`f6$E&j1Li znNc8nB84}NWY6kVPu=TcVuNyzdfbH&MZ26(tb0gbT%@?XorJSe=q; z%-sx#T?N`a(jq&adQK}VYu4U^Vw1y~q4XsfDHfCe1WIgI-LNlGHghRzws6Ew zgM{0+?@P(B#wOFKvp$*d53a-W?0TixE46r2 z!rGJG7gOsN8ehMN0P0G@{pZ0@lSKVJESV>AKtCho>Kat3f&5Q28FeIBf0k_7KB;}T zNh}|1@uF5v>_?H!+NMR;1qQGRngw3`(?n$6w{u=ga&aXU8AW7yF8~Tg-n@g&-Sf)e z44u{ptT%le1oc|yG&qu1c2yx$yNPQe&e4TqHfT#s3QeLzjQG38Rh$WttwAghL08d* zKy;sc`h6rCOZ(;xHEmjg@X#Cp5M>cEAy0YbXz?#BWE5wqa}!%qC8-h-<5Q)h0F^93 zM&!_pD-;r~yrX22r;5;3mYY>3NnB2K(yhC2)>SkcurRlrz91E>GtMJv`1GR?IsG9Bjb&2Ui z&gYwy5w)>7m0+}Xu8bi?%PC3YW=Ph(gPp|P+KoWScq1Dc0u#!ru=joOS%)gjNET_= zWURsVKtfmtt-OC;n|;{lgsoYT;1%y|&kfJS4mk$hml?j6vE66$V0XpW21? zW;H~=x}4~ViRb38K&p=)<8?Xl z${JeXO{?5Y?d>CU~gm(*3eTgQzP?-^`P)2F#EI>YYZG{Mbb!5Ra= z{`7)5Ilp2?KTwB1c*=TScH0DZ{y(C=Dk_dHYPJUp!GgQH2ZH;xZ!4(2Z#-TO8lH;X2-j#>`WJ_W7 zCIBgBv>+3av?uqYIy7&V97(`8Crq`Kioluhp)_|l`v_6MFj5|*86L|xt*>wmoP6tg z3a$^seLlG>eLCMUKX%-ctV!F*e?DqFE56D4+w7Jb(X!r;am8yt^ZyNax+?ycgZMZq z0xBmSE9f1QJ^xV;)*p!cK=KFDX6toHUPzLyr1ek#R3CKdR#lHasrR_mo?bVdwWWD| zwb`5hcQ)@H(M0zCue4nXH*jv7EX`UI&VbP7bS+3qM<8XezCCz8qU4mwnrMOeAe1BI zdErXHdi~UgL-Wk*^>IT51lS6NIerUG{{P$$C4rK(Vltk)+_UVM#8)hGP&HV za+rYX-oTuBjUr#?tyv>|G?jd>#uc|+#Puz`D6C~@&&SKn-6Nz(s04iqZ#Rie=3X}X zL)#y|<;ltecSS;Ohp0PMY1bEBpsKG)FV>LCb=Sb`xpOyvK)CXF-I$>G^d+##eaO_A zk1zj)p_1ACNcT^v-AG`gGXtVcQ)rsriTC{EqI%0y=VH2tcSF^JsA+qdlk%tLOTB-+ z#E^5|VH<65U5^%xd%E6Y_x8iah&=9&u|C&w$_M{}1eV@Rn zfLg0GJ$`LAR=e9@1(&}q{MGIF(}$Z+@NH=5avXxB5BKMh8sK=DY?s}y_HPsF9fXy4QEbKVXF*sD+Sq*3kc1*QF?8d6W0>e zRVP{5BN(33q}YUiX$pjQq(2y}EmNI~`;SMDM_Ff!cgRRg2fuFIc;2kJD^_{wFnF)I z@j%-ZEmYoDblRL6wGyJ^CJ>E0b>Tt0|KNeOT+ zzL(2NT2tY}>52nRaF^ULkcDL4X`uMn41d>U*CLy8G zInF0HP(`$i=2exjZp=D<>=Hsd3f3uj6B`#X76b`nqcd}bbQ%gx8*iNzlF&b4Ek3UB z-LqaNW(!^!(~8I%CgWk-n2^9&dd`ekkLk0sdV6cwnPqp`UsR~nz8J{Xpw;%Y-v|m9 z!zSM~UUhLADg1*>Lv+XWl#*g+_Vi=gIP%5!={3H26Rh&D#FJ0B@7s9%{-mhQ9`-IP z^a2M+jYwq&x+*!YG!4zs{+@2|v|bh0T&`vJ^G|Pk`COFj9cN{}=Y-qugW?Qp3>YU= z@||cL1bl-7n(w^I12G-n3WcZ!f?2lqUt(L35dU1i8zE5enLXhM<2uSsG_kcodrnf@{oork zfkM+P*dybWRj^RJ6-DBp#|R=KL^@i5@!Seo^;M<*=| zXGA=lxM)|R5xC7%{~DD_{y?U4S}yHrx`*C<0I~hH`UW>Am9g#3+aP>-X@~F?RVeWa zw{|XM@5uJlm_Gg?)ph~*+S*oQ(&9-8E<+O(;c*ps-|nkafUwFZlzGP&*tedK<=?_Y zaF#btGT0nYZ~t_Bza6RC&Uw&;h6U{&LVIDX^?QEcMzfB3xcu&24&#+9!Eriaeg|(c zpjc45HS&w$qkT6T8&fjtW6B>{M^fb{0@c)BBL+*qa&;Cp$Ij!VhOLy!_A%YJpq( zc9AV`*dB%4Et5Q6_}X;am;nM(>-e77l3Rz?{;LbJZH`#dtBUzY?sJL(>_ElNS6v%< zbl|@XkxAZ^EiO6fPLZ6ymG+(wG_==^`7n9%w<}wQNukfDf1Bz$n`^$ZXvep32L7Xi ziN;;l!cJ5ds9`J~`qR4`Kgd~xMZu00r6|TEi`cuwSoM7-@y#oPU{L0Cb~F)wrOT%s z`j9=?C;zS-Vs(#^kn75%f!kh9Tij=e^iAKHdv=K)UHSeZ=}ETQKgIB0v*?g_>x~Bq zfK%WnY!ElZ&Z9s8B}>M)wefbK%2a+^cLC|}NaM?bB<3s9)-9oLVh+ehFVBfGH{98PuXN^FB)ep`^rtzw2~P2Zh_ z9_N@%oB9e3f}}KK+1Jhy3%9^D^g*s-ZCq+saA(bCt( zjS<$kCm$EyL{*F;l9=7bG760~IFk^F_v^D$6|N{KYV*?&qRuYNEMisQxpl^p@Sqb% zPKM$r-RgjSERRcf1@Kk_3D#r~R`a6OrDrUU2vXQ{)2BM;kC5QW*0g&s*&h$7GlJv9&|W(^ zDYPlRv3wZgWU>tBaH-#zRX+WI6&f}kxebpuDMWL9Dc_sx8=4wOV%Qx52QS^aX3CA18(6b=Yc;S;^5H&= z>$lJ_SPu_Eh1W`GxeZB)92F z$$YO%kRQ`&=_fEP930!7`I9-)+4HiKkZ14Jq46x2pdS7$OtxuIF0=hS1Q<+^ZCOvG zl4?ea8U@1^7@qY5z~JgF*?f7RH}xFcDVCD<=0eS`XvDD{Z}cC=ObMmE($0E%a4u04 z5dK&rXNbj)?MF57S1-?SWuS{bJtk&&jt36d`dGl0fX{`NMJXw?EBt~~5iq48GO<$5 zDB6FELe$U1eilSqT9sy&+1x2wJ_&AZ+@Q%gv9vLcMd(?sr!`wOs*<-qA1#?IE>a+k zR;7+UWr-(94cmMW5IK*wkwzcNzz$mVjU-6%^9?rG{N%~x2Y z?eVG%O(|O)>g)8kCYT%4EmKt*bGYcFQn%HG#*cEWHfGAwdr|?xYO4s7Q@)W(sTpgb zu`_wNAXQl%uAs@vo#C@XR}1m`8UQ~h)FxwuZj7gn#;QpJgXH;x(t2KojRPUTzh5PS z5Q0rKz5NMQUmI?II`XpkNS5K6^H=$pN-HW^Bx^ZVdKc8-%b$pHGgC-imcJ!ul|M~0 zu6g*~Njxi>O}d6RxS?kCvipQr+_Tx~L@>M~ipI~j^a||BY;gPvsTqz-zZ~NmZY*0X z(AJ>h5r}GirbGX>7;ulL+P&-Qs8 zM@0&!%>V-_8V#jTKEoYF>4lrJ;)mc-@duH0l~k$HJAJ65n`Bu6TAp)nDn*-C0{@4G zQ`q|rqC+|Kc_RM6YQ6ejlYF#^6C3OSlF?EDnZbui$@7sj%a;vl2aI5XWfBk&musHO zsJEb4yU*L_nCzm(!&^Fqk3GqH#pnYUp0VPc=FKw*#RT{wrI)4tZu$9S`aBY4zm~pl zX1I6+A2{mXNGb%Z0wm%9K{W{HHU%>=-#eKkaOgc*E^%&EPeVJ+IWeM5GoVK zPIxTZ)8MHk#-rkRC7(x{9PB8F{B_@U*o<2l^^&vrCXuQ3k-5@JpSK0K82yHc8-0 zAW1*!*mC0#K4UMk-pW3b=u_?N9}fxl1Qp@F-3t4Hbv3x^q>ig>PKXM$_|n|yyr-|` z>!&1YNYpbVJ$AWO=nOL*&Y)Jz?}Uf5oB$0M2oQlhjhtyMh13AaLvw>$CY9ZzrklT_ zWRXRDZJrbPoyJ9|qL7e~OFd?E#0Qdxf=fSVNO;l{qU@}LBlgd>57)92NZk203-{k7 zB_L}tY21c`j1ij16Wqu?&L$tcaQ$w8yDJFw7s(|Ft3*&#Tqnz}D$Z+Cv?I-HYh&4Q zHlmui+MRY*6VYFC<%HkEYF@j47_}T;w`!^nZ*2YV(Z8?WP~>w@TSq9e5(xoQRtv-H zc?{PR2&cj`nNse^Kj@UitrEfSN{E>Yj=9@d!-r-hU{_37@FxTEj4kIRF zA4`@3vL&Y#C&Uf<;Tx~p*NQK53eO(wuW}N%1#8rvuY_qKmY}|9nB#XAo4hQDj4X2E zp(M`Q^X`&);l}U%ezZno3!`3Civc{Wy?kc!CzLMIB6kRDYI3q&X^E==-5Tgt^VK;7 zj8(Vv{-aW!Tf7Z6;MUNqv~kAbvEtIWlemPb$D4DP?zb?q6?&7!@P!P-7go$Xi<*i>nMO^eu9;PLt2Z!#0%F&&*-&L`MT$@wr zUbTjXOhoK^bo!-QOH6}fL4B=C*Fc#M>PGOJR6V~BEkT0S;I_1v31n8LVRkJ^;cMFh zbu+Jicem=W5ljBJ9C1lJ7hgQ4e;*Tp3rJJkuRqhM-+ANJPS3N}8u=+aGAKz$+epuZ zH+(Yhwev5iVAw(bZ%Cx8`+o_V|4g`LSBcgkPpHI zP*m_{PTFt#Jz!kTB}4NfZ;*hJl7`^hOI<=s6hY&#RTPY_6fnwfBz-4k@a>L;U-A#P^md^i&9#)bB_%rKe!$P^{?YI%Gj9H+Q z5Z2U1&hVRMTVCB)KPxBxwa!0$E5?`Z8{dU~37dvk-o*Z(iu6Ljx>5=*oi!dL!$#8( zD%W1yn^rEh{m0suJ!Mt;8`fzYg0y3!$OR3B*uD@(IVI*z1!6l#uY&xFQ+>9D^@zK z4~7%Cg2`akc|&{1f)mjjJtY}c1%rWViy?SA$1vqBrlW>z*dJQ4?NfoO*^JK|6b-i= zhF62G0ORs1FLJToq~3+119z#Kmy6m31`EDXxvQGTn1#LXgIkUR0&Bu3 zu(~R1f_7`7z#HFsXIbX~(L~E-bRk_Xt_&|UIk~YdoG%#W6GVl0TQM@RWLAuxJy{`3 zepctzX=PM63`wM-NY4gr!0u8gc31@jz=;M8IHP;-R{N>2++_U;l@RyM?hybjnF$%* ziM0g|)UXZ;Jl_ZQ>*zo_;g#LhxMW!Ep;u68sz6Rv*p~zs`?*^y)`5U!8FPrkx_jyr z{=ry55h=GnMN$dJ*Vwe&&n%)_Q^bvzLcc)fxglZa==U}LLa{rc#)c(^fV|*mPX14k zJ7kfR0dJqtUFZ1``EN&1+7)77a{VR&fPlI6_9TyyOYZcRkWQky(^c0sr{cd}Ghl`+ z(cq|3G?kI3Gv-(@ZvF1d`zFMpU5H})<7X9pKAFUQQJ$;-_h;F!%bDFztEzD9(d^5H z4%c#LGE|-z;cB|1@Quv%lB@--Zb6TF-l^^)2Bq3aN7iR1Fn+(&e>FT#RXoj?9Db2z zcqpqB??i^ftFgOHb`^*c*;}W#A2b5jTbO$;o1=f(#@wtPNf=k>;38?#gHn%N{@Fna z2eCiTEj&{q9lI|`y+r;;M-o7~bk4M<%%v#~E-8_QDe3x&B@?8tpq>x7;_VN3h1M!m zd$1iRUc^8Jq&`osx=2a>c*$2HQN0^n)As65pU4<_>2V94Z4=pkt2ERxF84u69pu(= zVcGKuF!X65`#iASEk_XbY!H3$gP`4GI8klSp-6>4Gs7m;;qMQobQcA0wt0&2PZ}Hk z^BBaJ1jM7`?EBc$-38EGQVi({XU3mZEymRJx-Bitxx(>1c2nJVDQnG+4KK+44PyA5 zI#zbpPj9!IXE|ZjV#Re<&GJ$ft>ZRQd(DV(%Je8P2uba14He+??ZxSZ#3k0ZN+m5n z>!2BVyNT1xe8)NY>zE-p1UzyXR_j8E%MvuR0l_9?gpCWRt)6HVR8;4bLmZ>me=Y_7 z?C@H%r(Z8f*d3$%g2FYL&Ws?~lf3rd&GcczMPp$ec?i9~Y2|8hyU<6OnX429^dbEP zgP(t$ZRE&o$Q2Ez=L)Ww7KU9kj0^%F=Z;`W#X{F+&(fSktp1f`@;}|Eg!a$zQ@z&J zSn?`zDqtsw59<k;9w@)4MU$*Ye$Q0`q_a@MD(U zZLn$uO4eS(>yKlYr)-6NT=3A{!(4%XwzeabCoO78t;K8vICQg`;+TTDGSfP^xd+-cY0x3x^RXdxU)5Xs&1m6ZN@9t6OL27ry} zOP~7WW$nfrw4!sIYmij(Lt+1CiX$xNGX>IlM(wBFi5^}i4L?i$HpH@J9+Kh;oj;>l zK8zv4G6Yff`*?K%a@Xkco?L28ds>zkC`B{6_k@r?XFQtX<;I^`=Qc#?V%7A+U{GIE zU!5yVi{ftUhYAy$V+=xblh_t`!d0X~xK>X?z_}u$g07CfXImBXpCzK4Xgp#L@=s%k zT#~Nc=}cwX5wIbt;F}e8wBV3T& zc>DSs!7fv#MjY%BE}C;AEOV|>qE1;=?R=eH9FKusvg2!RDw=gs^$WhF?%%k=<}X`h zB0H|F&>%f7=rV7^jCME=kfZ|POND*ju$O7B&Te?q=#*wC^t}q6c5<;g->=qox!i7j ztrbgD`M;T_%g3S_dMESGNfzB4x@LZTj$>&UqRHUzOC%pgXiP>1Wj;k@+x#{Hd)VF8 zyCyYCE{!sbGh@HQ9A$Pe83+7+?Su=kQnDSGeQ0vv+ZQdkcZtza>ek3{d=hyln%lLs_`;2JJ=`ZM#&%)gk95b$JiwcI}xKp@I= z%mCSr@4i_j4m? zswe>Z@hlk;K&8MP?f=0uQwKZV$^zc392`oT-e_&k<+kGHA{yGwZ5`T%g!-gxP8_<)6@@J#D{6x*Kf0wGXw(NOUTUQ89NyY>}6v4zxEzocT zX{!|_?=I%dJQr_~Isc|1$b(54gFC2Rg=`8U2R4q=y-s%~#2D`L+zrkz#|~@4hHJEA zDYFhv?=&KiJ?va1(kHG>I{NJ>_1@_>Apk};*?+N?e;;{`>i27haYSz$3UqZ|^eAZ3 zM$~^EZX{9trr_W@%`d*$=axE)%KJ+umr$5@>2guJIGcErE^}|!5fQ#b{oC?v*&?Lk z7=!qG!gp;(lf-$AS}i$CJAZ^xhle%o*rJmo8{ye5C`fGVa&f@+Uk)zx|By5!;(=sJ zs$S+f+#`IK>o|9>vfy{(F=>|eBr~P!+IcIg# z+q$Tdn2A$yMGW7e)fEb5(6M%cNKz981VBhiG&sLsiV!3vSLj?T^{Ql}9fPuc@{*gOeF-gW!<*XuD z5H+|zSuD7;&I#rKxPgtMA2~T-kv>^=L`Z3HG(yFvYT+N(oJik)DFaAHA#3IVG3a}im&`Mr zSu5AqU0sO@1piJteh3VK(MoI25x{xDv^^J7p$53R2iENWLy8vY@ZSp)??yILSigRc zxMh8$-dCfMs?s+It7CJO;KU&u|lx;rkevXyT%IxGxWa9ML}-20Xx zB{;XDHT(FpcF6Qy2bArTyg{ve!S`jT5*HqAh0jc(OUGD|$Hx}&CkNsT6CxyW#50=% znuvA!jIjHjsTSOe5B&VBdrYo4N|HJHOjSx!K`<#ONWU12jDS%D6vDwoj9A1#MSQOY z3?RF{LqI{o(*7!ukV4N>21Sp6!aIYKX3E>BRd|&0NZpoHii{+9;L|tz7f-=6C{WKaM^~{10ZmfNI9|u?7@>SK7l;Tf!!>P=&B3`@m`>2>2 zZ%=oleU4XTtQyobyC#oeV2>Z&aWNU4y3Z@;w@iIxKWHoHuqio_!*dg_yAX_+@@idr ztR3xgK_A}?c{?ZiBQQf&c|~4i2lEyBpAw0uUP~qIGygaWg5Vzsg9J0?J$);7Iso5UCuK z;WjXG>g3=plc4+hZD)K!=?W?RzH@qCBQ{pLL%kGG?i{Vgt}3>R1n3vtx)nmi;7NELToCtES6T?)f7wc83e^T<%} zz{C(;6oG>A$SILwGqE1LQ_I4b=q3F+anwu&p1M%gj{lUs!wyuvU|l+W4CdgdUw*-4 zOPkxGEo@V@l+jyXYKv^54n3`Rrhf93g_vx~3kv=nx2uslTLfx64X4<$b%us(KYBVW z#PGHK_*1Vrl}ZJkGZOo;`=)2y{m0jcUG?{JvtH7(XE3=dD(dkqr(6xSbBeya2HqMZ zH$x@;xc0ucQMUXmX-}6iv2=t&RlBdT_Lsu+F;9(KgHoP!BBe3|?QkVRib01(O2#6L z+@?$9{6T)m9aV(5wX+8RYEGBuTdVyO?0F!G-!EyET=Pbgk@=>U1p^6=e(=Ne2P?A= zkbjTfR2*i-fG%TJHYOE>i$hm571dTnoguid)6Emx3PnhOVtNG{Y^RL%<9f3GY|Thg zNrn9z4ZYY4gAw9Y81Y{aAK&$AiXV6VSH7X9fz_ezvvI}k#ILquyME|D*iNAopt-kR z!u@9vzb>P70%tV>=rXpMqBDM^X}4h9&ZGPR+YlDEP~fdrxwI~DTc`e|Z+TI0-b*5j z+k+VX`@$%-ig@>%Mq_<*vW{NxQC0DCRY%2c38m5J4E(uPM5mePy1_LS0m)gZ)+e!# zs2n;mEeS>$knZ@w*TWGxE4_(Zt{G8$Ez8>TVB3GSod)dP`N!Akt z;C9JYkaz5cnc6Q!%&Gs56ciFlO3<7C>Oj+jd1At)dVc4S`Z63=)98_hI0X0=;~p=V zhahiy!13C|hZ1(an|AyVwJT4$hlOy9R9NPKR++5NubCCgm=@PNe$7-?1RqJnm_u0c zZi6_xmT^>q4|$i!SMNK7%*OGn$#c1lXPg_(mhVjxxGXA;>njJ2G|{!h1|WcsqLc73 zAvP~=)Z{>I^re0UU8dEphoV6bcBxy>0$16xMPaTZQs}p%f0y)FeU2;1*T<2Yv-UIvpywC&4W+^lvZEk{sx{1SQt;3PyQwEVbA+cV+ zT*+h0&?+~#h$FB>4<$rrn}R((B4)J~{bZ=f$q3O_w~J2JNO-=(K!f-25$Q!lz(vr# zyifoHPSgmmbWv+-|8p;?hnvup8$#M|{-g~U;*b5V58Y>c4npC4@pbw2@EU2+o7ty= zzER9blV{@+@3Z|*mtz2@Ol&uyK8JWx{@$N4 zTJK)#fbuU+yFM>Fu<|6f;F@|ouxFCoZqefMo+tM$PdgvGlE+g|oLe+LG>>VO){HvO9fH8qGEE`7?jp~T_yK8w!(S)@rH}sw0jP@5L*B}f+&+P75rsV($ z5Ed#~#n+voD{|!6o~Kvr{)Gxu+1xJLew?2te5tWcuj=-Yd_6+mBj-eX?}Pt%rS3guLPuUbDK)~I2xCi zF-`>oR7{gE28dfg+eX#LK)6wh#ruo*18#JS2USoN(tOMUcm7FF%#kq?1t4N%HQvDz zWXS}E8W-JKXRP`45iu?+Z!Pqda2#<-*JvXOid55<|03IWw? zFHGY^ZgU1YVB|PXu*9!XLzB0e+SqL3c$n5chVO2opVjxaBY$mNWXru2nGb#yUI1KZ+4O*qQk?Jt<>_l9#TPBaT z*R_xRsmLaz`~~C^-d5k>YFv=TR6-?f9%`F7h>p>5_wpgal3!59`}|J_9p zb}8x_AijDt&t4o45vDUCH?baiKikkOeYK&CY|L!*5+td+<%$uD zI-?N?gsz~il@x3sNN*q!#*mY$oIfs5p{7Ja=bXP0kKD^jOM8-1dS43vAkW^#;zruN z4;=%D=5P`HC5p^!xQ-eDySa3uQlqKGmws1dxtgVnZ=&5-x;&cosuA~@{2MY?$7!?V z8%olv_-;6lWZJXM%aaGi$G7aGaO{;F^uN-tFsVGYB1bVYLhj7J^wZ?VDukvH>HDq0 z<%|f3<~0O2ztM$}9s9eZYmgKbu5_1RKs-L| zd@4WHg|C1-9a?s2DbSU#gJnkK{VHpkyM&6wWXCBzFD>vhT;nj?5K9=k7o8b{xjIE3 zf(BhrZ>!Qk02hFU)&~$_xpPa^!6MHS=I^EtXPTOMPFz!~?&NvLyy$>=aSarC6IO1h zxp0zWeJRf4W$t9XFAS0_# zk!XG7{UsRtK?P-Y=m9f`zDp_$)ncek$4^_PM;JTJS(lFumn&a+XBvV3`skax#s9Qb zE_1wXcFdTmsE@AZUZ?UJ6$$d>;szd-Gk#2${+NQN-v3S=XCEP-UzL>H1{4)Q~$KL zXAWja2~sjomb={IqpC+`wIyT*x>(j(^0u-M=~A>_fNt9Nm|B|8b$956$o}HCGUF^e zCcoT6=zpdD`DOwwugr?c6M&9VWEzVJ0d!%9OUBAmJ=%{kpi2rxL@?7ild+d5`eLC& z$tM856rzC>OcRz`R#oJdlgux(Wnq<~{(k_yrHS z0)oyxf8?MJ{l-H##oyer+u8L_M=qWRjR06rwG6kSCdy29moHuklU*OUGOhBb6H(|Gv9n(^FyU)( z;Go1ri$@4q_#wKdl<(qE8C62l9ZUE#c6jBRZt?H~^q{UGMd!z>g@La-%!WHC{LfEw zUCAcTZ;TyQENKx1Jun(^gFi#*1~i%yQcv zl699vmncD&7Y=x;4v~}%3~pON(WF5kK?hWrB|$LaM5bx~EYWZs3Ic84dRZ;j{L~#& zt~#@Ge9Sx}v1EgAC(+x~?8&2cqjPpx3c-UC+Hq*p`3uDMU;o95n-rHm2oft2ex#ie zdY8HHsM2hI*b~QZ_R1mR0;PGzksk)hij)*Pz7k@Een7ErP|5z}7eoNoILpgf=pz{C zOaD5HyCXMkgQPQA(sLhGD+XBq5yui_c+c6oBxDH1NHcRH^zMyE-qzymN{|$v&HSddNDtvWjlvw zsfzv zE54R?G|Jm&WPqX3{iZrARv?cz55{a#mNf$@Q*7Ky3aeA6WWd_)5c8Nvf0g=Q>oqq5 zomKe{t88BqJXt~BZ+oKV6T$cP{SlYoOsApV?jfnc+qCkv@9LJx;ts)1aQiZSU`)sX z^U+CGCvWD9jefb;-+|B1=D#@p9!u%DI0U&%f7>)wi+O=S#)s<}dT_c(I`_^Hk|8<0OeCYV*ZUQB4JAb| z33wlHMOi(*q&&t<+&7E_LoYS{ zE3d8-_YtFH^`^<)UUSL9y!$))b1-Nk(xReZYO7F`=U6h)+CpfNDg?U>nOovwMO>l4 z2sBK_;Xmb43C>UOr1Fo>)kscMT+kH z#!9n&2Ov=cj>t_=en<5D@JwicqecF|W_+mq$^26$-IiaE?Zz<-hht)53?E!LbS5lZ zc7}Y=Iu~gqS#4IjOCQ}h0`Rnl=&LLP`p*}P*ofBv6d;LQFY011Ps@FQ-g#ZP?ecM~ zaVl3t3tRO;pLZqmJcXMd$w;spuvM+apUy%rbv@99Ys5k=U-B;4JpRG0F(h|}ZVpVK z_eepwp1M%BPsHRD?etjwQbRYq%%r-k=Hoe*3>*04V1$o^6_K5!GZ5gc{?nQPCrVQ- zK$CgsvdH0uz*{y(Jf<4@FY(rQlR_s{Og9~3;`FRZTVP9U5r%ke$_z72enzM1EvWzO>=0d6(9P8oC8#YyS6gVXl_Euu+d`<_9u z+FUWeTZ8F$?|+{QlP3ClOh1i1*{rp^=}24+am_W7dvki+to~IB{oApj-8x_PUb^Qh z@bBy1Q#Jp~sQY#UffmeS#S!HUSBb$x*7uQ=C){DtjOG}@WYyHl!%uV3cBT58Znrb8t^p? z+hYpUe7b4Q+EE3IK+E?X8&R=1#&O?nxwSVzfUTH_DJe)xeX)x{7aG|~YURWMjU>!K zFf6x@&8P%?2JWjzn7QRGl&Qk*EEzVI?VhOUyzpHk3oQY0tggz=G>W2;aqj(4g9uW# zFNE=7^?67+3X(Vls-R&}v2ssN&gK)OIrXF!VV_b!FfY2MLa!WXzl-dzv~l9cy(PEd z;~8eA7dnd;1QmVxM7+!l`Q$2tL~Y3SKMwD}HO?TM(twKmXYqn3x3!RpU2~+JIQIom z-RB$|u0GlPbg3P4tqL_{y3u)e!`JH5)5tEK4J35=vGL`;nx)tAEwp9L%DKUZD7-{J znqVBxtyDHqar}wG=0EKgn2>ICW&y#df0X^WXM2Z`>{i#W4D>a_%LU-kuDqvqT?+IF z+M*UDoE)ov#*+k#?^vtSs>bp9_5kkL7RXT1sKeQDgo*6dE0q{Wkr5!HHN&K6lh$BFHK#dA8;8=sz*EU;ufoxyyB| zFJWGq!T0-`73(~|0>YoaogC?w+eg7~H8{XoO351h^o|d&G%8dnDYAA;j76GWXixK5 zzJJ_GV8+Nol=P%05O>&CH1F+yc(=blK0Qbz1d$dxq}6~5#{Ccl7Zt^dILwRvh9{+y zk$)FY`;#%32Ic5ve_M@S0iir4?bNWSkk_X zcdG53yUu1(ZroQA!hCks4lN_ z#`;9^3!*Cv4{<;1NGoFro7LmmVCMNScksZQvVfIZOP&sT(Eo-P)ZMwRY zf+>TAU->M(5&yy$i1MeO=WV@Kg@(5VbvX|61r=f>|9HM6C4^P%RT%n#2>z9tZ~|oD z6uT-sj~u6->r|AD`>Ky>K?A7&kuGZ&uw@is0iu!Gs_>N~x7r%N>y__r_>&OLU+>Cs z@bJqq_3tSz*pfL{9O;i>@>a=}@+m|YNs5aa>?-_PC%_z$NNH7E-c%8rY@;`wMlm_W zd~0A{0p(tc9Z}aT8Mc7wi=6_&(Z}Tng?3~xhga$vXXldQWOw4MaLtJyGzN zYZ5%Sz+~rMsNRJlnsk1{2BBoH80AG!9EhcjDetD3|PNe zDc&{QGoJ2GGB}O)*|tLPkI7S4AtL_aKiqz_(=nHLP3m}yfJvZIj_L1gc?cN)tK`3!yc?yG5;S6_;)0HbHD(3YtkJN zX>)%;Z;3N1m*e>4HCBx{Z<7fluWPUl3U?OTB%L*-knt5|i`tyOh48Q7ED9F;ACV73 zgnuGZl9xnEg)a}>e_dcP)rAy}5e!EQL*)M-qP{UYvM$=TqK<9b?4V=Yw(WFmr(@er zI;pVZbexWD+qV7cyYJoc_84o_pQ<1G)LG}OJ=a`w4j=Atb7t|heHX5%J(`-B>nl|S zdKPpgsBIj+<|u(GeL%r!m!vhE9|Co_>zNy_hab zVDRBvZ5U3a7+I;Q#GF{t*0;N#r}WRS(~=#M zu&%>%mZfBTaP^JSty_J=dtoBJtFq$)to9ZIBlqD!d@;Z2xwhJ0tHUPmlTbxb;8V}E zc6AZs%aoQud@|{jNN{~HYmsr}ug15r3+m*jacC!?>t^Kl-2Cm`P=aGWl5|;X(pPO{ zXPJY8&d;w<9Lb>)GkE*jjrNcBO|z8)2Fn_mr_PIDR8?x1_2Gw3~m|8OG;4xe!cW)!??k$Y^4}Lse zHx=6yhz<$*v%^Slz0@?N&DiO?77Fv2Ylj~5pvn^0;sg%XdTt20Z<6}Tnk7e&eCHg{ zX{ts<8kwcPmG+<-oLo)Bh*t z$O+atK0O2~hSG+3;2xozan(hEm7l zOaJXekqQw^T+JBd`8VM-a@exEasH}YnN9kEkX8IcH($d~SUgQCx@h{ln{x(NSb1&w zKWhp?ZW(_<5h>(}CY%WGn7q11Os>{+Q#rDnq38v}7(57E2@xlr7)6l1*h%yBa0^GAPvrE>-0-Q1 z&<%YKrNrkiJ*|`ndOL+DpUlMEkScu9+rZZYUx45GB;@~OUEnV_r=;Elp8UcW-8YPv zh+o=_!rz%YY|CPI-~o-y2aTcc`P>0n~`?HjbYl5D-k z(jq=ORa072N$4y)DiQ=JO1z~xUSb(Pgoq6;e5KzNn2Nq>aZRi@aN#G!4k6Yr=;hoP zocHbg`(kg2*nLKa)?VvS8kEPDkyR$~q-0^@5fS-Q0GB#%dQq}MWS|i#a$S#ub{_Q` zEi5dmBc$CuPvp1eL@l!(5+`MaLfk*SP5xC>F27E$J8n- z_PJ}PB%e?!dGgL&q`h4+wWuaW@*t}Ryk07Du3`O&zYIf9Dh_2J-?t_%k&pCVO!1%} zJ05nTFwbO(cn38S+iO_i1IF0er&|oa)@-h#C+|KuuRIMk@@>RDN{Xs248^ zE<_tr@S;a_Y1MWub;dVs(%8j)H71Opn|M1UOCO7;sQ$vPHS1K_P#4)SJ=W>6woh@@ z|7xElSQG&iyd2(3J}trEL)Rjt51An!X^99l1PO4|Wc$?zvVv^p0Dz8fI=l%UXN`Yx z$o?Np^YQ;-8hp?f8mS$K{)1@}K`{u598ipbqEz5vtz4A8 zx$j%Kxk34W(t^3x@D`LA8r_g8x$S(gpp^lM&-^@OR>7hK0Eq~Twt{NhV1hzv0fdJz z1r7-F5Y4S?{wyyX4379AL^FVlIFAy3$)`F>2pEpA;(xNGM>v(BP^+H)$>gf^k%A0B z!K_;0K0nskTmi0-Mit#Xu^{mKkB2TlPuPKO^2Qj)u1vGUF&uRaC>+4N(F@_DEvI@_ zE#cyYa*Exh=(t<_FqUkLi*klFh%om6t`-CyO6Pc%r?i(t5(}G!+n2yMk1qQMx3Zz~ zlC^hnH9y(Rrc!SR7yKxg$lzy$A?)Y$_nKNS=WMA!6YdxNY=vliyRFLdbO2;P zPtErBuf`CFKScNylaS)QNdJ8K9MY4Q^SgL11BQe*L%_+6b#|Pd{l`2n9tK*zUe4Mz zH_!j?bq6dBB>ZIbuIHLLqV~%ABxbp(q!yh2t>4n5s#R+*z)u^F*3ayddM8Kk=MYZ2 z1$#z%h4g*y&$7#tJ?u756sn+q+cM*#-+RiA?AssqW}3HyOh;tm-=8s3mmh9NCoT|f zJ-fZ@+o$4skmRboHa_%O4EFaFY`6u(QFhipn25%0!g>PN0Wh6F`nttdqMlUio+WYt3ks>LsK^0l@TrI-%aXS zA?HO;?-EV9&L3wF@IG%$FmZ1`?pGQm%_K8!lP~HMb&kdk4CJhv!Vh>#u__ckQ_|m0 z-hcA{KDD?~y>WJ2QgC{c-!ztIscSCoT}f}&auP7XVUvIP^lplwf9%_-%VSzpEXehN zm+n+mK{m>=j42Vd5s*Hy2?)gbs=~3MU5p7Y7VO=9JSMQ*_?xwIz1O(cuS^)pU=^`DXoSYG^A%i595Gz0F@8RpK!|FTKTyih645 zfBlETrNm7&q$;9qZanfE zmWf)}`ls3_TZC<{0!$VzwtMKBWf$M3n+$qeakedNP&zF6wKZFA$$x_%2=Io-RS@4ie$={P36 zPn};x(9&fEpSgdKi}BCI(4SYxi3wE|HdhE2X%apq_qJPjkpsg41Y&enj%MuLo-V%q z9ou>g9eKOKi{r|*z|cRUQ;##BTJ41g{1Wwj0)c6LPXU&P*4!JDs!y4aGeeT7AkCcr zcFXnGHU8I0ft3f}_j;-F#!o_cneS@ptbe7=T9vSHCd*JgkqMtEew9hblm;TcYwk(= zOfz7@lVDZeN2VUBdsreLdB8tH9YAA;3%)FF=D)0-nW0Y5jRS3d93WB;DL2uxlzyPP zABJ=8tltv-`s)C(f0;)>nFMz1P^u-95F zL#d<}a)cTSyfkJ}myZ>z=d{G_vgHk_8~Ab|VX~m(@sPvxyvO`imGSkM4YkJB6Hb^= zn}+t@uR6#6xSfUU{9DlQp;s>kw{jiG7$))X!6bcn3*qs{wOe}Ap#%TmMW6%+PLUF} zThpn=7@hs9(c}2?@ul4jTcg7fA>0+(5zE=WvGRvgFK7H zifS^kL(K~P>+$x$LJ264ZkYYH48)Zrqn`thXuVHqs** z7@=7x%u6`{M4{--@f?muncZ=51!5%VlV{vYoi{I6?`zY;)*;aoV>jZh$qF*a-9Quw zzjK;tZf+RB{ST8-Qmzc5$5up&cN_3J7iN%@$TToNdvZ&{ux7`E%4pgru}x{j7?0?( z>USGAJx>7IjMsU?_n`85o<*7nWo<61&AtYq{9MvF0A%Fq*cLmV5CtU9U((olD@Cx- z_0~!Dpkx`9WRvQ@2bW;JVqMg$E+|%9_nnB_C$3(Ao?d0ZBZre5rW^c7oZs&+K7KC- z{vrc4HIg$!766>cDS>F{@wgE2kbR(EN-f5E?hwLLWA`Y)pEoI!NGsvR;AVZFwD%Jw zr>H0xuSwJ7vnh%eQuz&iTkHT6737HxVnY2Xr_D7+f`b0fG+EVxYYZhkRN=L>c9C!Wss4I3%|U_MKU4I1nU_qWdy+5*WBlW`+dJwkD7!UCw>xgozX1t<-zGV2K*qBZ0=ZVf_y=|7*=VI z0PN?klljzU4=op$<>l)wJ@dbM2M_7tEfR&L?y0;YS|lhoJ){AI!6j zQQXA}4U_N7F3e`%t{-0>BM?8Jxx!+}Ld`S1YDBQ(4oj1Qs z^C2K@x-yxh3)S=!ThbtOrm~wB8B32;hJc!lrRM_GRsltKH1IeX#>}3tgr91CaGisD zl;jC2w;RQ9Cgg7@s=54?CJPNQg2-atu}7vvIX~Zj^0Gq#0BHo3m4jg;KiZv`Hq5Ut zoF4uvtkq3HQ2+!$Mk&EYXuqzlS=Ok}XjMfq4WBDsG=Aff)1MA@5K`2WI~od()0_8%T>81cK}s&JUTX! z+UiQth11k?th!1VYI_Vev(tR%v2+@U98+IR$-Uq5CyIdQXrTZhm~1-zwBs@D02w}K z&ipeC%PO)OA zRIos+1@0HugEZ(cp2LWE*(b0MuH>5B`H?sUFlnfxNGYZHi>YgfeWlzSs)yu)xJI+*VcYvg+d{h zRL310im>%9?2w&{taVSz($wp3GDp4+UE(Ql0LawLal}BuYG!KChYIcf_O?%6!(Van zuLkK)nJ?_*q!vei)b7bUk*QhceL;sh%OR4aieCa_YW^>DHMZhcWy1GIEbglI=n8{Y zdf(QL54w!twG)RUr{3QDsdkd6bLc~oEZfUqbt>rrq*v!TJ8ioXd*w9bD_M^I{OYn7 zk16S^6%z9Dq#ryI9t$6G-v@y5L>;8^e*$-QoTJfXVSrV?C8u@UKS(}AaOU^?$9bvnoBqA zA)wB9>rM;J_5GN{Pxr<5J^Y8wu>pH-aD7-wx&Dv3CrGxG?9i>Qds8sZP>(^=ugQEn z5PZw!)TKm!RqH1nFbDz$0`U6MuY3hzOE>Y_n}>ddjr|TD-cLQ*)P*Xy63?m@I$j4%N+jb=OvOkLm_8 zVRaQHd(KA31sFc6@V1Nx1kV2UZ-yZlX)aCXvk{@WCmW9FC-NSqBzFAD=0=K%OWtdSHh@BhlH z2Z6oC-q~VKtfa?{PPki5N>`g=!V{Z*rGzu$XSX&MS;lTOc&o0PVH%XFdm@h)8{b(bbtsrSnY`t=gUj3tO6iO z0d%|HbyNXaxf~a$(DyEZuv+rfx`h+}j>zFQ3u(GHp+^A_f;Rcg+i=4_#r%Y%-|Gyd znGeVm-%wKFFE5RnuIC7SHvjZV%o+O5_gW-9IiNctks-pi>X$z_5N%TdDa5$pK?D#F z#B-Vr_U*_(H&O_R!KD`U5k$E7)F|8r>dg39t@`9R#kD2)TF62G_yB>yq6a7oV8TW3Fsg&bHK9vDdy;HX?({?HvEcmq{7ZnNE;^4YZek^~=g`=#`E`2UX)O zF3QEJzFfe9#Phc+&3$pb@#_%0yEq!}t5zm-dUu+G4+@oXq}hL@o6F zl4MI|d!PPXsX9TFv9h@(T!41eQZzPLsNH{EhpM(M^yg~5%z?&QyFK8HC4D#V-7Mj| zk3QMHD~VwETx|zPGCcCpkfxU;2xFdYNew_(ylwj{LN*5WEMQhHV7jccBYtv-c@8o# zjy`qRl;ezphX$>ZKOjEcwLTwD=|74(gVkM$0>dYz`o{IEX-@Gi(#{ zoR%N}0O2k=m;>+jX=5*YjWm^ts~)KrhrhSRC8o#zmnnn_s?R_R45X+GVy^%WrWQQ^ zgP=x1@gGCzKcV41P-J|9rl`VrxDtrM{!INT-JnWrECx?XH#TqYC4xd-D3qXkIMykP zDCWwe;}`GF*D;%Pvp>x6MhoU(Yp7tYU0KpWADI;(7}``_`b{N*#&8!tZwDCe%vX`a zZzu|cNR(r4;*F=J0SG~=*h(x+182LdYL0yuTk35h{><8h3aA8OYdVwZBoT&%dsed* z>5tA+ia4O6gmy+KfiXCR)?&j+Au09X(m4XkXOpk|_#Ww$^kvinF=~rdr;wBzb3i0Q znRo&31!mr<_kX540-h7vn6!~zVeeUc&8|(qd_T(B)JVY5uGgH-rWZq0ydZsKn!}#f znfcTTRpHzCMyBb+EuGW>L79G!2woqm(sAV7YmOiKE5;~mro_DuA363hT*e~H^AlLo zWGMFl0E+nDhPn5TSRq{(kJ_3_y-M#}s$&32Pi()~u{lcuVhBG%cXsX8M-XHa%MD9->@`32r+`z)(1dLB z6^tK~G#zn`mWp6ekXmYCY&a^AOlH~vL|Riv10TPTr&T`DZzm*cHCr9eZ7RZgKh(n~ z;Cg=seDdt+49*KjVu8gv<0(HkUO4@25D6Ck=`G%OlTE8L2L6>-B0a;FYiA}DJ2EGo z1Q%94ENv(D_I~sRtP32k&@!t8(y7V=W z^5+*Djj4izs0)();`r&CA}f5bv&|g|0sWNMNa*|A{HWnstlh!2XSM})ZA0JnN+$!t$T-bndVLC2eM8eI?3Gu7?aKFA=czrUwfxMFfOOTmQzJY>Q0iG7LjEAQ zI{3WycJ?IDi>d);I(?+*XXo2hcM(2L+7+7-n`8vdk{^aw0%b#fjL~1!Ts$#!a_dcT zI+;Rp%#8a_b(-=V7|#bs0mYHTf1dloVIAT->$LBE)*NGh9e+R0N|a>MB!J zD+Q6C1%(ijAq=VDEx`IpYV~1~yao*bf%s-BaMRt!hY?N~y9`EpAy)uI6L&6zsy_Rf zN8efXr;2v;9DEF|t|A#-4Vo%&y%-Xufa8wAT_|4g3~Ycs1yM*`9m)$U#2Op`GDjI; zu(xVdD9k;U8(^(hxH9m{w-Q8$E%e%?ixA<3c#VkE@5f*yJ)LbrRgYyy`G#2AiDG!+ z91pTs3atNIZ?}V46Bnt$nohk|8uDvOG^uV%3_SImSL`v5E`~roO`dhg@^?583Ho}( z%wn*gicd}Qw{hUF1dz2J#o;O#V5qQ|!vd+ynMm@fEao!noGp=N+Z9hJDafWm;eN+k zAvc$3Jg@_dv@u|NYYKOqdfCZpmG?p)*^A$%=WJ*1)7eu-CK|wEzix`~D}TyCmlE*b zoJzub<5wEju6m1QJhoY{k8a`G+WGiGZ+{BP^W)dRGV_d(VgRB?MPERlqEA>K;-a@!LC}Dxs#_j)hc}|6$)5_J7sI~XY1~4=T9lW-J876 zv~D)q*eyxNge2B$a$2$iR2&%vW@p0-;CyI^TCQhESF(gJjq^&kGUEQR^q z#WAGXEL3?RM>k4Qev+wrt0oIGDi8g^?f0$QBzZ6KJzuDYHSy}~{Vg4iZ-P#fhPyzu zz!er(`;(UwTVgp@7*my_r%U806->38gJjHTqKt| zcnC=d44r{vdK+;tA>3W@%eogcd9rmgKeyP(=~&yajuAYwG0$iqH+e;?gvlH?rBvRI zJEb4(Kjrh?j-G%VSg8mh07R$XpqyM->q$tY@a`22BWmiP+@J!_8OLRwq5jw8stZ0j z8D{WhwiU4S3ml3$(>k=x(=u3sUHVjq@M9rlB)>V}{B^$1ucQbvu`U|OMLY(4wfP4wCXulr8t@1F`4Il8sZUka-ckXSPGI1+22(<1mpwJb z>brC6j(+F(G#gj^V3RZVB0v*U?>#)#&6qb48_+i|5z75UE0se5V6ue!FMfI~6G#6l zd@Xe!xbPAD&6Ir?;ymB;V@mPC@$|3|K=AulQ7@QuN8%?E08Sv{v^Xtm$v}QnX?WbO zeUb{b5aF!^gLIaB_BZ><3gr_iz$(BzLg~pIM#NMD_ysd01)c7rqY(A4fC1FjM&NubQdftGx_O8? z>h08>4?Fn+JdA6ua=`!NEg2bGKYR&fP6>QHm)CPXJ-mLF=}SO%5(%r_Cf=I=3Qcu7 z2sJ#T>i$xdxM69y_0APJGvS%3)&KjX^h^_J#sTLvb4Dh@f}KT9X!sK3Jp}kJme&%J zc8}FG_EIByMbofnO#Eoe#{2e72omszD%|DDQZCOVqV5znd$ZR^y~Ul1c8e(GdUPxSxY`vT^#M78F7M49AsIh_9cA+G*0fj+D=;Z3 zuDup7=JH#~3~O$N?g3@{4V1Di5?gCwM1P+aDdL-dV8IvZRg1v@NGhcwGMQ@6K;0xx z&3@&Bcky&Z{85ny+N-Zmkj>z5h{#R(is9L&S70`QHe$1`r`kdrrP5eXdIeEl4IG@o zYIO*9en4_7r{q!v&)08%UHCs_{i~veRn(YD_uHT1PgCJ%WZw14jtF;o_k+gOaHYI^ zzC+5~Z0VB>#RH@5ei&b7s|bG6J>;Nr6b;+yACx=y7L=_bRrS0!;24`RBObkqGG8-| zqGg|gc|00KQWdYnEniF}5D{%GgP`e_Q4s1*Njgsde@ zT^89C&0REZ)IP_EUy_1(>fV?SawRs0-l=i7N_z7{(cw41ss7aOGJE))PJbqk+h#tk zG|1B?H0~epnv0gE!u7~|(e(&Vv$~gIHmMdoFsi7j=8PLW0k7Pu?F zmC8q*VR%~FQNcRj>HK`(`BT7iAfX~Coh{T{Pe4BbFWkik zki%#Ctj41`qKU!gSf|;`!n|;-4)WStGQkM&0-pfwkeuDw1PkE(&z=nq;!AM<~P_ zi!)|!VESp<^BTASgGQ+CF;%wsF|2w@b+xsa!yDBvKUF#YlDp3gI#uV^eA;R;=uTJ1 zD|HNrF4?_rj4w|Fl}LgbUd*%N0wGpOx7vO40~Pwz z=PmmE2KmPxe_#H|^Sjg31_1IKsE0#e(Lu!QLByw*ICN^+^8GRvnLtvIE@E$@DS`?~ z<7dd`hG}iTC|K#|mT9%L#pf&1-Gyhk-$qzIxp+EuVcB%|bjHQSg&Pw`(9YlVL#fPw z1|}U=iy8Xn_(|j*xmGk3$x`RZDMI-!hXiYCyv)UldeqmPE*cfEZv{!$sS9ZS-c@LO zEi=?7j+H@@*fwxUxW9D#Rr9Y~ zHa)P0$m}bEfy6PifAGJiWF5K(N~58u!bE}?=VEjzAs>Tky7OUIEoYiPi^cnxU*f00 zzvWYZRq?+-RH(%SEXF0a_J*!)8pUuFzc)vp-^UVAjKpDtD9Mw+`2$`}-cNY+xi7{$f5Z(yyb zEO44)@XZ}a?u0|0UK3~Po{W8a&S<(2>}r^JS!d{nWpZ*_IrAaea8v2I%<~eIDQdx zm`IXDW&BICD97I1ve_7^^A++jvURq(1*VP`4jAvt%V3ms0rL)%mF@HDdsJA!@z%o5 zFC$rppImy#t!R((dV(2gWiC~vgg!U)M#+``deYfWUE8tbw%l*4`8;lR8uO`QylA-f zi+jOFt@jt=8+Ps(sD}1mz>kqBL3}6U8@6Y3QFqALj*1m$^o28jAo)W!-*o>6+-dO^ zN@RGap#aLfrs)U47zQ#-JC<%V~*C?^?%8{g(rMuV#!s$P>di(s6e>DVBV@0WxEm2eG&#Yft~ z5~_9aKfYcN1Or4s7fdgHFy_vJWf?@<M^pXiF#aHbJ+KFK{g&O`l@YwDR^Dze16-JG6U$Nxz4uS5;!lJ&?^TbO znhNSMMkJH*`w+K9V7~%Nwe*?`G}{MF+Zz)*b#Tpc&wj;H)kO{)m)KelkCIV3@#T!#{>%Yq`R-aF?9dbsR(anJ8%o0#idx!d(P_az z8nx~5(b}3Fin$@fpR)7XKRl8sHI$nzyNCv1ejZ)LlD2GEQHigXD!W~;q*c+p(=8X5 za`?`)A_bbG%%B050akW9?;l+z>#*vcZj6HAH@EjdlMR*!RyzDL6?sXDFta+&4HVz) ztN?q@DSMsmK3OjnJobvs7yTQ#OGI%!Ge+khLgjw}T%8D)>gVJoda$c0ZlCFzrF8x` zz<<`seG#jahbx}n5v!y2_IQW)5tOYp1I6}dQjgA!@Eq=H9;=y-r{pCv}<44-G zfk}t173lp^G!0p=>Uq}%7~z>3430x}4?TXshCUBEZc@Xg=zYjZ%HG+=Rf0}Zsz_#; zI%Y1fHC6pLJ_4WWCXw{$C0FsblIA{Cvl`|G03(^>Rc4d2lDzOEc`-CfC|Q`+M7d?c zt2;3OJurnw&wFjTKhEsBL$V-^2hH!blhp43Dz z3?VnXv@9O!uegMv{`z;8k0CKMck==#0Rc%HmwR~vT(F{4L60}cD zORnIqLeXr2HNWkROk7U=-2dpkeFY<8U4gc2LGJHDyZEtd^xiK@xBp4#{~#zXLFJ5M zZHEkB)%e9d^>Q#x7F-#|8vc!aVQt-}7x-FrI4l@dMajZ2*()8aFtR`J#A}&s&&b`j z?)@AaULQ+DZrdJ{>4Q)2eXY$i8w2wv<_A#*h6qc|XV}y0RPS;Tjy4>X?qsQA#*lP- zyv{^4Lvn}xgyUQPJCpR5xg~2V@iy#0sNVbsdR4oPw*;D260VRl1OaJ(n)^*fTidsS ze?qQr7)fssS#B%v0^A>|%2Ic+=1Wr#Lx00lntlkF+J}-)&gV`NHTKZ?4k4d4W2M<9uW-9#Qx~U<5cG5mCQ~o8DpxM}(^j4s-X1NxdF)x*n=8lcUd)sV zXpi0c_%#RBHQ6f0=`a4#UK`VjWK-`N@AvF3!>GVGR_YFaZVu2=* z5dk@Dm5!hGxw}sTzP7ppI)WY$hndaasAWx;u|=tmg-{~`0jhxat`K@Q4$hZgH-WUb zQ-!ipbw0~SO%4APm4pM1f3jTc_$zN_%n#$}>2=nW4-?R7KWGRg6eQ$W+mNhsTMHwE z8n~(sPy+LQtFcCwwW%Y42__RBgHev84ddbM=9^kOs>?mnA3?XL^jUflwYZm8{q&60Jor4RmSm~(T0O(U=`WRT(l#lUjEJb=}fkyl*@$;1}p(BYanC z7$i>r4*5Plp06GHwH!2iYg0UPFM2AAUUWCIqK6Hibg6g5)2xn@GTwm|m8?~htT-Lp z8FdmYJgAj69LqE$`dnKjsWN$UWjP{ijpjFd;nIN*%%ffSMClMsDz850u^TZW9#g)i0gb@INeNy)1%^_TC&v}d-)P&JCMo=U=;v?JwwOm7QHIMy&-+R* zGaDt&9mWv%rP1nV{$>G^w*VkgOb1f`K9~VZld5ZoA?LZfyI5{4o8G{4$3biT(1`wW z;TI(9=#*m_Ft&hgMwMleAjb{jIzkg!71>-o^U2D?AV}q~muO-~augW`EIq3esPXqX z)%DaI4KDWo)jKLF*FGRH(i9hZy8tV91t@174_2X3m5-eMBtcOULgpua1tdQWCEPKd z=lD|@6l}E^8b6qJe1}mBR&kl!YNvSO}gzrw{&wDLuQ7RJKpfQ|XX3yKze7A%VW&`x2#P4RvEYrDZ$=Z(|1Jz7u5C zsTr|oj3ewu*;3x3fnr3zMF&6hm-Y0Dk8vXa0A61&$ucnq4PY>^rUfYs+4=_Gp8M0i zSa#MPZ`>qBX=6i_tbK#%Jgh@xGDr5s8z97yAzhu{1~0T*>a1pMX)Qnf0?M|`1u*_7 zh?#|%za-?|9-q8^VuVt3-=V9CA%#LxLL8u}@pIc?oG13iLCk=_lyr4BCBQ4~ke9d^ zf{8Lfs6=EEZo8*OWZ_{3E~*?2o)!#{G32V2e81q6MNHGh(pBWSweGHo0u2zigU%LF z0|VU1rG`KNf{S`-&a8t-pULiEn(b-+I34i2n-~1S)I_ zavz2`0t2~>y!I{!1-t}R>O3QDr;8``Q`+9yL^^H9rsVJc4rCz^w*7%@DLfQqJA12g z<%uI|o_?c{6v5;Om?)9*S05H$jpd+2LxbT-WPqOE-^S4V^5Y%nYZ{co?&NM?ksjll z!5AyBp~cIx@nqcEeSuF`0={^tK&E28YII;)(C`^xnVt5hU^HfE#F!Nx*Lqnx>Qw)w z%clQcJ9`oXmB2_tB|3-x+fIl)NSK3BShCi4=Kd7e8AiuHC@rne{9f?(v{=r)kub+z zdnbtzp%(@p5y+CwQ4KCSCoKz&N+5G_P#=giI+zmP5IW5OJ?8S}wQK*wmcX6U1Cxg9 z{^3V*Uw+z-C`vYTv9IW?dkrQot)F=(xAG$L*3B$7e1#u3(EX5yoQ(7su>K?yC_L7r z=oX7NGci!U!b5!Doi-#{!}HM6G(bHsorO@g@ssYmx9^r?K7QmsCP7;QmpMY289y)9 z$$zOYi}F;PAEV3TRHr5`!_x9-!Og9I&GDjOBq+|hL#mR(r~U{egtxeH-U_=&3x4GN zZF3DxMPc;Z_=!1i)-1l+X5nm%UnXP}=mH?Ug=M@mAFO z**6i<<+x+(?LJ>rty-b$z#&jcp5P+kB>9@Z)2l5K2i0)K`fDU;hrNO4m*=m3+vEAjn$P28jE^2b~+b=bsgIBU-IJ*Aac9`=-mm;0gvf=SdUi$-LP?8_0N7hC=vW7 zp-r}eL*OE;1LM0zHGL7wzs7A(<$4~(#+*Ett5)eWpA9f-PctI;#L26pn`aNJ3MBsoD1G)7e0l08T*Z2xp66a~ORKD%&<0K*#WdO=TVc%b6 zut13U7{^5*8F9Uq4~(W&CS{RbZnQ)uV>{jK&e zupBNT;(lO95Xqo9J~ci6;S@i?DWGpSktEOUfc)q}#BGUZ%q8-%>+B~LY7s4=CSY1U zC5FhkrmQ1gDZmCfwEz=v@&YbSXayb$;ipj%%*MgO&-hY_e2{m{NQjTP!S;{69s=}0 znY{VQCg*iQCldn2vRw)AJ(Rd&sIDLC*`pb~KZabBU{AzNEI}ftYbWagbF?S}2YgsF z&43iQrKIWGKY*%zI>=?NYi!U{_;W|;bLrj}0hs^u4z;ob>UAB(#K&HES6|57Y(&3< zT(_xkxXoub4fF#@Q2&+^K7FnRF*(*aI(Hq>*R}7gVV!CJc*EL{4sp9GgzQs`l06#DIVxVck1;5z>s42I+f>^DUfwO3q#<^$NW2 zceepm2c#;JV~l-@cC7q=M{%yI@pmJmC!wI}V%vUVi!NBYQP>UF%Z&A(?-hn#cuSYuoBiFqg|mvuDuRd`)py;7KHD z1HSTu6%yr;bJ?OB-ux$;(BUcrD@WWu{0(f8>E#0CKf2z%mnVQ-HIk`qzKhNffxjoU z%h>)bnN*hFK9QZsGPuo~&Pu%5it?AO7wsos^?qOL^Y#oC?^+GjZnzpRw~!X9l7Ea@ z+cT+d6#Sdql*gcWaq@TOR#!_(7Mn@$G`6q*WZ7uyF)~Jqnzd{*?`aCju>z7k(neW` z`g`eSQKQh!$(i5M`Sro20VqMu@vD3}E0Um{3aJ|LZ_(}d2>#i>U6U|r*b2Ar5Gf&K z(}4%lOe>T$ksJbXFc7=CUgkd}htzP}SsH}`9bL;U2!G7U60l04sz-~*%pTfAn>|An zoZ7i*wD>QMtm`yA-59tQou53BvDd0Wq6kr{dlzKV@5YQajH0lnMP!2owgM@JqS>+e zICMyGUSHOIiKNLOlz?PzXrfgTow&Hq$a}QKoqSfuHijLw7N3*#pDadCr%{8Gwj5Oc$yX8iFLsr>myzkAP=<)DTc(*cCg4hM4-Ub)@I z=eqr0$7!k%&HUG`bP(6;!AvES^Rt9vODXXBTbtAUyi;^_;;$!9-?tY zVvqZ3>g4anmrd1p!CRp2il0tP$0EVd6OXEhwa*+=Xa08k=hM4D^2-31QR+0Kkjlu6 z#XtZoW^#+iubiaZHM7u0TMoannoR1)+gD+}8rF3jB5^@Q6J?r-7i#4E9@m|SCP>W@ zxeVPF7+)kWp@96G7)FTKIey)r9ftD<%Vs=w79)s4ZI*PCa7t{Bo3&d%)f7EC|KW8n zjT`Tt(%Pteakp5I;a#sZIYVl*m5RLDUNp}$O8O^pl#A~~E3W3=Ex^5p669j}Nlp@P8?~; zg(2QLbrWI{VSDpt9u+;Umc#5%9g!thTE1 z;={3)X)3Y>9qTP3@DBbyYl8YNb{^Zv$5h#jPx*m zH5}D>wVPHr9O5%C;7$=;4p8$fxICpSu=Rky$IAkToq5zCXp7LGmfA2>#)Ls#4eF-@ zC&|qPE^fKtU0Sq!oPTTnwx<#YnXdoo4gg>YDUpdd;SxtB^m%EnjOl1dj?A_E4r!W} z;UNyVy^gLVYf$Op!fC?tC?9j?X->6v*JFb078@N0;ye z${T7R{L9f%w-KI3Qrk0pMKGL`IBeaTmQYI z_4jB=cug5GUzKHP#=0!jkLFeNFE;Fi{Vhj<4pTW3RdjWGmKs3b$cfZC6EG|Hqgf~| zfL6Df>I&d_Go;p6vSjJ3O4P=;Q2oYXY#qV-udAzxWuQRm#*u{eVU69OV+HaAMNfee zZ7x|H4lCV@Z!i!t8D-Sq(+fO^S(#BLABh!kxSR=lOZ!}j(JPwUyl@56+($)6`~IffG#@nf;=wHg!G9wTX5M^jNa-ytt4W8=}e zZD~e-qg)DHqb!qiPmmESx}TRaDN#5b5+H2LO?Wjg(`yq_`q9nY>e`t@EE=!OdvF8P zlk`X{=D#Hm8XhiVhZ6U2l4qmdg^W1N2P2uE zR8k9Ot2rwu$^+O|^hs?H=kLswi$kFhfLng^Ebzb7oA;t|-U3T4kg;&V*M`bC1J9(i z&{pfgN#NxW17H=@UoqheU8P27ZT=skzA`9}rs;aI;4ZND50rN1JgZjgi?>y&VLPF!eb?e07G%GMey2BARKe6gywGq|(0!q9uA_uM&BNC}%0v18nwRza7>NLh}w zkR}_f(;s;JIf-=e08)O|dso~iUrMF436_Ha8oHGIhUa5C>RuF*Z_uD+H3{ZL=2FF> zbL5ejxPA?u$(NRImPk8cU+2RC`?_YYyX5=%cZnO$-s}2Wc z((P%4+JmJvzZN%9vw#)az}Oob<%Tv|=%qHtXH&qEbM zm>jp+zKo?lj#{2}GF5Ox@{BxVPq~n(!YW4wFA&+j1_O>Ir6yItL%y9Rk^N$c)KOme zo#rQ_a}}>`PY)6Sd`6S8ila5tcIL#HnX8(vEf0N6(*s?ON!bAC1Lkd zxT(uRr^I1@vs<_S!#|F5J9`z)tu-611JC5VrUw3-j)OCw?(=7MBIoeWljuvS8Od<@U<|EkuT27o?ZDrdf-lXN99X%=7{?BItfD2Y}?$5W*r*2!TI_iwRuHAWG zyTOFFFODt@0S-JZtLFIl72YooFTFQWiK}aCqF-FWbbNdbf87xKy92M%Y<}3aMAIlzYx9g(CrubiNenSq$Ys3@mf!Uq+6Z(`J$a&Edht|8aGk` zaG2_5^Vd~U{0E&q8dLB|#<8xo7#w`t}4$z4e- zX@-?JtHMQrsdxMjp|`DYCg#5i0~c3Ws|7dHclDM2%|!SDg_eS1zR;;11fueC$W#2H z#S)YllF{y>+z4=@6c6zcunv~rTw5%R9s`(Fm!mYV&-o$>Je6rmPf;xOW zzWAgctpC8{Ylnsg0PcUezFH@sY%Q;!d2rlXjKO;MWlJ2@d;VQPJdUaK9OPk)4>k8? z5TXH?3{1d?ntZ5@SdM^m{Zo3DQ>A=ZK{0DzG zBi`;UGjr(PK&^4QVZ{el1kl|`HD-4o(c@s!0_ScVcZ_pDU74mE=61eT! zc(QV$srT;cUH9geSaatd$Gb^Z;;ZL64WbC1<Q2 zD3pq0j36vD&oq3MsHqnkbW#4>Ui4Uy1ZKhr%h(-4H7K25^~Xv{>RaQURr~PsIP1p^ z^UZPyj+Z4dNqWde?0S43zDncoz3DcgK(#ZUQF}8qgn3OoS`M+h$G_rw-B}#S`ATAx zYny&?A;WK3Wqh{-@?EZ7TN26DAk`>;DYRS|gg_>x8v%}|c2IzjibB*c^Jbj_8BE4B zDc8@H_Dm=_9~BQ1$pz-5d{P{mWwICzW@?{wd1_su6x{ZeR)wJiGcuOt4w^2G1Y>XS zP1Z!#U-=i;iFG+_{6=QhT>#1rFBipYqh)Bwtn`zuL!6utb0qi4y^e=~0Bs?*8#G9T z2SbC3Y2)|9@r7+)WkBKOI~q}q^#3)z7QUc1f{v7!@AL~j-(N|~*h=Lys}3-I1TM}z zx9YNNY}ajP?uhFjcCS0|t22G5q?z?Q&(;a)TAO`ZCTj9qiT+istesZRWn6yuunRe% zGG&yC-W9xoFE6Zp7pNDUs>|s&`$AQmnM0*@{v`_+k$0ZSwmf%erx~^hZ~pG~=8oUC z27#F}lXm1b#LPrE`z^w4dHv?y-Ty_3nW_9_SQVb51!1*HO^sEVB~ZDYNN#cj1Ff?5 z3O9>T>Sy?nyPIb6+4XPXl)aT0Kkt?F)Xsq8nOzG=*nMQuOKm?MfY3KvR`I1uNnO?J zV0zg?WRI0XRn*HcnMxn5&WiPO_!H+ zGjH-9NBCr~6EwATbl%q7mY4L56KKRq?#JtrMhKp_nTOZLu%W56N@w3Sb9iIBgffQ7;BYO$VN|oedhhM87b>vOM$TOEnjNy3TA@bl>V`hjoZ|va1(;%I@`} zM%_Z)mNsG5X7rmMl#-Ly6?gyY4YLTBf*zJ>oc*|XcG^n^DZ(_>8zv(x{KN-vTnM6O ztIZ&ee0JLD0?=Re1sBo-uewk2zVG#R$leS8#u7s)h@OMDP_wx~bB&#GCW~BScNu z$DnnCyPJMjX~ne}VfE4($JGCN^2)16(PH1zj(xFCGH8hvtVD(m|=e( zLU7iX`ia!+c2gN3HBcZcTLB}ye43hHE~v3L^}m$RSb{gext41qp%MhNWblmGk}I^_ z@x~M}R*w7;{(0fQS6lm0dai#)u*bCslhk&2h=hDP@I#C{VH&<)eo>`dVe99cn4#L1v{DHTVLB*_pQItaZBm#^ov?YqU6$ z*Zd`6gEOiGZ4k}g_^*Q%20Re*(+B|$t+cki(qQa#^_<+(jPmgWVH&eW%6?axYb`sZ z(*>14WFQCXUsJT(oUawUagCJMxDHrl{p$#^?V-m-C%Q`~iL@t|?Tg|1X8Eh$`cl?g zYw5p3)xG#n13mT}JWKS-D0T_kPmFO#j2A}aZL2|4h@kC>xc=>SCN@{6qWj6+kJK&7 z)n<4X12MBxLHLUnhH~{Wy>$Mqz4LXA6S6j0?Rly@eQ#Zi6?woH1<3sdEvIa{a=|Mb zYBP$u%O#JQwZ5#Q@VSzy|DQKdZY+G3n4Ld&`=n@Tj?V7A zC$$W8Wi4aFh7VY6H*k8$cBzw%%B(BnSbSF=GG@v0y?Y3%U zr=zokWr>nhneU0zo}GOml^(1)x?RezPKvvTM%q{=kfa#>h1y36rEH%8ZUZU3))a2$ zPy10<+W)IdlKmfiL;_wZ!7Wor|G`I1VEd1VsS|8&V5`zICSX#eLmabA7DL3!a|sBx z?x(4ADHza?gw<<@sDbFE5o%AGf867uIN=za%7)7;nL2DlU~F1y$~|8`5M3Tlz;?Wu zuL0xT(jNyB>B;2>y_tbMDz=a)D&>~K7b#3*1zhOxqu#_msPCRh$c|I*;DRXF#w^vmg z9*&K2NsCF8C8;vsw2X{hb4aB)$cX~(aj}0Nt_ZO;Kt(;&0Kl!QZ4pOz$6ehxtJVJ} z^q!K3$azu<;m`DKxa3292`Na$*9l%d2kO{}kLE8w0k3_cqe#Di`l&vasR+_UmDgUX zd#N-zMJ7>vat92YLXVO9Cu#53B_q(Diaf!%_rnJqzMJTm(JuoB z%}Dm5+vuAqt5bQshIx_W6;yH@3Qamv6EbQh-b|n4nP8KgJ_*e?L(CuAEOAiGHu7TN zVbKL0Rr)IxFCS0bt6Sq+7w~#he598f4Sq9ZMNzN9=}-^fuDTeOAD3K3npn!@>_?qf zP*~M?{YRf`v4UxwrK$BbjmWY=7|&|b3ze;dQFH0lVGQHOl6%0_?Wxjiy1O`EjxOdr zMWF!7K$0+p6_B^kn{5n7?7H@@9&gnwRmj-*F&$x1)1+EkA^&vixkcw*$m+z{Se$b# zlo2`hJ0Tu-{ozBdghsrQN5+7*L3+1hbH}ZG9V5w!Qbh&qDJ+O%{G2C<2Em9kB=&mj zs_pE=WL*Q)h66Wu2O6UCEnecct}i*Dg`1&kF4M=kYTN0xrBhtc-z4pExB>Cq0oGSH zH;JCt_b4)(68b0WO116I%wYn0YR!2sF)>Q7AWahdef+OjkGHM;7cVmRHgq=TnjUyY zUa?zxMi$X(VMVo@?K9I_xKSadDlVB*Q00M8zD~WgbdK9=Dt~qWQYb+uf;rC-NY!$B zm=@;|PbUEy@s zwk0WsRpy~0N%P;{Ye-WTYsI3Nx|lw3f0c}TxhPyt&MLcH3YgH70?Z>Oq0t4%DZ z;$<#OKH8HP=lkdsNs#)KT*{Ga~wRwt07kt zfaX~I)YN{Kmro8LBjNq}OWI_9LOKs!K)PLH-L)U#h$$BB*+@#pdI+s5#RU7qhEk{> zH)q*aQ2|~RopDnhrUUkHy{vim{3wHRFU5xU+df|THx;jiQubokkqN6pKE4+YaJdFh z84AY%FuLRy6m2FdMQjI!*hO z^o6`p0Y3=vF|=84^^bXS=v~^;15W*eYrFp-(c*JDkGYG0-IuZb3HNq|LO0hM+WbA8 zQ$&@Q_p4=l*9AO1_i^D@De42ym(BzZUuuc_3f9?|v`5W5Isuf>NhPeU;g`;?4yvcs zHn)IfYkf0`OW_)(G+nQdx}cA^wfI(A3FYii5yPH5bPX)#&$}|Y{;yhwE3{`QuS(0G zG0IG2GcUSs_^i9@V10!g1TOt|zW}BGHl*y4oGZ^@y6o@V<*3noNv~XJq9AOUbkmYi zXqSjGt?piwb=eOHK4h(eD5S(-L+)DM7>o{IZn_{8P@0Df1Z50KMVzR6Y=5I_6rqm^ zmiYap(a=uu;^g1_LGtzhk-oi!+jgH=QY4Uf^XK#8GrH3V-&U4F+az8GCY zmPlJ@wb2!W<(}OiJ)y4ls&ngRsf*1Y1Y5${)42WD#`6#B+c_5`nK<5>m~SC;ad_9D~HV&3WwbgOo)`Gx(*5!K*9G%)v~A7 zt2eP=6=Q0EKVNVGFXg)XuP-_5XFhD>JLT|YVS#3hniVPHZ*3@_Wj~ch$#<>BDl+HB zLLgyc24h;$6;GOf*b|qPgUMg0?d#_v z5KC&-;tZ2H?OYVfl#nrd>3ka zd0WO$_uUT`Hvbu2P9!YfD@90Cvh6tmfE=gyy!rR9Jzu6)F5Xt&t_R$1Nx6|jzW~19 z@j@CZFd(PcERue+O|}xvM0NOxGr{M+DVOi9inhl>$W~CC+m^qh| zN^he*GN}?FOLk%?5ItJ}93CED)NK(-78WbyF}9O2F~wN@#9OR_SGMJyC|Z1L!E{8p zCFdC3k%CEz-4yZu-pv;k97_0s9~E?ehw{Ms+kgDRZgurr$ySKGDI`WS4!8E@vdl_+n60{xL^k3u z;0@ovjLSSf9cCOl$NGMCzI(#NT2$(KMTdbN z1;aVDqoy|I8`(9Q%FnJxABQvU*UitZrzXqbs zST{5XS_U@O;46Mwb~J#%i4Bfw29x7UB$j`GKapiXcHp=>+gHSnLKjU|LYIJWJA$No z?fzfpMx1GS%>>zq*mmO;SXfkV;qm8s@B?YgBh%?==$(8Ue&0;OzwE5iE@-MbaC|u2 z7D#x63z?N`@r^FHkP1o4fyyIjdWh+IL?PcGXPbDU^D|1d)Jbk!Z15@COMQth#d$4( zQd2PPYvFGR7&=F;$f(6EX;CCI7}_X6#(-`hcjIYG4Y55R(jnQyj4yXBsJFx&)mI8f zUNtDE*C-5S_JA$otOzQ!Q%j%=0TfIVnoXB(IFC0Dy+RZ}9Sum03*_4<51!XOTUTGv z9CkFa=6Li8IPPO8Z`$@Bl5sBl4j+aD=95Y_g>u8^d%k_91O~{()C#{_vPev0SvaoU zHU5e1JJZ0XDg=B#*|a=%9#o$}pyyxvZiR#tLT-Ow;DuLh;3VQ~A|~@GuRJ2`L}}7- z3@cZ4n;hTCMgT#A3&a{m+ikhIR6jK&C&x2S%8&I9x8F9=IZ;gKU(F;)^O+BsG5HIQ zZG>^F^j2EFR}(D<)HDzk~YH{%6}bO0o>^` z-gFe3RNX8fjDv)&fs5)r*S^RdY3W&VWg+2KbJPK@8`U=YU0K>Aw&-11X$6{1Jg=`F zN?Sv$dGS}-V^U+ig@{t)o^)zrv#T^HmKZQIzrh@bux$T?GxwpT zVxH=RGlYVlx{lhrkfh;n_r?M2)nV0M*M0Uv)^7AgD*4VELQ+CWEev5_dlVdJQtmd5 zFXSFl_PfY#QZC;J1r!Jz!^m!e7LnK``0IZS2s1e z`uc9w9#g1_iXl`*jC-Z=0Sd9P`s$*Sv8EBy#xOT5e33)%*|~y$&^90ekgD^7O8DQc zsD{*~Dz&`^(R<%)%Zw-}<0T4u4tQ-KzxDT%x)4`dBz&`dl6Hq-*|t#!Q8drD^1fvkP3q! zfk?u~LyuWk3tht6(|UxTml@BYGeeOI0srU;r;cFG*oC)jex{*KG; zD{NaT`7fUr@+D1=GShr4;j1jn^zY}1;W;D=FQ=NJWv@c7kCltky9&;5yI)6bnMz@Q zj*>72^L*I9vrNTAREMpZG+k~Q*Px32R%K02ul)q9u*>c`rd!?=bh}Q+XjIFL$NK3! zvjH>@i_h`1*<=vmSc)*(iZI2pMJ-^ugnz>V9ToOym$Baus&&O+y7JwAAU=u1YoA#( zppOpyy=;}DYu3pqfr@@oxi2Yrt%P(Kd494Sk>v=2X+dndW7{|c5+o8ALoC=Bv}LmZs~E|s;OAtg zQlk5<1}>8zEt~(>aN`0$Lei>75U|citov|8(nT2Y&akCTrMtS$SV4cYTI#+NoM zfuXvnTdo8`!vpS00a%0aEh3w(QwleE1@vTkTfx7iunz=d5Te0a*k7`C?e5K2 zR>9p0cF^;tQutW?3K``Vp*?J>VzNPtNdk9VY7J}v&GC^;<;+RH!D)}1^ImDR5 z#zIL>e8*Qd;$-KJxu@<+OKsY3QRCbpDxY%k zfmg=&r&W6yPqcfu#M>n&wy|>}(CERaw*yE+0!aUWGXh)|Nlla|l_6Y6NF&||DDnet z?FmVj_)79fc4)Zj$X?~krE%&hRHq$2ebv`Lxh1_$_K9pfk9Bm zR$dPk$&y;PyQVH0l=T`q(c(F66kao^AqF}RHrX6$b;0+h)aOqer4@?rY28G%7aR7v zl8-$v=vyCqB2(qgdflD7(;iN2LnYqgaE>h493De3#ACB3Dj5&?TfBrfY&fr{ktH=z z!(XDzytTtK@*8f|o*-O1**pkOvycs0Fd)kw*Pah z+$PZcDETTNai4srk0NJfit>c=XFIyx1;wQgw$vEl$aQG#ZRoP6zd=VQZTO1!c4P7D zdOS;$qfXzMr&xP)&5r*Te@mdO$6821HylNbfD{^98)(C3T}YG>x;sfv1(ar_f>{5?3#;zDtYc`0O%A%6OSO8zxvYsb%%Z+qf{|a^hBFJ zQ&#VK$0ie5{I^hv=7DUozMDu`jkzoFBSL#cmaeU(;|X2gb!WeRU9Y}-Z~~)A3IK3CnYn7m z$@s)Wm5)xR+3gv(`gX2+7(~5}J7w^WVz#=031w>ugU>N1`s1!Ll5|k?6hj=bv9mw|OgXKb9OU6%6m9{aHpWyqD@hShyG}J`_ zMnwgx!Ci=OvfD10_g5o}ZGDK5sHQkafw_*cn7;%^$9HYp(eA=K9`cC{*{t0IEup{C zu$X}p5<&@`X47%{%^y09#RW6fSm{s&v@P}4MMV&g{rP(lOIBaN*yUx#f#BCAm8Vx{ zZ|_7r=IET5o9-smA*0c=k))i4kZN~9b3oTFs{0ZgTG!En4!6QR0k8-Lmd(k^~~0RXnYH6pW8BgE3e z)miTo1?_vP6cvio;Rpx<eVz#B9KK*E*JFAsn8!ZC>Ocj<@4d*2@DmjXZ@DuAwd zqF^Op8TdV&vw0!$Ye|FNJ4G;;NofTf!$>rT4VO2QY!-wtNeQbW5Figg0M*HV?J!?* z53}ElmlmY5fJHhq&5L$_D08jG7}V~v&*Tsy;UKvKZ)r6In12qKwKw0;o8YSK%op7~ z!@B<^r#o{$GjQ*P8AWc13uXxl3B9Mb5JP|G>j3iS#-GxxNJzj`wZSRRtYS_#2?@=U6sNrI+{8KvKq>KiYBe-*d2 z?&16TbDulRe$l>IrglUbJ}ka=kw_+z6);$1Gxa99*e+&Ril+e&6Ru(!)&0O=JJ~c( zA_;m(!@!!JP2hWc(&*8jA2g}Ktj$4HERfQa0U~pMDxbSB5yAH%uC)TISe$el3iD$! z{E_WA(#F{v8yGdR{oBu9{X{GNRzd<|pDGJ^VCKV0kC^V{y(~Udjw*!lFA| zTXL-m=*}a$-acc|PFkDY*Gmg5T8PAR9YPP>j0eTSQH-4MKcOb%D4N@KlgMg!)CVDb z3am--AGqJoU;rlILyX>z(!0C|9NI{5*s7S_8G1||SE_FXj)a~rR44crZkcvhkGvQ6 z`^B*!fPPFm_wrT{o#dg~BCiU*+Mf+BK1V0O5OU_`Ap`S0^~<>DCswfEWkFDNOe=sv zTtxCv8UMj_UXQfKWHl86V-B35qU23wwu+5f2^AG-1)}46KJ%HT2eHDX;G9xB6+at_ zMoeDIDEI*6aBnmPj8=~G)pmBv{zozjm{X(v{~%v%yNfmbNdYksHvyropWe zJC7q%bT$w)i2{D;D#Mg zLBhV=w505W3C(wZV+8E8~kDT5)v18gp~faM$xRXZC8`++7D! zR3d|HRbqobIcY)u;o*(E?xbG~th}_gr@eKqVt=IaCyN$VTpVFet(Vz2` zX4>fV^czb(^{o8$`Ir7PN;|uQ9W~|Z+2YFG%|Zu{Q4=A~HviLQH{h^wpZD&@{TLGD z?+dWYOlqRoUHLhr8(JidH6Inzu{ZmHUtixa8 znq*#A@T?IMbWr@Z&#apD?30KZ8gyLAkzj9NKA0;nWUJ88F?3U)v75^vK@eQ-)XAG( z8P_(Z26I1>%%hDsjS#G5EXE)sy{$5vh5pyVj}lf}1P)ph&vQCm#C^sBfwDp)8wE51 zsu#EBUaN=W&S_pM&egZ2Kx0vlcb^-jzKb=*KPbD|W!<`-(|fOLEO4j$ulauUNuGHxI9J@2|1pyz0|&o1p1z zCtE}qL+aO)Nm6DIT@N^1GG05kF?%j06;vkEF9fSbfEfTU_aCo4bZuFgYE`1h%uF=x zQ_kF49cyeUNGn_$u9*b;Tbs7czXou4!;=Br04T|Klv!Ag6>=KV4JTylcu z*DTo?fgojL$dh?Ug9Mv)3ejm8*X+-VoafxB$vAgppVgnVw?%_E?%v8*{8XNwB}m38 z9n-8Yx>r97A^{VmO?kmcWpQmt07YUByKfmC(52FVfKEZsDX4>zp{-~g`;!|dkB674 zT9A@<1?4r|4%;Jb>7JWJtyFoX+;z0AVY!?dttb|v(S_B5Y@^$e18VkJ`@nWuU=;4m zja!<->a-*zvCE{ENu&TR>Mpr#6nsRHP6mbk4J6x;m}*(7p(u)u`GeuO6x%9Z z7FM_s8vcCuykj^c`tR_tqV{tL!pIL2dlU8%`sM^%h%Doha426FZ0N)=O7ZN*aJXCJ ziA7enD>ehoc)HCr(=*4+*@j&$xPhbGChrSgF?pG?EQr3QnsE5&RF%P z=DwcP$zE9~pq3^L$%N?hRNaO9R z2MX9Ssr8`jKZFQy&3?l>nCMVAPO4sdgJJwNM~gK3?-(iFT&w$UkNN=}mP28wg|CX1 z>VgU$?pmhY;2(uhr(Kfe%uXzJXby!FS->`(}#@VIlqsqyDo#z>wn9xTt zlvU9C1qHQb7|=`k(HS8Dz7FccbFtNN0avKs9N*XL&D5D(m>Svzx8l+($#0jmTT?Wy zoDF=o1|{Bl`>MF7E*w&8P~NYG6#de_>=*K!>lp7+jXsj^_G>!L%<6Z^U+Q>+e4*d# zmb<;G_d`>$ zUZ0u^v;`D_w*}JFeS9y|V0OJ#Q><)33XpGF02V2-cKpqAyP%_3r&yVHBuLkzBUfl@ z42gl&SQOeWLf{{bTB{{ci~;E>wnK?Lz1K=dE;(SJPK*%0ZlS-K5^8>)*{Zk$oOw!mG;K&vct{cn(*QT>g>6>;7>M zTaGCr2h5ahLprn1P0rvh-g6ez!iM{ks7OMb$1QBT4p&tkUqB0uvLp9Gv-Z`KJBEMMrQ=Ke(o+ovKDAUnTlI&CdF#YsD1*Sn%b5 zyNx2z!P#_VJK=BDkl~}Fk|~9zPWsPKU*9bLUXYQ$iW3WAp}3lw#z{J2V@D#?xFW4Y z5Nvx%d=}o*P{fD{j#v!Es?kY2Hg>C$JQX$FXlAlN8Ul-Tiu)$X1UC$bWEhmjVU_Tf zk;2R4m`4MYg$gP=b9O*aC)M zj?a0kL!O8mJsZS0`q3W%(mPy|f4XXi7Lno98>y9dNvWFfXo9btdGVKc6~o^q-dh!G zueclgag#Hs^>YDrl8S^L^NZvu0wXv<0Lx@`!22V87t>=RC zQx)0Dttqs%)({S_O$`>t_x);7x9Z^=WV!zjSSN{$AEDtCfG?Vi6@(!x_G+SRfnfiU zi>Sg9Q}AK_{@UMRGzinV?>%VCD!re0#XNC*)Q=47lDnb~Rh@UUnk0#dwS9+f@<3MH z3g`w0)UE(-~4zj7fqS zV^-=Qa78*2S_sIT0)6Q4E-D4&Qx5OqMRJp8|H7`;UN}D|v>}$J1_K~kDhS{!HHc;7 zmDeD!ak^c`iT-5h5=O0bW}o!Wd24t8wmy>Sj9_{DaIU_aPsRFzPMzmbsmfYg5SzDS zr#t>H?+5NG^RQBnqh`k(nthhK2+6$)ftO4s)(Ib|Sh>sPoTt|O;BJ`Ul!q@x2b?3M z>HUcu>`8CyGmIu8@Hk`jx`$a}^973-<&Vw-H-%0~}B=dlvzock= z2s*7CXIDidWEk|gno+_Ok=i4F9O?t*xQ;ZSQ)*2oa3YpHIX$>;g6S^gR-@bHBam-t z3ln48d80KJX_FDa0rpd*hHPeQ#dR5W1!q{FPz+B*C4^Y*Q%^O4#{Fqlog95-l(^^>XT?T3y^d#d*KEG;Hcnm3Op{BVjiCO4aS~_Lw@wn!E23^Qn=mImZWs ztun{E`3_Cqx2xC>^6-fquqNdog9Hnf6asqtg_}YpK6;8Ph-#+dgipuNAhC4VUs-Zq zA4CE9zX^m+kX-Foqi)-CqKM9~oYc@ciZW`ah3l{VTyX9ear>01guUOnt3%5;FO>dfT3)3IyTkya{q|1|&CofS!_1I< zN@li$6v_f#Sh3l1g_7(eF#e%GEl3>kPjWNlNDrShr@mUddPR%d0i>b?AKeKObApbG zw~Y>$=MtJim;=liv3>KQbRUr1BRQLx$VUwQ>7=^e`DyFm!poKX7alO1|7Fp!!&>vQ zNGqbtm{3g-v5Fnc)Sn})=8LR`2jkMvbrl?ymZF51)aBAw%)MKGYC!^^whK_D8E5CD z?9m)inxy!OLu{S(lRZA!E~KcA7T{^lrdBLe!$i^Aw1qR>*v~g;n^0ZlBh%C3dFWJC zbNG|$?oRj>xYcZOkyN2?K6;!Ts1ZtRbTwPy8>kX0Da_0avuwxGEY9*I3ASO%s)h4H z4g81CK?2JrZCG}61dq!T9%_yCCNuj3FFdPhlBLQCUOG1RX- z6f`dnB6Q%#e~zdI5m1-#c8a38>2kESFzOhr-I0*-+4}g-FQWIw^w1;OG<~+u=0hvp zrKSb5&tS)$=($Y5k-(TARUk>Ny@IJxh`)ZUYbab8e<5o+(uc@`#YZ{))p}EaRd00B z)eG}ib@Nr{aQ{^m!nPKngoawODy(kISyF0{*JGhrc{d&RbF7QdA<+%utXto}^g0HL zH(S)+<-?c9uRH9%lMk-1wfT?9+L zVmA8n{g$=plnn1fpF3nq$i@L#KICG|+>4>{xsF0DIrUMOr68=Wdgnzuk>DDuz<nfsI{ZS^M^K%v*q!sJQ#`e z7mtXO>XJXF#ZB}ds?Nh;{nY81O$!f!gfgAPE)L92$xR3YjF2f8^Ysy4xy}s~ql+C? z8E?8|Pov|xXbC7C_8|VUd;Ge;9wmi_;JNjE6ww+R>318JJF6+k+L4)sf)!WrKmysAM@v>@`d@EwE<4IS?T`Rs(Q!_#6B#Et z^g|D|F?+s7WTVr2cv0JxhcTqdqtAipE)xgkR$;ZNvvLqGWD|~)Y@68ZM#cSk=UQ1< zVkSbQcjqd)ck0K(=^?=(2RLJy$uY0L?z36purBFH7x+zK0ihd5@aOG}cjlLycd1|l z=!<=&5=rLbN8Pmw$f5WyKg0%^=)yJ7lVI|F5rPd@D-jR?uUh8isYGP(U5~|{3wy8y zu79dwi=V7afZZf};uqZ?xG>1O|H^%k?GgW}h$060=hEbJ`vEGWsmdZ>H=OuU3)$rd z%;Rjsxx?@p{X=%F7yfOTWU4sE&k^Y0QC95baf60fA{r|qU0=`}V1MOlUr30ohnPjX z{6g7SgupP~*ZCZM@q+pF?9h4BD3rsmy^KiIr*mfU>e z=n9^6*h3odO+UD5;}}V(5y~3>nQ2k3#Kf#xrGB=2*2!_Pg$asP3Wf&ghFtAY zV87gRT1s3BMG7&+aon*d6QqA6l#r8|E@e;ft|Atct!NAKc`BT}$H26>*@%nzsJqb{ ztPJ#mRI#aPrzI^7TQUD>;wn)TT;Ki>MI24OfX0FZzV{?Q#m+Q+eIk?D)k*(TfU7R4 zK^vH1ZK!hn9bsx)$t9(glHPgr)%qo#CU9KokIIUldUR}8Dnm3`KF>fsZ&s-iMdNBW z`VoplFY+iG3nah*2^VKEo@gOg;!eeqg!1pPgW$lWN`Gj-TWW7+;wL8Q!``O&MVHUR z=)g%gg)AKQMw>8HO{Ckek!9`eZkJtA3@}JXX zZ(;K}vRnf~WY_$U?=yVPUa^fomp!Yk6($9R^+SBks@Z5r5$bq3HcuwSJVMu7VlseN zdU#HekLy3`%FR5-7WA5bbb9MvsJ#gq?jl+v($)oI6CSL2<)cOG)@&0oo0>-$>ea>n zN+sz&$23~qcQv)=B~_glf6o4x)H^z;BmU5=74N+ne)ASa{`hd=34i#6G-Zp1VDKpy zpVdGz3388#eiWjS)8_5Yi~-i9F+)sh$4B^plL{*r=$VT(`Fzpc6e`5S#{Mz!tArZi z^~GjfDG6CDk||s$x>^x^h7jcjD=I8yy$!;*HRnMCT-FT$&gh_&x9vUiU&1C>N^bA! zs&2YI@(Z;kZk3c6{6H?05R@nI{!JNU76wz(no%L={}J`h!IAY})NjYO&51Fwla4d7 zZQHgcwr%r??POxxw(aERck90Q?W*->SDot9bbpaKB_aP;*Pd;1#n1uYBf@CW>hD1Xuv zfsl`!F`RXQ2@3=8=i0Qx&2#^h!oIC_FBkxzf^zx5{8P5^-vSKF$h;EjLIN)yCFK}Q zC29XN7EvHFL|)q=+c>Y;q08CgvylfcQKWR)=hc!6{u-#lrC?GN*PPAdX4u(>mh&~V z=xN%_=>{l}Brtq97v*!sZr<7V^^Ngq83>^{>RY4%MJ;6qJt}x-&iJ<9X2_kZ^XfXz zj{s2&@X7mGJpl}@qSuTPc0fF-391qvZ`m@Er`Ty!Gk3a$utbmW}kJzDLdb{Grt zsSrFtc&K~k)hH_Ff*qOqcf6|(^0H!yU4?hKsoVMX@#zE)b*-ws;+24BFG&pmM8;fK z67gak{Yo=X)q&%8_;lA;{7Z8h)9BF5(s|5P-9{hfaEZc`u;)a5<%Z3W{)Gh<^yl!; z5_$czSh3J1&)J(H$w%J3x}Vev`=QBpw3w4mtXjOCkJ&P>uF;yb31Ok+j%qR6jKQ)| zkmeH$yisMdZzZHO-+VTftwjc-mSdG;PA?3#&4xx`Hg3r%G#FZqW2>OQ!%ScOLL25z zKjgq|+C^gQl)8-GM%Ss787$Iqh&lNmVp3?-kr&xt7HTge{p{<_n<`Bx&N_pkO!nqQ z)zTKlzA-MAvt0}6Ri8@6M4+|N!ur^p5ccM+6eS&t9h;Q>W){c$vEA@d+s5AzYNk>Y zf87q(RIN=bbT2BMyLI#`{cfbVn3UWM8a2Enb7-wlKISJgJn+kHvP)g+7<=6{xE!23 zesQhP`H!20Dn0RyKYG`48s;kW{@*VPB-sCVe%?11Vb_2rHC-b}%c?s1}FLmv{lprUfy*Ijs&gx~RZyuD?zai?m}!*DttTezvKoH&nYtJz&H z!80uNfYMiD!nTh_p%V(Hk>@)idC@_X_$EmFBq70FRE*MCTuRY%LQ*}# z_IK4DSw`5IeGuS1aAGNE3=G$h&~^a*G5+0*m1O8T>izw&t~5|yW@cCzks8*Y3JiMx znZ5&JR$0CEe35;8!!Wiazm*OU1c$Fu)|XBDz)q7nE?3DXHYYiWX?`4(|oFT zs&yp~J4o0N{xs+0f9}`BcG^a&a6?oZDvw)4Zqj(q4DGp9F)Wye-M*pZ6nX-HUa-m>Ln3qOa(Os!>-J?OKFrt zCpSF9T83(W>Iwv&yx+>ZQC$|0IyPLXrz~L-b(lyjKZbmzqHub7GOpb>3wk z?3@iaPuY~-VoSC1O6w*|ew{BIlp@=ma40~p{42%qSUHZX2e3$y^2KVKYOz0gj!XTs zAf@y7%lut+%@prK*ZnX?o1puY0nLSE02UGiw{-=1Ztci%i*z{#9WFbmA6EyK~OEs z(r4#NXbVVbSWjH;mqm4TmXRK`OZU6e#s4_SW)#%wj7Z=!xHP!qVb#+`QU&FBV#mB$ zr^^tlI67wzFa+}Y3t2WYP>H&3QsUU76=&xkr@Sd-ez~Few5t2QTw)>Q46}AKE2_u< z)OY;{5CJp`#oi7IO8Li3QK<1ED#}i0IgI~qUpaJq?@252aC0+Y0lk1cW^AyIw(vGw zq&BsQ3%nO?)$DyIVsC$NXim`)*{;vR>EImue2tr(h*S!piWAezlgwf62g)+gg5efEClpir8ag2Rx|rZK5M2>&L`S z)g%jl-7d)qenz)PcSJ(1bxvKOcqj6#* z_ZPsZaE~Svf*{oh8$fv(+Tp8cel28LRS+6ZHPG`lP%8FX91L-0dh? zzgrSTpK#x|q0aAs#_W#m5TCMXzT^rn@V+C;@OZyPj6GFc63`3U+`T7A$mRA1@0)q; zp4C;+u@}*AF)_1Y=*9jS2=Tv(o<&F2ODBW{-7SA=gc|-q<_kRr2*(=nKH}xc5N<^6 zceT^`=5)aum06|gjaQDkuXw%E`hx<^163cIuhf;p7f0O>91UiLdb+MCvZn81`L8CV zO5^8~X%!VCltQpm40(0Dd{p@bTxX2bn6omnl+zFBMHLPjT`VCWbHJ{*h5k#J7-UvA z;*iV@#rLL)PXX}BvHeRx1GMto^ust#0}Za)+4!jFm7Rnqx*5Mg)ej*rY<(T+)J%#f zTo0$sG|JOq07%YZNB~`BGCaIAaSw$K;;o%lBe-BfF}hu>3gZZhCOfMR0~O<%_ADkP z^y)ifX1CuwE-(*qHKD)+s))A6!Iwmy*dYmTy%@Pr$>#)V#FB-AIQS{B6oZ;AVLCB3D4}AB^>_zKp)eoJ6ZF`iChF+{ zdK@|Qm9|E+1XV?T?>FyW`Se0HvQd&t8W2%p3Pbm^(z1H3R2gIOrl=hefGy9)HsC^C zZOg!{$(SOFxxAt783ItQ2j-Gpt|R>ujV%8qX2s50!FY(IO_+LjRW}gM;su;a+f-y0ZbJfbRlosBR~w9cLa|YiGwAS>t8u3N zS+4b{37%{K6mC5&bO6x&!;E}QE2=_%x~FItcaqRnP$*?PA(>kyovh8}$>xVDbc9am z4(Lr^g84z9{yQ^f1>_}>fB@QQlTr9)q}f|L6Ab&me%;!O=?pycuRf>WzKnS*?`P;? z2(2?mvonbLt?|uKp2KnVkLr8ub${WtYPmM^PIUdF9PxJ-$t>{t;s$2eJMeX1pJFGk zfX#t#esHMmvBA-1*tS4{P*x^+7#@FRjXXE4%A=Oh;F961Jmb%Eh;#W56)hWec^=cL znlGKh8hJ9aUF~NLGu}(2A7*Px4W9V*hODA-I^?)zrfzNP=Cx-`)Hm}Jm8)0gIgR=8 zaRmx^!nUX5`NNzrww+~q-S>>3YN@Vxi8{j`Zk)0SV>Va*M^j%ZG%?)Lb}9zYwnvNl zN#j2A-TJ#-BSH@I>9uB`3K(zK9$>56N+h*SRgt#TY6N2aeUC(#>QWy6w$NKT`;WHP zl^p+We|q%Hvk`KBYVaWW^?1;h|_-tE&+v&4t|LiePyQ>R_$_Qe}3f=!Bh5zo(;HNb}N0Z-fK z=jb!)3XPt!j>&ieP|X444VfwQJg3xWo!J<`%`jeuu+=SL7}@w9I9!;w)gAtcLzDsO zUwM!)ty`M;67T_0g$dA%Vr}mvVty2aE@Qcs+HaU3_|9M0mIJ>RFV~h zm6=sC4!S$_zd?HO0Xu!~+K2j2{X@V{5b30J{FY_!{G!Claugqy^=46wUY4{;ZU07) zFQ@&&sEpWv*1f8u1!f8eu2~ol5*8#l1yO=RLWI|BusO2|e5Imu>Gm>e<_!WbTfSQ;G^mB0FjdJ~gm@Tk6{%0e^+O~*>GZd3edr@Hd| zA+Y`_=P$2^_hz^5_5cY=!`L;9EQn*IAzvJ5Tax?OQwc1H(ZtW24i4-J`H7v%ng`cT zx_5?n`W!CF%n-c^m1DW_RP_j~@rn)A*-Ir?CA5SgHF#JdC*?KM}bKfbqeftp$#0;;e}fLVZyoq;~afZVCU^a!0M>JcyFcBw--j#PKRA|s z(i!ygvKpYvSnWQ0QHXKC*v^k#v37>*?x8)mLTXLQg@=(@*Au1)nd_ifO>YeaW?NQ%EMxVS*l(IfYS zXiuk_M>9&sNF2@9!$dVe-AFbLL_3Z#C~5zzUw1rh?FL_)EXq&JUAbjUyM#VK{LeCa zF@^J}qV0}5R-{q#z4XXstYT1OedSe@P|Dk-E@yNzp*H0OMbQBwehVpzNp$KW zdWITIULd%pc?A)#njb2`dMB>X8r|@lgCgi%1^h>R4Rt#B$f5>Z^1mAhfH|z-^RwN^ z$tgy1XfWd>2#GWz04{xZNtCH~zet%P4?|(0z&o z%ekD#jY#v~I#-cdrxRe%Y|KZnK)aHkU;3vB0(gf200mlz1fHKYGWj2`-MYJ5SOikv z$?wwYC673zRP><$M7=%=Y=D_-7iB;prYtCc3Z^D>S;{6_qxX&10^)4Gy?rbSyk!?&Y-1XoClb(6^l@K@srUruq_%)~)ZgExu~s zFt>)Y-OgmUbc|i28x#TJ#}&samZVDc5B2O`8@`V=&9_v0JleJUvhmTO|^~4_qmo;h8x1bag*Ea&qugs?HO+*iU z=@EepL+Pn5Tgtb#TE}WBvc=_h+uW%f?t$GkKzbE7$(%>mUus*!V(1_!7PX{DTP;n! z{o4>kwM3$hm4&2+_II6f?|Ll@NSscNq~I(M*X{M9c|ij&d!V!J?E#&gZCUrY`@*LZ z^X4*)L&9bCu3pWJOt#8vQsn+aqP45{2BbZv=lu^SeWe=OAMyWnb%8Qqbi=(+KtbsF z#DvurpPh%r3l$E^1^9Jw6h6dS<&^lwjNJJX0?@NOe$AcsA|`X(rfU9&P7*>eDl`xilmbI;yCuc%l__e1#D#&QPj>U69G=(;(?2f61MRPOLR*E6h?; zPZjzkrO3Iswt4E?Et;2xNVG_I$z?d{qst(So`6Ff)=B?oEv<^%q3s_68y4)!{u5+$ z)}vG{l*@&h&oV)DI+;z&0VBFS^0yYdw;R)*R`<4z_76P4$EYL%g2W``wmsb7BcyL% zW>lZ2L+q0njx7O+wB)|}89%8*tp>r;hr?h-!fKg*?g(q1#D~H9&dX^#*to#o-^Z?) zGo2Xc`|9;mb?yd|U}?}M5&-|7AzssLy{q+JPtlXF7`Fh_**@%>)L4sSjS;sEkFBQC z>4z&RV{f-HK2#!avu@pu#SOo-+8?kS|8VY==g@ZTpI;nY+mun-=?V@-;{Pnp!O6Uq zb)BSdo9ERgBg&r5>2l7?F~*#s{LUk55tCWAc?}xlzN_a9Q0>?1 zU1yii)iP9S-q$`U@(#y{*Tdh@d(Y7x3kaLhh821eSFu{L{p2E;x*5rD-Y6a8kFuKL zrqBOXwjaJ-Aiae&R=dfXMLp;3+DB)5Mz{c6tG(+OeP-zkQaEa}A^?tagmsvs%S>Tl zxnC}*9YzfJ^&5J#$tB-VY!|ce%{(WV6I*C0=;V|K;D>jtJ@2<<`l`|LQv!AWb&!Tb zMLz_B1r+iK)yBAN>P`x6r;NN+4o@&8i@OIC53kEkaR#cG$;hjZPu)v&R&80^Fh=Nu z1Amk?u;{2P$jw$K^?w$S^X7t>xnY`>r~LKR?9hcu-9Yj`a7lx-hX{1 z_kS2NAWHz4{SGnd^VEOI0Ym!=G%0pnJVToy<3_d@@qh0a4i?{7J%zL<<6-uPylG z#dC=b`_6Oxaka@=%6lMvK$;n*7Ju52(*@WDS)_tE2~=tlNmdM#5c%J)n!U$pn!@n)E3*^{QdJ2 zIz1~L465!8lrmVVKjQcibeO7)1gj6eXUa+h^3@r|`Cy?rj+{`lV)#(_@#->*w(+3{ z4D@6r9;}>_#KMY-7IZ}pRMOOTB|MinKCw7{p>YX`B<+9H{!V%6DWVXe&nM*mDKpeO zoC&8=HG!Y!Y`$M|obIsQ(l7|VcbKIp3d}GJ`E6=hZQRbu6w!jkSN57y_7^;&YJjUR8$}ewW zNm}>ItLc64yZ*=F8(5weCPZ@puaHl7plF$Njx~Me3r+C3-eV#5zWTBR7^3|2s)5Wu zVNl4~K9p~JBjHaLCOJ6QZ$t+oEWVT0;gVA~k=@cn`h}T|W%uz6jhfqOs89I&$MAS# zS(zXkH&I}P)~^~{KfyC>S+7adm1T0r`*4fgM2#*{aoD9p6E97|>1Nx1;jLRq1adK# zR_^dsFV#M5|LX0H_Ck8=rRX|ZVvk|(>&_=6%sswv1FgK)ki?59Tc(v7Xhj>Y#dfn| zyV9wxOtw|w1t?1i1_ZEg!n9Zg)!ctWwZkMn zgJNi#gbC`CPjffZ$0Q?#Q--zdedpN6=W+BpA6v8BqHByx2P#@I2OsC?V_a5LJ>J4b zJI@`gS`VedEy0M1iEZeR<>1tXD2H~a6E$mb;Z|^0#KPZ(Z1#iFl&@(^=z6l32|#$s zqr%=Kec@fZ;aIa6sD;*I2L|_cER0Ez(S71>y)>pXQAl;0@qY$&@Nc?zU+0{=mCx)t zh=w@pLT@=97jKwccVby4!tWg3tZIF@Uzbk8GhJ*f4e6|>f?^?lmPy33|CGsK4MbA{ z$TbWSLXvV*%r@t5g?UHBTsfss$asPf!1+^H4#`^KyxA$YrEKy5>ypo~1lvDAtA4b& z$Y4`K6j`45jA-Yvq}6ucFIxX~m(78OK+t+~W<+C0dEZ(Q2nSLKh`u~+-hkjWW-_7= zuU3+}|%sJEirWsKzLbs;o|x$UV#I znlXcvS8EWe3Nw`C`~tqRsE~Am+D8rtWo6A(y1{`97K}Jpzj8v+xi%#;I-LUryniUc zS0eCCglO-Fs_>^-0mFk9G{g;vB*YhNAC^Z9-7DC~1`BM2TML}|vgcv~`}qX#n@Y6k zj|nTs>nKnFeOvs}8TT@I5E9)vq7ym()&uO}LbKyM02lz-(^&aUcrPEB=d4VK320u^CoPQx*dopI8f1@|{@D+lS+jq%b zPI!F3AVon!|1g_5mZ6%aW`{aM{IK4aWjHOOBH|{bA6qI`c%*LncF}e@yLz4V^D1d9 z{&uabgtK`!r=;gPHKTT=bner|$$s`L3|rU6)P^$_z+lyqA^7Z2{e#(dw&FFgSmZ1F ze!NZNC0}ZpwgVM)B|MW;-(rM^{%|1_z>F`*1mTSE>XQdpg3vIVQ z^!64Z2pqp26sVE*#oW%tOv1McQIhEtWWb*LqZPrE2V5j&>yE zpyk62S)WXE*nBtQ7ro}czOLo#jsy{{f0O;b<2n9$bN+vyQ66J@>a#6+?wLLme%VB{ zT#)?E@yeEF%ckwnBbUroc5fXhS{H+wo@t(+?tAI+*HjqHy zZKZ!}!zVx9SE6ZRL?yRut}&U+GfV+0NMDfUP>B?8@;#wlm+T_Gg`MJBtcSM4gxoi$ z(H;dNR@(Xgel&onO!tu|G!lAhz9aypqH*>Q;iA&GHJ>j|5tnNei84LXW5q2#r<93u zFlYHK0>XAc-Q@T-rkL5ET#jarKgfs{x`E|s5yx(_9psr+oQ_JnO!x z%+vNjhys;Blm0s|)(%C-U3+|CJR0H=lv_{yivooSoJJ;~LHuVyKq`(op!UCaNM#Yo zxUaq+9KktKpoHlkjFGX%QsZAoqO^H~F#bj40Kf=MwW}oUimLH_Wgm-&9bu8RR8FXl zop`1FS5aY-fr=>3+@O}J6QfrmlnS4M?!9hGGu-x7mZsO0182*=&XD}eelWq_&SC@- zi64#iposjqSRfdaV_h+EzVT@r7krv zO$*8iJJIhf!dTBF7Onr`%*agQail#1be=8g{L-DgxZc_>2(NMu;VP(~Qw2o78cjOIYfbD1tRV_-9qR$oxr^#v--yoi z)0;akeihH9LlO_XPE|+G6=*f!fbK*v0@n*asFRm|DoV3q&M*P_bIa_TK_sfL0t7%o zlgn6IB{~zt8;ZA^Sf9vpMuXy_M;9_%#WGH0iLCz-fv6_Fc{g`D3pgrB;}Vzu zlKiDC|7tw4D3MtS=W#-%ypl9nn?3{P>XpEw9KmLduLl^ZrN4h}t++E%Mg%gVY!13@ zBXI_lu@%9+`gZBByN{xM;pmO`1Flc${1RJZQ*<0Q`Pa-+BA!53S#Vj zUScP3(LfE!MN76fVNN_31=46qpKTrIsD;B<`EcNz9KuHil;Ec4 z^cnUWdSUtpw&(2VMlfeF&pV2BT_Fwv8XC%AA|5~@J;w)_Ch3?aJ`h|VK6o-Hu|+NU zY()9a4^YNMaE&HrA4Nflp0fW1!PDaIe4|tTldAv(`hJYT1M1|Cn7Rq&09!Ovr^fM4 zmQ(&cuFQZOKsUGx!XJ^JL#a;0FOrzq-a*cw3mm^frM9omAahsMl7mBZD{~LhB8WF& zXT%cjxDL!y6;!{(JgleJ61h&LNAuRdmqro%_GrTnHwPfw(xdE2b_HJ!f{IKyL3bqu z`|uxH*^VAXcOn&L3mLuWoe3M|1b1RIL(Z2-Ftly36=q zrAV28+LgG!e8qO~-mF2GpKWIoi1A`%@8l^m2K{IFodTX)TS;I~GEL)eNQq+7_Id5u z=u(~GFmSJ7M5Xm;MLXXaBZe=k2kT^_8ci3AlF#V8iS|roYhYx!?((7%2F-_0Blx9t z2_d>;U>ZToNQZo8NFDLk&J(nKTpGN5vD9ZmI0)kW;rD7w6>sXfR#|f@8!xM77(R z5y@HM^g}&#!GVH^KuGVB*aJbUPPj(=2>$Zc>4o=<^Vpnhtb<`6w4kcSL7}{|ZSMV? zCAV%j<1Vve#39ashO-LZ48FP*lK)MM6W=}|(59NW!gUw+j;Vj6h$VXdB))T|w|A}> zLZ0#Wd}OG^LDm9T@x`J2B@1GoRj~cfWxoFNh+D@;a3!euyD^loDN&7q>4Bz2-e@R> z_PIYlZl|$}c{;s+;jadJ;r?#(QH_ATwY|(^OJ_QLwa?T}=rUnM4!o(OAY7bOrI0f- zQ~E(x*8N{+>F3D~SZvbC{GYQl_@mq(<^QPkM;YBgWEF%$A7DBcLAXJvT%3!=Xy0Hy z8g!C$$dQ^g!A#=3Z(0=mqW8>8^s>}{Y;pvqi zpoFshFf!zp;=GIHfM_sxjTjT*27yT7o^d7*PTE?m2@i_ed(?bbC4qkfrGZ0n0=V(>(W$vh7D}xG7YmvxXV5KVoQ}-Vp`Bn zX9e`OyZFjGv!nAQ@AuzX5U7jtC?Z|Zpj<@H4MSlo|95&CJmeh|cI_XqjpPe4L zuFmGIE1B3b$Ug7e7HF4BSv$#b>JQFl&-Lm?Y^$wP`BON8sZ~wKCd<1oAqlUk+X~$9S1F}dIRidlrXx!*k>QK6O7u) zdpdehTv08gv({iI4+b9uuWKfkU#}vc++m*$azouw*B>gRLb4Yy;*rVS+aPOH%`}PM zr+z*14fPAUH>0|?eJebS)(xvw1xa;0(dVLVloe#MB*&k^_AoZ-)a(>5A~HiC@5CO$&pJoZfsbIO zwTbcSwLi}IP5Z2@p;7329K(Ojun<~20p*O%Kh;i0$y>_hEa)=R5UE}XsXnj^Cg!5M zClEA|U~l$!*N)}yK|yu=Q8MJJ+`dlD+DgpXf&S`6J@7$Y5VwP28yn8m$1Kf;4c9bI zpM0PV1o~&Fbohll?zU7BV+B3$Vkp6Vi@!>SRE8NhNi_6>l}|QVAYLqO37TKvvM3%r z;Q%@zU~9bZ*%x)Yqt~0>DhDkoc|iOm7lYIfsw>dg9qHeNiS6(t2UeZ}D?YA7#U?wd zJb=T0H|Yv{{bT>PP4c9!tIF5pS=;NwCIYsU*A2%Z$Z!HDke7?_T-%iOkU5348bmx_ zU$z%=E3r@|H_(rK$%U=x!ktRI(Glx0U|4j)ta}pVEI}Q662r z8lF{bS@iKi0o$`>ucUog*a0^Xab_u6B>OqBw5iD4s!nl?&&xO>kyVb~gf+XkVjW7- z;f`*FGT~O*FB)YgW&|i29A>cqe5m^!8sq)dMU~gYRA5eDen7!@zcPoRaj6tpWCw`@ zaRPLP*&hCeki4F^ki{#Ts%Y%qLun{vqC2YZ^SOtO5c2AUVp-;mQ3mS*URqhf`uUod zg-|u^@i62Cl+plQHUWSYkjf$@aunGqjJ=sI3PH|%YGl3C#4pe1R#*Tns5>C#XZ)cN z>bm5?T1U%fBemrUASj#dXRpj5y0~)v>7H}w<^rs{1tjyF7^H?@t_8cGXS`lgrdG7| z*Tj4JjKc?IWG!!>Pdf*W&O$aCgq>#n&BdweO2k=s%fHk(N==Vzy)1v=bU*t=tsLw8boim8TF32 z^oO#<+huQrVCriJ>YOuU{&cCRzY#=|n z-KSXX9X^_0-_)yPX+CRfUF%yFG`gSmCf}`n=ADJ3BNE~uYCaBOzaYL6!3yzo1^#;q z)b@2GPL>)BJ!$AzfrmA8!(>rbzG6}7@^pWdp8V`dDF4_6L#H;3;4d?yQJO0VUW!Uc zbUBlB?}OhP?O6$Xzp>zYeWOBjBh27qr2!tr-)TST#14ytm*Rw~yg5EHwPkO0z4Y^0 zlDkaBNOIFSD4(>C#}yPQ2WRWEperZvhQe|d7sBECgA`1)|9tK4@ITnPg{Jd%63W&! zQ*$izi9m{Q*2k#fHch)~A0P^-!YWeXnKhf3*>)-e{AMiE^Be#NnyVmQcQ=QC48vdK zmwoMPdMKgva>z;DT|s0(d2R0Ll932Xy@**J7>&$|ln!gnJm*ZF=!GWABA@*XvPHGS z($c=)A=_@7{-7BjYPi=mt%fe!JNJx2!U4!u%`RH|sCnz3Nl2qKZDQHQh??`ju12(bHuPyX?vui&B4- z1D_lo`62U*Q#4X7QF52ACwUMT{oP^L0YQULJN6M7+}zY! z9(;{xPd0OmbaQv9x^-#7JR7Bf?;CSqaOYt5|^I_?`R?a;q$e+rn;H>@Y_)NLY6 z@a>mD8XE17Jf9&00NH|LjD2eE5ja8fG%m|IL$S2v4MBOnYz#BgD~?8SgDl^zNc)6Q z7E8QaAK~tvZBsxWMh*Qo7O{{rbcEUhEj%w1@^jX(%;(|_{l(O=&11_WK`4j-3o8&Z zuj2>hVK@y_?`;XfCeJBSYynBn_ZJzT_84h$Au5w zzse`Ua+kAqpPuMn$-JYafw3tCNO1=Y+%=x7JP4hs^qV132F7t7e@uff>?|G${aCjD6)nrpKwrlf+Va?cbt!DKc%yK{Vh`PY~JYjirtTH9tUF9h_ z;mV^zF3khr&(Pj#@tenNEYHki8BuO=W8-fz{6_(QLFMz{VE}nh6Q{1LzERYcE<#_K zhJP9E6r!&{Nv|eGpah??g(`9rl5_59Gp5!>*NWq9KvGbmgtapFK*dw)+HgQ7Yj zyjbTf_K>Z#$UN9P#E4XE^7{|wcruf+)ChBH@2}eE5gTY79mj*iA}%^b@#E*ka23y6 zOaEHRwZx{Nh643Y1Q?BAll7oS_5{OFpD58j-DU|$rrA&-!%cl{G}6d4qZ9}Z+Phe? z!CWs{H=}Kr2)8@99HU)4yj`wv7gWFOs5Gdxr~P<%{#^&V6m>t{Z%&my50tX|4O8A) zLv$-nnRWVYIxcJa)_;s2yg&R$vgA`cC0>Mx$Io{&QEk0JS#e$%-xKQQHO<0n8-X)r z+oTlAu{MxhaUNd4an9dS^s$3tN0hp_kEIbfW8mtYjMioq>Up?F*8KHWHCD-F;x5LqKgx#h2LIGvlkIZ?6ai+8=^ywp+E57~H>P z&S1aA#|npw0KrEDYQR#o1cH${{pB$Cx?x*0;P*`-RbwAEM6|MM=8av$dDH+mnAl-@cGO?xt|3v>y$jDmk7x2%tPie=d z{H>_}2iO(FE=3pl$51m>Ap7j5SZa$)ZW=8)G(qDdIJtA2p@>#iuvbA7ph{E6L!BK< zD7hfXhi=JZej#&$eE#RYoZgw<6rUmbPvsn%>G_5TydIO`)mfRy&@8xXR^e41>R_HD zy3fh-ur8lcfCTF^@P`Fnw8HX7Fd5LAIy#&tVLr+x4UBF!udh-giR)Kyka0$w1~c$&rCAs!zoJfE zZsqnR%?D|998)_oqq|B4_jvX8vcrW%0{~R~70O4IL41V3Y6D!=E>753!1kW3eQvl^ z@If|fPbW}3PZ96zg!TfW#MgP`6{JGdMkxWrCtv_5z|0w)264TZ40UhHdx0Vqz<&gQ zDG36I-yEn9Gkyw1u2P#Vl?;zh4BL18p;Taaiqe`ccZ;gc&uLElO66N=TldV@ly-!z zLzz`O1eIh`5mxtTg_}_hJhE30+~`{rc(%~{T!&DMZCK@VKnsC%Nv|oh>08R1vW89~ z5wQ=C1WC6DerWQ$clwmuq`n#8etGfCtwtKpoiLS_7gL#lDZ!!~1U5`jvFS>2_U$>nGgl1~? z>gT12--Y5bd>`E%=cA^&QXM<_BHxPQ^vD zL&y&=lG1Y_$h7|xjvM;FCeyE1$1%Eq?(;tQWfLVQbE=8+k>We&;!No0f}Swq^7fcpkK}z>SJ9gQoRa_KEBBj zHJKF8QKB>ksW427U`+{*qe3|xQ_QEz86c_+w)vv4qsJI#97Z$G%hn_8{dZ{Gs@I(| zP;`M$%v>8M>ioS9PCVQE(d8c|JjlrD(UxKJ!z{$ZZ@CzyaLf#HF8p7pyuD5F%2vI; zyH4By;ATDm_7F4=@Y0JMjJO8=!sh~p91g;pxVYok{|De7$onhYjh{TF=J~C4^T5HZ zYi+`f0;dQ;RAS7mz?PBM>7CKLmRltYO^u7U6X`5GCI&9^#O0ciZ#Fp(J@@@O0>wCr z7Je;D{H)tj75s?H)%0s{?9m^ObE`kzZE<(lv+AiIt2Cp}Wu1$CTgUQ_1oMp}^6&k= z75y$sZtr#d#DS7nf2&6NzrC(^aVcMb9+0TPkxgIbPC67jOEtYc~2 zb=#(JvP#FH`fs{bm7M40?MWte|GjGD1G(>k*|6}t#Q!Rb$1w5@m&>|Gcj6SK{P_Gh zaW6QIRz=Fy9dqBSw3x0TVcWbMQ@XZogQ-NV*U!H|Kx(&LU$VRDl&!h7WDW;x5={M` zU3iuQDorrO^M?mvVFIgZ7h0?s$9v)^if)|(5o~Uz23r}kK$V;eua4Gi>$FeXjXC2t zlJDCk-%NJ1q6uA%zWpjglw&A6*72t&1^nHH4I-{0&P(~u8k<}P(jG8pNh!A5A9cYM zrpC+|{ww0V(D!5O<+EM*@I@lyTd|7C(Ldm7R~Llho6$%5uIap;l6tid)E%*@Gw)F< z0ak8asI+64pBoEN42gWX2qZXY;+hbInrnKyto7IW%!n=w5cf-rIov!A$`DZyQL7oo z@Mb?wenh81gDt<$w}*{jT|uJgt)!}NzhQl~^zC85x3oSL^%y_iT{!_c{l;H^UFls@ z#vBqHhd8=hIPxdKAvL7P*(yk;|C$j0h`F*GydAD>z%Zu)LLL%W(^#io%Y{WSshg=}QmhmtxhH z--ZoEW+*H?a$HfK)NY-*^dQc#DNw*#tnCr@0CMT6p>l6kD$kMtEGjB1ls4tC4%#@i zH4Hd&0Pu&RK*i@^&_fc~y)p@x3K98z(ujo=S9Ai8MP6$yhYLz+T1e7_*h1r;LBUud z+8JTHclq0F2k*8kL%fGoZeGf3)?63DhADW@Bb;?$%u}JbIcc&?rp|HrlH-IF*rM5h zy!3$*!zB;oEG?2YNl4r@Wq;YhrB_VoRUA6RXvKN;qD`waaWp6YpQ6I|eCtQnip%|L z7ecFpI+wCEcPhd$luZ!?f5`_gv~n%YHM>T3@_4U`Jx7H);oj83^(p zF<1>bJ^&z5aO^s%c-D1kY1wXY+Bk#1&1B!WQJD}7L(JfOl5l(NB<$zLboY*}N9s4m zz^hAB5X|scoWn*sE`~lfgo(4A@`bE^9O-IODKjeuGyloB>XduFdQFeZ_pdM_kzOtO zfrB4vL-#&{E;|D6Ylgot6iMgDF4C)nbp9ma=W88o!P~R`MMJ*`83~=@t-LvfBd4u$ zbhM;BUe(vM{fBF@C*AdT=yE;w-eE;gZu7Z@ued5nX(L%ojc+Xea7_~vs-F;_c-;RJ zkrQt0Ya*4X*8x@Bs;#`nlM=pr{9lb@^e+6ZA?{eGG*A?{$6ycUtc3xj?5TFqN8`u} zxMd+6-}MQpIsxtaNv;1)0tA0@w zUjF+=8J`mt0qXzf?}ey*J~@AdQ{HQm{Re^Ulz(1OIO4?`m~i#xX$|Hq(cg6|tdryN zy(PEL@=QT#SK+Yg+Pdzw&1>C#T%L9(=EflWOY%|IE5p%htX^1k$7JoKI_acU0!Za# zVLBP(Zp{ieAmncJw>k%-L@7k%{oW79m~hN`afkVvVUU;gn;}TYD42)-gKNl|!Gb1* zqmJAV?UR}JA5Ao_0V~56k{=V%?4o^73P}?ATqiq|GVc6$pANRKO zJK}w_Ex?O8@_YLvZ^;QlY88V2SR1EQlw+sJ!K0Ek`Z3pBSsUbZYNj_z7Dcl$j(a9uqJ-bRybcT1e_^l1oEYe={f?h#uWt5q)umpJ%vUy^WhgFcT2WL*~loV`RDsa;ir& zGatwJ3_&AzQG6&qkPV%Ec)wZ4C_YA~W9zHk;}nC`0tFwSoFM@K&?S~%VNe$RTkMGV z>X*h>;nqJ&O@H)F8q)+p>CqEkXD}FVObCT9q%aS~=xF(`A~LDz`;d4G-TqZQbrNI? z&N@W7`|1Dj@3Z4zZL^>?dc{U*QpE^11d{VBpuecO^J!JDY@?xmcRJgl zOZ@iG(Kn9V!1M~R6U&|cm7sJwUQ9n*L1waQ)3fagi~nXJRJrQx^37b&+9N`3;VBb; zZ>Cz$^P#o4_wOy^8+5ROg>48{yLUEmdCn#+)c!;K-%^-R~8=W*vxyR}~aXV(bG`XGO~ckC=}cf7(s@xNd!;xzMR71N=c z|6Tf@wS8>wHvi*I*6_w_e!ORN`3uE0c1Pt9s|K-oUOvtrTu68NH^%7e^2m24}q#6c4N&(hR3jNSr9PN95fYO$X@Q<#8@Ri znQi-@LyN=wbG^;XJMx9a&-M2lUR3z*KL?Y&MsM~i?&rnmxs_!jpR~;IHLJb_zg>2! zRd^V|(9d7ZiY?9Gm7l?SeuGct9z&iY9P`Llv9^P}S-B zW1%$y2p~KfK(a{fnBdRuuGteffryutD}jJ;aQGJV;Xuw2NeyRDAhkPYAYY>uqNWl@ zbx2Ty3e2*%KE9_0BIb62E+Qa8Lv{*BAV1}xs{#NDl?ectnm!InuArVf1ckQ-YfQT14iNLq6~55Wlc?Q;yHquy0o zi2HbuYvS5uo3)p67-H7lfq*002=#rH~CUT}4eZPR62_zmz_o*pvlXm#vxqliLOz*X(z6m_G*_ zYP%+HwZXoL?(?T} zk#b5!+Sa(Y^;W#Oe`pb3v1D91M`2(^|iQ41`};jHhfUbV#)?H+DBY;Qi8e6Ttu zH0D|q_|^AiD`2je{ao(jli9Lp_i1sxUj+Mu6 zJ6u2d8z4RJ`xxshIl)V*1?So__<8Sx$dXmcx_hV{U8NV-4UOidN;#L993yhu+o=vj z+c5iI+&#QuXulH<=BJlx?wVuG0A8dkXWQrpL?L*>`A4UxWv5M$vA_aVJ^wXCAUd;) zq$^IXO--2}ih#W)(#2E@rqyvOb0kh>;pv_tg@lgUDoT~waL`obBz2A&1Y|pr^i%$I ztjK;pqkI1%q0Zr?Gc|irsRBgiB{->Z5`vpT1(za0E3VlF@O|rFul~poc%p*#Lkq%j z0O?D#w^<>R+fm}z=jK1&-*N&_00cNlh6C@5S|0|hQz5S#%3fJo|9iD%E+X!U!k#;8ipYuraX6@&%n^qo4c z+s(*I>8{H-<6Ezvwz{uJnRif~-(XW6`$B3{e*akY}M^13CfhjYgD{%fob+*c!6^*6a}zFp9@crW>8_<*qc zuMH2A_1t|vxS)UQ3%0NPrMM>P`oHMcf}>t3DfiV$c3y8*nsLX;DMm;BUN-5UTQ6Rf z|B$&=+f{0dSR`xih?EHzt1b5tDu9|jxA--uN+_%DvAD1a`%D z$M|(*QS*Mt1q*0(+F3VCIB->2vSh`(d7h@&KlRmR_ZvHWJO)ueEBvYUoNPvJf|N>I z%yj4R6CYp|8;GGfeNx@jPRzfv#iA3vRO0?zaC8i}R0;5~V<9xFH~f$>(oOkzSf+dpH&%jNKVYkf~$^a7VG21=NI=I+FX}qcROM=nNh)+h~c!4 z=EjLX|1b>4J@$tuMcA1u_>6gC>^wgTB8>aRaq02hI&Wn8#o19KG8Edw%fVZ-rp+7MNJuN&UnAdLTw|h#>jLxXV|!hC z$M$$@m%Lb8j<0;Lx|cNMGxsN+=(0Lb@KMU58tXu108jx>XJ=CY1UbzD0000000Cl461&u+VjJ#VW1a4)f6|!PL^> zNF24kie!~qWHQy@6&*sJb*e{#=ChsA4~Psc8k|}sYCd|E+O@`r1g9(UPt7IdMvkG6 z`2F|z+8MIn{ZPS~xuO)>LjeHylLQL(r?wxJdpo;*L)fk@nO#D4^Rn*xm%piEhEVAdr~9Z-6G3avVGhoCp>Iex z!*?|z3H31UZ0qTFmP?=7`TBm{ON3SjD4ZtF8vT(ndmzX?$EQ9Tk6S*fz1Zl^y=6it zrKeJ3qTfR`HLwRUZ0gU)bW+`D;^K}SA78~i2JKVhh#0(d&V?o@9U?^=&s+!D=Thoo z=JE`8_Jv1>?(7VtKVv*V&zK3=NXZ$vTAuE0;8RoW0V1)HBT%>i;D|^70IG;~kI559 zeo5&^+S@CAVX%dIG|% zi|$>Q{XWK*y?oHSQ)NfznYSK}clVQ8_NJ2AXzxnrM+r9G;-~r?=llM^olK7(n0a9n z?>O%m-A_U*>-r-T$h{LJ#4TJO)XJB5_$J8a$C^RwtPHsT#5J*}muK9ktK8bBYh^7@ zfjGGf7vIwqbxCYrsS?FfwYcuRcBeafep)&@;kDTJr&=f*&gC~Riu%*DuENCL?W@t& z$6MTeW~p-H%k%3(4AFi#JckR9!paZm%1=zcCb0l2^XJ<0%GvHwIQmoAs>)XH;hLOM zeY^YY0Mo|~Q@7vi=_GpN4azsDC1{oXXjV@R2^7SUebzflFP-d+-@1I1hsN)DTAcpx zc5*OokT`zt+%{6+oZ?DYU-CGM&BOX{rSEnm8wN^7_~$tb7^k!A_H-++S(k+BS^aNp zt*YIKx9&yy<$Ftd--l(rmdf5exYs-UCi^8vJM^8^b*3U_X8&92lkIlVx@&_2$L|8OIbeSf=%t__)-5eoo}%pTZ{krbQq+$d3omz(b|x&t?jywn3EGR19i!6 z7I$hB{UZs$(>%3GhG?YJ zbNj5?3VA$b`V_P)eH6qTXdm;@#c@`;$~^6BkUZ>q`24sSq=>8ykkdM44}DO9NQwf; zY2F}m+n;hguzwuowF__@Vt$`jgD3zoM}t#)-Q=N=X;4AkvGR+#~<*+wLRZxMb;^|S7r&^e%LlXlriW2l{~iX>^iU#`js}% zeZHl%iUM5%TVT)5@ezJk=xCx12Z%zhmvbR_TdYO3?o;{H^J!1E*INf_4I|m!^oudh zJj+#d|CQLy%GcR1?{rcS483B=xuDf}7k&51>#J!_pgAvZubX>!`P#4Dy53%JmX|SC z^|j0Dc&4d>Bdx0%`ScX0xXJD*;oKu_*{{oD?2yOz&jf6#yg8*!kz#$?-W4rH_Io>^b`6XB#}u@C)$BgK zp2p1DaR@f22u%0Ye94T9ZLV>gIIiD^MGqc&*)QNf@^1fzD+A{wJ6?a9UDwCU*_ zKrx7yAZmhEQ&2RBn$a}&lFsy?qRquPUSgWIb4inSV$ycrb|#tkoSf;&yG+}8=R4o? zyzle<^Q~vI_F8+bz4lta`|r0F&+pk&1jyjWw3hutLGn^zJ}HiLQSRzg%5^uiQ@b@c;3i~tRFS{V?d1bb4dya-Esykd+^H1vydbM7Yy?wou zn_ZyG-X0E1a-CjXq~DIhV%GEd`Pl_Ol?(LpEd6#8<%fA}R%8{Ez6| z02l>HksVd)q`^*a;%n|s)p}`G+~n?Tn#C(xBy&GygtU?a00PX3w6=jis%sZA_TZb^ z4tg?b3ery#;f}%^8MNv9!irah&JFE-Wg#g6jVPr+7y_A!XJhNuGn1Xyh{Nny?7<7X z)4d1jBEQEt>}al7}& zjP__91e}Y48dHfW(DmW%Nki^~aHt=aMF2BgCdh4Pt0&l(Ct|NG37-FRa$!{3QfhXQ zKHmV-;axkA?Ed)3;g65JQR=q6@ZKAx@7Z3sZrk-gZRL35kJrDy@rVDpemz<`K?0um zj1#w#`uW`cn;HFK4UMB@P`M5gg685UxdzljRkdeo-h8KeI)(ugRuPQK`p+gmtt7Ad|$-9*DgNp`qKdaxiV@q3s_Z%KsRGVjUv?=VWgb#mG z0^coN?D?breKssLb-uZ2@_qdeu&Aso_cEQqrRQCSq3T^$_ zeZM9M!@wzkZBqo@nol|Me3zoCEBS+G8)a3wE3p*`Lp!-zety&vJ0j8MVwtroWm>8yNkB&T1nfzV%WWU zWcMfU?0(_hH%j06kzsydn?HPf_#ZfDokjQ=ZMRe|__ zO7mBw5U^bU#6bF)4fnR_SRGf(zMd*^NYFv*ml7Mh{zSt^ZpEd-g8m9R?@RIN<&4Ib z_D@ap?i5AociWG&@Q!WA`xI*eDinJNCOXID!58w`JjaQlrnuik zWuFo{lq*ti&xxVe_^{fu$)PDsEAKhA)-7DAGYky}eqMTl_ra-6J;D|JE?BMHd4hKt zvVHRNsrfxs4(SzXQ-960bjuZ3754m8-Cn3)e^*mvc>l~-(}%Y&=?(q=y9(!~I#spa zxuz$HmA%qXQ`WQRhidhs>d~RKfM&(e-5=2H`q=i>(f;A{aHyuCz(E77LfyTnSvuU* zKf=m3?Cv>3UtLwM!0O#c)xZV=$53>nd+4i_{Er6%XEuDo$zSdIv3mZ@hMnvB^HDPU zd(O^Fcb%*`|J3T?UGJT#4*XQz*#)Zrm`UNl45BW{AP7n3L;#v00q=e-?jy(=f7u2p zx95+q2`-+6;4Clg5jqy75P;P^x10Funh(%p;ceeyXGyGQod{$qV4gj&-u=p7luOe5 zjxSWMq1R5`hTsc`)axX;4ZgmjH=L*}h2!>D_XGmx$JZZ2zJnU8x@V}VKe1;haQ-Q2 z{$G@Z?EE6buE&4udH4KT#54~NKh`vrbC&B%QwXsqRR(pkH?vRA}F)O zE}3ELbfVt4nNe!_pvKlGIE(ZhvateK&NOHKeSMo*JWzSxScqdCz*2} z>eNBYVm>2pxU)s_$5<#3*9{FQ6`{!?1i&980V0^weub7}rAL&~fR7B)V?Tm$UV&>& z_-G;-0ty1<@`2>bj{woJy9Ppi9gdfm*Kq)WICSR`1n-{LudYMeu=)>BA%PpTNFbwZ z9c|mMlSY?RU&sSQ7%)qyyh?`R0^YE0Ry1HN0K_+-m1I=JBuXn2fRhen_yD_NL9HH6 z$w|6RbS{_ecIp=7iG!0>NrS!hF5TWMy1a}{34_;ql49z$d3j@LT`5#=XJ^^og(ggq zH#U2{H;UKLS=Ky}v8f^{X%eqER4}L0)k^06*jsdFGP>dlG{AnocgtMa1|X~655P0y z<%b(O`X_=AU1abY08SkQAYP$K8eBKchC0{b?k>uMaEI_b4dE{NWA7uw?a;y_>n-E< zBNGlP!SyQCgzHskO|8EMjS})Yfj^PGbrVh#t*;S-A_Jf4JOme&&_(CX5q0aUFrW}L z4RD@Ypy7w|I^jZ>U>9_KWz7Mb7Shh(wX(V`b-FzD@FYIa$!~!39Gk@Z;A&m)HMqQ% zLEqJ~7RlDzmC3NPsbvBx<-KEY$zxYCZvT95(mVLxmlrZlzrIg$tz<7$*>AnjJhl!7 z@oW2mIdA+xW0&vk>7^Tw;P5^Pw7`Y`@h8=;9)uJIC-w+&oq6jGKcG;N7y}!^e`sjX z=H2;w1DyME#%s{~cU03%Idg~bmKLp21eAKW$0IaeUj~doLv|jz;YmZ7WYtX_$e`-if zXke{>XuaQ~h95rkXd3Y2UWiY~mu3(z+7c>AJ+qCR%TCeAY>lG`ScdW_YZNjw1Ubwi zbU&5GCUcU0c=o7a`0rgFRsa9bcC3Tor`7*|ERn8Lo`^IrMdh$`dt!>Y2X4`DzVi{m z)Q})|LxREUusq0NbRNWffkHGk8(q=hgtU^lPLj=%S0mSivn3T{6W1UoOm{__91z@xw&b7{hv0Z6d(XTdUEZ?vepgv-E9}zz z^c-HkcQkDdN{?AQzF~aw9q!&MX&*zQZ4Q010%G&Ght`?8!6}*J?p=5vn173ggAgU2 zHvBeYbL)HGAq=L<%Nqe^9GH2a!E_cv0SZ1qDjwhb_PN@D_l7%uwN@Y8R2QnMyfCPr z|3bMKpLW%haNW!K?G1`?UFm@o079i#GCu0v{Dp7wdTlaC7YW7skqg9^g4wc^O052> z=`K6PF0UP~W5gf{bNWmhqyFa=o4pm0Wg`=VtW4;8m!bZl%(>%2qBt=&YC(NE0?06as*-P#s5E}6!*K@~4_J6lf)wf2<)@zVTn3NV9r)OS zS+NEpI$SFwM;5&IdDG9feNNr9#_r05&MZtQcoo_fTg~?Bsz0V@ZhKayQ0A!eGzD6n z9x6eYFz_q@E)K!(>CR}2JpPyyYiGJx9Z{WZXr{>?`SSpi0Wujf3{2~)luZ7??+-#n zx1QGh{`J<0qrNcwV9UdY|Mc+7hYy(#A5tIw`+D{;^Wnp7zP|;ZFk+gd=f0)lNKtxP z#G6;NBfoRZnv4-2aGL8QJ}CO&dTeq@-)g{A!idb+67{vCBk+)3CwBYsvcx#nYTH6|Zo%0MYsxl~0@;}#*?)`1;XV~$wlE40V ze`V)0>}F5@JB?mNlZ7(rH++55b3NTwS zspIaU`s>&;R5yCV$Utt@F`Kbq8-~YApHS#gD#7p7rLQ-1nQ#uQ&at zU47(mezTjFwOCXxUK0` za`cW+R1+E`u`S?Ngq12DM)8lnwBV+9ZUJ3B^vgdXG~t z>~eJLx%Cp_ruhPzk)_1j1@)fgVNK>n9P&rO9~b#Rl7Of>bw(+SG5!bWr-%h z201p0rFzt&27zq#?pXm%D5Ndl9ak7le(fN;OpXN_78~@uZm)ujxhSYlt}_eNGFM)Y zB4tPRZm)GPXQ%j_lSsm?>@}6G4(ND1PEr%ihsluW9&Ui`N~j0kkpYp2Lg6ibL;nqh zrc%!<1(dz#>n^QfMIX(A#}9n4^gq3KUZ^H-2XXgPAN>4_C}{$s{J!Pc$NvM#r;&CG zFZu>wC>m>N_~e?5n@!V2(PNE>kdV9qrt7fC@ctJ9NG8KRF^MMx^^Gd4 zk$llpL0treVi1*TvD{&B`v4)4drg`BDH63)&_VbaiW_Llp*cG*Ueu({v{)3`dcu;^ zD*-oyF{BDcAt<7?h{a|)I}q)XI?fcYW<5}OHxC+recnnd8(z(tcX{6ujJ=pxwl?z1 zXAuL>75J|*VKq;^_Ou#pJ(2cc!^Yw9p-T?EU9aN|d#41%U}VYJ#z}!{T%bzoR{P0E zX&O<`!Po0lyH8l9(gYexm8Y=B=~IYFthU*VIz5jD_M%lXUUryfR8FW8=_Mk>ib%o) zgP@MRJW_6bk)k{*=Vn{=y89Hcg*mKS6KAm`b~cCQyXYf3j6(8nEf#OX(nf#0te(lx zqY+|D5C|mbDCRDC+Cs^q+nRzPE5WZ3fMNj>Oy-!(38}*(l>(&>_aLfh;^Zrg)!&8u zGM1oTz(f`GJY3uDM#AVF0y7?RkpL?+k5uQ$EuGV6&OCwBG-}ySB1}V<5hk^#VObV$ zEAW2?#M6?ryZh^uM}L2{<4>%w5xH1i^!)i9<59>IGP}rJ+A^G<;|SyAGO{(06QdOn{JMUeVDQBtL| z&e~RE&*NL0k~E^QBC&eFsnK{zQFuxlu=j=?Xk(=FD$o$VsZzV9mkAb=^aRrx1Y{L? zMM4%)GZj*nUvaYhAZT* zOrg2R0(A=3O4HL@iDA1UUd=6%om9;{SR47bHgapjnG<@JFELXwvif}P$#bIixV74D z!MU=e`#f|b%ePs**%v8uU_Nx$cKV2M8TH;B*zA!7M5G5ImrA6_jrVjJRm-{Yb`E)1 zHy#*JS)E7~?blB83H6gz{s&kG+YxD3pL9zJZ?*clh`k9aR8?(bE0#ElyzI*%x9#QFjv(#Z+~PX#8m7ICY1ZK%zzv?B}0T8WylhG|Vy(-&sOJ zBm{ycrv(ug%Sa}0dX!|Cp!xuTE3JCjSzsU3y1T&%pWJxD=?a3_9Qv-uB6RY3fLaNB ze})%5oW*K46Vwupa}*0Iq7X3<<6r|PM9^RaC35KnI|feqqN*MnmWM^EGt2+#^yd-^vMI}v6f=j6XQuy8K#t)4)n3;!`_^O z27XsV7z`y`hw^$V$PhNEGNVZ36mld37dPsuHU&?@r)fwbLaePuY^4QRL9i0FS$lp z_pC7pi_s|ZI*pBSJRbYn4o20QK~VBsv_gT(t)3;OF0ZRw+Fc^jC|IeMZr)&C@?g%$ z+Bo4QBS~p7WUivn9^=e3PwUVKk_e0wSe6*Hw$Z8XrZl}cOkfvu1d_U^bd=P+c~#k1 z*t{~($pFcv;q#()g}IW7YjG=sicj|AY z8P$eQ6J@&N7r!C4R1bi(*RSWNy00WYu|?_|y0R zcR`i3ZX1~8*^%^mg)wB*4Ga1~m&MQUEaPrVl7?KaOz|@iwx>KZN*o2il2~1l5`(IU z7>1|`ZGh+^T_dgc-cm|8{4cmu{eng!~mq-99d*{f`0ghtC+4iEY^e$5;W+pkEMw{EW zIPyz6ZFvC2Nb_YJKn%u_v#JH|!A|3N|H+b(-7?l*XaCttq0y!1Q`9UVPoUy1eMAI} z+F=%$Rlj`7BSNl;LW_DfO7_T7qQXE;3}Y8HwLV5;Hj{;Z!X)II%-tNC-^z9(QK(3r z&1wg-#bbmj5K<-<$k;z%+LA|ICyarcm>h+ziRM)>jeI=bzm&qVJhsl6*GE3Ct4(vUKZ zTrtiF`An`kLAN`P2oY}7tr5zXq4g$5Ra{Gr?6jmCvB|;E5=L=Lt@3z(oi%Tk&LxW$ z?;sb67`v~W$|)E2<#@F;Q7eqLsAub37kx|Ot{f=&eSDG4N-C$y`Bq<{nhv@e%|Sgw z4~;$zp9LR-CMMY>Z|AN#U%a;Yu&r`eqR8{~orLcb+R3}*#Pa3QogyT5bC8DoySc=R4+#~Z##LUmSDV&;5ryXq1|FFt?SYJ0J3 z3ZVqFD8p$+Jb7{!*~+6ju(?Q7_6RvOO=vUOEzBo>rrgrOnqJznxx-l zA~QWH61xFYh3_wHl>M`(S!KfoQaqVWIzr*&ikWa#Iaxxo28|Kqb^$dkw0M_JjVkdw z1DB{dVTa$JmN*nUp9Wex5kt7>l221zMm#qDZ6hQwp;>O_35E$Fm5G}Ld_QnA&TlAq zwQU!liZh(k3`d`bbSiY{Ci)-95^%j*5X*au;L5tsbd^7o;_Kg=o%8i_>EyuMdo$(jrHzib(s%88)Cg^Ja*u7^^M-<{Q(zrOc7uOKE(Q2(`XIdmSQk`%J+6DAJ z#~mp*N0S-W!C+y14w{IpnPm&*d&nGBraGk>>6fTls_R4-l?c=2j%A zm3y4fa5v{vo{W>g=Sf{jUX>w0XNya!yOEl-OoErj zZJpNT?RvwzVfpc+C1wLkWe*=mI&yf~OZ4sBVtcpT+JriLL^z@vZ*$HgwuVKzFuTL< z?k+8I3f2Nv&c?1uhB{f^(_`cVdRBt&us}MG1#-%H?C&|^tPLitp?Ikr`Y5)Nvu!!6 zs%qa;J7`|>y}MQe=fUPo<9IOzH=uw(ipOOsns5H)SE1_^Cu3vioF{tr z70=Mucw}v?X>Qq}oNYiO7e67NW9_)6s&}&!CltvWN?R^;ch9HWKP6G^4dccCK2E%# z`kdb@sqN$lV2FTtckVsjFs~vuy{o`gM_x+8d6`bOSezW}9IVy4Lwk_40@H=?kUq|}ZazNqh_ zk5vc#PX-q(iY+l3hTAHh69}=3K%^Ek#cK?i9nqLF#W8gntvU!Pau^!K7OM(QZd#y5 zc``+-2Mpb%&JP*YY3CtPj9q=c5M4#+g4lrEtQ5v$_OnM8e(#(E5~0b~ho>calU# zM|WdTd-2Gga%-9w1^u_PH$jD!)UE`X6hP+9nVR6h!Si~waq*8!&W2oSU!!A!`~!g=^G z_2I*ehYt@vd|2}E;VTaxwmy6~bSkv+XM6r-^DtSxZS1)3oYXB^q!=WHp{jtR`}>rB z=C5TM!xO00k+_;)!joiWJIN`9bplBSGk%9hT5=L3R3V>6p!8|9V&0>xaSLM1YLPtKoMcuJFhoJP3Un4ncTg!6 zDR8&Os(`vrt(lQ#VzOMMD=!6;FL&2*shT}0HL@w$reQqw4lbskEVHkIn^Q-hW4ju~ zgeI%5L1H8q(nJxU9AOJ1P+6T&ew6m$?r*fE13Q;?inv>L7=D@a^u&jX%~C}|W1~T) z%6?MUL=m*JMNuOUl63x~z7wjuvsh5 z$VuinmuRGnVwDmu-O~c~7LS6oV|d5>c}4r;oGmZ?+34ac*iq9|QZQb|o zW}Mvb0I3I@?XU4_lgU|sAQJUlIVM#SE=gN#Iw|Fg1{JwW&Tb}L zk!%I!TBcY+Zjoq7QAktC&X<<`Wg9OF?lVV^w;8YHj;zUEB9Xl1t#PO~H}BerO5cR- zy|=bunK!0YA3u|a9o2hPEZtJx_M^UH^7#jJlJg8z;QhBi?oO7VT~FK>8LPfeBN{O> zW0!L=Z~Nlir45G7`r+fxvbfoP2QlRYG^)PX7FnnFid-}SMZLW9mu-SXr?zQIHy&A1 z>xs7&x9bWiCCsB7+oUGoOb%iKX$fV*NY2XYuzT`2hzTn}c}*PZ=JQUXN+s)%l3Wby z8A7GfsmJ*qg-kXOPx5n>8WE0#z+S5i2E#}U+jO<36H#yoF$$RVQbNTEiR=P<8Zae+ zDm8RHnZzK$?`pzzOpT8=ZZ0@{_r0*`-E?|9bfHKj=m>W_;4YKhJoTpgX+Da0#?QAK z1fesHBsbm9HIm*g>$hFKoE}@3rC~CsK-yIyf3O(tl8o4{etg7SyrXfLku(wW%sb~I zpZKiD`9ahRPjs)%xwf8-Yk91`>t_jP?G*A%lbbW$tu@4}ptU3m%x_!DAp|$fE%-qw zXb^t4AS#|!3jGZc=(kMb<_ zs;DDJTZ6B;p)JNjtqVR$H%^)o)Zjc}6ebUIsYzr^o~!Zu%kFl!nXSOhrduSf4zrvk zB^M?ka^0GqTrG9Umzk|HX#*CPh}2t{eQHXkoZ#BzgAyR7vfAN>zo<#9CNlYV5Vc9v zG3802DF<~)2nl;T&M?9hoWn*>8oD^q$*SsmOUwtuF7_J{C^k-rUmC!U6$aA?G;^bviS~ioBUnPT^(KdpzSER_QWl8kHYD1ENW*UyylP4;- z=!I+TM3>!T(H}lM2-Gw=3z;(alU+n9sx~%~oydk^ueUnUOs&Z?<#*YrY@W;^FkRHK z_5!6sWp>*dKuMO!Ra!`LjY8YLyEJcCRhKWYDv(>DstZ0an{#}m4}BfKc%owq82|CE zopUr?D^GmzNu_&cvCuFpH6X#KHmPmrUI&uDMQRV0et&6lY3IV{Sd^kn&&@)KRJ1Fa z|51+iLMS9=@45k|lnomO3U+DNY3o4Z#AV&`9b!cs=GQ29FPot>VHIMOY6b$y!eo`t z*r$CgGZ1eqRBN(8Zy0lvq9E8#x@d&{f)6TYf zI^21KMHn9=)17ugO$LP)4|#Eo!R=7&Nl}rb^h!v3q7Fw4TT`J;vdgCgMvqG%2LupC zl*1T}luY6eZ>{II_ayyIHn@xnoNVD7o7yogt0T7~oK!!9!Jx~%<%l~dRce!Ptiz~7 zxn1&)1YHiZnh*&k9XZQts}%;qVW7y1v0ZeAurE(nW0%=w`jBsVSfJKofIrxHcu-`x zHn4R3@ZrM*g+10eD&CR(qM+qt}wvuEI@rj=5oGDYwci7|2` z|DJi$_{O9QKiaL%MYEYoSI}q!jg=fD?_T2k;_8yQba%0r-en;1ki9Y|m87s5F3#&n z^+5Kt+=<9VKAG4(B?8oTg+@R@)STo&V>DqS!H33Wt128Y)na*lcUqH*BtIJmM81X- z31Ny{t9RhYefh}`b7hZl!H2%6iP_4>aA)aq({t`u4g{j%eOF^0mWn3=D%$Rr4mwN);2y)^FJQ&o7iUkDj_94>?CgBEAtN7r!pq z_exK+@Ld&_uljc}iC=bOGC68t#gugDIwEw2H#bC!=kVPs7zvuDeaMxEw{^Scd@CgU zR*U_>uCgf1$?*M2ew`iu*C1o)^4ON0wAY<&(Z6H+zBS*eOny@d((D(*-n&|oc&Y)lzYTOtNqE~uJ zgb_rA^-H=1{Y<3GLbDd|JC-% zs6W->i(-TbRc4ONg~D0FD0aUww+zXx1}gb(AN%P5$h)?Aj-eJh)cIh46Qp?#n3+x@9TARF%i zpbledM?Ph&utx<~k(BFfbLxe5iY}m90A)@N>z- zi%5>JBID zRUcm@?Z_9BX>#DJsQZ8%0~(!*=QeU2ZT(Ayc3UHz10$9uEQzZ`08w=UFrzH&wv_HRQ4v(Pxe$)@;q2Js!eZdQmAfX_^g4R`QVvkrf>vjE<6tHyaHGjt2Rl#=0EM zdd5hgDEdj&y^WM}Tl4RI+dNZV_FA$XiNdJhi6(^o0Oc;DwpwGI4oT@v%zDcm0Z^zyP4Rs4CUToO*u;$In_ALyBN-XFb69$zN(j$M z2xEdkB)%DJ4z zgS%uzh)#hH@^-DEs)~i!P>suAID1K8M;X~ndVP0ODHP0C&n{Y?eNfG|0dqG>coP)? zqoKnV$1`x01lckOvUoNio?r_+fwDIyN7t%Vs4Fxt0OB3_`AKYYaMau#qf2?)g-2|H zv6N#|4Y!8CPl1nosN-N-4}3sb1mzjSxztQ*BTd)5syqn+Zhfn?# zXE-FW<58=-?<0eMeyesaoLS*HKYGgZV$DY(Et0iSA6ks<*1Y?vel;W>_xsnrsA@_6 zo#jejanDT74&FO2O>(0V64I8K}@~*wR?el!V6dM$}!r^2(8!Dmw+a%ATFaT6)Pd zNBHI-kMFpA>1=xHq1gPi)p2jFK^~G(3P-%PhigqoCO4q|fz?3tVyZlx3AETsTuN%< z;@OI*Wd6BPzWn;{zQC!(0L=*OJbvRW)!)<=ok8Qx8M#==@1y_VPvmD z71QlJ%txB!^}ueb0_WjAr?mAxteed zo%%(PnUTwH3&!-pZG$0kjX<1;U2_Omh-*TSSNeRWOnzc7iO0L$i*IVQ z%VN{TO0tqrb1{1pYMoLFY-*l(W2*TgBB~dttRx0JP{F?=2*WIP(k5WMKth?&^uRGP zk1)B~aA^8=sZE-}l(}~1tqV*%>_)6PiU?CG+IsO@phY5RLy*=ctm~qO%z;Xx-j~v? z_oS@3X|he#buJmXxI%)i#3|JY16b8D>V6483)15P>kfJ5_0?g8%VEHvOqGY zR<=ltp+u?BiHl7sNp=}~&Yns{_VNzgfE#lia~?7btqZ!;It)O@awB|rEJKso7qlay zE~}W@5QFq%dZRNKtfR}d-38=Cgb#R+(*#bbYpSwZsTIc$W$zdNRW=wtZavA2O;Gxt zQ>{LZHh!5(7~x(J;BMU58kfD3oID6h1_B{p7en^sa#mK@^coO&$qZ*BaF^y?9KCB8 zyjp9ZZ71U6Pt>T%7LAwIlR>2 z7Suu^Ng|qCw-m3AFbV_86A6AdP7jofnqoOq+BDf}aiL`Ok5~CaC0|EhmBx*f8~F|k zZt5B8tCcXKDDwLpgFe~aPoTw|Nr%-CQQlNv#0UwC3zcKFDC)3y8^_+yE}R;-J3J1J zGFms0*nGUKaHW>B!d6c7Y%S7!kgc56HmA7V{YPf3pH7rAW~u@;{$bHjk7=99L2gWJ ztQkRzM-ol(_UwBOKSA$L6ulh^_4hjhj=tL0_w9>dlCFyLvo~TZvabU-tKV(DhQ705 z-`SeN4=9C78M5!pv)_E~>~>rh@dxp^f52+DDfM{Ytc}XNr z8uQpO!hDlRriR}V13P}8pcgP>c)5Z|S!~7u{v62Qkq`0()^dCnBamt1{&c+F^ldsn z^7uzn_%>_(elVEelYb}6&ezDAb1&@2NK>Y7v0xN%BpAz+306}{r#;?-@R4tWXbf+^ zDHLP#Tcm9-a#f&7V(Ays%BvXZxZDUTcy3vP7>k_pA`NB=8a>@#vhAX0#V;G^ zumgIZn&&~|tmS+X#zc+Z$rk+@>QF^yUk)bdf^oo(ywgRvhN!X6rH3z&XehvF+djt0t%-b!gH!t9~88M{WEn!U3W94=b6tB|=p&rO(3QCrim~_$?qx8IlxRejT-;V70 z^69QuU7t`sfA`c|<+w@oyRVVGTBUxLU%YuJ>VqD~@A%KSE_B^1PFvB1XmrraL4^wO zJTy${tqY10y@kZ*-8P3}a&M~KL5*l*qDEGyWJxs@DezR;vP3>0R%hM{l1S$QkxYyC ztrs_bUsnozqes3f+!_eejqezO#fvGdOoH-$^zPkId9b>OB%H3R+u*)o2DmkR{45 zkbax=ynoNNckeraR4RK=qaRLuuoo~U9BIXGP8aRxUcJ*;GRqyw|2!!@;%?oQOG@m# zH04X)M=jgGu2fOIafE+hBQXCwBBsq@?y;*+OW#i{`GtOZ|CY>6px#-x(l`! zJ^Y9A)9+mOm-h_0hic?=#ov&J9AlqyIPn{|3>jjRYb)Z1{9|Qq74sQw^EkeBh-BpQ zhiV3nykGOS<5LQ_u~f2+*?g0U*Vl_t$44F|Iog6MJ0VTBhsE=6D3cM;uxWWs&%GEF z#BHef7DsPDvdkeVmF3AT3KSB&L=AWcWRb`qJ^S}td*YsI%(>*zdoO&JvobTgsQM%T zM-xVFU8xH+Z#4Psma*)yp_F$_MD$eTN|EB<{^VlzvN)eJIb8DcRccoBY%RSu zO-uq};Q+ti>*d{&^&aB0bC`H@eIZIlwng5sm&8UN3&)WCuWpNM###Ynjn+;5#HRib zADkiYqVb+oH*+bi<=Ki$p!a&_eEFAi+r*6sYPyi60; zylWzAMQnIurFd2^=ua2XUfPElW>lr!uIw{$lO>E7q+@n&^h^j&mw$J_KC6FIqyXlW zdHHuG$w4N8&dLy!Qo=Z8AMgkjemjO(CqOg5q-S^dE|^ns(~5zi`Gg!k#dhYbN_0nQwa? z`5~*4b@$TmUkPx4`He_{@>{bVrADo3SQ!V11>g)jSl|>?vFeO1QMm=~X`c(BXQ$8z@{HLdKGGnOEHvdl1{Ilt$W4CVy zgeF&?_JdtRQCT7F{M6jtX+h=Q>)GJzKu(qWda@7%7r!k3E}h&s=P4)Pd5(f`D@oRy zF3FKCOX{sm3v^4`)H1e`Vl8ml=R$1Zo)#=-69zXg0H^%`097X5y|7qs9^FYj!D|dX zqv&E|yNxk?!HaLFkO!GHM?&TQnWPEP?N@3`G&anBr#igdBpJQF&wZT^Koh(_%2y2YBNFq@N)E7A{-+7a3ibIL!atSS?YozBqku!2a9+A=@An$hSQ=8qcp)?QMjF@s0iEpEZ=JIfw|CM6pmoYk3UpMZq z(-vJlvt#H}$&`K*bK5WrGope| z2GpPrP*$q#Bt}aNJWVI*Yf|y8Q;J0Jz_s}Nnn<_gtXxx7T?@~2(65f3S@l(J>yF-3 zc&euA@Ys;x*2Qz_O@G#$dg~J~xy)`J$J^N>MYUA!EwTVEQdobpf!4 zPnKl)P9o=g9Vl*+3J=+4d_LR%~1xso0O%8WZ(&TV9q**_1GY?Oy;ifT9^3U$%8qf7~AB>=Bq zOv(+$BLGdb8ll7@0I5O-xwb82f0f*3&qkFrJ4sT2#zM0{$=q@Rd!8bW+~7@QMB=}1 z>Ah28Cza_hA68xeI-B#-lk#Jem0Rlcm)o4H>U$+NQ!TSOvR`p6&ZP+a6_ zb0nny-)co7bo%+4AuhMjLBNUIyS~`|hEes!~H` zNnznczx$?g_OHay*sd|7$UfF*E>q4*88Y89+4(^&(-4aLtUOXu++0K8)&XEDk{3>C zDMfQ8hp4~5KttLDXM6psIATRRk-1L-XBRQjTH`MhCCM#}?;0(M@0jZC*;_?z5G&gR_w2qDEnidm#Napq@a>PIyNQ8T5?I$Fe6gWlfehm zpHD!2e1n(F%nD)Of#cI9Fp7@FHprQ=!Txl1^RaJnzKme!96+rgw&ey5Pu@fRtt#8c)k8(Pvg$&9jI7>F|38EAVH#v_IC z+hSwlsTVT##M((&W-*w+M0nHC{xyB4jJ4!ZSRIIZ zkPyzvY$SSl)2qp(8z_PpnQA#QMKB{s{Vc(r3pASDj_(f|#X!zO6p~kw$0{&fETFca z8G9N+8T>sVoCt4kzjQdcE1vwS&Q!)HAFL&t8l3hMjuv|u7ETbx7B6OHeXC49B@^^3 z`J}LK5m|^p+fbf3?y(DaJlS}`o^I4^s@8M+F^^ zRfO7^w`13Jn>mE@cw&5(FSgj>-(_$rs%%W?9|B}iZLqya8&x!u&NuV6HB4a=C7IdC zi={U5$X0$j%DbUWwxB#EBf6fS2*WxXID3v3|0?O?_3t)0`M*scNG#jE|lc3$g?8-Kl+b(FIA{<*oopQzdWh=d*mmME~8JfY`A!5C85!-pR~e0cTY!@oRy z`1^+sKRBg-qK>@p7uU0|{YS)x)vQc=O34?T3FcqqvX7Ju_Jz7<{o%IsQV+ z)!)S4T+B9T403kiM8RK|?!R-z!tt8YG&4(80ee!Ox1&G&D`0n&n=0u2(IZ~Gc*0HY zXE)zDSamQf>q)@jh+iIZ_gB69$(A8cqm>w1TTc1Fnh2t!veY#dGg*HK|KQAyCrF9? z_9lP%;oPO| zYtc5xFhjFRO(*37{sImvdh^2ReK~s;Q6Z;8Ppp|yk+@pA9)6@}RoZ(&OvMF!BdH1H zg6W`dMJ!K9gwBs_6Wm_skjyA_br}eALM+S3t!%-`2Np8oRrHN3xEs+p-4}g2Hx5=} z^d89_hSJ66iiZUqc{A=HdoCuofMJ#pfGj{{#$FUpVMatTf`|#g;~)pnxCG3OF&iOk zHdKHqqc%~{Dxa0QE($=o#{>_-@`W1{-8oZimz>a)!$CPy@o0nTKuK(y{U(~o4EtX+ zy$x7XXP)Fh~>^bi9LL2Oi*35Xa1w$Msvr*6AJ0%B_!Uc|M|cGjvpMaS-T=drW<_j+dLf4jSX zE^{Sb7s^Y{eeV1B`+mQlUmL=xZ-esXZSQxi5VWh-aIL`ZXp#C2b3`*Tpuv2(_fBY< z?lE(bFpl*{R!A)QwSY2qdGh?XNfy|WKrTvzau0Aa0!m`51MM`!@NEHBd?aHCcqIfV z(XOd7WtC*#849c6>jNSTW?0D}BJ2dNI~ND2 z(IcF03uu0V4`g$rd`~#xJUXU1sn}KcvA;tW4{G>bwf%lu#Yx4!w@8`Hzn6lt)H z#}$KaCGhT=!=4@QrW-;etjglPnY(D4QuC6$5Dw@pFh8y#W}_PhbYhg@C9k|6*~y zbgo)8Hbxt4$E*8m!X6v~x=3SEAkQ|DeIl%1zbqi~14(%q0vbbNC3Pp|<62P4;^GX5 z>}jCcna&+wv4tofCM$q(O?OO;I$MxVNF?ulz6Ws=0VQMz`(*(kjrM+~xX|}<=9o1ie*9qG z_<^qH=*2fR82mdIH{YCLi~ZqcPQ}=P>*I=W?hz|z-+zc5s-m;If42Fs&wL%x;}X&Q z@33PTf%@x7+C2B{2glP#IVg)>pbVKi-#&b`&SI#vyU!?E(Qz|8n_CNS?9Mmf)4@u& z**YW2>R1X;hImUwn)TaW5=!g2FV%SSuZP=s|I zJ=7Xkjz?Qbp}%q_ILa8MO1RE9ka%C*O`c_6bEnD9vl~4NnB&cx#_7S>E-B>u7$LF^^H%Gjt0|_LwU8i*HpEKsc4O5L zH@hjz_qyVM2b72{n(>H6a-w~)1a!;P(7YX7Wud4G;!CJ@6Ne<}j8MO3IEa%VYgAF* zk>{WDlFtV*M;D4>Y7)3SphLvZELTA+BY*P;+7|hj)_c z>N<&_a7kGojii_YF&A8fwsO`0dBf5!)Krc8C_|YPacMas7oUP^a_MUQupiepGgk4c z02uOdzTG1fAlsbDCBT^X~r6QVw^bO`S>r7H+KTR!i#Up zGIfHt43A-KYfGNIAd#?J0} zUnPq_NvXNxIqnW0$nQK^{jtF`c;|(HD!mH2g<9LILR^k{uk2Iw4GXj;LZ2=Ar)3@Ft zxaj0Qmvj0iPlia74qmGDKlibp2%&!WXO0=z?8K5fp?8nN>6ATp!-7IANLRg9SOz9UL9B-m@))B^H@cD= zHI@~(3M**qziY0iq{Q<|PUCmb4i8EYSdR%})SxGN!~zYCLBKH9JBJ|lBqdVj@Q;_b zQ+S~54Hf_R+*=}@5lb9!5w8Mn zDm-BVdGmG@LeROd0eeAa^_z%+ju7s!-2=yO6{#{+DVsIWFi4Gq5Sb#|F!y*q|liN+F!pW;!2J-H*NF z(9C?As4ag*c`^7NzxwQc^PW}unZT&OsrL|4v1Yh2^&ny)5W^fgtXFZ>6VdQ3OH45-F294OpdNK2q8TpjQpg5S zwN8SI6gDmh{YMHFowku`{WhaVy5NB_7A0sMyF}U|_vzT)WD^#R80(%54`xVf9_aD%y;u7`R}9h)0)W4p265 zV3f)tG1gXBBD`^H#t?b_+n+_b!mwLNOv9;>ZX_o3%4nf8;%_bYO(t!}hhDliLCTY@w3 z&dOxO_@-=gb!T0LTWB58i9kNo?|Lh$tlL?HSU*9q0vlBz^=9VrKI|KPf4lqa9_x*U zIiow7`1#{9CMq5IT(R$y6|Bp`)B8}77rGei9hX6$b_~2Bn&;|&APRi5R(VG++M4=% ziugsR;8@wiR*!*K!@I|scx|_)oR!XuxQW! zFge}?&wOFGzOtxti;CI(93GkQC*V8HHQd&ZWQL2=>Yp5{D_h6_*J6~vFTIAAJ*-_H z)g5)zlQaEm8GnRm_kuT}BQD7>U=khUsX3P0*hX5@Ai3+$?vMmJ>9EXMa;?Kk!mn2_5dTwR*( zY>75uQoh&WgW&M%5Ym?%Q~8%utjgMDOKB!F!-zlTwCZF9oAy|~l@BN;L7UbO;&j1pGOjX5Ul3NF{;iYaxMI}|b}Fm1qhmkz*u!b&To$)aaH~ zkF*M*$T<~J?IcXqoGFlPqdv?i=&vx1jbKR-Q*!aDALMv8Y2DbQyZhw1rslb7<)5Y1 zQtRNk?ey8VJ9fOtGwCMYeDtoS&RO@0A0oo_-N`Yo$`8@0Yf#qNDm%7W_Kf=f_w2m& zm*AD?M;(oA!KG(8rP}p#Wj}beJUUmkVcy3=`t9usp?pX&4`bO~Z{)cn-*j|FWUg#*hpquptS=D%t=hpR=U{7uS zS#=iQY`^ZRIixzK|90GS+HXz;>aG+HE5_>`3s{Y`=sM-nyDzl9+s!0${i9x)h=(A_ z(aN>Gt?-nv!z-t{_FUA(j-j$=cNSJ4`G0 zSbxKd;#PXcz3}4Gp!c{5MNuo2NuzD^Z~JM*>P@5%*hxIit}RC@;uKP z_1i73-8<73`>or!9ZS7Sx$V4+h%!xOBo8ivZp2*?3ZSL!_e4+b_M!G=;$W&I1|5g% zRH3xu=lNSv6a@0RjnJ?W$idf$M&K^US1l64My0fj#-wkTqoyPZu1BOQS)vAwlTQ?j@MDy!)f=nBZ$dY(eC z?~^g3P|2bz8!urRmw?&9#WZ6UwAq>lDxVKEn~`U?p!@#JyC1Ibz^dA4-BVc=N1wtz zLlcr0Vr7r$vMtRJ3~hHcw)GO*eT5&ufuA^f=Zd^P^k^%ZnJx6XXL2(9 z@VM{GH!Y8H1F{9jrPJQT;GDN8y~cqbkFkkc*PWF$_IcAKIMeOAPB|Z*xiPn$M;m5p z>8s#_vq;r4uC4S~paenu|SVx0igF_S@5^TLh`a#Ro5&L0y48haI99 zq%>@4Z)I|If!L_G+Sj{llATG6>&4CE$?JqmSUmt=7-DQ!z=CS5m z4|6=fDuq@I(<7rQU7d9PPbHcIm;X~k`oGpd(073jk)OpIQ(=7-!!TV#Fvz<=tJq2| zlD=A;wuk|zagPM!926BF35a%NYsf{SeG!9-+cln4Fi0+4suinZ zB`)Hx*o4D6VpxS4zd_jnlos|i%E>7VC^Wz zy*;F+NWQ3F(hgN2Nl;UyH|n-I<(hHsVxh`(8?uI8U&hn$Hp<7Cq0ki=edm;2C~FjQ zN;|6>J;)9%$rHy^svR_HZIP=Eb|E1`$$`?A<7Sf=O|nxBzXTVGJv>Ni(kc^BR{NO(4P&gG5ZkA)QSA?L!%enBRHFRi}v zgCtWs-FKNB?2r|q8JvB8s(O{(H?#Ajk2%%F8O`xNrf6f-)XY|78cnk=jp7=sf zPrWJKEq(QeBE5-ckWPN49XV5)BJIaI%Z?A6tXHQyw)3{9 z$ZVfw8;T~ke0g>6s~=BuAx`3>@j2|R)}pkxj@6|uPV{&c$M8Xe2|qp(_(E5=YaI0k z-G`Zl)_>lm^Kw`rTlH=`IJtoUR zWB<)hyTASSGNZME17Y92^q%C`uf081Zn*LfpUcG@C7exqmKd1ZwH^uhgJp{9x`?5aK(Oc zp>WQVPYqmds-6&m0*?~_H}lu~fW%);H!-1hBV@`zhYC1IhR7ZPhZJXAr0u<&jKUoe zpWIan`g$WcnFm`aDp&^6e8r}NV!LA08!?`9oa)eakM(z4i}lmzB6L3INkW%FP2eJj zO4?N9Vp#IcklxFLiW@K$e~u%?1aD+*f5%gLbxf({VwR|_Q6&U%5a95<4>E5d7>WY> zxIqPV`GY5dks-y77$VxSX%lps@>Hw-J34eNzJTIu(rik{ft`-ML4>$jn=)Z4_0#?=juMRI0aAv zdy2hz_;N$++2O8d3;UnFU@)1s{-x&Zcj!D%Z=#%!C!B9|eeEYy(VU|-qV+r1-}C70 zMI9fP*sK1L1M|wJj?JJ%tP$UG%)zx6<&D-F9J1%M-e{vDz+3PFnYhS&SjZV~aoY(h znMwxYzJ=*{%V|!rKL;EjcbgIWB;1d^u3(M~nci@+*6M!Rq> zbf2SBWjZFm2xc8Rbm024%KM>xUtBZ1O+vM4mnIU;7fQxfKG<#j3Gcc;p$b}WLWu)R zf*0Ycdb|+li2oO9)m{I{Nm~ZzGr>@SS45;CD#bSEDde(dU~#O*7R$fSrlK(jBi5;J zP?M-%&(9)or4q0P2vVg|w%r4l(h|hHzDSg7ELLk)KfzIx_kb^fP($}b1f*BpNx=jz zhPeDtG1;y$8I6242^Fi3Aa{oF#-ZYNNITpk&<$6Sx=s(J0au}(Z)G4+u{aG{MCFZL zp>Q#Y>qo(=nTyrLMPfo)O0^J9InrH~A1@3|h=2ol03khVEghi=;OARI`J|!~1WQqf zI0A}gvU6-DM}rmedHu*@hu?O-ADH-PXnds@SEZR21?=n45pliZ`IABBgm7fROLh7L z_G5HnA9Q)peJXlC-@qY9a=TOpleo10 zg-AD3yMLScb7bGuV4#THm;1dC;*33TexKv7d*zb|YkdX&WK11%qV?VGU4J;cx(U}s zUcND(dJK}A`~A8{4Q|fVybeHEK4&x+x{Sv1$jYj^?!m@JJP)BYS?5yCTkr7gUHtAc znt-^EPcrCs*ZQHCdI#D@s8jyf=>tD&9qQWBeN`HY*5=h=$IW?lj#)3uvJF=*u2gq5 z<26Xl@TkYD*oU3T)v@l%6Q35@KeFgW>vM^!!~A1YH@^+Gup_NSCeva^A(iKK&fF47 zL^X%m1t_hka`MakV@ExAn%P`0b93b5m7o61bLCLtYEx+CIF(b&%?lObDA53B;;_N=qr1li@I}MSAXC`Q=hb#W3Yv^_F5Tg`RmMj)e^MKIDolr4M@t5SBauc~JwV#I$ zti?6GWOK^Lvfv0~W->(so34=0xP}c2ftjZ7l%_jrFO}2)+o>KE^8J3f6hc7E z1oS7v&?ybbeB=xKf%_oQti(Gj&U+w))#T)0w{4DkaejrczBOM|(!Ll5-!*5Etx%%& zY+q~zm#y0TwgnMsMLNJrq8A{It=h(S06`SOI%74=We}ML=nd|=9vs5LtkD6qC56M9 zj8>G}ldSOy$T7#G0OVjs%F4O!zkMOGee*%NLU2O{0qRB=nT)U?dHIU?53888_T1%a z;Q_(gQ)KgAsw@F@^gP->R}D)yC%HFx66p)3YeuDYZsn!3M&Vnr^7*l6UTog$-rFCZ z+BsI6mU?V7zH(#J*Z{u}gmNLoAe=sV)UEYW)@jRz5PS6$UA@`h51fb)B0kNurB-vj z|J)6M2;=Vx<{v7~XxXAD<@t^1!&eWTCU1ByGyB|*<8=#3FFw<;YMv~zd^;W^j!iOf zkO;KQY!R}n3w@Q-3HP?Si_y}zuNFne8|EM61aq|GmG*gWg3z@_L-E8H(7d$Vxg`;( zZ)^Qw<#XfdjnlU;mQf)X+UogoSrD-Y5k2rV6s7337^h8Ia} zG~WW+l4^@J120y#-&1LH)7bo)Xoo2uYs(lSj+po+Ynth-$G%1&+yZ6}7*@b; z1NH~f*9Wi0UG@eCHQa}3@7qPvQrM+iEaaek55Jql4}jaK=AMgaeIC{W11awJnKXtK z>gt#iKr+FhEFvVRK>!0-ogg;tLK_JffVRM<6FYK)7knOVgPiNud5OY6O|#HaRZ= z4lgL2_=kYh`@-Y??b_azvwm4`W}Z8~vhm9?X@Z1AHt2FrmUnFN=B=LwPTshYnf`+6 zE$%4)f2cA2V0Q-}Pr_4AQVOM1`8S{u^Vc7Mhwgu#t>C%hF9q{=w*Qe=3IF*wqT@eX zda983NDT~Ev-MNsUr>kH-0{SQ_gAN&&xm71_I1Z>PZag=^m#esw?y*w)>)#KH{%7T z{CPic@kx(QG|omdCC4{f3mzsCwa(+6rvvdA8%ort&)&p~q(dHj-MOH;Nlob*Z|jpEVSWbuVeZ+|SK%ZOIq9(mK05JnFh*4q4ZIv3dB)#WMjQQD`$qQp*)H z_V=`7+f=L!cQ}#XXj~zA9gA)$vjGR%7z7#b0jsVm|90p(lUKy5@iNXb-jA1qA`>n% zn!G6=4#*CG+o~}w5*R>whM_Rb%}9m0VsMmFBOH}6L&UIbF%E;29}6sH<;!6_J0paH z1xaV&0z%o&7x@?l&aYyJU;rLKL+u&AP>Z4RK9Ri9B()nv{DCG&hL6pOid9^2*Kebl zIT)Suda}CSZpbo*!eK#Q3JCWmqt_bJTasZ3Ty_sA`F$bg^`;@NlB?+p6__CUP8J(h zH_}VKC;4ucF$N)B+p zik-L*<>0O^unD3%?WRhbIn*lXTxCd0T3=Pe=1&?i93ugl z>33y~zkmMTJRDNye7_Pc+4}#su@rruWk-Wv-EM!K8#!Z3#8qnc>}e9jo?@9UByCc~ zvRQLM4jI(}b8WB^H;K4^sDmW4@vlbxUr|YTQW-bfYt9{h=Iz@a=iFSnf)J4c5(@-8!nRz5Z;SNotsi)#?xN1GYbGC3b=fpV+-_!d^X7^fyt*aT%{> zVKlbLv=m?>r(RU<(#vGPg4z1NPQ6etGQMqI#VDA*+#m>Tji;NzNUC;7G+pu3`e=e| zRRwOX5g&~1$cN7~avhcYoU3WSe%kfyC+4d9jax+@zWLlfR`~RvlE0rjbS&xh6u2<^ zN=38#RnEZNpO&!SJ1E-&EYAd5MYmAC#f6H1Y(_p$2kz}``)*ji)n5CSYgymJZConh zTC815VSS%rx|ow}bfQX(dgBBX4ij7rnZW{KQhtyGMzauu%G))TF1Cq^cF@VOYS4S{ z19h;)1oZYS;I;8~4Pm&PR4*2*mwhnTnLhpo}GXBjqzJKoBBZJ%utb zjy*|b^(gPASY?@M5iQ}gL5nyZ=4NX=K%*@mg-CmvPPV#fFYUBEF`PAc`HN_y-5Xn{ zj0ANR@H}q|sA7de+=`e5@i=M)`C`IeItuLUATaFF0*`;^Rj?ITov)cl#<(6D>DrHB|8mn-0O%PK>#;S=zGS0L}!S1aBU_D4Xs?yHU^!bQp@Cm470WnJL zBddTQmm`Y!!hI(`PJF6}Bx+lgZu8Egk5B=;%PKq&czI-+;fsa$C&Mqh2aVI7OwL34 z;7X_HU$qzM7?i^qS%rRAxbrXKU+<;43+MOtz8n35qsTetm^43W$y4~}_m(#gJRJAT zkU5#h$#JDOQ5??+5cxMBdVhHRVj}oetMig?WVDucwP)4f^RJ!W?0Wjczteh)M6iKZ z!ZIVOfHG4ul__zyQSHLdJZx?&uCJU=`Q5wf4rLnbG9Qc=wNd5^@s^orqBiyWSnZ^) zqv$YyloO2xW?m?{)Va+u%Mb~^ZhYHqgUiX7fTK6PGQtJ}tp!>nuom_qY zTctjRKm(MhPxXb>{zll?eX8;>@vfkc-hCkYtEfIE0r zOaow!IwEvMjDQBVgRqBu61@co7{$<$+e?Ignc#xV24@)I4+z;90G(>AB%qF|b2Xs! z;zA}q)HPImMdO&DvjMm`EQ$aiGW~>Khx9blVhx|v3p75f&Ig$rF4X=QzTj{jIQiz$ zqu)!AoR90V&PT@8%}HzT_6y+jwO4onu+GD8c7rtC$f|5=W6wJY?pv-*<2xsTo9&(J z?sK13Hy@oHd%th{=J_p~SKi$F;K74QO8=q?a=4f%OzD#!yz?>VA+YCiI6p5u{;#2| z%#L7t@oDo6aEdT5s7eZQvq_V~Q2%O2^}DPV3mdieGxz8hZ_tbXXR&!AgDG#b}^3$`1mq z%wMKvYX+9JX1U97R4J!3ofn#Pu z5g7bePmbTG@ShIcVh*pH*`IHNW^xhAJ&=E zMU%&l=lbEmSBcTh@W-FN`q7p5dcfL{@z!7S*8KB-=miPMIZVF)!T3V3VUJnnXs09{ zn45?3);~=v_;uP3-u&3zb@J2SL|30Vfi_fUj|B8B&)J{aUiW3j$)+3#3hgOcL3zw&Dm^^0K%n9=kU!z zd~22fmLE*z+I2F}=#+4WV^A;i`ZA%vji!n%(o#u5OVqZ23H;S`J2$M!!5%3LjcE1VnVp1CHl|!$Ca~04UZQRlWm`jm9V7liTJ8@BJx(@y! zhr`h|S+hV4S43oML8EW3$y;jkq>^9-<=?gr>6fw20HBQ9yrwnOj|c~2)j1&RzF1fq zCeRpg1^Eq>+~p561ApwVHUsPLqp2SYbeVP8CM{ zayHm3jjj6@HMxLSyKXB@ZxjMDz=TLlb!#9A_|ZG78djR?{&w5G=I=olc4J;#ItJh< zZcT@^V)Hz@>(z6KN#(8<+q+$#zUe}huok82^hNnmf3k4NCn(NPtgLSuUP69RSnzvA z<(3b;PAH1gAUH`$Bz`|&2UHUpdqgEn0b<&)kx0{PSY#kj9FeAYW!ctYh{H?IoJqzjr zGhRf^C|X0gb@sBU%t=LU5pLEaTfDP`_uIf(MJwt3X`x7eV)!-fm1hGD=(r~strZpV z@H5*CdAmP+E*YxI}a8Tp|8Ui8bJ z*~$l6$6U(KxtWUXZpO3fBi~_?4=&!Jt3hVqf4w;Oqw*t*8%=5&@vR5qdit%A=__R28WaQ)%yKWR%X{EEFN5lqJNyp7V3{{^Az)-2S6$ zE$h23n-5lpUtea5+m>{_M5nimWVxVMmhp@AvfoegcXuNP4EJb9w1XoccXx0+q{3i>1xxe7H$k(&k zq4ScUKpDf3xiPqtV;8FxWNBv*?ZRwoo3_)y^D|5V9~nYR&Z}cyVdq?vN;m*w3%Mdi zZ$%?C0Bel)h=Hed2uuf|-piU2V6+ZFC7ALqQ1nRn;8Iwv&oCj(PJ!>Rt zG~4Ywzd_xC^a@>k$tpD5-)-Wu8Se(j!D{>=MB{7ox3qzNZ>Tma`b z%LDbu{I!%qd35%%@WQ9$zL5vrD*%VQyvMI63j8Z}8upgC`bK^oCvgd#m0)8$S&yoMda!_32Xqv@|0Cx@7v9L{9@6)v0zD zUGT`SOYO&1i9V0tC$Y~!p88As9F%BFyrq7JylhL_W1dQP({84&R~vR-oH{wb7^=j9 zLZTzR?1Cwsa?$Q9g@-fe9LE6FFzO-b zwCS#S>+Q0eob6kwP$vgcTTJXyzeKNEW{Jim%Wcy@8MFvu@G=twv=MH`5-iUqRT|Zz z035xLtR7IX}I05BJ5Tx?z$UFSwoMlfYo;Qb8buw_6w}RGel>!o)#PJeA!EaiKDh5Af5jm@|%a zSB$L1vxu^cpwc`4o&5N$c#CSaF|G>b=n0p_z{Pf|O%!?10TmXGSpdS^2l~LJS zaVFBxtiAWbX~p2~9rL)`ZJ-Z1O=d@m{-FjSDR%a^WkerylMM6fvP!!_emU9mC?+;5rLrQHk+r^Eb!nH*Tb(veI8M;f4sQ4D_gc2%)vp^n3q#ex(`XK&- zcLqh6s{9-`Z>uEUK^ z?(EYb#N2SRGVOdOSFd+Ma(vQ!;ZEu`vlO$}m^U&w#M!C~oMYL?(&nYOJCDg}b#go3 zt8>h-xq*%81gZY8sOqp+=LOEd==esE;KWC6GR_&DHx}a%0Vbzbw$M}j(P49dSZ}>T zZD2)}u=}xyxHXrI%-qqbkd9XPZZKs>JR~LGl*$VsN7{Yny(G zU+eh$tFt?~k{z?vAJt!uZpNYD{bpgpBve(XN;|_pxtfpcYC2T0of~0+hy#)cTU~b? z6!YfZ-rszgefwU|>%X6|fLcTXZn?hV{5!O$m?ZVfJ<7&p$=xK#$uL|JQymQ9->{*u z5{BU;B%eXEVB7~RrdcIqnO8iZ1~X<&#thIlTaveX09~kYD9i$7kWZtglugIWk@A7P z13@WOc>tx8ERk=tfPUEBWVraqon#3xxL|C1Mpm&HQYp2Y%&9_8gt;FbD}V~U5Rxo8 zq8qKoj6nME>TFycTqp*nmN5$Vl6F8D)7i4I@%#zRHz_&y4q(KP*^4Dy)02t`Fz{Sr zeN;2-*AHi~3=2})@`D5*mvPiWUJaOTVWk-`W|g>`0-UUVgv;%oYr+s2L7xM>Tz?fT z9Q-UsSxq3@)E!%4nyNQxhb^YhLA)yjtL85DJn=MSYi(CtCLWM>J>FPNj?@lf5QCqk zq(Z}aXNy#4;0y|*#`7yMCIG_iIj&<9Li^dPG04V4M8Z+Aodn}DU_kS#Q07FJlTj1u z%$16aA7G`rC=VnZ+=I6AX;LtxE|FQ#2tWZ zKU846orFpNr-DfpmwUQQ2tP#^n%1aZL_5gn`@jP66^;)ju5%LkuUzYS@3%~*cCZN%BJ zx4-)Ajsq_QU&dbCm-}e_fi74JBLm?#>nhgvSOp_HzyHV9y=8AcLSG1aF!mf6qJaZ2 zx)i!*@0&;IpB5Ds?s^2nFF-%nyzY5=Q6NqBU-KO%vK`R2GEv%@M9+dY@$t1sXEx-a z+UcLMFm93^=h@4k)J1iIKi<+u9J7}l_7w1vJqxX~ioh46Y!dKy!Eg+JVnR56wjo-T zJ`eImYcEynv)p=fy1j@1iTOleA;YVm@e>)ks$Hs}sMYOq)0K0t$s9any(jkue!b8% z%@ToznP@Zt)gJfOkL^EH@kx9`m(WHDm5cp$>xB|T*(;G?*QsskZV6sfc?Lv*^i%mN zVz*gFi)Kf?obiUDjk*5Q|8#RY@bh~Buj)2k?~9`k*c?XTtvytyJw$(rW}KvtLDw(- z#O+Q>wQ2u6({rR5-tsXkK50|W8G#;297IJR=(sGn|LhkP%3OPlRPYEFe-xyWtcuYZ zye9{x29i)mY#sD)s;od<*95F7mSsSwhz^99Fwo_a#hmPAIk33BfWFs6HQP)1 z_7RT3zy_`0@SgFeEq7XAy17NKX26kKs3OfZJ&o$8fW{uf7Xurne|17qOjfy)WeFDWc?szrE ziB#=CX_q)ERro-D+y)S|-Y!5NP;W|g0%_?s32WhLd5ww0p1=LXlj)bfg-q6`7i>8> z_0F>|Zf?9%&bZ&QF^}A?x7?r9A8`A>fA9d^+)N}?v*d)cC~KI_e0C(TnUnD1Qp1bgW$LPLnR-aHO-~uj zbA^XM$sDiIOVehF(!fOAER_|x5CEU%apy0VU6BIJQeTwM-*;_$$am93yK(aq60pmO zzx|OqE6EQuIIlbAg=g=u9zb~9P{mscC<@RXqi08hX6j*`duFFUn(&asM|#{el;8n> z{9(Tmz+vW-2lkYraRMM9@yUl|^X|i+19e8LWm-^I*2M$mhkkiLYW1EP8}pEhe~b)u z{{64>HnQo(k7EUapF`GZ!WL9HKLj&b*I+7MgU&@`Ty?u(^k;4dImgx3?6{?@*gi3u0K{(4j3*&!2|WLoNdXs z0=~{XHmMB6J8yer6576gKtZ$gu`xX{W*`Tk(uY+X9=pOmGS*T}eetuptNPJ8&Hf18?X{b5Si>Mr6nK+h%o z4L_W!)mP#Rtu-}R zADzL5FP5973pyqd)5UXD+6S(|-IsQ?RNB*ASQ#!kE#QJA$+JvLH1YC9PS7ybbfh31 z%1QX^b8jxdGhe@ZLfZ3-lU;s$Wad9bd3!PIZm5C-(Mcs*l6Hq?LIr&^s3-EPM8sVN z$trFX_2`WOAb+Q0RUAxQOwfm!q%YFMV zki2gQyzl#czR&Y{)DUw8^KiB=l~2vcjK!TG#~MCq6lM8w@cU~J(qmAVg3wVQ=UV|( z?+2aMFeih$O=Cb)VglVW69ZN7c%wSpLFCVX6*x1*M^YeMjsLg6 z_8jG!oxF9McZK0YLS%EQVxhZeJAGnv>4ufFBneg|V*?QNpl_NNzk3**%XV*RjLnp> ztG6*FkjZ*=^YRg;Z$)hyv~71(tVsqr<$wpvD&LA8@3O~2-tPyZ;qR+^7fKb1SU9VE zC4s|_{R*SP!5f-rx!#gbDr7;3rnyrcD^dtk;ZSH|oy;)H1# zCa9g#$mFu4c50s_=~XJcQb!{4-7!(#VobtRy9?lBv)+9Q=Tlw#fj7SS=)K#v?9o%# za%t11GcNPmfJ?&%CtS+m7`11=G(|3bA=Wr+>Au*)+4`g~g`7eP+uzw_(Y>+07T z-ZGSBWSiaVGpb#+#!F925FDOk@}(Kp1jy`FfK{ntp*rq$2?kyx3L3RU=$X>#D8V$m zaU<%iW=r9sORiRmiJoV6GO?V{Xt25zD7>No3$NE=0BDq`XaX$ycZOKHb-$=h7=VNz zOgoiCNyGI@)rg0IU+Fxxn6Z<#05bSeE9G4rZNzY4Q&lr-H=EQ@Ap|aJ*uCpC-hddn zVxj>ZuS=Q*$S|~x82>C4oO9`|0n)@%fUnGb)tc7R(tOPv1*4i4tqE;L%woM!Hr605 z1y?^h!OtCY8447;l3>#xi;nc=-Z}~W#nDD*|Al_RM8CG__4rTwAEJov@S}ex4Vj7b;peG=Gg~6&ZdKH8Vo5MtU61VWZz-|5tBUgvAE0Z*6oa?k7V0s zOV;3AXT;}=`F3{ci+Rr%?d^Y>^6-1=$J*-1(YQ=6se)ctu)~iobe{ z!`8guJ&wO$_u*7uGmYhn9@nLbtZH67_8Nwv#?bht;?0QQ|=W8in z*01`;O4)4ww~T>!VLd=1%pYES{7XiJ)n6=D?SO-29S>;JrOxUcc(ybd6nS{1T!Y*z z#Q9Ye0*Mi^PP@*6&`F}qhx1ugupQ)G&;Oy&Cjpe)4=_L6DfG*Anw@Fz602l8BpYn? zO`U25MDGN%DCJ5f$YI1t=}{G5ISX#xPwWB?JbgjlNslD>%vnI0WsoFo^}vbb>*#D| zT7@(eiYg&Jd)iyboVBLGSB!?mKJ7BE85ScWlL-=b^%HB11SNXNRo~h6RDKCyqgShR zbui~3c8`Wmj7p?PhsG#oB}s54&Nm{Pl_ij??OEjoL>Gt{{?5^BTKB5+ds^GU77s_|iop!EiP3o?zFMhujm z;ExG{WRT>*iVrG#Ib+%kp;0-U%5|p#)^~%&t@w}q2R$S0Wl!8ml2=_k-5$bRyFzwAG(82cxF z5nKE6t7}7k@;BIl@8gpLp|EZHMY~}0QTw0vBHw_czFXmzDI=}jy^GtmH{+ANj~A2i z)+`fkF^yi>c+_>EyZ7x&Q`s$fivy8wyIYomN?_oXJ*ED2T3D;$)Kc9Sy|&nj!@3md zv>tu(Md)_-{K2*>(w1dv>y%|G>ehZZE+6o1g~Q)C05%(mto%;Wt21KVL%Y33Y{h=f z{@k+XOWQj`5gTN#>;(g|mO+2eTV`L177TTk!pCRefJ%E_BY;69x016hnJsM2vN@w( zm0QD6)f)fvST7oN;i4oCkC=ySHRQj0iYRb zyeXh$UrqUbN@3^L=F(Tz5NO+GR@M_)XnRL|2 z^(U%MuLGBSR5A<@YArS^VuC?dVP(k67rgK<#g?2vt_IX!vN!eW!P}zb+F!hkW|p)3+Xj)5oKnulsyN**c0I zKXM#B(D!5R-V2q54 z=35$_oW=Ck^6}8zSF@3{C1IRb8jYCc{Dtz%)k^-SD1Z1fT=`b~;#_~-g1)wx(ksPo zOVNvq0V3iyH_gZDw;s%KMC|!3+leDh3+F#WGRqPd^)2Qk{Q|I^-i!m61}8%smY@WW UA-?F`OVy9M;y;JVA7IG;0ivG%jsO4v literal 0 HcmV?d00001 diff --git a/sound/surgery/scalpel2.ogg b/sound/surgery/scalpel2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..497672239393ccba458095dfbdec0c0824027873 GIT binary patch literal 33847 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 literal 0 HcmV?d00001 From 52c144090e45ab5185913200dcf888b2ff0e8984 Mon Sep 17 00:00:00 2001 From: SandPoot <43283559+SandPoot@users.noreply.github.com> Date: Sat, 9 Apr 2022 19:44:27 -0300 Subject: [PATCH 39/53] Upload fixes (#15591) --- code/modules/vehicles/mecha/_mecha.dm | 2 +- code/modules/vehicles/mecha/mecha_actions.dm | 4 ---- code/modules/vehicles/mecha/mecha_construction_paths.dm | 8 ++++---- code/modules/vehicles/mecha/working/ripley.dm | 2 +- 4 files changed, 6 insertions(+), 10 deletions(-) diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm index 6b8642764e..0648c2bce5 100644 --- a/code/modules/vehicles/mecha/_mecha.dm +++ b/code/modules/vehicles/mecha/_mecha.dm @@ -956,7 +956,7 @@ /obj/vehicle/sealed/mecha/generate_actions() - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/climb_out) // I don't see a single problem in generating exit vehicle action. + initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_eject) // I don't see a single problem in generating exit vehicle action. initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_internals, VEHICLE_CONTROL_SETTINGS) initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_cycle_equip, VEHICLE_CONTROL_EQUIPMENT) initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_lights, VEHICLE_CONTROL_SETTINGS) diff --git a/code/modules/vehicles/mecha/mecha_actions.dm b/code/modules/vehicles/mecha/mecha_actions.dm index 070a3158b0..09ccaad2c2 100644 --- a/code/modules/vehicles/mecha/mecha_actions.dm +++ b/code/modules/vehicles/mecha/mecha_actions.dm @@ -273,7 +273,3 @@ button_icon_state = "mech_phasing_[chassis.phasing ? "on" : "off"]" to_chat(owner, "[icon2html(chassis, owner)]En":"#f00\">Dis"]abled phasing.") UpdateButtonIcon() - -/datum/action/vehicle/sealed/mecha/climb_out - name = "Eject From Mech" - button_icon_state = "mech_eject" diff --git a/code/modules/vehicles/mecha/mecha_construction_paths.dm b/code/modules/vehicles/mecha/mecha_construction_paths.dm index e1de113f16..ca79d98a64 100644 --- a/code/modules/vehicles/mecha/mecha_construction_paths.dm +++ b/code/modules/vehicles/mecha/mecha_construction_paths.dm @@ -557,7 +557,7 @@ inner_plating = /obj/item/stack/sheet/metal inner_plating_amount = 5 - outer_plating = /obj/item/mecha_parts/part/gygax_armor + outer_plating = /obj/item/mecha_parts/part/medigax_armor outer_plating_amount = 1 /datum/component/construction/mecha/medigax/custom_action(obj/item/I, mob/living/user, diff) @@ -687,15 +687,15 @@ /datum/component/construction/mecha/firefighter result = /obj/vehicle/sealed/mecha/working/ripley/firefighter - base_icon = "firefighter" + base_icon = "fireripley" circuit_control = /obj/item/circuitboard/mecha/ripley/main circuit_periph = /obj/item/circuitboard/mecha/ripley/peripherals - inner_plating= /obj/item/clothing/suit/fire + inner_plating = /obj/item/clothing/suit/fire inner_plating_amount = 1 - outer_plating=/obj/item/stack/sheet/plasteel + outer_plating = /obj/item/stack/sheet/plasteel outer_plating_amount = 10 /datum/component/construction/mecha/firefighter/get_outer_plating_steps() diff --git a/code/modules/vehicles/mecha/working/ripley.dm b/code/modules/vehicles/mecha/working/ripley.dm index 0d083d4bde..ef0694517d 100644 --- a/code/modules/vehicles/mecha/working/ripley.dm +++ b/code/modules/vehicles/mecha/working/ripley.dm @@ -40,7 +40,7 @@ AddComponent(/datum/component/armor_plate,3,/obj/item/stack/sheet/animalhide/goliath_hide,list(MELEE = 10, BULLET = 5, LASER = 5)) /obj/vehicle/sealed/mecha/working/ripley/generate_actions() - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/climb_out) + initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_eject) if(enclosed) initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_internals, VEHICLE_CONTROL_SETTINGS) initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_cycle_equip, VEHICLE_CONTROL_EQUIPMENT) From af4f0beeaeeefe525a79d077e828dc1b0a8bc729 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 9 Apr 2022 17:44:29 -0500 Subject: [PATCH 40/53] Automatic changelog generation for PR #15591 [ci skip] --- html/changelogs/AutoChangeLog-pr-15591.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-15591.yml diff --git a/html/changelogs/AutoChangeLog-pr-15591.yml b/html/changelogs/AutoChangeLog-pr-15591.yml new file mode 100644 index 0000000000..c6bcc30756 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15591.yml @@ -0,0 +1,6 @@ +author: "SandPoot" +delete-after: True +changes: + - bugfix: "The action button for leaving mechs actually works!" + - bugfix: "The medigax no longer uses gygax armor plates to be built!" + - bugfix: "The firefighter ripley is now visible during construction." From 85817a734b06f2bf5eae29db89218459ebf5f8bb Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 10 Apr 2022 00:41:28 +0000 Subject: [PATCH 41/53] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-15539.yml | 6 ------ html/changelogs/AutoChangeLog-pr-15558.yml | 4 ---- html/changelogs/AutoChangeLog-pr-15589.yml | 4 ---- html/changelogs/AutoChangeLog-pr-15591.yml | 6 ------ html/changelogs/archive/2022-04.yml | 12 ++++++++++++ 5 files changed, 12 insertions(+), 20 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-15539.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-15558.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-15589.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-15591.yml diff --git a/html/changelogs/AutoChangeLog-pr-15539.yml b/html/changelogs/AutoChangeLog-pr-15539.yml deleted file mode 100644 index 879fb0a209..0000000000 --- a/html/changelogs/AutoChangeLog-pr-15539.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Solaris-Shade" -delete-after: True -changes: - - bugfix: "fixed a few projectile lines" - - code_imp: "changed a large block of the projectile code" - - refactor: "refactored most of the projectile code" diff --git a/html/changelogs/AutoChangeLog-pr-15558.yml b/html/changelogs/AutoChangeLog-pr-15558.yml deleted file mode 100644 index a8c108c22b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-15558.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "tiviplus, lolman360, SandPoot" -delete-after: True -changes: - - refactor: "/obj/mecha > /obj/vehicle/sealed/mecha" diff --git a/html/changelogs/AutoChangeLog-pr-15589.yml b/html/changelogs/AutoChangeLog-pr-15589.yml deleted file mode 100644 index 2a7c630ce5..0000000000 --- a/html/changelogs/AutoChangeLog-pr-15589.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SandPoot" -delete-after: True -changes: - - bugfix: "Medigaxes can actually be built now." diff --git a/html/changelogs/AutoChangeLog-pr-15591.yml b/html/changelogs/AutoChangeLog-pr-15591.yml deleted file mode 100644 index c6bcc30756..0000000000 --- a/html/changelogs/AutoChangeLog-pr-15591.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "SandPoot" -delete-after: True -changes: - - bugfix: "The action button for leaving mechs actually works!" - - bugfix: "The medigax no longer uses gygax armor plates to be built!" - - bugfix: "The firefighter ripley is now visible during construction." diff --git a/html/changelogs/archive/2022-04.yml b/html/changelogs/archive/2022-04.yml index 3aac446326..db6500be01 100644 --- a/html/changelogs/archive/2022-04.yml +++ b/html/changelogs/archive/2022-04.yml @@ -8,3 +8,15 @@ - rscadd: Adds stasis beds and related mechanics - rscdel: Removed mapped in sleepers from station maps. Shuttles have it but centcomm doesn't. +2022-04-10: + SandPoot: + - bugfix: The action button for leaving mechs actually works! + - bugfix: The medigax no longer uses gygax armor plates to be built! + - bugfix: The firefighter ripley is now visible during construction. + - bugfix: Medigaxes can actually be built now. + Solaris-Shade: + - bugfix: fixed a few projectile lines + - code_imp: changed a large block of the projectile code + - refactor: refactored most of the projectile code + tiviplus, lolman360, SandPoot: + - refactor: /obj/mecha > /obj/vehicle/sealed/mecha From 9e9c38c4a505ef90600ad38b32bfadd58e255cf1 Mon Sep 17 00:00:00 2001 From: Putnam3145 Date: Sat, 9 Apr 2022 21:44:04 -0700 Subject: [PATCH 42/53] Makes auxmos do fires on Linux --- code/modules/atmospherics/auxgm/gas_types.dm | 8 ++++++++ code/modules/atmospherics/gasmixtures/reactions.dm | 7 ++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/code/modules/atmospherics/auxgm/gas_types.dm b/code/modules/atmospherics/auxgm/gas_types.dm index 6ee234d64d..d2ea9544b4 100644 --- a/code/modules/atmospherics/auxgm/gas_types.dm +++ b/code/modules/atmospherics/auxgm/gas_types.dm @@ -60,6 +60,10 @@ fire_products = "plasma_fire" enthalpy = FIRE_PLASMA_ENERGY_RELEASED // 3000000, 3 megajoules, 3000 kj +/datum/gas/plasma/New() + if(world.system_type == UNIX) + fire_temperature = null + /datum/gas/water_vapor id = GAS_H2O specific_heat = 40 @@ -134,6 +138,10 @@ fire_radiation_released = 50 // arbitrary number, basically 60 moles of trit burning will just barely start to harm you fire_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST - 50 +/datum/gas/tritium/New() + if(world.system_type == UNIX) + fire_temperature = null + /datum/gas/bz id = GAS_BZ specific_heat = 20 diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm index a6429a0754..34dce749f5 100644 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ b/code/modules/atmospherics/gasmixtures/reactions.dm @@ -5,10 +5,9 @@ for(var/r in subtypesof(/datum/gas_reaction)) var/datum/gas_reaction/reaction = r - if(initial(reaction.exclude)) - continue reaction = new r - . += reaction + if(!reaction.exclude) + . += reaction sortTim(., /proc/cmp_gas_reaction) /proc/cmp_gas_reaction(datum/gas_reaction/a, datum/gas_reaction/b) // compares lists of reactions by the maximum priority contained within the list @@ -119,6 +118,7 @@ id = "tritfire" /datum/gas_reaction/tritfire/init_reqs() + exclude = world.system_type == MS_WINDOWS // temporary stopgap until generic fires work on linux min_requirements = list( "TEMP" = FIRE_MINIMUM_TEMPERATURE_TO_EXIST, GAS_TRITIUM = MINIMUM_MOLE_COUNT, @@ -200,6 +200,7 @@ id = "plasmafire" /datum/gas_reaction/plasmafire/init_reqs() + exclude = world.system_type == MS_WINDOWS // temporary stopgap until generic fires work on linux min_requirements = list( "TEMP" = FIRE_MINIMUM_TEMPERATURE_TO_EXIST, GAS_PLASMA = MINIMUM_MOLE_COUNT, From 4d98d7cedb8a453ec18a5d989b214955bfc2e981 Mon Sep 17 00:00:00 2001 From: Putnam3145 Date: Sat, 9 Apr 2022 22:25:08 -0700 Subject: [PATCH 43/53] makes bombs not super OP on linux, too --- code/__DEFINES/research.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/__DEFINES/research.dm b/code/__DEFINES/research.dm index 55c3ac8772..e27489380c 100644 --- a/code/__DEFINES/research.dm +++ b/code/__DEFINES/research.dm @@ -74,5 +74,6 @@ ) #define BOMB_TARGET_POINTS 50000 //Adjust as needed. Actual hard cap is double this, but will never be reached due to hyperbolic curve. -#define BOMB_TARGET_SIZE 175 // The shockwave radius required for a bomb to get TECHWEB_BOMB_MIDPOINT points. +#define BOMB_TARGET_SIZE (world.system_type == MS_WINDOWS ? 240 : 50000) // The shockwave radius required for a bomb to get TECHWEB_BOMB_MIDPOINT points. +// Linux still has old trit fires, so #define BOMB_SUB_TARGET_EXPONENT 3 // The power of the points curve below the target size. Higher = less points for worse bombs, below target. From f235839351f005a39e48009ba57b74a1d65d690e Mon Sep 17 00:00:00 2001 From: BlueWildrose <57083662+BlueWildrose@users.noreply.github.com> Date: Thu, 14 Apr 2022 15:37:08 -0700 Subject: [PATCH 44/53] Adds carcinisoprojection jelly, a limb regrowth chem that is made from slime mutation toxin & blood (#15053) * Limb regrowth chem, new disease of crab cancer * Limb regrowth adjustments * oops, sorry linters. * oh right this would probably fuck with dullahans * woops missed a newline * Update code/modules/reagents/chemistry/reagents/medicine_reagents.dm Co-authored-by: DeltaFire <46569814+DeltaFire15@users.noreply.github.com> * just realized this check is unnecessary. * let's add a mood debuff while we're at it * Update medicine_reagents.dm * add a bounty * misspelling * Update crabcancer.dm Co-authored-by: DeltaFire <46569814+DeltaFire15@users.noreply.github.com> --- code/datums/diseases/crabcancer.dm | 67 +++++++++++++++++++ .../mood_events/generic_negative_events.dm | 5 ++ code/modules/cargo/bounties/reagent.dm | 1 + .../chemistry/reagents/medicine_reagents.dm | 49 +++++++++++++- .../reagents/chemistry/recipes/medicine.dm | 6 ++ code/modules/surgery/bodyparts/helpers.dm | 12 +++- tgstation.dme | 1 + 7 files changed, 137 insertions(+), 4 deletions(-) create mode 100644 code/datums/diseases/crabcancer.dm diff --git a/code/datums/diseases/crabcancer.dm b/code/datums/diseases/crabcancer.dm new file mode 100644 index 0000000000..a762028807 --- /dev/null +++ b/code/datums/diseases/crabcancer.dm @@ -0,0 +1,67 @@ +/datum/disease/crabcancer + name = "Crab Cancer" + form = "Skin Cancer" + max_stages = 3 + cure_text = "Mutadone" + spread_text = "Noncontagious" + cures = list(/datum/reagent/medicine/mutadone) + agent = "Carcinisoprojection Jelly" + viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) + permeability_mod = 1 + desc = "If left untreated, the patient will rapidly and painfully grow flesh that will fall off the subject. This can result in death if unmaintained." + severity = DISEASE_SEVERITY_DANGEROUS + spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS + visibility_flags = HIDDEN_PANDEMIC + bypasses_immunity = TRUE + +/datum/disease/crabcancer/stage_act() + ..() + switch(stage) + if(1) + if(prob(10)) + to_chat(affected_mob, "" + pick("You feel uncomfortable.", + "You can feel your arms and legs throbbing.", + "You feel... crabby.", + "You're starting to smell like seafood.") + "") + if(2) + if(prob(10)) + to_chat(affected_mob, "" + pick("Your flesh is starting to look deformed.", + "You feel your flesh bubbling and swelling.", + "You think you see pincers coming out of your flesh.", + "It's time for crab...") + "") + if(3) + if(prob(5)) + to_chat(affected_mob, "" + pick("Your skin forms black, rough patches!", + "The pain is unbearable!", + "Your skin is forming painful cysts!") + "") + affected_mob.take_bodypart_damage(rand(1,5)) + if(prob(5)) + affected_mob.visible_message("[affected_mob]'s own flesh swells and tears away from \him!", \ + "" + pick("You feel your flesh swelling and tearing away from you!", + "Your own flesh grows and falls beneath you!", + "The pain... the crabby meat falls off you!", + "Your flesh... it tears!", + "It is now time for crab!") + "", + "You hear a disgusting squelch of flesh being torn.") + playsound(affected_mob, 'sound/items/poster_ripped.ogg', 50, TRUE) + playsound(get_turf(affected_mob), 'sound/effects/splat.ogg', 20, TRUE) + affected_mob.emote("scream") + affected_mob.take_bodypart_damage(rand(15,25)) + var/humanmeatamount = rand(0,2) + var/crabmeatamount = rand(1,2) + var/meattype = /obj/item/reagent_containers/food/snacks/meat/slab/human + if(ishuman(affected_mob)) + meattype = affected_mob.dna.species.meat + else //grab the carbon's meat instead (usually this means monkey meat... though other disease-compatible carbon mobs might apply.) + meattype = affected_mob.type_of_meat + + if(humanmeatamount) + for(var/i=1 to humanmeatamount) + var/obj/item/reagent_containers/food/snacks/meat/slab/newmeat = new meattype + newmeat.name = "[affected_mob.real_name] [newmeat.name]" + newmeat.forceMove(affected_mob.loc) + if(crabmeatamount) + for(var/i=1 to crabmeatamount) + new /obj/item/reagent_containers/food/snacks/meat/rawcrab(affected_mob.loc) + affected_mob.jitteriness += 3 + diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index 4b2d872aec..3521fe756c 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -147,6 +147,11 @@ mood_change = -5 timeout = 1 MINUTES +/datum/mood_event/painful_limb_regrowth + description = "It's great to have all my limbs back but that was absolutely painful.\n" + mood_change = -5 + timeout = 1 MINUTES + /datum/mood_event/loud_gong description = "That loud gong noise really hurt my ears!\n" mood_change = -3 diff --git a/code/modules/cargo/bounties/reagent.dm b/code/modules/cargo/bounties/reagent.dm index 57501beab3..c8646ab618 100644 --- a/code/modules/cargo/bounties/reagent.dm +++ b/code/modules/cargo/bounties/reagent.dm @@ -139,6 +139,7 @@ /datum/reagent/medicine/atropine,\ /datum/reagent/medicine/strange_reagent,\ /datum/reagent/medicine/regen_jelly,\ + /datum/reagent/medicine/limb_regrowth,\ /datum/reagent/drug/space_drugs,\ /datum/reagent/drug/crank,\ /datum/reagent/drug/krokodil,\ diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 4d1ded3913..0a78af67b2 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -1359,7 +1359,7 @@ /datum/reagent/medicine/neo_jelly name = "Neo Jelly" - description = "Gradually regenerates all types of damage, without harming slime anatomy.Can OD" + description = "Gradually regenerates all types of damage, without harming slime anatomy. Can overdose." reagent_state = LIQUID metabolization_rate = 1 * REAGENTS_METABOLISM color = "#91D865" @@ -1797,3 +1797,50 @@ else M.adjustToxLoss(0.5*REAGENTS_EFFECT_MULTIPLIER) . = 1 + +/datum/reagent/medicine/limb_regrowth + name = "Carcinisoprojection Jelly" + description = "Also known as \"limb regrowth jelly\", this crabby looking xenobiological jelly will rapidly regrow any missing limbs someone has at the cost of some of their blood. Do not overdose." + taste_description = "salty slime" + color = "#EF5428" //like cooked crab! + reagent_state = LIQUID + overdose_threshold = 65 //it takes more than one bluespace syringe to overdose someone with this given how nasty the OD is. + value = REAGENT_VALUE_RARE + +/datum/reagent/medicine/limb_regrowth/reaction_mob(mob/living/carbon/C, method=TOUCH, reac_volume) + . = ..() + if(!.) + return + if(method == TOUCH) //as funny as it would be to have this hurled at someone, nah. + return + var/vol = reac_volume + C.reagents.get_reagent_amount(/datum/reagent/medicine/limb_regrowth) + if(vol < 5) //need at least 5 units. + return + var/list/limbs_to_heal = C.get_missing_limbs(exclude_head = TRUE) + if(limbs_to_heal.len < 1) //nothing happens if they already got all limbs. + return + if(HAS_TRAIT(C, TRAIT_ROBOTIC_ORGANISM)) //sorry synths, consider a visit to the roboticist. dunno how to justify regrowing robolimbs. + return + else if(ishuman(C) && !(HAS_BONE in C.dna?.species?.species_traits)) //boneless have little trouble with the limb chemical. + C.visible_message("[C] suddenly regrows \his limbs!", + "You suddenly regrow your limbs, sensation and all!") + else //boneful beings get to scream. + C.visible_message("[C]'s body lets off a grotesque squelching, bone crunching sound as \his limbs grow back rapidly!", + "Your body emits a grotesque squelching, bone crunching sound as your limbs grow back rapidly! \ + With the sensation of your regained limbs, also comes pain!", + "You hear a grotsque squelching noise and the sound of crunching bones.") + playsound(C, 'sound/magic/demon_consume.ogg', 50, 1) + SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "painful_limb_regrowth", /datum/mood_event/painful_limb_regrowth) + C.emote("scream") + C.regenerate_limbs(excluded_limbs = list(BODY_ZONE_HEAD)) //would be a little funky for dullahans if they suddenly sprouted a head. + C.blood_volume = max(C.blood_volume - 30*limbs_to_heal.len,0) + //lose blood for each limb that was regained. + //10 units less expensive than slime limb regrowth, but doesn't check for low blood like the ability, so it could be dangerous. + to_chat(C,"You feel like this ordeal of your limbs regrowing has made you a little paler... as well as made you feel a little thirsty.") + //hint at the blood loss. (paler is a common symptom depicted in-game of low blood, but dehydration is another symptom of low blood.) + + +/datum/reagent/medicine/limb_regrowth/overdose_start(mob/living/M) + M.ForceContractDisease(new /datum/disease/crabcancer, FALSE, TRUE) //it is now, time for crab. + ..() + . = 1 diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index 918ccf01e5..74c7d0d3c6 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -371,3 +371,9 @@ id = /datum/reagent/medicine/system_cleaner results = list(/datum/reagent/medicine/system_cleaner = 4) required_reagents = list(/datum/reagent/iron = 2, /datum/reagent/oil = 2, /datum/reagent/medicine/calomel = 2, /datum/reagent/acetone = 2) + +/datum/chemical_reaction/limb_regrowth + name = "Carcinisoprojection Jelly" + id = /datum/reagent/medicine/limb_regrowth + results = list(/datum/reagent/medicine/limb_regrowth = 2) + required_reagents = list(/datum/reagent/blood = 1, /datum/reagent/slime_toxin = 1) diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm index c2c5582f59..40f599c103 100644 --- a/code/modules/surgery/bodyparts/helpers.dm +++ b/code/modules/surgery/bodyparts/helpers.dm @@ -124,19 +124,25 @@ /mob/living/carbon/alien/larva/get_leg_ignore() return TRUE -/mob/living/proc/get_missing_limbs() +/mob/living/proc/get_missing_limbs(exclude_head = FALSE) return list() -/mob/living/carbon/get_missing_limbs() +/mob/living/carbon/get_missing_limbs(exclude_head = FALSE) var/list/full = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG) for(var/zone in full) + if(exclude_head && zone == BODY_ZONE_HEAD) //this is needed in case we don't care for the lack of a dullahan's head or something. + full -= zone + continue if(get_bodypart(zone)) full -= zone return full -/mob/living/carbon/alien/larva/get_missing_limbs() +/mob/living/carbon/alien/larva/get_missing_limbs(exclude_head = FALSE) var/list/full = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST) for(var/zone in full) + if(exclude_head && zone == BODY_ZONE_HEAD) //I guess???? + full -= zone + continue if(get_bodypart(zone)) full -= zone return full diff --git a/tgstation.dme b/tgstation.dme index 69acf7bff4..f3d34ee6bd 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -608,6 +608,7 @@ #include "code\datums\diseases\brainrot.dm" #include "code\datums\diseases\cold.dm" #include "code\datums\diseases\cold9.dm" +#include "code\datums\diseases\crabcancer.dm" #include "code\datums\diseases\dna_spread.dm" #include "code\datums\diseases\fake_gbs.dm" #include "code\datums\diseases\flu.dm" From eb62c0aa1d9c2e444dc9a0c1c132bc2aec4e7421 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 14 Apr 2022 17:37:11 -0500 Subject: [PATCH 45/53] Automatic changelog generation for PR #15053 [ci skip] --- html/changelogs/AutoChangeLog-pr-15053.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-15053.yml diff --git a/html/changelogs/AutoChangeLog-pr-15053.yml b/html/changelogs/AutoChangeLog-pr-15053.yml new file mode 100644 index 0000000000..a618f2fae0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15053.yml @@ -0,0 +1,4 @@ +author: "BlueWildrose" +delete-after: True +changes: + - rscadd: "Added carcinisoprojection jelly, a limb regrowth chemical made from xenobiology's slime mutation toxin & blood. Don't overdose!" From 697e2ca80aed7719f611ee3a626bd4797afb7c02 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 15 Apr 2022 00:42:54 +0000 Subject: [PATCH 46/53] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-15053.yml | 4 ---- html/changelogs/archive/2022-04.yml | 4 ++++ 2 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-15053.yml diff --git a/html/changelogs/AutoChangeLog-pr-15053.yml b/html/changelogs/AutoChangeLog-pr-15053.yml deleted file mode 100644 index a618f2fae0..0000000000 --- a/html/changelogs/AutoChangeLog-pr-15053.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BlueWildrose" -delete-after: True -changes: - - rscadd: "Added carcinisoprojection jelly, a limb regrowth chemical made from xenobiology's slime mutation toxin & blood. Don't overdose!" diff --git a/html/changelogs/archive/2022-04.yml b/html/changelogs/archive/2022-04.yml index db6500be01..a8ca0cfc2d 100644 --- a/html/changelogs/archive/2022-04.yml +++ b/html/changelogs/archive/2022-04.yml @@ -20,3 +20,7 @@ - refactor: refactored most of the projectile code tiviplus, lolman360, SandPoot: - refactor: /obj/mecha > /obj/vehicle/sealed/mecha +2022-04-15: + BlueWildrose: + - rscadd: Added carcinisoprojection jelly, a limb regrowth chemical made from xenobiology's + slime mutation toxin & blood. Don't overdose! From 13fb647b9efa36cd4afff0fe8614d7a9fbc695d7 Mon Sep 17 00:00:00 2001 From: SandPoot <43283559+SandPoot@users.noreply.github.com> Date: Fri, 15 Apr 2022 11:31:50 -0300 Subject: [PATCH 47/53] Update files (#15597) --- code/__HELPERS/do_after.dm | 19 ++++++++++++------- .../components/storage/concrete/rped.dm | 4 ++-- code/datums/components/storage/storage.dm | 4 ++-- code/datums/status_effects/buffs.dm | 2 +- code/game/atoms.dm | 2 +- code/game/turfs/turf.dm | 2 +- .../antagonists/clockcult/clock_scripture.dm | 4 ++-- code/modules/vehicles/secway.dm | 9 ++++++--- 8 files changed, 27 insertions(+), 19 deletions(-) diff --git a/code/__HELPERS/do_after.dm b/code/__HELPERS/do_after.dm index 3ec1aa9b08..5b17ed687c 100644 --- a/code/__HELPERS/do_after.dm +++ b/code/__HELPERS/do_after.dm @@ -121,7 +121,7 @@ break // CLEANUP - qdel(progbar) + progbar.end_progress() // If we failed, just return. if(!.) return FALSE @@ -206,8 +206,9 @@ if((!drifting && user.loc != user_loc) || target.loc != target_loc || (!ignorehelditem && user.get_active_held_item() != holding) || user.incapacitated() || user.lying || (extra_checks && !extra_checks.Invoke())) . = 0 break - if(progress) - qdel(progbar) + + if(!QDELETED(progbar)) + progbar.end_progress() if(!QDELETED(target)) LAZYREMOVE(user.do_afters, target) @@ -296,8 +297,10 @@ if(user.get_active_held_item() != holding) . = 0 break - if(progress) - qdel(progbar) + + if(!QDELETED(progbar)) + progbar.end_progress() + if(!QDELETED(target)) LAZYREMOVE(user.do_afters, target) @@ -351,8 +354,10 @@ if((!drifting && user_loc != user.loc) || QDELETED(target) || originalloc[target] != target.loc || user.get_active_held_item() != holding || user.incapacitated() || user.lying || (extra_checks && !extra_checks.Invoke())) . = 0 break mainloop - if(progbar) - qdel(progbar) + + if(!QDELETED(progbar)) + progbar.end_progress() + for(var/thing in targets) var/atom/target = thing if(!QDELETED(target)) diff --git a/code/datums/components/storage/concrete/rped.dm b/code/datums/components/storage/concrete/rped.dm index 3744e833ac..9d85dc6173 100644 --- a/code/datums/components/storage/concrete/rped.dm +++ b/code/datums/components/storage/concrete/rped.dm @@ -39,7 +39,7 @@ var/datum/progressbar/progress = new(M, length(things), T) while (do_after(M, 10, TRUE, T, FALSE, CALLBACK(src, .proc/mass_remove_from_storage, T, things, progress, TRUE, M))) stoplag(1) - qdel(progress) + progress.end_progress() A.do_squish(0.8, 1.2) /datum/component/storage/concrete/bluespace/rped @@ -83,5 +83,5 @@ var/datum/progressbar/progress = new(M, length(things), T) while (do_after(M, 10, TRUE, T, FALSE, CALLBACK(src, .proc/mass_remove_from_storage, T, things, progress, TRUE, M))) stoplag(1) - qdel(progress) + progress.end_progress() A.do_squish(0.8, 1.2) diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index c291a416fc..00a58a75f8 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -215,7 +215,7 @@ var/list/rejections = list() while(do_after(M, 10, TRUE, parent, FALSE, CALLBACK(src, .proc/handle_mass_pickup, things, I.loc, rejections, progress))) stoplag(1) - qdel(progress) + progress.end_progress() to_chat(M, "You put everything you could [insert_preposition] [parent].") A.do_squish(1.4, 0.4) @@ -273,7 +273,7 @@ var/datum/progressbar/progress = new(M, length(things), T) while (do_after(M, 10, TRUE, T, FALSE, CALLBACK(src, .proc/mass_remove_from_storage, T, things, progress, TRUE, M))) stoplag(1) - qdel(progress) + progress.end_progress() A.do_squish(0.8, 1.2) /datum/component/storage/proc/mass_remove_from_storage(atom/target, list/things, datum/progressbar/progress, trigger_on_found = TRUE, mob/user) diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index eda3470a0b..77638d157b 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -69,7 +69,7 @@ ..() /datum/status_effect/vanguard_shield/Destroy() - qdel(progbar) + progbar.end_progress() progbar = null return ..() diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 6f8faad7c3..daa195df25 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -891,7 +891,7 @@ return while (do_after(user, 10, TRUE, src, FALSE, CALLBACK(STR, /datum/component/storage.proc/handle_mass_item_insertion, things, src_object, user, progress))) stoplag(1) - qdel(progress) + progress.end_progress() to_chat(user, "You dump as much of [src_object.parent]'s contents into [STR.insert_preposition]to [src] as you can.") if(user.active_storage) //refresh the HUD to show the transfered contents user.active_storage.ui_show(user) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 88ca8a0250..dc44ac728f 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -388,7 +388,7 @@ GLOBAL_LIST_EMPTY(station_turfs) var/datum/progressbar/progress = new(user, things.len, src) while (do_after(usr, 1 SECONDS, TRUE, src, FALSE, CALLBACK(src_object, /datum/component/storage.proc/mass_remove_from_storage, src, things, progress, TRUE, user))) stoplag(1) - qdel(progress) + progress.end_progress() return TRUE diff --git a/code/modules/antagonists/clockcult/clock_scripture.dm b/code/modules/antagonists/clockcult/clock_scripture.dm index 6922c7cd81..feb724dceb 100644 --- a/code/modules/antagonists/clockcult/clock_scripture.dm +++ b/code/modules/antagonists/clockcult/clock_scripture.dm @@ -310,7 +310,7 @@ Judgement 80k power or nine converts var/datum/progressbar/progbar /datum/clockwork_scripture/ranged_ability/Destroy() - qdel(progbar) + progbar.end_progress() return ..() /datum/clockwork_scripture/ranged_ability/scripture_effects() @@ -333,7 +333,7 @@ Judgement 80k power or nine converts (allow_mobility || (can_recite() && T == get_turf(invoker)))) if(progbar) if(slab.slab_ability.in_progress) - qdel(progbar) + progbar.end_progress() else progbar.update(end_time - world.time) stoplag(1) diff --git a/code/modules/vehicles/secway.dm b/code/modules/vehicles/secway.dm index 8ad8b5f1ee..ea0ea2140b 100644 --- a/code/modules/vehicles/secway.dm +++ b/code/modules/vehicles/secway.dm @@ -43,7 +43,8 @@ . = ..(M, force, check_loc) if(.) if(progressbars_by_rider[M]) - qdel(progressbars_by_rider[M]) + var/datum/progressbar/to_delete = progressbars_by_rider[M] + to_delete.end_progress() var/datum/progressbar/D = new(M, chargemax, src) D.update(charge) progressbars_by_rider[M] = D @@ -51,12 +52,14 @@ /obj/vehicle/ridden/secway/unbuckle_mob(mob/living/M, force) . = ..(M, force) if(.) - qdel(progressbars_by_rider[M]) + var/datum/progressbar/to_delete = progressbars_by_rider[M] + to_delete.end_progress() progressbars_by_rider -= M /obj/vehicle/ridden/secway/Destroy() for(var/i in progressbars_by_rider) - qdel(progressbars_by_rider[i]) + var/datum/progressbar/to_delete = progressbars_by_rider[i] + to_delete.end_progress() progressbars_by_rider.Cut() STOP_PROCESSING(SSfastprocess, src) return ..() From 6ed7c5a8cd48790453872349bc949a9a44c10333 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 15 Apr 2022 09:31:54 -0500 Subject: [PATCH 48/53] Automatic changelog generation for PR #15597 [ci skip] --- html/changelogs/AutoChangeLog-pr-15597.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-15597.yml diff --git a/html/changelogs/AutoChangeLog-pr-15597.yml b/html/changelogs/AutoChangeLog-pr-15597.yml new file mode 100644 index 0000000000..0f57125f0f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15597.yml @@ -0,0 +1,4 @@ +author: "SandPoot" +delete-after: True +changes: + - bugfix: "Progressbars no longer stay after completing/failing their task." From d880de7c5ca8d4b8b1b0eaf20eaffbbd99d120ea Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sat, 16 Apr 2022 00:40:59 +0000 Subject: [PATCH 49/53] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-15597.yml | 4 ---- html/changelogs/archive/2022-04.yml | 3 +++ 2 files changed, 3 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-15597.yml diff --git a/html/changelogs/AutoChangeLog-pr-15597.yml b/html/changelogs/AutoChangeLog-pr-15597.yml deleted file mode 100644 index 0f57125f0f..0000000000 --- a/html/changelogs/AutoChangeLog-pr-15597.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SandPoot" -delete-after: True -changes: - - bugfix: "Progressbars no longer stay after completing/failing their task." diff --git a/html/changelogs/archive/2022-04.yml b/html/changelogs/archive/2022-04.yml index a8ca0cfc2d..fee6aad6e4 100644 --- a/html/changelogs/archive/2022-04.yml +++ b/html/changelogs/archive/2022-04.yml @@ -24,3 +24,6 @@ BlueWildrose: - rscadd: Added carcinisoprojection jelly, a limb regrowth chemical made from xenobiology's slime mutation toxin & blood. Don't overdose! +2022-04-16: + SandPoot: + - bugfix: Progressbars no longer stay after completing/failing their task. From afa9b1a962225063d963cef3cc1341bfca2b70ea Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 15 Apr 2022 19:42:01 -0500 Subject: [PATCH 50/53] Automatic changelog generation for PR #15585 [ci skip] --- html/changelogs/AutoChangeLog-pr-15585.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-15585.yml diff --git a/html/changelogs/AutoChangeLog-pr-15585.yml b/html/changelogs/AutoChangeLog-pr-15585.yml new file mode 100644 index 0000000000..f1cb4ac62a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15585.yml @@ -0,0 +1,4 @@ +author: "SandPoot" +delete-after: True +changes: + - code_imp: "Initialize(mapload)" From af1404c0e92177b5c1971fca3460b3a485fc6196 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 15 Apr 2022 19:42:07 -0500 Subject: [PATCH 51/53] Automatic changelog generation for PR #15593 [ci skip] --- html/changelogs/AutoChangeLog-pr-15593.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-15593.yml diff --git a/html/changelogs/AutoChangeLog-pr-15593.yml b/html/changelogs/AutoChangeLog-pr-15593.yml new file mode 100644 index 0000000000..32c871bef5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15593.yml @@ -0,0 +1,5 @@ +author: "Putnam3145" +delete-after: True +changes: + - bugfix: "Fires are back on Linux +tweak: Linux-only: plasma and trit fires work as before" From 11472c08b11e9b5eb1e7e8870573ff796c92223d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 15 Apr 2022 19:43:11 -0500 Subject: [PATCH 52/53] Automatic changelog generation for PR #15588 [ci skip] --- html/changelogs/AutoChangeLog-pr-15588.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-15588.yml diff --git a/html/changelogs/AutoChangeLog-pr-15588.yml b/html/changelogs/AutoChangeLog-pr-15588.yml new file mode 100644 index 0000000000..0328bdaef6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15588.yml @@ -0,0 +1,4 @@ +author: "SandPoot" +delete-after: True +changes: + - bugfix: "Fixes testicle shape saving." From 9b5c7ae313af38aebb76cf127bfd5f2dcbaa9167 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 15 Apr 2022 19:43:40 -0500 Subject: [PATCH 53/53] Automatic changelog generation for PR #15590 [ci skip] --- html/changelogs/AutoChangeLog-pr-15590.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-15590.yml diff --git a/html/changelogs/AutoChangeLog-pr-15590.yml b/html/changelogs/AutoChangeLog-pr-15590.yml new file mode 100644 index 0000000000..ebe7dd64d9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15590.yml @@ -0,0 +1,4 @@ +author: "maxspells" +delete-after: True +changes: + - expansion: "Surgery steps play sound effects appropriate to the step"