From 2c578ca683c1f69e42883bd11ddd169f48eaa144 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Thu, 24 Oct 2019 18:01:46 +0200 Subject: [PATCH 01/41] Ports move force and move resist, movement/pushing/pulling tweaks & co. --- .../lavaland_surface_ash_walker1.dmm | 2 +- _maps/RandomZLevels/VR/snowdin_VR.dmm | 6 +- _maps/RandomZLevels/caves.dmm | 16 +-- _maps/RandomZLevels/snowdin.dmm | 6 +- code/__DEFINES/misc.dm | 24 ---- code/__DEFINES/move_force.dm | 20 ++++ code/__DEFINES/time.dm | 24 ++++ code/__HELPERS/unsorted.dm | 2 +- code/controllers/subsystem/throwing.dm | 1 + code/datums/components/spawner.dm | 49 ++++++++ code/datums/martial/cqc.dm | 2 +- code/datums/martial/psychotic_brawl.dm | 2 +- code/datums/martial/sleeping_carp.dm | 2 +- code/game/atoms.dm | 2 +- code/game/atoms_movable.dm | 52 +++++--- .../game/gamemodes/clown_ops/clown_weapons.dm | 4 +- code/game/machinery/doors/door.dm | 1 + code/game/machinery/shieldgen.dm | 3 + .../game/mecha/equipment/tools/other_tools.dm | 4 +- code/game/mecha/equipment/weapons/weapons.dm | 2 +- code/game/mecha/mecha_defense.dm | 4 +- code/game/objects/effects/effects.dm | 1 + code/game/objects/items.dm | 18 +-- code/game/objects/items/dice.dm | 2 +- code/game/objects/items/handcuffs.dm | 4 +- code/game/objects/items/melee/misc.dm | 8 +- code/game/objects/items/singularityhammer.dm | 6 +- code/game/objects/items/stacks/bscrystal.dm | 2 +- code/game/objects/items/stacks/stack.dm | 2 +- code/game/objects/items/stunbaton.dm | 2 +- code/game/objects/items/theft_tools.dm | 2 +- code/game/objects/items/toys.dm | 8 +- code/game/objects/obj_defense.dm | 13 +- code/game/objects/objs.dm | 2 +- .../objects/structures/ghost_role_spawners.dm | 2 + code/game/objects/structures/grille.dm | 2 +- .../lavaland}/necropolis_tendril.dm | 64 +++++----- code/game/objects/structures/spawner.dm | 75 ++++++++++++ .../turfs/simulated/floor/plating/asteroid.dm | 8 +- code/game/turfs/simulated/lava.dm | 2 +- code/game/turfs/simulated/wall/misc_walls.dm | 2 +- .../clock_weapons/ratvarian_spear.dm | 8 +- code/modules/antagonists/cult/cult_items.dm | 18 +-- code/modules/antagonists/revenant/revenant.dm | 4 +- code/modules/assembly/infrared.dm | 2 +- code/modules/assembly/mousetrap.dm | 4 +- .../environmental/LINDA_turf_tile.dm | 3 +- .../atmospherics/machinery/atmosmachinery.dm | 1 + code/modules/events/immovable_rod.dm | 3 + code/modules/flufftext/Hallucination.dm | 4 +- code/modules/food_and_drinks/drinks/drinks.dm | 4 +- .../food_and_drinks/drinks/drinks/bottle.dm | 6 +- .../food_and_drinks/food/snacks_egg.dm | 2 +- .../food_and_drinks/food/snacks_other.dm | 4 +- .../food_and_drinks/food/snacks_pie.dm | 2 +- code/modules/food_and_drinks/pizzabox.dm | 2 +- code/modules/holiday/halloween/jacqueen.dm | 2 +- code/modules/holodeck/items.dm | 4 +- code/modules/hydroponics/grown.dm | 2 +- code/modules/hydroponics/growninedible.dm | 2 +- code/modules/mining/fulton.dm | 3 +- code/modules/mining/ores_coins.dm | 2 +- code/modules/mob/camera/camera.dm | 3 +- code/modules/mob/dead/dead.dm | 1 + .../modules/mob/dead/new_player/new_player.dm | 4 +- code/modules/mob/dead/observer/observer.dm | 5 - .../mob/living/carbon/alien/alien_defense.dm | 2 +- .../carbon/alien/humanoid/caste/hunter.dm | 16 +-- .../mob/living/carbon/alien/larva/larva.dm | 2 +- .../living/carbon/alien/special/facehugger.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 20 ++-- .../mob/living/carbon/carbon_defense.dm | 2 +- .../mob/living/carbon/human/human_defense.dm | 2 +- .../mob/living/carbon/monkey/combat.dm | 2 +- code/modules/mob/living/living.dm | 56 +++++---- code/modules/mob/living/living_defense.dm | 6 +- code/modules/mob/living/silicon/ai/ai.dm | 11 +- code/modules/mob/living/silicon/ai/death.dm | 2 +- .../mob/living/silicon/pai/pai_shell.dm | 2 +- .../mob/living/simple_animal/bot/honkbot.dm | 2 +- .../mob/living/simple_animal/bot/mulebot.dm | 4 +- .../mob/living/simple_animal/bot/secbot.dm | 2 +- .../mob/living/simple_animal/constructs.dm | 2 +- .../simple_animal/guardian/types/charger.dm | 14 +-- .../simple_animal/hostile/jungle/leaper.dm | 2 +- .../simple_animal/hostile/jungle/mook.dm | 2 +- .../simple_animal/hostile/jungle/seedling.dm | 2 +- .../hostile/megafauna/bubblegum.dm | 6 +- .../hostile/megafauna/megafauna.dm | 4 +- .../hostile/megafauna/swarmer.dm | 1 - .../hostile/mining_mobs/goliath.dm | 8 +- .../hostile/mining_mobs/hivelord.dm | 10 +- .../hostile/mining_mobs/mining_mobs.dm | 2 +- .../living/simple_animal/hostile/mushroom.dm | 2 +- .../simple_animal/hostile/netherworld.dm | 23 ++-- .../living/simple_animal/hostile/statue.dm | 5 +- .../mob/living/simple_animal/simple_animal.dm | 2 +- .../mob/living/simple_animal/slime/slime.dm | 4 +- .../mob/living/simple_animal/spawner.dm | 113 ------------------ code/modules/mob/mob_movement.dm | 3 +- code/modules/ninja/energy_katana.dm | 2 +- code/modules/paperwork/paperplane.dm | 2 +- code/modules/power/gravitygenerator.dm | 1 + code/modules/power/lighting.dm | 2 +- .../power/singularity/containment_field.dm | 1 + .../power/singularity/field_generator.dm | 2 + code/modules/power/singularity/singularity.dm | 1 + .../mapGenerators/lavaland.dm | 6 +- .../projectiles/ammunition/_ammunition.dm | 2 +- code/modules/reagents/reagent_containers.dm | 4 +- code/modules/recycling/disposal/bin.dm | 2 +- .../ruins/objects_and_mobs/ash_walker_den.dm | 33 ++--- code/modules/shuttle/on_move.dm | 2 +- code/modules/spells/spell_types/conjure.dm | 2 +- code/modules/spells/spell_types/wizard.dm | 2 +- code/modules/surgery/bodyparts/bodyparts.dm | 2 +- code/modules/unit_tests/_unit_tests.dm | 1 + code/modules/unit_tests/anchored_mobs.dm | 9 ++ .../living/silicon/robot/dogborg_equipment.dm | 16 +-- .../projectiles/guns/ballistic/spinfusor.dm | 6 +- tgstation.dme | 6 +- 121 files changed, 553 insertions(+), 437 deletions(-) create mode 100644 code/__DEFINES/move_force.dm create mode 100644 code/datums/components/spawner.dm rename code/{modules/mob/living/simple_animal/hostile/mining_mobs => game/objects/structures/lavaland}/necropolis_tendril.dm (71%) create mode 100644 code/game/objects/structures/spawner.dm delete mode 100644 code/modules/mob/living/simple_animal/spawner.dm create mode 100644 code/modules/unit_tests/anchored_mobs.dm diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm index ed5b07168f..1b4b6a5d43 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm @@ -266,7 +266,7 @@ /turf/open/indestructible/boss, /area/ruin/unpowered/ash_walkers) "aH" = ( -/mob/living/simple_animal/hostile/spawner/lavaland/ash_walker, +/obj/structure/lavaland/ash_walker, /turf/open/lava/smooth{ initial_gas_mix = "o2=14;n2=23;TEMP=300" }, diff --git a/_maps/RandomZLevels/VR/snowdin_VR.dmm b/_maps/RandomZLevels/VR/snowdin_VR.dmm index 8f6eda450c..0e67b7227c 100644 --- a/_maps/RandomZLevels/VR/snowdin_VR.dmm +++ b/_maps/RandomZLevels/VR/snowdin_VR.dmm @@ -3669,7 +3669,7 @@ /area/awaymission/snowdin/cave/cavern) "im" = ( /obj/effect/decal/cleanable/blood/old, -/mob/living/simple_animal/hostile/spawner/nether{ +/obj/structure/spawner/nether{ max_mobs = 5 }, /turf/open/floor/engine/cult{ @@ -8272,7 +8272,7 @@ /turf/open/floor/engine/cult, /area/awaymission/snowdin/post/cavern2) "sb" = ( -/mob/living/simple_animal/hostile/spawner/nether{ +/obj/structure/spawner/nether{ max_mobs = 4; name = "weak netherworld link" }, @@ -10173,7 +10173,7 @@ /obj/structure/cable/yellow{ icon_state = "2-8" }, -/mob/living/simple_animal/hostile/spawner/nether{ +/obj/structure/spawner/nether{ max_mobs = 4; name = "weak netherworld link" }, diff --git a/_maps/RandomZLevels/caves.dmm b/_maps/RandomZLevels/caves.dmm index a25808d933..66ab3e60a8 100644 --- a/_maps/RandomZLevels/caves.dmm +++ b/_maps/RandomZLevels/caves.dmm @@ -103,7 +103,7 @@ }, /area/awaymission/caves/BMP_asteroid/level_four) "at" = ( -/mob/living/simple_animal/hostile/spawner/skeleton, +/obj/structure/spawner/skeleton, /turf/open/floor/plating/asteroid/basalt/lava{ initial_gas_mix = "n2=23;o2=14" }, @@ -164,7 +164,7 @@ }, /area/awaymission/caves/BMP_asteroid/level_four) "aB" = ( -/mob/living/simple_animal/hostile/spawner/skeleton, +/obj/structure/spawner/skeleton, /turf/open/floor/engine/cult{ initial_gas_mix = "n2=23;o2=14" }, @@ -374,7 +374,7 @@ }, /area/awaymission/caves/BMP_asteroid/level_three) "be" = ( -/mob/living/simple_animal/hostile/spawner/mining/goliath, +/obj/structure/spawner/mining/goliath, /turf/open/floor/plating/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14" }, @@ -504,7 +504,7 @@ /area/awaymission/caves/BMP_asteroid/level_three) "bw" = ( /obj/effect/decal/cleanable/blood, -/mob/living/simple_animal/hostile/spawner/skeleton, +/obj/structure/spawner/skeleton, /turf/open/floor/engine/cult{ initial_gas_mix = "n2=23;o2=14" }, @@ -930,7 +930,7 @@ /turf/closed/wall, /area/awaymission/caves/BMP_asteroid/level_two) "cL" = ( -/mob/living/simple_animal/hostile/spawner/mining/basilisk, +/obj/structure/spawner/mining/basilisk, /turf/open/floor/plating/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14" }, @@ -1644,7 +1644,7 @@ /turf/open/floor/plasteel, /area/awaymission/caves/listeningpost) "fb" = ( -/mob/living/simple_animal/hostile/spawner/mining/hivelord, +/obj/structure/spawner/mining/hivelord, /turf/open/floor/plating/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14" }, @@ -2133,7 +2133,7 @@ /turf/open/floor/plasteel/recharge_floor, /area/awaymission/caves/BMP_asteroid) "gD" = ( -/mob/living/simple_animal/hostile/spawner/mining/hivelord, +/obj/structure/spawner/mining/hivelord, /turf/open/floor/plating/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14" }, @@ -2206,7 +2206,7 @@ }, /area/awaymission/caves/BMP_asteroid) "gQ" = ( -/mob/living/simple_animal/hostile/spawner/mining/basilisk, +/obj/structure/spawner/mining/basilisk, /turf/open/floor/plating/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14" }, diff --git a/_maps/RandomZLevels/snowdin.dmm b/_maps/RandomZLevels/snowdin.dmm index 525c8fcf7b..13171fddcc 100644 --- a/_maps/RandomZLevels/snowdin.dmm +++ b/_maps/RandomZLevels/snowdin.dmm @@ -3664,7 +3664,7 @@ /area/awaymission/snowdin/cave/cavern) "im" = ( /obj/effect/decal/cleanable/blood/old, -/mob/living/simple_animal/hostile/spawner/nether{ +/obj/structure/spawner/nether{ max_mobs = 5 }, /turf/open/floor/engine/cult{ @@ -8327,7 +8327,7 @@ /turf/open/floor/engine/cult, /area/awaymission/snowdin/post/cavern2) "sb" = ( -/mob/living/simple_animal/hostile/spawner/nether{ +/obj/structure/spawner/nether{ max_mobs = 4; name = "weak netherworld link" }, @@ -10237,7 +10237,7 @@ /obj/structure/cable/yellow{ icon_state = "2-8" }, -/mob/living/simple_animal/hostile/spawner/nether{ +/obj/structure/spawner/nether{ max_mobs = 4; name = "weak netherworld link" }, diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index bccf1f28dd..5ca0c99a63 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -25,30 +25,6 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s #define NOT_IMPLEMENTED "NOT_IMPLEMENTED" -#define MIDNIGHT_ROLLOVER 864000 //number of deciseconds in a day - -#define JANUARY 1 -#define FEBRUARY 2 -#define MARCH 3 -#define APRIL 4 -#define MAY 5 -#define JUNE 6 -#define JULY 7 -#define AUGUST 8 -#define SEPTEMBER 9 -#define OCTOBER 10 -#define NOVEMBER 11 -#define DECEMBER 12 - -//Select holiday names -- If you test for a holiday in the code, make the holiday's name a define and test for that instead -#define NEW_YEAR "New Year" -#define VALENTINES "Valentine's Day" -#define APRIL_FOOLS "April Fool's Day" -#define EASTER "Easter" -#define HALLOWEEN "Halloween" -#define CHRISTMAS "Christmas" -#define FESTIVE_SEASON "Festive Season" - //Human Overlays Indexes///////// //LOTS OF CIT CHANGES HERE. BE CAREFUL WHEN UPSTREAM ADDS MORE LAYERS #define MUTATIONS_LAYER 31 //mutations. Tk headglows, cold resistance glow, etc diff --git a/code/__DEFINES/move_force.dm b/code/__DEFINES/move_force.dm new file mode 100644 index 0000000000..ec31388c72 --- /dev/null +++ b/code/__DEFINES/move_force.dm @@ -0,0 +1,20 @@ +//Defaults +#define MOVE_FORCE_DEFAULT 1000 +#define MOVE_RESIST_DEFAULT 1000 +#define PULL_FORCE_DEFAULT 1000 + +//Factors/modifiers +#define MOVE_FORCE_PULL_RATIO 1 //Same move force to pull objects +#define MOVE_FORCE_PUSH_RATIO 1 //Same move force to normally push +#define MOVE_FORCE_FORCEPUSH_RATIO 2 //2x move force to forcefully push +#define MOVE_FORCE_CRUSH_RATIO 3 //3x move force to do things like crush objects +#define MOVE_FORCE_THROW_RATIO 1 //Same force throw as resist to throw objects + +#define MOVE_FORCE_OVERPOWERING (MOVE_FORCE_DEFAULT * MOVE_FORCE_CRUSH_RATIO * 10) +#define MOVE_FORCE_EXTREMELY_STRONG (MOVE_FORCE_DEFAULT * MOVE_FORCE_CRUSH_RATIO * 3) +#define MOVE_FORCE_VERY_STRONG ((MOVE_FORCE_DEFAULT * MOVE_FORCE_CRUSH_RATIO) - 1) +#define MOVE_FORCE_STRONG (MOVE_FORCE_DEFAULT * 2) +#define MOVE_FORCE_NORMAL MOVE_FORCE_DEFAULT +#define MOVE_FORCE_WEAK (MOVE_FORCE_DEFAULT / 2) +#define MOVE_FORCE_VERY_WEAK ((MOVE_FORCE_DEFAULT / MOVE_FORCE_CRUSH_RATIO) + 1) +#define MOVE_FORCE_EXTREMELY_WEAK (MOVE_FORCE_DEFAULT / (MOVE_FORCE_CRUSH_RATIO * 3)) \ No newline at end of file diff --git a/code/__DEFINES/time.dm b/code/__DEFINES/time.dm index f13f13510b..e1fff1879e 100644 --- a/code/__DEFINES/time.dm +++ b/code/__DEFINES/time.dm @@ -1,3 +1,27 @@ +#define MIDNIGHT_ROLLOVER 864000 //number of deciseconds in a day + +#define JANUARY 1 +#define FEBRUARY 2 +#define MARCH 3 +#define APRIL 4 +#define MAY 5 +#define JUNE 6 +#define JULY 7 +#define AUGUST 8 +#define SEPTEMBER 9 +#define OCTOBER 10 +#define NOVEMBER 11 +#define DECEMBER 12 + +//Select holiday names -- If you test for a holiday in the code, make the holiday's name a define and test for that instead +#define NEW_YEAR "New Year" +#define VALENTINES "Valentine's Day" +#define APRIL_FOOLS "April Fool's Day" +#define EASTER "Easter" +#define HALLOWEEN "Halloween" +#define CHRISTMAS "Christmas" +#define FESTIVE_SEASON "Festive Season" + /* Days of the week to make it easier to reference them. diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 3c8d62ce3a..da74045418 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1291,7 +1291,7 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) invisibility = 101 density = FALSE see_in_dark = 1e6 - anchored = TRUE + move_resist = INFINITY var/ready_to_die = FALSE /mob/dview/Initialize() //Properly prevents this mob from gaining huds or joining any global lists diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm index 77ad712b99..bf79cbda34 100644 --- a/code/controllers/subsystem/throwing.dm +++ b/code/controllers/subsystem/throwing.dm @@ -54,6 +54,7 @@ SUBSYSTEM_DEF(throwing) var/dist_y var/dx var/dy + var/force = MOVE_FORCE_DEFAULT var/pure_diagonal var/diagonal_error var/datum/callback/callback diff --git a/code/datums/components/spawner.dm b/code/datums/components/spawner.dm new file mode 100644 index 0000000000..dc46603b1e --- /dev/null +++ b/code/datums/components/spawner.dm @@ -0,0 +1,49 @@ +/datum/component/spawner + var/mob_types = list(/mob/living/simple_animal/hostile/carp) + var/spawn_time = 300 //30 seconds default + var/list/spawned_mobs = list() + var/spawn_delay = 0 + var/max_mobs = 5 + var/spawn_text = "emerges from" + var/list/faction = list("mining") + +/datum/component/spawner/Initialize(_mob_types, _spawn_time, _faction, _spawn_text, _max_mobs) + if(_spawn_time) + spawn_time=_spawn_time + if(_mob_types) + mob_types=_mob_types + if(_faction) + faction=_faction + if(_spawn_text) + spawn_text=_spawn_text + if(_max_mobs) + max_mobs=_max_mobs + + RegisterSignal(parent, list(COMSIG_PARENT_QDELETED), .proc/stop_spawning) + START_PROCESSING(SSprocessing, src) + +/datum/component/spawner/process() + try_spawn_mob() + + +/datum/component/spawner/proc/stop_spawning(force, hint) + STOP_PROCESSING(SSprocessing, src) + for(var/mob/living/simple_animal/L in spawned_mobs) + if(L.nest == src) + L.nest = null + spawned_mobs = null + +/datum/component/spawner/proc/try_spawn_mob() + var/atom/P = parent + if(spawned_mobs.len >= max_mobs) + return 0 + if(spawn_delay > world.time) + return 0 + spawn_delay = world.time + spawn_time + var/chosen_mob_type = pick(mob_types) + var/mob/living/simple_animal/L = new chosen_mob_type(P.loc) + L.flags_1 |= (P.flags_1 & ADMIN_SPAWNED_1) + spawned_mobs += L + L.nest = src + L.faction = src.faction + P.visible_message("[L] [spawn_text] [P].") \ No newline at end of file diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index c7644997ee..390122bc81 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -127,7 +127,7 @@ if(A.grab_state >= GRAB_AGGRESSIVE) D.grabbedby(A, 1) else - A.start_pulling(D, 1) + A.start_pulling(D, supress_message = TRUE) if(A.pulling) D.stop_pulling() log_combat(A, D, "grabbed", addition="aggressively") diff --git a/code/datums/martial/psychotic_brawl.dm b/code/datums/martial/psychotic_brawl.dm index 34301516dc..50e3f7d334 100644 --- a/code/datums/martial/psychotic_brawl.dm +++ b/code/datums/martial/psychotic_brawl.dm @@ -25,7 +25,7 @@ if(A.grab_state >= GRAB_AGGRESSIVE) D.grabbedby(A, 1) else - A.start_pulling(D, 1) + A.start_pulling(D, supress_message = TRUE) if(A.pulling) D.drop_all_held_items() D.stop_pulling() diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index 801e8c8c7a..933d96b179 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -108,7 +108,7 @@ if(A.grab_state >= GRAB_AGGRESSIVE) D.grabbedby(A, 1) else - A.start_pulling(D, 1) + A.start_pulling(D, supress_message = TRUE) if(A.pulling) D.drop_all_held_items() D.stop_pulling() diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 7c9dc3f4fe..e41b0986cb 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -313,7 +313,7 @@ SEND_SIGNAL(src, COMSIG_ATOM_FIRE_ACT, exposed_temperature, exposed_volume) return -/atom/proc/hitby(atom/movable/AM, skipcatch, hitpush, blocked) +/atom/proc/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) if(density && !has_gravity(AM)) //thrown stuff bounces off dense stuff in no grav, unless the thrown stuff ends up inside what it hit(embedding, bola, etc...). addtimer(CALLBACK(src, .proc/hitby_react, AM), 2) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 83762240bc..61cea6945e 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -3,6 +3,9 @@ var/last_move = null var/last_move_time = 0 var/anchored = FALSE + var/move_resist = MOVE_RESIST_DEFAULT + var/move_force = MOVE_FORCE_DEFAULT + var/pull_force = PULL_FORCE_DEFAULT var/datum/thrownthing/throwing = null var/throw_speed = 2 //How many tiles to move per ds when being thrown. Float values are fully supported var/throw_range = 7 @@ -71,20 +74,20 @@ return FALSE return ..() -/atom/movable/proc/start_pulling(atom/movable/AM,gs) +/atom/movable/proc/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE) if(QDELETED(AM)) return FALSE - if(!(AM.can_be_pulled(src))) + if(!(AM.can_be_pulled(src, state, force))) return FALSE // If we're pulling something then drop what we're currently pulling and pull this instead. if(pulling) - if(gs==0) + if(state == 0) stop_pulling() return FALSE // Are we trying to pull something we are already pulling? Then enter grab cycle and end. if(AM == pulling) - grab_state = gs + grab_state = state if(istype(AM,/mob/living)) var/mob/living/AMob = AM AMob.grabbedby(src) @@ -95,11 +98,12 @@ AM.pulledby.stop_pulling() //an object can't be pulled by two mobs at once. pulling = AM AM.pulledby = src - grab_state = gs + grab_state = state if(ismob(AM)) var/mob/M = AM log_combat(src, M, "grabbed", addition="passive grab") - visible_message("[src] has grabbed [M] passively!") + if(!supress_message) + visible_message("[src] has grabbed [M] passively!") return TRUE /atom/movable/proc/stop_pulling() @@ -461,17 +465,19 @@ /atom/movable/proc/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) set waitfor = 0 SEND_SIGNAL(src, COMSIG_MOVABLE_IMPACT, hit_atom, throwingdatum) - return hit_atom.hitby(src) + return hit_atom.hitby(src, throwingdatum=throwingdatum) -/atom/movable/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked) - if(!anchored && hitpush) +/atom/movable/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked, datum/thrownthing/throwingdatum) + if(!anchored && hitpush && (!throwingdatum || (throwingdatum.force >= (move_resist * MOVE_FORCE_PUSH_RATIO)))) step(src, AM.dir) ..() -/atom/movable/proc/safe_throw_at(atom/target, range, speed, mob/thrower, spin=TRUE, diagonals_first = FALSE, var/datum/callback/callback) - return throw_at(target, range, speed, thrower, spin, diagonals_first, callback) +/atom/movable/proc/safe_throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = INFINITY) + if((force < (move_resist * MOVE_FORCE_THROW_RATIO)) || (move_resist == INFINITY)) + return + return throw_at(target, range, speed, thrower, spin, diagonals_first, callback, force) -/atom/movable/proc/throw_at(atom/target, range, speed, mob/thrower, spin=TRUE, diagonals_first = FALSE, var/datum/callback/callback) //If this returns FALSE then callback will not be called. +/atom/movable/proc/throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = INFINITY) //If this returns FALSE then callback will not be called. . = FALSE if (!target || speed <= 0) return @@ -517,6 +523,7 @@ TT.speed = speed TT.thrower = thrower TT.diagonals_first = diagonals_first + TT.force = force TT.callback = callback var/dist_x = abs(target.x - src.x) @@ -565,6 +572,22 @@ return 0 return 1 +/atom/movable/proc/force_pushed(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction) + return FALSE + +/atom/movable/proc/force_push(atom/movable/AM, force = move_force, direction, silent = FALSE) + . = AM.force_pushed(src, force, direction) + if(!silent && .) + visible_message("[src] forcefully pushes against [AM]!", "You forcefully push against [AM]!") + +/atom/movable/proc/move_crush(atom/movable/AM, force = move_force, direction, silent = FALSE) + . = AM.move_crushed(src, force, direction) + if(!silent && .) + visible_message("[src] crushes past [AM]!", "You crush [AM]!") + +/atom/movable/proc/move_crushed(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction) + return FALSE + /atom/movable/CanPass(atom/movable/mover, turf/target) if(mover in buckled_mobs) return 1 @@ -784,14 +807,15 @@ /atom/movable/proc/get_cell() return -/atom/movable/proc/can_be_pulled(user) +/atom/movable/proc/can_be_pulled(user, grab_state, force) if(src == user || !isturf(loc)) return FALSE if(anchored || throwing) return FALSE + if(force < (move_resist * MOVE_FORCE_PULL_RATIO)) + return FALSE return TRUE - /obj/item/proc/do_pickup_animation(atom/target) set waitfor = FALSE if(!istype(loc, /turf)) diff --git a/code/game/gamemodes/clown_ops/clown_weapons.dm b/code/game/gamemodes/clown_ops/clown_weapons.dm index 9d1a3b650c..60ae5685ec 100644 --- a/code/game/gamemodes/clown_ops/clown_weapons.dm +++ b/code/game/gamemodes/clown_ops/clown_weapons.dm @@ -145,9 +145,9 @@ C.throw_mode_on() //so they can catch it on the return. return ..() -/obj/item/shield/energy/bananium/throw_impact(atom/hit_atom) +/obj/item/shield/energy/bananium/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(active) - var/caught = hit_atom.hitby(src, 0, 0) + var/caught = hit_atom.hitby(src, FALSE, FALSE, throwingdatum=throwingdatum) if(iscarbon(hit_atom) && !caught)//if they are a carbon and they didn't catch it GET_COMPONENT(slipper, /datum/component/slippery) slipper.Slip(hit_atom) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index a2da7de29a..15b3c66c8b 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -5,6 +5,7 @@ icon_state = "door1" opacity = 1 density = TRUE + move_resist = MOVE_FORCE_VERY_STRONG layer = OPEN_DOOR_LAYER power_channel = ENVIRON max_integrity = 350 diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index fc6577a4f1..16016b8e18 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -4,6 +4,7 @@ icon = 'icons/effects/effects.dmi' icon_state = "shield-old" density = TRUE + move_resist = INFINITY opacity = 0 anchored = TRUE resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF @@ -93,6 +94,7 @@ /obj/machinery/shieldgen/proc/shields_up() active = TRUE update_icon() + move_resist = INFINITY for(var/turf/target_tile in range(shield_range, src)) if(isspaceturf(target_tile) && !(locate(/obj/structure/emergency_shield) in target_tile)) @@ -101,6 +103,7 @@ /obj/machinery/shieldgen/proc/shields_down() active = FALSE + move_resist = initial(move_resist) update_icon() QDEL_LIST(deployed_shields) diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index a8ba9850ff..07ecdec508 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -84,7 +84,7 @@ switch(mode) if(1) if(!locked) - if(!istype(target) || target.anchored) + if(!istype(target) || target.anchored || target.move_resist >= MOVE_FORCE_EXTREMELY_STRON) occupant_message("Unable to lock on [target]") return locked = target @@ -110,7 +110,7 @@ else atoms = orange(3, target) for(var/atom/movable/A in atoms) - if(A.anchored) + if(A.anchored || A.move_resist >= MOVE_FORCE_EXTREMELY_STRONG) continue spawn(0) var/iter = 5-get_dist(A,target) diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 9f8f3ef742..5d4d0e5899 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -436,7 +436,7 @@ throwforce = 35 icon_state = "punching_glove" -/obj/item/punching_glove/throw_impact(atom/hit_atom) +/obj/item/punching_glove/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!..()) if(ismovableatom(hit_atom)) var/atom/movable/AM = hit_atom diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm index 62a62b569d..90cd5df79c 100644 --- a/code/game/mecha/mecha_defense.dm +++ b/code/game/mecha/mecha_defense.dm @@ -108,8 +108,8 @@ /obj/mecha/attack_tk() return -/obj/mecha/hitby(atom/movable/A as mob|obj) //wrapper - log_message("Hit by [A].", color="red") +/obj/mecha/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) //wrapper + log_message("Hit by [AM].", color="red") . = ..() diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm index 410923fe25..ccde9c2254 100644 --- a/code/game/objects/effects/effects.dm +++ b/code/game/objects/effects/effects.dm @@ -4,6 +4,7 @@ /obj/effect icon = 'icons/effects/effects.dmi' resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF + move_resist = INFINITY obj_flags = 0 /obj/effect/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 6a706fede9..542c3249ac 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -544,21 +544,21 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) else return -/obj/item/throw_impact(atom/A, datum/thrownthing/throwingdatum) - if(A && !QDELETED(A)) - SEND_SIGNAL(src, COMSIG_MOVABLE_IMPACT, A, throwingdatum) - if(is_hot() && isliving(A)) - var/mob/living/L = A +/obj/item/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + if(hit_atom && !QDELETED(hit_atom)) + SEND_SIGNAL(src, COMSIG_MOVABLE_IMPACT, hit_atom, throwingdatum) + if(is_hot() && isliving(hit_atom)) + var/mob/living/L = hit_atom L.IgniteMob() var/itempush = 1 if(w_class < 4) itempush = 0 //too light to push anything - return A.hitby(src, 0, itempush) + return hit_atom.hitby(src, 0, itempush, throwingdatum=throwingdatum) -/obj/item/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback) +/obj/item/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force) thrownby = thrower callback = CALLBACK(src, .proc/after_throw, callback) //replace their callback with our own - . = ..(target, range, speed, thrower, spin, diagonals_first, callback) + . = ..(target, range, speed, thrower, spin, diagonals_first, callback, force) /obj/item/proc/after_throw(datum/callback/callback) if (callback) //call the original callback @@ -649,7 +649,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) else . = "" -/obj/item/hitby(atom/movable/AM) +/obj/item/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) return /obj/item/attack_hulk(mob/living/carbon/human/user) diff --git a/code/game/objects/items/dice.dm b/code/game/objects/items/dice.dm index cb0d4ec4ac..c6af6246bf 100644 --- a/code/game/objects/items/dice.dm +++ b/code/game/objects/items/dice.dm @@ -160,7 +160,7 @@ /obj/item/dice/attack_self(mob/user) diceroll(user) -/obj/item/dice/throw_impact(atom/target) +/obj/item/dice/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) diceroll(thrownby) . = ..() diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index 246dd77684..d27ab8231b 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -340,7 +340,7 @@ return playsound(src.loc,'sound/weapons/bolathrow.ogg', 75, 1) -/obj/item/restraints/legcuffs/bola/throw_impact(atom/hit_atom) +/obj/item/restraints/legcuffs/bola/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(..() || !iscarbon(hit_atom))//if it gets caught or the target can't be cuffed, return//abort var/mob/living/carbon/C = hit_atom @@ -368,7 +368,7 @@ w_class = WEIGHT_CLASS_SMALL breakouttime = 60 -/obj/item/restraints/legcuffs/bola/energy/throw_impact(atom/hit_atom) +/obj/item/restraints/legcuffs/bola/energy/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(iscarbon(hit_atom)) var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy/cyborg(get_turf(hit_atom)) B.Crossed(hit_atom) diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 10b84917bb..7494eb8e1c 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -332,13 +332,13 @@ if(proximity_flag) consume_everything(target) -/obj/item/melee/supermatter_sword/throw_impact(target) +/obj/item/melee/supermatter_sword/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) ..() - if(ismob(target)) - var/mob/M + if(ismob(hit_atom)) + var/mob/M = hit_atom if(src.loc == M) M.dropItemToGround(src) - consume_everything(target) + consume_everything(hit_atom) /obj/item/melee/supermatter_sword/pickup(user) ..() diff --git a/code/game/objects/items/singularityhammer.dm b/code/game/objects/items/singularityhammer.dm index b6559c9091..1c20fcfacc 100644 --- a/code/game/objects/items/singularityhammer.dm +++ b/code/game/objects/items/singularityhammer.dm @@ -105,10 +105,10 @@ playsound(src.loc, "sparks", 50, 1) shock(M) -/obj/item/twohanded/mjollnir/throw_impact(atom/target) +/obj/item/twohanded/mjollnir/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) . = ..() - if(isliving(target)) - shock(target) + if(isliving(hit_atom)) + shock(hit_atom) /obj/item/twohanded/mjollnir/update_icon() //Currently only here to fuck with the on-mob icons. icon_state = "mjollnir[wielded]" diff --git a/code/game/objects/items/stacks/bscrystal.dm b/code/game/objects/items/stacks/bscrystal.dm index 49a735af9c..2d494ca186 100644 --- a/code/game/objects/items/stacks/bscrystal.dm +++ b/code/game/objects/items/stacks/bscrystal.dm @@ -35,7 +35,7 @@ /obj/item/stack/ore/bluespace_crystal/proc/blink_mob(mob/living/L) do_teleport(L, get_turf(L), blink_range, asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) -/obj/item/stack/ore/bluespace_crystal/throw_impact(atom/hit_atom) +/obj/item/stack/ore/bluespace_crystal/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!..()) // not caught in mid-air visible_message("[src] fizzles and disappears upon impact!") var/turf/T = get_turf(hit_atom) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 155d1f1643..ea9440830d 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -335,7 +335,7 @@ merge(o) . = ..() -/obj/item/stack/hitby(atom/movable/AM, skip, hitpush) +/obj/item/stack/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) if(istype(AM, merge_type)) merge(AM) . = ..() diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index bfe630ba01..81956f147c 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -40,7 +40,7 @@ cell = new preload_cell_type(src) update_icon() -/obj/item/melee/baton/throw_impact(atom/hit_atom) +/obj/item/melee/baton/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) ..() //Only mob/living types have stun handling if(status && prob(throw_hit_chance) && iscarbon(hit_atom)) diff --git a/code/game/objects/items/theft_tools.dm b/code/game/objects/items/theft_tools.dm index b99be7e988..243787dcb4 100644 --- a/code/game/objects/items/theft_tools.dm +++ b/code/game/objects/items/theft_tools.dm @@ -235,7 +235,7 @@ if(proximity && ismovableatom(O) && O != sliver) Consume(O, user) -/obj/item/hemostat/supermatter/throw_impact(atom/hit_atom) // no instakill supermatter javelins +/obj/item/hemostat/supermatter/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) // no instakill supermatter javelins if(sliver) sliver.forceMove(loc) to_chat(usr, "\The [sliver] falls out of \the [src] as you throw them.") diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 46fabea8b0..2e4c45fa96 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -84,7 +84,7 @@ else return ..() -/obj/item/toy/balloon/throw_impact(atom/hit_atom) +/obj/item/toy/balloon/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!..()) //was it caught by a mob? balloon_burst(hit_atom) @@ -384,7 +384,7 @@ /obj/item/toy/snappop/fire_act(exposed_temperature, exposed_volume) pop_burst() -/obj/item/toy/snappop/throw_impact(atom/hit_atom) +/obj/item/toy/snappop/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!..()) pop_burst() @@ -1006,7 +1006,7 @@ icon_state = "minimeteor" w_class = WEIGHT_CLASS_SMALL -/obj/item/toy/minimeteor/throw_impact(atom/hit_atom) +/obj/item/toy/minimeteor/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!..()) playsound(src, 'sound/effects/meteorimpact.ogg', 40, 1) for(var/mob/M in urange(10, src)) @@ -1055,7 +1055,7 @@ if(user.dropItemToGround(src)) throw_at(target, throw_range, throw_speed) -/obj/item/toy/snowball/throw_impact(atom/hit_atom) +/obj/item/toy/snowball/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!..()) playsound(src, 'sound/effects/pop.ogg', 20, 1) qdel(src) diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 70a05a8d40..2d99f0e073 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -46,7 +46,7 @@ if(BURN) playsound(src.loc, 'sound/items/welder.ogg', 100, 1) -/obj/hitby(atom/movable/AM) +/obj/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) ..() var/throwdamage = AM.throwforce if(isobj(AM)) @@ -126,6 +126,17 @@ if(. && !play_soundeffect) playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1) +/obj/force_pushed(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction) + return TRUE + +/obj/move_crushed(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction) + collision_damage(pusher, force, direction) + return TRUE + +/obj/proc/collision_damage(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction) + var/amt = max(0, ((force - (move_resist * MOVE_FORCE_CRUSH_RATIO)) / (move_resist * MOVE_FORCE_CRUSH_RATIO)) * 10) + take_damage(amt, BRUTE) + /obj/attack_slime(mob/living/simple_animal/slime/user) if(!user.is_adult) return diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 6dd8a43130..cd19ceda50 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -80,7 +80,7 @@ SEND_SIGNAL(src, COMSIG_OBJ_SETANCHORED, anchorvalue) anchored = anchorvalue -/obj/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback) +/obj/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force) ..() if(obj_flags & FROZEN) visible_message("[src] shatters into a million pieces!") diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index b820e93c7b..e71a2720ae 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -44,6 +44,7 @@ roundstart = FALSE death = FALSE anchored = FALSE + move_resist = MOVE_FORCE_NORMAL density = FALSE flavour_text = "You are an ash walker. Your tribe worships the Necropolis. The wastes are sacred ground, its monsters a blessed bounty. You would never leave its beautiful expanse. \ You have seen lights in the distance... they foreshadow the arrival of outsiders that seek to tear apart the Necropolis and its domain. Fresh sacrifices for your nest." @@ -118,6 +119,7 @@ roundstart = FALSE death = FALSE anchored = FALSE + move_resist = MOVE_FORCE_NORMAL density = FALSE var/has_owner = FALSE var/can_transfer = TRUE //if golems can switch bodies to this new shell diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 00d1690d86..460059ffbf 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -258,7 +258,7 @@ take_damage(1, BURN, 0, 0) ..() -/obj/structure/grille/hitby(AM as mob|obj) +/obj/structure/grille/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) if(isobj(AM)) if(prob(50) && anchored && !broken) var/obj/O = AM diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/necropolis_tendril.dm b/code/game/objects/structures/lavaland/necropolis_tendril.dm similarity index 71% rename from code/modules/mob/living/simple_animal/hostile/mining_mobs/necropolis_tendril.dm rename to code/game/objects/structures/lavaland/necropolis_tendril.dm index e3c81b2639..b1e9a81087 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/necropolis_tendril.dm +++ b/code/game/objects/structures/lavaland/necropolis_tendril.dm @@ -1,39 +1,32 @@ //Necropolis Tendrils, which spawn lavaland monsters and break into a chasm when killed -/obj/effect/light_emitter/tendril - set_luminosity = 4 - set_cap = 2.5 - light_color = LIGHT_COLOR_LAVA - -/mob/living/simple_animal/hostile/spawner/lavaland +/obj/structure/spawner/lavaland name = "necropolis tendril" desc = "A vile tendril of corruption, originating deep underground. Terrible monsters are pouring out of it." + icon = 'icons/mob/nest.dmi' icon_state = "tendril" - icon_living = "tendril" - icon_dead = "tendril" + faction = list("mining") - weather_immunities = list("lava","ash") - health = 250 - maxHealth = 250 max_mobs = 3 - spawn_time = 300 //30 seconds default + max_integrity = 250 mob_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril) - spawn_text = "emerges from" - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - maxbodytemp = INFINITY - loot = list(/obj/effect/collapse, /obj/structure/closet/crate/necropolis/tendril) - del_on_death = 1 + + move_resist=INFINITY // just killing it tears a massive hole in the ground, let's not move it + anchored = TRUE + resistance_flags = FIRE_PROOF | LAVA_PROOF + var/gps = null var/obj/effect/light_emitter/tendril/emitted_light -/mob/living/simple_animal/hostile/spawner/lavaland/goliath + +/obj/structure/spawner/lavaland/goliath mob_types = list(/mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril) -/mob/living/simple_animal/hostile/spawner/lavaland/legion +/obj/structure/spawner/lavaland/legion mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril) -/mob/living/simple_animal/hostile/spawner/lavaland/Initialize() +GLOBAL_LIST_INIT(tendrils, list()) +/obj/structure/spawner/lavaland/Initialize() . = ..() emitted_light = new(loc) for(var/F in RANGE_TURFS(1, src)) @@ -41,18 +34,19 @@ var/turf/closed/mineral/M = F M.ScrapeAway(null, CHANGETURF_IGNORE_AIR) gps = new /obj/item/gps/internal(src) + GLOB.tendrils += src -/mob/living/simple_animal/hostile/spawner/lavaland/Destroy() - QDEL_NULL(emitted_light) - QDEL_NULL(gps) +/obj/structure/spawner/lavaland/deconstruct(disassembled) + new /obj/effect/collapse(loc) + new /obj/structure/closet/crate/necropolis/tendril(loc) return ..() -/mob/living/simple_animal/hostile/spawner/lavaland/death() + +/obj/structure/spawner/lavaland/Destroy() var/last_tendril = TRUE - for(var/mob/living/simple_animal/hostile/spawner/lavaland/other in GLOB.mob_living_list) - if(other != src) - last_tendril = FALSE - break + if(GLOB.tendrils.len>1) + last_tendril = FALSE + if(last_tendril && !(flags_1 & ADMIN_SPAWNED_1)) if(SSmedals.hub_enabled) for(var/mob/living/L in view(7,src)) @@ -60,7 +54,15 @@ continue SSmedals.UnlockMedal("[BOSS_MEDAL_TENDRIL] [ALL_KILL_MEDAL]", L.client) SSmedals.SetScore(TENDRIL_CLEAR_SCORE, L.client, 1) - ..() + GLOB.tendrils -= src + QDEL_NULL(emitted_light) + QDEL_NULL(gps) + return ..() + +/obj/effect/light_emitter/tendril + set_luminosity = 4 + set_cap = 2.5 + light_color = LIGHT_COLOR_LAVA /obj/effect/collapse name = "collapsing necropolis tendril" @@ -92,4 +94,4 @@ for(var/turf/T in range(2,src)) if(!T.density) T.TerraformTurf(/turf/open/chasm/lavaland, /turf/open/chasm/lavaland) - qdel(src) + qdel(src) \ No newline at end of file diff --git a/code/game/objects/structures/spawner.dm b/code/game/objects/structures/spawner.dm new file mode 100644 index 0000000000..e67ef7af60 --- /dev/null +++ b/code/game/objects/structures/spawner.dm @@ -0,0 +1,75 @@ +/obj/structure/spawner + name = "monster nest" + icon = 'icons/mob/animal.dmi' + icon_state = "hole" + max_integrity = 100 + + move_resist = MOVE_FORCE_EXTREMELY_STRONG + anchored = TRUE + density = TRUE + + var/max_mobs = 5 + var/spawn_time = 300 //30 seconds default + var/mob_types = list(/mob/living/simple_animal/hostile/carp) + var/spawn_text = "emerges from" + var/faction = list("hostile") + +/obj/structure/spawner/Initialize() + . = ..() + AddComponent(/datum/component/spawner, mob_types, spawn_time, faction, spawn_text, max_mobs) + +/obj/structure/spawner/syndicate + name = "warp beacon" + icon = 'icons/obj/device.dmi' + icon_state = "syndbeacon" + spawn_text = "warps in from" + mob_types = list(/mob/living/simple_animal/hostile/syndicate/ranged) + faction = list(ROLE_SYNDICATE) + +/obj/structure/spawner/skeleton + name = "bone pit" + desc = "A pit full of bones, and some still seem to be moving..." + icon_state = "hole" + icon = 'icons/mob/nest.dmi' + max_integrity = 150 + max_mobs = 15 + spawn_time = 150 + mob_types = list(/mob/living/simple_animal/hostile/skeleton) + spawn_text = "climbs out of" + faction = list("skeleton") + +/obj/structure/spawner/mining + name = "monster den" + desc = "A hole dug into the ground, harboring all kinds of monsters found within most caves or mining asteroids." + icon_state = "hole" + max_integrity = 200 + max_mobs = 3 + icon = 'icons/mob/nest.dmi' + spawn_text = "crawls out of" + mob_types = list(/mob/living/simple_animal/hostile/asteroid/goldgrub, /mob/living/simple_animal/hostile/asteroid/goliath, /mob/living/simple_animal/hostile/asteroid/hivelord, /mob/living/simple_animal/hostile/asteroid/basilisk, /mob/living/simple_animal/hostile/asteroid/fugu) + faction = list("mining") + +/obj/structure/spawner/mining/goldgrub + name = "goldgrub den" + desc = "A den housing a nest of goldgrubs, annoying but arguably much better than anything else you'll find in a nest." + mob_types = list(/mob/living/simple_animal/hostile/asteroid/goldgrub) + +/obj/structure/spawner/mining/goliath + name = "goliath den" + desc = "A den housing a nest of goliaths, oh god why?" + mob_types = list(/mob/living/simple_animal/hostile/asteroid/goliath) + +/obj/structure/spawner/mining/hivelord + name = "hivelord den" + desc = "A den housing a nest of hivelords." + mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord) + +/obj/structure/spawner/mining/basilisk + name = "basilisk den" + desc = "A den housing a nest of basilisks, bring a coat." + mob_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk) + +/obj/structure/spawner/mining/wumborian + name = "wumborian fugu den" + desc = "A den housing a nest of wumborian fugus, how do they all even fit in there?" + mob_types = list(/mob/living/simple_animal/hostile/asteroid/fugu) \ No newline at end of file diff --git a/code/game/turfs/simulated/floor/plating/asteroid.dm b/code/game/turfs/simulated/floor/plating/asteroid.dm index d9966ee55c..d46c2363e3 100644 --- a/code/game/turfs/simulated/floor/plating/asteroid.dm +++ b/code/game/turfs/simulated/floor/plating/asteroid.dm @@ -155,9 +155,9 @@ has_data = TRUE /turf/open/floor/plating/asteroid/airless/cave/volcanic - mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/goliath/beast/random = 50, /mob/living/simple_animal/hostile/spawner/lavaland/goliath = 3, \ - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/random = 40, /mob/living/simple_animal/hostile/spawner/lavaland = 2, \ - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/random = 30, /mob/living/simple_animal/hostile/spawner/lavaland/legion = 3, \ + mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/goliath/beast/random = 50, /obj/structure/spawner/lavaland/goliath = 3, \ + /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/random = 40, /obj/structure/spawner/lavaland = 2, \ + /mob/living/simple_animal/hostile/asteroid/hivelord/legion/random = 30, /obj/structure/spawner/lavaland/legion = 3, \ SPAWN_MEGAFAUNA = 6, /mob/living/simple_animal/hostile/asteroid/goldgrub = 10) data_having_type = /turf/open/floor/plating/asteroid/airless/cave/volcanic/has_data @@ -278,7 +278,7 @@ return //if there's a megafauna within standard view don't spawn anything at all if(ispath(randumb, /mob/living/simple_animal/hostile/asteroid) || istype(H, /mob/living/simple_animal/hostile/asteroid)) return //if the random is a standard mob, avoid spawning if there's another one within 12 tiles - if((ispath(randumb, /mob/living/simple_animal/hostile/spawner/lavaland) || istype(H, /mob/living/simple_animal/hostile/spawner/lavaland)) && get_dist(src, H) <= 2) + if((ispath(randumb, /obj/structure/spawner/lavaland) || istype(H, /obj/structure/spawner/lavaland)) && get_dist(src, H) <= 2) return //prevents tendrils spawning in each other's collapse range new randumb(T) diff --git a/code/game/turfs/simulated/lava.dm b/code/game/turfs/simulated/lava.dm index e24736ecf3..6a5a8aee3c 100644 --- a/code/game/turfs/simulated/lava.dm +++ b/code/game/turfs/simulated/lava.dm @@ -36,7 +36,7 @@ if(burn_stuff(AM)) START_PROCESSING(SSobj, src) -/turf/open/lava/hitby(atom/movable/AM) +/turf/open/lava/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) if(burn_stuff(AM)) START_PROCESSING(SSobj, src) diff --git a/code/game/turfs/simulated/wall/misc_walls.dm b/code/game/turfs/simulated/wall/misc_walls.dm index 8b63d60939..d445be91cb 100644 --- a/code/game/turfs/simulated/wall/misc_walls.dm +++ b/code/game/turfs/simulated/wall/misc_walls.dm @@ -25,7 +25,7 @@ if(stored_pulling) stored_pulling.setDir(get_dir(stored_pulling.loc, newloc)) stored_pulling.forceMove(src) - H.start_pulling(stored_pulling, TRUE) + H.start_pulling(stored_pulling, supress_message = TRUE) /turf/closed/wall/mineral/cult/ratvar_act() . = ..() diff --git a/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm b/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm index 3ad6684725..a004714e5e 100644 --- a/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm +++ b/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm @@ -45,10 +45,10 @@ bonus_damage *= 3 //total 30 damage on cultists, 50 with ratvar GLOB.clockwork_vitality += target.adjustFireLoss(bonus_damage) //adds the damage done to existing vitality -/obj/item/clockwork/weapon/ratvarian_spear/throw_impact(atom/target) - var/turf/T = get_turf(target) - if(isliving(target)) - var/mob/living/L = target +/obj/item/clockwork/weapon/ratvarian_spear/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + var/turf/T = get_turf(hit_atom) + if(isliving(hit_atom)) + var/mob/living/L = hit_atom if(is_servant_of_ratvar(L)) if(L.put_in_active_hand(src)) L.visible_message("[L] catches [src] out of the air!") diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index 10759afcd0..445e4c9302 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -264,7 +264,7 @@ to_chat(user, "The bola seems to take on a life of its own!") throw_impact(user) -/obj/item/restraints/legcuffs/bola/cult/throw_impact(atom/hit_atom) +/obj/item/restraints/legcuffs/bola/cult/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(iscultist(hit_atom)) return . = ..() @@ -689,10 +689,10 @@ /obj/item/twohanded/cult_spear/update_icon() icon_state = "bloodspear[wielded]" -/obj/item/twohanded/cult_spear/throw_impact(atom/target) - var/turf/T = get_turf(target) - if(isliving(target)) - var/mob/living/L = target +/obj/item/twohanded/cult_spear/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + var/turf/T = get_turf(hit_atom) + if(isliving(hit_atom)) + var/mob/living/L = hit_atom if(iscultist(L)) playsound(src, 'sound/weapons/throwtap.ogg', 50) if(L.put_in_active_hand(src)) @@ -983,11 +983,11 @@ return TRUE return FALSE -/obj/item/shield/mirror/throw_impact(atom/target, throwingdatum) - var/turf/T = get_turf(target) +/obj/item/shield/mirror/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + var/turf/T = get_turf(hit_atom) var/datum/thrownthing/D = throwingdatum - if(isliving(target)) - var/mob/living/L = target + if(isliving(hit_atom)) + var/mob/living/L = hit_atom if(iscultist(L)) playsound(src, 'sound/weapons/throwtap.ogg', 50) if(L.put_in_active_hand(src)) diff --git a/code/modules/antagonists/revenant/revenant.dm b/code/modules/antagonists/revenant/revenant.dm index f380fa68e9..66eab69f39 100644 --- a/code/modules/antagonists/revenant/revenant.dm +++ b/code/modules/antagonists/revenant/revenant.dm @@ -43,7 +43,7 @@ wander = FALSE density = FALSE movement_type = FLYING - anchored = TRUE + move_resist = MOVE_FORCE_OVERPOWERING mob_size = MOB_SIZE_TINY pass_flags = PASSTABLE | PASSGRILLE | PASSMOB speed = 1 @@ -360,7 +360,7 @@ user.dropItemToGround(src) scatter() -/obj/item/ectoplasm/revenant/throw_impact(atom/hit_atom) +/obj/item/ectoplasm/revenant/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) ..() if(inert) return diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 07f31a6678..e9855bce46 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -142,7 +142,7 @@ . = ..() olddir = dir -/obj/item/assembly/infra/throw_impact() +/obj/item/assembly/infra/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) . = ..() if(!olddir) return diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index a2a9fb0105..9889a9e2c6 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -130,10 +130,10 @@ return FALSE -/obj/item/assembly/mousetrap/hitby(A as mob|obj) +/obj/item/assembly/mousetrap/hitby(atom/hit_atom, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) if(!armed) return ..() - visible_message("[src] is triggered by [A].") + visible_message("[src] is triggered by [hit_atom].") triggered(null) diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index ea555c9489..3967fc39b5 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -266,12 +266,13 @@ /atom/movable/proc/experience_pressure_difference(pressure_difference, direction, pressure_resistance_prob_delta = 0) var/const/PROBABILITY_OFFSET = 25 var/const/PROBABILITY_BASE_PRECENT = 75 + var/max_force = sqrt(pressure_difference)*(MOVE_FORCE_DEFAULT / 5) set waitfor = 0 var/move_prob = 100 if (pressure_resistance > 0) move_prob = (pressure_difference/pressure_resistance*PROBABILITY_BASE_PRECENT)-PROBABILITY_OFFSET move_prob += pressure_resistance_prob_delta - if (move_prob > PROBABILITY_OFFSET && prob(move_prob)) + if (move_prob > PROBABILITY_OFFSET && prob(move_prob) && (move_resist != INFINITY) && (!anchored && (max_force >= (move_resist * MOVE_FORCE_PUSH_RATIO))) || (anchored && (max_force >= (move_resist * MOVE_FORCE_FORCEPUSH_RATIO)))) step(src, direction) last_high_pressure_movement_air_cycle = SSair.times_fired diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index 7d095869cb..c9b5eab18e 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -14,6 +14,7 @@ Pipelines + Other Objects -> Pipe network /obj/machinery/atmospherics anchored = TRUE + move_resist = INFINITY //Moving a connected machine without actually doing the normal (dis)connection things will probably cause a LOT of issues. idle_power_usage = 0 active_power_usage = 0 power_channel = ENVIRON diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm index e041d566e9..27ca16fd3c 100644 --- a/code/modules/events/immovable_rod.dm +++ b/code/modules/events/immovable_rod.dm @@ -43,6 +43,9 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 icon = 'icons/obj/objects.dmi' icon_state = "immrod" throwforce = 100 + move_force = INFINITY + move_resist = INFINITY + pull_force = INFINITY density = TRUE anchored = TRUE var/mob/living/wizard diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index bac2e0bb65..b9f355a8cc 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -213,9 +213,9 @@ GLOBAL_LIST_INIT(hallucination_list, list( . = ..() name = "alien hunter ([rand(1, 1000)])" -/obj/effect/hallucination/simple/xeno/throw_impact(A) +/obj/effect/hallucination/simple/xeno/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) update_icon("alienh_pounce") - if(A == target && target.stat!=DEAD) + if(hit_atom == target && target.stat!=DEAD) target.Knockdown(100) target.visible_message("[target] flails around wildly.","[name] pounces on you!") diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index 7b1d8be85e..40489eba9b 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -101,10 +101,10 @@ to_chat(user, "You heat [name] with [I]!") ..() -/obj/item/reagent_containers/food/drinks/throw_impact(atom/target, datum/thrownthing/throwinfo) +/obj/item/reagent_containers/food/drinks/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) . = ..() if(!.) //if the bottle wasn't caught - smash(target, throwinfo.thrower, TRUE) + smash(hit_atom, throwingdatum?.thrower, TRUE) /obj/item/reagent_containers/food/drinks/proc/smash(atom/target, mob/thrower, ranged = FALSE) if(!isGlass) diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index e72b624ae5..16878bcf75 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -442,7 +442,7 @@ isGlass = FALSE return -/obj/item/reagent_containers/food/drinks/bottle/molotov/throw_impact(atom/target,datum/thrownthing/throwdata) +/obj/item/reagent_containers/food/drinks/bottle/molotov/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) var/firestarter = 0 for(var/datum/reagent/R in reagents.reagent_list) for(var/A in accelerants) @@ -450,8 +450,8 @@ firestarter = 1 break if(firestarter && active) - target.fire_act() - new /obj/effect/hotspot(get_turf(target)) + hit_atom.fire_act() + new /obj/effect/hotspot(get_turf(hit_atom)) ..() /obj/item/reagent_containers/food/drinks/bottle/molotov/attackby(obj/item/I, mob/user, params) diff --git a/code/modules/food_and_drinks/food/snacks_egg.dm b/code/modules/food_and_drinks/food/snacks_egg.dm index 510783479e..fdc02c96e4 100644 --- a/code/modules/food_and_drinks/food/snacks_egg.dm +++ b/code/modules/food_and_drinks/food/snacks_egg.dm @@ -31,7 +31,7 @@ var/color = mix_color_from_reagents(reagents.reagent_list) add_atom_colour(color, FIXED_COLOUR_PRIORITY) -/obj/item/reagent_containers/food/snacks/egg/throw_impact(atom/hit_atom) +/obj/item/reagent_containers/food/snacks/egg/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!..()) //was it caught by a mob? var/turf/T = get_turf(hit_atom) new/obj/effect/decal/cleanable/egg_smudge(T) diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm index ad0824dd79..3a60e991a9 100644 --- a/code/modules/food_and_drinks/food/snacks_other.dm +++ b/code/modules/food_and_drinks/food/snacks_other.dm @@ -439,8 +439,8 @@ head.color = C add_overlay(head) -/obj/item/reagent_containers/food/snacks/lollipop/throw_impact(atom/A) - ..(A) +/obj/item/reagent_containers/food/snacks/lollipop/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + ..(hit_atom) throw_speed = 1 throwforce = 0 diff --git a/code/modules/food_and_drinks/food/snacks_pie.dm b/code/modules/food_and_drinks/food/snacks_pie.dm index bc66d353e1..f32ebbb3a0 100644 --- a/code/modules/food_and_drinks/food/snacks_pie.dm +++ b/code/modules/food_and_drinks/food/snacks_pie.dm @@ -29,7 +29,7 @@ foodtype = GRAIN | DAIRY | SUGAR var/stunning = TRUE -/obj/item/reagent_containers/food/snacks/pie/cream/throw_impact(atom/hit_atom) +/obj/item/reagent_containers/food/snacks/pie/cream/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) . = ..() if(!.) //if we're not being caught splat(hit_atom) diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm index d608a73560..58f7985291 100644 --- a/code/modules/food_and_drinks/pizzabox.dm +++ b/code/modules/food_and_drinks/pizzabox.dm @@ -231,7 +231,7 @@ if(boxes.len >= 3 && prob(25 * boxes.len)) disperse_pizzas() -/obj/item/pizzabox/throw_impact(atom/movable/AM) +/obj/item/pizzabox/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(boxes.len >= 2 && prob(20 * boxes.len)) disperse_pizzas() diff --git a/code/modules/holiday/halloween/jacqueen.dm b/code/modules/holiday/halloween/jacqueen.dm index b2f69df2e4..b033755650 100644 --- a/code/modules/holiday/halloween/jacqueen.dm +++ b/code/modules/holiday/halloween/jacqueen.dm @@ -422,7 +422,7 @@ reagents.add_reagent(R, 30) name = "[R] Potion" -/obj/item/reagent_containers/potion_container/throw_impact(atom/target) +/obj/item/reagent_containers/potion_container/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) ..() sleep(20) var/datum/effect_system/smoke_spread/chem/s = new() diff --git a/code/modules/holodeck/items.dm b/code/modules/holodeck/items.dm index 5c143f7a25..54c940dfbc 100644 --- a/code/modules/holodeck/items.dm +++ b/code/modules/holodeck/items.dm @@ -80,7 +80,7 @@ item_state = "dodgeball" desc = "Used for playing the most violent and degrading of childhood games." -/obj/item/toy/beach_ball/holoball/dodgeball/throw_impact(atom/hit_atom) +/obj/item/toy/beach_ball/holoball/dodgeball/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) ..() if((ishuman(hit_atom))) var/mob/living/carbon/M = hit_atom @@ -123,7 +123,7 @@ else ..() -/obj/structure/holohoop/hitby(atom/movable/AM) +/obj/structure/holohoop/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) if (isitem(AM) && !istype(AM,/obj/item/projectile)) if(prob(50)) AM.forceMove(get_turf(src)) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 096c7b5b2b..5cc7fcc57a 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -91,7 +91,7 @@ squash(user) ..() -/obj/item/reagent_containers/food/snacks/grown/throw_impact(atom/hit_atom) +/obj/item/reagent_containers/food/snacks/grown/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!..()) //was it caught by a mob? if(seed) for(var/datum/plant_gene/trait/T in seed.genes) diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm index c0e3beaf79..3ef6c1472f 100644 --- a/code/modules/hydroponics/growninedible.dm +++ b/code/modules/hydroponics/growninedible.dm @@ -48,7 +48,7 @@ return 1 return 0 -/obj/item/grown/throw_impact(atom/hit_atom) +/obj/item/grown/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!..()) //was it caught by a mob? if(seed) for(var/datum/plant_gene/trait/T in seed.genes) diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm index f97d3612a8..af8860c02b 100644 --- a/code/modules/mining/fulton.dm +++ b/code/modules/mining/fulton.dm @@ -11,6 +11,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) var/uses_left = 3 var/can_use_indoors var/safe_for_living_creatures = 1 + var/max_force_fulton = MOVE_FORCE_STRONG /obj/item/extraction_pack/examine() . = ..() @@ -57,7 +58,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) return if(!isturf(A.loc)) // no extracting stuff inside other stuff return - if(A.anchored) + if(A.anchored || (A.move_resist > max_force_fulton)) return to_chat(user, "You start attaching the pack to [A]...") if(do_after(user,50,target=A)) diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 69361e8685..1ce735b0b8 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -99,7 +99,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ recipes = GLOB.sand_recipes . = ..() -/obj/item/stack/ore/glass/throw_impact(atom/hit_atom) +/obj/item/stack/ore/glass/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(..() || !ishuman(hit_atom)) return var/mob/living/carbon/human/C = hit_atom diff --git a/code/modules/mob/camera/camera.dm b/code/modules/mob/camera/camera.dm index ee89167f29..dffaf9e4e7 100644 --- a/code/modules/mob/camera/camera.dm +++ b/code/modules/mob/camera/camera.dm @@ -3,7 +3,8 @@ /mob/camera name = "camera mob" density = FALSE - anchored = TRUE + move_force = INFINITY + move_resist = INFINITY status_flags = GODMODE // You can't damage it. mouse_opacity = MOUSE_OPACITY_TRANSPARENT see_in_dark = 7 diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm index 35dbe0828f..213a6fd6db 100644 --- a/code/modules/mob/dead/dead.dm +++ b/code/modules/mob/dead/dead.dm @@ -4,6 +4,7 @@ INITIALIZE_IMMEDIATE(/mob/dead) /mob/dead sight = SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF + move_resist = INFINITY throwforce = 0 /mob/dead/Initialize() diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 591fc650b4..54c09184a3 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -12,8 +12,6 @@ stat = DEAD canmove = FALSE - anchored = TRUE // don't get pushed around - var/mob/living/new_character //for instant transfer once the round is set up //Used to make sure someone doesn't get spammed with messages if they're ineligible for roles @@ -151,7 +149,7 @@ message_admins(msg) to_chat(usr, "The round is either not ready, or has already finished...") return - + if(!GLOB.enter_allowed) to_chat(usr, "There is an administrative lock on entering the game!") return diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index d599d55886..e6a57f3180 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -12,7 +12,6 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) stat = DEAD density = FALSE canmove = 0 - anchored = TRUE // don't get pushed around see_invisible = SEE_INVISIBLE_OBSERVER see_in_dark = 100 invisibility = INVISIBILITY_OBSERVER @@ -619,10 +618,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp to_chat(src, "This creature is too powerful for you to possess!") return 0 - if(istype (target, /mob/living/simple_animal/hostile/spawner)) - to_chat(src, "This isn't really a creature, now is it!") - return 0 - if(!can_reenter_round) to_chat(src, "You are unable to re-enter the round.") return FALSE diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm index b9e27c0637..daffca106f 100644 --- a/code/modules/mob/living/carbon/alien/alien_defense.dm +++ b/code/modules/mob/living/carbon/alien/alien_defense.dm @@ -5,7 +5,7 @@ /mob/living/carbon/alien/get_ear_protection() return 2 //no ears -/mob/living/carbon/alien/hitby(atom/movable/AM, skipcatch, hitpush) +/mob/living/carbon/alien/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) ..(AM, skipcatch = TRUE, hitpush = FALSE) diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm index fe682b5c99..c75718e65c 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm @@ -54,18 +54,18 @@ weather_immunities -= "lava" update_icons() -/mob/living/carbon/alien/humanoid/hunter/throw_impact(atom/A) +/mob/living/carbon/alien/humanoid/hunter/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!leaping) return ..() pounce_cooldown = world.time + pounce_cooldown_time - if(A) - if(isliving(A)) - var/mob/living/L = A + if(hit_atom) + if(isliving(hit_atom)) + var/mob/living/L = hit_atom var/blocked = FALSE - if(ishuman(A)) - var/mob/living/carbon/human/H = A + if(ishuman(hit_atom)) + var/mob/living/carbon/human/H = hit_atom if(H.check_shields(src, 0, "the [name]", attack_type = LEAP_ATTACK)) blocked = TRUE if(!blocked) @@ -77,8 +77,8 @@ Knockdown(40, 1, 1) toggle_leap(0) - else if(A.density && !A.CanPass(src)) - visible_message("[src] smashes into [A]!", "[src] smashes into [A]!") + else if(hit_atom.density && !hit_atom.CanPass(src)) + visible_message("[src] smashes into [hit_atom]!", "[src] smashes into [hit_atom]!") Knockdown(40, 1, 1) if(leaping) diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index e1e079cbae..3b150a2264 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -57,7 +57,7 @@ /mob/living/carbon/alien/larva/toggle_throw_mode() return -/mob/living/carbon/alien/larva/start_pulling() +/mob/living/carbon/alien/larva/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE) return /mob/living/carbon/alien/larva/stripPanelUnequip(obj/item/what, mob/who) diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index e66d70f492..6b04233464 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -115,7 +115,7 @@ if(icon_state == "[initial(icon_state)]_thrown") icon_state = "[initial(icon_state)]" -/obj/item/clothing/mask/facehugger/throw_impact(atom/hit_atom) +/obj/item/clothing/mask/facehugger/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) ..() if(stat == CONSCIOUS) icon_state = "[initial(icon_state)]" diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 263edf42c2..a81545fbe5 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -94,15 +94,13 @@ return 1 return ..() -/mob/living/carbon/throw_impact(atom/hit_atom, throwingdatum) +/mob/living/carbon/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) . = ..() var/hurt = TRUE - if(istype(throwingdatum, /datum/thrownthing)) - var/datum/thrownthing/D = throwingdatum - if(iscyborg(D.thrower)) - var/mob/living/silicon/robot/R = D.thrower - if(!R.emagged) - hurt = FALSE + if(throwingdatum?.thrower && iscyborg(throwingdatum.thrower)) + var/mob/living/silicon/robot/R = throwingdatum.thrower + if(!R.emagged) + hurt = FALSE if(hit_atom.density && isturf(hit_atom)) if(hurt) Knockdown(20) @@ -160,7 +158,7 @@ //END OF CIT CHANGES var/atom/movable/thrown_thing - var/obj/item/I = src.get_active_held_item() + var/obj/item/I = get_active_held_item() if(!I) if(pulling && isliving(pulling) && grab_state >= GRAB_AGGRESSIVE) @@ -188,11 +186,11 @@ if(thrown_thing) visible_message("[src] has thrown [thrown_thing].") - src.log_message("has thrown [thrown_thing]", LOG_ATTACK) + log_message("has thrown [thrown_thing]", LOG_ATTACK) do_attack_animation(target, no_effect = 1) playsound(loc, 'sound/weapons/punchmiss.ogg', 50, 1, -1) newtonian_move(get_dir(target, src)) - thrown_thing.throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed, src) + thrown_thing.safe_throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed, src, null, null, null, move_force) /mob/living/carbon/restrained(ignore_grab) . = (handcuffed || (!ignore_grab && pulledby && pulledby.grab_state >= GRAB_AGGRESSIVE)) @@ -448,7 +446,7 @@ I.throw_at(target,I.throw_range,I.throw_speed,src) if(61 to 90) //throw it down to the floor var/turf/target = get_turf(loc) - I.throw_at(target,I.throw_range,I.throw_speed,src) + I.safe_throw_at(target,I.throw_range,I.throw_speed,src, force = move_force) /mob/living/carbon/Stat() ..() diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index bc64c8303b..626923a003 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -58,7 +58,7 @@ return return TRUE -/mob/living/carbon/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked = FALSE) +/mob/living/carbon/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) if(!skipcatch) //ugly, but easy if(can_catch_item()) if(istype(AM, /obj/item)) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index a44779e05e..3333459dca 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -124,7 +124,7 @@ return TRUE return FALSE -/mob/living/carbon/human/hitby(atom/movable/AM, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE) +/mob/living/carbon/human/hitby(atom/movable/AM, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) if(dna && dna.species) var/spec_return = dna.species.spec_hitby(AM, src) if(spec_return) diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm index 25bc243f07..180c638448 100644 --- a/code/modules/mob/living/carbon/monkey/combat.dm +++ b/code/modules/mob/living/carbon/monkey/combat.dm @@ -384,7 +384,7 @@ retaliate(Proj.firer) ..() -/mob/living/carbon/monkey/hitby(atom/movable/AM, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE) +/mob/living/carbon/monkey/hitby(atom/movable/AM, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) if(istype(AM, /obj/item)) var/obj/item/I = AM if(I.throwforce < src.health && I.thrownby && ishuman(I.thrownby)) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 812733ebe2..5afd2adace 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -59,7 +59,7 @@ return if(ismovableatom(A)) var/atom/movable/AM = A - if(PushAM(AM)) + if(PushAM(AM, move_force)) return /mob/living/Bumped(atom/movable/AM) @@ -202,33 +202,43 @@ return //Called when we want to push an atom/movable -/mob/living/proc/PushAM(atom/movable/AM) +/mob/living/proc/PushAM(atom/movable/AM, force = move_force) if(now_pushing) - return 1 + return TRUE if(moving_diagonally)// no pushing during diagonal moves. - return 1 + return TRUE if(!client && (mob_size < MOB_SIZE_SMALL)) return - if(!AM.anchored) - now_pushing = 1 - var/t = get_dir(src, AM) - if (istype(AM, /obj/structure/window)) - var/obj/structure/window/W = AM - if(W.fulltile) - for(var/obj/structure/window/win in get_step(W,t)) - now_pushing = 0 - return - if(pulling == AM) - stop_pulling() - var/current_dir - if(isliving(AM)) - current_dir = AM.dir - step(AM, t) - if(current_dir) - AM.setDir(current_dir) - now_pushing = 0 + now_pushing = TRUE + var/t = get_dir(src, AM) + var/push_anchored = FALSE + if((AM.move_resist * MOVE_FORCE_CRUSH_RATIO) <= force) + if(move_crush(AM, move_force, t)) + push_anchored = TRUE + if((AM.move_resist * MOVE_FORCE_FORCEPUSH_RATIO) <= force) //trigger move_crush and/or force_push regardless of if we can push it normally + if(force_push(AM, move_force, t, push_anchored)) + push_anchored = TRUE + if((AM.anchored && !push_anchored) || (force < (AM.move_resist * MOVE_FORCE_PUSH_RATIO))) + now_pushing = FALSE + return + if (istype(AM, /obj/structure/window)) + var/obj/structure/window/W = AM + if(W.fulltile) + for(var/obj/structure/window/win in get_step(W,t)) + now_pushing = FALSE + return + if(pulling == AM) + stop_pulling() + var/current_dir + if(isliving(AM)) + current_dir = AM.dir + if(step(AM, t)) + step(src, t) + if(current_dir) + AM.setDir(current_dir) + now_pushing = FALSE -/mob/living/start_pulling(atom/movable/AM, supress_message = 0) +/mob/living/start_pulling(atom/movable/AM, state, force = pull_force, supress_message = FALSE) if(!AM || !src) return FALSE if(!(AM.can_be_pulled(src))) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 9d04f288cd..fe35f1bf57 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -55,7 +55,7 @@ else return 0 -/mob/living/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked = FALSE) +/mob/living/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) if(istype(AM, /obj/item)) var/obj/item/I = AM var/zone = ran_zone(BODY_ZONE_CHEST, 65)//Hits a random part of the body, geared towards the chest @@ -120,7 +120,7 @@ adjust_fire_stacks(3) IgniteMob() -/mob/living/proc/grabbedby(mob/living/carbon/user, supress_message = 0) +/mob/living/proc/grabbedby(mob/living/carbon/user, supress_message = FALSE) if(user == anchored || !isturf(user.loc)) return FALSE @@ -146,7 +146,7 @@ return FALSE if(!user.pulling || user.pulling != src) - user.start_pulling(src, supress_message) + user.start_pulling(src, supress_message = supress_message) return if(!(status_flags & CANPUSH) || HAS_TRAIT(src, TRAIT_PUSHIMMUNE)) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 1b1eb1a805..551d9f4a99 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -16,7 +16,7 @@ name = "AI" icon = 'icons/mob/ai.dmi' icon_state = "ai" - anchored = TRUE + move_resist = MOVE_FORCE_VERY_STRONG density = TRUE canmove = FALSE status_flags = CANSTUN|CANPUSH @@ -318,9 +318,14 @@ return // stop if(incapacitated()) return - anchored = !anchored // Toggles the anchor + var/is_anchored = FALSE + if(move_resist == MOVE_FORCE_VERY_STRONG) + move_resist = MOVE_FORCE_VERY_STRONG + else + is_anchored = TRUE + move_resist = MOVE_FORCE_NORMAL - to_chat(src, "You are now [anchored ? "" : "un"]anchored.") + to_chat(src, "You are now [is_anchored ? "" : "un"]anchored.") // the message in the [] will change depending whether or not the AI is anchored /mob/living/silicon/ai/update_canmove() //If the AI dies, mobs won't go through it anymore diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm index 301d2bd218..319d94611b 100644 --- a/code/modules/mob/living/silicon/ai/death.dm +++ b/code/modules/mob/living/silicon/ai/death.dm @@ -14,7 +14,7 @@ cameraFollow = null - anchored = FALSE //unbolt floorbolts + move_resist = MOVE_FORCE_NORMAL update_canmove() if(eyeobj) eyeobj.setLoc(get_turf(src)) diff --git a/code/modules/mob/living/silicon/pai/pai_shell.dm b/code/modules/mob/living/silicon/pai/pai_shell.dm index 164a3e7389..ecb80961cb 100644 --- a/code/modules/mob/living/silicon/pai/pai_shell.dm +++ b/code/modules/mob/living/silicon/pai/pai_shell.dm @@ -99,7 +99,7 @@ if(loc != card) visible_message("[src] [rest? "lays down for a moment..." : "perks up from the ground"]") -/mob/living/silicon/pai/start_pulling(atom/movable/AM) +/mob/living/silicon/pai/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE) return FALSE /mob/living/silicon/pai/proc/toggle_integrated_light() diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm index 1c19cd82a1..62667c0e58 100644 --- a/code/modules/mob/living/simple_animal/bot/honkbot.dm +++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm @@ -155,7 +155,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]"}, bike_horn(A) -/mob/living/simple_animal/bot/honkbot/hitby(atom/movable/AM, skipcatch = 0, hitpush = 1, blocked = 0) +/mob/living/simple_animal/bot/honkbot/hitby(atom/movable/AM, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) if(istype(AM, /obj/item)) playsound(src, honksound, 50, TRUE, -1) var/obj/item/I = AM diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 1bc7493684..66bfd64a7d 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -13,8 +13,8 @@ desc = "A Multiple Utility Load Effector bot." icon_state = "mulebot0" density = TRUE - anchored = TRUE - animate_movement=1 + move_resist = MOVE_FORCE_STRONG + animate_movement = 1 health = 50 maxHealth = 50 damage_coeff = list(BRUTE = 0.5, BURN = 0.7, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index f22139ac22..fe02339403 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -221,7 +221,7 @@ Auto Patrol: []"}, ..() -/mob/living/simple_animal/bot/secbot/hitby(atom/movable/AM, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE) +/mob/living/simple_animal/bot/secbot/hitby(atom/movable/AM, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) if(istype(AM, /obj/item)) var/obj/item/I = AM if(I.throwforce < src.health && I.thrownby && ishuman(I.thrownby)) diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 3cc8822d02..ea7f5fe5ae 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -338,7 +338,7 @@ stored_pulling.forceMove(loc) forceMove(AM) if(stored_pulling) - start_pulling(stored_pulling, TRUE) //drag anything we're pulling through the wall with us by magic + start_pulling(stored_pulling, supress_message = TRUE) //drag anything we're pulling through the wall with us by magic /mob/living/simple_animal/hostile/construct/harvester/AttackingTarget() if(iscarbon(target)) diff --git a/code/modules/mob/living/simple_animal/guardian/types/charger.dm b/code/modules/mob/living/simple_animal/guardian/types/charger.dm index 3ece5d4e27..184da11d02 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/charger.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/charger.dm @@ -44,18 +44,18 @@ if(!charging) ..() -/mob/living/simple_animal/hostile/guardian/charger/throw_impact(atom/A) +/mob/living/simple_animal/hostile/guardian/charger/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!charging) return ..() - else if(A) - if(isliving(A) && A != summoner) - var/mob/living/L = A + else if(hit_atom) + if(isliving(hit_atom) && hit_atom != summoner) + var/mob/living/L = hit_atom var/blocked = FALSE - if(hasmatchingsummoner(A)) //if the summoner matches don't hurt them + if(hasmatchingsummoner(hit_atom)) //if the summoner matches don't hurt them blocked = TRUE - if(ishuman(A)) - var/mob/living/carbon/human/H = A + if(ishuman(hit_atom)) + var/mob/living/carbon/human/H = hit_atom if(H.check_shields(src, 90, "[name]", attack_type = THROWN_PROJECTILE_ATTACK)) blocked = TRUE if(!blocked) 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 d1e8f1f49e..72ae49eb0d 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm @@ -249,7 +249,7 @@ /mob/living/simple_animal/hostile/jungle/leaper/Goto() return -/mob/living/simple_animal/hostile/jungle/leaper/throw_impact() +/mob/living/simple_animal/hostile/jungle/leaper/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) return /mob/living/simple_animal/hostile/jungle/leaper/update_icons() 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 29f48c7295..b786637592 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm @@ -147,7 +147,7 @@ update_icons() Goto(target, move_to_delay, minimum_distance) -/mob/living/simple_animal/hostile/jungle/mook/throw_impact(atom/hit_atom, throwingdatum) +/mob/living/simple_animal/hostile/jungle/mook/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) . = ..() if(isliving(hit_atom) && attack_state == MOOK_ATTACK_ACTIVE) var/mob/living/L = hit_atom 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 1a894734d8..8a1cfb7125 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm @@ -29,7 +29,7 @@ projectilesound = 'sound/weapons/pierce.ogg' robust_searching = TRUE stat_attack = UNCONSCIOUS - anchored = TRUE + move_resist = MOVE_FORCE_EXTREMELY_STRONG var/combatant_state = SEEDLING_STATE_NEUTRAL var/obj/seedling_weakpoint/weak_point var/mob/living/beam_debuff_target 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 45745bd84e..83abde2fca 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -158,12 +158,12 @@ Difficulty: Hard DestroySurroundings() ..() -/mob/living/simple_animal/hostile/megafauna/bubblegum/throw_impact(atom/A) +/mob/living/simple_animal/hostile/megafauna/bubblegum/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!charging) return ..() - else if(isliving(A)) - var/mob/living/L = A + else if(isliving(hit_atom)) + var/mob/living/L = hit_atom L.visible_message("[src] slams into [L]!", "[src] slams into you!") L.apply_damage(40, BRUTE) playsound(get_turf(L), 'sound/effects/meteorimpact.ogg', 100, 1) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index d62f59cdd7..2ac8dd80c0 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -21,7 +21,9 @@ maxbodytemp = INFINITY vision_range = 4 aggro_vision_range = 15 - anchored = TRUE + move_force = MOVE_FORCE_OVERPOWERING + move_resist = MOVE_FORCE_OVERPOWERING + pull_force = MOVE_FORCE_OVERPOWERING mob_size = MOB_SIZE_LARGE layer = LARGE_MOB_LAYER //Looks weird with them slipping under mineral walls and cameras and shit otherwise mouse_opacity = MOUSE_OPACITY_OPAQUE // Easier to click on in melee, they're giant targets anyway 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 786d7a9775..c7d90f9556 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm @@ -54,7 +54,6 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa weather_immunities = list("lava","ash") stop_automated_movement = TRUE wander = FALSE - anchored = TRUE layer = BELOW_MOB_LAYER AIStatus = AI_OFF var/swarmer_spawn_cooldown = 0 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 15f2a0a834..c17e98a7db 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 @@ -27,7 +27,9 @@ throw_message = "does nothing to the rocky hide of the" vision_range = 4 aggro_vision_range = 7 - anchored = TRUE //Stays anchored until death as to be unpullable + move_force = MOVE_FORCE_VERY_STRONG + move_resist = MOVE_FORCE_VERY_STRONG + pull_force = MOVE_FORCE_VERY_STRONG var/pre_attack = 0 var/pre_attack_icon = "Goliath_preattack" loot = list(/obj/item/stack/sheet/animalhide/goliath_hide) @@ -51,7 +53,9 @@ . = 1 /mob/living/simple_animal/hostile/asteroid/goliath/death(gibbed) - anchored = FALSE + move_force = MOVE_FORCE_DEFAULT + move_resist = MOVE_RESIST_DEFAULT + pull_force = PULL_FORCE_DEFAULT ..(gibbed) /mob/living/simple_animal/hostile/asteroid/goliath/OpenFire() 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 82f85766c2..9e398ce0da 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 @@ -217,7 +217,7 @@ can_infest_dead = TRUE //Legion that spawns Legions -/mob/living/simple_animal/hostile/spawner/legion +/mob/living/simple_animal/hostile/big_legion name = "legion" desc = "One of many." icon = 'icons/mob/lavaland/64x64megafauna.dmi' @@ -226,10 +226,6 @@ icon_dead = "legion" health = 450 maxHealth = 450 - max_mobs = 3 - spawn_time = 200 - spawn_text = "peels itself off from" - mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion) melee_damage_lower = 20 melee_damage_upper = 20 anchored = FALSE @@ -252,6 +248,10 @@ see_in_dark = 8 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE +/mob/living/simple_animal/hostile/big_legion/Initialize() + .=..() + AddComponent(/datum/component/spawner, list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion), 200, faction, "peels itself off from", 3) + //Tendril-spawned Legion remains, the charred skeletons of those whose bodies sank into laval or fell into chasms. /obj/effect/mob_spawn/human/corpse/charredskeleton name = "charred skeletal remains" diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm index 05dec578bd..c040931979 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm @@ -45,7 +45,7 @@ visible_message("[P] has a reduced effect on [src]!") ..() -/mob/living/simple_animal/hostile/asteroid/hitby(atom/movable/AM)//No floor tiling them to death, wiseguy +/mob/living/simple_animal/hostile/asteroid/hitby(atom/movable/AM, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum)//No floor tiling them to death, wiseguy if(istype(AM, /obj/item)) var/obj/item/T = AM if(!stat) diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm index dbaa8ab5fa..67a2282abc 100644 --- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm +++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm @@ -170,7 +170,7 @@ if(M.a_intent == INTENT_HARM) Bruise() -/mob/living/simple_animal/hostile/mushroom/hitby(atom/movable/AM) +/mob/living/simple_animal/hostile/mushroom/hitby(atom/movable/AM, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) ..() if(istype(AM, /obj/item)) var/obj/item/T = AM diff --git a/code/modules/mob/living/simple_animal/hostile/netherworld.dm b/code/modules/mob/living/simple_animal/hostile/netherworld.dm index 8210fd6490..d144ad272b 100644 --- a/code/modules/mob/living/simple_animal/hostile/netherworld.dm +++ b/code/modules/mob/living/simple_animal/hostile/netherworld.dm @@ -65,33 +65,30 @@ attacktext = "punches" deathmessage = "falls apart into a fine dust." -/mob/living/simple_animal/hostile/spawner/nether +/obj/structure/spawner/nether name = "netherworld link" desc = "A direct link to another dimension full of creatures not very happy to see you. Entering the link would be a very bad idea." icon_state = "nether" - icon_living = "nether" - health = 50 - maxHealth = 50 + max_integrity = 50 spawn_time = 600 //1 minute max_mobs = 15 - mob_biotypes = list(MOB_INORGANIC) icon = 'icons/mob/nest.dmi' spawn_text = "crawls through" mob_types = list(/mob/living/simple_animal/hostile/netherworld/migo, /mob/living/simple_animal/hostile/netherworld, /mob/living/simple_animal/hostile/netherworld/blankbody) - 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) faction = list("nether") - deathmessage = "shatters into oblivion." - del_on_death = TRUE -/mob/living/simple_animal/hostile/spawner/nether/attack_hand(mob/user) +/obj/structure/spawner/nether/Initialize() + .=..() + START_PROCESSING(SSprocessing, src) + +/obj/structure/spawner/nether/attack_hand(mob/user) user.visible_message("[user] is violently pulled into the link!", \ "Touching the portal, you are quickly pulled through into a world of unimaginable horror!") contents.Add(user) -/mob/living/simple_animal/hostile/spawner/nether/Life() - ..() - var/list/C = src.get_contents() - for(var/mob/living/M in C) + +/obj/structure/spawner/nether/process() + for(var/mob/living/M in contents) if(M) playsound(src, 'sound/magic/demon_consume.ogg', 50, 1) M.adjustBruteLoss(60) diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index 804989e71e..f38d77cd90 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -43,7 +43,10 @@ search_objects = 1 // So that it can see through walls sight = SEE_SELF|SEE_MOBS|SEE_OBJS|SEE_TURFS - anchored = TRUE + + move_force = MOVE_FORCE_EXTREMELY_STRONG + move_resist = MOVE_FORCE_EXTREMELY_STRONG + pull_force = MOVE_FORCE_EXTREMELY_STRONG var/cannot_be_seen = 1 var/mob/living/creator = null diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 1f81899d8a..3f72022d24 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -65,7 +65,7 @@ var/buffed = 0 //In the event that you want to have a buffing effect on the mob, but don't want it to stack with other effects, any outside force that applies a buff to a simple mob should at least set this to 1, so we have something to check against var/gold_core_spawnable = NO_SPAWN //If the mob can be spawned with a gold slime core. HOSTILE_SPAWN are spawned with plasma, FRIENDLY_SPAWN are spawned with blood - var/mob/living/simple_animal/hostile/spawner/nest + var/datum/component/spawner/nest var/sentience_type = SENTIENCE_ORGANIC // Sentience type, for slime potions diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index 2001c61e12..655933a0bd 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -61,7 +61,7 @@ var/mood = "" // To show its face var/mutator_used = FALSE //So you can't shove a dozen mutators into a single slime var/force_stasis = FALSE - + do_footstep = TRUE var/static/regex/slime_name_regex = new("\\w+ (baby|adult) slime \\(\\d+\\)") @@ -245,7 +245,7 @@ /mob/living/simple_animal/slime/doUnEquip(obj/item/W) return -/mob/living/simple_animal/slime/start_pulling(atom/movable/AM) +/mob/living/simple_animal/slime/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE) return /mob/living/simple_animal/slime/attack_ui(slot) diff --git a/code/modules/mob/living/simple_animal/spawner.dm b/code/modules/mob/living/simple_animal/spawner.dm deleted file mode 100644 index 0b97a940e4..0000000000 --- a/code/modules/mob/living/simple_animal/spawner.dm +++ /dev/null @@ -1,113 +0,0 @@ -/mob/living/simple_animal/hostile/spawner - name = "monster nest" - icon = 'icons/mob/animal.dmi' - health = 100 - maxHealth = 100 - gender = NEUTER - var/list/spawned_mobs = list() - var/max_mobs = 5 - var/spawn_delay = 0 - var/spawn_time = 300 //30 seconds default - var/mob_types = list(/mob/living/simple_animal/hostile/carp) - var/spawn_text = "emerges from" - status_flags = 0 - anchored = TRUE - AIStatus = AI_OFF - a_intent = INTENT_HARM - stop_automated_movement = 1 - wander = 0 - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - maxbodytemp = 350 - layer = BELOW_MOB_LAYER - sentience_type = SENTIENCE_BOSS - - -/mob/living/simple_animal/hostile/spawner/Destroy() - for(var/mob/living/simple_animal/L in spawned_mobs) - if(L.nest == src) - L.nest = null - spawned_mobs = null - return ..() - -/mob/living/simple_animal/hostile/spawner/Life() - . = ..() - if(!.) // dead - return - spawn_mob() - -/mob/living/simple_animal/hostile/spawner/proc/spawn_mob() - if(spawned_mobs.len >= max_mobs) - return 0 - if(spawn_delay > world.time) - return 0 - spawn_delay = world.time + spawn_time - var/chosen_mob_type = pick(mob_types) - var/mob/living/simple_animal/L = new chosen_mob_type(src.loc) - L.flags_1 |= (flags_1 & ADMIN_SPAWNED_1) //If we were admin spawned, lets have our children count as that as well. - spawned_mobs += L - L.nest = src - L.faction = src.faction - visible_message("[L] [spawn_text] [src].") - -/mob/living/simple_animal/hostile/spawner/syndicate - name = "warp beacon" - icon = 'icons/obj/device.dmi' - icon_state = "syndbeacon" - spawn_text = "warps in from" - mob_types = list(/mob/living/simple_animal/hostile/syndicate/ranged) - faction = list(ROLE_SYNDICATE) - -/mob/living/simple_animal/hostile/spawner/skeleton - name = "bone pit" - desc = "A pit full of bones, and some still seem to be moving..." - icon_state = "hole" - icon_living = "hole" - icon = 'icons/mob/nest.dmi' - health = 150 - maxHealth = 150 - max_mobs = 15 - spawn_time = 150 - mob_types = list(/mob/living/simple_animal/hostile/skeleton) - spawn_text = "climbs out of" - 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) - faction = list("skeleton") - -/mob/living/simple_animal/hostile/spawner/mining - name = "monster den" - desc = "A hole dug into the ground, harboring all kinds of monsters found within most caves or mining asteroids." - icon_state = "hole" - icon_living = "hole" - health = 200 - maxHealth = 200 - max_mobs = 3 - icon = 'icons/mob/nest.dmi' - spawn_text = "crawls out of" - mob_types = list(/mob/living/simple_animal/hostile/asteroid/goldgrub, /mob/living/simple_animal/hostile/asteroid/goliath, /mob/living/simple_animal/hostile/asteroid/hivelord, /mob/living/simple_animal/hostile/asteroid/basilisk, /mob/living/simple_animal/hostile/asteroid/fugu) - 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) - faction = list("mining") - -/mob/living/simple_animal/hostile/spawner/mining/goldgrub - name = "goldgrub den" - desc = "A den housing a nest of goldgrubs, annoying but arguably much better than anything else you'll find in a nest." - mob_types = list(/mob/living/simple_animal/hostile/asteroid/goldgrub) - -/mob/living/simple_animal/hostile/spawner/mining/goliath - name = "goliath den" - desc = "A den housing a nest of goliaths, oh god why?" - mob_types = list(/mob/living/simple_animal/hostile/asteroid/goliath) - -/mob/living/simple_animal/hostile/spawner/mining/hivelord - name = "hivelord den" - desc = "A den housing a nest of hivelords." - mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord) - -/mob/living/simple_animal/hostile/spawner/mining/basilisk - name = "basilisk den" - desc = "A den housing a nest of basilisks, bring a coat." - mob_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk) - -/mob/living/simple_animal/hostile/spawner/mining/wumborian - name = "wumborian fugu den" - desc = "A den housing a nest of wumborian fugus, how do they all even fit in there?" - mob_types = list(/mob/living/simple_animal/hostile/asteroid/fugu) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 82e2b11f8e..85d8f94deb 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -108,8 +108,7 @@ if((direct & (direct - 1)) && mob.loc == n) //moved diagonally successfully add_delay *= 2 - if(mob.loc != oldloc) - move_delay += add_delay + move_delay += add_delay if(.) // If mob is null here, we deserve the runtime if(mob.throwing) mob.throwing.finalize(FALSE) diff --git a/code/modules/ninja/energy_katana.dm b/code/modules/ninja/energy_katana.dm index 97c41faf12..e6d53d914f 100644 --- a/code/modules/ninja/energy_katana.dm +++ b/code/modules/ninja/energy_katana.dm @@ -56,7 +56,7 @@ //If we hit the Ninja who owns this Katana, they catch it. //Works for if the Ninja throws it or it throws itself or someone tries //To throw it at the ninja -/obj/item/energy_katana/throw_impact(atom/hit_atom) +/obj/item/energy_katana/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(ishuman(hit_atom)) var/mob/living/carbon/human/H = hit_atom if(istype(H.wear_suit, /obj/item/clothing/suit/space/space_ninja)) diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index 4b08ccf608..a896eb9034 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -97,7 +97,7 @@ /obj/item/paperplane/throw_at(atom/target, range, speed, mob/thrower, spin=FALSE, diagonals_first = FALSE, datum/callback/callback) . = ..(target, range, speed, thrower, FALSE, diagonals_first, callback) -/obj/item/paperplane/throw_impact(atom/hit_atom) +/obj/item/paperplane/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(iscarbon(hit_atom)) var/mob/living/carbon/C = hit_atom if(C.can_catch_item(TRUE)) diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 4d8cdaa778..6cedab99a4 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -23,6 +23,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne desc = "A device which produces a graviton field when set up." icon = 'icons/obj/machines/gravity_generator.dmi' density = TRUE + move_resist = INFINITY use_power = NO_POWER_USE resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF var/sprite_number = 0 diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 8d99cbb485..f995993ea2 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -758,7 +758,7 @@ /obj/item/light/bulb/broken status = LIGHT_BROKEN -/obj/item/light/throw_impact(atom/hit_atom) +/obj/item/light/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!..()) //not caught by a mob shatter() diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index 3b0f7e7f6f..491be4a83d 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -6,6 +6,7 @@ icon = 'icons/obj/singularity.dmi' icon_state = "Contain_F" density = FALSE + move_resist = INFINITY resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF use_power = NO_POWER_USE interaction_flags_atom = NONE diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 6be89b43f4..cc6adb6b36 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -245,6 +245,7 @@ field_generator power level display if(state != FG_WELDED || !anchored) turn_off() return + move_resist = INFINITY spawn(1) setup_field(1) spawn(2) @@ -335,6 +336,7 @@ field_generator power level display message_admins("A singulo exists and a containment field has failed at [ADMIN_VERBOSEJMP(T)].") investigate_log("has failed whilst a singulo exists at [AREACOORD(T)].", INVESTIGATE_SINGULO) O.last_warning = world.time + move_resist = initial(move_resist) /obj/machinery/field/generator/shock(mob/living/user) if(fields.len) diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 35710f8d61..dbd16b8c08 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -7,6 +7,7 @@ icon_state = "singularity_s1" anchored = TRUE density = TRUE + move_resist = INFINITY layer = MASSIVE_OBJ_LAYER light_range = 6 appearance_flags = 0 diff --git a/code/modules/procedural_mapping/mapGenerators/lavaland.dm b/code/modules/procedural_mapping/mapGenerators/lavaland.dm index e6d7b00e8d..9e50b3ae95 100644 --- a/code/modules/procedural_mapping/mapGenerators/lavaland.dm +++ b/code/modules/procedural_mapping/mapGenerators/lavaland.dm @@ -16,9 +16,9 @@ /datum/mapGeneratorModule/splatterLayer/lavalandTendrils spawnableTurfs = list() - spawnableAtoms = list(/mob/living/simple_animal/hostile/spawner/lavaland = 5, - /mob/living/simple_animal/hostile/spawner/lavaland/legion = 5, - /mob/living/simple_animal/hostile/spawner/lavaland/goliath = 5) + spawnableAtoms = list(/obj/structure/spawner/lavaland = 5, + /obj/structure/spawner/lavaland/legion = 5, + /obj/structure/spawner/lavaland/goliath = 5) /datum/mapGenerator/lavaland/ground_only modules = list(/datum/mapGeneratorModule/bottomLayer/lavaland_default) diff --git a/code/modules/projectiles/ammunition/_ammunition.dm b/code/modules/projectiles/ammunition/_ammunition.dm index 87fdbc65b0..2a7d61f268 100644 --- a/code/modules/projectiles/ammunition/_ammunition.dm +++ b/code/modules/projectiles/ammunition/_ammunition.dm @@ -65,7 +65,7 @@ else return ..() -/obj/item/ammo_casing/throw_impact(atom/A) +/obj/item/ammo_casing/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(heavy_metal) bounce_away(FALSE, NONE) . = ..() diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index b3f9591f64..26bbb20e6a 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -78,9 +78,9 @@ reagents.expose_temperature(exposed_temperature) ..() -/obj/item/reagent_containers/throw_impact(atom/target) +/obj/item/reagent_containers/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) . = ..() - SplashReagents(target, TRUE) + SplashReagents(hit_atom, TRUE) /obj/item/reagent_containers/proc/bartender_check(atom/target) . = FALSE diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index a4a6a7d473..7bddb46d50 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -355,7 +355,7 @@ ui.soft_update_fields() -/obj/machinery/disposal/bin/hitby(atom/movable/AM) +/obj/machinery/disposal/bin/hitby(atom/movable/AM, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) if(isitem(AM) && AM.CanEnterDisposals()) if(prob(75)) AM.forceMove(src) diff --git a/code/modules/ruins/objects_and_mobs/ash_walker_den.dm b/code/modules/ruins/objects_and_mobs/ash_walker_den.dm index 5425ddbdc4..2401fc63a0 100644 --- a/code/modules/ruins/objects_and_mobs/ash_walker_den.dm +++ b/code/modules/ruins/objects_and_mobs/ash_walker_den.dm @@ -1,26 +1,31 @@ #define ASH_WALKER_SPAWN_THRESHOLD 2 //The ash walker den consumes corpses or unconscious mobs to create ash walker eggs. For more info on those, check ghost_role_spawners.dm -/mob/living/simple_animal/hostile/spawner/lavaland/ash_walker +/obj/structure/lavaland/ash_walker name = "necropolis tendril nest" desc = "A vile tendril of corruption. It's surrounded by a nest of rapidly growing eggs..." + icon = 'icons/mob/nest.dmi' icon_state = "ash_walker_nest" - icon_living = "ash_walker_nest" - icon_dead = "ash_walker_nest" - faction = list("ashwalker") - health = 200 - maxHealth = 200 - loot = list(/obj/effect/collapse) + move_resist=INFINITY // just killing it tears a massive hole in the ground, let's not move it + anchored = TRUE + density = TRUE + resistance_flags = FIRE_PROOF | LAVA_PROOF + max_integrity = 200 + var/faction = list("ashwalker") var/meat_counter = 6 -/mob/living/simple_animal/hostile/spawner/lavaland/ash_walker/death() +/obj/structure/lavaland/ash_walker/Initialize() + .=..() + START_PROCESSING(SSprocessing, src) + +/obj/structure/lavaland/ash_walker/deconstruct(disassembled) new /obj/item/assembly/signaler/anomaly (get_step(loc, pick(GLOB.alldirs))) - return ..() + new /obj/effect/collapse(loc) -/mob/living/simple_animal/hostile/spawner/lavaland/ash_walker/Life() +/obj/structure/lavaland/ash_walker/process() consume() - return ..() + spawn_mob() -/mob/living/simple_animal/hostile/spawner/lavaland/ash_walker/proc/consume() +/obj/structure/lavaland/ash_walker/proc/consume() for(var/mob/living/H in view(src, 1)) //Only for corpse right next to/on same tile if(H.stat) visible_message("Serrated tendrils eagerly pull [H] to [src], tearing the body apart as its blood seeps over the eggs.") @@ -33,9 +38,9 @@ else meat_counter++ H.gib() - adjustHealth(-maxHealth * 0.05)//restores 5% hp of tendril + obj_integrity = min(obj_integrity + max_integrity*0.05,max_integrity)//restores 5% hp of tendril -/mob/living/simple_animal/hostile/spawner/lavaland/ash_walker/spawn_mob() +/obj/structure/lavaland/ash_walker/proc/spawn_mob() if(meat_counter >= ASH_WALKER_SPAWN_THRESHOLD) new /obj/effect/mob_spawn/human/ash_walker(get_step(loc, pick(GLOB.alldirs))) visible_message("One of the eggs swells to an unnatural size and tumbles free. It's ready to hatch!") diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index dd2d7483e3..91243e04b7 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -131,7 +131,7 @@ All ShuttleMove procs go here var/range = throw_force * 10 range = CEILING(rand(range-(range*0.1), range+(range*0.1)), 10)/10 var/speed = range/5 - throw_at(target, range, speed) + safe_throw_at(target, range, speed) ///////////////////////////////////////////////////////////////////////////////////// diff --git a/code/modules/spells/spell_types/conjure.dm b/code/modules/spells/spell_types/conjure.dm index 3ebded7487..2b7be7b4d7 100644 --- a/code/modules/spells/spell_types/conjure.dm +++ b/code/modules/spells/spell_types/conjure.dm @@ -63,7 +63,7 @@ clothes_req = FALSE charge_max = 600 cooldown_min = 200 - summon_type = list(/mob/living/simple_animal/hostile/spawner/nether) + summon_type = list(/obj/structure/spawner/nether) summon_amt = 1 range = 1 cast_sound = 'sound/weapons/marauder.ogg' diff --git a/code/modules/spells/spell_types/wizard.dm b/code/modules/spells/spell_types/wizard.dm index c4d2c34a71..005a52a382 100644 --- a/code/modules/spells/spell_types/wizard.dm +++ b/code/modules/spells/spell_types/wizard.dm @@ -363,7 +363,7 @@ icon_state = "snappop" w_class = WEIGHT_CLASS_TINY -/obj/item/spellpacket/lightningbolt/throw_impact(atom/hit_atom) +/obj/item/spellpacket/lightningbolt/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!..()) if(isliving(hit_atom)) var/mob/living/M = hit_atom diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index dffb7bf355..52261eac4e 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -116,7 +116,7 @@ else return ..() -/obj/item/bodypart/throw_impact(atom/hit_atom) +/obj/item/bodypart/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) ..() if(status != BODYPART_ROBOTIC) playsound(get_turf(src), 'sound/misc/splort.ogg', 50, 1, -1) diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index 8da5d7c113..66f3d4f544 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -2,6 +2,7 @@ //Keep this sorted alphabetically #ifdef UNIT_TESTS +#include "anchored_mobs.dm" #include "reagent_id_typos.dm" #include "reagent_recipe_collisions.dm" #include "spawn_humans.dm" diff --git a/code/modules/unit_tests/anchored_mobs.dm b/code/modules/unit_tests/anchored_mobs.dm new file mode 100644 index 0000000000..5324179bb7 --- /dev/null +++ b/code/modules/unit_tests/anchored_mobs.dm @@ -0,0 +1,9 @@ +/datum/unit_test/anchored_mobs/Run() + var/list/L = list() + for(var/i in typesof(/mob)) + var/mob/M = i + if(initial(M.anchored)) + L += "[i]" + if(!L.len) + return //passed! + Fail("The following mobs are defined as anchored. This is incompatible with the new move force/resist system and needs to be revised.: [L.Join(" ")]") \ No newline at end of file diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm index de3f43f8ee..adecad7885 100644 --- a/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm +++ b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm @@ -351,17 +351,17 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm ! cell.use(750) //Less than a stunbaton since stunbatons hit everytime. weather_immunities -= "lava" -/mob/living/silicon/robot/throw_impact(atom/A) +/mob/living/silicon/robot/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!leaping) return ..() - if(A) - if(isliving(A)) - var/mob/living/L = A + if(hit_atom) + if(isliving(hit_atom)) + var/mob/living/L = hit_atom var/blocked = 0 - if(ishuman(A)) - var/mob/living/carbon/human/H = A + if(ishuman(hit_atom)) + var/mob/living/carbon/human/H = hit_atom if(H.check_shields(0, "the [name]", src, attack_type = LEAP_ATTACK)) blocked = 1 if(!blocked) @@ -377,8 +377,8 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm ! pounce_cooldown = !pounce_cooldown spawn(pounce_cooldown_time) //3s by default pounce_cooldown = !pounce_cooldown - else if(A.density && !A.CanPass(src)) - visible_message("[src] smashes into [A]!", "You smash into [A]!") + else if(hit_atom.density && !hit_atom.CanPass(src)) + visible_message("[src] smashes into [hit_atom]!", "You smash into [hit_atom]!") playsound(src, 'sound/items/trayhit1.ogg', 50, 1) Knockdown(15, 1, 1) diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/spinfusor.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/spinfusor.dm index d16df6b285..5c4775a1e1 100644 --- a/modular_citadel/code/modules/projectiles/guns/ballistic/spinfusor.dm +++ b/modular_citadel/code/modules/projectiles/guns/ballistic/spinfusor.dm @@ -22,11 +22,11 @@ throwforce = 15 //still deadly when thrown throw_speed = 3 -/obj/item/ammo_casing/caseless/spinfusor/throw_impact(atom/target) //disks detonate when thrown +/obj/item/ammo_casing/caseless/spinfusor/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) //disks detonate when thrown if(!..()) // not caught in mid-air visible_message("[src] detonates!") - playsound(src.loc, "sparks", 50, 1) - explosion(target, -1, -1, 1, 1, -1) + playsound(loc, "sparks", 50, 1) + explosion(hit_atom, -1, -1, 1, 1, -1) qdel(src) return 1 diff --git a/tgstation.dme b/tgstation.dme index 702f34f80c..d1e526d6ea 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -68,6 +68,7 @@ #include "code\__DEFINES\misc.dm" #include "code\__DEFINES\mobs.dm" #include "code\__DEFINES\monkeys.dm" +#include "code\__DEFINES\move_force.dm" #include "code\__DEFINES\movespeed_modification.dm" #include "code\__DEFINES\nanites.dm" #include "code\__DEFINES\networks.dm" @@ -377,6 +378,7 @@ #include "code\datums\components\rotation.dm" #include "code\datums\components\signal_redirect.dm" #include "code\datums\components\slippery.dm" +#include "code\datums\components\spawner.dm" #include "code\datums\components\spooky.dm" #include "code\datums\components\squeak.dm" #include "code\datums\components\stationloving.dm" @@ -1022,6 +1024,7 @@ #include "code\game\objects\structures\reflector.dm" #include "code\game\objects\structures\safe.dm" #include "code\game\objects\structures\showcase.dm" +#include "code\game\objects\structures\spawner.dm" #include "code\game\objects\structures\spirit_board.dm" #include "code\game\objects\structures\statues.dm" #include "code\game\objects\structures\table_frames.dm" @@ -1063,6 +1066,7 @@ #include "code\game\objects\structures\crates_lockers\crates\large.dm" #include "code\game\objects\structures\crates_lockers\crates\secure.dm" #include "code\game\objects\structures\crates_lockers\crates\wooden.dm" +#include "code\game\objects\structures\lavaland\necropolis_tendril.dm" #include "code\game\objects\structures\signs\_signs.dm" #include "code\game\objects\structures\signs\signs_departments.dm" #include "code\game\objects\structures\signs\signs_maps.dm" @@ -2171,7 +2175,6 @@ #include "code\modules\mob\living\simple_animal\simple_animal.dm" #include "code\modules\mob\living\simple_animal\simple_animal_vr.dm" #include "code\modules\mob\living\simple_animal\simplemob_vore_values.dm" -#include "code\modules\mob\living\simple_animal\spawner.dm" #include "code\modules\mob\living\simple_animal\status_procs.dm" #include "code\modules\mob\living\simple_animal\bot\bot.dm" #include "code\modules\mob\living\simple_animal\bot\cleanbot.dm" @@ -2275,7 +2278,6 @@ #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\gutlunch.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\hivelord.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\mining_mobs.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\necropolis_tendril.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\bat.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\clown.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\frog.dm" From a5c95f20b644355c4649ab0bbc9dd5a4d1a5e369 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Thu, 24 Oct 2019 19:58:32 +0200 Subject: [PATCH 02/41] typo. --- code/game/mecha/equipment/tools/other_tools.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index 07ecdec508..fdb620cc67 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -84,7 +84,7 @@ switch(mode) if(1) if(!locked) - if(!istype(target) || target.anchored || target.move_resist >= MOVE_FORCE_EXTREMELY_STRON) + if(!istype(target) || target.anchored || target.move_resist >= MOVE_FORCE_EXTREMELY_STRONG) occupant_message("Unable to lock on [target]") return locked = target From b29fc9aa5865cf1786f7b7ee38e2fc711f9fefdf Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Thu, 24 Oct 2019 20:44:29 +0200 Subject: [PATCH 03/41] fermis code looks very 2k17, sad. --- code/modules/holiday/halloween/halloween.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/holiday/halloween/halloween.dm b/code/modules/holiday/halloween/halloween.dm index 5635994a7a..151bb26076 100644 --- a/code/modules/holiday/halloween/halloween.dm +++ b/code/modules/holiday/halloween/halloween.dm @@ -132,7 +132,7 @@ speak_emote = list("howls") emote_hear = list("wails","screeches") density = FALSE - anchored = TRUE + move_resist = MOVE_FORCE_OVERPOWERING incorporeal_move = 1 layer = 4 var/timer = 0 From b3ef41a10ff6064b5cf368c84067877310384b98 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Wed, 30 Oct 2019 14:02:17 +0100 Subject: [PATCH 04/41] Fixing living being unable to pull anything. --- code/modules/mob/living/living.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index df3366187d..5389f1b099 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -241,7 +241,7 @@ /mob/living/start_pulling(atom/movable/AM, state, force = pull_force, supress_message = FALSE) if(!AM || !src) return FALSE - if(!(AM.can_be_pulled(src))) + if(!(AM.can_be_pulled(src, state, force))) return FALSE if(throwing || incapacitated()) return FALSE From 27af7b271f4f999cfd56ffbf240a7d642be3d36f Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Fri, 6 Dec 2019 20:12:30 +0100 Subject: [PATCH 05/41] qdeleted to qdeleting --- code/datums/components/spawner.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/components/spawner.dm b/code/datums/components/spawner.dm index dc46603b1e..fe86b60375 100644 --- a/code/datums/components/spawner.dm +++ b/code/datums/components/spawner.dm @@ -19,7 +19,7 @@ if(_max_mobs) max_mobs=_max_mobs - RegisterSignal(parent, list(COMSIG_PARENT_QDELETED), .proc/stop_spawning) + RegisterSignal(parent, list(COMSIG_PARENT_QDELETING), .proc/stop_spawning) START_PROCESSING(SSprocessing, src) /datum/component/spawner/process() From f83d1c4763b251f2d8d52635f8cf13a0428cf1a7 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Sat, 7 Dec 2019 10:53:10 +0100 Subject: [PATCH 06/41] Made kevlar and armor padding accessories inconspicious and examine-proof. --- code/__DEFINES/inventory.dm | 1 + code/modules/clothing/under/_under.dm | 3 +++ code/modules/clothing/under/accessories.dm | 3 +++ code/modules/mob/living/carbon/human/examine.dm | 2 +- code/modules/uplink/uplink_items.dm | 6 +++--- 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index f5ea8d835f..98ba432e52 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -110,6 +110,7 @@ #define HIDENECK (1<<10) #define HIDETAUR (1<<11) //gotta hide that snowflake #define HIDESNOUT (1<<12) //or do we actually hide our snoots +#define HIDEACCESSORY (1<<13) //hides the jumpsuit accessory. //bitflags for clothing coverage - also used for limbs #define HEAD (1<<0) diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index bb5f909521..508fece53b 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -102,6 +102,9 @@ if(user && notifyAttach) to_chat(user, "You attach [I] to [src].") + if((flags_inv & HIDEACCESSORY) || (A.flags_inv & HIDEACCESSORY)) + return TRUE + var/accessory_color = attached_accessory.item_color if(!accessory_color) accessory_color = attached_accessory.icon_state diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm index 0a0499b5f9..50038a03ac 100644 --- a/code/modules/clothing/under/accessories.dm +++ b/code/modules/clothing/under/accessories.dm @@ -373,6 +373,7 @@ icon_state = "padding" item_color = "nothing" armor = list("melee" = 15, "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 sheets" @@ -380,6 +381,7 @@ icon_state = "padding" item_color = "nothing" 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 = "underling plastic sheet" @@ -387,6 +389,7 @@ icon_state = "plastics" item_color = "nothing" armor = list("melee" = 0, "bullet" = 0, "laser" = 20, "energy" = 10, "bomb" = 0, "bio" = 30, "rad" = 0, "fire" = 0, "acid" = -40) + flags_inv = HIDEACCESSORY ///////////////////// //Pokadots On Pants// diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 04ec0454f8..01f452df56 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -34,7 +34,7 @@ var/accessory_msg if(istype(w_uniform, /obj/item/clothing/under)) var/obj/item/clothing/under/U = w_uniform - if(U.attached_accessory) + if(U.attached_accessory && !(U.attached_accessory.flags_inv & HIDEACCESSORY) && !(U.flags_inv & HIDEACCESSORY)) accessory_msg += " with [icon2html(U.attached_accessory, user)] \a [U.attached_accessory]" . += "[t_He] [t_is] wearing [w_uniform.get_examine_string(user)][accessory_msg]." diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index cf663e353f..a6110f3464 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -1332,21 +1332,21 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/suits/padding name = "Soft Padding" - desc = "Padding to add to a jumpsuit to help against melee and bullets." + desc = "Inconspicious padding worn underneath jumpsuits to protect the user against melee and bullets." item = /obj/item/clothing/accessory/padding cost = 2 exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) /datum/uplink_item/suits/kevlar name = "Kevlar sheets" - desc = "Kevlar sheets to add to jumpsuit to help against bullets and melee." + desc = "Inconspicious kevlar sheets worn underneath jumpsuits to protect the user against bullets and melee." item = /obj/item/clothing/accessory/kevlar cost = 2 exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) /datum/uplink_item/suits/plastic name = "Plastic sheet" - desc = "Plastic body sheet to add to a jumpsuit to help against laser and energy harm." + desc = "Inconspicious plastic body sheet worn underneath jumpsuits to protect the user against laser and energy beams." item = /obj/item/clothing/accessory/plastics cost = 2 exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) From 160e8c1ec5863d4d5c6ae0f7fba096bbc18e0163 Mon Sep 17 00:00:00 2001 From: Seris02 Date: Fri, 27 Dec 2019 23:21:40 +0800 Subject: [PATCH 07/41] stunglasses --- code/datums/action.dm | 3 ++ code/modules/clothing/glasses/_glasses.dm | 30 +++++++++++++++++++ .../crafting/recipes/recipes_clothing.dm | 10 +++++++ 3 files changed, 43 insertions(+) diff --git a/code/datums/action.dm b/code/datums/action.dm index 77aa729eb1..44a0e0c7ba 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -533,6 +533,9 @@ cooldown = world.time owner.playsound_local(box, 'sound/misc/box_deploy.ogg', 50, TRUE) +/datum/action/item_action/flash + name = "Flash" + //Preset for spells /datum/action/spell_action check_flags = 0 diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 206165a495..db5f79dfaf 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -247,6 +247,36 @@ throwforce = 12 glass_colour_type = /datum/client_colour/glass_colour/red +/obj/item/clothing/glasses/sunglasses/stunglasses + name = "stunglasses" + desc = "Sunglasses with inbuilt flashes. Made for those who prefer to walk around in style, who needs clumsy flashes anyway?" + actions_types = list(/datum/action/item_action/flash) + var/obj/item/assembly/flash/installed + +/obj/item/clothing/glasses/sunglasses/stunglasses/Initialize() + ..() + if (!installed) + installed = new(src) + +/obj/item/clothing/glasses/sunglasses/stunglasses/ui_action_click(mob/user) + if (installed && !installed.crit_fail) + installed.attack_self(user) + else + to_chat(user, "Install a new flash in [src]!") + + +/obj/item/clothing/glasses/sunglasses/stunglasses/attackby(obj/item/W,mob/user) + if (istype(W,/obj/item/screwdriver)) + if (installed) + installed.forceMove(get_turf(src)) + to_chat(user, "You remove [installed] from [src].") + installed = null + if (istype(W,/obj/item/assembly/flash)) + if (!installed) + W.forceMove(src) + to_chat(user, "You install [W] into [src].") + installed = W + /obj/item/clothing/glasses/welding name = "welding goggles" desc = "Protects the eyes from welders; approved by the mad scientist association." diff --git a/code/modules/crafting/recipes/recipes_clothing.dm b/code/modules/crafting/recipes/recipes_clothing.dm index 4f06a44811..088cf30196 100644 --- a/code/modules/crafting/recipes/recipes_clothing.dm +++ b/code/modules/crafting/recipes/recipes_clothing.dm @@ -87,6 +87,16 @@ reqs = list(/obj/item/clothing/glasses/sunglasses/reagent = 1) category = CAT_CLOTHING +/datum/crafting_recipe/stunglasses + name = "Stunglasses" + result = /obj/item/clothing/glasses/sunglasses/stunglasses + time = 60 + tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + reqs = list(/obj/item/assembly/flash = 1, + /obj/item/clothing/glasses/sunglasses = 1, + /obj/item/stack/cable_coil = 5) + category = CAT_CLOTHING + /datum/crafting_recipe/ghostsheet name = "Ghost Sheet" result = /obj/item/clothing/suit/ghost_sheet From 1d449fcd129a98a0259821ae372f7268478643e1 Mon Sep 17 00:00:00 2001 From: Seris02 Date: Sun, 29 Dec 2019 19:46:47 +0800 Subject: [PATCH 08/41] changes --- code/modules/clothing/glasses/_glasses.dm | 4 ++-- code/modules/crafting/recipes/recipes_clothing.dm | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index db5f79dfaf..330e10db0e 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -254,7 +254,7 @@ var/obj/item/assembly/flash/installed /obj/item/clothing/glasses/sunglasses/stunglasses/Initialize() - ..() + . = ..() if (!installed) installed = new(src) @@ -264,7 +264,6 @@ else to_chat(user, "Install a new flash in [src]!") - /obj/item/clothing/glasses/sunglasses/stunglasses/attackby(obj/item/W,mob/user) if (istype(W,/obj/item/screwdriver)) if (installed) @@ -276,6 +275,7 @@ W.forceMove(src) to_chat(user, "You install [W] into [src].") installed = W + . = ..() /obj/item/clothing/glasses/welding name = "welding goggles" diff --git a/code/modules/crafting/recipes/recipes_clothing.dm b/code/modules/crafting/recipes/recipes_clothing.dm index 088cf30196..83e82654a2 100644 --- a/code/modules/crafting/recipes/recipes_clothing.dm +++ b/code/modules/crafting/recipes/recipes_clothing.dm @@ -86,7 +86,7 @@ tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) reqs = list(/obj/item/clothing/glasses/sunglasses/reagent = 1) category = CAT_CLOTHING - +/* //Kevinz doesn't want it as a recipe for now, leaving it in if anything ever changes to let it in /datum/crafting_recipe/stunglasses name = "Stunglasses" result = /obj/item/clothing/glasses/sunglasses/stunglasses @@ -96,7 +96,7 @@ /obj/item/clothing/glasses/sunglasses = 1, /obj/item/stack/cable_coil = 5) category = CAT_CLOTHING - +*/ /datum/crafting_recipe/ghostsheet name = "Ghost Sheet" result = /obj/item/clothing/suit/ghost_sheet From 9ea99d4c810bf11a158e4f360e14585a1f58909b Mon Sep 17 00:00:00 2001 From: deathride58 Date: Sun, 29 Dec 2019 20:01:21 -0500 Subject: [PATCH 09/41] nerfs limb stamcrit by doubling the base limb stam regen, making limbs regen stam at double the rate when disabled, and adding stam multiplier mechanics to limb stamloss --- code/modules/surgery/bodyparts/bodyparts.dm | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index a1b74942e0..f04cb0c602 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -29,6 +29,7 @@ var/burn_dam = 0 var/stamina_dam = 0 var/max_stamina_damage = 0 + var/incoming_stam_mult = 1 //Multiplier for incoming staminaloss, decreases when taking staminaloss when the limb is disabled, resets back to 1 when limb is no longer disabled. var/max_damage = 0 var/stam_heal_tick = 0 //per Life(). Defaults to 0 due to citadel changes @@ -141,7 +142,7 @@ //Return TRUE to get whatever mob this is in to update health. /obj/item/bodypart/proc/on_life() if(stam_heal_tick && stamina_dam > DAMAGE_PRECISION) //DO NOT update health here, it'll be done in the carbon's life. - if(heal_damage(brute = 0, burn = 0, stamina = stam_heal_tick, only_robotic = FALSE, only_organic = FALSE, updating_health = FALSE)) + if(heal_damage(brute = 0, burn = 0, stamina = (stam_heal_tick * (disabled ? 2 : 1)), only_robotic = FALSE, only_organic = FALSE, updating_health = FALSE)) . |= BODYPART_LIFE_UPDATE_HEALTH //Applies brute and burn damage to the organ. Returns 1 if the damage-icon states changed at all. @@ -153,7 +154,7 @@ var/dmg_mlt = CONFIG_GET(number/damage_multiplier) brute = round(max(brute * dmg_mlt, 0),DAMAGE_PRECISION) burn = round(max(burn * dmg_mlt, 0),DAMAGE_PRECISION) - stamina = round(max(stamina * dmg_mlt, 0),DAMAGE_PRECISION) + stamina = round(max((stamina * dmg_mlt) * incoming_stam_mult, 0),DAMAGE_PRECISION) brute = max(0, brute - brute_reduction) burn = max(0, burn - burn_reduction) //No stamina scaling.. for now.. @@ -184,6 +185,9 @@ var/available_damage = max_damage - current_damage stamina_dam += round(CLAMP(stamina, 0, min(max_stamina_damage - stamina_dam, available_damage)), DAMAGE_PRECISION) + if(disabled && stamina > 10) + incoming_stam_mult = max(0.01, incoming_stam_mult/(stamina*0.1)) + if(owner && updating_health) owner.updatehealth() if(stamina > DAMAGE_PRECISION) @@ -253,6 +257,8 @@ owner.update_health_hud() //update the healthdoll owner.update_body() owner.update_canmove() + if(!disabled) + incoming_stam_mult = 1 return TRUE //Updates an organ's brute/burn states for use by update_damage_overlays() @@ -646,7 +652,7 @@ held_index = 1 px_x = -6 px_y = 0 - stam_heal_tick = 2 + stam_heal_tick = 4 /obj/item/bodypart/l_arm/is_disabled() if(HAS_TRAIT(owner, TRAIT_PARALYSIS_L_ARM)) @@ -706,7 +712,7 @@ held_index = 2 px_x = 6 px_y = 0 - stam_heal_tick = 2 + stam_heal_tick = 4 max_stamina_damage = 50 /obj/item/bodypart/r_arm/is_disabled() @@ -766,7 +772,7 @@ body_damage_coeff = 0.75 px_x = -2 px_y = 12 - stam_heal_tick = 2 + stam_heal_tick = 4 max_stamina_damage = 50 var/blood_state = BLOOD_STATE_NOT_BLOODY var/list/bloody_legs = list(BLOOD_STATE_BLOOD = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0) @@ -827,7 +833,7 @@ px_x = 2 px_y = 12 max_stamina_damage = 50 - stam_heal_tick = 2 + stam_heal_tick = 4 var/blood_state = BLOOD_STATE_NOT_BLOODY var/list/bloody_legs = list(BLOOD_STATE_BLOOD = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0) From 080cb7489365a668363a7a9ecd28e11d6e0a688f Mon Sep 17 00:00:00 2001 From: Hatterhat Date: Fri, 10 Jan 2020 22:56:11 -0600 Subject: [PATCH 10/41] tgstation 40920 tweaked and tested for cit --- code/datums/status_effects/debuffs.dm | 2 +- code/game/machinery/autolathe.dm | 8 ++++++- code/game/machinery/cell_charger.dm | 2 ++ code/game/machinery/cloning.dm | 5 ++++ code/game/machinery/computer/teleporter.dm | 6 ++--- code/game/machinery/dna_scanner.dm | 7 ++++++ code/game/machinery/harvester.dm | 6 +++-- code/game/machinery/hologram.dm | 5 ++++ code/game/machinery/launch_pad.dm | 5 ++++ code/game/machinery/limbgrower.dm | 7 +++++- code/game/machinery/recharger.dm | 5 ++++ code/game/machinery/rechargestation.dm | 7 ++++++ code/game/machinery/recycler.dm | 7 +++--- code/game/machinery/spaceheater.dm | 2 ++ code/game/machinery/teleporter.dm | 24 +++++++++++++++---- code/game/mecha/mech_bay.dm | 5 ++++ code/game/mecha/mech_fabricator.dm | 5 ++++ .../objects/items/devices/laserpointer.dm | 8 +++++++ .../components/unary_devices/cryo.dm | 5 ++++ .../kitchen_machinery/deep_fryer.dm | 4 +++- .../kitchen_machinery/gibber.dm | 8 +++++++ .../kitchen_machinery/monkeyrecycler.dm | 8 +++++-- .../kitchen_machinery/processor.dm | 5 ++++ .../kitchen_machinery/smartfridge.dm | 5 ++++ code/modules/hydroponics/biogenerator.dm | 6 +++++ code/modules/hydroponics/hydroponics.dm | 5 ++++ code/modules/hydroponics/seed_extractor.dm | 5 ++++ code/modules/power/port_gen.dm | 2 ++ code/modules/power/rtg.dm | 5 ++++ code/modules/power/singularity/emitter.dm | 5 ++++ code/modules/power/tesla/coil.dm | 5 ++++ code/modules/power/turbine.dm | 10 ++++++++ .../chemistry/machinery/chem_heater.dm | 5 ++++ code/modules/research/experimentor.dm | 5 ++++ .../modules/research/machinery/_production.dm | 6 +++++ .../research/nanites/nanite_chamber.dm | 5 ++++ 36 files changed, 196 insertions(+), 19 deletions(-) diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 036d8193fb..e3d351c80c 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -613,7 +613,7 @@ if(do_after(mob_viewer, 35, null, mob_viewer)) if(isliving(mob_viewer)) var/mob/living/L = mob_viewer - to_chat(mob_viewer, "You succesfuly remove the durathread strand.") + to_chat(mob_viewer, "You successfully remove the durathread strand.") L.remove_status_effect(STATUS_EFFECT_CHOKINGSTRAND) diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index bdb90c4c97..eaa5f44e0b 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -220,6 +220,12 @@ T -= M.rating*0.2 prod_coeff = min(1,max(0,T)) // Coeff going 1 -> 0,8 -> 0,6 -> 0,4 +/obj/machinery/autolathe/examine(mob/user) + . += ..() + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Storing up to [materials.max_amount] material units.
Material consumption at [prod_coeff*100]%.
" + /obj/machinery/autolathe/proc/main_win(mob/user) var/dat = "

Autolathe Menu:


" dat += materials_printout() @@ -380,4 +386,4 @@ //Called when the object is constructed by an autolathe //Has a reference to the autolathe so you can do !!FUN!! things with hacked lathes /obj/item/proc/autolathe_crafted(obj/machinery/autolathe/A) - return \ No newline at end of file + return diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index 1c0635fd3d..1be5a40070 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -28,6 +28,8 @@ . += "There's [charging ? "a" : "no"] cell in the charger." if(charging) . += "Current charge: [round(charging.percent(), 1)]%." + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads: Charge rate at [charge_rate]J per cycle.") /obj/machinery/cell_charger/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/stock_parts/cell) && !panel_open) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 97b260f3bf..cdbafbc3e9 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -102,8 +102,13 @@ /obj/machinery/clonepod/examine(mob/user) . = ..() var/mob/living/mob_occupant = occupant + . += "The linking device can be scanned with a multitool." if(mess) . += "It's filled with blood and viscera. You swear you can see it moving..." + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads: Speed [speed_coeff*50]%.
Predicted amount of cellular damage: [100-heal_level]%.") + if(efficiency > 5) + to_chat(user, "Pod has been upgraded to support autoprocessing.") if(is_operational() && mob_occupant) if(mob_occupant.stat != DEAD) . += "Current clone cycle is [round(get_completion())]% complete." diff --git a/code/game/machinery/computer/teleporter.dm b/code/game/machinery/computer/teleporter.dm index 21fb70c38c..c52cf29660 100644 --- a/code/game/machinery/computer/teleporter.dm +++ b/code/game/machinery/computer/teleporter.dm @@ -44,7 +44,7 @@ data += "Current target: [(!target) ? "None" : "[get_area(target)] [(regime_set != "Gate") ? "" : "Teleporter"]"]
" if(calibrating) data += "Calibration: In Progress" - else if(power_station.teleporter_hub.calibrated || power_station.teleporter_hub.accurate >= 3) + else if(power_station.teleporter_hub.calibrated || power_station.efficiency >= 3) data += "Calibration: Optimal" else data += "Calibration: Sub-Optimal" @@ -84,14 +84,14 @@ if(!target) say("Error: No target set to calibrate to.") return - if(power_station.teleporter_hub.calibrated || power_station.teleporter_hub.accurate >= 3) + if(power_station.teleporter_hub.calibrated || power_station.efficiency >= 3) say("Hub is already calibrated!") return say("Processing hub calibration to target...") calibrating = 1 power_station.update_icon() - spawn(50 * (3 - power_station.teleporter_hub.accurate)) //Better parts mean faster calibration + spawn(50 * (3 - power_station.efficiency)) //Better parts mean faster calibration calibrating = 0 if(check_hub_connection()) power_station.teleporter_hub.calibrated = 1 diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm index f62dceff6c..648e9f5e71 100644 --- a/code/game/machinery/dna_scanner.dm +++ b/code/game/machinery/dna_scanner.dm @@ -27,6 +27,13 @@ for(var/obj/item/stock_parts/micro_laser/P in component_parts) damage_coeff = P.rating +/obj/machinery/dna_scannernew/examine(mob/user) + ..() + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads: Radiation pulse accuracy increased by factor [precision_coeff**2].
Radiation pulse damage decreased by factor [damage_coeff**2].") + if(scan_level >= 3) + to_chat(user, "Scanner has been upgraded to support autoprocessing.") + /obj/machinery/dna_scannernew/update_icon() //no power or maintenance diff --git a/code/game/machinery/harvester.dm b/code/game/machinery/harvester.dm index e1f9824524..40e898e29c 100644 --- a/code/game/machinery/harvester.dm +++ b/code/game/machinery/harvester.dm @@ -129,7 +129,7 @@ /obj/machinery/harvester/proc/end_harvesting() harvesting = FALSE open_machine() - say("Subject has been succesfuly harvested.") + say("Subject has been successfully harvested.") playsound(src, 'sound/machines/microwave/microwave-end.ogg', 100, 0) /obj/machinery/harvester/screwdriver_act(mob/living/user, obj/item/I) @@ -191,4 +191,6 @@ if(state_open) . += "[src] must be closed before harvesting." else if(!harvesting) - . += "Alt-click [src] to start harvesting." \ No newline at end of file + . += "Alt-click [src] to start harvesting." + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads: Harvest speed at [interval*0.1] seconds per organ.") diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index b1783ba940..d48a71ce46 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -143,6 +143,11 @@ GLOBAL_LIST_EMPTY(network_holopads) holograph_range += 1 * B.rating holo_range = holograph_range +/obj/machinery/holopad/examine(mob/user) + ..() + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads: Current projection range: [holo_range] units.") + /obj/machinery/holopad/attackby(obj/item/P, mob/user, params) if(default_deconstruction_screwdriver(user, "holopad_open", "holopad0", P)) return diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm index 5418dcdb97..4a51a7b0c5 100644 --- a/code/game/machinery/launch_pad.dm +++ b/code/game/machinery/launch_pad.dm @@ -23,6 +23,11 @@ E += M.rating*15 range = E +/obj/machinery/launchpad/examine(mob/user) + ..() + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads: Maximum range: [range] units.") + /obj/machinery/launchpad/attackby(obj/item/I, mob/user, params) if(stationary) if(default_deconstruction_screwdriver(user, "lpad-idle-o", "lpad-idle", I)) diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index bf9400219b..9c2bd0744b 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -144,7 +144,7 @@ // Set this limb up using the specias name and body zone limb.icon_state = "[selected_category]_[limb.body_zone]" limb.name = "\improper synthetic [selected_category] [parse_zone(limb.body_zone)]" - limb.desc = "A synthetic [selected_category] limb that will morph on its first use in surgery. This one is for the [parse_zone(limb.body_zone)]" + limb.desc = "A synthetic [selected_category] limb that will morph on its first use in surgery. This one is for the [parse_zone(limb.body_zone)]." limb.species_id = selected_category limb.update_icon_dropped() @@ -158,6 +158,11 @@ T -= M.rating*0.2 prod_coeff = min(1,max(0,T)) // Coeff going 1 -> 0,8 -> 0,6 -> 0,4 +/obj/machinery/limbgrower/examine(mob/user) + ..() + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads: Storing up to [reagents.maximum_volume]u of synthflesh.
Synthflesh consumption at [prod_coeff*100]%.") + /obj/machinery/limbgrower/proc/main_win(mob/user) var/dat = "

Limb Grower Menu:


" dat += "Chemical Storage" diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 927608d3d5..fcfdcc44bb 100755 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -23,6 +23,11 @@ for(var/obj/item/stock_parts/capacitor/C in component_parts) recharge_coeff = C.rating +/obj/machinery/recharger/examine(mob/user) + ..() + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads: Recharging [recharge_coeff*10]% cell charge per cycle.") + /obj/machinery/recharger/proc/setCharging(new_charging) charging = new_charging if (new_charging) diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index c0f563d44d..fa438b518b 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -50,6 +50,13 @@ for(var/obj/item/stock_parts/cell/C in component_parts) recharge_speed *= C.maxcharge / 10000 +/obj/machinery/recharge_station/examine(mob/user) + ..() + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads: Recharging [recharge_speed]J per cycle.") + if(repairs) + to_chat(user, "[src] has been upgraded to support automatic repairs.") + /obj/machinery/recharge_station/process() if(!is_operational()) return diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index c8beeb8c83..b7c4d8f5d6 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -41,9 +41,10 @@ /obj/machinery/recycler/examine(mob/user) . = ..() - . += "The power light is [(stat & NOPOWER) ? "off" : "on"]." - . += "The safety-mode light is [safety_mode ? "on" : "off"]." - . += "The safety-sensors status light is [obj_flags & EMAGGED ? "off" : "on"]." + . += "Reclaiming [amount_produced]% of materials salvaged." + . += {"The power light is [(stat & NOPOWER) ? "off" : "on"]. + The safety-mode light is [safety_mode ? "on" : "off"]. + The safety-sensors status light is [obj_flags & EMAGGED ? "off" : "on"]."} /obj/machinery/recycler/power_change() ..() diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 984a911d32..968ff69e66 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -52,6 +52,8 @@ . += "The charge meter reads [cell ? round(cell.percent(), 1) : 0]%." else . += "There is no power cell installed." + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads: Temperature range at [settableTemperatureRange]°C.
Heating power at [heatingPower*0.001]kJ.
Power consumption at [(efficiency*-0.0025)+150]%.") //100%, 75%, 50%, 25% /obj/machinery/space_heater/update_icon() if(on) diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index ae71a0b844..3a52e652d3 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -11,7 +11,7 @@ idle_power_usage = 10 active_power_usage = 2000 circuit = /obj/item/circuitboard/machine/teleporter_hub - var/accurate = FALSE + var/accuracy = 0 var/obj/machinery/teleport/station/power_station var/calibrated //Calibration prevents mutation @@ -29,7 +29,12 @@ var/A = 0 for(var/obj/item/stock_parts/matter_bin/M in component_parts) A += M.rating - accurate = A + accuracy = A + +/obj/machinery/teleport/hub/examine(mob/user) + ..() + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads: Probability of malfunction decreased by [(accuracy*25)-25]%.") /obj/machinery/teleport/hub/proc/link_power_station() if(power_station) @@ -69,13 +74,13 @@ if(do_teleport(M, com.target, channel = TELEPORT_CHANNEL_BLUESPACE)) use_power(5000) - if(!calibrated && iscarbon(M) && prob(30 - ((accurate) * 10))) //oh dear a problem + if(!calibrated && iscarbon(M) && prob(30 - ((accuracy) * 10))) //oh dear a problem var/mob/living/carbon/C = M if(C.dna?.species && C.dna.species.id != "fly" && !HAS_TRAIT(C, TRAIT_RADIMMUNE)) to_chat(C, "You hear a buzzing in your ears.") C.set_species(/datum/species/fly) log_game("[C] ([key_name(C)]) was turned into a fly person") - C.apply_effect((rand(120 - accurate * 40, 180 - accurate * 60)), EFFECT_IRRADIATE, 0) + C.apply_effect((rand(120 - accuracy * 40, 180 - accuracy * 60)), EFFECT_IRRADIATE, 0) calibrated = FALSE return @@ -102,7 +107,7 @@ /obj/machinery/teleport/station - name = "station" + name = "teleporter station" desc = "The power control station for a bluespace teleporter. Used for toggling power, and can activate a test-fire to prevent malfunctions." icon_state = "controller" use_power = IDLE_POWER_USE @@ -125,6 +130,15 @@ E += C.rating efficiency = E - 1 +/obj/machinery/teleport/station/examine(mob/user) + ..() + if(!panel_open) + to_chat(user, "The panel is screwed in, obstructing the linking device and wiring panel.") + else + to_chat(user, "The linking device is now able to be scanned with a multitool.
The wiring can be connected to a nearby console and hub with a pair of wirecutters.
") + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads: This station can be linked to [efficiency] other station(s).") + /obj/machinery/teleport/station/proc/link_console_and_hub() for(var/direction in GLOB.cardinals) teleporter_hub = locate(/obj/machinery/teleport/hub, get_step(src, direction)) diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm index bc8a675085..9903fa00b1 100644 --- a/code/game/mecha/mech_bay.dm +++ b/code/game/mecha/mech_bay.dm @@ -36,6 +36,11 @@ MC += C.rating max_charge = MC * 25 +/obj/machinery/mech_bay_recharge_port/examine(mob/user) + ..() + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads: Base recharge rate at [max_charge]J per cycle.") + /obj/machinery/mech_bay_recharge_port/process() if(stat & NOPOWER || !recharge_console) return diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 417fefce6e..eaaef75501 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -62,6 +62,11 @@ T += Ml.rating time_coeff = round(initial(time_coeff) - (initial(time_coeff)*(T))/5,0.01) +/obj/machinery/mecha_part_fabricator/examine(mob/user) + ..() + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads: Storing up to [materials.max_amount] material units.
Material consumption at [component_coeff*100]%.
Build time reduced by [100-time_coeff*100]%.") /obj/machinery/mecha_part_fabricator/emag_act() . = ..() diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index 1654ecde41..1f79614da2 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -56,6 +56,14 @@ else return ..() +/obj/item/laser_pointer/examine(mob/user) + ..() + if(in_range(user, src) || isobserver(user)) + if(!diode) + to_chat(user, "The diode is missing.") + else + to_chat(user, "A class [diode.rating] laser diode is installed. It is screwed in place.") + /obj/item/laser_pointer/afterattack(atom/target, mob/living/user, flag, params) . = ..() laser_act(target, user, params) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index 0a54503be5..291eb40507 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -57,6 +57,11 @@ heat_capacity = initial(heat_capacity) / C conduction_coefficient = initial(conduction_coefficient) * C +/obj/machinery/atmospherics/components/unary/cryo_cell/examine(mob/user) //this is leaving out everything but efficiency since they follow the same idea of "better matter bin, better results" + ..() + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads: Efficiency at [efficiency*100]%.") + /obj/machinery/atmospherics/components/unary/cryo_cell/Destroy() QDEL_NULL(radio) QDEL_NULL(beaker) 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 27ee54815f..253dfcd728 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm @@ -66,10 +66,12 @@ God bless America. oil_use = initial(oil_use) - (oil_efficiency * 0.0095) fry_speed = oil_efficiency -/obj/machinery/deepfryer/examine() +/obj/machinery/deepfryer/examine(mob/user) . = ..() if(frying) . += "You can make out \a [frying] in the oil." + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads: Frying at [fry_speed*100]% speed.
Using [oil_use*10] units of oil per second.") /obj/machinery/deepfryer/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/reagent_containers/pill)) diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm index e5c5a4f933..1369341d40 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -30,6 +30,14 @@ if(M.rating >= 2) ignore_clothing = TRUE +/obj/machinery/gibber/examine(mob/user) + ..() + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads: Outputting [meat_produced] meat slab(s) after [gibtime*0.1] seconds of processing.") + for(var/obj/item/stock_parts/manipulator/M in component_parts) + if(M.rating >= 2) + to_chat(user, "Gibber has been upgraded to process inorganic materials.") + /obj/machinery/gibber/update_icon() cut_overlays() if (dirty) diff --git a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm index c25cb2288f..27c0376f63 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm @@ -1,6 +1,6 @@ /obj/machinery/monkey_recycler name = "monkey recycler" - desc = "A machine used for recycling dead monkeys into monkey cubes. It currently produces 1 cube for every 5 monkeys inserted." // except it literally never does + desc = "A machine used for recycling dead monkeys into monkey cubes." // except it literally never does icon = 'icons/obj/kitchen.dmi' icon_state = "grinder" layer = BELOW_OBJ_LAYER @@ -22,7 +22,11 @@ cubes_made = M.rating cube_production = cubes_made required_grind = req_grind - src.desc = "A machine used for recycling dead monkeys into monkey cubes. It currently produces [cubes_made] cube(s) for every [required_grind] monkey(s) inserted." + +/obj/machinery/monkey_recycler/examine(mob/user) + ..() + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads: Producing [cube_production] cube(s) for every [required_grind] monkey(s) inserted.") /obj/machinery/monkey_recycler/attackby(obj/item/O, mob/user, params) if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", O)) diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm index 35ce25bbaf..ae16b9cb66 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm @@ -21,6 +21,11 @@ for(var/obj/item/stock_parts/manipulator/M in component_parts) rating_speed = M.rating +/obj/machinery/processor/examine(mob/user) + ..() + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads: Outputting [rating_amount] item(s) at [rating_speed*100]% speed.") + /obj/machinery/processor/proc/process_food(datum/food_processor_process/recipe, atom/movable/what) if (recipe.output && loc && !QDELETED(src)) for(var/i = 0, i < rating_amount, i++) diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index 893a53ede7..d259b39b31 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -33,6 +33,11 @@ for(var/obj/item/stock_parts/matter_bin/B in component_parts) max_n_of_items = 1500 * B.rating +/obj/machinery/smartfridge/examine(mob/user) + ..() + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads: This unit can hold a maximum of [max_n_of_items] items.") + /obj/machinery/smartfridge/power_change() ..() update_icon() diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index ac750a0492..0d19c4d6cc 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -52,6 +52,12 @@ productivity = P max_items = max_storage + +/obj/machinery/biogenerator/examine(mob/user) + ..() + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads: Productivity at [productivity*100]%.
Matter consumption reduced by [(efficiency*25)-25]%.
Machine can hold up to [max_items] pieces of produce.") + /obj/machinery/biogenerator/on_reagent_change(changetype) //When the reagents change, change the icon as well. update_icon() diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 0b6834c408..2bbb781a03 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -46,6 +46,11 @@ maxwater = tmp_capacity * 50 // Up to 300 maxnutri = tmp_capacity * 5 // Up to 30 +/obj/machinery/hydroponics/constructable/examine(mob/user) + ..() + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads: Tray efficiency at [rating*100]%.") + /obj/machinery/hydroponics/Destroy() if(myseed) qdel(myseed) diff --git a/code/modules/hydroponics/seed_extractor.dm b/code/modules/hydroponics/seed_extractor.dm index d9bea64411..226b73c455 100644 --- a/code/modules/hydroponics/seed_extractor.dm +++ b/code/modules/hydroponics/seed_extractor.dm @@ -56,6 +56,11 @@ for(var/obj/item/stock_parts/manipulator/M in component_parts) seed_multiplier = M.rating +/obj/machinery/seed_extractor/examine(mob/user) + ..() + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads: Extracting [seed_multiplier] seed(s) per piece of produce.
Machine can store up to [max_seeds]% seeds.") + /obj/machinery/seed_extractor/attackby(obj/item/O, mob/user, params) if(default_deconstruction_screwdriver(user, "sextractor_open", "sextractor", O)) diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index a9cd97c331..31a6caf077 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -103,6 +103,8 @@ . += "The generator has [sheets] units of [sheet_name] fuel left, producing [power_gen] per cycle." if(crit_fail) . += "The generator seems to have broken down." + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads: Fuel efficiency increased by [(consumption*100)-100]%.") /obj/machinery/power/port_gen/pacman/HasFuel() if(sheets >= 1 / (time_per_sheet / power_output) - sheet_left) diff --git a/code/modules/power/rtg.dm b/code/modules/power/rtg.dm index 9dca8f3124..21095944dd 100644 --- a/code/modules/power/rtg.dm +++ b/code/modules/power/rtg.dm @@ -36,6 +36,11 @@ power_gen = initial(power_gen) * part_level +/obj/machinery/power/rtg/examine(mob/user) + ..() + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads: Power generation now at [power_gen*0.001]kW.") + /obj/machinery/power/rtg/attackby(obj/item/I, mob/user, params) if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-open", initial(icon_state), I)) return diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 71a8565d26..7bd5fd0110 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -68,6 +68,11 @@ sparks.attach(src) sparks.set_up(1, TRUE, src) +/obj/machinery/power/emitter/examine(mob/user) + ..() + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads: Emitting one beam each [fire_delay*0.1] seconds.
Power consumption at [active_power_usage]W.") + /obj/machinery/power/emitter/ComponentInitialize() . = ..() AddComponent(/datum/component/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES) diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm index 2265f806a5..8d2b81e48a 100644 --- a/code/modules/power/tesla/coil.dm +++ b/code/modules/power/tesla/coil.dm @@ -36,6 +36,11 @@ zap_cooldown -= (C.rating * 20) input_power_multiplier = power_multiplier +/obj/machinery/power/tesla_coil/examine(mob/user) + ..() + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads: Power generation at [input_power_multiplier*100]%.
Shock interval at [zap_cooldown*0.1] seconds.") + /obj/machinery/power/tesla_coil/on_construction() if(anchored) connect_to_network() diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index 85ee7589b9..8487d72afb 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -94,6 +94,11 @@ E += M.rating efficiency = E / 6 +/obj/machinery/power/compressor/examine(mob/user) + ..() + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads: Efficiency at [efficiency*100]%.") + /obj/machinery/power/compressor/attackby(obj/item/I, mob/user, params) if(default_deconstruction_screwdriver(user, initial(icon_state), initial(icon_state), I)) return @@ -176,6 +181,11 @@ P += C.rating productivity = P / 6 +/obj/machinery/power/turbine/examine(mob/user) + ..() + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads: Productivity at [productivity*100]%.") + /obj/machinery/power/turbine/locate_machinery() if(compressor) return diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index b4f14c69a7..6d6b21bf74 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -52,6 +52,11 @@ for(var/obj/item/stock_parts/micro_laser/M in component_parts) heater_coefficient *= M.rating +/obj/machinery/chem_heater/examine(mob/user) + ..() + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads: Heating reagents at [heater_coefficient*1000]% speed.") + /obj/machinery/chem_heater/process() ..() if(stat & NOPOWER) diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index b25ee9bb2d..152f292564 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -82,6 +82,11 @@ for(var/obj/item/stock_parts/micro_laser/M in component_parts) badThingCoeff += M.rating +/obj/machinery/reagentgrinder/examine(mob/user) + ..() + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads: Grinding reagents at [speed*100]%.") + /obj/machinery/rnd/experimentor/proc/checkCircumstances(obj/item/O) //snowflake check to only take "made" bombs if(istype(O, /obj/item/transfer_valve)) diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm index 9ba45fb1a3..44c56835fa 100644 --- a/code/modules/research/machinery/_production.dm +++ b/code/modules/research/machinery/_production.dm @@ -73,6 +73,12 @@ total_rating = max(1, total_rating) efficiency_coeff = total_rating +/obj/machinery/rnd/production/examine(mob/user) + . = ..() + var/datum/component/remote_materials/materials = GetComponent(/datum/component/remote_materials) + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Storing up to [materials.local_size] material units locally.
Material usage efficiency at [efficiency_coeff*50]%.
" + //we eject the materials upon deconstruction. /obj/machinery/rnd/production/on_deconstruction() for(var/obj/item/reagent_containers/glass/G in component_parts) diff --git a/code/modules/research/nanites/nanite_chamber.dm b/code/modules/research/nanites/nanite_chamber.dm index 1fc2633989..90ee9ddf9f 100644 --- a/code/modules/research/nanites/nanite_chamber.dm +++ b/code/modules/research/nanites/nanite_chamber.dm @@ -29,6 +29,11 @@ for(var/obj/item/stock_parts/scanning_module/P in component_parts) scan_level += P.rating +/obj/machinery/nanite_chamber/examine(mob/user) + ..() + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads: Scanning module has been upgraded to level [scan_level].") + /obj/machinery/nanite_chamber/proc/set_busy(status, message, working_icon) busy = status busy_message = message From bb0d012d7a0ff970c60868c0bbb70c012847812d Mon Sep 17 00:00:00 2001 From: Putnam Date: Sun, 12 Jan 2020 16:08:49 -0800 Subject: [PATCH 11/41] well that works --- code/datums/elements/dusts_on_catatonia.dm | 25 +++++++++++++++++++ .../objects/structures/ghost_role_spawners.dm | 1 + tgstation.dme | 1 + 3 files changed, 27 insertions(+) create mode 100644 code/datums/elements/dusts_on_catatonia.dm diff --git a/code/datums/elements/dusts_on_catatonia.dm b/code/datums/elements/dusts_on_catatonia.dm new file mode 100644 index 0000000000..2922bdf80b --- /dev/null +++ b/code/datums/elements/dusts_on_catatonia.dm @@ -0,0 +1,25 @@ +/datum/element/dusts_on_catatonia + element_flags = ELEMENT_DETACH + var/list/mob/attached_mobs = list() + +/datum/element/dusts_on_catatonia/Attach(datum/target,penalize = FALSE) + . = ..() + if(!ismob(target)) + return ELEMENT_INCOMPATIBLE + var/mob/M = target + if(!(M in attached_mobs)) + attached_mobs += M + START_PROCESSING(SSprocessing,src) + +/datum/element/dusts_on_catatonia/Detach(mob/M) + . = ..() + if(M in attached_mobs) + attached_mobs -= M + if(!attached_mobs.len) + STOP_PROCESSING(SSprocessing,src) + +/datum/element/dusts_on_catatonia/process() + for(var/mob/M in attached_mobs) + if(!M.key && !M.get_ghost()) + M.dust(force = TRUE) + Detach(M) diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index 705ca9a884..9c0cc844f9 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -627,6 +627,7 @@ SSjob.equip_loadout(null, new_spawn, FALSE) SSquirks.AssignQuirks(new_spawn, new_spawn.client, TRUE, TRUE, null, FALSE, new_spawn) new_spawn.AddElement(/datum/element/ghost_role_eligibility) + new_spawn.AddElement(/datum/element/dusts_on_catatonia) ADD_TRAIT(new_spawn, TRAIT_SIXTHSENSE, GHOSTROLE_TRAIT) ADD_TRAIT(new_spawn,TRAIT_EXEMPT_HEALTH_EVENTS,GHOSTROLE_TRAIT) to_chat(new_spawn,"You maybe sharing your cafe with some ninja-captured individuals, so make sure to only interact with the ghosts you hear as a ghost!") diff --git a/tgstation.dme b/tgstation.dme index 33a4251dd7..79bc3b58a1 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -469,6 +469,7 @@ #include "code\datums\diseases\advance\symptoms\youth.dm" #include "code\datums\elements\_element.dm" #include "code\datums\elements\cleaning.dm" +#include "code\datums\elements\dusts_on_catatonia.dm" #include "code\datums\elements\earhealing.dm" #include "code\datums\elements\ghost_role_eligibility.dm" #include "code\datums\helper_datums\events.dm" From 6197920101aad834a80619245d000cc71acfb721 Mon Sep 17 00:00:00 2001 From: Putnam Date: Sun, 12 Jan 2020 23:40:28 -0800 Subject: [PATCH 12/41] fixed unnecessary typecheck --- code/datums/elements/dusts_on_catatonia.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/datums/elements/dusts_on_catatonia.dm b/code/datums/elements/dusts_on_catatonia.dm index 2922bdf80b..f5ca5722c4 100644 --- a/code/datums/elements/dusts_on_catatonia.dm +++ b/code/datums/elements/dusts_on_catatonia.dm @@ -19,7 +19,8 @@ STOP_PROCESSING(SSprocessing,src) /datum/element/dusts_on_catatonia/process() - for(var/mob/M in attached_mobs) + for(var/m in attached_mobs) + var/mob/M = m if(!M.key && !M.get_ghost()) M.dust(force = TRUE) Detach(M) From 300fdb431c9840006796bfc2cf2f337912dce3bd Mon Sep 17 00:00:00 2001 From: Artur Date: Fri, 17 Jan 2020 19:46:27 +0100 Subject: [PATCH 13/41] 0 clue if itll even work. Cowabunga it is. --- code/modules/admin/topic.dm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 88d4105124..a15ae74218 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -907,12 +907,16 @@ dat += "Alien" else dat += "Alien" - //Gang if(jobban_isbanned(M, ROLE_GANG) || isbanned_dept) dat += "Gang" else dat += "Gang" + //Bloodsucker + if(jobban_isbanned(M, ROLE_BLOODSUCKER) || isbanned_dept) + dat += "Bloodsucker" + else + dat += "Bloodsucker" //Other Roles (black) From 2fe23b67dbdd2d4e95ace083605dbaf7a59f318f Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Sat, 18 Jan 2020 03:37:30 +0100 Subject: [PATCH 14/41] fug --- code/modules/uplink/uplink_items/uplink_clothing.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/uplink/uplink_items/uplink_clothing.dm b/code/modules/uplink/uplink_items/uplink_clothing.dm index 2f8391c637..3a3c53288a 100644 --- a/code/modules/uplink/uplink_items/uplink_clothing.dm +++ b/code/modules/uplink/uplink_items/uplink_clothing.dm @@ -29,14 +29,14 @@ exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) /datum/uplink_item/suits/kevlar - name = "Kevlar sheets" + name = "Kevlar Padding" desc = "An inconspicious kevlar padding meant to be worn underneath jumpsuits, will cushion the wearer from ballistic harm." item = /obj/item/clothing/accessory/kevlar cost = 2 exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) /datum/uplink_item/suits/plastic - name = "Plastic sheet" + name = "Ablative Padding" desc = "An inconspicious ablative padding meant to be worn underneath jumpsuits, will cushion the wearer from energy lasers harm." item = /obj/item/clothing/accessory/plastics cost = 2 From 54a2b32f4241d40fd1989fa1db1c0f895322bbaa Mon Sep 17 00:00:00 2001 From: chefferz Date: Fri, 17 Jan 2020 23:55:44 -0500 Subject: [PATCH 15/41] Update console.dm --- code/modules/antagonists/abductor/machinery/console.dm | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/code/modules/antagonists/abductor/machinery/console.dm b/code/modules/antagonists/abductor/machinery/console.dm index 47294bc766..b8d5b1bf6d 100644 --- a/code/modules/antagonists/abductor/machinery/console.dm +++ b/code/modules/antagonists/abductor/machinery/console.dm @@ -46,7 +46,6 @@ dat += "Advanced Baton (2 Credits)
" dat += "Mental Interface Device (2 Credits)
" dat += "Reagent Synthesizer (2 Credits)
" - dat += "Shrink Ray Blaster (2 Credits)
" dat += "Agent Helmet (1 Credit)
" dat += "Agent Vest (1 Credit)
" dat += "Radio Silencer (1 Credit)
" @@ -119,8 +118,6 @@ Dispense(/obj/item/abductor_machine_beacon/chem_dispenser,cost=2) if("tongue") Dispense(/obj/item/organ/tongue/abductor) - if("shrink_ray") - Dispense(/obj/item/gun/energy/shrink_ray,cost=2) updateUsrDialog() /obj/machinery/abductor/console/proc/TeleporterRetrieve() @@ -245,4 +242,4 @@ new item(drop_location) else - say("Insufficent data!") \ No newline at end of file + say("Insufficent data!") From c612462b8c8ff179e5d5fa1ff006fac709facc39 Mon Sep 17 00:00:00 2001 From: Putnam Date: Sat, 18 Jan 2020 03:39:27 -0800 Subject: [PATCH 16/41] some demodularization + new eligibility stuff --- .../datums/elements/ghost_role_eligibility.dm | 2 + code/modules/admin/admin.dm | 40 +++++++++-- code/modules/admin/topic.dm | 69 ++++++++++++++++++- modular_citadel/code/modules/admin/admin.dm | 39 ----------- modular_citadel/code/modules/admin/topic.dm | 59 ---------------- tgstation.dme | 2 - 6 files changed, 106 insertions(+), 105 deletions(-) delete mode 100644 modular_citadel/code/modules/admin/admin.dm delete mode 100644 modular_citadel/code/modules/admin/topic.dm diff --git a/code/datums/elements/ghost_role_eligibility.dm b/code/datums/elements/ghost_role_eligibility.dm index 8ecb579bc8..e57aaddd5a 100644 --- a/code/datums/elements/ghost_role_eligibility.dm +++ b/code/datums/elements/ghost_role_eligibility.dm @@ -22,6 +22,8 @@ if(!(M.ckey in timeouts)) timeouts += M.ckey timeouts[M.ckey] = 0 + else if(timeouts[M.ckey] == CANT_REENTER_ROUND) + return timeouts[M.ckey] = max(timeouts[M.ckey],penalty) /datum/element/ghost_role_eligibility/Detach(mob/M) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 88e68158ed..372902e8d6 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -185,7 +185,6 @@ body += "Shade" body += "
" - if (M.client) body += "

" body += "Other actions:" body += "
" @@ -194,9 +193,9 @@ body += "Thunderdome 2 | " body += "Thunderdome Admin | " body += "Thunderdome Observer | " - - body += usr.client.citaPPoptions(M) // CITADEL - + body += "Make mentor | " + body += "Remove mentor" + body += "Allow reentering round" body += "
" body += "" @@ -1009,3 +1008,36 @@ "Admin login: [key_name(src)]") if(string) message_admins("[string]") + +/client/proc/cmd_admin_man_up(mob/M in GLOB.mob_list) + set category = "Special Verbs" + set name = "Man Up" + + if(!M) + return + if(!check_rights(R_ADMIN)) + return + + to_chat(M, "Man up, and deal with it.
Move on.") + M.playsound_local(M, 'sound/voice/manup.ogg', 50, FALSE, pressure_affected = FALSE) + + log_admin("Man up: [key_name(usr)] told [key_name(M)] to man up") + var/message = "[key_name_admin(usr)] told [key_name_admin(M)] to man up." + message_admins(message) + admin_ticket_log(M, message) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Man Up") + +/client/proc/cmd_admin_man_up_global() + set category = "Special Verbs" + set name = "Man Up Global" + + if(!check_rights(R_ADMIN)) + return + + to_chat(world, "Man up, and deal with it.
Move on.") + for(var/mob/M in GLOB.player_list) + M.playsound_local(M, 'sound/voice/manup.ogg', 50, FALSE, pressure_affected = FALSE) + + log_admin("Man up global: [key_name(usr)] told everybody to man up") + message_admins("[key_name_admin(usr)] told everybody to man up.") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Man Up Global") diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 88d4105124..119c214d6b 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -22,7 +22,10 @@ if(!CheckAdminHref(href, href_list)) return - citaTopic(href, href_list) //CITADEL EDIT, MENTORS + if(href_list["makementor"]) + makeMentor(href_list["makementor"]) + else if(href_list["removementor"]) + removeMentor(href_list["removementor"]) if(href_list["ahelp"]) if(!check_rights(R_ADMIN, TRUE)) @@ -1715,6 +1718,16 @@ log_admin("[key_name(usr)] forced [key_name(M)] to say: [speech]") message_admins("[key_name_admin(usr)] forced [key_name_admin(M)] to say: [speech]") + else if(href_list["makeeligible"]) + if(!check_rights(R_ADMIN)) + return + var/mob/M = locate(href_list["eligible"]) + if(!ismob(M)) + to_chat(usr, "this can only be used on instances of type /mob.") + var/datum/element/ghost_role_eligibility/eli = SSdcs.GetElement(/datum/element/ghost_role_eligibility) + if(M.ckey in eli.timeouts) + eli.timeouts -= M.ckey + else if(href_list["sendtoprison"]) if(!check_rights(R_ADMIN)) return @@ -2846,3 +2859,57 @@ dat += {"Random (default)
"} dat += {"Now: [GLOB.secret_force_mode]"} usr << browse(dat, "window=f_secret") + +/datum/admins/proc/makeMentor(ckey) + if(!usr.client) + return + if (!check_rights(0)) + return + if(!ckey) + return + var/client/C = GLOB.directory[ckey] + if(C) + if(check_rights_for(C, R_ADMIN,0)) + to_chat(usr, "The client chosen is an admin! Cannot mentorize.") + return + if(SSdbcore.Connect()) + var/datum/DBQuery/query_get_mentor = SSdbcore.NewQuery("SELECT id FROM [format_table_name("mentor")] WHERE ckey = '[ckey]'") + if(query_get_mentor.NextRow()) + to_chat(usr, "[ckey] is already a mentor.") + return + var/datum/DBQuery/query_add_mentor = SSdbcore.NewQuery("INSERT INTO `[format_table_name("mentor")]` (`id`, `ckey`) VALUES (null, '[ckey]')") + if(!query_add_mentor.warn_execute()) + return + var/datum/DBQuery/query_add_admin_log = SSdbcore.NewQuery("INSERT INTO `[format_table_name("admin_log")]` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Added new mentor [ckey]');") + if(!query_add_admin_log.warn_execute()) + return + else + to_chat(usr, "Failed to establish database connection. The changes will last only for the current round.") + new /datum/mentors(ckey) + to_chat(usr, "New mentor added.") + +/datum/admins/proc/removeMentor(ckey) + if(!usr.client) + return + if (!check_rights(0)) + return + if(!ckey) + return + var/client/C = GLOB.directory[ckey] + if(C) + if(check_rights_for(C, R_ADMIN,0)) + to_chat(usr, "The client chosen is an admin, not a mentor! Cannot de-mentorize.") + return + C.remove_mentor_verbs() + C.mentor_datum = null + GLOB.mentors -= C + if(SSdbcore.Connect()) + var/datum/DBQuery/query_remove_mentor = SSdbcore.NewQuery("DELETE FROM [format_table_name("mentor")] WHERE ckey = '[ckey]'") + if(!query_remove_mentor.warn_execute()) + return + var/datum/DBQuery/query_add_admin_log = SSdbcore.NewQuery("INSERT INTO `[format_table_name("admin_log")]` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Removed mentor [ckey]');") + if(!query_add_admin_log.warn_execute()) + return + else + to_chat(usr, "Failed to establish database connection. The changes will last only for the current round.") + to_chat(usr, "Mentor removed.") diff --git a/modular_citadel/code/modules/admin/admin.dm b/modular_citadel/code/modules/admin/admin.dm deleted file mode 100644 index 529d0c79ec..0000000000 --- a/modular_citadel/code/modules/admin/admin.dm +++ /dev/null @@ -1,39 +0,0 @@ -/client/proc/citaPPoptions(mob/M) // why is this client and not /datum/admins? noone knows, in PP src == client, instead of holder. wtf. - var/body = "
" - if(M.client) - body += "Make mentor | " - body += "Remove mentor" - return body - -/client/proc/cmd_admin_man_up(mob/M in GLOB.mob_list) - set category = "Special Verbs" - set name = "Man Up" - - if(!M) - return - if(!check_rights(R_ADMIN)) - return - - to_chat(M, "Man up, and deal with it.
Move on.") - M.playsound_local(M, 'sound/voice/manup.ogg', 50, FALSE, pressure_affected = FALSE) - - log_admin("Man up: [key_name(usr)] told [key_name(M)] to man up") - var/message = "[key_name_admin(usr)] told [key_name_admin(M)] to man up." - message_admins(message) - admin_ticket_log(M, message) - SSblackbox.record_feedback("tally", "admin_verb", 1, "Man Up") - -/client/proc/cmd_admin_man_up_global() - set category = "Special Verbs" - set name = "Man Up Global" - - if(!check_rights(R_ADMIN)) - return - - to_chat(world, "Man up, and deal with it.
Move on.") - for(var/mob/M in GLOB.player_list) - M.playsound_local(M, 'sound/voice/manup.ogg', 50, FALSE, pressure_affected = FALSE) - - log_admin("Man up global: [key_name(usr)] told everybody to man up") - message_admins("[key_name_admin(usr)] told everybody to man up.") - SSblackbox.record_feedback("tally", "admin_verb", 1, "Man Up Global") diff --git a/modular_citadel/code/modules/admin/topic.dm b/modular_citadel/code/modules/admin/topic.dm deleted file mode 100644 index 26bc902bef..0000000000 --- a/modular_citadel/code/modules/admin/topic.dm +++ /dev/null @@ -1,59 +0,0 @@ -/datum/admins/proc/citaTopic(href, href_list) - if(href_list["makementor"]) - makeMentor(href_list["makementor"]) - else if(href_list["removementor"]) - removeMentor(href_list["removementor"]) - -/datum/admins/proc/makeMentor(ckey) - if(!usr.client) - return - if (!check_rights(0)) - return - if(!ckey) - return - var/client/C = GLOB.directory[ckey] - if(C) - if(check_rights_for(C, R_ADMIN,0)) - to_chat(usr, "The client chosen is an admin! Cannot mentorize.") - return - if(SSdbcore.Connect()) - var/datum/DBQuery/query_get_mentor = SSdbcore.NewQuery("SELECT id FROM [format_table_name("mentor")] WHERE ckey = '[ckey]'") - if(query_get_mentor.NextRow()) - to_chat(usr, "[ckey] is already a mentor.") - return - var/datum/DBQuery/query_add_mentor = SSdbcore.NewQuery("INSERT INTO `[format_table_name("mentor")]` (`id`, `ckey`) VALUES (null, '[ckey]')") - if(!query_add_mentor.warn_execute()) - return - var/datum/DBQuery/query_add_admin_log = SSdbcore.NewQuery("INSERT INTO `[format_table_name("admin_log")]` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Added new mentor [ckey]');") - if(!query_add_admin_log.warn_execute()) - return - else - to_chat(usr, "Failed to establish database connection. The changes will last only for the current round.") - new /datum/mentors(ckey) - to_chat(usr, "New mentor added.") - -/datum/admins/proc/removeMentor(ckey) - if(!usr.client) - return - if (!check_rights(0)) - return - if(!ckey) - return - var/client/C = GLOB.directory[ckey] - if(C) - if(check_rights_for(C, R_ADMIN,0)) - to_chat(usr, "The client chosen is an admin, not a mentor! Cannot de-mentorize.") - return - C.remove_mentor_verbs() - C.mentor_datum = null - GLOB.mentors -= C - if(SSdbcore.Connect()) - var/datum/DBQuery/query_remove_mentor = SSdbcore.NewQuery("DELETE FROM [format_table_name("mentor")] WHERE ckey = '[ckey]'") - if(!query_remove_mentor.warn_execute()) - return - var/datum/DBQuery/query_add_admin_log = SSdbcore.NewQuery("INSERT INTO `[format_table_name("admin_log")]` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Removed mentor [ckey]');") - if(!query_add_admin_log.warn_execute()) - return - else - to_chat(usr, "Failed to establish database connection. The changes will last only for the current round.") - to_chat(usr, "Mentor removed.") \ No newline at end of file diff --git a/tgstation.dme b/tgstation.dme index 1893edc33d..f90156d466 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -3091,11 +3091,9 @@ #include "modular_citadel\code\game\machinery\wishgranter.dm" #include "modular_citadel\code\game\objects\cit_screenshake.dm" #include "modular_citadel\code\game\objects\effects\temporary_visuals\souldeath.dm" -#include "modular_citadel\code\modules\admin\admin.dm" #include "modular_citadel\code\modules\admin\chat_commands.dm" #include "modular_citadel\code\modules\admin\holder2.dm" #include "modular_citadel\code\modules\admin\secrets.dm" -#include "modular_citadel\code\modules\admin\topic.dm" #include "modular_citadel\code\modules\arousal\arousal.dm" #include "modular_citadel\code\modules\arousal\genitals.dm" #include "modular_citadel\code\modules\arousal\genitals_sprite_accessories.dm" From 133cb89b32fe4c8e615cb38378905a24c31f9488 Mon Sep 17 00:00:00 2001 From: Putnam Date: Sat, 18 Jan 2020 06:55:26 -0800 Subject: [PATCH 17/41] hilbert's hotel for ghost dojo --- _maps/map_files/generic/CentCom.dmm | 6 +++++- code/modules/ruins/spaceruin_code/hilbertshotel.dm | 9 +++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 9a94fd3f61..ee4288d7fc 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -7891,6 +7891,10 @@ }, /turf/open/floor/engine/cult, /area/wizard_station) +"sa" = ( +/obj/item/hilbertshotel/ghostdojo, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "sc" = ( /obj/docking_port/stationary{ area_type = /area/syndicate_mothership/control; @@ -47751,7 +47755,7 @@ Of QF Nd Sd -Sd +sa Nd WN Ur diff --git a/code/modules/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/ruins/spaceruin_code/hilbertshotel.dm index f64b5e4d01..dc721506a5 100644 --- a/code/modules/ruins/spaceruin_code/hilbertshotel.dm +++ b/code/modules/ruins/spaceruin_code/hilbertshotel.dm @@ -172,6 +172,15 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337) var/turf/T = locate(_x, _y, _z) A.forceMove(T) +/obj/item/hilbertshotel/ghostdojo + name = "Infinite Dormitories" + anchored = TRUE + interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND + +/obj/item/hilbertshotel/ghostdojo/interact(mob/user) + . = ..() + promptAndCheckIn(user) + //Template Stuff /datum/map_template/hilbertshotel name = "Hilbert's Hotel Room" From 072eca6ec018d08347d2a5dd917f7f46bcda80a6 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Sat, 18 Jan 2020 23:01:00 +0100 Subject: [PATCH 18/41] fixes and more PRs --- code/__DEFINES/traits.dm | 2 ++ code/datums/helper_datums/teleport.dm | 2 +- code/modules/mob/living/silicon/ai/ai.dm | 11 +++++++---- .../simple_animal/hostile/megafauna/megafauna.dm | 1 + 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index e48eea451d..033636017d 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -173,6 +173,7 @@ #define TRAIT_AUTO_CATCH_ITEM "auto_catch_item" #define TRAIT_CLOWN_MENTALITY "clown_mentality" // The future is now, clownman. #define TRAIT_FREESPRINT "free_sprinting" +#define TRAIT_NO_TELEPORT "no-teleport" //you just can't #define TRAIT_NO_ALCOHOL "alcohol_intolerance" // common trait sources @@ -234,4 +235,5 @@ #define NUKEOP_ANTAGONIST "nukeop-antagonist" #define MADE_UNCLONEABLE "made-uncloneable" #define NUKEOP_TRAIT "nuke-op" +#define MEGAFAUNA_TRAIT "megafauna" #define DEATHSQUAD_TRAIT "deathsquad" diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index 1c2ce851fe..6b0981665d 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -66,7 +66,7 @@ var/area/A = get_area(curturf) var/area/B = get_area(destturf) - if(!forced && (A.noteleport || B.noteleport)) + if(!forced && (HAS_TRAIT(teleatom, TRAIT_NO_TELEPORT) || A.noteleport || B.noteleport)) return FALSE if(SEND_SIGNAL(destturf, COMSIG_ATOM_INTERCEPT_TELEPORT, channel, curturf, destturf)) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 54548962eb..33cbdb7cc9 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -16,7 +16,7 @@ name = "AI" icon = 'icons/mob/ai.dmi' icon_state = "ai" - move_resist = MOVE_FORCE_VERY_STRONG + move_resist = MOVE_FORCE_OVERPOWERING density = TRUE canmove = FALSE status_flags = CANSTUN|CANPUSH @@ -101,6 +101,7 @@ new/obj/structure/AIcore/deactivated(loc) //New empty terminal. return INITIALIZE_HINT_QDEL //Delete AI. + ADD_TRAIT(src, TRAIT_NO_TELEPORT, src) if(L && istype(L, /datum/ai_laws)) laws = L laws.associate(src) @@ -312,11 +313,13 @@ if(incapacitated()) return var/is_anchored = FALSE - if(move_resist == MOVE_FORCE_VERY_STRONG) - move_resist = MOVE_FORCE_VERY_STRONG + if(move_resist == MOVE_FORCE_OVERPOWERING) + move_resist = MOVE_FORCE_NORMAL else is_anchored = TRUE - move_resist = MOVE_FORCE_NORMAL + move_resist = MOVE_FORCE_OVERPOWERING + REMOVE_TRAIT(src, TRAIT_NO_TELEPORT, src) + ADD_TRAIT(src, TRAIT_NO_TELEPORT, src) to_chat(src, "You are now [is_anchored ? "" : "un"]anchored.") // the message in the [] will change depending whether or not the AI is anchored diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index db35fc95c9..d7c52efe1d 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -39,6 +39,7 @@ /mob/living/simple_animal/hostile/megafauna/Initialize(mapload) . = ..() apply_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING) + ADD_TRAIT(src, TRAIT_NO_TELEPORT, MEGAFAUNA_TRAIT) /mob/living/simple_animal/hostile/megafauna/Destroy() QDEL_NULL(internal) From 590d71ddc111c0e3eb02f54559fce3851c000de4 Mon Sep 17 00:00:00 2001 From: Hatterhat Date: Sat, 18 Jan 2020 23:35:52 -0600 Subject: [PATCH 19/41] hey ghom i fixed it i think --- code/game/machinery/cell_charger.dm | 2 +- code/game/machinery/cloning.dm | 2 +- code/game/machinery/dna_scanner.dm | 6 +++--- code/game/machinery/doors/firedoor.dm | 2 +- code/game/machinery/harvester.dm | 2 +- code/game/machinery/hologram.dm | 4 ++-- code/game/machinery/launch_pad.dm | 4 ++-- code/game/machinery/limbgrower.dm | 4 ++-- code/game/machinery/recharger.dm | 18 +++++++++++++++--- code/game/machinery/rechargestation.dm | 4 ++-- code/game/machinery/spaceheater.dm | 2 +- code/game/machinery/teleporter.dm | 12 ++++++------ code/game/mecha/mech_bay.dm | 4 ++-- code/game/mecha/mech_fabricator.dm | 4 ++-- .../game/objects/items/devices/laserpointer.dm | 6 +++--- .../machinery/components/unary_devices/cryo.dm | 4 ++-- .../kitchen_machinery/deep_fryer.dm | 2 +- .../kitchen_machinery/gibber.dm | 6 +++--- .../kitchen_machinery/monkeyrecycler.dm | 4 ++-- .../kitchen_machinery/processor.dm | 4 ++-- .../kitchen_machinery/smartfridge.dm | 4 ++-- code/modules/hydroponics/biogenerator.dm | 4 ++-- code/modules/hydroponics/hydroponics.dm | 4 ++-- code/modules/hydroponics/seed_extractor.dm | 4 ++-- code/modules/power/port_gen.dm | 2 +- code/modules/power/rtg.dm | 4 ++-- code/modules/power/singularity/emitter.dm | 4 ++-- code/modules/power/tesla/coil.dm | 4 ++-- code/modules/power/turbine.dm | 8 ++++---- .../chemistry/machinery/chem_dispenser.dm | 4 +++- .../chemistry/machinery/chem_heater.dm | 4 ++-- code/modules/research/experimentor.dm | 6 +++--- code/modules/research/machinery/_production.dm | 2 +- .../modules/research/nanites/nanite_chamber.dm | 4 ++-- 34 files changed, 84 insertions(+), 70 deletions(-) diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index 2c3a6fa18b..fc6cac785a 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -29,7 +29,7 @@ if(charging) . += "Current charge: [round(charging.percent(), 1)]%." if(in_range(user, src) || isobserver(user)) - to_chat(user, "The status display reads: Charge rate at [charge_rate]J per cycle.") + . += "The status display reads: Charge rate at [charge_rate]J per cycle." /obj/machinery/cell_charger/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/stock_parts/cell) && !panel_open) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index ba5c4c9998..711b221c54 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -106,7 +106,7 @@ if(mess) . += "It's filled with blood and viscera. You swear you can see it moving..." if(in_range(user, src) || isobserver(user)) - to_chat(user, "The status display reads: Speed [speed_coeff*50]%.
Predicted amount of cellular damage: [100-heal_level]%.") + . += "The status display reads: Cloning speed at [speed_coeff*50]%.
Predicted amount of cellular damage: [100-heal_level]%.
" if(efficiency > 5) to_chat(user, "Pod has been upgraded to support autoprocessing.") if(is_operational() && mob_occupant) diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm index 648e9f5e71..cff2e361bd 100644 --- a/code/game/machinery/dna_scanner.dm +++ b/code/game/machinery/dna_scanner.dm @@ -28,11 +28,11 @@ damage_coeff = P.rating /obj/machinery/dna_scannernew/examine(mob/user) - ..() + . = ..() if(in_range(user, src) || isobserver(user)) - to_chat(user, "The status display reads: Radiation pulse accuracy increased by factor [precision_coeff**2].
Radiation pulse damage decreased by factor [damage_coeff**2].") + . += "The status display reads: Radiation pulse accuracy increased by factor [precision_coeff**2].
Radiation pulse damage decreased by factor [damage_coeff**2].
" if(scan_level >= 3) - to_chat(user, "Scanner has been upgraded to support autoprocessing.") + . += "Scanner has been upgraded to support autoprocessing." /obj/machinery/dna_scannernew/update_icon() diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 0429db5792..f5bf8c8a1b 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -32,7 +32,7 @@ CalculateAffectingAreas() /obj/machinery/door/firedoor/examine(mob/user) - ..() + . = ..() if(!density) . += "It is open, but could be pried closed." else if(!welded) diff --git a/code/game/machinery/harvester.dm b/code/game/machinery/harvester.dm index 40e898e29c..40430b37b7 100644 --- a/code/game/machinery/harvester.dm +++ b/code/game/machinery/harvester.dm @@ -193,4 +193,4 @@ else if(!harvesting) . += "Alt-click [src] to start harvesting." if(in_range(user, src) || isobserver(user)) - to_chat(user, "The status display reads: Harvest speed at [interval*0.1] seconds per organ.") + . += "The status display reads: Harvest speed at [interval*0.1] seconds per organ." diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 53a75445c0..f3e446c686 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -144,9 +144,9 @@ GLOBAL_LIST_EMPTY(network_holopads) holo_range = holograph_range /obj/machinery/holopad/examine(mob/user) - ..() + . = ..() if(in_range(user, src) || isobserver(user)) - to_chat(user, "The status display reads: Current projection range: [holo_range] units.") + . += "The status display reads: Current projection range: [holo_range] units." /obj/machinery/holopad/attackby(obj/item/P, mob/user, params) if(default_deconstruction_screwdriver(user, "holopad_open", "holopad0", P)) diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm index 4a51a7b0c5..b4a9584368 100644 --- a/code/game/machinery/launch_pad.dm +++ b/code/game/machinery/launch_pad.dm @@ -24,9 +24,9 @@ range = E /obj/machinery/launchpad/examine(mob/user) - ..() + . = ..() if(in_range(user, src) || isobserver(user)) - to_chat(user, "The status display reads: Maximum range: [range] units.") + . += "The status display reads: Maximum range: [range] units." /obj/machinery/launchpad/attackby(obj/item/I, mob/user, params) if(stationary) diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index 9c2bd0744b..28afea817b 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -159,9 +159,9 @@ prod_coeff = min(1,max(0,T)) // Coeff going 1 -> 0,8 -> 0,6 -> 0,4 /obj/machinery/limbgrower/examine(mob/user) - ..() + . = ..() if(in_range(user, src) || isobserver(user)) - to_chat(user, "The status display reads: Storing up to [reagents.maximum_volume]u of synthflesh.
Synthflesh consumption at [prod_coeff*100]%.") + . += "The status display reads: Storing up to [reagents.maximum_volume]u of synthflesh.
Synthflesh consumption at [prod_coeff*100]%." /obj/machinery/limbgrower/proc/main_win(mob/user) var/dat = "

Limb Grower Menu:


" diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 373fb4df37..2211397f3e 100755 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -24,9 +24,21 @@ recharge_coeff = C.rating /obj/machinery/recharger/examine(mob/user) - ..() - if(in_range(user, src) || isobserver(user)) - to_chat(user, "The status display reads: Recharging [recharge_coeff*10]% cell charge per cycle.") + . = ..() + if(!in_range(user, src) && !issilicon(user) && !isobserver(user)) + . += "You're too far away to examine [src]'s contents and display!" + return + + if(charging) + . += {"\The [src] contains: + - \A [charging]."} + + if(!(stat & (NOPOWER|BROKEN))) + . += "The status display reads:" + . += "- Recharging [recharge_coeff*10]% cell charge per cycle." + if(charging) + var/obj/item/stock_parts/cell/C = charging.get_cell() + . += "- \The [charging]'s cell is at [C.percent()]%." /obj/machinery/recharger/proc/setCharging(new_charging) charging = new_charging diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index 9667386790..374c0c71b9 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -51,9 +51,9 @@ recharge_speed *= C.maxcharge / 10000 /obj/machinery/recharge_station/examine(mob/user) - ..() + . = ..() if(in_range(user, src) || isobserver(user)) - to_chat(user, "The status display reads: Recharging [recharge_speed]J per cycle.") + . += "The status display reads: Recharging [recharge_speed]J per cycle." if(repairs) to_chat(user, "[src] has been upgraded to support automatic repairs.") diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 968ff69e66..6eca52aa0e 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -53,7 +53,7 @@ else . += "There is no power cell installed." if(in_range(user, src) || isobserver(user)) - to_chat(user, "The status display reads: Temperature range at [settableTemperatureRange]°C.
Heating power at [heatingPower*0.001]kJ.
Power consumption at [(efficiency*-0.0025)+150]%.") //100%, 75%, 50%, 25% + . += "The status display reads: Temperature range at [settableTemperatureRange]°C.
Heating power at [heatingPower*0.001]kJ.
Power consumption at [(efficiency*-0.0025)+150]%." //100%, 75%, 50%, 25% /obj/machinery/space_heater/update_icon() if(on) diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 3a52e652d3..3cc71df0f1 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -32,9 +32,9 @@ accuracy = A /obj/machinery/teleport/hub/examine(mob/user) - ..() + . = ..() if(in_range(user, src) || isobserver(user)) - to_chat(user, "The status display reads: Probability of malfunction decreased by [(accuracy*25)-25]%.") + . += "The status display reads: Probability of malfunction decreased by [(accuracy*25)-25]%." /obj/machinery/teleport/hub/proc/link_power_station() if(power_station) @@ -131,13 +131,13 @@ efficiency = E - 1 /obj/machinery/teleport/station/examine(mob/user) - ..() + . = ..() if(!panel_open) - to_chat(user, "The panel is screwed in, obstructing the linking device and wiring panel.") + . += "The panel is screwed in, obstructing the linking device and wiring panel." else - to_chat(user, "The linking device is now able to be scanned with a multitool.
The wiring can be connected to a nearby console and hub with a pair of wirecutters.
") + . += "The linking device is now able to be scanned with a multitool.
The wiring can be connected to a nearby console and hub with a pair of wirecutters.
" if(in_range(user, src) || isobserver(user)) - to_chat(user, "The status display reads: This station can be linked to [efficiency] other station(s).") + . += "The status display reads: This station can be linked to [efficiency] other station(s)." /obj/machinery/teleport/station/proc/link_console_and_hub() for(var/direction in GLOB.cardinals) diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm index 9903fa00b1..90f037c279 100644 --- a/code/game/mecha/mech_bay.dm +++ b/code/game/mecha/mech_bay.dm @@ -37,9 +37,9 @@ max_charge = MC * 25 /obj/machinery/mech_bay_recharge_port/examine(mob/user) - ..() + . = ..() if(in_range(user, src) || isobserver(user)) - to_chat(user, "The status display reads: Base recharge rate at [max_charge]J per cycle.") + . += "The status display reads: Base recharge rate at [max_charge]J per cycle." /obj/machinery/mech_bay_recharge_port/process() if(stat & NOPOWER || !recharge_console) diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 2e95894361..98e4eb4258 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -63,10 +63,10 @@ time_coeff = round(initial(time_coeff) - (initial(time_coeff)*(T))/5,0.01) /obj/machinery/mecha_part_fabricator/examine(mob/user) - ..() + . = ..() var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) if(in_range(user, src) || isobserver(user)) - to_chat(user, "The status display reads: Storing up to [materials.max_amount] material units.
Material consumption at [component_coeff*100]%.
Build time reduced by [100-time_coeff*100]%.") + . += "The status display reads: Storing up to [materials.max_amount] material units.
Material consumption at [component_coeff*100]%.
Build time reduced by [100-time_coeff*100]%.
" /obj/machinery/mecha_part_fabricator/emag_act() . = ..() diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index 51485e4925..1f2f1ddda2 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -57,12 +57,12 @@ return ..() /obj/item/laser_pointer/examine(mob/user) - ..() + . = ..() if(in_range(user, src) || isobserver(user)) if(!diode) - to_chat(user, "The diode is missing.") + . += "The diode is missing." else - to_chat(user, "A class [diode.rating] laser diode is installed. It is screwed in place.") + . += "A class [diode.rating] laser diode is installed. It is screwed in place." /obj/item/laser_pointer/afterattack(atom/target, mob/living/user, flag, params) . = ..() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index 0eabc652c4..539b5ce57a 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -58,9 +58,9 @@ conduction_coefficient = initial(conduction_coefficient) * C /obj/machinery/atmospherics/components/unary/cryo_cell/examine(mob/user) //this is leaving out everything but efficiency since they follow the same idea of "better matter bin, better results" - ..() + . = ..() if(in_range(user, src) || isobserver(user)) - to_chat(user, "The status display reads: Efficiency at [efficiency*100]%.") + . += "The status display reads: Efficiency at [efficiency*100]%." /obj/machinery/atmospherics/components/unary/cryo_cell/Destroy() QDEL_NULL(radio) 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 253dfcd728..f3b8e466f3 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm @@ -71,7 +71,7 @@ God bless America. if(frying) . += "You can make out \a [frying] in the oil." if(in_range(user, src) || isobserver(user)) - to_chat(user, "The status display reads: Frying at [fry_speed*100]% speed.
Using [oil_use*10] units of oil per second.") + . += "The status display reads: Frying at [fry_speed*100]% speed.
Using [oil_use*10] units of oil per second.
" /obj/machinery/deepfryer/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/reagent_containers/pill)) diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm index 1369341d40..4406491f10 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -31,12 +31,12 @@ ignore_clothing = TRUE /obj/machinery/gibber/examine(mob/user) - ..() + . = ..() if(in_range(user, src) || isobserver(user)) - to_chat(user, "The status display reads: Outputting [meat_produced] meat slab(s) after [gibtime*0.1] seconds of processing.") + . += "The status display reads: Outputting [meat_produced] meat slab(s) after [gibtime*0.1] seconds of processing." for(var/obj/item/stock_parts/manipulator/M in component_parts) if(M.rating >= 2) - to_chat(user, "Gibber has been upgraded to process inorganic materials.") + . += "Gibber has been upgraded to process inorganic materials." /obj/machinery/gibber/update_icon() cut_overlays() diff --git a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm index 27c0376f63..3d7341308b 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm @@ -24,9 +24,9 @@ required_grind = req_grind /obj/machinery/monkey_recycler/examine(mob/user) - ..() + . = ..() if(in_range(user, src) || isobserver(user)) - to_chat(user, "The status display reads: Producing [cube_production] cube(s) for every [required_grind] monkey(s) inserted.") + . += "The status display reads: Producing [cube_production] cubes for every monkey inserted." /obj/machinery/monkey_recycler/attackby(obj/item/O, mob/user, params) if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", O)) diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm index ae16b9cb66..b81c127523 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm @@ -22,9 +22,9 @@ rating_speed = M.rating /obj/machinery/processor/examine(mob/user) - ..() + . = ..() if(in_range(user, src) || isobserver(user)) - to_chat(user, "The status display reads: Outputting [rating_amount] item(s) at [rating_speed*100]% speed.") + . += "The status display reads: Outputting [rating_amount] item(s) at [rating_speed*100]% speed." /obj/machinery/processor/proc/process_food(datum/food_processor_process/recipe, atom/movable/what) if (recipe.output && loc && !QDELETED(src)) diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index d259b39b31..7619f68448 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -34,9 +34,9 @@ max_n_of_items = 1500 * B.rating /obj/machinery/smartfridge/examine(mob/user) - ..() + . = ..() if(in_range(user, src) || isobserver(user)) - to_chat(user, "The status display reads: This unit can hold a maximum of [max_n_of_items] items.") + . += "The status display reads: This unit can hold a maximum of [max_n_of_items] items." /obj/machinery/smartfridge/power_change() ..() diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index 3acff55d38..2376010408 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -54,9 +54,9 @@ /obj/machinery/biogenerator/examine(mob/user) - ..() + . = ..() if(in_range(user, src) || isobserver(user)) - to_chat(user, "The status display reads: Productivity at [productivity*100]%.
Matter consumption reduced by [(efficiency*25)-25]%.
Machine can hold up to [max_items] pieces of produce.") + . += "The status display reads: Productivity at [productivity*100]%.
Matter consumption reduced by [(efficiency*25)-25]%.
Machine can hold up to [max_items] pieces of produce.
" /obj/machinery/biogenerator/on_reagent_change(changetype) //When the reagents change, change the icon as well. update_icon() diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 0d53d5eb76..f122f7cc4a 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -47,9 +47,9 @@ maxnutri = tmp_capacity * 5 // Up to 30 /obj/machinery/hydroponics/constructable/examine(mob/user) - ..() + . = ..() if(in_range(user, src) || isobserver(user)) - to_chat(user, "The status display reads: Tray efficiency at [rating*100]%.") + . += "The status display reads: Tray efficiency at [rating*100]%." /obj/machinery/hydroponics/Destroy() if(myseed) diff --git a/code/modules/hydroponics/seed_extractor.dm b/code/modules/hydroponics/seed_extractor.dm index f4ca3e95c6..617b980654 100644 --- a/code/modules/hydroponics/seed_extractor.dm +++ b/code/modules/hydroponics/seed_extractor.dm @@ -57,9 +57,9 @@ seed_multiplier = M.rating /obj/machinery/seed_extractor/examine(mob/user) - ..() + . = ..() if(in_range(user, src) || isobserver(user)) - to_chat(user, "The status display reads: Extracting [seed_multiplier] seed(s) per piece of produce.
Machine can store up to [max_seeds]% seeds.") + . += "The status display reads: Extracting [seed_multiplier] seed(s) per piece of produce.
Machine can store up to [max_seeds]% seeds.
" /obj/machinery/seed_extractor/attackby(obj/item/O, mob/user, params) diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index ce219656d7..3a6a98d681 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -104,7 +104,7 @@ if(crit_fail) . += "The generator seems to have broken down." if(in_range(user, src) || isobserver(user)) - to_chat(user, "The status display reads: Fuel efficiency increased by [(consumption*100)-100]%.") + . += "The status display reads: Fuel efficiency increased by [(consumption*100)-100]%." /obj/machinery/power/port_gen/pacman/HasFuel() if(sheets >= 1 / (time_per_sheet / power_output) - sheet_left) diff --git a/code/modules/power/rtg.dm b/code/modules/power/rtg.dm index 21095944dd..fd97ea52ba 100644 --- a/code/modules/power/rtg.dm +++ b/code/modules/power/rtg.dm @@ -37,9 +37,9 @@ power_gen = initial(power_gen) * part_level /obj/machinery/power/rtg/examine(mob/user) - ..() + . = ..() if(in_range(user, src) || isobserver(user)) - to_chat(user, "The status display reads: Power generation now at [power_gen*0.001]kW.") + . += "The status display reads: Power generation now at [power_gen*0.001]kW." /obj/machinery/power/rtg/attackby(obj/item/I, mob/user, params) if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-open", initial(icon_state), I)) diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 7f0e6f23f0..d8b0ede3a2 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -69,9 +69,9 @@ sparks.set_up(1, TRUE, src) /obj/machinery/power/emitter/examine(mob/user) - ..() + . = ..() if(in_range(user, src) || isobserver(user)) - to_chat(user, "The status display reads: Emitting one beam each [fire_delay*0.1] seconds.
Power consumption at [active_power_usage]W.") + . += "The status display reads: Emitting one beam each [fire_delay*0.1] seconds.
Power consumption at [active_power_usage]W.
" /obj/machinery/power/emitter/ComponentInitialize() . = ..() diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm index 8d2b81e48a..e29ffa865e 100644 --- a/code/modules/power/tesla/coil.dm +++ b/code/modules/power/tesla/coil.dm @@ -37,9 +37,9 @@ input_power_multiplier = power_multiplier /obj/machinery/power/tesla_coil/examine(mob/user) - ..() + . = ..() if(in_range(user, src) || isobserver(user)) - to_chat(user, "The status display reads: Power generation at [input_power_multiplier*100]%.
Shock interval at [zap_cooldown*0.1] seconds.") + . += "The status display reads: Power generation at [input_power_multiplier*100]%.
Shock interval at [zap_cooldown*0.1] seconds.
" /obj/machinery/power/tesla_coil/on_construction() if(anchored) diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index 8487d72afb..423aaae3f9 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -95,9 +95,9 @@ efficiency = E / 6 /obj/machinery/power/compressor/examine(mob/user) - ..() + . = ..() if(in_range(user, src) || isobserver(user)) - to_chat(user, "The status display reads: Efficiency at [efficiency*100]%.") + . += "The status display reads: Efficiency at [efficiency*100]%." /obj/machinery/power/compressor/attackby(obj/item/I, mob/user, params) if(default_deconstruction_screwdriver(user, initial(icon_state), initial(icon_state), I)) @@ -182,9 +182,9 @@ productivity = P / 6 /obj/machinery/power/turbine/examine(mob/user) - ..() + . = ..() if(in_range(user, src) || isobserver(user)) - to_chat(user, "The status display reads: Productivity at [productivity*100]%.") + . += "The status display reads: Productivity at [productivity*100]%." /obj/machinery/power/turbine/locate_machinery() if(compressor) diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 424f2bce30..ce839f33d7 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -113,7 +113,9 @@ if(panel_open) . += "[src]'s maintenance hatch is open!" if(in_range(user, src) || isobserver(user)) - . += "The status display reads:
Recharging [recharge_amount] power units per interval.
Power efficiency increased by [(powerefficiency*1000)-100]%." + . += "The status display reads:\n\ + Recharging [recharge_amount] power units per interval.\n\ + Power efficiency increased by [round((powerefficiency*1000)-100, 1)]%." switch(macrotier) if(1) . += "Macro granularity at 5u." diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index 6d6b21bf74..f4014387c6 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -53,9 +53,9 @@ heater_coefficient *= M.rating /obj/machinery/chem_heater/examine(mob/user) - ..() + . = ..() if(in_range(user, src) || isobserver(user)) - to_chat(user, "The status display reads: Heating reagents at [heater_coefficient*1000]% speed.") + . += "The status display reads: Heating reagents at [heater_coefficient*1000]% speed." /obj/machinery/chem_heater/process() ..() diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index a418fc77a4..681195bcc3 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -82,10 +82,10 @@ for(var/obj/item/stock_parts/micro_laser/M in component_parts) badThingCoeff += M.rating -/obj/machinery/reagentgrinder/examine(mob/user) - ..() +/obj/machinery/rnd/experimentor/examine(mob/user) + . = ..() if(in_range(user, src) || isobserver(user)) - to_chat(user, "The status display reads: Grinding reagents at [speed*100]%.") + . += "The status display reads: Malfunction probability reduced by [badThingCoeff]%.
Cooldown interval between experiments at [resetTime*0.1] seconds.
" /obj/machinery/rnd/experimentor/proc/checkCircumstances(obj/item/O) //snowflake check to only take "made" bombs diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm index 2fbe2ae7aa..659a83c703 100644 --- a/code/modules/research/machinery/_production.dm +++ b/code/modules/research/machinery/_production.dm @@ -77,7 +77,7 @@ . = ..() var/datum/component/remote_materials/materials = GetComponent(/datum/component/remote_materials) if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Storing up to [materials.local_size] material units locally.
Material usage efficiency at [efficiency_coeff*50]%.
" + . += "The status display reads: Storing up to [materials.local_size] material units locally.
Material usage efficiency at [efficiency_coeff*100]%.
" //we eject the materials upon deconstruction. /obj/machinery/rnd/production/on_deconstruction() diff --git a/code/modules/research/nanites/nanite_chamber.dm b/code/modules/research/nanites/nanite_chamber.dm index 90ee9ddf9f..515231c24c 100644 --- a/code/modules/research/nanites/nanite_chamber.dm +++ b/code/modules/research/nanites/nanite_chamber.dm @@ -30,9 +30,9 @@ scan_level += P.rating /obj/machinery/nanite_chamber/examine(mob/user) - ..() + . = ..() if(in_range(user, src) || isobserver(user)) - to_chat(user, "The status display reads: Scanning module has been upgraded to level [scan_level].") + . += "The status display reads: Scanning module has been upgraded to level [scan_level]." /obj/machinery/nanite_chamber/proc/set_busy(status, message, working_icon) busy = status From 1bdb515592da0f1048393ad4f9eec809a668417e Mon Sep 17 00:00:00 2001 From: Putnam Date: Sun, 19 Jan 2020 03:44:45 -0800 Subject: [PATCH 20/41] made suicide a config flag --- code/controllers/configuration/entries/game_options.dm | 2 ++ code/modules/client/verbs/suicide.dm | 2 ++ config/game_options.txt | 3 +++ 3 files changed, 7 insertions(+) diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index aeca31ebd2..6efc9eab12 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -408,3 +408,5 @@ /datum/config_entry/number/dropped_modes config_entry_value = 3 + +/datum/config_entry/flag/suicide_allowed diff --git a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm index 2e643cc05d..43f1c4c198 100644 --- a/code/modules/client/verbs/suicide.dm +++ b/code/modules/client/verbs/suicide.dm @@ -207,6 +207,8 @@ message_admins("[key_name(src)] (job: [src.job ? "[src.job]" : "None"]) [is_special_character(src) ? "(ANTAG!) " : ""][ghosting ? "ghosted" : "committed suicide"] at [AREACOORD(src)].") /mob/living/proc/canSuicide() + if(!CONFIG_GET(flag/suicide_allowed)) + return FALSE switch(stat) if(CONSCIOUS) return TRUE diff --git a/config/game_options.txt b/config/game_options.txt index b8b89de17c..9fc50fcd0f 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -597,3 +597,6 @@ MODETIER_VOTING ## Number of modes dropped by the modetier vote during mode selection, after vote. DROPPED_MODES 3 + +## Whether the suicide verb is allowed. +# SUICIDE_ALLOWED From cd47e81b18518107b795316a2e5b0d94e70f7850 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 19 Jan 2020 08:33:33 -0600 Subject: [PATCH 21/41] Automatic changelog generation for PR #10547 [ci skip] --- html/changelogs/AutoChangeLog-pr-10547.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10547.yml diff --git a/html/changelogs/AutoChangeLog-pr-10547.yml b/html/changelogs/AutoChangeLog-pr-10547.yml new file mode 100644 index 0000000000..41d255e991 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10547.yml @@ -0,0 +1,4 @@ +author: "Putnam3145" +delete-after: True +changes: + - tweak: "Ghost dojo spawns will dust if their owner suicides or uses the \"ghost\" verb." From 95cddfed27e7797de51b4cc91cff81fc10e258b4 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 19 Jan 2020 09:35:50 -0600 Subject: [PATCH 22/41] Automatic changelog generation for PR #10307 [ci skip] --- html/changelogs/AutoChangeLog-pr-10307.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10307.yml diff --git a/html/changelogs/AutoChangeLog-pr-10307.yml b/html/changelogs/AutoChangeLog-pr-10307.yml new file mode 100644 index 0000000000..279dbe2840 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10307.yml @@ -0,0 +1,4 @@ +author: "Seris02" +delete-after: True +changes: + - rscadd: "stunglasses" From ecaff2ffe8ac23d32decfc2371f471e46e9c8dfd Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 19 Jan 2020 09:37:42 -0600 Subject: [PATCH 23/41] Automatic changelog generation for PR #10520 [ci skip] --- html/changelogs/AutoChangeLog-pr-10520.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10520.yml diff --git a/html/changelogs/AutoChangeLog-pr-10520.yml b/html/changelogs/AutoChangeLog-pr-10520.yml new file mode 100644 index 0000000000..ae23c082d8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10520.yml @@ -0,0 +1,7 @@ +author: "Denton, ported by Hatterhat" +delete-after: True +changes: + - tweak: "Most upgradeable machines now show their upgrade status when examined while standing right next to them." + - tweak: "Added examine messages to teleporter stations that hint at their multitool/wirecutter interactions." + - tweak: "Renamed teleporter stations from station to teleporter station." + - code_imp: "Changed the teleporter hub accurate var to accuracy; the old name misled people into thinking that it was a boolean." From 6725e996612625263d1133843deba25cccc35779 Mon Sep 17 00:00:00 2001 From: keronshb Date: Sun, 19 Jan 2020 14:26:16 -0500 Subject: [PATCH 24/41] icon fix pt1 icon fix pt1 --- icons/obj/device.dmi | Bin 51443 -> 45858 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 71fceba8b4df1735833a78dad91efa252f0c487d..032b0c27ad3c75b57c6bfb9ee59e600f2a699e84 100644 GIT binary patch literal 45858 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
t zUG@0Xqh(jDPT9iXvV7^0^eV@tLY8OS2@aR8TGPRAD0quq*qUhS8S1>XnKDRNofd|N zam%N-j)z171$|vzUDL56R^AtjmkNtU^13a6eQfz5VY>q`Gq_?`iel zycg3ubFGqRim@q5K2nrC1;XFHt6pZ4%L=@yHpPiXs(1`7CV`fx!*S}&Di#Lvc(ubP`7vMo>=;PlaC@7&A(WifE{GuAqoMh<{O3y%snw2x-%_gF3 zg{lFZ*NnM2C6ck1_-p&K-15X|-IyC-Hn9uf52lm7TV2?BZP0K{S68~a#0Xug%Tra4 z)A1LphR=(8Jm4jRe(7AECh);B&Sc87;U1y}!}$X?UYUHho6e4|^NkEZ$es1O;k)AE zlCwaylOPf!JPG>C7nY2b=w+%wv1QRGUNXb7K0Ayql5W6#R&HYsEDOhZ+@@qpHMwytUqh)+6i)eRC+26)1o zI)L=vQl$dV!VYT$VBhuzm@iz&iT5S!93WFjqngsj*-8g<_%E%O$5Wi^DT-AB^@%4-5 z_dF6c?g$AfUm<_<_U$FNNqP6|qet{sQ@`HaPk59M6-CvDcDzo_3Zj~rn21b>p@Oc8 z-B=iI@92>pCzRSxa-p4}V!?@LdzTL|)hmME;WKH~-w2*TOL=1{#>SaS{XM&<{Hz9b z#AgIN_d}9dy$ufBd^>YkrxU-j?dx>J$UZsLS%)Kq9A`1l#0&Cox*m_;)p~UZ!GlOUSr5)@o%N4ve-`fy zU-u;D+bh2m72PUs%zFgQ>yi{&DpTs2<-fTMe+))+5TG?* z7Beywlq<}97=32L|8DTYT>E&6GU{A7k3ZR=_TMzss9NNqtf&sfjp&b!u^juD`jQ$a_i^kl>&5w z&IkYf(f!+@_WfMYd5az)+T8s5yBou2^9n?sbE9fVA=@k27wpH_B+JxX_}jXNSfS~~ z)eoczg4tJln+v-6CC;8#+!n>CX6B`BNzrC7Qn}v>Y9meS{P8KZUkT{VJfzwd!nQle zfyIOw+C_ekNWpzQJ~*$e_;$Y@_~E5`1_sIZL0$O7 zYJuj4mA5zPC#_#m@_eVquIRIE;BwO(STw<*Be~IEG7i@od?w{b=c-(=j{UVhUb1p> z7ITFiZjnH+AohSeI3f2s*UyrT-p6rqulKt9R~|E`c<-JQHLXMgcjfkg2v2Y&L(1)c zjz~sK2DO2oJ_YyexNM5b8Zbu1U;$ru+Xi6e21qUQ*9_x2OH%~3xXzA19R}_|rFU+i zSjGpC*!~qTW6QZkbUUz7oHWkF=s>lk6lL7TdU(N;8GqYIEM~*B#`IAv%ln&_rA9G1 z0&>y$#g2H-N+sF%9`+66g?@hznhv+ty&CxHL??#xKL;!=UDsX%V%3oJaqMl}FSsS; z9N4ZeZfx{_e<1Yyq5#HpUs(h_5p+)#o45h z7|Kcmy)g$I$IH|UL8|}0^xi8I+ zf%3q)K6)GTV`q0uK4$4;-F11|uipMWuA8z-tDhw5e9x_k!XZgF;l=|J(h-6(a8SSK z;tBO1f)xn3YEOfWgkyKihRqFmtCI~XdV`|KjF4Dg|NiEz2ytodG&J7ooAYE zT+t%>PYO000*pa9C*Tp$`s{ws0siekO#iWt2yu$+WAROa(V$Lu@CE~Qk1#MHK|wBX zGF8UK1|K&)huWvPUQ^a#1z~rA&5>8mTs(+8^VDldgTiqwpR~;-9(Ql7TCQwA_~=5Z zZ^WUFYo2oR0V8j=VdKZv-Se!0ElBcFq)3Q9=zJ7=az0-?oYq@ ztckh=L#`j3S?;doef;lAs*6SHlQGr@LYr3CbO>kv57=ut`?`ALjSNBJ`%4L0a)-y#$JJ(gizmA(PgKAk)eLq7q(DnA@DD1h~)Uc zu?1Cj^vVBxA3pjY21{K#;D6yo=vyuY6~_9Y_at5Mhx#w=78502(4g8+0mAzJPZS@u z>g8-wb;es?fC{I0cl<4~qYHujX9SrPpv=_i{b_-sVeQ8F!BL4VBz}6R>`#oUkB22c3o6@YdYA|cxF?QX_j2SH)k_kz&Zqy=fARe8yFbm zY)~sYPAk)0lx2iscXypvrL@6Y0DPsM|BUz{?%q(uPHzR%Epi|z9|02mX(7IobGO5| zQ)C=?1zu9W{+kzPfJs?x=mpAn{e=iP5(oU+Ebl;1mYTalC(jAC1ob@>|Jn@#zZP=s z(B|1ljuXV)$(U-N!;J5?wi)iu+l^O z0#}Jr^7#t;I>EDU`1Pk1#w@V=`}mfhh%`m<2#dl8FFL4C2$vlg4J0ukJq9sT>iF#m zb;xk$4s}Hjn0apUu1t)KXfS%yfXk3t#v9f=3l&WP@KmpL8v5e$n!^Pkj?K#;V{YOf zB-&*rKhouOtcKEaIaJc^is_Gda<|QiPfcP6J6anttN3B{*@_3TbHBA6cU7g>km5XI z47Vwut6f*6JWWn0SwzVVP1iHokoPC0>mMOOWst91v-h&yV>7*|0l%7UsmE;G^WCB= z(t|P;(f1Upe-9Ufpc9J8=BjNH*^@@`7GQsrM2))uP!zbo(<+lLnx=@(LlITHAWY~_ ze+tCu-10Tr;|wL_cl?D~A|#H73zQ|dDRRrttU1UC+>&Ha8W7tZfODtfX@u4O(a{O4 zsHpf;T3RaQ>FGHQ+$>*Z3AjDoKw3~j&0gc-Ll*a~sqW=fGS^iW?vsZn(9D1?oI;QF zT~lqs{`wBW2Je%HDeGI;c9@U(TZjC1NNgRYIv-gVed=Kk`!)o(`177?OQw=RuP(KE z#0C5FWPh`MmOs$GTimp`W2d`e+}Jb^`JmE})|dSxCc%TMo)-nMCs$U&>9Jfd=K3Ip zIHgiX#4p8HJ$z%i-3g&F;VCbLE>9W66R|1RWN}Uh<4Y%-%Q=IfMumW!9H+7&^JoAq zdt_o_C>U;QdX*EiYnfa~(1`rK3!cE^%71STxLQf|44EXP$(@8o531QZ{Dn+6$!}M- z+m=>rWR~hY!?Jeq5^o8#{1fXUC>XACdgz5+`MVfV2=Qf_g0$@BI8oie{_; zfn5xWSV*D|x4*vaO#x>Wzo1~?cwp$bXa&8RS|1obNxy`ymYtxroqgA_r@Zmv z{oE3cS^8~G&Fj5WxNVzxOGz5Dj#+TaOnU1JqK{!XSgw&pRYJ49H39zJiXXw{SEG{| zPeJMXiHyso8k|~pvG&<<7_{VOf!Y8VQff{MQGRSjqZ~SY<1CNXsXF=5=;eSm( zO0pQjzg|A1y1NE9w;-O}=pf0d=v5#rEv^047+$wkKvWbo;}||~{qTQ-3pwZn1XOxpX8SG}S4h0a3ji$T#lK$NFb zN?T^AmxA#-j_P5{jg5-^(_TYwu-^>G_N2-8U=6bpR+mVFA0kDedkg>brRda9Ai?zj=A`&RVot<>zlG7}ZVwIydZ5VQf2?;-r{EJEu#E^?5U`{ryZ(WK>j! zQ*EYl`VE}p@;H0;PvMAF?}93=%FxVL=w0T;gWsK7TF>V(&E2@V$d4%YU{W}8Wk!i* zWU?V6=oBg%2ymRs8K74gLP38{?%eanHHR~ctft`J%6&>vYQ{FGUWWU82>R#fc&8?U zcP1zI`k~TWa_H`(6~BhCTpgKa%(zwZH-cL0;=NUd?SD$M;hyn|1+Ap|OIl8f(fRd` zb6z^|meD=45tn%UdJS*xFHxBS`AHU3Au>ech#S-r|BP6RZi&Kb2jKqB!K9yyOBNhF zC|wq7tsvU@f&-*wofs8&1qWPhkD?<}5vUvli&jya13x-vQB)K+GCI0bn3pGFTIr~= z#A^QYK=tgDGMnO%*qu zOgF0dacmygg|NvYtdD&vU9kwqSb^_|)w!*iX}&nrfK{?F4$f_R61ss_I9$+lbhE&N z{`j#Xsp~C^Vr;CD_E~(Ny_b2QVsLP@eEW`Toj!^6Qp6p{xz!_MLeI5{$`eI*f@f1~ zHwQg7zqQv5ZI(3OF5{JtsyIJ;!NFoV{y8)o0OJRNeXj>f4gLMkcnLu8KHH##_#}!c zm^nw^ams9xlahIuPgFAFq@M2ikBgU{H2yfPXB!2he*F2G%)Br|16DEq7d={0&c*P< zBvpCr{%!ucQo=1Eoi;GWO)2-Q_>JB$_P_=zZ$gLjU53~GCW>!JSnq1BGsy9eyPVvF z308t%F!jJrCB|V^>z!f8!rk$a@f$H3nwqOMk`rOaEwx1MCsI)sCs(;`rx3ngD|Cmp z-eh-B#{+phPVEj)k)pWca)%HZ%DT|Ap+50g+m1@PS@*J}({1;{EnF8caA!`Ss;VCq z-XK^`1&LIGBWD^Y)W>Zppkt%^zkx*<)ew=Jd%dm(NQD7|A#KbHI;Tcsl<_{)_P2=1 zVpx-UU6Rk>dt!~X9#NZGsiK-bJCTA* zUs{zhQbvfNq&#tDGoG|BLo4Pi*Wsv9FF@r57`f>NU1y2v$HoD|@7so5-}6wNQ`fjC&V<*%BWndN0_85tRXxS(tr zxd!NRVh>RKu}eInZ>Du}p(}u#W~k5x$4<`9svx`+Y`v62#Borb900NHPU`C_5UAko zgWDhA`xhccaZH>W11DXaND1#lM6@jS6XpbW)N@rYRzFw(_Li*Z{&By5O^qT1G&H33 zvfYD$hD-UMTx*=%FGd+EkItbK?krjm3n;Xd8vp}Ae#k2DC}bO+4iXg=JtLZPH749! z!VelMorLJd*w5lHL-l(}O9szEN2%%&t4f7NY9$BQ{=g#6P+FCop=2D+n+2O}c}Lix zYppUDVMuXTcX+BMEKUYv+eQV<5BONY6b&7nI?!k{fJjFe=VxadWP(U+8CNH(`42a5 zJZ}koqizV;t32NHEi!e+#b<-X^u;NgQhEvYn@aGL*~P`ozvPP?!x26k&k&{**=j-O zHN9T;Zjt~Q#wj6JO-;?+Zu5pk@tI-}>NDgXF9-reABE;XO#W4zWww6nS*((rL$3@r zB3@fr8%i0XL(jq6+bOmW3tA&uTXHZRgWcWqAU@G3AsOIPr#Ca@XXu*^fYC6Gj(P$A z>T6#!uh&;DinmrG*ZpPP&F>#`N-lo1-7*u0rZ=8OIMiN{@N#EJ;=eN>4{;+4o_3Pn zLanc%hc_#SiZSg(lzEP0FU{NuISD!`nu@`!*8B0+^?KREO}j4Fm4-kO zi(73Rl{pLnFz^a50Alw)U&;6-G10c~EwG(sgmI4RljFu~Wcp#g|ISAV0NlTF0l41E z!Sy`!anM<8?8W~Ll3kYYJo7W~odwVi6*>Hs>8gE<$v$Z9lTJGOI5?i+DP^Hw(8VIt$C;(op~4??r(4(+W{ej@VXZtp6O%998T^0E4V=m3dTz6OM@Pez7iHjl zd=PjbP;HeM&DZ<&M2F920_kU+Jl>)qgR zq*{s92NhBU)&aKVO^AN7Mzh6cE%?se_pus>9J za$8tC*0o`s_+@c7_Yn%b1sU{>{f91;Qf5niexo|HY2c=(-SEjqm95AfTgByWC8xId|3)w_IO zs-w^dnpJHH-O(<3HLQk|XBVG>&Ad;}|1won{B zZj)lfOJEj>lvfq(vHGh0N*g1p>y=i5W#pP(B^ljss~Pozu2XD?=Qrph_CpI9BNvP$o=XJVtk-?;9}fS7^Zfb zIn!60^GiSSP;bvUihudB=8E5s+}(IzhO%dl4%qEq10P{Rz0{m>=dum*;I| zN^P#L{U)xDe`7N9o>B5nkTQ63mLn}upxF2DA>J=DzaksaX=Yga?RRTX4GVH{LbUSj zfz9!8HirG~{aLn+JT85#drVAB5C|DvU?uOons4HVZ&(0KMHxz*d)Y{%(k|`uSt3SV zE%kM}&CN~k2Xw=aAGyVi1rD|r4xX!;qG_XzRxvB0`|$RO1_5K1Von>lPJ(yb>X} z3dqNEe|J9lC4&(=U(P?*3R;V`&4(@R7>B;G0MMi99?o7+J#nX=Hn|eOp3MVeNFY^u zlJOzF#_Z8Fp5i>)9xdl!3zb9ieMsj~orvC$#aJ%#fs?y3#14Fo)TF7p8&575Ol6;- zX}L*=zYp{tnub=kIZszvtad7-BlCqwGC!IT`fOI$xOQg%F=SGL;5Hp1LmMopl}Q+I zC)7hL5r}2>M`rUBovDl>mZETg%NMM&vG9{V9;@3-4kumAl1jSGnY{{3 zZnZ3y2z!6UtSvI=Yfnt^-jb1<>|(Seg&`_p6TERRhUwD()z?>sMb$>_Zn{gPl_8Xn zZls131nJJ9Q4j%1iJ?Q05EPMa3F+>Vk`kmtNnxyq!$^EK6eIISxTNo@I09&wV^m2!1bW{*1Wnbng%<7r8T58T}lVv zxl^^gB~DWP6-)NPo#IA*bv^9PoXGQlyHtMNW1Se%EtGDYngL%N#xhfWoN@j_21{!| z19vsIi<&_rb(@%oxiznbv~B@1VeBURKOpXA;d+$umq-z?=rFq?9`=EsqOg|?s~ofB zOb{u;%>GCLe||cGhzgtngVfQ8gg)A<*Q|=^4kf})^3R%y%^lm>WQ;5BTij0t0)xn) zivm=pye`3m*xnB!uDR=~?6Y*t-8@`nwcRR5>@t+ViDx!gXnEWt^k~~}<)p(?j5YuT zp0?^=rmB(P(>8%|>C&k*fh!z%k)f@v{Os^6E;cdFawT}Z^a+xA0Z##)#sFl-dl zDL3lcv^0~IiAi=(hTn`z{?}6tqkv`JfsHyV;@u{#ZJS)a1@*h?=iuHXGB|pU9$Tg{ z2n20{CxnUD)^^k9P@l%CqL7f8yUR6a^vtOkW`ra0=_t_E-HF&%I>fM#ZHA#PIS_Zo z4tVq7O%*F8pFnf>2mpjgp34|z=d+0~w<73f)roWRZQTbB38!31KscE zW*f#QMBR~x@YBEsDlr!gB|=(H z)V9$Xx?Z)Nx8V_X*2NQl)TEsK_j~6TV>F;)V?$CAP|j}feqvx|v0?$bi=jb`=NPL- zl&|H%)h9Ze5>F|p-Wih0>rYq1E;0cPRE~Ptx$&0vOaninl`_N|ilp%Crnd2(a07OA zmm3{|NYuB3Gt)L~HV=xd3q{6rdb|Z!26tCB2Ud!?BpX&{2%?@k$Bd8b+@+#nWvdn8 z_X;@@G<2!hks*QyD>xwqCit?B7(D1ncF?S&;rYAJO^52z(fuIz)o zk>dYJHp=mdVS{dSQz0!IF7h6F?J!w>Zzksam{~6uMszE*hmSAo;UNqQUrDiSpezHi z*^Vg~AKTHJ8yf~YV<74@^8~DpDw$Smi2cvRUw+`PET*fdnjNHtN)tUJ+d$xd7)}un z(@rmFGW*N*Ci!5Hx*C^Bjj}N?mfLkg2N$VR+GOqE5DE5%V|}aa{w!I8yBY;}cVK1c z4*VgWQKSiSxvn%0)-7f^T3E(qOo;>bEF6uW!H5Vzp_X)vFGIa$!GiMuSKVh@^ImT=R3~l zx;QF|8VedhV1pYnGhZbQEzQj(+uhu;Rh;MFiv(bRTf+5xo#JNH5Y_41P{ zmNn{{>wZuYn*q@!m>dcPo#v3{X2}~%HRp7b#tU%$*g?dF!lrhm;XuU)rsl{B_y_vxJ}wH~^68=(z69iC}yE4e2-8hum2BotW3) zQ$$l+EqwzKc(^3=%ai48@~`$;b_Lz8=((UQ7bWweGzlI&4&Pvz&T4z*VMG}8S0QxU zG{W5k^`?7>oI8nVYa7l$Fn;Cc=Z`PX+HrTGb7t@DSLwcbny@5+x*MbzK_p$9e-RzJ z$Ic%za597q*xK9wtN+C4z=QaAxc(v+m7mxsPuU2RhzQ_EfG)Pc=3c!WK;Gm6=~nMP zAFYGUzcnUqmthYmLWN|lVoa7SDIPh^mEpGQXx$mejBpG|R}JJLy(X0UaC0pTv&{+- zVAl{}4%|B*1Pd#N_bUE5qz#T*&fhQt4m$COX=FUqOG>YQ23*nZcf+QIkDz{VIsEYj zvO(-X@U`)4s&mq4cWn+j<2PztKmZmrgM2e=kyFl;VGpwbTUe@ZSc?ptR^-4-*Qb#T4p-*)j90Jsmv{ec8Wkh2tWOsMQaM@BTmH^PYG<}vuj$2 z&pdZmmbZc=>goysEC&aNnYlR-Oha5oDu}I_CZ`?<{-z08n{p^mg{r50R#N0!y!$!p+c#oYH#v;@l3n zUfh(7Y;bV!do$k6zQx7GmEB$9j)T52uDgVx3LyL--}3e;r#n-(KnoZ~ia@|?93TyP zL}b11u>Fk~2lu4ZwYpkvd^q*_+yv#DIab#hnuAZt*BAH4?tRzguUJ)2b$?Ul=NKg7XlyJ{5JML}NW-@V_r)4Y5e|N_yc*^m@J@N`a!XO?DjAmwi{Df^J4IeW3FAN%d^FPH^&O7_-!sd?0;_@3!2SwX*u!>ZK>7=`XT5muhRbE zex;H+o=V?o3tK68*!a=wj|O^Ka&B}|DWW1Ci4u<+y0LOCC_EE=!J@sE+TdU7JetQ% zY6chyN667XS1PRFnHo7pI!6EO>=)-LiZIBvEpM8E3(j4Fm&Y_TVRvOD$*Dv>AZToe z(_pkRCx;HUwjKWkK&u!2Hv7a5Rtu~V$hFv>>t8N_4gijjTP)9b($ocJ)CWf7p(V=vhu_mB~290G3Tos5}l4Pll}wzSm(fd|8&W0e~?v-mZ2V&0U#F zkoB|82UAfeK6CF2Y`G(%WJte z^(U*VI!HgU@0INk+Sbh5d8qLAmZPK*GmB{>-n<-fErvmsZV<{60y1md76$^X#4`1a zGFA?Xu+FS&G}4ZnBEn?ST&ab``K7lZNJO zO~f?M(TzS*IP{B%o#?eXG_s+^Ba7!}#|oQo>q=bv^;^qJ8NTcLOO1&OO%w`tU6hR8 zA*li{L@i#fWY>($`n^bQ4v@Zu7@%sW%Y^{9Nl0x4#-6$*VdrZzs(vHA621t~U7-~~ zJAUE_hIu~LMc)IVKXxEm9w(^u(pJv^E+s9sys;6n&>{tNfCZsQPmR9sw7X9mGv6`t zG=l|@aiY#GT(6ciL<MNZlWCo#F$k*C`S>(3wD2hovqBM^fGDa4F;2OM z@r~3tdKzz7VYN0|buc;c$ALQmzks!Lj*k zRYdNwf>`<@kog`DX!&XshI90I<|?q6);%)I8Bg?R#bJSKck>dNc44$$g%3?%2*$nU zo$<0{Wwn3!e7}=*=>5~`$`@C@;AtVhxDU1v+pztnGi=nAy?xm(`qR{Wt2Gt>i@E`J ztL*j{H}k}#@`B*GQs8yC5;5sniGE-CIYDemn=5p1{k7ME1Kz*WhL1A=7LM;Scm8}E zL?94+O;G9dRxz^aKkNG&y^)|r=l=LPDW|1o!gh3j5&DBPO+57d&`Smd5T~98=0{(^ zF%llpTL)T;zFNPVt&T;v>aP?dTJN0p zP&3Zd1W0dNNJXm8PahA0?~~pXn+O5qbUOqbv&mx2g3I|qHnnZ=*otQQLQSXraqLo7 zVww*7mM<3*pHZ)Y`F82ghW9fndxqQCr9I_)gaW!V)edpH3$Q>=bu~>*Wi$VlaW&$1 z+7Z_Q%?1bFzEg>}A12%ju?oK3bL0HG^|K!*W52Bb+tOX$5e=lr*u9NkO76*T+#MLu z%+essM*$ekZcUXkT*@px*|Xaxw~m4DJMxuPxyy9Z$m%00x`qcw{oY-lQd*XgW9x-O zik7?L^52fU!peGtdYht5Np-bQ5PE!%zAiF78t-g( zmUSMysq+P~K9U}DG*MsMUCSUAV=_Jb3+s%R#4;5Y(mXrc&r{OT`cV(mY?1qLMB9i% z)ju*I;y4dz8TA_^l$kY#)YSAP%dA6DTs(UM&?PgYTgmmsq4$VS)s6T-r_=Y-JB9Fog6OJT7!Ymtb|2B(V#IvOXhn@>wQ z!V#HVe>L6K#eSt;g}bsZRG*Iv$GR8Bj)L7Sc+pe@=M7R>-+aWcbI}N}d|JBK9vF%l z@0hQo?Sca%7^}IR(@oy!>2(_L1nU)8(zmrA8?nD1KTso9QUE5yg5>UJJ@!IKa#xq~ zmkpd*Y}+ho28IwCKTg(R0QqmTGFo}e($nG-k|M6&J@~U>Pgm<~<(Ui4B@kqnS-uWS zNus25I*ml2jlEXk0a8Eu6}?^&^qx%pc6NP+kmw)b>CAoqEUf_sS@G*>UZU(2%!@A7 zKK{j`?^Tiaa$C6y!sPVy)}1xjB8#+3#_WGHt#K z#J~9q$@gq@oBUhw-x>~NVci4abz*%87y@|kc@U#Be}gbQM!BpJ=2N~uc6s`u<|M~TssSL zaS?eYvrKr`MEZp`xw^S4+1rb5&&+m~>#{dYcm|Q^+8=mBD0zAD{-&LP)W1VjoFfF` zZv@VR*AmbtgP=v-?u>yon7<>cS35K~(2Dj5iB-KkIC4+7SVM2-aJlj}VYON~;k8G%7 zL~{N(xN&jzKbMWC|=e4fH|| zcS>!w(L5IT@e|O(CEk)V@MQw`B^+$*3U(hk{qQSe-p^dEVaLc!%4f}FS|Hf~$SC)z z_|fHMquO}SnLE_!sD#&{7)Dh_d2)+ApCel;oum%|Gk?>hFRgo9F6i4bpjg0xL3^z4 z^x2MtIE&<0@;XsbpO2|=T_|~RNr|kQ3UazQNOvP?e7cjF&~PHV=FgfJzZ_v8)0u$d z)t~YVWx6k@QE+exAyCN4{xp#b@pfDqh;T|0pfSUD9Cy-+s}G4htI$KPEX)4{hjQm| z3YiUVTX1pQb}5rH)H%;j-fx@{na(j!X(X)=26KlkoK2fw=W-)h=ED|`UlIx5iWg4A=SNZ@LRo{L$ZX;mv63F-EYpO()GQ)TDo{PKv#7*&N({@~wQ~6+ zNHLTcFx$(=ijz64@ab#%NsA`HCiK}nDfc7W#_6@Wr;WgDV!)NXo{}3%AX$Ps*OSP#QGhYB@dg=ZEBzS z6yTRc`Kaqz_MT~|_}k7EnUCl!>>Dqncv~W8mNVeG(1?5AaIOM=TJLtXEqSouRNJuc z+>LeaEPu9e&wtXF05KI9gp-8n@48CN6l*D0MrZ9v9}%hSwr9dl=wkBjH8_m@g07E+1g@nicMSYw#xNWD!( zJH!Rgs9?U~+Qu9Svzw!LvVf zzbuW@B5gKD*0N(5T#Jk7c-r7K7R?cO`)wpKFwd-R==(S&-bUz4)zh5ci1=xtmNLRZfglMUNWWlld$#9H3W>%8^ zVLrvB!l=$R#u|?^mc`@{kItY3Od?{szsSr8O8%7h{Io(p#};GWJT~SqdfrPty~O@n zA`g>VM)Bhi+X5~={!6@EMU|HM_AP0cI%2BzA)|i@wY$)>t&>xm#@VnPEHsCCAWcgf zFRhT!vTq@A-|s-kengz>WvZ9QX`J=nmS;8IB&*}gKvj=+Uh=a8&vUDbs_^ISb8pYu zFuuX;dipXmx_Q)&war>^zm5oZ>u5zqdP_;HWzw*)q@=U)1gXG&mlfT)8UGoTxY-tD z$uF<+w5LA`|9z~bEh!TzndO6F{O*4IZx_*(j_bqXC>k<@CDeUkI2^-02A6i|_+T~I zFdPQ0G)Mgzdc$qjc6ZNkUVu-C0WFQyKcdn7c9hQ=k+F!h7)ZaBGgYC~F2!UG5I>tW zPHRV!jH|zBkP!?Ksi%^o-3=WOf4}?9%}S`yrQ>e%f8-y0I`TAh%a<=;@&RVX>(ZiX7Bq_Tl9xY;qs=&7;>9 z;3#03wCqrhxrywp&a`^^1otw)yul`)>b`mUKc)_Qi6p*(zICVRF}{MXI$xaqwg4*l z`9>fCuzdMfBYS&NEF6YDBVh&$9UG59yh28BM#d|tt1b*`kZd=P(<_K$%Owy+x$=D= zakWT@ohdIbhu=kJq~5%HOo+xxh0@h@1t{|(vn+ih)7J7Q{7O;i=ymmh^(jLlweX@e znwFNa_qi&)!8fz)DG!hrhwZy_(DSrVK56z5I>ztK5Yc5&g7gU!%W(WVL@CGjqEWup z0v8@7Q$HGz`^{V1`}G0>{j_Guolg>MjxcKlkVBv^Ri`VQhpDv0+d%_^hqGtANx~tf zpcp3nCn&4p-9RA>lEnNa{ipshe*Yg^aGvD<-26|lasPoi#vj8i?EE2i7M)H-$2zp5uO?fdWi?A;OF)Ea3Ngr2WnSV0&k0#Z|n*cHj;m>*VC* z`o#m59}R47Tku zPsyAqmFN9QYG7RY>H2DXe({yq4O~Y{59jAI4!G*hc9_XmT@Q)$oD`*?-^Umoe?1~< z7+Kc`5xFPGWRRHI=`)`L%z;L1e<4_5v^^+B(i;FCiMrfjo7-nk;{9n8=S;=*h*3^^ zOch7@-p>gST-mIS6b*_82;u(6_hJcLbnhI08qPetpQT_gBzo!ZDv@q&T0~Znl4Vbk zwdw!$7iY>dw&dZBWx>qR$f_#AF~oVdt)N^JHhBxo*!YW)uCCDDp#Ui3GtCQ403V)Z zeax1Tmp9J4+S@_aBaW*Qj=^O!XNe62N*fPm>-_%nNZ2}a-NrUy;aeh-nyIZAJU zpq!jf%!8DjJEu9dwIbPcLx!S(z1~5$y>A-V8G9+({Rz>fTlUqmtg37M^;?-tmmhta z^;$oj+CV!!Y%hd@LxB#&dG0y|r0pgaE1J-7=^0V4EkN)#w%>S%yy5)9NSRG z;JKvVW%oSt2t6F{t`Pm0Hx>?%#qEt$E=Oz;3!3 z{=L7J#MhrngK9*pIvi}~diJfHT6BWF?PU2{cP1j9ZW=Q9@UYAz^<5GKH53Ph7B4P4 zpP8rZPZ^mQ(xBo_^wxC&%%w1H>cPA?q155ExxS$|3w?ck{%KpmPLoe@O5r5{wv2yX z;J9bW{2i2NaTvJYHYR|V^#)*i4UbkAYLnaji5-WbI&B8WASMd-WopXM@=7!{RH;MYymI--UrlDt zWG>!C+smb>=qTUpv3uoX)bxV~?fLn3W?n2COH<>xhh?nHgX@7|spii8<-!mD#8rHB z33%XYeu>K)b32Fr1@dkF*DH`Nup8qG7=WXI`gQf;reW-IIb^j+%snXKi?Z-6quh6W)#Px0x2seN2vF%MP;o-&jl@o}W*SLt5T+g2D+zkiSg{ z@RO&U3tnWrvoD)5EGzqtk!NSl4P+TbjK$C3FE|$%$#(0^S?Dpm5f)Zgb;^^;Z1rVKKadcV7ZMt0u zdR{_0+R#_QIV=s*ViwT>SCgaX3+;v-=(+Xg#a7H-TymG&F#+GCkiqpk`SMIjq*3%2 zZ-3*mr(6uWQ`VB`fdkyEE6H=B2^UPn(xq78+S?#V(9& z?F-gm8A#7(=XjXSEy~-#z&U0rZ}~J)$>h6&0yZ~4Kg;PWS-HH}c$Blv#nl%`c^*d) z5cYCVuuiT5!1g*fbAaI)_0mYmWb)Z+zEfN`6Nm6P>d7gPPH&Qp-&0UCyh{%H+ zAqV0Q?5pXL5`)S|8BlB9M_TIrl`2!|+_*S-UM-fK> z?*=#N6*hRJA&#Sg3p?fGD7>zW8w?VVjVSX*vF+v|yd64Ym-)`WeB!T1(0=QATLU8= zQv+9v9)36tRQEoo1of#m1Q$q?E}1ER&vSEN)FygZ%>sQvm^C+NA~%=cT(I|~KEJ9; z=U{#>hqE(MeA))Ct{y|)#?ab=Oh{bPEXs)kWhOvvfR35onH8srXZYs!35(v(TJC3+ z7|w?(hlolwG64K1Cu=^}7qZIFH%9`K4;%pIKCA?os&Yt1tgZAE$uWD9Fb=uvS{B?B zWGC;fbngX%b02;d1ZiVb7jJ(be)IQVewUIAE-Gk6c4V>R83LkHtlWv7%C-$68*8gIQtZ^ zP#IK;0pk*aH>Ans{xY||&^s`j@OF5Z@~*6vy&r~RwdOdORAtHeUTspUz39T0781%q zy?d*g{b7G-%ohNq78D(A{s~?;b^nvv_K5r^7XCMO{~Qw(3pXJP1|2%RUea47@BhEM z^`G?G;@cNuNX4{RnJ-6gqoSUBMKuAB`1okfcW1GH!t(OS?v)OZvQ$LRE4!*qfRl*fX1US;`IC>A&xMZ6L~8STO6{JH#%#OO;(z z#93@U@hQji-_7y{gJ5)F&0WB<+TpG788-z`=Q3ZgT#++WKdY4L{COL6&lEo{6x5Ua zq_-TV4}Ws!bLsP!FDG8#j@!qu)ki^RdrM@%!R{WFl%F5Yg`f!bvGh4nYwN4Ye{E{) zF$3PTS^%=Tx{1&0XBC@=*@_#{F;oA37FAG7V}xGm27;>J5kI`R9W9Q>Jrfw?mqwB% zo0Jq3W4j&h!T)CJyBRS1Qq(7J4bkr-#W?d)^nZt?66CaAjD&PaHxeQx%}5O)B^}Zw-3-i7 z0|V@j-~Ye%KIdB3-e;}rY%hkH;j8z3pXYt*z8^zXl;m!a(31cFa7#g6S`7ejC9hvZ zHvj-IO`YNg0Q@|!4_YqLrp_i#mJTkK_I3c^k)E&p+iq5nLd@MSC`NDW(_C*m9mMSZ zO(%KZPv2>aA4b)^i*<@d9XXemn(fdUdo}0vnA^co7R3YOBP}0XQm@mXL(96DuvbS~bG&qfxB+F& zWw16&ZTx$t3AV`OpXV$*9yTmO0kM1|)Ld=0r)G6A-;KUA7TY$J!g~o8Rkc0&%rPux zP4%ybDoomXMtwVoV|YzBn19o#PQRqke-<6wciWAmh6}mC$@4sR&N33Y4QIdmRO<FrBoIIwm-BmdHh@dz7LlXw580Ps)=%Gf*U-7eWLVCvf0*Brr?^I-#ypQsQ z8n#>d-fomz^pKz~b){?5kHK!Ea;LDg9<{REumMxrho!dWvGm#UinXhKbFU-hBkDZ} z_q;1pWEACa7>V!6-Bx&<5{J3Jd=y-{i`{de?Xte(D?vif6ug8_RN^8lz2Epd%%tGX z$nDnL$?eQgHm;c}BE}AwPD7=d%>HAja%M$P-m$m&9O;+OD6hMwt5UDKPxB>ykQ5k9 zY|qHr-b~n>NpmTfIQl^$^LFjjcF)_Vk{>n~KJP{Hm72coW~af4VBE;pW;mk(5!NHbiV3n1ZwDX7+z6fsb z&?V*IAAib)+s1X~kq+OWfj3I}cWuXIIMr%t3=+DW{lh}Orc)CeG~l@WAY|LBEOr-i zRmkx)%};&EOPmr%M4X;rN^GE$j2Har!QrGoGMzixMEVCV|MQ_+D!Sqqk37t8YIO=D z7#eK`M%cA64rZjEbm+d?-c<{_@|073YvzZWG%yTdpeR77*2uRpklB2vS$(}moTl2F zHrcm%`p8WLufgQbahmjt7)xpL(DB)^6oZwQ_;`VY2_l7gYuYE>E@wk>1rZZ1PDD~Q z<1Nl)LSt~*qHfxI(NVSi-=|i%2MXzHLU`oP%W%62QQWmo{g>(K=h*&0UU{4j z#!u30k0FBZXwgjJ1wJux7kS7_y0_)9SALonFC^0y;!xko7X{ioD)(_}a05hN%;r^h5h9NigC&p^( z*n9D~K{?FolojQ$5Dk@Z5^5b8$s`(rV&jA0VxpSaU^!O;H%dx^*isvz6%LhbSo-uY zoF3K3y|+>qm`3wb&U=RWvre|hCi>V?Fl^6%t@NTr72axVYcsR3usr+1;Z+7uQc}i_ zLwR6J%gY20HQT9(iHTFqdz$#5EKOL9xfn*`)Z@-64SaMK5X6YoCerAP)5Ty&dk}NJR0 z#TH^bktwDC?DuYvuj5J%y%|=BWW5If@w1j?$yb>aMsa?&Gf4^!$2&N{tY&JnKc;A9 zhF-ufJti&=4+sehyA3dli7^P+&9+>RlU7Rl1Lf%$0l(!4TkBNTZBBMxU;luB(o5;q z*4FR3a2_6m#*qDehr%FvV$>3AW2>!(AIrgIe>iU2FY715D%wcs@IZ#hfm$3;ECD2o zc=HRpZWzAgK8<=rgvceHzau1{3@#7LcBS*W(g&Zs$gwO@hiHks7vLZle>Cjj0@QSL zGyUWwB>r0X?=pnP%C2s?ZH{zo9mKNA?Icc>b(KwWJDXSO zNaA&&IlL~Bp5_2hg(}m22RZ#40KhWI#Y1BA(R)!gunZA*T%bKML_n78_Pp-Twsj;d z`Kl|Lu=LwWiR-JL1x9qlL-a4fHO_Qic3O#?qwR@Y+wE}xHaS}iys9W4CoUv1eiL(S zT;)ZgU2*ReLFL)9jVsS(L(gv$!mV4I{r!8lU5acZ{o=egvSV|!fbV+Uvsf&;q8Pe) zAGc5i5H5GevfjaLuHPB02zVjkbHd04^}TaF9qYh1x^7v&2D=80?V=gF8?l1*qL`cu z;Y(|Nudz#dxZQ5&leZc#{gwuB8%)2sMyYT!0oPM_VK=+{%FC<%MX6_%*~o6&a#tJx zJPChl)_2G9e)qL*Es^QPyFj$HvQQ@mP(?Q@Wuw|ZL42jWyo5U=?y~l! z3yreX%06vgTEjCn@ok5C9#Exu)A$Lw>F6BiHr(U*@+2uSaqZCEa%ZyQ(Tu5Wf%+QM zeEX|9f_8=+aCCJ1R@Qu}la#@W=CntA075&Ii#19e&JHct2Z0_PUwoX`IDanxn*6!( z^mfZCF)yA!EN6s8euo1+7R4YE(_958vymTfyF!mvLj|#oM_g;-2s{FwuyEQ>432s2 zQm$&PXj^WbpA>QL)ppF^rm*Y=rt#a702{M)&*P_wd(ot4$3a@3c{ctiprK80NT2d- zO|MlwJqCp{D5-tme0b^zw6y5}A7zxmE#d%52-_3?=FJf*!=ZqgN{ zZW^qciAoc&kE*er$WhJ`SF#`D5CzW)w0}hNcaP4_c!7Ov*N#s;Lr>_y?+SIUvlo&A z@kE#Ez;tS?g6t8P&RlliheUU*o_#%*7%6vX>m50aWr9ZZQW+$!;kD?y&#gLhswDB~ z?@K$;osbr-qzt{hvtTU%o8u9=scwri!p8)p^4o?<1>7*&+nM^VIZa~GJM5D0c3F#w z>&THSfO;-|l|xv3+VM$laxLb-aMSC_eE2}^uY$qYx98ot@2Gc;2Tg;+CzQF#c;nYzPkDaAZcVd;k@{= zcXy=?w-}RCVbaAhO>dmGprRLzYkMtcGQeXO=_hAr$766l#nY!wDe%#&P zFC!@l%fT$Xt+XkyELin6<0zlydCcwGj>+lzCi^%wD&9rC)YY5}31tCHL!59XJ;Fu)MK)(>#WG2|xaJ9qd0%0p`{fPp)BD#efC%w zq89-!OJH!Y$xyabTgR8%jVWK2Mx%a;u7JAE0PHUYGc6&K?;M7Q;{h+8h|#6)?(WuD zFR$Cq?8BQcZdqDd`mQ4trtx-ghYG3GG*3<}&e@f92zI6k@>N2y%N(EcT-psi1xH&e=lm-XMKKz#rtN-#(x04eu&C+UZp+6uds=I5LrzmIhT;vYtVB z>e)`)FqzZo{-VE{h|!wn9(0}k)r*uK9ly8ZWiS5>qsT}e2KRbCU}gRF0W`<1wdUMl zgi~kPwfb8lC}`I+wB6NNb0cX zA|NojNHd*7pw7wpc^dR9gcWrr{=7$?X7GlEgtRP2OGF(kcP$@uF~J)iyG56ek1zqv z*uUhMb(IDinE+QkUJ` z-A^B~u@QOI;9gH{GjcH?i1t&Wb9Q$)ABOO&25E%tZmeBSwbCEk?p{pTi*fe@Mrf^%as92=U&Ex{~g=4;*euL%GK=T?F^Hba^-fGHg zb$xA3QC}}}4Sc^=N|}k}R(E%Wpuqs74imm%>H;x&qqUzQ?6#A$bN>72k~Gn~P4C~U zs;IzbXZ0)*9uSwENj`Pd1Qx^Yg;&2?1|D}*FUrm~5bH-5=jUnFLb^^Mk%OS`wVEtH zbkK-f9%ns>4}SgbQLp4?`u$*nfrU5WIbR=9>A>wGL8}#P9`QpyDn6be$W-@J7<%k} z0PC7PB`|v{J$5Wl>_sx0jT5Tq7G*0ia<{Jg6jFBsf$FcV60E4g#QMB0c9Wn;t z6_i3V78ULi(!gr0`saJB>7J9JL z@^Td`b*DeLxRTSD0^~d^x5)1RzUQlA&FX3Vr@sC4vjz>dnwYw}x{*7~evMitH(^SG zpdmVXl988~b!6{WX+=;ZWz^y>qINa>c;n!LVOIXnQr zetg;dE89Q=u2?InwF;>Z6n5Qu3K_)iJIJ8(6^-|1>%QgXu^IIya`R+SP*Vqvm+I#J z{CP)4MuuXDcn(P_InM6Rd>mAD>e)8fBKhWkmGSJyhi&C>T5gJ&!nnDVtg-r=pJ&Tj z2bYxo;6|-a^*2;$b7RBIRUNc3){awa}Sl}SH4zZv*5O`LEYf99_NxlHE(`^{r1tsd4Fc&FysutgsNbzM_ea_ z3ys=|R~H<;l>npedGa8pcADIyWffYZ%ba{2h@`5`){L}wb&+;-bZD#}SyH(WND)cy zkecHFr4akbCD{&*j=@UPUhJhDa}?mNv2$O@3IEflPmiBGIS}ai+V)(Na{e!WZ;%|r z>Cq|8hvqr_?^I>pmuvlL!%g1qqL@$ln6cr3lhzUEmOc&!(V`Vk2T(IE?VB$i&7I`k zQ$jTIwll0xR+tbJ5*-YI?-z&{(w@JS!CBGI5%w7q-gc+kg?Hn z=(RU>vy2)gFoUCCi@_1w<36ZL} z6ciKy@YAi|=^?76MG}mh|Dp#aG*@@xgMu`lX6uF=dYtgR@q>0XaP^M_ng7Ts-zS;Z zZERFq3)icW1QIy|>2?=jLhs3ooZPh5wv%{ijiTxo+xMR4H?(y|F<8@!xRq$m=xps2Dr|Jx(J#~+Tp^WGhBykzxXt%C2m^J4o zRB?O6TO3h_%K7hdirs2reH5oqvm_^a+j_itM;YC0dLmT3%3*@Q`k~`AN=`O}j8A&K zNi|QKl=>zF77}w=-ll(U$IoB>&@{x3?sZ3eS&uUkN84gvrfU6W>B@+RxT!BeRHLiW z<1KDziQ{oJrdi>0?&h*PO;fD#L;C6yUWL`FqGd{LsqV7kE|JXHWeUU>Wj>H@N&nm| z0!(L3)B{8HAt+0qrKJy3zAP*cg(N6hR0~Hkm;l3pbfL)_Yr3_*6g)ty#_6H2gd;AX z#~9m=4NK#Nd!o%=kPug##l7FA@L*xdPpPb|JTxFIVs77-s>>a}x=bmvNBkrMw^iGp z!uQuX+S?3a8fWuC*^zKwdtJAB6Yx_%+wUm4;^OB*<t7=qvcoSM+}LveuX z!sc7f_HXFgb_y~S@dO<-_Fi`L_`C&rgzi`>Flh1uU^i~j13<0q%r}KMF+b6zU=;$8 zhtJg7j^;fK#PqCr{~>r}e?)=o>gcdMChyUDSwXn4|OA zA9~#unB}Wx!;mrv6+_Fs&h(l8@%!9(^bWquM$q-hXZ&U!y@Q}S3i`^}{#o&R_Kk}U z2A~0q{qlw7`xMCwuR{x?rS?#=b=Qp{94dAt>OVFFMhFxJ90C}2e>5{wgm_?LRls!Q z;88ET>>wfRvr%N;4+8tlsuH7H?VROQ#^UIszNCAo9dw(Rqo1pw{b=UfLyI}U!Zu~0 zK$q^O=dq{M?~L+cbk^OB5^KbijmB0!)M@L_lQqp8XcEB?SU?F{d=GIJS^#sf&fj;$ zATHB-fysA}QRS1hw&aQF*dR<_**+%c!Js&A@%Q6^;7ntp;7L7__K3D z0PrfU|J-+pvr)4}@5?P3I=aSUnF6kfgSkh@$Z(%IVh;nBzB;xOMd+0OemFL}U+2_r zmqJ^k!z@_e@Ceg9QF+B=xy;#`x|&7WYy*FL(Kemnc8>FRCRNwatD^AmGysW^B@Zl2 zG&f&WjEIv+7orLY9p<@eQ;hJ|O>A~~1ni3-6` z0*sBJy(iy+e+Q&IVwY#zWu9^1&`lW4@l?VFOc-^JQSR_kq*_tv)J= z@$vb>5J zokW0v@=7`4rW!Cx3pamk^H;L3 z+7hRY{}y_iti3N~oLh3p;hgYt{|<@jIPQm&pJ;>I>L|iXSQ~+9G&i>-qA76(_pyKg z9RUFW0CSCF&vm!rAR!@%NlWAGr$dH=x!>B%v`4Ch$>%i;{M*}M)AQB#*OAH@j{`kE zL?!C2h7*J^VyOK066~@@9xwrCJ|edk$Q?u_m3OhX()bnOt}fk#uuQSNr196Bkw3<| z;AL06c3x-^9jh-8kunmEx98J#UUyyr+!{vbGEm=Eaf!eCOf9TiUDiz(D5;_7WyfOA zRC0et!6B>6;{e#vz*VD-Y#P7C=(osPj7A#L8zILn>ALkt3Y5^H(z^u4-d*k3P_h6o z1-K#{7UC(}Pxsqh5Ot1Xh=%sZUoOClv9~6_>-sj^7bu7rilHPP&-;VJgL48kJ;w3Cx)R!TmSta$e7L2C@J<)4?&Hk(2AAlOBeONEX3J$v?#^eAsn=8n?$DS^% z8lrk4&id|sv2FyWZ{qnvtX^yVqnYL%s&pY|*(w$oW_mqbCMI{Y2!EQwy)Ek7^X8@1 z25y)V-A_9wQGG*Mi}i60xF<<1c-Mu5%BvJ)McM##P4gI=oijfg^ZBb&j~Eg1IzTqThAdgGE zV`{dX;oCjnAX*O{)1RooinuD>1pf6Ui&+IwbeZg!?$~<*nn=7MN z6Lt(kLL7?IpM0xa9y}AUYu$QjeP7(Xv--nFyIKD!XYrt2=cYN#Gf-y5uAz}MUVn;q z-Rj zF_PHWSO6AE#ZIC_`#@*4tJC)(kVx*j|F=~O0j+Z>?jS67N0gqk^V~M9sn$+yz`Md`TD6+PD2a+&nYvJ<|+nkMl za;)%Pb%B(9t=(q%XnPV|M6(ldMMZ_bMDtja_X+K**RSVzG>bL3i@P*`=(U1#7y>5^ z;tP+D$I9^g+#!ChxIkYLBN7)zkc*x7t?|?cE8TK)^{$SKZ3KTxb?LxBE|o@VdW{z_ zEQBWULJZXd+dDf+Bv~peKNtP%_gYWFl%7yDWHehWS5p?j1HpLW;|%VXm>A}dA3r7^ zUVbf%z$__gA@QgqR&0ikM8X$l{ehy zCh+s1%hm(iIy1C=`9TJ~>Lx+GeNf5Z*MkdG7psmM702+tdi6@w;CSVCT-Zk)?WaAf zJNhWX(EK2k0t}gMP!ClUj?)uLn3e~dF$P5dxEW)dfMg;dBvPLlP${Gs7Fl5NSjNL0 zztHsZal9EZc?(}l=as*JICFaaRdZNbFeo+S-oe>A=iP7Srly4k_}3L8N?`vt`}n8? zMtTN1vk5E0NR&vh>_S&Z+xZ@$#zXFoa)}s8%cyT*1E$g(mxkN{nBB0S%;gom)fXl$ zThg~7?PILOL?RF(;QJiceYvm(U@}J$u`#9zac$^3+#D@s^d50tD+G&~@ZJap5seB_ zU6HjYhlaOFc{1ZvqMO2K6|ibL$1lSm=Jlu8?+T3l!Q_qhky84GgF!GE!v}kU5%K1d zF@j0r3g!y=>U#Bp>zTfqEmQ`#`s~?)5g<7r+q-*uupDINXBkTVErP$W1})%)(36$D zQEN9B1_E%3qt|=Pt>gi^BR8~DIXwd5=s0qyxo~;27zE=C3@8D^qturgbI(8xE%)lD zxBUB~tdwF8mBl%U1Ker;7XA$rzTWt`?v1<2Rz)rV3v6&>-7JhEvVEy{gr!$6TiPKf z|GOLA@8R8ST1ULw=W)LJ3hQ?MyoGxe_1it%8~2xc9Yo3Afa!)G7_t`l=?w8psBSrZ zQRd{7rk#8j9eJTx9x+#V6Jy$*aRts~_tNeH`4lu6?~jJMQD2&EHiNZl4_`ONL$h2U z;n0z!$tJv(qEoQ6-^gNVxOW;Fx7%6pJ@#sr@PsW)C!+#Nl~Yh8O|QGV?9 z7D;~nhnGbL9pG`k66J~|%t{8Gjs|Rt(4ZFRPZJnqi)tnARJ8PxToJUHseN~pTd{&! z9|X;)oQzCiJg@zyifYk*Idirgs<$IB-Y%c?iV6tvCA@QTowcIMv?Rr{;08G5rR7#a zCKo|J5Z_XiNtnT!zLAhduk8Xr8ow{=90Z(ryTp-zI$8meat|&qcQ=%Ul{>(s!?@cm z#o%Ot^H!(2aI<=r#w0%vp#A34a8?a&?f0~1k0ZX4%M76>nZv4t7BSx8>nKJq4(>i<5fTUr5!!N8+!8t~akJkd7Ys)`?E!%IrXN)nm#-$;Rq$+sp4z1*llDM?svqUIF-_xv zS*;|VfwQ)msZmm1<5Vz(()Q`-DDEi zI~Z(kTsir9#aB499oK<|qP3lUHMp}5StZgO7Jdp|hb-&g9|y00jpcnm zg>I0!8ndbkD2^^nZC;V*jo3~JeR$8?X#c`>znS0Y+7bc|7>@@^OeF!U_lk}52Jy6< z^5_5>GJ=y=mv6QhB3DDdy-V9lEn8#W7%IPXJMpn4M%5F@7qFS_MFk3Y|+Jlk)K%VUY zq7KG3GE1F(TLRdSZQS|#xhL| zs*Cv%d*J||Yo`LplntamuB?t=!za;YVp@ob=ZW_>^R>h=dqIf}Pw#I<;0YTUn5yGr zMsKa5nJsidBi+{MiGFbpzf>LZ3mry83N#dMQ8R#)4oTHm)0p*$yU+E=_-T`hOE9%~ z8Rq?)%ML;>n~tZg>lr`WwPUXp_%Rzk2ql7BfQZrCiYh8zz&U?JhAPt}wTX^r4<%FnQ z4WGzO6PnY%Yesq5tSCb}a7*Lrv7!>mC+Ws6?~lew~QG4AqrL$%ppv_NWTn(p2z=R#^e#qib_ zYOggpmx#_2OV$|F@yw(Tf)Dt+oHn=b)Kvs+0@{S2MSH?H3ENNu9=5k=vKjItRxn+OTLG#Y3Zr%^xT~9%ciQU%I)sKS?u? z^GygztnR}3z}K+-4hs}obWdI1{i{ds@=|(>t~a=nOjrZpJKtvZrtwJU-J8cF!19$@hkB6dmD{JU`j#0 z!bhai*rcYn*-O1#j9g{h7XBpFz5zXlaE%^Q@2Jx7vGdw1)LP6h2sU{$V7DWlY$5=; z-^_wgGUw$P_zgY5TxViTQ9D80LJbwh<`p@Z+Qa$KbKUmSH^^PhxF?*PZ;-CpB*w3L zM86uqE?nIPAf)~t>Mm==%8eYNKz|rhY$gE(V4({9cF(L8fp8lHgBlR$cwMZG-kieC zH$_bLFCmpiCnk(Q4D91gur%Av=~XM45DaB0y8rJA?T2A+g6nc_b?1Mps{0>#=6|sq zT;y5h0LFj>m}Sru3WBz!rf)b`?j1=4FyKtI-pFNn|gN0PDd?zaGtCN=YA|)lQsW1Hw<$&3Q zGd6`Ymx3Uw0XRajNm?;4I;qQ*^AAAA)3Ps@gj~&K?4@D1X(d*}CvO#xxvTUooxnmO zx^2WCxcdA?ZvUQO`TmOBpX}DQeGRLccfrTB{1c@Z%(%(WA0B_3s>69-mS;Rox(0`| zw6s=7jHf8yQ*~f-4rOvK;aBPoTQxdA;sSbq9p4km3X$jaf@3FZ#W9uQ1`GrmnU+%o zYMGboWk+Wr+OrrcO3Ojj;^6s?ka_6bCCMDYqY*Fjz6=RU%FR|c^TDOAlif0Ef|%IN zF?#h(oz{?$2x)Pm6sUPmPtS-q!?na-bkP2vEARhJ8U3%4{r`;%-}k2lft(JWpSo*c zb^XzTW-w-cEjTDhM{J;HI$H-!Ta}BURhYoJXR_W`U|D+Y-g5~qk(+B4Rd&}J(EzOl z)E%P2VtUfwNaw-Jcb*pO7A0RxSoeDJ5iPYF!wp0u!Vu)H`j-g;itsGdLoP0AGc<9( z&c}8xU-FRdkiKEF!tFP{5M>>jhY5wJIE`Ge6_F+oA)Ryg?<23_fc`I;{^+TFeypM8 zmOSR2eSB^NO8vY{8lg!LvrDFebY!j-F{*LzuGI$R8=0;wok!QC>uaN%^~Zo|rUX@f zaY+jUC43{k`3hs*ByLRWekmTO;kP+GfCyD^m3yuCciY_W$84Us3W74fE( zn6~pX^=jtC8tr@4$R-qMJY`{FjU|8eXc+~6*%P0Tkl&Yjjlrl>&>;TVpxwIv30nET zA*cTynDd{XSdc0}Dquga=K%j_M47T}hjd^N z`>_LVJkNvW4M!QZ#cQ~Um4uYkxmo3*Myz|I;*j?_=j+8ybvi9i>O_V|HJy`g!G%(p z9U9CmBLQ02z@VU38~$-*%)E$i(`M5}!qJ@)@pm%OHkg8 zw(X6k3}-esF^qVH+;!)_A^!$6Opa|k3$@;3AXH=Ygj~cgcbzKsV3JlumeY47LJQjs z-jk;3Wj7dER}d`?fcu`wtZFKTTY{y@9qTpf4O#@~t6yg`b0;+qLjtlxLpYdoX(eE$ zgnGleOxUj{$5~o6ig1>`+R1~0dwuJ;^5HmL*D#xt@$fS84)c2rjYQny*We#MIF^$} zfV%%*1>XL%tp1CL-T&8x=~n+HC9{I~5S6Gt2(=*jJ<-$u=;!xY%J3{clg^*|{9%V;>*q)!bYw!=`eoN~1Nrxc3$Lq7D+~rX16SU!-LFW<%-pLbLU~eD zpDv1=-KMbYP^DB$aqcB`JdeB-k3k$xUpX`vl>`wi+UwMW)VSZ84tWN6S>A_o##TH^IuDGo*=SYi<;PJz~PpSrDR};EcREpeti0=o+st%ccP*pZb>IuTU-Gvs`A)`E*^`f zyEUZg`YoM#CsIUK?yWL%a&JzGrONAFJBOW?wgp9UO4O(&@8c`T=D1UNc>W4t?hZMe zCojYxv-9$#&w2+2WM583Z1bg*TmhDKAXHeqo)jMsILy*$JRxCbT{g-F@60UE!Q??t zRK&$^I}H|2+2m!E!2#mp;pP9}Dpc=Y$>!|)_$6_BtT^d~HZ%jgNpOlN)eBIeHWj&G zQTK(6)!Qc>KL9wezxCl<&!1C)2DqsA=)Dph2b=nzjZ4|#C7NXh9xJhO zCA7;ODj<7aUf>G5E)fK>7VvM}(0LS3%gqXK-DV2s7WFrTP=}&F4#w%S`5|upgL03k zzj}oWZjZb!RvSCIP?>0E!M!~vuyrOBFGpqvmz9Mj$LSr1jZH(x$LO?r&q$CS{S_pv zdG-AhTe+~>r%)n!E4A0ywMgz4c2_)sruHN{%WRq9{d0E?!o2aj0&*@dYcS{!AQ{-} zaO1&CrhlOU`uPO~c;)wr%|tZ1n2g_i$({K44;Wvsprn+jV|t&4W3Rp@J+^)r9|uIV zH0B_{zXqJ5b=u7f`P#j0@Dt|mk6Rd|5cLmizsVsaG!>tk8b-^l^Y}OwQ_l1K>}cEE z7570V;dOA~l9Zlqqo}M*2mHk&FtDeBMHUtUu!1b#>Am=oM%p{z+TSH>XyGW&EJJLa zX-R>L;?!+PH;M2$pWV~z;4GqNSl|SgBdo&+hiz}DE8?!n%M04K`O3FrGBfRJmIbEC z=4&_Zg7k;6b5?eQrmS}~_|zWGVm`?M5~gA9WQVlhmCnsiX1cWr@Ub(!>Je-1m&F zgHO{zi{$Z#=ELwVXdfuxnrwc&=`<3OQ{Kh1=hdVjRXHUIrQ&<}*r){tqV}q}Ka9?g z;hY!dO48B^(SLB+_9io2m%Hn99*K!Hjnv|YB4fGj7oPhqR9px)cBU4wBLOx@oucSX~&u(HM`B?Wu$)e&Z``QC8Z3S76Z?gCS%;Zj`z zo4I;*o$+Igfjul@@~p~y@CCG9zP^nllZg)(2Pe1OZP%#1(@KOkw3<@l@b1^H*U{PC zdK*r4tifa~mD*J4Ji-MV(ahKGf2}yyegbzzwZg<{e>y*@j80i7BPQlLyK2_;7rmRt z_Jt|s+sA_hunupVWvtG?G(OQvfXORrOelL9rd9oQN-QO|7%mYjC?2N&oUyf9lH%VeAa( z^bqN4!5P=i>AQB-qi4^btA6+p2!jFAa&maUw1}7gZ#EjKrE_*SZ}kA?rsgGU!6nO2 zEVNP#I1Ni(W7gi)%yseLiX86E-IJ1%@<9D&=d&1M?hj`wMO)+lX+y2{G7P*)IVQg^ zUQP!%oLuo3Il_-m_cl!DP!cd$co+z8vaD`jT$ms#F*P7)JXSQei+ca<0*~-yr+pJ_ z-(l&VffnOF23v%t6?(fc9xP9vQlzA$cwi5@^1E0do%opPU3@K?SH3h56tse1W4o+b zw#=YO)R$pKgGsX^njM8gQQW<2`EnP8Hi(FcTS0K@!pl~9Y{pL^E*%Bxk1GHJ!C`t9 z2{tx-Z3%OcbOF<)1?t^(SiuUGyVD?jG_qe}*#vyLh5 z?ROv-k%w0da?4+C&KR^l9*aSA6nE}~wA8zDmp;h%Q@qcDw0vOZ?SbH}Q#)Xt`3xSQ z1dr1hc;JAi+d+QKov&?((dqi?)%*!Dfq~;40u|e3d;FHCr{`q7YjJNP^TErD&C9dn z8MJ(w>&=S=-o(ohGlpOAh0K$qhn)8-j`H1+^A<<3>y!&|W@4YH8l++}G| z!zcFd;(k^u6R!2=r^r&zu+uzaf|)vY(k?g)>SJ%)&;j!F=9f%#u^|M?Mqjr-nPggx zd_+8v@QZiYh{-3q4Khp_n=ii20~>$-e28}60h^&DLB%Wi_AXOY`{2lGyyPy>V#CjQ zF|sOtwO7l{hsl5smH9z}(I*%AWL|TPp)?Smyq=TRIBfbGvl127#t*FrCXoF_OXn~f_$a{`|TX5jLg&kmHjM{=1At?ge zw%90PH{TxMbN0ZqPs>QjD^*ygA_~K&s$Y(5F)9Ej1=(Mv+n8uB8)Yb;#<;_6LmOsl zrQd#_3l{l{LSc$KMh79>nZB1+2Z!j1aQK2m@paUH+kF-mpg}4iCtSxtqNr;!TN)?L z)dEe(uzlj+Xi4BCv?tHseHS)!^6LKkhrDcaG!g?L1d&ya;!7@`i&Tt^KeR|=zN>Tg ze%&XP(DjcUyd@P(Mx`!<%k}c5y2r)Q#D#ALNbZ_LvTTg~a=jfJf+^!Ee*wQNH)Afh z&K`S48SqVqyTFX{aN4@eXnVYL@~30&i+9ET8*P|ytp;%_%C8SjO`9*s4Go*T9`}jl z>0E-G)0nE!gXm^j%rZM7jJ7{jSf8*4?Kjm-=%?p;c`v8qylnj#jTSgwM@GRh>Ne~l zA{!eU7BBoxjT#O_N3vM?=VYVS>h2}6x=Dq0ym4`P@q^^i<{%BmX~}t2CZ4?x<(d#z z`+KZ*21_tr8oov@!9^20Pc2cZQ{yB!Hzvqr4mJYFg?cJ-`O^BR+saC2f%FeA;|BJMmO z^2dB3q@#3;fL$qPFrY~VKEF%0o|LZXE~>Td#t`!Y^-$V%FXxRf6e?OYPaBdK%e$G# zG*(9ne%Ww9Ok~R;kA-xNAHeyQWF=ugf?! zU_m0s&Nm@z$}gN;T7#$m7_R`F9tZnJ%$Uw6P)Px^6WQspcl*B9K4XM)*-_ z%8OqK89U#YJeurJB7ap9fiZRq_)J;95)O7kgim$#7o1|y=m}B3$tnenx+ETLIKQU| zQ3E{y(nEe7g0l5)Y|Es^lW2t}W`Fr|8(ix4z3%7A(Hpmus7T2$+aOyq2Q-n}Rno;3 zO=4b$4k^5D0ikxYKNlV9^fTOW{A3lP$GCh`U!>RzLp|chPNe%^|LuLh{SGXKgUS+E z=e#bg|LDmRg&G!VBo@06#d<8>b#(*u=fAcp=mVIq!>s2E>OXif8v2GXr*#~ZI+$F# z@LLuqGP=uUO*sw8jD!4FFyS!t5^GYj6R2|?<#MQGwwLldvG&nmynB}Mt%M# z{6xYzlX$+G^{2XFmTFqSC^evHtav#(O`x|E@a(pusBYNf^=t4?$E-_SJ<-Yt?{-tE zX)u;g*ARX@W%su>&H4Co>zwzp?Zncx`0ASmvLx&UO3TZKj3y?)F5ThN2}n~98*<|s zq$oMH9I3urG_Ntb$OIhD!Qbof3kqr-@GF%>TTSsLnaTT$EY#dz|<%o-oHA)q6 z{~<`*wfEEogY8N7J6MwWQ+f{{aDxLeKDzoZjl~A8v=^<(`I?RY6`Y-6BJas%TODnE zU&xLfvmM(S^BHj00x;gVuWBY4KJWdlsLHLDzK$%Vq(0FXuYX~egVnJZEJ<<($vNDX%{9}4&StNR`ZWyc zR>DO*--5?K;Vpy@T}qM-#^Qy7-2($|(!B3=-kZ5Cwlhb}vm3}kZ=X?+m>CVNN$y-)hl`w1~2NXO*T)OB|* z<#y*58^|jtSO!mayKEDWqN&`ytlT{di;9v3y9L2^UA=YhY>;s6Hd@d0Sj?*A&w91QFzlb9jCI2s=tY5*wKd$w z4T&J%zgxGKPR5lDtW=?T4Ihswv95VdU#tweDSGC2L~F^1A)QbjAjS7z|1Usc8K|Ae z@_kBMJ6*5&>=B&;Z%F`bRNB>i6l*c13EA>e#JvVG`ZQDZ!(%!C0;X4%KgDm5 zIlJ9%Sy}mLiN`?0fnfA`R9eLhwz##Jo+Js-S-GYKSDq+Ad3}5?tS5db=o{6V__enV z&XMD5UE<V*7p>2w%YHixC2+@d~59Hrni)AG9Z3 zKM~xxp{TDaIYl;GyV@S-C>cdY>aK3V#?GFm_WnJAJ+I!DqBsy&k`3;stWoTUYgN%9 zbWUjo_nDa3+;;245-}who*C)htQ#$S5B8aZw^f>?xlXp8`+$wU{Q0<-CcTbPU>s%`(%#`;0{^hPoF;hS5FTft(j!BUm6I$ z%Y4x}XS<`Rebg(|&AN@Y6e5Q#>kNY@*2(RLe9VKenD;R z?G03X(@lj>0XuM8_=DOvnIGMe0LDlQ#(ro<5*?Oqp#-i9PBl*Yx>H%zHY~g>sGGT= zYPWkOoz4{xwI=im3Xe=*l)k(3@6un7*1yNBf5S6k<2-hXdr|me=_UY~# zP_m1CQf(-#-I50AO!g%`aofq0;@ry+LLEsZU|FBEv@as8K>j;4M0_s&qu3pjo4+k0 zEX&uxyFWe|M5!%?{>Ce>0g;h8lOizS}g!(-5h z%P^RACH6y0couN{k`|K1IF~-F!l^6CxorsU0zsXfmBMVP<3#=xx z&sCt%wGU|tFr(M5s*E-5pJrb^r0FYtP*fUd5f~t~@2JF>ymY8gbpy$Uy-YbUzulD4 zy|U}EpqTwH4BxGFVm+RvtScn0U=@TRvLCb<9YnNO(Z-F;}byW}%p{(e1tDdx+5+0LM`hDWny zL~Z>a>zY?of8(}6+VMcCW7yme0p(sjP20jy0#Z9hnBo3%#~KVWfgvF3o?!{F1sMSC}Ei0I`WpAbHTI39$7s z{pJPb@Rk4>hJH7@Z~p}ErKvl$*nE`>yqm-}E^eMg0a?47zfWjby}$L2&&TTNy-;FG zF!V+V1lnhrW3HGR3Ldk_ahN(`KZ;6bX#BgEr2~gI-Bx2n29aFi6UZr)hEG)R6`mf6 zMz3%;kto-TAtz&q#wobg%!6mbTvYAT`!yJ#D&kpYWViSnxifK<-#N20>(Z55nN&FJ zzCtR;AaCxY)y-46Co=5wlk(l#mG!kD-A`q)Rm=`A`J0=YSv$#*EX(Q_*e&)3n6oTz zo*gL8%!XDoW>7D$q$o$mjg$a{sOa(bi!uBw*O>^>uCHSKJ3+XU{RC!F-G_EH=RuT%xqIwf?tS#t zPH!xYB?Ic$bY^+1A9R)vZz|Zd|N7@NRZQ~yJT*rC-!lQvM*(%G3nfbrd-vMx?$B*s z3ZKt<#>=mw!Xt}7cWfL;#RXh~^307iCO&7}J_~TBty*pF;UGHJkb>j#2!(Zi{n2Rkx zYZ}VTDwq#yq0j#UpH^M2HgH3+@5hosb1!+STd$S`*T|uVNr17#7KH4?w`x(H~hk z7>F+s`Jiac4n2*SZS%Z8TDGG6>zOJ0PFB%0XftY6W$2J7@j20NGJ%+{)Lf)EB@fDw z@KzdC{{vq*<)g>)Zz|-XAIL>hoOU!;k_=4h0*DG~ESlN>a5Ac@_O$|FIq}S!`^VgJ zg%-HlJV}q)75%E~-R$3=&Ecm{DbJ2wo1?lhw*z`VirpJ%o{+>b)XH+J-ofcBNs8Z( zH85^g%+k(NpkF7q^}OM$S(o^anYtaJs)Ud`JX ztMe^e#sJcPdyUsR1i4LAv~5k*N?V5uH{ZCbB1=l6ViDZB@@CdxfCu#$9m2xDr6nDD zrOwlBBgKdD8suOw9eEitbAc#H7^(QUR)?_kvrkkmjW{!;lR6rmS5m+{; zbi3dheL{7u6{pS2_Gh~AEdYMIC&~QBz@9Dd zpYd6bFETyb#D5$@2MhB8;O9vv4*Jp85MSc34}6IHdnoft0^s#Y{N@S!bkOWNT{K!| zdaqb!)V)G3H?z)EUG3$B+!%ixfla!bIK^lbod_$~W{At&kfsxVaG+iM% z^zGY08(2+7f4U{Z3Re7al?qE@LOpn^6|A3HP{v z^To|JeSR(uaVWhmWy5?VBxr+-=P=+45<}kG(?!o3R{Jt&av$51w!hCOX2C^Xp&&!u zb68a)`V=x@p%NV#j?S=MQ2mOT_qnRX`PLZGDQk+cW|?m&~yilV!Z+lcHUc z`v%I-G_^5S%{WRcE%iw33CjiTik~XI$Z)U`O_P9^8Y;5VlJhC%FeO<_!c}>zjaK5* zvnhoGqm9&CnmvJ00E8P{Cx2Z$K3K;tK^=mLjAIQ%y5Ive z11Pa?`39+LSp;pKk=-EnIN2!q%x}S@+FI{JTsfmYpEkrg_Lg97L8^1xPXjsUqFM?+ zdrF~aUP5o%|6m?MUA?{#WNSN&iC)I|)ARM`*rKT+k2RAqd3S=$+5cR72V;GbxV<8e z)GSM#S~PB`T!CJ+cDy_~Ik%+vwvPnP9er>Q%I^kRqnUsad0-&X6{5eAFfqh8$kc%;v1a@SQ?o7!xCY|!d%>?Y6K=21het$wY9fyKtz##fh&A;6 zkxjXCwkifx_n1KN9d=FWuSHe;bG`tj5eC3iK>kmTmp&G{W;uZ;zB%16wxmfqupzaM}L; z>CC(g`dLgAxr!fC+^-T^!^faLTWBrbW+K(Rucj8IWF)C3seeO6npJrJw}^DftrBLD zB6n-|-P@AqkKQit>gsBh5u=svlgcZpGVaVXelSj);ccNU6Rhq2L;rJoW#LDRt)q$} z`U~07{`hf#!y7)zW}7Mv1{yZe*d?5gPBa%0RCl^o@M2YhU;ZLg`omP@Ar@BdN~H^3 zai5HB0Tvr!M$1>~k5Iz$l|gUxp>;piKRl#oGM{^` zH|Uf)iIOTv3f;!Y7>toCk9IbLX|l5SSE`{cB30ju9%66LF~ir>Jzb8JV<)$1t12mO zEg%c!8W+eK%k@pOI*yrKzwo8Z6bsteQeDN9{Q5_ybc3wWHUAQ;l4hw^-BsM0kf^Y_ z?fnm~BpICsxTI5Qa=zj$-85Biduo^Y|y19X8j8fD9gOLp;;cJg>S)%@~v!M z=|H^k?S*<1aSR26lYhU+}CfL1c8KjYK5a16}FIEqHoncP)t=QXon8rafP)xhuh z7=2+y{&hbag9y^ZQgNZ?=F$)<4JYTs*Asm?3?5sKjagS_M-oyTo3>;xn3{czZMA+( z-nv1g5Dqc86QRpVzb2E6BTkt>Ao1FjDykzt!pRG7us817ADg|hV*>HCb%%`A7^;X;8D0PsJXbmH{*LcHR(MR zEO6^znk$N~B8|>o!;tP6Uq-0B;B~oGtNR*#LnNvbBcty1sX?xc|4w;gy@`IKiCs4^ zIqyovA=TXAl$@NL;Yr@IaJq{{Aw+^P`4|J;G1V7mN_`c1ui&~aGT6m$Kjy+)+ANCl zuEJNAk?}Xq9@oAmNr00*=Ad7kBH~gWb^eqR3WrMb7+SX|u)<=mNA|9HcbO82kfdM5 zoprjBQ9=q)g-P2ykYx;c>Jt(-%WwNH)oPz9F5SHfP0A7d^1CP$`U>ZqE5gl>=@~#% zq?6IGiR*qAy>CK(5kjt+uuR@^bX>XQ79jzrfx?e*C)(8Y9_tOnZ)3DZhOsQ;3Qk=B?%RI5aLsF6NL_ zib38-rWvZjFi_#%H#|r>4Ja0V@wPIJ66}JIUVLvFD?=5gEa>e-$e!U0>QxqmidCc0KWZ9a$90w)A6PqzjYt@f=rf_~3y+ zbqIDb;V)=HAo(H0CTiXYsRjhpO$P~xh|oaJ0s55oSQ+Tn{?Gd{_h&sr$e|rFX`-y^YVTy56_>Yr1s(~DV9C{aE?_sn8(Y*7#g} zGQNZLq$p^P@$et7CpQ=7RZD2yZs+k1GfT+#)FERS?TRSpj`gP~jqgMF@}Bv0aBp?p zvrThsCGJruB`S~4dIgU@;HV&ew1X@nWmC2jv2i=w*S~t`GWW0qik+!DceY2$xQ?b1 z=9axvI+F`+EI$}B*VgQj&y)X(9dYp4pW8(d-5M4f;z*wz?uEV*SrR27&nq^q7=+H) zOUZfRP`m_Ve2QAsdHl>)Qvj$P zkm$k#Ht`$KCsP&IYe$uyM6p(fJfyFQZrk9usIxFTSH8^D2On0MoL1q3{Gb3X$Bi+pj@-GuTrx){zch_- zlX4lREiNt|s^~_eDI9u;_x5)c9QaW$Y@{$?eF^51%6LU7s-*N4Q2pA0Sm_0@KfbT6 zRRk=e5ApF~VA;82fDl0Wo_Tq0Pbs~y!b|xt9~26e_-F`<_eX6nKWm#{m#zA z(+kw7lE1NB1y_d+9!%@lJ&uURF3QTHWPqqt$Ed6mvN`iIkfgQ8>@5kLTk^p$Z96V? z^s%$9eDG|b^<)ZGxa39cfJIq%6k~PC6J7XTa#&qXPvQANV_%?+-n-D&caqMD7bn!X?4tibDVU1hCl?zG~h` zhcpRyg^sEH?}Iefdkm?9bFEw>J8kn_Bo+D|{yf|Jy(vf;%*YZVth&%1Rd7UNco($v z%Y%-N4oLtA(L(00Um=I~-E);il@xNzi$p+;DX*tfGpY^R0oUvz3n>pqN2V;RLw03-Opb4n4 z5MMf$?Gd|x(^ulziJ@ySQ0NP*+(>eIu3W}@`gH%XP@+KqXmorWM4CyXqoePldzuUw zN%`6QxQSWd>q~H%r#hIa>$Z%O=;#0o-=LD(0Q-R@pS_oo-8n5 z<5^hVx#raOaR|svH-(0V3PCmi`=C8;68kE4?LStGJct6nS1Bv|w7leC^|$YN>{Wiv z=P+9Z;gFc8OC(U@PC)W^h{KpPqifclr174335V)+GJbWvd^%Mi7~BHHKu=(Pb6>>y z`T339*a_pFl`G{_nq&62+1Z->{6Fc}*Y&n|Zyi|SFb(yn+iQZ~zTXNkCn_!a`Urac z2qQ#=uDqUbi`4XVoy3V$1{xwUBu(dN%mS}fr&bF!U!^7VmHp}QcFD`?9E?SUE7MZ4 z#DAL!xS){gUM$I(=r3h z-*5(5%$#ZO%uPOs;S{w_*~sI{_=D7tIKA}eGbX5?gmJ}vqCuJGh~^NQrBC-nr56*D-v)%7{mC|_A+&t)RMpW9-+7Jzto)^L)`<&~FgW!KU4G(yy&?xnvX|m^rCb+NhAA{A5hv#N%u77-h z2!$i*Y&1SU;TO3^c6RjBG(G77!dVxJZNUT5-mTQs)Y2b6nzjK)1kgBd0q)zXVj#|` zxaY@^Zl&+**L?Y2E*mNh6x#=va%AdHS{P1RrnyIEHlhGq5$GXWa-AOhBjM%cEjnw( z6uG&2h~Hwq_rufIAoW3`-@$k5>ldiI_o#Cg|9#GmwBqL8F?cD~iG3g=BZpm)kQ2N* zbNz=4bjB1{@$jMfsB%%R(9O|u&tGxZLQu&{f;IR)1K6!pp48H^AI)1Wi1|TGq~1Na z%8Qw_4ix?#EU>I+qUd^XDl`JL=e#s1uu=|}vlQyhGLbqlGCRlaF%-vT9{45=sb^TO z)At*9 zm%`T^I!ZXDvrkufMx=ONp+{9-itt)TXT~$sVi(_<2Arjep&MP!E#9smYIs8G$nBa3 zG&X!Pzk7}@N;9sf7VC(d*h~!^%3*MCh4BVr3*`^S3)tTL^qBJtIGIze+rPJjyFy>< z!_e9sw(hwY!N7LY5)dg0uqrBI3(NYu*!7Oownh^%t~EcpRqEEcOXQi{!!gP3IF!X*^H$dhD7sC4Knv6$qM#N`iFzulR6Br?dJk7HjOsmWS)15rI`nL_`$v{yo?)C{UJO)Q!3HRSGEZM`i$x2jD@xS{uBxa4@em zds4f7X)z`yCOj&N?%r3q3@Q9sOb6ZG?ylN;LkK;ws+t-R+qP2Z2+baHkt3ZB$xAwL zmzjm-LtnL>(y*I+oxfIT3R1Z4Lr}>-AHISEtKA!Ug?|a?jE1$uDm?l&K9QicLP7+wFQQzt{iaBuU}#~wT9+N!uXbxQ>H!p(|9B2~98PwB$}L4*J00$>D+1!zti z7n7^-v-|_KXpxhZZB!rl-|623y@6;EEAj}15}F}~vlijHLO^>2qf;~zYZaSsNlM@Q zo}JC_bK-Fyhm*z_Om7B#KF^sS?)QiqNTy)p`{wxNDjoq+>Ks~e_!1c?WyXsGXaL`x z6TESQZpDXtIU%jXHhW|ekpF6i)_NvBXm}{!pxY@)0%GBBDzAj|RlLBwyRGJ5s9G3- z<9GMx-#qoo_61Mi*z8OIISXUDHHX ze$lzeY_hGH-avpFDCHND-u*{`#C{Dgb#sk+Q1m!}+C^8XCK>-L^A{;bp5fZ=cZVsh zGjCJt`Ime9L{Qe7UUI1LS(IAUiHM^0ecqA1$XVy^*~f3y-Gl>_!^=WQwC|;4L&y)C z3dB$<`M7?avL|fsnZ)8ee8%-az0l5>d&Dg-4}Oi6BL(8e(S8323$Wc{TYmJW(C&zBeH-~NL4^Re2QrTWjkT;t}|=K zF%)e&@xF}{LO#uiOEmCyHCat^_N%}7>-^lR?spgiq_TlkG)SAr^T3AXi=IJ4OC>^8 zA@hS83g3Mn%%2e1d>v|OiBd$7a@F#8;!%%@a?{fxkQzZ~$c@cS%&Ydfm6h*OtY@4a z;G3GM=-44VY~}gSQ&d+C5o5~_B1{5nWTsC-`ZvU+d^32dL2M>HbhB>^A9RG_`a2R3hdRlZ5FR>+3o z!IFE|*#7(!?&P_dpL}=eIO?6zs$}4sJc!dghafyv~5G1n+^%>AhfT?Q+Y747pO>jq`8C@M&r>0q49dsKO;> zRsE0D9fDa2Q&CCXJvac7%kST>h>02edu*AHR#sL9{SywuV_EE`=pNrA*sUfeoWLTF zWf+2tOiaGLA~Bl#1(;kPDfo>4YXFx>0L%S%WMm}G-+=)p$FZNz5xHHzXnvk}d-V_u zS{W0f%MpNy8=yo2t>{kK%=Htop{31SjCXfrgtuBVBkBB;sU-@;{%cPofoGs}1(@@B z-b#O0RUJEn!zT&$xkSeQ+Wxlu$K(Vr0Qd@*{{J}*|8L$0`p?vCg6P9cZ{AFRgd}b> zXe=g-fNH2Q+U@C)5?p(6ps%--h6nn&Kxg>n%B`8ev!cb6QW-p+j6%{~N2_x==A;Ve=}OwmTt-M$?e~GD%C8S4UCJk+y(Y=4EsraKbQo_xLjIT*bIV$U~9*O#=jQeSqtLJ7D|SQZpQ<8aV5V4N|5ui zWd$MA(s-f9vWJp?z9=S){dyMn1Vw9w+p^J!wZy6Nx@ZQBSj)i1>!Lxk-N$CZsO+^7 z%mQ6-k9B4h=UQvtjrFn2w`C;w(h^6JcIU(9!*;{v$d)Fjp`X`Ol9a}t@WL%mE=oIJ z7yzeKyyuc<2HCI1Nn(dGN(wTG@)!G=WsSEX=y}d`Q)k5I*RNbl?@Uwd#o?c5>Y7j0 z(O1@mm)7`Bi5^>vB8rqra~=hPGY!a~$%a5q2ne!~U{4leBHq3Y0#%sil%`JYN#a+& zLQ?doqBWF?#o6SuWBg*6Z{1?W=Tr!tvWhlogs9M+AXj?YCJqwS8El&oJ>h|u?Za+F&g$QxpTBa zRBz#^bF+lLcyFL}j3{O1OE}1}tg5YDXx?)7fC=)FXEcwa&j`n>s{Gg->JR3GhPikGcR!%5&aT)14Z(H# zk5_8VU-jp45O$GwRGD$6r#_>?wYRd!V^vRYY6kJ)9No(26ivf^bJg;(kr6R;8(88U== z+;o7R*0iyq04l$Gn^^4l<$n$@ijH0`T90*4cD;t69i^m*133I{x1^+GzfC*slj29& zBd5;6J01x|Dck@pO8-`6Uc~$m<%B1>H!Kv`U+0-s z|Kfza@s*#SK1+13Ikx_TM>z^WR#hHBC31yUwV%_{5);k6IJ6u87eWRntk|_u5-lc7 z!%pMG+ZEGqL~qQ*Tsb?oUrM<0AvQK*2w!Wo>2l^(q(J%$UwM8zN<=-=fD_Kct{FO) zQ-Lw{T$MBFXZHW{vq-S7cbdnLN^NUv>$he3yOg#12Q6UY2@K>v)rDNIiP!$Tw7RuS z4t9k__6rcy)!lV6vbel-r$U)vL46{Lm7lv{##ey%{ux(@YxTeR^OVIkP0|Hn)Ng$F zWjJSsUgEU_aV+CdP&EUu%HU}9dT6Kh*?F^u0mOK8Xa*s(R_->+o!azGZ1agM(DN+8 zmaPYVXYfxZ`OePbH{1JP%Jx?j?J1mNM=!p8OErq{fHkwhi=~mjH%H!RbY#49{W@D9 zvW}vnfJzo_Tm>O}6`l|$+vs1o4WQt>WaulA6n3KrEi|il3Ui@tJXW5=x z*|r+`Tra!Jb91IBM*HJ)H8)?pG+MSDz_8Yc^Z2*GaRJ!g8wTFTE(Uq5-gS#57Vw)~ z9{iyTVZ~D);+yFGTo(HbpFMog&Ry46u4orMJyq2F-OxmM7!6KL~7TcU|3_Kuk5KR-|2t>@F?n($IwzmCK2;Q zmtT~}Bv9K_Dq3qX=+xl{-tMdjlEJ?A^J{KzCr9CNioL1I-J=r|3xI0Bv$KPo>ANpi z;ddSIGu{xA7PYmTTUtV_ixtR_{|{84fBGw7bB7q2nKR4vpFFv`cU8D0&RPM+u5Prz zjGW^pf}Zy%#U{ogwdv`GgvDd_cw0)`ELvC19r3a=tslS6%666jS zZs~{HfQF)goCW}9KDj7c1QULd5Ui-B^v~gzK&X=Yptr!)tC!0MEuKL?)2uB{Fy&fy zcEp4kocr6#+1Bzo>Zav`A|s_li4X?%hK2@$Lw!2)X`K&D`;P~liE&w1zFLj$vRBK? zJ9lSu92CAqtDMmS{rDyT17Un~=rt$9w|hRlf@B1|;?e-_+~H0H`D{(9<)yc#CM0wq z{L$UrEr<3LL=dkmEcfWOy{3+h>`6zd^-Oq+lMfCP;>FNc>24h&>)I4d_6}rR2-B6i z0qQ(BZS6fsq_h9`HydPU6Smie$2Awg-n6?34orCulD#tv3;(Q^rPJ=>rC*EJ&^&f= z#y3T6^YwjqzL1o69%5!`XAo49ftdIy-d6F{_Fd*Dq4yja^))8kd7iHEVVoT;QB8Mh zzR+$XD;`-3Rv;{5vdA%Bb3dKqFVA}^X9dnb>ajiahu~!z3t>6hg;{~ z^P3e#l3OOY8t8a#eV{pxU=v8LRT3j_SX2msGItG>@NlcTBqX`vEtEWv^bgYMuPk3^2az;Te(9j;vp4cK`R(#+TT!1ql8%-}S5u0aW*7L5445?+zyeVLiTDYrXYu98IabxclS(5Bi zAC#{#*<}MWo7uDaYp6>%3C-Yno|!_94&yy`*tqUDF*90hemZp50k$N286W+V zv&}}fR&VC;rg^DqhM(*n*yrJV#XADIn>Z{B&Bo?^_btmq){Ad%A{2#YNQVY-pNG3- z)uhXLU*GvBkZX6!!psczD&AAC^0u4^SSfCvS7G9%z4v&Z;rG9@xlv)qU!ll>Sg5CYXs_X!-aXcbq=nPfA~IDP>iM#>u^yP z?W-Hxb$$$7zBp6`=2|uTs8H?wKSy@|V%iFrFJA2YmYuzeURYRg3E+sp?qRAK?SyKN z9+)l#TXSaoqSt5!-j^FCi6K~cKYsjp6(+^T%-k&H`a2r&aY5YDt%{wa@$=lp74>q= zJFb5vE$ZMk)|RNNX2H{sExk^3-yOOvfMWr6j*lsP)O3tBK$kc3*@{Y2alJV6Y6@cl za7i2&x#VFYuW6N9-&AecipA0T2t#jgFNaEi9LOFfZj=g1=R8zS?~@vCyugbics6Z^ zBjdGAoZSFX#K?Ah8e-TRp+{AV+cuMCGZ4w=-+IAUcUel-U`<4oh4j8`-b_nSvq9#Vz&x!1mUEEwgZhSeP{$jUBI*`%L}_-Io1$ZtA5CTEW<>)yK!HTO^nU&5w-^>sON^lVNpPxN%dAWD3)+AH6%sDD`q# zF9#e02q6>0HP33YMRd z4cO7pU<(awBlSIvwQ6iyCjRg)?i*UR6uVp+i0E4%PSs zsgtTXHK%LX!~kQGykUk@S>rho6pedH4)sYcvfa}@XwOI^mjni7Y~iFHuIW$XR?x}w zQL+=_-^xC04NwE8H_^)my4DPPhf+|IrvZ2(o4@`V<=%^1y+&w&Bo(kpVixQ04Z`<*(0O5?KRT6 zIQRl^m=!2rJ$BSAE>&jDq6igJKCyBaz8ZzyI~}1P!r|rIwjb|}yg)VCBmLe?HlxVQ zhL(M3h?W_oUb(#)0JXqbiIyN%w7d}Ldw(OughY(}dY-ws6mlqhV!A@QgNwUqJ|UT$=KdU~%)o0m`V#$iP1c$5Rq*D^ zAz8qFA~ zQ1fy}gMs;_ug?&2J^43PTWJSsM4PT$m-~31aLQCfRMgUN#_Vu+QA;1Al-ppX9%AH~ z+za;`JgCHG$TeKVa@hq#Jp3g3zTZ^GmIcwsGwH3+FdTDj|0>ezC+3(qkpXiwbM#y0 zBxw}oy=v(2xlHoG;$pgmA#oX-Yd8%gBAjq2B+^pa5flHo^1H1@<5+b&zv?Q(o^JCa zCBbA=@{C?#oB9|Q#Zy6IBbGliEAbyEPh$AFb4;3wfz&Hg?cITuw;c7;R-3kW@s9jF z&J4yUyz&p{>)#&lAWBXB>wu@nBmeMj10BITOwRKeCCJaT?->huJ7mdgPX?+^h$vl$b%hh-zr6DGtu&JeSGOl0g&jzm+NUwPb|Gw?EN z{lV>b-DW69mV8EXUIPPzEX(nG{w4ox z9E#Vnw)xAOT>ONTXGBh_!vX~d#ayD;j#562i&|9ZF|lM-Uv?DAhii6kFnk^S^NmG08FKr%BT^qHEz=-^-QdCrga-1q@i;mgyP6C+6q-*c5<=8 z$to&1CM_+k9aGbL!hCc8;9!vf@z4KrqRcPTpekYX+EBrlswz1G*9RQYJG-o(rc$rH zO=PwUX8N~X`Cm%b6|P^@2e3(})zIYxL`m06<1_tp+)LK9f#Kmx0H9S_!RGI~tgR47 zSi)~YT}uh`=d!1dZDfuA&J8rP$QmEO+QkG2Tnx-HXlE`euP~Im3s*ho)n_L^%F0Lx z$<5B-c=tXh8W`7UG+BOeS60ne#mQ@~S0;?v|3_-x> zrk`JUWZeFTSb3-y3Ub-44WZ92-5~ zNBc~nV!ETFN4@YW5TEH&TIypNB^RCW00+8`ttLAyT@wxRl@gJH*n)Edfc6NASQ4xl4 zUMx5xEo+}v+{!-i;Nf%1(@A4msKRxuxsuAQni*YxMyGD^b4FdUwjm@_$@`DlUfcjB z_#s0>P#l{Dh>9?ItE^3vLxY3Z5wT;OtbebW3_fYOXLrhic38@>K>SLQRFM7CT$rgz zsB}-Vy*CO@du%>XCx4IiBAolC6)wT`d-qy`KVETS{N0x9nrNvTjJLJCoAtyY|Jrg` zg8c-V%_;b_y|7D&z!TbiNs^wBU1i^+vte6O&TF25#*)(BC9Y@~R{gbeJI5De|NZ;-dT)`6i<`S`{DP*Iv?DY-tg>~*fOxx(X?^L_lvwM>c#z@9T6T75-}j9Q+DQ>M z^JTor+y9Nq8+00ze$tNVyCt2Nk0`b?R&aEppF6D&f6WKp^XO%L)o(vna)DKJd-F{dffse|yDPL-ztnE;*SsZdfsu+_Y#P>#D7mQf|XbE{X_ zRj{psRyt`I*C7gs?chb*_Yco9-|(id1xJjNtCPgr!+T5FMF+j!oq?k;4b9DSM|uo_ z_GuyG8$R2UJNi#UhJFcrC=mExF2J)CuVVYnahiCTbYrI0w0RxJA2HOyz}X)$Hw0Y)8=dY7s3xM^`F>ALYdc2Y8e&LXtd6VXuvB&5p(ARSlNQryJ#y~P zW-!-*t>fvVQcB4>hJQ zt81YZ@Ms+0Br!-w_F8H zwlKixZ{V)n0D0zj`6+Ee`g&9T-6hGQ3Kn;NPYCzj4tIv;BYJ)i`u<}$xEUfcq*ga@n z+r+RF`q#4*0z>I6v={WLvlb_t=}uqyyv5Q2KJql`GhuOjv?O{ zZU$Z>knj<#6UUbeU1Wh98Pm*dT6yVbgKei==H9(~ug^9shn5|mJaKXrvy=sHCV?H9 zoBjLZ>rg=XBSPN<# zJPJwlX(3&;p(LJ?USP8jjn zgP8(M8n0V7Idq~Oc9%yrbcmO~;K6z1tjz+h6THfq6WsnjA%Pt~+15rzPfrgafvi(h z2^BRpF|@d{0=T2eX=$H7J9tn^u*2wr1z!EM`y;wsd&eSP-5^F~;C`YPLjsF;X1^1= z3h5mxcKA(e9GeB=Bq$BG+`_Os?!v-!@!}stN`Mm-_h)L+K&IRXprG3BJ-G+6_T=Q` zz)6|e?OVTojR=2lu5NgQUE2o-)40^p8Et`-8g&uNlj^UfacRfm3o^LMWo5vk5QK?c zT93U@7b2m>>a@-PvzaiU!tVEPyi_aX{0_={=)ssN%TY`@WH9X&nTnO&L!PW7s# z{{DVST3StTWT_^VT2Ro+;a+W36$H)52;}HSO&M(y-sjHaFsc1~D-cpWE%%3zr_YNa zBo&K*jq#3vfXpoYpSfQrfTncIOh*%f#G+`)yy8ZJ z6`t^>wQI#O%7h{A7H^IGTh}S|r2h|%WSr3(XW1cE_~wbDV@o%PPZ2jawb=2!YWqKx zy>(O+;r~B6G$JV=NSBBpDJ38wAQq)`Eg^!WbnnuofDIxDqDV*hq`z-;8w7ekztEUqQ&%v9I%1Z^buRDRf*BD8WJU!~yf_-(#NvvD zOAuB26^O{ih{(;1BdNiRY341yxSr35Vkopt1EkkUZEY4nS?+$|Wmaxwu?_qR#klOA zaekwyvIyL!X|TdA1Y6r*>G~fSvrMz0N+e}#=q|6tZ`@x)wO84K#Y>ghKj3*MFbC*t zDH+BJ1^diTcV^FhDMls7G3F?h!eN3aICw1LtDQLkX@LlJVT@FU0JHjamIPPPHd2Yn z!%mJPgZPejin`dNOi!e%3aHikq#kg;>JvfKt$7??J(NFtyMIx5Dwa9?(frs(D@qk9 zW>A#?fcXwczF~?>!~+l%M%%*qG4f+!e(;}&4DKLd?E5R69;f?N zy9ZB@Vy{!$`lgJIG?u0;K{Xa=FTIEHIDR{vG}~mUG;av3IHr3>g3G5I6ZQTNCvS|! zCaSf)JxYbCjpnkE>yxq9w%}}d0HX!}ae0L!zb{$T{71huO3xs~0(#TkN2XeX{Q)Ob z>@6!&&jxFqu%!4pv_o@cFyex5+W%mo2#KI7KdV?=&w%qoFIg4F4NMr{ODu@W3C?NIB2|Ax|i=SP6uZ`Ja0(Oza5 zEdIbfi@nK!E<3AK9SMEjN3PvI0TBV*hl&DesB(q#o9f`gbrP{)N@C2ImdE`I3*WlJ zR>%vg0`B6>6p4P6TH!~GhhfftVpRSEE_Z!lNC!RmKsVBL&r*q${9YMBfu#SVs5w)a z10WX51(mx&3`v@@=Iz`0c`tlF3j53~cN9ZnrT<;b!DSsh~wp z?LjexQ}=|MFWMO8u@c{Z-C#$R6kp~gRmUf4G?x6Uw<}P+q$gw|5 z))n7h#W;tBeocS-MmO4)afL~mGIR=Tmt~)idBIM7@zi$ysyyrQX6;*731B&tD}pzF^V+Sp%EIjcq7^$@KHdpLfLyl!~MIIw_jt zw>HWEM@0u&Lgjs9QRRiF6Y;;<7zagTFyMVCl1;wQ@Lb~dW=WP5&iM`^=<8Nc96TAl z+=Db0xTd z7Asn?@8gJuVp2;>2Vu?ZFzi02hF+ka9b2?}I?fP68qsgMCbk>#SYeR`V=5F>p}JVx z7Fx%pH{#W4aD$ExO0N6G?PB3$|Ie{4np^edWfvJS*&&J)g;dwRikjer5YZoFaAeb0 z87$?PWx9&Vsr~lA0L9ISaB@){9WL%#*3ToA+7ooS!3RZg8D1o;NN_n`tG2mFxpg?i zy2HhZQ(tm+E+>4zlm&QrN>T5&-c~T<4M!-E^8TSmvi;ss`JzvFMoE&p2cH3y%Kd|b zk$j#O_1hfzoXC>1HyIhlL;C3%UNj*aqUCNgW;ERrY9ZL zPYqV`Dn)`Spl<|s#>$4<&ED+SB=v)Sh=j+8J`F7%$rl+N9TgH0i5TpBZ-JJtp$FfM z$-hr+DgFm-=w0NVu07gwMw44y(NG>PcTL5z<%MNvsSx}j(@$z@5$|UyNO0l1?S)=t zL>NMCEPjj#ux##1wYJ-TVQVMEKbE7WA50le;;C0fGW^ln3TLg}p32x)5+zu${!DTD z4c95bUFRbFa1*Si=mxZSba)YVZ5h9@xKgF|RHY7PhE?R+44NTDB8m>UixsA(ag+D% z-w%t3AORr|JtJd8N(yUrb+u#gi|z;z6V1)>bfwP`8O)A^5Zl_;0x_hEgM(H>=(&$x zuI;Mp=LBqCHZ6C7mNK;`-&JZvI@fl7-Sm{ES0-%@7qxMiqNboLjUl6;;fS^A`(Uk$ zrng>K=D{}ITuYj~Y58@_{P}Ll2zA{yZ;C>}MNr5YSbC=mm7pR?&OY!4lWov($wm$g zch+iYaSt>9%{qQ${FFFC8Z;};YMf%l2#FLJD+)zN6VcEs8!Mx&G|?kRJt$KA9=O8p z!TA-sQ+LfJV&kQ-0t{YzPar;x zsEfCKmUdYv6m_gA-z|P2fdF5<`J4<0?e2AO-<(#8q+>YRHFiBv;cA{uIRUtk6nw8D z6=c#7B-h&0O4nBjGw-+&4a?Ahi6MD%tJRJ+<=$XZM+=&Znci#cJA6&G&XKZu8Nm&S z?xQl6-%%S#2+GIC-9n$2fgUST-n45^F{L)9$$x2>nWTbGnQw_H3h)_02A;S@V|K@6 zlCXVWVD#bANv-)|DmR5z)h#zZ42oNbXWphZs>F~qZP=cYZT#!6b!#aH%}9-$A_|at zcCQBHK9Z8lzo05(>gTiZzDu0iD0DUkx)ApjI=x^~&Z@_19S#k+GB7 zAn!vpDwPTfkixxH9pMH$Wyz}lFI_JJ=m$hTI$R%d{xUtK3fO@~dStOY-X$&*Qa`H8 zDebef^;E-t?dOz~{t7Eh7yWrdRG)|(BvU2j7 zA%TgWrs_*D3yEG=JKTFWV)Q^IRjHIuQj$nBUg{Nxa%^chGY7kD=)=~#Df`=>9S4_W zs5C(mT0sd;Fp>%;ZrP$#kD!y3GV@`T50| zCoH|qb!uc>$`#?}-4H;hP!;>oM26^m{b#NX`pB%&y^uit6;o}A<1bw2q|H22boUdAUPy@BMx!v}kZYfm!u`IWkQH3|ePV{71ax?K49nLHQhoO#&E;&I4Iwq4|m85)yiLif#dVdh{F|9IxNL<@+r=s-S|cblOXj zjDv0Cd@toGYaE!$K}Kz`;S1`V0*Ub_Y-#WO`LtP z?IxN|6J$Pu;o-iok`ieFKG*k8Gxk=76jX9pM|hljHP+#^6Nw&3Mqg)SB!LOCagh;T z$I>F21hhwia-~_hqyC~!iR@|3+@fLiJ-ey$E|9?5t^dP!&yU@Gx3MGjb%V`rB;U{} zy$?7outIFfYgr}Lti=u3$L$fDLA%G!F@oA`#?jokQ_Q{h?FDM-!c4jkB|O?BER+xo zYkusu>*E8DTJIkFt2~uIc+ys!<&zSG-|V3dI^s4}n9I!MTqJU#qM9VCx%1irxRCYc zJSrxS!}fs!#lnQT1LW!9K?F4(Jh}aow+-Aa7#GmQ2bV!gM%LWku31>vI4lUpPne8b z8}1g6iZW_zdzJSDBOU`|*DgYK2YaA3%bhMf`XU`SQR2amI(;!8gPC|u|1{59&%`SB z@Ta$uuvkli`4#evs}lts2h67vr;Zb~WFK8oQJWMe`bJiXzv8K+Zv;?P{m`bd%+@(} z^=U0J*0ju?)zFG@b8|#^3@wK1{4xyvH%(a7#r|VpB;}=2AbAZIC4%dhjp^#%NAi6j z&7irEyG}_$LINCXdXg?ml3T)UcWWK{p?f`;Bi5t#Ok;MQs*$ zI+|EkU!+_qwciO8EJsm7s(&jEC|$TG^XNNi6Ni1;w$>Vm7IJyqmi-~fW(pL6>AvqDUr5REapSMvpS27;uz2kR4ieiMLu%F%|}|Jx!^X;xq|ST z6Id@w1$fHbOfeEQ2Mf6J#D@>uesXf4p2~~NgrFA$d!>RuO;Pb z1xB;Xa&F(*49FIWXoe@gvc~^X6oU6&n6Rgwp0=c(y_|Kt_kB(hAYswIo5V1v+vsQ8 z2JRW(T30}}?BmB*K-;aU!Aom?vV!}3gk19J4gRyOwIF8C0z*XUR9at_cc=dof?$0& zSe6RfwV71eXJ&n zWWp4mP$->jWnd=23r<4;HwO?K|+R%YCQs&!41cw#c(T3dl>1oOKX*BIR(n;&+bw z(rk>Fk(H^3rK0)sF`s7@{SL#O4DV4HfE_~ok9NsM@?SFvq?>(bf>*C)@Lss5P;qY% z*=$|K^xdKN36;w9;k~hf7X|XM)^d9~XVri`M-p1>CLp=_DOX(1uQi%`ENk}k-T9C; z;_`VTmx_DP8w?spSL`(WtY4gg#kDHL5oE}k1V=DPe=myHLr_Us?^v~x zl9I(Q_vYo*mEL28;NmNxXYwDmlE(Cz;gM-w#~lyF_WU33vXWTb6u8atJBqtzt|cii zuG2Zn80=w?eEMKh#c2FOh~D`RKF!YuEOr_(Vjt7%T2vfJ{%}B{Q{C=71)joB!9nA9 zcVCcii)x&B5ow4KX7@#*!1(o?ARw$n3IyE^+O7%k+!VR^$lHfNZY9r$=|Ac|@DLHFJJl6=p~%k&BI$eG{-M|w zs(-g1?^GXU=f)NaSOT?IQ&T#L=hz@DzsLp=(n9#}K!ztq_7|7&%(m$ELO{a&HF0rn z50<`zzA`Rjo~2{gfhvlA4tVc$ZUC7948->DBo*A_uCaCQd9bzWVn1BFmzeZ!8nJfb zm@vOGIMY#m7}P^|a&exxBW}v{KP~YLAdU5(p7{jCmw{*;c|HJO3Ow88j+ws(^$?|x zuc}rgjF)^MpMl%3@4tLGjYM42(vq*MZklK(ql!8fAH9;D4O#a?j)|OgbV4^oUSS5| ziU&l4JIWeSSsaf(k$w61>|0~PRgSH#H*Y>f9hNhJQaf9P+dMB<5!J8N?hjb?CyF4p zL$npan6-x3=it7y`}+?ivpyeZoyNKu{pl8O$8BWku07mucd`bMf+qgY#! z+RLB;JyN60Ha^jGm*~Bj2_MFWHZ>@aFEb3PuJ4RJ!Q#Lw1rp`qUQ!TK&FcmkY5ET+ZohYQm#>LJ3 z?C3q)G1{Tw(a}Je-+7gll@Ada*mN&^xFI&=Z1_HU&4~oEegWfL7q|2@)w=FaNgVnw zZ|i`GrK(w-9um-X%*gpjAY7dhnXB+KwN&Salk+@aam&b&C{{vhqOA!*KVb`y02gbR z*I4laIrUu^N0`ZHm+HV(DXReZ%b#20HOIGXdY_1}e*8%UdF1r^;RlzLm|mIxy8H9( zrUfPqwspZ9sT+|Q0MZNuuhQNoPt=^@Yi=m{B2ktt7i6E${m=cxc@KZE-j^+6EaCa@ zPvyF9SO=Z2aX1~cIeW-A6mxRNaU61)s$qYbfr|XNJX^gp3#)28*hbxf=Gsq@&LJB^ zcJcvO_GG=`0%JL&^Z#N2 zijiX2c{;@IdcTg3kIcWH@Yl$6zvFt5X*rA)IaK!c8P88wI4*kw?TCVVa9*A6%?+91 zb{KBlPP*wt%H=nGYmv*Qb3bO{z4@fBKZe2RJ={nz2tB`>j+OA8vFX^UPt&b4kHK!Q z?Yiv(a}(bn8S5sTkG1@uI{~Zw*s_K_z;8duON83v)Aut*A)N7)xV_q4a(1>U_=Cj> zuN9sKT$IITfITy22$`6bcS^O4ci@{Hhs6&t5a+XpeTNCmwVXOl%kBw2`XWzuOY!21 z!XIoWsCVJ`Hzd2bPi5$pMug344*~qq(*4j1YrXeeKmAx!Kbz~r+}m@<*6F|sN-SCmFidKy=3Wnij0*@|9sInxE{@8GQPE;ftv@6-KSRGOAKGmG%i+e2*e|_$XYnIF=>W4rVTZAik?p@fZ)ojqp?iC- z!2Kgpg!_q#VSeI>DfE|0o_}|yaMi?Bgmny&b@yoD9VaK@4HQxZvIb1iUlcL3wUpEs z0G4uFgr(FZtR;4KtgXqd`c#ZY$L5=oD+=S1W!p1kFV2n4X|9H z>uq-+V30xz*z1V|lb5vxh1JdUVUx9jX|7Hhh|zc}1x^>1V(Yeq2z|^u<_cprkEuxc zV12v{+*h4iQ2RlX@ih@^j$2f8;#PxOFcwgIQO#}znDgc~3dQ}2=2m<8vm+#LWVHI~ z2)n2#wWF)rL&~O9_JK>66Z=12ZfmD*k1Un5BQ)DSst=IvYRuDk>MwNXh}>o7_+ttD zl+SnbUlps;0{JlB;G(()!lGd~7LRM)U6Q-(;=iVeRoY|ukL;9m%ZZog1wPf&&BN=# z&Zi6^-Zs^vgW-`Li@eg7VPf@Ha2U;b3vJFKS=qTjJASrQv9HS(%;dCev0dw4tV|4H zXP2X2D`37N;d0ZjV!56BtJZ|iVmA7zGiB=K?zEiQ3`S^|JH*h_8-JMgQGvQ9WlOGKbu*M>*;u0*L(UckvtRlzjkq$wK{-e|T3D5I z;CC@x&K$kJs((DvDb9Pio}jNzzA&{O_&%+iNBU7ywSEG6&6fYiI>ka=nT*icFJkqq zGnApfDs27izP(@j_Q~NMDkWgKIB#Daysp~kVqRQ-tUh+$2_ji^ zXNyB1PHulJ4v8YB2357t|4N0$W=4>!F`k1)7`*>01ID-dUl}ls{{PB=ft}7t5MVDg z3bIVDyAhA%g#IJBg;lECp_sgTM8Eo=|Mn~DZw!im0F{5h)!!FI=VCaR&{BqhTLa>z zPm0wCZ#z{Bl^ehmrNFu>1mg=#h$1tH_2|NkmDy}<|MTAxUPp67ucLVqJ_}w1u)odh zWGiB5bE=9CaKTt*U09)WJnVu}W6?D4z3Tu3AujPL`PV`gO=`$%_P@`L-&iFPr_%yp zSAG@$I1o^ypWXMpduh85HI}`SI@P#(RS^I4VV_DcdV@9@wAcoYpAduJu}V9Ct)@gz z=$^JcfU7_1p{L)3L%>?kN2sCp;NjStx{!0wM8&~FNtErgGAWkDZ_~z-B3_aZ52lf+ zd8nEjmap3VvBzOz!jx47{_~Y+rPo5+edsuJNtg1ik=b{Ft5*Xo1h08waI~tXK`Oic z7Gl?yblUw4oX{0Np^)!mb{~790S?G0-GyYqTkj?*X_<BjG37Wr^}a-EY0(iuueeo4Z5l5P4-cP@Y`nt1;~?fx z|3823*F1SmPRk{6S!tK@M^dbhe{a}MAMZwj_M=4ltO{5+m7b@~SG|<9zlVXhrEH~k zAN{`BztX|W&mS@2QmK=%u6t|p&hc=EJ9UUP^T3R|&xI5Zh<s=H3iuGe;hksi zh828w-$%u|7&^tsVR^x0h1CjtHggl&L`A;3YZuc821IPhZa+vD4sTo?S@VwVPErFS z0&OaC<6CnU<6kXQ0r8O)zhloVEp5Ga?%Ph`Q;p68i0ACX>qteU5iU9FM+T;R8+j2;E(or2p7t{g<0|PXH6sCJ-X| z(Mx1acjtj2{0BTGHji7-=`#F>prEZ&76MNzqN;*N^OJfo4>6jMxLk~ zLuV@zy4F`jW?lTpWw!p))oa)I!9|bbHqBhNJclfBITIUmLr&;hW=5g%vY%}r zY5dfH|5>`un*@oI4*Q9mQ@Izj(NAJjnx8Xc2l0wKkt6HKx<(Sc2Ew2$w0;O~{I?}c z@$!o9*_VgR_# zZm&+awt>NWy{BSspV^Wauj%BP3B<<7Uy6^P!Y~Q+xt}C|u*LO-sBNhO3XHW6LhSyFnNZ#;BIfxwCbYdni}M@v zgVY9qd7;@cY^yKhzyW$)MZo{sPH(t@X?!n6ky+BOhxNrjf)Zou&^r;)tZhq=(<10H zKEA6hcvLx$rlo_6 z>_Ijjh;BXK#UK11H|}tyI49GHEH_AR`2@Bq0rh-7R`_{Gh$@G`Haghnk=j7(ytX2g zhIf9C{6*Y4?(;qwp7>9+&RP`5aj)h{a8bpf7kCLRmNDUFgg#LU8&Mj=9+c&rq6bWb z$LaL8Vdn60oqxi9MOc#B>Mr~0cQ)0WzjAsGNW}%g_Uqd_CB)1ExD%5ws&KrYN!VZs z;Q<0KubC0xM-`wI(^Wt3z>g<^c8^YAHmU{)sOe|TGbog&TyFknyGL*m8*^q)#6I+@ zqkm!H+V_LuJOcFjU_W$kQQu%1Z{^avk&0}E4qGmYQ+j;~OeJdC7p;>xNJe&mfA!GX z%)doVBleArAczW?*K+>d$~@|2$2>X^KevgP{a%Eu1FaTuptK>uMH-wJnmcbCNS!E$ zOAh?NMq&t-3B~DVIX$lr{+HvY@8P&a^n_2dcgHf9>lSnMnz@f=JYvdr{n>|uaoJXh zskkbuTpz~>aEWucy*fCwlYM|*I{|B&Vw&L2MFxhD-TnO| zv!qEy#oGdpREbZIping0A8N{bk^@2Q?d@O-sPcTk!L1*hHq_F-zWwy4HF$nv=H~yC zB6e_>AN!p<>yg4AoFuLvJ9UFKCz8DE(;8D_TY$uw-{v^4e8ydI8rb9S8=VzDX=QtBr60a_7?*&w>l zefl92_ch0ABZt2pbV6rdw)}f4`_R*u5ot&Y^kI4a0av&PLjwc<3OArB36LLT2cpNA zfKxLfsn0z(6sO?nFPkGMPA3hZV@Sq-m!~ReV{{2xoy0W(6)4kZ&wiNL6Ac$b*XKcH z^GFpv@+N!e9{~62K~`IPdZ!-0$L9Ezi*xVI$*FG%gV@BR);p^E+wgoJO77DmTAdCzLRUA;DI`3BNdK(<+SMv?0>j{rLuI2oXpcEH)fDW7* zwqIPNZIN50XZ@czQY&_p=06bTa6R__icFFIuQDyA!hadT|IZ=mZrntf1IDLMIDD1% z|4Y~!qbsLwxZr#EZ|Byz*i|oZFuLuQ^aX(rFsxDoy-m;O-9Z1>(3#{k=m%=!^Vc6a zIc3RKfft|>ca$;+;cUiBY@kp;$%+MjUjT2A9CGau-1R)j47J-WH7gYBrXi0&*S%G{ zS3AV699-S)`LaE0RVM{|8@2NUbl@q&DXsj`SEQa&0)yDd)Ks=)pR8}+Jf>W$=CP*- zCXKdf(~W(<&pXJKsa&OL+O9krBqaiT z<+q~eM=8B>^V#?m{gpVO`%!UE94fNvvxtH2E>JAi)X_;S0se>NXe8ry9R8bDVz0jh zt{G=`TCt6+f}4t{f*C>HYxz|g;w^S&8o8M8iAyfkiyLjSM^n)!hn0w1Y$52;e|2fK_cEHMWweSXzNCZ{&k&mlf5I5Pt@ zNMvDJ$!ZN$ws{?ane43W*C*6(-k5l-2q$%q&6&P8Hh`eNf(Ki4+ktu(&tyNjiwldL z0ioT8*7RMZEXYg#>niT*TJY>Mam@mJ-9Zor-+ei>e0uL4%v1&SXWPGk!Hb}1k=7?y zLYG6WxgeyPqW2u8XA~_C$8uKIOTO!5ApV0|<{pWyL0#VvueG?b9cqbXNwVG!?c~Cx z$kE?}UPBy-jr~`VWmC;aFUIBG01bU)In8Hid2UR`)-7UX3?`<6pxgFcC(PHey+Jp6 z;sO2O+^E^AuOgfw`8cO#f#FA5Yg;r z7K{yUf%UM7$0%+RkiO894<|2OO=?i{IB~>=z$FTym6Z?NaFgy&S0yDEY>K6!pG@>W zp7Oa)*lymPvMI5D=>hu$@rK3m{;`&jr+&39>@!F-=BjA@9Ln>$$z!g=fp2_5sW-Co zyD%Ts*@Gf6gdsl755}6WyIe6vuXU>!0yxpNOg$eiE6#u;O@n zmUDr)iM8LToyacs;|&M83;ruff35f#NxxSVe*Vq+x@j`GTf^B|#A#!_WI4j&b|O(; zVZpneu{;E0sIJVuyOeyj;fY_&7)%h6EEef+>?s8`J+@2rghjL6M!~#oNvA{>;B5)7U{{#C` zicD8M`i%M1)-YPBt+Hcjt=&0*j zRR#rAh{gJ`5He9h+bgaTCpRTo5c4vISZFgW+89CF!SDFo&B%}C?R3#K#=^ovdB5$n z)_T9QonrtT>D>7u#z{PtmQ3-AJ87YuhM4f)y|-K4!x*2!jnB&JCML)YwZQ7>Z;HIwJu%rIuH^`nHpDf96SB3l=4*UoUw6kkjcPo`|GhN7@A3rM(u~2gwv|i=k z;>WyvSY)>`q+WVB@aYx7B_vQN{$UZtdsvm(BL14=Cc*hN29ff!kno$1>4@%%R2%+c zF#Cc|V=Wijaht;_2>XX22+crxuFY*NQQcr$-dDbb^&fy8QIVdK^zMwAg7WJQ z1(deGlJpvBj*)Z0nwXreJ|Z9QVB1Y_YHrN1_?Ucq*b(vgik^ih3Dq$!l7=0pNRx(L z$7GLv1+W+782+(MxIf$R+1quo(`>sJ<+~53JWd!JGNWJxW5}#5V!s(57GZ^&kKG^& zYkM+1(~OMK(wd6VHZL@CnW-HiINR=}!-zwN^cslO@J$C8rcmNjGr4~!)Tlp`>oMP~ zGc?my>XmF@nCIhUIvcN%4(J)nm=1FU5&T!i7c;74pZfM0pV;9;lAF0n^%r1};=R!`6PEN*a>8enrxn+!* zl4S;%54dle_)yTAjS_Xd`BsTsXkfWK{l<&J*989Z`e!+npOr}VLqytl0)CZw1KCIP z=c&}!>S|WOcbztkbpa1lL5QJY{jD8W{09|+l&sWW~$t`lUJe?kNO_KtZfxb^aUXXZ%q1KoUwz zM+cMaw9@nrNKU+L4-eXD7~4@b2BmTa{=2{^4lUoy3|jXSF3@DmMUxws(Lr*a`xHf} z4X7Mc?|6Y2g3{FL>cBU#jokpC43dm9r#_EHNY!?Cy*3J~sC4h5*7i1s%(YC(pw06` zdPedz!C3_azT?{L{g|PM=5sA#X*oHPP?REUpP~{bBrN>4AOxJI2ELPDzGz{{w&AWm}>DM|-Q4?wW{5 zcfm$_XT!l&#N65c_#{|;GXxSaHDA^G!2u%2Tt2-GizK9knu`ZDp7s*3#2XaoaI~H-ErFm`-8u?>HqI2Rhk^cbA0zCKlhl)h4DxO7li-p^8X`zZF$J{ z_gV3_7E>-foKoPaA`Kic&cp~Q=`-N2dWV zbD*Xu-c9&E3J#`GPpi7^rm5nwpaH2mI~U0B4Cg&bk+P4M7d56Fm@Jl2LZ>N*1iCnE z=+X00o;pf=p3n-sP35fsjLu^T=Aga<=~)_z7O~sCQu8sCv3(_3gvgCKyTGTnCk*{J zvV5w=n0SQwdH(;SHp_PB)m?sT?_gRw?!bn|4$K9<*L!R9 zDZEmbM7AxKJWkn^UhcZX{rhq%64gqoSLfsUw4O?pUn`Lm8tdw2fh%3w zaG);Ok$C0i?=6KK-Hc=7MP{G}`c%ZY$oo^yXk!0FakjZDvQC!tGfeyK#fwoOv-~l( z@rL1Dn1j@pFl7~5P{{u4DBa>Hot2;eptR|0MFtP?l?))PQf9{K@ZR^A#j`X*qcm1% zYo+;`oZQ$v1!QCbhaeNSNiIN$ROt}UIrv%(WDjXYR0gfv3RK}TO*GrY5cJccW-wbS zi*y@nRy%SS@K zT;bzma?o7H)iF0bI?_2=y*&rRO?$bhJ{36Lp1BAnpmg`fwb7mFkGBq%ZGaHac%7d( zP&xbS>FJ3*i=H+`&jYmE-Mt6>n-gW{(-?sN-3QPIp!6HBK!oW{P9pPq_WRY9d_%r8 zj1ritfslyV^FnpPX;2gQ$SQIaE?PR_A|xb4pK}y=+eOwq#_k1ir!IY1>===dK%3Q# zU!!BKW-#$y6%d+W3)exf;O7nBe}5Pt`qsX9LtT;!=}M*4&=*Ga{x|$uPcNv=kgWjF zBsU!WRe1aCED$K<$&(fV!;#^K%8U>8=VQ3}q@*4n>U@^f4!%7csaWyCj{-Rf${N&H zE+s_KiQb*%hP9s_$bbpfmhAT@R=ZcMkBNalN!Y#QV$zw($@NRhvunty9daKn74AnI z_7deW8KiQi&l;@>_Z_*DG#u=%tKYvLhh}`V3khlVK)DsLi)b4GF6GP0R4(btFPk_KoA8|dJT3&{DltnZmJi-lc+B*Ox3ngCQBMBe zR8b4{zGec0CH?v()!s)Av2*kMJ4way2j3lR zY6{wNm#$H^_yyNp^1iak{JPRLvySRj7Ow_Bp?Sep)@fMiz9L~47-B&rE%!Cl3{q}m z-`|Q#KXsi#d{XbXn{d{Nj*5yKLd+i2cKc`6IS}Rr2n~687dFNUcb)#eF8;T)bYYvk zKEL8%BN30ooD^)MkO*WqR`saZ5*OY_(9wwB%(N1Qze>l()NnJuMPnf7vX4s|Xj0ryH8(bpDu zBdDj-^nR5pTWF>G6#No2xRR5!gzS4zt7$PiJRI5aYb*^rg+c6VZ80>KJ-mP4KIr6f zF1|1W+q?*?J0p`lTmCG8y*p+;Q(v#l(#_TF{mK2bIlQ6(X6+fxvu2W7Nz_SfjpU3P za6CkF)VOK>=M`nhhkR5)0xl7-|5VoV-#suj+V<85KwmbnH%d?@Q=?>$A3r{CW*1S1 ze%U|BGui()R5B8r^y7zM3_WQ%1@CojZEYxYxO^f7d^^6|)!pdSaQ9`p_-RB3(z{d2 z=(K_Cn|tGhkKEI+j_x7sAb&>**jzdPA=&=9otj!$Q^&$)uA9nmh1-n6*JhVzwOM?c zu#1J@Esmws)YMEbdJk~KcVDsceu=x!ji=P-t9gHR%?9@MeeqM6Atad0L+{ljoEy+#i>W;m*}@vE&ly*ykz-0)btfcSlzu9b4(x^%E3Jj zR#rRo-uIMSQ0-JJ9?MYPO7{2aFpsZ@fu)-&6sG)SKVQyvg&{+Lb!dxafHs>W7L~{; z994{ZT4OjySPF6Aj=8OiP&}Xo^D7kzIdu~t`*U&;HCan!?jc1f5zg}a`^evSMA`1s zOSK{)@1uj_e=Ja;dd&G!K^m+;(^ye4Vl!z;_S;%w4z%}5Om6&&PTHO`{@f6Bk<<$B zH;aAou zdl&()D}z0J{5TkyLFbB%Qw>ulbb%gnto82=h;&>%R&L`uv+{X(0pbWizPJAUKNUJs t+VdZNbe|9d)(5Cmt>*o|RMZv;(C(m+pSxP$Dg^%A*VNG{x?>&we*rPZo+SVP From a4f35eed47f18b5099cc94dc90c793418a734a5e Mon Sep 17 00:00:00 2001 From: keronshb Date: Sun, 19 Jan 2020 14:33:41 -0500 Subject: [PATCH 25/41] This should fix the icon icon fix pt 2, I swear --- icons/obj/device.dmi | Bin 45858 -> 46295 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 032b0c27ad3c75b57c6bfb9ee59e600f2a699e84..556bb0b5bec53a9dd8e887c65003785e983b4d91 100644 GIT binary patch delta 6216 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 NhMKl&xw3WW{{WcnDI@>@ delta 5776 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 Date: Sun, 19 Jan 2020 13:40:09 -0700 Subject: [PATCH 26/41] Update grenade.dm --- code/game/objects/items/grenades/grenade.dm | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/code/game/objects/items/grenades/grenade.dm b/code/game/objects/items/grenades/grenade.dm index 033ea9e791..1f8c04593a 100644 --- a/code/game/objects/items/grenades/grenade.dm +++ b/code/game/objects/items/grenades/grenade.dm @@ -1,4 +1,4 @@ -/obj/item/grenade + /obj/item/grenade name = "grenade" desc = "It has an adjustable timer." w_class = WEIGHT_CLASS_SMALL @@ -93,9 +93,8 @@ var/obj/item/I = loc I.grenade_prime_react(src) - -/obj/item/grenade/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/screwdriver)) +/obj/item/grenade/tool_act(mob/living/user, obj/item/I, tool_behaviour) + if(tool_behaviour == TOOL_SCREWDRIVER) switch(det_time) if ("1") det_time = 10 From 92ead7e65d955f50c2dd877524515dc79b605e2f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 19 Jan 2020 17:10:59 -0600 Subject: [PATCH 27/41] Automatic changelog generation for PR #9601 [ci skip] --- html/changelogs/AutoChangeLog-pr-9601.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9601.yml diff --git a/html/changelogs/AutoChangeLog-pr-9601.yml b/html/changelogs/AutoChangeLog-pr-9601.yml new file mode 100644 index 0000000000..c54279627f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9601.yml @@ -0,0 +1,9 @@ +author: "Ghommie (original PRs by Kevinz000, ShivCalez, 4dplanner, Barhandar, 81Denton, zxaber, Fox-McCloud)" +delete-after: True +changes: + - rscadd: "All atom movables now have move force and move resist, and pull force An atom can only pull another atom if its pull force is stronger than that atom's move resist" + - rscadd: "Mobs with a higher move force than an atom's move resist will automatically try to force the atom out of its way. This might not always work, depending on how snowflakey code is. +experimental: As of right now, everything has a move force and resist of 100, and a pull force of 101. Things take (resist - force) damage when bumped into +experimental: Failing to move onto a tile will now still bump up your last move timer. However, successfully pushing something out of your way will result in you automatically moving into where it was." + - bugfix: "Bolted AIs can no longer be teleported by launchpads." + - balance: "Megafauna cannot teleport" From b1cd0f4edeab547a546767712d249d7bf08bda3a Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sun, 19 Jan 2020 16:11:49 -0700 Subject: [PATCH 28/41] Update grenade.dm --- code/game/objects/items/grenades/grenade.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/grenades/grenade.dm b/code/game/objects/items/grenades/grenade.dm index 1f8c04593a..16a5e6d1d3 100644 --- a/code/game/objects/items/grenades/grenade.dm +++ b/code/game/objects/items/grenades/grenade.dm @@ -1,4 +1,4 @@ - /obj/item/grenade +/obj/item/grenade name = "grenade" desc = "It has an adjustable timer." w_class = WEIGHT_CLASS_SMALL From 705bb9c29ec1e3a184534aafcf521b4197f13991 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 19 Jan 2020 17:58:30 -0600 Subject: [PATCH 29/41] Automatic changelog generation for PR #10097 [ci skip] --- html/changelogs/AutoChangeLog-pr-10097.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10097.yml diff --git a/html/changelogs/AutoChangeLog-pr-10097.yml b/html/changelogs/AutoChangeLog-pr-10097.yml new file mode 100644 index 0000000000..9b9a2c9a58 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10097.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - tweak: "Attached kevlar/soft/plastic padding accessories are now stealthier and will no longer be displayed on mob examine." From ea088680e224d347c64633f32a7fe5848697eb2e Mon Sep 17 00:00:00 2001 From: keronshb Date: Sun, 19 Jan 2020 19:25:14 -0500 Subject: [PATCH 30/41] Fixed sprites This should be it, really --- icons/obj/device.dmi | Bin 46295 -> 52409 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 556bb0b5bec53a9dd8e887c65003785e983b4d91..c5a6914cf40102c3e83717c369be24462c88ec55 100644 GIT binary patch literal 52409 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 literal 46295 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 k{xr` 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

IoLCs_Nn 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 Z0jI)W4S9Z2MFN0dYARaFm5(e!{|_FgIsgCw From 16f9c1bf78b5ee183c33fe6e1aa8346005a3f219 Mon Sep 17 00:00:00 2001 From: Putnam Date: Sun, 19 Jan 2020 18:01:21 -0800 Subject: [PATCH 31/41] feedback, EORG allowed --- code/__HELPERS/roundend.dm | 2 +- code/modules/client/verbs/suicide.dm | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 49825bcb50..19ee2b2a5a 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -178,7 +178,7 @@ if(!C.credits) C.RollCredits() C.playtitlemusic(40) - + CONFIG_SET(flag/suicide_allowed,TRUE) // EORG suicides allowed var/popcount = gather_roundend_feedback() display_report(popcount) diff --git a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm index 43f1c4c198..255a5a2eec 100644 --- a/code/modules/client/verbs/suicide.dm +++ b/code/modules/client/verbs/suicide.dm @@ -208,6 +208,7 @@ /mob/living/proc/canSuicide() if(!CONFIG_GET(flag/suicide_allowed)) + to_chat(src, "Suicide is not enabled in the config.") return FALSE switch(stat) if(CONSCIOUS) From 56e58e5c5ea40d810372eed49bd9849dbd5c7bbf Mon Sep 17 00:00:00 2001 From: Putnam3145 Date: Sun, 19 Jan 2020 18:14:33 -0800 Subject: [PATCH 32/41] whoops Co-Authored-By: Ghom <42542238+Ghommie@users.noreply.github.com> --- code/modules/admin/topic.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 119c214d6b..9c8081c046 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1721,7 +1721,7 @@ else if(href_list["makeeligible"]) if(!check_rights(R_ADMIN)) return - var/mob/M = locate(href_list["eligible"]) + var/mob/M = locate(href_list["makeeligible"]) if(!ismob(M)) to_chat(usr, "this can only be used on instances of type /mob.") var/datum/element/ghost_role_eligibility/eli = SSdcs.GetElement(/datum/element/ghost_role_eligibility) From 194647a7f4dc83a3cc6eee0410d237bec680da60 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 19 Jan 2020 20:24:02 -0600 Subject: [PATCH 33/41] Automatic changelog generation for PR #10614 [ci skip] --- html/changelogs/AutoChangeLog-pr-10614.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10614.yml diff --git a/html/changelogs/AutoChangeLog-pr-10614.yml b/html/changelogs/AutoChangeLog-pr-10614.yml new file mode 100644 index 0000000000..4c4d8bfdbd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10614.yml @@ -0,0 +1,4 @@ +author: "Putnam3145" +delete-after: True +changes: + - config: "Added suicide to the config." From 8e30dd228215ef3a58aa76d214d23190bc627d91 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 19 Jan 2020 20:24:49 -0600 Subject: [PATCH 34/41] Automatic changelog generation for PR #10597 [ci skip] --- html/changelogs/AutoChangeLog-pr-10597.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10597.yml diff --git a/html/changelogs/AutoChangeLog-pr-10597.yml b/html/changelogs/AutoChangeLog-pr-10597.yml new file mode 100644 index 0000000000..9f28c4f84c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10597.yml @@ -0,0 +1,5 @@ +author: "Putnam3145" +delete-after: True +changes: + - code_imp: "demodularized player panel code, mostly" + - admin: "added ghost role eligibility delay removal to player panel" From 28a2cc4a3db2be9c4d3f19f0120b56038f316182 Mon Sep 17 00:00:00 2001 From: Hatterhat Date: Sun, 19 Jan 2020 23:55:12 -0600 Subject: [PATCH 35/41] .357 AP printable from illegal ballistics --- code/modules/research/techweb/all_nodes.dm | 2 +- .../projectiles/boxes_magazines/external/pistol.dm | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 74f07e4ce3..2dc2e71dea 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -1117,7 +1117,7 @@ id = "advanced_illegal_ballistics" display_name = "Advanced Non-Standard Ballistics" description = "Ballistic ammunition for non-standard firearms. Usually the ones you don't have nor want to be involved with." - design_ids = list("10mm","10mmap","10mminc","10mmhp","sl357","pistolm9mm","m45","bolt_clip") + design_ids = list("10mm","10mmap","10mminc","10mmhp","sl357","sl357ap","pistolm9mm","m45","bolt_clip") prereq_ids = list("ballistic_weapons","syndicate_basic","explosive_weapons") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 25000) //This gives sec lethal mags/clips for guns from traitors, space, or anything in between. export_price = 7000 diff --git a/modular_citadel/code/modules/projectiles/boxes_magazines/external/pistol.dm b/modular_citadel/code/modules/projectiles/boxes_magazines/external/pistol.dm index 4ae3e5c488..dd45c0278a 100644 --- a/modular_citadel/code/modules/projectiles/boxes_magazines/external/pistol.dm +++ b/modular_citadel/code/modules/projectiles/boxes_magazines/external/pistol.dm @@ -78,3 +78,13 @@ build_path = /obj/item/ammo_box/a357 category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/sl357ap + name = "revolver speedloader (.357 AP)" + desc = "A revolver speedloader. Cuts through like a hot knife through butter." + id = "sl357ap" + build_type = PROTOLATHE + materials = list(MAT_METAL = 30000, MAT_TITANIUM = 45000) + build_path = /obj/item/ammo_box/a357/ap + category = list("Ammo") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY From 0f4f07dc95b0046fa2383fbada29b6863d90ce8d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 20 Jan 2020 00:11:05 -0600 Subject: [PATCH 36/41] Automatic changelog generation for PR #10346 [ci skip] --- html/changelogs/AutoChangeLog-pr-10346.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10346.yml diff --git a/html/changelogs/AutoChangeLog-pr-10346.yml b/html/changelogs/AutoChangeLog-pr-10346.yml new file mode 100644 index 0000000000..3a0cd6dae4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10346.yml @@ -0,0 +1,6 @@ +author: "Bhijn" +delete-after: True +changes: + - rscadd: "Limbs now regenerate their stamina faster while disabled" + - rscadd: "Limbs now have the same incoming stamina damage multiplier mechanics as spacemen, where the more staminaloss they take while disabled, the less staminaloss they'll take." + - balance: "Limbs have had their base stamina regen rate doubled to match the doubled stamina regen rate of standard spacemen." From 5bd2b13233aa51fae8c3a4752726307339988c0d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 20 Jan 2020 11:04:34 -0600 Subject: [PATCH 37/41] Automatic changelog generation for PR #10615 [ci skip] --- html/changelogs/AutoChangeLog-pr-10615.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10615.yml diff --git a/html/changelogs/AutoChangeLog-pr-10615.yml b/html/changelogs/AutoChangeLog-pr-10615.yml new file mode 100644 index 0000000000..f67392cd7f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10615.yml @@ -0,0 +1,4 @@ +author: "keronshb" +delete-after: True +changes: + - bugfix: "fixed my messup" From 06e23144a8062db0df15f453e6498d515bfb679d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 20 Jan 2020 11:50:27 -0600 Subject: [PATCH 38/41] Automatic changelog generation for PR #10621 [ci skip] --- html/changelogs/AutoChangeLog-pr-10621.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10621.yml diff --git a/html/changelogs/AutoChangeLog-pr-10621.yml b/html/changelogs/AutoChangeLog-pr-10621.yml new file mode 100644 index 0000000000..0bb08dee2c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10621.yml @@ -0,0 +1,4 @@ +author: "Hatterhat" +delete-after: True +changes: + - rscadd: "You can now print .357 AP speedloaders from Security techfabs after you pick up the Advanced Non-Standard Ballistics node." From a99090ddbf9cf235d838720fad805abd0b08db62 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 20 Jan 2020 13:02:09 -0600 Subject: [PATCH 39/41] Automatic changelog generation for PR #10617 [ci skip] --- html/changelogs/AutoChangeLog-pr-10617.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10617.yml diff --git a/html/changelogs/AutoChangeLog-pr-10617.yml b/html/changelogs/AutoChangeLog-pr-10617.yml new file mode 100644 index 0000000000..923913a043 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10617.yml @@ -0,0 +1,4 @@ +author: "kevinz000" +delete-after: True +changes: + - bugfix: "Grenades can now have their timers adjusted." From 348fa8be8674b31e6dc2d114ba30676430d6b308 Mon Sep 17 00:00:00 2001 From: Hatterhat <31829017+Hatterhat@users.noreply.github.com> Date: Mon, 20 Jan 2020 17:27:51 -0600 Subject: [PATCH 40/41] salt pr @kevinz000 --- code/modules/research/techweb/all_nodes.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 2dc2e71dea..2fa5901ec9 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -80,7 +80,7 @@ display_name = "Advanced Biotechnology" description = "Advanced Biotechnology" prereq_ids = list("biotech") - design_ids = list("piercesyringe", "crewpinpointer", "smoke_machine", "plasmarefiller", "limbgrower", "meta_beaker", "healthanalyzer_advanced", "harvester", "holobarrier_med", "detective_scanner", "defibrillator_compact", "smartdartgun", "medicinalsmartdart", "pHmeter") + design_ids = list("piercesyringe", "crewpinpointer", "smoke_machine", "plasmarefiller", "limbgrower", "meta_beaker", "healthanalyzer_advanced", "harvester", "holobarrier_med", "defibrillator_compact", "smartdartgun", "medicinalsmartdart", "pHmeter") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 From ad2db72b0d5275a19b01c0980ca60221b77c8874 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 20 Jan 2020 18:02:56 -0600 Subject: [PATCH 41/41] Automatic changelog generation for PR #10635 [ci skip] --- html/changelogs/AutoChangeLog-pr-10635.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10635.yml diff --git a/html/changelogs/AutoChangeLog-pr-10635.yml b/html/changelogs/AutoChangeLog-pr-10635.yml new file mode 100644 index 0000000000..66c90808d6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10635.yml @@ -0,0 +1,4 @@ +author: "Hatterhat" +delete-after: True +changes: + - rscdel: "Forensic scanner removed from Advanced Biotechnology node."