diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_providence_crash.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_providence_crash.dmm new file mode 100644 index 00000000000..4635618b370 --- /dev/null +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_providence_crash.dmm @@ -0,0 +1,5012 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ak" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/trash/spentcasing/bullet/medium, +/obj/item/trash/spentcasing/bullet/medium, +/obj/structure/table/flipped{ + dir = 8 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"aw" = ( +/obj/item/ammo_box/huntsman32, +/obj/item/ammo_box/huntsman32, +/obj/item/ammo_box/huntsman32, +/obj/item/ammo_box/huntsman32, +/obj/structure/closet/crate, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/pod/light, +/area/ruin/powered/providence) +"aP" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/mapping_helpers/turfs/damage, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"aR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/mob_spawner/watcher, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"aX" = ( +/obj/effect/decal/cleanable/glass, +/obj/item/shard, +/obj/effect/mapping_helpers/turfs/damage, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"be" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mob_spawn/human/corpse/vulpkanin/merc, +/obj/item/salvage/loot/dogtags, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"bu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/salvage/ruin/broken_rifle, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"bx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/mob_spawner/ash_whelp, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"by" = ( +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/ruin/powered/providence) +"bB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mob_spawn/human/corpse/vulpkanin/officer, +/obj/item/salvage/loot/dogtags/officer, +/obj/item/salvage/ruin/broken_rifle, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"bD" = ( +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/unexplored) +"cI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/salvage/ruin/broken_rifle, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"cQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/environmental_storytelling_holopad/providence/crew_quarters, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"cU" = ( +/obj/effect/landmark/mob_spawner/ash_whelp, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/powered/providence) +"cW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mob_spawn/human/corpse/vulpkanin/officer, +/obj/item/salvage/loot/dogtags/officer, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"du" = ( +/obj/structure/flora/ash/rock/style_random, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/unexplored) +"dy" = ( +/obj/machinery/door/airlock/hatch/manual_rotation{ + dir = 4 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/pod/light, +/area/ruin/powered/providence) +"dF" = ( +/obj/machinery/door/airlock/hatch/manual_rotation{ + dir = 4 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"ee" = ( +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/unexplored) +"fs" = ( +/obj/item/shard, +/obj/item/trash/spentcasing/bullet/medium, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/unexplored) +"fP" = ( +/obj/effect/landmark/mob_spawner/goliath, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"fT" = ( +/obj/effect/mob_spawn/human/corpse/vulpkanin/captain/providence, +/obj/item/gun/projectile/revolver/charons_special, +/obj/item/salvage/loot/dogtags/captain, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/pod/light, +/area/ruin/powered/providence) +"ga" = ( +/obj/item/shard, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"gb" = ( +/obj/effect/mapping_helpers/turfs/damage, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mob_spawn/human/corpse/vulpkanin/officer, +/obj/item/salvage/loot/dogtags, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"gi" = ( +/obj/effect/mapping_helpers/turfs/damage, +/obj/effect/decal/cleanable/dirt, +/obj/item/chair, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"gl" = ( +/obj/item/shard, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"gE" = ( +/obj/structure/flora/ash/rock/style_random, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/powered/providence) +"gN" = ( +/obj/effect/mapping_helpers/turfs/damage, +/obj/effect/decal/cleanable/dirt, +/obj/item/salvage/ruin/broken_rifle, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"gS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/mob_spawner/ash_whelp, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"gU" = ( +/obj/structure/sign/cargo, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/wall/indestructible/riveted, +/area/ruin/powered/providence) +"gZ" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/mapping_helpers/turfs/damage, +/obj/item/shard, +/obj/item/shard, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"hc" = ( +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/pod/light, +/area/ruin/powered/providence) +"hd" = ( +/obj/effect/mapping_helpers/turfs/damage, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mob_spawn/human/corpse/vulpkanin/merc, +/obj/item/salvage/loot/dogtags, +/obj/item/salvage/ruin/broken_rifle, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"hq" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/mapping_helpers/turfs/damage, +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/flipped, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"hA" = ( +/obj/effect/mapping_helpers/turfs/damage, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"hN" = ( +/obj/machinery/door/airlock/hatch/manual_rotation{ + dir = 4 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/powered/providence) +"ic" = ( +/obj/effect/mapping_helpers/turfs/damage, +/obj/effect/mapping_helpers/turfs/damage, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"ir" = ( +/obj/structure/sign/engineering/atmos, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/wall/r_wall, +/area/ruin/powered/providence) +"iI" = ( +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/powered/providence) +"iR" = ( +/obj/effect/mapping_helpers/turfs/damage, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"iV" = ( +/obj/effect/mapping_helpers/turfs/damage, +/obj/effect/landmark/mob_spawner/goliath, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"jf" = ( +/obj/structure/sign/engineering/comms, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/wall/r_wall, +/area/ruin/powered/providence) +"kx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/flag/species/vulp, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"kI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/hologram/holopad, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"kR" = ( +/obj/item/shard, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"kX" = ( +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"li" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/mapping_helpers/turfs/damage, +/obj/item/shard, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"lo" = ( +/obj/effect/mapping_helpers/turfs/damage, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"lu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/baseturf_helper/lava_land, +/obj/item/trash/spentcasing/bullet/medium, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"mz" = ( +/obj/structure/table/glass/reinforced/titanium, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/pod/light, +/area/ruin/powered/providence) +"mV" = ( +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/template_noop, +/area/lavaland/surface/outdoors/unexplored) +"mW" = ( +/obj/effect/mapping_helpers/turfs/damage, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mob_spawn/human/corpse/vulpkanin/officer, +/obj/item/salvage/loot/dogtags/officer, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"nO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/mob_spawner/watcher, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"nQ" = ( +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/unexplored) +"oo" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/mapping_helpers/turfs/damage, +/obj/effect/decal/cleanable/dirt, +/obj/item/trash/spentcasing/bullet/medium, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"oz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"pv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"pE" = ( +/obj/structure/table/glass/reinforced/titanium, +/obj/effect/spawner/random/uncommon_ore, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/pod/light, +/area/ruin/powered/providence) +"pN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/trash/spentcasing/bullet/medium, +/obj/item/trash/spentcasing/bullet/medium, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"pW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"qp" = ( +/obj/effect/landmark/mob_spawner/legion, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/powered/providence) +"qI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mob_spawn/human/corpse/vulpkanin/officer, +/obj/item/salvage/loot/dogtags/officer, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"qJ" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/mapping_helpers/turfs/damage, +/obj/item/shard, +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/flipped, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"rp" = ( +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"rF" = ( +/obj/item/shard, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/unexplored) +"rP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"si" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/mapping_helpers/turfs/damage, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"sj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/environmental_storytelling_holopad/providence/communications, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"sq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/extinguisher_cabinet{ + name = "north bump"; + pixel_y = 30 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"sS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mob_spawn/human/corpse/vulpkanin/merc, +/obj/item/salvage/loot/dogtags, +/obj/item/salvage/ruin/broken_rifle, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"tg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/extinguisher_cabinet{ + name = "south bump"; + pixel_y = -30 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"tt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"tu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/trash/spentcasing/bullet/medium, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"uc" = ( +/obj/effect/decal/cleanable/glass, +/obj/item/shard, +/obj/effect/mapping_helpers/turfs/damage, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"uj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/chair{ + dir = 1 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"vc" = ( +/obj/effect/landmark/mob_spawner/watcher, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"vT" = ( +/obj/effect/mapping_helpers/turfs/damage, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"vU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mob_spawn/human/corpse/vulpkanin/merc, +/obj/item/salvage/loot/dogtags, +/obj/item/trash/spentcasing/bullet/medium, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"vX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mob_spawn/human/corpse/vulpkanin/merc, +/obj/item/salvage/loot/dogtags, +/mob/living/basic/mining/big_legion, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"wT" = ( +/obj/effect/mapping_helpers/turfs/damage, +/obj/structure/providence_lockdown_controller, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"xl" = ( +/obj/effect/mapping_helpers/turfs/damage, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mob_spawn/human/corpse/vulpkanin/merc, +/obj/item/salvage/loot/dogtags, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"xI" = ( +/obj/effect/mapping_helpers/turfs/damage, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/mob_spawner/goliath, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"yz" = ( +/obj/effect/mapping_helpers/turfs/damage, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mob_spawn/human/corpse/vulpkanin/merc, +/obj/item/salvage/loot/dogtags, +/obj/item/trash/spentcasing/bullet/medium, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"yH" = ( +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"yS" = ( +/obj/structure/table/glass/reinforced/titanium, +/obj/effect/spawner/random/traders/steadfast_minor, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/pod/light, +/area/ruin/powered/providence) +"zI" = ( +/obj/effect/spawner/window/reinforced/grilled, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"zX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/extinguisher_cabinet{ + name = "east bump"; + pixel_x = 27 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"AH" = ( +/obj/effect/mapping_helpers/turfs/damage, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"Bc" = ( +/turf/template_noop, +/area/lavaland/surface/outdoors/unexplored) +"Bl" = ( +/obj/effect/decal/cleanable/glass, +/obj/item/shard, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"Bs" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mob_spawn/human/corpse/vulpkanin/merc, +/obj/item/salvage/loot/dogtags, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"Bt" = ( +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/wall/r_wall, +/area/ruin/powered/providence) +"Bx" = ( +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/wall/indestructible/riveted, +/area/ruin/powered/providence) +"Cc" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/mapping_helpers/turfs/damage, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"Cs" = ( +/obj/effect/mapping_helpers/turfs/damage, +/obj/effect/decal/cleanable/dirt, +/obj/item/chair{ + dir = 1 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"CE" = ( +/obj/effect/spawner/window/reinforced/grilled, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"Ds" = ( +/obj/effect/decal/cleanable/glass, +/obj/item/shard, +/obj/item/shard, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"DA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/environmental_storytelling_holopad/providence/last_stand, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"DO" = ( +/obj/effect/mapping_helpers/no_lava, +/turf/template_noop, +/area/lavaland/surface/outdoors/unexplored) +"Ed" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/tcomms/relay, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"Eg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"Eu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/trash/spentcasing/bullet/medium, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"EJ" = ( +/obj/item/shard, +/obj/effect/mapping_helpers/turfs/damage, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"Ft" = ( +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/powered/providence) +"FB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"Gg" = ( +/obj/effect/mapping_helpers/turfs/damage, +/obj/effect/decal/cleanable/dirt, +/obj/item/trash/spentcasing/bullet/medium, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"Gl" = ( +/obj/structure/flora/ash/rock/style_random, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/unexplored) +"Gu" = ( +/obj/structure/whelp_statue, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/unexplored) +"GB" = ( +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/template_noop, +/area/lavaland/surface/outdoors/unexplored) +"GI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/extinguisher_cabinet{ + name = "north bump"; + pixel_y = 30 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"GK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/hologram/holopad, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"Hy" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/mapping_helpers/turfs/damage, +/obj/item/trash/spentcasing/bullet/medium, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"HW" = ( +/obj/structure/environmental_storytelling_holopad/providence/bridge, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"Im" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/mob_spawner/goliath, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"Io" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/glass/reinforced/titanium, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"Jl" = ( +/obj/effect/mob_spawn/human/corpse/vulpkanin/officer, +/obj/item/salvage/loot/dogtags/officer, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"Kj" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/mapping_helpers/turfs/damage, +/obj/item/shard, +/obj/structure/table/flipped{ + dir = 1 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"Kx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/chair, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"Kz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate/trashcart, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"Lf" = ( +/obj/effect/mapping_helpers/turfs/damage, +/obj/effect/landmark/mob_spawner/legion, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"Ln" = ( +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"LJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"LM" = ( +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/wall/r_wall, +/area/ruin/powered/providence) +"Mg" = ( +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/ruin/powered/providence) +"Mv" = ( +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/wall/r_wall, +/area/ruin/powered/providence) +"MH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/glass/reinforced/titanium, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"MT" = ( +/obj/machinery/door/poddoor/multi_tile/impassable/triple/manual_rotation{ + dir = 4; + id_tag = "PW_CHALLENGE_LOOTROOM"; + name = "ship's vault" + }, +/obj/machinery/door/airlock/hatch/manual_rotation{ + dir = 4 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/pod/light, +/area/ruin/powered/providence) +"MV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/mob_spawner/goliath, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"Np" = ( +/obj/item/shard, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"NA" = ( +/obj/effect/decal/cleanable/glass, +/obj/item/shard, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"NF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mob_spawn/human/corpse/vulpkanin/merc, +/obj/item/salvage/loot/dogtags, +/obj/item/salvage/ruin/broken_rifle, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"NP" = ( +/obj/effect/mapping_helpers/turfs/damage, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"Oa" = ( +/obj/effect/spawner/window/reinforced/grilled, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"Oh" = ( +/obj/structure/extinguisher_cabinet{ + name = "west bump"; + pixel_x = -27 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"Pt" = ( +/obj/structure/whelp_statue, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/unexplored) +"PH" = ( +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/unexplored) +"PR" = ( +/obj/effect/mapping_helpers/turfs/damage, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"QD" = ( +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/chasm/straight_down/lava_land_surface, +/area/lavaland/surface/outdoors/unexplored) +"QS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/flag/species/vulp, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"Rl" = ( +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"Rt" = ( +/obj/structure/table/glass/reinforced/titanium, +/obj/effect/spawner/random/rare_ore, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/pod/light, +/area/ruin/powered/providence) +"Sd" = ( +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/pod/light, +/area/ruin/powered/providence) +"Su" = ( +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/unexplored) +"SB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"SD" = ( +/obj/structure/sign/service/bar, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/wall/r_wall, +/area/ruin/powered/providence) +"SN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"TQ" = ( +/obj/item/shard, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"TS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/flipped{ + dir = 8 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"Un" = ( +/obj/effect/landmark/mob_spawner/watcher, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"US" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/salvage/ruin/broken_rifle, +/obj/structure/table/flipped{ + dir = 8 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"Wg" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/mapping_helpers/turfs/damage, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"WX" = ( +/obj/effect/decal/cleanable/glass, +/obj/item/shard, +/obj/effect/mapping_helpers/turfs/damage, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"WY" = ( +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/wall/indestructible/riveted, +/area/ruin/powered/providence) +"Xa" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/mapping_helpers/turfs/damage, +/obj/structure/table/flipped{ + dir = 1 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"Xh" = ( +/obj/structure/table/glass/reinforced/titanium, +/obj/effect/spawner/random/rare_ore, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/pod/light, +/area/ruin/powered/providence) +"Xj" = ( +/obj/structure/flora/ash/rock/style_random, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/unexplored) +"Xy" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/mapping_helpers/turfs/damage, +/obj/item/shard, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/lavaland_air, +/area/ruin/powered/providence) +"YO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mob_spawn/human/corpse/vulpkanin/merc, +/obj/item/salvage/loot/dogtags, +/obj/item/trash/spentcasing/bullet/medium, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"Zd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/mob_spawner/legion, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plasteel/lavaland_air, +/area/ruin/powered/providence) +"ZM" = ( +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/chasm/straight_down/lava_land_surface, +/area/ruin/powered/providence) + +(1,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +DO +DO +DO +DO +DO +DO +DO +DO +DO +DO +DO +DO +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +"} +(2,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +DO +DO +DO +DO +DO +DO +DO +DO +DO +DO +DO +DO +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +"} +(3,1,1) = {" +Bc +Bc +Bc +DO +DO +DO +DO +DO +DO +DO +Bc +Bc +Bc +Bc +Bc +Bc +nQ +ee +ee +ee +ee +ee +ee +DO +DO +DO +DO +DO +DO +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +"} +(4,1,1) = {" +Bc +Bc +Bc +DO +DO +QD +QD +QD +QD +DO +Bc +Bc +ee +ee +ee +nQ +nQ +Xj +PH +PH +PH +PH +PH +GB +GB +GB +GB +GB +DO +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +"} +(5,1,1) = {" +Bc +Bc +Bc +DO +DO +QD +QD +QD +QD +QD +Bc +ee +ee +QD +ee +ee +ee +ee +ee +ee +ee +ee +ee +ee +ee +ee +ee +ee +ee +ee +ee +ee +ee +ee +ee +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +"} +(6,1,1) = {" +Bc +Bc +Bc +DO +QD +QD +QD +QD +ee +ee +ee +ee +ee +QD +QD +QD +ee +ee +ee +ee +ee +ee +ee +ee +ee +Xj +ee +ee +ee +ee +ee +ee +ee +ee +ee +ee +nQ +nQ +Bc +Bc +Bc +Bc +Bc +Bc +"} +(7,1,1) = {" +Bc +Bc +Bc +DO +QD +QD +QD +ee +ee +ee +ee +QD +QD +QD +QD +QD +ee +ee +ee +ee +Xj +ee +ee +ee +ee +ee +QD +QD +QD +QD +QD +QD +QD +QD +QD +ee +nQ +nQ +Bc +Bc +Bc +Bc +Bc +Bc +"} +(8,1,1) = {" +Bc +Bc +Bc +DO +QD +QD +QD +ee +QD +ee +ee +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +Xj +QD +QD +QD +ee +nQ +nQ +Bc +Bc +Bc +Bc +Bc +Bc +"} +(9,1,1) = {" +Bc +Bc +Bc +DO +DO +DO +DO +ee +ee +ee +ee +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +ee +ee +ee +nQ +nQ +nQ +Bc +Bc +Bc +Bc +Bc +"} +(10,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +nQ +Pt +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +ee +ee +nQ +nQ +nQ +Bc +Bc +Bc +Bc +Bc +"} +(11,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +nQ +ee +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +ee +PH +ee +ee +ee +ee +DO +DO +DO +DO +"} +(12,1,1) = {" +Bc +Bc +Bc +Bc +Bc +DO +DO +DO +DO +Xj +PH +ee +ee +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +ee +ee +ee +ee +PH +ee +PH +PH +PH +DO +DO +DO +DO +"} +(13,1,1) = {" +Bc +Bc +DO +DO +DO +GB +DO +DO +DO +ee +PH +ee +ee +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +ee +ee +ee +nQ +ee +ee +PH +PH +PH +ee +DO +DO +DO +"} +(14,1,1) = {" +Bc +Bc +DO +DO +DO +GB +DO +DO +DO +ee +PH +ee +ee +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +ee +ee +nQ +ee +ee +PH +Gu +PH +ee +DO +DO +DO +"} +(15,1,1) = {" +DO +DO +GB +GB +GB +mV +DO +DO +DO +ee +PH +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +ee +ee +nQ +nQ +nQ +Gl +ee +ee +nQ +nQ +Bc +Bc +"} +(16,1,1) = {" +DO +DO +DO +DO +DO +DO +Bc +Bc +Bc +nQ +ee +ee +ee +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +QD +Mv +Mv +ee +nQ +nQ +nQ +nQ +nQ +nQ +nQ +nQ +Bc +Bc +"} +(17,1,1) = {" +DO +DO +DO +DO +DO +DO +Bc +Bc +nQ +nQ +ee +ee +ee +ee +Mv +PR +QD +QD +QD +QD +bu +be +QD +PR +QD +QD +QD +PR +QD +PR +PR +PR +Mv +ee +nQ +nQ +nQ +nQ +nQ +nQ +nQ +nQ +Bc +Bc +"} +(18,1,1) = {" +DO +DO +DO +DO +DO +DO +Bc +Bc +nQ +nQ +ee +ee +ee +ee +Mv +PR +ZM +FB +FB +QD +QD +QD +QD +PR +QD +QD +QD +PR +PR +PR +Bs +rP +Mv +ee +nQ +nQ +nQ +nQ +nQ +nQ +nQ +nQ +Bc +Bc +"} +(19,1,1) = {" +DO +DO +DO +DO +DO +DO +Bc +Bc +nQ +nQ +ee +ee +ee +ee +Mv +PR +QD +QD +QD +QD +PR +PR +PR +ic +PR +Mv +QD +FB +PR +rP +rP +rP +Mv +ee +nQ +nQ +nQ +nQ +nQ +nQ +nQ +nQ +Bc +Bc +"} +(20,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +nQ +nQ +ee +ee +ee +ee +Mv +PR +PR +PR +PR +PR +PR +QD +QD +PR +QD +Mv +sq +PR +sj +rP +rP +rP +Mv +ee +nQ +nQ +nQ +nQ +nQ +nQ +nQ +nQ +Bc +Bc +"} +(21,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +nQ +nQ +ee +ee +ee +ee +Mv +FB +PR +PR +kI +PR +FB +dF +rP +PR +rP +dF +rP +rP +rP +Bs +rP +Ed +Mv +ee +ee +ee +ee +nQ +nQ +nQ +Xj +nQ +Bc +Bc +"} +(22,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +nQ +nQ +ee +ee +ee +ee +Mv +rP +rP +rP +rP +rP +rP +ir +rP +FB +rP +jf +rP +rP +rP +rP +rP +rP +Mv +ee +ee +ee +ee +nQ +nQ +nQ +nQ +nQ +Bc +Bc +"} +(23,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +nQ +nQ +ee +ee +Mv +Mv +Mv +Mv +Mv +Mv +Mv +Mv +Mv +Mv +rP +be +rP +Mv +Mv +Mv +Mv +Mv +Mv +Mv +Mv +Mv +Mv +ee +ee +nQ +nQ +nQ +nQ +nQ +Bc +Bc +"} +(24,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +nQ +nQ +ee +Mv +Mv +rP +rP +rP +rP +rP +rP +rP +rP +Mv +rP +be +rP +Mv +rP +rP +rP +Bs +rP +rP +rP +LJ +LM +LM +bD +PH +PH +Mv +nQ +nQ +Bc +Bc +"} +(25,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +nQ +nQ +ee +Mv +rP +rP +rP +rP +rP +PR +PR +rP +gl +Bl +rP +rP +rP +Oa +Bs +pv +rP +Zd +rP +rP +rP +tt +lo +LM +bD +PH +PH +Mv +nQ +nQ +Bc +Bc +"} +(26,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +nQ +nQ +ee +si +PR +FB +FB +rP +rP +xl +PR +rP +gl +Bl +Im +rP +rP +Oa +rP +rP +SN +FB +PR +Cs +rP +iR +lo +uc +bD +PH +PH +Mv +nQ +nQ +Bc +Bc +"} +(27,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +nQ +nQ +ee +Oa +PR +rP +FB +rP +gS +xl +PR +rP +rP +Oa +FB +FB +gl +Bl +rP +MH +Io +PR +PR +PR +rP +tt +Np +uc +bD +PH +bD +Bt +Mv +nQ +Bc +Bc +"} +(28,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +nQ +nQ +ee +Oa +FB +FB +PR +rP +rP +rP +rP +rP +rP +Oa +rP +rP +rP +Oa +rP +Kx +rP +rP +rP +MH +rP +tt +SB +uc +bD +PH +bD +Bt +Mv +nQ +Bc +Bc +"} +(29,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +nQ +nQ +ee +si +rP +FB +FB +Bs +rP +rP +FB +rP +rP +FB +rP +rP +rP +Mv +GI +rP +GK +MH +MH +FB +PR +iR +SB +zI +bD +PH +bD +Bt +Mv +nQ +Bc +Bc +"} +(30,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +nQ +nQ +ee +si +FB +PR +rP +rP +rP +rP +PR +rP +rP +Mv +rP +rP +FB +Mv +rP +xI +Bs +gi +Eg +rP +rP +LJ +oz +uc +bD +PH +bD +Bt +Mv +nQ +Bc +Bc +"} +(31,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +nQ +nQ +ee +si +FB +PR +rP +rP +rP +rP +PR +Bs +rP +dF +rP +rP +FB +dF +rP +PR +rP +FB +FB +rP +rP +SB +TQ +WX +Su +bD +bD +Bt +Mv +Mv +Bc +Bc +"} +(32,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +nQ +nQ +ee +Oa +PR +PR +rP +rP +Zd +cQ +rP +rP +rP +dF +rP +Bs +rP +dF +rP +uj +pv +pv +rP +FB +PR +lo +EJ +Cc +Su +bD +bD +PH +Mv +Mv +Bc +Bc +"} +(33,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +nQ +nQ +ee +si +PR +rP +Bs +rP +rP +rP +rP +rP +rP +Mv +rP +kX +rP +SD +rP +MH +MH +MH +FB +FB +PR +lo +AH +Cc +Su +bD +bD +PH +Mv +Mv +Bc +Bc +"} +(34,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +nQ +Xj +PH +si +rP +rP +MV +FB +PR +rP +rP +rP +tg +Mv +FB +FB +rP +Mv +rP +MH +MH +MH +rP +rP +rP +LJ +LJ +CE +PH +ee +ee +ee +Mv +Mv +Bc +Bc +"} +(35,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +nQ +nQ +ee +PH +Oa +FB +FB +rP +PR +PR +rP +rP +rP +rP +Oa +FB +PR +rP +Oa +rP +pW +rP +pW +rP +FB +PR +tt +tt +CE +PH +ee +ee +ee +Mv +Mv +Bc +Bc +"} +(36,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +nQ +ee +PH +PH +Oa +PR +FB +rP +FB +FB +rP +rP +rP +rP +Oa +rP +PR +Im +Oa +rP +rP +rP +rP +rP +rP +FB +iR +tt +aX +PH +ee +ee +ee +Mv +Mv +Bc +Bc +"} +(37,1,1) = {" +Bc +Bc +Bc +Bc +Bc +nQ +nQ +nQ +ee +PH +PH +si +PR +FB +FB +bx +rP +rP +Bs +rP +rP +Oa +rP +PR +cW +NA +Bs +rP +Bs +rP +Zd +rP +FB +iR +kR +aX +PH +ee +ee +ee +Mv +Mv +Bc +Bc +"} +(38,1,1) = {" +Bc +Bc +Bc +DO +ee +ee +ee +ee +ee +PH +bD +Wg +PR +FB +rP +rP +rP +rP +rP +rP +rP +Oa +FB +PR +rP +Ds +rP +rP +rP +rP +rP +rP +rP +LJ +ga +Wg +PH +ee +ee +ee +Mv +Mv +Bc +Bc +"} +(39,1,1) = {" +Bc +Bc +Bc +DO +ee +ee +Mv +Mv +Mv +Mv +Bt +Bt +rP +rP +rP +rP +rP +rP +rP +rP +gl +Bl +FB +PR +gl +NA +pv +pv +uj +FB +FB +rP +rP +LJ +ga +Bt +Bt +Mv +Mv +Mv +Mv +Mv +Bc +Bc +"} +(40,1,1) = {" +Bc +Bc +Bc +DO +Mv +Mv +Mv +Mv +Mv +Mv +Bt +Bt +Mv +rP +rP +rP +rP +rP +rP +rP +rP +Mv +FB +PR +rP +Mv +MH +MH +MH +Kz +rP +rP +rP +LJ +Bt +Bt +Bt +Mv +Mv +Mv +Mv +Mv +Bc +Bc +"} +(41,1,1) = {" +Bc +Bc +Bc +DO +DO +DO +DO +DO +ee +PH +PH +PH +Mv +Mv +Mv +Mv +Mv +Mv +Mv +Mv +Mv +Mv +rP +rP +rP +Mv +Mv +Mv +Mv +Mv +Mv +Mv +Mv +Bt +Bt +PH +bD +bD +PH +ee +Mv +Mv +Bc +Bc +"} +(42,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +nQ +ee +ee +ee +ee +ee +Mv +PR +PR +FB +rP +rP +rP +rP +rP +rP +rP +rP +rP +rP +rP +PR +PR +PR +Mv +PH +PH +PH +bD +bD +PH +ee +Mv +Mv +Bc +Bc +"} +(43,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +nQ +ee +ee +ee +ee +ee +aP +si +Gg +tu +tu +Eu +rP +cI +rP +rP +rP +rP +bx +FB +rP +FB +PR +si +si +PH +PH +PH +bD +bD +PH +ee +Mv +Mv +Bc +Bc +"} +(44,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +nQ +ee +Pt +ee +Xj +ee +gZ +si +Gg +Gg +FB +FB +FB +vU +tu +FB +tu +FB +FB +FB +rP +PR +PR +li +li +PH +PH +PH +bD +bD +PH +ee +Mv +Mv +Bc +Bc +"} +(45,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +nQ +ee +ee +ee +ee +ee +Xy +si +PR +PR +FB +tu +FB +tu +tu +FB +rP +rP +NF +FB +FB +FB +FB +Bl +si +PH +PH +PH +bD +bD +PH +ee +Mv +Mv +Bc +Bc +"} +(46,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +nQ +ee +ee +ee +ee +fs +aP +si +PR +PR +bx +FB +FB +pN +pN +FB +rP +Eu +rP +rP +FB +PR +gN +si +si +PH +PH +PH +bD +bD +PH +ee +Mv +Mv +Bc +Bc +"} +(47,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +nQ +ee +ee +ee +ee +rF +Hy +si +yz +Gg +bu +tu +FB +tu +lu +DA +FB +FB +FB +tu +rP +PR +hd +si +li +PH +PH +PH +bD +du +PH +PH +Bt +Mv +Bc +Bc +"} +(48,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +nQ +ee +ee +ee +ee +rF +aP +PR +PR +PR +FB +be +US +TS +TS +TS +ak +TS +TS +tu +sS +PR +xl +si +li +ee +ee +ee +PH +PH +ee +Mv +Mv +Bc +Bc +Bc +"} +(49,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +nQ +ee +ee +ee +ee +ee +Xa +yz +PR +bu +tu +FB +rP +rP +vX +tu +tu +rP +FB +FB +aR +PR +PR +PR +hq +ee +ee +ee +PH +PH +ee +Mv +Mv +Bc +Bc +Bc +"} +(50,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +nQ +ee +ee +ee +rF +ee +Kj +li +PR +FB +tu +rP +nO +cI +FB +tu +be +rP +cI +rP +FB +PR +FB +FB +qJ +ee +ee +ee +PH +PH +PH +Bt +Bt +DO +DO +Bc +"} +(51,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +nQ +Xj +ee +ee +ee +ee +Xa +Bl +FB +PR +FB +Bs +rP +tu +YO +rP +rP +Eu +Eu +rP +Eu +FB +PR +gb +qJ +rF +ee +ee +PH +bD +bD +Bt +DO +DO +DO +Bc +"} +(52,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +nQ +ee +ee +ee +ee +ee +Mv +oo +mW +tu +bB +Eu +Eu +tu +tu +qI +rP +FB +Eu +rP +rP +qI +PR +FB +Mv +ee +ee +ee +PH +bD +bD +Bt +DO +DO +DO +Bc +"} +(53,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +nQ +ee +ee +ee +ee +Mv +Mv +Gg +PR +FB +rP +zX +rP +QS +rP +rP +cW +kx +rP +rP +rP +PR +FB +PR +Mv +Mv +ee +ee +PH +PH +Bt +Bt +DO +DO +DO +Bc +"} +(54,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +nQ +ee +ee +ee +Mv +Mv +Mv +Mv +hN +Mv +Mv +WY +WY +WY +dy +dy +MT +gU +WY +WY +Mv +Mv +hN +Mv +Mv +Mv +Mv +ee +PH +ee +PH +DO +DO +DO +DO +Bc +"} +(55,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +ee +ee +PH +Bt +Bt +rp +rp +rp +rp +rp +rp +Bx +Rt +Sd +Sd +Sd +Sd +Sd +Rt +Bx +rp +rp +rp +rp +rp +rp +Bt +Bt +PH +ee +Pt +Bc +Bc +Bc +Bc +Bc +"} +(56,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +ee +ee +Mv +Mv +kX +hA +hA +kX +kX +hA +hA +WY +Xh +hc +hc +hc +hc +hc +Xh +WY +kX +hA +Ln +Jl +kX +kX +kX +Mv +Mv +ee +ee +DO +DO +DO +DO +DO +"} +(57,1,1) = {" +Bc +Bc +Bc +Bc +Bc +DO +DO +DO +ee +Mv +Mv +kX +kX +hA +hA +kX +kX +hA +hA +WY +yS +hc +hc +hc +hc +hc +mz +WY +kX +Ln +hA +hA +hA +Ln +Ln +kX +Mv +Mv +ee +DO +DO +DO +DO +DO +"} +(58,1,1) = {" +Bc +Bc +Bc +Bc +Bc +DO +DO +DO +ee +Mv +NP +rp +Rl +kX +Ln +hA +hA +kX +kX +WY +mz +hc +hc +hc +hc +hc +mz +WY +kX +Ln +Ln +hA +hA +Ln +Ln +kX +kX +Mv +ee +DO +DO +DO +DO +DO +"} +(59,1,1) = {" +Bc +Bc +Bc +Bc +DO +GB +DO +DO +ee +hA +NP +rp +Rl +fP +Ln +hA +hA +kX +kX +WY +pE +hc +hc +hc +hc +hc +pE +WY +kX +kX +Ln +hA +hA +hA +hA +hA +hA +hA +ee +DO +DO +DO +DO +DO +"} +(60,1,1) = {" +Bc +Bc +Bc +Bc +DO +GB +DO +DO +ee +hA +NP +rp +Rl +kX +Ln +hA +hA +kX +kX +WY +pE +hc +hc +hc +hc +hc +pE +WY +kX +kX +Ln +hA +hA +Ln +hA +hA +hA +hA +ee +DO +DO +DO +DO +DO +"} +(61,1,1) = {" +Bc +Bc +Bc +Bc +DO +GB +DO +DO +ee +hA +NP +rp +Rl +kX +Ln +Ln +Ln +kX +kX +WY +mz +hc +hc +hc +hc +hc +mz +WY +kX +kX +Ln +Ln +Ln +hA +hA +hA +hA +hA +ee +DO +DO +DO +DO +DO +"} +(62,1,1) = {" +Bc +Bc +Bc +Bc +DO +GB +DO +DO +ee +hA +NP +NP +NP +Ln +kX +kX +kX +kX +kX +WY +yS +hc +hc +fT +aw +hc +mz +WY +kX +kX +kX +kX +vc +hA +hA +hA +hA +hA +ee +DO +DO +DO +DO +DO +"} +(63,1,1) = {" +Bc +Bc +Bc +Bc +DO +GB +DO +DO +ee +hA +NP +NP +NP +hA +kX +kX +kX +kX +kX +WY +WY +WY +WY +WY +WY +WY +WY +WY +kX +kX +Ln +hA +hA +Ln +hA +hA +hA +hA +ee +DO +DO +DO +DO +DO +"} +(64,1,1) = {" +Bc +Bc +Bc +Bc +DO +GB +DO +DO +ee +hA +NP +Rl +rp +hA +Ln +hA +hA +kX +kX +kX +kX +Oh +kX +kX +kX +kX +kX +kX +kX +kX +Ln +hA +hA +Ln +hA +hA +hA +hA +ee +DO +DO +DO +DO +DO +"} +(65,1,1) = {" +Bc +Bc +Bc +Bc +DO +GB +DO +DO +ee +hA +NP +Rl +rp +hA +hA +hA +hA +hA +Ln +kX +kX +kX +kX +kX +hA +hA +kX +kX +kX +kX +Ln +hA +hA +kX +kX +Ln +hA +hA +ee +DO +DO +DO +DO +DO +"} +(66,1,1) = {" +Bc +Bc +Bc +Bc +DO +GB +DO +DO +ee +hA +NP +Rl +rp +hA +hA +Ln +kX +Ln +hA +kX +kX +kX +kX +HW +Ln +Ln +kX +kX +hA +hA +Ln +Ln +Ln +kX +kX +Ln +hA +hA +ee +DO +DO +DO +DO +DO +"} +(67,1,1) = {" +DO +DO +DO +DO +DO +GB +DO +DO +DO +hA +NP +rp +rp +hA +hA +Ln +kX +Ln +hA +hA +hA +hA +hA +hA +hA +Ln +Ln +Ln +hA +hA +kX +kX +kX +kX +kX +Ln +hA +hA +DO +DO +DO +DO +DO +DO +"} +(68,1,1) = {" +DO +DO +DO +DO +DO +GB +DO +DO +DO +hA +NP +rp +rp +hA +hA +Ln +Ln +Ln +hA +hA +hA +hA +hA +hA +hA +hA +hA +Lf +hA +hA +hA +hA +Ln +kX +Ln +kX +hA +hA +DO +DO +DO +DO +DO +DO +"} +(69,1,1) = {" +DO +DO +DO +DO +DO +GB +GB +GB +GB +NP +vT +yH +vT +NP +iV +NP +hA +hA +hA +hA +hA +hA +hA +wT +hA +hA +hA +hA +hA +hA +hA +hA +Ln +kX +Ln +kX +hA +hA +DO +DO +DO +DO +DO +DO +"} +(70,1,1) = {" +DO +DO +DO +DO +DO +GB +GB +GB +GB +NP +NP +rp +NP +NP +NP +NP +hA +hA +hA +hA +hA +hA +Ft +Ft +Ft +hA +hA +hA +hA +hA +hA +hA +Ln +Un +kX +kX +hA +hA +DO +DO +DO +DO +DO +DO +"} +(71,1,1) = {" +DO +DO +DO +DO +DO +GB +GB +GB +GB +NP +NP +rp +NP +NP +NP +NP +hA +hA +hA +hA +Ft +qp +Ft +by +Ft +hA +hA +hA +hA +hA +hA +hA +Ln +kX +kX +kX +hA +Mv +DO +DO +DO +DO +DO +DO +"} +(72,1,1) = {" +DO +DO +DO +DO +DO +GB +GB +GB +GB +Bt +NP +NP +NP +NP +NP +NP +hA +hA +hA +hA +Ft +Ft +Ft +by +Ft +gE +cU +hA +hA +hA +hA +hA +Ln +kX +kX +kX +Mv +Mv +DO +DO +DO +DO +DO +DO +"} +(73,1,1) = {" +DO +DO +DO +DO +DO +GB +GB +GB +GB +Bt +Bt +rp +rp +NP +NP +NP +hA +Ft +hA +hA +Ft +by +by +by +by +Ft +Ft +Ft +Ft +hA +hA +hA +Ln +kX +kX +Mv +Mv +DO +DO +DO +DO +DO +DO +DO +"} +(74,1,1) = {" +DO +DO +DO +DO +DO +GB +GB +GB +GB +GB +Bt +Bt +rp +NP +NP +NP +hA +Ft +Ft +Ft +Ft +by +by +by +by +by +Ft +by +Ft +hA +hA +hA +Ln +kX +Mv +Mv +DO +DO +DO +DO +DO +DO +DO +DO +"} +(75,1,1) = {" +DO +DO +DO +DO +DO +GB +GB +GB +GB +GB +GB +Bt +Bt +NP +NP +NP +Ft +by +Ft +Ft +by +by +by +by +by +by +by +by +Ft +hA +hA +hA +Ln +Mv +Mv +DO +DO +DO +DO +DO +DO +DO +DO +DO +"} +(76,1,1) = {" +DO +DO +DO +GB +DO +DO +GB +GB +mV +mV +GB +GB +Bt +Bt +NP +iI +by +Mg +Mg +Mg +Mg +Mg +Mg +Mg +Mg +Mg +Mg +Mg +iI +NP +NP +NP +Bt +Bt +GB +DO +DO +DO +DO +GB +GB +DO +DO +DO +"} +(77,1,1) = {" +DO +DO +DO +GB +DO +DO +GB +GB +mV +mV +GB +GB +GB +GB +GB +GB +DO +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +DO +DO +DO +DO +DO +DO +Bc +Bc +Bc +"} +(78,1,1) = {" +DO +DO +DO +GB +DO +DO +GB +GB +GB +GB +DO +DO +DO +DO +GB +GB +DO +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +DO +Bc +Bc +Bc +DO +DO +Bc +Bc +Bc +"} +(79,1,1) = {" +DO +DO +DO +GB +DO +DO +GB +GB +GB +GB +DO +DO +DO +DO +GB +GB +DO +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +DO +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +"} +(80,1,1) = {" +Bc +Bc +Bc +DO +DO +DO +GB +GB +GB +GB +DO +DO +DO +DO +GB +mV +GB +mV +mV +mV +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +DO +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +"} +(81,1,1) = {" +Bc +Bc +Bc +DO +DO +DO +DO +DO +DO +DO +Bc +Bc +Bc +Bc +Bc +DO +GB +mV +mV +mV +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +"} +(82,1,1) = {" +Bc +Bc +Bc +DO +DO +DO +DO +DO +DO +DO +Bc +Bc +Bc +Bc +Bc +DO +DO +mV +mV +mV +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +DO +DO +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +"} +(83,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +DO +DO +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +"} +(84,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +GB +DO +DO +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +"} +(85,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +DO +DO +DO +DO +DO +DO +DO +DO +DO +DO +DO +DO +DO +DO +DO +DO +DO +DO +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +"} +(86,1,1) = {" +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +DO +DO +DO +DO +DO +DO +DO +DO +DO +DO +DO +DO +DO +DO +DO +DO +DO +DO +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +Bc +"} diff --git a/code/__DEFINES/ai/ai_defines.dm b/code/__DEFINES/ai/ai_defines.dm index 6f27ca7a03a..17553cb0f92 100644 --- a/code/__DEFINES/ai/ai_defines.dm +++ b/code/__DEFINES/ai/ai_defines.dm @@ -76,4 +76,4 @@ /// probability that the pawn should try resisting out of restraints #define RESIST_SUBTREE_PROB 50 /// macro for whether it's appropriate to resist right now, used by resist subtree -#define SHOULD_RESIST(source) (source.on_fire || source.buckled || source.restrained() || source.pulledby) +#define SHOULD_RESIST(source) (source.on_fire || source.buckled || source.restrained() || source.pulledby || istype(source.loc, /obj/structure/closet)) diff --git a/code/__DEFINES/ai/ash_whelp_defines.dm b/code/__DEFINES/ai/ash_whelp_defines.dm new file mode 100644 index 00000000000..d2f69e096d6 --- /dev/null +++ b/code/__DEFINES/ai/ash_whelp_defines.dm @@ -0,0 +1,11 @@ +// Ash Whelps +/// whelp's straight line fire ability +#define BB_WHELP_STRAIGHTLINE_FIRE "BB_whelp_straightline_fire" +/// whelp's secondary enraged ability +#define BB_WHELP_WIDESPREAD_FIRE "BB_whelp_widespread_fire" +/// the target rock we will attempt to create a sculpture out of +#define BB_TARGET_ROCK "BB_target_rock" +/// the cannibal target we shall consume +#define BB_TARGET_CANNIBAL "BB_target_cannibal" +/// the tree we will burn down +#define BB_TARGET_TREE "BB_target_tree" diff --git a/code/datums/mapping/templates/lavaland_map_templates.dm b/code/datums/mapping/templates/lavaland_map_templates.dm index 42779a5dd05..97884cfe041 100644 --- a/code/datums/mapping/templates/lavaland_map_templates.dm +++ b/code/datums/mapping/templates/lavaland_map_templates.dm @@ -285,6 +285,13 @@ description = "A small wooden cabin that was once lived in by a hermit who is now nowhere to be found." allow_duplicates = FALSE +/datum/map_template/ruin/lavaland/providence_crash + id = "providence crash" + suffix = "lavaland_surface_providence_crash.dmm" + name = "Crash of the Providence" + description = "A wrecked vulpkanin mercenary vessel. There may still be some treasures hidden behind the locked door." + allow_duplicates = FALSE + // MARK: Bridges /datum/map_template/ruin/lavaland/zlvl_bridge diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 2af91340c83..ab39832504a 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -1605,3 +1605,47 @@ new /obj/effect/temp_visual/temporal_slash(get_turf(owner), owner) #undef FINISHER_THRESHOLD + +/datum/status_effect/ice_block_talisman + id = "ice_block_talisman" + duration = 4 SECONDS + status_type = STATUS_EFFECT_REPLACE + alert_type = /atom/movable/screen/alert/status_effect/ice_block_talisman + /// Stored icon overlay for the hit mob, removed when effect is removed + var/icon/cube + +/datum/status_effect/ice_block_talisman/on_creation(mob/living/new_owner, set_duration) + if(isnum(set_duration)) + duration = set_duration + return ..() + +/atom/movable/screen/alert/status_effect/ice_block_talisman + name = "Frozen Solid" + desc = "You're frozen inside an ice cube, and cannot move!" + icon_state = "frozen" + +/datum/status_effect/ice_block_talisman/on_apply() + RegisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(owner_moved)) + if(!owner.stat) + to_chat(owner, SPAN_USERDANGER("You become frozen in a cube!")) + cube = icon('icons/effects/freeze.dmi', "ice_cube") + var/list/icon_dimensions = get_icon_dimensions(owner.icon) + cube.Scale(icon_dimensions["width"], icon_dimensions["height"]) + owner.add_overlay(cube) + return ..() + +/// Blocks movement from the status effect owner +/datum/status_effect/ice_block_talisman/proc/owner_moved() + SIGNAL_HANDLER + return COMPONENT_MOVABLE_BLOCK_PRE_MOVE + +/datum/status_effect/ice_block_talisman/be_replaced() + owner.cut_overlay(cube) + UnregisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE) + return ..() + +/datum/status_effect/ice_block_talisman/on_remove() + if(!owner.stat) + to_chat(owner, SPAN_NOTICE("The cube melts!")) + owner.cut_overlay(cube) + UnregisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE) diff --git a/code/game/area/areas/ruins/lavaland_areas.dm b/code/game/area/areas/ruins/lavaland_areas.dm index 2bf38279f32..74c29485de9 100644 --- a/code/game/area/areas/ruins/lavaland_areas.dm +++ b/code/game/area/areas/ruins/lavaland_areas.dm @@ -17,6 +17,10 @@ /area/ruin/powered/gluttony icon_state = "yellow" +/area/ruin/powered/providence + icon_state = "yellow" + tele_proof = TRUE + /area/ruin/powered/golem_ship name = "Free Golem Ship" icon_state = "yellow" diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 57834061b4f..05fc1c8e89f 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -654,6 +654,26 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/newplayer_start) //Without this you sp mobtype = /mob/living/basic/mining/goliath/ancient . = ..() +/obj/effect/landmark/mob_spawner/ash_whelp + mobtype = /mob/living/basic/mining/ash_whelp + +/obj/effect/landmark/mob_spawner/ash_whelp/Initialize(mapload) + if(prob(2)) + mobtype = /mob/living/basic/mining/ash_whelp/ice + . = ..() + +/obj/effect/landmark/mob_spawner/ashwalker_npc + mobtype = /mob/living/basic/ash_walker + +/obj/effect/landmark/mob_spawner/ashwalker_npc/Initialize(mapload) + if(prob(40)) + mobtype = /mob/living/basic/ash_walker/tough + else if(prob(15)) + mobtype = /mob/living/basic/ash_walker/veteran + else if(prob(1)) + mobtype = /mob/living/basic/ash_walker/elite + . = ..() + /obj/effect/landmark/mob_spawner/legion mobtype = /mob/living/basic/mining/hivelord/legion diff --git a/code/game/objects/effects/spawners/random/pool/lavaland_pools.dm b/code/game/objects/effects/spawners/random/pool/lavaland_pools.dm index f60d03840c8..21893c72b3b 100644 --- a/code/game/objects/effects/spawners/random/pool/lavaland_pools.dm +++ b/code/game/objects/effects/spawners/random/pool/lavaland_pools.dm @@ -37,8 +37,10 @@ list( /obj/effect/landmark/mob_spawner/abandoned_minebot, + /obj/effect/landmark/mob_spawner/ashwalker_npc, /obj/effect/landmark/mob_spawner/goldgrub, /obj/effect/landmark/mob_spawner/gutlunch, + /obj/effect/landmark/mob_spawner/ash_whelp, ) = 1, ) diff --git a/code/game/objects/items/salvage.dm b/code/game/objects/items/salvage.dm index bc79bd1a7b4..80327b0e01c 100644 --- a/code/game/objects/items/salvage.dm +++ b/code/game/objects/items/salvage.dm @@ -71,6 +71,13 @@ pickup_sound = sound('sound/hallucinations/im_here2.ogg', 10) drop_sound = sound('sound/hallucinations/look_up2.ogg', 10) +/obj/item/salvage/ruin/broken_rifle + name = "broken rifle" + desc = "A battered, broken rifle. All but useless as a weapon, however it can be sold for scrap or dismantled for materials." + icon_state = "broken_rifle" + value = 50 + materials = list(MAT_METAL = 2000, MAT_PLATINUM = 2000, MAT_IRIDIUM = 2000, MAT_PALLADIUM = 2000) + /// Loot salvage, gained from fighting space simplemobs. /obj/item/salvage/loot/pirate name = "stolen jewellery" @@ -104,3 +111,20 @@ pickup_sound = 'sound/items/handling/taperecorder_pickup.ogg' drop_sound = 'sound/items/handling/taperecorder_drop.ogg' value = 125 // Mobs that drop this are fairly dangerous, so let's give it some value + +/obj/item/salvage/loot/dogtags + name = "dog tags" + desc = "Dog tags belonging to an unnamed soldier or mercenary. Someone is likely willing to pay good credits to see them returned." + icon_state = "dogtag" + w_class = WEIGHT_CLASS_TINY + +/obj/item/salvage/loot/dogtags/officer + name = "officer's dog tags" + desc = "Dog tags belonging to an unnamed high-ranking soldier or mercenary. Someone is likely willing to pay good credits to see them returned." + icon_state = "dogtag_officer" + value = 250 + +/obj/item/salvage/loot/dogtags/captain + name = "captain's dog tags" + desc = "Dog tags belonging to an unnamed captain of a soldier or mercenary group. Someone is likely willing to pay good credits to see them returned." + value = 400 diff --git a/code/modules/awaymissions/mission_code/ruins/providence_wreck.dm b/code/modules/awaymissions/mission_code/ruins/providence_wreck.dm new file mode 100644 index 00000000000..09ceda39503 --- /dev/null +++ b/code/modules/awaymissions/mission_code/ruins/providence_wreck.dm @@ -0,0 +1,167 @@ +#define PW_CHALLENGE_LOOTROOM "PW_CHALLENGE_LOOTROOM" + +/obj/structure/environmental_storytelling_holopad/providence + speaking_name = "Captain Charon" + +/obj/structure/environmental_storytelling_holopad/providence/start_message(mob/living/carbon/human/H) + activated = TRUE + QDEL_NULL(proximity_monitor) + icon_state = "holopad1" + update_icon(UPDATE_OVERLAYS) + var/obj/effect/overlay/hologram = new(get_turf(src)) + our_holo = hologram + hologram.icon = getHologramIcon(icon('icons/mob/simple_human.dmi', "captain_charon"), colour = null, opacity = 0.8, colour_blocking = TRUE) // This is more offputting. Also in colour more and less transparent. + hologram.alpha = 166 + hologram.mouse_opacity = MOUSE_OPACITY_TRANSPARENT + hologram.layer = FLY_LAYER + hologram.anchored = TRUE + hologram.name = speaking_name + hologram.set_light(2) + hologram.bubble_icon = "swarmer" + hologram.pixel_y = 16 + for(var/I in things_to_say) + hologram.atom_say("[I]") + sleep(loop_sleep_time) + qdel(hologram) + icon_state = initial(icon_state) + update_icon(UPDATE_OVERLAYS) + +/obj/structure/environmental_storytelling_holopad/providence/bridge + things_to_say = list( + "Log. This is Captain Charon... Of the independant vessel 'Providence'...", + "Hrk... That thing... it got me good. Hah. I got it better.", + "Eckart didn't make it. They got him. I haven't heard the screams for hours now...", + "This place - it's hell. It's truly hell.", + "I'm locking down the ship. That's all I can do now.", + "If anyone heard any of my recordings, you can use the device here to disable the lockdown... but it'll probably attract the beasts to you while it works.", + "If nobody did... Hah, then why am I still talking?", + "Captain Charon, signing off... Please, before this place takes me too." + ) + +/obj/structure/environmental_storytelling_holopad/providence/last_stand + things_to_say = list( + "Log. This is Captain Charon of the independant vessel 'Providence...", + "The noises are growing closer. We've already seen assailants from some tribal species and other creatures.", + "They're probing our defenses - looking for a way in. We've locked down the damaged sections from what's still intact. That'll buy us time.", + "Eckart is proving to be a good skirmisher, but he's running low on shells.", + "While he buys us time, we've begun to fortify this room. We'll hold out. I promised my crew that much.", + "Captain Charon, signing off. If you see miss Protheros, tell her I love her very much." + ) + +/obj/structure/environmental_storytelling_holopad/providence/crew_quarters + things_to_say = list( + "Log. This is Captain Charon of the independant vessel 'Providence.", + "It's not looking good. Most of the crew were badly injured in the crash.", + "We've got what doctors are still mobile running triage, but that's not the worst of it.", + "Lieutenant Eckart took an old spacesuit out to look around, and he came back. Said he heard noises.", + "Nothing good can come of that, no sir. What crew remain alive have taken up arms. We're not going to die down here.", + "Captain Charon, signing off." + ) + +/obj/structure/environmental_storytelling_holopad/providence/communications + things_to_say = list( + "Log. This is Captain Charon of the independant vessel 'Providence.", + "We've sent out a distress signal. Best we can do now is wait.", + "The back half of the ship is gone. That hole in the ground... it doesn't end.", + "Sergeant Kenefick shined a targeting laser into the hole, and the rangefinder wouldn't stop ticking.", + "We've lost all contact with engineering, and a chunk of our medical deck is gone.", + "I believe we can pull through though. Things seem rough, but we've toughed through worse.", + "Captain Charon, signing off." + ) + +/obj/structure/providence_lockdown_controller + name = "lockdown controller" + desc = "A machine that controls the heavy blast doors all around the Providence. Reversing this should unlock the entire ship for exploration." + icon = 'icons/obj/machines/mining_machines.dmi' + icon_state = "asteroid_magnet" + anchored = TRUE + density = TRUE + armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 10, RAD = 100, FIRE = 100, ACID = 100) + resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + /// How long does it take to remove the lockdown + var/lockdown_time = 8 MINUTES + /// Number of waves, minus one for the starting wave + var/wave_count = 5 + /// Minimum mobs per wave + var/wave_mob_min = 3 + /// Max mobs per wave + var/wave_mob_max = 6 + /// Mobs that can spawn in the wave + var/list/wave_mobs = list( + /mob/living/basic/mining/hivelord/legion = 375, + /mob/living/basic/ash_walker = 332, + /mob/living/basic/mining/goliath = 297, + /mob/living/basic/mining/basilisk/watcher = 296, + /mob/living/basic/ash_walker/tough = 120, + /mob/living/basic/mining/ash_whelp = 98, + /mob/living/basic/ash_walker/veteran = 45, + /mob/living/basic/mining/hivelord/legion/dwarf = 25, + /mob/living/basic/mining/goliath/ancient = 3, + /mob/living/basic/ash_walker/elite = 3, + /mob/living/basic/mining/basilisk/watcher/magmawing = 3, + /mob/living/basic/mining/ash_whelp/ice = 2, + /mob/living/basic/mining/basilisk/watcher/icewing = 1, + ) + /// What faction to give the mobs that spawn + var/mob_faction = "providence_attackers" + /// Are we active + var/started = FALSE + +/obj/structure/providence_lockdown_controller/attack_hand(mob/living/user) + . = ..() + if(!isliving(user)) + return + if(isanimal_or_basicmob(user)) + return + if(!Adjacent(user)) + return + if(started) + return + start_challenge() + +/obj/structure/providence_lockdown_controller/proc/start_challenge() + icon_state = "asteroid_magnet-on" + started = TRUE + atom_say("Beginning lockdown lift procedure...") + var/wave_delay = lockdown_time / wave_count + for(var/i in 1 to wave_count) + addtimer(CALLBACK(src, PROC_REF(spawn_wave)), wave_delay * i) + addtimer(CALLBACK(src, PROC_REF(finish_challenge)), lockdown_time) + sleep(5 SECONDS) + spawn_wave() + +/obj/structure/providence_lockdown_controller/proc/finish_challenge() + for(var/obj/machinery/door/poddoor/P in GLOB.airlocks) + if(P.density && P.id_tag == PW_CHALLENGE_LOOTROOM && P.z == z && !P.operating) + P.open() + atom_say("Lockdown lifted. Have a secure daayayyyayyy... -ZZZT!") + visible_message("[src] starts beeping ominously!") + for(var/i in 1 to 4) + playsound(loc, 'sound/items/timer.ogg', 30, 0) + sleep(1 SECONDS) + explosion(loc, 2, 5, 10, 16, flame_range = 20, cause = name) + qdel(src) + +/obj/structure/providence_lockdown_controller/proc/spawn_wave() + var/list/valid_turfs = orange(8, get_turf(src)) - orange(3, get_turf(src)) + var/num_to_spawn = rand(wave_mob_min, wave_mob_max) + for(var/i in 1 to num_to_spawn) + var/turf/valid_spawn + while(!valid_spawn) + var/turf/T = pick_n_take(valid_turfs) + if(!T.is_blocked_turf() && !T.density && !T.contains(/mob) && !istype(T, /turf/simulated/floor/pod)) + valid_spawn = T + var/mob_type = pickweight(wave_mobs) + var/mob/living/new_mob = new mob_type(valid_spawn) + new /obj/effect/temp_visual/cosmic_explosion(valid_spawn) + if(!new_mob.ai_controller) + return + new_mob.ai_controller.set_blackboard_key(BB_TRAVEL_DESTINATION, get_turf(src)) + new_mob.ai_controller.queue_behavior(/datum/ai_behavior/travel_towards, BB_TRAVEL_DESTINATION) + new_mob.faction |= mob_faction + +/obj/effect/mob_spawn/human/corpse/vulpkanin/captain/providence + mob_name = "Charon Protheros" + mob_gender = MALE + +#undef PW_CHALLENGE_LOOTROOM diff --git a/code/modules/awaymissions/mob_spawn.dm b/code/modules/awaymissions/mob_spawn.dm index 32bb9c30c2a..fc2ec12eb24 100644 --- a/code/modules/awaymissions/mob_spawn.dm +++ b/code/modules/awaymissions/mob_spawn.dm @@ -710,6 +710,38 @@ mob_species = /datum/species/skeleton/brittle mob_gender = NEUTER +/obj/effect/mob_spawn/human/corpse/vulpkanin + name = "vulpkanin" + mob_species = /datum/species/vulpkanin + +/obj/effect/mob_spawn/human/corpse/vulpkanin/merc + outfit = /datum/outfit/vulpkanin_merc + +/datum/outfit/vulpkanin_merc + name = "vulpkanin mercenary" + uniform = /obj/item/clothing/under/syndicate/tacticool + suit = /obj/item/clothing/suit/armor/vest + shoes = /obj/item/clothing/shoes/jackboots + gloves = /obj/item/clothing/gloves/color/black + +/obj/effect/mob_spawn/human/corpse/vulpkanin/officer + outfit = /datum/outfit/vulpkanin_merc/officer + +/datum/outfit/vulpkanin_merc/officer + name = "vulpkanin officer" + uniform = /obj/item/clothing/under/rank/procedure/blueshield + suit = /obj/item/clothing/suit/armor/secjacket + head = /obj/item/clothing/head/beret/blue + +/obj/effect/mob_spawn/human/corpse/vulpkanin/captain + outfit = /datum/outfit/vulpkanin_merc/captain + +/datum/outfit/vulpkanin_merc/captain + name = "vulpkanin captain" + uniform = /obj/item/clothing/under/rank/captain + suit = /obj/item/clothing/suit/armor/secjacket + head = /obj/item/clothing/head/caphat + /datum/outfit/randomizer name = "randomizer" diff --git a/code/modules/mob/living/basic/lavaland/ash_walkers.dm b/code/modules/mob/living/basic/lavaland/ash_walkers.dm new file mode 100644 index 00000000000..2a1d9d2f13a --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/ash_walkers.dm @@ -0,0 +1,103 @@ +/mob/living/basic/ash_walker + name = "ash walker" + desc = "These reptillian creatures appear to be related to the Unathi, but seem significantly less evolved." + icon = 'icons/mob/simple_human.dmi' + icon_state = "ashwalker" + icon_living = "ashwalker" + icon_dead = "ashwalker_dead" // Does not actually exist. del_on_death. + icon_gib = "ashwalker_gib" // Does not actually exist. del_on_death. + mob_biotypes = MOB_ORGANIC | MOB_HUMANOID + speed = -0.8 + harm_intent_damage = 5 + melee_damage_lower = 10 + melee_damage_upper = 15 + melee_attack_cooldown_min = 1 SECONDS + melee_attack_cooldown_max = 1.5 SECONDS + attack_verb_continuous = "stabs" + attack_verb_simple = "stab" + attack_sound = 'sound/weapons/bladeslice.ogg' + a_intent = INTENT_HARM + ai_controller = /datum/ai_controller/basic_controller/simple/ash_walker + faction = list("ashwalker") + weather_immunities = list("lava","ash") + unsuitable_atmos_damage = 0 + minimum_survivable_temperature = 0 + maximum_survivable_temperature = INFINITY + loot = list(/obj/effect/mob_spawn/human/corpse/ashwalker, + /obj/item/spear, + /obj/item/stack/ore/iron{layer = ABOVE_MOB_LAYER}) + basic_mob_flags = DEL_ON_DEATH + sentience_type = SENTIENCE_OTHER + step_type = FOOTSTEP_MOB_SHOE + +/mob/living/basic/ash_walker/Initialize(mapload) + . = ..() + add_language("Sinta'unathi") + set_default_language(GLOB.all_languages["Sinta'unathi"]) + gender = pick(MALE, FEMALE) + AddElement(/datum/element/ai_retaliate) + +/mob/living/basic/ash_walker/tough + name = "ash walker hunter" + icon_state = "ashwalker_hunter" + icon_living = "ashwalker_hunter" + damage_coeff = list(BRUTE = 0.9, BURN = 0.6, TOX = 1, CLONE = 1, STAMINA = 1, OXY = 1) + melee_damage_lower = 15 + melee_damage_upper = 20 + loot = list(/obj/effect/mob_spawn/human/corpse/ashwalker, + /obj/item/spear, + /obj/item/stack/ore/plasma{layer = ABOVE_MOB_LAYER}) + +/mob/living/basic/ash_walker/veteran + name = "ash walker slayer" + icon_state = "ashwalker_veteran" + icon_living = "ashwalker_veteran" + damage_coeff = list(BRUTE = 0.8, BURN = 0.4, TOX = 1, CLONE = 1, STAMINA = 1, OXY = 1) + armor_penetration_flat = 15 + melee_damage_lower = 15 + melee_damage_upper = 20 + loot = list(/obj/effect/mob_spawn/human/corpse/ashwalker, + /obj/item/spear, + /obj/item/stack/ore/silver{layer = ABOVE_MOB_LAYER}) + +/mob/living/basic/ash_walker/elite + name = "ash walker dragonslayer" + icon_state = "ashwalker_elite" + icon_living = "ashwalker_elite" + damage_coeff = list(BRUTE = 0.5, BURN = 0, TOX = 1, CLONE = 1, STAMINA = 1, OXY = 1) + armor_penetration_flat = 25 + melee_damage_lower = 20 + melee_damage_upper = 25 + loot = list(/obj/effect/mob_spawn/human/corpse/ashwalker, + /obj/item/spear, + /obj/item/stack/ore/gold{layer = ABOVE_MOB_LAYER}) + +/datum/ai_controller/basic_controller/simple/ash_walker + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_TARGET_MINIMUM_STAT = UNCONSCIOUS, + ) + planning_subtrees = list( + /datum/ai_planning_subtree/generic_resist, + /datum/ai_planning_subtree/random_speech/ash_walker, + /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/find_and_hunt_target/prowl/lavaland, + ) + +/datum/ai_planning_subtree/random_speech/ash_walker + speech_chance = 10 + emote_see = list("grunts.", "hisses.", "inspects their claws.") + speak = list( + "As the necropolis wills.", + "It's been too long since we've had a good hunt.", + "Don't sleep in the shade too long. The cold dreams will find you.", + "I heard the dust singing across the rocks today.", + "The young ones think the lava fields are a brave place. They will find good hunts there.", + "Did you see that star fall?", + "Sometimes, I feel like they're watching me.", + "I heard someone got a goliath the other day. Delicious.", + "Think we'll see an offworlder today?", + "Words are cheap.") diff --git a/code/modules/mob/living/basic/lavaland/ash_whelp/ash_whelp.dm b/code/modules/mob/living/basic/lavaland/ash_whelp/ash_whelp.dm new file mode 100644 index 00000000000..5efee7e75a2 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/ash_whelp/ash_whelp.dm @@ -0,0 +1,123 @@ +/mob/living/basic/mining/ash_whelp + name = "ash whelp" + desc = "The offspring of an ash drake, weak in comparison but still terrifying." + icon_state = "ash_whelp" + icon_living = "ash_whelp" + icon_dead = "ash_whelp_dead" + butcher_results = list( + /obj/item/stack/ore/gold = 3, + /obj/item/stack/sheet/animalhide/ashdrake = 1, + /obj/item/stack/sheet/bone = 10, + /obj/item/stack/sheet/sinew = 2, + ) + crusher_loot = list(/obj/item/crusher_trophy/tail_spike) + speed = 12 + + maxHealth = 300 + health = 300 + obj_damage = 40 + armor_penetration_flat = 20 + melee_damage_lower = 20 + melee_damage_upper = 25 + + response_help_continuous = "pets" + response_help_simple = "pet" + attack_verb_continuous = "chomps" + attack_verb_simple = "chomp" + throw_blocked_message = "does nothing to the scaled hide of the" + death_message = "collapses on its side." + death_sound = 'sound/misc/demon_dies.ogg' + attack_sound = 'sound/misc/demon_attack1.ogg' + + faction = list("mining") + + move_force = MOVE_FORCE_STRONG + move_resist = MOVE_FORCE_STRONG + pull_force = MOVE_FORCE_STRONG + + ai_controller = /datum/ai_controller/basic_controller/ash_whelp + var/list/innate_actions = list( + /datum/action/cooldown/mob_cooldown/fire_breath = BB_WHELP_STRAIGHTLINE_FIRE, + /datum/action/cooldown/mob_cooldown/fire_breath/ice/eruption/fire = BB_WHELP_WIDESPREAD_FIRE, + ) + + /// How much we will heal when consuming a target + var/heal_on_cannibalize = 5 + +/mob/living/basic/mining/ash_whelp/Initialize(mapload) + . = ..() + AddElement(/datum/element/ai_retaliate) + AddComponent(/datum/component/ai_target_timer) + AddComponent(/datum/component/footstep, FOOTSTEP_MOB_HEAVY) + grant_actions_by_list(innate_actions) + +/mob/living/basic/mining/ash_whelp/early_melee_attack(atom/target, list/modifiers, ignore_cooldown) + . = ..() + + if(istype(target, /obj/structure/flora/ash/rock)) + create_sculpture(target) + return FALSE + + if(!istype(target, type)) + return TRUE + + var/mob/living/victim = target + if(victim.stat != DEAD) + return TRUE + + if(istype(target, /mob/living/basic/mining/ash_whelp)) + cannibalize_victim(victim) + return FALSE + return FALSE + +/// Carve a stone into a beautiful self-portrait +/mob/living/basic/mining/ash_whelp/proc/create_sculpture(atom/target) + visible_message("[src] starts to sculpt [target].") + if(!do_after(src, 5 SECONDS, target = target)) + return + var/obj/structure/whelp_statue/dragon_statue = new(get_turf(target)) + dragon_statue.name = "statue of [src]" + dragon_statue.desc = "Let this serve as a warning." + qdel(target) + +/// Gib and consume our fellow ash drakes +/mob/living/basic/mining/ash_whelp/proc/cannibalize_victim(mob/living/target) + start_pulling(target) + visible_message("[src] starts to consume [target].") + if(!do_after(src, 5 SECONDS, target)) + return + target.gib() + adjustBruteLoss(-1 * heal_on_cannibalize) + +/// Ice whelp, the cold variant of ash whelps. +/mob/living/basic/mining/ash_whelp/ice + name = "ice whelp" + desc = "The offspring of an ash drake, weak in comparison but still terrifying. This one exudes an icy aura." + icon_state = "ice_whelp" + icon_living = "ice_whelp" + icon_dead = "ice_whelp_dead" + innate_actions = list( + /datum/action/cooldown/mob_cooldown/fire_breath/ice = BB_WHELP_STRAIGHTLINE_FIRE, + /datum/action/cooldown/mob_cooldown/fire_breath/ice/eruption = BB_WHELP_WIDESPREAD_FIRE, + ) + +/// Ash whelp statue formed by them carving a rock +/obj/structure/whelp_statue + name = "statue of an ash whelp" + desc = "A basalt sculpture of a proud and regal drake. Its eyes are six glowing gemstones." + icon = 'icons/obj/structures/statues.dmi' + icon_state = "drake" + density = TRUE + anchored = TRUE + integrity_failure = 100 + layer = EDGED_TURF_LAYER + +/obj/structure/whelp_statue/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) + . = ..() + update_icon(UPDATE_ICON_STATE) + +/obj/structure/whelp_statue/update_icon_state() + if(broken) + icon_state = "drake_headless" + return + icon_state = "drake" diff --git a/code/modules/mob/living/basic/lavaland/ash_whelp/ash_whelp_actions.dm b/code/modules/mob/living/basic/lavaland/ash_whelp/ash_whelp_actions.dm new file mode 100644 index 00000000000..928978ac59a --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/ash_whelp/ash_whelp_actions.dm @@ -0,0 +1,209 @@ +/datum/action/cooldown/mob_cooldown/fire_breath + name = "Fire Breath" + button_icon_state = "fireball" + desc = "Breathe a line of flames towards the target." + cooldown_time = 3 SECONDS + /// The range of the fire + var/fire_range = 15 + /// The sound played when you use this ability + var/fire_sound = 'sound/magic/fireball.ogg' + /// Time to wait between spawning each fire turf + var/fire_delay = 0.15 SECONDS + /// How hot is our fire + var/fire_temperature = 1000 + /// 'How much' fire do we expose the turf to? + var/fire_volume = 50 + /// How much damage do you take when engulfed? + var/fire_damage = 20 + /// How much damage to mechs take when engulfed? + var/mech_damage = 45 + +/datum/action/cooldown/mob_cooldown/fire_breath/Activate(atom/target_atom) + disable_cooldown_actions() + attack_sequence(target_atom) + StartCooldown() + enable_cooldown_actions() + return TRUE + +/// Apply our specific fire breathing shape, in proc form so we can override it in subtypes +/datum/action/cooldown/mob_cooldown/fire_breath/proc/attack_sequence(atom/target) + playsound(owner.loc, fire_sound, 200, TRUE) + fire_line(target) + +/// Breathe fire in a line towards the target, optionally rotated at an offset from the target +/datum/action/cooldown/mob_cooldown/fire_breath/proc/fire_line(atom/target, offset) + if(isnull(target)) + return + var/turf/target_turf = get_ranged_target_turf_direct(owner, target, fire_range, offset) + var/list/turfs = get_line(owner, target_turf) - get_turf(owner) + INVOKE_ASYNC(src, PROC_REF(progressive_fire_line), turfs) + +/// Creates fire with a delay on the list of targeted turfs +/datum/action/cooldown/mob_cooldown/fire_breath/proc/progressive_fire_line(list/burn_turfs) + if(QDELETED(owner) || owner.stat == DEAD) + return + // Guys we have already hit, no double dipping + var/list/hit_list = list(owner) // also don't burn ourselves + for(var/turf/target_turf in burn_turfs) + if(target_turf.is_blocked_turf(exclude_mobs = TRUE)) + return + burn_turf(target_turf, hit_list, owner) + sleep(fire_delay) + +/// Finally spawn the actual fire, spawns the fire hotspot in case you want to recolour it or something +/datum/action/cooldown/mob_cooldown/fire_breath/proc/burn_turf(turf/fire_turf, list/hit_list, mob/living/source) + var/obj/effect/hotspot/hotspot = new /obj/effect/hotspot/fake(fire_turf) + hotspot.temperature = fire_temperature + hotspot.recolor() + fire_turf.hotspot_expose(fire_temperature, fire_volume) + + for(var/mob/living/barbecued in fire_turf.contents) + if(barbecued in hit_list) + continue + hit_list |= barbecued + on_burn_mob(barbecued, source) + + for(var/obj/mecha/robotron in fire_turf.contents) + if(robotron in hit_list) + continue + hit_list |= robotron + robotron.take_damage(mech_damage, BURN, FIRE) + + return + +/// Do something unpleasant to someone we set on fire +/datum/action/cooldown/mob_cooldown/fire_breath/proc/on_burn_mob(mob/living/barbecued, mob/living/source) + if(fire_temperature <= TCMB) + barbecued.apply_status_effect(/datum/status_effect/ice_block_talisman, 3 SECONDS) + to_chat(barbecued, SPAN_USERDANGER("You're frozen solid by [source]'s icy breath!")) + else + to_chat(barbecued, SPAN_USERDANGER("You are burned by [source]'s fire breath!")) + barbecued.adjustFireLoss(fire_damage) + +/// Shoot three lines of fire in a sort of fork pattern approximating a cone +/datum/action/cooldown/mob_cooldown/fire_breath/cone + name = "Fire Cone" + desc = "Breathe several lines of fire directed at a target." + /// The angles relative to the target that shoot lines of fire + var/list/angles = list(-40, 0, 40) + +/datum/action/cooldown/mob_cooldown/fire_breath/cone/attack_sequence(atom/target) + playsound(owner.loc, fire_sound, 200, TRUE) + for(var/offset in angles) + fire_line(target, offset) + +/// Shoot fire in a whole bunch of directions +/datum/action/cooldown/mob_cooldown/fire_breath/mass_fire + name = "Mass Fire" + button_icon = 'icons/effects/fire.dmi' + button_icon_state = "light" + desc = "Breathe flames in all directions." + cooldown_time = 10.5 SECONDS + click_to_activate = FALSE + /// How many fire lines do we produce to turn a full circle? + var/sectors = 12 + /// How long do we wait between each spin? + var/breath_delay = 2.5 SECONDS + /// How many full circles do we perform? + var/total_spins = 3 + +/datum/action/cooldown/mob_cooldown/fire_breath/mass_fire/Activate(atom/target_atom) + target_atom = get_step(owner, owner.dir) // Just shoot it forwards, we don't need to click on someone forthis one + return ..() + +/datum/action/cooldown/mob_cooldown/fire_breath/mass_fire/attack_sequence(atom/target) + var/queued_spins = 0 + for(var/i in 1 to total_spins) + var/delay = queued_spins * breath_delay + queued_spins++ + addtimer(CALLBACK(src, PROC_REF(fire_spin), target, queued_spins), delay) + +/// Breathe fire in a circle, with a slight angle offset based on which of our several circles it is +/datum/action/cooldown/mob_cooldown/fire_breath/mass_fire/proc/fire_spin(target, spin_count) + if(QDELETED(owner) || owner.stat == DEAD) + return // Too dead to spin + playsound(owner.loc, fire_sound, 200, TRUE) + var/angle_increment = 360 / sectors + var/additional_offset = spin_count * angle_increment / 2 + for(var/i in 1 to sectors) + fire_line(target, (angle_increment * i) + (additional_offset)) + +/// Breathe "fire" in a line (it's freezing cold) +/datum/action/cooldown/mob_cooldown/fire_breath/ice + name = "Ice Breath" + desc = "Fire a cold line of fire towards the enemy!" + cooldown_time = 6 SECONDS + fire_range = 7 + fire_damage = 10 + fire_delay = 0.85 DECISECONDS + fire_temperature = TCMB + /// Time to warn people about what we are doing + var/forecast_delay = 0.6 SECONDS + /// What turf are we aiming at? + var/turf/target_turf + /// Overlay we show when we're about to fire + var/image/forecast_overlay + /// Icon state used foroverlay + var/forecast_overlay_state = "ice_whelp_telegraph_dir" + +/datum/action/cooldown/mob_cooldown/fire_breath/ice/New(Target, original) + . = ..() + forecast_overlay = image('icons/mob/lavaland/lavaland_monsters.dmi', forecast_overlay_state) + +/// Apply our specific fire breathing shape, in proc form so we can override it in subtypes +/datum/action/cooldown/mob_cooldown/fire_breath/ice/attack_sequence(atom/target) + target_turf = get_turf(target) + INVOKE_ASYNC(src, PROC_REF(attack_forecast)) + +/// Charge up before we breathe fire +/datum/action/cooldown/mob_cooldown/fire_breath/ice/proc/attack_forecast() + owner.face_atom(target_turf) + owner.Shake(pixelshiftx = 1, pixelshifty = 0, duration = forecast_delay) + forecast_overlay.dir = (get_dir(owner, target_turf)) + owner.add_overlay(forecast_overlay) + var/succeeded = do_after(owner, delay = forecast_delay, target = owner, hidden = TRUE) + owner.cut_overlay(forecast_overlay) + if(succeeded) + playsound(owner.loc, fire_sound, 200, TRUE) + breath_attack() + +/// Actually breathe fire +/datum/action/cooldown/mob_cooldown/fire_breath/ice/proc/breath_attack() + owner.face_atom(target_turf) + fire_line(target_turf) + target_turf = null + +/// Breathe really cold fire an area around them +/datum/action/cooldown/mob_cooldown/fire_breath/ice/eruption + name = "Ice Eruption" + desc = "Unleash cold fire in all directions" + button_icon = 'icons/effects/fire.dmi' + button_icon_state = "light" + click_to_activate = FALSE + fire_range = 3 + forecast_delay = 1 SECONDS + fire_delay = 1.5 DECISECONDS + forecast_overlay_state = "ice_whelp_telegraph_all" + +/datum/action/cooldown/mob_cooldown/fire_breath/ice/eruption/breath_attack() + target_turf = null + + var/list/hit_list = list(owner) + var/list/nearby_turfs = list() + for(var/turf/simulated/floor/target_turf in circle_range(owner, fire_range)) + if(target_turf.is_blocked_turf(exclude_mobs = TRUE)) + continue + var/turf_dist = get_dist(owner, target_turf) + if(turf_dist == 0) + continue + LAZYADDASSOCLIST(nearby_turfs, "[turf_dist]", target_turf) + + for(var/i in 1 to fire_range) + for(var/turf/simulated/floor/kindling as anything in nearby_turfs["[i]"]) + burn_turf(kindling, hit_list, owner) + sleep(fire_delay) + +///Fire subtype forash whelps +/datum/action/cooldown/mob_cooldown/fire_breath/ice/eruption/fire + name = "Eruption" + fire_temperature = 1000 diff --git a/code/modules/mob/living/basic/lavaland/ash_whelp/ash_whelp_ai.dm b/code/modules/mob/living/basic/lavaland/ash_whelp/ash_whelp_ai.dm new file mode 100644 index 00000000000..722ab4ac606 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/ash_whelp/ash_whelp_ai.dm @@ -0,0 +1,163 @@ +/// We won't use fire breath unless we have had the same target forthis long +#define MIN_TIME_TO_BREATH_WEAPON 2 SECONDS + +/datum/ai_controller/basic_controller/ash_whelp + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_TARGET_MINIMUM_STAT = UNCONSCIOUS, + BB_AGGRO_RANGE = 5, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + + planning_subtrees = list( + /datum/ai_planning_subtree/generic_resist, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/targeted_mob_ability/ash_whelp, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_melee_attack_subtree/ash_whelp, + /datum/ai_planning_subtree/sculpt_statues, + /datum/ai_planning_subtree/find_and_hunt_target/corpses/ash_whelp, + /datum/ai_planning_subtree/burn_trees, + /datum/ai_planning_subtree/find_and_hunt_target/prowl/lavaland, + ) + +/// Cancel melee attacks when we have our breath weapon +/datum/ai_planning_subtree/basic_melee_attack_subtree/ash_whelp + melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/ash_whelp + +/// Cancel melee attacks when we have our breath weapon +/datum/ai_behavior/basic_melee_attack/ash_whelp + +/datum/ai_behavior/basic_melee_attack/ash_whelp/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key) + var/datum/action/cooldown/breath_weapon = controller.blackboard[BB_TARGETED_ACTION] + if(breath_weapon?.IsAvailable()) + return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED + + return ..() + +/// Find other tasty dragons +/datum/ai_planning_subtree/find_and_hunt_target/corpses/ash_whelp + target_key = BB_TARGET_CANNIBAL + finding_behavior = /datum/ai_behavior/find_hunt_target/corpses/dragon_corpse + hunting_behavior = /datum/ai_behavior/hunt_target/interact_with_target/dragon_cannibalise + hunt_targets = list(/mob/living/basic/mining/ash_whelp) + hunt_range = 10 + +/datum/ai_behavior/find_hunt_target/corpses/dragon_corpse + +/datum/ai_behavior/find_hunt_target/corpses/dragon_corpse/valid_dinner(mob/living/source, mob/living/dinner, radius) + if(dinner.pulledby) // someone already got him before us + return FALSE + return ..() + +/// Eat other dragons +/datum/ai_behavior/hunt_target/interact_with_target/dragon_cannibalise + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + +/datum/ai_behavior/hunt_target/interact_with_target/dragon_cannibalise/perform(seconds_per_tick, datum/ai_controller/controller, target_key, attack_key) + var/mob/living/target = controller.blackboard[target_key] + if(QDELETED(target) || target.stat != DEAD || target.pulledby) // we were too slow + return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED + return ..() + +/datum/ai_behavior/cannibalize/finish_action(datum/ai_controller/controller, succeeded, target_key) + . = ..() + controller.clear_blackboard_key(target_key) + +/// Subtree to find icy rocks and create sculptures out of them +/datum/ai_planning_subtree/sculpt_statues + +/datum/ai_planning_subtree/sculpt_statues/select_behaviors(datum/ai_controller/controller, seconds_per_tick) + if(controller.blackboard_key_exists(BB_TARGET_ROCK)) + controller.queue_behavior(/datum/ai_behavior/sculpt_statue, BB_TARGET_ROCK) + return SUBTREE_RETURN_FINISH_PLANNING + controller.queue_behavior(/datum/ai_behavior/find_and_set, BB_TARGET_ROCK, /obj/structure/flora/ash/rock) + +/datum/ai_behavior/sculpt_statue + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + action_cooldown = 5 MINUTES + +/datum/ai_behavior/sculpt_statue/setup(datum/ai_controller/controller, target_key) + . = ..() + var/obj/target = controller.blackboard[target_key] + if(QDELETED(target)) + return FALSE + set_movement_target(controller, target) + +/datum/ai_behavior/sculpt_statue/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + . = ..() + if(!controller.ai_interact(target = target_key, intent = INTENT_HELP)) + return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED + return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED + +/datum/ai_behavior/sculpt_statue/finish_action(datum/ai_controller/controller, succeeded, target_key) + . = ..() + controller.clear_blackboard_key(target_key) + + +/// Select appropriate ability based on range +/datum/ai_planning_subtree/targeted_mob_ability/ash_whelp + operational_datums = list(/datum/component/ai_target_timer) + +/datum/ai_planning_subtree/targeted_mob_ability/ash_whelp/select_behaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/target = controller.blackboard[target_key] + if(isnull(target)) + return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED + + var/time_on_target = controller.blackboard[BB_BASIC_MOB_HAS_TARGET_TIME] || 0 + if(time_on_target < MIN_TIME_TO_BREATH_WEAPON) + return // We need to spend some time acquiring our target first + + var/dist_to_target = get_dist(controller.pawn, target) + var/datum/action/cooldown/mob_cooldown/fire_breath/short_range_ability = controller.blackboard[BB_WHELP_WIDESPREAD_FIRE] + if(isnull(short_range_ability) || dist_to_target > short_range_ability.fire_range) + ability_key = BB_WHELP_STRAIGHTLINE_FIRE + return ..() + + ability_key = BB_WHELP_WIDESPREAD_FIRE + return ..() + +/// subtree to look fortrees and burn them with our flamethrower +/datum/ai_planning_subtree/burn_trees + +/datum/ai_planning_subtree/burn_trees/select_behaviors(datum/ai_controller/controller, seconds_per_tick) + var/datum/action/cooldown/using_action = controller.blackboard[BB_WHELP_STRAIGHTLINE_FIRE] + if(!using_action?.IsAvailable()) + return + + if(controller.blackboard_key_exists(BB_TARGET_TREE)) + controller.queue_behavior(/datum/ai_behavior/targeted_mob_ability/and_clear_target/burn_trees, BB_WHELP_STRAIGHTLINE_FIRE, BB_TARGET_TREE) + return SUBTREE_RETURN_FINISH_PLANNING + controller.queue_behavior(/datum/ai_behavior/set_target_tree, BB_TARGET_TREE) + +/datum/ai_behavior/set_target_tree + +/datum/ai_behavior/set_target_tree/perform(seconds_per_tick, datum/ai_controller/controller, tree_key) + . = ..() + var/mob/living_pawn = controller.pawn + var/list/possible_trees = list() + + for(var/obj/structure/flora/tree/possible_tree in oview(9, living_pawn)) + possible_trees += possible_tree + + if(!length(possible_trees)) + return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED + + controller.set_blackboard_key(tree_key, pick(possible_trees)) + return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED + +/datum/ai_behavior/targeted_mob_ability/and_clear_target/burn_trees + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + required_distance = 2 + action_cooldown = 2 MINUTES + +/datum/ai_behavior/targeted_mob_ability/and_clear_target/burn_trees/setup(datum/ai_controller/controller, ability_key, target_key) + . = ..() + var/obj/target = controller.blackboard[target_key] + if(QDELETED(target)) + return FALSE + set_movement_target(controller, target) + +#undef MIN_TIME_TO_BREATH_WEAPON diff --git a/code/modules/projectiles/ammunition/ammo_boxes.dm b/code/modules/projectiles/ammunition/ammo_boxes.dm index 308f013c6fd..df7f1bb829e 100644 --- a/code/modules/projectiles/ammunition/ammo_boxes.dm +++ b/code/modules/projectiles/ammunition/ammo_boxes.dm @@ -14,6 +14,14 @@ multi_sprite_step = 1 icon_state = "357_box" +/obj/item/ammo_box/huntsman32 + name = "speed loader (.32 Huntsman)" + desc = "A small device designed to quickly reload revolvers. Seven round capacity." + materials = list() + ammo_type = /obj/item/ammo_casing/huntsman32 + multi_sprite_step = 1 // see: /obj/item/ammo_box/update_icon() + icon_state = "357" + /obj/item/ammo_box/c9mm name = "ammo box (9mm)" desc = "An ammunition box filled with 9mm pistol cartridges, commonly used in handguns and submachine guns." diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm index 208cafe79ef..1ae4ea95600 100644 --- a/code/modules/projectiles/ammunition/ammo_casings.dm +++ b/code/modules/projectiles/ammunition/ammo_casings.dm @@ -7,6 +7,15 @@ muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_NORMAL muzzle_flash_range = MUZZLE_FLASH_RANGE_STRONG +/obj/item/ammo_casing/huntsman32 + name = ".32 huntsman round" + desc = "A .32 caliber round. The bullet is scored and designed to fragment on hit, dealing large amounts of damage to large creatures." + icon_state = "magnum_steel" + caliber = "32" + projectile_type = /obj/projectile/bullet + muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_NORMAL + muzzle_flash_range = MUZZLE_FLASH_RANGE_STRONG + /obj/item/ammo_casing/rubber9mm name = "9mm rubber round" desc = "A 9mm pistol cartridge. This one has a rubber tip for less-lethal takedowns." @@ -19,7 +28,7 @@ desc = "A 7.62mm rifle cartridge, often used in Soviet rifles." icon_state = "rifle_brass" caliber = "a762" - projectile_type = /obj/projectile/bullet + projectile_type = /obj/projectile/bullet/huntsman32 muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_STRONG muzzle_flash_range = MUZZLE_FLASH_RANGE_STRONG diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm index fa940abba53..8bd273db344 100644 --- a/code/modules/projectiles/ammunition/magazines.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -57,6 +57,10 @@ return 0 +/obj/item/ammo_box/magazine/internal/cylinder/charons_special + ammo_type = /obj/item/ammo_casing/huntsman32 + caliber = "32" + /obj/item/ammo_box/magazine/internal/cylinder/rev38/invisible name = "finger gun cylinder" desc = "Wait, what?" diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index 0851d12dda2..139f82e41fd 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -132,6 +132,14 @@ options["Fancy"] = "revolver-fancy" options["Rose Gold Finish"] = "revolver-rose" +/// Special revolver found in the vulpkanin ship lavaland ruin +/obj/item/gun/projectile/revolver/charons_special + name = "Charon's Modified Revolver" + desc = "A bog-standard service revolver, modified to fire special .32 caliber \"Huntsman\" rounds. The barrel is engraved with a captain's insignia and a pair of wings." + icon_state = "charons-special" + mag_type = /obj/item/ammo_box/magazine/internal/cylinder/charons_special + origin_tech = "combat=6;materials=5" + /// Summoned by the Finger Gun spell, from advanced mimery traitor item /obj/item/gun/projectile/revolver/fingergun name = "finger gun" diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 8b3e600a002..8792cd03348 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -52,6 +52,15 @@ stamina = 30 icon_state = "bullet-r" +/obj/projectile/bullet/huntsman32 + damage = 20 + +/obj/projectile/bullet/huntsman32/on_hit(atom/target, blocked = 0) + if(..(target, blocked) && isliving(target)) + var/mob/living/L = target + if(L.mob_size >= MOB_SIZE_LARGE) + L.apply_damage(80, BRUTE) + /obj/projectile/bullet/toxinbullet damage = 15 damage_type = TOX diff --git a/config/example/config.toml b/config/example/config.toml index 10ea4442baf..eefb6d305b5 100644 --- a/config/example/config.toml +++ b/config/example/config.toml @@ -785,6 +785,7 @@ active_lava_ruins = [ "_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_wooden_cabin.dmm", "_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm", "_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_basalt_lab.dmm", + "_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_providence_crash.dmm", ] ################################################################ diff --git a/icons/mob/lavaland/lavaland_monsters.dmi b/icons/mob/lavaland/lavaland_monsters.dmi index 84822ad6552..490078908ed 100644 Binary files a/icons/mob/lavaland/lavaland_monsters.dmi and b/icons/mob/lavaland/lavaland_monsters.dmi differ diff --git a/icons/mob/simple_human.dmi b/icons/mob/simple_human.dmi index 5d1565258ec..d3fe3be5b2b 100644 Binary files a/icons/mob/simple_human.dmi and b/icons/mob/simple_human.dmi differ diff --git a/icons/obj/machines/mining_machines.dmi b/icons/obj/machines/mining_machines.dmi index 3a6b3600ca1..166360c0a91 100644 Binary files a/icons/obj/machines/mining_machines.dmi and b/icons/obj/machines/mining_machines.dmi differ diff --git a/icons/obj/sellable.dmi b/icons/obj/sellable.dmi index ee4527649ad..3bd75ea1e14 100644 Binary files a/icons/obj/sellable.dmi and b/icons/obj/sellable.dmi differ diff --git a/icons/obj/structures/statues.dmi b/icons/obj/structures/statues.dmi new file mode 100644 index 00000000000..8e4ead3668e Binary files /dev/null and b/icons/obj/structures/statues.dmi differ diff --git a/icons/tgmc/objects/guns.dmi b/icons/tgmc/objects/guns.dmi index 9434181dbc2..45a84f3b9d7 100644 Binary files a/icons/tgmc/objects/guns.dmi and b/icons/tgmc/objects/guns.dmi differ diff --git a/paradise.dme b/paradise.dme index dac8da2535a..b2b44787123 100644 --- a/paradise.dme +++ b/paradise.dme @@ -163,6 +163,7 @@ #include "code\__DEFINES\zlevel_defines.dm" #include "code\__DEFINES\zoom.dm" #include "code\__DEFINES\ai\ai_defines.dm" +#include "code\__DEFINES\ai\ash_whelp_defines.dm" #include "code\__DEFINES\ai\blackboard_defines.dm" #include "code\__DEFINES\ai\bluespace_horror_blackboard_defines.dm" #include "code\__DEFINES\ai\changeling_giant_spider_ai_defines.dm" @@ -2035,6 +2036,7 @@ #include "code\modules\awaymissions\mission_code\ruins\oldstation.dm" #include "code\modules\awaymissions\mission_code\ruins\processing_facility.dm" #include "code\modules\awaymissions\mission_code\ruins\ragnarok_ship.dm" +#include "code\modules\awaymissions\mission_code\ruins\providence_wreck.dm" #include "code\modules\awaymissions\mission_code\ruins\sieged_lab.dm" #include "code\modules\awaymissions\mission_code\ruins\snowbiodome.dm" #include "code\modules\awaymissions\mission_code\ruins\syndiecakesfactory.dm" @@ -2756,6 +2758,10 @@ #include "code\modules\mob\living\basic\hostile\swarmers\swarmer_actions.dm" #include "code\modules\mob\living\basic\hostile\swarmers\swarmer_ai.dm" #include "code\modules\mob\living\basic\hostile\swarmers\swarmer_effects.dm" +#include "code\modules\mob\living\basic\lavaland\ash_walkers.dm" +#include "code\modules\mob\living\basic\lavaland\ash_whelp\ash_whelp.dm" +#include "code\modules\mob\living\basic\lavaland\ash_whelp\ash_whelp_actions.dm" +#include "code\modules\mob\living\basic\lavaland\ash_whelp\ash_whelp_ai.dm" #include "code\modules\mob\living\basic\lavaland\goliath\goliath.dm" #include "code\modules\mob\living\basic\lavaland\goliath\goliath_actions.dm" #include "code\modules\mob\living\basic\lavaland\goliath\goliath_ai.dm"