From 4dde7adc7c8882a49d88248c7ac04a7f9d032a2b Mon Sep 17 00:00:00 2001 From: zevo <95449138+Zevotech@users.noreply.github.com> Date: Wed, 5 Jun 2024 23:34:18 -0400 Subject: [PATCH 01/18] Ashwalker Shrine Remap (#2931) ## About The Pull Request Completely remaps Ashwalker_Shrine into a new map: The Buried Shrine. An unknown temple buried and ruined by volcanic activity. Who it belonged to before it was destroyed is unknown, but some of their riches yet remain buried inside. (Note, this is distinctly **Not** The Necropolis, and not *explicitly* ashwalker in origin. The walls have been renamed to represent this.) SDMM: ![StrongDMM-2024-04-23 22 37 23](https://github.com/shiptest-ss13/Shiptest/assets/95449138/2dcf4e18-7278-423b-9bfa-a13fc3972dcf) ![StrongDMM-2024-04-23 22 37 24](https://github.com/shiptest-ss13/Shiptest/assets/95449138/efdc9fca-c9bd-44dd-b103-c0bf3a3fb712) Ingame: ![image](https://github.com/shiptest-ss13/Shiptest/assets/95449138/bd997ac3-6de6-40a4-a23a-8fd4cd34296b) (Fun fact: See those tiles in the lava? They sink when you walk over them and come back up after a few seconds. Good luck! :]) ## Why It's Good For The Game Redone lavaland ruins that don't suck are good. This PR has the added benefit of making the formerly necropolis walls not *strictly* necropolis related due to its dubious chances at remaining in the lore. They're good looking walls. ## Changelog :cl: add: remapped and renamed ashwalker_shrine into lavaland_surface_buried_shrine add: Necropolis walls have been renamed to thick stone walls. /:cl: --- .../lavaland_surface_ashwalker_shrine.dmm | 3692 ----------- .../lavaland_surface_buried_shrine.dmm | 5795 +++++++++++++++++ _maps/map_catalogue.txt | 6 +- code/datums/ruins/lavaland.dm | 10 +- code/game/area/areas/ruins/lavaland.dm | 5 + code/game/turfs/closed/_closed.dm | 2 +- 6 files changed, 5809 insertions(+), 3701 deletions(-) delete mode 100644 _maps/RandomRuins/LavaRuins/lavaland_surface_ashwalker_shrine.dmm create mode 100644 _maps/RandomRuins/LavaRuins/lavaland_surface_buried_shrine.dmm diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ashwalker_shrine.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ashwalker_shrine.dmm deleted file mode 100644 index b3d7e439a805..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ashwalker_shrine.dmm +++ /dev/null @@ -1,3692 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"ad" = ( -/obj/structure/fence{ - dir = 4 - }, -/turf/open/floor/plating/ashplanet/ash, -/area/overmap_encounter/planetoid/lava/explored) -"aw" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/obj/item/melee/transforming/energy/sword/saber/red, -/obj/effect/mob_spawn/human/corpse/nanotrasenassaultsoldier, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"aA" = ( -/turf/template_noop, -/area/template_noop) -"aG" = ( -/obj/item/circuitboard/computer/operating, -/obj/item/storage/backpack/duffelbag/syndie/surgery, -/obj/structure/closet/supplypod, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"bm" = ( -/obj/structure/stone_tile/slab, -/obj/structure/table/wood, -/obj/item/storage/toolbox/syndicate, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"cm" = ( -/obj/structure/stone_tile/block, -/obj/structure/stone_tile/slab{ - pixel_y = -16 - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"cv" = ( -/obj/structure/bonfire, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"cx" = ( -/obj/structure/stone_tile/slab, -/obj/item/ammo_casing/shotgun/buckshot, -/obj/effect/mob_spawn/human/corpse{ - mob_species = /datum/species/lizard/ashwalker - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"cA" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/obj/structure/stone_tile/block{ - dir = 8 - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"cR" = ( -/obj/structure/stone_tile/slab, -/obj/item/ammo_casing/shotgun/buckshot, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"dg" = ( -/obj/structure/stone_tile/block{ - pixel_x = -16 - }, -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"dn" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/obj/structure/stone_tile/block{ - dir = 4 - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"dv" = ( -/obj/item/ammo_casing/shotgun/buckshot, -/turf/open/floor/wood, -/area/overmap_encounter/planetoid/lava/explored) -"dD" = ( -/turf/closed/indestructible/riveted/boss, -/area/overmap_encounter/planetoid/lava/explored) -"dM" = ( -/obj/structure/stone_tile/slab, -/turf/open/lava/smooth/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"dY" = ( -/obj/structure/fence/door{ - dir = 4 - }, -/turf/open/floor/wood, -/area/overmap_encounter/planetoid/lava/explored) -"ee" = ( -/obj/structure/stone_tile/slab/burnt, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"ej" = ( -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/center/cracked, -/obj/structure/stone_tile/surrounding_tile, -/obj/structure/stone_tile/surrounding_tile{ - dir = 1 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"ek" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"eq" = ( -/obj/item/storage/bag/plants/portaseeder, -/turf/open/floor/wood, -/area/overmap_encounter/planetoid/lava/explored) -"ew" = ( -/obj/structure/stone_tile/block, -/obj/structure/mineral_door/sandstone, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"eH" = ( -/obj/structure/stone_tile/center, -/obj/structure/stone_tile/surrounding_tile, -/obj/structure/stone_tile/surrounding_tile{ - dir = 8 - }, -/obj/structure/stone_tile/surrounding_tile{ - dir = 4 - }, -/obj/structure/stone_tile/surrounding_tile{ - dir = 1 - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"eZ" = ( -/obj/structure/stone_tile/surrounding_tile/cracked, -/obj/structure/stone_tile/center, -/obj/structure/stone_tile/surrounding_tile{ - dir = 1 - }, -/obj/structure/stone_tile/surrounding_tile{ - dir = 8 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"fd" = ( -/obj/structure/stone_tile/slab/cracked{ - dir = 10 - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"fe" = ( -/obj/structure/closet/crate/radiation, -/obj/item/flashlight/lantern, -/obj/item/flashlight/lantern, -/obj/item/flashlight/lantern, -/obj/item/flashlight/flare, -/turf/open/floor/wood, -/area/overmap_encounter/planetoid/lava/explored) -"fU" = ( -/obj/structure/stone_tile/block{ - dir = 4; - pixel_y = -16 - }, -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 8 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"fV" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken4" - }, -/area/overmap_encounter/planetoid/lava/explored) -"gl" = ( -/obj/structure/stone_tile/block, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"gp" = ( -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile/block{ - dir = 8; - pixel_y = 16 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"gM" = ( -/obj/item/stack/cable_coil/red, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"ha" = ( -/obj/structure/stone_tile/slab/cracked{ - dir = 6 - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"hd" = ( -/obj/structure/stone_tile, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"hk" = ( -/obj/structure/rack, -/obj/item/stack/sheet/mineral/wood{ - amount = 18 - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"ie" = ( -/obj/structure/table/wood, -/obj/item/seeds/cannabis, -/turf/open/floor/wood, -/area/overmap_encounter/planetoid/lava/explored) -"ik" = ( -/obj/structure/stone_tile{ - dir = 8 - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"il" = ( -/obj/structure/table/wood, -/obj/item/spear/bonespear, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"im" = ( -/obj/structure/fence{ - dir = 8 - }, -/turf/open/floor/plating/ashplanet/ash, -/area/overmap_encounter/planetoid/lava/explored) -"iw" = ( -/turf/open/floor/wood, -/area/overmap_encounter/planetoid/lava/explored) -"je" = ( -/obj/structure/stone_tile/block{ - dir = 1; - pixel_x = 16 - }, -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 1 - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"jl" = ( -/turf/open/lava/smooth/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"ke" = ( -/obj/machinery/hydroponics/soil, -/turf/open/floor/plating/ashplanet/ash, -/area/overmap_encounter/planetoid/lava/explored) -"kz" = ( -/obj/structure/stone_tile/block{ - dir = 8; - pixel_y = 16 - }, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"kD" = ( -/obj/structure/stone_tile/block{ - dir = 1 - }, -/obj/item/ammo_casing/shotgun/buckshot, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"kT" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/obj/structure/mineral_door/sandstone, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"kV" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken2" - }, -/area/overmap_encounter/planetoid/lava/explored) -"kZ" = ( -/obj/structure/stone_tile/surrounding_tile{ - dir = 4 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"lc" = ( -/obj/structure/stone_tile/slab, -/obj/structure/table/wood, -/obj/item/instrument/trombone, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"lh" = ( -/obj/structure/table/wood, -/obj/item/storage/firstaid/fire, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"ln" = ( -/obj/machinery/the_singularitygen, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"lt" = ( -/mob/living/simple_animal/hostile/asteroid/gutlunch, -/turf/open/floor/wood, -/area/overmap_encounter/planetoid/lava/explored) -"lx" = ( -/obj/structure/fence, -/turf/open/floor/plating/ashplanet/ash, -/area/overmap_encounter/planetoid/lava/explored) -"lO" = ( -/obj/structure/stone_tile/slab{ - pixel_y = -16 - }, -/obj/structure/stone_tile/block, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"mg" = ( -/obj/structure/stone_tile/slab, -/obj/structure/mineral_door/sandstone, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"nh" = ( -/obj/effect/mob_spawn/human/corpse{ - mob_species = /datum/species/lizard/ashwalker - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"nr" = ( -/obj/structure/stone_tile/block{ - dir = 1 - }, -/obj/structure/mineral_door/sandstone, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"ny" = ( -/obj/structure/stone_tile/block{ - dir = 1 - }, -/obj/structure/stone_tile/block, -/obj/structure/chair/wood/wings{ - dir = 4 - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"ox" = ( -/obj/structure/stone_tile/slab, -/obj/effect/gibspawner/human, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"oF" = ( -/obj/structure/stone_tile/block, -/obj/structure/stone_tile/block{ - dir = 1 - }, -/obj/structure/chair/wood/wings, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"oO" = ( -/obj/structure/fence/door, -/turf/open/floor/plating/ashplanet/ash, -/area/overmap_encounter/planetoid/lava/explored) -"oY" = ( -/obj/structure/stone_tile/surrounding_tile/cracked, -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/center, -/obj/structure/stone_tile/surrounding_tile{ - dir = 8 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"px" = ( -/obj/item/seeds/potato, -/turf/open/floor/plating/ashplanet/ash, -/area/overmap_encounter/planetoid/lava/explored) -"pJ" = ( -/mob/living/simple_animal/hostile/human/nanotrasen/ranged/smg, -/turf/open/floor/wood, -/area/overmap_encounter/planetoid/lava/explored) -"pT" = ( -/obj/structure/table/wood, -/obj/item/seeds/ambrosia, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"pZ" = ( -/obj/structure/fence/corner{ - dir = 6 - }, -/turf/open/floor/plating/ashplanet/ash, -/area/overmap_encounter/planetoid/lava/explored) -"qq" = ( -/obj/structure/stone_tile/slab/cracked{ - dir = 5 - }, -/obj/structure/bonfire, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"qw" = ( -/obj/effect/gibspawner/human, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"qy" = ( -/obj/structure/stone_tile/slab/burnt, -/obj/item/ammo_casing/shotgun/buckshot, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"qG" = ( -/obj/structure/stone_tile/surrounding, -/obj/structure/stone_tile/center, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"rc" = ( -/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck, -/turf/open/floor/wood, -/area/overmap_encounter/planetoid/lava/explored) -"rk" = ( -/obj/structure/stone_tile/block{ - dir = 1 - }, -/obj/structure/stone_tile/block, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"rm" = ( -/obj/structure/stone_tile/slab, -/obj/structure/chair/wood/wings{ - dir = 4 - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"rp" = ( -/obj/structure/rack, -/turf/open/floor/wood, -/area/overmap_encounter/planetoid/lava/explored) -"ru" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, -/area/overmap_encounter/planetoid/lava/explored) -"rx" = ( -/obj/structure/stone_tile/block, -/obj/effect/mob_spawn/human/corpse{ - mob_species = /datum/species/lizard/ashwalker - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"rD" = ( -/obj/structure/stone_tile/slab, -/obj/effect/mob_spawn/human/corpse{ - mob_species = /datum/species/lizard/ashwalker - }, -/obj/item/spear/bonespear, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"rH" = ( -/obj/structure/stone_tile/surrounding_tile{ - dir = 8 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"rJ" = ( -/obj/structure/stone_tile/slab, -/obj/item/paper{ - desc = "A hastily written note, written in the Lizard language."; - default_raw_text = "To all brethren who may read this, we are sorry. We failed to defend the Necropolis, and those from the sky destroyed our home. I write this in my last dying breath, to warn you to not make our mistakes. Don't let them fool you with their actions, all of those who come from the sky are not your friends. They wish to loot and pillage your villages. Please do not make our same mistakes." - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"sc" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/obj/effect/mob_spawn/human/corpse{ - mob_species = /datum/species/lizard/ashwalker - }, -/obj/item/spear/bonespear, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"ss" = ( -/obj/structure/stone_tile/slab, -/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"sM" = ( -/obj/item/seeds/tower, -/turf/open/floor/plating/ashplanet/ash, -/area/overmap_encounter/planetoid/lava/explored) -"tR" = ( -/obj/structure/table/wood, -/obj/item/seeds/cotton/durathread, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"uc" = ( -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile/block{ - dir = 8; - pixel_y = 16 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"uH" = ( -/obj/structure/stone_tile/block, -/obj/effect/gibspawner/human, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"uJ" = ( -/obj/structure/bed, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"uK" = ( -/turf/closed/wall/mineral/wood/nonmetal, -/area/overmap_encounter/planetoid/lava/explored) -"vd" = ( -/obj/structure/stone_tile/block, -/obj/structure/stone_tile/block{ - dir = 1 - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"vm" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/obj/structure/stone_tile{ - dir = 8 - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"vu" = ( -/obj/structure/stone_tile/surrounding, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"vH" = ( -/obj/structure/stone_tile/block, -/obj/effect/mob_spawn/human/corpse{ - mob_species = /datum/species/lizard/ashwalker - }, -/obj/item/spear/bonespear, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"vN" = ( -/obj/structure/stone_tile/block{ - dir = 8; - pixel_y = 16 - }, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"vU" = ( -/obj/effect/mob_spawn/human/corpse{ - mob_species = /datum/species/lizard/ashwalker - }, -/obj/item/spear/bonespear, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"vW" = ( -/obj/structure/stone_tile/center, -/obj/structure/stone_tile/surrounding/burnt, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"wi" = ( -/mob/living/simple_animal/hostile/asteroid/gutlunch, -/turf/open/floor/plating/ashplanet/ash, -/area/overmap_encounter/planetoid/lava/explored) -"wt" = ( -/obj/structure/bed, -/turf/open/floor/wood, -/area/overmap_encounter/planetoid/lava/explored) -"wz" = ( -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/stone_tile/block, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"wO" = ( -/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen, -/turf/open/floor/wood, -/area/overmap_encounter/planetoid/lava/explored) -"wV" = ( -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/overmap_encounter/planetoid/lava/explored) -"xa" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/obj/effect/gibspawner/human, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"xt" = ( -/obj/structure/stone_tile/slab, -/obj/structure/table/wood, -/obj/item/weldingtool/experimental, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"xT" = ( -/obj/structure/stone_tile/slab, -/obj/structure/stone_tile/slab, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"xZ" = ( -/obj/structure/stone_tile/slab, -/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"yp" = ( -/obj/structure/stone_tile/block, -/mob/living/simple_animal/hostile/asteroid/gutlunch, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"yD" = ( -/obj/structure/stone_tile/slab, -/mob/living/simple_animal/hostile/asteroid/gutlunch/grublunch, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"yJ" = ( -/obj/structure/stone_tile/slab, -/mob/living/simple_animal/hostile/human/nanotrasen/ranged/assault, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"zG" = ( -/obj/structure/table/wood, -/obj/structure/stone_tile/slab, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"zJ" = ( -/obj/structure/sink/puddle, -/turf/open/floor/plating/ashplanet/ash, -/area/overmap_encounter/planetoid/lava/explored) -"zW" = ( -/obj/item/ammo_casing/shotgun/buckshot, -/turf/open/floor/wood{ - icon_state = "wood-broken6" - }, -/area/overmap_encounter/planetoid/lava/explored) -"zY" = ( -/obj/structure/stone_tile/block{ - dir = 1; - pixel_x = 16 - }, -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/effect/mob_spawn/human/corpse{ - mob_species = /datum/species/lizard/ashwalker - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"An" = ( -/obj/structure/fence/corner{ - dir = 8 - }, -/turf/open/floor/plating/ashplanet/ash, -/area/overmap_encounter/planetoid/lava/explored) -"At" = ( -/obj/structure/table/wood, -/obj/item/seeds/garlic, -/turf/open/floor/wood, -/area/overmap_encounter/planetoid/lava/explored) -"AG" = ( -/obj/item/seeds/peas, -/turf/open/floor/plating/ashplanet/ash, -/area/overmap_encounter/planetoid/lava/explored) -"AI" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 4 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"AY" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/obj/effect/mob_spawn/human/corpse{ - mob_species = /datum/species/lizard/ashwalker - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"Bv" = ( -/obj/item/seeds/glowshroom/glowcap, -/turf/open/floor/plating/ashplanet/ash, -/area/overmap_encounter/planetoid/lava/explored) -"BF" = ( -/obj/machinery/hydroponics/soil, -/obj/item/seeds/tower, -/turf/open/floor/plating/ashplanet/ash, -/area/overmap_encounter/planetoid/lava/explored) -"Cr" = ( -/obj/structure/fence/door{ - dir = 4 - }, -/turf/open/floor/plating/ashplanet/ash, -/area/overmap_encounter/planetoid/lava/explored) -"CE" = ( -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile/slab{ - pixel_y = -16 - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"CM" = ( -/turf/open/floor/plating/ashplanet/ash, -/area/overmap_encounter/planetoid/lava/explored) -"CP" = ( -/obj/machinery/smartfridge/drying_rack, -/turf/open/floor/wood, -/area/overmap_encounter/planetoid/lava/explored) -"CT" = ( -/obj/structure/stone_tile/slab, -/obj/structure/table/wood, -/obj/item/reagent_containers/food/snacks/soup/blood, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"CU" = ( -/obj/structure/stone_tile/slab, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"Dk" = ( -/obj/structure/stone_tile{ - dir = 4 - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"DF" = ( -/obj/item/clothing/head/welding, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"Eh" = ( -/obj/structure/stone_tile/slab, -/obj/structure/table/wood, -/obj/item/reagent_containers/glass/bowl/mushroom_bowl, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"Eq" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/obj/effect/mob_spawn/human/corpse{ - mob_species = /datum/species/lizard/ashwalker - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"Ez" = ( -/obj/structure/stone_tile/slab, -/obj/structure/table/wood, -/obj/item/reagent_containers/glass/bowl/mushroom_bowl, -/obj/item/reagent_containers/food/snacks/soup/wish, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"Fk" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"Fo" = ( -/obj/structure/stone_tile/slab, -/obj/structure/table/wood, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"FS" = ( -/obj/structure/table/wood, -/obj/item/seeds/ambrosia, -/turf/open/floor/wood, -/area/overmap_encounter/planetoid/lava/explored) -"Gr" = ( -/obj/item/ammo_casing/shotgun/buckshot, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"GD" = ( -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 8 - }, -/obj/structure/stone_tile/center, -/obj/structure/stone_tile/surrounding_tile{ - dir = 1 - }, -/obj/structure/stone_tile/surrounding_tile{ - dir = 4 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"HL" = ( -/obj/effect/mob_spawn/human/corpse{ - mob_species = /datum/species/lizard/ashwalker - }, -/turf/open/floor/wood, -/area/overmap_encounter/planetoid/lava/explored) -"HP" = ( -/obj/structure/mineral_door/sandstone, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"Ii" = ( -/obj/structure/stone_tile/surrounding_tile, -/obj/structure/stone_tile/surrounding_tile{ - pixel_x = 17; - pixel_y = -17 - }, -/obj/structure/stone_tile/surrounding_tile{ - dir = 1; - pixel_x = 17; - pixel_y = -17 - }, -/obj/structure/stone_tile/surrounding_tile{ - dir = 4; - pixel_x = 17; - pixel_y = -17 - }, -/obj/structure/stone_tile/surrounding_tile{ - dir = 8; - pixel_x = 17; - pixel_y = -17 - }, -/obj/structure/stone_tile/center{ - pixel_x = 17; - pixel_y = -17 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"IF" = ( -/obj/structure/stone_tile/block{ - dir = 1 - }, -/obj/item/kinetic_crusher, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"IO" = ( -/obj/structure/stone_tile/block/cracked, -/turf/open/lava/smooth/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"Jd" = ( -/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck, -/turf/open/floor/plating/ashplanet/ash, -/area/overmap_encounter/planetoid/lava/explored) -"Jk" = ( -/obj/structure/stone_tile/block{ - dir = 4; - pixel_y = -16 - }, -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 8 - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"Jv" = ( -/obj/structure/stone_tile/block{ - dir = 1 - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"JA" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken3" - }, -/area/overmap_encounter/planetoid/lava/explored) -"JL" = ( -/obj/structure/table/wood, -/obj/item/seeds/cotton, -/turf/open/floor/wood, -/area/overmap_encounter/planetoid/lava/explored) -"JM" = ( -/obj/structure/table/wood, -/obj/item/seeds/cabbage, -/turf/open/floor/wood, -/area/overmap_encounter/planetoid/lava/explored) -"JR" = ( -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/effect/mob_spawn/human/corpse{ - mob_species = /datum/species/lizard/ashwalker - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"JV" = ( -/obj/structure/table/wood, -/obj/item/seeds/cherry, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"JZ" = ( -/obj/structure/stone_tile/slab, -/obj/structure/fluff/drake_statue, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"Kd" = ( -/obj/structure/stone_tile/slab/cracked{ - dir = 1 - }, -/obj/structure/table/wood, -/obj/item/stack/sheet/mineral/wood/fifty, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"Ku" = ( -/obj/structure/table/wood, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"KR" = ( -/obj/item/storage/firstaid/regular, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"KS" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/obj/item/ammo_casing/shotgun/buckshot, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"Lj" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/obj/effect/mob_spawn/human/corpse{ - mob_species = /datum/species/lizard/ashwalker - }, -/obj/item/spear/bonespear, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"LG" = ( -/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen, -/turf/open/floor/plating/ashplanet/ash, -/area/overmap_encounter/planetoid/lava/explored) -"LL" = ( -/obj/structure/stone_tile/slab, -/obj/effect/mob_spawn/human/corpse{ - mob_species = /datum/species/lizard/ashwalker - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"LS" = ( -/obj/item/seeds/plump, -/turf/open/floor/plating/ashplanet/ash, -/area/overmap_encounter/planetoid/lava/explored) -"MX" = ( -/obj/structure/stone_tile/slab/cracked{ - dir = 10 - }, -/obj/item/ammo_casing/shotgun/buckshot, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"Nf" = ( -/obj/structure/stone_tile/block{ - dir = 1 - }, -/obj/structure/stone_tile/block, -/obj/structure/chair/wood/wings{ - dir = 1 - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"Np" = ( -/obj/item/seeds/wheat, -/turf/open/floor/plating/ashplanet/ash, -/area/overmap_encounter/planetoid/lava/explored) -"Nt" = ( -/obj/structure/bonfire, -/turf/open/floor/wood, -/area/overmap_encounter/planetoid/lava/explored) -"NA" = ( -/obj/structure/table/wood, -/obj/item/clothing/head/welding, -/turf/open/floor/wood, -/area/overmap_encounter/planetoid/lava/explored) -"ND" = ( -/obj/structure/stone_tile/block, -/obj/structure/stone_tile/slab{ - pixel_y = -16 - }, -/obj/structure/mineral_door/sandstone, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"NE" = ( -/obj/structure/stone_tile/block{ - dir = 1 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"OB" = ( -/obj/structure/table/optable, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"Pi" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 1 - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"Qv" = ( -/obj/structure/sink/puddle, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"QT" = ( -/obj/structure/fence/corner{ - dir = 5 - }, -/turf/open/floor/plating/ashplanet/ash, -/area/overmap_encounter/planetoid/lava/explored) -"QW" = ( -/obj/structure/closet/crate/medical, -/obj/item/storage/firstaid/regular, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/blood/lizard, -/obj/item/reagent_containers/blood/lizard, -/obj/item/stack/sheet/cotton/cloth/ten, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"Sa" = ( -/obj/structure/stone_tile/slab/cracked{ - dir = 4 - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"SJ" = ( -/obj/effect/mob_spawn/human/corpse{ - mob_species = /datum/species/lizard/ashwalker - }, -/obj/structure/stone_tile/block{ - dir = 8 - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"SO" = ( -/obj/structure/closet/crate, -/obj/item/flashlight/lantern, -/obj/item/flashlight/lantern, -/obj/item/flashlight/lantern, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"Td" = ( -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"Ty" = ( -/obj/structure/stone_tile/slab/cracked, -/mob/living/simple_animal/hostile/human/nanotrasen/ranged, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"TX" = ( -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile/block{ - dir = 1 - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"Ua" = ( -/obj/structure/stone_tile/surrounding_tile{ - dir = 1 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"Us" = ( -/obj/structure/stone_tile/slab, -/obj/structure/table/wood, -/obj/item/spear/bonespear, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"Ux" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken6" - }, -/area/overmap_encounter/planetoid/lava/explored) -"Uy" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/obj/structure/mineral_door/sandstone, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"UB" = ( -/obj/structure/stone_tile{ - dir = 1 - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"UF" = ( -/obj/structure/table/wood, -/obj/item/spear/bonespear, -/turf/open/floor/wood, -/area/overmap_encounter/planetoid/lava/explored) -"Vb" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/obj/item/clothing/head/welding, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"VT" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"WJ" = ( -/obj/structure/table/wood, -/obj/item/melee/transforming/energy/sword/saber/red, -/turf/open/floor/wood, -/area/overmap_encounter/planetoid/lava/explored) -"WM" = ( -/obj/item/storage/firstaid/tactical, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"Xe" = ( -/obj/machinery/hydroponics/soil, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"Xw" = ( -/obj/structure/mineral_door/sandstone, -/turf/open/floor/wood, -/area/overmap_encounter/planetoid/lava/explored) -"Yg" = ( -/obj/structure/stone_tile/slab/cracked{ - dir = 5 - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"Yh" = ( -/obj/structure/stone_tile/slab/cracked, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"YC" = ( -/obj/structure/table/wood, -/obj/item/storage/firstaid/ancient, -/turf/open/floor/wood, -/area/overmap_encounter/planetoid/lava/explored) -"YI" = ( -/obj/structure/table/wood, -/obj/item/stack/sheet/mineral/wood/fifty, -/turf/open/floor/wood, -/area/overmap_encounter/planetoid/lava/explored) -"YT" = ( -/obj/structure/stone_tile/block/cracked, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"Zc" = ( -/obj/structure/stone_tile/block{ - dir = 1 - }, -/obj/structure/stone_tile/block, -/obj/structure/chair/wood/wings, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"Zj" = ( -/obj/machinery/iv_drip, -/obj/item/reagent_containers/food/drinks/waterbottle/large, -/turf/open/floor/wood, -/area/overmap_encounter/planetoid/lava/explored) -"ZL" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/obj/effect/gibspawner/human, -/turf/open/lava/smooth/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) -"ZX" = ( -/obj/structure/table/wood, -/obj/item/storage/box/rxglasses, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/overmap_encounter/planetoid/lava/explored) - -(1,1,1) = {" -Td -Td -Td -Td -Td -Td -Td -Td -Td -Td -Td -Td -Td -Td -Td -dD -uK -dD -uK -Td -dD -uK -dD -Td -Td -Td -Td -gl -Td -Td -Td -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -"} -(2,1,1) = {" -Td -An -lx -lx -lx -lx -lx -lx -dD -uK -Td -dD -Td -Td -uK -dD -pT -wV -CP -Td -wV -ie -dD -uK -Td -Td -Td -Td -CU -Td -Td -aA -aA -aA -aA -aA -aA -aA -Td -Td -Td -Td -aA -aA -aA -aA -aA -aA -aA -aA -"} -(3,1,1) = {" -Td -ad -px -Np -CM -LS -CM -sM -Td -iw -iw -uK -uK -Td -dD -Td -Td -iw -iw -iw -iw -iw -iw -dD -Td -Td -Td -gl -Td -Jv -Td -Td -Td -Td -Td -Td -Td -Td -Gr -gl -ee -Td -Td -aA -aA -aA -aA -aA -aA -aA -"} -(4,1,1) = {" -Td -ad -CM -BF -ke -ke -ke -CM -oO -iw -iw -iw -dD -Td -Td -Td -iw -Td -Td -iw -JL -JV -wV -dD -Td -Td -Td -gl -CU -Jv -Td -Td -Td -uK -dD -uK -Td -uK -dD -YT -CU -Jv -Td -aA -aA -aA -aA -aA -aA -aA -"} -(5,1,1) = {" -Td -ad -CM -ke -ke -BF -ke -Bv -dD -iw -iw -iw -Td -Td -dD -Td -wV -tR -Td -Td -JM -wV -wV -Td -Td -Td -Td -gl -CU -Td -Td -Td -dD -dD -iw -iw -Td -pJ -dD -gl -Yh -Jv -Td -Gr -Td -aA -aA -aA -aA -aA -"} -(6,1,1) = {" -Td -ad -Np -AG -sM -CM -sM -zJ -dD -eq -iw -wt -uK -Td -uK -iw -iw -At -iw -Td -iw -iw -iw -dD -Td -Td -Td -gl -CU -Jv -Td -Td -Td -Td -iw -HL -iw -Td -uK -YT -CU -Pi -Td -Td -Td -Td -Td -dD -dD -Td -"} -(7,1,1) = {" -Td -QT -lx -lx -Cr -lx -lx -lx -uK -dD -iw -uK -dD -Td -dD -hk -rp -Ku -iw -Td -wV -Ku -FS -uK -Td -Td -Td -gl -CU -Jv -Td -Td -dD -iw -Td -Td -Td -Td -dD -gl -cR -Jv -Td -dD -dD -dD -uK -dD -uK -dD -"} -(8,1,1) = {" -Td -Td -Td -Td -Td -Td -Td -Td -Td -Jv -CU -gl -Td -Td -dD -Td -uK -dD -HP -HP -dD -uK -Td -dD -Td -Td -Td -gl -CU -Jv -Td -Td -uK -UF -iw -iw -cv -iw -Xw -Td -ee -Jv -gM -uK -Td -uK -Td -uK -Td -dD -"} -(9,1,1) = {" -Td -Td -Td -cA -cA -cA -cA -Fk -Fk -Fk -CU -Fk -Fk -Fk -Fk -Fk -Fk -VT -CU -CU -vm -Fk -Fk -Fk -Fk -Fk -Fk -hd -CU -Jv -Td -Td -dD -il -iw -Td -iw -HL -uK -gl -CU -UB -Fk -Fk -AY -eZ -AI -ej -Td -uK -"} -(10,1,1) = {" -Td -Td -CU -CU -CU -CU -CU -CU -CU -CU -CU -CU -CU -CU -lO -Jv -CU -lO -Jv -CU -lO -Jv -lO -Jv -lO -Jv -lO -Jv -CU -Jv -Td -Td -dD -dD -iw -iw -iw -iw -dD -gl -ee -CU -CU -Ty -rJ -IO -jl -NE -WM -Td -"} -(11,1,1) = {" -Td -CU -CU -CU -CU -CU -CU -CU -CU -CU -CU -CU -CU -CU -lO -Jv -CU -lO -Jv -CU -lO -Jv -lO -Jv -lO -Jv -lO -Jv -CU -Jv -Td -Td -Td -dD -iw -iw -SO -dD -uK -gl -Yh -Dk -SJ -ek -aw -oY -ZL -GD -Td -uK -"} -(12,1,1) = {" -Td -Td -ek -ek -dn -dn -dn -ek -ek -ek -ek -ek -ek -ek -ek -ek -ek -ek -TX -CU -wz -ek -ek -ek -ek -ek -ek -ik -CU -Jv -Td -Td -Td -dD -Td -uK -uK -dD -Xe -YT -qy -Jv -Td -cv -uK -Td -Td -nh -dD -dD -"} -(13,1,1) = {" -aA -Td -Td -Td -Td -Td -Td -Td -Td -Td -Td -Td -Td -Td -Td -Td -Td -dD -vd -CU -rk -dD -Td -wV -wV -Xw -dD -gl -CU -Jv -Td -Td -Td -Td -Td -Td -Td -Td -Xe -gl -CU -Jv -Td -Td -Td -dD -uK -uK -Td -uK -"} -(14,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -Td -uK -oF -CT -Nf -dD -iw -iw -iw -Td -uK -uH -CU -Jv -Td -Td -Td -Td -Td -Td -Td -Td -Xe -gl -CU -kD -DF -Xe -Qv -Td -uK -dD -cv -Td -"} -(15,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -Td -uK -oF -Eh -Nf -wV -Td -iw -iw -iw -dD -gl -CU -Jv -Td -Td -Td -Td -dD -dD -uK -Qv -Td -gl -CU -Pi -qw -Xe -uK -dD -Ux -dD -uK -Td -"} -(16,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -Td -Td -vd -CU -Zc -wV -iw -iw -iw -iw -uK -gl -CU -Jv -Td -uK -dD -wV -Td -YI -uK -dD -Td -YT -ee -IF -Td -dD -uK -iw -iw -iw -uK -uK -"} -(17,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -Td -dD -oF -Ez -Nf -wV -iw -iw -iw -iw -dD -gl -CU -Jv -Td -Xw -JA -iw -Td -Td -iw -HP -Gr -rx -CU -Pi -Td -aG -Yh -iw -MX -iw -iw -uK -"} -(18,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -Td -uK -vd -rm -ny -Xw -iw -iw -iw -Td -Td -gl -CU -Jv -Td -dD -SO -nh -Nt -Td -lh -dD -Td -gl -Yh -kD -Td -dD -Yg -Ux -iw -JA -iw -Ux -"} -(19,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -Td -dD -dD -zG -zG -dD -iw -Td -wt -dD -Td -gl -xT -Jv -Td -iw -SO -iw -fV -iw -iw -uK -Td -gl -CU -Pi -Td -uK -ha -iw -Td -HL -ha -uK -"} -(20,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -Td -Td -uK -Td -dD -uK -Td -dD -dD -uK -Td -gl -CU -Jv -Td -dD -uK -dD -uJ -iw -dD -uK -qw -gl -ee -Jv -uK -uK -iw -kV -iw -iw -Yh -uK -"} -(21,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -Td -Td -Td -Td -Td -Td -Td -Td -nh -Td -Td -Td -Td -gl -CU -Jv -Td -Td -Td -Td -dD -Td -dD -Td -Td -gl -cR -UB -Xw -dv -iw -iw -qq -iw -iw -dD -"} -(22,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -Td -CU -Fk -Fk -Fk -Fk -Fk -Fk -Fk -Fk -Lj -Fk -Fk -hd -CU -UB -Fk -Fk -Fk -Fk -Fk -Fk -KS -Fk -Vb -hd -CU -JR -Td -iw -Td -Ux -iw -ru -iw -dD -"} -(23,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -Td -gl -CU -CU -CU -CU -CU -ox -CU -CU -CU -CU -CU -CU -vu -CU -CU -CU -CU -CU -cx -Yh -CU -ee -CU -yJ -vW -Jv -uK -dD -iw -zW -ha -Td -WJ -uK -"} -(24,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -Td -gl -CU -Td -ek -ek -ek -ik -rD -Dk -ek -Eq -ek -ik -CU -Dk -ek -ek -ek -ik -CU -Dk -ek -ek -ek -ik -ee -Jv -Td -uK -iw -Sa -iw -iw -NA -dD -"} -(25,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -Td -gl -CU -Jv -dD -dD -dD -ew -mg -nr -dD -dD -dD -gl -CU -Jv -eH -Jk -vN -eH -CU -qG -Jk -vN -eH -gl -CU -Pi -Td -uK -iw -Kd -wV -Td -YC -dD -"} -(26,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -Td -rx -CU -Jv -dD -Fo -Fo -gl -CU -Jv -lc -Fo -dD -gl -CU -Jv -je -Ii -Ua -je -CU -je -Ii -Ua -je -YT -Yh -kD -Td -uK -dD -dD -dD -Ux -uK -dD -"} -(27,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -Td -gl -CU -Jv -dD -Fo -CU -yp -CU -Jv -ss -Fo -dD -gl -CU -Jv -dg -rH -kZ -dg -CU -dg -rH -kZ -dg -gl -CU -Jv -Td -Td -Td -Td -Td -Td -Td -Td -"} -(28,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -Td -gl -CU -vU -kT -xa -Fk -eZ -AI -ej -Fk -Fk -kT -hd -LL -UB -eH -Jk -gp -eH -CU -eH -fU -uc -eH -hd -CU -Jv -Td -Td -Td -Td -Td -Td -Td -Td -"} -(29,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -vU -gl -CU -CU -mg -CU -xZ -IO -jl -NE -CU -CU -mg -CU -vu -CU -CU -LL -CU -CU -JZ -CU -dM -dM -CU -CU -CU -Jv -Td -dD -dD -uK -dD -dD -Td -dD -"} -(30,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -Td -gl -LL -Td -Uy -ek -ek -oY -ZL -GD -ek -ek -Uy -ik -CU -Dk -eH -Jk -vN -eH -CU -eH -fU -kz -eH -ik -CU -Jv -Td -uK -ln -fe -iw -iw -Td -uK -"} -(31,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -Td -gl -CU -Jv -dD -Us -CU -gl -yD -Jv -CU -xt -dD -gl -CU -Jv -zY -Ii -Ua -je -CU -je -Ii -Ua -je -uH -CU -UB -Fk -dD -iw -Td -Td -iw -iw -uK -"} -(32,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -qw -gl -CU -Jv -dD -Us -Us -gl -CU -Jv -bm -Fo -dD -vH -CU -Jv -dg -rH -kZ -dg -CU -dg -rH -kZ -dg -gl -CU -CU -CU -Xw -Td -Td -Td -iw -iw -dD -"} -(33,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -Td -gl -CU -Jv -dD -dD -dD -ew -mg -nr -dD -dD -dD -gl -CU -Jv -eH -Jk -gp -eH -CU -eH -Jk -gp -eH -gl -CU -Dk -ek -uK -iw -iw -iw -iw -Td -uK -"} -(34,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -Td -gl -CU -Td -AY -Fk -Fk -hd -CU -UB -Fk -Fk -Fk -hd -CU -UB -Fk -Fk -Fk -hd -CU -UB -Fk -Fk -Fk -hd -CU -Jv -Td -dD -dD -iw -Td -dD -wt -dD -"} -(35,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -Td -gl -CU -CU -CU -CU -CU -CU -LL -CU -LL -CU -CU -CU -CU -CU -CU -CU -CU -CU -CU -CU -CU -CU -CU -CU -CU -Jv -Td -uK -uK -dY -dD -dD -dD -uK -"} -(36,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -Td -CU -ek -ek -ek -ek -sc -ek -ek -ek -ek -ek -CE -Dk -ek -ek -ek -ek -ek -CE -Dk -ek -ek -ek -ek -ik -CU -Jv -Td -im -Jd -CM -uK -iw -wO -dD -"} -(37,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -Td -Td -Td -Td -Td -Td -Td -Td -Td -qw -Td -Td -cm -Jv -Td -Td -qw -dD -Td -cm -Jv -Td -Td -Td -Td -gl -CU -Jv -Td -im -CM -CM -dD -iw -CM -uK -"} -(38,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -Td -Td -uK -dD -uK -cm -Jv -dD -uK -dD -uK -uK -ND -Jv -dD -dD -uK -Td -gl -CU -Jv -Td -oO -CM -CM -lt -iw -iw -uK -"} -(39,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -Td -uK -uK -uK -Td -iw -Td -iw -iw -uK -KR -iw -Td -Ku -ZX -Ku -dD -Td -gl -CU -Jv -Td -im -LG -CM -uK -uK -rc -uK -"} -(40,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -Td -uK -dD -Td -Td -Td -iw -iw -iw -uK -Td -Td -Td -Td -Td -iw -uK -Td -gl -CU -Jv -Td -im -CM -CM -CM -dD -uK -dD -"} -(41,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -Td -Td -uK -Td -iw -Td -Td -Td -iw -dD -iw -Td -Td -Td -iw -iw -dD -Td -gl -CU -Jv -Td -im -CM -Jd -CM -CM -CM -im -"} -(42,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -Td -uK -dD -wt -uJ -uJ -uJ -wt -uK -OB -Zj -Td -iw -QW -uK -dD -Td -gl -CU -Jv -Td -im -wi -CM -LG -CM -LG -im -"} -(43,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -Td -Td -uK -uK -dD -dD -uK -uK -dD -uK -dD -uK -dD -uK -dD -Td -Td -gl -Yg -Jv -Td -QT -lx -lx -lx -lx -lx -pZ -"} -(44,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -Td -Td -Td -dD -uK -Td -Td -uK -uK -Td -uK -uK -Td -uK -Td -Td -gl -fd -Jv -Td -Td -Td -Td -Td -Td -aA -aA -"} -(45,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -Td -Td -Td -Td -Td -Td -Td -Td -Td -Td -Td -uK -Td -Td -Td -YT -Td -YT -Td -Td -Td -Td -aA -aA -aA -aA -"} -(46,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -Td -vd -Td -Jv -Td -Td -aA -aA -aA -aA -aA -aA -"} -(47,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -Td -vd -CU -rk -Td -aA -aA -aA -aA -aA -aA -aA -"} -(48,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -aA -Td -vd -CU -rk -Td -aA -aA -aA -aA -aA -aA -aA -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_buried_shrine.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_buried_shrine.dmm new file mode 100644 index 000000000000..e5756e7dbdf5 --- /dev/null +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_buried_shrine.dmm @@ -0,0 +1,5795 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"at" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/center/cracked, +/obj/structure/stone_tile/surrounding_tile/cracked, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"aD" = ( +/obj/structure/flora/rock/hell, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, +/area/overmap_encounter/planetoid/lava/explored) +"aP" = ( +/obj/structure/flora/ausbushes/sparsegrass/hell, +/turf/open/floor/plating/moss, +/area/overmap_encounter/planetoid/cave/explored) +"be" = ( +/obj/item/reagent_containers/food/snacks/grown/apple{ + pixel_x = 12 + }, +/turf/open/floor/plating/grass/lava, +/area/ruin/unpowered/buried_shrine) +"bp" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 10 + }, +/obj/structure/stone_tile/center/burnt{ + fall_on_cross = 1; + pixel_y = 6 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"bW" = ( +/obj/structure/flora/ausbushes/sparsegrass/hell, +/turf/open/floor/plating/grass/lava/orange, +/area/overmap_encounter/planetoid/lava/explored) +"bY" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/center/burnt, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"ch" = ( +/obj/structure/destructible/tribal_torch{ + pixel_y = 13 + }, +/obj/structure/stone_tile/surrounding, +/obj/structure/stone_tile/center, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"cn" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 6 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, +/area/ruin/unpowered/buried_shrine) +"co" = ( +/obj/structure/stone_tile/surrounding/cracked, +/obj/item/stack/ore/gold, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"cv" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/glass/bottle/potion, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"cA" = ( +/obj/structure/stone_tile/surrounding, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"cD" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 6 + }, +/obj/structure/destructible/tribal_torch, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"cN" = ( +/obj/item/stack/sheet/bone, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"df" = ( +/obj/structure/stone_tile/block/cracked, +/obj/item/stack/sheet/mineral/wood, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"dg" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, +/area/overmap_encounter/planetoid/lava/explored) +"di" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/center/cracked, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"dn" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 5 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, +/area/overmap_encounter/planetoid/lava/explored) +"dA" = ( +/obj/structure/stone_tile/center/burnt{ + fall_on_cross = 1; + pixel_x = 5 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"dB" = ( +/obj/structure/stone_tile/block/cracked, +/obj/structure/stone_tile/center{ + pixel_y = -6 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"dD" = ( +/turf/closed/indestructible/riveted/boss, +/area/overmap_encounter/planetoid/lava/explored) +"dF" = ( +/turf/open/floor/plating/moss, +/area/overmap_encounter/planetoid/cave/explored) +"dG" = ( +/obj/structure/table/wood, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/item/stack/ore/gold{ + amount = 10 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"dQ" = ( +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding/cracked{ + dir = 4 + }, +/obj/structure/destructible/tribal_torch{ + pixel_y = 13 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"dS" = ( +/obj/structure/stone_tile/center/burnt{ + fall_on_cross = 1; + pixel_y = 10; + pixel_x = 6 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"dX" = ( +/obj/structure/stone_tile/center/burnt{ + fall_on_cross = 1; + pixel_y = -8 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"ee" = ( +/turf/open/lava/smooth/lava_land_surface, +/area/overmap_encounter/planetoid/lava/explored) +"ef" = ( +/obj/structure/stone_tile/surrounding/cracked, +/obj/structure/stone_tile/center/cracked, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"em" = ( +/obj/structure/stone_tile/center/burnt{ + fall_on_cross = 1; + pixel_y = 7; + pixel_x = -2 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"eI" = ( +/turf/open/floor/plating/grass/lava, +/area/ruin/unpowered/buried_shrine) +"eJ" = ( +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, +/area/overmap_encounter/planetoid/lava/explored) +"eZ" = ( +/obj/structure/table/wood, +/obj/item/clothing/head/hooded/cloakhood/bone, +/obj/structure/stone_tile/slab, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"ff" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/item/stack/ore/gold, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"fh" = ( +/obj/item/clothing/suit/armor/curator, +/obj/item/clothing/head/fedora/curator{ + pixel_y = 16 + }, +/obj/effect/decal/remains/human{ + pixel_y = 8 + }, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/ash/large{ + pixel_y = -8 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"fq" = ( +/obj/structure/destructible/tribal_torch{ + pixel_y = 13 + }, +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"fx" = ( +/obj/structure/destructible/tribal_torch, +/obj/structure/stone_tile/slab/cracked, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"fB" = ( +/obj/structure/flora/rock/pile/lava, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, +/area/overmap_encounter/planetoid/lava/explored) +"fL" = ( +/obj/structure/stone_tile/center/burnt{ + fall_on_cross = 1; + pixel_x = 7; + pixel_y = -5 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"fY" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/effect/decal/cleanable/ash{ + pixel_x = 6; + pixel_y = 11 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"gt" = ( +/obj/structure/flora/ash/stem_shroom, +/turf/open/floor/plating/moss, +/area/overmap_encounter/planetoid/cave/explored) +"gz" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/stone_tile/cracked, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"gE" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"gH" = ( +/obj/structure/stone_tile/cracked, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"gW" = ( +/obj/structure/stone_tile/center/burnt{ + fall_on_cross = 1; + pixel_x = 10 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"ha" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 6 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, +/area/overmap_encounter/planetoid/lava/explored) +"hn" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"hp" = ( +/obj/structure/flora/ausbushes/ywflowers/hell, +/turf/open/floor/plating/grass/lava, +/area/ruin/unpowered/buried_shrine) +"hz" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"hW" = ( +/obj/structure/stone_tile/surrounding_tile/burnt{ + dir = 8 + }, +/obj/structure/stone_tile/center/burnt{ + fall_on_cross = 1 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 5 + }, +/obj/structure/stone_tile/surrounding_tile/cracked, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"ic" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"ii" = ( +/obj/structure/chair/pew{ + dir = 1 + }, +/obj/structure/stone_tile/slab, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"iw" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"iB" = ( +/obj/structure/stone_tile/block/burnt{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 6 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"iK" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"iL" = ( +/obj/structure/stone_tile/surrounding_tile/cracked, +/obj/structure/stone_tile/center/burnt{ + fall_on_cross = 1; + pixel_y = -8 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"iX" = ( +/obj/structure/flora/rock/pile, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, +/area/overmap_encounter/planetoid/cave/explored) +"jo" = ( +/obj/item/reagent_containers/food/snacks/grown/apple{ + pixel_y = 12; + pixel_x = 11 + }, +/turf/open/floor/plating/grass/lava, +/area/ruin/unpowered/buried_shrine) +"jt" = ( +/obj/structure/flora/rock/pile, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, +/area/overmap_encounter/planetoid/lava/explored) +"jy" = ( +/obj/structure/stone_tile/block/cracked, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"jI" = ( +/obj/structure/flora/ash/tall_shroom, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, +/area/overmap_encounter/planetoid/lava/explored) +"jJ" = ( +/obj/structure/flora/ash/tall_shroom, +/turf/open/floor/plating/moss, +/area/overmap_encounter/planetoid/cave/explored) +"jM" = ( +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile/cracked, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"jY" = ( +/obj/structure/stone_tile/center/burnt{ + fall_on_cross = 1; + pixel_y = -3 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"kp" = ( +/obj/structure/table_frame/wood, +/obj/structure/stone_tile/slab, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"kt" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, +/area/overmap_encounter/planetoid/lava/explored) +"kC" = ( +/obj/structure/stone_tile/center/burnt{ + fall_on_cross = 1; + pixel_y = -2; + pixel_x = 2 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"kJ" = ( +/obj/structure/stone_tile/surrounding/cracked, +/obj/structure/stone_tile/center/cracked, +/obj/structure/destructible/tribal_torch{ + pixel_y = 13 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"kW" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"kZ" = ( +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/cracked, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"ld" = ( +/obj/structure/table/wood, +/obj/item/stack/ore/diamond, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"lo" = ( +/obj/structure/flora/ausbushes/fullgrass/hell, +/turf/open/floor/plating/moss, +/area/overmap_encounter/planetoid/cave/explored) +"lJ" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"lO" = ( +/obj/structure/flora/ausbushes/sparsegrass/hell, +/turf/open/floor/plating/moss, +/area/overmap_encounter/planetoid/lava/explored) +"me" = ( +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/surrounding_tile{ + pixel_x = 17; + pixel_y = -17 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1; + pixel_x = 17; + pixel_y = -17 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 4; + pixel_x = 17; + pixel_y = -17 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8; + pixel_x = 17; + pixel_y = -17 + }, +/obj/structure/stone_tile/center{ + pixel_x = 17; + pixel_y = -17 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"mn" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"mr" = ( +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"mv" = ( +/obj/structure/stone_tile/block/burnt{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile/burnt{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile/burnt, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"mM" = ( +/obj/structure/stone_tile/surrounding, +/obj/structure/fluff/drake_statue, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"nh" = ( +/turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, +/area/overmap_encounter/planetoid/lava/explored) +"nk" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"nq" = ( +/obj/structure/stone_tile/surrounding, +/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"nz" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 5 + }, +/obj/item/stack/ore/gold, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"nP" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/center/burnt{ + fall_on_cross = 1; + pixel_y = 6 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"nX" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"oi" = ( +/obj/structure/stone_tile{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"ol" = ( +/obj/structure/stone_tile/center/burnt{ + fall_on_cross = 1; + pixel_y = 8; + pixel_x = -8 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"om" = ( +/obj/structure/table_frame/wood, +/obj/item/reagent_containers/food/snacks/grown/ash_flora/fireblossom, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"on" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"oH" = ( +/obj/structure/stone_tile/surrounding, +/obj/structure/stone_tile/center/cracked, +/obj/structure/destructible/tribal_torch{ + pixel_y = 14 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"oL" = ( +/obj/structure/stone_tile/center/burnt{ + fall_on_cross = 1; + pixel_x = 9; + pixel_y = 8 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"pu" = ( +/mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient, +/turf/open/floor/plating/moss, +/area/ruin/unpowered/buried_shrine) +"pK" = ( +/obj/structure/stone_tile/slab, +/mob/living/simple_animal/hostile/asteroid/brimdemon, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"qh" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding/cracked{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"qi" = ( +/obj/structure/stone_tile/surrounding, +/obj/structure/stone_tile/center/cracked, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"qp" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 9 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 6 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"qt" = ( +/obj/structure/stone_tile/center/cracked, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"qw" = ( +/obj/structure/stone_tile/block/burnt{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile/burnt, +/obj/structure/stone_tile/surrounding_tile/burnt{ + dir = 8 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"qO" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 5 + }, +/obj/structure/chair/wood, +/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"qT" = ( +/obj/structure/stone_tile/center/burnt{ + fall_on_cross = 1; + pixel_x = -7; + pixel_y = 3 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"qV" = ( +/obj/structure/destructible/tribal_torch, +/obj/structure/stone_tile/slab, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"rh" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, +/area/overmap_encounter/planetoid/lava/explored) +"rk" = ( +/obj/structure/stone_tile/slab/cracked, +/obj/item/pickaxe/rusted{ + pixel_x = 3 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"rp" = ( +/obj/structure/stone_tile/surrounding, +/obj/structure/stone_tile/center, +/obj/item/clothing/suit/hooded/cloak/bone{ + pixel_y = -4 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"rt" = ( +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/item/stack/sheet/bone, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, +/area/ruin/unpowered/buried_shrine) +"rA" = ( +/obj/structure/flora/ash/cacti, +/turf/open/floor/plating/moss, +/area/ruin/unpowered/buried_shrine) +"rD" = ( +/obj/structure/stone_tile/center/burnt{ + fall_on_cross = 1; + pixel_x = 9 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"rH" = ( +/turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, +/area/overmap_encounter/planetoid/cave/explored) +"rM" = ( +/obj/structure/stone_tile/center/burnt{ + fall_on_cross = 1; + pixel_y = -6 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"rP" = ( +/obj/structure/flora/ash/leaf_shroom, +/turf/open/floor/plating/moss, +/area/overmap_encounter/planetoid/lava/explored) +"su" = ( +/obj/item/stack/ore/gold, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"sv" = ( +/obj/structure/flora/ash/tall_shroom, +/turf/open/floor/plating/moss, +/area/ruin/unpowered/buried_shrine) +"sy" = ( +/obj/structure/stone_tile/center/burnt{ + fall_on_cross = 1; + pixel_x = 6; + pixel_y = -8 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"sB" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 5 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"sD" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"sJ" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 6 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"sL" = ( +/obj/structure/stone_tile/center/burnt{ + fall_on_cross = 1; + pixel_y = -1 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"sS" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 4 + }, +/obj/item/stack/sheet/mineral/wood, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"ta" = ( +/obj/structure/stone_tile/block, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"td" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 5 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"tA" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, +/area/overmap_encounter/planetoid/lava/explored) +"tE" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/glass/mortar/mushroom{ + pixel_x = -5 + }, +/obj/item/pestle{ + pixel_y = 5 + }, +/obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_stem{ + pixel_x = -11; + pixel_y = 10 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"tL" = ( +/obj/structure/stone_tile/slab, +/obj/structure/destructible/tribal_torch, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"uf" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 10 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"uK" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"uN" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/item/stack/ore/gold, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"uP" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/center, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"uS" = ( +/obj/structure/table_frame/wood, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"vg" = ( +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"vi" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/glass/bottle/potion, +/obj/item/reagent_containers/glass/bottle/potion{ + pixel_x = -10; + pixel_y = 9 + }, +/obj/item/reagent_containers/glass/bottle/potion{ + pixel_x = 10; + pixel_y = 9 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"vo" = ( +/obj/structure/table/wood, +/obj/item/gun/ballistic/bow/ashen, +/obj/structure/stone_tile/slab, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"vJ" = ( +/obj/structure/flora/ash/stem_shroom, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"vO" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/center/burnt, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"vR" = ( +/obj/item/stack/sheet/bone, +/obj/structure/stone_tile/slab/cracked{ + dir = 5 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"wj" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"wl" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"wt" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 4 + }, +/mob/living/simple_animal/hostile/asteroid/brimdemon, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"wy" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile/block/cracked{ + dir = 6 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"wM" = ( +/obj/structure/stone_tile/slab, +/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"wS" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 4 + }, +/turf/closed/mineral/random/volcanic, +/area/ruin/unpowered/buried_shrine) +"xe" = ( +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, +/area/overmap_encounter/planetoid/lava/explored) +"xs" = ( +/obj/structure/stone_tile/block/burnt{ + dir = 4 + }, +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"xJ" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/structure/stone_tile/block/cracked{ + dir = 10 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"xT" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/obj/structure/chair/wood, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"yb" = ( +/obj/structure/stone_tile/center/burnt{ + fall_on_cross = 1; + pixel_y = 6; + pixel_x = -4 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"yt" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 5 + }, +/obj/structure/stone_tile/center, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"yv" = ( +/obj/structure/stone_tile/surrounding, +/obj/item/stack/ore/gold, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"yy" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"yz" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"yF" = ( +/obj/structure/flora/ausbushes/fullgrass/hell, +/turf/open/floor/plating/grass/lava, +/area/ruin/unpowered/buried_shrine) +"yJ" = ( +/turf/open/floor/plating/grass/lava/orange, +/area/overmap_encounter/planetoid/lava/explored) +"yM" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"zg" = ( +/obj/structure/stone_tile, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"zB" = ( +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 6 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"zL" = ( +/obj/structure/flora/rock/lava, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, +/area/overmap_encounter/planetoid/lava/explored) +"zM" = ( +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/item/stack/ore/gold, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"zN" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/stone_tile/block{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"zQ" = ( +/obj/structure/stone_tile/surrounding_tile/burnt{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile/burnt, +/obj/structure/stone_tile/surrounding_tile/burnt{ + dir = 4 + }, +/obj/structure/stone_tile/center/burnt, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Ab" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Ad" = ( +/obj/structure/stone_tile/slab, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Aw" = ( +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Ay" = ( +/obj/structure/flora/ausbushes/fernybush/hell, +/turf/open/floor/plating/grass/lava/orange, +/area/overmap_encounter/planetoid/lava/explored) +"AY" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/obj/item/stack/ore/gold, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Ba" = ( +/obj/structure/stone_tile/block/burnt{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 5 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Bc" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/block/cracked{ + dir = 10 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Bm" = ( +/obj/structure/stone_tile/center/burnt{ + fall_on_cross = 1; + pixel_y = 4 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Bz" = ( +/obj/structure/table_frame/wood, +/obj/item/stack/sheet/bone, +/obj/structure/stone_tile/slab, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"BA" = ( +/obj/structure/destructible/tribal_torch{ + pixel_y = 13 + }, +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding/cracked{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"BF" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 6 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"BZ" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Cm" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 5 + }, +/obj/structure/stone_tile/center/burnt, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Cv" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 4 + }, +/obj/item/chair/wood/wings{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"CD" = ( +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"CE" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"CF" = ( +/obj/structure/chair/pew/left{ + dir = 1 + }, +/obj/structure/stone_tile/slab, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"CM" = ( +/obj/structure/stone_tile/center, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"CT" = ( +/obj/structure/table/wood, +/obj/item/candle, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"CU" = ( +/mob/living/simple_animal/hostile/asteroid/goliath/pup{ + pixel_x = 0 + }, +/turf/open/floor/plating/moss, +/area/ruin/unpowered/buried_shrine) +"Do" = ( +/obj/structure/flora/ausbushes/hell, +/turf/open/floor/plating/grass/lava/orange, +/area/overmap_encounter/planetoid/lava/explored) +"Dp" = ( +/obj/structure/flora/ash/fireblossom, +/turf/open/floor/plating/grass/lava/orange, +/area/overmap_encounter/planetoid/lava/explored) +"DB" = ( +/obj/structure/flora/ausbushes/fullgrass/hell, +/turf/open/floor/plating/grass/lava/orange, +/area/overmap_encounter/planetoid/lava/explored) +"Ee" = ( +/obj/structure/chair/pew/left, +/obj/structure/stone_tile/slab, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Ef" = ( +/obj/structure/flora/ash/fern, +/turf/open/floor/plating/moss, +/area/overmap_encounter/planetoid/cave/explored) +"Eh" = ( +/turf/closed/mineral/random/volcanic, +/area/overmap_encounter/planetoid/lava/explored) +"Eu" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 5 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 6 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Ez" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"EE" = ( +/obj/structure/stone_tile/center/burnt, +/obj/structure/stone_tile/surrounding/burnt, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Fo" = ( +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Fq" = ( +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Fw" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 1 + }, +/obj/structure/chair/wood/wings, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"FC" = ( +/obj/item/reagent_containers/food/snacks/grown/apple{ + pixel_y = 16 + }, +/turf/open/floor/plating/grass/lava, +/area/ruin/unpowered/buried_shrine) +"FD" = ( +/obj/structure/stone_tile/center/burnt{ + fall_on_cross = 1; + pixel_x = 1 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Gm" = ( +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile/block/cracked{ + dir = 9 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Go" = ( +/obj/structure/stone_tile/surrounding_tile/cracked, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"GB" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/effect/decal/cleanable/ash{ + pixel_x = -8 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"GL" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/obj/structure/stone_tile/block/cracked, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"GT" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Hg" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 4 + }, +/obj/item/stack/ore/gold, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Hh" = ( +/obj/structure/stone_tile/surrounding_tile, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Ht" = ( +/obj/structure/stone_tile/surrounding/cracked, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Hv" = ( +/obj/structure/flora/tree/dead/hell, +/turf/open/floor/plating/grass/lava, +/area/ruin/unpowered/buried_shrine) +"Hw" = ( +/obj/structure/stone_tile/center/burnt{ + fall_on_cross = 1; + pixel_y = 6 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"HN" = ( +/obj/structure/stone_tile/center/burnt{ + fall_on_cross = 1; + pixel_x = -3 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Ii" = ( +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, +/area/ruin/unpowered/buried_shrine) +"Iz" = ( +/obj/structure/destructible/tribal_torch{ + pixel_y = 14 + }, +/obj/structure/stone_tile/surrounding/cracked, +/obj/structure/stone_tile/center, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"IL" = ( +/obj/structure/stone_tile/slab/cracked, +/obj/item/stack/sheet/mineral/wood, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Ja" = ( +/obj/structure/stone_tile/center/burnt{ + fall_on_cross = 1; + pixel_y = 2; + pixel_x = 7 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Jc" = ( +/obj/structure/stone_tile/block/burnt{ + dir = 8 + }, +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Jh" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 9 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Jk" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, +/area/overmap_encounter/planetoid/lava/explored) +"Jr" = ( +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, +/area/overmap_encounter/planetoid/lava/explored) +"Jv" = ( +/mob/living/simple_animal/hostile/asteroid/goliath/pup{ + pixel_x = 0 + }, +/obj/structure/flora/ausbushes/sparsegrass/hell, +/turf/open/floor/plating/moss, +/area/ruin/unpowered/buried_shrine) +"Jw" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile/block{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"JE" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 1 + }, +/obj/item/stack/ore/gold, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"JJ" = ( +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"JL" = ( +/obj/structure/flora/ausbushes/ywflowers/hell, +/turf/open/floor/plating/grass/lava/orange, +/area/overmap_encounter/planetoid/lava/explored) +"Ka" = ( +/obj/structure/stone_tile/surrounding_tile/burnt{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile/burnt, +/obj/structure/stone_tile/surrounding_tile/burnt{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile/burnt{ + dir = 4 + }, +/obj/structure/stone_tile/center/burnt, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Kt" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Kz" = ( +/obj/structure/flora/ash/cap_shroom, +/turf/open/floor/plating/moss, +/area/overmap_encounter/planetoid/cave/explored) +"KD" = ( +/obj/structure/stone_tile/cracked, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, +/area/overmap_encounter/planetoid/lava/explored) +"Lu" = ( +/obj/structure/flora/ash/leaf_shroom, +/turf/open/floor/plating/moss, +/area/overmap_encounter/planetoid/cave/explored) +"Lx" = ( +/obj/structure/stone_tile/center/burnt{ + fall_on_cross = 1; + pixel_y = 1; + pixel_x = 4 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"LC" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"LJ" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/grown/ambrosia/gaia{ + pixel_y = 6 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"LK" = ( +/turf/open/floor/plating/moss, +/area/overmap_encounter/planetoid/lava/explored) +"LL" = ( +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, +/area/overmap_encounter/planetoid/lava/explored) +"LP" = ( +/obj/structure/table/wood, +/obj/item/ammo_casing/caseless/arrow/bone, +/obj/item/ammo_casing/caseless/arrow/bone{ + pixel_y = -4 + }, +/obj/item/ammo_casing/caseless/arrow/bone{ + pixel_y = 4 + }, +/obj/item/ammo_casing/caseless/arrow/bone{ + pixel_y = 8 + }, +/obj/item/ammo_casing/caseless/arrow/bone{ + pixel_y = 12 + }, +/obj/structure/stone_tile/slab, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"LW" = ( +/obj/structure/destructible/tribal_torch{ + pixel_y = 13 + }, +/obj/structure/stone_tile/surrounding, +/obj/structure/stone_tile/center/cracked, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"LZ" = ( +/obj/structure/stone_tile/center/burnt{ + fall_on_cross = 1; + pixel_y = 5; + pixel_x = 6 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Mc" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile/slab, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Md" = ( +/obj/structure/stone_tile/surrounding_tile/cracked, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, +/area/overmap_encounter/planetoid/lava/explored) +"Mt" = ( +/obj/structure/flora/ausbushes/genericbush/hell, +/turf/open/floor/plating/grass/lava, +/area/ruin/unpowered/buried_shrine) +"Mw" = ( +/obj/structure/stone_tile/center/burnt{ + fall_on_cross = 1; + pixel_x = -7; + pixel_y = -8 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Mx" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"MJ" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 8 + }, +/obj/item/stack/ore/gold, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"MQ" = ( +/turf/template_noop, +/area/template_noop) +"Ni" = ( +/obj/structure/table/wood, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Nk" = ( +/obj/structure/table_frame/wood, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"NK" = ( +/obj/structure/flora/ash/cacti, +/turf/open/floor/plating/grass/lava, +/area/ruin/unpowered/buried_shrine) +"NN" = ( +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding/cracked{ + dir = 5 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"NY" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 9 + }, +/obj/structure/stone_tile/block/cracked, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Ok" = ( +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/item/stack/ore/gold, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Ot" = ( +/obj/structure/stone_tile/center/burnt{ + fall_on_cross = 1; + pixel_y = 8; + pixel_x = -1 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"OO" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding/cracked{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"OT" = ( +/obj/structure/flora/ausbushes/fullgrass/hell, +/turf/open/floor/plating/moss, +/area/overmap_encounter/planetoid/lava/explored) +"Ps" = ( +/obj/structure/flora/rock/hell, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, +/area/overmap_encounter/planetoid/cave/explored) +"Qb" = ( +/obj/structure/flora/ausbushes/sparsegrass/hell, +/turf/open/floor/plating/grass/lava, +/area/ruin/unpowered/buried_shrine) +"Qf" = ( +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"QR" = ( +/obj/structure/flora/tree/dead/tall/grey, +/turf/open/floor/plating/grass/lava/orange, +/area/overmap_encounter/planetoid/lava/explored) +"Rd" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, +/area/ruin/unpowered/buried_shrine) +"Rl" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"RK" = ( +/obj/structure/stone_tile/center/cracked, +/mob/living/simple_animal/hostile/asteroid/brimdemon, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"RN" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Sa" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, +/area/overmap_encounter/planetoid/lava/explored) +"Sj" = ( +/obj/structure/flora/ausbushes/sparsegrass/hell, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, +/area/overmap_encounter/planetoid/lava/explored) +"Sn" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/grown/ash_flora/fireblossom, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"So" = ( +/obj/structure/stone_tile/block/cracked, +/obj/structure/stone_tile/block/cracked{ + dir = 5 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Sw" = ( +/obj/structure/stone_tile/center/burnt{ + fall_on_cross = 1; + pixel_x = -9 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"SA" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/glass/bowl/mushroom_bowl, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"SJ" = ( +/obj/structure/stone_tile/center/burnt{ + fall_on_cross = 1; + pixel_y = 2; + pixel_x = 4 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"SV" = ( +/obj/structure/chair/pew/right{ + dir = 1 + }, +/obj/structure/stone_tile/slab, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Td" = ( +/obj/structure/stone_tile/slab/cracked, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Tp" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, +/area/ruin/unpowered/buried_shrine) +"Tu" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/obj/item/chair/wood{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Ty" = ( +/obj/item/stack/sheet/bluespace_crystal/five{ + pixel_x = -7 + }, +/obj/item/stack/sheet/mineral/gold/five{ + pixel_y = 3 + }, +/obj/item/stack/sheet/mineral/diamond/five{ + pixel_x = 8 + }, +/obj/structure/closet/crate/necropolis, +/obj/structure/stone_tile/slab/cracked{ + dir = 5 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"TO" = ( +/turf/closed/mineral/random/volcanic, +/area/ruin/unpowered/buried_shrine) +"Ua" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/obj/effect/decal/cleanable/ash{ + pixel_x = 6; + pixel_y = 11 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Uf" = ( +/obj/structure/chair/pew, +/obj/structure/stone_tile/slab, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Uw" = ( +/obj/structure/flora/ausbushes/sparsegrass/hell, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, +/area/overmap_encounter/planetoid/cave/explored) +"UB" = ( +/obj/structure/flora/ausbushes/genericbush/hell, +/obj/item/reagent_containers/food/snacks/grown/apple{ + pixel_x = -10; + pixel_y = -6 + }, +/turf/open/floor/plating/grass/lava, +/area/ruin/unpowered/buried_shrine) +"UF" = ( +/obj/structure/stone_tile/block, +/obj/item/claymore/bone{ + pixel_x = 8; + pixel_y = 21 + }, +/obj/item/shield/riot/goliath{ + pixel_x = -12; + pixel_y = 16 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Vt" = ( +/obj/structure/flora/ash/leaf_shroom, +/turf/open/floor/plating/moss, +/area/ruin/unpowered/buried_shrine) +"VG" = ( +/obj/structure/table/wood, +/obj/item/kitchen/knife/combat/bone, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Wd" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 5 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Ws" = ( +/turf/open/floor/plating/moss, +/area/ruin/unpowered/buried_shrine) +"WD" = ( +/obj/structure/flora/tree/dead/barren, +/turf/open/floor/plating/grass/lava/orange, +/area/overmap_encounter/planetoid/lava/explored) +"WG" = ( +/obj/structure/stone_tile/slab/burnt, +/obj/item/gem/amber, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"WP" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, +/area/overmap_encounter/planetoid/lava/explored) +"WZ" = ( +/turf/closed/indestructible/riveted/boss, +/area/ruin/unpowered/buried_shrine) +"Xh" = ( +/obj/structure/flora/ash/cap_shroom, +/turf/open/floor/plating/moss, +/area/ruin/unpowered/buried_shrine) +"Xn" = ( +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, +/area/ruin/unpowered/buried_shrine) +"Xr" = ( +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, +/area/ruin/unpowered/buried_shrine) +"Xv" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/center, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"XA" = ( +/turf/closed/indestructible/riveted/boss, +/area/overmap_encounter/planetoid/cave/explored) +"Ye" = ( +/obj/structure/chair/pew/right, +/obj/structure/stone_tile/slab, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Yf" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 9 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Yh" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Yp" = ( +/obj/structure/stone_tile/center/burnt{ + fall_on_cross = 1; + pixel_y = -7; + pixel_x = -4 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"YK" = ( +/obj/structure/flora/ausbushes/sparsegrass/hell, +/turf/open/floor/plating/moss, +/area/ruin/unpowered/buried_shrine) +"Zk" = ( +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Zl" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/stone_tile/center/burnt{ + fall_on_cross = 1; + pixel_y = -8 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"Zo" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 10 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"ZE" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/center/burnt, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"ZK" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/obj/structure/stone_tile, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_shrine) +"ZV" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, +/area/ruin/unpowered/buried_shrine) +"ZX" = ( +/obj/structure/stone_tile/center/burnt{ + fall_on_cross = 1; + pixel_y = 7; + pixel_x = 9 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/ruin/unpowered/buried_shrine) + +(1,1,1) = {" +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +nh +nh +nh +nh +nh +nh +nh +nh +nh +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +"} +(2,1,1) = {" +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +nh +nh +nh +MQ +MQ +MQ +nh +jt +Eh +Eh +lO +LK +aD +nh +LK +Sj +nh +nh +jt +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +"} +(3,1,1) = {" +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +jt +nh +nh +nh +nh +nh +nh +nh +Eh +Eh +gt +dF +jJ +nh +nh +nh +nh +LK +nh +nh +nh +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +"} +(4,1,1) = {" +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +nh +nh +nh +aD +nh +nh +nh +nh +aD +nh +nh +Eh +dF +lo +dF +dF +aP +dF +LK +nh +aD +nh +Sj +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +"} +(5,1,1) = {" +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +nh +nh +lO +nh +nh +lO +Eh +Eh +nh +nh +Eh +Eh +Eh +Eh +dF +aP +dF +dF +jJ +dF +lO +LK +lO +nh +nh +MQ +MQ +nh +nh +nh +nh +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +"} +(6,1,1) = {" +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +nh +nh +nh +aD +nh +nh +LK +nh +nh +Eh +nh +Sj +nh +Eh +Eh +Eh +Eh +Eh +Eh +Kz +dF +dF +Eh +Eh +Eh +Eh +nh +nh +nh +nh +nh +nh +aD +nh +nh +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +"} +(7,1,1) = {" +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +nh +Eh +Eh +nh +Sj +nh +nh +LK +rP +LK +Eh +Eh +nh +Eh +Eh +Eh +Eh +Eh +Eh +Eh +Eh +lo +dF +jJ +Eh +Eh +Eh +Eh +aD +nh +Sj +nh +Eh +nh +Sj +nh +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +"} +(8,1,1) = {" +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +jt +nh +Eh +nh +nh +nh +nh +Eh +dF +aP +aP +dF +Eh +Eh +Eh +Eh +Eh +Eh +Eh +Eh +Eh +Eh +dF +dF +dF +Eh +Eh +Eh +Eh +Eh +nh +Eh +Eh +Eh +nh +nh +jt +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +"} +(9,1,1) = {" +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +nh +nh +Eh +Eh +jt +nh +Eh +Eh +lo +dF +Kz +dF +Eh +Eh +Eh +WZ +WZ +WZ +WZ +WZ +Eh +Eh +gt +aP +dF +Ef +Eh +Eh +Eh +Eh +nh +Eh +Eh +nh +nh +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +"} +(10,1,1) = {" +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +nh +Sj +nh +Eh +Eh +Eh +Eh +dF +dF +dF +aP +Eh +Eh +WZ +WZ +WZ +vg +vg +vg +WZ +WZ +WZ +Eh +Eh +lo +aP +Kz +Eh +Eh +Eh +Eh +Eh +nh +aD +nh +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +"} +(11,1,1) = {" +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +nh +nh +nh +Eh +Eh +Eh +jJ +aP +aP +dF +Eh +Eh +WZ +WZ +vg +vg +vg +yF +hp +Qb +TO +WZ +WZ +Eh +jJ +dF +lo +Eh +Eh +Eh +Eh +Eh +nh +nh +nh +nh +nh +nh +MQ +MQ +MQ +MQ +MQ +MQ +MQ +"} +(12,1,1) = {" +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +nh +aD +Eh +Eh +XA +Ef +dF +lo +dF +Eh +Eh +WZ +WZ +TO +hp +eI +be +jo +Mt +TO +TO +TO +WZ +WZ +Eh +dF +dF +dF +Eh +Eh +Eh +Eh +Eh +Eh +Eh +jt +nh +nh +nh +MQ +MQ +MQ +MQ +MQ +MQ +"} +(13,1,1) = {" +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +nh +nh +nh +Eh +XA +XA +dF +dF +aP +gt +Eh +Eh +WZ +TO +Qb +Mt +eI +Hv +FC +Qb +hp +NK +TO +vg +WZ +Eh +Eh +aP +lo +Eh +Eh +Eh +Eh +Eh +Eh +Eh +Eh +Sj +nh +nh +MQ +MQ +MQ +MQ +MQ +MQ +"} +(14,1,1) = {" +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +Sj +nh +nh +Eh +XA +lo +aP +dF +dF +Eh +Eh +Eh +WZ +TO +NK +WZ +WZ +UB +Qb +yF +WZ +WZ +Td +vg +WZ +Eh +Eh +dF +gt +dF +Eh +Eh +Eh +Eh +Eh +Eh +Eh +nh +aD +nh +MQ +MQ +MQ +MQ +MQ +MQ +"} +(15,1,1) = {" +MQ +MQ +MQ +MQ +MQ +nh +nh +nh +nh +nh +nh +nh +Sj +dF +dF +dF +Kz +dF +Eh +Eh +WZ +WZ +TO +TO +WZ +WZ +TO +TO +hp +WZ +WZ +cN +vg +WZ +WZ +Eh +Eh +dF +aP +Eh +Eh +Eh +Eh +XA +XA +Eh +Eh +nh +nh +MQ +MQ +MQ +MQ +MQ +MQ +"} +(16,1,1) = {" +MQ +MQ +MQ +MQ +nh +nh +Eh +Eh +jt +nh +Eh +Eh +Eh +jJ +lo +dF +XA +XA +Eh +Eh +WZ +vg +TO +TO +TO +TO +TO +TO +Qb +TO +TO +hn +vg +vg +WZ +Eh +Eh +XA +XA +Eh +Eh +Eh +Eh +Eh +XA +XA +Eh +nh +nh +MQ +MQ +MQ +MQ +MQ +MQ +"} +(17,1,1) = {" +MQ +MQ +MQ +MQ +MQ +nh +nh +Eh +Eh +Eh +Eh +Eh +XA +dF +dF +aP +XA +XA +Eh +Eh +WZ +vg +on +Fq +Ht +TO +TO +TO +TO +TO +Wd +Fq +cN +vg +WZ +Eh +Eh +XA +XA +Eh +Eh +Eh +Eh +Eh +gt +XA +nh +nh +nh +jt +MQ +MQ +MQ +MQ +MQ +"} +(18,1,1) = {" +MQ +MQ +MQ +MQ +MQ +MQ +nh +nh +Eh +Eh +XA +XA +XA +dF +Lu +dF +Eh +Eh +Eh +Eh +WZ +vg +hn +cN +Fq +yz +TO +TO +TO +TO +TO +TO +TO +vg +WZ +Eh +Eh +Eh +Eh +Eh +Eh +Eh +Eh +Eh +aP +XA +XA +nh +Sj +nh +MQ +MQ +MQ +MQ +MQ +"} +(19,1,1) = {" +MQ +MQ +MQ +nh +nh +nh +nh +jt +Eh +XA +XA +aP +dF +dF +dF +Eh +Eh +Eh +Eh +Eh +WZ +WZ +WZ +WZ +Td +TO +TO +TO +TO +TO +TO +WZ +WZ +WZ +WZ +Eh +Eh +Eh +Eh +Eh +Eh +Eh +Eh +Eh +lo +jJ +XA +aD +nh +nh +MQ +MQ +MQ +MQ +MQ +"} +(20,1,1) = {" +MQ +MQ +MQ +aD +nh +Eh +nh +Eh +Eh +XA +lo +dF +aP +dF +Eh +Eh +Eh +Eh +WZ +WZ +WZ +me +Ab +WZ +WZ +WZ +TO +TO +TO +WZ +WZ +WZ +me +Ab +WZ +WZ +WZ +Eh +Eh +Eh +Eh +Eh +Eh +Eh +dF +aP +XA +XA +nh +nh +nh +MQ +MQ +MQ +MQ +"} +(21,1,1) = {" +MQ +MQ +MQ +nh +Sj +Eh +Eh +Eh +XA +XA +Kz +dF +dF +Eh +Eh +Eh +Eh +Eh +TO +on +lJ +RN +wj +WZ +TO +TO +TO +Fq +Tp +Mx +CF +WZ +RN +wj +ta +oi +WZ +WZ +Eh +Eh +Eh +Eh +Eh +Eh +lo +dF +aP +XA +nh +nh +nh +MQ +MQ +MQ +MQ +"} +(22,1,1) = {" +MQ +MQ +jt +nh +nh +nh +Eh +Eh +XA +dF +dF +aP +jJ +Eh +Eh +Eh +Eh +TO +TO +BF +oi +wl +wl +WZ +IL +ta +Wd +Xr +Tp +lJ +ii +WZ +wl +wl +yz +Ad +OO +WZ +WZ +Eh +Eh +Eh +Eh +Eh +Eh +Ef +aP +XA +nh +nh +nh +MQ +MQ +MQ +MQ +"} +(23,1,1) = {" +MQ +MQ +nh +nh +nh +Eh +Eh +Eh +XA +dF +dF +dF +Eh +Eh +Eh +Eh +Eh +TO +qh +JJ +Rl +yz +WZ +WZ +sS +df +Ii +sB +Td +lJ +SV +WZ +WZ +lJ +Ad +nq +Ad +TO +WZ +WZ +Eh +Eh +Eh +Eh +Eh +gt +lo +XA +Sj +nh +jt +nh +MQ +MQ +MQ +"} +(24,1,1) = {" +MQ +MQ +nh +nh +Eh +Eh +Eh +jJ +lo +aP +dF +Eh +Eh +Eh +Eh +Eh +Eh +TO +Qf +Ad +JJ +TO +WZ +BA +Wd +Tp +yz +Ad +JE +Ii +on +kJ +WZ +oi +on +Ad +yz +TO +TO +WZ +Eh +Eh +Eh +Eh +Eh +Eh +dF +lo +nh +lO +nh +Sj +MQ +MQ +MQ +"} +(25,1,1) = {" +MQ +MQ +nh +LK +Eh +Eh +aP +dF +dF +gt +Eh +Eh +Eh +Eh +WZ +WZ +WZ +TO +Ht +Aw +Ad +TO +WZ +TO +BF +vJ +Ad +cA +Ad +yz +Fq +Fq +WZ +Aw +Fq +ff +Fo +WZ +WZ +WZ +WZ +Eh +Eh +Eh +Eh +Eh +dF +dF +nh +nh +nh +nh +MQ +MQ +MQ +"} +(26,1,1) = {" +MQ +nh +nh +lO +Lu +dF +dF +aP +Eh +Eh +Eh +Eh +Eh +Eh +WZ +ld +WZ +WZ +WZ +yz +Fq +TO +TO +TO +Xr +Ht +Td +pK +on +Ii +Tp +Xr +Fq +kW +BZ +kW +CE +WZ +uS +Sn +WZ +Eh +Eh +Eh +Eh +Eh +aP +dF +LK +nh +aD +nh +MQ +MQ +MQ +"} +(27,1,1) = {" +MQ +aD +nh +nh +dF +lo +dF +Eh +Eh +dD +dD +Eh +Eh +Eh +WZ +Fq +ta +kW +td +kZ +Td +TO +TO +TO +TO +Tp +hn +Ii +Ht +Tp +Hg +BF +Ii +Ad +Ad +Ad +TO +WZ +zg +CE +WZ +Eh +Eh +Eh +XA +XA +Kz +aP +nh +lO +nh +nh +MQ +MQ +MQ +"} +(28,1,1) = {" +MQ +nh +nh +nh +aP +Kz +Eh +Eh +Eh +dD +dD +Eh +Eh +WZ +WZ +Td +lJ +nz +jy +hn +CE +WZ +WZ +TO +TO +TO +Wd +GL +Ad +Fq +Xr +Ii +WZ +WZ +TO +TO +TO +TO +Aw +nk +WZ +WZ +Eh +Eh +XA +XA +lo +Eh +Eh +aD +nh +nh +nh +MQ +MQ +"} +(29,1,1) = {" +MQ +nh +Sj +nh +aP +Eh +Eh +Eh +Eh +Eh +Eh +Eh +Eh +WZ +CT +Fq +jy +wl +lJ +fq +WZ +WZ +WZ +WZ +WZ +TO +BF +qi +TO +wS +WZ +WZ +WZ +WZ +WZ +TO +TO +Ad +ta +zg +Fo +WZ +Eh +Eh +Eh +Eh +Eh +Eh +nh +nh +nh +jI +jt +MQ +MQ +"} +(30,1,1) = {" +MQ +nh +nh +LK +dF +Eh +Eh +Eh +Eh +Eh +Eh +Eh +Eh +WZ +Nk +Fq +TO +TO +TO +WZ +WZ +tE +vi +qp +WZ +WZ +Ad +Fq +TO +WZ +WZ +iK +GB +nX +WZ +WZ +Fq +Wd +ta +oi +Fq +WZ +Eh +Eh +Eh +Eh +nh +aD +nh +nh +nh +nh +nh +nh +MQ +"} +(31,1,1) = {" +nh +nh +LK +OT +Eh +Eh +Eh +Eh +Eh +WZ +WZ +WZ +WZ +WZ +WZ +WZ +TO +TO +WZ +WZ +WZ +Td +ic +xJ +TO +WZ +Ad +Bc +yz +WZ +TO +Ua +rp +UF +WZ +WZ +WZ +Ad +BF +WZ +WZ +WZ +WZ +WZ +WZ +WZ +Sj +nh +jI +Sj +nh +nh +Sj +nh +MQ +"} +(32,1,1) = {" +nh +nh +lO +Eh +Eh +Eh +Eh +Eh +WZ +WZ +Ad +Ad +cD +WZ +yy +TO +TO +Fq +wl +CD +WZ +So +ZE +vg +TO +WZ +Ba +vO +Jc +WZ +TO +zQ +fY +Hh +WZ +Go +ch +Mc +sD +Fq +TO +WZ +TO +TO +zB +WZ +WZ +jt +nh +Jk +nh +aD +nh +nh +MQ +"} +(33,1,1) = {" +jt +Sj +Sj +Eh +Eh +Eh +Eh +WZ +WZ +yy +Cv +Ni +lJ +WZ +ta +su +Mx +uP +ta +AY +WZ +WZ +Mw +FD +oL +WZ +vg +jY +vg +WZ +vg +Hw +TO +WZ +WZ +Ht +kW +nP +iL +Fq +TO +WZ +TO +yz +Yf +fx +WZ +WZ +rh +xe +dD +nh +nh +nh +Sj +"} +(34,1,1) = {" +nh +nh +aD +nh +Eh +Eh +Eh +WZ +Ad +xT +SA +Nk +sJ +Ad +wy +kW +yz +Ad +hn +kW +ZK +WZ +TO +vg +dA +vg +vg +dX +gW +Ja +SJ +HN +ZX +WZ +qw +wl +qt +mn +lJ +Fq +rk +fh +Ad +GT +Ad +on +Rd +ta +tA +WP +Sa +Jr +nh +nh +nh +"} +(35,1,1) = {" +nh +nh +nh +Eh +Eh +ee +Eh +WZ +dQ +qO +cv +LJ +ta +NN +ta +Xv +Ad +mM +Ad +yt +lJ +WZ +TO +vg +dX +Sw +rD +EE +vg +vg +vg +vg +LZ +WZ +Ka +dB +RK +uP +di +zN +Ad +Td +Ad +BF +yz +td +Ht +ZV +kt +ha +ha +Sj +nh +nh +nh +"} +(36,1,1) = {" +Sj +nh +Eh +Eh +ee +ee +ee +WZ +Wd +Tu +Nk +VG +uf +Td +Zk +wl +Td +Ad +yz +wl +gE +WZ +vg +vg +qT +TO +vg +Bm +vg +vg +sy +kC +em +WZ +mv +kW +CM +jy +lJ +TO +Ad +TO +Wd +wl +Ad +uK +wl +cn +Md +dn +dg +KD +nh +nh +nh +"} +(37,1,1) = {" +nh +nh +Eh +ee +ee +ee +ee +WZ +WZ +Yh +Fw +SA +lJ +WZ +ta +Fq +lJ +Xv +jy +lJ +WZ +WZ +TO +fL +ol +WZ +vg +rM +vg +WZ +sL +vg +vg +WZ +WZ +on +wl +bp +Zl +TO +TO +WZ +td +Td +td +qV +WZ +WZ +eJ +LL +dD +nh +Sj +nh +nh +"} +(38,1,1) = {" +nh +nh +Eh +Eh +nh +ee +ee +ee +WZ +WZ +yz +wM +tL +WZ +Yh +kW +Fq +vJ +kW +Gm +WZ +CE +Cm +yb +vg +WZ +xs +bY +iB +WZ +Yp +Lx +Ot +dS +WZ +Kt +Iz +ta +lJ +Fq +TO +WZ +hz +Fq +at +WZ +WZ +Eh +Eh +Eh +Eh +nh +nh +nh +MQ +"} +(39,1,1) = {" +MQ +nh +nh +nh +nh +zL +ee +ee +ee +WZ +WZ +WZ +WZ +WZ +WZ +WZ +MJ +Ht +WZ +WZ +WZ +on +JJ +vg +vg +WZ +Ad +NY +yz +WZ +vg +vg +vg +Hw +WZ +WZ +WZ +hn +Ad +WZ +WZ +WZ +WZ +WZ +WZ +WZ +Eh +Eh +Eh +Eh +jt +nh +nh +nh +MQ +"} +(40,1,1) = {" +MQ +nh +jt +nh +nh +nh +ee +ee +ee +Eh +Eh +Eh +Eh +WZ +Nk +wy +wl +wl +mr +WZ +WZ +Ty +yM +uf +WZ +WZ +hn +td +Ad +WZ +WZ +Eu +WG +hW +WZ +WZ +vJ +Ad +ta +Ok +JJ +WZ +Eh +Eh +Eh +Eh +Eh +Eh +nh +nh +nh +nh +nh +MQ +MQ +"} +(41,1,1) = {" +MQ +nh +nh +nh +Sj +nh +ee +ee +Eh +Eh +Eh +Eh +Eh +WZ +CT +Fq +uf +kW +Mx +BA +WZ +WZ +WZ +WZ +WZ +TO +Wd +ef +BF +TO +WZ +WZ +WZ +WZ +WZ +oH +uN +Wd +Yh +oi +nk +WZ +Eh +Eh +Eh +Eh +Eh +nh +nh +nh +aD +nh +nh +MQ +MQ +"} +(42,1,1) = {" +MQ +MQ +nh +nh +nh +nh +ee +ee +Eh +dD +dD +Eh +Eh +WZ +WZ +Td +lJ +wt +ta +TO +TO +WZ +WZ +TO +TO +TO +Ad +Jw +Ad +TO +TO +TO +WZ +WZ +Fq +nk +Td +yy +nk +oi +WZ +WZ +ee +Eh +dD +dD +jt +nh +Sj +nh +nh +nh +MQ +MQ +MQ +"} +(43,1,1) = {" +MQ +MQ +MQ +nh +nh +nh +ee +ee +ee +dD +dD +Eh +Eh +Eh +WZ +Yf +jy +LC +TO +TO +TO +TO +TO +TO +gH +Xr +zg +Tp +on +zM +Tp +TO +TO +Ad +Ad +Ad +Ez +WZ +JJ +mr +WZ +ee +ee +Eh +dD +dD +nh +nh +nh +jI +nh +nh +MQ +MQ +MQ +"} +(44,1,1) = {" +MQ +MQ +MQ +nh +jt +nh +zL +ee +ee +ee +Eh +Eh +Eh +Eh +WZ +om +WZ +WZ +WZ +TO +TO +BF +TO +Xr +uK +Fo +Ht +Ad +Td +Tp +Wd +TO +TO +TO +iw +wl +CE +WZ +dG +CT +WZ +ee +ee +ee +ee +fB +nh +nh +nh +nh +nh +MQ +MQ +MQ +MQ +"} +(45,1,1) = {" +MQ +MQ +MQ +Sj +nh +nh +nh +Eh +ee +ee +ee +Eh +Eh +Eh +WZ +WZ +WZ +TO +TO +TO +Wd +gH +WZ +su +Tp +yz +Ad +yv +Ad +Fo +Xr +TO +WZ +TO +CE +kW +Aw +WZ +WZ +WZ +WZ +ee +ee +ee +Sj +nh +jI +nh +nh +nh +nh +MQ +MQ +MQ +MQ +"} +(46,1,1) = {" +MQ +MQ +MQ +MQ +nh +nh +nh +Eh +Eh +ee +Eh +Eh +Eh +Eh +Eh +WZ +TO +TO +Zo +Ad +zg +on +WZ +fq +uK +JJ +yz +Ad +hn +Tp +Fq +LW +WZ +Aw +Ht +Ad +hn +TO +TO +WZ +ee +ee +ee +ee +zL +nh +nh +nh +nh +Sj +nh +MQ +MQ +MQ +MQ +"} +(47,1,1) = {" +MQ +MQ +MQ +MQ +MQ +nh +nh +nh +Eh +Eh +Eh +nh +Eh +Eh +Eh +WZ +WZ +Td +yz +hn +co +Wd +WZ +WZ +Ee +ta +yM +Fq +yz +lJ +CF +WZ +WZ +lJ +Ad +nq +TO +TO +WZ +WZ +ee +Eh +Eh +Eh +Eh +nh +nh +jt +nh +nh +nh +MQ +MQ +MQ +MQ +"} +(48,1,1) = {" +MQ +MQ +MQ +MQ +MQ +nh +nh +Sj +nh +nh +nh +nh +nh +Eh +Eh +Eh +WZ +WZ +Ad +Jh +nk +kW +kW +WZ +Uf +ta +BF +Tp +jM +lJ +ii +WZ +kW +gz +Td +Ad +TO +TO +Eh +Eh +Eh +Eh +Eh +Eh +Eh +Eh +Eh +Eh +nh +nh +nh +MQ +MQ +MQ +MQ +"} +(49,1,1) = {" +MQ +MQ +MQ +MQ +MQ +MQ +aD +nh +nh +MQ +MQ +MQ +nh +nh +Eh +Eh +Eh +WZ +WZ +Td +lJ +me +Ab +WZ +Ye +ta +hn +Xn +Ht +lJ +SV +WZ +me +Ab +ta +TO +TO +Eh +Eh +Eh +Eh +Eh +Eh +Eh +Eh +Eh +nh +Eh +nh +nh +MQ +MQ +MQ +MQ +MQ +"} +(50,1,1) = {" +MQ +MQ +MQ +MQ +MQ +MQ +MQ +nh +MQ +MQ +MQ +nh +nh +jt +Eh +Eh +Eh +Eh +WZ +WZ +WZ +RN +wj +WZ +WZ +WZ +vJ +Fq +Tp +WZ +WZ +WZ +RN +wj +WZ +WZ +WZ +Eh +Eh +Eh +Eh +Eh +Eh +nh +nh +nh +nh +nh +nh +MQ +MQ +MQ +MQ +MQ +MQ +"} +(51,1,1) = {" +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +nh +Sj +Eh +Eh +Eh +Eh +Eh +Eh +Eh +WZ +WZ +WZ +WZ +TO +Wd +Fq +BF +gH +hn +TO +WZ +WZ +WZ +WZ +Eh +Eh +Eh +Eh +Eh +Eh +Eh +nh +Sj +nh +aD +nh +nh +MQ +MQ +MQ +MQ +MQ +MQ +MQ +"} +(52,1,1) = {" +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +nh +nh +Eh +Eh +nh +Eh +Eh +Eh +Eh +Eh +WZ +Bz +TO +TO +TO +TO +Xr +hn +Xr +TO +TO +TO +Wd +kp +WZ +Eh +Eh +Eh +Eh +DB +yJ +Eh +Eh +nh +nh +nh +nh +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +"} +(53,1,1) = {" +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +nh +nh +nh +nh +nh +nh +Eh +XA +XA +Eh +Eh +WZ +eZ +vR +TO +TO +TO +TO +TO +TO +TO +TO +TO +TO +LP +WZ +Eh +Eh +dD +dD +bW +bW +Eh +Eh +aD +nh +nh +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +"} +(54,1,1) = {" +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +nh +aD +MQ +MQ +MQ +nh +Eh +XA +XA +Eh +Eh +WZ +Bz +Xr +TO +TO +TO +TO +TO +TO +TO +TO +TO +TO +vo +WZ +Eh +Eh +dD +dD +yJ +JL +Do +Eh +Eh +Eh +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +"} +(55,1,1) = {" +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +nh +Eh +Eh +rH +rH +Eh +WZ +WZ +BF +TO +WZ +WZ +TO +TO +TO +WZ +WZ +TO +TO +WZ +WZ +Eh +yJ +yJ +yJ +DB +Dp +yJ +yJ +Eh +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +"} +(56,1,1) = {" +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +nh +Eh +Eh +Ps +rH +Eh +Eh +WZ +rt +TO +WZ +WZ +Xh +YK +YK +WZ +WZ +TO +Fq +WZ +DB +yJ +bW +yJ +bW +bW +yJ +yJ +bW +yJ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +"} +(57,1,1) = {" +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +Sj +nh +nh +Eh +Eh +rH +rH +Eh +WZ +WZ +TO +TO +TO +Ws +YK +Jv +Ws +Xh +TO +TO +WZ +yJ +yJ +yJ +yJ +WD +yJ +bW +yJ +bW +DB +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +"} +(58,1,1) = {" +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +nh +nh +nh +Eh +Eh +rH +iX +Eh +Eh +WZ +TO +CU +sv +Ws +pu +sv +YK +YK +Vt +WZ +WZ +Dp +Do +bW +bW +yJ +Ay +JL +yJ +yJ +JL +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +"} +(59,1,1) = {" +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +nh +nh +nh +nh +Eh +rH +Uw +Eh +Eh +Eh +WZ +WZ +rA +Ws +Jv +YK +Ws +YK +CU +WZ +WZ +yJ +yJ +JL +yJ +DB +yJ +yJ +yJ +yJ +QR +yJ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +"} +(60,1,1) = {" +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +nh +jt +Sj +nh +nh +rH +rH +Eh +Eh +Eh +Eh +WZ +WZ +WZ +Vt +YK +rA +WZ +WZ +WZ +yJ +bW +yJ +yJ +yJ +yJ +yJ +yJ +yJ +DB +bW +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +"} +(61,1,1) = {" +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +nh +nh +nh +nh +nh +Eh +Eh +Eh +Eh +Eh +Eh +Eh +WZ +WZ +WZ +WZ +WZ +yJ +yJ +bW +bW +Ay +yJ +bW +bW +yJ +Do +bW +bW +yJ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +"} +(62,1,1) = {" +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +nh +nh +nh +nh +nh +Eh +Eh +Eh +Eh +Eh +Eh +Eh +Eh +DB +yJ +yJ +Do +yJ +DB +yJ +yJ +yJ +bW +yJ +yJ +Dp +yJ +yJ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +"} +(63,1,1) = {" +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +nh +nh +nh +nh +nh +Eh +Eh +Eh +Eh +Eh +Eh +yJ +Ay +bW +yJ +yJ +yJ +Dp +bW +bW +yJ +JL +yJ +bW +yJ +yJ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +"} +(64,1,1) = {" +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +nh +Sj +nh +Eh +Eh +bW +Eh +Eh +Eh +Eh +yJ +bW +yJ +yJ +yJ +WD +yJ +yJ +yJ +yJ +yJ +QR +bW +bW +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +"} +(65,1,1) = {" +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +nh +aD +nh +nh +Eh +bW +bW +yJ +Dp +DB +Do +bW +bW +Ay +bW +JL +yJ +Do +yJ +yJ +DB +yJ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +"} +(66,1,1) = {" +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +nh +nh +nh +Eh +Eh +JL +Ay +yJ +WD +JL +yJ +yJ +DB +bW +bW +bW +yJ +yJ +yJ +bW +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +"} +(67,1,1) = {" +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +nh +nh +MQ +MQ +MQ +MQ +bW +bW +bW +yJ +QR +yJ +bW +DB +yJ +bW +DB +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +MQ +"} diff --git a/_maps/map_catalogue.txt b/_maps/map_catalogue.txt index ca3748b4c94c..e7b6ca5db5d3 100644 --- a/_maps/map_catalogue.txt +++ b/_maps/map_catalogue.txt @@ -126,9 +126,9 @@ Find the key for using this catalogue in "map_catalogue_key.txt" Size = (x = 11)(y = 16)(z = 1) Tags = "Minor Combat Challenge", "Medium Loot", "Inhospitable" - File Name = "_maps\RandomRuins\LavaRuins\lavaland_surface_ashwalker_shrine.dmm" - Size = (x = 48)(y = 50)(z = 1) - Tags = "No Combat", "Minor Loot", "Inhospitable" + File Name = "_maps\RandomRuins\LavaRuins\lavaland_surface_buried_shrine.dmm" + Size = (x = 67)(y = 55)(z = 1) + Tags = "Medium Combat", "Medium Loot", "Hazardous", "Lava", "Inhospitable" File Name = "_maps\RandomRuins\LavaRuins\lavaland_surface_biodome_winter.dmm" Size = (x = 46)(y = 42)(z = 1) diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm index 9944cb00fe55..bb4bcf74b31c 100644 --- a/code/datums/ruins/lavaland.dm +++ b/code/datums/ruins/lavaland.dm @@ -92,11 +92,11 @@ suffix = "lavaland_surface_dwarffortress.dmm" allow_duplicates = FALSE -/datum/map_template/ruin/lavaland/ashwalker_shrine - name = "Ashwalker shrine" - id = "ashwalker_shrine" - description = "A destroyed ashwalker village. What even happened here?" - suffix = "lavaland_surface_ashwalker_shrine.dmm" +/datum/map_template/ruin/lavaland/buried_shrine + name = "Buried Shrine" + id = "buried_shrine" + description = "An ancient temple belonging to some long-gone inhabitants, wrecked and buried by the volcanic activity of it's home planet." + suffix = "lavaland_surface_buried_shrine.dmm" /datum/map_template/ruin/lavaland/spookycrash name = "Spooky Crash" diff --git a/code/game/area/areas/ruins/lavaland.dm b/code/game/area/areas/ruins/lavaland.dm index 5e8e706a319d..c4d3f75f8fb7 100644 --- a/code/game/area/areas/ruins/lavaland.dm +++ b/code/game/area/areas/ruins/lavaland.dm @@ -112,3 +112,8 @@ /area/ruin/unpowered/scorched_hut name = "Scorched Hut" icon_state = "red" + +/area/ruin/unpowered/buried_shrine + name = "Buried Shrine" + icon_state = "red" + diff --git a/code/game/turfs/closed/_closed.dm b/code/game/turfs/closed/_closed.dm index bb5d6f7311c0..4866dbfb3f60 100644 --- a/code/game/turfs/closed/_closed.dm +++ b/code/game/turfs/closed/_closed.dm @@ -239,7 +239,7 @@ return TRUE /turf/closed/indestructible/riveted/boss - name = "necropolis wall" + name = "thick stone wall" desc = "A thick, seemingly indestructible stone wall." icon = 'icons/turf/walls/boss_wall.dmi' icon_state = "boss_wall-0" From f57c31cee8566dab197ba6a6c935f72ed7f7b4b4 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 5 Jun 2024 22:45:28 -0500 Subject: [PATCH 02/18] Automatic changelog generation for PR #2931 [ci skip] --- html/changelogs/AutoChangeLog-pr-2931.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2931.yml diff --git a/html/changelogs/AutoChangeLog-pr-2931.yml b/html/changelogs/AutoChangeLog-pr-2931.yml new file mode 100644 index 000000000000..3ee174b3f911 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2931.yml @@ -0,0 +1,5 @@ +author: Zevotech +changes: + - {rscadd: remapped and renamed ashwalker_shrine into lavaland_surface_buried_shrine} + - {rscadd: Necropolis walls have been renamed to thick stone walls.} +delete-after: true From 498f5591dc752e2a5adf862f8a623be6778e3c84 Mon Sep 17 00:00:00 2001 From: Sun-Soaked <45698967+Sun-Soaked@users.noreply.github.com> Date: Thu, 6 Jun 2024 02:43:42 -0400 Subject: [PATCH 03/18] Knife visibility quick fix (#3079) ## About The Pull Request oops These really need Real world icons but I'm not in my active phase rn ## Why It's Good For The Game It makes knives appear ## Changelog :cl: fix: combat knives and their subtypes now once again have sprites. /:cl: --- code/game/objects/items/kitchen.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm index c8c9a0f96b96..e386420462d6 100644 --- a/code/game/objects/items/kitchen.dm +++ b/code/game/objects/items/kitchen.dm @@ -191,7 +191,7 @@ /obj/item/kitchen/knife/combat/Initialize() . = ..() - AddElement(/datum/element/world_icon, null, icon, 'icons/obj/kitchen.dmi') + AddElement(/datum/element/world_icon, null, icon, 'icons/obj/item/knife.dmi') /obj/item/kitchen/knife/combat/survival name = "survival knife" From 1c15691b920c512f013900b812abd9d581d67c07 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 6 Jun 2024 01:54:53 -0500 Subject: [PATCH 04/18] Automatic changelog generation for PR #3079 [ci skip] --- html/changelogs/AutoChangeLog-pr-3079.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3079.yml diff --git a/html/changelogs/AutoChangeLog-pr-3079.yml b/html/changelogs/AutoChangeLog-pr-3079.yml new file mode 100644 index 000000000000..7bbcaa88eb5a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3079.yml @@ -0,0 +1,4 @@ +author: Sun-Soaked +changes: + - {bugfix: combat knives and their subtypes now once again have sprites.} +delete-after: true From c586916008cca1f69085c8d60fa39100e7f4a52f Mon Sep 17 00:00:00 2001 From: rye-rice <58402542+rye-rice@users.noreply.github.com> Date: Thu, 6 Jun 2024 11:33:34 -0700 Subject: [PATCH 05/18] small pr to make firemode code easier | or, how firemode code was so fucking terrible that this pr touches like 20-30 files (#3061) ## About The Pull Request Wanted to add pride flags for pride month, but had to get this 'small pr' out the way. Oops. tldr; as a player, this should not affect you. Like at all. Move along This changes firemodes to not be fucking terrible codewise and to touch as a developer. Yes, i HAD to touch gun.dm that much. That was how deep rooted the rot was. Also get's rid of the 0.4 second hardcoded fire delay, now pistols and revolvers shoot as fast as they were intended. Great. This meant that i had to touch a bunch of numbers i set to 0 out of frustration at it not working, being completely unaware of the hardcoded fire delay. This also fixes the E-40 to have laser full auto and to have an ammo counter. I wasn't even trying to fix the E-40, but by unshittifying firemode code i got it to work. Wow. ## Why It's Good For The Game This should make the 3 upcoming gun expansions less ass to add. ## Changelog :cl: add: Changing firemodes on guns now have new sprites fix: The E-40 now works as intended! add: The E-40 now has an ammo counter balance: The P16 shoots slightly faster. balance: .299 Eoehoma caseless has gotten a slight nerf, while the E-40 shoots slightly faster. balance: Two E-40s max are obtainable from the black market should it spawn. Blank market price cap of the E-40 has also increased /:cl: --------- Co-authored-by: retlaw34 <58402542+retlaw34@users.noreply.github.com> --- code/__DEFINES/combat.dm | 5 +- code/__DEFINES/dcs/signals.dm | 4 + code/__DEFINES/guns.dm | 6 + code/datums/action.dm | 1 + code/datums/components/fullauto.dm | 38 +- code/datums/components/gunpoint.dm | 2 +- code/game/machinery/recharger.dm | 1 + code/game/objects/items/chrono_eraser.dm | 2 +- code/game/objects/items/devices/paicard.dm | 2 +- .../abductor/equipment/abduction_gear.dm | 2 +- .../changeling/powers/mutations.dm | 2 +- .../blackmarket/blackmarket_items/weapons.dm | 6 +- .../mining/lavaland/necropolis_chests.dm | 4 +- code/modules/mob/living/silicon/pai/pai.dm | 4 +- .../mob/living/silicon/pai/pai_shell.dm | 8 +- .../modules/projectiles/ammunition/_firing.dm | 2 - .../projectiles/ammunition/ballistic/rifle.dm | 2 +- .../ammunition/caseless/_caseless.dm | 6 +- .../projectiles/ammunition/energy/laser.dm | 2 +- .../projectiles/ammunition/energy/stun.dm | 2 +- code/modules/projectiles/gun.dm | 595 ++++++++++++------ code/modules/projectiles/guns/ballistic.dm | 22 +- .../projectiles/guns/ballistic/assault.dm | 214 +++---- .../projectiles/guns/ballistic/automatic.dm | 69 +- .../projectiles/guns/ballistic/gauss.dm | 34 +- .../modules/projectiles/guns/ballistic/hmg.dm | 49 +- .../projectiles/guns/ballistic/launchers.dm | 10 +- .../projectiles/guns/ballistic/pistol.dm | 38 +- .../projectiles/guns/ballistic/revolver.dm | 50 +- .../projectiles/guns/ballistic/rifle.dm | 13 +- .../projectiles/guns/ballistic/shotgun.dm | 54 +- .../modules/projectiles/guns/ballistic/smg.dm | 204 +++--- .../modules/projectiles/guns/ballistic/toy.dm | 2 +- code/modules/projectiles/guns/energy.dm | 10 +- .../projectiles/guns/energy/energy_gun.dm | 16 +- .../projectiles/guns/energy/laser_gatling.dm | 7 +- .../projectiles/guns/energy/special.dm | 12 +- .../guns/faction/gezena/energy_gunsword.dm | 15 +- code/modules/projectiles/guns/gunhud.dm | 56 +- .../projectiles/projectile/bullets/gauss.dm | 3 +- .../projectiles/projectile/bullets/rifle.dm | 4 +- icons/hud/gun_hud.dmi | Bin 2359 -> 2428 bytes icons/mob/actions/actions_items.dmi | Bin 13971 -> 20966 bytes 43 files changed, 929 insertions(+), 649 deletions(-) diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 7df3a453acfb..e5683140933f 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -140,13 +140,14 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(/obj/item/gun))) #define WEAPON_MEDIUM 2 /// You must wield the gun to fire this gun #define WEAPON_HEAVY 3 +/// You must FULLY wield (wait the full wield delay) the gun to fire this gun +#define WEAPON_VERY_HEAVY 4 //Gun trigger guards #define TRIGGER_GUARD_ALLOW_ALL -1 #define TRIGGER_GUARD_NONE 0 #define TRIGGER_GUARD_NORMAL 1 //Gun bolt types -///Gun has a bolt, it stays closed while not cycling. The gun must be racked to have a bullet chambered when a mag is inserted. -/// Example: c20, shotguns, m90 +///The gun has a closed bolt, when resting it's closed, and must be racked to get a bullet from a magazine. see: Every Fucking Videogame Gun Ever #define BOLT_TYPE_STANDARD 1 ///Gun has a bolt, it is open when ready to fire. The gun can never have a chambered bullet with no magazine, but the bolt stays ready when a mag is removed. /// Example: Some SMGs, the L6 diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 42f21252213c..f7267a7af8d3 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -774,6 +774,10 @@ /// send when enabling/diabling an autofire component #define COMSIG_GUN_DISABLE_AUTOFIRE "disable_autofire" #define COMSIG_GUN_ENABLE_AUTOFIRE "enable_autofire" +#define COMSIG_GUN_SET_AUTOFIRE_SPEED "set_autofire_speed" + +///sent when guns need to notify the gun hud to update. mostly for revolvers. +#define COMSIG_UPDATE_AMMO_HUD "update_ammo_hud" ///called in /obj/item/gun/process_chamber (src) #define COMSIG_GUN_CHAMBER_PROCESSED "gun_chamber_processed" diff --git a/code/__DEFINES/guns.dm b/code/__DEFINES/guns.dm index 0256ed11bedd..556a9ff0e35c 100644 --- a/code/__DEFINES/guns.dm +++ b/code/__DEFINES/guns.dm @@ -14,3 +14,9 @@ #define MANUFACTURER_DONKCO "the Donk! Co. logo" #define MANUFACTURER_PGF "the Etherbor Industries emblem" #define MANUFACTURER_IMPORT "Lanchester Import Co." + +#define FIREMODE_SEMIAUTO "single" +#define FIREMODE_BURST "burst" +#define FIREMODE_FULLAUTO "auto" +#define FIREMODE_OTHER "other" +#define FIREMODE_OTHER_TWO "other2" diff --git a/code/datums/action.dm b/code/datums/action.dm index ff03b689085d..de13fc002dde 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -207,6 +207,7 @@ /datum/action/item_action/toggle_firemode name = "Toggle Firemode" + icon_icon = 'icons/mob/actions/actions_items.dmi' /datum/action/item_action/rcl_col name = "Change Cable Color" diff --git a/code/datums/components/fullauto.dm b/code/datums/components/fullauto.dm index 177093a49fef..f3050c7ab76c 100644 --- a/code/datums/components/fullauto.dm +++ b/code/datums/components/fullauto.dm @@ -8,7 +8,7 @@ var/turf/target_loc //For dealing with locking on targets due to BYOND engine limitations (the mouse input only happening when mouse moves). var/autofire_stat = AUTOFIRE_STAT_IDLE var/mouse_parameters - var/autofire_shot_delay = 0.3 SECONDS //Time between individual shots. + var/autofire_shot_delay = 0.1 SECONDS //Time between individual shots. var/mouse_status = AUTOFIRE_MOUSEUP //This seems hacky but there can be two MouseDown() without a MouseUp() in between if the user holds click and uses alt+tab, printscreen or similar. var/enabled = TRUE @@ -22,6 +22,7 @@ RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(wake_up)) RegisterSignal(parent, COMSIG_GUN_DISABLE_AUTOFIRE, PROC_REF(disable_autofire)) RegisterSignal(parent, COMSIG_GUN_ENABLE_AUTOFIRE, PROC_REF(enable_autofire)) + RegisterSignal(parent, COMSIG_GUN_SET_AUTOFIRE_SPEED, PROC_REF(set_autofire_speed)) if(_autofire_shot_delay) autofire_shot_delay = _autofire_shot_delay if(autofire_stat == AUTOFIRE_STAT_IDLE && ismob(gun.loc)) @@ -161,7 +162,7 @@ if(isgun(parent)) var/obj/item/gun/shoota = parent - if(!shoota.on_autofire_start(shooter)) //This is needed because the minigun has a do_after before firing and signals are async. + if(!shoota.on_autofire_start(shooter=shooter)) //This is needed because the minigun has a do_after before firing and signals are async. stop_autofiring() return if(autofire_stat != AUTOFIRE_STAT_FIRING) @@ -242,12 +243,12 @@ // Gun procs. -/obj/item/gun/proc/on_autofire_start(mob/living/shooter) - if(semicd || shooter.stat || !can_trigger_gun(shooter)) - return FALSE - if(!can_shoot()) - shoot_with_empty_chamber(shooter) +/obj/item/gun/proc/on_autofire_start(datum/source, atom/target, mob/living/shooter, params) + if(current_cooldown || shooter.stat) return FALSE + if(!can_shoot()) //we call pre_fire so bolts/slides work correctly + INVOKE_ASYNC(src, PROC_REF(do_autofire_shot), source, target, shooter, params) + return NONE if(weapon_weight == WEAPON_HEAVY && (!wielded)) to_chat(shooter, "You need a more secure grip to fire [src]!") return FALSE @@ -262,32 +263,29 @@ /obj/item/gun/proc/do_autofire(datum/source, atom/target, mob/living/shooter, params) SIGNAL_HANDLER - if(semicd || shooter.incapacitated()) + if(current_cooldown || shooter.incapacitated()) return NONE if(weapon_weight == WEAPON_HEAVY && (!wielded)) to_chat(shooter, "You need a more secure grip to fire [src]!") return NONE - if(!can_shoot()) - shoot_with_empty_chamber(shooter) + if(!can_shoot()) //we stop if we cant shoot but also calling pre_fire so the bolt works correctly if it's a weird open bolt weapon. + INVOKE_ASYNC(src, PROC_REF(do_autofire_shot), source, target, shooter, params) return NONE INVOKE_ASYNC(src, PROC_REF(do_autofire_shot), source, target, shooter, params) return COMPONENT_AUTOFIRE_SHOT_SUCCESS //All is well, we can continue shooting. /obj/item/gun/proc/do_autofire_shot(datum/source, atom/target, mob/living/shooter, params) - var/obj/item/gun/akimbo_gun = shooter.get_inactive_held_item() - var/bonus_spread = 0 - if(istype(akimbo_gun) && weapon_weight < WEAPON_MEDIUM) - if(akimbo_gun.weapon_weight < WEAPON_MEDIUM && akimbo_gun.can_trigger_gun(shooter)) - bonus_spread = dual_wield_spread - addtimer(CALLBACK(akimbo_gun, TYPE_PROC_REF(/obj/item/gun, process_fire), target, shooter, TRUE, params, null, bonus_spread), 1) - process_fire(target, shooter, TRUE, params, null, bonus_spread) - -/datum/component/automatic_fire/proc/disable_autofire() + pre_fire(target, shooter, TRUE, params, null) //dual wielding is handled here + +/datum/component/automatic_fire/proc/disable_autofire(datum/source) enabled = FALSE -/datum/component/automatic_fire/proc/enable_autofire() +/datum/component/automatic_fire/proc/enable_autofire(datum/source) enabled = TRUE +/datum/component/automatic_fire/proc/set_autofire_speed(datum/source, newspeed) + autofire_shot_delay = newspeed + #undef AUTOFIRE_MOUSEUP #undef AUTOFIRE_MOUSEDOWN diff --git a/code/datums/components/gunpoint.dm b/code/datums/components/gunpoint.dm index 0aa1a5a1e8cc..85701e9c7626 100644 --- a/code/datums/components/gunpoint.dm +++ b/code/datums/components/gunpoint.dm @@ -126,7 +126,7 @@ if(weapon.chambered && weapon.chambered.BB) weapon.chambered.BB.damage *= damage_mult - weapon.process_fire(target, shooter) + weapon.pre_fire(target, shooter) qdel(src) /datum/component/gunpoint/proc/cancel() diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 2720443d2424..b0e030206a0f 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -21,6 +21,7 @@ /obj/item/ammo_box/magazine/recharge, /obj/item/modular_computer, /obj/item/gun/ballistic/automatic/powered, + /obj/item/gun/ballistic/automatic/assault/e40, )) /obj/machinery/recharger/RefreshParts() diff --git a/code/game/objects/items/chrono_eraser.dm b/code/game/objects/items/chrono_eraser.dm index f63a5e9dd45a..baa541662e20 100644 --- a/code/game/objects/items/chrono_eraser.dm +++ b/code/game/objects/items/chrono_eraser.dm @@ -51,7 +51,7 @@ item_flags = DROPDEL ammo_type = list(/obj/item/ammo_casing/energy/chrono_beam) can_charge = FALSE - fire_delay = 50 + fire_delay = 5 SECONDS var/obj/item/chrono_eraser/TED = null var/obj/structure/chrono_field/field = null var/turf/startpos = null diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index bf08b704beb0..61486cf07bf2 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -85,7 +85,7 @@ pai.master_dna = M.dna.unique_enzymes to_chat(pai, "You have been bound to a new master.") pai.laws.set_zeroth_law("Serve your master.") - pai.emittersemicd = FALSE + pai.emittercurrent_cooldown = FALSE if(href_list["wipe"]) var/confirm = input("Are you CERTAIN you wish to delete the current personality? This action cannot be undone.", "Personality Wipe") in list("Yes", "No") if(confirm == "Yes") diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm index 1245e2585462..5bce8014babe 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm @@ -384,7 +384,7 @@ ammo_type = list(/obj/item/ammo_casing/energy/shrink) item_state = "shrink_ray" icon_state = "shrink_ray" - fire_delay = 30 + fire_delay = 3 SECONDS selfcharge = 1//shot costs 200 energy, has a max capacity of 1000 for 5 shots. self charge returns 25 energy every couple ticks, so about 1 shot charged every 12~ seconds trigger_guard = TRIGGER_GUARD_ALLOW_ALL// variable-size trigger, get it? (abductors need this to be set so the gun is usable for them) diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index f32c0dcc215b..68e0d514ad3a 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -245,7 +245,7 @@ fire_sound = 'sound/effects/splat.ogg' force = 0 max_charges = 1 - fire_delay = 1 + fire_delay = 0.1 SECONDS throwforce = 0 //Just to be on the safe side throw_range = 0 throw_speed = 0 diff --git a/code/modules/cargo/blackmarket/blackmarket_items/weapons.dm b/code/modules/cargo/blackmarket/blackmarket_items/weapons.dm index 8832729e58af..83740509f2d7 100644 --- a/code/modules/cargo/blackmarket/blackmarket_items/weapons.dm +++ b/code/modules/cargo/blackmarket/blackmarket_items/weapons.dm @@ -122,8 +122,8 @@ pair_item = /datum/blackmarket_item/weapon/e40_mag price_min = 7000 - price_max = 13000 - stock = 1 + price_max = 15000 + stock_max = 2 availability_prob = 20 /datum/blackmarket_item/weapon/e40_mag @@ -134,7 +134,7 @@ price_min = 750 price_max = 1250 stock_min = 2 - stock_max = 4 + stock_max = 6 availability_prob = 0 /datum/blackmarket_item/weapon/e50 diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 36d556bc5f42..88e1d066024f 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -957,6 +957,7 @@ return COMPONENT_NO_ATTACK_OBJ //A version of the Cave Story refrence that a deranged scientist got their hands on. Better? Not really. Different? Definitely. +//TODO: replace with a proper polar star and spur, not to mention a proper sprite /obj/item/gun/energy/spur name = "Slowpoke" desc = "The work of a truly genius gunsmith, altered and \"improved\" by a truly deranged Nanotrasen scientist, using components from a kinetic accelerator and beam rifle. Draw, partner!" @@ -965,11 +966,10 @@ righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' icon_state = "spur" item_state = "spur" - fire_delay = 0.5 //BRATATAT! This is a cowboy's six-shooter after all. selfcharge = 1 charge_delay = 1 slot_flags = ITEM_SLOT_BELT - fire_delay = 1 + fire_delay = 0.1 SECONDS recoil = 1 cell_type = /obj/item/stock_parts/cell/gun ammo_type = list(/obj/item/ammo_casing/energy/spur) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 1f574f08a450..9f3b85fd4a92 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -74,7 +74,7 @@ var/emitterregen = 0.25 var/emittercd = 50 var/emitteroverloadcd = 100 - var/emittersemicd = FALSE + var/emittercurrent_cooldown = FALSE var/overload_ventcrawl = 0 var/overload_bulletblock = 0 //Why is this a good idea? @@ -125,7 +125,7 @@ . = ..() - emittersemicd = TRUE + emittercurrent_cooldown = TRUE addtimer(CALLBACK(src, PROC_REF(emittercool)), 600) if(!holoform) diff --git a/code/modules/mob/living/silicon/pai/pai_shell.dm b/code/modules/mob/living/silicon/pai/pai_shell.dm index 31a807b319b2..8d50f4a389f4 100644 --- a/code/modules/mob/living/silicon/pai/pai_shell.dm +++ b/code/modules/mob/living/silicon/pai/pai_shell.dm @@ -12,11 +12,11 @@ . = fold_in(force) return - if(emittersemicd) + if(emittercurrent_cooldown) to_chat(src, "Error: Holochassis emitters recycling. Please try again later.") return FALSE - emittersemicd = TRUE + emittercurrent_cooldown = TRUE addtimer(CALLBACK(src, PROC_REF(emittercool)), emittercd) REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, PAI_FOLDED) REMOVE_TRAIT(src, TRAIT_HANDS_BLOCKED, PAI_FOLDED) @@ -42,10 +42,10 @@ holoform = TRUE /mob/living/silicon/pai/proc/emittercool() - emittersemicd = FALSE + emittercurrent_cooldown = FALSE /mob/living/silicon/pai/proc/fold_in(force = FALSE) - emittersemicd = TRUE + emittercurrent_cooldown = TRUE if(!force) addtimer(CALLBACK(src, PROC_REF(emittercool)), emittercd) else diff --git a/code/modules/projectiles/ammunition/_firing.dm b/code/modules/projectiles/ammunition/_firing.dm index ee155db4e719..93fa4208d571 100644 --- a/code/modules/projectiles/ammunition/_firing.dm +++ b/code/modules/projectiles/ammunition/_firing.dm @@ -18,8 +18,6 @@ if(click_cooldown_override) user.changeNext_move(click_cooldown_override) - else - user.changeNext_move(CLICK_CD_RANGE) user.newtonian_move(get_dir(target, user)) update_appearance() diff --git a/code/modules/projectiles/ammunition/ballistic/rifle.dm b/code/modules/projectiles/ammunition/ballistic/rifle.dm index 57592185aff6..b3875292fba2 100644 --- a/code/modules/projectiles/ammunition/ballistic/rifle.dm +++ b/code/modules/projectiles/ammunition/ballistic/rifle.dm @@ -106,4 +106,4 @@ icon_state = "caseless" caliber = ".299 caseless" projectile_type = /obj/projectile/bullet/c299 - bullet_per_box = 80 + bullet_per_box = 100 diff --git a/code/modules/projectiles/ammunition/caseless/_caseless.dm b/code/modules/projectiles/ammunition/caseless/_caseless.dm index 0d364cc93f5a..9e9dafb8d806 100644 --- a/code/modules/projectiles/ammunition/caseless/_caseless.dm +++ b/code/modules/projectiles/ammunition/caseless/_caseless.dm @@ -3,8 +3,10 @@ firing_effect_type = null heavy_metal = FALSE -/obj/item/ammo_casing/caseless/on_eject(atom/shooter) - qdel(src) +/obj/item/ammo_casing/caseless/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread, atom/fired_from) + . = ..() + if(.) + qdel(src) // Overridden; caseless ammo does not distinguish between "live" and "empty"/"spent" icon states (because it has no casing). /obj/item/ammo_casing/caseless/update_icon_state() diff --git a/code/modules/projectiles/ammunition/energy/laser.dm b/code/modules/projectiles/ammunition/energy/laser.dm index 6320cb24b0c6..d0334e8d8acc 100644 --- a/code/modules/projectiles/ammunition/energy/laser.dm +++ b/code/modules/projectiles/ammunition/energy/laser.dm @@ -31,7 +31,7 @@ projectile_type = /obj/projectile/beam/laser/weak/negative_ap e_cost = 799 //12 shots with a normal power cell, 25 with an upgraded select_name = "kill" - delay = 0.1 SECONDS + delay = 0.13 SECONDS /obj/item/ammo_casing/energy/lasergun/old projectile_type = /obj/projectile/beam/laser diff --git a/code/modules/projectiles/ammunition/energy/stun.dm b/code/modules/projectiles/ammunition/energy/stun.dm index 917e1c8c8189..1f74196eb83b 100644 --- a/code/modules/projectiles/ammunition/energy/stun.dm +++ b/code/modules/projectiles/ammunition/energy/stun.dm @@ -46,4 +46,4 @@ /obj/item/ammo_casing/energy/disabler/smg projectile_type = /obj/projectile/beam/disabler/weak/negative_ap e_cost = 330 - delay = 0.1 SECONDS + delay = 0.13 SECONDS diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 892a914b88c5..9948e8dbf329 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -1,4 +1,3 @@ - #define DUALWIELD_PENALTY_EXTRA_MULTIPLIER 1.6 /obj/item/gun @@ -27,25 +26,55 @@ var/vary_fire_sound = TRUE var/fire_sound_volume = 50 var/dry_fire_sound = 'sound/weapons/gun/general/dry_fire.ogg' - var/dry_fire_text = "click" //change this on non-gun things - var/suppressed = null //whether or not a message is displayed when fired + ///Text showed when attempting to fire with no round or empty round. + var/dry_fire_text = "click" + ///whether or not a message is displayed when fired + var/suppressed = null var/can_suppress = FALSE var/suppressed_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg' var/suppressed_volume = 60 var/can_unsuppress = TRUE var/obj/item/ammo_casing/chambered = null - trigger_guard = TRIGGER_GUARD_NORMAL //trigger guard on the weapon, hulks can't fire them with their big meaty fingers - var/sawn_desc = null //description change if weapon is sawn-off + ///trigger guard on the weapon. Used for hulk mutations and ashies. I honestly dont know how usefult his is, id avoid touching it + trigger_guard = TRIGGER_GUARD_NORMAL + ///Set the description of the gun to this when sawed off + var/sawn_desc = null + ///This triggers some sprite behavior in shotguns and prevents further sawoff, note that can_be_sawn_off is on gun/ballistic and not here, wtf. var/sawn_off = FALSE - var/burst_size = 1 //how large a burst is - var/fire_delay = 0 //rate of fire for burst firing and semi auto - var/firing_burst = 0 //Prevent the weapon from firing again while already firing - var/semicd = 0 //cooldown handler + + /// how many shots per burst, Ex: most machine pistols, M90, some ARs are 3rnd burst, while others like the GAR and laser minigun are 2 round burst. + var/burst_size = 3 + ///The rate of fire when firing in a burst. Not the delay between bursts + var/burst_delay = 0.15 SECONDS + ///The rate of fire when firing full auto and semi auto, and between bursts; for bursts its fire delay + burst_delay after every burst + var/fire_delay = 0.2 SECONDS + + /// after initializing, we set the firemode to this + var/default_firemode = FIREMODE_SEMIAUTO + ///Firemode index, due to code shit this is the currently selected firemode + var/firemode_index + /// Our firemodes, subtract and add to this list as needed. NOTE that the autofire component is given on init when FIREMODE_FULLAUTO is here. + var/list/gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_BURST, FIREMODE_FULLAUTO, FIREMODE_OTHER, FIREMODE_OTHER_TWO) + /// A acoc list that determines the names of firemodes. Use if you wanna be weird and set the name of say, FIREMODE_OTHER to "Underbarrel grenade launcher" for example. + var/list/gun_firenames = list(FIREMODE_SEMIAUTO = "single", FIREMODE_BURST = "burst fire", FIREMODE_FULLAUTO = "full auto", FIREMODE_OTHER = "misc. fire", FIREMODE_OTHER_TWO = "very misc. fire") + ///BASICALLY: the little button you select firing modes from? this is jsut the prefix of the icon state of that. For example, if we set it as "laser", the fire select will use "laser_single" and so on. + var/fire_select_icon_state_prefix = "" + ///If true, we put "safety_" before fire_select_icon_state_prefix's prefix. ex. "safety_laser_single" + var/adjust_fire_select_icon_state_on_safety = FALSE + + ///Are we firing a burst? If so, dont fire again until burst is done + var/currently_firing_burst = FALSE + ///This prevents gun from firing until the coodown is done, affected by lag + var/current_cooldown = 0 + ///affects if you can fire it unwielded or even dual wield it. LIGHT means dual wield allowed, HEAVY and higher means you have to wield to fire var/weapon_weight = WEAPON_LIGHT - var/dual_wield_spread = 24 //additional spread when dual wielding - var/randomspread = 1 //Set to 0 for shotguns. This is used for weapons that don't fire all their bullets at once. + ///If dual wielding, add this to the spread + var/dual_wield_spread = 24 + /// ???, no clue what this is. Original desc: //Set to 0 for shotguns. This is used for weapons that don't fire all their bullets at once. + var/randomspread = 1 - var/projectile_damage_multiplier = 1 //Alters projectile damage multiplicatively based on this value. Use it for "better" or "worse" weapons that use the same ammo. + ///Alters projectile damage multiplicatively based on this value. Use it for "better" or "worse" weapons that use the same ammo. + var/projectile_damage_multiplier = 1 lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' @@ -127,6 +156,7 @@ alight = new(src) muzzle_flash = new(src, muzzleflash_iconstate) build_zooming() + build_firemodes() /obj/item/gun/ComponentInitialize() . = ..() @@ -152,8 +182,10 @@ ) ) wielded_fully = TRUE + return TRUE else wielded_fully = TRUE + return TRUE /obj/item/gun/proc/is_wielded() return wielded @@ -217,6 +249,51 @@ if(zoomed && user.get_active_held_item() != src) zoom(user, user.dir, FALSE) //we can only stay zoomed in if it's in our hands //yeah and we only unzoom if we're actually zoomed using the gun!! +/obj/item/gun/attack(mob/M as mob, mob/user) + if(user.a_intent == INTENT_HARM) //Flogging + if(bayonet) + M.attackby(bayonet, user) + return + else + return ..() + return + +/obj/item/gun/attack_obj(obj/O, mob/user) + if(user.a_intent == INTENT_HARM) + if(bayonet) + O.attackby(bayonet, user) + return + return ..() + +/obj/item/gun/attackby(obj/item/I, mob/user, params) + if(user.a_intent == INTENT_HARM) + return ..() + else if(istype(I, /obj/item/flashlight/seclite)) + if(!can_flashlight) + return ..() + var/obj/item/flashlight/seclite/S = I + if(!gun_light) + if(!user.transferItemToLoc(I, src)) + return + to_chat(user, "You click [S] into place on [src].") + set_gun_light(S) + update_gunlight() + alight = new(src) + if(loc == user) + alight.Grant(user) + else if(istype(I, /obj/item/kitchen/knife)) + var/obj/item/kitchen/knife/K = I + if(!can_bayonet || !K.bayonet || bayonet) //ensure the gun has an attachment point available, and that the knife is compatible with it. + return ..() + if(!user.transferItemToLoc(I, src)) + return + to_chat(user, "You attach [K] to [src]'s bayonet lug.") + bayonet = K + update_appearance() + + else + return ..() + //called after the gun has successfully fired its chambered ammo. /obj/item/gun/proc/process_chamber(atom/shooter) SEND_SIGNAL(src, COMSIG_GUN_CHAMBER_PROCESSED) @@ -229,252 +306,277 @@ return FALSE return TRUE -/obj/item/gun/proc/shoot_with_empty_chamber(mob/living/user as mob|obj) - if(!safety) - to_chat(user, "*[dry_fire_text]*") - playsound(src, dry_fire_sound, 30, TRUE) - return - to_chat(user, "Safeties are active on the [src]! Turn them off to fire!") - - -/obj/item/gun/proc/shoot_live_shot(mob/living/user, pointblank = 0, atom/pbtarget = null, message = 1) - var/actual_angle = get_angle_with_scatter((user || get_turf(src)), pbtarget, rand(-recoil_deviation, recoil_deviation) + 180) - var/muzzle_angle = Get_Angle(get_turf(src), pbtarget) - if(muzzle_flash && !muzzle_flash.applied) - handle_muzzle_flash(user, muzzle_angle) - - if(wielded_fully) - simulate_recoil(user, recoil, actual_angle) - else if(!wielded_fully) - simulate_recoil(user, recoil_unwielded, actual_angle) - - if(suppressed) - playsound(user, suppressed_sound, suppressed_volume, vary_fire_sound, ignore_walls = FALSE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0) - else - playsound(user, fire_sound, fire_sound_volume, vary_fire_sound) - if(message) - if(pointblank) - user.visible_message( - span_danger("[user] fires [src] point blank at [pbtarget]!"), - span_danger("You fire [src] point blank at [pbtarget]!"), - span_hear("You hear a gunshot!"), COMBAT_MESSAGE_RANGE, pbtarget - ) - to_chat(pbtarget, "[user] fires [src] point blank at you!") - if(pb_knockback > 0 && ismob(pbtarget)) - var/mob/PBT = pbtarget - var/atom/throw_target = get_edge_target_turf(PBT, user.dir) - PBT.throw_at(throw_target, pb_knockback, 2) - else - user.visible_message( - span_danger("[user] fires [src]!"), - blind_message = span_hear("You hear a gunshot!"), - vision_distance = COMBAT_MESSAGE_RANGE, - ignored_mobs = user - ) - /obj/item/gun/emp_act(severity) . = ..() if(!(. & EMP_PROTECT_CONTENTS)) for(var/obj/O in contents) O.emp_act(severity) + +/obj/item/gun/proc/recharge_newshot() + return + /obj/item/gun/afterattack(atom/target, mob/living/user, flag, params) . = ..() + //No target? Why are we even firing anyways... if(!target) return - if(firing_burst) + //If we are burst firing, don't fire, obviously + if(currently_firing_burst) return - if(flag) //It's adjacent, is the user, or is on the user's person + //This var happens when we are either clicking someone next to us or ourselves. Check if we don't want to fire... + if(flag) if(target in user.contents) //can't shoot stuff inside us. return if(!ismob(target) || user.a_intent == INTENT_HARM) //melee attack return if(target == user && user.zone_selected != BODY_ZONE_PRECISE_MOUTH) //so we can't shoot ourselves (unless mouth selected) return +/* TODO: gunpointing is very broken, port the old skyrat gunpointing? its much better, usablity wise and rp wise? if(ismob(target) && user.a_intent == INTENT_GRAB) if(user.GetComponent(/datum/component/gunpoint)) to_chat(user, "You are already holding someone up!") return user.AddComponent(/datum/component/gunpoint, target, src) return +*/ + // Good job, but we have exta checks to do... + return pre_fire(target, user, TRUE, flag, params, null) + +/obj/item/gun/proc/pre_fire(atom/target, mob/living/user, message = TRUE, flag, params = null, zone_override = "", bonus_spread = 0, dual_wielded_gun = FALSE) + add_fingerprint(user) - if(istype(user))//Check if the user can use the gun, if the user isn't alive(turrets) assume it can. - var/mob/living/L = user - if(!can_trigger_gun(L)) + // If we have a cooldown, don't do anything, obviously + if(current_cooldown) + return + + //We check if the user can even use the gun, if not, we assume the user isn't alive(turrets) so we go ahead. + if(istype(user)) + var/mob/living/living_user = user + if(!can_trigger_gun(living_user)) return + //If targetting the mouth, we do suicide instead. if(flag) if(user.zone_selected == BODY_ZONE_PRECISE_MOUTH) handle_suicide(user, target, params) return - if(!can_shoot()) //Just because you can pull the trigger doesn't mean it can shoot. + //Just because we can pull the trigger doesn't mean it can fire. Mostly for safties. + if(!can_shoot()) shoot_with_empty_chamber(user) return + //we then check our weapon weight vs if we are being wielded... + if(weapon_weight == WEAPON_VERY_HEAVY && (!wielded_fully)) + to_chat(user, "You need a fully secure grip to fire [src]!") + return + if(weapon_weight == WEAPON_HEAVY && (!wielded)) to_chat(user, "You need a more secure grip to fire [src]!") return - //DUAL (or more!) WIELDING - var/bonus_spread = 0 + //If we have the pacifist trait and a chambered round, don't fire. Honestly, pacifism quirk is pretty stupid, and as such we check again in process_fire() anyways + if(chambered) + if(HAS_TRAIT(user, TRAIT_PACIFISM)) // If the user has the pacifist trait, then they won't be able to fire [src] if the round chambered inside of [src] is lethal. + if(chambered.harmful) // Is the bullet chambered harmful? + to_chat(user, "[src] is lethally chambered! You don't want to risk harming anyone...") + return + + //Dual wielding handling. Not the biggest fan of this, but it's here. Dual berettas not included var/loop_counter = 0 - if(ishuman(user) && user.a_intent == INTENT_HARM) - var/mob/living/carbon/human/H = user - for(var/obj/item/gun/G in H.held_items) - if(G == src || G.weapon_weight >= WEAPON_MEDIUM) + if(ishuman(user) && user.a_intent == INTENT_HARM && !dual_wielded_gun) + var/mob/living/carbon/human/our_cowboy = user + for(var/obj/item/gun/found_gun in our_cowboy.held_items) + if(found_gun == src || found_gun.weapon_weight >= WEAPON_MEDIUM) continue - else if(G.can_trigger_gun(user)) + else if(found_gun.can_trigger_gun(user)) bonus_spread += dual_wield_spread loop_counter++ - addtimer(CALLBACK(G, TYPE_PROC_REF(/obj/item/gun, process_fire), target, user, TRUE, params, null, bonus_spread), loop_counter) + addtimer(CALLBACK(found_gun, TYPE_PROC_REF(/obj/item/gun, pre_fire), target, user, TRUE, params, null, bonus_spread), loop_counter) + //get current firemode + var/current_firemode = gun_firemodes[firemode_index] + //FIREMODE_OTHER and its sister directs you to another proc for special handling + if(current_firemode == FIREMODE_OTHER) + return process_other(target, user, message, flag, params, zone_override, bonus_spread) + if(current_firemode == FIREMODE_OTHER_TWO) + return process_other_two(target, user, message, flag, params, zone_override, bonus_spread) + + //if all of that succeded, we finally get to process firing return process_fire(target, user, TRUE, params, null, bonus_spread) -/obj/item/gun/proc/recharge_newshot() - return +/obj/item/gun/proc/process_other(atom/target, mob/living/user, message = TRUE, flag, params = null, zone_override = "", bonus_spread = 0) + return //use this for 'underbarrels!! + +/obj/item/gun/proc/process_other_two(atom/target, mob/living/user, message = TRUE, flag, params = null, zone_override = "", bonus_spread = 0) + return //reserved in case another fire mode is needed, if you need special behavior, put it here then call process_fire, or call process_fire and have the special behavior there + +/** + * Handles everything involving firing. + * * gun.dm is still a fucking mess, and I will document everything next time i get to it... for now this will suffice. + * + * Returns TRUE or FALSE depending on if it actually fired a shot. + * Arguments: + * * target - The atom we are trying to hit. + * * user - The living mob firing the gun, if any. + * * message - Do we show the usual messages? eg. "x fires the y!" + * * params - Is the params string from byond [/atom/proc/Click] code, see that documentation. + * * zone_override - The bodypart we attempt to hit, sometimes hits another. + * * bonus_spread - Adds this value to spread, in this case used by dual wielding. + * * burst_firing - Not to be confused with currently_firing_burst. This var is TRUE when we are doing a burst except for the first shot in a burst, as to override the spam burst checks. + * * spread_override - Bullet spread is forcibly set to this. This is usually because of bursts attempting to share the same burst trajectory. + * * iteration - Which shot in a burst are we in. + */ +/obj/item/gun/proc/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0, burst_firing = FALSE, spread_override = 0, iteration = 0) + //OKAY, this prevents us from firing until our cooldown is done + if(!burst_firing) //if we're firing a burst, dont interfere to avoid issues + if(current_cooldown) + return FALSE -/obj/item/gun/proc/process_burst(mob/living/user, atom/target, message = TRUE, params=null, zone_override = "", sprd = 0, randomized_gun_spread = 0, randomized_bonus_spread = 0, rand_spr = 0, iteration = 0) - if(!user || !firing_burst) - firing_burst = FALSE + //Check one last time for safeties... + if(!can_shoot()) + shoot_with_empty_chamber(user) + currently_firing_burst = FALSE return FALSE - if(!issilicon(user)) - if(iteration > 1 && !(user.is_holding(src))) //for burst firing - firing_burst = FALSE + + //special hahnding for burst firing + if(burst_firing) + if(!user || !currently_firing_burst) + currently_firing_burst = FALSE return FALSE - if(chambered && chambered.BB) + if(!issilicon(user)) + //If we aren't holding the gun, what are we doing, stop firing! + if(iteration > 1 && !(user.is_holding(src))) + currently_firing_burst = FALSE + return FALSE + + //Do we have a round? If not, stop the whole chain, and if we do, check if the gun is chambered. Pacisim is pretty lame anyways. + if(chambered) if(HAS_TRAIT(user, TRAIT_PACIFISM)) // If the user has the pacifist trait, then they won't be able to fire [src] if the round chambered inside of [src] is lethal. if(chambered.harmful) // Is the bullet chambered harmful? to_chat(user, "[src] is lethally chambered! You don't want to risk harming anyone...") - return - if(randomspread) - sprd = round((rand() - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread)) - else //Smart spread - sprd = round((((rand_spr/burst_size) * iteration) - (0.5 + (rand_spr * 0.25))) * (randomized_gun_spread + randomized_bonus_spread)) - before_firing(target,user) - if(!chambered.fire_casing(target, user, params, ,suppressed, zone_override, sprd, src)) - shoot_with_empty_chamber(user) - firing_burst = FALSE - return FALSE - else - if(get_dist(user, target) <= 1) //Making sure whether the target is in vicinity for the pointblank shot - shoot_live_shot(user, 1, target, message) - else - shoot_live_shot(user, 0, target, message) - if (iteration >= burst_size) - firing_burst = FALSE + currently_firing_burst = FALSE //no burst 4 u + return FALSE + else + shoot_with_empty_chamber(user) + currently_firing_burst = FALSE + return FALSE + + // we hold the total spread in this var + var/sprd + // if we ARE burst firing and don't have "randomspread", we add the burst's penalty on top of it. + if(burst_firing && !randomspread) + bonus_spread += burst_size * iteration + + //override spread? usually happens only in bursts + if(spread_override && !randomspread) + sprd = spread_override else + //Calculate spread + sprd = calculate_spread(user, bonus_spread) + + before_firing(target,user) + //If we cant fire the round, just end the proc here. Otherwise, continue + if(!chambered.fire_casing(target, user, params, , suppressed, zone_override, sprd, src)) shoot_with_empty_chamber(user) - firing_burst = FALSE + currently_firing_burst = FALSE return FALSE + //Are we PBing someone? If so, set pointblank to TRUE + shoot_live_shot(user, (get_dist(user, target) <= 1), target, message) //Making sure whether the target is in vicinity for the pointblank shot + + //process the chamber... process_chamber(shooter = user) update_appearance() - return TRUE - -/obj/item/gun/proc/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) + //get our current firemode... + var/current_firemode = gun_firemodes[firemode_index] + + //If we are set to burst fire, then we burst fire! + if(burst_size > 1 && (current_firemode == FIREMODE_BURST) && !burst_firing) + currently_firing_burst = TRUE + for(var/i = 2 to burst_size) //we fire the first burst normally, hence why its 2 + addtimer(CALLBACK(src, PROC_REF(process_fire), target, user, message, params, zone_override, 0, TRUE, sprd, i), burst_delay * (i - 1)) + + //if we have a fire delay, set up a cooldown + if(fire_delay && (!burst_firing && !currently_firing_burst)) + current_cooldown = TRUE + addtimer(CALLBACK(src, PROC_REF(reset_current_cooldown)), fire_delay) + if(burst_firing && iteration >= burst_size) + current_cooldown = TRUE + addtimer(CALLBACK(src, PROC_REF(reset_current_cooldown)), fire_delay+burst_delay) + currently_firing_burst = FALSE + + // update our inhands... if(user) - SEND_SIGNAL(user, COMSIG_MOB_FIRED_GUN, user, target, params, zone_override) + user.update_inv_hands() - add_fingerprint(user) + SSblackbox.record_feedback("tally", "gun_fired", 1, type) + return TRUE - if(semicd) +/obj/item/gun/proc/reset_current_cooldown() + current_cooldown = FALSE +/obj/item/gun/proc/shoot_with_empty_chamber(mob/living/user as mob|obj) + if(!safety) + to_chat(user, "*[dry_fire_text]*") + playsound(src, dry_fire_sound, 30, TRUE) return + to_chat(user, "Safeties are active on the [src]! Turn them off to fire!") - var/sprd = 0 - var/randomized_gun_spread = 0 - var/rand_spr = rand() - if(wielded_fully && spread) - randomized_gun_spread = rand(0,spread) - else if(!wielded_fully && spread_unwielded) - randomized_gun_spread = rand(0,spread_unwielded) +/obj/item/gun/proc/shoot_live_shot(mob/living/user, pointblank = FALSE, atom/pbtarget = null, message = TRUE) + var/actual_angle = get_angle_with_scatter((user || get_turf(src)), pbtarget, rand(-recoil_deviation, recoil_deviation) + 180) + var/muzzle_angle = Get_Angle(get_turf(src), pbtarget) - if(HAS_TRAIT(user, TRAIT_POOR_AIM)) //nice shootin' tex - bonus_spread += 25 - var/randomized_bonus_spread = rand(0, bonus_spread) + user.changeNext_move(clamp(fire_delay, 0, CLICK_CD_RANGE)) - if(burst_size > 1) - firing_burst = TRUE - for(var/i = 1 to burst_size) - addtimer(CALLBACK(src, PROC_REF(process_burst), user, target, message, params, zone_override, sprd, randomized_gun_spread, randomized_bonus_spread, rand_spr, i), fire_delay * (i - 1)) + if(muzzle_flash && !muzzle_flash.applied) + handle_muzzle_flash(user, muzzle_angle) + + if(wielded_fully) + simulate_recoil(user, recoil, actual_angle) + else if(!wielded_fully) + simulate_recoil(user, recoil_unwielded, actual_angle) + + if(suppressed) + playsound(user, suppressed_sound, suppressed_volume, vary_fire_sound, ignore_walls = FALSE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0) else - if(chambered) - if(HAS_TRAIT(user, TRAIT_PACIFISM)) // If the user has the pacifist trait, then they won't be able to fire [src] if the round chambered inside of [src] is lethal. - if(chambered.harmful) // Is the bullet chambered harmful? - to_chat(user, "[src] is lethally chambered! You don't want to risk harming anyone...") - return - sprd = round((rand() - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread)) - sprd = calculate_spread(user, sprd) - - before_firing(target,user) - if(!chambered.fire_casing(target, user, params, , suppressed, zone_override, sprd, src)) - shoot_with_empty_chamber(user) - return + playsound(user, fire_sound, fire_sound_volume, vary_fire_sound) + if(message) + if(pointblank) + user.visible_message( + span_danger("[user] fires [src] point blank at [pbtarget]!"), + span_danger("You fire [src] point blank at [pbtarget]!"), + span_hear("You hear a gunshot!"), COMBAT_MESSAGE_RANGE, pbtarget + ) + to_chat(pbtarget, "[user] fires [src] point blank at you!") + if(pb_knockback > 0 && ismob(pbtarget)) + var/mob/PBT = pbtarget + var/atom/throw_target = get_edge_target_turf(PBT, user.dir) + PBT.throw_at(throw_target, pb_knockback, 2) else - if(get_dist(user, target) <= 1) //Making sure whether the target is in vicinity for the pointblank shot - shoot_live_shot(user, TRUE, target, message) - else - shoot_live_shot(user, FALSE, target, message) - else - shoot_with_empty_chamber(user) - return - process_chamber(shooter = user) - update_appearance() - if(fire_delay) - semicd = TRUE - addtimer(CALLBACK(src, PROC_REF(reset_semicd)), fire_delay) + user.visible_message( + span_danger("[user] fires [src]!"), + blind_message = span_hear("You hear a gunshot!"), + vision_distance = COMBAT_MESSAGE_RANGE, + ignored_mobs = user + ) - if(user) - user.update_inv_hands() - SSblackbox.record_feedback("tally", "gun_fired", 1, type) - return TRUE + //cloudy sent a meme in the discord. i dont know if its true, but i made this piece of code in honor of it + var/mob/living/carbon/human/living_human = user + if(istype(living_human)) + if(!living_human.wear_neck) + return //if nothing on the neck, don't do anything + var/current_month = text2num(time2text(world.timeofday, "MM")) + var/static/regex/bian = regex("(?:^\\W*lesbian)", "i") -/obj/item/gun/proc/reset_semicd() - semicd = FALSE + if(current_month == JUNE) + return //if it isn't june, don't do this easter egg -/obj/item/gun/attack(mob/M as mob, mob/user) - if(user.a_intent == INTENT_HARM) //Flogging - if(bayonet) - M.attackby(bayonet, user) - return - else - return ..() - return + if(!findtext(bian, living_human.generic_adjective)) + return //dont bother if we already are affected by it -/obj/item/gun/attack_obj(obj/O, mob/user) - if(user.a_intent == INTENT_HARM) - if(bayonet) - O.attackby(bayonet, user) - return - return ..() - -/obj/item/gun/attackby(obj/item/I, mob/user, params) - if(user.a_intent == INTENT_HARM) - return ..() - else if(istype(I, /obj/item/flashlight/seclite)) - if(!can_flashlight) - return ..() - var/obj/item/flashlight/seclite/S = I - if(!gun_light) - if(!user.transferItemToLoc(I, src)) - return - to_chat(user, "You click [S] into place on [src].") - set_gun_light(S) - update_gunlight() - alight = new(src) - if(loc == user) - alight.Grant(user) - else if(istype(I, /obj/item/kitchen/knife)) - var/obj/item/kitchen/knife/K = I - if(!can_bayonet || !K.bayonet || bayonet) //ensure the gun has an attachment point available, and that the knife is compatible with it. - return ..() - if(!user.transferItemToLoc(I, src)) - return - to_chat(user, "You attach [K] to [src]'s bayonet lug.") - bayonet = K - update_appearance() - - else - return ..() + if(istype(living_human.wear_neck, /obj/item/clothing/neck/tie/lesbian) || living_human.wear_neck.icon_state == "lesbian") + var/use_space = "[living_human.generic_adjective ? " " : ""]" + living_human.generic_adjective = "lesbian[use_space][living_human.generic_adjective]" //i actually don't remember the meme. it was something like lesbians will stop working if they see another with a gun. or something. /obj/item/gun/CtrlClick(mob/user) . = ..() @@ -666,7 +768,7 @@ if(!ishuman(user) || !ishuman(target)) return - if(semicd) + if(current_cooldown) return if(!can_shoot()) //Just because you can pull the trigger doesn't mean it can shoot. @@ -680,7 +782,7 @@ target.visible_message(span_warning("[user] points [src] at [target]'s head, ready to pull the trigger..."), \ span_userdanger("[user] points [src] at your head, ready to pull the trigger...")) - semicd = TRUE + current_cooldown = TRUE if(!bypass_timer && (!do_after(user, 100, target) || user.zone_selected != BODY_ZONE_PRECISE_MOUTH)) if(user) @@ -688,17 +790,18 @@ user.visible_message(span_notice("[user] decided not to shoot.")) else if(target && target.Adjacent(user)) target.visible_message(span_notice("[user] has decided to spare [target]."), span_notice("[user] has decided to spare your life!")) - semicd = FALSE + current_cooldown = FALSE return - semicd = FALSE + current_cooldown = FALSE target.visible_message(span_warning("[user] pulls the trigger!"), span_userdanger("[(user == target) ? "You pull" : "[user] pulls"] the trigger!")) if(chambered && chambered.BB && can_trigger_gun(user)) chambered.BB.damage *= 3 //Check is here for safeties and such, brain will be removed after - process_fire(target, user, TRUE, params, BODY_ZONE_HEAD) + if(!pre_fire(target, user, TRUE, params, BODY_ZONE_HEAD)) + return var/obj/item/organ/brain/brain_to_blast = target.getorganslot(ORGAN_SLOT_BRAIN) if(brain_to_blast) @@ -732,10 +835,55 @@ // We do it like this in case theres some specific gun behavior for adjusting spread, like bipods or folded stocks /obj/item/gun/proc/calculate_spread(mob/user, bonus_spread) - return bonus_spread + ///our final spread value + var/sprd = 0 + ///our randomized value after checking if we are wielded or not + var/randomized_gun_spread = 0 + ///bonus + var/randomized_bonus_spread + // do we have poor aim + var/poor_aim = FALSE + + //do we have bonus_spread ? If so, set sprd to it because it means a subtype's proc messed with it + sprd += bonus_spread + + //reset bonus_spread for poor aim... + bonus_spread = 0 + + // if we have poor aim, we fuck the shooter over + if(HAS_TRAIT(user, TRAIT_POOR_AIM)) + bonus_spread += 25 + poor_aim = TRUE + // then we randomize the bonus spread + randomized_bonus_spread = rand(poor_aim ? 10 : 0, bonus_spread) //poor aim is no longer just a nusiance + + //then, we mutiply previous bonus spread as it means dual wielding usually, it also means poor aim is also even more severe + randomized_bonus_spread *= DUALWIELD_PENALTY_EXTRA_MULTIPLIER + + // we will then calculate gun spread depending on if we are fully wielding (after do_after) the gun or not + randomized_gun_spread = rand(0, wielded_fully ? spread : spread_unwielded) + + //finally, we put it all together including if sprd has a value + sprd += randomized_gun_spread + randomized_bonus_spread + + //clamp it down to avoid guns with negative spread to have worse recoil... + sprd = clamp(sprd, 0, INFINITY) + + // im not sure what this does, i beleive its meant to make it so bullet spread goes in the opposite direction? get back to me on this - update,i have commented it out, however it appears be dapening spread. weird. + //sprd *= (rand() - 0.5) + + //coin flip if we mutiply output by -1 so spread isn't JUST to the right + if(prob(50)) + sprd *= -1 + + // then we round it up and send it! + sprd = round(sprd) + + return sprd /obj/item/gun/proc/simulate_recoil(mob/living/user, recoil_bonus = 0, firing_angle) var/total_recoil = calculate_recoil(user, recoil_bonus) + total_recoil = clamp(total_recoil, 0 , INFINITY) var/actual_angle = firing_angle + rand(-recoil_deviation, recoil_deviation) + 180 if(actual_angle > 360) @@ -747,6 +895,7 @@ /obj/item/gun/proc/handle_muzzle_flash(mob/living/user, firing_angle) var/atom/movable/flash_loc = user var/prev_light = light_range + if(!light_on && (light_range <= muzzle_flash_lum)) set_light_range(muzzle_flash_lum) set_light_color(muzzle_flash_color) @@ -895,4 +1044,60 @@ azoom = new() azoom.gun = src +/obj/item/gun/proc/build_firemodes() + if(FIREMODE_FULLAUTO in gun_firemodes) + AddComponent(/datum/component/automatic_fire, fire_delay) + SEND_SIGNAL(src, COMSIG_GUN_DISABLE_AUTOFIRE) + var/datum/action/item_action/our_action + + if(gun_firemodes.len > 1) + our_action = new /datum/action/item_action/toggle_firemode(src) + + for(var/i=1, i <= gun_firemodes.len+1, i++) + if(default_firemode == gun_firemodes[i]) + firemode_index = i + if(gun_firemodes[i] == FIREMODE_FULLAUTO) + SEND_SIGNAL(src, COMSIG_GUN_ENABLE_AUTOFIRE) + if(our_action) + our_action.UpdateButtonIcon() + return + + firemode_index = 1 + CRASH("default_firemode isn't in the gun_firemodes list of [src.type]!! Defaulting to 1!!") + +/obj/item/gun/ui_action_click(mob/user, actiontype) + if(istype(actiontype, /datum/action/item_action/toggle_firemode)) + fire_select(user) + else + ..() + +/obj/item/gun/proc/fire_select(mob/living/carbon/human/user) + + //gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_BURST, FIREMODE_FULLAUTO, FIREMODE_OTHER) + + firemode_index++ + if(firemode_index > gun_firemodes.len) + firemode_index = 1 //reset to the first index if it's over the limit. Byond arrays start at 1 instead of 0, hence why its set to 1. + + var/current_firemode = gun_firemodes[firemode_index] + if(current_firemode == FIREMODE_FULLAUTO) + SEND_SIGNAL(src, COMSIG_GUN_ENABLE_AUTOFIRE) + else + SEND_SIGNAL(src, COMSIG_GUN_DISABLE_AUTOFIRE) +//wawa + to_chat(user, "Switched to [gun_firenames[current_firemode]].") + playsound(user, 'sound/weapons/gun/general/selector.ogg', 100, TRUE) + update_appearance() + for(var/datum/action/current_action as anything in actions) + current_action.UpdateButtonIcon() + +/datum/action/item_action/toggle_firemode/UpdateButtonIcon(status_only = FALSE, force = FALSE) + var/obj/item/gun/our_gun = target + + var/current_firemode = our_gun.gun_firemodes[our_gun.firemode_index] + //tldr; if we have adjust_fire_select_icon_state_on_safety as true, we append "safety_" to the prefix, otherwise nothing. + var/safety_prefix = "[our_gun.adjust_fire_select_icon_state_on_safety ? "[our_gun.safety ? "safety_" : ""]" : ""]" + button_icon_state = "[safety_prefix][our_gun.fire_select_icon_state_prefix][current_firemode]" + return ..() + #undef DUALWIELD_PENALTY_EXTRA_MULTIPLIER diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 37b8ceea801c..e5345c0eab45 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -58,9 +58,9 @@ ///Compatible magazines with the gun var/mag_type = /obj/item/ammo_box/magazine/m10mm //Removes the need for max_ammo and caliber info ///Whether the sprite has a visible magazine or not - var/mag_display = FALSE + var/show_magazine_on_sprite = FALSE ///Whether the sprite has a visible ammo display or not - var/mag_display_ammo = FALSE + var/show_magazine_on_sprite_ammo = FALSE ///Whether the sprite has a visible indicator for being empty or not. var/empty_indicator = FALSE ///Whether the gun alarms when empty or not. @@ -68,7 +68,7 @@ ///Do we eject the magazine upon runing out of ammo? var/empty_autoeject = FALSE ///Whether the gun supports multiple special mag types - var/special_mags = FALSE + var/unique_mag_sprites_for_variants = FALSE ///The bolt type of the gun, affects quite a bit of functionality, see combat.dm defines for bolt types: BOLT_TYPE_STANDARD; BOLT_TYPE_LOCKING; BOLT_TYPE_OPEN; BOLT_TYPE_NO_BOLT var/bolt_type = BOLT_TYPE_STANDARD ///Used for locking bolt and open bolt guns. Set a bit differently for the two but prevents firing when true for both. @@ -126,7 +126,7 @@ if (suppressed) . += "[icon_state]_suppressor" if (magazine) - if (special_mags) + if (unique_mag_sprites_for_variants) . += "[icon_state]_mag_[magazine.base_icon_state]" if (!magazine.ammo_count()) . += "[icon_state]_mag_empty" @@ -191,6 +191,7 @@ else playsound(src, rack_sound, rack_sound_volume, rack_sound_vary) update_appearance() + SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD) ///Drops the bolt from a locked position /obj/item/gun/ballistic/proc/drop_bolt(mob/user = null) @@ -217,6 +218,7 @@ if (bolt_type == BOLT_TYPE_OPEN && !bolt_locked) chamber_round(TRUE) update_appearance() + SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD) return TRUE else to_chat(user, "You cannot seem to get \the [src] out of your hands!") @@ -237,6 +239,7 @@ if (display_message) to_chat(user, "You pull the [magazine_wording] out of \the [src].") update_appearance() + SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD) if (tac_load) if(do_after(user, tactical_reload_delay, TRUE, src)) if (insert_magazine(user, tac_load, FALSE)) @@ -249,6 +252,7 @@ if(user) user.put_in_hands(old_mag) update_appearance() + SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD) /obj/item/gun/ballistic/can_shoot() if(safety) @@ -303,11 +307,6 @@ return return FALSE -/obj/item/gun/ballistic/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) - if (sawn_off) - bonus_spread += SAWN_OFF_ACC_PENALTY - . = ..() - ///Installs a new suppressor, assumes that the suppressor is already in the contents of src /obj/item/gun/ballistic/proc/install_suppressor(obj/item/suppressor/S) suppressed = S @@ -351,8 +350,11 @@ bolt_locked = TRUE update_appearance() -/obj/item/gun/ballistic/afterattack() +/obj/item/gun/ballistic/pre_fire(atom/target, mob/living/user, message = TRUE, flag, params = null, zone_override = "", bonus_spread = 0, dual_wielded_gun = FALSE) prefire_empty_checks() + return ..() + +/obj/item/gun/ballistic/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0, burst_firing = FALSE, spread_override = 0, iteration = 0) . = ..() //The gun actually firing postfire_empty_checks(.) diff --git a/code/modules/projectiles/guns/ballistic/assault.dm b/code/modules/projectiles/guns/ballistic/assault.dm index d0b69480a106..9d97dc627bd4 100644 --- a/code/modules/projectiles/guns/ballistic/assault.dm +++ b/code/modules/projectiles/guns/ballistic/assault.dm @@ -1,10 +1,10 @@ /obj/item/gun/ballistic/automatic/assault - burst_size = 1 - actions_types = list() - wield_delay = 0.7 SECONDS + gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_FULLAUTO) + default_firemode = FIREMODE_SEMIAUTO + wield_delay = 0.8 SECONDS wield_slowdown = 0.6 - fire_delay = 1 + fire_delay = 0.2 SECONDS load_sound = 'sound/weapons/gun/rifle/ar_reload.ogg' load_empty_sound = 'sound/weapons/gun/rifle/ar_reload.ogg' @@ -17,18 +17,20 @@ /obj/item/gun/ballistic/automatic/assault/calculate_recoil(mob/user, recoil_bonus = 0) var/gunslinger_bonus = 2 var/total_recoil = recoil_bonus + if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger penalty total_recoil += gunslinger_bonus - total_recoil = clamp(total_recoil,0,INFINITY) - return total_recoil + + return ..(user, total_recoil) /obj/item/gun/ballistic/automatic/assault/calculate_spread(mob/user, bonus_spread) - var/gunslinger_bonus = 8 + var/gunslinger_bonus = 16 var/total_spread = bonus_spread + if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger penalty total_spread += gunslinger_bonus - total_spread = clamp(total_spread,0,INFINITY) - return total_spread + + return ..(user, total_spread) /obj/item/gun/ballistic/automatic/assault/skm name = "\improper SKM-24" @@ -44,8 +46,8 @@ icon_state = "skm" item_state = "skm" - mag_display = TRUE - special_mags = TRUE + show_magazine_on_sprite = TRUE + unique_mag_sprites_for_variants = TRUE weapon_weight = WEAPON_MEDIUM w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK @@ -55,9 +57,7 @@ spread = 1 wield_delay = 0.7 SECONDS -/obj/item/gun/ballistic/automatic/assault/skm/ComponentInitialize() - . = ..() - AddComponent(/datum/component/automatic_fire, 0.2 SECONDS) + fire_delay = 0.2 SECONDS /obj/item/gun/ballistic/automatic/assault/skm/pirate name = "\improper Chopper" @@ -82,22 +82,21 @@ fire_sound = 'sound/weapons/gun/rifle/m16.ogg' icon_state = "p16" item_state = "p16" - mag_display = TRUE + show_magazine_on_sprite = TRUE w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK mag_type = /obj/item/ammo_box/magazine/p16 spread = 2 wield_delay = 0.5 SECONDS + + fire_delay = 0.18 SECONDS + rack_sound = 'sound/weapons/gun/rifle/m16_cocked.ogg' load_sound = 'sound/weapons/gun/rifle/m16_reload.ogg' load_empty_sound = 'sound/weapons/gun/rifle/m16_reload.ogg' eject_sound = 'sound/weapons/gun/rifle/m16_unload.ogg' eject_empty_sound = 'sound/weapons/gun/rifle/m16_unload.ogg' -/obj/item/gun/ballistic/automatic/assault/p16/ComponentInitialize() - . = ..() - AddComponent(/datum/component/automatic_fire, 0.2 SECONDS) - /obj/item/gun/ballistic/automatic/assault/p16/minutemen name = "\improper CM-16" desc = "The standard-issue rifle of CLIP and an extensively modified reproduction of the P-16. Chambered in 5.56mm." @@ -106,72 +105,56 @@ /obj/item/gun/ballistic/automatic/assault/swiss_cheese name = "\improper Swiss Cheese" - desc = "An ancient longarm famous for its boxy, modular design. The DMA on this unit is, sadly, broken. Uses 5.56mm ammunition for Matter mode." + desc = "An ancient longarm famous for its boxy, modular design. Mass produced by the Terran Confederation in ages past, these often mutiple century old designs have survied due to their sheer ruggedness. The DMA on this unit is sadly broken, but these rifles are known for their excellent burst fire. Uses 5.56mm ammunition for Matter mode." icon = 'icons/obj/guns/48x32guns.dmi' fire_sound = 'sound/weapons/gun/rifle/swiss.ogg' icon_state = "swiss" item_state = "swiss" - mag_display = TRUE + show_magazine_on_sprite = TRUE empty_indicator = TRUE burst_size = 3 - fire_delay = 1.5 + burst_delay = 0.08 SECONDS + fire_delay = 0.25 SECONDS spread = 8 weapon_weight = WEAPON_MEDIUM + gun_firenames = list(FIREMODE_SEMIAUTO = "matter semi-auto", FIREMODE_BURST = "matter burst fire", FIREMODE_FULLAUTO = "matter full auto", FIREMODE_OTHER = "hybrid") + gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_BURST, FIREMODE_FULLAUTO, FIREMODE_OTHER) + + fire_select_icon_state_prefix = "swisschesse_" + w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK mag_type = /obj/item/ammo_box/magazine/swiss - actions_types = list(/datum/action/item_action/toggle_firemode) manufacturer = MANUFACTURER_SOLARARMORIES spread = 8 spread_unwielded = 15 -/obj/item/gun/ballistic/automatic/assault/swiss_cheese/ComponentInitialize() - . = ..() - AddComponent(/datum/component/automatic_fire, 0.65 SECONDS) - -/obj/item/gun/ballistic/automatic/assault/swiss_cheese/afterattack(atom/target, mob/living/user, flag, params) - if(select == 2) - to_chat(user, "You hear a strange sound from the DMA unit. It doesn't appear to be operational.") - return - else - return ..() - -/obj/item/gun/ballistic/automatic/assault/swiss_cheese/burst_select() - var/mob/living/carbon/human/user = usr - switch(select) - if(1) - select = 2 - to_chat(user, "You switch to Hybrid.") - if(2) - select = 1 - burst_size = initial(burst_size) - fire_delay = initial(fire_delay) - to_chat(user, "You switch to [burst_size]-rnd Matter.") - - playsound(user, 'sound/weapons/gun/general/selector.ogg', 100, TRUE) - update_appearance() - for(var/datum/action/action as anything in actions) - action.UpdateButtonIcon() - -#define E40_BALLISTIC_MODE 1 -#define E40_LASER_MODE 2 +/obj/item/gun/ballistic/automatic/assault/swiss_cheese/process_other(atom/target, mob/living/user, message = TRUE, flag, params = null, zone_override = "", bonus_spread = 0) + to_chat(user, "You hear a strange sound from the DMA unit. It doesn't appear to be operational.") /obj/item/gun/ballistic/automatic/assault/e40 name = "\improper E-40 Hybrid Rifle" - desc = "A Hybrid Assault Rifle, best known for being having a dual ballistic and laser system. Chambered in .229 Eoehoma caseless, and uses energy for lasers." + desc = "A Hybrid Assault Rifle, best known for being having a dual ballistic/laser system along with an advanced ammo counter. Once an icon for bounty hunters, age has broken most down, so these end up in collector's hands or as shoddy Frontiersmen laser SMG conversions when in their inheritted stockpiles. But if one were to find one in working condition, it would be just as formidable as back then. Chambered in .229 Eoehoma caseless, and uses energy for lasers." icon = 'icons/obj/guns/48x32guns.dmi' icon_state = "e40" item_state = "e40" mag_type = /obj/item/ammo_box/magazine/e40 can_suppress = FALSE - actions_types = list(/datum/action/item_action/toggle_firemode) var/obj/item/gun/energy/laser/e40_laser_secondary/secondary + fire_select_icon_state_prefix = "e40_" + + fire_delay = 0.18 SECONDS + recoil_unwielded = 3 + + gun_firenames = list(FIREMODE_FULLAUTO = "full auto ballistic", FIREMODE_OTHER = "full auto laser") + gun_firemodes = list(FIREMODE_FULLAUTO, FIREMODE_OTHER) + default_firemode = FIREMODE_OTHER weapon_weight = WEAPON_MEDIUM w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK - mag_display = TRUE + show_magazine_on_sprite = TRUE empty_indicator = TRUE fire_sound = 'sound/weapons/gun/laser/e40_bal.ogg' manufacturer = MANUFACTURER_EOEHOMA @@ -179,56 +162,84 @@ /obj/item/gun/ballistic/automatic/assault/e40/Initialize() . = ..() secondary = new /obj/item/gun/energy/laser/e40_laser_secondary(src) - AddComponent(/datum/component/automatic_fire, 0.2 SECONDS) RegisterSignal(secondary, COMSIG_ATOM_UPDATE_ICON, PROC_REF(secondary_update_icon)) SEND_SIGNAL(secondary, COMSIG_GUN_DISABLE_AUTOFIRE) update_appearance() +/obj/item/gun/ballistic/automatic/assault/e40/ComponentInitialize() + . = ..() + AddComponent(/datum/component/ammo_hud/eoehoma) // at long last... the ammo counter on the side of the sprite is functional... + /obj/item/gun/ballistic/automatic/assault/e40/do_autofire(datum/source, atom/target, mob/living/shooter, params) - if(select == E40_LASER_MODE) - secondary.do_autofire(source, target, shooter, params) - else + var/current_firemode = gun_firemodes[firemode_index] + if(current_firemode != FIREMODE_OTHER) return ..() + return secondary.do_autofire(source, target, shooter, params) /obj/item/gun/ballistic/automatic/assault/e40/do_autofire_shot(datum/source, atom/target, mob/living/shooter, params) - if(select == E40_LASER_MODE) - secondary.do_autofire_shot(source, target, shooter, params) - else + var/current_firemode = gun_firemodes[firemode_index] + if(current_firemode != FIREMODE_OTHER) return ..() + return secondary.do_autofire_shot(source, target, shooter, params) /obj/item/gun/ballistic/automatic/assault/e40/process_fire(atom/target, mob/living/user, message, params, zone_override, bonus_spread) - if(select == E40_LASER_MODE) - secondary.process_fire(target, user, message, params, zone_override, bonus_spread) - else + var/current_firemode = gun_firemodes[firemode_index] + if(current_firemode != FIREMODE_OTHER) return ..() + return secondary.process_fire(target, user, message, params, zone_override, bonus_spread) /obj/item/gun/ballistic/automatic/assault/e40/can_shoot() - if(select == E40_LASER_MODE) - return secondary.can_shoot() - else + var/current_firemode = gun_firemodes[firemode_index] + if(current_firemode != FIREMODE_OTHER) return ..() + return secondary.can_shoot() /obj/item/gun/ballistic/automatic/assault/e40/afterattack(atom/target, mob/living/user, flag, params) - if(select == E40_LASER_MODE) - secondary.afterattack(target, user, flag, params) - else + var/current_firemode = gun_firemodes[firemode_index] + if(current_firemode != FIREMODE_OTHER) return ..() + return secondary.afterattack(target, user, flag, params) /obj/item/gun/ballistic/automatic/assault/e40/attackby(obj/item/attack_obj, mob/user, params) if(istype(attack_obj, /obj/item/stock_parts/cell/gun)) - secondary.attackby(attack_obj, user, params) + return secondary.attackby(attack_obj, user, params) if(istype(attack_obj, /obj/item/screwdriver)) - secondary.screwdriver_act(user, attack_obj,) - else - ..() + return secondary.screwdriver_act(user, attack_obj,) + return ..() + /obj/item/gun/ballistic/automatic/assault/e40/can_shoot() - if(select == E40_LASER_MODE) - return secondary.can_shoot() - return ..() + var/current_firemode = gun_firemodes[firemode_index] + if(current_firemode != FIREMODE_OTHER) + return ..() + return secondary.can_shoot() + +/obj/item/gun/ballistic/automatic/assault/e40/on_wield(obj/item/source, mob/user) + wielded = TRUE + secondary.wielded = TRUE + INVOKE_ASYNC(src, .proc.do_wield, user) + +/obj/item/gun/ballistic/automatic/assault/e40/do_wield(mob/user) + . = ..() + secondary.wielded_fully = wielded_fully + +/// triggered on unwield of two handed item +/obj/item/gun/ballistic/automatic/assault/e40/on_unwield(obj/item/source, mob/user) + . = ..() + secondary.wielded_fully = FALSE + secondary.wielded = FALSE + /obj/item/gun/ballistic/automatic/assault/e40/proc/secondary_update_icon() - update_icon() + update_appearance() + SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD) + +/obj/item/gun/ballistic/automatic/assault/e40/process_other(atom/target, mob/living/user, message = TRUE, flag, params = null, zone_override = "", bonus_spread = 0) + secondary.pre_fire(target, user, message, flag, params, zone_override, bonus_spread) + + +/obj/item/gun/ballistic/automatic/powered/get_cell() + return cell /obj/item/gun/ballistic/automatic/assault/e40/update_overlays() . = ..() @@ -244,41 +255,33 @@ . += "[icon_state]_cell" -/obj/item/gun/ballistic/automatic/assault/e40/burst_select() - var/mob/living/carbon/human/user = usr - switch(select) - if(NONE) - select = E40_BALLISTIC_MODE - to_chat(user, "You switch to full automatic ballistic.") - if(E40_BALLISTIC_MODE) - select = E40_LASER_MODE - to_chat(user, "You switch to full auto laser.") - SEND_SIGNAL(src, COMSIG_GUN_DISABLE_AUTOFIRE) - SEND_SIGNAL(secondary, COMSIG_GUN_ENABLE_AUTOFIRE) - if(E40_LASER_MODE) - select = E40_BALLISTIC_MODE - to_chat(user, "You switch to full automatic ballistic.") - SEND_SIGNAL(src, COMSIG_GUN_ENABLE_AUTOFIRE) - SEND_SIGNAL(secondary, COMSIG_GUN_DISABLE_AUTOFIRE) - playsound(user, 'sound/weapons/empty.ogg', 100, TRUE) - update_icon() - return - - - /obj/item/gun/ballistic/automatic/assault/e40/toggle_safety(mob/user, silent=FALSE) . = ..() secondary.toggle_safety(user, silent=TRUE) +/obj/item/gun/ballistic/automatic/assault/e40/fire_select(mob/living/carbon/human/user) + . = ..() + var/current_firemode = gun_firemodes[firemode_index] + if(current_firemode == FIREMODE_OTHER) + SEND_SIGNAL(src, COMSIG_GUN_ENABLE_AUTOFIRE) + SEND_SIGNAL(src, COMSIG_GUN_SET_AUTOFIRE_SPEED, secondary.fire_delay) + else + SEND_SIGNAL(src, COMSIG_GUN_SET_AUTOFIRE_SPEED, fire_delay) + SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD) + //laser /obj/item/gun/energy/laser/e40_laser_secondary name = "secondary e40 laser gun" - desc = "The laser component of a E-40 Hybrid Rifle. You probably shouldn't see this." + desc = "The laser component of a E-40 Hybrid Rifle. You probably shouldn't see this. If you can though, you should probably know lorewise, this is primary, the ballistic compontent in universe is secondary. Unfortunately, we cannot simulate this, So codewise this is secondary." fire_sound = 'sound/weapons/gun/laser/e40_las.ogg' w_class = WEIGHT_CLASS_NORMAL ammo_type = list(/obj/item/ammo_casing/energy/laser/assault) - fire_delay = 2 + fire_delay = 0.2 SECONDS + gun_firemodes = list(FIREMODE_FULLAUTO) + default_firemode = FIREMODE_FULLAUTO + + spread_unwielded = 20 //techinically a battle rifle, i'm putting it here for organisation sake @@ -294,12 +297,13 @@ internal_magazine = TRUE mag_type = /obj/item/ammo_box/magazine/internal/vickland fire_sound = 'sound/weapons/gun/rifle/vickland.ogg' - burst_size = 0 actions_types = list() manufacturer = MANUFACTURER_HUNTERSPRIDE rack_sound = 'sound/weapons/gun/rifle/ar_cock.ogg' + fire_delay = 0.4 SECONDS + spread_unwielded = 25 recoil = 0 recoil_unwielded = 4 diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index abc0bcbc9bcb..c0ccf71d513e 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -1,10 +1,10 @@ + /obj/item/gun/ballistic/automatic w_class = WEIGHT_CLASS_NORMAL - var/select = 1 can_suppress = TRUE - burst_size = 3 - fire_delay = 2 - actions_types = list(/datum/action/item_action/toggle_firemode) + + gun_firemodes = list(FIREMODE_SEMIAUTO) + default_firemode = FIREMODE_SEMIAUTO semi_auto = TRUE fire_sound = 'sound/weapons/gun/smg/shot.ogg' fire_sound_volume = 90 @@ -14,6 +14,7 @@ weapon_weight = WEAPON_MEDIUM pickup_sound = 'sound/items/handling/rifle_pickup.ogg' + fire_delay = 0.4 SECONDS wield_delay = 1 SECONDS spread = 0 spread_unwielded = 13 @@ -21,36 +22,6 @@ recoil_unwielded = 4 wield_slowdown = 0.35 -/obj/item/gun/ballistic/automatic/update_overlays() - . = ..() - if(!select) - . += "[initial(icon_state)]_semi" - if(select == 1) - . += "[initial(icon_state)]_burst" - -/obj/item/gun/ballistic/automatic/ui_action_click(mob/user, actiontype) - if(istype(actiontype, /datum/action/item_action/toggle_firemode)) - burst_select() - else - ..() - -/obj/item/gun/ballistic/automatic/proc/burst_select() - var/mob/living/carbon/human/user = usr - select = !select - if(!select) - burst_size = 1 - fire_delay = 0 - to_chat(user, "You switch to semi-automatic.") - else - burst_size = initial(burst_size) - fire_delay = initial(fire_delay) - to_chat(user, "You switch to [burst_size]-rnd burst.") - - playsound(user, 'sound/weapons/gun/general/selector.ogg', 100, TRUE) - update_appearance() - for(var/X in actions) - var/datum/action/A = X - A.UpdateButtonIcon() // SNIPER // @@ -68,7 +39,6 @@ recoil = 2 weapon_weight = WEAPON_HEAVY mag_type = /obj/item/ammo_box/magazine/sniper_rounds - fire_delay = 40 burst_size = 1 w_class = WEIGHT_CLASS_NORMAL zoomable = TRUE @@ -76,13 +46,13 @@ zoom_out_amt = 5 slot_flags = ITEM_SLOT_BACK actions_types = list() - mag_display = TRUE + show_magazine_on_sprite = TRUE manufacturer = MANUFACTURER_SCARBOROUGH spread = -5 spread_unwielded = 20 - recoil = 0 - recoil_unwielded = 4 + recoil = 5 + recoil_unwielded = 50 wield_slowdown = 1 wield_delay = 1.3 SECONDS @@ -96,38 +66,36 @@ EMPTY_GUN_HELPER(automatic/sniper_rifle/syndicate) // Old Semi-Auto Rifle // -/obj/item/gun/ballistic/automatic/surplus +/obj/item/gun/ballistic/automatic/surplus //TODO: NEEDS TO BE REPLACED WITH PISTOL CARBINES OR LOWCAL SEMI-AUTO RIFLES name = "surplus rifle" desc = "One of countless cheap, obsolete rifles found throughout the Frontier. Its lack of lethality renders it mostly a deterrent. Chambered in 10mm." icon_state = "surplus" item_state = "moistnugget" weapon_weight = WEAPON_HEAVY mag_type = /obj/item/ammo_box/magazine/m10mm/rifle - fire_delay = 10 + fire_delay = 0.5 SECONDS burst_size = 1 can_unsuppress = TRUE can_suppress = TRUE w_class = WEIGHT_CLASS_HUGE slot_flags = ITEM_SLOT_BACK - actions_types = list() - mag_display = TRUE + show_magazine_on_sprite = TRUE // Laser rifle (rechargeable magazine) // -/obj/item/gun/ballistic/automatic/laser +/obj/item/gun/ballistic/automatic/laser //TODO: REMOVE name = "laser rifle" desc = "Though sometimes mocked for the relatively weak firepower of their energy weapons, the logistic miracle of rechargeable ammunition has given Nanotrasen a decisive edge over many a foe." icon_state = "oldrifle" item_state = "arg" mag_type = /obj/item/ammo_box/magazine/recharge - fire_delay = 2 + fire_delay = 0.2 SECONDS can_suppress = FALSE burst_size = 0 - actions_types = list() fire_sound = 'sound/weapons/laser.ogg' casing_ejector = FALSE -/obj/item/gun/ballistic/automatic/ebr +/obj/item/gun/ballistic/automatic/ebr //fuck this gun, its getting wiped soon enough name = "\improper M514 EBR" desc = "A reliable, high-powered battle rifle often found in the hands of Syndicate personnel and remnants, chambered in .308. Effective against personnel and armor alike." icon = 'icons/obj/guns/48x32guns.dmi' @@ -136,13 +104,12 @@ EMPTY_GUN_HELPER(automatic/sniper_rifle/syndicate) icon_state = "ebr" item_state = "ebr" zoomable = TRUE - mag_display = TRUE + show_magazine_on_sprite = TRUE weapon_weight = WEAPON_MEDIUM w_class = WEIGHT_CLASS_BULKY mag_type = /obj/item/ammo_box/magazine/ebr fire_sound = 'sound/weapons/gun/rifle/shot_alt2.ogg' burst_size = 0 - actions_types = list() manufacturer = MANUFACTURER_SCARBOROUGH wield_slowdown = 2 @@ -158,7 +125,7 @@ EMPTY_GUN_HELPER(automatic/ebr) icon_state = "gal" item_state = "gal" zoomable = TRUE - mag_display = TRUE + show_magazine_on_sprite = TRUE weapon_weight = WEAPON_MEDIUM w_class = WEIGHT_CLASS_BULKY mag_type = /obj/item/ammo_box/magazine/gal @@ -169,6 +136,8 @@ EMPTY_GUN_HELPER(automatic/ebr) wield_slowdown = 2 spread = -4 + fire_select_icon_state_prefix = "clip_" + adjust_fire_select_icon_state_on_safety = TRUE /obj/item/gun/ballistic/automatic/gal/inteq name = "\improper SsG-04" @@ -185,5 +154,5 @@ EMPTY_GUN_HELPER(automatic/ebr) can_suppress = FALSE actions_types = list() can_bayonet = FALSE - mag_display = TRUE + show_magazine_on_sprite = TRUE weapon_weight = WEAPON_LIGHT diff --git a/code/modules/projectiles/guns/ballistic/gauss.dm b/code/modules/projectiles/guns/ballistic/gauss.dm index 8fce353d8b22..c50f906e4eba 100644 --- a/code/modules/projectiles/guns/ballistic/gauss.dm +++ b/code/modules/projectiles/guns/ballistic/gauss.dm @@ -9,9 +9,9 @@ load_sound = 'sound/weapons/gun/gauss/rifle_reload.ogg' can_suppress = FALSE burst_size = 1 - fire_delay = 3 + fire_delay = 0.3 SECONDS spread = 0 - mag_display = TRUE + show_magazine_on_sprite = TRUE empty_indicator = TRUE weapon_weight = WEAPON_MEDIUM w_class = WEIGHT_CLASS_BULKY @@ -25,6 +25,7 @@ recoil_unwielded = 4 wield_slowdown = 0.75 wield_delay = 1 SECONDS + fire_select_icon_state_prefix = "pellet_" /obj/item/gun/ballistic/automatic/powered/gauss/modelh name = "Model H" @@ -37,14 +38,15 @@ cell_type = /obj/item/stock_parts/cell/gun/solgov slot_flags = ITEM_SLOT_BELT w_class = WEIGHT_CLASS_SMALL - fire_delay = 0 //pistol - mag_display = FALSE + fire_delay = 0.6 SECONDS //pistol, but heavy caliber. + show_magazine_on_sprite = FALSE empty_indicator = FALSE manufacturer = MANUFACTURER_SOLARARMORIES - recoil = 1 + recoil = 2 recoil_unwielded = 4 - spread = 3 + spread = 6 spread_unwielded = 12 + fire_select_icon_state_prefix = "slug_" /obj/item/gun/ballistic/automatic/powered/gauss/modelh/suns desc = "A standard-issue pistol exported from the Solarian Confederation. It fires slow flesh-rending ferromagnetic slugs at a high energy cost, however they are ineffective on any armor. It is painted in the colors of SUNS." @@ -62,13 +64,13 @@ fire_sound = 'sound/weapons/gun/gauss/claris.ogg' load_sound = 'sound/weapons/gun/gauss/sniper_reload.ogg' cell_type = /obj/item/stock_parts/cell/gun/solgov - fire_delay = 2 + fire_delay = 0.4 SECONDS bolt_type = BOLT_TYPE_NO_BOLT internal_magazine = TRUE - casing_ejector = FALSE - mag_display = FALSE + show_magazine_on_sprite = FALSE empty_indicator = FALSE manufacturer = MANUFACTURER_SOLARARMORIES + fire_select_icon_state_prefix = "pellet_" /obj/item/gun/ballistic/automatic/powered/gauss/claris/suns desc = "An antiquated Solarian rifle. Chambered in ferromagnetic pellets, just as the founding Solarians intended. Evidently, SUNS' founders echo the sentiment, as it appears to be painted in their colors." @@ -85,17 +87,19 @@ fire_sound = 'sound/weapons/gun/gauss/gar.ogg' load_sound = 'sound/weapons/gun/gauss/rifle_reload.ogg' cell_type = /obj/item/stock_parts/cell/gun/solgov - burst_size = 2 - fire_delay = 1 + burst_size = 1 + + fire_delay = 0.2 SECONDS + actions_types = list() empty_indicator = FALSE manufacturer = MANUFACTURER_SOLARARMORIES - wield_delay = 0.7 SECONDS + gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_FULLAUTO) + default_firemode = FIREMODE_SEMIAUTO -/obj/item/gun/ballistic/automatic/powered/gauss/gar/ComponentInitialize() - . = ..() - AddComponent(/datum/component/automatic_fire, 0.2 SECONDS) + wield_delay = 0.7 SECONDS + fire_select_icon_state_prefix = "lance_" /obj/item/gun/ballistic/automatic/powered/gauss/gar/suns desc = "A Solarian carbine, unusually modern for its producers. It's just modern enough for SUNS, however, who have painted the weapon in their colors. Launches ferromagnetic lances at alarming speeds." diff --git a/code/modules/projectiles/guns/ballistic/hmg.dm b/code/modules/projectiles/guns/ballistic/hmg.dm index 359a9e13e31e..4e9abd0cd70c 100644 --- a/code/modules/projectiles/guns/ballistic/hmg.dm +++ b/code/modules/projectiles/guns/ballistic/hmg.dm @@ -7,7 +7,10 @@ burst_size = 1 actions_types = list(/datum/action/item_action/deploy_bipod) //this is on hmg, as I need the same mechanics for a future gun. ideally, this would be an attachment, but that's still pending drag_slowdown = 1.5 - fire_delay = 1 + fire_delay = 0.1 SECONDS + + gun_firemodes = list(FIREMODE_FULLAUTO) + default_firemode = FIREMODE_FULLAUTO spread = 4 spread_unwielded = 80 @@ -114,24 +117,26 @@ retract_bipod(user=user) /obj/item/gun/ballistic/automatic/hmg/calculate_recoil(mob/user, recoil_bonus = 0) - var/gunslinger_bonus = 1 + var/gunslinger_bonus = 2 var/total_recoil = recoil_bonus + if(bipod_deployed) total_recoil += deploy_recoil_bonus if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger penalty total_recoil += gunslinger_bonus - total_recoil = clamp(total_recoil,0,INFINITY) - return total_recoil + + return ..(user, total_recoil) /obj/item/gun/ballistic/automatic/hmg/calculate_spread(mob/user, bonus_spread) - var/gunslinger_bonus = 4 + var/gunslinger_bonus = 20 var/total_spread = bonus_spread + if(bipod_deployed) total_spread += deploy_spread_bonus if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger penalty total_spread += gunslinger_bonus - total_spread = clamp(total_spread,0,INFINITY) - return total_spread + + return ..(user, total_spread) /obj/item/gun/ballistic/automatic/hmg/update_icon_state() @@ -155,9 +160,12 @@ mag_type = /obj/item/ammo_box/magazine/mm712x82 can_suppress = FALSE spread = 7 + + fire_delay = 0.1 SECONDS + bolt_type = BOLT_TYPE_OPEN - mag_display = TRUE - mag_display_ammo = TRUE + show_magazine_on_sprite = TRUE + show_magazine_on_sprite_ammo = TRUE tac_reloads = FALSE fire_sound = 'sound/weapons/gun/l6/shot.ogg' rack_sound = 'sound/weapons/gun/l6/l6_rack.ogg' @@ -165,10 +173,6 @@ manufacturer = MANUFACTURER_SCARBOROUGH var/cover_open = FALSE -/obj/item/gun/ballistic/automatic/hmg/l6_saw/ComponentInitialize() - . = ..() - AddComponent(/datum/component/automatic_fire, 0.1 SECONDS) - /obj/item/gun/ballistic/automatic/hmg/l6_saw/examine(mob/user) . = ..() . += "alt + click to [cover_open ? "close" : "open"] the dust cover." @@ -217,16 +221,17 @@ item_state = "arg" mag_type = /obj/item/ammo_box/magazine/rifle47x33mm spread = 7 + + fire_delay = 0.1 SECONDS + + fire_select_icon_state_prefix = "caseless_" + can_suppress = FALSE can_bayonet = FALSE - mag_display = TRUE + show_magazine_on_sprite = TRUE w_class = WEIGHT_CLASS_BULKY manufacturer = MANUFACTURER_SOLARARMORIES -/obj/item/gun/ballistic/automatic/hmg/solar/ComponentInitialize() - . = ..() - AddComponent(/datum/component/automatic_fire, 0.1 SECONDS) - /obj/item/gun/ballistic/automatic/hmg/skm_lmg name = "\improper SKM-24u" desc = "What appears to be a standard SKM-24 at first glance is actually a light machine gun conversion, with an extended, heavy barrel and overhauled internals. Its weight, bulk, and robust fire rate make it difficult to handle without using the bipod in a prone position or against appropriate cover such as a table. Chambered in 7.62x40mm CLIP." @@ -242,15 +247,18 @@ eject_sound = 'sound/weapons/gun/rifle/skm_unload.ogg' eject_empty_sound = 'sound/weapons/gun/rifle/skm_unload.ogg' + gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_FULLAUTO) + default_firemode = FIREMODE_SEMIAUTO - mag_display = TRUE - special_mags = TRUE + show_magazine_on_sprite = TRUE + unique_mag_sprites_for_variants = TRUE weapon_weight = WEAPON_MEDIUM w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK manufacturer = MANUFACTURER_IMPORT mag_type = /obj/item/ammo_box/magazine/skm_762_40 + fire_delay = 0.13 SECONDS spread = 7 //you can hipfire, but why? spread_unwielded = 25 @@ -265,7 +273,6 @@ /obj/item/gun/ballistic/automatic/hmg/skm_lmg/ComponentInitialize() . = ..() - AddComponent(/datum/component/automatic_fire, 0.13 SECONDS) //slower than other lmgs but faster than skm and most smgs AddElement(/datum/element/update_icon_updates_onmob) /obj/item/gun/ballistic/automatic/hmg/skm_lmg/extended //spawns with the proper extended magazine, for erts diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm index 01644cd6e9bb..5619b039d488 100644 --- a/code/modules/projectiles/guns/ballistic/launchers.dm +++ b/code/modules/projectiles/guns/ballistic/launchers.dm @@ -11,7 +11,11 @@ fire_sound = 'sound/weapons/gun/general/grenade_launch.ogg' w_class = WEIGHT_CLASS_NORMAL bolt_type = BOLT_TYPE_NO_BOLT - fire_delay = 10 + fire_delay = 1 SECONDS + semi_auto = TRUE + has_safety = FALSE + safety = FALSE + gate_offset = 0 /obj/item/gun/ballistic/revolver/grenadelauncher/attackby(obj/item/A, mob/user, params) ..() @@ -35,7 +39,7 @@ fire_sound = 'sound/weapons/gun/general/grenade_launch.ogg' mag_type = /obj/item/ammo_box/magazine/m75 burst_size = 1 - fire_delay = 0 + fire_delay = 0.4 SECONDS actions_types = list() casing_ejector = FALSE @@ -50,7 +54,7 @@ w_class = WEIGHT_CLASS_BULKY can_suppress = FALSE burst_size = 1 - fire_delay = 0 + fire_delay = 0.4 SECONDS casing_ejector = FALSE weapon_weight = WEAPON_HEAVY bolt_type = BOLT_TYPE_NO_BOLT diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index 11aad5203361..160067b6d250 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -5,8 +5,6 @@ w_class = WEIGHT_CLASS_SMALL mag_type = /obj/item/ammo_box/magazine/m10mm can_suppress = TRUE - burst_size = 1 - fire_delay = 0 //spam it as fast as you can actions_types = list() bolt_type = BOLT_TYPE_LOCKING fire_sound = 'sound/weapons/gun/pistol/shot.ogg' @@ -24,12 +22,16 @@ bolt_wording = "slide" weapon_weight = WEAPON_LIGHT pickup_sound = 'sound/items/handling/gun_pickup.ogg' - fire_delay = 1 manufacturer = MANUFACTURER_SCARBOROUGH + recoil = 0.5 // apogee wants bloom, this is a placeholder until then to simulate the same concept. + recoil_unwielded = 3 + recoil_backtime_multiplier = 1 + wield_delay = 0.2 SECONDS - spread = 2 - spread_unwielded = 5 + fire_delay = 0.2 SECONDS + spread = 5 + spread_unwielded = 7 wield_slowdown = 0.15 muzzleflash_iconstate = "muzzle_flash_light" @@ -62,7 +64,6 @@ EMPTY_GUN_HELPER(automatic/pistol) load_empty_sound = 'sound/weapons/gun/pistol/candor_reload.ogg' eject_sound = 'sound/weapons/gun/pistol/candor_unload.ogg' eject_empty_sound = 'sound/weapons/gun/pistol/candor_unload.ogg' - recoil = -2 EMPTY_GUN_HELPER(automatic/pistol/candor) @@ -89,7 +90,7 @@ EMPTY_GUN_HELPER(automatic/pistol/candor/factory) force = 14 mag_type = /obj/item/ammo_box/magazine/m50 can_suppress = FALSE - mag_display = TRUE + show_magazine_on_sprite = TRUE fire_sound = 'sound/weapons/gun/pistol/deagle.ogg' rack_sound = 'sound/weapons/gun/pistol/rack.ogg' lock_back_sound = 'sound/weapons/gun/pistol/slide_lock.ogg' @@ -99,11 +100,13 @@ EMPTY_GUN_HELPER(automatic/pistol/candor/factory) load_empty_sound = 'sound/weapons/gun/pistol/deagle_reload.ogg' eject_sound = 'sound/weapons/gun/pistol/deagle_unload.ogg' eject_empty_sound = 'sound/weapons/gun/pistol/deagle_unload.ogg' - fire_delay = 0.7 SECONDS - recoil = 1 - recoil_unwielded = 2 - spread = 4 - spread_unwielded = 7 + fire_delay = 0.6 SECONDS + recoil = 2 + recoil_unwielded = 5 + recoil_backtime_multiplier = 2 + + spread = 7 + spread_unwielded = 14 /obj/item/gun/ballistic/automatic/pistol/deagle/gold desc = "A gold-plated Desert Eagle folded over a million times by superior Martian gunsmiths. Uses .50 AE ammo." @@ -123,8 +126,11 @@ EMPTY_GUN_HELPER(automatic/pistol/candor/factory) mag_type = /obj/item/ammo_box/magazine/pistolm9mm can_suppress = FALSE burst_size = 3 - fire_delay = 2 - actions_types = list(/datum/action/item_action/toggle_firemode) + burst_delay = 0.1 SECONDS + fire_delay = 0.4 SECONDS + gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_BURST) + default_firemode = FIREMODE_SEMIAUTO + /obj/item/gun/ballistic/automatic/pistol/stickman name = "flat gun" @@ -236,6 +242,8 @@ EMPTY_GUN_HELPER(automatic/pistol/commander/inteq) eject_sound = 'sound/weapons/gun/pistol/mag_release.ogg' eject_empty_sound = 'sound/weapons/gun/pistol/mag_release.ogg' + fire_select_icon_state_prefix = "caseless_" + /obj/item/gun/ballistic/automatic/pistol/solgov/old icon_state = "pistole-c-old" @@ -246,7 +254,7 @@ EMPTY_GUN_HELPER(automatic/pistol/commander/inteq) weapon_weight = WEAPON_LIGHT w_class = WEIGHT_CLASS_SMALL mag_type = /obj/item/ammo_box/magazine/tec9 - mag_display = TRUE + show_magazine_on_sprite = TRUE load_sound = 'sound/weapons/gun/pistol/mag_insert.ogg' load_empty_sound = 'sound/weapons/gun/pistol/mag_insert.ogg' eject_sound = 'sound/weapons/gun/pistol/mag_release.ogg' diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index 27c3d124906a..f39382e81ea2 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -25,7 +25,7 @@ var/spin_delay = 10 var/recent_spin = 0 manufacturer = MANUFACTURER_SCARBOROUGH - fire_delay = 2 + fire_delay = 0.4 SECONDS spread_unwielded = 15 recoil = 0.5 recoil_unwielded = 2 @@ -35,6 +35,9 @@ dry_fire_text = "snap" wield_slowdown = 0.3 + gun_firemodes = list(FIREMODE_SEMIAUTO) + default_firemode = FIREMODE_SEMIAUTO + safety_wording = "hammer" var/gate_loaded = FALSE //for stupid wild west shit @@ -279,7 +282,8 @@ to_chat(user, "You rack the [bolt_wording] of \the [src].") playsound(src, rack_sound, rack_sound_volume, rack_sound_vary) - chamber_round(TRUE) + if((!safety && !semi_auto) || (!safety && !semi_auto)) + chamber_round(TRUE) SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD) update_appearance() @@ -411,11 +415,14 @@ var/fan = FALSE if(HAS_TRAIT(user, TRAIT_GUNSLINGER) && !semi_auto && !wielded && loc == user && !safety && !user.get_inactive_held_item()) fan = TRUE + fire_delay = 0 SECONDS . = ..() + fire_delay = src::fire_delay if(fan) rack() to_chat(user, "You fan the [bolt_wording] of \the [src]!") - user.changeNext_move(CLICK_CD_RAPID) + balloon_alert_to_viewers("fans revolver!") + fire_delay = 0 SECONDS /obj/item/gun/ballistic/revolver/shoot_live_shot(mob/living/user, pointblank, atom/pbtarget, message) . = ..() @@ -434,18 +441,22 @@ /obj/item/gun/ballistic/revolver/calculate_recoil(mob/user, recoil_bonus = 0) var/gunslinger_bonus = -1 var/total_recoil = recoil_bonus + if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger bonus total_recoil += gunslinger_bonus total_recoil = clamp(total_recoil,0,INFINITY) - return total_recoil + + return ..(user, total_recoil) /obj/item/gun/ballistic/revolver/calculate_spread(mob/user, bonus_spread) - var/gunslinger_bonus = -4 + var/gunslinger_bonus = -8 var/total_spread = bonus_spread + if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger bonus total_spread += gunslinger_bonus total_spread = clamp(total_spread,0,INFINITY) - return total_spread + + return ..(user, total_spread) /obj/item/gun/ballistic/revolver/pickup(mob/user) . = ..() @@ -454,12 +465,6 @@ /obj/item/gun/ballistic/revolver/proc/tryflip(mob/living/user) if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) if(COOLDOWN_FINISHED(src, flip_cooldown)) - if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(40)) - to_chat(user, "While trying to flip the [src] you pull the trigger and accidently shoot yourself!") - var/flip_mistake = pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, BODY_ZONE_HEAD, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_CHEST) - process_fire(user, user, FALSE, flip_mistake) - user.dropItemToGround(src, TRUE) - return COOLDOWN_START(src, flip_cooldown, 0.3 SECONDS) SpinAnimation(5,1) user.visible_message("[user] spins the [src] around their finger by the trigger. That’s pretty badass.") @@ -486,14 +491,15 @@ manufacturer = MANUFACTURER_HUNTERSPRIDE recoil = 0 //weaker than normal revolver, no recoil + fire_delay = 0.2 SECONDS EMPTY_GUN_HELPER(revolver/detective) /obj/item/gun/ballistic/revolver/detective/ComponentInitialize() . = ..() AddComponent(/datum/component/ammo_hud/revolver) //note that the hud at the moment only supports 6 round revolvers, 7 or 5 isn't supported rn - -/obj/item/gun/ballistic/revolver/detective/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) +//...why...? +/obj/item/gun/ballistic/revolver/detective/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0, burst_firing = FALSE, spread_override = 0, iteration = 0) if(magazine.caliber != initial(magazine.caliber)) if(prob(100 - (magazine.ammo_count() * 5))) //minimum probability of 70, maximum of 95 playsound(user, fire_sound, fire_sound_volume, vary_fire_sound) @@ -580,19 +586,22 @@ EMPTY_GUN_HELPER(revolver/detective) fire_sound = 'sound/weapons/gun/revolver/shot_hunting.ogg' manufacturer = MANUFACTURER_HUNTERSPRIDE gate_loaded = TRUE + fire_delay = 0.6 SECONDS wield_slowdown = 0.5 - spread_unwielded = 5 - spread = 2 + spread_unwielded = 20 + spread = 6 recoil = 2 recoil_unwielded = 4 -// A gun to play Russian Roulette! -// You can spin the chamber to randomize the position of the bullet. - /obj/item/gun/ballistic/revolver/ashhand/ComponentInitialize() . = ..() AddComponent(/datum/component/ammo_hud/revolver) +// A gun to play Russian Roulette! +// You can spin the chamber to randomize the position of the bullet. + +//TODO: this is stupid, but used in ONE fucking ruin. Remember to remove when you aren't afraid to do a ton of path changes. + /obj/item/gun/ballistic/revolver/russian name = "\improper Russian revolver" desc = "A Solarian revolver for particularly lethal drinking games. It has a mechanism requiring you to spin the chamber before each trigger pull. Uses .357 ammo." @@ -691,7 +700,7 @@ EMPTY_GUN_HELPER(revolver/detective) spread = 20 manufacturer = MANUFACTURER_HUNTERSPRIDE spread_unwielded = 50 - fire_delay = 0 + fire_delay = 0 SECONDS gate_offset = 4 semi_auto = TRUE safety_wording = "safety" @@ -717,6 +726,7 @@ EMPTY_GUN_HELPER(revolver/detective) ) recoil = 0 //weaker than normal revolver, no recoil + spread_unwielded = 10 /obj/item/gun/ballistic/revolver/shadow/ComponentInitialize() . = ..() diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm index 24cf3323048a..bdeb7a4811f3 100644 --- a/code/modules/projectiles/guns/ballistic/rifle.dm +++ b/code/modules/projectiles/guns/ballistic/rifle.dm @@ -22,8 +22,11 @@ weapon_weight = WEAPON_MEDIUM pickup_sound = 'sound/items/handling/rifle_pickup.ogg' + gun_firemodes = list(FIREMODE_SEMIAUTO) + default_firemode = FIREMODE_SEMIAUTO + spread = -1 - spread_unwielded = 12 + spread_unwielded = 48 recoil = -3 recoil_unwielded = 4 wield_slowdown = 1 @@ -89,18 +92,18 @@ /obj/item/gun/ballistic/rifle/illestren/sawoff(mob/user) . = ..() if(.) - spread = 36 - spread_unwielded = 108 + spread = 24 + spread_unwielded = 30 can_bayonet = FALSE item_state = "illestren_sawn" mob_overlay_state = item_state weapon_weight = WEAPON_MEDIUM //you can fire it onehanded, makes it worse than worse than useless onehanded, but you can /obj/item/gun/ballistic/rifle/illestren/blow_up(mob/user) - . = 0 + . = FALSE if(chambered && chambered.BB) process_fire(user, user, FALSE) - . = 1 + . = TRUE /obj/item/gun/ballistic/rifle/illestren/factory desc = "A sturdy and conventional bolt-action rifle. One of Hunter's Pride's most successful firearms, this example has been kept in excellent shape and may as well be fresh out of the workshop. Chambered in 8x50mmR." diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 4b3d8c7687f0..90e13c82ee06 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -19,10 +19,14 @@ cartridge_wording = "shell" tac_reloads = FALSE pickup_sound = 'sound/items/handling/shotgun_pickup.ogg' - fire_delay = 7 + fire_delay = 0.7 SECONDS pb_knockback = 2 manufacturer = MANUFACTURER_HUNTERSPRIDE + gun_firemodes = list(FIREMODE_SEMIAUTO) + default_firemode = FIREMODE_SEMIAUTO + fire_select_icon_state_prefix = "sg_" + wield_slowdown = 0.45 wield_delay = 0.8 SECONDS @@ -48,7 +52,8 @@ if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger bonus total_recoil += gunslinger_bonus total_recoil = clamp(total_recoil,0,INFINITY) - return total_recoil + + return ..(user, total_recoil) // BRIMSTONE SHOTGUN // @@ -61,18 +66,17 @@ icon_state = "brimstone" item_state = "brimstone" + gun_firemodes = list(FIREMODE_FULLAUTO) + default_firemode = FIREMODE_FULLAUTO + mag_type = /obj/item/ammo_box/magazine/internal/shot/lethal manufacturer = MANUFACTURER_HUNTERSPRIDE - fire_delay = 1 - rack_delay = 2 + fire_delay = 0.05 SECONDS //slamfire + rack_delay = 0.2 SECONDS can_be_sawn_off = TRUE -/obj/item/gun/ballistic/shotgun/brimstone/ComponentInitialize() - . = ..() - AddComponent(/datum/component/automatic_fire, 0.1 SECONDS) - /obj/item/gun/ballistic/shotgun/brimstone/sawoff(mob/user) . = ..() if(.) @@ -99,7 +103,7 @@ sawn_desc = "Come with me if you want to live." can_be_sawn_off = TRUE rack_sound = 'sound/weapons/gun/shotgun/rack_alt.ogg' - fire_delay = 1 + fire_delay = 0.1 SECONDS /obj/item/gun/ballistic/shotgun/hellfire/sawoff(mob/user) . = ..() @@ -140,7 +144,7 @@ desc = "A semi-automatic shotgun with tactical furniture and six-shell capacity underneath." icon_state = "cshotgun" item_state = "shotgun_combat" - fire_delay = 5 + fire_delay = 0.5 SECONDS mag_type = /obj/item/ammo_box/magazine/internal/shot/com w_class = WEIGHT_CLASS_HUGE @@ -197,7 +201,7 @@ // Bulldog shotgun // -/obj/item/gun/ballistic/shotgun/bulldog +/obj/item/gun/ballistic/shotgun/bulldog //TODO: REPATH TO LIKE /obj/item/gun/ballistic/shotgun/automatic/bulldog name = "\improper Bulldog Shotgun" desc = "A semi-automatic, magazine-fed shotgun designed for combat in tight quarters, manufactured by Scarborough Arms. A historical favorite of various Syndicate factions, especially the Gorlex Marauders." icon = 'icons/obj/guns/48x32guns.dmi' @@ -211,13 +215,12 @@ mag_type = /obj/item/ammo_box/magazine/m12g can_suppress = FALSE burst_size = 1 - fire_delay = 0 + fire_delay = 0.4 SECONDS // this NEEDS the old delay. fire_sound = 'sound/weapons/gun/shotgun/bulldog.ogg' - actions_types = list() - mag_display = TRUE + show_magazine_on_sprite = TRUE empty_indicator = TRUE empty_alarm = TRUE - special_mags = TRUE + unique_mag_sprites_for_variants = TRUE semi_auto = TRUE internal_magazine = FALSE casing_ejector = TRUE @@ -225,6 +228,13 @@ pickup_sound = 'sound/items/handling/rifle_pickup.ogg' manufacturer = MANUFACTURER_SCARBOROUGH + load_sound = 'sound/weapons/gun/rifle/ar_reload.ogg' + load_empty_sound = 'sound/weapons/gun/rifle/ar_reload.ogg' + eject_sound = 'sound/weapons/gun/rifle/ar_unload.ogg' + eject_empty_sound = 'sound/weapons/gun/rifle/ar_unload.ogg' + + rack_sound = 'sound/weapons/gun/rifle/ar_cock.ogg' + spread = 4 spread_unwielded = 16 recoil = 1 @@ -259,8 +269,10 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq) item_state = "cm15" empty_alarm = FALSE empty_indicator = FALSE - special_mags = FALSE + unique_mag_sprites_for_variants = FALSE manufacturer = MANUFACTURER_MINUTEMAN + fire_select_icon_state_prefix = "clip_" + adjust_fire_select_icon_state_on_safety = TRUE ///////////////////////////// // DOUBLE BARRELED SHOTGUN // @@ -548,7 +560,7 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq) attack_verb = list("bludgeoned", "smashed") mag_type = /obj/item/ammo_box/magazine/internal/shot/sex burst_size = 6 - fire_delay = 0.8 + fire_delay = 0.08 SECONDS //?? very weird number pb_knockback = 12 unique_reskin = null recoil = 10 @@ -581,7 +593,7 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq) base_icon_state = "shotgun_e" icon_state = "shotgun_e" burst_size = 100 - fire_delay = 0.1 + fire_delay = 0.01 SECONDS pb_knockback = 40 recoil = 100 recoil_unwielded = 200 @@ -743,10 +755,10 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq) wield_slowdown = 0.5 wield_delay = 0.5 SECONDS - spread_unwielded = 5 //mostly the hunting revolver stats - spread = 2 + spread_unwielded = 20 //mostly the hunting revolver stats + spread = 6 recoil = 2 - recoil_unwielded = 3 + recoil_unwielded = 4 /obj/item/gun/ballistic/shotgun/doublebarrel/beacon/factory desc = "A single-shot break-action rifle made by Hunter's Pride and sold to civilian hunters. This example has been kept in excellent shape and may as well be fresh out of the workshop. Uses .45-70 ammo." diff --git a/code/modules/projectiles/guns/ballistic/smg.dm b/code/modules/projectiles/guns/ballistic/smg.dm index a6739a79776e..5e8896ab10ec 100644 --- a/code/modules/projectiles/guns/ballistic/smg.dm +++ b/code/modules/projectiles/guns/ballistic/smg.dm @@ -1,14 +1,18 @@ /obj/item/gun/ballistic/automatic/smg - burst_size = 1 + burst_size = 2 actions_types = list() - fire_delay = 1 - spread = 4 + fire_delay = 0.13 SECONDS + + spread = 6 spread_unwielded = 10 wield_slowdown = 0.35 recoil_unwielded = 4 w_class = WEIGHT_CLASS_BULKY - wield_delay = 0.4 SECONDS + gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_FULLAUTO) + default_firemode = FIREMODE_SEMIAUTO + + wield_delay = 0.5 SECONDS load_sound = 'sound/weapons/gun/smg/smg_reload.ogg' load_empty_sound = 'sound/weapons/gun/smg/smg_reload.ogg' @@ -16,20 +20,24 @@ eject_empty_sound = 'sound/weapons/gun/smg/smg_unload.ogg' /obj/item/gun/ballistic/automatic/smg/calculate_recoil(mob/user, recoil_bonus = 0) - var/gunslinger_bonus = 1 - var/total_recoil = recoil_bonus + var/gunslinger_bonus = 2 + var/total_recoil + if(.) + total_recoil += . if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger penalty total_recoil += gunslinger_bonus - total_recoil = clamp(total_recoil,0,INFINITY) - return total_recoil + . = total_recoil + return ..() /obj/item/gun/ballistic/automatic/smg/calculate_spread(mob/user, bonus_spread) - var/gunslinger_bonus = 4 + var/gunslinger_bonus = 16 var/total_spread = bonus_spread + if(.) + total_spread += . if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger penalty total_spread += gunslinger_bonus - total_spread = clamp(total_spread,0,INFINITY) - return total_spread + . = total_spread + return ..() /obj/item/gun/ballistic/automatic/smg/proto name = "\improper Nanotrasen Saber SMG" @@ -37,14 +45,11 @@ icon_state = "saber" actions_types = list() mag_type = /obj/item/ammo_box/magazine/smgm9mm + bolt_type = BOLT_TYPE_LOCKING - mag_display = TRUE + show_magazine_on_sprite = TRUE manufacturer = MANUFACTURER_NANOTRASEN_OLD -/obj/item/gun/ballistic/automatic/smg/proto/ComponentInitialize() - . = ..() - AddComponent(/datum/component/automatic_fire, 0.13 SECONDS) - /obj/item/gun/ballistic/automatic/smg/c20r name = "\improper C-20r SMG" desc = "A bullpup .45 SMG designated 'C-20r.' Its buttstamp reads 'Scarborough Arms - Per falcis, per pravitas.'" @@ -55,17 +60,13 @@ can_suppress = FALSE knife_x_offset = 26 knife_y_offset = 12 - mag_display = TRUE - mag_display_ammo = TRUE + show_magazine_on_sprite = TRUE + show_magazine_on_sprite_ammo = TRUE empty_indicator = TRUE manufacturer = MANUFACTURER_SCARBOROUGH EMPTY_GUN_HELPER(automatic/smg/c20r) -/obj/item/gun/ballistic/automatic/smg/c20r/ComponentInitialize() - . = ..() - AddComponent(/datum/component/automatic_fire, 0.13 SECONDS) - /obj/item/gun/ballistic/automatic/smg/c20r/Initialize() . = ..() update_appearance() @@ -89,28 +90,23 @@ EMPTY_GUN_HELPER(automatic/smg/c20r) item_state = "arg" mag_type = /obj/item/ammo_box/magazine/wt550m9 can_suppress = FALSE - burst_size = 1 actions_types = list() can_bayonet = TRUE knife_x_offset = 25 knife_y_offset = 12 - mag_display = TRUE - mag_display_ammo = TRUE + show_magazine_on_sprite = TRUE + show_magazine_on_sprite_ammo = TRUE empty_indicator = TRUE manufacturer = MANUFACTURER_NANOTRASEN_OLD fire_sound = 'sound/weapons/gun/smg/smg_heavy.ogg' -/obj/item/gun/ballistic/automatic/smg/wt550/ComponentInitialize() - . = ..() - AddComponent(/datum/component/automatic_fire, 0.13 SECONDS) - /obj/item/gun/ballistic/automatic/smg/mini_uzi name = "\improper Type U3 Uzi" desc = "A lightweight submachine gun, for when you really want someone dead. Uses 9mm rounds." icon_state = "uzi" mag_type = /obj/item/ammo_box/magazine/uzim9mm bolt_type = BOLT_TYPE_OPEN - mag_display = TRUE + show_magazine_on_sprite = TRUE fire_sound = 'sound/weapons/gun/smg/uzi.ogg' rack_sound = 'sound/weapons/gun/smg/uzi_cocked.ogg' @@ -124,10 +120,7 @@ EMPTY_GUN_HELPER(automatic/smg/c20r) spread_unwielded = 8 wield_slowdown = 0.25 wield_delay = 0.2 SECONDS - -/obj/item/gun/ballistic/automatic/smg/mini_uzi/ComponentInitialize() - . = ..() - AddComponent(/datum/component/automatic_fire, 0.1 SECONDS) + fire_delay = 0.1 SECONDS /obj/item/gun/ballistic/automatic/smg/vector name = "\improper Vector carbine" @@ -136,14 +129,10 @@ EMPTY_GUN_HELPER(automatic/smg/c20r) item_state = "vector" mag_type = /obj/item/ammo_box/magazine/smgm9mm //you guys remember when the autorifle was chambered in 9mm bolt_type = BOLT_TYPE_LOCKING - mag_display = TRUE + show_magazine_on_sprite = TRUE weapon_weight = WEAPON_LIGHT fire_sound = 'sound/weapons/gun/smg/vector_fire.ogg' -/obj/item/gun/ballistic/automatic/smg/vector/ComponentInitialize() - . = ..() - AddComponent(/datum/component/automatic_fire, 0.13 SECONDS) - /obj/item/gun/ballistic/automatic/smg/m90 name = "\improper M-90gl Carbine" desc = "A three-round burst 5.56 toploading carbine, designated 'M-90gl'. Has an attached underbarrel grenade launcher which can be toggled on and off." @@ -151,67 +140,76 @@ EMPTY_GUN_HELPER(automatic/smg/c20r) item_state = "m90" mag_type = /obj/item/ammo_box/magazine/m556 can_suppress = FALSE - actions_types = list(/datum/action/item_action/toggle_firemode) - var/obj/item/gun/ballistic/revolver/grenadelauncher/underbarrel - burst_size = 3 - fire_delay = 2 - mag_display = TRUE + gun_firenames = list(FIREMODE_SEMIAUTO = "single", FIREMODE_BURST = "burst fire", FIREMODE_FULLAUTO = "full auto", FIREMODE_OTHER = "underbarrel grenade launcher") + gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_BURST, FIREMODE_OTHER) + default_firemode = FIREMODE_SEMIAUTO + var/obj/item/gun/ballistic/revolver/grenadelauncher/secondary + show_magazine_on_sprite = TRUE empty_indicator = TRUE fire_sound = 'sound/weapons/gun/rifle/shot_alt.ogg' manufacturer = MANUFACTURER_SCARBOROUGH + burst_size = 3 + burst_delay = 0.1 SECONDS + fire_delay = 0.2 SECONDS spread = 1 spread_unwielded = 8 wield_slowdown = 0.4 /obj/item/gun/ballistic/automatic/smg/m90/Initialize() . = ..() - underbarrel = new /obj/item/gun/ballistic/revolver/grenadelauncher(src) + secondary = new /obj/item/gun/ballistic/revolver/grenadelauncher(src) + RegisterSignal(secondary, COMSIG_ATOM_UPDATE_ICON, PROC_REF(secondary_update_icon)) update_appearance() +/obj/item/gun/ballistic/automatic/smg/m90/process_other(atom/target, mob/living/user, message = TRUE, flag, params = null, zone_override = "", bonus_spread = 0) + return secondary.pre_fire(target, user, message, params, zone_override, bonus_spread) + +/obj/item/gun/ballistic/automatic/smg/m90/can_shoot() + var/current_firemode = gun_firemodes[firemode_index] + if(current_firemode != FIREMODE_OTHER) + return ..() + return secondary.can_shoot() + /obj/item/gun/ballistic/automatic/smg/m90/afterattack(atom/target, mob/living/user, flag, params) - if(select == 2) - underbarrel.afterattack(target, user, flag, params) - else + var/current_firemode = gun_firemodes[firemode_index] + if(current_firemode != FIREMODE_OTHER) return ..() + return secondary.afterattack(target, user, flag, params) + +/obj/item/gun/ballistic/automatic/smg/m90/attackby(obj/item/attack_obj, mob/user, params) + if(istype(attack_obj, secondary.magazine.ammo_type)) + secondary.unique_action() + return secondary.attackby(attack_obj, user, params) + return ..() -/obj/item/gun/ballistic/automatic/smg/m90/attackby(obj/item/A, mob/user, params) - if(istype(A, /obj/item/ammo_casing)) - if(istype(A, underbarrel.magazine.ammo_type)) - underbarrel.attack_self() - underbarrel.attackby(A, user, params) - else - ..() -/obj/item/gun/ballistic/automatic/smg/m90/update_overlays() +/obj/item/gun/ballistic/automatic/smg/m90/can_shoot() + var/current_firemode = gun_firemodes[firemode_index] + if(current_firemode != FIREMODE_OTHER) + return ..() + return secondary.can_shoot() + +/obj/item/gun/ballistic/automatic/smg/m90/on_wield(obj/item/source, mob/user) + wielded = TRUE + secondary.wielded = TRUE + INVOKE_ASYNC(src, .proc.do_wield, user) + +/obj/item/gun/ballistic/automatic/smg/m90/do_wield(mob/user) . = ..() - switch(select) - if(0) - . += "[initial(icon_state)]_semi" - if(1) - . += "[initial(icon_state)]_burst" - if(2) - . += "[initial(icon_state)]_gren" - -/obj/item/gun/ballistic/automatic/smg/m90/burst_select() - var/mob/living/carbon/human/user = usr - switch(select) - if(0) - select = 1 - burst_size = initial(burst_size) - fire_delay = initial(fire_delay) - to_chat(user, "You switch to [burst_size]-rnd burst.") - if(1) - select = 2 - to_chat(user, "You switch to grenades.") - if(2) - select = 0 - burst_size = 1 - fire_delay = 0 - to_chat(user, "You switch to semi-auto.") - playsound(user, 'sound/weapons/gun/general/selector.ogg', 100, TRUE) + secondary.wielded_fully = wielded_fully + +/// triggered on unwield of two handed item +/obj/item/gun/ballistic/automatic/smg/m90/on_unwield(obj/item/source, mob/user) + . = ..() + secondary.wielded_fully = FALSE + secondary.wielded = FALSE + + +/obj/item/gun/ballistic/automatic/smg/m90/proc/secondary_update_icon() update_appearance() - return + SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD) + /obj/item/gun/ballistic/automatic/smg/firestorm //weapon designed by Apogee-dev name = "HP Firestorm" @@ -221,20 +219,18 @@ EMPTY_GUN_HELPER(automatic/smg/c20r) item_state = "firestorm" mag_type = /obj/item/ammo_box/magazine/c45_firestorm_mag can_suppress = FALSE - special_mags = TRUE + unique_mag_sprites_for_variants = TRUE burst_size = 1 actions_types = list() - fire_delay = 1 + fire_delay = 0.13 SECONDS + bolt_type = BOLT_TYPE_OPEN rack_sound = 'sound/weapons/gun/smg/uzi_cocked.ogg' fire_sound = 'sound/weapons/gun/smg/firestorm.ogg' + manufacturer = MANUFACTURER_HUNTERSPRIDE wield_slowdown = 0.4 -/obj/item/gun/ballistic/automatic/smg/firestorm/Initialize() - . = ..() - AddComponent(/datum/component/automatic_fire, 0.13 SECONDS) - /obj/item/gun/ballistic/automatic/smg/firestorm/pan //spawns with pan magazine, can take sticks instead of just drums, not sure where this would be used, maybe erts? spawnwithmagazine = FALSE @@ -253,11 +249,10 @@ EMPTY_GUN_HELPER(automatic/smg/c20r) fire_sound = 'sound/weapons/gun/smg/smg_heavy.ogg' manufacturer = MANUFACTURER_MINUTEMAN -EMPTY_GUN_HELPER(automatic/smg/cm5) + fire_select_icon_state_prefix = "clip_" + adjust_fire_select_icon_state_on_safety = TRUE -/obj/item/gun/ballistic/automatic/smg/cm5/ComponentInitialize() - . = ..() - AddComponent(/datum/component/automatic_fire, 0.13 SECONDS) +EMPTY_GUN_HELPER(automatic/smg/cm5) /obj/item/gun/ballistic/automatic/smg/cm5/compact name = "\improper CM-5c" @@ -266,15 +261,13 @@ EMPTY_GUN_HELPER(automatic/smg/cm5) spread = 25 spread_unwielded = 40 + fire_delay = 0.08 SECONDS + recoil = 1 recoil_unwielded = 2 wield_delay = 0.2 SECONDS wield_slowdown = 0.15 -/obj/item/gun/ballistic/automatic/smg/cm5/compact/ComponentInitialize() - . = ..() - AddComponent(/datum/component/automatic_fire, 0.8 SECONDS) - /obj/item/gun/ballistic/automatic/smg/skm_carbine name = "\improper SKM-24v" desc = "The SKM-24v was a carbine modification of the SKM-24 during the Frontiersmen War. This, however, is just a shoddy imitation of that carbine, effectively an SKM-24 with a sawed down barrel and a folding wire stock. Can be fired with the stock folded, though accuracy suffers. Chambered in 4.6x30mm." @@ -322,7 +315,6 @@ EMPTY_GUN_HELPER(automatic/smg/cm5) /obj/item/gun/ballistic/automatic/smg/skm_carbine/ComponentInitialize() . = ..() - AddComponent(/datum/component/automatic_fire, 0.13 SECONDS) AddElement(/datum/element/update_icon_updates_onmob) /datum/action/item_action/fold_stock @@ -356,26 +348,19 @@ EMPTY_GUN_HELPER(automatic/smg/cm5) /obj/item/gun/ballistic/automatic/smg/skm_carbine/calculate_recoil(mob/user, recoil_bonus = 0) - var/gunslinger_bonus = 1 var/total_recoil = recoil_bonus if(!stock_folded) total_recoil += stock_recoil_bonus - if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger penalty - total_recoil += gunslinger_bonus - total_recoil = clamp(total_recoil,0,INFINITY) - return total_recoil + return ..(user, total_recoil) /obj/item/gun/ballistic/automatic/smg/skm_carbine/calculate_spread(mob/user, bonus_spread) - var/gunslinger_bonus = 4 var/total_spread = bonus_spread + if(!stock_folded) total_spread += stock_spread_bonus - if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger penalty - total_spread += gunslinger_bonus - total_spread = clamp(total_spread,0,INFINITY) - return total_spread + return ..(user, total_spread) /obj/item/gun/ballistic/automatic/smg/skm_carbine/update_icon_state() . = ..() @@ -418,8 +403,3 @@ EMPTY_GUN_HELPER(automatic/smg/cm5) unfolded_slowdown = 0.35 unfolded_wield_delay = 0.4 SECONDS - - -/obj/item/gun/ballistic/automatic/smg/skm_carbine/inteq/ComponentInitialize() - . = ..() - AddComponent(/datum/component/automatic_fire, 0.13 SECONDS) diff --git a/code/modules/projectiles/guns/ballistic/toy.dm b/code/modules/projectiles/guns/ballistic/toy.dm index 5f62b8c7ca78..796a62dd9427 100644 --- a/code/modules/projectiles/guns/ballistic/toy.dm +++ b/code/modules/projectiles/guns/ballistic/toy.dm @@ -29,7 +29,7 @@ mag_type = /obj/item/ammo_box/magazine/toy/pistol fire_sound = 'sound/items/syringeproj.ogg' burst_size = 1 - fire_delay = 0 + fire_delay = 0.2 SECONDS actions_types = list() recoil = -10 //its a toy... recoil_unwielded = -10 diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 705789b3484a..d06ad71d206d 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -10,6 +10,11 @@ has_safety = TRUE safety = TRUE + gun_firemodes = list(FIREMODE_SEMIAUTO) + default_firemode = FIREMODE_SEMIAUTO + + fire_select_icon_state_prefix = "laser_" + var/obj/item/stock_parts/cell/gun/cell //What type of power cell this uses var/cell_type = /obj/item/stock_parts/cell/gun var/modifystate = 0 @@ -217,11 +222,6 @@ process_chamber() // If the gun was drained and then recharged, load a new shot. return ..() -/obj/item/gun/energy/process_burst(mob/living/user, atom/target, message = TRUE, params = null, zone_override="", sprd = 0, randomized_gun_spread = 0, randomized_bonus_spread = 0, rand_spr = 0, iteration = 0) - if(!chambered && can_shoot()) - process_chamber() // Ditto. - return ..() - /obj/item/gun/energy/proc/select_fire(mob/living/user) select++ if (select > ammo_type.len) diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index f2c504f07f84..f1188f76701f 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -52,14 +52,15 @@ w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK + gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_FULLAUTO) + default_firemode = FIREMODE_SEMIAUTO + + fire_delay = 0.2 SECONDS + wield_delay = 0.7 SECONDS wield_slowdown = 0.6 spread_unwielded = 20 -/obj/item/gun/energy/e_gun/hades/Initialize() - . = ..() - AddComponent(/datum/component/automatic_fire, 0.2 SECONDS) - /obj/item/gun/energy/e_gun/old name = "prototype energy gun" desc = "NT-P:01 Prototype Energy Gun. Early stage development of a unique laser rifle that has a multifaceted energy lens, allowing the gun to alter the form of projectile it fires on command. The project was a dud, and Nanotrasen later acquired Sharplite to suit its laser weapon needs." @@ -224,9 +225,10 @@ charge_sections = 3 weapon_weight = WEAPON_LIGHT -/obj/item/gun/energy/e_gun/smg/Initialize() - . = ..() - AddComponent(/datum/component/automatic_fire, 0.13 SECONDS) + fire_delay = 0.13 SECONDS + + gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_FULLAUTO) + default_firemode = FIREMODE_SEMIAUTO /obj/item/gun/energy/e_gun/iot name = "\improper E-SG 500 Second Edition" diff --git a/code/modules/projectiles/guns/energy/laser_gatling.dm b/code/modules/projectiles/guns/energy/laser_gatling.dm index b21e176b92e8..22e6e57d8817 100644 --- a/code/modules/projectiles/guns/energy/laser_gatling.dm +++ b/code/modules/projectiles/guns/energy/laser_gatling.dm @@ -105,6 +105,12 @@ icon_state = "minigun_spin" item_state = "minigun" slowdown = 1 + + fire_delay = 0.1 SECONDS + + gun_firemodes = list(FIREMODE_FULLAUTO) + default_firemode = FIREMODE_FULLAUTO + slot_flags = null w_class = WEIGHT_CLASS_HUGE custom_materials = null @@ -121,7 +127,6 @@ ammo_pack = loc AddElement(/datum/element/update_icon_blocker) - AddComponent(/datum/component/automatic_fire, 0.15 SECONDS) return ..() /obj/item/gun/energy/minigun/Destroy() diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index d84655fb5813..73d9104833fb 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -277,10 +277,14 @@ can_charge = FALSE use_cyborg_cell = TRUE + fire_delay = 0.3 SECONDS + + gun_firemodes = list(FIREMODE_FULLAUTO) + default_firemode = FIREMODE_FULLAUTO + /obj/item/gun/energy/printer/ComponentInitialize() . = ..() AddElement(/datum/element/update_icon_blocker) - AddComponent(/datum/component/automatic_fire, 0.3 SECONDS) /obj/item/gun/energy/printer/emp_act() return @@ -391,9 +395,9 @@ shaded_charge = TRUE weapon_weight = WEAPON_HEAVY -/obj/item/gun/energy/tesla_cannon/ComponentInitialize() - . = ..() - AddComponent(/datum/component/automatic_fire, 0.1 SECONDS) + fire_delay = 0.1 SECONDS + gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_FULLAUTO) + default_firemode = FIREMODE_SEMIAUTO /obj/item/gun/energy/buster name = "replica buster cannon" diff --git a/code/modules/projectiles/guns/faction/gezena/energy_gunsword.dm b/code/modules/projectiles/guns/faction/gezena/energy_gunsword.dm index aea05fb8fe51..20a301a1396c 100644 --- a/code/modules/projectiles/guns/faction/gezena/energy_gunsword.dm +++ b/code/modules/projectiles/guns/faction/gezena/energy_gunsword.dm @@ -11,6 +11,8 @@ modifystate = TRUE + fire_delay = 0.16 SECONDS + wield_delay = 0.7 SECONDS wield_slowdown = 0.35 @@ -50,10 +52,6 @@ cell_type = /obj/item/stock_parts/cell/gun/pgf ammo_type = list(/obj/item/ammo_casing/energy/pgf , /obj/item/ammo_casing/energy/disabler/hitscan) -/obj/item/gun/energy/kalix/pgf/ComponentInitialize() - . = ..() - AddComponent(/datum/component/automatic_fire, 0.16 SECONDS) - /obj/projectile/beam/hitscan/kalix/pgf name = "concentrated energy" tracer_type = /obj/effect/projectile/tracer/pgf @@ -105,6 +103,11 @@ modifystate = FALSE + gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_FULLAUTO) + default_firemode = FIREMODE_SEMIAUTO + + fire_delay = 0.2 SECONDS + wield_delay = 0.7 SECONDS wield_slowdown = 0.6 @@ -113,10 +116,6 @@ ammo_type = list(/obj/item/ammo_casing/energy/pgf/assault, /obj/item/ammo_casing/energy/pgf/sniper) -/obj/item/gun/energy/kalix/pgf/heavy/ComponentInitialize() - . = ..() - AddComponent(/datum/component/automatic_fire, 0.2 SECONDS) - /obj/item/ammo_casing/energy/pgf/assault select_name = "AR" projectile_type = /obj/projectile/beam/hitscan/kalix/pgf/assault diff --git a/code/modules/projectiles/guns/gunhud.dm b/code/modules/projectiles/guns/gunhud.dm index 9d1a40db8bb6..3dad98f54219 100644 --- a/code/modules/projectiles/guns/gunhud.dm +++ b/code/modules/projectiles/guns/gunhud.dm @@ -18,9 +18,6 @@ // Ammo counter #define ui_ammocounter "EAST-1:28,CENTER+1:25" -///The gun needs to update the gun hud! -#define COMSIG_UPDATE_AMMO_HUD "update_ammo_hud" - /datum/hud var/atom/movable/screen/ammo_counter @@ -233,6 +230,7 @@ /datum/component/ammo_hud/laser/cybersun prefix = "cybersun_" +//please be aware, this only supports 6 round revolvers. It is comically easy to support more or less rounds,like in game there are 7 round and 5 round revolvers, but that requires sprites, and i'm lasy /datum/component/ammo_hud/revolver prefix = "revolver_" @@ -285,3 +283,55 @@ round_images += current_bullet_image hud.update_overlays(round_images) + +/datum/component/ammo_hud/eoehoma + backing_color = "#cb001a" + +/datum/component/ammo_hud/eoehoma/update_hud() + var/obj/item/gun/ballistic/automatic/assault/e40/pew = parent + var/obj/item/gun/energy/laser/e40_laser_secondary/pew_secondary = pew.secondary + hud.maptext = null + hud.icon_state = "[prefix]backing" + + var/indicator + var/rounds = num2text(get_accurate_ammo_count(pew)) + var/oth_o + var/oth_t + var/oth_h + + var/current_firemode = pew.gun_firemodes[pew.firemode_index] + if(current_firemode == FIREMODE_FULLAUTO) + if(!pew.magazine) + hud.set_hud(backing_color, "[prefix]oe", "[prefix]te", "[prefix]he", "[prefix]no_mag") + return + if(!pew.get_ammo()) + hud.set_hud(backing_color, "[prefix]oe", "[prefix]te", "[prefix]he", "[prefix]empty_flash") + return + rounds = num2text(get_accurate_ammo_count(pew)) + indicator = "bullet" + else + if(!pew_secondary.cell) + hud.set_hud(backing_color, "[prefix]oe", "[prefix]te", "[prefix]he", "[prefix]no_mag") + return + if(!get_accurate_laser_count(pew_secondary)) + hud.set_hud(backing_color, "[prefix]oe", "[prefix]te", "[prefix]he", "[prefix]empty_flash_laser") + return + rounds = num2text(get_accurate_laser_count(pew_secondary)) + indicator = "laser" + + + switch(length(rounds)) + if(1) + oth_o = "[prefix]o[rounds[1]]" + if(2) + oth_o = "[prefix]o[rounds[2]]" + oth_t = "[prefix]t[rounds[1]]" + if(3) + oth_o = "[prefix]o[rounds[3]]" + oth_t = "[prefix]t[rounds[2]]" + oth_h = "[prefix]h[rounds[1]]" + else + oth_o = "[prefix]o9" + oth_t = "[prefix]t9" + oth_h = "[prefix]h9" + hud.set_hud(backing_color, oth_o, oth_t, oth_h, indicator) diff --git a/code/modules/projectiles/projectile/bullets/gauss.dm b/code/modules/projectiles/projectile/bullets/gauss.dm index 0955745ed798..6011adb61c88 100644 --- a/code/modules/projectiles/projectile/bullets/gauss.dm +++ b/code/modules/projectiles/projectile/bullets/gauss.dm @@ -5,7 +5,8 @@ icon_state = "gauss-pellet" damage = 25 range = 35 - light_color = COLOR_SOFT_RED + light_system = 2 + light_color = MOVABLE_LIGHT light_range = 3 // Ferromagnetic Lance (GAR AR) diff --git a/code/modules/projectiles/projectile/bullets/rifle.dm b/code/modules/projectiles/projectile/bullets/rifle.dm index ddd3319122c7..f7b963cff94b 100644 --- a/code/modules/projectiles/projectile/bullets/rifle.dm +++ b/code/modules/projectiles/projectile/bullets/rifle.dm @@ -77,5 +77,5 @@ /obj/projectile/bullet/c299 name = ".229 Eoehoma caseless bullet" - damage = 25 - armour_penetration = 20 + damage = 20 + armour_penetration = 10 diff --git a/icons/hud/gun_hud.dmi b/icons/hud/gun_hud.dmi index a24f7f2964f369c4d9bc2c921264b64a4ea0885c..d108a6088e8f85f2d24354ecd5c8fe2e7062ec0e 100644 GIT binary patch delta 2309 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 F{%>rVAmso6 diff --git a/icons/mob/actions/actions_items.dmi b/icons/mob/actions/actions_items.dmi index c52e55c475a6827d5b58e198915d948839c39968..9baf5cdde9b3735a3afbf7adccdd226c77bede62 100644 GIT binary patch literal 20966 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 literal 13971 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 From 1a99384b3ad334ae4ff624a3e0192e5f7c92ae96 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 6 Jun 2024 13:44:42 -0500 Subject: [PATCH 06/18] Automatic changelog generation for PR #3061 [ci skip] --- html/changelogs/AutoChangeLog-pr-3061.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3061.yml diff --git a/html/changelogs/AutoChangeLog-pr-3061.yml b/html/changelogs/AutoChangeLog-pr-3061.yml new file mode 100644 index 000000000000..cce63207623b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3061.yml @@ -0,0 +1,9 @@ +author: rye-rice +changes: + - {rscadd: Changing firemodes on guns now have new sprites} + - {bugfix: The E-40 now works as intended!} + - {rscadd: The E-40 now has an ammo counter} + - {balance: The P16 shoots slightly faster.} + - {balance: Two E-40s max are obtainable from the black market should it spawn. + Blank market price cap of the E-40 has also increased} +delete-after: true From 952ab8b3a54a8878144986b1601dfa47fee5db71 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 7 Jun 2024 00:54:25 +0000 Subject: [PATCH 07/18] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-2931.yml | 5 ----- html/changelogs/AutoChangeLog-pr-3061.yml | 9 --------- html/changelogs/AutoChangeLog-pr-3079.yml | 4 ---- html/changelogs/archive/2024-06.yml | 13 +++++++++++++ 4 files changed, 13 insertions(+), 18 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-2931.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3061.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3079.yml diff --git a/html/changelogs/AutoChangeLog-pr-2931.yml b/html/changelogs/AutoChangeLog-pr-2931.yml deleted file mode 100644 index 3ee174b3f911..000000000000 --- a/html/changelogs/AutoChangeLog-pr-2931.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Zevotech -changes: - - {rscadd: remapped and renamed ashwalker_shrine into lavaland_surface_buried_shrine} - - {rscadd: Necropolis walls have been renamed to thick stone walls.} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3061.yml b/html/changelogs/AutoChangeLog-pr-3061.yml deleted file mode 100644 index cce63207623b..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3061.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: rye-rice -changes: - - {rscadd: Changing firemodes on guns now have new sprites} - - {bugfix: The E-40 now works as intended!} - - {rscadd: The E-40 now has an ammo counter} - - {balance: The P16 shoots slightly faster.} - - {balance: Two E-40s max are obtainable from the black market should it spawn. - Blank market price cap of the E-40 has also increased} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3079.yml b/html/changelogs/AutoChangeLog-pr-3079.yml deleted file mode 100644 index 7bbcaa88eb5a..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3079.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Sun-Soaked -changes: - - {bugfix: combat knives and their subtypes now once again have sprites.} -delete-after: true diff --git a/html/changelogs/archive/2024-06.yml b/html/changelogs/archive/2024-06.yml index b6d113723f62..1a993f9a46ac 100644 --- a/html/changelogs/archive/2024-06.yml +++ b/html/changelogs/archive/2024-06.yml @@ -118,3 +118,16 @@ 2024-06-06: SomeguyManperson: - bugfix: melee hermits have had their immortal snail deals revoked +2024-06-07: + Sun-Soaked: + - bugfix: combat knives and their subtypes now once again have sprites. + Zevotech: + - rscadd: remapped and renamed ashwalker_shrine into lavaland_surface_buried_shrine + - rscadd: Necropolis walls have been renamed to thick stone walls. + rye-rice: + - rscadd: Changing firemodes on guns now have new sprites + - bugfix: The E-40 now works as intended! + - rscadd: The E-40 now has an ammo counter + - balance: The P16 shoots slightly faster. + - balance: Two E-40s max are obtainable from the black market should it spawn. Blank + market price cap of the E-40 has also increased From bb106420eef4bd442b01a147533f0ef09afc71ff Mon Sep 17 00:00:00 2001 From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Fri, 7 Jun 2024 00:55:36 -0500 Subject: [PATCH 08/18] Removes magic stuff adjacent to gun/magic (#2877) ## About The Pull Request This was MEANT to be a pr were i was tackling gun cruft but magic accounts for a large portion of the line count. Pulls from #2664 (minus the actual gun crafting) and #2702 ## Why It's Good For The Game Cruft ## Changelog :cl: del: Removed alot of magic cruft code: Sorts gun defines into there own file /:cl: --------- Signed-off-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Co-authored-by: Sun-Soaked <45698967+Sun-Soaked@users.noreply.github.com> --- _maps/map_files/generic/CentCom.dmm | 5 - code/__DEFINES/DNA.dm | 1 - code/__DEFINES/combat.dm | 67 -- code/__DEFINES/guns.dm | 78 +- code/controllers/subsystem/traumas.dm | 1 - code/datums/components/fantasy/suffixes.dm | 4 - code/datums/dna.dm | 2 - code/datums/mutations/actions.dm | 61 -- code/game/gamemodes/objective.dm | 25 - code/game/objects/items/dna_injector.dm | 5 - code/game/objects/items/granters.dm | 13 - code/game/objects/items/storage/belt.dm | 27 - .../structures/fugitive_role_spawners.dm | 58 -- .../structures/icemoon/cave_entrance.dm | 2 - code/modules/admin/verbs/randomverbs.dm | 2 - .../changeling/powers/mutations.dm | 179 ----- code/modules/antagonists/cult/blood_magic.dm | 14 +- code/modules/antagonists/cult/cult_items.dm | 41 - .../antagonists/fugitive/fugitive_outfits.dm | 154 ---- .../antagonists/survivalist/survivalist.dm | 14 - .../antagonists/wizard/equipment/spellbook.dm | 63 -- code/modules/antagonists/wizard/wizard.dm | 1 - .../awaymissions/mission_code/snowdin.dm | 13 - code/modules/cargo/exports/lavaland.dm | 6 +- code/modules/clothing/outfits/standard.dm | 2 - code/modules/events/wizard/magicarp.dm | 75 -- code/modules/mining/equipment/survival_pod.dm | 4 - .../mining/lavaland/necropolis_chests.dm | 94 +-- .../modules/mob/dead/new_player/new_player.dm | 2 - .../human/species_types/lizardpeople.dm | 1 - .../hostile/megafauna/codename_claw.dm | 99 +++ .../mob/living/simple_animal/hostile/mimic.dm | 10 - .../projectiles/ammunition/special/magic.dm | 65 -- .../boxes_magazines/internal/misc.dm | 6 - .../boxes_magazines/internal/rifle.dm | 7 - code/modules/projectiles/gun.dm | 4 - .../projectiles/guns/ballistic/pistol.dm | 23 - .../projectiles/guns/ballistic/revolver.dm | 12 - .../projectiles/guns/ballistic/rifle.dm | 55 -- .../projectiles/guns/ballistic/shotgun.dm | 46 -- code/modules/projectiles/guns/magic.dm | 85 -- code/modules/projectiles/guns/magic/staff.dm | 142 ---- code/modules/projectiles/guns/magic/wand.dm | 266 ------- code/modules/projectiles/projectile.dm | 4 - code/modules/projectiles/projectile/magic.dm | 734 ------------------ .../projectiles/projectile/magic/spellcard.dm | 6 - code/modules/research/designs.dm | 5 +- .../research/designs/weapon_designs.dm | 8 - code/modules/research/experimentor.dm | 10 - .../xenobiology/crossbreeding/_weapons.dm | 51 -- .../xenobiology/crossbreeding/chilling.dm | 23 - .../ruins/icemoonruin_code/hotsprings.dm | 56 -- code/modules/shuttle/special.dm | 129 --- code/modules/spells/spell_types/aimed.dm | 63 +- code/modules/spells/spell_types/charge.dm | 14 - code/modules/spells/spell_types/devil.dm | 2 +- .../spells/spell_types/infinite_guns.dm | 27 - .../spells/spell_types/rightandwrong.dm | 101 +-- code/modules/spells/spell_types/shapeshift.dm | 1 - code/modules/uplink/uplink_items.dm | 7 - code/modules/vending/autodrobe.dm | 1 - shiptest.dme | 10 - 62 files changed, 192 insertions(+), 2894 deletions(-) delete mode 100644 code/game/objects/structures/fugitive_role_spawners.dm delete mode 100644 code/modules/antagonists/fugitive/fugitive_outfits.dm delete mode 100644 code/modules/events/wizard/magicarp.dm delete mode 100644 code/modules/projectiles/guns/magic.dm delete mode 100644 code/modules/projectiles/guns/magic/staff.dm delete mode 100644 code/modules/projectiles/guns/magic/wand.dm delete mode 100644 code/modules/projectiles/projectile/magic.dm delete mode 100644 code/modules/projectiles/projectile/magic/spellcard.dm delete mode 100644 code/modules/ruins/icemoonruin_code/hotsprings.dm delete mode 100644 code/modules/spells/spell_types/infinite_guns.dm diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 19b41ef8018f..0f8565b7ecec 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -3045,11 +3045,6 @@ /area/wizard_station) "aEX" = ( /obj/structure/table/wood, -/obj/item/gun/magic/wand{ - desc = "Used in emergencies to reignite magma engines."; - max_charges = 0; - name = "wand of emergency engine ignition" - }, /turf/open/floor/plasteel, /area/wizard_station) "aEY" = ( diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 30bcd4e253c8..8b05ccacd1fe 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -31,7 +31,6 @@ #define GLOWY /datum/mutation/human/glow #define ANTIGLOWY /datum/mutation/human/glow/anti #define TELEPATHY /datum/mutation/human/telepathy -#define FIREBREATH /datum/mutation/human/firebreath #define VOID /datum/mutation/human/void #define TONGUESPIKE /datum/mutation/human/tonguespike #define TONGUESPIKECHEM /datum/mutation/human/tongue_spike/chem diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index e5683140933f..ad0754c85b21 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -133,53 +133,6 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(/obj/item/gun))) #define EMBED_POINTY list("ignore_throwspeed_threshold" = TRUE) #define EMBED_POINTY_SUPERIOR list("embed_chance" = 100, "ignore_throwspeed_threshold" = TRUE) -//Gun weapon weight -/// Allows you to dual wield this gun and your offhand gun -#define WEAPON_LIGHT 1 -/// Does not allow you to dual wield with this gun and your offhand gun -#define WEAPON_MEDIUM 2 -/// You must wield the gun to fire this gun -#define WEAPON_HEAVY 3 -/// You must FULLY wield (wait the full wield delay) the gun to fire this gun -#define WEAPON_VERY_HEAVY 4 -//Gun trigger guards -#define TRIGGER_GUARD_ALLOW_ALL -1 -#define TRIGGER_GUARD_NONE 0 -#define TRIGGER_GUARD_NORMAL 1 -//Gun bolt types -///The gun has a closed bolt, when resting it's closed, and must be racked to get a bullet from a magazine. see: Every Fucking Videogame Gun Ever -#define BOLT_TYPE_STANDARD 1 -///Gun has a bolt, it is open when ready to fire. The gun can never have a chambered bullet with no magazine, but the bolt stays ready when a mag is removed. -/// Example: Some SMGs, the L6 -#define BOLT_TYPE_OPEN 2 -///Gun has no moving bolt mechanism, it cannot be racked. Also dumps the entire contents when emptied instead of a magazine. -/// Example: Break action shotguns, revolvers -#define BOLT_TYPE_NO_BOLT 3 -///Gun has a bolt, it locks back when empty. It can be released to chamber a round if a magazine is in. -/// Example: Pistols with a slide lock, some SMGs -#define BOLT_TYPE_LOCKING 4 -//Sawn off nerfs -///accuracy penalty of sawn off guns -#define SAWN_OFF_ACC_PENALTY 25 -///added recoil of sawn off guns -#define SAWN_OFF_RECOIL 1 - -//ammo box sprite defines -///ammo box will always use provided icon state -#define AMMO_BOX_ONE_SPRITE 0 -///ammo box will have a different state for each bullet; - -#define AMMO_BOX_PER_BULLET 1 -///ammo box will have a different state for full and empty; -max_ammo and -0 -#define AMMO_BOX_FULL_EMPTY 2 - -#define SUPPRESSED_NONE 0 -#define SUPPRESSED_QUIET 1 ///standard suppressed -#define SUPPRESSED_VERY 2 /// no message - -//Projectile Reflect -#define REFLECT_NORMAL (1<<0) -#define REFLECT_FAKEPROJECTILE (1<<1) - //Object/Item sharpness #define IS_BLUNT 0 #define IS_SHARP 1 @@ -215,23 +168,3 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(/obj/item/gun))) //We will round to this value in damage calculations. #define DAMAGE_PRECISION 0.1 - -//bullet_act() return values -#define BULLET_ACT_HIT "HIT" //It's a successful hit, whatever that means in the context of the thing it's hitting. -#define BULLET_ACT_BLOCK "BLOCK" //It's a blocked hit, whatever that means in the context of the thing it's hitting. -#define BULLET_ACT_FORCE_PIERCE "PIERCE" //It pierces through the object regardless of the bullet being piercing by default. - -#define NICE_SHOT_RICOCHET_BONUS 10 //if the shooter has the NICE_SHOT trait and they fire a ricocheting projectile, add this to the ricochet chance and auto aim angle - -//Autofire component -/// Compatible firemode is in the gun. Wait until it's held in the user hands. -#define AUTOFIRE_STAT_IDLE (1<<0) -/// Gun is active and in the user hands. Wait until user does a valid click. -#define AUTOFIRE_STAT_ALERT (1<<1) -/// Gun is shooting. -#define AUTOFIRE_STAT_FIRING (1<<2) - -#define COMSIG_AUTOFIRE_ONMOUSEDOWN "autofire_onmousedown" - #define COMPONENT_AUTOFIRE_ONMOUSEDOWN_BYPASS (1<<0) -#define COMSIG_AUTOFIRE_SHOT "autofire_shot" - #define COMPONENT_AUTOFIRE_SHOT_SUCCESS (1<<0) diff --git a/code/__DEFINES/guns.dm b/code/__DEFINES/guns.dm index 556a9ff0e35c..dba7ce93afaf 100644 --- a/code/__DEFINES/guns.dm +++ b/code/__DEFINES/guns.dm @@ -1,4 +1,61 @@ -//weapon manufacturers +//Gun weapon weight +/// Allows you to dual wield this gun and your offhand gun +#define WEAPON_LIGHT 1 +/// Does not allow you to dual wield with this gun and your offhand gun +#define WEAPON_MEDIUM 2 +/// You must wield the gun to fire this gun +#define WEAPON_HEAVY 3 +/// You must FULLY wield (wait the full wield delay) the gun to fire this gun +#define WEAPON_VERY_HEAVY 4 +//Gun trigger guards +#define TRIGGER_GUARD_ALLOW_ALL -1 +#define TRIGGER_GUARD_NONE 0 +#define TRIGGER_GUARD_NORMAL 1 +//Gun bolt types +///The gun has a closed bolt, when resting it's closed, and must be racked to get a bullet from a magazine. see: Every Fucking Videogame Gun Ever +#define BOLT_TYPE_STANDARD 1 +///Gun has a bolt, it is open when ready to fire. The gun can never have a chambered bullet with no magazine, but the bolt stays ready when a mag is removed. +/// Example: Some SMGs, the L6 +#define BOLT_TYPE_OPEN 2 +///Gun has no moving bolt mechanism, it cannot be racked. Also dumps the entire contents when emptied instead of a magazine. +/// Example: Break action shotguns, revolvers +#define BOLT_TYPE_NO_BOLT 3 +///Gun has a bolt, it locks back when empty. It can be released to chamber a round if a magazine is in. +/// Example: Pistols with a slide lock, some SMGs +#define BOLT_TYPE_LOCKING 4 +//Sawn off nerfs +///accuracy penalty of sawn off guns +#define SAWN_OFF_ACC_PENALTY 25 +///added recoil of sawn off guns +#define SAWN_OFF_RECOIL 1 + +//ammo box sprite defines +///ammo box will always use provided icon state +#define AMMO_BOX_ONE_SPRITE 0 +///ammo box will have a different state for each bullet; - +#define AMMO_BOX_PER_BULLET 1 +///ammo box will have a different state for full and empty; -max_ammo and -0 +#define AMMO_BOX_FULL_EMPTY 2 + +#define SUPPRESSED_NONE 0 +#define SUPPRESSED_QUIET 1 ///standard suppressed +#define SUPPRESSED_VERY 2 /// no message + +//Autofire component +/// Compatible firemode is in the gun. Wait until it's held in the user hands. +#define AUTOFIRE_STAT_IDLE (1<<0) +/// Gun is active and in the user hands. Wait until user does a valid click. +#define AUTOFIRE_STAT_ALERT (1<<1) +/// Gun is shooting. +#define AUTOFIRE_STAT_FIRING (1<<2) + +#define COMSIG_AUTOFIRE_ONMOUSEDOWN "autofire_onmousedown" + #define COMPONENT_AUTOFIRE_ONMOUSEDOWN_BYPASS (1<<0) +#define COMSIG_AUTOFIRE_SHOT "autofire_shot" + #define COMPONENT_AUTOFIRE_SHOT_SUCCESS (1<<0) + +#define DUALWIELD_PENALTY_EXTRA_MULTIPLIER 1.6 + #define MANUFACTURER_NONE null #define MANUFACTURER_SHARPLITE "the Sharplite Defense logo" #define MANUFACTURER_SHARPLITE_NEW "the Nanotrasen-Sharplite logo" @@ -15,6 +72,25 @@ #define MANUFACTURER_PGF "the Etherbor Industries emblem" #define MANUFACTURER_IMPORT "Lanchester Import Co." + +///////////////// +// PROJECTILES // +///////////////// + +//bullet_act() return values +#define BULLET_ACT_HIT "HIT" //It's a successful hit, whatever that means in the context of the thing it's hitting. +#define BULLET_ACT_BLOCK "BLOCK" //It's a blocked hit, whatever that means in the context of the thing it's hitting. +#define BULLET_ACT_FORCE_PIERCE "PIERCE" //It pierces through the object regardless of the bullet being piercing by default. + +#define NICE_SHOT_RICOCHET_BONUS 10 //if the shooter has the NICE_SHOT trait and they fire a ricocheting projectile, add this to the ricochet chance and auto aim angle + +//Projectile Reflect +#define REFLECT_NORMAL (1<<0) +#define REFLECT_FAKEPROJECTILE (1<<1) + +#define MOVES_HITSCAN -1 //Not actually hitscan but close as we get without actual hitscan. +#define MUZZLE_EFFECT_PIXEL_INCREMENT 17 //How many pixels to move the muzzle flash up so your character doesn't look like they're shitting out lasers. + #define FIREMODE_SEMIAUTO "single" #define FIREMODE_BURST "burst" #define FIREMODE_FULLAUTO "auto" diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm index 3dc5553b7381..25ae750eb0d3 100644 --- a/code/controllers/subsystem/traumas.dm +++ b/code/controllers/subsystem/traumas.dm @@ -132,7 +132,6 @@ SUBSYSTEM_DEF(traumas) /obj/item/soulstone, /obj/item/clothing/suit/wizrobe, /obj/item/clothing/head/wizard, /obj/item/spellbook, /obj/item/staff, /obj/item/clothing/suit/space/hardsuit/shielded/wizard, /obj/item/clothing/suit/space/hardsuit/wizard, - /obj/item/gun/magic/staff, /obj/item/gun/magic/wand, /obj/item/nullrod, /obj/item/clothing/under/rank/civilian/chaplain)), "aliens" = typecacheof(list( diff --git a/code/datums/components/fantasy/suffixes.dm b/code/datums/components/fantasy/suffixes.dm index ec1ee58735f9..8cabee42d21c 100644 --- a/code/datums/components/fantasy/suffixes.dm +++ b/code/datums/components/fantasy/suffixes.dm @@ -131,11 +131,7 @@ /obj/projectile/bullet/honker = 15, /obj/projectile/temp = 15, /obj/projectile/ion = 15, - /obj/projectile/magic/door = 15, - /obj/projectile/magic/locker = 15, - /obj/projectile/magic/fetch = 15, /obj/projectile/beam/emitter = 15, - /obj/projectile/magic/flying = 15, /obj/projectile/energy/net = 15, /obj/projectile/bullet/incendiary/c9mm = 15, /obj/projectile/temp/hot = 15, diff --git a/code/datums/dna.dm b/code/datums/dna.dm index dde90dd5dbe8..abd20fd29212 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -659,8 +659,6 @@ O.Remove(src) visible_message("[src] vomits up their [O.name]!", "You vomit up your [O.name]") //no "vomit up your the heart" O.forceMove(drop_location()) - if(prob(20)) - O.animate_atom_living() if(9 to 10) ForceContractDisease(new/datum/disease/gastrolosis()) to_chat(src, "Oh, I actually feel quite alright!") diff --git a/code/datums/mutations/actions.dm b/code/datums/mutations/actions.dm index f2ffe7c25fd2..53080247b827 100644 --- a/code/datums/mutations/actions.dm +++ b/code/datums/mutations/actions.dm @@ -88,67 +88,6 @@ if(direction_text) to_chat(user,"You consider [tracking_target]'s scent. The trail leads [direction_text].") -/datum/mutation/human/firebreath - name = "Fire Breath" - desc = "An ancient mutation that gives lizards breath of fire." - quality = POSITIVE - difficulty = 12 - locked = TRUE - text_gain_indication = "Your throat is burning!" - text_lose_indication = "Your throat is cooling down." - power = /obj/effect/proc_holder/spell/aimed/firebreath - instability = 30 - energy_coeff = 1 - power_coeff = 1 - -/datum/mutation/human/firebreath/modify() - if(power) - var/obj/effect/proc_holder/spell/aimed/firebreath/S = power - S.strength = GET_MUTATION_POWER(src) - -/obj/effect/proc_holder/spell/aimed/firebreath - name = "Fire Breath" - desc = "You can breathe fire at a target." - school = "evocation" - charge_max = 600 - clothes_req = FALSE - range = 20 - projectile_type = /obj/projectile/magic/aoe/fireball/firebreath - base_icon_state = "fireball" - action_icon_state = "fireball0" - sound = 'sound/magic/demon_dies.ogg' //horrifying lizard noises - active_msg = "You built up heat in your mouth." - deactive_msg = "You swallow the flame." - var/strength = 1 - -/obj/effect/proc_holder/spell/aimed/firebreath/before_cast(list/targets) - . = ..() - if(iscarbon(usr)) - var/mob/living/carbon/C = usr - if(C.is_mouth_covered()) - C.adjust_fire_stacks(2) - C.IgniteMob() - to_chat(C,"Something in front of your mouth caught fire!") - return FALSE - -/obj/effect/proc_holder/spell/aimed/firebreath/ready_projectile(obj/projectile/P, atom/target, mob/user, iteration) - if(!istype(P, /obj/projectile/magic/aoe/fireball)) - return - var/obj/projectile/magic/aoe/fireball/F = P - switch(strength) - if(1 to 3) - F.exp_light = strength-1 - if(4 to INFINITY) - F.exp_heavy = strength-3 - F.exp_fire += strength - -/obj/projectile/magic/aoe/fireball/firebreath - name = "fire breath" - exp_heavy = 0 - exp_light = 0 - exp_flash = 0 - exp_fire= 4 - /datum/mutation/human/void name = "Void Magnet" desc = "A rare genome that attracts odd forces not usually observed." diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 82735ff9d522..65e161f2176b 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -883,31 +883,6 @@ GLOBAL_LIST_EMPTY(possible_items_special) explanation_text = "Steal at least five guns!" wanted_items = list(/obj/item/gun) -/datum/objective/steal_five_of_type/summon_magic - name = "steal magic" - explanation_text = "Steal at least five magical artefacts!" - wanted_items = list() - -/datum/objective/steal_five_of_type/summon_magic/New() - wanted_items = GLOB.summoned_magic_objectives - ..() - -/datum/objective/steal_five_of_type/summon_magic/check_completion() - var/list/datum/mind/owners = get_owners() - var/stolen_count = 0 - for(var/datum/mind/M in owners) - if(!isliving(M.current)) - continue - var/list/all_items = M.current.GetAllContents() //this should get things in cheesewheels, books, etc. - for(var/obj/I in all_items) //Check for wanted items - if(istype(I, /obj/item/book/granter/spell)) - var/obj/item/book/granter/spell/spellbook = I - if(!spellbook.used || !spellbook.oneuse) //if the book still has powers... - stolen_count++ //it counts. nice. - else if(is_type_in_typecache(I, wanted_items)) - stolen_count++ - return stolen_count >= 5 - //Created by admin tools /datum/objective/custom name = "custom" diff --git a/code/game/objects/items/dna_injector.dm b/code/game/objects/items/dna_injector.dm index 1f78839ae40f..a11539595805 100644 --- a/code/game/objects/items/dna_injector.dm +++ b/code/game/objects/items/dna_injector.dm @@ -90,11 +90,6 @@ desc = "This will make you big and strong, but give you a bad skin condition." add_mutations = list(HULK) -/obj/item/dnainjector/firebreath - name = "\improper DNA injector (Fire Breath)" - desc = "Restores the dragon ancestry." - add_mutations = list(FIREBREATH) - /obj/item/dnainjector/xraymut name = "\improper DNA injector (X-ray)" desc = "Finally you can see what the Captain does." diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm index 0681892fd47e..f3cdfb068944 100644 --- a/code/game/objects/items/granters.dm +++ b/code/game/objects/items/granters.dm @@ -247,19 +247,6 @@ user.Stun(40, ignore_canstun = TRUE) user.petrify(30) -/obj/item/book/granter/spell/cards - spell = /obj/effect/proc_holder/spell/aimed/spell_cards - spellname = "spellcards" - icon_state ="bookspellcards" - desc = "The ultimate card trick, for users ten and up." - remarks = list("It's all about the razzmataz.", "...I don't think I'll actually be sawing anyone in half", "These are pretty flimsy, most armor would defeat them.", "They do burn damage? Weird.", "Why the dumb stance? It's just a flick of the hand...", "Are these cards? They feel stiffer then pages.", "Best performed using a top hat...") - -/obj/item/book/granter/spell/cards/recoil(mob/living/user) - ..() - to_chat(user,"The cards are against you!") - user.Stun(40, ignore_canstun = TRUE) - user.petrify(30) - /obj/item/book/granter/spell/shapechange spell = /obj/effect/proc_holder/spell/targeted/shapeshift spellname = "shapechange" diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index c578c318e73a..0e2a945de0be 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -600,33 +600,6 @@ /obj/item/multitool = 1) generate_items_inside(items_inside,src) - -/obj/item/storage/belt/wands - name = "wand belt" - desc = "A belt designed to hold various rods of power. A veritable fanny pack of exotic magic." - icon_state = "soulstone" - item_state = "soulstone" - -/obj/item/storage/belt/wands/ComponentInitialize() - . = ..() - var/datum/component/storage/STR = GetComponent(/datum/component/storage) - STR.max_items = 6 - STR.set_holdable(list( - /obj/item/gun/magic/wand - )) - -/obj/item/storage/belt/wands/full/PopulateContents() - new /obj/item/gun/magic/wand/death(src) - new /obj/item/gun/magic/wand/resurrection(src) - new /obj/item/gun/magic/wand/polymorph(src) - new /obj/item/gun/magic/wand/teleport(src) - new /obj/item/gun/magic/wand/door(src) - new /obj/item/gun/magic/wand/fireball(src) - - for(var/obj/item/gun/magic/wand/W in contents) //All wands in this pack come in the best possible condition - W.max_charges = initial(W.max_charges) - W.charges = W.max_charges - /obj/item/storage/belt/janitor name = "janibelt" desc = "A belt used to hold most janitorial supplies." diff --git a/code/game/objects/structures/fugitive_role_spawners.dm b/code/game/objects/structures/fugitive_role_spawners.dm deleted file mode 100644 index 4f98e919ffc5..000000000000 --- a/code/game/objects/structures/fugitive_role_spawners.dm +++ /dev/null @@ -1,58 +0,0 @@ - - -/obj/effect/mob_spawn/human/fugitive - assignedrole = "Fugitive Hunter" - flavour_text = "" //the flavor text will be the backstory argument called on the antagonist's greet, see hunter.dm for details - roundstart = FALSE - death = FALSE - random = TRUE - show_flavour = FALSE - density = TRUE - var/back_story = "error" - -/obj/effect/mob_spawn/human/fugitive/Initialize(mapload) - . = ..() - notify_ghosts("Hunters are waking up looking for refugees!", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_FUGITIVE) - -/obj/effect/mob_spawn/human/fugitive/spacepol - name = "police pod" - desc = "A small sleeper typically used to put people to sleep for briefing on the mission." - mob_name = "a spacepol officer" - flavour_text = "Justice has arrived. I am a member of the Spacepol!" - back_story = "space cop" - outfit = /datum/outfit/spacepol - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper" - -/obj/effect/mob_spawn/human/fugitive/russian - name = "russian pod" - flavour_text = "Ay blyat. I am a space-russian smuggler! We were mid-flight when our cargo was beamed off our ship!" - back_story = "russian" - desc = "A small sleeper typically used to make long distance travel a bit more bearable." - mob_name = "russian" - outfit = /datum/outfit/frontier/hunter - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper" - -/obj/effect/mob_spawn/human/fugitive/bounty - name = "bounty hunter pod" - flavour_text = "We got a new bounty on some fugitives, dead or alive." - back_story = "bounty hunters" - desc = "A small sleeper typically used to make long distance travel a bit more bearable." - mob_name = "bounty hunter" - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper" - -/obj/effect/mob_spawn/human/fugitive/bounty/Destroy() - var/obj/structure/fluff/empty_sleeper/S = new(drop_location()) - S.setDir(dir) - return ..() - -/obj/effect/mob_spawn/human/fugitive/bounty/armor - outfit = /datum/outfit/bountyarmor - -/obj/effect/mob_spawn/human/fugitive/bounty/hook - outfit = /datum/outfit/bountyhook - -/obj/effect/mob_spawn/human/fugitive/bounty/synth - outfit = /datum/outfit/bountysynth diff --git a/code/game/objects/structures/icemoon/cave_entrance.dm b/code/game/objects/structures/icemoon/cave_entrance.dm index 2a7a8c5f4a38..47ac972b1c20 100644 --- a/code/game/objects/structures/icemoon/cave_entrance.dm +++ b/code/game/objects/structures/icemoon/cave_entrance.dm @@ -743,7 +743,6 @@ GLOBAL_LIST_INIT(ore_probability, list( new /obj/item/clothing/suit/space/hardsuit/carp(loc) new /mob/living/simple_animal/hostile/carp(loc) if(prob(45)) - new /obj/item/gun/magic/hook(loc) new /mob/living/simple_animal/hostile/carp(loc) if(prob(45)) new /obj/item/reagent_containers/food/snacks/fishmeat/carp(loc) @@ -1045,7 +1044,6 @@ GLOBAL_LIST_INIT(ore_probability, list( if(prob(45)) new /obj/item/dnainjector/dwarf(loc) if(prob(35)) - new /obj/item/dnainjector/firebreath(loc) new /mob/living/simple_animal/hostile/gorilla(loc) if(prob(35)) new /mob/living/simple_animal/hostile/gorilla(loc) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index df5b1d6d18d3..f189fdf6106d 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -735,8 +735,6 @@ M.audible_message("...wabbajack...wabbajack...") playsound(M.loc, 'sound/magic/staff_change.ogg', 50, TRUE, -1) - wabbajack(M) - message_admins("Mass polymorph started by [who_did_it] is complete.") diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index 68e0d514ad3a..28a4ae06d16b 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -211,185 +211,6 @@ if(can_drop) new /obj/item/melee/synthetic_arm_blade(get_turf(user)) -/***************************************\ -|***********COMBAT TENTACLES*************| -\***************************************/ - -/datum/action/changeling/weapon/tentacle - name = "Tentacle" - desc = "We ready a tentacle to grab items or victims with. Costs 10 chemicals." - helptext = "We can use it once to retrieve a distant item. If used on living creatures, the effect depends on the intent: \ - Help will simply drag them closer, Disarm will grab whatever they're holding instead of them, Grab will put the victim in our hold after catching it, \ - and Harm will pull it in and stab it if we're also holding a sharp weapon. Cannot be used while in lesser form." - button_icon_state = "tentacle" - chemical_cost = 10 - dna_cost = 2 - req_human = 1 - weapon_type = /obj/item/gun/magic/tentacle - weapon_name_simple = "tentacle" - silent = TRUE - -/obj/item/gun/magic/tentacle - name = "tentacle" - desc = "A fleshy tentacle that can stretch out and grab things or people." - icon = 'icons/obj/changeling_items.dmi' - icon_state = "tentacle" - item_state = "tentacle" - lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi' - righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi' - item_flags = NEEDS_PERMIT | ABSTRACT | DROPDEL | NOBLUDGEON - flags_1 = NONE - w_class = WEIGHT_CLASS_HUGE - slot_flags = NONE - ammo_type = /obj/item/ammo_casing/magic/tentacle - fire_sound = 'sound/effects/splat.ogg' - force = 0 - max_charges = 1 - fire_delay = 0.1 SECONDS - throwforce = 0 //Just to be on the safe side - throw_range = 0 - throw_speed = 0 - -/obj/item/gun/magic/tentacle/Initialize(mapload, silent) - . = ..() - ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) - if(ismob(loc)) - if(!silent) - loc.visible_message("[loc.name]\'s arm starts stretching inhumanly!", "Our arm twists and mutates, transforming it into a tentacle.", "You hear organic matter ripping and tearing!") - else - to_chat(loc, "You prepare to extend a tentacle.") - - -/obj/item/gun/magic/tentacle/shoot_with_empty_chamber(mob/living/user as mob|obj) - to_chat(user, "The [name] is not ready yet.") - -/obj/item/gun/magic/tentacle/process_fire() - . = ..() - if(charges == 0) - qdel(src) - -/obj/item/ammo_casing/magic/tentacle - name = "tentacle" - desc = "A tentacle." - projectile_type = /obj/projectile/tentacle - caliber = "tentacle" - icon_state = "arrow" - firing_effect_type = null - var/obj/item/gun/magic/tentacle/gun //the item that shot it - -/obj/item/ammo_casing/magic/tentacle/Initialize() - gun = loc - . = ..() - -/obj/item/ammo_casing/magic/tentacle/Destroy() - gun = null - return ..() - -/obj/projectile/tentacle - name = "tentacle" - icon_state = "tentacle_end" - pass_flags = PASSTABLE - damage = 0 - damage_type = BRUTE - range = 8 - hitsound = 'sound/weapons/thudswoosh.ogg' - var/chain - var/obj/item/ammo_casing/magic/tentacle/source //the item that shot it - -/obj/projectile/tentacle/Initialize() - source = loc - . = ..() - -/obj/projectile/tentacle/fire(setAngle) - if(firer) - chain = firer.Beam(src, icon_state = "tentacle", emissive = FALSE) - ..() - -/obj/projectile/tentacle/proc/reset_throw(mob/living/carbon/human/H) - if(H.throw_mode) - H.throw_mode_off() //Don't annoy the changeling if he doesn't catch the item - -/obj/projectile/tentacle/proc/tentacle_grab(mob/living/carbon/human/H, mob/living/carbon/C) - if(H.Adjacent(C)) - if(H.get_active_held_item() && !H.get_inactive_held_item()) - H.swap_hand() - if(H.get_active_held_item()) - return - C.grabbedby(H) - C.grippedby(H, instant = TRUE) //instant aggro grab - -/obj/projectile/tentacle/proc/tentacle_stab(mob/living/carbon/human/H, mob/living/carbon/C) - if(H.Adjacent(C)) - for(var/obj/item/I in H.held_items) - if(I.get_sharpness()) - C.visible_message("[H] impales [C] with [H.p_their()] [I.name]!", "[H] impales you with [H.p_their()] [I.name]!") - C.apply_damage(I.force, BRUTE, BODY_ZONE_CHEST) - H.do_item_attack_animation(C, used_item = I) - H.add_mob_blood(C) - playsound(get_turf(H),I.hitsound,75,TRUE) - return - -/obj/projectile/tentacle/on_hit(atom/target, blocked = FALSE) - var/mob/living/carbon/human/H = firer - if(blocked >= 100) - return BULLET_ACT_BLOCK - if(isitem(target)) - var/obj/item/I = target - if(!I.anchored) - to_chat(firer, "You pull [I] towards yourself.") - H.throw_mode_on() - I.throw_at(H, 10, 2) - . = BULLET_ACT_HIT - - else if(isliving(target)) - var/mob/living/L = target - if(!L.anchored && !L.throwing)//avoid double hits - if(iscarbon(L)) - var/mob/living/carbon/C = L - var/firer_intent = INTENT_HARM - var/mob/M = firer - if(istype(M)) - firer_intent = M.a_intent - switch(firer_intent) - if(INTENT_HELP) - C.visible_message("[L] is pulled by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!") - C.throw_at(get_step_towards(H,C), 8, 2) - return BULLET_ACT_HIT - - if(INTENT_DISARM) - var/obj/item/I = C.get_active_held_item() - if(I) - if(C.dropItemToGround(I)) - C.visible_message("[I] is yanked off [C]'s hand by [src]!","A tentacle pulls [I] away from you!") - on_hit(I) //grab the item as if you had hit it directly with the tentacle - return BULLET_ACT_HIT - else - to_chat(firer, "You can't seem to pry [I] off [C]'s hands!") - return BULLET_ACT_BLOCK - else - to_chat(firer, "[C] has nothing in hand to disarm!") - return BULLET_ACT_HIT - - if(INTENT_GRAB) - C.visible_message("[L] is grabbed by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!") - C.throw_at(get_step_towards(H,C), 8, 2, H, TRUE, TRUE, callback=CALLBACK(src, PROC_REF(tentacle_grab), H, C)) - return BULLET_ACT_HIT - - if(INTENT_HARM) - C.visible_message("[L] is thrown towards [H] by a tentacle!","A tentacle grabs you and throws you towards [H]!") - C.throw_at(get_step_towards(H,C), 8, 2, H, TRUE, TRUE, callback=CALLBACK(src, PROC_REF(tentacle_stab), H, C)) - return BULLET_ACT_HIT - else - L.visible_message("[L] is pulled by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!") - L.throw_at(get_step_towards(H,L), 8, 2) - . = BULLET_ACT_HIT - -/obj/projectile/tentacle/Destroy() - qdel(chain) - source = null - return ..() - - /***************************************\ |****************SHIELD*****************| \***************************************/ diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index cf1562d8c289..c9232857a547 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -812,7 +812,7 @@ /obj/item/melee/blood_magic/manipulator/attack_self(mob/living/user) if(iscultist(user)) - var/list/options = list("Blood Spear (150)", "Blood Bolt Barrage (300)", "Blood Beam (500)") + var/list/options = list("Blood Spear (150)", "Blood Beam (500)") var/choice = input(user, "Choose a greater blood rite...", "Greater Blood Rites") as null|anything in options if(!choice) to_chat(user, "You decide against conducting a greater blood rite.") @@ -835,18 +835,6 @@ user.visible_message( "A [rite.name] appears at [user]'s feet!", \ "A [rite.name] materializes at your feet.") - if("Blood Bolt Barrage (300)") - if(uses < BLOOD_BARRAGE_COST) - to_chat(user, "You need [BLOOD_BARRAGE_COST] charges to perform this rite.") - else - var/obj/rite = new /obj/item/gun/ballistic/rifle/illestren/enchanted/arcane_barrage/blood() - uses -= BLOOD_BARRAGE_COST - qdel(src) - if(user.put_in_hands(rite)) - to_chat(user, "Your hands glow with power!") - else - to_chat(user, "You need a free hand for this rite!") - qdel(rite) if("Blood Beam (500)") if(uses < BLOOD_BEAM_COST) to_chat(user, "You need [BLOOD_BEAM_COST] charges to perform this rite.") diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index 6eed283b02f1..53d17bf325aa 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -703,47 +703,6 @@ L.visible_message("An unseen force pulls the blood spear from [L]'s hands!") spear.throw_at(owner, 10, 2, owner) - -/obj/item/gun/ballistic/rifle/illestren/enchanted/arcane_barrage/blood - name = "blood bolt barrage" - desc = "Blood for blood." - color = "#ff0000" - guns_left = 24 - mag_type = /obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage/blood - fire_sound = 'sound/magic/wand_teleport.ogg' - - -/obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage/blood - ammo_type = /obj/item/ammo_casing/magic/arcane_barrage/blood - -/obj/item/ammo_casing/magic/arcane_barrage/blood - projectile_type = /obj/projectile/magic/arcane_barrage/blood - firing_effect_type = /obj/effect/temp_visual/cult/sparks - -/obj/projectile/magic/arcane_barrage/blood - name = "blood bolt" - icon_state = "mini_leaper" - nondirectional_sprite = TRUE - damage_type = BRUTE - impact_effect_type = /obj/effect/temp_visual/dir_setting/bloodsplatter - -/obj/projectile/magic/arcane_barrage/blood/Bump(atom/target) - var/turf/T = get_turf(target) - playsound(T, 'sound/effects/splat.ogg', 50, TRUE) - if(iscultist(target)) - if(ishuman(target)) - var/mob/living/carbon/human/H = target - if(H.stat != DEAD) - H.reagents.add_reagent(/datum/reagent/fuel/unholywater, 4) - if(isshade(target) || isconstruct(target)) - var/mob/living/simple_animal/M = target - if(M.health+5 < M.maxHealth) - M.adjustHealth(-5) - new /obj/effect/temp_visual/cult/sparks(T) - qdel(src) - else - ..() - /obj/item/blood_beam name = "\improper magical aura" desc = "Sinister looking aura that distorts the flow of reality around it." diff --git a/code/modules/antagonists/fugitive/fugitive_outfits.dm b/code/modules/antagonists/fugitive/fugitive_outfits.dm deleted file mode 100644 index df784813df40..000000000000 --- a/code/modules/antagonists/fugitive/fugitive_outfits.dm +++ /dev/null @@ -1,154 +0,0 @@ -/datum/outfit/prisoner - name = "Prison Escapee" - uniform = /obj/item/clothing/under/rank/prisoner - shoes = /obj/item/clothing/shoes/sneakers/orange - r_pocket = /obj/item/kitchen/knife/shiv - -/datum/outfit/prisoner/post_equip(mob/living/carbon/human/H, visualsOnly=FALSE) - if(visualsOnly) - return - H.fully_replace_character_name(null,"NTP #CC-0[rand(111,999)]") //same as the lavaland prisoner transport, but this time they are from CC, or CentCom - -/datum/outfit/yalp_cultist - name = "Cultist of Yalp Elor" - uniform = /obj/item/clothing/under/rank/civilian/chaplain - suit = /obj/item/clothing/suit/chaplainsuit/holidaypriest - gloves = /obj/item/clothing/gloves/color/red - shoes = /obj/item/clothing/shoes/sneakers/black - mask = /obj/item/clothing/mask/gas/tiki_mask/yalp_elor - -/datum/outfit/waldo - name = "Waldo" - uniform = /obj/item/clothing/under/pants/jeans - suit = /obj/item/clothing/suit/striped_sweater - head = /obj/item/clothing/head/beanie/waldo - shoes = /obj/item/clothing/shoes/sneakers/brown - ears = /obj/item/radio/headset - glasses = /obj/item/clothing/glasses/regular/circle - -/datum/outfit/waldo/post_equip(mob/living/carbon/human/H, visualsOnly=FALSE) - if(visualsOnly) - return - H.fully_replace_character_name(null,"Waldo") - H.eye_color = "000" - H.gender = MALE - H.skin_tone = "caucasian3" - H.hairstyle = "Business Hair 3" - H.facial_hairstyle = "Shaved" - H.hair_color = "000" - H.facial_hair_color = H.hair_color - H.update_body() - if(H.mind) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null)) - var/list/no_drops = list() - no_drops += H.get_item_by_slot(ITEM_SLOT_FEET) - no_drops += H.get_item_by_slot(ITEM_SLOT_ICLOTHING) - no_drops += H.get_item_by_slot(ITEM_SLOT_OCLOTHING) - no_drops += H.get_item_by_slot(ITEM_SLOT_HEAD) - no_drops += H.get_item_by_slot(ITEM_SLOT_EYES) - for(var/i in no_drops) - var/obj/item/I = i - ADD_TRAIT(I, TRAIT_NODROP, CURSED_ITEM_TRAIT) - -/datum/outfit/synthetic - name = "Factory Error Synth" - uniform = /obj/item/clothing/under/color/white - ears = /obj/item/radio/headset - -/datum/outfit/synthetic/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - if(visualsOnly) - return - var/obj/item/organ/eyes/robotic/glow/eyes = new() - eyes.Insert(src, drop_if_replaced = FALSE) - -/datum/outfit/spacepol - name = "Spacepol Officer" - uniform = /obj/item/clothing/under/rank/security/officer/beatcop - suit = /obj/item/clothing/suit/armor/vest/blueshirt - belt = /obj/item/gun/ballistic/automatic/pistol/candor - head = /obj/item/clothing/head/helmet/police - gloves = /obj/item/clothing/gloves/tackler/combat - shoes = /obj/item/clothing/shoes/jackboots - mask = /obj/item/clothing/mask/gas/sechailer/swat/spacepol - glasses = /obj/item/clothing/glasses/sunglasses - ears = /obj/item/radio/headset - l_pocket = /obj/item/ammo_box/magazine/m45 - r_pocket = /obj/item/restraints/handcuffs - id = /obj/item/card/id - -/datum/outfit/spacepol/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - if(visualsOnly) - return - var/obj/item/card/id/W = H.wear_id - W.assignment = "Police Officer" - W.registered_name = H.real_name - W.update_label() - -/datum/outfit/frontier/hunter - name = "Frontiersman Corpse (Hunter)" - ears = /obj/item/radio/headset - r_hand = /obj/item/gun/ballistic/rifle/illestren - -/datum/outfit/frontier/hunter/pre_equip(mob/living/carbon/human/H) - if(prob(50)) - head = /obj/item/clothing/head/trapper - -/datum/outfit/bountyarmor - name = "Bounty Hunter - Armored" - uniform = /obj/item/clothing/under/rank/prisoner - head = /obj/item/clothing/head/hunter - suit = /obj/item/clothing/suit/space/hunter - gloves = /obj/item/clothing/gloves/tackler/combat - shoes = /obj/item/clothing/shoes/jackboots - mask = /obj/item/clothing/mask/gas/hunter - glasses = /obj/item/clothing/glasses/sunglasses/garb - ears = /obj/item/radio/headset - l_pocket = /obj/item/tank/internals/emergency_oxygen - r_pocket = /obj/item/restraints/handcuffs/cable - id = /obj/item/card/id - r_hand = /obj/item/flamethrower/full/tank - -/datum/outfit/bountyarmor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - if(visualsOnly) - return - var/obj/item/card/id/W = H.wear_id - W.assignment = "Bounty Hunter" - W.registered_name = H.real_name - W.update_label() - -/datum/outfit/bountyhook - name = "Bounty Hunter - Hook" - uniform = /obj/item/clothing/under/rank/prisoner - back = /obj/item/storage/backpack - head = /obj/item/clothing/head/scarecrow_hat - gloves = /obj/item/clothing/gloves/botanic_leather - ears = /obj/item/radio/headset - shoes = /obj/item/clothing/shoes/jackboots - mask = /obj/item/clothing/mask/scarecrow - r_pocket = /obj/item/restraints/handcuffs/cable - id = /obj/item/card/id - r_hand = /obj/item/gun/ballistic/shotgun/doublebarrel/hook - - backpack_contents = list( - /obj/item/ammo_casing/shotgun/incapacitate = 6 - ) - -/datum/outfit/bountyhook/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - if(visualsOnly) - return - var/obj/item/card/id/W = H.wear_id - W.assignment = "Bounty Hunter" - W.registered_name = H.real_name - W.update_label() - -/datum/outfit/bountysynth - name = "Bounty Hunter - Synth" - uniform = /obj/item/clothing/under/rank/prisoner - back = /obj/item/storage/backpack - suit = /obj/item/clothing/suit/armor/riot - shoes = /obj/item/clothing/shoes/jackboots - glasses = /obj/item/clothing/glasses/eyepatch - r_pocket = /obj/item/restraints/handcuffs/cable - ears = /obj/item/radio/headset - id = /obj/item/card/id - r_hand = /obj/item/storage/firstaid/regular diff --git a/code/modules/antagonists/survivalist/survivalist.dm b/code/modules/antagonists/survivalist/survivalist.dm index 0e38dc57105d..1fb457eea64b 100644 --- a/code/modules/antagonists/survivalist/survivalist.dm +++ b/code/modules/antagonists/survivalist/survivalist.dm @@ -26,17 +26,3 @@ guns.owner = owner objectives += guns ..() - -/datum/antagonist/survivalist/magic - name = "Amateur Magician" - greet_message = "Grow your newfound talent! Grab as many magical artefacts as possible, by any means necessary. Kill anyone who gets in your way." - -/datum/antagonist/survivalist/magic/greet() - ..() - to_chat(owner, "As a wonderful magician, you should remember that spellbooks don't mean anything if they are used up.") - -/datum/antagonist/survivalist/magic/forge_objectives() - var/datum/objective/steal_five_of_type/summon_magic/magic = new - magic.owner = owner - objectives += magic - ..() diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm index 58e397a64d40..69ff4bcfc2f5 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook.dm @@ -106,10 +106,6 @@ name = "Fireball" spell_type = /obj/effect/proc_holder/spell/aimed/fireball -/datum/spellbook_entry/spell_cards - name = "Spell Cards" - spell_type = /obj/effect/proc_holder/spell/aimed/spell_cards - /datum/spellbook_entry/rod_form name = "Rod Form" spell_type = /obj/effect/proc_holder/spell/targeted/rod_form @@ -223,18 +219,6 @@ . = ..() REMOVE_TRAIT(user, TRAIT_TESLA_SHOCKIMMUNE, "lightning_bolt_spell") -/datum/spellbook_entry/infinite_guns - name = "Lesser Summon Guns" - spell_type = /obj/effect/proc_holder/spell/targeted/infinite_guns/gun - cost = 3 - no_coexistance_typecache = /obj/effect/proc_holder/spell/targeted/infinite_guns/arcane_barrage - -/datum/spellbook_entry/arcane_barrage - name = "Arcane Barrage" - spell_type = /obj/effect/proc_holder/spell/targeted/infinite_guns/arcane_barrage - cost = 3 - no_coexistance_typecache = /obj/effect/proc_holder/spell/targeted/infinite_guns/gun - /datum/spellbook_entry/barnyard name = "Barnyard Curse" spell_type = /obj/effect/proc_holder/spell/pointed/barnyardcurse @@ -291,47 +275,6 @@ dat += "[surplus] left.
" return dat -/datum/spellbook_entry/item/staffchange - name = "Staff of Change" - desc = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself." - item_path = /obj/item/gun/magic/staff/change - -/datum/spellbook_entry/item/staffanimation - name = "Staff of Animation" - desc = "An arcane staff capable of shooting bolts of eldritch energy which cause inanimate objects to come to life. This magic doesn't affect machines." - item_path = /obj/item/gun/magic/staff/animate - category = "Assistance" - -/datum/spellbook_entry/item/staffchaos - name = "Staff of Chaos" - desc = "A caprious tool that can fire all sorts of magic without any rhyme or reason. Using it on people you care about is not recommended." - item_path = /obj/item/gun/magic/staff/chaos - -/datum/spellbook_entry/item/spellblade - name = "Spellblade" - desc = "A sword capable of firing blasts of energy which rip targets limb from limb." - item_path = /obj/item/gun/magic/staff/spellblade - -/datum/spellbook_entry/item/staffdoor - name = "Staff of Door Creation" - desc = "A particular staff that can mold solid walls into ornate doors. Useful for getting around in the absence of other transportation. Does not work on glass." - item_path = /obj/item/gun/magic/staff/door - cost = 1 - category = "Mobility" - -/datum/spellbook_entry/item/staffhealing - name = "Staff of Healing" - desc = "An altruistic staff that can heal the lame and raise the dead." - item_path = /obj/item/gun/magic/staff/healing - cost = 1 - category = "Defensive" - -/datum/spellbook_entry/item/lockerstaff - name = "Staff of the Locker" - desc = "A staff that shoots lockers. It eats anyone it hits on its way, leaving a welded locker with your victims behind." - item_path = /obj/item/gun/magic/staff/locker - category = "Defensive" - /datum/spellbook_entry/item/scryingorb name = "Scrying Orb" desc = "An incandescent orb of crackling energy. Using it will allow you to release your ghost while alive, allowing you to spy upon others and talk to the deceased. In addition, buying it will permanently grant you X-ray vision." @@ -356,12 +299,6 @@ item_path = /obj/item/necromantic_stone category = "Assistance" -/datum/spellbook_entry/item/wands - name = "Wand Assortment" - desc = "A collection of wands that allow for a wide variety of utility. Wands have a limited number of charges, so be conservative with their use. Comes in a handy belt." - item_path = /obj/item/storage/belt/wands/full - category = "Defensive" - /datum/spellbook_entry/item/armor name = "Mastercrafted Armor Set" desc = "An artefact suit of armor that allows you to cast spells while providing more protection against attacks and the void of space." diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm index 14cf56d51ae0..96a41b2ac07b 100644 --- a/code/modules/antagonists/wizard/wizard.dm +++ b/code/modules/antagonists/wizard/wizard.dm @@ -204,7 +204,6 @@ if(APPRENTICE_HEALING) owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/charge(null)) owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/forcewall(null)) - H.put_in_hands(new /obj/item/gun/magic/staff/healing(H)) to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned life-saving survival spells. You are able to cast charge and forcewall.") if(APPRENTICE_ROBELESS) owner.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null)) diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm index c7aa46af728b..b64a2abf02de 100644 --- a/code/modules/awaymissions/mission_code/snowdin.dm +++ b/code/modules/awaymissions/mission_code/snowdin.dm @@ -487,7 +487,6 @@ /obj/item/shield/energy = 6, /obj/item/shield/riot/tele = 12, /obj/item/dnainjector/lasereyesmut = 7, - /obj/item/gun/magic/wand/fireball/inert = 3, /obj/item/pneumatic_cannon = 15, /obj/item/melee/transforming/energy/sword = 7, /obj/item/book/granter/spell/knock = 15, @@ -515,8 +514,6 @@ /obj/item/dualsaber = 15, /obj/item/organ/heart/demon = 7, /obj/item/gun/ballistic/automatic/smg/c20r = 16, - /obj/item/gun/magic/wand/resurrection/inert = 15, - /obj/item/gun/magic/wand/resurrection = 10, /obj/item/uplink/old = 2, /obj/item/book/granter/spell/charge = 12, /obj/item/grenade/clusterbuster/spawner_manhacks = 15, @@ -556,16 +553,6 @@ desc = "High speed, low drag combat boots, now with an added layer of insulation." min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT -/obj/item/gun/magic/wand/fireball/inert - name = "weakened wand of fireball" - desc = "This wand shoots scorching balls of fire that explode into destructive flames. The years of the cold have weakened the magic inside the wand." - max_charges = 4 - -/obj/item/gun/magic/wand/resurrection/inert - name = "weakened wand of healing" - desc = "This wand uses healing magics to heal and revive. The years of the cold have weakened the magic inside the wand." - max_charges = 5 - /obj/effect/mob_spawn/human/syndicatesoldier/coldres name = "Syndicate Snow Operative" outfit = /datum/outfit/snowsyndie/corpse diff --git a/code/modules/cargo/exports/lavaland.dm b/code/modules/cargo/exports/lavaland.dm index b330b0ec4bdc..4779886622a4 100644 --- a/code/modules/cargo/exports/lavaland.dm +++ b/code/modules/cargo/exports/lavaland.dm @@ -7,7 +7,6 @@ unit_name = "minor lava planet artifact" export_types = list(/obj/item/immortality_talisman, /obj/item/book_of_babel, - /obj/item/gun/magic/hook, /obj/item/wisp_lantern, /obj/item/reagent_containers/glass/bottle/potion/flight, /obj/item/katana/cursed, @@ -23,9 +22,7 @@ /obj/item/lava_staff, /obj/item/ship_in_a_bottle, /obj/item/clothing/shoes/clown_shoes/banana_shoes, - /obj/item/gun/magic/staff/honk, /obj/item/kitchen/knife/envy, - /obj/item/gun/ballistic/revolver/russian/soul, /obj/item/veilrender/vealrender, /obj/item/nullrod/scythe/talking/necro, /obj/item/clothing/suit/armor/ascetic) @@ -55,8 +52,7 @@ /obj/machinery/anomalous_crystal, /obj/item/mayhem, /obj/item/blood_contract, - /obj/item/guardiancreator/miner/choose,//this is basically the most valulable mining loot so good luck getting a miner to part ways - /obj/item/gun/magic/staff/spellblade, + /obj/item/guardiancreator/miner/choose//this is basically the most valulable mining loot so good luck getting a miner to part ways ) /* /datum/export/lavaland/trophycommon diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index d039d06dae35..100cc7ff0f52 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -226,8 +226,6 @@ backpack_contents = list( /obj/item/melee/transforming/energy/axe=1,\ /obj/item/storage/part_replacer/bluespace/tier4=1,\ - /obj/item/gun/magic/wand/resurrection/debug=1,\ - /obj/item/gun/magic/wand/death/debug=1,\ /obj/item/debug/human_spawner=1,\ /obj/item/debug/omnitool=1 ) diff --git a/code/modules/events/wizard/magicarp.dm b/code/modules/events/wizard/magicarp.dm deleted file mode 100644 index 68a38f0479e1..000000000000 --- a/code/modules/events/wizard/magicarp.dm +++ /dev/null @@ -1,75 +0,0 @@ -/datum/round_event_control/wizard/magicarp //these fish is loaded - name = "Magicarp" - weight = 1 - typepath = /datum/round_event/wizard/magicarp - max_occurrences = 1 - earliest_start = 0 MINUTES - -/datum/round_event/wizard/magicarp - announceWhen = 3 - startWhen = 50 - -/datum/round_event/wizard/magicarp/setup() - startWhen = rand(40, 60) - -/datum/round_event/wizard/magicarp/announce(fake) - priority_announce("Unknown magical entities have been detected near [station_name()], please stand-by.", "Lifesign Alert") - -/datum/round_event/wizard/magicarp/start() - for(var/obj/effect/landmark/carpspawn/C in GLOB.landmarks_list) - if(prob(5)) - new /mob/living/simple_animal/hostile/carp/ranged/chaos(C.loc) - else - new /mob/living/simple_animal/hostile/carp/ranged(C.loc) - -/mob/living/simple_animal/hostile/carp/ranged - name = "magicarp" - desc = "50% magic, 50% carp, 100% horrible." - icon_state = "magicarp" - icon_living = "magicarp" - icon_dead = "magicarp_dead" - icon_gib = "magicarp_gib" - ranged = 1 - retreat_distance = 2 - minimum_distance = 0 //Between shots they can and will close in to nash - projectiletype = /obj/projectile/magic - projectilesound = 'sound/weapons/emitter.ogg' - maxHealth = 50 - health = 50 - gold_core_spawnable = NO_SPAWN - random_color = FALSE - food_type = list() - tame_chance = 0 - bonus_tame_chance = 0 - var/allowed_projectile_types = list(/obj/projectile/magic/change, /obj/projectile/magic/animate, /obj/projectile/magic/resurrection, - /obj/projectile/magic/death, /obj/projectile/magic/teleport, /obj/projectile/magic/door, /obj/projectile/magic/aoe/fireball, - /obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage) - -/mob/living/simple_animal/hostile/carp/ranged/Initialize() - projectiletype = pick(allowed_projectile_types) - . = ..() - -/mob/living/simple_animal/hostile/carp/ranged/chaos - name = "chaos magicarp" - desc = "50% carp, 100% magic, 150% horrible." - color = "#00FFFF" - maxHealth = 75 - health = 75 - gold_core_spawnable = NO_SPAWN - -/mob/living/simple_animal/hostile/carp/ranged/chaos/Shoot() - projectiletype = pick(allowed_projectile_types) - ..() - -/mob/living/simple_animal/hostile/carp/ranged/xenobiology // these are for the xenobio gold slime pool - gold_core_spawnable = HOSTILE_SPAWN - allowed_projectile_types = list(/obj/projectile/magic/animate, /obj/projectile/magic/teleport, - /obj/projectile/magic/door, /obj/projectile/magic/aoe/fireball, /obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage, - /obj/projectile/magic/spell/magic_missile, /obj/projectile/magic/aoe/lightning, /obj/projectile/magic/locker) //thanks Lett1 /finally, we can synthesize the lockerfish - -/mob/living/simple_animal/hostile/carp/ranged/chaos/xenobiology - gold_core_spawnable = HOSTILE_SPAWN - allowed_projectile_types = list(/obj/projectile/magic/change, /obj/projectile/magic/animate, /obj/projectile/magic/resurrection, - /obj/projectile/magic/death, /obj/projectile/magic/teleport, /obj/projectile/magic/door, /obj/projectile/magic/aoe/fireball, - /obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage, /obj/projectile/magic/locker, /obj/projectile/magic/nothing, - /obj/projectile/magic/aoe/lightning, /obj/projectile/magic/necropotence, /obj/projectile/magic/fortify, /obj/projectile/magic/spell/magic_missile)//now THIS is chaos diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index 817970a00602..7ba30d327444 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -315,10 +315,6 @@ /obj/item/hierophant_club, /obj/item/gun/energy/minigun, /obj/item/gun/ballistic/automatic/hmg/l6_saw, - /obj/item/gun/magic/staff/chaos, - /obj/item/gun/magic/staff/spellblade, - /obj/item/gun/magic/wand/death, - /obj/item/gun/magic/wand/fireball, /obj/item/stack/telecrystal/twenty, /obj/item/nuke_core, /obj/item/phylactery, diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 88e1d066024f..7b80559d2691 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -66,8 +66,6 @@ new /obj/item/wisp_lantern(src) if(20) new /obj/item/immortality_talisman(src) - if(21) - new /obj/item/gun/magic/hook(src) if(22) new /obj/item/voodoo(src) if(23) @@ -143,8 +141,6 @@ new /obj/item/wisp_lantern(src) if(20) new /obj/item/immortality_talisman(src) - if(21) - new /obj/item/gun/magic/hook(src) if(22) new /obj/item/voodoo(src) if(23) @@ -481,91 +477,6 @@ /obj/effect/warp_cube/ex_act(severity, target) return -//Meat Hook -/obj/item/gun/magic/hook - name = "meat hook" - desc = "A light hooked blade, attached by the handle to a long chain. Can be used to make quick strikes in hand, or thrown at enemies, magically dragging them to the user. Get over here!" - ammo_type = /obj/item/ammo_casing/magic/hook - icon_state = "hook" - item_state = "hook" - lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' - fire_sound = 'sound/weapons/batonextend.ogg' - max_charges = 1 - item_flags = NEEDS_PERMIT - force = 15 - sharpness = IS_SHARP - block_chance = 5//A pittance, but might be worth something in a scuffle - hitsound = 'sound/weapons/chainhit.ogg' - -/obj/item/gun/magic/hook/melee_attack_chain(mob/user, atom/target, params) - ..() - user.changeNext_move(CLICK_CD_MELEE * 0.5)//quick to swing. 15 force can be quite something with this attack frequency. - -/obj/item/gun/magic/hook/Initialize() - . = ..() - AddComponent(/datum/component/butchering, 15, 130, 0, hitsound) - -/obj/item/ammo_casing/magic/hook - name = "hook" - desc = "A hook." - projectile_type = /obj/projectile/hook - caliber = "hook" - icon_state = "arrow" - -/obj/projectile/hook - name = "hook" - icon_state = "hook" - icon = 'icons/obj/lavaland/artefacts.dmi' - pass_flags = PASSTABLE - damage = 20 - stamina = 20 - armour_penetration = 60 - damage_type = BRUTE - hitsound = 'sound/effects/splat.ogg' - var/chain - var/knockdown_time = (0.5 SECONDS) - -/obj/projectile/hook/fire(setAngle) - if(firer) - chain = firer.Beam(src, icon_state = "chain", emissive = FALSE) - ..() - //TODO: root the firer until the chain returns - -/obj/projectile/hook/on_hit(atom/target) - . = ..() - if(ismovable(target)) - var/atom/movable/A = target - if(A.anchored) - return - A.visible_message("[A] is snagged by [firer]'s hook!") - new /datum/forced_movement(A, get_turf(firer), 5, TRUE) - if (isliving(target)) - var/mob/living/fresh_meat = target - fresh_meat.Knockdown(knockdown_time) - return - //TODO: keep the chain beamed to A - //TODO: needs a callback to delete the chain - -/obj/projectile/hook/Destroy() - qdel(chain) - return ..() - -//just a nerfed version of the real thing for the bounty hunters. -/obj/item/gun/magic/hook/bounty - name = "hook" - ammo_type = /obj/item/ammo_casing/magic/hook/bounty - -/obj/item/gun/magic/hook/bounty/shoot_with_empty_chamber(mob/living/user) - to_chat(user, "The [src] isn't ready to fire yet!") - -/obj/item/ammo_casing/magic/hook/bounty - projectile_type = /obj/projectile/hook/bounty - -/obj/projectile/hook/bounty - damage = 0 - stamina = 40 - //Immortality Talisman: Now with state-of-the-art panic button technology /obj/item/immortality_talisman name = "\improper Immortality Talisman" @@ -1303,7 +1214,6 @@ new /obj/item/lava_staff(src) if(3) new /obj/item/book/granter/spell/sacredflame(src) - new /obj/item/gun/magic/wand/fireball(src) if(4) new /obj/item/dragons_blood(src) @@ -1519,14 +1429,12 @@ /obj/structure/closet/crate/necropolis/bubblegum/PopulateContents() new /obj/item/clothing/suit/space/hostile_environment(src) new /obj/item/clothing/head/helmet/space/hostile_environment(src) - var/loot = rand(1,3) + var/loot = rand(1,2) switch(loot) if(1) new /obj/item/mayhem(src) if(2) new /obj/item/blood_contract(src) - if(3) - new /obj/item/gun/magic/staff/spellblade(src) /obj/item/mayhem name = "mayhem in a bottle" diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 25722dd28e5f..8fbf9c32a38e 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -335,8 +335,6 @@ if(GLOB.summon_guns_triggered) give_guns(humanc) - if(GLOB.summon_magic_triggered) - give_magic(humanc) if(GLOB.curse_of_madness_triggered) give_madness(humanc, GLOB.curse_of_madness_triggered) if(CONFIG_GET(flag/roundstart_traits)) diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index 6cb15357cc64..c34a70b3afde 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -21,7 +21,6 @@ exotic_bloodtype = "L" disliked_food = GRAIN | DAIRY | CLOTH | GROSS liked_food = GORE | MEAT - inert_mutation = FIREBREATH deathsound = 'sound/voice/lizard/deathsound.ogg' wings_icons = list("Dragon") species_language_holder = /datum/language_holder/lizard diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm index 77b4544a6dbb..3a4506b62562 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm @@ -315,3 +315,102 @@ empulse(src, 5, 8) new /obj/effect/gibspawner/human(get_turf(src)) qdel(src) + +/obj/projectile/tentacle + name = "tentacle" + icon_state = "tentacle_end" + pass_flags = PASSTABLE + damage = 0 + damage_type = BRUTE + range = 8 + hitsound = 'sound/weapons/thudswoosh.ogg' + var/chain + +/obj/projectile/tentacle/fire(setAngle) + if(firer) + chain = firer.Beam(src, icon_state = "tentacle", emissive = FALSE) + ..() + +/obj/projectile/tentacle/proc/reset_throw(mob/living/carbon/human/H) + if(H.throw_mode) + H.throw_mode_off() //Don't annoy the changeling if he doesn't catch the item + +/obj/projectile/tentacle/proc/tentacle_grab(mob/living/carbon/human/H, mob/living/carbon/C) + if(H.Adjacent(C)) + if(H.get_active_held_item() && !H.get_inactive_held_item()) + H.swap_hand() + if(H.get_active_held_item()) + return + C.grabbedby(H) + C.grippedby(H, instant = TRUE) //instant aggro grab + +/obj/projectile/tentacle/proc/tentacle_stab(mob/living/carbon/human/H, mob/living/carbon/C) + if(H.Adjacent(C)) + for(var/obj/item/I in H.held_items) + if(I.get_sharpness()) + C.visible_message("[H] impales [C] with [H.p_their()] [I.name]!", "[H] impales you with [H.p_their()] [I.name]!") + C.apply_damage(I.force, BRUTE, BODY_ZONE_CHEST) + H.do_item_attack_animation(C, used_item = I) + H.add_mob_blood(C) + playsound(get_turf(H),I.hitsound,75,TRUE) + return + +/obj/projectile/tentacle/on_hit(atom/target, blocked = FALSE) + var/mob/living/carbon/human/H = firer + if(blocked >= 100) + return BULLET_ACT_BLOCK + if(isitem(target)) + var/obj/item/I = target + if(!I.anchored) + to_chat(firer, "You pull [I] towards yourself.") + H.throw_mode_on() + I.throw_at(H, 10, 2) + . = BULLET_ACT_HIT + + else if(isliving(target)) + var/mob/living/L = target + if(!L.anchored && !L.throwing)//avoid double hits + if(iscarbon(L)) + var/mob/living/carbon/C = L + var/firer_intent = INTENT_HARM + var/mob/M = firer + if(istype(M)) + firer_intent = M.a_intent + switch(firer_intent) + if(INTENT_HELP) + C.visible_message("[L] is pulled by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!") + C.throw_at(get_step_towards(H,C), 8, 2) + return BULLET_ACT_HIT + + if(INTENT_DISARM) + var/obj/item/I = C.get_active_held_item() + if(I) + if(C.dropItemToGround(I)) + C.visible_message("[I] is yanked off [C]'s hand by [src]!","A tentacle pulls [I] away from you!") + on_hit(I) //grab the item as if you had hit it directly with the tentacle + return BULLET_ACT_HIT + else + to_chat(firer, "You can't seem to pry [I] off [C]'s hands!") + return BULLET_ACT_BLOCK + else + to_chat(firer, "[C] has nothing in hand to disarm!") + return BULLET_ACT_HIT + + if(INTENT_GRAB) + C.visible_message("[L] is grabbed by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!") + C.throw_at(get_step_towards(H,C), 8, 2, H, TRUE, TRUE, callback=CALLBACK(src, PROC_REF(tentacle_grab), H, C)) + return BULLET_ACT_HIT + + if(INTENT_HARM) + C.visible_message("[L] is thrown towards [H] by a tentacle!","A tentacle grabs you and throws you towards [H]!") + C.throw_at(get_step_towards(H,C), 8, 2, H, TRUE, TRUE, callback=CALLBACK(src, PROC_REF(tentacle_stab), H, C)) + return BULLET_ACT_HIT + else + L.visible_message("[L] is pulled by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!") + L.throw_at(get_step_towards(H,L), 8, 2) + . = BULLET_ACT_HIT + +/obj/projectile/tentacle/Destroy() + qdel(chain) + return ..() + diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index ca595d4d682f..0568533c1e0c 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -205,7 +205,6 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca /mob/living/simple_animal/hostile/mimic/copy/ranged var/obj/item/gun/TrueGun = null - var/obj/item/gun/magic/Zapstick var/obj/item/gun/ballistic/Pewgun var/obj/item/gun/energy/Zapgun @@ -223,10 +222,6 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca move_to_delay = 2 * G.w_class + 1 projectilesound = G.fire_sound TrueGun = G - if(istype(G, /obj/item/gun/magic)) - Zapstick = G - var/obj/item/ammo_casing/magic/M = Zapstick.ammo_type - projectiletype = initial(M.projectile_type) if(istype(G, /obj/item/gun/ballistic)) Pewgun = G var/obj/item/ammo_box/magazine/M = Pewgun.mag_type @@ -245,11 +240,6 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca Zapgun.cell.use(shot.e_cost) Zapgun.update_appearance() ..() - else if(Zapstick) - if(Zapstick.charges) - Zapstick.charges-- - Zapstick.update_appearance() - ..() else if(Pewgun) if(Pewgun.chambered) if(Pewgun.chambered.BB) diff --git a/code/modules/projectiles/ammunition/special/magic.dm b/code/modules/projectiles/ammunition/special/magic.dm index e38df896bed1..046ae7dbc078 100644 --- a/code/modules/projectiles/ammunition/special/magic.dm +++ b/code/modules/projectiles/ammunition/special/magic.dm @@ -4,68 +4,3 @@ projectile_type = /obj/projectile/magic firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/magic heavy_metal = FALSE - -/obj/item/ammo_casing/magic/change - projectile_type = /obj/projectile/magic/change - -/obj/item/ammo_casing/magic/animate - projectile_type = /obj/projectile/magic/animate - -/obj/item/ammo_casing/magic/heal - projectile_type = /obj/projectile/magic/resurrection - harmful = FALSE - -/obj/item/ammo_casing/magic/death - projectile_type = /obj/projectile/magic/death - -/obj/item/ammo_casing/magic/teleport - projectile_type = /obj/projectile/magic/teleport - harmful = FALSE - -/obj/item/ammo_casing/magic/safety - projectile_type = /obj/projectile/magic/safety - harmful = FALSE - -/obj/item/ammo_casing/magic/door - projectile_type = /obj/projectile/magic/door - harmful = FALSE - -/obj/item/ammo_casing/magic/fireball - projectile_type = /obj/projectile/magic/aoe/fireball - -/obj/item/ammo_casing/magic/chaos - projectile_type = /obj/projectile/magic - -/obj/item/ammo_casing/magic/spellblade - projectile_type = /obj/projectile/magic/spellblade - -/obj/item/ammo_casing/magic/arcane_barrage - projectile_type = /obj/projectile/magic/arcane_barrage - -/obj/item/ammo_casing/magic/honk - projectile_type = /obj/projectile/bullet/honker - -/obj/item/ammo_casing/magic/locker - projectile_type = /obj/projectile/magic/locker - -/obj/item/ammo_casing/magic/flying - projectile_type = /obj/projectile/magic/flying - -/obj/item/ammo_casing/magic/bounty - projectile_type = /obj/projectile/magic/bounty - -/obj/item/ammo_casing/magic/antimagic - projectile_type = /obj/projectile/magic/antimagic - -/obj/item/ammo_casing/magic/sapping - projectile_type = /obj/projectile/magic/sapping - -/obj/item/ammo_casing/magic/necropotence - projectile_type = /obj/projectile/magic/necropotence - -/obj/item/ammo_casing/magic/wipe - projectile_type = /obj/projectile/magic/wipe - -/obj/item/ammo_casing/magic/nothing - projectile_type = /obj/projectile/magic/nothing - harmful = FALSE diff --git a/code/modules/projectiles/boxes_magazines/internal/misc.dm b/code/modules/projectiles/boxes_magazines/internal/misc.dm index 1d4316560e92..55b749ac3333 100644 --- a/code/modules/projectiles/boxes_magazines/internal/misc.dm +++ b/code/modules/projectiles/boxes_magazines/internal/misc.dm @@ -1,9 +1,3 @@ -/obj/item/ammo_box/magazine/internal/hook - name = "hook internal tube" - ammo_type = /obj/item/ammo_casing/magic/hook - caliber = "hook" - max_ammo = 1 - /obj/item/ammo_box/magazine/internal/bow name = "bowstring" ammo_type = /obj/item/ammo_casing/caseless/arrow diff --git a/code/modules/projectiles/boxes_magazines/internal/rifle.dm b/code/modules/projectiles/boxes_magazines/internal/rifle.dm index 921ff98293a1..4f2f8c537958 100644 --- a/code/modules/projectiles/boxes_magazines/internal/rifle.dm +++ b/code/modules/projectiles/boxes_magazines/internal/rifle.dm @@ -6,13 +6,6 @@ max_ammo = 5 instant_load = TRUE -/obj/item/ammo_box/magazine/internal/boltaction/enchanted - max_ammo = 1 - ammo_type = /obj/item/ammo_casing/a8_50r - -/obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage - ammo_type = /obj/item/ammo_casing/magic/arcane_barrage - /obj/item/ammo_box/magazine/internal/boltaction/solgov name = "SSG-669C internal magazine" ammo_type = /obj/item/ammo_casing/caseless/a858 diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 9948e8dbf329..3edfd1382cf4 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -1,5 +1,3 @@ -#define DUALWIELD_PENALTY_EXTRA_MULTIPLIER 1.6 - /obj/item/gun name = "gun" desc = "It's a gun. It's pretty terrible, though." @@ -1099,5 +1097,3 @@ var/safety_prefix = "[our_gun.adjust_fire_select_icon_state_on_safety ? "[our_gun.safety ? "safety_" : ""]" : ""]" button_icon_state = "[safety_prefix][our_gun.fire_select_icon_state_prefix][current_firemode]" return ..() - -#undef DUALWIELD_PENALTY_EXTRA_MULTIPLIER diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index 160067b6d250..c4d505bcb10c 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -132,23 +132,6 @@ EMPTY_GUN_HELPER(automatic/pistol/candor/factory) default_firemode = FIREMODE_SEMIAUTO -/obj/item/gun/ballistic/automatic/pistol/stickman - name = "flat gun" - desc = "A 2 dimensional gun.. what?" - icon_state = "flatgun" - manufacturer = MANUFACTURER_NONE - -/obj/item/gun/ballistic/automatic/pistol/stickman/pickup(mob/living/user) - SHOULD_CALL_PARENT(0) - to_chat(user, "As you try to pick up [src], it slips out of your grip..") - if(prob(50)) - to_chat(user, "..and vanishes from your vision! Where the hell did it go?") - qdel(src) - user.update_icons() - else - to_chat(user, "..and falls into view. Whew, that was a close one.") - user.dropItemToGround(src) - /obj/item/gun/ballistic/automatic/pistol/commander name = "\improper Commander" desc = "A classic handgun in a tasteful black and stainless steel color scheme. An enamel Nanotrasen logo is set into the grips. Chambered in 9mm." @@ -281,12 +264,6 @@ EMPTY_GUN_HELPER(automatic/pistol/commander/inteq) to_chat(user, "Theres no magazine to replace!") return -/obj/item/gun/ballistic/automatic/pistol/disposable/pizza - name = "pizza disposable gun" - desc = "How horrible. Whoever you point at with this won't be very cheesed to meet you." //this is a warcrime against italians // IF YOU'RE GOING TO DO US DIRTY SPELL IT RIGHT - icon_state = "disposable_pizza" - custom_materials = list(/datum/material/pizza=2000) - //not technically a pistol but whatever /obj/item/gun/ballistic/derringer name = ".38 Derringer" diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index f39382e81ea2..c581c79442de 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -679,18 +679,6 @@ EMPTY_GUN_HELPER(revolver/detective) user.apply_damage(300, BRUTE, affecting) user.visible_message("[user.name] fires [src] at [user.p_their()] head!", "You fire [src] at your head!", "You hear a gunshot!") -/obj/item/gun/ballistic/revolver/russian/soul - name = "cursed Russian revolver" - desc = "To play with this revolver requires wagering your very soul." - -/obj/item/gun/ballistic/revolver/russian/soul/shoot_self(mob/living/user) - ..() - var/obj/item/soulstone/anybody/revolver/SS = new /obj/item/soulstone/anybody/revolver(get_turf(src)) - if(!SS.transfer_soul("FORCE", user)) //Something went wrong - qdel(SS) - return - user.visible_message("[user.name]'s soul is captured by \the [src]!", "You've lost the gamble! Your soul is forfeit!") - /obj/item/gun/ballistic/revolver/firebrand name = "\improper HP Firebrand" desc = "An archaic precursor to revolver-type firearms, this gun was rendered completely obsolete millennia ago. While fast to fire, it is extremely inaccurate. Uses .357 ammo." diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm index bdeb7a4811f3..45b1e8b2debd 100644 --- a/code/modules/projectiles/guns/ballistic/rifle.dm +++ b/code/modules/projectiles/guns/ballistic/rifle.dm @@ -70,10 +70,6 @@ . = ..() . += "The bolt is [bolt_locked ? "open" : "closed"]." -/////////////////////// -// BOLT ACTION RIFLE // -/////////////////////// - /obj/item/gun/ballistic/rifle/illestren name = "\improper HP Illestren" desc = "A sturdy and conventional bolt-action rifle. One of Hunter's Pride's most successful firearms, the Illestren is popular among colonists, pirates, snipers, and countless others. Chambered in 8x50mmR." @@ -163,57 +159,6 @@ manufacturer = MANUFACTURER_HUNTERSPRIDE -/obj/item/gun/ballistic/rifle/illestren/enchanted - name = "enchanted bolt-action rifle" - desc = "Careful not to lose your head." - var/guns_left = 30 - mag_type = /obj/item/ammo_box/magazine/internal/boltaction/enchanted - can_be_sawn_off = FALSE - manufacturer = MANUFACTURER_NONE - -/obj/item/gun/ballistic/rifle/illestren/enchanted/arcane_barrage - name = "arcane barrage" - desc = "Pew Pew Pew." - fire_sound = 'sound/weapons/emitter.ogg' - icon = 'icons/obj/guns/projectile.dmi' - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' - icon_state = "arcane_barrage" - item_state = "arcane_barrage" - slot_flags = null - can_bayonet = FALSE - item_flags = NEEDS_PERMIT | DROPDEL | ABSTRACT | NOBLUDGEON - flags_1 = NONE - trigger_guard = TRIGGER_GUARD_ALLOW_ALL - - mag_type = /obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage - -/obj/item/gun/ballistic/rifle/illestren/enchanted/dropped() - . = ..() - guns_left = 0 - -/obj/item/gun/ballistic/rifle/illestren/enchanted/proc/discard_gun(mob/living/user) - user.throw_item(pick(oview(7,get_turf(user)))) - -/obj/item/gun/ballistic/rifle/illestren/enchanted/arcane_barrage/discard_gun(mob/living/user) - qdel(src) - -/obj/item/gun/ballistic/rifle/illestren/enchanted/attack_self() - return - -/obj/item/gun/ballistic/rifle/illestren/enchanted/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) - . = ..() - if(!.) - return - if(guns_left) - var/obj/item/gun/ballistic/rifle/illestren/enchanted/gun = new type - gun.guns_left = guns_left - 1 - discard_gun(user) - user.swap_hand() - user.put_in_hands(gun) - else - user.dropItemToGround(src, TRUE) - /obj/item/gun/ballistic/rifle/polymer name = "polymer survivor rifle" desc = "A bolt-action rifle made of scrap, desperation, and luck. Likely to shatter at any moment. Chambered in .300 Blackout." diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 90e13c82ee06..bfe2e88bf804 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -452,52 +452,6 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq) sawn_off = TRUE slot_flags = ITEM_SLOT_BELT -/obj/item/gun/ballistic/shotgun/doublebarrel/hook - name = "hook modified sawn-off shotgun" - desc = "Range isn't an issue when you can bring your victim to you." - icon_state = "hookshotgun" - icon = 'icons/obj/guns/projectile.dmi' - item_state = "shotgun" - load_sound = 'sound/weapons/gun/shotgun/insert_shell.ogg' - mag_type = /obj/item/ammo_box/magazine/internal/shot/bounty - w_class = WEIGHT_CLASS_BULKY - weapon_weight = WEAPON_MEDIUM - can_be_sawn_off = FALSE - force = 16 //it has a hook on it - attack_verb = list("slashed", "hooked", "stabbed") - hitsound = 'sound/weapons/bladeslice.ogg' - //our hook gun! - var/obj/item/gun/magic/hook/bounty/hook - var/toggled = FALSE - -/obj/item/gun/ballistic/shotgun/doublebarrel/hook/Initialize() - . = ..() - hook = new /obj/item/gun/magic/hook/bounty(src) - -/obj/item/gun/ballistic/shotgun/doublebarrel/hook/AltClick(mob/user) - if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) - return - if(toggled) - to_chat(user,"You switch to the shotgun.") - fire_sound = initial(fire_sound) - else - to_chat(user,"You switch to the hook.") - fire_sound = 'sound/weapons/batonextend.ogg' - toggled = !toggled - -/obj/item/gun/ballistic/shotgun/doublebarrel/hook/examine(mob/user) - . = ..() - if(toggled) - . += "Alt-click to switch to the shotgun." - else - . += "Alt-click to switch to the hook." - -/obj/item/gun/ballistic/shotgun/doublebarrel/hook/afterattack(atom/target, mob/living/user, flag, params) - if(toggled) - hook.afterattack(target, user, flag, params) - else - return ..() - /obj/item/gun/ballistic/shotgun/automatic/combat/compact/compact name = "compact compact combat shotgun" desc = "A compact version of the compact version of the semi automatic combat shotgun. For when you want a gun the same size as your brain." diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm deleted file mode 100644 index 1f8be937b645..000000000000 --- a/code/modules/projectiles/guns/magic.dm +++ /dev/null @@ -1,85 +0,0 @@ -/obj/item/gun/magic - name = "staff of nothing" - desc = "This staff is boring to watch because even though it came first you've seen everything it can do in other staves for years." - icon = 'icons/obj/guns/magic.dmi' - icon_state = "staffofnothing" - item_state = "staff" - lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' //not really a gun and some toys use these inhands - righthand_file = 'icons/mob/inhands/items_righthand.dmi' - fire_sound = 'sound/weapons/emitter.ogg' - flags_1 = CONDUCT_1 - w_class = WEIGHT_CLASS_HUGE - var/checks_antimagic = TRUE - var/max_charges = 6 - var/charges = 0 - var/recharge_rate = 4 - var/charge_tick = 0 - var/can_charge = TRUE - var/ammo_type - var/no_den_usage - trigger_guard = TRIGGER_GUARD_ALLOW_ALL // Has no trigger at all, uses magic instead - -/obj/item/gun/magic/process_fire(atom/target, mob/living/user, message, params, zone_override, bonus_spread) - if(no_den_usage) - var/area/A = get_area(user) - if(istype(A, /area/wizard_station)) - add_fingerprint(user) - to_chat(user, "You know better than to violate the security of The Den, best wait until you leave to use [src].") - return - else - no_den_usage = 0 - if(checks_antimagic && user.anti_magic_check(TRUE, FALSE, FALSE, 0, TRUE)) - add_fingerprint(user) - to_chat(user, "Something is interfering with [src].") - return - . = ..() - -/obj/item/gun/magic/can_shoot() - return charges - -/obj/item/gun/magic/recharge_newshot() - if (charges && chambered && !chambered.BB) - chambered.newshot() - -/obj/item/gun/magic/process_chamber(atom/shooter) - if(chambered && !chambered.BB) //if BB is null, i.e the shot has been fired... - charges--//... drain a charge - recharge_newshot() - -/obj/item/gun/magic/Initialize() - . = ..() - charges = max_charges - if(ammo_type) - chambered = new ammo_type(src) - if(can_charge) - START_PROCESSING(SSobj, src) - - -/obj/item/gun/magic/Destroy() - if(can_charge) - STOP_PROCESSING(SSobj, src) - return ..() - - -/obj/item/gun/magic/process() - if (charges >= max_charges) - charge_tick = 0 - return - charge_tick++ - if(charge_tick < recharge_rate) - return 0 - charge_tick = 0 - charges++ - if(charges == 1) - recharge_newshot() - return 1 - - -/obj/item/gun/magic/shoot_with_empty_chamber(mob/living/user as mob|obj) - to_chat(user, "The [name] whizzles quietly.") - -/obj/item/gun/magic/vv_edit_var(var_name, var_value) - . = ..() - switch(var_name) - if(NAMEOF(src, charges)) - recharge_newshot() diff --git a/code/modules/projectiles/guns/magic/staff.dm b/code/modules/projectiles/guns/magic/staff.dm deleted file mode 100644 index e8f1683d21a1..000000000000 --- a/code/modules/projectiles/guns/magic/staff.dm +++ /dev/null @@ -1,142 +0,0 @@ -/obj/item/gun/magic/staff - slot_flags = ITEM_SLOT_BACK - lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi' - item_flags = NEEDS_PERMIT | NO_MAT_REDEMPTION - -/obj/item/gun/magic/staff/change - name = "staff of change" - desc = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself." - fire_sound = 'sound/magic/staff_change.ogg' - ammo_type = /obj/item/ammo_casing/magic/change - icon_state = "staffofchange" - item_state = "staffofchange" - -/obj/item/gun/magic/staff/animate - name = "staff of animation" - desc = "An artefact that spits bolts of life-force which causes objects which are hit by it to animate and come to life! This magic doesn't affect machines." - fire_sound = 'sound/magic/staff_animation.ogg' - ammo_type = /obj/item/ammo_casing/magic/animate - icon_state = "staffofanimation" - item_state = "staffofanimation" - -/obj/item/gun/magic/staff/healing - name = "staff of healing" - desc = "An artefact that spits bolts of restoring magic which can remove ailments of all kinds and even raise the dead." - fire_sound = 'sound/magic/staff_healing.ogg' - ammo_type = /obj/item/ammo_casing/magic/heal - icon_state = "staffofhealing" - item_state = "staffofhealing" - -/obj/item/gun/magic/staff/healing/handle_suicide() //Stops people trying to commit suicide to heal themselves - return - -/obj/item/gun/magic/staff/chaos - name = "staff of chaos" - desc = "An artefact that spits bolts of chaotic magic that can potentially do anything." - fire_sound = 'sound/magic/staff_chaos.ogg' - ammo_type = /obj/item/ammo_casing/magic/chaos - icon_state = "staffofchaos" - item_state = "staffofchaos" - max_charges = 10 - recharge_rate = 2 - no_den_usage = 1 - var/allowed_projectile_types = list(/obj/projectile/magic/change, /obj/projectile/magic/animate, /obj/projectile/magic/resurrection, - /obj/projectile/magic/death, /obj/projectile/magic/teleport, /obj/projectile/magic/door, /obj/projectile/magic/aoe/fireball, - /obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage, /obj/projectile/magic/locker, /obj/projectile/magic/flying, - /obj/projectile/magic/bounty, /obj/projectile/magic/antimagic, /obj/projectile/magic/fetch, /obj/projectile/magic/sapping, - /obj/projectile/magic/necropotence, /obj/projectile/magic, /obj/projectile/temp/chill, /obj/projectile/magic/wipe) - -/obj/item/gun/magic/staff/chaos/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) - chambered.projectile_type = pick(allowed_projectile_types) - . = ..() - -/obj/item/gun/magic/staff/door - name = "staff of door creation" - desc = "An artefact that spits bolts of transformative magic that can create doors in walls." - fire_sound = 'sound/magic/staff_door.ogg' - ammo_type = /obj/item/ammo_casing/magic/door - icon_state = "staffofdoor" - item_state = "staffofdoor" - max_charges = 10 - recharge_rate = 2 - no_den_usage = 1 - -/obj/item/gun/magic/staff/honk - name = "staff of the honkmother" - desc = "Honk." - fire_sound = 'sound/items/airhorn.ogg' - ammo_type = /obj/item/ammo_casing/magic/honk - icon_state = "honker" - item_state = "honker" - max_charges = 4 - recharge_rate = 8 - -/obj/item/gun/magic/staff/spellblade - name = "spellblade" - desc = "A deadly combination of laziness and boodlust, this blade allows the user to dismember their enemies without all the hard work of actually swinging the sword." - fire_sound = 'sound/magic/fireball.ogg' - ammo_type = /obj/item/ammo_casing/magic/spellblade - icon_state = "spellblade" - item_state = "spellblade" - lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' - hitsound = 'sound/weapons/rapierhit.ogg' - force = 20 - armour_penetration = 75 - block_chance = 50 - sharpness = IS_SHARP - max_charges = 4 - -/obj/item/gun/magic/staff/spellblade/Initialize() - . = ..() - AddComponent(/datum/component/butchering, 15, 125, 0, hitsound) - -/obj/item/gun/magic/staff/spellblade/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - if(attack_type == PROJECTILE_ATTACK) - final_block_chance = 0 - return ..() - -/obj/item/gun/magic/staff/locker - name = "staff of the locker" - desc = "An artefact that expells encapsulating bolts, for incapacitating thy enemy." - fire_sound = 'sound/magic/staff_change.ogg' - ammo_type = /obj/item/ammo_casing/magic/locker - icon_state = "locker" - item_state = "locker" - max_charges = 6 - recharge_rate = 4 - -//yes, they don't have sounds. they're admin staves, and their projectiles will play the chaos bolt sound anyway so why bother? - -/obj/item/gun/magic/staff/flying - name = "staff of flying" - desc = "An artefact that spits bolts of graceful magic that can make something fly." - fire_sound = 'sound/magic/staff_healing.ogg' - ammo_type = /obj/item/ammo_casing/magic/flying - icon_state = "staffofflight" - item_state = "staffofflight" - -/obj/item/gun/magic/staff/sapping - name = "staff of sapping" - desc = "An artefact that spits bolts of sapping magic that can make something sad." - fire_sound = 'sound/magic/staff_change.ogg' - ammo_type = /obj/item/ammo_casing/magic/sapping - icon_state = "staffofsapping" - item_state = "staffofsapping" - -/obj/item/gun/magic/staff/necropotence - name = "staff of necropotence" - desc = "An artefact that spits bolts of death magic that can repurpose the soul." - fire_sound = 'sound/magic/staff_change.ogg' - ammo_type = /obj/item/ammo_casing/magic/necropotence - icon_state = "staffofnecropotence" - item_state = "staffofnecropotence" - -/obj/item/gun/magic/staff/wipe - name = "staff of possession" - desc = "An artefact that spits bolts of mind-unlocking magic that can let ghosts invade the victim's mind." - fire_sound = 'sound/magic/staff_change.ogg' - ammo_type = /obj/item/ammo_casing/magic/wipe - icon_state = "staffofwipe" - item_state = "staffofwipe" diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm deleted file mode 100644 index c6a25127878a..000000000000 --- a/code/modules/projectiles/guns/magic/wand.dm +++ /dev/null @@ -1,266 +0,0 @@ -//For use in prob() to determine if an empty wand will shoot once then break. -#define WAND_WREST_CHANCE (1/121) - -/obj/item/gun/magic/wand - name = "wand" - desc = "You shouldn't have this." - ammo_type = /obj/item/ammo_casing/magic - icon_state = "nothingwand" - item_state = "wand" - base_icon_state = "nothingwand" - w_class = WEIGHT_CLASS_SMALL - can_charge = FALSE - max_charges = 100 //100, 50, 50, 34 (max charge distribution by 25%ths) - var/variable_charges = TRUE - -/obj/item/gun/magic/wand/Initialize() - if(prob(75) && variable_charges) //25% chance of listed max charges, 50% chance of 1/2 max charges, 25% chance of 1/3 max charges - if(prob(33)) - max_charges = CEILING(max_charges / 3, 1) - else - max_charges = CEILING(max_charges / 2, 1) - return ..() - -/obj/item/gun/magic/wand/examine(mob/user) - . = ..() - . += "Has [charges] charge\s remaining." - -/obj/item/gun/magic/wand/update_icon_state() - icon_state = "[base_icon_state][charges ? null : "-drained"]" - return ..() - -/obj/item/gun/magic/wand/attack(atom/target, mob/living/user) - if(target == user) - return - ..() - -/obj/item/gun/magic/wand/afterattack(atom/target, mob/living/user) - var/wrested = FALSE - if(!charges) - wrested = shoot_with_empty_chamber(user) - if(!wrested) - return - if(target == user) - if(no_den_usage) - var/area/A = get_area(user) - if(istype(A, /area/wizard_station)) - to_chat(user, "You know better than to violate the security of The Den, best wait until you leave to use [src].") - return - else - no_den_usage = 0 - zap_self(user) - else - . = ..() - if(wrested) - to_chat(user,"[src] overloads and disintegrates.") - qdel(src) - return - update_appearance() - -/obj/item/gun/magic/wand/shoot_with_empty_chamber(mob/living/user) - if(prob(100*WAND_WREST_CHANCE)) - to_chat(user,"You manage to activate [src] one last time.") - charges++ - recharge_newshot() - return TRUE - return ..() - -/obj/item/gun/magic/wand/proc/zap_self(mob/living/user) - user.visible_message("[user] zaps [user.p_them()]self with [src].") - playsound(user, fire_sound, 50, TRUE) - user.log_message("zapped [user.p_them()]self with a [src]", LOG_ATTACK) - - -///////////////////////////////////// -//WAND OF DEATH -///////////////////////////////////// - -/obj/item/gun/magic/wand/death - name = "wand of death" - desc = "This deadly wand overwhelms the victim's body with pure energy, slaying them without fail." - fire_sound = 'sound/magic/wandodeath.ogg' - ammo_type = /obj/item/ammo_casing/magic/death - icon_state = "deathwand" - base_icon_state = "deathwand" - max_charges = 3 //3, 2, 2, 1 - -/obj/item/gun/magic/wand/death/zap_self(mob/living/user) - ..() - charges-- - if(user.anti_magic_check()) - user.visible_message("[src] has no effect on [user]!") - return - if(isliving(user)) - var/mob/living/L = user - if(L.mob_biotypes & MOB_UNDEAD) //negative energy heals the undead - user.revive(full_heal = TRUE, admin_revive = TRUE) - to_chat(user, "You feel great!") - return - to_chat(user, "You irradiate yourself with pure negative energy! \ - [pick("Do not pass go. Do not collect 200 zorkmids.","You feel more confident in your spell casting skills.","You Die...","Do you want your possessions identified?")]\ - ") - user.death(FALSE) - -/obj/item/gun/magic/wand/death/debug - desc = "In some obscure circles, this is known as the 'cloning tester's friend'." - max_charges = 500 - variable_charges = FALSE - can_charge = TRUE - recharge_rate = 1 - - -///////////////////////////////////// -//WAND OF HEALING -///////////////////////////////////// - -/obj/item/gun/magic/wand/resurrection - name = "wand of healing" - desc = "This wand uses healing magics to heal and revive. They are rarely utilized within the Wizard Federation for some reason." - ammo_type = /obj/item/ammo_casing/magic/heal - fire_sound = 'sound/magic/staff_healing.ogg' - icon_state = "revivewand" - base_icon_state = "revivewand" - max_charges = 10 //10, 5, 5, 4 - -/obj/item/gun/magic/wand/resurrection/zap_self(mob/living/user) - ..() - charges-- - if(user.anti_magic_check()) - user.visible_message("[src] has no effect on [user]!") - return - if(isliving(user)) - var/mob/living/L = user - if(L.mob_biotypes & MOB_UNDEAD) //positive energy harms the undead - to_chat(user, "You irradiate yourself with pure positive energy! \ - [pick("Do not pass go. Do not collect 200 zorkmids.","You feel more confident in your spell casting skills.","You Die...","Do you want your possessions identified?")]\ - ") - user.death(0) - return - user.revive(full_heal = TRUE, admin_revive = TRUE) - to_chat(user, "You feel great!") - -/obj/item/gun/magic/wand/resurrection/debug //for testing - desc = "Is it possible for something to be even more powerful than regular magic? This wand is." - max_charges = 500 - variable_charges = FALSE - can_charge = TRUE - recharge_rate = 1 - -///////////////////////////////////// -//WAND OF POLYMORPH -///////////////////////////////////// - -/obj/item/gun/magic/wand/polymorph - name = "wand of polymorph" - desc = "This wand is attuned to chaos and will radically alter the victim's form." - ammo_type = /obj/item/ammo_casing/magic/change - icon_state = "polywand" - base_icon_state = "polywand" - fire_sound = 'sound/magic/staff_change.ogg' - max_charges = 10 //10, 5, 5, 4 - -/obj/item/gun/magic/wand/polymorph/zap_self(mob/living/user) - ..() //because the user mob ceases to exists by the time wabbajack fully resolves - - wabbajack(user) - charges-- - -///////////////////////////////////// -//WAND OF TELEPORTATION -///////////////////////////////////// - -/obj/item/gun/magic/wand/teleport - name = "wand of teleportation" - desc = "This wand will wrench targets through space and time to move them somewhere else." - ammo_type = /obj/item/ammo_casing/magic/teleport - fire_sound = 'sound/magic/wand_teleport.ogg' - icon_state = "telewand" - base_icon_state = "telewand" - max_charges = 10 //10, 5, 5, 4 - no_den_usage = TRUE - -/obj/item/gun/magic/wand/teleport/zap_self(mob/living/user) - if(do_teleport(user, user, 10, channel = TELEPORT_CHANNEL_MAGIC)) - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(3, user.loc) - smoke.start() - charges-- - ..() - -/obj/item/gun/magic/wand/safety - name = "wand of safety" - desc = "This wand will use the lightest of bluespace currents to gently place the target somewhere safe." - ammo_type = /obj/item/ammo_casing/magic/safety - fire_sound = 'sound/magic/wand_teleport.ogg' - icon_state = "telewand" - base_icon_state = "telewand" - max_charges = 10 //10, 5, 5, 4 - no_den_usage = FALSE - -/obj/item/gun/magic/wand/safety/zap_self(mob/living/user) - var/turf/origin = get_turf(user) - var/turf/destination = find_safe_turf() - - if(do_teleport(user, destination, channel=TELEPORT_CHANNEL_MAGIC)) - for(var/t in list(origin, destination)) - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(0, t) - smoke.start() - ..() - -/obj/item/gun/magic/wand/safety/debug - desc = "This wand has 'find_safe_turf()' engraved into its blue wood. Perhaps it's a secret message?" - max_charges = 500 - variable_charges = FALSE - can_charge = TRUE - recharge_rate = 1 - - -///////////////////////////////////// -//WAND OF DOOR CREATION -///////////////////////////////////// - -/obj/item/gun/magic/wand/door - name = "wand of door creation" - desc = "This particular wand can create doors in any wall for the unscrupulous wizard who shuns teleportation magics." - ammo_type = /obj/item/ammo_casing/magic/door - icon_state = "doorwand" - base_icon_state = "doorwand" - fire_sound = 'sound/magic/staff_door.ogg' - max_charges = 20 //20, 10, 10, 7 - no_den_usage = 1 - -/obj/item/gun/magic/wand/door/zap_self(mob/living/user) - to_chat(user, "You feel vaguely more open with your feelings.") - charges-- - ..() - -///////////////////////////////////// -//WAND OF FIREBALL -///////////////////////////////////// - -/obj/item/gun/magic/wand/fireball - name = "wand of fireball" - desc = "This wand shoots scorching balls of fire that explode into destructive flames." - fire_sound = 'sound/magic/fireball.ogg' - ammo_type = /obj/item/ammo_casing/magic/fireball - icon_state = "firewand" - base_icon_state = "firewand" - max_charges = 8 //8, 4, 4, 3 - -/obj/item/gun/magic/wand/fireball/zap_self(mob/living/user) - ..() - explosion(user.loc, -1, 0, 2, 3, 0, flame_range = 2) - charges-- - -///////////////////////////////////// -//WAND OF NOTHING -///////////////////////////////////// - -/obj/item/gun/magic/wand/nothing - name = "wand of nothing" - desc = "It's not just a stick, it's a MAGIC stick?" - ammo_type = /obj/item/ammo_casing/magic/nothing - - -#undef WAND_WREST_CHANCE diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 829393d4d115..0b9bcb8da4f7 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -1,7 +1,3 @@ - -#define MOVES_HITSCAN -1 //Not actually hitscan but close as we get without actual hitscan. -#define MUZZLE_EFFECT_PIXEL_INCREMENT 17 //How many pixels to move the muzzle flash up so your character doesn't look like they're shitting out lasers. - /obj/projectile name = "projectile" icon = 'icons/obj/projectiles.dmi' diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm deleted file mode 100644 index 6ca85ca933ec..000000000000 --- a/code/modules/projectiles/projectile/magic.dm +++ /dev/null @@ -1,734 +0,0 @@ -/obj/projectile/magic - name = "bolt" - icon_state = "energy" - damage = 0 - damage_type = OXY - nodamage = TRUE - armour_penetration = 100 - flag = "magic" - -/obj/projectile/magic/death - name = "bolt of death" - icon_state = "pulse1_bl" - -/obj/projectile/magic/death/on_hit(target) - . = ..() - if(ismob(target)) - var/mob/M = target - if(M.anti_magic_check()) - M.visible_message("[src] vanishes on contact with [target]!") - return BULLET_ACT_BLOCK - if(isliving(M)) - var/mob/living/L = M - if(L.mob_biotypes & MOB_UNDEAD) //negative energy heals the undead - if(L.hellbound && L.stat == DEAD) - return BULLET_ACT_BLOCK - if(L.revive(full_heal = TRUE, admin_revive = TRUE)) - L.grab_ghost(force = TRUE) - to_chat(L, "You rise with a start, you're undead!!!") - else if(L.stat != DEAD) - to_chat(L, "You feel great!") - else - L.death(0) - else - M.death(0) - -/obj/projectile/magic/resurrection - name = "bolt of resurrection" - icon_state = "ion" - damage = 0 - damage_type = OXY - nodamage = TRUE - -/obj/projectile/magic/resurrection/on_hit(mob/living/carbon/target) - . = ..() - if(isliving(target)) - if(target.anti_magic_check()) - target.visible_message("[src] vanishes on contact with [target]!") - return BULLET_ACT_BLOCK - if(target.mob_biotypes & MOB_UNDEAD) //positive energy harms the undead - target.death(0) - else - if(target.hellbound && target.stat == DEAD) - return BULLET_ACT_BLOCK - if(target.revive(full_heal = TRUE, admin_revive = TRUE)) - target.grab_ghost(force = TRUE) // even suicides - to_chat(target, "You rise with a start, you're alive!!!") - else if(target.stat != DEAD) - to_chat(target, "You feel great!") - -/obj/projectile/magic/teleport - name = "bolt of teleportation" - icon_state = "bluespace" - damage = 0 - damage_type = OXY - nodamage = TRUE - var/inner_tele_radius = 0 - var/outer_tele_radius = 6 - -/obj/projectile/magic/teleport/on_hit(mob/target) - . = ..() - if(ismob(target)) - var/mob/M = target - if(M.anti_magic_check()) - M.visible_message("[src] fizzles on contact with [target]!") - return BULLET_ACT_BLOCK - var/teleammount = 0 - var/teleloc = target - if(!isturf(target)) - teleloc = target.loc - for(var/atom/movable/stuff in teleloc) - if(!stuff.anchored && stuff.loc && !isobserver(stuff)) - if(do_teleport(stuff, stuff, 10, channel = TELEPORT_CHANNEL_MAGIC)) - teleammount++ - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(max(round(4 - teleammount),0), stuff.loc) //Smoke drops off if a lot of stuff is moved for the sake of sanity - smoke.start() - -/obj/projectile/magic/safety - name = "bolt of safety" - icon_state = "bluespace" - damage = 0 - damage_type = OXY - nodamage = TRUE - -/obj/projectile/magic/safety/on_hit(atom/target) - . = ..() - if(ismob(target)) - var/mob/M = target - if(M.anti_magic_check()) - M.visible_message("[src] fizzles on contact with [target]!") - return BULLET_ACT_BLOCK - if(isturf(target)) - return BULLET_ACT_HIT - - var/turf/origin_turf = get_turf(target) - var/turf/destination_turf = find_safe_turf() - - if(do_teleport(target, destination_turf, channel=TELEPORT_CHANNEL_MAGIC)) - for(var/t in list(origin_turf, destination_turf)) - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(0, t) - smoke.start() - -/obj/projectile/magic/door - name = "bolt of door creation" - icon_state = "energy" - damage = 0 - damage_type = OXY - nodamage = TRUE - var/list/door_types = list(/obj/structure/mineral_door/wood, /obj/structure/mineral_door/iron, /obj/structure/mineral_door/silver, /obj/structure/mineral_door/gold, /obj/structure/mineral_door/uranium, /obj/structure/mineral_door/sandstone, /obj/structure/mineral_door/transparent/plasma, /obj/structure/mineral_door/transparent/diamond) - -/obj/projectile/magic/door/on_hit(atom/target) - . = ..() - if(istype(target, /obj/machinery/door)) - OpenDoor(target) - else - var/turf/T = get_turf(target) - if(isclosedturf(T) && !isindestructiblewall(T)) - CreateDoor(T) - -/obj/projectile/magic/door/proc/CreateDoor(turf/T) - var/door_type = pick(door_types) - var/obj/structure/mineral_door/D = new door_type(T) - T.ChangeTurf(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) - D.Open() - -/obj/projectile/magic/door/proc/OpenDoor(obj/machinery/door/D) - if(istype(D, /obj/machinery/door/airlock)) - var/obj/machinery/door/airlock/A = D - A.locked = FALSE - D.open() - -/obj/projectile/magic/change - name = "bolt of change" - icon_state = "ice_1" - damage = 0 - damage_type = BURN - nodamage = TRUE - -/obj/projectile/magic/change/on_hit(atom/change) - . = ..() - if(ismob(change)) - var/mob/M = change - if(M.anti_magic_check()) - M.visible_message("[src] fizzles on contact with [M]!") - qdel(src) - return BULLET_ACT_BLOCK - wabbajack(change) - qdel(src) - -/proc/wabbajack(mob/living/M) - if(!istype(M) || M.stat == DEAD || M.notransform || (GODMODE & M.status_flags)) - return - - M.notransform = TRUE - ADD_TRAIT(M, TRAIT_IMMOBILIZED, MAGIC_TRAIT) - ADD_TRAIT(M, TRAIT_HANDS_BLOCKED, MAGIC_TRAIT) - M.icon = null - M.cut_overlays() - M.invisibility = INVISIBILITY_ABSTRACT - - var/list/contents = M.contents.Copy() - - if(iscyborg(M)) - var/mob/living/silicon/robot/Robot = M - // Disconnect AI's in shells - if(Robot.connected_ai) - Robot.connected_ai.disconnect_shell() - if(Robot.mmi) - qdel(Robot.mmi) - Robot.notify_ai(NEW_BORG) - else - for(var/obj/item/W in contents) - if(!M.dropItemToGround(W)) - qdel(W) - - var/mob/living/new_mob - - var/randomize = pick("monkey","robot","slime","xeno","humanoid","animal") - switch(randomize) - if("monkey") - new_mob = new /mob/living/carbon/monkey(M.loc) - - if("robot") - var/robot = pick(200;/mob/living/silicon/robot, - /mob/living/silicon/robot/modules/syndicate, - /mob/living/silicon/robot/modules/syndicate/medical, - /mob/living/silicon/robot/modules/syndicate/saboteur, - 200;/mob/living/simple_animal/drone/polymorphed) - new_mob = new robot(M.loc) - if(issilicon(new_mob)) - new_mob.gender = M.gender - new_mob.invisibility = 0 - new_mob.job = "Cyborg" - var/mob/living/silicon/robot/Robot = new_mob - Robot.lawupdate = FALSE - Robot.connected_ai = null - Robot.mmi.transfer_identity(M) //Does not transfer key/client. - Robot.clear_inherent_laws(0) - Robot.clear_zeroth_law(0) - - if("slime") - new_mob = new /mob/living/simple_animal/slime/random(M.loc) - - if("xeno") - var/Xe - if(M.ckey) - Xe = pick(/mob/living/carbon/alien/humanoid/hunter,/mob/living/carbon/alien/humanoid/sentinel) - else - Xe = pick(/mob/living/carbon/alien/humanoid/hunter,/mob/living/simple_animal/hostile/alien/sentinel) - new_mob = new Xe(M.loc) - - if("animal") - var/path = pick(/mob/living/simple_animal/hostile/carp, - /mob/living/simple_animal/hostile/bear, - /mob/living/simple_animal/hostile/mushroom, - /mob/living/simple_animal/hostile/statue, - /mob/living/simple_animal/hostile/retaliate/bat, - /mob/living/simple_animal/hostile/retaliate/goat, - /mob/living/simple_animal/hostile/killertomato, - /mob/living/simple_animal/hostile/poison/giant_spider, - /mob/living/simple_animal/hostile/poison/giant_spider/hunter, - /mob/living/simple_animal/hostile/blob/blobbernaut/independent, - /mob/living/simple_animal/hostile/carp/ranged, - /mob/living/simple_animal/hostile/carp/ranged/chaos, - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher, - /mob/living/simple_animal/hostile/asteroid/goliath/beast, - /mob/living/simple_animal/hostile/headcrab, - /mob/living/simple_animal/hostile/morph, - /mob/living/simple_animal/hostile/megafauna/dragon/lesser, - /mob/living/simple_animal/hostile/gorilla, - /mob/living/simple_animal/parrot, - /mob/living/simple_animal/pet/dog/corgi, - /mob/living/simple_animal/crab, - /mob/living/simple_animal/pet/dog/pug, - /mob/living/simple_animal/pet/cat, - /mob/living/simple_animal/mouse, - /mob/living/simple_animal/chicken, - /mob/living/simple_animal/cow, - /mob/living/simple_animal/hostile/lizard, - /mob/living/simple_animal/pet/fox, - /mob/living/simple_animal/butterfly, - /mob/living/simple_animal/pet/cat/cak, - /mob/living/simple_animal/chick) - new_mob = new path(M.loc) - - if("humanoid") - new_mob = new /mob/living/carbon/human(M.loc) - - if(prob(50)) - var/list/chooseable_races = list() - for(var/speciestype in subtypesof(/datum/species)) - var/datum/species/S = speciestype - if(initial(S.changesource_flags) & WABBAJACK) - chooseable_races += speciestype - - if(chooseable_races.len) - new_mob.set_species(pick(chooseable_races)) - - var/datum/preferences/A = new() //Randomize appearance for the human - A.copy_to(new_mob, icon_updates=0) - - var/mob/living/carbon/human/H = new_mob - H.update_hair() - H.update_body_parts(TRUE) - H.dna.update_dna_identity() - - if(!new_mob) - return - - // Some forms can still wear some items - for(var/obj/item/W in contents) - new_mob.equip_to_appropriate_slot(W) - - M.log_message("became [new_mob.real_name]", LOG_ATTACK, color="orange") - - new_mob.a_intent = INTENT_HARM - - M.wabbajack_act(new_mob) - - to_chat(new_mob, "Your form morphs into that of a [randomize].") - - var/poly_msg = get_policy(POLICY_POLYMORPH) - if(poly_msg) - to_chat(new_mob, poly_msg) - - M.transfer_observers_to(new_mob) - - qdel(M) - return new_mob - -/obj/projectile/magic/animate - name = "bolt of animation" - icon_state = "red_1" - damage = 0 - damage_type = BURN - nodamage = TRUE - -/obj/projectile/magic/animate/on_hit(atom/target, blocked = FALSE) - target.animate_atom_living(firer) - ..() - -/atom/proc/animate_atom_living(mob/living/owner = null) - if((isitem(src) || isstructure(src)) && !is_type_in_list(src, GLOB.protected_objects)) - if(istype(src, /obj/structure/statue/petrified)) - var/obj/structure/statue/petrified/P = src - if(P.petrified_mob) - var/mob/living/L = P.petrified_mob - var/mob/living/simple_animal/hostile/statue/S = new(P.loc, owner) - S.name = "statue of [L.name]" - if(owner) - S.faction = list("[REF(owner)]") - S.icon = P.icon - S.icon_state = P.icon_state - S.copy_overlays(P, TRUE) - S.color = P.color - S.atom_colours = P.atom_colours.Copy() - if(L.mind) - L.mind.transfer_to(S) - if(owner) - to_chat(S, "You are an animate statue. You cannot move when monitored, but are nearly invincible and deadly when unobserved! Do not harm [owner], your creator.") - P.forceMove(S) - return - else - var/obj/O = src - if(istype(O, /obj/item/gun)) - new /mob/living/simple_animal/hostile/mimic/copy/ranged(loc, src, owner) - else - new /mob/living/simple_animal/hostile/mimic/copy(loc, src, owner) - - else if(istype(src, /mob/living/simple_animal/hostile/mimic/copy)) - // Change our allegiance! - var/mob/living/simple_animal/hostile/mimic/copy/C = src - if(owner) - C.ChangeOwner(owner) - -/obj/projectile/magic/spellblade - name = "blade energy" - icon_state = "lavastaff" - damage = 15 - damage_type = BURN - flag = "magic" - dismemberment = 50 - nodamage = FALSE - -/obj/projectile/magic/spellblade/on_hit(target) - if(ismob(target)) - var/mob/M = target - if(M.anti_magic_check()) - M.visible_message("[src] vanishes on contact with [target]!") - qdel(src) - return BULLET_ACT_BLOCK - . = ..() - -/obj/projectile/magic/arcane_barrage - name = "arcane bolt" - icon_state = "arcane_barrage" - damage = 20 - damage_type = BURN - nodamage = FALSE - armour_penetration = 0 - flag = "magic" - hitsound = 'sound/weapons/barragespellhit.ogg' - -/obj/projectile/magic/arcane_barrage/on_hit(target) - if(ismob(target)) - var/mob/M = target - if(M.anti_magic_check()) - M.visible_message("[src] vanishes on contact with [target]!") - qdel(src) - return BULLET_ACT_BLOCK - . = ..() - - -/obj/projectile/magic/locker - name = "locker bolt" - icon_state = "locker" - nodamage = TRUE - flag = "magic" - var/weld = TRUE - var/created = FALSE //prevents creation of more then one locker if it has multiple hits - var/locker_suck = TRUE - var/obj/structure/closet/locker_temp_instance = /obj/structure/closet/decay - -/obj/projectile/magic/locker/Initialize() - . = ..() - locker_temp_instance = new(src) - -/obj/projectile/magic/locker/prehit_pierce(atom/A) - . = ..() - if(isliving(A) && locker_suck) - var/mob/living/M = A - if(M.anti_magic_check()) // no this doesn't check if ..() returned to phase through do I care no it's magic ain't gotta explain shit - M.visible_message("[src] vanishes on contact with [A]!") - return PROJECTILE_DELETE_WITHOUT_HITTING - if(!locker_temp_instance.insertion_allowed(M)) - return - M.forceMove(src) - return PROJECTILE_PIERCE_PHASE - -/obj/projectile/magic/locker/on_hit(target) - if(created) - return ..() - if(LAZYLEN(contents)) - for(var/atom/movable/AM in contents) - locker_temp_instance.insert(AM) - locker_temp_instance.welded = weld - locker_temp_instance.update_appearance() - created = TRUE - return ..() - -/obj/projectile/magic/locker/Destroy() - locker_suck = FALSE - RemoveElement(/datum/element/connect_loc, projectile_connections) //We do this manually so the forcemoves don't "hit" us. This behavior is kinda dumb, someone refactor this - for(var/atom/movable/AM in contents) - AM.forceMove(get_turf(src)) - . = ..() - -/obj/structure/closet/decay - breakout_time = 600 - icon_welded = null - var/magic_icon = "cursed" - var/weakened_icon = "decursed" - var/auto_destroy = TRUE - -/obj/structure/closet/decay/Initialize() - . = ..() - if(auto_destroy) - addtimer(CALLBACK(src, PROC_REF(bust_open)), 5 MINUTES) - addtimer(CALLBACK(src, PROC_REF(magicly_lock)), 5) - -/obj/structure/closet/decay/proc/magicly_lock() - if(!welded) - return - icon_state = magic_icon - update_appearance() - -/obj/structure/closet/decay/after_weld(weld_state) - if(weld_state) - unmagify() - -/obj/structure/closet/decay/proc/decay() - animate(src, alpha = 0, time = 30) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), src), 30) - -/obj/structure/closet/decay/open(mob/living/user, force = FALSE) - . = ..() - if(.) - if(icon_state == magic_icon) //check if we used the magic icon at all before giving it the lesser magic icon - unmagify() - else - addtimer(CALLBACK(src, PROC_REF(decay)), 15 SECONDS) - -/obj/structure/closet/decay/proc/unmagify() - icon_state = weakened_icon - update_appearance() - addtimer(CALLBACK(src, PROC_REF(decay)), 15 SECONDS) - icon_welded = "welded" - -/obj/projectile/magic/flying - name = "bolt of flying" - icon_state = "flight" - -/obj/projectile/magic/flying/on_hit(target) - . = ..() - if(isliving(target)) - var/mob/living/L = target - if(L.anti_magic_check()) - L.visible_message("[src] vanishes on contact with [target]!") - return BULLET_ACT_BLOCK - var/atom/throw_target = get_edge_target_turf(L, angle2dir(Angle)) - L.throw_at(throw_target, 200, 4) - -/obj/projectile/magic/bounty - name = "bolt of bounty" - icon_state = "bounty" - -/obj/projectile/magic/bounty/on_hit(target) - . = ..() - if(isliving(target)) - var/mob/living/L = target - if(L.anti_magic_check() || !firer) - L.visible_message("[src] vanishes on contact with [target]!") - return BULLET_ACT_BLOCK - L.apply_status_effect(STATUS_EFFECT_BOUNTY, firer) - -/obj/projectile/magic/antimagic - name = "bolt of antimagic" - icon_state = "antimagic" - -/obj/projectile/magic/antimagic/on_hit(target) - . = ..() - if(isliving(target)) - var/mob/living/L = target - if(L.anti_magic_check()) - L.visible_message("[src] vanishes on contact with [target]!") - return BULLET_ACT_BLOCK - L.apply_status_effect(STATUS_EFFECT_ANTIMAGIC) - -/obj/projectile/magic/fetch - name = "bolt of fetching" - icon_state = "fetch" - -/obj/projectile/magic/fetch/on_hit(target) - . = ..() - if(isliving(target)) - var/mob/living/L = target - if(L.anti_magic_check() || !firer) - L.visible_message("[src] vanishes on contact with [target]!") - return BULLET_ACT_BLOCK - var/atom/throw_target = get_edge_target_turf(L, get_dir(L, firer)) - L.throw_at(throw_target, 200, 4) - -/obj/projectile/magic/sapping - name = "bolt of sapping" - icon_state = "sapping" - -/obj/projectile/magic/sapping/on_hit(target) - . = ..() - if(ismob(target)) - var/mob/M = target - if(M.anti_magic_check()) - M.visible_message("[src] vanishes on contact with [target]!") - return BULLET_ACT_BLOCK - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, src, /datum/mood_event/sapped) - -/obj/projectile/magic/necropotence - name = "bolt of necropotence" - icon_state = "necropotence" - -/obj/projectile/magic/necropotence/on_hit(target) - . = ..() - if(isliving(target)) - var/mob/living/L = target - if(L.anti_magic_check() || !L.mind || !L.mind.hasSoul) - L.visible_message("[src] vanishes on contact with [target]!") - return BULLET_ACT_BLOCK - to_chat(L, "Your body feels drained and there is a burning pain in your chest.") - L.maxHealth -= 20 - L.health = min(L.health, L.maxHealth) - if(L.maxHealth <= 0) - to_chat(L, "Your weakened soul is completely consumed by the [src]!") - L.mind.hasSoul = FALSE - for(var/obj/effect/proc_holder/spell/spell in L.mind.spell_list) - spell.charge_counter = spell.charge_max - spell.recharging = FALSE - spell.update_appearance() - -/obj/projectile/magic/fortify - name = "bolt of light" - icon_state = "spark" - -/obj/projectile/magic/fortify/on_hit(target) - . = ..() - if(isliving(target)) - var/mob/living/L = target - if(L.anti_magic_check() || !L.mind || !L.mind.hasSoul) - L.visible_message("[src] vanishes on contact with [target]!") - return BULLET_ACT_BLOCK - to_chat(L, "You feel your body flood with magical strength! Your flesh feels cleansed, and somehow... tougher.") - L.maxHealth += 20 - L.heal_overall_damage(20, 20) - L.apply_damage(-200, CLONE)//cleanses cellular damage - if(L.mind.hasSoul == FALSE)//restores consumed souls - to_chat(L, "You feel a warm light in your chest... the [src] has restored something you'd long forgotten.") - L.mind.hasSoul = TRUE - if(L.hellbound == 1) - L.hellbound = 0//devil economy in shambles - for(var/obj/effect/proc_holder/spell/spell in L.mind.spell_list) - spell.charge_counter = spell.charge_max - spell.recharging = FALSE - spell.update_appearance() - -/obj/projectile/magic/wipe - name = "bolt of possession" - icon_state = "wipe" - -/obj/projectile/magic/wipe/on_hit(target) - . = ..() - if(iscarbon(target)) - var/mob/living/carbon/M = target - if(M.anti_magic_check()) - M.visible_message("[src] vanishes on contact with [target]!") - return BULLET_ACT_BLOCK - for(var/x in M.get_traumas())//checks to see if the victim is already going through possession - if(istype(x, /datum/brain_trauma/special/imaginary_friend/trapped_owner)) - M.visible_message("[src] vanishes on contact with [target]!") - return BULLET_ACT_BLOCK - to_chat(M, "Your mind has been opened to possession!") - possession_test(M) - return BULLET_ACT_HIT - -/obj/projectile/magic/wipe/proc/possession_test(mob/living/carbon/M) - var/datum/brain_trauma/special/imaginary_friend/trapped_owner/trauma = M.gain_trauma(/datum/brain_trauma/special/imaginary_friend/trapped_owner) - var/poll_message = "Do you want to play as [M.real_name]?" - if(M.mind && M.mind.assigned_role) - poll_message = "[poll_message] Job:[M.mind.assigned_role]." - if(M.mind && M.mind.special_role) - poll_message = "[poll_message] Status:[M.mind.special_role]." - else if(M.mind) - var/datum/antagonist/A = M.mind.has_antag_datum(/datum/antagonist/) - if(A) - poll_message = "[poll_message] Status:[A.name]." - var/list/mob/dead/observer/candidates = pollCandidatesForMob(poll_message, ROLE_PAI, null, FALSE, 100, M) - if(M.stat == DEAD)//boo. - return - if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) - to_chat(M, "You have been noticed by a ghost and it has possessed you!") - var/oldkey = M.key - M.ghostize(0) - M.key = C.key - trauma.friend.key = oldkey - trauma.friend.reset_perspective(null) - trauma.friend.Show() - trauma.friend_initialized = TRUE - else - to_chat(M, "Your mind has managed to go unnoticed in the spirit world.") - qdel(trauma) - -/obj/projectile/magic/aoe - name = "Area Bolt" - desc = "What the fuck does this do?!" - damage = 0 - var/proxdet = TRUE - -/obj/projectile/magic/aoe/Range() - if(proxdet) - for(var/mob/living/L in range(1, get_turf(src))) - if(L.stat != DEAD && L != firer && !L.anti_magic_check()) - return Bump(L) - ..() - - -/obj/projectile/magic/aoe/lightning - name = "lightning bolt" - icon_state = "tesla_projectile" //Better sprites are REALLY needed and appreciated!~ - damage = 15 - damage_type = BURN - nodamage = FALSE - speed = 0.3 - flag = "magic" - - var/zap_power = 20000 - var/zap_range = 15 - var/zap_flags = ZAP_MOB_DAMAGE | ZAP_MOB_STUN | ZAP_OBJ_DAMAGE - var/chain - var/mob/living/caster - -/obj/projectile/magic/aoe/lightning/fire(setAngle) - if(caster) - chain = caster.Beam(src, icon_state = "lightning[rand(1, 12)]", time = INFINITY, maxdistance = INFINITY) - ..() - -/obj/projectile/magic/aoe/lightning/on_hit(target) - . = ..() - if(ismob(target)) - var/mob/M = target - if(M.anti_magic_check()) - visible_message("[src] fizzles on contact with [target]!") - qdel(src) - return BULLET_ACT_BLOCK - tesla_zap(src, zap_range, zap_power, zap_flags) - qdel(src) - -/obj/projectile/magic/aoe/lightning/Destroy() - qdel(chain) - . = ..() - -/obj/projectile/magic/aoe/fireball - name = "bolt of fireball" - icon_state = "fireball" - damage = 10 - damage_type = BRUTE - nodamage = FALSE - - //explosion values - var/exp_heavy = 0 - var/exp_light = 2 - var/exp_flash = 3 - var/exp_fire = 2 - -/obj/projectile/magic/aoe/fireball/on_hit(target) - . = ..() - if(ismob(target)) - var/mob/living/M = target - if(M.anti_magic_check()) - visible_message("[src] vanishes into smoke on contact with [target]!") - return BULLET_ACT_BLOCK - M.take_overall_damage(0,10) //between this 10 burn, the 10 brute, the explosion brute, and the onfire burn, your at about 65 damage if you stop drop and roll immediately - var/turf/T = get_turf(target) - explosion(T, -1, exp_heavy, exp_light, exp_flash, 0, flame_range = exp_fire) - -/obj/projectile/magic/aoe/fireball/infernal - name = "infernal fireball" - exp_heavy = -1 - exp_light = -1 - exp_flash = 4 - exp_fire= 5 - -/obj/projectile/magic/aoe/fireball/infernal/on_hit(target) - . = ..() - if(ismob(target)) - var/mob/living/M = target - if(M.anti_magic_check()) - return BULLET_ACT_BLOCK - var/turf/T = get_turf(target) - for(var/i=0, i<50, i+=10) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(explosion), T, -1, exp_heavy, exp_light, exp_flash, FALSE, FALSE, exp_fire), i) - -//still magic related, but a different path - -/obj/projectile/temp/chill - name = "bolt of chills" - icon_state = "ice_2" - damage = 0 - damage_type = BURN - nodamage = FALSE - armour_penetration = 100 - temperature = -200 // Cools you down greatly per hit - flag = "magic" - -/obj/projectile/magic/nothing - name = "bolt of nothing" diff --git a/code/modules/projectiles/projectile/magic/spellcard.dm b/code/modules/projectiles/projectile/magic/spellcard.dm deleted file mode 100644 index 464586d2f8a4..000000000000 --- a/code/modules/projectiles/projectile/magic/spellcard.dm +++ /dev/null @@ -1,6 +0,0 @@ -/obj/projectile/spellcard - name = "enchanted card" - desc = "A piece of paper enchanted to give it extreme durability and stiffness, along with a very hot burn to anyone unfortunate enough to get hit by a charged one." - icon_state = "spellcard" - damage_type = BURN - damage = 2 diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 9bdc513289e1..5e45c756c881 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -138,16 +138,15 @@ other types of metals and chemistry for reagents). blueprints[1] = new /datum/design/c10mm() -/obj/item/disk/design_disk/adv/disposable_gun +/obj/item/disk/design_disk/disposable_gun name = "design disk - disposable gun" desc = "A design disk containing designs for a cheap and disposable gun." illustration = "gun" max_blueprints = 2 -/obj/item/disk/design_disk/adv/disposable_gun/Initialize() +/obj/item/disk/design_disk/disposable_gun/Initialize() . = ..() blueprints[1] = new /datum/design/disposable_gun() - blueprints[2] = new /datum/design/pizza_disposable_gun() /obj/item/disk/design_disk/clip_mechs name = "design disk - CLIP mecha modifications" diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index 5edbb4df1158..45d65ebf0753 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -650,14 +650,6 @@ build_path = /obj/item/gun/ballistic/automatic/pistol/disposable category = list("Imported") -/datum/design/pizza_disposable_gun - name = "Pizza Disposable Gun" - id = "disposable_pizza" - build_type = AUTOLATHE - materials = list(/datum/material/pizza = 4000) - build_path = /obj/item/gun/ballistic/automatic/pistol/disposable/pizza - category = list("Imported") - //SRM Ballistics /datum/design/doublebarrel name = "Double Barrel Shotgun" diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 9016d60515e7..ce473ad739cb 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -355,16 +355,6 @@ C.name = "Cup of Suspicious Liquid" C.desc = "It has a large hazard symbol printed on the side in fading ink." investigate_log("Experimentor has made a cup of [chosenchem] coffee.", INVESTIGATE_EXPERIMENTOR) - else if(prob(EFFECT_PROB_VERYLOW-badThingCoeff)) - var/turf/start = get_turf(src) - var/mob/M = locate(/mob/living) in view(src, 3) - var/turf/MT = get_turf(M) - if(MT) - visible_message("[src] dangerously overheats, launching a flaming fuel orb!") - investigate_log("Experimentor has launched a fireball at [M]!", INVESTIGATE_EXPERIMENTOR) - var/obj/projectile/magic/aoe/fireball/FB = new /obj/projectile/magic/aoe/fireball(start) - FB.preparePixelProjectile(MT, start) - FB.fire() else if(prob(EFFECT_PROB_LOW-badThingCoeff)) visible_message("[src] malfunctions, melting [exp_on] and releasing a burst of flame!") explosion(loc, -1, 0, 0, 0, 0, flame_range = 2) diff --git a/code/modules/research/xenobiology/crossbreeding/_weapons.dm b/code/modules/research/xenobiology/crossbreeding/_weapons.dm index 29ea3fbd4298..ac663059d0c0 100644 --- a/code/modules/research/xenobiology/crossbreeding/_weapons.dm +++ b/code/modules/research/xenobiology/crossbreeding/_weapons.dm @@ -65,54 +65,3 @@ Slimecrossing Weapons /obj/item/shield/adamantineshield/ComponentInitialize() . = ..() AddComponent(/datum/component/two_handed, require_twohands=TRUE, force_wielded=15) - -//Bloodchiller - Chilling Green -/obj/item/gun/magic/bloodchill - name = "blood chiller" - desc = "A horrifying weapon made of your own bone and blood vessels. It shoots slowing globules of your own blood. Ech." - icon = 'icons/obj/slimecrossing.dmi' - icon_state = "bloodgun" - item_state = "bloodgun" - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' - item_flags = ABSTRACT | DROPDEL - w_class = WEIGHT_CLASS_HUGE - slot_flags = NONE - force = 5 - max_charges = 1 //Recharging costs blood. - recharge_rate = 1 - ammo_type = /obj/item/ammo_casing/magic/bloodchill - fire_sound = 'sound/effects/attackblob.ogg' - -/obj/item/gun/magic/bloodchill/Initialize() - . = ..() - ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT) - -/obj/item/gun/magic/bloodchill/process() - charge_tick++ - if(charge_tick < recharge_rate || charges >= max_charges) - return 0 - charge_tick = 0 - var/mob/living/M = loc - if(istype(M) && M.blood_volume >= 20) - charges++ - M.blood_volume -= 20 - if(charges == 1) - recharge_newshot() - return 1 - -/obj/item/ammo_casing/magic/bloodchill - projectile_type = /obj/projectile/magic/bloodchill - -/obj/projectile/magic/bloodchill - name = "blood ball" - icon_state = "pulse0_bl" - damage = 0 - damage_type = OXY - nodamage = TRUE - hitsound = 'sound/effects/splat.ogg' - -/obj/projectile/magic/bloodchill/on_hit(mob/living/target) - . = ..() - if(isliving(target)) - target.apply_status_effect(/datum/status_effect/bloodchill) diff --git a/code/modules/research/xenobiology/crossbreeding/chilling.dm b/code/modules/research/xenobiology/crossbreeding/chilling.dm index 89fa16cca7f5..9fe7857c073b 100644 --- a/code/modules/research/xenobiology/crossbreeding/chilling.dm +++ b/code/modules/research/xenobiology/crossbreeding/chilling.dm @@ -235,29 +235,6 @@ Chilling extracts: user.visible_message("[src] lets out a peaceful ring as it shatters, but nothing happens...") ..() -/obj/item/slimecross/chilling/green - colour = "green" - effect_desc = "Creates a bone gun in the hand it is used in, which uses blood as ammo." - -/obj/item/slimecross/chilling/green/do_effect(mob/user) - var/which_hand = "l_hand" - if(!(user.active_hand_index % 2)) - which_hand = "r_hand" - var/mob/living/L = user - if(!istype(user)) - return - var/obj/item/held = L.get_active_held_item() //This should be itself, but just in case... - L.dropItemToGround(held) - var/obj/item/gun/magic/bloodchill/gun = new(user) - if(!L.put_in_hands(gun)) - qdel(gun) - user.visible_message("[src] flash-freezes [user]'s arm, cracking the flesh horribly!") - else - user.visible_message("[src] chills and snaps off the front of the bone on [user]'s arm, leaving behind a strange, gun-like structure!") - user.emote("scream") - L.apply_damage(30,BURN,which_hand) - ..() - /obj/item/slimecross/chilling/pink colour = "pink" effect_desc = "Creates a slime corgi puppy." diff --git a/code/modules/ruins/icemoonruin_code/hotsprings.dm b/code/modules/ruins/icemoonruin_code/hotsprings.dm deleted file mode 100644 index dd4d39e91a20..000000000000 --- a/code/modules/ruins/icemoonruin_code/hotsprings.dm +++ /dev/null @@ -1,56 +0,0 @@ -GLOBAL_LIST_EMPTY(cursed_minds) - -/** - * Turns whoever enters into a mob or random person - * - * If mob is chosen, turns the person into a random animal type - * If appearance is chosen, turns the person into a random human with a random species - * This changes name, and changes their DNA as well - * Random species is same as wizard swap event so people don't get killed ex: plasmamen - * Once the spring is used, it cannot be used by the same mind ever again - * After usage, teleports the user back to a random safe turf (so mobs are not killed by ice moon atmosphere) - * - */ - -/turf/open/water/cursed_spring - baseturfs = /turf/open/water/cursed_spring - planetary_atmos = TRUE - initial_gas_mix = ICEMOON_DEFAULT_ATMOS - -/turf/open/water/cursed_spring/Entered(atom/movable/thing, atom/oldLoc) - . = ..() - if(!isliving(thing)) - return - var/mob/living/L = thing - if(!L.client) - return - if(GLOB.cursed_minds[L.mind]) - return - GLOB.cursed_minds[L.mind] = TRUE - RegisterSignal(L.mind, COMSIG_PARENT_QDELETING, PROC_REF(remove_from_cursed)) - var/random_choice = pick("Mob", "Appearance") - switch(random_choice) - if("Mob") - L = wabbajack(L, "animal") - if("Appearance") - var/mob/living/carbon/human/H = wabbajack(L, "humanoid") - randomize_human(H) - var/list/all_species = list() - for(var/stype in subtypesof(/datum/species)) - var/datum/species/S = stype - if(initial(S.changesource_flags) & RACE_SWAP) - all_species += stype - var/random_race = pick(all_species) - H.set_species(random_race) - H.dna.unique_enzymes = H.dna.generate_unique_enzymes() - L = H - var/turf/T = find_safe_turf() - L.forceMove(T) - to_chat(L, "You blink and find yourself in [get_area_name(T)].") - -/** - * Deletes minds from the cursed minds list after their deletion - * - */ -/turf/open/water/cursed_spring/proc/remove_from_cursed(datum/mind/M) - GLOB.cursed_minds -= M diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm index 2603d9ea3e24..1ddb26efba88 100644 --- a/code/modules/shuttle/special.dm +++ b/code/modules/shuttle/special.dm @@ -1,134 +1,5 @@ // Special objects for shuttle templates go here if nowhere else -// Wabbajack statue, a sleeping frog statue that shoots bolts of change if -// living carbons are put on its altar/tables - -/obj/machinery/power/emitter/energycannon/magical - name = "wabbajack statue" - desc = "Who am I? What is my purpose in life? What do I mean by who am I?" - projectile_type = /obj/projectile/magic/change - icon = 'icons/obj/machines/magic_emitter.dmi' - icon_state = "wabbajack_statue" - icon_state_on = "wabbajack_statue_on" - base_icon_state = "wabbajack_statue" - active = FALSE - allow_switch_interact = FALSE - var/list/active_tables = list() - var/tables_required = 2 - -/obj/machinery/power/emitter/energycannon/magical/Initialize() - . = ..() - if(prob(50)) - desc = "Oh no, not again." - update_appearance() - -/obj/machinery/power/emitter/energycannon/magical/update_icon_state() - . = ..() - icon_state = active ? icon_state_on : initial(icon_state) - -/obj/machinery/power/emitter/energycannon/magical/process() - . = ..() - if(active_tables.len >= tables_required) - if(!active) - visible_message("\ - [src] opens its eyes.") - active = TRUE - else - if(active) - visible_message("\ - [src] closes its eyes.") - active = FALSE - update_appearance() - -/obj/machinery/power/emitter/energycannon/magical/attackby(obj/item/W, mob/user, params) - return - -/obj/machinery/power/emitter/energycannon/magical/ex_act(severity) - return - -/obj/machinery/power/emitter/energycannon/magical/emag_act(mob/user) - return - -/obj/structure/table/abductor/wabbajack - name = "wabbajack altar" - desc = "Whether you're sleeping or waking, it's going to be quite chaotic." - max_integrity = 1000 - verb_say = "chants" - var/obj/machinery/power/emitter/energycannon/magical/our_statue - var/list/mob/living/sleepers = list() - var/never_spoken = TRUE - flags_1 = NODECONSTRUCT_1 - -/obj/structure/table/abductor/wabbajack/Initialize(mapload) - . = ..() - START_PROCESSING(SSobj, src) - -/obj/structure/table/abductor/wabbajack/Destroy() - STOP_PROCESSING(SSobj, src) - . = ..() - -/obj/structure/table/abductor/wabbajack/process() - var/area = orange(4, src) - if(!our_statue) - for(var/obj/machinery/power/emitter/energycannon/magical/M in area) - our_statue = M - break - - if(!our_statue) - name = "inert [initial(name)]" - return - else - name = initial(name) - - var/turf/T = get_turf(src) - var/list/found = list() - for(var/mob/living/carbon/C in T) - if(C.stat != DEAD) - found += C - - // New sleepers - for(var/i in found - sleepers) - var/mob/living/L = i - L.add_atom_colour("#800080", TEMPORARY_COLOUR_PRIORITY) - L.visible_message("A strange purple glow wraps itself around [L] as [L.p_they()] suddenly fall[L.p_s()] unconscious.", - "[desc]") - // Don't let them sit suround unconscious forever - addtimer(CALLBACK(src, PROC_REF(sleeper_dreams), L), 100) - - // Existing sleepers - for(var/i in found) - var/mob/living/L = i - L.SetSleeping(200) - - // Missing sleepers - for(var/i in sleepers - found) - var/mob/living/L = i - L.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, "#800080") - L.visible_message("The glow from [L] fades \ - away.") - L.grab_ghost() - - sleepers = found - - if(sleepers.len) - our_statue.active_tables |= src - if(never_spoken || prob(5)) - say(desc) - never_spoken = FALSE - else - our_statue.active_tables -= src - -/obj/structure/table/abductor/wabbajack/proc/sleeper_dreams(mob/living/sleeper) - if(sleeper in sleepers) - to_chat(sleeper, "While you slumber, you have the strangest dream, like you can see yourself from the outside.") - sleeper.ghostize(TRUE) - -/obj/structure/table/abductor/wabbajack/left - desc = "You sleep so it may wake." - -/obj/structure/table/abductor/wabbajack/right - desc = "It wakes so you may sleep." - // Bar staff, GODMODE mobs(as long as they stay in the shuttle) that just want to make sure people have drinks // and a good time. diff --git a/code/modules/spells/spell_types/aimed.dm b/code/modules/spells/spell_types/aimed.dm index 9e30c708774d..46737c5b5a99 100644 --- a/code/modules/spells/spell_types/aimed.dm +++ b/code/modules/spells/spell_types/aimed.dm @@ -2,7 +2,7 @@ /obj/effect/proc_holder/spell/aimed name = "aimed projectile spell" base_icon_state = "projectile" - var/projectile_type = /obj/projectile/magic/teleport + var/projectile_type = /obj/projectile var/deactive_msg = "You discharge your projectile..." var/active_msg = "You charge your projectile!" var/active_icon_state = "projectile" @@ -106,7 +106,7 @@ projectile_var_overrides = list("zap_range" = 15, "zap_power" = 20000, "zap_flags" = ZAP_MOB_DAMAGE) active_msg = "You energize your hands with arcane lightning!" deactive_msg = "You let the energy flow out of your hands back into yourself..." - projectile_type = /obj/projectile/magic/aoe/lightning + projectile_type = /obj/projectile/magic /obj/effect/proc_holder/spell/aimed/fireball name = "Fireball" @@ -118,7 +118,7 @@ invocation_type = INVOCATION_SHOUT range = 20 cooldown_min = 20 //10 deciseconds reduction per rank - projectile_type = /obj/projectile/magic/aoe/fireball + projectile_type = /obj/projectile/magic base_icon_state = "fireball" action_icon_state = "fireball0" sound = 'sound/magic/fireball.ogg' @@ -130,60 +130,3 @@ var/range = 6 + 2*spell_level projectile_var_overrides = list("range" = range) return ..() - -/obj/effect/proc_holder/spell/aimed/spell_cards - name = "Spell Cards" - desc = "Blazing hot rapid-fire homing cards. Send your foes to the shadow realm with their mystical power!" - school = "evocation" - charge_max = 50 - clothes_req = FALSE - invocation = "Sigi'lu M'Fan 'Tasia" - invocation_type = INVOCATION_SHOUT - range = 40 - cooldown_min = 10 - projectile_amount = 5 - projectiles_per_fire = 7 - projectile_type = /obj/projectile/spellcard - base_icon_state = "spellcard" - action_icon_state = "spellcard0" - var/datum/weakref/current_target_weakref - var/projectile_turnrate = 10 - var/projectile_pixel_homing_spread = 32 - var/projectile_initial_spread_amount = 30 - var/projectile_location_spread_amount = 12 - var/datum/component/lockon_aiming/lockon_component - ranged_clickcd_override = TRUE - -/obj/effect/proc_holder/spell/aimed/spell_cards/on_activation(mob/M) - QDEL_NULL(lockon_component) - lockon_component = M.AddComponent(/datum/component/lockon_aiming, 5, typecacheof(list(/mob/living)), 1, null, CALLBACK(src, PROC_REF(on_lockon_component))) - -/obj/effect/proc_holder/spell/aimed/spell_cards/proc/on_lockon_component(list/locked_weakrefs) - if(!length(locked_weakrefs)) - current_target_weakref = null - return - current_target_weakref = locked_weakrefs[1] - var/atom/A = current_target_weakref.resolve() - if(A) - var/mob/M = lockon_component.parent - M.face_atom(A) - -/obj/effect/proc_holder/spell/aimed/spell_cards/on_deactivation(mob/M) - QDEL_NULL(lockon_component) - -/obj/effect/proc_holder/spell/aimed/spell_cards/ready_projectile(obj/projectile/P, atom/target, mob/user, iteration) - if(current_target_weakref) - var/atom/A = current_target_weakref.resolve() - if(A && get_dist(A, user) < 7) - P.homing_turn_speed = projectile_turnrate - P.homing_inaccuracy_min = projectile_pixel_homing_spread - P.homing_inaccuracy_max = projectile_pixel_homing_spread - P.set_homing_target(current_target_weakref.resolve()) - var/rand_spr = rand() - var/total_angle = projectile_initial_spread_amount * 2 - var/adjusted_angle = total_angle - ((projectile_initial_spread_amount / projectiles_per_fire) * 0.5) - var/one_fire_angle = adjusted_angle / projectiles_per_fire - var/current_angle = iteration * one_fire_angle * rand_spr - (projectile_initial_spread_amount / 2) - P.pixel_x = rand(-projectile_location_spread_amount, projectile_location_spread_amount) - P.pixel_y = rand(-projectile_location_spread_amount, projectile_location_spread_amount) - P.preparePixelProjectile(target, user, null, current_angle) diff --git a/code/modules/spells/spell_types/charge.dm b/code/modules/spells/spell_types/charge.dm index 57325e685f4d..225c36580e49 100644 --- a/code/modules/spells/spell_types/charge.dm +++ b/code/modules/spells/spell_types/charge.dm @@ -51,20 +51,6 @@ I.used = FALSE charged_item = I break - else if(istype(item, /obj/item/gun/magic)) - var/obj/item/gun/magic/I = item - if(prob(80) && !I.can_charge) - I.max_charges-- - if(I.max_charges <= 0) - I.max_charges = 0 - burnt_out = TRUE - I.charges = I.max_charges - if(istype(item, /obj/item/gun/magic/wand) && I.max_charges != 0) - var/obj/item/gun/magic/W = item - W.icon_state = initial(W.icon_state) - I.recharge_newshot() - charged_item = I - break else if(istype(item, /obj/item/stock_parts/cell)) var/obj/item/stock_parts/cell/C = item if(!C.self_recharge) diff --git a/code/modules/spells/spell_types/devil.dm b/code/modules/spells/spell_types/devil.dm index b7da88dfe790..421b7f40f11c 100644 --- a/code/modules/spells/spell_types/devil.dm +++ b/code/modules/spells/spell_types/devil.dm @@ -84,7 +84,7 @@ invocation_type = INVOCATION_SHOUT range = 2 - projectile_type = /obj/projectile/magic/aoe/fireball/infernal + projectile_type = /obj/projectile/magic action_background_icon_state = "bg_demon" diff --git a/code/modules/spells/spell_types/infinite_guns.dm b/code/modules/spells/spell_types/infinite_guns.dm deleted file mode 100644 index 3f400a8fb4bc..000000000000 --- a/code/modules/spells/spell_types/infinite_guns.dm +++ /dev/null @@ -1,27 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/infinite_guns - name = "Lesser Summon Guns" - desc = "Why reload when you have infinite guns? Summons an unending stream of bolt action rifles that deal little damage, but will knock targets down. Requires both hands free to use. Learning this spell makes you unable to learn Arcane Barrage." - invocation_type = "none" - include_user = TRUE - range = -1 - - school = "conjuration" - charge_max = 750 - clothes_req = TRUE - cooldown_min = 10 //Gun wizard - action_icon_state = "bolt_action" - var/summon_path = /obj/item/gun/ballistic/rifle/illestren/enchanted - -/obj/effect/proc_holder/spell/targeted/infinite_guns/cast(list/targets, mob/user = usr) - for(var/mob/living/carbon/C in targets) - C.drop_all_held_items() - var/GUN = new summon_path - C.put_in_hands(GUN) - -/obj/effect/proc_holder/spell/targeted/infinite_guns/gun - -/obj/effect/proc_holder/spell/targeted/infinite_guns/arcane_barrage - name = "Arcane Barrage" - desc = "Fire a torrent of arcane energy at your foes with this (powerful) spell. Deals much more damage than Lesser Summon Guns, but won't knock targets down. Requires both hands free to use. Learning this spell makes you unable to learn Lesser Summon Gun." - action_icon_state = "arcane_barrage" - summon_path = /obj/item/gun/ballistic/rifle/illestren/enchanted/arcane_barrage diff --git a/code/modules/spells/spell_types/rightandwrong.dm b/code/modules/spells/spell_types/rightandwrong.dm index e79ffb8a491e..ed6d9a9b957d 100644 --- a/code/modules/spells/spell_types/rightandwrong.dm +++ b/code/modules/spells/spell_types/rightandwrong.dm @@ -49,60 +49,8 @@ GLOBAL_LIST_INIT(summoned_guns, list( /obj/item/gun/energy/laser/scatter, /obj/item/gun/energy/gravity_gun)) -//if you add anything that isn't covered by the typepaths below, add it to summon_magic_objective_types -GLOBAL_LIST_INIT(summoned_magic, list( - /obj/item/book/granter/spell/fireball, - /obj/item/book/granter/spell/smoke, - /obj/item/book/granter/spell/blind, - /obj/item/book/granter/spell/mindswap, - /obj/item/book/granter/spell/forcewall, - /obj/item/book/granter/spell/knock, - /obj/item/book/granter/spell/barnyard, - /obj/item/book/granter/spell/charge, - /obj/item/book/granter/spell/summonitem, - /obj/item/gun/magic/wand/nothing, - /obj/item/gun/magic/wand/death, - /obj/item/gun/magic/wand/resurrection, - /obj/item/gun/magic/wand/polymorph, - /obj/item/gun/magic/wand/teleport, - /obj/item/gun/magic/wand/door, - /obj/item/gun/magic/wand/fireball, - /obj/item/gun/magic/staff/healing, - /obj/item/gun/magic/staff/door, - /obj/item/scrying, - /obj/item/voodoo, - /obj/item/warpwhistle, - /obj/item/clothing/suit/space/hardsuit/shielded/wizard, - /obj/item/immortality_talisman, - /obj/item/melee/ghost_sword)) - -GLOBAL_LIST_INIT(summoned_special_magic, list( - /obj/item/gun/magic/staff/change, - /obj/item/gun/magic/staff/animate, - /obj/item/storage/belt/wands/full, - /obj/item/antag_spawner/contract, - /obj/item/gun/magic/staff/chaos, - /obj/item/necromantic_stone, - /obj/item/blood_contract)) - -//everything above except for single use spellbooks, because they are counted separately (and are for basic bitches anyways) -GLOBAL_LIST_INIT(summoned_magic_objectives, list( - /obj/item/antag_spawner/contract, - /obj/item/blood_contract, - /obj/item/clothing/suit/space/hardsuit/shielded/wizard, - /obj/item/gun/magic, - /obj/item/immortality_talisman, - /obj/item/melee/ghost_sword, - /obj/item/necromantic_stone, - /obj/item/scrying, - /obj/item/spellbook, - /obj/item/storage/belt/wands/full, - /obj/item/voodoo, - /obj/item/warpwhistle)) - // If true, it's the probability of triggering "survivor" antag. GLOBAL_VAR_INIT(summon_guns_triggered, FALSE) -GLOBAL_VAR_INIT(summon_magic_triggered, FALSE) /proc/give_guns(mob/living/carbon/human/H) if(H.stat == DEAD || !(H.client)) @@ -125,54 +73,19 @@ GLOBAL_VAR_INIT(summon_magic_triggered, FALSE) to_chat(H, "\A [G] appears [in_hand ? "in your hand" : "at your feet"]!") -/proc/give_magic(mob/living/carbon/human/H) - if(H.stat == DEAD || !(H.client)) - return - if(H.mind) - if(iswizard(H) || H.mind.has_antag_datum(/datum/antagonist/survivalist/magic)) - return - - if(prob(GLOB.summon_magic_triggered) && !(H.mind.has_antag_datum(/datum/antagonist))) - H.mind.add_antag_datum(/datum/antagonist/survivalist/magic) - H.log_message("was made into a survivalist, and trusts no one!", LOG_ATTACK, color="red") - - var/magic_type = pick(GLOB.summoned_magic) - var/lucky = FALSE - if(prob(SPECIALIST_MAGIC_PROB)) - magic_type = pick(GLOB.summoned_special_magic) - lucky = TRUE - - var/obj/item/M = new magic_type(get_turf(H)) - playsound(get_turf(H),'sound/magic/summon_magic.ogg', 50, TRUE) - - var/in_hand = H.put_in_hands(M) - - to_chat(H, "\A [M] appears [in_hand ? "in your hand" : "at your feet"]!") - if(lucky) - to_chat(H, "You feel incredibly lucky.") - - -/proc/rightandwrong(summon_type, mob/user, survivor_probability) - if(user) //in this case either someone holding a spellbook or a badmin - to_chat(user, "You summoned [summon_type]!") - message_admins("[ADMIN_LOOKUPFLW(user)] summoned [summon_type]!") - log_game("[key_name(user)] summoned [summon_type]!") +/proc/rightandwrong(mob/user, survivor_probability) + if(user) //in this case someone is a badmin + to_chat(user, "You summoned guns!") + message_admins("[ADMIN_LOOKUPFLW(user)] summoned guns!") + log_game("[key_name(user)] summoned guns!") - if(summon_type == SUMMON_MAGIC) - GLOB.summon_magic_triggered = survivor_probability - else if(summon_type == SUMMON_GUNS) - GLOB.summon_guns_triggered = survivor_probability - else - CRASH("Bad summon_type given: [summon_type]") + GLOB.summon_guns_triggered = survivor_probability for(var/mob/living/carbon/human/H in GLOB.player_list) var/turf/T = get_turf(H) if(T && is_away_level(T)) continue - if(summon_type == SUMMON_MAGIC) - give_magic(H) - else - give_guns(H) + give_guns(H) /proc/summonevents() if(!SSevents.wizardmode) diff --git a/code/modules/spells/spell_types/shapeshift.dm b/code/modules/spells/spell_types/shapeshift.dm index 65eb0cebb2b3..254a43dc23af 100644 --- a/code/modules/spells/spell_types/shapeshift.dm +++ b/code/modules/spells/spell_types/shapeshift.dm @@ -19,7 +19,6 @@ var/mob/living/shapeshift_type var/list/possible_shapes = list(/mob/living/simple_animal/mouse,\ /mob/living/simple_animal/pet/dog/corgi,\ - /mob/living/simple_animal/hostile/carp/ranged/chaos,\ /mob/living/simple_animal/bot/secbot/ed209,\ /mob/living/simple_animal/hostile/poison/giant_spider/hunter/viper,\ /mob/living/simple_animal/hostile/construct/juggernaut) diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index f58f94df84dd..eaa0a631ec5d 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -1712,13 +1712,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/flashlight/lantern/syndicate restricted_species = list("moth") //End WS edit -/datum/uplink_item/race_restricted/syndigenetics - name = "Fire Breath" - desc = "One of our subsidiaries, 23AndMe, have recently found the formula of backtracking lizard's genetic trail and giving them the ability to breathe fire, much like their dragon ancestors." - cost = 5 - item = /obj/item/dnainjector/firebreath - restricted_species = list("lizard") - /datum/uplink_item/race_restricted/razorwing name = "Razorwing Implant" desc = "Put those wings to good use! This implant makes your wingtips razor sharp and gives you the ability to flourish them, slicing anyone in range." diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index 04ae257730f2..367c309d59a1 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -112,7 +112,6 @@ /obj/item/gohei = 1, /obj/item/clothing/suit/judgerobe = 1, /obj/item/clothing/head/powdered_wig = 1, - /obj/item/gun/magic/wand/nothing = 2, /obj/item/clothing/glasses/sunglasses/garb = 2, /obj/item/clothing/glasses/blindfold = 1, /obj/item/clothing/mask/muzzle = 2) diff --git a/shiptest.dme b/shiptest.dme index b8df46bc4017..630c5d479767 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -1352,7 +1352,6 @@ #include "code\game\objects\structures\fireplace.dm" #include "code\game\objects\structures\flora.dm" #include "code\game\objects\structures\fluff.dm" -#include "code\game\objects\structures\fugitive_role_spawners.dm" #include "code\game\objects\structures\ghost_role_spawners.dm" #include "code\game\objects\structures\girders.dm" #include "code\game\objects\structures\grille.dm" @@ -1704,7 +1703,6 @@ #include "code\modules\antagonists\ert\nanotrasen.dm" #include "code\modules\antagonists\ert\solgov.dm" #include "code\modules\antagonists\ert\syndicate.dm" -#include "code\modules\antagonists\fugitive\fugitive_outfits.dm" #include "code\modules\antagonists\gang\outfits.dm" #include "code\modules\antagonists\greentext\greentext.dm" #include "code\modules\antagonists\magic_servant\servant.dm" @@ -2133,7 +2131,6 @@ #include "code\modules\events\wizard\invincible.dm" #include "code\modules\events\wizard\lava.dm" #include "code\modules\events\wizard\madness.dm" -#include "code\modules\events\wizard\magicarp.dm" #include "code\modules\events\wizard\petsplosion.dm" #include "code\modules\events\wizard\race.dm" #include "code\modules\events\wizard\rpgloot.dm" @@ -3031,7 +3028,6 @@ #include "code\modules\projectiles\guns\ballistic.dm" #include "code\modules\projectiles\guns\energy.dm" #include "code\modules\projectiles\guns\gunhud.dm" -#include "code\modules\projectiles\guns\magic.dm" #include "code\modules\projectiles\guns\powered.dm" #include "code\modules\projectiles\guns\ballistic\assault.dm" #include "code\modules\projectiles\guns\ballistic\automatic.dm" @@ -3054,8 +3050,6 @@ #include "code\modules\projectiles\guns\energy\special.dm" #include "code\modules\projectiles\guns\energy\stun.dm" #include "code\modules\projectiles\guns\faction\gezena\energy_gunsword.dm" -#include "code\modules\projectiles\guns\magic\staff.dm" -#include "code\modules\projectiles\guns\magic\wand.dm" #include "code\modules\projectiles\guns\misc\beam_rifle.dm" #include "code\modules\projectiles\guns\misc\blastcannon.dm" #include "code\modules\projectiles\guns\misc\bow.dm" @@ -3065,7 +3059,6 @@ #include "code\modules\projectiles\guns\misc\syringe_gun.dm" #include "code\modules\projectiles\projectile\beams.dm" #include "code\modules\projectiles\projectile\bullets.dm" -#include "code\modules\projectiles\projectile\magic.dm" #include "code\modules\projectiles\projectile\bullets\_incendiary.dm" #include "code\modules\projectiles\projectile\bullets\dart_syringe.dm" #include "code\modules\projectiles\projectile\bullets\dnainjector.dm" @@ -3087,7 +3080,6 @@ #include "code\modules\projectiles\projectile\energy\nuclear_particle.dm" #include "code\modules\projectiles\projectile\energy\stun.dm" #include "code\modules\projectiles\projectile\energy\tesla.dm" -#include "code\modules\projectiles\projectile\magic\spellcard.dm" #include "code\modules\projectiles\projectile\reusable\_reusable.dm" #include "code\modules\projectiles\projectile\reusable\arrow.dm" #include "code\modules\projectiles\projectile\reusable\foam_dart.dm" @@ -3255,7 +3247,6 @@ #include "code\modules\research\xenobiology\crossbreeding\stabilized.dm" #include "code\modules\ruins\lavaland_ruin_code.dm" #include "code\modules\ruins\rockplanet_ruin_code.dm" -#include "code\modules\ruins\icemoonruin_code\hotsprings.dm" #include "code\modules\ruins\icemoonruin_code\hydroponicslab.dm" #include "code\modules\ruins\icemoonruin_code\library.dm" #include "code\modules\ruins\icemoonruin_code\wrath.dm" @@ -3315,7 +3306,6 @@ #include "code\modules\spells\spell_types\forcewall.dm" #include "code\modules\spells\spell_types\genetic.dm" #include "code\modules\spells\spell_types\godhand.dm" -#include "code\modules\spells\spell_types\infinite_guns.dm" #include "code\modules\spells\spell_types\inflict_handler.dm" #include "code\modules\spells\spell_types\knock.dm" #include "code\modules\spells\spell_types\lichdom.dm" From 5ee9a62c5b264289b07b81d9bc59b4d5515c960c Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 7 Jun 2024 01:06:51 -0500 Subject: [PATCH 09/18] Automatic changelog generation for PR #2877 [ci skip] --- html/changelogs/AutoChangeLog-pr-2877.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2877.yml diff --git a/html/changelogs/AutoChangeLog-pr-2877.yml b/html/changelogs/AutoChangeLog-pr-2877.yml new file mode 100644 index 000000000000..42882de45c2d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2877.yml @@ -0,0 +1,5 @@ +author: FalloutFalcon +changes: + - {rscdel: Removed alot of magic cruft} + - {code_imp: Sorts gun defines into there own file} +delete-after: true From 6b05aed2790d0a99cf0cd5eabb7aa24e7646ce4f Mon Sep 17 00:00:00 2001 From: Sun-Soaked <45698967+Sun-Soaked@users.noreply.github.com> Date: Fri, 7 Jun 2024 02:06:38 -0400 Subject: [PATCH 10/18] Removes the Scary Comment Errorer (#3082) ## About The Pull Request ![image](https://github.com/shiptest-ss13/Shiptest/assets/45698967/2487a72a-73aa-4bb0-946a-d1ffd645cdd9) this ominous comment kept causing weird non-halting errors. But when you looked away, the errors would dissapear... Bugtesting this has convinced me the line is cursed and made evil by dark energies emanating from rylie so I'm gonna destroy it just to be safe ## Why It's Good For The Game Shiptest.exe creepypasta ## Changelog :cl: fix: removes a comment from apc.dm that was causing strange errors. /:cl: --- code/modules/power/apc.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 3684d5ad8159..f21f95692234 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -217,8 +217,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/power/apc/auto_name, 25) // this allows the APC to be embedded in a wall, yet still inside an area if (building) setDir(ndir) - tdir = dir // to fix Vars bug -//!!!!!!!!!!!!!! FUCK YOU SINGLE LINE OF CODE!! FUCK YOU YOU PIECE OF SHIT!!!!! setDir(SOUTH) + tdir = dir// to fix Vars bug + switch(tdir) if(NORTH) if((pixel_y != initial(pixel_y)) && (pixel_y != 23)) From 5474eac08b7d035bbd28a1bf8ceb8abf780d0c1a Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 7 Jun 2024 01:20:57 -0500 Subject: [PATCH 11/18] Automatic changelog generation for PR #3082 [ci skip] --- html/changelogs/AutoChangeLog-pr-3082.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3082.yml diff --git a/html/changelogs/AutoChangeLog-pr-3082.yml b/html/changelogs/AutoChangeLog-pr-3082.yml new file mode 100644 index 000000000000..fd21b0f418a1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3082.yml @@ -0,0 +1,4 @@ +author: Sun-Soaked +changes: + - {bugfix: removes a comment from apc.dm that was causing strange errors.} +delete-after: true From af3f029fdede9c4b18dfb2fa5848ff165e300798 Mon Sep 17 00:00:00 2001 From: Theos Date: Fri, 7 Jun 2024 04:54:49 -0400 Subject: [PATCH 12/18] Gunslinger fix (#3081) ## About The Pull Request Revolvers no longer clamp their gunslinger spread bonus since negative recoil is applied effectively later ## Why It's Good For The Game This side towards enemy ## Changelog :cl: fix: gunslinger applies its spread reduction effect to revolvers /:cl: Signed-off-by: Theos --- code/modules/projectiles/guns/ballistic/revolver.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index c581c79442de..756a8aa9ca26 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -454,7 +454,6 @@ if(HAS_TRAIT(user, TRAIT_GUNSLINGER)) //gunslinger bonus total_spread += gunslinger_bonus - total_spread = clamp(total_spread,0,INFINITY) return ..(user, total_spread) From 9eae1c08e6f8bc2f15aa166d43dff0a1d66b4899 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 7 Jun 2024 04:06:00 -0500 Subject: [PATCH 13/18] Automatic changelog generation for PR #3081 [ci skip] --- html/changelogs/AutoChangeLog-pr-3081.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3081.yml diff --git a/html/changelogs/AutoChangeLog-pr-3081.yml b/html/changelogs/AutoChangeLog-pr-3081.yml new file mode 100644 index 000000000000..0bdc52c7cfc5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3081.yml @@ -0,0 +1,4 @@ +author: SomeguyManperson +changes: + - {bugfix: gunslinger applies its spread reduction effect to revolvers} +delete-after: true From 3b4e076807df4f6dcfd80ff47b665ae97841d0f9 Mon Sep 17 00:00:00 2001 From: thgvr <81882910+thgvr@users.noreply.github.com> Date: Fri, 7 Jun 2024 13:48:09 -0700 Subject: [PATCH 14/18] [IDB IGNORE]Kepori Visual Overhaul (#2892) ## About The Pull Request KEPORI.... TWO!! ![PEGGLETWO](https://github.com/shiptest-ss13/Shiptest/assets/81882910/834f7caa-909c-44fc-9da1-959af0df189c) ![image](https://github.com/shiptest-ss13/Shiptest/assets/81882910/20990212-0539-4812-985a-d000d83127af) This PR aims mostly for parity with existing Kepori customization. A few customization options were removed as they didn't offer much. Also adds a new "Head Feathers" sprite accessory type so it's not tied to body, as well as cleaning up existing sprite accessories. I believe this iteration of Kepori is closer to the original vision of what they should be, and was held back for various reasons during the past iteration. I've spent a long time on this, and I think it has come out very very well. Credits to `spookypineapple` for his great help during this process. This doesn't include everything for now. I cut out some old jumpsuits that needed updating as I'd have to fully resprite them anyways. Some of them don't even have resprited human versions, so whatever. TODO: Literally everything else (not in this PR) ## Changelog :cl: imageadd: Kepori have been given a full visual overhaul. /:cl: --------- Co-authored-by: retlaw34 <58402542+retlaw34@users.noreply.github.com> Co-authored-by: CoreyLee Hassell --- code/__DEFINES/inventory.dm | 1 - code/__DEFINES/species_clothing_defines.dm | 12 +- code/__HELPERS/global_lists.dm | 1 + code/__HELPERS/mobs.dm | 1 + code/_globalvars/lists/flavor_misc.dm | 1 + code/game/objects/items/storage/backpack.dm | 2 +- code/modules/admin/create_mob.dm | 1 + code/modules/client/preferences.dm | 43 +- code/modules/client/preferences_savefile.dm | 7 +- code/modules/clothing/clothing.dm | 5 +- code/modules/clothing/glasses/hud.dm | 2 - code/modules/clothing/gloves/color.dm | 11 +- code/modules/clothing/gloves/miscellaneous.dm | 2 +- code/modules/clothing/head/helmet.dm | 2 + .../clothing/spacesuits/_spacesuits.dm | 2 +- code/modules/clothing/suits/armor.dm | 6 +- code/modules/clothing/suits/wintercoats.dm | 125 +++-- code/modules/clothing/under/jobs/cargo.dm | 14 +- code/modules/clothing/under/jobs/medical.dm | 2 +- code/modules/clothing/under/skirt_dress.dm | 2 +- code/modules/clothing/under/syndicate.dm | 26 +- .../new_player/sprite_accessories/kepori.dm | 53 ++- .../living/carbon/human/consistent_human.dm | 1 + .../mob/living/carbon/human/species.dm | 17 +- .../carbon/human/species_types/kepori.dm | 77 +++- .../living/carbon/human/species_types/vox.dm | 19 +- .../mob/living/carbon/human/update_icons.dm | 426 ++++++++++++------ .../surgery/bodyparts/robot_bodyparts.dm | 7 - code/modules/surgery/organs/eyes.dm | 3 + icons/blanks/64x64.dmi | Bin 0 -> 219 bytes icons/mob/augmentation/augments_kepori.dmi | Bin 1889 -> 1520 bytes icons/mob/augmentation/augments_keporiOLD.dmi | Bin 0 -> 1889 bytes icons/mob/clothing/species/kepori.dmi | Bin 4392 -> 3541 bytes .../species/kepori/underwear_legs_kepori.dmi | Bin 0 -> 330 bytes .../underwear_legs_keporiOLD.dmi} | Bin .../species/kepori/underwear_socks_kepori.dmi | Bin 0 -> 3276 bytes .../underwear_socks_keporiOLD.dmi} | Bin .../species/kepori/underwear_torso_kepori.dmi | Bin 0 -> 1112 bytes .../underwear_torso_keporiOLD.dmi} | Bin icons/mob/kepori_parts.dmi | Bin 7739 -> 0 bytes icons/mob/species/kepori/bodyparts.dmi | Bin 1368 -> 1480 bytes icons/mob/species/kepori/kepori_eyes.dmi | Bin 0 -> 361 bytes icons/mob/species/kepori/kepori_parts.dmi | Bin 0 -> 2824 bytes .../mob/species/kepori/onmob_belt_kepori.dmi | Bin 182 -> 184 bytes .../species/kepori/onmob_belt_keporiOLD.dmi | Bin 0 -> 182 bytes .../mob/species/kepori/onmob_ears_kepori.dmi | Bin 0 -> 184 bytes .../mob/species/kepori/onmob_eyes_kepori.dmi | Bin 312 -> 366 bytes .../species/kepori/onmob_eyes_keporiOLD.dmi | Bin 0 -> 312 bytes .../mob/species/kepori/onmob_feet_kepori.dmi | Bin 1743 -> 5438 bytes .../species/kepori/onmob_feet_keporiOLD.dmi | Bin 0 -> 1676 bytes .../mob/species/kepori/onmob_hands_kepori.dmi | Bin 393 -> 216 bytes .../species/kepori/onmob_hands_keporiOLD.dmi | Bin 0 -> 393 bytes .../mob/species/kepori/onmob_head_kepori.dmi | Bin 1169 -> 1224 bytes .../species/kepori/onmob_head_keporiOLD.dmi | Bin 0 -> 1164 bytes .../mob/species/kepori/onmob_mask_kepori.dmi | Bin 463 -> 211 bytes .../species/kepori/onmob_mask_keporiOLD.dmi | Bin 0 -> 463 bytes .../mob/species/kepori/onmob_suit_kepori.dmi | Bin 5080 -> 2350 bytes .../species/kepori/onmob_suit_keporiOLD.dmi | Bin 0 -> 5080 bytes .../species/kepori/onmob_uniform_kepori.dmi | Bin 34468 -> 3279 bytes .../kepori/onmob_uniform_keporiOLD.dmi | Bin 0 -> 35309 bytes 60 files changed, 615 insertions(+), 256 deletions(-) create mode 100644 icons/blanks/64x64.dmi create mode 100644 icons/mob/augmentation/augments_keporiOLD.dmi create mode 100644 icons/mob/clothing/underwear/species/kepori/underwear_legs_kepori.dmi rename icons/mob/clothing/underwear/species/{underwear_legs_kepori.dmi => kepori/underwear_legs_keporiOLD.dmi} (100%) create mode 100644 icons/mob/clothing/underwear/species/kepori/underwear_socks_kepori.dmi rename icons/mob/clothing/underwear/species/{underwear_socks_kepori.dmi => kepori/underwear_socks_keporiOLD.dmi} (100%) create mode 100644 icons/mob/clothing/underwear/species/kepori/underwear_torso_kepori.dmi rename icons/mob/clothing/underwear/species/{underwear_torso_kepori.dmi => kepori/underwear_torso_keporiOLD.dmi} (100%) delete mode 100644 icons/mob/kepori_parts.dmi create mode 100644 icons/mob/species/kepori/kepori_eyes.dmi create mode 100644 icons/mob/species/kepori/kepori_parts.dmi create mode 100644 icons/mob/species/kepori/onmob_belt_keporiOLD.dmi create mode 100644 icons/mob/species/kepori/onmob_ears_kepori.dmi create mode 100644 icons/mob/species/kepori/onmob_eyes_keporiOLD.dmi create mode 100644 icons/mob/species/kepori/onmob_feet_keporiOLD.dmi create mode 100644 icons/mob/species/kepori/onmob_hands_keporiOLD.dmi create mode 100644 icons/mob/species/kepori/onmob_head_keporiOLD.dmi create mode 100644 icons/mob/species/kepori/onmob_mask_keporiOLD.dmi create mode 100644 icons/mob/species/kepori/onmob_suit_keporiOLD.dmi create mode 100644 icons/mob/species/kepori/onmob_uniform_keporiOLD.dmi diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index 8cd775c06f77..64aa6aa52627 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -174,5 +174,4 @@ GLOBAL_LIST_INIT(security_wintercoat_allowed, typecacheof(list( /obj/item/tank/internals/plasmaman, /obj/item/toy))) -//WS Port - Internals checker #define GET_INTERNAL_SLOTS(C) list(C.head, C.wear_mask) diff --git a/code/__DEFINES/species_clothing_defines.dm b/code/__DEFINES/species_clothing_defines.dm index c74a20877348..517579192634 100644 --- a/code/__DEFINES/species_clothing_defines.dm +++ b/code/__DEFINES/species_clothing_defines.dm @@ -31,12 +31,12 @@ #define KEPORI_UNIFORM_PATH 'icons/mob/species/kepori/onmob_uniform_kepori.dmi' #define KEPORI_SHOES_PATH 'icons/mob/species/kepori/onmob_feet_kepori.dmi' #define KEPORI_SUIT_PATH 'icons/mob/species/kepori/onmob_suit_kepori.dmi' -//#define KEPORI_EARS_PATH 'icons/mob/species/kepori/onmob_ears_kepori.dmi' +#define KEPORI_EARS_PATH 'icons/mob/species/kepori/onmob_ears_kepori.dmi' #define KEPORI_MASK_PATH 'icons/mob/species/kepori/onmob_mask_kepori.dmi' #define KEPORI_HEAD_PATH 'icons/mob/species/kepori/onmob_head_kepori.dmi' +#define KEPORI_GLASSES_PATH 'icons/mob/species/kepori/onmob_eyes_kepori.dmi' #define KEPORI_GLOVES_PATH 'icons/mob/species/kepori/onmob_hands_kepori.dmi' -//#define KEPORI_BELT_PATH 'icons/mob/species/kepori/onmob_belt_kepori.dmi' -//#define KEPORI_GLASSES_PATH 'icons/mob/species/kepori/onmob_eyes_kepori.dmi' -#define KEPORI_UNDERWEAR_TORSO_PATH 'icons/mob/clothing/underwear/species/underwear_torso_kepori.dmi' -#define KEPORI_UNDERWEAR_LEGS_PATH 'icons/mob/clothing/underwear/species/underwear_legs_kepori.dmi' -#define KEPORI_UNDERWEAR_SOCKS_PATH 'icons/mob/clothing/underwear/species/underwear_socks_kepori.dmi' +#define KEPORI_BELT_PATH 'icons/mob/species/kepori/onmob_belt_kepori.dmi' +#define KEPORI_UNDERWEAR_TORSO_PATH 'icons/mob/clothing/underwear/species/kepori/underwear_torso_kepori.dmi' +#define KEPORI_UNDERWEAR_LEGS_PATH 'icons/mob/clothing/underwear/species/kepori/underwear_legs_kepori.dmi' +#define KEPORI_UNDERWEAR_SOCKS_PATH 'icons/mob/clothing/underwear/species/kepori/underwear_socks_kepori.dmi' diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index e44755574eea..5eb2686b2118 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -42,6 +42,7 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/spider_spinneret, GLOB.spider_spinneret_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/kepori_feathers, GLOB.kepori_feathers_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/kepori_body_feathers, GLOB.kepori_body_feathers_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/kepori_head_feathers, GLOB.kepori_head_feathers_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/kepori_tail_feathers, GLOB.kepori_tail_feathers_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/vox_head_quills, GLOB.vox_head_quills_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/vox_neck_quills, GLOB.vox_neck_quills_list) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 63990e61ee33..6a3028443dcc 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -108,6 +108,7 @@ "ipc_chassis" = pick(GLOB.ipc_chassis_list), "ipc_screen" = pick(GLOB.ipc_screens_list), "kepori_body_feathers" = pick(GLOB.kepori_body_feathers_list), + "kepori_head_feathers" = pick(GLOB.kepori_head_feathers_list), "kepori_feathers" = pick(GLOB.kepori_feathers_list), "kepori_tail_feathers" = pick(GLOB.kepori_tail_feathers_list), "legs" = "Normal Legs", diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index f4f000be6d57..f9edbc500142 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -46,6 +46,7 @@ GLOBAL_LIST_EMPTY(spider_legs_list) GLOBAL_LIST_EMPTY(spider_spinneret_list) GLOBAL_LIST_EMPTY(kepori_feathers_list) GLOBAL_LIST_EMPTY(kepori_body_feathers_list) +GLOBAL_LIST_EMPTY(kepori_head_feathers_list) GLOBAL_LIST_EMPTY(kepori_tail_feathers_list) GLOBAL_LIST_EMPTY(vox_head_quills_list) GLOBAL_LIST_EMPTY(vox_neck_quills_list) diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index f8bb97d3a411..5d87b42b78e5 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -226,7 +226,7 @@ /obj/item/storage/backpack/satchel/leather name = "leather satchel" desc = "It's a very fancy satchel made with fine leather." - icon = 'icons/obj/storage.dmi' //WS Edit - Suitcases + icon = 'icons/obj/storage.dmi' icon_state = "satchel" item_state = "satchel" diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm index 7d5dfccf2804..3b8c5191c9b6 100644 --- a/code/modules/admin/create_mob.dm +++ b/code/modules/admin/create_mob.dm @@ -42,6 +42,7 @@ H.dna.features["squid_face"] = pick(GLOB.squid_face_list) H.dna.features["kepori_feathers"] = pick(GLOB.kepori_feathers_list) H.dna.features["kepori_body_feathers"] = pick(GLOB.kepori_body_feathers_list) + H.dna.features["kepori_head_feathers"] = pick(GLOB.kepori_head_feathers_list) H.dna.features["vox_head_quills"] = pick(GLOB.vox_head_quills_list) H.dna.features["vox_neck_quills"] = pick(GLOB.vox_neck_quills_list) H.dna.features["elzu_horns"] = pick(GLOB.elzu_horns_list) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 662a549ca631..b9a4fb8f0ca3 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -114,9 +114,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) "ipc_tail" = "None", "ipc_chassis" = "Morpheus Cyberkinetics (Custom)", "ipc_brain" = "Posibrain", - "kepori_feathers" = "Plain", - "kepori_body_feathers" = "Plain", - "kepori_tail_feathers" = "Fan", + "kepori_feathers" = "None", + "kepori_body_feathers" = "None", + "kepori_head_feathers" = "None", + "kepori_tail_feathers" = "None", "vox_head_quills" = "Plain", "vox_neck_quills" = "Plain", "elzu_horns" = "None", @@ -244,7 +245,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) return #define APPEARANCE_CATEGORY_COLUMN "" -#define MAX_MUTANT_ROWS 4 +#define MAX_MUTANT_ROWS 5 /datum/preferences/proc/ShowChoices(mob/user) show_loadout = (current_tab != 1) ? show_loadout : FALSE @@ -728,6 +729,19 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "" mutant_category = 0 + if("kepori_head_feathers" in pref_species.default_features) + if(!mutant_category) + dat += APPEARANCE_CATEGORY_COLUMN + + dat += "

Head Feathers

" + dat += "[features["kepori_head_feathers"]]
" + dat += "    Change
" + + mutant_category++ + if(mutant_category >= MAX_MUTANT_ROWS) + dat += "" + mutant_category = 0 + if("kepori_body_feathers" in pref_species.default_features) if(!mutant_category) dat += APPEARANCE_CATEGORY_COLUMN @@ -836,10 +850,17 @@ GLOBAL_LIST_EMPTY(preferences_datums) //Adds a thing to select which phobia because I can't be assed to put that in the quirks window if("Phobia" in all_quirks) + if(!mutant_category) + dat += APPEARANCE_CATEGORY_COLUMN dat += "

Phobia

" dat += "[phobia]
" + mutant_category++ + if(mutant_category >= MAX_MUTANT_ROWS) + dat += "" + mutant_category = 0 + if("Smoker" in all_quirks) dat += "

Smoker

" @@ -853,6 +874,14 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "[features["body_size"]]
" + mutant_category++ + if(mutant_category >= MAX_MUTANT_ROWS) + dat += "" + mutant_category = 0 + + if(generic_adjective) + if(!mutant_category) + dat += APPEARANCE_CATEGORY_COLUMN dat += "

Character Adjective

" @@ -1970,6 +1999,12 @@ GLOBAL_LIST_EMPTY(preferences_datums) if (new_kepori_feathers) features["kepori_feathers"] = new_kepori_feathers + if("kepori_head_feathers") + var/new_kepori_feathers + new_kepori_feathers = input(user, "Choose your character's head feathers:", "Character Preference") as null|anything in GLOB.kepori_head_feathers_list + if (new_kepori_feathers) + features["kepori_head_feathers"] = new_kepori_feathers + if("kepori_body_feathers") var/new_kepori_feathers new_kepori_feathers = input(user, "Choose your character's body feathers:", "Character Preference") as null|anything in GLOB.kepori_body_feathers_list diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index b53d761c41da..3c3040f03906 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -438,6 +438,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car READ_FILE(S["feature_ipc_brain"], features["ipc_brain"]) READ_FILE(S["feature_kepori_feathers"], features["kepori_feathers"]) READ_FILE(S["feature_kepori_body_feathers"], features["kepori_body_feathers"]) + READ_FILE(S["feature_kepori_head_feathers"], features["kepori_head_feathers"]) READ_FILE(S["feature_kepori_tail_feathers"], features["kepori_tail_feathers"]) READ_FILE(S["feature_vox_head_quills"], features["vox_head_quills"]) READ_FILE(S["feature_vox_neck_quills"], features["vox_neck_quills"]) @@ -548,8 +549,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car features["ipc_chassis"] = sanitize_inlist(features["ipc_chassis"], GLOB.ipc_chassis_list) features["ipc_brain"] = sanitize_inlist(features["ipc_brain"], GLOB.ipc_brain_list) features["kepori_feathers"] = sanitize_inlist(features["kepori_feathers"], GLOB.kepori_feathers_list, "Plain") - features["kepori_body_feathers"] = sanitize_inlist(features["kepori_body_feathers"], GLOB.kepori_body_feathers_list, "Plain") - features["kepori_tail_feathers"] = sanitize_inlist(features["kepori_tail_feathers"], GLOB.kepori_tail_feathers_list, "Fan") + features["kepori_body_feathers"] = sanitize_inlist(features["kepori_body_feathers"], GLOB.kepori_body_feathers_list, "None") + features["kepori_head_feathers"] = sanitize_inlist(features["kepori_head_feathers"], GLOB.kepori_head_feathers_list, "None") + features["kepori_tail_feathers"] = sanitize_inlist(features["kepori_tail_feathers"], GLOB.kepori_tail_feathers_list, "None") features["vox_head_quills"] = sanitize_inlist(features["vox_head_quills"], GLOB.vox_head_quills_list, "None") features["vox_neck_quills"] = sanitize_inlist(features["vox_neck_quills"], GLOB.vox_neck_quills_list, "None") features["elzu_horns"] = sanitize_inlist(features["elzu_horns"], GLOB.elzu_horns_list) @@ -629,6 +631,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["feature_ipc_brain"] , features["ipc_brain"]) WRITE_FILE(S["feature_kepori_feathers"] , features["kepori_feathers"]) WRITE_FILE(S["feature_kepori_body_feathers"], features["kepori_body_feathers"]) + WRITE_FILE(S["feature_kepori_head_feathers"], features["feature_kepori_head_feathers"]) WRITE_FILE(S["feature_kepori_tail_feathers"], features["kepori_tail_feathers"]) WRITE_FILE(S["feature_vox_head_quills"] , features["vox_head_quills"]) WRITE_FILE(S["feature_vox_neck_quills"] , features["vox_neck_quills"]) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index b1e1cc1f2105..166f437dc3af 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -286,7 +286,7 @@ if("[layer]" in mob_species.offset_clothing) // This code taken from Baystation 12 - var/icon/final_I = icon('icons/blanks/32x32.dmi', "nothing") + var/icon/final_I = icon('icons/blanks/64x64.dmi', "nothing") var/list/shifts = mob_species.offset_clothing["[layer]"] // Apply all pixel shifts for each direction. @@ -294,9 +294,10 @@ var/list/facing_list = shifts[shift_facing] var/use_dir = text2num(shift_facing) var/icon/equip = icon(file2use, icon_state = state2use, dir = use_dir) - var/icon/canvas = icon('icons/blanks/32x32.dmi', "nothing") + var/icon/canvas = icon('icons/blanks/64x64.dmi', "nothing") canvas.Blend(equip, ICON_OVERLAY, facing_list["x"]+1, facing_list["y"]+1) final_I.Insert(canvas, dir = use_dir) + final_I = fcopy_rsc(final_I) GLOB.species_clothing_icons[mob_species.id]["[file2use]-[state2use]"] = final_I return TRUE diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 385baa647432..0698981207bf 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -248,7 +248,6 @@ tint = 1 glass_colour_type = /datum/client_colour/glass_colour/gray - /obj/item/clothing/glasses/hud/spacecop/hidden // for the undercover cop name = "sunglasses" desc = "These sunglasses are special, and let you view potential criminals." @@ -274,4 +273,3 @@ desc = "A heads-up display that scans the humanoids in view and provides accurate data about their ID status and security records. This pair also corrects nearsightedness." icon_state = "prescriptionsecurityhud" vision_correction = 1 - diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index 06bd05a45795..cbac3e0e8901 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -220,7 +220,7 @@ icon_state = "nitrile" transfer_prints = FALSE carrytrait = TRAIT_QUICKER_CARRY - supports_variations = KEPORI_VARIATION + //supports_variations = KEPORI_VARIATION /obj/item/clothing/gloves/color/latex/nitrile/evil name = "red nitrile gloves" @@ -240,10 +240,8 @@ desc = "Overdesigned engineering gloves that have automated construction subrutines dialed in, allowing for faster construction while worn." icon = 'icons/obj/clothing/clockwork_garb.dmi' icon_state = "clockwork_gauntlets" - siemens_coefficient = 0 //WS Station eddit "Tinkers Gloves Insuls" - permeability_coefficient = 0.05 //WS Station eddit "Tinkers Gloves Insuls" - //siemens_coefficient = 0.8 WS Station eddit "Tinkers Gloves Insuls" - //permeability_coefficient = 0.3 WS Station eddit "Tinkers Gloves Insuls" + siemens_coefficient = 0 + permeability_coefficient = 0.05 carrytrait = TRAIT_QUICK_BUILD custom_materials = list(/datum/material/iron=2000, /datum/material/silver=1500, /datum/material/gold = 1000) @@ -276,7 +274,8 @@ /obj/item/clothing/gloves/color/light_brown = 1, /obj/item/clothing/gloves/color/brown = 1, /obj/item/clothing/gloves/color/white = 1, - /obj/item/clothing/gloves/color/rainbow = 1) + /obj/item/clothing/gloves/color/rainbow = 1, + ) /obj/item/clothing/gloves/maid name = "maid arm covers" diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 314af8aaf44a..9d8db3c035d8 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -38,7 +38,7 @@ max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT resistance_flags = NONE armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50) - supports_variations = KEPORI_VARIATION + //supports_variations = KEPORI_VARIATION /obj/item/clothing/gloves/combat/maid name = "combat maid sleeves" diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index dee6b0d0c9ee..6648f6341196 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -500,6 +500,7 @@ icon_state = "inteq_swat" item_state = "inteq_swat" flags_inv = HIDEHAIR + supports_variations = KEPORI_VARIATION content_overlays = TRUE /obj/item/clothing/head/helmet/inteq @@ -508,6 +509,7 @@ icon_state = "inteq_helmet" icon_state = "inteq_helmet" can_flashlight = TRUE + supports_variations = KEPORI_VARIATION content_overlays = TRUE /obj/item/clothing/head/solgov diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm index bd1817e1bf45..cb98f607089c 100644 --- a/code/modules/clothing/spacesuits/_spacesuits.dm +++ b/code/modules/clothing/spacesuits/_spacesuits.dm @@ -40,7 +40,7 @@ slowdown = 1 armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 50, "fire" = 80, "acid" = 70) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT - cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS + cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 889bcc0420f2..47ce052d5bec 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -34,7 +34,7 @@ desc = "A Type I armored vest that provides decent protection against most types of damage." icon_state = "armor_alt" item_state = "armoralt" - supports_variations = KEPORI_VARIATION + //supports_variations = KEPORI_VARIATION /obj/item/clothing/suit/armor/vest/marine name = "light tactical armor vest" @@ -326,7 +326,7 @@ desc = "A luxurious brown coat made from a crossweave of kevlar and ballistic fibre, the collar and wrist trims are made from genuine wolf fur. as protective as it is stylish." icon_state = "armor_inteq_battlecoat" item_state = "inteq_battlecoat" - supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION /obj/item/clothing/suit/armor/hos/inteq/honorable //Basically CC higherup clothing for inteq name = "honorable vanguard battlecoat" @@ -334,7 +334,7 @@ icon_state = "armor_inteq_honorable_battlecoat" item_state = "inteq_honorable_battlecoat" armor = list("melee" = 40, "bullet" = 50, "laser" = 50, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 90) - supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON /obj/item/clothing/suit/armor/inteq/corpsman name = "inteq corpsman vest" diff --git a/code/modules/clothing/suits/wintercoats.dm b/code/modules/clothing/suits/wintercoats.dm index 588a8f1600de..9b141148e5a2 100644 --- a/code/modules/clothing/suits/wintercoats.dm +++ b/code/modules/clothing/suits/wintercoats.dm @@ -1,5 +1,7 @@ // WINTER COATS +//Someone please make the allowed lists globals or something + /obj/item/clothing/suit/hooded/wintercoat name = "winter coat" desc = "A heavy jacket made from 'synthetic' animal furs." @@ -10,14 +12,14 @@ body_parts_covered = CHEST|GROIN|ARMS cold_protection = CHEST|GROIN|ARMS min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0) - allowed = list( /obj/item/flashlight, - /obj/item/tank/internals/emergency_oxygen, - /obj/item/tank/internals/plasmaman, - /obj/item/toy, - /obj/item/storage/fancy/cigarettes, - /obj/item/lighter, - ) + allowed = list( + /obj/item/flashlight, + /obj/item/tank/internals/emergency_oxygen, + /obj/item/tank/internals/plasmaman, + /obj/item/toy, + /obj/item/storage/fancy/cigarettes, + /obj/item/lighter, + ) /obj/item/clothing/head/hooded/winterhood name = "winter hood" @@ -29,13 +31,11 @@ cold_protection = HEAD min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT flags_inv = HIDEHAIR|HIDEEARS - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0) /obj/item/clothing/suit/hooded/wintercoat/captain name = "captain's winter coat" icon_state = "coatcaptain" item_state = "coatcaptain" - armor = list("melee" = 25, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50) hoodtype = /obj/item/clothing/head/hooded/winterhood/captain /obj/item/clothing/suit/hooded/wintercoat/captain/Initialize() @@ -44,13 +44,11 @@ /obj/item/clothing/head/hooded/winterhood/captain icon_state = "hood_captain" - armor = list("melee" = 25, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50) /obj/item/clothing/suit/hooded/wintercoat/security name = "security winter coat" icon_state = "coatsecurity" item_state = "coatsecurity" - armor = list("melee" = 25, "bullet" = 15, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45) hoodtype = /obj/item/clothing/head/hooded/winterhood/security /obj/item/clothing/suit/hooded/wintercoat/security/Initialize() @@ -59,19 +57,37 @@ /obj/item/clothing/head/hooded/winterhood/security icon_state = "hood_security" - armor = list("melee" = 25, "bullet" = 15, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45) /obj/item/clothing/suit/hooded/wintercoat/medical name = "medical winter coat" icon_state = "coatmedical" item_state = "coatmedical" - allowed = list(/obj/item/analyzer, /obj/item/sensor_device, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 45) hoodtype = /obj/item/clothing/head/hooded/winterhood/medical + allowed = list( + /obj/item/analyzer, + /obj/item/sensor_device, + /obj/item/stack/medical, + /obj/item/dnainjector, + /obj/item/reagent_containers/dropper, + /obj/item/reagent_containers/syringe, + /obj/item/reagent_containers/hypospray, + /obj/item/healthanalyzer, + /obj/item/flashlight/pen, + /obj/item/reagent_containers/glass/bottle, + /obj/item/reagent_containers/glass/beaker, + /obj/item/reagent_containers/pill, + /obj/item/storage/pill_bottle, + /obj/item/paper, + /obj/item/melee/classic_baton/telescopic, + /obj/item/toy, + /obj/item/storage/fancy/cigarettes, + /obj/item/lighter, + /obj/item/tank/internals/emergency_oxygen, + /obj/item/tank/internals/plasmaman, + ) /obj/item/clothing/head/hooded/winterhood/medical icon_state = "hood_medical" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 45) /obj/item/clothing/suit/hooded/wintercoat/medical/paramedic name = "paramedic winter coat" @@ -86,25 +102,52 @@ name = "science winter coat" icon_state = "coatscience" item_state = "coatscience" - allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) hoodtype = /obj/item/clothing/head/hooded/winterhood/science + allowed = list( + /obj/item/analyzer, + /obj/item/stack/medical, + /obj/item/dnainjector, + /obj/item/reagent_containers/dropper, + /obj/item/reagent_containers/syringe, + /obj/item/reagent_containers/hypospray, + /obj/item/healthanalyzer, + /obj/item/flashlight/pen, + /obj/item/reagent_containers/glass/bottle, + /obj/item/reagent_containers/glass/beaker, + /obj/item/reagent_containers/pill, + /obj/item/storage/pill_bottle, + /obj/item/paper, + /obj/item/melee/classic_baton/telescopic, + /obj/item/toy, + /obj/item/storage/fancy/cigarettes, + /obj/item/lighter, + /obj/item/tank/internals/emergency_oxygen, + /obj/item/tank/internals/plasmaman, + ) /obj/item/clothing/head/hooded/winterhood/science icon_state = "hood_science" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) /obj/item/clothing/suit/hooded/wintercoat/engineering name = "engineering winter coat" icon_state = "coatengineer" item_state = "coatengineer" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 20, "fire" = 30, "acid" = 45) - allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/t_scanner, /obj/item/construction/rcd, /obj/item/pipe_dispenser, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) hoodtype = /obj/item/clothing/head/hooded/winterhood/engineering + allowed = list( + /obj/item/flashlight, + /obj/item/tank/internals/emergency_oxygen, + /obj/item/tank/internals/plasmaman, + /obj/item/t_scanner, + /obj/item/construction/rcd, + /obj/item/pipe_dispenser, + /obj/item/toy, + /obj/item/storage/fancy/cigarettes, + /obj/item/lighter, + ) + /obj/item/clothing/head/hooded/winterhood/engineering icon_state = "hood_engineer" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 20, "fire" = 30, "acid" = 45) /obj/item/clothing/suit/hooded/wintercoat/engineering/atmos name = "atmospherics winter coat" @@ -119,8 +162,22 @@ name = "hydroponics winter coat" icon_state = "coathydro" item_state = "coathydro" - allowed = list(/obj/item/reagent_containers/spray/plantbgone, /obj/item/plant_analyzer, /obj/item/seeds, /obj/item/reagent_containers/glass/bottle, /obj/item/cultivator, /obj/item/reagent_containers/spray/pestspray, /obj/item/hatchet, /obj/item/storage/bag/plants, /obj/item/toy, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) hoodtype = /obj/item/clothing/head/hooded/winterhood/hydro + allowed = list( + /obj/item/reagent_containers/spray/plantbgone, + /obj/item/plant_analyzer, + /obj/item/seeds, + /obj/item/reagent_containers/glass/bottle, + /obj/item/cultivator, + /obj/item/reagent_containers/spray/pestspray, + /obj/item/hatchet, + /obj/item/storage/bag/plants, + /obj/item/toy, + /obj/item/tank/internals/emergency_oxygen, + /obj/item/tank/internals/plasmaman, + /obj/item/storage/fancy/cigarettes, + /obj/item/lighter, + ) /obj/item/clothing/head/hooded/winterhood/hydro icon_state = "hood_hydro" @@ -138,13 +195,18 @@ name = "mining winter coat" icon_state = "coatminer" item_state = "coatminer" - allowed = list(/obj/item/pickaxe, /obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) - armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) hoodtype = /obj/item/clothing/head/hooded/winterhood/miner + allowed = list( + /obj/item/pickaxe, + /obj/item/flashlight, + /obj/item/tank/internals/emergency_oxygen, + /obj/item/toy, + /obj/item/storage/fancy/cigarettes, + /obj/item/lighter, + ) /obj/item/clothing/head/hooded/winterhood/miner icon_state = "hood_miner" - armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) // Inteq @@ -154,18 +216,17 @@ icon_state = "coatinteq" item_state = "coatinteq" hoodtype = /obj/item/clothing/head/hooded/winterhood/security/inteq - supports_variations = KEPORI_VARIATION + //supports_variations = KEPORI_VARIATION /obj/item/clothing/head/hooded/winterhood/security/inteq icon_state = "hood_inteq" - supports_variations = KEPORI_VARIATION + //supports_variations = KEPORI_VARIATION /obj/item/clothing/suit/hooded/wintercoat/security/inteq/alt name = "inteq hooded coat" desc = "A hooded coat with a fur trim around the hood, comfy! It has a small 'IRMG' embroidered onto the shoulder." icon_state = "coatinteq_alt" item_state = "coatinteq_alt" - armor = list("melee" = 25, "bullet" = 15, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45) hoodtype = /obj/item/clothing/head/hooded/winterhood/security/inteq/alt /obj/item/clothing/head/hooded/winterhood/security/inteq/alt @@ -173,15 +234,14 @@ desc = "A comfortable looking brown hood." icon_state = "hood_inteq_alt" item_state = "hood_inteq_alt" - armor = list("melee" = 25, "bullet" = 15, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45) // CentCom + /obj/item/clothing/suit/hooded/wintercoat/centcom name = "centcom winter coat" desc = "A luxurious winter coat woven in the bright green and gold colours of Central Command. It has a small pin in the shape of the Nanotrasen logo for a zipper." icon_state = "coatcentcom" item_state = "coatcentcom" - armor = list("melee" = 35, "bullet" = 40, "laser" = 40, "energy" = 50, "bomb" = 35, "bio" = 10, "rad" = 10, "fire" = 10, "acid" = 60) hoodtype = /obj/item/clothing/head/hooded/winterhood/centcom /obj/item/clothing/suit/hooded/wintercoat/centcom/Initialize(mapload) @@ -190,7 +250,6 @@ /obj/item/clothing/head/hooded/winterhood/centcom icon_state = "hood_centcom" - armor = list("melee" = 35, "bullet" = 40, "laser" = 40, "energy" = 50, "bomb" = 35, "bio" = 10, "rad" = 10, "fire" = 10, "acid" = 60) // SolGov @@ -199,9 +258,7 @@ desc = "An environment-resistant wintercoat in the colors of the Solarian Confederation." icon_state = "coatsolgov" item_state = "coatsolgov" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 20, "fire" = 30, "acid" = 45) hoodtype = /obj/item/clothing/head/hooded/winterhood/solgov /obj/item/clothing/head/hooded/winterhood/solgov icon_state = "hood_solgov" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 20, "fire" = 30, "acid" = 45) diff --git a/code/modules/clothing/under/jobs/cargo.dm b/code/modules/clothing/under/jobs/cargo.dm index 2341da5567a9..0af578bfd452 100644 --- a/code/modules/clothing/under/jobs/cargo.dm +++ b/code/modules/clothing/under/jobs/cargo.dm @@ -1,7 +1,7 @@ /obj/item/clothing/under/rank/cargo icon = 'icons/obj/clothing/under/cargo.dmi' mob_overlay_icon = 'icons/mob/clothing/under/cargo.dmi' - supports_variations = KEPORI_VARIATION + //supports_variations = KEPORI_VARIATION /obj/item/clothing/under/rank/cargo/qm name = "quartermaster's jumpsuit" @@ -16,7 +16,7 @@ item_state = "lb_suit" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE - supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION /obj/item/clothing/under/rank/cargo/tech name = "cargo technician's jumpsuit" @@ -24,7 +24,7 @@ icon_state = "cargotech" item_state = "lb_suit" body_parts_covered = CHEST|GROIN|ARMS - supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION alt_covers_chest = TRUE /obj/item/clothing/under/rank/cargo/tech/skirt @@ -33,7 +33,7 @@ icon_state = "cargo_skirt" item_state = "lb_suit" body_parts_covered = CHEST|GROIN|ARMS - supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION can_adjust = FALSE /obj/item/clothing/under/rank/cargo/miner @@ -43,7 +43,7 @@ item_state = "miner" armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 0) resistance_flags = NONE - supports_variations = KEPORI_VARIATION + //supports_variations = KEPORI_VARIATION /obj/item/clothing/under/rank/cargo/miner/lavaland desc = "A light uniform for operating in hazardous environments, manufactured en-masse by EXOCOM for the profitable frontier prospector market. Adventurous khaki jeans included." @@ -51,14 +51,14 @@ icon_state = "explorer" item_state = "explorer" can_adjust = TRUE - supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION /obj/item/clothing/under/rank/cargo/miner/hazard desc = "A thick jumpsuit with reflective stripes for hazardous, low-visibility environments. It's coated in a thick layer of asteroid dust." name = "asteroid miner's jumpsuit" icon_state = "hazard" item_state = "hazard" - supports_variations = DIGITIGRADE_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION /obj/item/clothing/under/rank/cargo/miner/lavaland/old icon_state = "explorerold" diff --git a/code/modules/clothing/under/jobs/medical.dm b/code/modules/clothing/under/jobs/medical.dm index bf462c7fda4d..183e957d2338 100644 --- a/code/modules/clothing/under/jobs/medical.dm +++ b/code/modules/clothing/under/jobs/medical.dm @@ -174,7 +174,7 @@ desc = "A light white gown that allows easy access to any patient who wears this." icon_state = "gownwhite" item_state = "gownwhite" - supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION can_adjust = FALSE /obj/item/clothing/under/rank/medical/gown/green diff --git a/code/modules/clothing/under/skirt_dress.dm b/code/modules/clothing/under/skirt_dress.dm index 1dabceb6db24..f74748f71fbb 100644 --- a/code/modules/clothing/under/skirt_dress.dm +++ b/code/modules/clothing/under/skirt_dress.dm @@ -93,4 +93,4 @@ desc = "A pretty red dress with big pink ribbons attached. Intended to be worn by Kepori cosplayers, but also fits other species." icon_state = "rilena_dress" item_state = "rilena_dress" - supports_variations = KEPORI_VARIATION + //supports_variations = KEPORI_VARIATION diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm index 9eb76ee6bf5e..85c9996489e2 100644 --- a/code/modules/clothing/under/syndicate.dm +++ b/code/modules/clothing/under/syndicate.dm @@ -7,7 +7,7 @@ alt_covers_chest = TRUE icon = 'icons/obj/clothing/under/syndicate.dmi' mob_overlay_icon = 'icons/mob/clothing/under/syndicate.dmi' - supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION /obj/item/clothing/under/syndicate/skirt name = "tactical skirtleneck" @@ -17,7 +17,7 @@ armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40) alt_covers_chest = TRUE can_adjust = FALSE - supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION /obj/item/clothing/under/syndicate/bloodred name = "blood-red sneaksuit" @@ -27,7 +27,7 @@ armor = list("melee" = 10, "bullet" = 10, "laser" = 10,"energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 50, "acid" = 40) resistance_flags = FIRE_PROOF | ACID_PROOF can_adjust = FALSE - supports_variations = DIGITIGRADE_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION /obj/item/clothing/under/syndicate/bloodred/sleepytime name = "blood-red pajamas" @@ -35,7 +35,7 @@ icon_state = "bloodred_pajamas" item_state = "bl_suit" armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40) - supports_variations = DIGITIGRADE_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION /obj/item/clothing/under/syndicate/tacticool name = "tacticool turtleneck" @@ -43,7 +43,7 @@ icon_state = "tactifool" item_state = "bl_suit" armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40) - supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION /obj/item/clothing/under/syndicate/tacticool/skirt name = "tacticool skirtleneck" @@ -52,7 +52,7 @@ item_state = "bl_suit" armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40) can_adjust = FALSE - supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON /obj/item/clothing/under/syndicate/sniper name = "Tactical turtleneck suit" @@ -75,7 +75,7 @@ desc = "With a suit lined with this many pockets, you are ready to operate." icon_state = "syndicate_combat" can_adjust = FALSE - supports_variations = DIGITIGRADE_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION /obj/item/clothing/under/syndicate/rus_army name = "advanced military tracksuit" @@ -100,7 +100,7 @@ can_adjust = FALSE armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40) alt_covers_chest = TRUE - supports_variations = DIGITIGRADE_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION /obj/item/clothing/under/syndicate/cybersun name = "cybersun jumpsuit" @@ -115,7 +115,7 @@ icon_state = "cybersun" armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 100) alt_covers_chest = TRUE - supports_variations = DIGITIGRADE_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION /obj/item/clothing/under/syndicate/cybersun/officer name = "cybersun officer's suit" @@ -130,7 +130,7 @@ icon_state = "cybersun_med" permeability_coefficient = 0.5 armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0) - supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION /obj/item/clothing/under/syndicate/medic/skirt name = "Cybersun medical jumpskirt" @@ -138,7 +138,7 @@ icon_state = "cybersun_med_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE - supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION /obj/item/clothing/under/syndicate/donk name = "Donk! Co. employee uniform" @@ -148,14 +148,14 @@ armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40) body_parts_covered = CHEST|GROIN|ARMS alt_covers_chest = TRUE - supports_variations = DIGITIGRADE_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION /obj/item/clothing/under/syndicate/donk/qm name = "Donk! Co. manager uniform" desc = "The standard uniform of Donk Co. managers. Direct all complaints here." icon_state = "donk_qm" body_parts_covered = CHEST|GROIN|LEGS|ARMS - supports_variations = DIGITIGRADE_VARIATION | KEPORI_VARIATION + supports_variations = DIGITIGRADE_VARIATION /obj/item/clothing/suit/hazardvest/donk name = "Donk! Co. employee vest" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/kepori.dm b/code/modules/mob/dead/new_player/sprite_accessories/kepori.dm index 4ed949c63ef8..9fd4579e46f8 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/kepori.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/kepori.dm @@ -1,10 +1,9 @@ -//Kepori mutant parts - -//Start head feathers +// "Hair" feathers /datum/sprite_accessory/kepori_feathers color_src = HAIR - icon = 'icons/mob/kepori_parts.dmi' + body_zone = BODY_ZONE_HEAD + icon = 'icons/mob/species/kepori/kepori_parts.dmi' /datum/sprite_accessory/kepori_feathers/none name = "None" @@ -37,10 +36,6 @@ name = "Spikey" icon_state = "spikey" -/datum/sprite_accessory/kepori_feathers/soap - name = "Soap" - icon_state = "soap" - /datum/sprite_accessory/kepori_feathers/crowned name = "Crowned" icon_state = "crowned" @@ -57,40 +52,60 @@ name = "Bun" icon_state = "bun" -//Start body feathers +// Head/Face feathers + +/datum/sprite_accessory/kepori_head_feathers + color_src = MUTCOLORS_SECONDARY + body_zone = BODY_ZONE_HEAD + icon = 'icons/mob/species/kepori/kepori_parts.dmi' + +/datum/sprite_accessory/kepori_head_feathers/none + name = "None" + +/datum/sprite_accessory/kepori_head_feathers/full + name = "Full" + icon_state = "full" + +/datum/sprite_accessory/kepori_head_feathers/half + name = "Half" + icon_state = "half" + +// Body feathers /datum/sprite_accessory/kepori_body_feathers color_src = MUTCOLORS_SECONDARY - icon = 'icons/mob/kepori_parts.dmi' + body_zone = BODY_ZONE_CHEST + icon = 'icons/mob/species/kepori/kepori_parts.dmi' /datum/sprite_accessory/kepori_body_feathers/none name = "None" -/datum/sprite_accessory/kepori_body_feathers/aftik - name = "Aftik" - icon_state = "aftik" - /datum/sprite_accessory/kepori_body_feathers/belly name = "Belly" icon_state = "belly" -/datum/sprite_accessory/kepori_body_feathers/shirt - name = "Shirt" - icon_state = "shirt" +/datum/sprite_accessory/kepori_body_feathers/belly_wings + name = "Belly + Wings" + icon_state = "bwings" /datum/sprite_accessory/kepori_body_feathers/soap name = "Soap" icon_state = "soap" +/datum/sprite_accessory/kepori_body_feathers/soap_wings + name = "Soap + Wings" + icon_state = "swings" + /datum/sprite_accessory/kepori_body_feathers/wings name = "Wings" icon_state = "wings" -//Start tail feathers +// Tail feathers /datum/sprite_accessory/kepori_tail_feathers color_src = MUTCOLORS_SECONDARY - icon = 'icons/mob/kepori_parts.dmi' + body_zone = BODY_ZONE_CHEST + icon = 'icons/mob/species/kepori/kepori_parts.dmi' /datum/sprite_accessory/kepori_tail_feathers/none name = "None" diff --git a/code/modules/mob/living/carbon/human/consistent_human.dm b/code/modules/mob/living/carbon/human/consistent_human.dm index e63adffeee48..86e6e08c4367 100644 --- a/code/modules/mob/living/carbon/human/consistent_human.dm +++ b/code/modules/mob/living/carbon/human/consistent_human.dm @@ -31,6 +31,7 @@ dna.features["spider_spinneret"] = GLOB.spider_spinneret_list[hex2num(copytext(seed, 11, 12)) % length(GLOB.spider_spinneret_list) + 1] dna.features["kepori_feathers"] = GLOB.kepori_feathers_list[hex2num(copytext(seed, 12, 13)) % length(GLOB.kepori_feathers_list) + 1] dna.features["kepori_body_feathers"] = GLOB.kepori_body_feathers_list[hex2num(copytext(seed, 13, 14)) % length(GLOB.kepori_body_feathers_list) + 1] + dna.features["kepori_head_feathers"] = GLOB.kepori_head_feathers_list[hex2num(copytext(seed, 13, 14)) % length(GLOB.kepori_head_feathers_list) + 1] dna.features["vox_head_quills"] = GLOB.vox_head_quills_list[hex2num(copytext(seed, 14, 15)) % length(GLOB.vox_head_quills_list) + 1] dna.features["vox_neck_quills"] = GLOB.vox_neck_quills_list[hex2num(copytext(seed, 15, 16)) % length(GLOB.vox_neck_quills_list) + 1] dna.features["elzu_horns"] = GLOB.elzu_horns_list[hex2num(copytext(seed, 16, 17)) % length(GLOB.elzu_horns_list) + 1] diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 166d2d4e83a0..e848bc01d251 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -688,16 +688,27 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) var/mutable_appearance/eye_overlay var/mutable_appearance/sclera_overlay + if(eyes) if(!HAS_TRAIT(H, TRAIT_EYESCLOSED) && !(H.stat == DEAD)) - eye_overlay = mutable_appearance(species_eye_path || 'icons/mob/human_face.dmi', eyes.eye_icon_state, -BODYPARTS_LAYER) - sclera_overlay = mutable_appearance('icons/mob/human_face.dmi', eyes.sclera_icon_state, -BODYPARTS_LAYER) + + if(iskepori(H)) // Kepori need sclera but don't fit the normal silhouette, so this needs changing. Make better later. + eye_overlay = mutable_appearance('icons/mob/species/kepori/kepori_eyes.dmi', eyes.eye_icon_state, -BODYPARTS_LAYER) + sclera_overlay = mutable_appearance('icons/mob/species/kepori/kepori_eyes.dmi', eyes.sclera_icon_state, -BODYPARTS_LAYER) + + else + eye_overlay = mutable_appearance(species_eye_path || 'icons/mob/human_face.dmi', eyes.eye_icon_state, -BODYPARTS_LAYER) + sclera_overlay = mutable_appearance('icons/mob/human_face.dmi', eyes.sclera_icon_state, -BODYPARTS_LAYER) + if((EYECOLOR in species_traits) && eyes) eye_overlay.color = "#" + H.eye_color + if((SCLERA in species_traits) && eyes) sclera_overlay.color = "#" + H.sclera_color standing += sclera_overlay + standing += eye_overlay + if(EMOTE_OVERLAY in species_traits) // blush if (HAS_TRAIT(H, TRAIT_BLUSHING)) // Caused by either the *blush emote or the "drunk" mood event @@ -939,6 +950,8 @@ GLOBAL_LIST_EMPTY(roundstart_races) S = GLOB.spider_spinneret_list[H.dna.features["spider_spinneret"]] if("kepori_body_feathers") S = GLOB.kepori_body_feathers_list[H.dna.features["kepori_body_feathers"]] + if("kepori_head_feathers") + S = GLOB.kepori_head_feathers_list[H.dna.features["kepori_head_feathers"]] if("kepori_tail_feathers") S = GLOB.kepori_tail_feathers_list[H.dna.features["kepori_tail_feathers"]] if("kepori_feathers") diff --git a/code/modules/mob/living/carbon/human/species_types/kepori.dm b/code/modules/mob/living/carbon/human/species_types/kepori.dm index 5693c646cf3f..3278d3d77c1e 100644 --- a/code/modules/mob/living/carbon/human/species_types/kepori.dm +++ b/code/modules/mob/living/carbon/human/species_types/kepori.dm @@ -2,10 +2,10 @@ name = "\improper Kepori" id = SPECIES_KEPORI default_color = "6060FF" - species_traits = list(MUTCOLORS, EYECOLOR, MUTCOLORS_SECONDARY) + species_traits = list(SCLERA, MUTCOLORS, EYECOLOR, MUTCOLORS_SECONDARY) inherent_traits = list(TRAIT_SCOOPABLE) - mutant_bodyparts = list("kepori_body_feathers", "kepori_tail_feathers", "kepori_feathers") - default_features = list("mcolor" = "0F0", "wings" = "None", "kepori_feathers" = "Plain", "kepori_body_feathers" = "Plain", "kepori_tail_feathers" = "Fan", "body_size" = "Normal") + mutant_bodyparts = list("kepori_body_feathers", "kepori_head_feathers", "kepori_tail_feathers", "kepori_feathers") + default_features = list("mcolor" = "0F0", "wings" = "None", "kepori_feathers" = "None", "kepori_head_feathers" = "None", "kepori_body_feathers" = "None", "kepori_tail_feathers" = "None") meat = /obj/item/reagent_containers/food/snacks/meat/slab/chicken disliked_food = FRIED | GROSS | CLOTH liked_food = MEAT | GORE @@ -15,7 +15,7 @@ attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' species_clothing_path = 'icons/mob/clothing/species/kepori.dmi' - species_eye_path = 'icons/mob/kepori_parts.dmi' + species_eye_path = 'icons/mob/species/kepori/kepori_eyes.dmi' heatmod = 0.67 coldmod = 1.5 brutemod = 1.5 @@ -57,17 +57,64 @@ species_robotic_l_leg = /obj/item/bodypart/leg/left/robot/surplus/kepori species_robotic_r_leg = /obj/item/bodypart/leg/right/robot/surplus/kepori + robotic_eyes = /obj/item/organ/eyes/robotic/kepori + /datum/species/kepori/New() . = ..() // This is in new because "[HEAD_LAYER]" etc. is NOT a constant compile-time value. For some reason. // Why not just use HEAD_LAYER? Well, because HEAD_LAYER is a number, and if you try to use numbers as indexes, // BYOND will try to make it an ordered list. So, we have to use a string. This is annoying, but it's the only way to do it smoothly. offset_clothing = list( - "[HEAD_LAYER]" = list("[NORTH]" = list("x" = 0, "y" = -4), "[EAST]" = list("x" = 4, "y" = -4), "[SOUTH]" = list("x" = 0, "y" = -4), "[WEST]" = list("x" = -4, "y" = -4)), - "[GLASSES_LAYER]" = list("[NORTH]" = list("x" = 0, "y" = -4), "[EAST]" = list("x" = 4, "y" = -4), "[SOUTH]" = list("x" = 0, "y" = -4), "[WEST]" = list("x" = -4, "y" = -4)), - "[FACEMASK_LAYER]" = list("[NORTH]" = list("x" = 0, "y" = -5), "[EAST]" = list("x" = 4, "y" = -5), "[SOUTH]" = list("x" = 0, "y" = -5), "[WEST]" = list("x" = -4, "y" = -5)), + "[HEAD_LAYER]" = list( + "[NORTH]" = list("x" = 8, "y" = -3), + "[EAST]" = list("x" = 19, "y" = -3), //ISSUE: The head sprites seem to be cut off when given an offset this large, combined with kepori offset + "[SOUTH]" = list("x" = 8, "y" = -3), + "[WEST]" = list("x" = -3, "y" = -3) + ), + "[GLASSES_LAYER]" = list( + "[NORTH]" = list("x" = 8, "y" = -3), + "[EAST]" = list("x" = 19, "y" = -3), + "[SOUTH]" = list("x" = 8, "y" = -3), + "[WEST]" = list("x" = -3, "y" = -3) + ), + "[FACEMASK_LAYER]" = list( + "[NORTH]" = list("x" = 8, "y" = -3), + "[EAST]" = list("x" = 19, "y" = -3), + "[SOUTH]" = list("x" = 8, "y" = -3), + "[WEST]" = list("x" = -3, "y" = -3) + ), + "[BELT_LAYER]" = list( + "[NORTH]" = list("x" = 8, "y" = -1), + "[EAST]" = list("x" = 8, "y" = -1), + "[SOUTH]" = list("x" = 8, "y" = -1), + "[WEST]" = list("x" = 9, "y" = -1) + ), + "[EARS_LAYER]" = list( + "[NORTH]" = list("x" = 8, "y" = -3), + "[EAST]" = list("x" = 19, "y" = -3), + "[SOUTH]" = list("x" = 8, "y" = -3), + "[WEST]" = list("x" = -3, "y" = -3) + ), + "[SUIT_STORE_LAYER]" = list( + "[NORTH]" = list("x" = 8, "y" = -1), + "[EAST]" = list("x" = 8, "y" = -1), + "[SOUTH]" = list("x" = 8, "y" = -1), + "[WEST]" = list("x" = -8, "y" = -1) + ), ) +// First list is left hand, second list is right hand. This is used for inhand offsets. +/datum/species/kepori/get_item_offsets_for_dir(dir, hand) + //LEFT/RIGHT + if(dir & NORTH) + return list(list("x" = 9, "y" = -1), list("x" = 7, "y" = -1)) + if(dir & SOUTH) + return list(list("x" = 7, "y" = -1), list("x" = 9, "y" = -1)) + if(dir & EAST) + return list(list("x" = 18, "y" = -2), list("x" = 21, "y" = -2)) //("x" = 18, "y" = 2), list("x" = 21, "y" = -1)) + if(dir & WEST) + return list(list("x" = -4, "y" = -2), list("x" = -1, "y" = -2)) //("x" = -5, "y" = -1), list("x" = -1, "y" = 2)) + /datum/species/kepori/random_name(gender,unique,lastname) if(unique) return random_unique_kepori_name() @@ -86,17 +133,27 @@ return equip_delay_self_check(I, H, bypass_equip_delay_self) /datum/species/kepori/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load) - ..() + . = ..() + + C.base_pixel_x -= 8 + C.pixel_x = C.base_pixel_x + C.update_hands_on_rotate() + if(ishuman(C)) keptackle = new keptackle.Grant(C) /datum/species/kepori/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load) + . = ..() + + C.base_pixel_x += 8 + C.pixel_x = C.base_pixel_x + C.stop_updating_hands() + if(keptackle) keptackle.Remove(C) - qdel(C.GetComponent(/datum/component/tackler)) - ..() + qdel(C.GetComponent(/datum/component/tackler)) /datum/action/innate/keptackle name = "Pounce" diff --git a/code/modules/mob/living/carbon/human/species_types/vox.dm b/code/modules/mob/living/carbon/human/species_types/vox.dm index fd03e184b9ba..b9cc8306762e 100644 --- a/code/modules/mob/living/carbon/human/species_types/vox.dm +++ b/code/modules/mob/living/carbon/human/species_types/vox.dm @@ -67,14 +67,29 @@ /datum/species/vox/New() . = ..() + // This is in new because "[HEAD_LAYER]" etc. is NOT a constant compile-time value. For some reason. + // Why not just use HEAD_LAYER? Well, because HEAD_LAYER is a number, and if you try to use numbers as indexes, + // BYOND will try to make it an ordered list. So, we have to use a string. This is annoying, but it's the only way to do it smoothly. + offset_clothing = list( + "[SUIT_STORE_LAYER]" = list( + "[NORTH]" = list("x" = 8, "y" = 0), + "[EAST]" = list("x" = 8, "y" = 0), + "[SOUTH]" = list("x" = 8, "y" = 0), + "[WEST]" = list("x" = -8, "y" = 0) + ), + "[EARS_LAYER]" = list( + "[NORTH]" = list("x" = 8, "y" = 0), + "[EAST]" = list("x" = 8, "y" = 0), + "[SOUTH]" = list("x" = 8, "y" = 0), + "[WEST]" = list("x" = -8, "y" = 0) + ), + ) /datum/species/vox/random_name(gender,unique,lastname) if(unique) return random_unique_vox_name() return vox_name() - - /datum/species/vox/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load) . = ..() C.base_pixel_x -= 9 diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index be99a1e4d547..beecda12b083 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -1,5 +1,4 @@ #define RESOLVE_ICON_STATE(I) (I.mob_overlay_state || I.icon_state) -#define CHECK_USE_AUTOGEN (handled_by_bodytype ? null : dna.species) //Is this gross overuse of macros? Yes. Fuck you. /////////////////////// //UPDATE_ICONS SYSTEM// @@ -111,9 +110,6 @@ There are several things that need to be remembered: if(wear_suit && (wear_suit.flags_inv & HIDEJUMPSUIT)) return - var/target_overlay = U.icon_state - if(U.adjusted == ALT_STYLE) - target_overlay = "[target_overlay]_d" var/t_color = U.item_color @@ -122,10 +118,18 @@ There are several things that need to be remembered: if(U.adjusted == ALT_STYLE) t_color = "[t_color]_d" + ///The final thing we overlay. Set on build_worn_icon. var/mutable_appearance/uniform_overlay + ///icon file of the clothing var/icon_file = U.mob_overlay_icon - var/handled_by_bodytype = TRUE + ///The icon state to overlay + var/target_overlay = U.icon_state + if(U.adjusted == ALT_STYLE) + target_overlay = "[target_overlay]_d" + /// Does this clothing need to be generated via greyscale? + var/handled_by_bodytype = FALSE + if(!uniform_overlay) //Kapu's autistic attempt at digitigrade handling //Hi Kapu @@ -135,21 +139,29 @@ There are several things that need to be remembered: icon_file = U.mob_overlay_icon target_overlay = "[target_overlay]_digi" - else if((dna.species.bodytype & BODYTYPE_VOX) && (U.supports_variations & VOX_VARIATION)) - icon_file = VOX_UNIFORM_PATH - if(U.vox_override_icon) - icon_file = U.vox_override_icon + else if(dna.species.bodytype & BODYTYPE_VOX) + if(U.supports_variations & VOX_VARIATION) + icon_file = VOX_UNIFORM_PATH + if(U.vox_override_icon) + icon_file = U.vox_override_icon + else + handled_by_bodytype = TRUE + + else if(dna.species.bodytype & BODYTYPE_KEPORI) + if(U.supports_variations & KEPORI_VARIATION) + icon_file = KEPORI_UNIFORM_PATH + if(U.kepoi_override_icon) + icon_file = U.kepoi_override_icon + else + handled_by_bodytype = TRUE - else if((dna.species.bodytype & BODYTYPE_KEPORI) && (U.supports_variations & KEPORI_VARIATION)) - icon_file = KEPORI_UNIFORM_PATH - if(U.kepoi_override_icon) - icon_file = U.kepoi_override_icon if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(U)))) - handled_by_bodytype = FALSE + handled_by_bodytype = TRUE icon_file = U.mob_overlay_icon || DEFAULT_UNIFORM_PATH - uniform_overlay = U.build_worn_icon(default_layer = UNIFORM_LAYER, default_icon_file = icon_file, override_file = icon_file, isinhands = FALSE, override_file = icon_file, override_state = target_overlay, mob_species = CHECK_USE_AUTOGEN) + var/use_autogen = handled_by_bodytype ? dna.species : null + uniform_overlay = U.build_worn_icon(default_layer = UNIFORM_LAYER, default_icon_file = icon_file, override_file = icon_file, isinhands = FALSE, override_file = icon_file, override_state = target_overlay, mob_species = use_autogen) if(!uniform_overlay) return @@ -176,7 +188,8 @@ There are several things that need to be remembered: var/handled_by_bodytype //TODO: add an icon file for ID slot stuff, so it's less snowflakey - id_overlay = I.build_worn_icon(default_layer = ID_LAYER, default_icon_file = 'icons/mob/mob.dmi', mob_species = CHECK_USE_AUTOGEN) + var/use_autogen = handled_by_bodytype ? dna.species : null + id_overlay = I.build_worn_icon(default_layer = ID_LAYER, default_icon_file = 'icons/mob/mob.dmi', mob_species = use_autogen) if(!id_overlay) return @@ -206,29 +219,41 @@ There are several things that need to be remembered: //Bloody hands end - var/mutable_appearance/gloves_overlay + if(gloves) var/obj/item/I = gloves update_hud_gloves(I) - var/handled_by_bodytype = TRUE + ///The final thing we overlay. Set on build_worn_icon. + var/mutable_appearance/gloves_overlay + + ///icon file of the clothing var/icon_file = I.mob_overlay_icon + /// Does this clothing need to be generated via greyscale? + var/handled_by_bodytype = FALSE - if((dna.species.bodytype & BODYTYPE_VOX) && (I.supports_variations & VOX_VARIATION)) - icon_file = VOX_GLOVES_PATH - if(I.vox_override_icon) - icon_file = I.vox_override_icon + if(dna.species.bodytype & BODYTYPE_VOX) + if(I.supports_variations & VOX_VARIATION) + icon_file = VOX_GLOVES_PATH + if(I.vox_override_icon) + icon_file = I.vox_override_icon + else + handled_by_bodytype = TRUE - if((dna.species.bodytype & BODYTYPE_KEPORI) && (I.supports_variations & KEPORI_VARIATION)) - icon_file = KEPORI_GLOVES_PATH - if(I.kepoi_override_icon) - icon_file = I.kepoi_override_icon + else if(dna.species.bodytype & BODYTYPE_KEPORI) + if(I.supports_variations & KEPORI_VARIATION) + icon_file = KEPORI_GLOVES_PATH + if(I.kepoi_override_icon) + icon_file = I.kepoi_override_icon + else + handled_by_bodytype = TRUE if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I)))) - handled_by_bodytype = FALSE + handled_by_bodytype = TRUE icon_file = DEFAULT_GLOVES_PATH - gloves_overlay = I.build_worn_icon(default_layer = GLOVES_LAYER, default_icon_file = icon_file, override_file = icon_file, mob_species = CHECK_USE_AUTOGEN) + var/use_autogen = handled_by_bodytype ? dna.species : null + gloves_overlay = I.build_worn_icon(default_layer = GLOVES_LAYER, default_icon_file = icon_file, override_file = icon_file, mob_species = use_autogen) if(!gloves_overlay) return @@ -250,25 +275,37 @@ There are several things that need to be remembered: var/obj/item/I = glasses update_hud_glasses(I) if(!(head?.flags_inv & HIDEEYES) && !(wear_mask?.flags_inv & HIDEEYES)) + ///The final thing we overlay. Set on build_worn_icon. var/mutable_appearance/glasses_overlay - var/handled_by_bodytype = TRUE + + ///icon file of the clothing var/icon_file = I.mob_overlay_icon - if((dna.species.bodytype & BODYTYPE_VOX) && (I.supports_variations & VOX_VARIATION)) - icon_file = VOX_GLASSES_PATH - if(I.vox_override_icon) - icon_file = I.vox_override_icon -/*uncomment post kepori resprite - if((dna.species.bodytype & BODYTYPE_KEPORI) && (I.supports_variations & KEPORI_VARIATION)) - icon_file = KEPORI_GLASSES_PATH - if(I.kepoi_override_icon) - icon_file = I.kepoi_override_icon -*/ + /// Does this clothing need to be generated via greyscale? + var/handled_by_bodytype = FALSE + + if(dna.species.bodytype & BODYTYPE_VOX) + if(I.supports_variations & VOX_VARIATION) + icon_file = VOX_GLASSES_PATH + if(I.vox_override_icon) + icon_file = I.vox_override_icon + else + handled_by_bodytype = TRUE + + else if(dna.species.bodytype & BODYTYPE_KEPORI) + if(I.supports_variations & KEPORI_VARIATION) + icon_file = KEPORI_GLASSES_PATH + if(I.kepoi_override_icon) + icon_file = I.kepoi_override_icon + else + handled_by_bodytype = TRUE + if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I)))) - handled_by_bodytype = FALSE + handled_by_bodytype = TRUE icon_file = DEFAULT_GLASSES_PATH - glasses_overlay = I.build_worn_icon(default_layer = GLASSES_LAYER, default_icon_file = icon_file, override_file = icon_file, mob_species = CHECK_USE_AUTOGEN) + var/use_autogen = handled_by_bodytype ? dna.species : null + glasses_overlay = I.build_worn_icon(default_layer = GLASSES_LAYER, default_icon_file = icon_file, override_file = icon_file, mob_species = use_autogen) if(!glasses_overlay) return @@ -288,27 +325,38 @@ There are several things that need to be remembered: if(ears) var/obj/item/I = ears - var/mutable_appearance/ears_overlay update_hud_ears(I) - var/handled_by_bodytype = TRUE + ///The final thing we overlay. Set on build_worn_icon. + var/mutable_appearance/ears_overlay + + ///icon file of the clothing var/icon_file = I.mob_overlay_icon + /// Does this clothing need to be generated via greyscale? + var/handled_by_bodytype = FALSE + + if(dna.species.bodytype & BODYTYPE_VOX) + if(I.supports_variations & VOX_VARIATION) + icon_file = VOX_EARS_PATH + if(I.vox_override_icon) + icon_file = I.vox_override_icon + else + handled_by_bodytype = TRUE + + else if(dna.species.bodytype & BODYTYPE_KEPORI) + if(I.supports_variations & KEPORI_VARIATION) + icon_file = KEPORI_EARS_PATH + if(I.kepoi_override_icon) + icon_file = I.kepoi_override_icon + else + handled_by_bodytype = TRUE - if((dna.species.bodytype & BODYTYPE_VOX) && (I.supports_variations & VOX_VARIATION)) - icon_file = VOX_EARS_PATH - if(I.vox_override_icon) - icon_file = I.vox_override_icon -/*uncomment post kepori resprite - if((dna.species.bodytype & BODYTYPE_KEPORI) && (I.supports_variations & KEPORI_VARIATION)) - icon_file = KEPORI_EARS_PATH - if(I.kepoi_override_icon) - icon_file = I.kepoi_override_icon -*/ if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I)))) - handled_by_bodytype = FALSE + handled_by_bodytype = TRUE icon_file = DEFAULT_EARS_PATH - ears_overlay = I.build_worn_icon(default_layer = EARS_LAYER, override_file = icon_file, mob_species = CHECK_USE_AUTOGEN) + var/use_autogen = handled_by_bodytype ? dna.species : null + ears_overlay = I.build_worn_icon(default_layer = EARS_LAYER, override_file = icon_file, mob_species = use_autogen) if(!ears_overlay) return @@ -328,11 +376,17 @@ There are several things that need to be remembered: if(shoes) var/obj/item/I = shoes + update_hud_shoes(I) + ///The final thing we overlay. Set on build_worn_icon. var/mutable_appearance/shoes_overlay + + ///icon file of the clothing var/icon_file = I.mob_overlay_icon + ///The icon state to overlay var/target_overlay = I.icon_state - update_hud_shoes(I) - var/handled_by_bodytype = TRUE + + /// Does this clothing need to be generated via greyscale? + var/handled_by_bodytype = FALSE if((dna.species.bodytype & BODYTYPE_DIGITIGRADE) && ((I.supports_variations & DIGITIGRADE_VARIATION) || (I.supports_variations & DIGITIGRADE_VARIATION_SAME_ICON_FILE))) var/obj/item/bodypart/leg = src.get_bodypart(BODY_ZONE_L_LEG) @@ -342,21 +396,28 @@ There are several things that need to be remembered: icon_file = I.mob_overlay_icon target_overlay = "[target_overlay]_digi" - if((dna.species.bodytype & BODYTYPE_VOX) && (I.supports_variations & VOX_VARIATION)) - icon_file = VOX_SHOES_PATH - if(I.vox_override_icon) - icon_file = I.vox_override_icon + else if(dna.species.bodytype & BODYTYPE_VOX) + if(I.supports_variations & VOX_VARIATION) + icon_file = VOX_SHOES_PATH + if(I.vox_override_icon) + icon_file = I.vox_override_icon + else + handled_by_bodytype = TRUE - if((dna.species.bodytype & BODYTYPE_KEPORI) && (I.supports_variations & KEPORI_VARIATION)) - icon_file = KEPORI_SHOES_PATH - if(I.kepoi_override_icon) - icon_file = I.kepoi_override_icon + else if(dna.species.bodytype & BODYTYPE_KEPORI) + if(I.supports_variations & KEPORI_VARIATION) + icon_file = KEPORI_SHOES_PATH + if(I.kepoi_override_icon) + icon_file = I.kepoi_override_icon + else + handled_by_bodytype = TRUE if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I)))) - handled_by_bodytype = FALSE + handled_by_bodytype = TRUE icon_file = DEFAULT_SHOES_PATH - shoes_overlay = I.build_worn_icon(default_layer = SHOES_LAYER, default_icon_file = icon_file, override_file = icon_file, isinhands = FALSE, mob_species = CHECK_USE_AUTOGEN, override_state = target_overlay) + var/use_autogen = handled_by_bodytype ? dna.species : null + shoes_overlay = I.build_worn_icon(default_layer = SHOES_LAYER, default_icon_file = icon_file, override_file = icon_file, isinhands = FALSE, mob_species = use_autogen, override_state = target_overlay) if(!shoes_overlay) return @@ -394,31 +455,44 @@ There are several things that need to be remembered: inv.update_appearance() if(head) var/obj/item/I = head - var/mutable_appearance/head_overlay update_hud_head(I) - var/handled_by_bodytype = TRUE + ///The final thing we overlay. Set on build_worn_icon. + var/mutable_appearance/head_overlay + + ///icon file of the clothing var/icon_file = I.mob_overlay_icon + ///The icon state to overlay var/target_overlay = I.icon_state + /// Does this clothing need to be generated via greyscale? + var/handled_by_bodytype = FALSE + var/obj/item/bodypart/head_bodypart = src.get_bodypart(BODY_ZONE_HEAD) if((head_bodypart.bodytype & BODYTYPE_SNOUT) && (I.supports_variations & SNOUTED_VARIATION)) target_overlay = "[target_overlay]_snouted" - if((dna.species.bodytype & BODYTYPE_VOX) && (I.supports_variations & VOX_VARIATION)) - icon_file = VOX_HEAD_PATH - if(I.vox_override_icon) - icon_file = I.vox_override_icon + else if(dna.species.bodytype & BODYTYPE_VOX) + if(I.supports_variations & VOX_VARIATION) + icon_file = VOX_HEAD_PATH + if(I.vox_override_icon) + icon_file = I.vox_override_icon + else + handled_by_bodytype = TRUE - if((dna.species.bodytype & BODYTYPE_KEPORI) && (I.supports_variations & KEPORI_VARIATION)) - icon_file = KEPORI_HEAD_PATH - if(I.kepoi_override_icon) - icon_file = I.kepoi_override_icon + else if(dna.species.bodytype & BODYTYPE_KEPORI) + if(I.supports_variations & KEPORI_VARIATION) + icon_file = KEPORI_HEAD_PATH + if(I.kepoi_override_icon) + icon_file = I.kepoi_override_icon + else + handled_by_bodytype = TRUE if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I)))) - handled_by_bodytype = FALSE + handled_by_bodytype = TRUE icon_file = DEFAULT_HEAD_PATH - head_overlay = I.build_worn_icon(default_layer = HEAD_LAYER, default_icon_file = icon_file, override_file = icon_file, isinhands = FALSE, mob_species = CHECK_USE_AUTOGEN, override_state = target_overlay) + var/use_autogen = handled_by_bodytype ? dna.species : null + head_overlay = I.build_worn_icon(default_layer = HEAD_LAYER, default_icon_file = icon_file, override_file = icon_file, isinhands = FALSE, mob_species = use_autogen, override_state = target_overlay) if(!head_overlay) return @@ -436,26 +510,39 @@ There are several things that need to be remembered: if(belt) var/obj/item/I = belt - var/mutable_appearance/belt_overlay update_hud_belt(I) - var/handled_by_bodytype + ///The final thing we overlay. Set on build_worn_icon. + var/mutable_appearance/belt_overlay + + ///icon file of the clothing var/icon_file = I.mob_overlay_icon - if((I.supports_variations & VOX_VARIATION) && (dna.species.bodytype & BODYTYPE_VOX)) - icon_file = VOX_BELT_PATH - if(I.vox_override_icon) - icon_file = I.vox_override_icon + /// Does this clothing need to be generated via greyscale? + var/handled_by_bodytype = FALSE + - //if((I.supports_variations & KEPORI_VARIATION) && (dna.species.bodytype & BODYTYPE_KEPORI)) - //icon_file = KEPORI_BELT_PATH - //if(I.kepoi_override_icon) -// icon_file = I.kepoi_override_icon + if(dna.species.bodytype & BODYTYPE_VOX) + if(I.supports_variations & VOX_VARIATION) + icon_file = VOX_BELT_PATH + if(I.vox_override_icon) + icon_file = I.vox_override_icon + else + handled_by_bodytype = TRUE + + else if(dna.species.bodytype & BODYTYPE_KEPORI) + if(I.supports_variations & KEPORI_VARIATION) + icon_file = KEPORI_BELT_PATH + if(I.kepoi_override_icon) + icon_file = I.kepoi_override_icon + else + handled_by_bodytype = TRUE if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I)))) - handled_by_bodytype = FALSE + handled_by_bodytype = TRUE icon_file = DEFAULT_BELT_PATH - belt_overlay = I.build_worn_icon(default_layer = BELT_LAYER, default_icon_file = icon_file, override_file = icon_file, mob_species = CHECK_USE_AUTOGEN) + var/use_autogen = handled_by_bodytype ? dna.species : null + belt_overlay = I.build_worn_icon(default_layer = BELT_LAYER, default_icon_file = icon_file, override_file = icon_file, mob_species = use_autogen) if(!belt_overlay) return @@ -474,33 +561,46 @@ There are several things that need to be remembered: if(wear_suit) var/obj/item/I = wear_suit - var/mutable_appearance/suit_overlay update_hud_wear_suit(I) + ///The final thing we overlay. Set on build_worn_icon. + var/mutable_appearance/suit_overlay + + ///icon file of the clothing var/icon_file = I.mob_overlay_icon + ///The icon state to overlay var/target_overlay = I.icon_state - var/handled_by_bodytype = TRUE + /// Does this clothing need to be generated via greyscale? + var/handled_by_bodytype = FALSE + if((dna.species.bodytype & BODYTYPE_DIGITIGRADE) && ((I.supports_variations & DIGITIGRADE_VARIATION) || (I.supports_variations & DIGITIGRADE_VARIATION_SAME_ICON_FILE))) icon_file = DIGITIGRADE_SUIT_PATH if((I.supports_variations & DIGITIGRADE_VARIATION_SAME_ICON_FILE)) icon_file = I.mob_overlay_icon target_overlay = "[target_overlay]_digi" - else if((dna.species.bodytype & BODYTYPE_VOX) && (I.supports_variations & VOX_VARIATION)) - icon_file = VOX_SUIT_PATH - if(I.vox_override_icon) - icon_file = I.vox_override_icon + else if(dna.species.bodytype & BODYTYPE_VOX) + if(I.supports_variations & VOX_VARIATION) + icon_file = VOX_SUIT_PATH + if(I.vox_override_icon) + icon_file = I.vox_override_icon + else + handled_by_bodytype = TRUE - else if((dna.species.bodytype & BODYTYPE_KEPORI) && (I.supports_variations & KEPORI_VARIATION)) - icon_file = KEPORI_SUIT_PATH - if(I.kepoi_override_icon) - icon_file = I.kepoi_override_icon + else if(dna.species.bodytype & BODYTYPE_KEPORI) + if(I.supports_variations & KEPORI_VARIATION) + icon_file = KEPORI_SUIT_PATH + if(I.kepoi_override_icon) + icon_file = I.kepoi_override_icon + else + handled_by_bodytype = TRUE if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I)))) - handled_by_bodytype = FALSE + handled_by_bodytype = TRUE icon_file = I.mob_overlay_icon - suit_overlay = wear_suit.build_worn_icon(default_layer = SUIT_LAYER, override_file = icon_file, mob_species = CHECK_USE_AUTOGEN, override_state = target_overlay) + var/use_autogen = handled_by_bodytype ? dna.species : null + suit_overlay = wear_suit.build_worn_icon(default_layer = SUIT_LAYER, override_file = icon_file, mob_species = use_autogen, override_state = target_overlay) if(!suit_overlay) return @@ -546,31 +646,44 @@ There are several things that need to be remembered: if(wear_mask) var/obj/item/I = wear_mask update_hud_wear_mask(I) + ///The final thing we overlay. Set on build_worn_icon. var/mutable_appearance/mask_overlay + + ///icon file of the clothing var/icon_file = I.mob_overlay_icon + ///The icon state to overlay var/target_overlay = I.icon_state - var/handled_by_bodytype = TRUE + + /// Does this clothing need to be generated via greyscale? + var/handled_by_bodytype = FALSE if(!(ITEM_SLOT_MASK in check_obscured_slots())) var/obj/item/bodypart/head_bodypart = src.get_bodypart(BODY_ZONE_HEAD) if((head_bodypart.bodytype & BODYTYPE_SNOUT) && (I.supports_variations & SNOUTED_VARIATION)) target_overlay = "[target_overlay]_snouted" - if((dna.species.bodytype & BODYTYPE_VOX) && (I.supports_variations & VOX_VARIATION)) - icon_file = VOX_MASK_PATH - if(I.vox_override_icon) - icon_file = I.vox_override_icon - - if((dna.species.bodytype & BODYTYPE_KEPORI) && (I.supports_variations & KEPORI_VARIATION)) - icon_file = KEPORI_MASK_PATH - if(I.kepoi_override_icon) - icon_file = I.kepoi_override_icon + if(dna.species.bodytype & BODYTYPE_VOX) + if(I.supports_variations & VOX_VARIATION) + icon_file = VOX_MASK_PATH + if(I.vox_override_icon) + icon_file = I.vox_override_icon + else + handled_by_bodytype = TRUE + + else if(dna.species.bodytype & BODYTYPE_KEPORI) + if(I.supports_variations & KEPORI_VARIATION) + icon_file = KEPORI_MASK_PATH + if(I.kepoi_override_icon) + icon_file = I.kepoi_override_icon + else + handled_by_bodytype = TRUE if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I)))) icon_file = DEFAULT_MASK_PATH - handled_by_bodytype = FALSE + handled_by_bodytype = TRUE - mask_overlay = I.build_worn_icon(default_layer = FACEMASK_LAYER, default_icon_file = icon_file, override_file = icon_file, mob_species = CHECK_USE_AUTOGEN, override_state = target_overlay) + var/use_autogen = handled_by_bodytype ? dna.species : null + mask_overlay = I.build_worn_icon(default_layer = FACEMASK_LAYER, default_icon_file = icon_file, override_file = icon_file, mob_species = use_autogen, override_state = target_overlay) if(!mask_overlay) return @@ -588,17 +701,48 @@ There are several things that need to be remembered: if(wear_neck) var/obj/item/I = wear_neck + ///The final thing we overlay. Set on build_worn_icon. + var/mutable_appearance/neck_overlay + + ///icon file of the clothing + var/icon_file = I.mob_overlay_icon + ///The icon state to overlay + var/target_overlay = I.icon_state + + /// Does this clothing need to be generated via greyscale? + var/handled_by_bodytype = FALSE + + update_hud_neck(I) if(!(ITEM_SLOT_NECK in check_obscured_slots())) - var/icon_file = I.mob_overlay_icon - var/handled_by_bodytype = TRUE + + if(dna.species.bodytype & BODYTYPE_VOX) // there is neither a vox or kepori neck path, we just tell it to greyscale no matter what +// if(I.supports_variations & VOX_VARIATION) +// icon_file = VOX_NECK_PATH +// if(I.vox_override_icon) +// icon_file = I.vox_override_icon +// else + handled_by_bodytype = TRUE + + else if(dna.species.bodytype & BODYTYPE_KEPORI) +// if(I.supports_variations & KEPORI_VARIATION) +// icon_file = KEPORI_NECK_PATH +// if(I.kepoi_override_icon) +// icon_file = I.kepoi_override_icon +// else + handled_by_bodytype = TRUE if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(I)))) - handled_by_bodytype = FALSE + handled_by_bodytype = TRUE icon_file = DEFAULT_NECK_PATH - overlays_standing[NECK_LAYER] = wear_neck.build_worn_icon(default_layer = NECK_LAYER, default_icon_file = icon_file, override_file = icon_file, mob_species = CHECK_USE_AUTOGEN) + var/use_autogen = handled_by_bodytype ? dna.species : null + neck_overlay = I.build_worn_icon(default_layer = NECK_LAYER, default_icon_file = icon_file, override_file = icon_file, isinhands = FALSE, mob_species = use_autogen, override_state = target_overlay) + if(!neck_overlay) + return + + overlays_standing[NECK_LAYER] = neck_overlay apply_overlay(NECK_LAYER) @@ -611,23 +755,42 @@ There are several things that need to be remembered: if(back) var/obj/item/I = back - var/mutable_appearance/back_overlay update_hud_back(I) - var/icon_file = I.mob_overlay_icon - var/handled_by_bodytype = TRUE - if((dna.species.bodytype & BODYTYPE_VOX) && (I.supports_variations & VOX_VARIATION)) - icon_file = VOX_BACK_PATH + ///The final thing we overlay. Set on build_worn_icon. + var/mutable_appearance/back_overlay - if(!icon_exists(icon_file, RESOLVE_ICON_STATE(I))) - icon_file = DEFAULT_BACK_PATH - handled_by_bodytype = FALSE + ///icon file of the clothing + var/icon_file = I.mob_overlay_icon - back_overlay = I.build_worn_icon(default_layer = BACK_LAYER, default_icon_file = icon_file, override_file = icon_file, isinhands = FALSE, override_file = icon_file, mob_species = CHECK_USE_AUTOGEN) + /// Does this clothing need to be generated via greyscale + var/handled_by_bodytype = FALSE if(!back_overlay) - return - overlays_standing[BACK_LAYER] = back_overlay - apply_overlay(BACK_LAYER) + if(dna.species.bodytype & BODYTYPE_VOX) + if(I.supports_variations & VOX_VARIATION) + icon_file = VOX_BACK_PATH + else + handled_by_bodytype = TRUE + + else if(dna.species.bodytype & BODYTYPE_KEPORI) +// if(I.supports_variations & KEPORI_VARIATION) +// icon_file = KEPORI_BACK_PATH +// else + handled_by_bodytype = TRUE + + if(!icon_exists(icon_file, RESOLVE_ICON_STATE(I))) + icon_file = DEFAULT_BACK_PATH + handled_by_bodytype = TRUE + + var/use_autogen = handled_by_bodytype ? dna.species : null + back_overlay = I.build_worn_icon(default_layer = BACK_LAYER, default_icon_file = icon_file, override_file = icon_file, isinhands = FALSE, override_file = icon_file, mob_species = use_autogen) + + if(!back_overlay) + return + overlays_standing[BACK_LAYER] = back_overlay + + if(back_overlay) //This is faster fuck you + apply_overlay(BACK_LAYER) /mob/living/carbon/human/update_inv_legcuffed() remove_overlay(LEGCUFF_LAYER) @@ -768,6 +931,7 @@ in this situation default_icon_file is expected to match either the lefthand_ or ^this female part sucks and will be fully ripped out ideally */ +// Note: if handled_by_bodytype is TRUE before calling this, it makes species use greyscale /obj/item/proc/build_worn_icon(default_layer = 0, default_icon_file = null, isinhands = FALSE, override_state = null, override_file = null, datum/species/mob_species = null, direction = null) // WS Edit Start - Worn Icon State diff --git a/code/modules/surgery/bodyparts/robot_bodyparts.dm b/code/modules/surgery/bodyparts/robot_bodyparts.dm index 398d937cc586..61bbb88ab545 100644 --- a/code/modules/surgery/bodyparts/robot_bodyparts.dm +++ b/code/modules/surgery/bodyparts/robot_bodyparts.dm @@ -137,7 +137,6 @@ var/wired = FALSE var/obj/item/stock_parts/cell/cell = null - /obj/item/bodypart/chest/robot/handle_atom_del(atom/A) if(A == cell) cell = null @@ -191,7 +190,6 @@ cell.forceMove(drop_location()) cell = null - /obj/item/bodypart/chest/robot/examine(mob/user) . = ..() if(cell) @@ -214,7 +212,6 @@ cell = null ..() - /obj/item/bodypart/head/robot name = "cyborg head" desc = "A standard reinforced braincase, with spine-plugged neural socket and sensor gimbals." @@ -304,7 +301,6 @@ to_chat(user, "There is no flash to remove from [src].") return TRUE - /obj/item/bodypart/head/robot/drop_organs(mob/user, violent_removal) if(flash1) flash1.forceMove(user.loc) @@ -314,9 +310,6 @@ flash2 = null ..() - - - /obj/item/bodypart/l_arm/robot/surplus name = "surplus prosthetic left arm" desc = "A skeletal, robotic limb. Outdated and fragile, but it's still better than nothing." diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 0c200df9f6b1..283ee77971eb 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -149,6 +149,9 @@ /obj/item/organ/eyes/robotic/lizard eye_icon_state = "eyes_synth" +/obj/item/organ/eyes/robotic/kepori + eye_icon_state = "eyes_kepori_synth" + /obj/item/organ/eyes/robotic/emp_act(severity) . = ..() if(!owner || . & EMP_PROTECT_SELF) diff --git a/icons/blanks/64x64.dmi b/icons/blanks/64x64.dmi new file mode 100644 index 0000000000000000000000000000000000000000..6bfbd471e5db047e61a56f350fa92b3820a03f7e GIT binary patch literal 219 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 literal 4392 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 diff --git a/icons/mob/clothing/underwear/species/kepori/underwear_legs_kepori.dmi b/icons/mob/clothing/underwear/species/kepori/underwear_legs_kepori.dmi new file mode 100644 index 0000000000000000000000000000000000000000..166e1a7624d989077a4ed74d75d14280c7debb9b GIT binary patch literal 330 zcmeAS@N?(olHy`uVBq!ia0y~yU{nBN2S#R~h}ur$nLvsyz$e7@02sV_rX&FrVJr#q z3ubV5b|VeQIa(DGQR0$XoLrPyP?DLS$G}iAr+3m`zC#8)Ezh56E-G{X!>gmSLiCkG zJmbs$xs?{ktS)6qwKda^ P1rqRd^>bP0l+XkKNUwht literal 0 HcmV?d00001 diff --git a/icons/mob/clothing/underwear/species/underwear_legs_kepori.dmi b/icons/mob/clothing/underwear/species/kepori/underwear_legs_keporiOLD.dmi similarity index 100% rename from icons/mob/clothing/underwear/species/underwear_legs_kepori.dmi rename to icons/mob/clothing/underwear/species/kepori/underwear_legs_keporiOLD.dmi diff --git a/icons/mob/clothing/underwear/species/kepori/underwear_socks_kepori.dmi b/icons/mob/clothing/underwear/species/kepori/underwear_socks_kepori.dmi new file mode 100644 index 0000000000000000000000000000000000000000..6fe4e042f679f121f956f8a657f52bddf3df6b50 GIT binary patch literal 3276 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 literal 0 HcmV?d00001 diff --git a/icons/mob/clothing/underwear/species/underwear_socks_kepori.dmi b/icons/mob/clothing/underwear/species/kepori/underwear_socks_keporiOLD.dmi similarity index 100% rename from icons/mob/clothing/underwear/species/underwear_socks_kepori.dmi rename to icons/mob/clothing/underwear/species/kepori/underwear_socks_keporiOLD.dmi diff --git a/icons/mob/clothing/underwear/species/kepori/underwear_torso_kepori.dmi b/icons/mob/clothing/underwear/species/kepori/underwear_torso_kepori.dmi new file mode 100644 index 0000000000000000000000000000000000000000..1a6a59cd52410068d42af2bf76912e1a6bfd8057 GIT binary patch literal 1112 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 VrA^d&;H5CgK-WkIf89Fde*nex*-iie diff --git a/icons/mob/species/kepori/bodyparts.dmi b/icons/mob/species/kepori/bodyparts.dmi index f19aaeacbe08ebafdf5c90f7fe8fd985e6ba2dfc..058d315d7bd838f18a69c3eadde22c29f701f7b9 100644 GIT binary patch literal 1480 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 aS@;KFB^A&t%D~fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainFEVwu`QZv&tN`M?=Bd+3- z#FA7XQz^AFwOEOZGbOXA7^IAgGp#5wHx%Dj>c zTso8$T>V_YZUz8-i#E`;I)nHC004DKL_t(&f$i2Y3V<*Sh2dK5-Xmmj_Xr*#2;ToH zb}1CZs0Fd&|7GcGN$42ofJVhw)79;-L}~{4nkE1MfQML{QJ?BEG2Vt$0002rGnK*G zjJz)9pt%gzW^^_P005v(>tVQQEJG8UQ3xR)RrSrE0Ki{ub8iHJ0c6UD00000NkvXX Hu0mjfyepRq literal 0 HcmV?d00001 diff --git a/icons/mob/species/kepori/kepori_parts.dmi b/icons/mob/species/kepori/kepori_parts.dmi new file mode 100644 index 0000000000000000000000000000000000000000..76d1819c9dd8540096f3dcbab77e6c842f1f8ffd GIT binary patch literal 2824 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 literal 0 HcmV?d00001 diff --git a/icons/mob/species/kepori/onmob_belt_kepori.dmi b/icons/mob/species/kepori/onmob_belt_kepori.dmi index cf74d73796c8c6121c0818fdac74e4a7f0ab9a5f..4a5a4ba7b32a424e1d1997c33d98c6cbc5e66041 100644 GIT binary patch delta 114 zcmdnSxPwu#Gr-TCmrII^fq{Y7)59eQNE-mL0wXh!%#+HDpQtF$=snTV#JNyshlO#F z@nvJL2AO1Ky;Rn4d+`ly44=CBOQxikuK_CO@pN$v;h346AaM`Kd%(cRBzM^z$YStx L^>bP0l+XkKya*fK delta 112 zcmdnNxQ$Vwqi)e_1!5cyiE*d|0 zq;uX!^CUx2Pwx&3;~?Y9#$F0CsjT7l;v3i)KHlcf^{%~V4K$R;)5S4_V`g%K#2p}S W0R!VxY5#RV7K5j&pUXO@geCygCOLEf literal 0 HcmV?d00001 diff --git a/icons/mob/species/kepori/onmob_ears_kepori.dmi b/icons/mob/species/kepori/onmob_ears_kepori.dmi new file mode 100644 index 0000000000000000000000000000000000000000..4a5a4ba7b32a424e1d1997c33d98c6cbc5e66041 GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^20*O9$P6U&q%z}y6mx)2h%1m@US)d=NHLZK`2{mL zJiCzw=P@u;%n1%FC@TH_CAi?@*C$%ux?1PXoDbd*YH-o` z!6TjXKAI;P3Uzi^7zY_&Huh?eNmkZNWev9%-@wN3shhuKN_zPkps_rjE{-7_Gm{e} Z?g4oZ7#Nx4F1rI+44$rjF6*2UngC^=H`D+C literal 0 HcmV?d00001 diff --git a/icons/mob/species/kepori/onmob_eyes_kepori.dmi b/icons/mob/species/kepori/onmob_eyes_kepori.dmi index 2cfe52f4630de6ad4dd084c72e5d10bdffcb53cd..1b6c6f68a3a5f4c0be859a740de64ce91db89638 100644 GIT binary patch delta 299 zcmdnN^o}XGGr-TCmrII^fq{Y7)59eQNGAYs0}C^dWcyUu38X{=d_r6g95|q%uIK9H zB_SbyCSCsj{xmKwzR(SKOMwa)OM?7@862M7NCR@pCkB}C7wYV=Fb*=lZ0yw_ldQaM z;zZf{dELfqH4M!~kC?fvIJVRw^5E6;tU2}!N6x6pS*(<<0_tq>ba4!cXnlLdk?XL6 zKx?A(!rytD@@yO(J~FA9U#RVR@VEa$&LlO1ggdOi>Q@)eXx}Wgw7{6(cnfPx*WxSx zXCzK!4&<8>uFw7@<8~MmL(I~%)!Np|anCpJiTk_OW?t}zt(EVeZILgWopfTV!^z+u td+$8)e%rm=_RZS2L9^L`4q#yT|B!p1C+}X*h5w#_xSpM56C74hRQml(aKXo~ zPqe&swa%S6AG{&d;G*$^M>^+yG*2=V_4MwrFb*=lZ0w~l=h37ilR^}NHI3J+Y&Ed6 zwYRlZ-x|@`ZLGR^g~XDX-NtJ*49!K4m^}#!EBIQ>D9z8{IbF6aas8!@K-bP0l+XkK DYD;Rd literal 0 HcmV?d00001 diff --git a/icons/mob/species/kepori/onmob_feet_kepori.dmi b/icons/mob/species/kepori/onmob_feet_kepori.dmi index 7af39a1f676d91001ba7efc2fa93272359a842f9..93bb6ee443d5487e7bb19387a2012dc1b1e8bbd6 100644 GIT binary patch literal 5438 zcmds5X%ax%?kBA48Ha!XCgZ46B0 zbICPaLIs}23YP?TGZ%78P{9<%1%cMg z{{HrImhoGQ@M(oTnHqb%f1HuumwQRY2%+vopLqScLyo5jBgs)S1Fx7xz8H|!cUdVY z{J?h12$B)&xs>auTflnooouq$p=Sx-$?B@xBqbb856jqfUD+|*U+Wr3f~SCf8Xol9 zuiu{}`B^?v``x_tOjcz|yDIDIiNwS@X`AVbhMkEjk(YlsO7C)qHNxr|+v{*Y%;F;_ zM>^{C3@n)nU6b~imnKfFi9qLHb(xCpV}L*h^`Pb^juE-6aZJ$Q8j-R*Oki%rA0!_C z*rI*4cMADbGjK?GR5bHP84PI1BK3C{3R@PHsxbBbbnR)qfBlp-qKVm`=hsgS!Un&- zA7`axm{A*M-Ee$$YUA3%ry#lGkLw?t=uM^Z<9YhLMxzHA2;e@q2 zDOaKwdCRVhZP{Xsk49$TX>ET}!`&d}%XIbySWPh}GDZN^aj0J|r^M4BNU}9iXhGgp zQ7KmncoE`Rz>ztQS{CW)(}{fhlaqK|4VM{kz&6=-g9LNX|4ku+JO>;e{Y$<+X?e4r2MmWA2hEV z5cI329rHZ-Uv2X~8gI1Sx4C_feL!*W;$CBNW(duUEV)UwCAqfio@?y2 zsma%0YzyChlaTEN(Q1!Lac>SPQAL(IxawDf6}&9e3yeGs*D^``PMAdigQ z`HuoMAIq(%^p5>AM#8N3=bnifKmn%M@RLme&WO>15nOfN4Ubyo4|-3ei)2jvW*6J+mttkavDgObZ~9TRr#f0FeY8j+00UM)oiGOXkGDxvU*T*8AI+ zU-qIKe2Fc*=jF}wEB_)G-j_F03Il!ta^1#Z?MBzuC$7=X6?yX4u0#qe1zQyb^j0$> zdTN(VnQZw@|^= z2QOs28Pn&CG1CN%kpb|}OQ(xVN+Ot;Y#Jb{{mtG-4a7%kP;!plhcfqX)km>6Gt4=#_f(sa@SFvCu~3XxVv7RQ3J|6J zIZe=`--J@%-9EDKTN~rVb3#CBAlz-{KDBaX8^2OjC^vjZTy<;dK4y~{LTIEbV8KSi zD-Z8Nv_m28FARm8)K3_4)b?Wvhey#Z*Psp#O0TZ;(-Bw%+87XUG_^3LrW#k!R_>r% zs9`$z^if)I9){7UlaI?g`^B%Xd;200tim_(?Llki(a0PrPwbN}O{f;c0fybS&@4E* zaHBy;bcmPi0uDxcdj{9RD!|p%xZ}{amCT$%-Z+BPwvw5awD&^}kj-*0I>`oGkL*UN7bSHzkvYFjFbx%{0x+Za}pi_lEAI zBtJXcLl=CQ${34`uWmtnk#7rgw(Y?hhU|C`EKX)p>1>(i(FBaUbTe=d*}M_ADp>eJ zt&!B4!3JIn*%&)g1vo#x+yHH`KFf>^1eQXveWld>TLx<%1GWHH-01q*e9f5o_XXPm zvUMsX^`hcKuFpLIvDiZ(Uoys_=;*0;rZcl8>=gHPn@%phmn^lN<({Rh`6O|cI`h&p zW7l%tT;TM$%xK;a5&8GqPn0j9_m|Fpdpk(HE!modyyAVP`o_g~@)26h?f0~Y{HV8| zLn(MEPpR8e%7C=U!ay5aY<1P99<;Adhi>!6-+DN@sf;{E`k)JUVSS}&t5-`sA?c`- zAvBS;*q5Z1__Go;gv<}0GR0rAxID8mtEMe=g=Az`g0F7A5!4g-V|Lwue<=fXesiK= zISXU(UNCxJP-gxGKJv21oUlzdEhUow^U z8UHSQUM_uxejDI|kw@~*j$&!^!#Uzq+C;=cEqK=Nr{%1j8L&O$=TMXP91t4d%rWqd zLt{Rbc?B#vqWm+#XJm#>+0#Gq0C&c{6xQ&nsBhc z6l&kIIlba5V4hgW1$!FBxZPZcC|Wy-im*!o&vHpUYs$~DhrS0rx~tH(>znsSfAwDu ztD;upoS%Q4aO7q;4dBObgkGv z*|KXztXxhqW-L|f(0q{BB+eC?pH}RDczn(v$NAL>|5KGkNp2*g^@Y8g-HZ6m%3HJH z$xf9KJ#Wbw4=*Yf9a24pOcKw@1?y-8Ayl2tG0tRNgnHGK?LKIc+QLG$AZIS#gN_P`3#iolBd;qXoBAR+O+E zKD{_KK(T>0UNkV@I&}v>P5;7a9FlChdMjR1&Z-G)!wg-re$4Uf6gZkXT1~ro$&3bA=C`2Si10KYVTX8uYaA_CI4Pt|C>g zoLYDM=W8^(M6v6JL6YuIPtKyo<}9dh9^}DqAmJg z)pkJV=shJ7-M@Yri5_}|P^O*5Jno$Ap_K5n+y=GjF`Mj2TP!Jh{ajN;0LgmY|9@F0 zT!_)l*Qs`#D+BLFPR;C9hpjzsgpXG$C+33H;Xy;{dV0Y1&-ne6@T}eU%#m?KX#8P4 z-8nz^Ciu|G6)7gb(Yw8thb>ZhzLXrRb$_G*+6lWeFa?idN0$8_|1G4Kklf1bAtRmZ zv^fm(X!B!$awVdzHVWk9s&;wZ!LcwW+&02_!fIXG3{jJ6hM}%N${aV8vUtX*Yj7zz1ekM!pV_Hd{E6OIgL6`WU;_H=9 z0F~je8ocL@naUOCBpVNgz8U~g+99HCWw^U6v$%jmne7?_VBm82FEKY4E&$~R$mu}y z17k#eDk>`5{XZa?_nq-EV+ zel*Yid5b&t36nhpVEKy^)`u)E*FJ#RYvj||o0P)2^)ut+&HkMN6Ljn-t5k zbu%1`dn;jZQ@LcmqAo$)=s^hp*{Q36E`sJGYuJNG!K>&j0G10L>@Jgn%a(?+Z<=aNO*R2dji-Vjv+o2V?|CAn9ZT<+5k)( zArBO*RYB;^S_hYd%Ly)zv0q=)I2LYW3KU59LA<>sPpp3FVhuQep5-OaQs}9`rT>4f zV=R}aNW;U5p3y^R{2%_ej4h@O8jdTyKsBfO6`p#6_gF!1a-$L9o?rg#MZvqD)Lj2c z(f?h>d?n$-Gm8f6fgv2Sq}Aj_ zl+&r5UKoFDuAtbFfm(I6bFo-nHCr`^z4dVSixmO&@^K#I6jL z(3>rSR;?4zEe`e38L_4pQ!jo0%Nt{p2w8ex#;>xI`p6lk#hO6i!d3t!Mo3mp^!WTK tod1f?iQ+HHAn?FhldM4Tp6e+*HH0$zxMpcb~~)uvbD{sY?#NZkMc literal 1743 zcmYL{dtB1z9>;%XY31-T5-)fuwR9?8TIy7UG#z;fZ3#qJAb}_SBLF}H+-d-OHNlZwhsS|~6BdFC=;-J$F*d~nM;RNLe&XQdgFJrdpw&k@ z5N9V>e|N`(;G;GNEz8I<(=n!7Ezsd3J>7Eu^? zV?*fj@-l~gV}54fOFy4)(!V-uYJc4ZVQgZ7Kzv%`{0aZheos%dyW*BqvX zs$C)HUd0kQ-xb|L0$^9c$>z zFMEY$hz#Q>b$$^Iuagmu#PExAonE_y-&Axi zvGoQkGiyQ_N&PCUX2u|XUrQ^WRTnX}Zu)S~UT!Ne(^vFJ)$Dh;^lWPDL%2F;owQyv zP)Y14O-zk?dftSYl?>_Gc5q~fIIdH38$l~0&D4s^fo-!dgV&F8eWqFx zCY~=zg`K>m&$|#|tMs1N93%Mu@&Ul6>%B$>viYasE~w<}sqRDd%A{XbGt;GdQSxsg zgCt(GK=M*mOeW+#4(ha)#B1p4mYtOeI|T4jk1ZrW8o|1Tc^GX~KYVX>0_(&iAHQ9v&FMEG!o4Mo{-=Fbg$o zn|vA9?jrfvP;96deWGb|s6;2Z;ieHi<$++FZlQ2^?1Ns;&}jzD%h}B@R=rNnf787U z^Fl5Ex=m{vjTJ0ajij(IB))A~aPj8T+8T^9X>D5}6S+A#3i_lC13o9R|CIM6E;Dg* z8ZPP|`+7)GrzEWD?cfWceMr+f+9^~>zVfpC z>hIL>Z=a^&4v1%!S8iR0DAt%KIB2t8g=P$+3ZaB=-dC|XYyvm}!zHv=BS z6YnKGpcoYiijxZpkH6p+*n-d_)Y8x+(%kI`wt(2Xq8VR6S1k@nLTm4DvlEd^V?E=i7r&LU6H%pS5`hbCFlORohcGm^Soo! zSj6%0kUz%oHw7iku{1}4n0f9p3Jv3_tL;8mjX4UWV_3mv=>i3xMm5nk3l{wfBoKH`!4cIq3(R%XFmPD_IlOJF0R7W7L5lQwQ diff --git a/icons/mob/species/kepori/onmob_feet_keporiOLD.dmi b/icons/mob/species/kepori/onmob_feet_keporiOLD.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f352a422378a9b734c6da6d5770b9a2a6a7308e8 GIT binary patch literal 1676 zcmY+Ddpy&77{`BfIh826ttl&%l1p-*T_T;SqmeLK?w3MtnZv}^v2@`$DiP6!TGA}3 zq@gBqPSLC+yfBy0vSdy_)5b1m9jDGY&mZ6CdA@&qKkw)AJ@1LdsIP*q0sugLpPQ=} z0H`QK6=1~@rHiTd^H#bFPj~OV&CSj0A<)g643UW4mKIhz+S;ymW|2SbGTvm6;D<^L z-BWo!6ys=SYyj)`j2%QrYkGQ`LAyLL+7;-6{3Y?& zVW{ajV{^!Q19Nk0y5;r`&TB_UG)!B4r-4q0k=9MPF2-#0YrOsrlYD!>XCCKV<1gQtBXzT6Zer-ANM65%TDnAk$zS04(L~b9MGkE&VhYfHQQ|&Kf<{ zem3*xa=&1;6^5qSAJ!=pK_&U(+NPPQUv1x9zn@ME?BQU2I``3Qyr8PePAu9C*d1M? zXF^UX;NB|g`S?9N!%Q>p7T^oOzOwyeM&0X<#}9z@^)duU$lp9Qb;|}7dK7a*}+&C;bDWR)kMYkaOCLz?;MDPs7*hV+y21PmaPP@?w+TH&j5p9crmS za4y@mY5A8|y(@YseZV6aQf7{0_9Z-GX4TZg4r*^l#cjdLmNOU}Y zXbxQ45K!X_{_-DCb{x@Gy$Deul$6*%v=)EBWiZK^gUlj@Bn z4p%U`!iJLIl=`aqczi}rX5)b*Vt6e(Yi_RpHhF-}Tx7gH8mF1l{h0Rv**LwGGr^_6 zH>TwH84H(vrzT~~WR!%vY$5-LLYSDif~_&7nc2p^?fd16HnL!D6%iaAJ?H>O%z{rQ zGSF*^XD2ip5U-sr^2(=oT90hA{eUa#*yDhLqXY|y!|%e-7ED&)!FiTX(5w_OhtoJi zLTtDktupURt9$hY{(RzMn_L%;m}1D!wsw!a`WW2z@!IM9Ko0^0n?0H^l0_N4>!4{5 zgTdGVjPV-E;E{;;UpD!s>=Fl9d0?rSj8b(HL;m&0FIsxbq#OPE8#GdpTG92wZ>Y3g zYvcH5NF@C75-(x}<%q!^UPxqfv8_EE2_`Y*gmHc?`+k)J+p_X#v`S>pU^qf~O+x$$ z_6@sp(TCJL3#*=Xopf=8>Xbur$MsfKMmUOEq7GBDg<9>qY(H?(#eLHJ^QGi!K8&%( zHSNvp%J%Ms zjT6Mx$!CjIuJjB_rCnU+JjkN`A-51oq;&sNJ7VGz6DRn-vbGj(7#Wu)-%$rd6hmjZ zd_HKX4YCk4bT1#|e_lA%U4~YKhJcp3C**2Mp%fHN@qY$1oTkt_V(HV+RA^5YNzxY~ zZaKYNEf#mF5kpD1BKQiE6U9dQRLE& z2+iyXFA^+)$!B+73w^#u6JC5GyekbTr?B_ literal 0 HcmV?d00001 diff --git a/icons/mob/species/kepori/onmob_hands_kepori.dmi b/icons/mob/species/kepori/onmob_hands_kepori.dmi index 6dff1607ef57442080e5eb90b212a977a72608ef..1cd287411171528c02e31b3764085268e0abe009 100644 GIT binary patch delta 173 zcmeBVzQO3&8Q|y6%O%Cdz`(%k>ERLtq!WPHfsq+V-v9N$7f3M&_=LC~IB+1%dtVBW z%UBZR7tG-B>_!@plRh!bB)L#$hlO#F@nvJL2AO2#b&n<;nG~WB?Ah6Eth#xH#FCb7 zGC)ttc@!6~s0~C`-yoOwJ~# zDlfC7C^IJ&mpWwyS3ei9D*-P1FuH_*xorRd0GCNbK~z|U?bbmG!Y~kp;Yrh)1Jna3 zy?}@pi1iG5g4(Ss&##*iN=hHNDu4905BCgi$}S2@K6<_DqFb9g3iOa z7}c%Cy)4Kc^y<8mhxlg!007$&dW%_ZEj+IE_kVDc1-*w$S-}4Q0DzTgMoWX-dU;62 yXg65%lm(-QcUkbTbe9FcGwRiO3s=C_eE`)>30zJ066^o~002ovPDHLkU;%>J!G`Ss diff --git a/icons/mob/species/kepori/onmob_hands_keporiOLD.dmi b/icons/mob/species/kepori/onmob_hands_keporiOLD.dmi new file mode 100644 index 0000000000000000000000000000000000000000..6dff1607ef57442080e5eb90b212a977a72608ef GIT binary patch literal 393 zcmV;40e1e0P)cj;OgfB z4p{&)z-I^w2lg!h00WUpL_t(|ob8#>vZ^o)e?h^*O53|N{wXu-{fpRzr)+$vGZz~!r7(f) zfBC-?cE+_YOY-keKss1yz*BWoJ^kuz$dz$j;%)heSJl>2761SM000000N~$*?*k?! zz7Kqd?*n=zz7OQ#`v3p{00000006*Wq1o^EjUm1jd{QBCzt85%duP=qpPI}H!d_vd9A{d!jSBX-jKh6nA!JTCO5q7on^b2)Tt7}%GUI3# z+FULx_GH~&*395KKmY&$000000H4QnyuURzNJ4mbpr{j(rwZ-Fx^TK*|N8nr^?3cQ<`$u z_nA3_Sj#5oTK_UBk(p<+(B^hqu_x>HvSudN0RjL300000000009{>OV00000_|NzQ XA%HYjvLIjO00000NkvXXu0mjf6Z;me delta 1101 zcmV-T1hV_c36Tj+iBL{Q4GJ0x0000DNk~Le0001>0001h2m=5B0K2`CDF6TfNKi~v zMF0Q*MJ6C_J}Dm{COJ7jVKy#%PBbkoGp2f5GaDEf86F=I5s^eB6(p5ksQ>@~0d!JM zQvg8b*k%9#0FaS=G=Fl8jkq{7QZv&tN+6u#lEji!AXBM4Gp{7IC?h{VB_6~oRN~@H z$t)@c>F451D@x2w1+fhg8bC@jQ{$6z5|guuRa}&sLcF=9sl=*HFG{S$rB+$N)z1YS zA^-`0Q$)wD2UP$716xT%K~#90?U?Ouqc9Lf0YhA%IJg@h(k!f`(n41Z%d0bt5KS)xG4% zn@$wj61wE(@qZ?FAL-`<33PhAbRUAmluUY%C z3KtQ)U_%W{!h3>91c^Tj$N~|8lHgW?7x5luY!Nazq}ms_$(tWG-2G^q*b#{&kH?0* zxdCkQ?gx*l^LdxZL2`PFV3Q19?$(1!JGrXa_cZ1YJY4IVmPMS6WrvjHaDE6LPj7GNgnU< zm_K_2pTGOjW2&c^9n(OYBRu+;7Zez$ynW=9j(UsOHA^ipDhPX1)pXAfcPN;_2KTWj z7y>zE+8%>~_woMpdssaA9mltvapafiDvCHNdboL)&5)n2?4?b**NCkhCv9Q60 zVSgBgVHk#C7{>2KdlIGIU7Y7RlK7&O3Q5X5zrLPlKDN~MN`5l)ykJ8OO9Iu4ASu7b zlNTF@X%hW|)NieP`s%U!*3a)wV3g%dM zLsDanF_KfZNSF$W9%004jp0{{R3ySZF*5+B`&qf3a)-G;IIGyWK~eBXk~#<000A9NklNl@ z(vf)6G$fw}YFHAe-dIXPB1rsMK))W({T0ES1HW?XFdb@a5n?!|+7sO5 ztu{BDrb0#_5=kEK@t8k*1fReA(POHom>ttVnm=_cnr@VdSl#Y6f*fmQnFe(Up zQ`L0O4|gb-!3OuSC>R1cW!fHtg7@+M^m|x5`5ni%oN?rr=qidhDtfqim(7r$uI!}s zC+sIVqDTdQl(DeEhG7_nVHk#C7{>2KdlIGIU7Y7RlK7&O3Q5X5zrLPlKDN~MN`5l) zykJ8OO9Iu4ASu7blNTF@X%hW-7 zXnPC_u6gVV=2&+_Qe%xVl2f)wmY2IyS$WK>R3oHvOv5F#&iXQcQmsr?f!!QiP eFbu=^E`I=Ar#rumE;Yjd0000 literal 0 HcmV?d00001 diff --git a/icons/mob/species/kepori/onmob_mask_kepori.dmi b/icons/mob/species/kepori/onmob_mask_kepori.dmi index 610c62338c186ff5ffa7d79b0ccfc664b76a6bbe..d455cf0bd3e534b48b5dffe188230811c127b4ad 100644 GIT binary patch delta 168 zcmX@le3{X)Gr-TCmrII^fq{Y7)59eQNE-mL0wXh!%#+HD2U5%dJ|V6^dU=)YEg;2M z666=m;PC858jzDV(bpudP-lmQaggz4W3L98WaV{_CLNg+q7dxa*=?-4d4Hx;Tb#%uG&@xCi7tU|?jDyX+2RF?hQA KxvXM&0L delta 422 zcmV;X0a^aj0nYZFb8bFkllzJ;ciPs1*1b$3JAvfHj z^YceKbdDd7M48?U6mY7v6w8(<4NQ(==&2aG$BEY%if5E8hc^^OQLe-k5P*lgR;!RFihT}VmqA0%x zSoqmu%`LI$-wq3Mk=`?~b-#@NT?2Km|L#mUTi%5|VQ8{BVLmh{it-mc0K%CT6r8z- Qt^fc407*qoM6N<$g0?`UQ~&?~ diff --git a/icons/mob/species/kepori/onmob_mask_keporiOLD.dmi b/icons/mob/species/kepori/onmob_mask_keporiOLD.dmi new file mode 100644 index 0000000000000000000000000000000000000000..610c62338c186ff5ffa7d79b0ccfc664b76a6bbe GIT binary patch literal 463 zcmV;=0WkiFP)V=-0C=2J zR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5 zDKoDmwJ<&@F()xOC$TJ1iHkEOv#1!Por^QAC^0t`#5TmKKEAX7mlkCOS3ei9n*fDD zE+MFDY>xl{0O(0XK~z|U?Uum}gD?z5la>L%FhGJCAaND|_8+RKQd`HNfeSrUe&WDa z@+~`uFB_v=NY~c2F#udy?@di_Ao3bOl$DfvD?y3Z2r&eHOhh3!+@kaIM>=$lACE+t z-V79QsXyI}7RE2X=!%AZaU0 zb4Oua27yFCyF`T@IZRSoSoAO2I-hT9YEnL`uB{C>G&E6EI%0AFtSm1Zq@(AeuBjKD zWp=;JvAP3tAuujHlKh%fMj%+2{)EIw7V(7)A~BA3P9W2nA%Ec|C&Ae*#@sL3H!3J1 zCMY}%1iD`6@<1gYSZf$gu=YN9GdNf~u{UPH#-WnqY%&If*>x3giYxIJfgsW9i6tuH=p zyA1)^b-~3Ojs?9HP(Z8A?#dAQv5O>XYS!R1wFbKPxPznNQm*xRw)UxBJ(4Hj_2loW zCrahtM>{FYck619({YwT=WL!tGs~6JbymIn_2^D))icKtr?5RabT(nkzL9j4-iQ>q z){Z&Up3JR`QHKo&ViY9q<&S52FVAgN9wSQoTwgNpX@A2XSGjQ+&1r|; zg{uvkCRh%^h^AbL_WJy~VWbk9I4XbV(GH}*QKx8-@46S_2zOx5qebDzVR8Se8j5-3T zSvLQ1ubt(Z%=&y6OP(FBny5hv66|NlTA#0}S|~-> zSF^I^$G|0|sDL*fC6OCei~U3=ovDSXLOw3;HM_z4fn;&Jh|K*SJAr#)uYA$A0%IUt z);~EM+11j|Q4mV-O9u^cv{w9E86D+K%0sGYGat!n?5|8_gaic}ZNUKpyw`K{J9O91 zN_0JG&xQW6>4Vg!6m0nI9~5dNzO-WA+T#SW*X6+Vq%Skv0T&3TGPKxdCHKUk#6N&b z$6O7eu7e(o(mxf>;OU-0?-mcXyY0tSZ|}Y=AFzt9BB$=lEl^Ri8Ct{dJ#fbaPd~=V zlD3f#D>zUwEZDkR!TNT;OURm4$qx)3CroplKg2qPZ*h(ZvD3&t9LouBR6vu}nb1TC zp>xFkz3}7h?RCz}O-hdQB`74hs`zq3 zEdRa6N?Uor)~n2Llx!}K(~$hrn!o0Kf<%7M%+a2kZ*|F?(xsDwpgNcwHkTRv@m4=@Pg5Nl2bW=jp^ z?|v}==F@gnCzk3G<=my~F@#-|Te4jAtfkwwE&uA?wZNc{P$)A3i2r_PKGEu&;E%Ls zdqxi3Q+bMO*TnPAJ3ISvb^+7LGR_#c1oD2*ggzsh_Z?w067XZg7bQ7=v+>z;4^3)z z>1uheojqh&LdtVF--{Sxl)Il$4<&u6B8_Or%C$B0TSjybvp7~k(>sd1#5zr5O&(K| z%ksW?Ec9PXiP0zRB=}-yxN#XN9rM2SZ5bPli`^R!UH3bTE@_Op?=fNqV2LkIS+tVf zD!)9exmv=xpa%1aJ4f66#KHvr_LMkPjS-xCqZT6QgY0~cp*z1!P?xVw#;vMz@ z8fw^+h5}mSr@HID-x91_@cHf@_e@l-t~^aSqP`(;*FMhgzGAUsJmf z5#9z&#b%k4X{*Mqn>Q#a>BNj^wn7i!xP(Ymo{RcR)Z`i7aQ)=$yCbmC=GmOzdJOLT zncZ~ahA_IImY>lTRJP*G0dV^ECswCA__!RS!Q~}(E^ogt8{M-kE1*en(U__9si734 zhuf!E0aA5Mpy`b8c3e-w z(p!Y2ehf*>NYw%WOUEzBeyzJj=XH{K#mddt_wSN!OeF}A4O@F`l7X2*q5_GUiu2>e zpToXe;3ja|ar3ic2`R~8RqpK8+_fi=ros9_7H1x;72PE_t^pg2{OphRpZ0E+zw@1N zkB;!c5-)AnL@A0gJFj}6Y+~=b4#d6hp%;`C7kgvFWj85E0ZIy=xOBy@TV08$YwV#7 z&=&@_w@}Lb5)=yBeK4%oFABb65WKg}|7}a-(iN; m`Ok9vAMJm4C5{hlh}#!oD}3eNHVJ<$Agl9s=GAAfB>e+JHowLI literal 5080 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≪mjSoXikWpdtS2Wato1-04o!ROb4}d@i8v1!i7|MC$w@|bo^fJMm zb#I;XBhzhk|Hg=Vv&aG4|3q;q@yORRkkB>h7~s>1KKre~H<`hDp#rfm=DSTTXg52q zTi)%eG1nSC9RI8fWUwxho%2~BonIk4n4VLN8SvAc$qhKQ4g(`km8FVq3#-1n;aDNG zRngmShIr;$!M9BnYnQLixnP)6{U9VPcjw`HB09P2?HT3j>MO!q-Mi?X{rn6?vhm0` zS>T(?R{oE|zY&|Q?5rCUwL((rcn&;C{tm&5v(NJH$lh>%hJ5XHDaUiXKFeXRiG2G& zjVCtu4$rjNlqz)9J4nUR16Bh0apV5l`oJGhS-VnhZSF@}?5l)D$M5=g+UWPf&R0ps z>5@)Jr}i9&LBP>TZ`iC>Gg%k)ADYF(Oi&0e6U(PH?ZmH3Gu1vW9~_K+T!ko{go{|5 zL4!5-X3*k^5r^deRMm(|ST-y>P&>Ch%g*EX{v=>cqPILak$4OmofN-(mSz z+ys`@{)@5y4v+De=)S(k_~5y3k2ma#gJ-x|%G&H=+un?=6P+dw_nvJ$_Q!>m{eBmi z&H*YjuxlA=BU~Fez~>w%PPXfy4%QeTaCX}7o*;28>j%; zsn>RTLHC2b?;-m+@#$%?2yu6?hpP*tLP;ehFTB-?1K^!Fw0S>yNN7rDOMGmp z=qgh>3K(Fn>1)VDJI&80u?Ow}zvI)R3yQy-*>}*(@w>^FB2S~Tcf{YGj)poP;R$*DBs=4*UR4LCtWV4v@f*(yn9v_JHZBa zK+~V*vtY;0LZ?+MZx|k^-5|ZQvLKAzNIR3y<_riEe{kVzeDQ$JpM#cFvfNF*AvdZt zyBZ&E#6HMHoFj)`LEIPcgMr$1e*h#83GHUc6uh=a*n+{Br`1^vD0KLuU;rvYQ!YTDDw=qd)h z4fCNXLJ8O3x_j^*L@|P^V8yT`AI{321{FE#nOhX7_&^c2_xXt`UGj4S`O*wYFLuk_ zgthyb%*hjAaLB_LaW4bS*|;Fr{*!i1{mERKsDcl4=`OFIi(}uxKaSPe^`IY_{+>javA?i`7!#UzpZxwbX>I`4>XdTs`R=2-kr^;zb3Dq*Evpn@&!#3w?9CR?05 zAy=6cZlBD^l#8#EfAfE7Pnn2U(5&;4gp^;5nFwWnt=VrUD{a&a(bi5g6q~D7Y}TAG zM3Y^_sAu@#yS^Xob%0kYZF^X+$Y&2==o+pvFZ)g|jfS)8>irb?hO+Gyz86Q%)gxaT zf2Jb_p-2eCX01)6>^$w&WAO5oD*ScFN(B?2vhA3ESSJD5QSJIoy4OxOD^#@h5(}%7a*E33SaQra1%hb4h zR_{~QTJL@YARATEE_bnlX1EKGNF2!st>@2zP!fL`6-!tC4e~d&J`%$7Lqf z5Er@A;gsI+_x5M;Q_pniN$FWR+VY)^Pg@ByXXD5Mv##ajgtpL&j<4`L6`3S|j{`8< z$`PF=R{FhHyW$2p_X0)NlOfIABDV8tZxHOS;)^FfN(-1hh!tqwA^G2>s70xiq&9Ko zRM9_)q@?yyPrr4t;+KL)QW2EYF6wET?;QK`sji0yYU)%+8j1Ffh3rs@DJxZgrli01 liB)f7(%j!pJEuklUu%~&sp}eieDW8I2BmMNSBZ3s`3E>9sjmP4 diff --git a/icons/mob/species/kepori/onmob_suit_keporiOLD.dmi b/icons/mob/species/kepori/onmob_suit_keporiOLD.dmi new file mode 100644 index 0000000000000000000000000000000000000000..4d5eaaab1196ad921406c50f5121e573a7851188 GIT binary patch literal 5080 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≪mjSoXikWpdtS2Wato1-04o!ROb4}d@i8v1!i7|MC$w@|bo^fJMm zb#I;XBhzhk|Hg=Vv&aG4|3q;q@yORRkkB>h7~s>1KKre~H<`hDp#rfm=DSTTXg52q zTi)%eG1nSC9RI8fWUwxho%2~BonIk4n4VLN8SvAc$qhKQ4g(`km8FVq3#-1n;aDNG zRngmShIr;$!M9BnYnQLixnP)6{U9VPcjw`HB09P2?HT3j>MO!q-Mi?X{rn6?vhm0` zS>T(?R{oE|zY&|Q?5rCUwL((rcn&;C{tm&5v(NJH$lh>%hJ5XHDaUiXKFeXRiG2G& zjVCtu4$rjNlqz)9J4nUR16Bh0apV5l`oJGhS-VnhZSF@}?5l)D$M5=g+UWPf&R0ps z>5@)Jr}i9&LBP>TZ`iC>Gg%k)ADYF(Oi&0e6U(PH?ZmH3Gu1vW9~_K+T!ko{go{|5 zL4!5-X3*k^5r^deRMm(|ST-y>P&>Ch%g*EX{v=>cqPILak$4OmofN-(mSz z+ys`@{)@5y4v+De=)S(k_~5y3k2ma#gJ-x|%G&H=+un?=6P+dw_nvJ$_Q!>m{eBmi z&H*YjuxlA=BU~Fez~>w%PPXfy4%QeTaCX}7o*;28>j%; zsn>RTLHC2b?;-m+@#$%?2yu6?hpP*tLP;ehFTB-?1K^!Fw0S>yNN7rDOMGmp z=qgh>3K(Fn>1)VDJI&80u?Ow}zvI)R3yQy-*>}*(@w>^FB2S~Tcf{YGj)poP;R$*DBs=4*UR4LCtWV4v@f*(yn9v_JHZBa zK+~V*vtY;0LZ?+MZx|k^-5|ZQvLKAzNIR3y<_riEe{kVzeDQ$JpM#cFvfNF*AvdZt zyBZ&E#6HMHoFj)`LEIPcgMr$1e*h#83GHUc6uh=a*n+{Br`1^vD0KLuU;rvYQ!YTDDw=qd)h z4fCNXLJ8O3x_j^*L@|P^V8yT`AI{321{FE#nOhX7_&^c2_xXt`UGj4S`O*wYFLuk_ zgthyb%*hjAaLB_LaW4bS*|;Fr{*!i1{mERKsDcl4=`OFIi(}uxKaSPe^`IY_{+>javA?i`7!#UzpZxwbX>I`4>XdTs`R=2-kr^;zb3Dq*Evpn@&!#3w?9CR?05 zAy=6cZlBD^l#8#EfAfE7Pnn2U(5&;4gp^;5nFwWnt=VrUD{a&a(bi5g6q~D7Y}TAG zM3Y^_sAu@#yS^Xob%0kYZF^X+$Y&2==o+pvFZ)g|jfS)8>irb?hO+Gyz86Q%)gxaT zf2Jb_p-2eCX01)6>^$w&WAO5oD*ScFN(B?2vhA3ESSJD5QSJIoy4OxOD^#@h5(}%7a*E33SaQra1%hb4h zR_{~QTJL@YARATEE_bnlX1EKGNF2!st>@2zP!fL`6-!tC4e~d&J`%$7Lqf z5Er@A;gsI+_x5M;Q_pniN$FWR+VY)^Pg@ByXXD5Mv##ajgtpL&j<4`L6`3S|j{`8< z$`PF=R{FhHyW$2p_X0)NlOfIABDV8tZxHOS;)^FfN(-1hh!tqwA^G2>s70xiq&9Ko zRM9_)q@?yyPrr4t;+KL)QW2EYF6wET?;QK`sji0yYU)%+8j1Ffh3rs@DJxZgrli01 liB)f7(%j!pJEuklUu%~&sp}eieDW8I2BmMNSBZ3s`3E>9sjmP4 literal 0 HcmV?d00001 diff --git a/icons/mob/species/kepori/onmob_uniform_kepori.dmi b/icons/mob/species/kepori/onmob_uniform_kepori.dmi index d9bec6e951851ab6e089001f2732c40d716712de..d6f011cef3122d717d12ef7478d5790dcb81e76b 100644 GIT binary patch literal 3279 zcmYk94LnrY8^;Hm5i!yW2{SgkUMerK-liHRLNP0Y+QKBHmb}+Q%vGaO6opjsUJ>%P zMAK$$68%?$@iK%)#Eco4WejG_o%_GF?f(Ct&$;)W=bU@bJ?A;U=X;-f&6D7ws;sSy zKp<4zT%EiS2ssRVI4CK=E!&?Q;=&hePj_$U*49?jEm|8@)qdG-knCisrG+*!GiWp6Gm4zvDU}D*K&MfN4LB2TSWAZ zW?M@y%Rb8k$vQ#XswZy0zU_@68e7&FGt2xIH-%aUrlR=?1!Fp~3I+xB# zA{0X#ygbgX8NL&u;2+rJ?Q?U|_U}U4KQ=pJ^%FazkJ*2rPg7x^ddB03sh;GQ#n(ZtJ*KO!CxAMc4dVfTum~4gkd?b){L=_?Y~iw zjTrE7eLH%#Q4-le0-NroVTFiil`HL?i35k-%&Pb2dh8#$?pex-JDZ0&_D-*O0Eksd z6>nL)*Vw{f?=DWiYvTKJ+wt0kZ!vCGx0H6uVr?-F#wl8tB8u&CQvf?&^7O%=N>#UN zvXX^@_midxrqo8!xLu1niy1Q*ndGvD4MdLG4o$_gxEtz3*WTT)XYI`8@@r<5M*Q*e z8)FoTE>uG?3LZIr%Y$X-G#*no<=5`Mn@;ZCuNSZF877E>N~L@!Xnm-j!+)}cLP&;jbb*<-Z(hg-wVl8|;o3MP-`js!k~ zd^%YMF~syuF&jL_*PV>LklZO#*@Xx;Rluk&%vnV0cP0G#N`(HgM(YG!&vwbE9Qt?H z8Fbefi7pL##3OI!%5p2%@oG-<&^2c|^-tn;7W$=HZ6(|BM_RK_vyA%)pi+>&W!W{j z1nZ_5@(1o=%9Ij#NG7+5i7v)HCrI+2sa{~!Dw|_K#(K%Nq?(QE!9z|TOs3ZV2ohcb zh2@6g%V6V(oTSu1wy3RNDKnZ@>^zp@Mh{vnyRwLN=?p8WHY>p~Hz@{4cSv+A_dH~O zM7lo0Sg16lOSbusr*d63gExoun1cTJ6z|?em%iY3{oiCpc|r1dsYbNpAfe^cX^HN@ zPHsBY2iRC2k9voZ|Mj|ZzaZtUek?UR2eU-(7OyS+`8@pUE>%JayH}-||LTX1yW(##Ag$L=vi@QU*Ht2m`Djmu=w@REL z@9jaWw%PhkWt=^@E;mr8XP$Av)`mayx18S3E8(TmfF z;W@n7{^=K+?Ot|Ouq{;HsDlh?I%J zjwaq@3hsh(BJ8Zx@#+k@OD#~Mdrnp~A;K<79Ut+@D`M&amY_$7%wfpERZcj3>JTFB z{?XOO*T>Hn;}!yRr9Z_%9f38^wT67wU){G1G_T8zKBoD7*=qzzjz;0wskcLhB9Y{o zf?fQ}@$IdHf~q4@q;%yB!vE4|;iQW~j|jV65xR9*5(=GR4G8SDYU-c;<=pl4KKg_V zmxuCa&8eEVZu?7wO(R=FW@u+47!R$Yqo~OD83|tUR_UH#jSoGjfh58%>7RtmauWo4 zRsp8v&~qSZxUzTPPhdN~w4iT5x9)efN(xfAHgE|TqIW-0`iWwg&%?_YBM7f|Jy zGVX3MRjre5IfcS6x_H9F%ecu>Y^)6PLZ(y+IS-?c!&QOGy1vmyRh^JuhQi>gWe${D}@8KwlJ7xiZZHT;KjTIS_mTl+!KXGxId-!%*;yFVUo zEOa-BOG+eRjg~&Mr6>yAqZJG85~lOjL!Jh$lv93@#ve}N8J-&>eV3XI7|NubDFCHv z!`xzHM$3v^$30%OG+wg^SKQ9eHBO~)DE2Qaur+6fu0I>-89>A z5j#Q1I)NqzRhF!r2(G5tz8o9mojXd2-j2Uf(8o(qy^lN9E4aHRD3xM}n=}-)BRAo1 zsCkH~4K)9e2xr$x%PmD>YO{zQlZ^M>Tr1!33B}YnZ~sPs{TbFz!bRAbogzAK^!s-} zP%Yf|vM)TNloYzb3h?Pj5QN)M=DSi%b&-czzVoxngQe z+j`--q5z7_1#$K2_$$+A-ef+I<x~Cs@Weo zC=-8rTQ}O9M!8ym>l9&MG*dWG8lU`++M^$|8Tr%qEz`Y0hWr@hCBmw}__@p@`@##h z6_XFZAE?Fdw{#*+=K2;_gcp+;IXI0U!!CxGn0dK>g6dMZ1664#_N*DOREf7$9RqH={u$naeuk+zbV&}WREZu4I zpzY3?XEsR|wjU#ZX?meEx0Lf@&)kCe_@l_>5%Aqs%(wK47=e%)+H%i zp>a;&u?-Fa+7IR2b{@T#B4VF3o$FEP0Xz!+WLKP!eaRDdwn|d96&-#vvyG8-go2Q)CBZ&gD1k zVeHJ~ZCG0cHLmWxtXt$Fz?#Tp zKd3Shj_4LdHKi=EQRJuVzIs~Molx*N`!eLkP> z?>BSJGtV{GGc(uxq37JU_c>?B+H1Y`d#&wfWkqT1N6#KXAP{U>8Oe7L2tp404>~Hi zv(H2C_l%_YZ+1N#SW*^u%)zGYw?B3ZWt81ze8qEE z->9>G#weVW?f5Pc*Z5v43i0t{_L6VvRo|MRIgNMUAH)=+^L8iytku{OTAUULT%0cQ z;t2?D9ZCO;RdKa4WBBEX+*of#y1`eXXgmMs2QEj6qVPi=o4Jrly|FSWf13F~%hQxw zq@P`nEEN7w>h7kfywg#bY|Ze@lfeoa(AMYZdg|5oh#jkv#dMo9kT;T%VC{sLsz`n^ z9(o@VGD9I0XT*Jre1w}r_Cq=2f*-%dC89qnRwV`>m4Ut`EG3=!<&Wq%qv1oD&8>nl z8_UnhPlgt>wAWwqcey1eyE{1&1_X5^M!5@n7;nDd>!NpPiRqFG*cVA^%USD8ei@w* zi4Tp=`L%uAVO`-CRxy8gcZq4wN~{ruI!y(EP(frR#Z}!i_S?O@@h{q8uxC$e(@j4P zhVI9Ypy1&li>n~BXe)d2ktLNHmg+h&q=+FoJu45jn$l)3Tz(utT~8q?mcy-EU;hbh zFQ)Npw?@8`WjNOq% z!V~a#ni$3>D)hiHWH~YThv}3NUx0_X1OCU4rgSZ~3Dvlpe=lydI~n$NwA0VpZI$HM zgbh)vTO)lsBJATj>%)4FNa5pC(HUK#$!$>XdZ%35qWX8&KFJU~otlv&9m5ZP>Yh`jtzF=S$IB$se$;SQz^#EYbf{@edAKss*cfieBv|oDHY< zY7-U&A`4cC5X&;2gfI&ud$V>`k|eB8r#a~vIRnj$s;WG#NzE>kv9KNq=n;AQvp{C; zYMFhj>{r@*VedGsqjzt$KOl-p`EXsTPs`&NgQj>f@2RM)l!yCP46)8ptxUJpm&DSh z%ZF$;DLq0je;bc?9&QWk+)#R>Y@M|be=)Io@G^Q0zwcar9`e?%!7au|o8^BQk zm(9CTGc80izXPS#UHMzYZ>jBwE7N>wHZRLp>H{LkwQ0%uPuF6?Z_OvfFAo7!D-1`4%S=#=-F3Tr^@GL=dV>PB zoO}12oYrhyP%Jb6DpRN90Okp*LZ#b-NvVt+9Eocr#+*!9k# zD>1NnSUhc!{YJD_VH37|(=mWiY&cEE$ti+Rw9f;9L`)$@Oa&4pw+H79Q1&o-VL#o# zYetd!iUVP1@sdS=+lRn z&m8}p^V9Sez0iLJQK&&>!~6YD%ln==ICrCXD{YJGMj+AUt4vWz{xfMe&?84gAFLs@F_yl9nDr`mYg`t|7+l0c<)Uo+L8(+yE$%`~ZJ+5!OsrH>f&21Q& zDe+G11s@zQwRI^@4mRInC!Cm=I2KDrKoha+EjoC^eJMWxUdXPSpWv91K#&npaC|PS z?H8-*%3-hUG^q=Uik^4P#)Ns}PFM^-EgDUwO^bZf+rY>1Vla%9J)?7#7>(k`OT)gr zoA8vbaH%sX^?tD&Ax&K4ONI)@uzSDHmG_i`BDApvcXB5k%IfNbNzZM%S8Vptzyw(2 z12eD5B33;pab8(4+lFHN_>%_mWhuDs$*^X~JvPLTo87E~> zv1WZ?j~-I!TmE^=R<$s3#um22W&T+plY-79XDY>MnR$szC$rZiF!ct$0OSD*lUBjZn=Z3;OW?=g5Xp`&wNOd*Y+>5=Q zVj6e}_8o+fPb95}hA1v$)UGVYoASud_mGpZ zSn^bKRO}x3yVnIxuqp2+4T7+;0Bz{D9xPu`4CXPaFne<{Blg;0)`pjl>@oTQ=k@5x zD=DuMea9g~WHu;eWqx+tk$48053UtfCfqU{fSO#mCx&XmLu`$j}?B1KX0aZ+Pzt` zFh%_y+ei$DPhkQC!gyRgZLar?a*Skb|C=g?2XevKR+Fs&(yjp8T-W~kVB&T%rj%4) zo?s*l=BC|Qsz$rGC#G~injiz!AZ@rG{RWlhL96!}VP3zO`I`584$HYiK4jUcAG3^> z#K1={rX)nk!3*8*E`6YHuc~3KtcpBS#ALwl_Pnf=29bBubz{{U0?~oGAy+07RyuP+ z3N{5zx|JcFL<8RuAeCFc`lrjDEnU}dvA75b16#~&T;Up!b;g$)MKDc$daPuSowJ71 zA|mJue1KZ0oPXNZ8l98^Gn0iR@R65e^1apq%fpYDvtFy67-W;Dl^xTlWrZCs`?uD% zG8}ZW1Cu$wJ)S*8IaV(q4IYO^N*)fPLDVa?X%}PT&>__eD+5*k7 zgArb?fR7fs0Dx`k2y&89i+k2emW?L(}Z!K|8Dc%WoJ zo-nz!$}NN;c1hX+|t&#ASI+0F}Edtk*GqGdD zfgFQCiiP^u#q+R7jPzCc6EHwMyA~E^WxV&bu0wPI4XtxbR6Kt~iQf**ZK}GWN8eMf zT3vLsd279lr_WqY^qV|Fcp|ByQuCvKVXnC?jX>Gjr~jO!PLhWS+BAY%F=PO)r*{2l zbN@q3KGaPAAA;2Xl)-|Jyb;sVQ|Jjthqs}wy}9_K!$jMEwn{4HktLuVtseH<(#Cp0 zO0J@lJlDNfZoZPxjz|A6eM4fCtH2S8|StMbOhasp?xyLgoIe`3!N^Z zMRaG0pJf2GarPwQo=;6M6OIr8r>^!rA?v=X0=D8V=fg$4%+;3<+z|uJd$A%^ z0bVy9O=r}Oy{RhAY_G_{&4Pp6(}(7dr{tw~*>knFXNpfCA4xUGzwkQ0RQmEs*Af~d zfKc-&+m;8xzkVuhu&1uNsaF3{zZ|Nh$C!fRn2D|(Q|YrMIb8uO&AB>B)xAq2UAt1N z+f6^)2R}VK0jFB76KIw|oEp?C6bB7b@2TCqSGSswkcj~qSGUgc{8Qxar__QUne-Mw zpP=zD!y=a>mZJI;gX2zd%lJK|D`Kf@%kTX&`3n8Ui%elJtsauZ}d=Uu|%{b zz>#WEcEwX0=!JRTwRSzKy_R&eV$8D*2z*XE8lfwV9u`GZ$IvV%LI<^mHRT&^nXlwEVr-*!cc49>ITSQnq}qFJ zCsx*296zI%f3FkO(?x{IrP2f?zyTlg6koLC#CC#otR zao0Y6&z_i+baA~o=lngHB2Jk>f3+^XzG@Hr3b^-CYg?uDm_!I5J;`ZfG&{v++w^b?!tkORsZv^fAOJ?wOdF1T3*A zMRYR+FV)q;=)Ndm(yvgD3@P}y(Kb=Bum@dTCCUpwX^0<7`U|7L>8eS-%pYaN@j8hj zoks8QUGwW}ZOzi>^b8LVmueaay1eW>4x{Z0Y$il|Lqkh-*Ns7Jy!hkSOC#{ZdE)`@ z@ZU$$qO&~Z?@9EZCq#Q|PWlzl8KS>pQP|*zUJ%~GMUm@Hi6VkRbz?}`>(@I6qOR+g z9-VXL)sXWYJ5mE|%PIXG1;>^c$g$oDET8n6#*oS(2EM)!E*=boxD56OjT2f?vwu)i zxe<6na`N(C|7c88)k+rf>1P2Ddy@(l4=^yJi(gj~NHxVSREpebeZc-x2q}MP1lTUL zyphtJ_U>UN|H?lcFmn0S3_<0Fmt#`}fza|00}~S=HYySTA{ItM&37yg zUP9yBV0TlvmIL-OmL8ys^<;|_F{U`AkH8?SpF`oCO&#y;K)wjWRcU6)(Mp`4YK_Y~Y@1>EJ4JxM+FUlMXBb_zp3jq46Vk9ZMka*3!o zPM$F~!=2n*FG~#72M*%E#&X(Wbz`&Crv=DeCR(RpQ^(jfxZ(p?P(FZT@=YPboGw#v zrMELLe<3Ag+~tWY2h6hsuFP-^l)0zK`d~;)A-uvYK_zs#8LiB=oS8vJk z-Eoa?#SHWK$6bNbdy$^A{REk$JVlG6NKD(N^Y9DpCoj5a72T_>&n5-P^ag(&z=B6{ zeq{La8E8Gh3`#+gukdBZxNy!n0>*18sSxn98mg-3zyE$r_t#uSL1bT%(tel#E{J{m zL=MpjOo)GHDF6Q6Ekrex;YC zFG-g1U}rf1d!w|W7Co$|A4T-_Z?OQvkK6Fhl1E33c2^bVue@2Cjx37eggyh5XwBzX?+?5|`Dy_*~KU zXbP1L<&8eh>kq3qeTNPX?S8z__*w7h;2j)6eXf@2 zMGrV~ZyeZ15_4V+fyDbK1*?7Y?0)MO?XYQl_4S4yUcuXFUdS z=u?e?WV$-fmzJ21YX5$Qc{nxPW=C}q4Kt#bp67NI87hiTnj8yHq4{&CW1p&h+K0{w z5nHDgCwT)GT(vLHBw#+Z#7^UeJ}2eGgW#Sn4C&kTcPv*0J|6 zX^9vZsT*L=00s9U4Z|8rDh|$HUN7A@LU{rgHZYz!o84JqiCdN&UAlva1BSKWWy;YR zMc5%|lrzs=Hi}U4U#+r*c;mQ0PIhf!R>Zxn+Li&eGC5>kqPgY6u%$KS3n|scTV*I# zDZ+oKF+e__Oz%ciJMUHrUCd!71zWs$4!eE+i$=AwjblUShh6%l_5mN%KQvs^6$T^i z_k*zc?ogvSWlGZIP2u~W?x%wmQjpAZgw?{7ER7M^seUYNU*6CAu#CJsW0hqjmA$!+ zfB4`9`fHt8%oaE_&I0g5(EJbhRgem6&*r$^FqbI(D~AOi-M`9v3KX#wh5uEZ?0<@P z{}YKVCDVU-;U-RVW_1JVTA%wLwkv35dxCWX+Xae~E7vP_C6=r&E7qdD`jrUO{gK@O z)@B<$iqIifir<6wh^TAA?B<6Dh0I>On_0!H8dAWy-CdK+*Amj#D*E|x98Pg@NjE1y z1uVUay+yBTanNqE@BMggI)Iv&Y9!YQynNE3GYE&q6$@d&DJ>59{a@;JaO`^t8iS16 zfDM{WtR#H)zOAE3w=_~t9o?gll+zsl@CzR*Af!Yf#ObD_M`!H61rI2iCc(1SdJrHL zS%inTWbrwJ3FOA1-FfpSC#h+mOd+-9#*m>vmQ!C{CR45>#A-2OV517?v=h=*iO9S^!LBUy20s(Pl9lH{)$qRV%amE)*Pffont zL?X7TF;1bg^b*(3&zBQKYZ8FY$S9B-ktz>=&`kHt-;p5riG!%7tny^cXaQV2*^X`} z0MjxfH#SIjDtZHBI`OkMeq38oQEcUcMhia6u6atDk{-@D%6jC|0hc>Y*rO$fe;TmZ zG3k}ad2pmZZh5+@K#tt`n5s1dyak8Agtv4lMc$MZNrByo$5;*Mm;~4_g9mh(4F8Ydgun#A$@5=u$^+np zs;-~((PQ~}z z=qBv&q004PdkY4rbNv$yrS8C$oHLmdP@#6*fux;srvH}a!KMrY1om%2qpsfUhm8$P zmFyPd1$R>IA{0Qz3W^3RA;mK&cWZ(`g`Voq-#~tpant;H=67tBZE^LOfAD1pBrIn+ zkTBV7ibGJyreBN>{^}LR8(^RaPW_Kk2Pay(4<5+kp$i)UfR%$pJsEz$X12b{W2^&q z!k=lkSSJSTM&BBvF}?P0fJAQ^$ZuwI*zwpafhAR9?jSu44iA5nOAi)kF|PY`pUl5A z)ZyLI;C&c^G7q@azf*Y;Kww`2?gScQ!hKw&4j^h%JeW{Cl|)rc82?}-`$LU5^U2G% z7~{&O+(YAD7umQV0)x2L)^<)}Nm4vtJtfA@?t==Hpr+NHz{i;WOI^R-TbU*5egq!# z$HcFh@Kb#k6KFK(!Y4rG^FG=X3j$E?$(|y^Y=uVuKvb6Jy2ZPXD|;9EZ+&6ZC_Zyuk5VdN(5%y( z;dongC|=Tn=jCT2xpo#~zo&-ho1eLg`U8 zvv(mU{t1nMfB-Qa4dVhfB!4q396SzCXu9h^9m1v`T)A=V`=YG268Jm_)#T{22?za` z8u(8C_V;56SGcO2lcf;^6FNQp`uPt{or_{b8Hz8=!!mnENu@W?@E+P2k>(HPj>!P6 zmYweT8}1`X3^Oyc_LspUC^g~Ld+mCqE`4*clYp0qRBznb#ESnRusy&pSU_+J>Z0=b zb*TY$E992WHRb{4a%%+Cy|@NmEnM@Cj?jjWY~k@7r&BU215 zxB=Kb2PJlip`BzGZhtRMj_(#|d^$R?@#@NzH&zg9TBw}kNsw67HH9wqcP^O_YQj4` z$$^Lm@lVnB)K79;rO)9 zwpd|HbDNvbydj2r$qKK%zEPI5%=(l)0oQP?ud+n_`1!wWKzI^ zp|O1I38P9J%T;O!ef}A;2`fu)YqMOB6%PU*?rps&3-Lg~>_Z@Aj?Ur>B^PXTWcTx6 ze_M%jyyp`VbP=ejWV3WT)jodciin7qB)%60T`)uv$JM|&dqfxxW^8}9M!^sh(Ua7_ zBjPqvHsO#+!Ykmnlh!{-N9Bp>L;LFg7a32VJ_qicLAq2$*5uRQFaJt<8cR5vFnct3 zr;l1;CixFYbOJ&=H%<*+QvWT?)%{19OSECzf)>7YK0EE*L>30#4J70WYyns_x$P@I z$mgcA4zst}Qo#~n2p}pOkif1O5C$=Y`Nd;^vjL%**;uR|NaC@!JhC`&rUQ3Ncj}yg z@&EzcHL|&;1>cFPy`g1BzJWd6^n-s1|G!_-K7AmemQQNc!1uZYfRi@G@C^thKvgTt zGuU&=pW9B+7Pi?F^in5y_$S42%ElM-NF3UM3}8+Ps__dZEGOo)UAr>n@9-7 ziN+`Ps>1#Ms}^7))^LA7LgW+N2!Vtvn@|nJmgbXg46JBJ2lA8@gYvF7{1LJ1#&KkerQ!xsvsJY z#cc-dUF%y$a%I@IX`8{5@D5kx;o#Pyt@YMCQwH~ruS!)6AQdNjGoP_>Rehn`TkU{* zN{Xz1exA&*raQy*4M2`%u@5&4;!3+6z%_$4n5g)A6P9&juy?yc3LlNAA%!Fghnx8; zAfp=GniK}EiGxkzbC)eluhm(nPJkRBN#9cb>%SG5{WEFrX1G>0A|eXUq<3J?9s%8VsianX3N=0THo(Lb9>etGoMmWr@;HK?HC-@8!fI z;Ur=`Y8FNuO%m|7hX*oZ<5f8=!Wd9D+KsL*#&b$Po2bf-6r zu&Zm)=fP|p@`_{mKW7k}b*ZkeA8dcmt}w%gAQjBFWCn)X1uOB(4;+_Se5jzO-xP1E z?H;TSF><>6D8TGXs{e(2gPpY%B8V|<6KbqJFF$pq5)`irZzKaP57pT`@>abOSPhTp z^FP=1-m#I4s6r|(PYL`U-=qAmoZ|!&+&!o+{OWotI+30C2?gQ&)*ap<>|gykCI&oS zjy|=|_upyJVralRtS(V6JV`-#!CglvgRvUjAC2cgrB6k1TF*M>8Mgd#%gb4qjCg6* zxWDFh%`u>4gGjJ-cn|#c3taTJ;hWPi2*hoFwtwU?FRc6g;?^B>w>C^U(+R!7%)jqZ z#6YE-hAt)yPV#dLGjBio_c4L!%}Vj@pWt2XwfugGm>V9yPn}Xz&9?radGv%~_f@Y9 z6h8Y;?8dAT_yG^x9bI!jcrZeyTO6RsA5z%fDD}s{842=U}H;Au5|1R)Y}FPT!HV0#K9j{WQ>uSw)lm6E;HW$?@RtpD=jXJf$eU|H$)`%7s`xVr{03+ccMsA7|F?)Nv`V6jV2?$39m+hv7*ceU7@s>GnZLzsHd80lzg zhFBN`jWlX&^rzdmkw`0%B?Q*QBdAcg0IRO9qM1QF^>eQzgy99pO9~@z7dLJE{cQ3M z7r-yvVesu92<`8Uqu!`9gXKU6{8WK|=TFJ17>&2o+<$rbNOM8b2>;ZNLn9rAV5rr_ zQd9Q8tS6diaaQ!XgOx>fBy@$4Fnsh+ndtsdP_dWT=^Bo7yI$jHPunlBqQui|_O6;r zOvI4WQ?Xh27%Xw%+61T=>RE7Uxb_=4EzA>9$MJyF6W z2{S{f>pcyU#(iZ<#S-c}uCy2%z#!@#?4`8X6cVDhTQ-MjB$O_y5ZOY9XHi*0W%ol2 ztDzuJ`e+lhYh78MX+0FH_lq^lrxv<|2t|#y@1~8#N2C#jm_e>7Y#DUBcm3-Zv~~H7 z^rgt$Y*U{=m;z)hjv)4Z6jOcf#mFnTmwWYhG#^MJR*FUl{5$2OP5oYl8$xt>5>VqIT7ODA!ZKs6r2v3m^~+uTpcmu1QAj2V8qM<{YBzgA>D zEhBoG6_Y0J;kInb`6uly@w2qGhg0iGK|Ma_sF3t!(A?sWtz$=|^zlmHo;WMenQtqo zZ~4O8ngYz}fQrLle&_kt|FOPgx-V zUO?&FaV(B8&=A%OWUu5Cjw|`_M69`1<^5Q|3=9|2ic}fqGT?kaRWnSWTVhwt?rOS_ z{ih~po1dM!qcII?QE^25%QLdYi~*8!zxu>`K59E|;U5^PI;!lMSnP;pxrl7C$VHlc(l z#DD0Zub$GEa%Ofo^|I%vXY27f6qw{Y2UXPtudf3$u8j>PFGY<GAJ@;9{8%$t2t4&~ zTFbG4>N)2VAU6nP>O1PKj>}a68rsqCj3!?QCNl642Rgrj_ZCWk1v}0EUdLpyt&r?V zxrE~8_Dfm5)VKm<+%)UFEob+B#xR#qMiXV}zKCvRBjJA)^`>EkQkAW3+n-qRh(z`7 z;YW)l_Zz*GNbpGBPvym~_n8``bMfa!F;~HM8eKIxJ%~yl8OXi2X6g#RcB$Bhl^8q) z&5!&l7Qv!e6m%CUZGvX%UK^-@!#XSAZYZfp!au(#8C;b z+l+67kP;#WB@qPD@84WNBCgW};Q{z&8KqHp9pP%1gyBcN*sQDoxDgG$9yDUO5u^vj zMJ6ww6*?~x#c;V}2O)@gd96OTAXo;u1{5*KV)BnrwhptcP8%b)lg&O2eO!=J?sI@% zU2E4^sbO3pgT&t%d{W-9!Zhw4{Oc&hsE%`$u!Jm39Lk|&%9O<>S#_K#B4`f1T9ns< zh395E5Qe|Txw6e?Nncz0qgCaf-qK!5l|JDs3AAfiiLvUS)beaEi1Vy@lwm0xw)>1= zrN{ZE2f9oeTw7afr}PsnlG>&!odxf4BzxH!nTje<0tf0X|2qeDAA-q267>!>{rULJr_@# z#p=*>a(G^9=_b4Adq&wHtnQ31g5}u9Z~w!NI~euxJY>kV-=^Wj)l z=I!Q7)X~Zm^Ez3A$NrO#?Ch_44o;{>%rOPBiCC^d`4T9RdLhV6I*ov&`UMS6Y=-0< z5Fo>V+*e`kcKf5p{@kOuV0)*Jfdgs9d2p?3G^*?%SB1 zvXEpbnt#@{fkGuOY{*DB8~FI7`1mwav#&-EV28%c#mexcxC93|v?E$gP;DoG!}ntR z<(g&#o`v=(3P?jo^OZT=%?c`el|DPm@}Q6!Qb)11R#MxztofKj{j1a)=Ti+Rs{++u zJ%$`I6-o)e(Sy1mnTn%6#2M`Txh*`%lq+ zH$j}gFXxr`;Yt|Pc8sR`Y$RN?^bnJko1{;2^1z@^hMm8N~l|)^~B=aK>C)8=fAmpj1Qj^cl2KS$Rb$Po#+XRHxM;4FFo1 z>{Iw{$Ng%X48fUznx5L0%eUZ1x~Nzij;_)P{P4q;+$4%j@pkyweZKbjZVtHbhHaFb zBuGM(dr)uMe>O}7Hneh$my6%&EJK~gzR%z0-dUY)qWKYIW*>o4FdlBBmETCZfhV;; z%r~OLzTD_QK^7Kp-08N=1KiO_Bm7mQLmmCW`>yUxDr^Wx z>5l*2>7r3F`)m~qMxXPxz^bJvJvrCzZTH&c##Ym^%4Dd)u#a;6m-Ec}+smk~JTuak zm816?^q)<}>l`MEF^Jt3u=(x>Q^qZ9U3{HqAyIN3T@hg1wJdH(Q;Eur;Oc zy*x2cnO5EjWdHOx3J`}9md$NOTO`Q6HEacvGx6}I_QFX^U5hcA{N+=~@t~h*O!VDh z-|Ta+rHOkC`C#R^k*|((NiOV9+tLz#m%U>@_bzaTB5h^o7EGsl24{Y1x-VbW{c4pl zEQ5t_Srdl}7rnhHx~o_4s5|w{0>2?ws4=^Fo078gSc~84APNFm2t>>f(TYkry#081 z`P-U)t ze^J^H3~hkf!$;s9vu>96B-J~owYYQQeTq3@q^?0U^h8W%QvGVD|>%#trfjE%1%Q0`Gq2#A*w`=a32MzGv^zM7&G@_tX zvoeUeh9W3jve%f&e_r?0X-v!+gwmFBVa4kYS6+>Y(nolWZpdBw*>H!t%#?jf%t)jY zRAbK)aD4<>wLL<=jnqKIni(>hFH+2Wec2gctk#|#(b%Q!gOp-X17&8tv0Ni&}pApN}v6!_^pW%k_%xnw5omgIVnoS~zV`i19Y8Ub+73@8i$H* z^GqX4ClJgswutB}jVHFN@2Vqq@4-|};7IRV7$8yi=T9%AFG!8}pf7qAP6DOT)?Wvmo{YeKF;Y|9!eq0YIH-BGXTj-lGJ5i3BBqRX;j?s> zFBv?{?D;;h{89KaECpX;y>Syo9|e}xm8 zHT5;HAq*wLWHKUTo+j+c2ZZ0*Y4Qp#9b(OCz9sG=u$GnMTMRSwC$rKP^Q(piStld- zPd+nW0B>^tD3dhWFm^?f^o2JBrl_fhg9(#q55FHE3TQjwho)+t##vhwXti7ferJVRxNQ4DRBl9fk?|Q<%aYJHF{#`t z@9oQV)br-n!(4~ts-3s|!WtA9)$O#1PUKyN;3fZ=Sm4}M&q@@(&BeMtB_g~K zv*`1y?Z?Ov?#vTJ$V-;NVpm=hxa-nBQ)2mTsu^Es0+M_OnnETN{VX>;kWV%r(ERbw zXOk6tQz|{Nk6x#db=W*4=}ZS)bn+@_k$sp;p~RCQ636;>fXdP-G<xLyYRs40ypv?u=ZS>ZY@UhL(Pgl0xzS^a3@KoPnJWicfiILd$_FW+)L2Xa! zpl<`rRV=@8n@gKO4`k@C$`We$@?S2NeCZI|rI&hz4b*c9{Ki5Q+9%({aP^&4$CJ(} z)2f>3&X6YlHXrE=xztE+-g|efr#abr1lBAHFu5~cSIo$5A76@&U05}JXaI-#9z*oK zOuwckSoVlAD|Hp`VFDj*>E(PVmQn7w8aKo1j0v$hv{(J9|zrwjzMuC2^2HYhfHPV_d5$Svs$*w2s(&M;Pv za=!qjwOhI8yG;&mKZbMg4Ak{w_i%%iq|oJ#3U*y0C-M$CZc3$AfBr zHx&-D;;|KN@lDMhmP12p$=$SucxRC2VZo4z24Ffjx{vpgINk3=$=ZK|Ge+V33k=g) zrEmH>%d0UAm$^oRe3qYBY^_J8){M{vO5l+u8qmImT~*FI$A z3!$PFUB*b+sokVDAnpuZcTefi{ig#bxVq9AYRx|TVka9ul(MW3?~4>=7v|qjfm`Id zcw*omuiaOq*AGmN&>vmfc!Azf{rV|SA!gX8!*>vXgtiVo)|KqVoO0&}nogzk+NPPc z<8R!jqXLGCs!fmfhUeqqLM0Yo$9~qyRO?$bBlrHyo*AnCHF{;T^6A)_tSv0SU%nmN zTz;plECjfaa2AXa;3s@8NP{eYCe$!>H#fhqlmCn#`E8eg0b|dodUL=q3TGK=aa-Qi z6FV9qRYp05ONP6MiLrFLdviXCy4+5QO8RJW9r{gMub=Ch3+r(hpVRGmCt1u0UGU-A zG+K8`*UuCUhoc7$tgV6Gz7F^L2}hov1|ra3o?;;PbPIq=Y8oki&mx+*Y96!rv>*kH ztCeu9GN~P-?$b$9RXD#4-Bj*M14Y!f)`bXpj<;sPVE+37#0HMGKg@uy$%O1EwjSehq)BA38NLMDwG9!Mf@hE42Do> z?@+P;{G zx^2QztBC1ay*WJAaBpfRc~lVTO!i~rh@GKWDOKidF$eUAf}RlIf*_D8VQzzqDu0oi zF^P4A6il?rjwgy5Tr9GK#5Yq!#9tDFGn!WZ*x^jzNU=UR*ktpmy#3~Yus6YFBrDg? z%$(v}v+=nv<}>)nqg^Y*qY1S4SNkdtzM^e+1M7)U_3~0!kxMzlh57xB3$^cY%8GN- zcF#9Imgtl0o&`?DommNT!oUwkHF$6h^#9JlN3HP4>x_?$^Xjxz-# z(wyCfZx>cnJ60+KANrf79hxjI7hiLVuo2o?jLHwpet&iwXA^%UZ888#!T_?CU5~6R z2Y_%>P_X2Gjlc-`2loh3_w*WgxN`yRfUq*agGbRT|MB6QRmiVEzxfbM;yI%(RoDlc z8NX;GPQ}@~^R+DG&D+LJQ!T0D!vF}yA(Yq)#^ z@wXL6P|Pk@r^Ofyf>k8v$_V4MEjS@xrHAE-5MB>^&=|gVdYO{*L;pawdJFW;twpPjClm4R@mmv#$X&Lfi-yQ4Qo@go$)zt2nn9)q3s`1m-` zikcRTIEW$sI!}$kUEhm+c0oN@$aYFNL=_a1ygbPk#)KTZ`#?OGF?TP>#;EP92=2B` zpPSEk0iK0-4e;xSTEEYLEj+#EKG^`Qr@Koj{>35V$@y(r0^sj)7LKR!iOGvS+x=&5 zcmlhb#nw*iNz=06B`<&ZvtEx~AS*u!m}H@vYfhNb;L0zWpKnGPBCw=<=iC3#-uJemW{7)05J6qbMH?-9HCldA9fU zZae;DWTv|@q|?2{9k?FN{gXj%r`x&NaW4+HZEZav_gNL^U(w)=_x3O2Qv)bfvm*ld zAn}IifRD&0Y%k97aYPaGu9O3$fHjW7ZPQkHk<$%+EhK^&oPnVCXN8+cklSWH_cjq? zYz!4W`o_EWFYed=8+}RrYb4$nQ~HDbrtTkeeXkGSkAEy!OYx4@AN@s;6}+sg3J6P7 z-ya66e|ZzXw?I4AlfwOl0*L8-KmH7ay~dj^ zvM|>0s9A@usOhud7x+ETE5Yax+!_E+_yehM94{$(582wx&;2TpvwAlogCyI9T9OX?rwh98H&A!7X6PG8C)f0M zap4?`avuc9x6q|vrTzzrMp_1mM2df7A|kS$ zU~x7tB|qvyEYTNP^s%#px4S;Qe>pD|1rgu zj2MX6O`FeYA>!A!Up*s?Ap+)bvO4K4wQtm;YqLy0?n()s1jh!Nm+Um-6Phmr3E4Dh z5XIg{V4gVEIPiWO(>VZHu$vfmeAayF+!f9a0b*!SPZSXkwpS4J^IEvC z{IGyKIZyh#CI`Z&8Vcuz!m3L3dII;AH9w=7>h!TmZ*74;E<778YnIo3BvaRe$J~5+ zBcEb$u)3y8(Q_8hq7m-NwQ&gd!8Y6B;Og&I`w1jAgXfTn~7B)~(K>{4vP zW8`;}>{K!S!Z(A-zw-f)3;B1x@P7=^bjAnBgydh}Cvld~`;{3CLD<>ZLp1^4NA7QDizm)a_W&&9m5Mc}b=ye){9k;K;4)}b}+q<#RQh}keeoQNHz?;E*m^_9vW zasxN=Z$l^+-Y*W_CPQowRt}1L3~Y7+Jf4KqQ+FNKa2?8k}0zZLvx!Evtf`Z^jY5_F=r?7Et;Kj*|DEL_}tl*8wd#=VL^02Z(ls3F4^541W zu%yE0g2Q_T;O1oAGKA!-ZjM@NZ53zyof~0gay>qpYk5w;G*$Sm-*t6vF`qZG))x{W zkiHvxMT}KkS&}58p$+~|hEsiI`-c2o1b!f(4L{i^%;iXi^gkxSz-Q~~;u&hDrKF0T zg>M)_=_t){>Qr`?XC{Tcf=eLrlq^r1irp_*{d~Aj(Ut;?t0Prg?RFKS<}_J+!>m zE+h+QOqM}&*=(OmREjDba0dH>ja4WQEy*iW8sl9|b_c&p_(5zN@ShN*8uJ2EiK^!& zEyeNfQ%gXZB+4>iQYRC6%6*?`tQa47bZjI+UHR_)>+F$sP^D>NGmDLWKIu+R!Oya0 zYG$6ZejKN7Db1t){&v@DZ8gno-0#Kg$8-Plp6C(;o%2rLSM*Lsnm%1Wf5i1%;vP)cIVtXfK{j5jAg=u|xc=PccF)2QQ}9 z%S`BhuiJ&xwV<3)cUZ(@&QEJ!a&dUiDyz;+UJ9H@32P~X{&fL`W0H&s^VZS#d$#p4jQ4NVVzmS@ zu0>y_fd(ph$Jw47)~7n-tx$5^iy8ZQD)@z|%vb}3U?hU0x>{(if2V_{x3`d+L3&xJ zuBO0wKyKC2%%2w`BKk>c4(~CuafO!E-PnCYnsqpjYPQu* zU_%|cESEdz!#$a$t`3=35t2GOq>57l5QvY!{P8I}k@J;b-x{^JguT;x}p1$n$gZDhtkHMHCRR@_&{Rn-OkZlp^}K|)Ya5$Wy}L5fAj;@rjayzhtiez?DT@9%~mWUtu!%*>iK>pv@I9qx>JNEo3vw6^Kb zt6w#Ld;W2NlTX|!_XRQtd%|Axu@@G;knF{=WGNOZW~UEz;rGUITrXp)rDQRzNw&-F zt=71ESwq<_j}Tkl1?uU_>1Aj(v)U<23GS`-hGFBEySc}AVp}w5%RMg|YDGAXY@hoN z*MGZE{|k@4IW#0)F>w077+vT8sP8sVfKick=HLK)5a%Xz&CbRq*wa)?8&b3fjEu4~ zr>8_}m1gtv;&+@J9kb{v5p9#1IfPbQ0bfwd@L;{28;A8T>Wp#e5_8i_6mf|eD#N;` zwRJeIEgrj9hRQ_B?G9v>9~ANC!zeD>RMtMTqfVO8AOp|yfDe~M1^kP!>ZXp_)S%qH zyQn5~I%lD4I)=SBGU7DUb8adkT6zI>PhPiUdz>tcvp4+eh%is}lryCg)S65zUtr9i zx4Vvn(ZAD+3D~sD&o;4XIzF{?td_ODddc_rQG45(HTv|k_n}l&qLqG^^OHGy`6!PW z^d!;hH-BpRum#6gG49vtqGv2Fes}6fc76r$y6pw+JCvz+a|HZPSMSe9A|lRg8Xk$) zElOe?%hmH>Huv)6!eKu~No|m*>qbtiw|{qhk)>-3=bs54+L`{b7|wsU+N6!z?sN8Z z^yD_+T<>&_7`obv~4-kT)xW8b3*GiX9` z9p=7Psi!#p6QdMzL-5xwm@oCU0|BI`mKIv;loQ+1Mf@%)yEK3yRb(-5b;BPoD}{k%uz z3+!}`=sp_a-V}7(lVq`;faAs`R;Tz&zQ$TUn?p1o@3A{Z%gNRb%Y^*-L)?aDj^%8) zZL4#Umhfv_#)5($2fdZQ^4_cHvS(HiQqSv##*C^Zo@~H5Y<90|v=Z90>z_ws!};LU zV(>j<`9FA|ImF;f`Tm{K4NI(V#||-x`Obbt7L1an9%gzDCg#Z|_lI9IeHU=uW$}@3 z@x|VrTI)-ZLB*<8oX>DP+2mZ2_1pqmak(`a(w-g z>gp-cRXDC`gPzLD_LA9R<0RYu;mn{;PJzUmU2D964LB2e{xpfgOyM8gStvOV6KFbdogQ#dED{swk!PJO3%#8`3K2Da`YMf&#$fmy=TBsIRcVbY8_e%aJH zZt3HV8rgI>+ITt@sm`&S`y-!QPI=mXdrw5bTvb!Q@1`pW_Yh&LsJYd@GI_#hDe&Tz z7X;|rJrp^q9YQW9+E2d;Q>yd9TC+U!ESf<`9h_?qE{KF5SW<8-@--sB;mVM%oH^E8 z%_DWTEksVnyr(GeKPRGC=aWrn;Dp8Ncep`_kAUu%^77BYST?wMqI;Bu&ggx@^#onh z^_qu+ljHKky**<`*|0l4LA?!hij4OYDW>UeY9#f!Uj2|RAc7Rvl$OOQ`dX>Qy;U)M zqVIDG5D%k4HP*XVXKkB`l52-crp|XAu~%;4%$(Ax+euwCG5|}_rdYj^g$|{mR#BhG zAN+d1)D6kQzJG$-+WHE1`yA0yu;~ggV$!*!egV80n(ROvVmne3pZUaCam`M|hTKK` zTEAmayymT8!}1pXz3nvs7)K-Ldz4vUb(!>sXnB~;aG=uiY?|?MQ{3;8sJ`Nk3^?O_9{F1|QUTWa>yan2zvQ4H zxg?-%FieGzjesT!Bbil8sBy(d-r>q#gb!isFtTqwI6?elc`L$ngIj;fQCydLILsIQ zi{bsKu&cWUCg-U6x!NunwKWuq*X_BaL@j~eC&y$G5?-Uny}b2C{L@qGFNo4z$e6jS z8*Qk+?$}KuN8@#vv@EAxd%OofGU?QP4KUK7DyG1|3`(9cO+>pBNZGC`)+FB9zsPYL zM*!~hY`(wCgqC}aYYic|=G1qAaEFP(eS3xTt}(|^Ca$_&trgzE5jc`sW}?NZRK9e0 z&m0gVIQ9GPaTRb<1gf2I`SA|O%;p+R)ImD4A2XvbJ&AFYeMU_uM6Ooptjza_l=ck+ z14CV<$h+Q@%;^5+j}HAVs;a6rS4%wz_tU9XO#C~;t}-eCxUyR`Umq;|>Lhhk#~)oC zH-cF`iJ{gXrYt>$U}<6=E1dCl)%WDzDaP8mTuU4x_{ETA(jA;bJr+BLw{b7H*G(!oh?Dt0zhc>r6lv~8+_m~?{ zZ{CDFF8>rTh9a^P?^e(jcO!BQ3;2_~SVPnhVmCAIZHh+Z1`hdc6} zHTD-Np^N*M7d>5cs}^pvJ(VkFTYFan?C482v)?jb)iT5>Mx;Ddlza23%Y2T-+2igv z%a+1gr)C(oii^?J(5XI2P7~9C`YURmEFy_#&!zgTjF66Qrxg7@ACqX=KKXweOaHd z{Qb?Z;To$-a^&&6hG!3C2g>2srPIRm-kB0tcDGfH&eGF(F*s(hYr zas{H%l-0E&hu1`rUUd3nDJljA>|Z0-=Wn4!kh^tV@zb9)CX*0H8W>)Tf;wXaemj);B?+w@=Idqzm!hP*)Hd4j*&_XAj-D4$e#pHM} z%JlmOM-p}3XpTV|dsmbmXM&qOJqvOMAs2fqy~4Wse!i(FAFc;!%=lF6r`Vqh<|p=@ z%UAo}%Ah2SNPOsJj(v;KVEW|I%j}{D<7=pr7huPk&byY4O^;p&2?x;Z-Ls0hhva?!Wbynx9a&;~uA!8o(MfhrtfSi&f`Fq-b1sk2S{jiOasLYk~}Jcw@ZZCTfXGj|qWtd7x=#gqb=lBR9pY zc$dZ4@samD&fIh@LOaWQ%Gl+yYELP(uBn2;B^|zKxZz4$hd&J zUpAx_BBafX0_c&&nwI&7@ondTDkeROXl>mtM*)Mpc;=kGnn1MX3MS5VK+VB8c$lp^ z4H7e#xLiCvJoHUS7?)vvQ#T8C&v5YLSbjZNFfUEqpRz8||8N;Zca4sZH^ekW`nrkV z57XMus9FaNdSB&YnH)^cff4~ELd`urvJ(iGY$XKD;cIa$GJ!gL2Koy>FAI)8&(^-S zGR3N&R!j{D5rQo&3H_ky18V}#dincDan!vnZIA5{U)g)gGvx)F*aa zFs%Ku6K28DPFoqjTC|oa!|LikZu_OvJ8XV8dtasssOn~mU&_-!%C<^o3=Oi)w$-hG z4()zFKb*f^CxES4+m4reBrj`4)!bGk5%Vd`->(IMyv`OIXcDHq-PmP+OG|@hBL20ly|SOQ8&M zSD2dTkh~gjm0YA}(H!#}v6sZ0eVyH$UpFutSiD<2&o6a!v85cad72$pBK_n6Bhb8o z^|M0Nv6aHMx@GCM@}xu#yR@rE4+>B~sjN-6E?j5iccL6Up5c#SWi~Y2zZRoc4$8TTN>c7oo z!6r%|c)IM6qoijaL7qSe4H#CvWc^Y6UY#eAl_LJVDAsr1)<})FT60_8o^^Eyy;4J4 z5n3IQt5(F1^o9mzoRCj+b%1V{IzqyC_@LlE{%R-w@ZX=RsN1x)r_}_|E^^1_Pt!9A z1QHHYyGd=^nlZGOnaW1+kY}zQ+ZEsE6jUB{)V=MMib+vO_(klUwkd+X;FTa)JCzqvwhc7pvj94;P0hmv$?^t_Hr@SrsPtDYXNooAw{7cmnG zPZ4w_<<;mdf60jEZu@66$pc$qll}b@>tuABdeXB*s`7aO4ffY+kI&daPO&~q)%5UP zo$8%;D(1Rv;H8^h`hK>`Lt=d43s!}*d_+!*P4p*%rVZ*pH1D2?jDwk4&0=~dSmSB7vrs`M$)>n zb35uCm8)ZPYJ`uOz0XfgWG38vHX z;@%o&+C9`!;RUwg3i5GRKIiXw4XXoo&znD=_=n;8>xRajl!M{u7PtBeBt$&wzlp+S=g~F!5NLf=<1rl<=?oC`pU^>xkv7evzYv zulCM*F#{e8%S28*kuw)Me6}_c{O{c-rRVYMM|;sZP=tR*Lsg)#p}p?4&O25z{TE&A;&aIslduD$Xz!V_6_OYFJA;Y}++q?$=tSs_I||SV zo{B#bxo+?5a!vL$6j4V{vzC%lntW?_+~YIWcodzJ8&p!Ey4~B4s67{O%CA-9BwO%n zxNq)@Bny{&`7`TUnn9?~g+1n_`t^IioS((G0kQ>)n_esP?eE}LTmJ!fBKgI>RmKUR zs*B}EkKaKVxspA8g(7D^r`V{nb3IQ3mCZtMkH+kW9Xj0#u{e$9uGnOoP~_i428z7a z7{ZSnVfX_EBV(>?eqVlyk2(U#Lg4RBeS=vfYtWIf{|}JHZmF;v$CwGL3eGzl)QR<{j)e}mjyZz2X}xR{GLT!1 zVl6jMR%`eI3bNP5j|iXOA9IqtOeDefQo#88Zo~k2#a^5H4>|y&7zb^EuaVTf9K{ec z=+5?)J|{)|u%K~;DlY8~V?ey*D^`tm{*JQzD{>x#@u!v-dpM@cWS{IGEadGUf&wlm zZ^}+mQU)#O#p{kU{|C?;>G`|Y!nd-8q74$@b@9x<>lsTwYjYPwEEkzIr1#Lp@^8%lfz4%D8~`LRLPWM3y)7 z_+Pf1K=T_=M$LHEY$yPr1%TJj_ZnaNNHV`3Xc7WmT5jMDfs{Y_I45lZN&X5R?PV7u zMhi^#!7{rowdTtgKD{?MaiDn2%l9sk_{mp7eu?a#3x9uhn((&vf5moN zvt_rHptG9_`5vu;7R(9JZhPQYc};eutbC;sR1?zh_KMy76thLHdIv|`oOU6luAv5P z=kiQmx>I=5KpI+YX{`Bc}$MvADbzkYvS7&Z6mq+MULv6KB`d*&aH%3JTLa`b||GXRfCHWLeLvL6J|h z`b4I)4(q~73gCtD1gOCO;MZ5a$5@yiP1tF=|B18E^`Ca8QHI}}zw@Y4fCz(T)Su0% zkV3}bRv~F8gSn?v)Q3JfGrc~ch+Tn$pUQ?Q;#d+4ztiG2#eq_jc^Nf4MUooEanK4z zr)xK_3Yce?v6@<;giEG~VCJZ>{71 zyUb`at+=@E)xP9UKmw4@&=)yKLRI<>0a6iiIDBcjO6PC0j=-;V4(qXix#`@^6+7 zl^@nA+F3`dYV5EX91-RF5dz#a^CL8wfE}tHCy%{ z57KFeXHi8LNQ|4mH*dvw_DHEISj>(yY96vK!BK*#PH!~K0>wPTDvDc7eOGO;8z*bA z=eKA4s;Y_&ONi+Fem>(~b?b9T_V()@+Nl;RDC3&UFH~?bKq_~N_wK!}sqd%c!)cw4>O1^Uh13r?2tXxBQmo$9o-nwJ$kz>ZUd%JJ09kjGgN&k^QSiRFsS zPZV8na(U+)iwCX<9okj{>-zgBT%bCLkxor7j=M2liSrB)J%{{*!rFop zzuztxBJ#uhXhd{}dV^y*&}swA8%g)o`H7l6pZ!oSIsjDHRj^~s0&}X?Dfz9d<)1oK z%l7|3BsgB7v^9-AhDUL)pRG)hRvahgnghq%Cl6$c(?#3zPceMaO0zD^6T`e z4|pC#boV{z_wdy0K;V=+YwGxM5NmXr9Kw42ZBIHW-(h2NO#uaEE} zO}^RQfn-k}!sv3T11?*aTM>eb4;c>nUB|6!8jnsIhuG1-U~9SWJ6G!Q$SIxg5@!D< z1$H@yADvi~P@C3trDc57W$>x!N*#afv!1eZ6P^Z2pLNTD!w1Ynjm1@=FE*Iw8`4#^ zQoX$^pET_YP*LgpEV8q(k@Q}45Me!2IuN5l(P(LCKo{_{!c*$bn$E`2Wj^omN9v8q?V+3N63xThLj-0t~(+1bD>BK6O6#o8g+Vb-O6RjXS^Y?xOxy`za;zmMT?xp6QQrn$SFSZ^t>VeK| zlrg9ThBq*Dy!gSk?npGr05Z)W zqr{$U0r}X>FFkblRwkA&J9GNp=NlF>$PoJoy3fP+)iGqkDU78e=NrQ@Wx~5QZZmsc z1k>BRvc?EvWyP=f4p@R7>nvH3BKXz{0ynpR38e`$Bu9eu-)t#iRxA+~-OqPq>GAJ#Z^aJ{ng*xlM*bvM8j zpT7}}ap2Tq<^hIb7knP3F{Q4IcV;2N`LiXsntZJEv4Q^b$>EJSK&?UT#Q@|l)acBm z`gj%c2o*Z^nTMQvBm(HwWUpPgO4fDl`L-8~^2LZq@Rw?n{k7Bi4ujoS*c^RD+N<1Z zXGa%%8Cex~dz;u>=6>*VET=mE>V0K&q+E?BKCh} z5_w9g1QRiArW^nrDhG^^WrG(EPe+~>ogN&~u0LcCxts`+3V%x7K!@DtY#r|3sl}g| z`IF1Ze`LvY#;SvQ)EPovz0!AN85G<}=iYyLf4MNS9G zBz5x_HiL@KxSmvi1{mJFC#LDd$|rJ#$5*5kv{%j2vT?hBqZeqeXOkK3O&+0A(BF;SR@YoaVJ8C#B3?96=1<83IOMyb$eyEE5`@5Lm#j@Rz z`Z)4)>t)w%U-+#+acfrDR)D#&gzM4ZZE7ND;xa+@$B|QV)NU#0%%w+8)O@HF63EA8 z!Y!!k)>mSp>t06cgYJWAV$ysWzwS=}dI4Vr2X}NSX1O~3+?0XG`@U_YtS%iy>&et- zc6EfHKh|>qDB?zfU&i>2jxRGSQqBFn%p@oWxV63(0t)~c?g-%P{_-S!*KUNGqkqV~ zc#Q<+AMOtz%L~75ddu-quv4K>;iTfh+Wg_~SsYwk=`@t)9VC&AyXE7IW0JglZ9hfp zu~$7sz2X_AwYL$7@EZ5ji(_#h$HsXcOy6sh=rhm$i>tMUg#E$qTq7e1Kh@^%?ln*b z-#1v<#MA z(iSAdXPjqEM@Fk#x}0#JE(L+?ClBp|5C=4$ej@p9iZHN|wK}9eCfi0X%JiFC)Pobc zL1U|QB-xP=6h=pP8>0Byznvvr9j?k2;X-Dm3TyyJQK#?heF zzDBk6vtMx9i9b31tdh^W#&PfmGY?cLwUc4~C8#&jG961wL^dvUCpT3$3K*!!G4);vFJaP0jdtu}i&ouFENFi4iQ z!eB7Bcvy3YnEFvFRh|Y?EkN$FeY;Qp^nTRQ?&p3;!aZ`vS&IdMG__z|X4J>`?vdjw zjyIkK=@J8Ho|u+)E>K#eHg_Y+g?-bycOWP-x{5GgsdL6%WriHRRxHx}#g04-5dy^aaU3viMHUUJ;%=z+ zIRo?mnILPVXeFvGDX7^gk8bG$QAYZ*HPCChCy$!QcLV8~4y5A82M%~aNh_$Jc|`m$ zNzJTlK&U}in~&c$qso)mhwZ48m%y*Kw!GlmaL;|M(BxyZu6sD+u9yb>r%nlt%vOIQ zta}yLKPX~@0WqtvU0G+%MN$6!tc=i%=U+2N{`y=-tK(aiwZ~_;{{B`Dz1x()4rCmk zh1gzb>DUaF2_Iiv#E_+a4Gv5u9=GAp;@~rVR6Hs^vt~k&hrjFQMeVcv@*7RWepEEa zSVGGHad=d^3CRjKjTyS21zqqVMNA(-51RJR0=R17Q{1xYOyZ$G zh(!l*|0Xo~ljzU+;MVNTsa_tX@B&L!M@VuFu7i+ zSi_v!Y@m0p(;9aw%_Hb>mVtuZad0EXe(fEYge)!=I5&4)+&pvmiJcwx%cy2I<*fO; zs9NBnQ7S|;D+-QiZxB;Z1c5-qi3$-x95l`Q97-dpj(cRyiUC`&%Yo+=vJ+hoP+y)Je~m*SoL71uli45tuuDnJN<47<0I6LdA6~>pIHNtsx;MaS<=Hhl2866nA$eJ2ekbMm9 z__OM?wca+JIs-^yA+|^XT;N-2YzNVS|AsyVvEH>{(M9p_b000?~;X`xRJM|}> za?={#PLVnYc=A!>2f}Uc2)WgAaRWc@wZO%|iqn7;cA_(}Oi^E>TnIu&y?R%PbE6ItC(^nm_Ycd% ztoeAVaCqqi`!9|7hrbt{NXbwLgCSe#O3rgGtDoQ z1uyTBC>Y~_mI{;Z@h?JuOl zrRughoq3BGngIVL&oky{KUM?6lkO^IaRLbq+$MVNSBVSr+LSR`SwLnZWPcWE$Qj(` zf2g-Fu+LTG-hv?Lox8Wc=TmbIMX*SZ5b$W2ik!r*f+3rnW}VUI(3jbU@%2(E>J(<* z+WtnF?_P6J%?|q(F`3tGlMhrP0&67c$R_-7RZCZfeqXiDE6}=BUpBP|!vQ`j$ ztJByHR8I&>Tz7iPL>>0{s{yk*ip~ZmC$#satYsjX2TE0zt^=45FhnfcH+UN-Wg}U^8Qf?D_vIJ0a{dFaxy1-s4@@S zCYFo1z*2yo9^H4?XLRg=s)ntY`mp`w(JX>W*5#ed)^~=1AO+HV_Ml`Uh~}B753Ih* zQUW3V0DWnai0+Jn_j-uBFA2D)W*Oya6xB2N?oU@(&}o*5>1?p|z396+#XcC-y}W7< zF|a%M_gd@5=J5fu9PG~JZ@lJz5%FFesjv-20=7XHQP4h1H=ZOKA3=J&G90|Q?*3#%C2r|z`gvS+GnA}DG4I$ggWNF6>-RQ$7-Pg&>rLyUI27c?(dWUGjQLwJw`5tg_}>1#e-=1&ZyytF+(Z>rdw_m( z3#qE_zpg(f*FQIw-u?AY$ie?xh3nO5MZkZ(e4HWS^^l)208w=*KkoVjJROX)zbdHa zI{qhPRSrbSEV$X?(e%N~ysEIz@DkxPyjhM`q;o;91E9qxXGyR`5d?6R>-uT(%(px7 zQNQf}_6XmDXwDCBgTx*DTcCs592moGiRcZ~rJ5Ll13G~8z+sgI+Pf@dCHe2FdNufV z>0s*FyS6q0sBvP%E8SF+A$mjW2NAY<(pP9;iu4 zzdqxC$gW~B;{IrUfpuGG-x}`e#}Ay|=iO<0x>!D&^R)^ZQddV14pg3lZPc?#z-RrD z7{VcH)D`EOBAeeSe~BgzC~BNG_xYEP5vj}lvr0IxD2{ef&~#sQKh~W> ze5rq(3r!uHv$!>C$meck@teOHYbz_9|KVo8*u#f{BS+96O-TU#;VJOx0kI{pPDLf-M?8w^ z(6vO+EpXofG-Y&QLeMQTWlq!0;l#7#$^k1;e|=c79iOZ5>rQK`wS>u;?`~I4N1VyR zoK_#nf9EGR6KY`qmeUJ=;%4TUx7h4{2*pJ(qYrgSzwCL@FP@QwP+V{8x*2?>*gxv) z)5^=qNe%x1!BHP)gL9`S+R_g?wp1s?U%q^q@h1DbvQqk$+dRW^;(20)eR=1oSPZ%C zn8h(uqM%a_J^w?y=xh6J*Zuo&!j#uR#y#N^=e3H7t9||NpH|J_q`bzSKbSmQoY=e5 zEs}T5zA9G;3m3zL-l)$$dM~WAPw*Lag#$@sDv@ZTsJ!r2P3u?7uGdWKb1bfo!m?cU zr4%$PNQF{v%ZwQ;)_IW|C4p8;`-Nm){~&ZzQt3yb@6tJHj*i?qD&Wn290#=7HJ!RI z5NI^;1b(nvhf7wzVzq`&qT_Zrx5@J?PH4tZz|9=Mb0XW`E7 zqtjqo$k5g{e(dU_H`nbXyVm-VA~w1&Jx0J>_evfqo*^zxE$@%7nvvj+!d#0-ko?KQ z*#yC4qHNGRr?tCksG!$E#lH2|=Kb(U?f#7#Q76CYE!4>$!X%JN6ooZb6jzj$>1bg| z!3o#1|MY9>dEH?0A5{}SP!gD(fnolofBdb@m3-OUW_<7msp}EtmcvghXJJh{_Vor9 zXh&wyM1^IHj*cWKG4H2^qOh7$7Pn5fCmHJRn(|O-ef%io=pt*BbfR*HRs<)e8w0dS zMFo$|OwHiV6g9uCsimdmz{UrTuL@5^+=z!O;Pe2k3=Iz(@lXXgd%d}GWfT@pe$2>- zGTjsx6r`M-ocufrGkS~fQ|!~9fOdfBXA~D`8)rsbvKutg7^s~;s4#(BA;c{cNkGEz z{BQ-``x^Vyxyu?s)F$+onkVt6_PrTT={6nS#>Pete%D(9K`8HO-w-maS1nyLGq?r@ z1{GCRKP&I5s;Dq{ts-M|x4RH%U5ZapsdY^3Y@HPaB`*L^b6%%<>mTCot*&4ej6PE! zgTh`gK+UFH=@n(9b&9u-4h{}lTIjreS`3LZ={-_39NXJU>rNv<2r%eAYyylX1y;@ z1@$DR&C~5G*5T#pq|a|9?*N%ax_>4Yz)S(a_F^q-5ELXw)I2q?_8ft)A1zWt!!0=E z1*Be6BLHr}XffqNgPthZZ)@o4Zl6&5(6Iv*t5p)~cB8D}OY8E-jks!UZJo*AQE<|s zE>veGz(NPDQR=kTXS)Hjwl0|F)zQ((c3RQi*x2B>N5DZ9ZedHt%?jUa3iX5cnT`9S z3q8jRdy#qEOmX+_cV*O!r<<0iP5;6|?({@OvP*5RKU+R32Cey(24XJ+S8{0!HP8*w zIBKEL5{W;oh@ym2cFR&>iu(HcaF=?9l~h|M@_x_TakLPmNsVQ4G7mPU)I=|zO@b9kh3*jlF+!^7oVsr&c^my+wQ%kZzLRE!P0~)U4gOUS@oVe z6zp=w@H{V)F#eTjHoq*)!y98 zW701;bl}4UA zhen}|Syw3@sfJZ4SC!NOYx^oU+P1WDPE%vHdMrxLc0-@>2eRajRc@(IEkkN>2m=-V z1Po4Oi?$nrF8qx(m2m`u;q{9ztbYVI<$OtnrMw=0pG+zpb{{{@TK5Ih(W3U@E9`m} zbfac;{s>Mu+j1?#3hfgi{3TY}H3Tm&Z{GLslG@ryZ@m0k(k5%27?=He9k0g5)E_;5 z%;ZS+O&mtMVs;Z5u8eD@$uz{6pKh&F$8NM9xmoaMx<~$5j71IZS)~=n#P5YmF-60D zY#%2v_oOkqwK72K<%TM4S8XUy0MyG&^<0r4HMJ{HenBabdSe=m$S2a2BI5q z*3_ouXxi4)K?jAwgO9r7f7X2YB(O&?yBugKlryL!9t1N}xTBBMNM!aOQfT)|I3zPV{cKpOPiN+a>{i$7?Qf_Z~ixS z6uWY-z##}@@0GNq>i_z_WU#yVU+DSI?qcwG4|esX0w87SAv^S`G9kZ?7amK=ghbrX z4QOQHn^NH-nc@uxDFC*f8B2*Ue7|2$Oh#Vh|2p@1G(rO~C6l=7 zdcpFv>>3XsB2Xf|vk>svG!-1;q+fT!GA-47qpFHgUaRukM__RImLZ>O#=r0e(p6Rc zpfx?)ogNcm{SUn9O%o@0Bsw(o7u);{De7^8)Bg#Kuv(6eT#fmM zk``TJ|19ti+kIPR$roN6(PRjP64QC}`u)v9;u4Kvrfq zlEKr@b8u>EbBrY~C+7u{W!yDz3;j0P7g&FaskwPM7;wSOQ&4kXig3EHN{ErZ{txXU zDIUQWnIw=Q*Vi}NTDURYMq>3W0Myt3q+;9Oc%zN>uh5r#XU4~k*t%Y0L5yhsW$4~- z_kYmk-Ol-SmJ+~LP`RJ>sbwYu<$H#S`uo=u z1g_!P?U!r|Xx0Hu=~~&Ig2-%bBO$pT{=1AzT3WUZ>?_u`y_?3)D78hnw;_Kpdjab# z^th(S^!97!KvxiVe=X=Sk8LyE!}Do=>0k^8NX_ z#(uVYC5}J12JT{aLI)Vk=3*>!$mY5K7 z`88N{mLD`nzx5N_(0!Z;wr97$#omGP_CMFZx@E&!Ig}<2J3Yad*&`$HC& Zucej8vC?#Fef^;(o2nb3_mxOc*NOzY=cXu;%&YV5p z`+lD5{+;Xh$9c~Ao$C^YPt45TYp=c5Yroh2_(fG&7Vkd!eFy}CC-?f*8wdpD2l59C z1Dx68t#}6xY(3SronO6oGIg~2=xk+g2Z6Y!#6~Nr+~Xh!8rmyOXqgXjoDaar>}Wx0 zv^TGosvg;IsVrM6y)e3c&Fy+VwbsjZ=)8bE$3_`vlTaGh`Q?S+1J$;@ojTI9KiQAv zYZ@74SOjKsB4ia4u;fYWBe%p`!^5H+9%cl-toMWEl{`P`6~X*m4RZr1e36qB`&OfURv0|cdtZ$ zxn6VK@i(<2;~T5wN+m0)=p4rCt2;u`_7_SsIjKWm+itGhPdNt71WSj!7q|{5H{)dT z^70@O1ZWa@N@B%0;@}Ux)JPOUGzo$vag0~s(DEJ`0l1!lZ6*#*2GaeHE~-)`Cdbo1 z9vUDSpI}K#WcxGN|5iU9D{uwsA_Y5qq80_0fDL$a%oB&vFX%Cq`7n_TlI-dke79vK zs=L;uO#pAE>)MI33zbgoXZoPqAX>!6wpl`j%Y;);<{tlP`>Ued8Y9u;P$)GqG*qm! z`2rR(#=V7ZqUqTq8P8*X&R|2}Kf z44c~8f++D+wYR=(?%a*Bdq7L|`l@zKM@JlXh})UIGW44m(Gy}x*tRF|d1V@n=@&Cy zzEDrfk*)uuicMn2RN`cjTvhJu_i{db29?25ccNI#;2-&pap-;zz)WC|8dLoGJK___@O z`}ezu>`NZevFX$FRI^q;0q+>-Gc3|kH6LOmR+4%CCq*=PDuK9TD|(pX{Sqf(ZBv7u zWjN>3##Gp4)Squ#nnH>)Sp|GFoni!FAktSBt1mC6{LI(c9*>T^fvM)8+`tzC*#y5@ zk|zX#m#K>jI^pkDkfmm|XROlrMkMtP?MacX^EJlbBIDvhwO7R{k5LrUITTVvP2(&% z$qDDJyYt-H>>AuDq;6)Bp9fq;tKoqrYZBWpL5$n8Ry#>e%AY*zs<&*T8n^ASD%fkA zIhUB3GPhx&p`FuC_d5@FPsF^GGqly!2Y$jmI-6xN)P=bWDIOhuKAExuE@0fc!FA*= zJTl}zXpvn$3~*9%rKTy z^p)4eZF0;2JJ~mOQe4%UK=-a@UDRl{>X=gRkK97pR4vWdrrye-D||Ggn72gs%YSr1 zlg)^ngemU@Ddz_FZXG(hI$vhT@^9y8Z(}T%GrNGhodf#CZvGB02lVd;^;!lh=W6MZ z9F?Aac>$L%{lhq|N2h2|C%GkeOAp5SNbe~zE8M!|wFyl1IsEkYhJzFrW%h9PgsR}H zeCx^8q3a_GB0K{F1}K5U!t;Hty5sfDCyCJ^1wnC<-Bs>BBf%Atv08FdgP50EpV3NR z=R0|DyfYr0AIBT{hIv`a$DtW!IWbdoc!VN|s?!i3(DIxHovqn+l1vr4 z>?ojJ>(1%1eLo{FPuux(2*OYqhk=D<*$yJ|MNFlw)9}MsDB|MmN~KEYr>U*0(8cEB zDh%zEU6>LdjQ5U^_us_mzbn>p;To$~&6e`VHin_i4U?-dcfoXV6y($yNPElh?A0wo zdv$yKHdj?mZFpazlj}tKe0!EnXGk)4G;4LFv%gwQJ|wP-A=VbV!tN5`af6Nv?Kzu< zgBe-C`J!#(o}$ciioplB3^Y2A^fgHgE7M}TGK2)Zr|RAlU92H}nDphrG0TvgyScD_ zXL@c^N+Bcsc(d8cNM~x5*mk+F%Nb3R!W44@(-bP`4m4HFkmxOuSpMT3?E3jF%;C0u_#MSlC@1-zklW@RW1 zVSnS+*tRzdN39h>xUjMf$ZfDjaM35$^4^nIP(Vwbrz}(Xwp{uV&1QDbwIqvRUf;%k z=UL_uN@|h7m+%Ma&dLa8x-JzuH{SQ1g?+(*z)Q4-3Ok;3fgeUwN;MAc&je%@VLttanUJQqW0pJhRB1n zZw9b{r|D|9JV7gnb~+PO6Kv>u<`s%=akPU;5haLC10e7J#8spRiM~Ty#J*N}jL)-^ z-&C^2rHhP6-3x0Pb%=XfvoP3UY>K0Xl^&03?@}?AlRb6UafID^k95H?^~WWqBn)BP zE%tIm%m`bo-{c;|s*tDlIahgo9Woanv7yr4N88Y#q=!!$a0bz|3w_rPhbTQdeX^c> zil9kJznqk-CWh#Y2Ae^AOpxjLS&jYLYlwJqeQdp`*HT3VCq#V4dazCfaa=1nlzxk-){)T9rmiAMpqFrOf$o!Fbu> zWj+WnE^FDg189Ty(%%$I$e){IXRjeTAXXAqjU=X(x5&RUIk(rq( zi-`orQKj-rF?+E<`8s3^0gkxOTa@M7#=ewDL~;<>H-4vUiXhy2%Cj@xN;mEx=JYq7 z0Ayapbq0d$!=G&Qxqp8nhh(5n`lR#BtEmGFSkIq6tlITh$QmD1Lqmi9Thw#eP^a$s zoSnZfm`2;?Zn8aU^Vy14c)6dI1^^e3XHlyHDO}7skpV6?cX?5R*|8y>rd{`Jt(VVE z`}yt8PXyuau9s(5597<1kM-^N1O;!~4L4qJW$NyeKB5XM3hOrBI&33)GT~TH#tYt2 zq{nTDc6+8aX&ubi8oJG8{sr=5blaGdTunzO)13^7VyjMX>O@MKhWmd$8XF(Pgn)KR z#&u@*$)_N1=gJ-Gu1u`u2aYi=BzoVM;F0~8ZZe{d8=3I$bm{MoYr)h3jzz#{uOC*d z%j-~o!2plnehC-$GK$~PKx2Tnp7O#)bb|De6j2N>`S>rQS%TH3WM-NS8?m>Takr(I z1qt-x#?P`eHiN09($G8PO^T$K$VmVcaebzo_{`xLcITzV{lpC=b4My6GrE9f&n%x;Y z#xnzYTh5;OG@0DQh<@isP@W*f%v|xkPBHGrFVG0wJP@tfkx9FA7srMbq|?sFrT8)N zB?Ruyt#}wxEpcaoQ}V(*TG_E6DNRWRgS=rD*!o`m-o)8^K9VO+@A)WfqAV=lFExEJ zebkJdD7utxiR-oiJhO++(nA;xccPy;;VrciZ-tFHhQneB!N9ZD{ksmQTWSuxbmpgp39zE1+>*)-7>9t%Ol!f$0yCC2{Y zn{h*Vm0P#qUQ4tk!)L{vp_PwIRj#RDGU4D)DRn| zrzRsCkr5yo{-mewF4HF?oPR+hMo_2q6^i*lym;fe_3oIA#}(H=|6G`2Fx+o}AAcm; z^mAHAy2Z055UM1#U|NnV%}kR2!Wm?18gT3NEn2|3!lYpQ<$lHV{?=c{$sPR9-K*GJ z#vnBU>yNoz{@|i@7=O?y{WjY0=1rmO!Y<5RICQ)0;J5c6qOdw~qu9;q&`%#+N(Hm^etVRB z%IrA%k7Vwuz+Pp`^Glb_b+~#PlmWm!t-T-6>fMfCy+lcy!B7>H4DxBnK7jw28RSK0rnAXT-5q6 z?upnu(sKKUdsvHAc`*#xbE%gy@Rdc;o$l9sZLK)@sZ$(TDrq)3w9%^F{)**fd+Vrm zcu!o@{PAP4-`cSrewAz5#xT>csMthw*$SxwF9V{#j%&sHs<6#F=2Px}04zO@g6V7B zd*=Ha#1Qe^Wzq9GBV`nsdCs_giluh3)Mx7#O9FQ1Gbv_W;OJqL?<A0njRsN8jyX(Jrj9KJsgQZjT{i1jqWlkwTwUw2x{%)T}Hx1fpy{CN` zP%Qd=F~GXzG@(hyk_@_Z%pePVG6qm8^I_R8Zq<5X05Tk+Z6cNypALqHoINM^N4;0y zWQ!#~XdF`blo!zzbUjs;4L+^YFWqAUolu}DMpuPpKFv5~>L%)x_)N*qwssKvm;D!WrlHH_k2LmQv2 zadHF`_P?RY_h>Oh9!MUy>@@$sLRH2P#%XK#P{*|l+ePW~2RTi{Oul8STu7*5fNSyn zo3{$OGu+La`1#l(R!TX1zCqOuagZ#e2iWC9vReq`BlIAm)>nW?L2%T3JT;nP;7DpI`V*lssW1zIOYNi&0{~)@f8|&AmBFeJmlBYbikv*u ze${^Ux*G!EL}YsQny)kS&wA`{76Yn@`1nFfsODpHjE4ReXPKNA;Hz*t#Uh)!nujnt z+|RGNkA_R+8OfLu3D)J@ko;!9qMgG3uCOEj`9@s|w;2e$S^8(s6yO)%D6k>GZ5$^p z&LUG|QIL8}N!(>_vPsl?4!JLRKtTaw%=qavYWjN)6u-*xq`9cXDgAkBT2or0OyO;y z1pNoj0rJ}ZaC>7b4%ny-bT%KS>p4wd%mMfld^=8+Cq=96Y(rKIHj=Su^)&iF{&2K! z(Zm7W*W#&s&7yLCbXa019yXa9>YFr#?d_i4>s;YKV!|4?BcFSFH><)d>w$?5&AGmbfG zKFcHmKVFU~2ztC-rPCoJi)mSq|MWqeH&C&9DZVTA96R+^Rr;+gCN^~#0ugR2hCi98 z_fKEToI|zo4o+dsfNW2&G2kX{EA;--*zLl1l)MeJleny5-gfeMB{`QB#_`Nya-M(v z4Nq)iE0*zU%|E_db0V^)E{%!UcL=c&YJD#%DTuwH>q4ea;V5Bxbvp zx}reQMDxRgq<_W&k`-!@r*<3A1xsh{lmV6IGl*BP-YNSB*5R50uTKV)Zu9MVMzK>L&Ud}%>thH=n zF!ZK2MCavWQ?Wfw?GC1D8romTx-`rwyc8o`uDZB%5|@_l%xpFC`$v&Eti(Of(vL-v zdM@8imww0e_a*8=GB1~wyeLKh3b-+pZUx{;jc2!P&DrpKno<=}4qts`^6zjxMKH^8 zUFKWouD3XmdH9Wr*d0(+W7_Y#j*d~qWeojk6sji`cZA%%5cL87z zpk+hd*P%Hn_T=i4PA}*ja}p5UlAf~DC$?_9clUjeUw>KnO$TPt&T>5D4O+oJ{WsKD zD#+vlmi0PBr3J{HjN42CxK;IaG(Xnow}c`Z8mvqtz5SgP3o9OpE_!V9jHVa8#=Zx; znqjlLhYiE#-){6P`thQ}^o#S+@h%Vmls(y~X_EAz^(#rONHH=&t4#G($mOB%dZ*B? zrV|wI^$?mC7zVZfVo7!mu=SbEhhHxSd=Yn43vb^u1Qj=!w6kXP{Q_zU>wBXUYRU*q zi~xz5ApzB1ngL1>jA5SGSto zvF*Gh&f=EMFjGjtYu_)hiVhOr!{gmL<2bsSq4h~GeM-c|QoyWY?t}t5@|suI$aPkI z_`SnF)Kkc0lE1# zV7AcZkcj;zEoJo*{Z+Vy4qhn%InK!~uDiAm?=6{&f|ahkX=$qy-tpw|>h}pittiwj zw`-+?a^`l|E#pt1ycmbh!f!(-|mGF~&wc$mc@EHf9j`7Ih2;ZE2#!IB&Z6gE9O zK4Hp;vFnZbYYU{f=BQMqg8)hZVFI0Bq;6UxTik78oL>ChpHV-g7=`jiuc_w4~uzgiG}-0Au6hO0U>^fIuC>T2~S6T0qZU*i04Bn%a(%h^=&#q z3GWmIfuCQjR)Z+?;a6``R`&-XZujVJ+u7TLaHX@dun&uLS&(8GT`~*5<1NGFGD%m3 z3L^Jk0^IG4LP2MGmH#wBB>4%IB9kE=7;JaLUnyOZ{B-RxT4?*FK8_P^KTwyIDb0ruM5Sa(2> z>t)((Y^;9)AzLE?wG(lJ(uvqH2QBOb{#4LS!)Bk9*D?7+R{9!qF9&GuQ(F55YGC26 z$k&PCeRhP@H9#7UJY2{Aea!9f;YZRlw^^&846#=LFM7TGH>m5$pX&5OKPvwH;+v~ zoVC6#q6FnBNaSyw7$Hs~kXy3Nip(UlFAYHf?ZYk63Q?r(@7FS8V0Hlq)flzFPWQp% zoqZYg^`>o*Z{h3n?g)AFqHLNzC9Tp3lpA?R+N~&*UaC5fUx8SsTG&aZ_)qoC3?Ers z0kU4f*5p6xTDB$|QeD%K7E6d8eDCj#6(sxL-@1>-o4?r_jfh&6T|TKQG{8tN)t}ip z<0#nfH#Y1aG&o^@Rl5zO*WoQo|2HCkkiA?sZ!SD*!F)~y&$G6SGANX`b$0g4Nt#)X z><*;Gq+OMQHRE;~&R+HhH-n%sZR2v9IL)r~TVoU=75gRjQ({2$y74Cd#2bG~7Ri6a zv5AGA@2|cN$+d!)Jdvy3AbnsaD}Hf!lA8w-7BFo3`hPhNdn?feyi;`EAk^D<&H(pi zfX{TL`=sszskcG^ENbU6v=t7 zB&U(x1eV0CmqF(3)Yc1u9~`DZ;q&9K-bay;wNj7P5+^W%Y3@$NNTQKwdYT^NpG8uX z5ZkO>b!~)w<;V3H^9C>K{3IbH=ko3CdTCV%;*$7z^x$J|!K8b*pwT4E(?QAhGLKpb0cAERV{&J_)a(TdoR1E1m5%N8Wahif7SVOh7xFZoISPQ-g{yy8%`DL8PIx` zg;o^)PNb(iCmUHv;-ecY#LtWalGj?HA3&jOOew3i{txR+>Dq0^{Sp<-bifbQgt0k% zTEt-F2Mr+1Nb_>^J6ZaRnAJa-Lt!chlR8@BNIOnglwO*X|H{H}N6%o-?xONa*(Cs2`Wthp0`m0IG!8be3Phck81DITDp(5%kO8rtPj9-!Bo+e6Pa5H zb(yfqV1NcG!|=csrmM2-(b4sv^7MvRS73ZH3o>Ze9FVp5m*27*L_V|Jnb{nHD08F~ zfHz4`E?E4!09kibbAjR{li`09fG<|MXHQIlHr29xVF3y77A!{QMaP7RVAscvG;_HK z4=4do^kv~EfH^tsUvq`ND>ogVynFk`*uJclo1GH0T_y%v!=sZMu>19GLGbIo*(V@9 zf-2Z+1qE3jAN`h>Jbo&yqK>zg;?Dz$F%%UPg0rTFnNCoyjl==FrJNdwOL7w%p3?`@ z3SU`>0^n&Od-{2;l7hmKJ7e4nCC@H$K(g1EANYjE0VO?rQ(9$Z zC;(Jac|j!=`K7)iBO?ICIh?oHLFp^|=g-w1SXT5q1_9j8his!38$ihYX{r~0&gG65 zfFdp%jJPtzUbG}NDuP&VqYBv-exhiCF%3;55%+fz^G|U30$121+_}of^C^J;A8j)ya3FqMdntsb}<_meTPNf0u!L|R1A&}YJ+9xRFpkmBSx=SxxA>`ddEHc%w|IpGG1dk!4s zZ}h%1qZVGAkg&Cxam$MkhrC;r2)Az@!Mq~ph>b?ZqsUR0=) z=vLeA#M*T@iPI+cqXol`(MXeTmTT{q05!QRzko8>8~#8yPwq7YEEd{w3OrezAjoN< zZ!54@1>!CEdoEhsd+e8Tjtg((tmfQg8PU%I1zf2ae9xd>;M7nQZFnO|d59^1Vn;iKkCR z0f=Yo6r*&X_$R7>j)t3K{^G1Kl2g`Phc3s0&tdNE?dcov&zhzgZ?rC4f{Wn7>dXVfeE;eJ`%^dWKWGLMtDlp|A>*|tIbRl}qOtO1ObIonrZEvqnR1m^wL z(*$3`5O=I_4iH6q;E#fm5ZG~d6(SIn7?V~6O+3l5aYBm#Vcn zWeF>*FQ7=kOpc2Iybnl;L0)%aCj&Uo{FJXDM}16e1&^T~Y&|JvGT_F73j;N^a)!fC z=dM^KlNcQd+}jdSl*0bhW0}a(YVG_K*cZYM3g2KSh=x*&&Mp@+KA!W!poV>aE&kE! zLKeggdzJokzfvQd`lZ8rRa^EvINRF#cXwfK=xYKk#pT3A^(_qVk_J?`JQY|x0r!#k*-oumsZNiC3CWyA&1bm z4kVwv@zq<=HpCnaOb8;s)qeTw8b_e(P)vwATu_)Tosqh&rr zvqBl^ec8WY6w|1g$v?k(QiW;xt9WR#L>Z;+`+smz9XX>;+3VX)m>BkJzgom`DFZlU z_SscB2+{-J>8|gp><7<#B2$n<^}xep;=@eKPYRu+2d0Ce?=wZ^@jdQwKfy2o2PVrg z&1(h-o!#Je3Zj5T;>V#6hR7PUyK;@MCE?t|wxn22intVMT%jpknUn-iTw|(_*GoNA zx`x2=0ZCk(zLAykrqQnrU6->%jFyYMR%RnN^p8^_vS{XwMbw^ECPY8JZ&9i zS1vD>Yg>iIOKWgF`F^uycn#~X8@B*~t-Q4wyG=O%PEgeAYHbeiLh91~nswbs(2=F8 z)Xk%nx!e(9{0jdGZiVrWQz8*t_Lmn_8w*5NO2)?V*VgBfq-<*{L^p;ppSUIy2*Kr` z6ju5AxwX;UwnU z8p;9z*qRT8Ywfavb?)&hU^wj%0&nHtkX37r3^0ftH3`}&zsB!D1|D;Pe+D}6`=M!` z4?&kelw6M^P6V46DsLarTw+4B?moVkuhw?hd&RSpw8!t7nN**n$24!EvF~ZvlTK$& zdUv%>ZgVd)7_TcbeJ*gzIKbiCc(Yi0LJRE`r_Z?;7#m_r-3poOs0(lR?O+pEgOVvk z5-usZ?vlVM3ps^yN^RGG(jn*=H-8H0Wh&~IT>UMm5{CKa`uVn}m#sKbvSJR)pIvpQ zeRV~FmFyH{k3!vVB3Z{67wio|>h<(Wo~k;5%U^ky`(051>eT${?-^n-MCZ2}30OHL zn+caX38IC{#ymHIZtpUwUSHq05)%r?{IG98EOKVnbNN{0Ec@@o!FtY9T(0ywI-!}F zM(t{=0B~wwT}*z((h<#aoM&2tgJ$AdbkDM7N;e1<0>-V&?Oap+Knxc`>ec^|!j=2u zHp*>InJR^y@~3tuj9uRN&tDOBU=;!m+6Ng6P6I)gLSr~N9hU2LUdc++2)?{e(p1>V zGl7QNy!*KGENIaMr=*;2sm-nGW93aSg3VhiOpYwkhckn65T!g04w4WfjDrh8P3G62 zQDXM&4?x8SPdL?eZV5s`s^rzziOQ{P`lk>K_+;YynBN^hLyh-pEkHEEVWz~jk$?He zuptClDF(@}?imSP*;Q;NdRT|%1=$Ny%r;w&_Te@0!W+dF4&kldhWn+p@v5X4x9n&h8pcgF*1xMD9XouFoHhG82ow|e(suphl&DGj>jB@pD9CHco3fSDXfUCfN6GB z`S4I{S@y+cOM5L_-)tu4ckM^Zz0Z5bc7OT+b6np18LAmTQPMrCY$3mQEC?_AjS*L5 z+$d@v;VEwWQ!6i4`*_?CtZLSO2^KbZCm$W#u*scJ>who=+4EB_;lC8!j;>C0%fi}c z-#P=Vy1P1C&A0*jx*@v7K7uiP&Hey)D&B|!tICsVS?9+3LE{I*lO!yNq%*Wcr0D>7 z`e%Z9u^)=^TtaMGJ3h|wQ_~!vWj>VT_a`ih-jy@2d92^Wj^TGI3^5aS>&1ucCEH1V z8zNCfu@RB@iKTcML$ zJ`;ucu&ZpEW+UXeftKNgk_2BZTqQCBBS|n^tRmtVLd|pDK{>cvqXN%$g6@D_v4Ns& zqN5`S2sY@!Q;g*K@XAW(n#K?R+WMCB3HF99aJjD15D)Mzg!+v4YtE;TiEZ`axb~e- zv7cjiam63a25g~h-Tp<*ZQZDve4Vvz-0B|=J$E%VPT;imw{+^-F4$lUO|S2CYDXjtVJNR=Y*l%;AS;!S>*jOyy@r3-YV}0#Tzp;}9Sd#z}TQM=wAPY4;5d%RaA!gu>{;BIh?v&AA zXPD%d?$K38d*EsAcU6p*j+NBLKO|-rJ-blD1PB+sXZ`X&t2h-R7H_W^Vb?armm9iX zxffIL?ldp`*qaDEk9q!6a!5;DGeuBE)uV=QA&G}y>+ix)9#GyrfYeOf>^0~`(KZQn z&%fL+or7xYe1|{~_Cs24{O7crq{@$bf=7P^Klqe2ZSVbIe?KG)23?v<`R+#~8=(Nr z%JyZLik$qbh$yJW7rPR2``{s>Shx8A(lShrVCaB0{c6xkB4lYdKfz_*#!QZA&}s`% zFVv8)DH8T;)&do9pnyA$Td@B}sTm+B*zEUzgVDR#ru*Rz2Yc@z;x77Or_UFMh{8Mw zOuoTt;5tmq8xkW;yQNjnCP>-#-v$6bz~z(yUzxm&x9u@K2Qp~UtR7t%O}R}Gc8$|qv3t2~@(<^G3%~+X;3vU( z=;>>Y?sm}c-wIOtzz*#6wA7sx5poxEG*1hG6|~txqC}jr+&;L%_cElieHb?`4K95B zu<$}?g`J`oUEUSWrkKS=bEw$5)@PTFZiD?d&p^PDTQonM<6Qp&w!eTKyg*f^jL5wa zQ^f*13QHgBq*&bZP1m`sBxq0>{3U!ox9gvj)ardw{B+UVrn@z3(P94+8duek)$-Et z;R_!YBa!s-YTS55IVDc6H|2ItiIIs>GiNBpt z-f!a(lKll*EZ}kcfL7`=QBaJ)#Xxly^eGMgax@?MPGiDA74AsI@Xr^8A>5a z`36B198qX}FGA#^uElq3?7bq3w@zfd1m0j9J(SVg!d^O{osk72Zw^XosGiyZvfvS1 zi+}X7UWvuTPHBEsM(gt4si?{n1@Y*<0)BQiyOL&5$wp`0vlRq-H4wXzn`_MqOQtl7 z*AM{ogT}N*A&_QltE<{4u8ms97Enn-Th0ch&6^x(6_NEL9i?JCo+@5q1N3W0rQdiL z%i3wk;Xj>lUVBxE^{M9gl7>Z+8f&G`zlkvRKleC3OGABD!fc84l^Uz~2j&0!hZO!N z?__LY+Yl|ft`4=%kPF19(Iaw%&oZqJ(d^bPZz@6TZ!F$!?NQeb?)IpL-(Z@nr=!P}a)<4_YWfje=(O69}Y z%Ycc=zG&N;{n!$!@EO!c5Wl{>Pjh{(e+DZn#ka2`di)mjICaPHL)w0Q9=+EQ$C5&~ zgZavV52g65J=SV2ggHgX4P{lv%wa$A*5sfaMaSCk(2WT}9bR)6q-;)PC&uQJ)9Jf* zDi!_QQ&$f^i9_e4I zusHiQ-^L;3gcspT{T)iC2VEhv_AQg?RM88jrHJwiw!EU!*8WFSFAXSjs19!D8y88m zR}j}HQZ*Z2(&abJlOP{Q6Y5d)N^q_mD%_xZ~Xak1`eI!-HWJBX3>?e*$Q5PT}*@q{NfshZeo_PGWfYjpjeOKS^j?77RN#xy88iG#C(=!Ec?le zM!1kz%a1+90}-(_ScD~3c-2lZ%#$?p?gC}@9+u4m`Ctq}&_EhO91-gQ3L--+{nxQWaK#Xmfy+N1_hwK&P1q0=sbOK@H;*y3LhT!$!ZkPQ<6~ zbT4_9X=P#f+}j@gTPpWWEjFWtH9c1Hf4nzMv~d((qBE0~tD-f4=08Y3honzlnkydQ z*ssdSG$$q@5c!>^u2e~i_=PE?4czWKFy!9|igW4Je&0c10p4mcz|aMZpC_XF>CPq& zwI(HG$`z5cjywiq#%?N8ZqgXJK0dwzZhBMt43YntW~l$X!qns3pAu?coRDTMvH$6Q zO7p(X7-e3h4uZ>^*l9bej7DaHD9Q#*{F*a=_ihAcHLj3en^r&88VF# zPW(e=w$^YB#G_xf^5xbFmlNJv?RNTi`u6!?2Kvu=&@Adk3YETnqZz8&_~q9KU!>tF zKLmQb`SWRL-!*x!?Qs~TEOHRS)e0~xp@WXL({Jwa4%;=kd>uPB@6G))fp$`C3b~~3 zuC`^2dKmlg8do#uV-MIcCq_X+SwjVeC~QCwpTclIR*^v+UxIP!$_8H@8GOtpJP6L# zt80#0?&i2Xy2T3kKK~N(p@C`zL@apV{GNEo;l8z7_x%%t`#NvQO#fqLBKtpNxDZRx zRTM~eGLhP*Wh*jbRc)jv41?pJK1F)+@usk^9;EeaS`g|D5)oEf-ni4LI3?fs*rrbx zG)mzY@1WyxZY`ch$#iVz)q6}4p{-%mGIPGDkB!o}6|3xbHQld^4mOLQ9vY4Brv}d@ zV8?=YmRluGRl6`v*5<`Ci4vcGn1AVNAzC!RCI)*e?fevU?4hE0DyB>P`6L*epj6IX z;XFCM7Vq5zyKk9%*SNqulD|t5OGajv`(ik(@8uNT7K>q*3Ow7Ezka*HRMNZB!p$oD zQ7lJqhftttrm!YQPuGrpW3~(JLB+glv9n?}>=5>nAL70WOEhr}dZd)AYZUT$Nq|XS zxBthhl)S1{7$2{b7bFpm&`9@J_!EiJQ59LM9gf-V#O#Zl!X)n;w9=FdxR?AiAxHs&i`)R1o>&68YtsVOD@(_RUk7DmaPWj%KmTqLS zsRZipzkMS{Y}*r7+z?ZJ>0#BsyBya>YlOoE5j|1Pa2~7G0Vw5e(}Rry2= zSCcBOT&lKf@nil4$sgQlc3S-B-`QMBz?=jLg9JJ6dg!|9b$;f2_wCBVezU8)z-e*g zvD4oRwa(~Kgg`EA;@ejs;+$d&LH*8&S3M-2Wf?UKW6+4;CDvEEfkIt)j}c9qT=_qJ zcE%X3blnOt+`is$R3i)8Ozn#o-gFBb2i+*x=^s>51<_yWy7!_UmAd2n6afQr>oa6g zwlUYWer;HCsT!F~@Wig4%~N>K;?4I7t>c=7IGVXo;d~2TR|Yl@NW52S25!i>SSfzH zVAD*PNS5S~!x1IMJ=P0e?RR|!hAeAhRjOum+@>-dAK|!sJ_3qw?YauE+81X%ycNEf zVH7bp7>iJt`{GVqZYkaVv!~MwrB&BJB;qgzJgm4he`8#hA=^YP{(Yj3gqZkI-MbLHkea&M-IDqaAKhw`)6?zC*+n=V zT65FLSwR1f92oj@KEtY#^g+x7`=`&zAU0%$v5=~<`1ns5zpuO(`-Vw+{6a$h)?sE= ziAoUkN&M?M*f#uwfIRT*O-C%s|A!}H|0l5d&r`U6nNVNCBP=>g3J}0TspPB93fzc7|T~n+HQUe5{E`ztG`M}jK z=O;RSjv^t7(c&3jCJ=`lz$?a{mcrshDb;V46o#4Wv$q;z6!|1<$g8mJP8CO{?$NMx zVjS~9!nbS&YqY~G=?ga@{2r0$$p=lkW@0gz@6@?IsT}&eqSzH8`5`vprtCy?jcg=UZwe3Jlq}l7p^2=O}r!udVV*F}Y|Lu1$S5Rdd6z z|CWw+`XxS80qSZWX=LaW$}s7+UHfadCnQ|Aps%l7;owvcX=K6m*`G9Bh9siZs8j(` z$i3ei9qtEo+@RM9;27)%fBkiiqYk-hc3VA zAV{=RPS0y)y13=K*o~z}%nr0iIa0bepRrRal7MBU)a<$6+gOfE(%$Kxkn}?g%a`PMgmjuCgTBX`88WqI^2wcM#gspjvJxK9OYX_b;B zcp)LDm=ai_(uIIZIF=w+*gE zE1r8P_B%ShegF0U0=(A?h$yy-w5j-Y^ukp9CFF-P2~k7_R5HQ(EkB@wsBE_I|w46^$IPj;L+j?#p}<{}m!>D7b)duw?5 z+D?TK0>uJm*-A@0Jcex!y*lNKdI;dEB@a8V zf~VC}&I$kaglk#x7h40z`=%qXxb6I^Ms%wqdoDMFglI)IopLTP$J`&r{1xl``u(J3 z)Pd?5OYb7;v2!KTDVhlupYO4-h&TIAO)h>~OygW#9RBKJMK<;BU6K2(o91I2bSq40 zZobv(TyJm(%8&GBTq_6pei#3$Ut*0HgyqU&kZlv<5uq8i+%SpMkCZJQB`mPCQ|qyv zD@e=2a=XI~2mVLOp1VtZlo~x*DgLc;8`I4{;Lvy!1V><%y+%8JbBDjTP0Nn8bv}z` zoYKyJ?7YN5OqKSC_y?Kim71XaaSuxxe<0U-Ik`HjUO(<_+Sfm>!hBh_*(3V(2`~A7 zle4*~ z>>K2zr{LKvQNo*RA*0<%d=PU@^mQ->U|$MO{UJ~VVSQX%zML>MJ)OG@tjQTICsDJT zq{&whhQ>dBvsoC0w6kBpOV+8Nlz8Izjph6+6W0x+$~uv}{Ne!cB#=i+_bRk`d|v{b z6&B_(j5;pM5R30e2m4FU8}L;INkk~|^;orDov6)||Aq7Pqg*O|Ryq%E2Lx_)8FrUC z!k$$R5Ip4iSQila(xr8&nIzB%Rx@$L1)*To!4H@M0DNZC?PI|6Vn1xi~lH#5XSd^-q6f-)^ihyeQli6&E3|z zfNv3-Kecgsk#eg~`0MS8i!yv4XmZay=CD~%{n=)s@OV8VYRgiFD zrRTontIgIp)OQNziZpF7$$9xJNi`pRk+JI-fP^6=7aQSPjU`% zz`OYO!_k*oDzPVx9n_*~3M$pBmc=02dg?Dkua8p8ruX>wMZ@U2w+|3`@l&?EFK9ay zu$yvzv+kA4VZ#W?#N8^ZJP3$BK-)XTKvV}`)EM8!}(nd+om;P%~ zi^*52XVYkHPv95ZkM2&XCs;+ny7%J)nK2^-@{j;C;OFbr7o3WE%jfl>*|(?WH1Rv; zAH23^{0Y>f;z8dIZx>qF*2{`NlAAYb4K>!p*-jiBRTnw+*nKw zAlcfjUk;Y0KZH8oyxzOrjZacsk8>Y+qo_O+{rP-=K=&i})s z?j_p~==RS|HiT9WmS4-WXYA}|0bBJ~Ev#dUaXo*^Q|0nnJ|up@-p)n-hOBwfAV=FH z0p3H{u6A~2Y-XMfc3AwV9siOY=uV1@F*Y_KcPN{=m<1ls*cyP;`FG!g1g#b}0wqF% z+}socnWcVw#6B;5_h-->0u@1GI4&>MRarW?DfFT#=U|3b5k2zqV^qkC=aiNhaGx^D zjmuZw`?jsX2$6ASUFi+t{fDtou(Cr!jE_ZX&F>sCLwa4~aFxLJX@A0RuH1lvHfL5f zbp7!zy#lDZQ16=Im@?cl8J96CHCFw2IcsTN9X@wMtL=NqMi}>k#63oVAuzm9t;y#h zen~QXoH5@DEOiG0AdqSUF;bpycKkXz#>$G3r_(pqOXuz!pcIs|@mM?hp@WnsMNZS{ z!wWBaP!lTi8MHBZsJ+ML`dg+mmric%tMR*;rb)7!$v zq@ZxDzZRvS>9AG%|EspQj*9wu`^J}$E=59WK@?Cxy1Nl60YT|dy1N%aLJ&~tE=fu0 z?vl=>qy>@g+}&sRe7^U6&hMPxAJ6lg`|)tx_j_h`X0DjIUf0C6M610^G?3wJUa)S6U1l#^TFHI?PPjxP)^0Grdzjt6NWX|?!2=<5Y_fePlGq&zp{`E%eZ*a}Ufrc>g)(V?c7FI%Xfnt1N z40+LMJ7^06Psm46F7DF2WO>M)2?i4W;D;KpJmQ~td7#{q^^+b|Pj#YW$3pQnhrMol z{%-)n!%r`A-4b8hj%Bl`6>R7-2+akKNj--ExO^E3B zr?@$G%>TQizlrD=TU?CNbaRJDw&L%4g3S8fRv%Z|V@}yO@X4NL{U@(@bw2qEslHvF{perij4R+$`K2$AN2p&1^XWeg!FHl;gq90^}(xOSM#;5z2|N{ zu*yyHqHEeV?z5Xy%|m6)N*u`S?CffKtACO8o7*%l5fQzsmwFOfUXyG=bKdRi5=T7$ z*=V?ozEMtXm257{Pj5A@DEQ51V*rlGU{54mupY%Nw40X$9QA0|V!`enGyp*V72#o_)e{7t7dp4l6Z_L2neX6(!b z8#NzsCpe3u1}h&<^bHSoq~4LxM0g)VFOw3zRG6$=zJEEZfWK??N%8TjnkLrCo0*~X zY~D52%N@uLkyjg#I^5UKTkOdj5u>kv^42INa>u4plku38qgw%`PdWX)op4)a6w%7c(sjrW^V)`C@#i;g?ItrCIPFCIuZQl5G zZ%P+9c#t+z)etUK;s~Ln6z%d5axvm?*d{kxb2Kc&8$?AQ58sf5NuQ;O0jBvhL1OpQ zI4ilROwk}$e=H#ZIo*XyYL+8L5@ZfdEAkNkW3-!oSl0qJ*R{oQ1?rdsa^WMlhTLKf zPq4Txlr${)LL>h;!^)c60Z=(}ai;qWcuXgIe^u(#JPE=8Fdq3|zSiI|agD{QYy1yElyKK2NTnVPDEMMmyUqMv#r&i!I? zKE8MnyG5*|)IKnfzU_*%fL+=gy1HO2*ojZ+cHHVqRU*6Pc>@Hp$DeVM{`DP>YB8t< zLeDhaRnj68_kMM$UK!jpE%T8CcrRfP`+z!del3n55L;e`ZGn!1?fLU@aTiljy7c6c zsmnKDjjtZ9Z5sxI0zDx!7O#Zy8y&_A@w7%dlo48idvv2;AKCi)u-gL;z4FE?Rs}LO zyXDbtgv6@s(DU28@$ES>_=_@|-kw_cZJP4+YBVL+xzs{&#HPkldtZ!NBm7Po+^4YG z;ysX68Jtz@LyutdD*ManqdO$rmwo5or|zZSO!$sb<|{P9gQcE75%d^dg1p;k!*Jho z*&H@i*T9==enz==l6a%pG6G_R@hEk-s>wKl?cFHy{1agj7fwK00$qR4sSRdrZ^X`E zyJP)LyL*-3%Asd${NFC-M)&8fP*GQPZW?}qp0iM4!{>;-;rWTR*yZiheKXXik)(iq zT~!&7mKL;(XeR%DgHz{Azb2}8^R;(&=24dv7v6~L@NK^(V|LrzC`~+%6k@|N3JfgS zPSYAktM>_rJ-e(O4+s1`ekhwcJ{Cb(2z;B+(#dE`zwmHB4vk&EToE&1Lz~$&JLeIj zW4%5nbB{|31~+q0=WpldJrtz00Ipg9NFPFo04%kWG+hF17QBdV|H_;md*=7UhJwGP znH=MOGQ?R|p4D%E5{sRXaJ<=C z07DIZs`vYC#%%$v=5?WG$EpFXxfWb{qkoUGHyUFEeM%YEoh(M&GQo?bo0kcf-hG?6 zN)vFNuOlu7Vb7&kR}+Y8v~2LSLxF1rs+~YgF*(n@qZNoDbqn|=yh6#wpC)p~oT%Vu z4(%`smHZ2%)zJH>f<%>b;;>f2eKwm0pktW^R`PhgnLP;&ufSo|?{73D4)S~G8*fYXjmO?10jdaeMYeFxd zuqxv*Rm|#DR^9d43gt}+AsIg`$&;u#xMSNc2tFTzTS&pRKDQ!>WN+QfScN4q=P$An zsYdlq`q;O(=eS)gk@`iz$_NU8bqBHpR-NuZ_z45uP>E_+_XF=&iRpj1373CdYWevk zM$kccGs@R4MvUa11$Yc+U@={VX0-HN_cf0~^&((|klPUgN|+f=($kY=C$y8Y|YeJCQ{vM}Ht~)}X zz}(|9VJB{a4f)f0y%cZ<=ZO38(X6PV5+q+w_X~+bn^!F<1xI?!S7H&>=S?V>&n6vI z&JBea3DKiBA?Qp8;Rj^M>aMkx|?94g+tZ8Q@Rh@eW z-&_S#J#;~s<26-sCjP1ncRD;iBc?WJ!dLo>i{irZNY)uPf3cE@CUeM|Z499b|K`Ew z*MjzoZ#Uxs^RTw>%U=_6Ilahv-;K-mFbSt)oUH&eWsF=agiL1Tk)|k#pvBy;g`xuZd z!?3GgjG5O5@}`!|&fBGQ_3rGbUhMR1ac9J}#RVfrD?0APLlb_1oVoEp$25tPt1*qs zYXv>g()}nvaplF6FXg(arv-JQx^v7*dW%F~f|Bo+9xIgF^G4m*T8^XjDMZ|w%`#lan-6yng=&lVnJ<`i}=C#)JBpx4{j$LX0OKFj(Ps7nZ z6Ic%4cu}=TM{*23(2`O2^j{XYwU^rwIk~{TOj9=GYl7)RFAe%!j zAx|IlxGAyzE%k2o(tTu)tgnj#fzTq7c(#M}5bu4lu|%=&3;u+*w6u&`S9kD`=m4or z9}s-vP*M-fH(z=}=<_?np*{8TxD7^}ccOIp)5C}?uT{*X@Ef7zI5zzhgSbx)r=O7T zMTCW<7&|eA6rfUNFis*^%QKrKCiY%S;Ejok0L?=@dvS9Y9*E+Vxy$jZyhq8IZDW+; z1)5(7y2$*0iDHO&yh)O(&E69V!B@L)y7s+{g<(E2 zvaIFdyTA-TWPSN7M`vduG6wz4eRrd}VWSKEE>@8<>$=N2Q+@%~n5Om=MHTTNQ`hGEIc>A@kRn;r`>9Q zMkEX+NvM$_a_$5}@W{rn8<=jq3}lB}Pr4igZj2&*3+w;L;Xu3xJ;4^#JuG^t``;2} zUcyL&o}9O5jBqXP>)7q5C6|8V=dQG(N4<)-Va>8zM^XPA)Ytm=BBlDBe`9oz{TtZq z)xS~C{$FL9NMfBF{Oo=6^N1`QC8Do77qnGeySr_$6jy~kFU)NS>=W^xzJ-g35S4#s~bKX0?1RmpC)4Iq05E1VX61- zK*IktuDx-oe~Wc=eYBK0RYt%fs2KW1d=ZCe9L+I#yjnX`q7U4C>|@#Lu9Z9gIZmf+ z!RV(@HwE1ik&a8}grAH4#1{>Bp)vedUXae%r$IDRA{7CY^ z1DF%W^0nNy&i&XId88nX?9T6h8yBji8TW1B@umchy@{l zW(8Nb7b!AzLH(gnc3)rL(!cM8X^0?_&AEn(BcHG(zE6D;Se$X4x`g`d;F8l6>r^qP zo*4_{j|I1_l%qlBc6P_b?}`~Cy+Gd}0nyRgGYI#5wOyE7ntkk90(Im9WIf}uCX8)a z;`AnNP+HJ;MkPJ?V}t+lU;c8s5e!IEwcxupZ^X}lxKNJI4DkMy^M&Xs^p6Pe~*I)(<4=<`9(11CWm`ygUS(_s%&WaoyDL@n=x;23m9hQdN8~5iu zDsz=(F#&TxpSHQ`S_`7b56ohXf%1@x@}W7ftBy5+B(3|g_^lo?de7Z`Rk2>YT&X^P|8Y=T``QtCU?)Jxh{}zva|gX;BBYmM-Q4CzB`KC_AB z>klV^U-zGz07g~S*5)*2D^uA!cCVCYHDwckrAM5xV9#Qm9;mRFpLY>6iY=Ss*=F=e zZl!t#(WD-zNkke?nkbY9CvoK4|C0F1bx`4<}KPP{B(&kwl?G{|;5JNY=yFkJ#I1XQFX zR$l7I58BeH*%iYov>5~U_rre}Mz39qmF!2&Z;Z4x{N^cJAQqXMZw&m*a#25jyI4E( z(xJli*HKcP9g@H#SwCTJseg?a8H?8DCy^ErEO4i25sB}B*9G3dZ1CZ=_RdiJhUug} za;TayUzV_r&W|q8#$lgIx15(34H7Ra1Z(P_MuQ{@bJ0+1=avr&REnh&h5QN3rPlM!eO6B+L6jMRW2d4UlRHNYll4SAGN&Mlx0M*yO4& z9mV4PFvJpH(KHhBtwFi9KY#)jH=K@Wu9L%k0`rPt@6!+N%iQ}u;>_RlaVJ#g2{%D^ zLSW;wPVJzSgnZ-f##!a9l~yvJ%GsfTGQXM1kq4s^;=l+OV?)wg{6v8%q#qU}&n0sM zCcS%>iJFQkrL11V*?o6#8n9pE^NP`xcLdpQvUm0a+w9sqb6XEcW4A-ETrA5a$$lM3GK!mI~aor1BkS|&f&6$R%+wCqq%Vi;d)Xxs@h zp#l6bsR-K+`*!nNWrJsWX;(a>0@)GTJ~_Q9Xsy>kC~*`FQF<$*uOPky=3pWPyMcgV z_$C34qdzX3U2m|%4XH8Rxr9c~#C?A%{{5?O0vDY(y_@5+#Yvneaq+|MZLsH=GIX%NsNQe;hiSC|P0^!Sz# zFf>e<+E%3g9Ad+M645>jZ096$S7|-;6oUkC|VGgJD=X7Gex=@&7ypBE^3b4xTx|O z7<-NlXFMxc&ib2eSk~x>_LuYM_8sYoLB}&ofvhD3GE!DzhO-qqGZ^Zx=EL&Hu|bC+ zlHN1mV{~$r1o?Z@+@+?lIt4kKH*KHy4O7^F{_ilaA{PCe@A^N|1`0ewyIUYK0ZDtN ze)m^k%&@zIwG+4lF}7>aVszigSJPGHx-9Ni;F^vPt^O7Xv~iuI(htc4od8)>LI?R?!`u zTfe}U9YpkbA$E!R#Ke3bKQ?W>(a%VUX0=GsCF4O8#~yRK3p$ng;hP@lZ|0imx$wvJ z*(HZ5tttNO<+o%D%@L_S7vg^gwwG0nKJG*Jee0}Qoe;P4`iVItdsAv%N}JC2*Dgim zxQlqR6T92iv61ve3q7%GSt}x|$L-o1?okr-wP6YFO@ev2)DKJhCqO$K`vmn*nAiWu zXz2eBfrW`zit_}W*8GBA*-3U!x!0PC#rY(!T8p?$IqT#-YIKJc7Wg|=r|r%ma-YKW zDlb3j{Yw8S_ovaio>lW}wD$fhtyc5n2WMk{n~U`KHxPSemHEzhuS#|Ie#Wl%QxLNh zwR)i*oUKP-Yc(2X4!D+f`v#!hyx6mi8P+0#eunkj?qMqjYFBrU1)Q`HmhAngW{bu-S$`wseDy*F z;8*aUpsdq#x#v!I2r9mmR|8v8vsz2df7U1t5QyhNhBzO28lyZ9auuuXJVN@N!Hequ zItySguJ3X+`I<(=uo!gdmhe2ysYG!;?FNpA)pb!@TGi_89tX=3;^LHOK0%cK1;^+r zl=65$TAV^L-~*$v1IYl#Nbkjk@xO5F^7o~5^+J0POe>MdX9SDu--f3-$|@A|NC9nL zk#cwaJa)vWyM9J*Fg^wGdnvx?>gV5Bwt&`b^)5Zk!y-RSFHzKxH)@HyHxY%*D1y{; zf4GIC5pgWGNIlxYGKYk!>_`)kKu>kkTngW1Xp59>9mf%|9|nhoSn4V1w|%0`@)X)0 z+!duhw@yI@8bBCWn(g!pHgafNq!01jwD|98L;(TcKWKipatg}BCB)Ga!%}d%_nN?% zgA#%%`Kd+3nm@yYPcX>p#e3oEOaIk|b0D);LkLF{Ox@$zlb+zY6)R-nUN$`7K!n%hy7CO{x z9#CS)(t?0nn3sQk-d-8q5%A{w^MDrtUxRpm=1^7}5XX%2rbH+=N4C zaS53;D(U-pCOhAFdup+G<(RW#rKRI<`;*cd9-yR~oUeT<-v&G!8UZ@Z2>(cUF1Hyr zR(zpV{gCMq^vwA;bp9NdunUL^5|AEfH?fLEm=TKGNojJrJZUT5nJ1?bGx(W0Q}NhF zcOmo3_6L(sJQ(w-WnsAeq0RcU=g}h{uvU+9hR^n&%siu;%KWlnLLTmb8oC}SFL*Ff zN)W`Sh{ZB~Lmq8C>N@d85DTb5#nAO}aPsIJGyKOz%BNd3rSrhjy`UH7rjnOINBUhr zs*vI=(IOan5wt+!#eUB0KD$%!E3FK1Y7*jNK%JxyaFidsL}oeg{%~eEdEEB&?uXy{ zN$2R93%;Me6G5X$35knMD1(@IjeX6^Cy@#mYStavA_H<`36SryB=JCHUpJWN{&=QC zyXlzfY4D`{84X4zTJGrcU8tEv*2j8{XW=cFuOD-x3B5ECZrf}6@3OB|^jxqZnVLNM zPg%dS$asDv*M&g~KkaY!o(H3GbOI&4C|VJC{Kx7vVf=f?B&GW{F5h1buP*PYgOqzG zRaY;zUYS@EG@gE-a(hx%q0e`dhbdNq)Bx*qRGs!>3_qT2^YF~v+|hJe7a@gYeyc-= zd?Ubt*s>E9-rTBz5oh(t_q9Lg0a%hw)dsqrSsO zu(Vx-{Z|q#Sstl&^jrh~lYuASSzO{@>8fkL#L|3D7w}AT^|~4QRewMVKfsAvc02rGeF)DWBO- zJ3m3_kGE&~Sr=p=tuGZoi5O<{- zkIuQQ@0a%$OXIIdlF+93aCx&uP$Jd$CBf$&>>Ax4`1d6`zwX^b-HaTkht4VC6Wld8 zwmvmy<)sig=xzzRFkOl&c{3cH&a{{1dcW_of<(C&Yrue%|G~_e_Z!2N|F`hZBV|x=j=8etPJ&5&lp)ZY3HRx z*gNL*Z~0_KO2wFKk2soNb)G8c7m-bE^tq|z7kz0u(LRI)o0{s^X7&z+CY;8mdEP6X zg*)F}sPL)?+5Vld$yzk@WqTuGb1iBpBDfaj8d#w>y0+0d;Qdoo6c@f@Q;%cl=iVaU zaF%l!Ztb$(@LS>d@NeZYC~DYl^=Tp+9U}W7YUfN`RRYiJPX4vuu>S*f+q$wm0SuC6 z0$sYdzuV!z{Kr_D*Bb?5i(bt9{Slf3Q)4 z)Id=)2A^|;!z5)TgyArHKhn1_3f=Jpy=^nSqrVTNn+KR=RG7mqU^acw7pTFt9ls|g!^w&o^ ziH+%snGE@TKCNL-o<3@P<1nvuto=8Ejaek=)g#sWhSA|&A8%ip zR|x*h)1(J%vQPp@d9@%!uo5lTAy5PiS4bBxjs!DYJ%VDKs2qE*`2+amygUoZpw(JO zwtjXGcs$%3cAJJ&O7(fkg-FMVqKk$;CJa?H^8~%xQFz{YmqyGmwhQ(MG>X=iPWGz! zq0__p%Ixs|fw)l#Bc2~A$jjs};aiQ2&Q9d6Xoi*}sRUn`w7v*_skTrJdDe#iC8AQc z{{%0(Rg|vYp0#kq2%f#ffiYKew9kE9@q(kxN_t)!X>iEFP!?0tjaC8<)gfd_vWY|f z0VbhO;f*U6*h%85*pSiQtLqc90bCGN`RKZq%b!^L)pg3m5C+ z4ncQ45p`frFFsdR{@&~mcv{mBCG+13JHj-o(jPOc;M0S3q5l3qB~x zr?CtIDC!=3TrH7XD!;%CvBFO^S(6=Xg+M0AJsHH`uYh!xMWoPdzcR&gaQUAB#fD!L zLMyO)&d{^s0#ooLJ-*w56VXCo5RkB%mx9oE(8#!oF_}_Q_im5P)*tb%M;f{& z5r3%I*rCEF?~6_PcSt)63ls9Vn+#`6WMAgNu*q$atu@{`)K?!W9KEZodh%$xjq z6Fg0*xssWyo9{EoIdk7impj95Gaszdx64;j(pbw8)kC*=o~UZQtO=eKc%y|JSww~~ zaW{o81X6(|(R5vUEWG3g4|yE~g=Ag?60hbDAA4ezgJLQASB&?K4x~KC`D=Hf=~XJ4 zzU|mCFJO;ENiiByqU~oqA#G7hqEUVsbHN1Ba?gf4TGV!D4pYD-?*@~#v^l)D(xMjv zd;-fk6CRAb%AwwsWI*X|CpN0QPKEq^c}*7#UL-ADw1PeqLWht^oj=?BjhNck#M07( zW67|M7Cuax$ArC{~-j6fyI~&4?QHi_#66Ih@zHuOUQ1SU3`sR%Ck(c>*VG} zSm*M7^JEFOtLS&zjDcE=8tCweTT{5*~%4mtTy;egvry8oj@Y zLf{bdWv+Ya8^IgAUA4Kvu~JPXiHX|K8Xe1l0; z+LHWkDAiWYn&wJw=3xeZ&xS84%S_uZ$>;{8Zztb1GbY7(W^uiZv!)|wgNxT$Z$>|k z#8<@X4SYtto`X*H$0|MU3W{u<-e^39Q+aIX@0bKj;k+6=;hDU{i zBwSc-eB{2zQw)<+uZ_bf8F#6*64u8q22Q;OuhkA)7j5NkJ{5>>qZBZTN^D{V^NX{K z;bxcqdJzVe6sfh&tv1#!1CwF`69;Z^}tWnY>*T^Ekk5Og}$GK44aS$2W%@SW&NV8 z=+7ZaC;{t?V=HShlUO~8?(iv)cs)VFkQ|qrKPp_gU0=!TmYruy67cM}0!|#1TUhx$ zoo68RO+@Gk+9nMS+yk3qv)4;$iFS&7vw4HbwX^{P7(Wed(~`o|y1eSVv!}H7;zz<> zRCEeC3QJ6O38~^iqnxz%Nh0`JCc?3);uE`qYCTJH4K@C#pU)9-FSA+>prOkfUL!Jv zmx{IAPpAuQI%h_|=zKiRAno32;D_XY;e3pKH;d7vh&8xE94kwv_o1!`O>UrTPIc$| z4bMq~g5bi+`*(Fp#mbgX;)K1@laHCRo-~FXsAG)cuE!zJ7=3-wcn(H`o?Oh&mw`Pa zT6ZvlgAdd@$uL;n=QFMDZYJlBB!rML?6#kL_ZCP9nME7ibuVVI9?p>E?CAtLwtB!4 z#SaVo+fbSX;v}lA?AOygqq18A~XA`k;b#G+K2j67v_;I-w65KaZne8A0fAgD{gWLg>*2>K-($ zWj+VLLY`nh`Mkx|p3^#I{y=?BsdjcKY^5dOd`bdNoxHHHfbtw|H$uk5%?_{p36rVw z%R>V$#V_w01}P+EJ~UX3IAM9Q{rIK1NGR}$aP=M>fjWAEU>)~2;mCa-eB%@6Wc6Rc zx}u0$g6O}kC!_K`BX)n;;@Xx?L0BlIu3r+WwhV;ehiwExDSkHZG&*vz3mwjFQzMg>xFF^6uh1RMADVQg5{s2}hJShg#Zy^^T zc$V$3s|7hGMB#`x+-mbJbL9nQK6EOUumdpE^U*Qs;fo5``F;E`tkv-YmjV`!UKEXL&|TVEkkc zIb`0|qu)Wvke0svLhT@*5X^V{|_P*>0!jAbFYs)!f5FE#mbxYkm|MiaqFJj_3hQYa($ zQyf9;nVnN0)Ryf7bmoDvhun3DBgYrIp&q$o^3TUMq_^ zy6E*vXF&Fbk$2~--S5>s_&UjOngk_vcjb*9jpZaa6j=6o2AsxXM{#}uXNpr z@JpMv(S6kcy#VIoOr1wuNxD4ZxO|ELl$%)n?OKUKbZc)T2;~y>p{Z zcZ!`Ue#qmHR{bq!*gGeI_GhN!i0h*LqAgzOcOi@GO|6?kDrzsroY_;F6r235 zrt0YiVtLU@-{{_v17BR}%uw2%8|*Z3cSVRPg?2`L)e!OZ?Lwfpd~fM=dJteR9%{z< z?3#cLe+N!;d$3x{6Ynb26?o7e{>R<-|D9C<&#r)J3v*87QP*V)hpyO{n6yFf`If~~ zgMQ#$+_;HZooa{v>#N&Woh{XKrJdIJHE%cma4{2JD?=iS6$lDyN(q6351iH>;KS8i zo+gO-%kZ}%x%D!V+NDq0!!pQ10iaWRaq=;B=Ph|go8xNbI|7KRZ_TG}X3p+FNmX}l zy%zoXU8(hXr9bB%fYaOn;mA6@b#L?)*b5N9Tym;V!;xFI8lMDOX09kP0yt{KdziXC zS%vFyhsaV*@7>XAC=M(YASd z!ceYxHk`zd6QqH~0uoRFc%)AjkJpWm-{$>p>Hlhfeh0Eb424Il8PA*-8h9_ep&5b) z+CyCBIN+#j0^9cJ*BJ`Ya>TTHit}q=Dsd=z}!-`s(|$M{zBp~dbJE1#Kj!T zY_rFeA21j~z;Zz(3%eyj+%^u~KhvEBJOqDb`ctYZoJO%RNU(SASI2~*d%doU1(7&F zlG?Jn$KKablwYx`tBAX=(>86|OWcH-EFsG79~ycGSoA^8NWQq87{bY@L<|YzyI=su z7%V~b4GocLKue9lu!*7A9j$Az{)xq)E}{h-UC#q9Jw8k5A=a6nH8yeI!&@KzTD&^P zuZx;fk1rgH!5a0wer!%cUF1IKlWET#bV%T;Cgq#9baGHRR+}%7+S%wqIht5(&DRGHdot@zM>xGu8czkf;oe}JyhEV=87&M2nw(mNFQ+`E*D_xr6iN%0h^@EhjBP4pw)Z1| zBggWjw9P@l*3~DbH2Bt=d-9}I@}{_swbRjka=JQe(Kfi#q_;Er7wbu$UWxX7a&mxE zKTl#H+u!ET_fp;5PIAG)!R5MQ4lSu29UV4v`_F;r1cAioF%|BF;>S1+9+|Nz&i+0; zGy44Fg$sDQaWwg=)l&@)t4Z%JrBPQS*yB~7V61k1!vD}c?j=)=@)#QSp?5&l<5Oh! z_%QAD&&+L}K|iBy$@HvD*K3+QnhkHyLEFyP46V)0*VvgA z78U|&ai$Eh2)YwYxIr1O2P{Dh!uGe^xYSpfXZxz!+T<^kl&%)5U>X|te*E}x-v$-f zK@KrM%W%M0ozLL#cMMKoJ-sP=Q;C(KV|{np=^}X!c2KRg4oE%xt<$@*w#G`>7)eO` zQIC-h!|_U2)vr2!g=;3ncg)T+IwjiDv#e)igg8D=6_RkUUnb1y)ItB`;&rm{%I0S1 z^t5*LSzyuk@3|xTupcRFb>ho6_kO~LCt}ISOs<9m7y*6zO~*thS9k=+hwq2XN%L?a zOfk3+WB!zv8ZX~-45=QESyv05?bdQqMM}FCA{zUC{xo%RavETR!8I_qx zljpkF2J+ALS7&;UXW8!tEG81f^gp_T1TM#`xr`LzvWRIUdX!&NiVErwEjnrR)$S4v z4sW9k%t0B4dp z;O(DN??h#$TRrF>2e4nK)bB-?{fuu$0-Zmyw7NCGL6sxUUta6_+M8HT_S4<`7b-f< z^CAu2y$|P5reo;ZTz^yqm7u}?JwCsb6(i5UncjBa6SRx28{97mIwpNxG$wN=HzJ3V z#}f1y=ncw>P;MfIImy_`v^D@^NxjEXtJU(kW&XUKoToA=ExTte?hM!*5f=8j#TSgJ zWV`tqF63iTzboEP@;T++z^`-9r7I{cmAA2By}7v|p`&|t2ff*_Op*G)3sUOyn1m(U zjyow)-(#u8uLD|V1|6{w=Yn-SLMWvQ<+fWIaq!NIdq7};iYogS-b4`D>(wANcTo!i`sV&VLO^Lz`V>FA5suO z%9^WGjt|Vvx&8X;SltRVWCb`lh#_ySI2!CWfB(i!357sXhM26XYidk~lKH3>MZoL> zCKmA5aU$eP7XX)Y#aay?vz$DjOPsZp*Vj)iKZFgRK%t{F*Ph~yZwKWfGH``+?y@t@ zHcsR8>Z}GX-DVQhJm#Lr#3-oK$8%|X;4RU7vM0cRWg>o@g>ot#^>M7QMC;5H;CgFH z@x1jM$zJD+8Ekr_K479IGalZ)Gt1`kQ-_}3DK+^@Qi;f(I#sl)zrJDYiM8) z`S-8&x4b;ODFLd;WWVb(F7a75xPzUY9I%=XnH(>V-o?hnqeFfwy*NAwCksy^wgBpx ztdhddWdwy5s%Eb+EiV z3c~r;G^*$D(AWL&2UZjw)@5UUXp8rF>+7n3dTWuVlp#37EgG7dd>K27epAQ$fcus%hHbPK{B%3i9D5Gt9ztsqFlzm&_@0_Gt^Zri6XxJrRe`YP#tR|CP~75 zkCb$(6kUqssnmZq%l>zO@BjTq+R1!?yS=i-&EsrozY-aTd3a+Bt5Qw>c@_dUuul9B z*c|>B{{b-iv`E~qsPh}8gKxzt7Z$|G*6))__@VY7=4}NY>@@T2B*%7-PkaJvBl^63 zp>rAZVcVg%2NA>pbd+T=Q9E(5JegB(yGcrtWbk1Z`R0U6SB`mVwiZ^{E(02+}?nqzLBT~%~<;j>(( z`86q~6Jm@5e zgh-kx%HQHT6?%aChSJ5Tsbsh}a$B>UJO*zeC3rI*NiPY*J^b_y)TCUu_6E$a_vicr z%82!Xt%|0Qm{R%~C$j+n%oG(Krhf$3M(N#SG7w^NKN&;Jh=-zBn-vcqAJD4wfP~px zpPnsV6=1CnYch%ee0=;et5)Wf^M&!rM{z?2btHU?JWgso+O;=DWtA>H9YwYHG zfI4Tvw@rZYcHE(4BIa2+R$`wneuDvQmF*u^F0Q-twGIhC@$mE@u6KM}2qED0+>*Sj zG6O{CLJz3AXeTrD2QX;mjrzZ^rDHQr_k$aae0zl%fH+_>QdCjt1`Uap{?fZUAf%Wyg3^|iQ|jhupl`PVj>BBWp~=$*d4#+9=l zES(ps0gn2rl>iFVm=94!TNwR^v$}eEfNnI`cXU=(R=1EWN!ilchEzieL?yXN-Eb}v zBC*6e@fKTMT~&Ym+B4U1F_C0Pw6vh0Zw;$$>GJ;|1eaUw zWq^F@c?*o?lLHEJa(8N^jh)?TT}>nKAUe0l9UoBxUykRlOu#>KV8!@~T@TD_zwgiR za1bcx>7zejy0c#I6cLEDmsR%-zkd_+^(%l^W8jOYI_M52CJdreq#jezQDKsAl?k3I zy}0{;6a(tuVAc34pe0o?jlJNMX^=w~$oP0{V*s@cfw zCv9s0;($EM4Fqhxl8Q-5ncs&3`|;_#MTLpRm5g3gOQ%rLZu-iSzDkz`f+I+vXynXJ^E}H>gN&i#= zxLOWf48)6|{UU6n^?GNVE4z~TGF+f^D00k_*L1Vz#D9u`i|eJL7;fMNk_VXnQM)mz zH!ttTvl%?~ospvp_$?!G)7;u#)_Nat?6l!={Gz;eQZWX3^9wFPP_iT*`BB2l;E$i+ z)t+!qQ1kXF)X#&~oDC*dhy3)rtj-SOdW9V^&5ZFdj5-00dNfZZ<@I2l)402wUC99( zj$?8__c(6aFn;NNc96s}Z+kj7eeQ<1C++$J^>4#EVD&4ir7^1Bn)u|ZKLBU7=Up2X zrl5*q3!;luZFHSyj04xIPiY~O>M{p literal 0 HcmV?d00001 From df6edbf251ada0e6295c5c688e70109ab2846b39 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 7 Jun 2024 15:59:01 -0500 Subject: [PATCH 15/18] Automatic changelog generation for PR #2892 [ci skip] --- html/changelogs/AutoChangeLog-pr-2892.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2892.yml diff --git a/html/changelogs/AutoChangeLog-pr-2892.yml b/html/changelogs/AutoChangeLog-pr-2892.yml new file mode 100644 index 000000000000..d99977d71583 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2892.yml @@ -0,0 +1,4 @@ +author: thgvr +changes: + - {imageadd: Kepori have been given a full visual overhaul.} +delete-after: true From 472d093cf7fedf90be8f53044bb33f9f49ec9a67 Mon Sep 17 00:00:00 2001 From: Apogee-dev <60533805+Apogee-dev@users.noreply.github.com> Date: Fri, 7 Jun 2024 17:10:25 -0700 Subject: [PATCH 16/18] Fixes a broken icon state on corpo sofas (#3085) ## About The Pull Request As the title says. One state on blue corp sofas was flipped the wrong way around. ## Why It's Good For The Game fix good ## Changelog :cl: fix: fixed an incorrect sprite state on corpo sofas /:cl: --- icons/obj/structures/chairs/sofa.dmi | Bin 92079 -> 92101 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/structures/chairs/sofa.dmi b/icons/obj/structures/chairs/sofa.dmi index e8cfa4c5509b6d1a7fc7cdd3417e7829489c264a..17c976e4650ed3c92bf692bfd3de7d6146212bce 100644 GIT binary patch delta 31810 zcmZ^KWmuG7@b)fCcS@H?cMHN&f;317N`pazgftHzAtE6m4GYprDInb;-O?wzLhxh+}c)#qm*Y0zjb7s!mGxy9hQ#p#$Gm2By5e(eYHC3$ZR`Ea$K6b}FCUBycF(z_jk5;1h=V!i=K{v z_^)YNyKVt?;@=dGK8|Vx#p{>ERa~5s3XGrT9i`Q!esdM`3JZSpz3sDGGWlhh?K%1+ z+w(B!E*R7S9LyXpd+Hiz%X*jXPK_rErZBayd6~y_wu`n`*D3i)?tG99nG;cZv4+-J z28}&ZBxCh2(#Mb3+8)c~L@iTvw4_V=oS0JpYBx~JN94Mw}~3@VF?ivdIksH zAzWWFdhbvBpIk%9Qs2f8g(Psl``PCT0;S;r>b|r>Q|yoQ<-$Xv_(ueoykvPbXq1o5 zBb3x{M`*WKN)M^*NaAz(5J0U&hJWyiKk}7>E1&k_H7bSH9;nV zH@5>&sLJPwTb541@HumIUG|u20wWaSs!>R|!`s>3`bbc$^85@5k@SjIZL{DLaYQL9m`AP^f!zNE*;M~}Hrd43w5=)no}Nxxb@wTEv}6v>)XXRhX!3gG8o8r-nVnT~gH=nR54 z)rWz&v}n~|=(XXyWEqoKViM*LdkY*o(e0C zsba2{8N3CbKtk8+@~9ZVc(rP(se}$dX{lKeGJM68xS*HaacTGvMJ8{!_Vl0tIpwj- zXPB&JZsU0T7(&^ii~O5wbnd3RF=fbm28nAwdtj6ZI8uwv0*20u)6~I#gkI-{2U$EmcB@`8ap@p9>cdoUMK+f@mxF^ zmp|$y%M}V%_@|!D?30Z@P>YHlwE1Po$#Gweq2#-yU&6o4?fcu#mYrZ(1&7L1sSAeY z3wojAMDH&!COCyVFil}X!O-%{DeC7tzJ;J`7Ag6G-Eo8L0e zc1VqAQBffW4>gO~$j*DUX}f820^SX`-RvtIOpJ->1z)3HVHop8q!x7#0%jNbhU<+0m_sg*m@`1Z-E8j@(v zsU+=47J$E<$Se2ZEyPPWf+ zz3ufvt0baE_vy29er%oQVpGP34J=@U6JX%}nHj##k4JSn7oK%fS$0QWpbM#1;zu6F zO;$%1i8oHa6SJgREeAu_q7Io>8}y6`3)Y$Q2K`{O60^g?~!5HOICMo%w)S zyD-73#1Cz7#CjV*A2JsvVBwWRUrOV>dr6DqP4bAi6`~tmc3JG4tM`d&YdM^3ADD+8 zwUF)4L)p4rE`b2)OL!Y+X z1+ua!6|13HdtORfpA*dI%5Vj=qd^KmcZ#3!cWtw0B>ybdpvEfpk7_G}T&z6;_noZF zP9uZ^^KLht+gM%J6%-Y=3<+Aff0T(6zPN>JV;&l`5(Mcea@3%^1~fl}y$VY@Cf zl^XZgd4WxM!LQAZYRMvwRG!Ww6Dyhvep!q)`rp6n&%DwIB92)^{Pgl|D5%1lv zM}tc@Lh`-V*Db`w#lOy(NXk`j5iOA|-&Ie%8T9;FC8j_I0@)cF7Ph%$EpxVR6$=Bb zt;b$X)KKMou&tkK-Pxl;qGHudhpLR@?i^w4Y~_~yODG8l6!S#yp6Bas^t;t)d8_R; z^PE{(QV^&TjrbL|ED5Z&D3lzi-i)HUmX$}bl4sba8Zf){j8d8Pt)90bpNZV%&Yngb zxU^k5n9BKktSlL!Poeua!;iqAk6X&;ZCbZAF3tempIp9MNT^ss7+PkKu82btZTQvD2hUlASKMLs>wpIxtvnQJNXlkw zyZ2ClMV^4M*ylM(#F(5otAq?*{toO%yj;21E^R!JWAqftF=tO&Ce@J^5H5x_mXtb< zt55sp3xEYekc;^5zI82n0lY@rxUFKh2TIJxiw`PjI3{cCL(c4NUf6xvdTr*w6Q`r| z+%MX0q#sSa9eAJxH!?Xv-?E|yoi($$vcDurAiAhTOWr?|_)H69x`+LN3|*9wmCUX8 z_gWeF6-y+~wZ`EwP)kr>qP41+jN`}?$;aW354PUWxByR6RpYta+Yl zoisx({q$6OEfSHNB}Bt>@5A_HtZ>ieWJrn38<+h_c(n^ltw{g#C8YFu%$|;Ul#ZS5 zFxqI_{>8WY6}G3fX-=p1`ut36u}bgPJF)>i=6g`)R4<0;E^gSc zoT~=mpr2;Nor&*OW}j62m84Ga`r(582zpuQ_HKuF2y?UfQi^BPB4{SqFVRoOil43= zqaFjTe`fha>@OhJRg}2_PT+&W?_3$f3_Fs0Hi;QC$KSEaG#;?h#$`v8g(p ziX}Jl({yIxVNIXTLf2iYGk&ZKhm{JccJ+BNJWQcg*960YlnW+I>Mk4<#_+Kd{B&oE z_)uGAHjc6_{PX~|!E{8CFW5q=AbSp&eRPypW1n`9l2=ce|C%oP`6YlwtbdP~`0WIo zvwrNUnQ1+RWe=VX>U6Y9n7!!%FJ5_Ebc7n4Fjgj!6o(~Y&-bCxZ&{!%M2fSwROSQp zEG|jx*4cc;&?s%*4c$7K4c`_2-N@<>@KgpGI_fU*szU-i!#YA_*sak-Oh3Byjj#9b z&+8d`ICiV9rpR%QS}X9M5g5{kF`U0QJcZNNzcXOA&-dh(3f57f_=&FiRidn`Qp9fA z?j#jV_iS?u&%9rVog3M}w_%<6VEgW?9eA5x+yADIb}GgY!RJFCBS_pNrXU=NOP+B} zBqvQl(>FV1G`%tC4h^inP|yof2=sl-HlRaD=oKg062C#vqFc~e!(?Q01P6hqg+=J_XEB-|S(uLe-ey(&YvIuj6fR@c4A;mx3{h_@UW-UCJ7I;WkuNY z-cMet5)x5~gkXuGAkIwBUn`CSJ}5` z{akM1jt^;WSi91=Zss+sy9Z#y{7&nadR73cb)cxPFer)GgI*LdFn6VQIv23#X8NF% zu#SZ6kO(cui4F=~ZYz@zxw%zjx8Ly>E&J#*$Qveqyxen{AVwXQG;=d?5suI@M0Y7oizQ=IvJ-m!OWGarxSIESe)y3}Tcn^*- zQd&ouw_D{l@bxt}NI13cY!-6q-FCM`%gul(!=cMlSmIrI;@|Y% z?m_NrK3E@1eWjLsG~HS?J)`JJr6?dXdVHD2WYn7ZC7+?x=PIjDZVK1>4+N;l)3v&D z6DJ|vNXaV&+OAKy*@U!4=Q9$|<6aP; ziy6n#NIp1WXbYikfUD8?;VOLRjhtlY6N&;7G6wYu&um7AB9y^cwZXjoX)abDXW`V! zLwjJ`$G22u{#TsCae>G_u;!A38|=Y@ov1%|hp~6sxcglufu$ zNBYTj(L!By5!#at?J#A3yseR<398A8anLDW1|Fo??I8AeP=W`)1jLJTM7U*_| z9QvELGRj`NM1c|jS1yLxb{~W0Hm64UaItY3+v($Oo~k`YUIn zav*XDuwUF+dE%>B5)nneA$5MufFu;p>6R4({7?+-vI2Op2lc+{xd@(V*tySGN0N`L zy-XL<+Uk2J+(t8vE6=I7pxJN@TS1J1hL%nEw2X17P&y|J_qF{elgqjRA5kn$`PaMR zk|>?=M~*eR&dgD{t((%P6>GvhI&%6I*+ z)$)_s$<^#KYbMs|{$XqVW;Ncyo~>CRR6Pa@NQtkOk$zFQ;l!g%{EH4#rkn?zT)PnF ztzY`lP2!zBPh!$w#0K3pg@AF-AEx#v|L7)qYj?|KM^3U;M(I@@wCPcte(&TzJ~8-! zy{y?E%Dwc+K$qYSj*|vad}O`*9XBw2v+>&otXQ!SI=k2bx(N5XktZ-1TAl)8qk*kN zt?k5b@6lR8C;Qyztyj=J6$L8oq&bN<+u{;Nls`mPN8DZox9Y#9_NwlaYWT(Wc+(|t zT`n$#-Xwg;iWhGhFOb;S#wrQ=p}!+Pl647W?JCf2z3PK>#_;84R4UwK1o*UCI4Ew6 zN1*ILUAACh!(Xa&8!|Ru-&GKBIx2+~rxlvfXHKh)xkEl3dUlqNoy(4%Vk z*7=jceGbHSl_$w41lisS3_LoBKktO%rg8+6p~oZAg_uf0B-l9T4KBq@8X1U4@mR^2 z#r?l+E0AhVVlpn#^-JZOL5Eca%dZKYJaVk~uevVe(AhcIXW2~Kp?51wjI4~m-@bkN zW1c9il$7oyg^x7L7n9bwV^|(u()b7~FyoALXaC7wbJaU(Wu|iKUoXG`6rvnyLlAeV za=Qjg)BkpvJej9jM=1MY+p)!J>^s2U)sXYYV>S@_uvtpF?G+U zrAfYazbg@!L|c%!8>UU-uxGM5EKZr~7-P?Sf3GNg!pz9=z=>5si}~J~JHcww+ffF< z1VO1ul(2zom7XhokL)7U;cw}7pHgMmkMWcV&UcW3gSVQ}po!9DIKw>P-qB|7rOQsJfloY64gRvMqQsrYAMXs{#5S-~ zXerR9QAeNYx?)H2fsNQ2JeGO3D>51Aq*TIEuT~DbEcmB6gmS|8X0P;aDI1?7e)-pP z!JQaG*&T%WPfy2$@ddVEjzhq1=;pG)4RZyD`)b7rWzTP1I9p`1VIxu6`w^1iuK30F z&dY`6a=`$M5kR8!tK4ehYXCPWa!XrlEb)VtNQ1EpHKbBo7jk0$vGmDEaN(CptSV z+v~O6s_egg;xo)pCD@t~l?ocbQ+lx6C?Irqn5Ku-Hv}NF7{L>_g+2}KQAK%-j~NTD z_0KJtJik+XICPJG@YFtvy_yW!GPM$eXzRy+-1K#Te;9aI*z)q_g1zn*c=XW}G?3~C zxP8%z0C_qxfRtOj00MG_IPckUFx4TM7xF%kr|t4Jv`d?>5cPv#O><>OvnPuJ|EP)9 zr^I*S)dPdm>U}S~6Hij5AYA&K$CIgTWdCyDm?sMNnB!J7v+r}>m9@*8CSO+D&;=7t z(K2|xJ>KqLllN`!E~3-vWwYwmN9mkXsB8)YMUEXu;9;VzwT8E|&m6mdD^4ffrt3f+ zf#j34GK8#mdv>yeM!R}^?U zNebgKb~$tXAroU}2B8!PK6lw%Z=bP|hPJq2L^HqI{I`-|+qqj$aQ%o?k`MS*kwDU1 zhBAODx^Ri2$SW8@3pyeO*ss^mDuVG%!-j7PFYnT+VUZ_YJtbxFTt=52=DEWc0`NOe ztglDU&KLefCO=u7G)cu-&xmCuT}yKL{IzXz;(=WpyS1GD`y}G7yw*FfuU6hc&>d_h z$;2yg8YWuQl7A{KNEq~FSBvN0=X`PV$p`Rr{iAVV?(2G^`{A!fJ5t!F2=p4Yepzin zQjiRey>`1D!e&JK)pT!VL$`zA73e||YvY6GLPx=Dm9^4rQXC2QBhkip8`9PK-E=GS zd$~o&v_HTig-2gg!w&%BzI+YITI|G&% zbKn(#$tp-|baXOk@e0;%*+f2SSkQshDg}HtZ{Ua z1Vi4dkiG$HKH-)_+!YL5VrbNzqgG_=MiemhO-|g&K!wbsox`;R=?YST6yU~Hy zxB$Jr?V;m!A>X?<(lt>^4+7P{zHI5)!aNKCwV&|cuENo9^y`xCA1}xUfQ`GUk+-v# zhrq)%00)5HHUaZ3=Ra8^t|9U`AH6L1Z{E~`w&)dq{$VA#W1XyQTo{cgI#Hkz`ql(t z;!!kw)VFHFa#O49t9I0PRkwe{Pj<(kz5jPVGNF#+I}405Q^DP%8^9CD&Y%}TshI}R zMV?3Pp{M@@6Gw)kg^mcpTb=zJQ8w2pcXwoIJwS`=YT)tDm$8*x`Y+rC+J3NpvD&$7 zp5Kx9UUduvE?g*I=RXw>V=Q_X*M&KD8fNi!a;BZ!Rkh4NxsB(*(tfdG<`rv<8bb(1 zcnAq(A>4VX)308{PxZJ35pmahSjRkA`8UcN7L%wjY2_C$g*0E&K}tbt8}o=DnKYP0eak_glnGG zjI}bg0*@Wd5koahWA=*hzGS~6Ii-wD7s~kWM&w5AFsJzMtG6%=iez;Gbv}IslCVHa zJda!mDXLKL-a{u`JVgV}m^&Ace?&DCs@>iY?-%snK0PIoC&4=G|)U%J};kMSy)S5yTpsTf+OU)C}EMqfqO~BxT|A#EaFy4r4ah2mvV< zR8#)x9Qir`fvv3t=4;AsjesI4G;f9o)XKT>fOOW^fihFK zsg_{cIbSzOD?IfxA)vQcGRp2f}WdG#QMSvowczDlM9H?V7~rwc6qoH z*I~qH;0|NTCAFrIeQ7-7;XKKcoV%aPysWQY1YM-u>9VIey@T(`U3e1#TVSD<+#LNx zSO-7|ZCx(7mhLz-i)H^^WW6&*+|Hk11T{w}U~{0JsRW=**tyZ)L=xj`W_@Q4){f{$ zzj-47N0#&r*4rm~kY6OmPFsx;r}AX5XD4eKRjlbgIQwL+hK3qrK7D6`xL)R}Kr(i$ zzo3?#Hl7eHUXUD5eFER4#&)s(?Sg98SP%Tp;U~|D{zm>4 z{lvWsvvf-W-#DDQ0@;Rv*NKe40Gf03l`%c6sPi@Q>9z1cyM#maR~%h^}J*KpqS%spyy9ptoD}{#0P0=J`j4Gr=1Y zAOqf(W0!^1HhFZenYRRUM5=NUROnEQ2CJyJOQ)US(gZ+0=4jRxVu3Y&&S*0#D!cc& z$Uj81un_ndg*nVexy?FitWk#&>8I#oWiwZ-#2YDM?xResMwI6ZZb9r}nuI+pqk0Qr zL}j5OT(&h}#BixI#2)pA?fjgGSOa->0Pwgfg`3Hy)YNl?IQN%%NiR<`?a3iD$nLo z=e62yMG=;CsQM$hrJ>Ph7@u=L8_dJYX2P|pkI(hq3u7J5VUMyZu|BG1+v!B0!uP?I zg@nA|P{Y2_BnHR;EzC&ND^I?o5!-c}wg7jBwsgnY}pl0uAsgmGL z2@r@QUguKO$78zgxFMQt#@6mcJ>%Y?QO$t#v&&IQMV}B+LY`?X&SSue4}0j=Ra`Sw zclb;g2M82tP9~~P5?WCLsNnMgXy}JL3qtEVy%5Ja75BrKQgUA^$IR&-!0HbEI(!*> z15#ETwDIu-z+A^-ew= z&e;`+dETo=UO)%X=iwD~KGQ_ld+`v+uz4Sv=D=5sS2y?2ne(w^eH4 zGlo|yCGI!6)jQlrKf#Zxlyf-BWq7;*-FbukM-W|6B8E~PAOG>%BKalbhyD2{wHAuQ zc@aiU={h25!sECola6Nz%_2-@O(Q!%eEwH^6*vbHiops4B*%7H!8jw^>LY5Qz!=T18r8cZHE8S!ymG!F-+w)d&TG>|TsE)eg6 z-^rXi-`;+xJg6%7;pG5j^)<7~kSMz%5y`BKz@3W9*Va2>*T(rTZU_IU*KZu$u~oo` zK5g0&$?nXaPSL4<=`dMnC@unoFlGBFehfoU`<^&q_>24I)F(r+OP*h4@e{nRea+f? zd8LM%hAXBqqtf(Cw5>npreqVku;e}@oK)esd?k2Qq{|{|b^e7>W_xs@OH8tXxSbk6 zl8J%#_?G7$AKAumB(Iu9=WJ$9JK#%|l8eY+v{97N2#t~ui{dW0zYig@-H6_THjW%7 zJt37|d+BNB8b+5V54*f5dU2THOBGLG{|TXqcZ{bx{n`BM1_3JZ5zF`FZyD)3aaiR|Wu+mHIfj+c%)%o8?q- zmfGXp5i6&89gsTEbq(Rp-lCAK3)+sBam{l3$E7tk9z-Fdep8LAdLM5KwoT;fc{55^ zNGsWo0wxlwXbt;$ToG*EKkzV8(mgYp2dH&9)tjw{``~vLzIbop|PSNxr z|40i*fAv5uUhaNZy67{O+Y6_Ec>u=KX16TK=zG&-Nm*HpQ{QptIWV@97c>*IfpGqy)Hi^{nwmdo;T;36c;>@>16lyeXwP! zb2bBPC2eTgkxQ$$7=7Oct893wK~oMSlGo?&}fgz~pi0 zE|gXg1}WiI5Wz!pVwAC^_IGDCU-5>MeuAg{6SCO!mpilx6-!UlBF+rTB0AW@9RZ+! zNJDO4{TAXTcX40(Y-i2_{LwD4#MAeejsnz1()DL8*Q^J^*h}ZxR@R^!TICMsXU;zcfx3$jD4DLf5WTo zR!n*tyEdh2oKn%GF~8$^pD8$lHaM>&hRa3qpoiZ(tuDIRk_1>?!n6-L)IGP8S%hc#PIc9!_fy88n51E8Y~xm7Ik_7- zqc(zLux6$y)6b7~xL%U_T796(PlV>IaYjiKWQcX`e_Z6H_8tUW-IrJ}Z7zi0r6P&< zd{z1+zn^^weVI^rvba$M7+#kHp4JX8&5iO(k*w@w577#zg>ElBCCb&@{VUVc(@RVF z#d2=0k~qO>i#2suel|PznJfaZ>MR${Zr!DkG33X^QR1PvmlKw zN1V93-@Z+=|5@c#eb%CI4WRNg1qfPeBH-6&;IO+)em? zXXnJnaSY}qKDn|qQC{SXj8A&i`~B4%Us=Z-_@1?c=P~gF@yb^I4~(NqpssRJqC2+2 zOGM=X>pX5#YF=)SfQM*sFzFM$OLXt&k7($r)vl+rg0|CG=Y;CN6}W7$K%k2pOMzAe z;+sAR^kMV6{43H45X>1^lzaC|!%BiCRua@OriVEXmvp&Hxd@_jqo`KI+ZgB?|7sJ! zz3PZJ0-59jr5rrl4j@!R#z$$OVc-z2;ux?MsH8&#P;O#7Mwe^tU60ptuWauqk?9kn zOoq{&{HlLDm`-yUpz6gf#ZgbtvzrRRagh%TRTsugA@1Q6YE^cJJ3XDC28_6A<_^V_ zj#MI?5CJS7g-ipLA6G2F8{w9Tq=qT^}G5-XrGq(NwLw!neSgZ&GAVD z2vhhcp2uf>f?K|I3S@^v%lX>o1ENFx;hteTlY7WYe!iaAsw_{|(-q%L1J?p0%+y<@>!|G1k;zX=J;Q>O@B3{EJucidOD@hVppLpJ6=)z6CKn4WkqcH?O zFa|VUVMW?_v`S|%_8Z~;gtUP2B(u-oE^v2U@7-GiK>>^JK@%pc{|?bu^76BkFteG1 zQJaO&0(2!%)5Tg!6=nB1j8@e5-{XfZZ;3%S#T4Aq<&q3$-hv)o?EqlTim|tP%xi?|q25D#IJiOpA*pGfLF%rGr`KQ~D#ilK!k)+FNMHm& z`joahFThi6O=GN7eJc(ndU98#u7>fwo+u8NgO<17$4_GJ0{M?t=KcYLmMoFYri@Ld7gfZyf4~nt;rQJU z>D-3hR4}YTwjD1OyiF3$0Pv=KbQ+0x##&VI!jLXBqsGH!0Y}u2rxZKA)yHPX_M2`P zMnM98JQ;t>$FiKV^kiOsjV&3qFT+h;DDyMHFrEPbNGj$o#w#HRQdB=(DYWB{I4vj- z#NEEU+pOkaEwp?8Xpd_TWa4EhTW2fax&wI;E{11gzr;ahDTfkT^xF@Y9PN?B!x;qG zPwok7!4I0>VPXEMIG3+hOL;KMOP=_^%!hOygC<{!A7GAf{1JvOB`QNtXQG#G(~I^%X5hDRar>`HgaurLD3m-s*g9%Y z6U|#>lUI4SX~bDFOrC0A2%^sPUcFq!28s%)%yo70kKYW8k15ii9q6w5OLyjJwc;WQ zW86d1^Tsij%xzk*swc+2M&=NO?dQTgJ%=~jkZ|lq@VOiRi^~nS9U)orgH`6KaxoEIl zC^6TQPhC{>2tga4S!sKsMA`tTXA6bd9m#ut==DNBwziUP@p3MFoLMvtJ`?OVd&1mg zj{Mc->YL#@U9tdqdD>oBPY~W!5I|nRo$r@Z8y?`s#6Lgh|Mq7i#kLcYJ);CtvPA}h zWf2LiYThZ2Wu&x=<|Z&myco!L-1>6LMY;cW=@){}_xP%5Waf86Sp1T}n^lWC9! ziRtpjX5`gJocmr|sHwi(zxnJgT9EeYqUIQeq>7zGjC!S#f`2jr?@g3kgfP948IG%4 zO@3y%;Q0VbQ5y8O`I?S*RO(c6ifV@n8w~`HC*<*muj8da%(+I5oafn1Ui+h^kO%H6 zmF=8AgfXZfelrPXN@kRVkn8=nr@|tk8;T&3N2n`tcUk0&=C3&IXOvnywNN>1I3bsQ z^#s3g3jS_(_RAme8Q+@2`06Ylb-9h(KLeu}ki5mkeL{@JxRr{ zBbmimPt+PF8sc{DFfdkOf|?D+XWI%DClY}yt}DeJV?5H3ymY?@4YkEzZ4Z~VbpEj` zez^y!oj2QlJQh#9d1D_)!M}YRrIwSHIh&)tsU#EyPFbH~@HzlV{YGYf>D*F3C!-l9 z#&&GgI73I0@wFIH1M5$zJ&MLtn8pcVQyJ3;{slr#XQrMwGkb+dxd)ceK8zd5wYHqj zIsH_8s_(aRM5df)LGb96&9JE+3;fQWt?=X<13!b1al0xxP@!DyX|{l7hGhwd!J1@W zOgsQ0n8HtTFWv{36v~=BB)C+&N2pdQRAi*@PBxAS7^DT3|9qHlG%YC~#LGs5j~3g} zfd-rBk(>jZliU4pN7dAnF90i`A^Bos_s69qse!Nd8lDBQ^7i(?n`JJ^8)-S|X8f1JZ=C|VEpFc*fdi6W>0RTC(kRto;@YQpx$Px&YT5SCR9LCy#`fl2` z63xzT^8TJ=xz3X%K@{`TGw|H^dWOpzNjcRB?4w>}xPPwE>dTiRcZZr1YMd%%<14mcGa_J4(Yf+f8S25|06#*1>N0~dpJ z>TKmDTMW59KKCtT+)8b87Hj^b9q31t(@Lk_4DNlq??u+#fLMRa(kn-#??!6N^MH)} z1k3Y}q;i*ObjYSxTkVPGIK)KS9HE#9W=*?_%)Q+t+}!oyvHv|IdjWdBH%h% z8<|C*9xE@>+wr_CujoR(FBfo23u20#OMO9a@BiW@W`Zy|F(#WN#g#zPNT>=pQSc2C zPz%HhgMj@3+OlBcUzJ`XE+o_u@tV?@Wu+ zFFGpmBqD4-j$+N=rB-2&-n}qwG(CCOLkC>7CVPzITH7F6ieCYvdef$MoocgnXEN>9 z+oHXXRs-NNWZ)<$k$yZXW*m*|mK#t>$MxrS^Mf+QDq6?NfqvbT&BJ;>#53vBA6Y!n zIm3g=xfcWWZJzXK%$vI0o+DO=<&M+{YfK>NpBz_H8Kd>0NDGhV5iTrP+ym(dNXDv` zoo}25u?VfR0O??M6X?q>3d|cjo&bvnbA1uAFY!J`kvp$K35?iRJdGbcp7&{ei19HQ zxC!$h{1jncl2D;{)Xhgi2(#a$cMY^T&)*lLoPQLq)_SL-sVC@Ea$G*5PE~nv-V1ai z_37G2zxI9b;2+j<_1*kmV`=VpHe$GbHb8)L%tUV8p(bE8*Y}3Uz#p!1fA7vL9&J}Ao}4g&-ivg(7j%w;PbbZ~*fyegna8nrd7<{Op3Hu@`6Y2u6Q$PgSY1 zt3yLWaUN{v`%;_bW8u@}uLfzQhWil=kG7hywEw1fOxj{6T(D0+^n28xq*t5~g1a_s zcb8!6_;pr|YKIFyWH&(ZcJ(3XA#m@B56jwmJ?#yGsDRlPf7@Y(Nu3jYmJLFP5Z;Tp z2x74*>r#Cy{ONzj-ay$_XGiLBB*w%Br@5Fe6-?w|`oOT#Y1OC0W{z7eq4W2~2@>~9 zlf`1SjP)t}WcV5L+15T}LlVmciRUi-J=kkMItRQ>rB>yKTLs~*$OlSQK95fZw)}X& z-zy@`5DJxyD6n|Wysn*%MAM#nRw>HeGuF&GFx@k6e}Ll9u3fgrSLPT(Q09o_s=ZTy zsS-u5dFtuv^m(;V${^q-y?$}RlDf*il!S)(AHw(ptnSQaR&$HC6{ws~+xo{Wf$>{4 zx3qkho{*?=B8%FZ1|ZFj_fYarVo=ssb&g@#1ZcZDLvcE9O>p|?ASM^|D-7*wk*_C@ zWJ{SDK(xpmf4SEr8McKcLV;PdAGJIueU4y1*Rpmo5!u9!xq9 z0Ss}wo}V|$Oy@&sNqp4>@nQOrFR5VO$qcaUSQ`&g92Ey@56T}E)i*h7r$N$vNrsb0 z80GaGKAFi0=}-B8=iPXc%BnM)gBlRZTBt%yg`l&$y}zsMP1()LK$2188ykls=xjm{ zlrz`G#iL+N0r2@70QEFJY!ok-yEKJ$r1BAeoOv6(snV9^HH3uP>~JM;P2{e%3Yv6S zwOqr0x;8#UyO@NY_>JYcx>AjujM^Z_C*AN#UMcPk7Gg_c?OzfN6ekbxg1-jg^%GOMlTwJsN*N zd#A#_gtx~ZQ@Yt!Di}9~+!`B0C$by$v6C+s8^JiAS;`hU&AOu|e!a7 zdMNR_GH>zsQ(6JZgm;TnzZWV!ze}N<>h{eHb@!-W8Mi5qbq9Q`{j4Q)v}Jx${8p?< z<3o#wh-9wL?^1NxJekt21UX|(C%U!$UEoKqrq-FuAn6xpGxNS1axE1dK;WiW2r>zd zQ+jK3ndT?DW9|}xw1D_BOmKY{f{!aNA>Hop<^zTsZngPwNlmQ`z#`G;_f^Z+F2UEW z!qRsZ?R{03XZabI!Z?`evs7@Jpt}FKpKHOhsZw~ng!sP573o9HvgO<#K~Palk_?uH z{|H(M`1h&!Vc{>h!fvD+rh6l;gv$6d^}{IYX_g_{xb_g@pN5Sd58F2ldp|S%X@~pE zy^c%BS+imdSq;A1yzfE8n?FZMm6tRC98*B~|BbzAkWiR(q=zJV?v_a&tsVQsJk}qV zeY5}H+*|AQm;IyZ%3$x1G^@K^lbOKd7^}an=e?`J@E5&6NbpE8^@W?*ZV|9_f|-B1 z+hh3QG2Qljvn@Oe>0=Mag`x{@5+veD05_8H&Q62tcVx(+cc~2*dE~)7nz2?+gNI)u zX23UyXnPC!XcXwqZ&d|7%QTPmIH%?m6?ld5I24!e$IJrStG8VgFti(9^N}{O;XO}@Y9>c(G~dJ%Jnne!0^YA?!OIyXCa)| z;-TQY_WS8iqwrJxgnPhBoD~izB#DTqCyV~L&Emf`-wMU+>0*J}ecl8!omEgA-YIzt zPXLE`DiJw2Je5i%o^M98`GZ+?WXU=|G0 zm!mC1Tg(@`*xhzjp^WC_S@DxYsga}L%1p)G&Z~`=q6FZZ$Hha6p&OCoB1#NjUy^(J z$BtQka%q^qA#1Y>bFh<8KDAkAMg*kHW6eMI~^okip+#}-lA(A=EN6J!5?1xiV+ zz{HiD+<%_!pRBw-8_r^!eJS+(Il#;jogfe2DD0_Evbp}_v!VSj$Sve_eUU@??Y}U$ zsffY!#}lgZPVavF(l=R3bUBj77B`)*R5I>EPZwki=8s#Ca#QtBlUF^%EwQ>y!zUwl zU$pVA6f(ueSts2Wl^)h$XS5*@TZW(p*tNcseoYUTggx@vV}#!gVvZE+_esBE7@H6u z4ij%hIvOt33`BnYI{J`|UFL5kJFdz{ z>xLsn!@c9xhm`x%{CNY`G#b1ygf8}vo9PAnj`{UGV0GVf91g}}(I~e@3 zkBB-qV+>K2GE^>1IFGev@nqu*I@bb@fKM+5E**SG6PRFU{|Ut5t$!cqjX&2z^#7LH z#ibAMT~=O~8m;_*uD3}{*4$U^W(m=A%i=bXNg%d$b;Lr4%hx zO}b|?0|k8cjI4cms|5V=AKah8D|-kLyd092_rm*gS4GUqP5r(gCg62z(x{y7P>1Uc zXv;+F*-%&){fCv1X5}|3bJee)pLnnXLc3kO?F^zaLYjvOfA!D;ct*;HvrP{ejD%r^ z$MfrSQTg{1ITjG|J(eFuRl2p_UAgiaP+6Y+LE2V1V48B?P4qO~xY|so;Erc|esI6t zL}dUlU6@jF%X~kW225TE5i9ISx_ z4C!mzBgp-4(xwDZmA_#*z=gzXv@$<6VxH|-D70W%dobZ=QjqHF zHDSje6V(A@$?0;{UYSObF!7@VE{%;6p^9U1J^Lbf>krAYuQWwR3v#T@&@rhCoS6Qk z|Ka7{45d9fDvWD)R5{O|>a9O}mVFF%s>@-F(_LeTdBaLiazDuaDBdO9dAmU(fny|)Op@B!+ZsH4sRk4f@OzN(>?=iJ zY%N`Wksw=M;H|7Uj^&T01k_Kk6f9u&kUT-IF?=%>hg_@HNl!ViWtEHsSjwYdyR;5s z&kvDC@w|DK1@mH_h$q&SX&=yR{7j5c+Bh_cOh(^$-p>wIBqfi3ROTG6-9$m3#`e_} z+=rAY5LleVEmC))F=uwOj1FU3z+k>AG#^x;cJrrj3%!chH; z?V@Pt;4K3>k1`mvxsj)bcV4G1jhFX9VaH(lZCev_-*zS&8e)Dtf%U-QOI*&Y&vu4k z10ED_pnhSlcx@{I2VSj$6B-7QPS^XN6YOll!ZIz_t2ZC#w;F5$M3%`Lw)eW0k}K^4 z|03tMU8HsYoB(xIL(S$A4znEcpc5}Y%2=xeeR2EqY*&)$(6Fuh2(jD$#^+R*1LTHB zPc51@^7>A{y$B~K?x*egf_d_!BraHkBG@Y)HDj6O>lE+`NhPgy6^{{)JtSKU)x&r? z=}h5;r>SfHM*`w%66$Si48Qz&DyzGakseG$JR4!g%}S54;F9$!cDYxO@J0Nwl5|d? z%5rRM?Cm~opvYCW$91%dphi*1co=dPB0u$hSSp!(_3|xwksL(lG4DdX(KElQ$N@zf z8ok4LLHs;2(%s{B#4+@)DswA(ZqF3h&+EtMS&6Grh}*dCPa%jAiK*gq@r<)RPeVl-pP;h|Fdjdj8lu3uNTzQK9@&t%9h{ei1rTR%&$xafp2m3!;V{mDQ@c1b)JN_ z4JZM(502hKzMoS?vZvB?AlW17q?fk}2T8zBz$U=>Y^Q+(@(1koO`dPyi zAIXs#N}iU6SUjjFOuM5;H1Xip7|4_ z^Tm_R{@wg5B5)$&!lSmfA6s7iT-AK^U}f9q%+)&S&Xah9q4iuJrG9Q%?4Yj%%jP7I zU07iy{lV+x?b6Rd>6q~dGZ$Pa(P+$hn=lFY8;7md?oOA!yRLn|+R%AYmuIowroI`c zSsD2Gea!a<=ukw)FnMZ@nadJJ>6e}uTpJeA1p{Ae&D;s&ViyN!*%5L`uP|1w7P7Lan#2ekyOx_S! zUbk#R9iWoZS0CDczK3sk>~Yk5k06OStE=^@?bz1Jgf!vxO4+#SE@pWX`m>U8QKR?t z3GTum(_^04urGIkZ(Av$Pc0sgCxIj^jwp&yws%d5USw3U80UMT7Oy2!Myl(QUr#q) z-&BE@tXKywFI(z(BOku!?TEF;KhE-8bxI*YgqhJ#H#!*R_KS?=vD z=P74PLi7)J;0Bf3UV=1Wz%jQBYX)CmShW1;$|$T>(Q>I@s|?wb;df9uI(kYvqcLHx z`Q{=C!F#HdJp#r;w>36{@$rifYBteT(Y#`2Gkya-0Sn79bL?JGBR*T~xK)`IeZ!sp zJ)=X|9187TKP8<6R6WmT#3p?<$eN_iD>GZvj=KRWtCIuNbd!lu_oWLY=={`MdraQdk8>@3 zlE&MOm6x!#sML4xbu=%Tfoz4?kLBFI>nH<#zu6!V+`^u|KX2^6SU$;o%OdB-4OU9$|~dUorhf%+>DaMjhg*>}I#;Ekc4dU>Ej{{l%|?`nbx9 zS`C(3wO4+>X4G@PgZ(V-sUz0B>{OGl;fYJYKx0u7)I!|cAt?8qFDWd-P9Wh^W|P|| zY=qY@H_M9SiIwY|#y7;15@~-kbFmF0IzYUUpT}CyAh&Q@{PNqyfXDvTTn%ari{-2P zlOzhka6N-Q?3P7LQ)L_oL7AH8JFpMyTzaC&bM6#N>3bz@DLT!7zU)0ZKcuA}o~62U zn#9rpMh-lSc%|dqI-_L-5)&c6%|9@SNMmmiM%H^en`hz4N6lB{DD#N)1@zGZD<5h5 zTQ|Q1#$5i$C^Y2vW&I_SbChU9p?-@U`YZ)DdCBLu*N-Oan8!*W&i>)!3$r`2B@q${ zI!POMg2d?eWRbK(BP!PsxDTz8L^Mz?>}0l1qbbi1e1tD(7fO$!WBk{;S-jD5Jp9@h z_7LqkC#HOH{ZVkklpdJFNh|=&MSr9nkS(%E4TDft#z`;uvB+I{fJDkWG z?Vw4ah$ok^*#vStbm3{}{2{rEeR_=r_QyBh84o7%w;HP)gwS8YH}I3B2rML8%{>I^tSyA^7BHatl^MNXT0V%9G%H27{+itlk?7$YL&P_nyo2SfmXNvEeG$|N_y{JypI~rQN=ksi# zURF?AXl>4x!ns$5DP`LT869A)N&3WZkXRoA=Qsa$i=#OxtluunERq<&3#1Q#9KKE| zy3mr09M!mg;v<0L`3;#Pk^2zk3xZyIB5kgaoqi`|)X@Vho%GNX-){>!adO@fOE6Mn-=fzVg<4^NG6Z%cEGggl9^*)_WJ&vsWE4=B4sXg zEExy5HVYK3MP4w$GcxmbyIXA0 z4l?!C#s1fyntSgUWCY>PPk5|QH1v`jxp9(4x>kiX+LNWa@m8uiw+z8fBFaA+y|RaZ z5v%~2juL6Pbp+GPb!lKo{y#WC-VO0~GrYZl*rR%*&zkb3m_I_sPyCQ5pT-RZXS-rN zK*&?7fY|2e@sD1C9Rp9;izG}z%;~koe^|ifw_VUX*z*OrTK}d2|A7I!|9HrkJ0tJI zqfn2%E^noHaQ5Kb$=h+9?hyR)9NMIDwBLXcBYZ#K$=z3c*!A^qEUPaxv^f7Dfy)Ij zkgsw9qY8ED5rYlEE&nAE7o%Gxe3~%Vp#HtGk1OP2DT@2Yl@oyyFakHg*#)d zH(20eGe#Zd>J1qPf`L}22H2*)7mItA)3qSThw3t=%#g12rG!9g+24o zl}Ypn6@szs5RCk9D9|bu18-Q@cU}rxg0Ee(rS+9 zn7En!UWwT^^T)Bo8-uw};O6_6wYN4p&|t+lsm^}wc#Q9cr>4Ar6MJD*(TMem-RZ?2 zl@1Ek8HA$e{AFd_NUeY$TYE4pO8WV?8-XGb;r~tl8Fni6;;K5Vr0iEpHN7N8@X;hU zpvFtkmQ$^6-t^$CP&j830$-@CA4vgL+sN&|hB5gg)a`m{AJV+C)*#7M3TKjl5Jf1Y z=(}a~kFQB9P;{?avyK(VTC_-)8~4?)ie0XELy{8E}Y+xYQxC`A{>eZR24B8T4rZ1 zUoCZzdTgh!NKFd4LubS#B^|A@i5m?V!1)nsmu_xm_!*xy(wB(+&Wn0C@2U6x8v(s; zR-D*CG5-#dMb`a`nTc`ih1Mzy_3Qs&{gw(JnQA9+OAW=!V4P4teb1KYOZQ)>-x}a# z&6(UCrQ%Hk-&nC8BWv(s>Qj;$Uo;ukN<@%A4$8o*H+ZC$|H< z=ql5$DJ>gD5(;ro9e%~b9n(~7m~&l%_Xt_3-7sq5u?9Bn-5pF=>*WcH{+upXeP*68 ze}J3&>ooBaxB!+sq3u-p_GshbHEjptrNz27d2GcM0~a8dO6~r3;c!iw zSa!^;vTEL?~63h$lz2t7WOMBzPnd9FC4Hax8eD*B!1iBJmznw?X4?7(O|g zTk70}*^8gf`6#_Q*+S|Ja&W~9vgV##XAs!c<0}JO)BJj7Rs1aDIr;d zu>kM@``}sxKci!bcrgCLQnn|VK+MHgQ07=#cciBiK&I%0Cw##vdRT;B8v`awrt#hd z;qnLp82v|-fj5KhUaZNxB&w|_N9a^0OzKK<&Dkc5_OrLJemLbwLAEa490HZjU>b!2 zw1u#g;r6u#*M_8w5^(Ozi$k?_V5RCmv&htOHo;~?JdLm^KZ=75@NHkJe$I9mrZdu` zNKr_(@A5+_jpX*ocnHXeLxydCMl}H#QKC_jSZ)U*SiI?!4bK;|N@7xIL%SeOvP|79 zFk>m-(m-3Dtp@yXMP;Ll{zz$800COzCS}X^ddrXSTmn*EF>4)eer_F{;dz;(QMaaS zeAEnvGR1oSN2}@5+p$ED9Uq2xS*og@U^(T;(3tIUE71p>o@^%G*>tP$L@lu^YF~@x z-%}lX{~&vBtcGupJXAy2l^CBu0AOMPrsBH@rh8Qsf-fKDL_cP6?^cf3wqHTphbysrSk?AuJ&fcvjnJ0tWk1CnAR>14k^-BGF>c=!H4b z3^`y%py^nFUCvhMaNYo2OP3{raS7Y9=Bu|D`a_VVR%qVH$-AE>N>cZ(-2khhmu?b4^1J6+uFu-Lbm;_BY$kNsYf4 zy&w3eHhO+NI2l2#$xW46d*%8J7t%oBW8YPkAoMsZ;;1yGIRf6WI#2bi+muV(@b|Zm zpKYKO##dhzY8&JU``jM|N>l})pOvq+FSe%z6&T@9uCatV8OLRJ=IC7lkkcQnq*f#Y z@Od--b0I9?s@-Ga24OcY_oVk^v5?SrTc@dckH!<9*vdE6Z9mUSuOLI&0;AF^m*UMZ z#tLLB5!^K3V84+(m-|U&n;T>5L51Kqiex|Q(K;OruU4O>qfzPPgip(ZwsSS(S_9Y? z)&2NKpN|qzP~}Rpl#8A#vXA1PBOIt{7_!Z1G43*XUdp%bYlO^nDWTq(--P=ElnWvZ zUd!itJ@lYw3dyI55k`^=sQh-+RGxzg-xJzxQOnb*+UM5{n9KcMfH=ByD12<(4);_B zYfv)S5_zVZ#LJcXwAGk*8hA|pZj8GH;k5)Iz15ElfY@q}B6@iEs|T9q%7ba0-sjh^ z1~z0g546%SQabp-9YHzTEh)R3*#P~uQ5=(PCWf7kY}Zlc?E_|VW{RY&Mk}d(Uw71! zUHux2E9D&~p?$nsV*AaWkgs118<<4gzR zzF>I;`TeY^^8G>=wGvlHEx8}}{5M7Ua+MIzJWI6j!3>qGPVfOQk^ z!`8OB?psrY-VT66(dnQE)P!@Gc1*Qr7-tstHkPi{BXBR zahR3Ttxxx-1`%5~OY?an@g}u~VyrMMOBryZG9oE6NZHVegmbiopqW_q|4uC%77&Fk4KhsQ*pofneSaePe*}QX2KY$-IyTdke_M zgY?qllK-Ugu6RTTQo(0KE~BPus1))q1&)irdIhjMokmS_vQSSCxbeWBU(iEl@Sc!n z6F1KetlliIss<)315{&R)OPRD(?sJ#Q{U}5F2P+6h(zLd2YX&C=F3r&rRfBZ*;I8+ zog9+CJGi~U^8}1r9R)IsBk%2A?tcJNl({)@X z*OQbYh2*K@SlDDa-KW;nAbsz^y?W=DXR@}(!xbLUU_RrU@EeTAJ!j=h1`PfK2`md7 zJGeh}5#24aH6IttUyMb@LFY$_>~HF+ao~%vQ{5+tMJy=hlDx+A|*~)kF z8*F5{*J2M=KBIej8@Kg-gA6vCuNR~Dz7rGMAR{tinDRP%wzQt%;NJcNV9@~N9( znc-o*^8s_FpGVA^5$oNSyYaDKhE6%!3^cb)s+^>C<$c5Wj_LfJ9xEgh+M$;S`XTPO=!ePDZNWJG)4GXqa;N|&*^>lS%68^ zyDn%4-zuN6lij5{QT3`9MpF8SIa6SLQ-9P#XbClcVRgQ>%>jYntfU=NK@^cJm~~sy zB(c7!lGT%j*9N%BPtXnP(lyc*huy#^{gVlnT>R`^L{A7BPfA~t9qAvtZn`W1qvY~@ zT$T|C-T&FKbi_KsU1wfpZ6nF}Zp~ctE!ZeNdS6B(vQKXyA|LuKg3n}h;5FFho#;ha zE_!2Lw4b5t*1TogCaI&PIb;RQi$f+L7^g|c=&R~{i8zGko}a8P%-D9F17Wi0#I<>i zv09pWS$as^ZnTE(w%T!Zq188x-Vp!wQ{9kfl7Vz!zXYdEXi>GETTRZX)J+8(!>jOR z^3)`;*-^DD9M@quct>fxioO`xI6v_GV>ZxRzI+Y`JB11((_aEn&yF*E^2*DaSf>7l z=z?52a)5Woq|!?AKB!#Z2hoDE2~Qak)g) znME~}En_334J1$->GrxEa0%o~Y{8!ziVL0HYYy;#F?4~_B!kWRp4WdPbW^y4+r?!m z%HI#7&ARgoPqD9^4u^>CgI80pti}(7^JbI*{FYFClDf0^(YLIJUFC;@2X(c4@8Un2 z`hx5;SHt<$nc=$}ZIh?QgMyyC&a`WCAoNU>V-UsF@fO|sf)IVajLi8`G z&EkV`3e(N(&k9pJ^B!NHUc1lQUBQmIs{{T}UQTo`NAGR!wYcFzPPCw!@0tXXDk$y| z{>{)Cu?(gg{(J+mcU@Uq!6QDuRM!-svo=3iPV>2$AzqXT&x0Ul1I>Zap0No1@d65`5ubk&*ay zkI>K=^OL-AD6tiiZPwdzd<^LFnIFkAwqc&;k3gD6%3NNK{3wG!-~k?!-d=ub&6OQo zR|yDT$QmI#8R^VU6DoafK5oqnNUI}~abO+4P%G3ka^bB)lpiAsQT8&Q^h@m;Svg4W z#TxTTla_I^V?IR*4dT7Je#PG&8;&f0#Zrpj39u&YVQ+%S&KWReR9ie z^7<0}m$rwHt8=D6mS&{t$t!v9KL~elp&xA7x<_m7ECmKWz^~(wJBr&Hlzj=>iL#c^ z(>p2gR(v6;7V!`GoRh&md4Nl$7Cd}HqrvF;mYnqN?r|( zF!f}{^%Y6m5^y9SdZ0Ov5i5sd>`EHXnewg~G4=EwT9-x;J$UZFa2;{RI38L86IJSQ zuMFkmx+TboOK$X-ukTl}JY9OAiNJD}7u9uN%dZqvVK5CR|AVvz3-zpj2s$qs^v9#-9%X_qhKMKRV)!aCEtNBq;OL+$ve_A zPM4(qhMPO-^V-tRA>-|*KU(;8nG<3^)4H$yUZlbevVCB*veZiaOe{SArO?(H{<}|0Z+r_Iq0^?jb|W8kbWyiY>*=vcs_9^dR~LuNgs_7ws5{6MR@DFYpMyOZ#yJ8u*eSxBruy6DBo^N)f#? z8#J5>Dmo1xs^q=YnXgx4qH`OP-GnoDEgcC=`q`FYhHXMf`XiGu!Z}}6;RoOlc?-#D ziRpBz<4haJuw{yg8ty-#zoZ9P>ivpO_i^VowSdl|S!|h%x1fI$-;eR^^#C2)#bAqb zy5jvbi)M?il|cUsOcC5Xip>3=P}sX21dLaTQbc23icE825~lI4>DG;X9Ttl>f^75y z@oWuOznKP2j08~#<_~i?lvjOaL8F70mBtDRG%v@R9`;2LKl9CBsPD@f${z-v4KLU{ zO=HgFAvG$Ma-6;C^ued%aTxE>qs`qA?cUZn>MFr`!dp<87`6?L)|ZQq=dS{e8OL#= zNKeUoqD@ThJJ6dmoA~W+$cU51Cy=07DW~Ggb*XjN~)EQL=C^aB__!wfXMLnv1868gU(=W z8gq~uX^LmFeK`08Rl(V4e8>EJOp)+vxpMIgh`*lW_>T7B_0E|feVwq5Ip&|p2q7OB z2RG<1**a;vt)r{)*%%YZMNam4=kw|rYF_Eh{DH)2P3FyEb;{9G6f6&J7X+?^gtDCP zKgOEBoFo09>whv2Ht<85DE(t)d2gD$q5RilQ8aWwuf@qv6i3QOx;gcK&t6WQh zs8Gv1gZG&Umff)b5U4z7p4;hxFncG*+r;jNGS6&Lao4Oh`L3xL% z+d0;2tVZvLExxl2TZ_cFSnYo1XCMyvePDZ}i<&a^-28BD*Q*_sdH-8mjfZZ0MVSOjQKqWTpR^!685AUQ?bn z)invsM|2$f^QX&gkNMZ?@(Wp&(K9W-HmLB^(607jQYmU^>kd7O9A$%KU;?bC`8?`F zkPmuW7|U-3Ui~nDbff7+j9Z#+pxvs^>KA)uGTdoJbQf4T^HBwQT38RTq-367mzg)8e;#^9W85WgqqBK? z?^F^A;CoOcFop zOy+Bv9Q5UTFT>Gd(&pG&36>~D)^bH=nWjPfU52PJC6cd17o|BI2&gu5-I#RMe0>DK zeA+f-aS<)Jzwkq@yw3OAza-m=g1IT=hU3y0{)37uU1FwF>D9gM4uxo+!Igo1IaKJ5 z%pn=%*%>eA-9kC|deKV6S=yLXywR{AY#c`>+}96`sq1i#!{0S&YzoDXvTj(YwGpCq z>OqODA7IofBd^0YB&>kG3@iY(2x3qkOFhb3iMq<6ZwEDmb}3dHf6Qb*grA1>(XNE- zRy=6INtj5o`Ik;xKX4UocX>3gr>~T4$LV@&C6x4SzWyW|$i#WP{WlZm7CCm>Pdne@ z#Ezw9IAZ$|=c>rGOf^uAVN`>NW0HCcWa2)BJ$_e;re!Y@^@UzHSnx_jfBHCnq$L~g zyMymY6Fk$oG(}p7#KFCe>QmFmIHhAj+iz5gU1|YYLTGCqt##1wI=Vxq}V)_nMGM#3N<^dinOr1Z@Q0I zBFzR$9}Y&0lx$t&iWQL@U=ty~&S7UA0nN@B0+%sIh!Qg}gP)&ZYCdJH1 zG-NO2*HF6Q4joL&oG9fj`3#yctGzO&oEMf-MZ19bu44g#g?L!vxqH0BXGJ12~goEHq!S7cX4@_#7z-_|CY2*HfP4BzT{lM3V z6ghrMqdztq(&?7!kvU{Z-l74TS*a}1h|)u@???F!4Q~6a0*T2wCb+~cH^J;@elC-qOYm;*Fg@Zc>mWWb zSdSL|jG|f6 zh4ZgIze^fJh_-Zutf_UUTW2k@@!DDaH~dED?6@a%b0>f*4^82UX<&_SUQ@IXCt7z1 zpm08x4ndtaJM&>X9}urc+1e-Fv#>5u0CojJm<0)C-_1Wx)RL2A5Q`Rb`D?4^cH~3U zf1Z{Pp${0b@S}12yV3#t@o|U@*|JEq(?&E{vcQioX;UA&FjZBx0c7|` z1zwjL4HBF+QJeBbuXxODo8<-Z;b)ua_c}T$fD(* zK(A|w6Yr*L^HYah1g;5WDfYR4EArOEGhF&Iy8GUJn7oJHQnZmui2+Hn z*uk^gz(W{f|502_gO*!#QjO{PbC+REE%vG4U#pJ|zowuyo*17vd_b1yj|KNI3WZtbuXz(=|&AC8?p=lI}S=k#6j@?t?t&|SAUG)_B^f5 zQMmo}hv*i)t-ayApxfiuMUq|H#20CQEsh%{wU5?~mWR5Xb>bh9BF8 zF*`7K6|`lNi~fP$9QbT5JHhIImsaZh=8uV}n^rk!n z(&dtcn9uXGw<7+5(0vWCYUAh}NaHryV-^zDzMBO#+aQxj>?KR1Qs zd;&Q4)zJr!ImX=vCh!i+52KD+RHXn#Jm}U7K^WHtc<#m4|7cUpbl79qW6b@oly1%g zw=2euy0gUYxMXzU2mw@E4*lfwpMOBM)~6O%j+h=}g6CnVi221KZKC5)tI0O6x69Rc z*efPrCGOf_cKH+CmNlzVNo3k+>Y88szRf#`@sx<6Cj6JW|~AD^I4#s zIgD`Qm3!K-;bZu%t+3pm##&WT60qG6!hLn-aPv_>1Lw5LIob9AellppJl8PoAg%*e z3KIvbui?Z#jHQ+;x*z5=vb_9g6>{7DPXiO!X%{*Vl#YGmkAM0OuP}z^2lY!GRrP-b zmN(3)Rv&$iT+6hf03zy@xY!|*US3|Pfg7GJlZFa%LJGS%W&Amyw>@+-FzxuTORFZh zmuil>4GY|Vy9+!XDiNeS)Q*0iAi9}py zd66g-^{IH>HkO^hF}p2wyTB*~_OXGI06n23 z2@ztt#LZ+m(jl71vJ`7^_zGAAD}OU>&y#^@Q}68GG*cwaSwS7IbH4tPx@MYQdrBCa z`fC8tZLOQ@bej}h8%Jt|MCDh1AS5Aw_OV_#T5*Vgk5j=G+7t9RL;Sw4I4_O-1SbIM zwdGx&6No?aVof2~q+GZ$%m1U-=5W)Iu(~_1HeXHSxl5dO8Z?|xu7RglPZ?Of2@(O4 z;nrJh<4}R6VkYwIOGC?Ic;+8cSeq(sK7+j@%9bu5|Lm6U?CLgYo?7h5`;Sq}mW!4H zZJ>}`W-W}MerP`r$l!Y*S|`(WKT* zUBSNe+UXX=wn6~G;|?un*@wopM4j1C$lQneeux|tt2v;;gd%xJkx(ibPNVWNvEz3w zy0y8Mv}XJ39yTb7;No_DSFPsu9W~|e3a_|XJ`*cYt#Zdc<;RetBgCueHB*N_vgAB9 zfq6Sfpq~iE2LdKGCTpKmu)orMUSwAYhjs=N)L3@-y&h6=d8!cbDe3u_)O&Yc$jKRP z_tX4oU|HX}T%K_o6yJ6|-hkUmiYlASu#&f*Cp zhzCR?>nbs?)v<{%qnc#@c>xhZ5#d5po;hU|0e&3`X5GkP0ox!Wbj&*b~ z)B)f3OVP8b^}T&_q2YT3Nay}t!8z!5W4V}~(By^Zf$_#g6!7c32FYhp8!mTqVH!}H z4}oB_-6$R}GtD?^1a`fNeP;d*=XyTVgv$qcPFx#jfq{!nSr}@)hsBZS2LZoS6f~cd I%9#cJKS^ll;{X5v delta 31798 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

$^|h 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 From 6ff03bca4fe36f77928f89eb4b764660c6e8f5ff Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 7 Jun 2024 19:21:23 -0500 Subject: [PATCH 17/18] Automatic changelog generation for PR #3085 [ci skip] --- html/changelogs/AutoChangeLog-pr-3085.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3085.yml diff --git a/html/changelogs/AutoChangeLog-pr-3085.yml b/html/changelogs/AutoChangeLog-pr-3085.yml new file mode 100644 index 000000000000..5fcf5c6cfb5c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3085.yml @@ -0,0 +1,4 @@ +author: Apogee-dev +changes: + - {bugfix: fixed an incorrect sprite state on corpo sofas} +delete-after: true From acbdd4519ffefd8034952cdcddb628148353717d Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sat, 8 Jun 2024 00:52:30 +0000 Subject: [PATCH 18/18] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-2877.yml | 5 ----- html/changelogs/AutoChangeLog-pr-2892.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3081.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3082.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3085.yml | 4 ---- html/changelogs/archive/2024-06.yml | 12 ++++++++++++ 6 files changed, 12 insertions(+), 21 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-2877.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2892.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3081.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3082.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3085.yml diff --git a/html/changelogs/AutoChangeLog-pr-2877.yml b/html/changelogs/AutoChangeLog-pr-2877.yml deleted file mode 100644 index 42882de45c2d..000000000000 --- a/html/changelogs/AutoChangeLog-pr-2877.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: FalloutFalcon -changes: - - {rscdel: Removed alot of magic cruft} - - {code_imp: Sorts gun defines into there own file} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-2892.yml b/html/changelogs/AutoChangeLog-pr-2892.yml deleted file mode 100644 index d99977d71583..000000000000 --- a/html/changelogs/AutoChangeLog-pr-2892.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: thgvr -changes: - - {imageadd: Kepori have been given a full visual overhaul.} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3081.yml b/html/changelogs/AutoChangeLog-pr-3081.yml deleted file mode 100644 index 0bdc52c7cfc5..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3081.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: SomeguyManperson -changes: - - {bugfix: gunslinger applies its spread reduction effect to revolvers} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3082.yml b/html/changelogs/AutoChangeLog-pr-3082.yml deleted file mode 100644 index fd21b0f418a1..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3082.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Sun-Soaked -changes: - - {bugfix: removes a comment from apc.dm that was causing strange errors.} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3085.yml b/html/changelogs/AutoChangeLog-pr-3085.yml deleted file mode 100644 index 5fcf5c6cfb5c..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3085.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Apogee-dev -changes: - - {bugfix: fixed an incorrect sprite state on corpo sofas} -delete-after: true diff --git a/html/changelogs/archive/2024-06.yml b/html/changelogs/archive/2024-06.yml index 1a993f9a46ac..ee60e5a1fb00 100644 --- a/html/changelogs/archive/2024-06.yml +++ b/html/changelogs/archive/2024-06.yml @@ -131,3 +131,15 @@ - balance: The P16 shoots slightly faster. - balance: Two E-40s max are obtainable from the black market should it spawn. Blank market price cap of the E-40 has also increased +2024-06-08: + Apogee-dev: + - bugfix: fixed an incorrect sprite state on corpo sofas + FalloutFalcon: + - rscdel: Removed alot of magic cruft + - code_imp: Sorts gun defines into there own file + SomeguyManperson: + - bugfix: gunslinger applies its spread reduction effect to revolvers + Sun-Soaked: + - bugfix: removes a comment from apc.dm that was causing strange errors. + thgvr: + - imageadd: Kepori have been given a full visual overhaul.