From 98b13020f801b13be0fd89764c3a288659357bb0 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 19 Jun 2024 21:36:40 -0400 Subject: [PATCH 01/38] Update attribution for Sunbeamstress' music tracks --- code/datums/music_tracks/elibao.dm | 8 ++++---- code/datums/music_tracks/lasers.dm | 8 ++++---- code/datums/music_tracks/pwmur.dm | 8 ++++---- .../objects/items/weapons/storage/fancy/cigarettes.dm | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/code/datums/music_tracks/elibao.dm b/code/datums/music_tracks/elibao.dm index 821e23c85fd..72be0da4562 100644 --- a/code/datums/music_tracks/elibao.dm +++ b/code/datums/music_tracks/elibao.dm @@ -1,16 +1,16 @@ /decl/music_track/elibao - artist = "Earthcrusher" + artist = "Sunbeamstress" title = "every light is blinking at once" song = 'sound/music/elibao.ogg' license = /decl/license/cc_by_nc_sa_3_0 - url = "https://soundcloud.com/alexanderdivine/every-light-is-blinking-at-once" + url = "https://soundcloud.com/sunbeamstress/every-light-is-blinking-at-once" /* 'every light is blinking at once' -An original jam, (c)2018 Earthcrusher, aka Alexander Divine. +An original jam, (c)2018 Sunbeamstress, aka Lauren Loveless. Licensed for use under Creative Commons License: CC BY-SA 3.0 Use it however you like. Stay beautiful. -Link to online version at: https://soundcloud.com/alexanderdivine/every-light-is-blinking-at-once +Link to online version at: https://soundcloud.com/sunbeamstress/every-light-is-blinking-at-once */ diff --git a/code/datums/music_tracks/lasers.dm b/code/datums/music_tracks/lasers.dm index 2811a92e344..940196b9695 100644 --- a/code/datums/music_tracks/lasers.dm +++ b/code/datums/music_tracks/lasers.dm @@ -1,16 +1,16 @@ /decl/music_track/lasers - artist = "Earthcrusher" + artist = "Sunbeamstress" title = "lasers rip apart the bulkhead" song = 'sound/music/lasers_rip_apart_the_bulkhead.ogg' license = /decl/license/cc_by_nc_sa_3_0 - url = "https://soundcloud.com/alexanderdivine/lasers-rip-apart-the-bulkhead" + url = "https://soundcloud.com/sunbeamstress/lasers-rip-apart-the-bulkhead" /* 'lasers rip apart the bulkhead' -An original jam, (c)2018 Earthcrusher, aka Alexander Divine. +An original jam, (c)2018 Sunbeamstress, aka Lauren Loveless. Licensed for use under Creative Commons License: CC BY-SA 3.0 Use it however you like. Stay beautiful. -Link to online version at: https://soundcloud.com/alexanderdivine/lasers-rip-apart-the-bulkhead +Link to online version at: https://soundcloud.com/sunbeamstress/lasers-rip-apart-the-bulkhead */ diff --git a/code/datums/music_tracks/pwmur.dm b/code/datums/music_tracks/pwmur.dm index d3e1a66df06..bf917c86455 100644 --- a/code/datums/music_tracks/pwmur.dm +++ b/code/datums/music_tracks/pwmur.dm @@ -1,16 +1,16 @@ /decl/music_track/pwmur - artist = "Earthcrusher" + artist = "Sunbeamstress" title = "phoron will make us rich" song = 'sound/music/pwmur.ogg' license = /decl/license/cc_by_nc_sa_3_0 - url = "https://soundcloud.com/alexanderdivine/phoron-will-make-us-rich" + url = "https://soundcloud.com/sunbeamstress/phoron-will-make-us-rich" /* 'phoron will make us rich' -An original jam, (c)2018 Earthcrusher, aka Alexander Divine. +An original jam, (c)2018 Sunbeamstress, aka Lauren Loveless. Licensed for use under Creative Commons License: CC BY-SA 3.0 Use it however you like. Stay beautiful. -Link to online version at: https://soundcloud.com/alexanderdivine/phoron-will-make-us-rich +Link to online version at: https://soundcloud.com/sunbeamstress/phoron-will-make-us-rich */ diff --git a/code/game/objects/items/weapons/storage/fancy/cigarettes.dm b/code/game/objects/items/weapons/storage/fancy/cigarettes.dm index 5bd2ad606ff..220e8f3f5ee 100644 --- a/code/game/objects/items/weapons/storage/fancy/cigarettes.dm +++ b/code/game/objects/items/weapons/storage/fancy/cigarettes.dm @@ -85,7 +85,7 @@ /obj/item/storage/box/fancy/cigarettes/killthroat/populate_reagents() add_to_reagents(/decl/material/liquid/fuel, (max_storage_space * 4)) -// New exciting ways to kill your lungs! - Earthcrusher // +// New exciting ways to kill your lungs! - Sunbeamstress // /obj/item/storage/box/fancy/cigarettes/luckystars name = "pack of Lucky Stars" From d11fd5b8449427390e32707fbb9e9652546946d8 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 20 Jun 2024 17:47:15 -0400 Subject: [PATCH 02/38] Fix double dots instead of periods or ellipses --- code/_helpers/time.dm | 2 +- .../config/config_types/config_server.dm | 2 +- code/datums/movement/mob.dm | 2 +- code/datums/outfits/horror_killers.dm | 2 +- code/datums/repositories/client.dm | 2 +- code/datums/repositories/mobs.dm | 2 +- code/game/atoms_init.dm | 2 +- .../form_items/starlight_structures.dm | 2 +- code/game/gamemodes/godmode/god_altar.dm | 4 ++-- code/game/gamemodes/meteor/meteors.dm | 2 +- code/game/machinery/computer/message.dm | 2 +- code/game/machinery/hologram.dm | 2 +- code/game/machinery/vending/food.dm | 2 +- code/game/machinery/wall_frames.dm | 2 +- .../objects/effects/decals/posters/bs12.dm | 2 +- code/game/objects/items/cryobag.dm | 2 +- code/game/objects/items/stacks/stack.dm | 2 +- code/game/objects/items/weapons/stunbaton.dm | 2 +- code/game/objects/structures/flora/tree.dm | 2 +- code/game/objects/structures/signs.dm | 2 +- code/modules/clothing/chameleon.dm | 2 +- code/modules/codex/entries/guides.dm | 4 ++-- code/modules/emotes/definitions/audible.dm | 2 +- code/modules/events/meteors.dm | 4 ++-- .../integrated_electronics/subtypes/input.dm | 6 +++--- .../planet_themes/ruined_city.dm | 2 +- .../random_exoplanet/planet_types/barren.dm | 2 +- code/modules/mining/ore_box.dm | 2 +- .../mob/living/deity/phenomena/conversion.dm | 2 +- .../mob/living/silicon/robot/drone/drone.dm | 20 +++++++++---------- .../simple_animal/constructs/soulstone.dm | 6 +++--- .../simple_animal/hostile/retaliate/parrot.dm | 4 ++-- .../mob/observer/eye/freelook/read_me.dm | 2 +- .../computers/subtypes/dev_holo.dm | 2 +- .../file_system/programs/generic/game.dm | 2 +- .../programs/generic/ntdownloader.dm | 2 +- code/modules/modular_computers/os/ui.dm | 2 +- code/modules/multiz/level_data.dm | 2 +- code/modules/organs/internal/brain.dm | 2 +- .../overmap/ships/computers/engine_control.dm | 4 ++-- code/modules/paperwork/adminpaper.dm | 2 +- code/modules/paperwork/handlabeler.dm | 4 ++-- code/modules/paperwork/paper_bundle.dm | 2 +- code/modules/power/breaker_box.dm | 8 ++++---- code/modules/power/gravitygenerator.dm | 2 +- code/modules/power/smes_construction.dm | 4 ++-- .../reagent_containers/food/burgers.dm | 4 ++-- .../reagent_containers/food/rotten.dm | 2 +- .../reagents/reagent_containers/food/soup.dm | 2 +- code/modules/shieldgen/emergency_shield.dm | 2 +- .../spells/aoe_turf/conjure/force_portal.dm | 2 +- code/modules/synthesized_instruments/song.dm | 2 +- maps/away/unishi/unishi.dm | 2 +- .../system/psionics/faculties/coercion.dm | 2 +- mods/content/xenobiology/circuit.dm | 2 +- nano/templates/computer_fabricator.tmpl | 2 +- 56 files changed, 80 insertions(+), 80 deletions(-) diff --git a/code/_helpers/time.dm b/code/_helpers/time.dm index ba248a2a0da..70d27c55bad 100644 --- a/code/_helpers/time.dm +++ b/code/_helpers/time.dm @@ -126,7 +126,7 @@ var/global/round_start_time = 0 return last_round_duration var/mills = round_duration_in_ticks // 1/10 of a second, not real milliseconds but whatever - //var/secs = ((mills % 36000) % 600) / 10 //Not really needed, but I'll leave it here for refrence.. or something + //var/secs = ((mills % 36000) % 600) / 10 //Not really needed, but I'll leave it here for reference or something var/mins = round((mills % 36000) / 600) var/hours = round(mills / 36000) diff --git a/code/datums/config/config_types/config_server.dm b/code/datums/config/config_types/config_server.dm index 9181d2862ff..8a4774d647e 100644 --- a/code/datums/config/config_types/config_server.dm +++ b/code/datums/config/config_types/config_server.dm @@ -330,7 +330,7 @@ /decl/config/toggle/delist_when_no_admins uid = "delist_when_no_admins" - desc = "Determines if the server should hide itself from the hub when no admins are online.." + desc = "Determines if the server should hide itself from the hub when no admins are online." /decl/config/toggle/wait_for_sigusr1_reboot uid = "wait_for_sigusr1_reboot" diff --git a/code/datums/movement/mob.dm b/code/datums/movement/mob.dm index 6450f821a63..0291d61bcaf 100644 --- a/code/datums/movement/mob.dm +++ b/code/datums/movement/mob.dm @@ -165,7 +165,7 @@ return MOVEMENT_PROCEED -// Finally.. the last of the mob movement junk +// Finally... the last of the mob movement junk /datum/movement_handler/mob/movement/DoMove(var/direction, var/mob/mover) . = MOVEMENT_HANDLED diff --git a/code/datums/outfits/horror_killers.dm b/code/datums/outfits/horror_killers.dm index 88d54917fe5..f93f8f965c5 100644 --- a/code/datums/outfits/horror_killers.dm +++ b/code/datums/outfits/horror_killers.dm @@ -34,7 +34,7 @@ var/victim = get_mannequin(H.ckey) if(victim) for(var/obj/item/carried_item in H.get_equipped_items(TRUE)) - carried_item.add_blood(victim) //Oh yes, there will be blood.. just not blood from the killer because that's odd + carried_item.add_blood(victim) //Oh yes, there will be blood... just not blood from the killer because that's odd /decl/hierarchy/outfit/reaper name = "Reaper" diff --git a/code/datums/repositories/client.dm b/code/datums/repositories/client.dm index 4217a4042a3..db50e1daec3 100644 --- a/code/datums/repositories/client.dm +++ b/code/datums/repositories/client.dm @@ -9,7 +9,7 @@ var/global/repository/client/client_repository = new() ..() clients_ = list() -// A lite client is unique per ckey and mob ref (save for ref conflicts.. oh well) +// A lite client is unique per ckey and mob ref (save for ref conflicts... oh well) /repository/client/proc/get_lite_client(var/mob/M) if(isclient(M)) var/client/C = M // BYOND is supposed to ensure clients always have a mob diff --git a/code/datums/repositories/mobs.dm b/code/datums/repositories/mobs.dm index 024aed9c450..87af6ea7cac 100644 --- a/code/datums/repositories/mobs.dm +++ b/code/datums/repositories/mobs.dm @@ -7,7 +7,7 @@ var/global/repository/mob/mob_repository = new() ..() mobs_ = list() -// A lite mob is unique per ckey and mob real name/ref (ref conflicts possible.. but oh well) +// A lite mob is unique per ckey and mob real name/ref (ref conflicts possible... but oh well) /repository/mob/proc/get_lite_mob(var/mob/M) . = mobs_[mob2unique(M)] if(!.) diff --git a/code/game/atoms_init.dm b/code/game/atoms_init.dm index 01a2b9d1f38..dd18cefaccd 100644 --- a/code/game/atoms_init.dm +++ b/code/game/atoms_init.dm @@ -147,7 +147,7 @@ return list(loc) /atom/PopulateClone(atom/clone) - //Not entirely sure about icon stuff. Some legacy things would need it copied, but not more recently coded atoms.. + //Not entirely sure about icon stuff. Some legacy things would need it copied, but not more recently coded atoms. clone.appearance = appearance clone.set_invisibility(invisibility) diff --git a/code/game/gamemodes/godmode/form_items/starlight_structures.dm b/code/game/gamemodes/godmode/form_items/starlight_structures.dm index 51f3c734282..89281288fce 100644 --- a/code/game/gamemodes/godmode/form_items/starlight_structures.dm +++ b/code/game/gamemodes/godmode/form_items/starlight_structures.dm @@ -37,7 +37,7 @@ ) ), "Shadowling" = list( - "description" = "Beings that come from a place of no light. They sneak from place to place, disabling everyone they touch..", + "description" = "Beings that come from a place of no light. They sneak from place to place, disabling everyone they touch.", "message" = "As a Shadow you take damage from the light itself but have the ability to vanish from sight itself.", "species" = "Shadow", "spells" = list( diff --git a/code/game/gamemodes/godmode/god_altar.dm b/code/game/gamemodes/godmode/god_altar.dm index 576271d8472..ac4f313aee7 100644 --- a/code/game/gamemodes/godmode/god_altar.dm +++ b/code/game/gamemodes/godmode/god_altar.dm @@ -52,9 +52,9 @@ if(3) text = "You feel like your thought are being overriden..." if(2) - text = "You can't.... concentrate.. must... resist!" + text = "You can't... concentrate... must... resist!" if(1) - text = "Can't... resist. ... anymore." + text = "Can't... resist... anymore." to_chat(linked_god, "\The [target] is getting close to conversion!") to_chat(target, "[text]. Resist Conversion") diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 87613dba7d3..7d793607031 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -331,7 +331,7 @@ var/global/list/meteors_cataclysm = list(\ // This is the final solution against shields - a single impact can bring down most shield generators. /obj/effect/meteor/supermatter name = "supermatter shard" - desc = "Oh god, what will be next..?" + desc = "Oh god, what will be next...?" icon = 'icons/obj/supermatter_32.dmi' icon_state = "supermatter" diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index cde979fbef0..81ba9c07166 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -54,7 +54,7 @@ /obj/machinery/computer/message_monitor/emag_act(var/remaining_charges, var/mob/user) // Will create sparks and print out the console's password. You will then have to wait a while for the console to be back online. - // It'll take more time if there's more characters in the password.. + // It'll take more time if there's more characters in the password. if(!emag && operable()) var/obj/machinery/network/message_server/linked_server = get_message_server() if(linked_server) diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index a9f3f07644f..fbe1a323535 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -146,7 +146,7 @@ var/global/list/holopads = list() to_chat(user, "Using such sophisticated technology, just to talk to yourself seems a bit silly.") return if(targetpad && targetpad.caller_id) - to_chat(user, "The pad flashes a busy sign. Maybe you should try again later..") + to_chat(user, "The pad flashes a busy sign. Maybe you should try again later.") return if(targetpad) make_call(targetpad, user) diff --git a/code/game/machinery/vending/food.dm b/code/game/machinery/vending/food.dm index fad22182860..0418c0b4a70 100644 --- a/code/game/machinery/vending/food.dm +++ b/code/game/machinery/vending/food.dm @@ -26,7 +26,7 @@ /obj/item/chems/food/syndicake = 6 ) -//a food variant of the boda machine - It carries slavic themed foods.. Mostly beer snacks +//a food variant of the boda machine - It carries slavic themed foods. Mostly beer snacks /obj/machinery/vending/snix name = "Snix" desc = "An old snack vending machine, how did it get here? And are the snacks still good?" diff --git a/code/game/machinery/wall_frames.dm b/code/game/machinery/wall_frames.dm index 17214a15e77..f3f7fb0ed89 100644 --- a/code/game/machinery/wall_frames.dm +++ b/code/game/machinery/wall_frames.dm @@ -303,7 +303,7 @@ /obj/item/frame/button/airlock_controller/kit/warn_not_setup(mob/user) to_chat(user, SPAN_WARNING("First, use a multitool on the kit to properly setup the controller's software!")) -//Let them also hit it with a circuitboard if they so wish. But multitool is better when you don't want to print one for nothing.. +//Let them also hit it with a circuitboard if they so wish. But multitool is better when you don't want to print one for nothing. /obj/item/frame/button/airlock_controller/kit/attackby(obj/item/W, mob/user) if(!IS_MULTITOOL(W)) return ..() diff --git a/code/game/objects/effects/decals/posters/bs12.dm b/code/game/objects/effects/decals/posters/bs12.dm index b02e172a875..6a585fa4e93 100644 --- a/code/game/objects/effects/decals/posters/bs12.dm +++ b/code/game/objects/effects/decals/posters/bs12.dm @@ -49,7 +49,7 @@ DEFINE_POSTER( bay_43, "bsposter43", "Responsible medbay habits, No #3", DEFINE_POSTER( bay_45, "bsposter45", "Responsible engineering habits, No #1", "A safety poster featuring a blue haired engineer. \"When repairing a machine or construction, always aim for long-term solutions.\"") DEFINE_POSTER( bay_46, "bsposter46", "Inspirational lawyer", "An inspirational poster depicting an alien lawyer. He seems to be shouting something, while pointing fiercely to the right.") DEFINE_POSTER( bay_47, "bsposter47", "Security pinup", "This is a pin-up poster. A dark skinned white haired girl poses in the sunlight wearing a tank top with her stomach exposed. The text on the poster states \"M, Succubus of Security.\" and a lipstick mark stains the top right corner, as if kissed by the model herself.") -DEFINE_POSTER( bay_48, "bsposter48", "Borg pinup?", "This is a.. pin-up poster? It is a diagram on an old model of cyborg with a note scribbled in marker on the bottom, on the top there is a large XO written in red marker.") +DEFINE_POSTER( bay_48, "bsposter48", "Borg pinup?", "This is a... pin-up poster? It is a diagram of an old model of cyborg with a note scribbled in marker on the bottom, on the top there is a large XO written in red marker.") DEFINE_POSTER( bay_49, "bsposter49", "Engineering recruitment", "This is a poster showing an engineer relaxing by a computer, the text states \"Living the life! Join Engineering today!\"") DEFINE_POSTER( bay_50, "bsposter50", "Pinup Girl Cindy Kate", "This particular one is of Cindy Kate, a seductive performer well known among less savoury circles.") DEFINE_POSTER( bay_51, "bsposter51", "space appreciation poster", "This is a poster produced by the Generic Space Company, as a part of a series of commemorative posters on the wonders of space. One of three.") diff --git a/code/game/objects/items/cryobag.dm b/code/game/objects/items/cryobag.dm index 50ae3c0eebc..1fb84bb2849 100644 --- a/code/game/objects/items/cryobag.dm +++ b/code/game/objects/items/cryobag.dm @@ -111,7 +111,7 @@ /obj/item/usedcryobag name = "used stasis bag" - desc = "Pretty useless now.." + desc = "Pretty useless now..." icon_state = "bodybag_used" icon = 'icons/obj/closets/cryobag.dmi' material = /decl/material/solid/organic/plastic diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index f48fc269225..574bd61de8e 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -437,7 +437,7 @@ /**Whether a stack has the capability to be split. */ /obj/item/stack/proc/can_split() - return !(uses_charge && !force) //#TODO: The !force was a hacky way to tell if its a borg or rigsuit module. Probably would be good to find a better way.. + return !(uses_charge && !force) //#TODO: The !force was a hacky way to tell if its a borg or rigsuit module. Probably would be good to find a better way... /**Whether a stack type has the capability to be merged. */ /obj/item/stack/proc/can_merge_stacks(var/obj/item/stack/other) diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 637ce63e363..6a75d23bc2b 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -168,7 +168,7 @@ if (R) return ..() else // Stop pretending and get out of your cardborg suit, human. - to_chat(user, "You don't seem to be able to interact with this by yourself..") + to_chat(user, "You don't seem to be able to interact with this by yourself.") add_fingerprint(user) return 0 diff --git a/code/game/objects/structures/flora/tree.dm b/code/game/objects/structures/flora/tree.dm index 9c38aa58eb9..c91b309d3ea 100644 --- a/code/game/objects/structures/flora/tree.dm +++ b/code/game/objects/structures/flora/tree.dm @@ -72,7 +72,7 @@ new log_type(T, rand(max(1,round(log_amount*0.5)), log_amount), material?.type, reinf_material?.type) if(stump_type) var/obj/structure/flora/stump/stump = new stump_type(T, material, reinf_material) - stump.icon_state = icon_state //A bit dirty maybe, but its probably not worth writing a whole system for this when we have 3 kinds of trees.. + stump.icon_state = icon_state //A bit dirty maybe, but its probably not worth writing a whole system for this when we have 3 kinds of trees... . = ..() /obj/structure/flora/tree/pine diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index b091ca95c74..565a799ddee 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -62,7 +62,7 @@ sign_type = null return S -///Attempts installing the sign and ask the user for direction and etc.. +///Attempts installing the sign and ask the user for direction and etc. /obj/item/sign/proc/try_install(var/turf/targeted_turf, var/mob/user) var/facing = get_cardinal_dir(user, targeted_turf) || user.dir var/install_dir = global.reverse_dir[facing] diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index 2d247d30dd2..957872f823f 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -105,7 +105,7 @@ /obj/item/clothing/suit/chameleon name = "armor" icon = 'icons/clothing/suit/armor/vest.dmi' - desc = "It appears to be a vest of standard armor, except this is embedded with a hidden holographic cloaker, allowing it to change it's appearance, but offering no protection.. It seems to have a small dial inside." + desc = "It appears to be a vest of standard armor, except this is embedded with a hidden holographic cloaker, allowing it to change its appearance, but offering no protection. It seems to have a small dial inside." origin_tech = @'{"esoteric":3}' item_flags = ITEM_FLAG_INVALID_FOR_CHAMELEON var/static/list/clothing_choices diff --git a/code/modules/codex/entries/guides.dm b/code/modules/codex/entries/guides.dm index 5a6e7c15f4c..75d149383fd 100644 --- a/code/modules/codex/entries/guides.dm +++ b/code/modules/codex/entries/guides.dm @@ -372,8 +372,8 @@
  • Unary vent: The basic vent used in rooms. It pumps gas into the room, but can't suck it back out. Controlled by the room's air alarm system.
  • Scrubber: The other half of room equipment. Filters air, and can suck it in entirely in what's called a "panic siphon." Activating a panic siphon without very good reason will kill someone. Don't do it.
  • Meter: A little box with some gauges and numbers. Fasten it to any pipe or manifold and it'll read you the pressure in it. Very useful.
  • -
  • Gas mixer: Two sides are input, one side is output. Mixes the gases pumped into it at the ratio defined. The side perpendicular to the other two is "node 2," for reference, on non-mirrored mixers.. - Output is controlled by flow rate. There is also an "omni" variant that allows you to set input and output sections freely..
  • +
  • Gas mixer: Two sides are input, one side is output. Mixes the gases pumped into it at the ratio defined. The side perpendicular to the other two is "node 2," for reference, on non-mirrored mixers. + Output is controlled by flow rate. There is also an "omni" variant that allows you to set input and output sections freely.
  • Gas filter: Essentially the opposite of a gas mixer. One side is input. The other two sides are output. One gas type will be filtered into the perpendicular output pipe, the rest will continue out the other side. Can also output from 0-4500 kPa. The "omni" vairant allows you to set input and output sections freely.
  • diff --git a/code/modules/emotes/definitions/audible.dm b/code/modules/emotes/definitions/audible.dm index cd5925460ce..8a94493ec2e 100644 --- a/code/modules/emotes/definitions/audible.dm +++ b/code/modules/emotes/definitions/audible.dm @@ -33,7 +33,7 @@ /decl/emote/audible/gnarl key = "gnarl" - emote_message_3p = "$USER$ gnarls and shows its teeth.." + emote_message_3p = "$USER$ gnarls and shows its teeth." /decl/emote/audible/multichirp key = "mchirp" diff --git a/code/modules/events/meteors.dm b/code/modules/events/meteors.dm index 37485967fd9..30c2ac25a21 100644 --- a/code/modules/events/meteors.dm +++ b/code/modules/events/meteors.dm @@ -112,9 +112,9 @@ var/global/list/meteors_major = list( /datum/event/meteor_wave/overmap/tick() if(!victim) return - if (victim.is_still() || victim.get_helm_skill() >= SKILL_ADEPT) //Unless you're standing or good at your job.. + if (victim.is_still() || victim.get_helm_skill() >= SKILL_ADEPT) //Unless you're standing still or good at your job... start_side = pick(global.cardinal) - else //..Meteors mostly fly in your face + else //... Meteors mostly fly in your face start_side = prob(90) ? victim.fore_dir : pick(global.cardinal) ..() diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index 14bcd356cda..a3ae0f726f6 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -195,7 +195,7 @@ var/mob/living/carbon/human/H = get_pin_data_as_type(IC_INPUT, 1, /mob/living) if(!istype(H)) //Invalid input return - if(H in view(get_turf(src))) // Like medbot's analyzer it can be used in range.. + if(H in view(get_turf(src))) // Like the medbot's analyzer it can be used at range. var/current_max_health = H.get_max_health() var/obj/item/organ/internal/brain = GET_INTERNAL_ORGAN(H, BP_BRAIN) @@ -254,7 +254,7 @@ return for(var/i=1, i<=outputs.len, i++) set_pin_data(IC_OUTPUT, i, null) - if(H in view(get_turf(src))) // Like medbot's analyzer it can be used in range.. + if(H in view(get_turf(src))) // Like the medbot's analyzer it can be used at range. if(H.seed) set_pin_data(IC_OUTPUT, 1, H.seed.seed_name) set_pin_data(IC_OUTPUT, 2, H.age) @@ -297,7 +297,7 @@ return for(var/i=1, i<=outputs.len, i++) set_pin_data(IC_OUTPUT, i, null) - if(H in view(get_turf(src))) // Like medbot's analyzer it can be used in range.. + if(H in view(get_turf(src))) // Like the medbot's analyzer it can be used at range. if(H.seed) for(var/chem_path in H.seed.chems) var/decl/material/R = chem_path diff --git a/code/modules/maps/template_types/random_exoplanet/planet_themes/ruined_city.dm b/code/modules/maps/template_types/random_exoplanet/planet_themes/ruined_city.dm index 457be8d6f2e..5f713862cd8 100644 --- a/code/modules/maps/template_types/random_exoplanet/planet_themes/ruined_city.dm +++ b/code/modules/maps/template_types/random_exoplanet/planet_themes/ruined_city.dm @@ -25,7 +25,7 @@ var/datum/level_data/LD = SSmapping.levels_by_id[E.surface_level_id] var/area/A = LD.get_base_area_instance() if(istype(A, world.area)) - PRINT_STACK_TRACE("Got '[world.area]' area as area for the surface level '[LD]' of planetoid '[E]'.") //Don't modify the ambience of the space area.. + PRINT_STACK_TRACE("Got '[world.area]' area as area for the surface level '[LD]' of planetoid '[E]'.") //Don't modify the ambience of the space area. LAZYDISTINCTADD(A.ambience, spooky_ambience) /datum/exoplanet_theme/ruined_city/get_sensor_data() diff --git a/code/modules/maps/template_types/random_exoplanet/planet_types/barren.dm b/code/modules/maps/template_types/random_exoplanet/planet_types/barren.dm index bc7d23c4670..6489b6b3598 100644 --- a/code/modules/maps/template_types/random_exoplanet/planet_types/barren.dm +++ b/code/modules/maps/template_types/random_exoplanet/planet_types/barren.dm @@ -38,7 +38,7 @@ // Planetoid Data //////////////////////////////////////////////////////////////////////////// -//#FIXME: Barren is kind of a wide encompassing planet type. There's a lot of extremes to take into accounts for a single type.. +//#FIXME: Barren is kind of a wide encompassing planet type. There's a lot of extremes to take into accounts for a single type... /datum/planetoid_data/random/barren habitability_class = null diff --git a/code/modules/mining/ore_box.dm b/code/modules/mining/ore_box.dm index 7bb8b5da341..36127c24bca 100644 --- a/code/modules/mining/ore_box.dm +++ b/code/modules/mining/ore_box.dm @@ -51,7 +51,7 @@ for(var/obj/item/stack/material/ore/O in ores) if(total_ores >= maximum_ores) if(user) - to_chat(user, SPAN_WARNING("You insert only what you can..")) + to_chat(user, SPAN_WARNING("You insert only what you can.")) break inserted += O.amount insert_ore(O) diff --git a/code/modules/mob/living/deity/phenomena/conversion.dm b/code/modules/mob/living/deity/phenomena/conversion.dm index d9dc309a33c..344880f91f2 100644 --- a/code/modules/mob/living/deity/phenomena/conversion.dm +++ b/code/modules/mob/living/deity/phenomena/conversion.dm @@ -40,7 +40,7 @@ return 0 var/obj/structure/deity/altar/A = locate() in get_turf(L) if(!A || A.linked_god != linked) - to_chat(linked,"\The [L] needs to be on \a [linked.get_type_name(/obj/structure/deity/altar)] to be forcefully converted..") + to_chat(linked,"\The [L] needs to be on \a [linked.get_type_name(/obj/structure/deity/altar)] to be forcefully converted.") return 0 return 1 diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index ff78cd41471..043435c127d 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -74,19 +74,19 @@ /mob/living/silicon/robot/drone/can_be_possessed_by(var/mob/observer/ghost/possessor) if(!istype(possessor) || !possessor.client || !possessor.ckey) - return 0 + return FALSE if(!get_config_value(/decl/config/toggle/on/allow_drone_spawn)) - to_chat(src, "Playing as drones is not currently permitted.") - return 0 + to_chat(possessor, SPAN_DANGER("Playing as drones is not currently permitted.")) + return FALSE if(too_many_active_drones()) - to_chat(src, "The maximum number of active drones has been reached..") - return 0 + to_chat(possessor, SPAN_DANGER("The maximum number of active drones has been reached.")) + return FALSE if(jobban_isbanned(possessor,ASSIGNMENT_ROBOT)) - to_chat(usr, "You are banned from playing synthetics and cannot spawn as a drone.") - return 0 + to_chat(possessor, SPAN_DANGER("You are banned from playing synthetics and cannot spawn as a drone.")) + return FALSE if(!possessor.MayRespawn(1,DRONE_SPAWN_DELAY)) - return 0 - return 1 + return FALSE + return TRUE /mob/living/silicon/robot/drone/do_possession(var/mob/observer/ghost/possessor) if(!(istype(possessor) && possessor.ckey)) @@ -134,7 +134,7 @@ //Redefining some robot procs... /mob/living/silicon/robot/drone/fully_replace_character_name(pickedName as text) - // Would prefer to call the grandparent proc but this isn't possible, so.. + // Would prefer to call the grandparent proc but this isn't possible, so... real_name = pickedName SetName(real_name) diff --git a/code/modules/mob/living/simple_animal/constructs/soulstone.dm b/code/modules/mob/living/simple_animal/constructs/soulstone.dm index 884576424d5..c63f5a08009 100644 --- a/code/modules/mob/living/simple_animal/constructs/soulstone.dm +++ b/code/modules/mob/living/simple_animal/constructs/soulstone.dm @@ -45,16 +45,16 @@ /obj/item/soulstone/attackby(var/obj/item/I, var/mob/user) ..() if(is_evil && istype(I, /obj/item/nullrod)) - to_chat(user, "You cleanse \the [src] of taint, purging its shackles to its creator..") + to_chat(user, SPAN_NOTICE("You cleanse \the [src] of taint, purging its shackles to its creator.")) is_evil = 0 return if(I.force >= 5) if(full != SOULSTONE_CRACKED) - user.visible_message("\The [user] hits \the [src] with \the [I], and it breaks.[shade.client ? " You hear a terrible scream!" : ""]", "You hit \the [src] with \the [I], and it cracks.[shade.client ? " You hear a terrible scream!" : ""]", shade.client ? "You hear a scream." : null) + user.visible_message(SPAN_WARNING("\The [user] hits \the [src] with \the [I], and it breaks.[shade.client ? " You hear a terrible scream!" : ""]"), SPAN_WARNING("You hit \the [src] with \the [I], and it cracks.[shade.client ? " You hear a terrible scream!" : ""]"), shade.client ? "You hear a scream." : null) playsound(loc, 'sound/effects/Glasshit.ogg', 75) set_full(SOULSTONE_CRACKED) else - user.visible_message("\The [user] shatters \the [src] with \the [I]!") + user.visible_message(SPAN_DANGER("\The [user] shatters \the [src] with \the [I]!")) shatter() /obj/item/soulstone/attack(var/mob/living/simple_animal/M, var/mob/user) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm index fc62f980948..f44a6f78a74 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm @@ -125,7 +125,7 @@ if(parrot_state == PARROT_PERCH) parrot_sleep_dur = parrot_sleep_max //Reset it's sleep timer if it was perched parrot_interest = user - parrot_state = PARROT_SWOOP //The parrot just got hit, it WILL move, now to pick a direction.. + parrot_state = PARROT_SWOOP //The parrot just got hit, it WILL move, now to pick a direction... if(isliving(user)) var/mob/living/M = user if(M.current_health < 50) //Weakened mob? Fight back! @@ -209,7 +209,7 @@ SelfMove(pick(global.cardinal)) return - if(!held_item && !parrot_perch) //If we've got nothing to do.. look for something to do. + if(!held_item && !parrot_perch) //If we've got nothing to do, look for something to do. var/atom/movable/AM = search_for_perch_and_item() //This handles checking through lists so we know it's either a perch or stealable item if(AM) if((isitem(AM) && can_pick_up(AM)) || isliving(AM)) //If stealable item diff --git a/code/modules/mob/observer/eye/freelook/read_me.dm b/code/modules/mob/observer/eye/freelook/read_me.dm index fe7edf80295..76338342416 100644 --- a/code/modules/mob/observer/eye/freelook/read_me.dm +++ b/code/modules/mob/observer/eye/freelook/read_me.dm @@ -13,7 +13,7 @@ With this, the AI controls an "AI Eye" mob, which moves just like a ghost; such as moving through walls and being invisible to players. The AI's eye is set to this mob and then we use a system (explained below) to determine what the cameras around the AI Eye can and cannot see. If the camera cannot see a turf, it will black it out, otherwise it won't and the AI will be able to see it. - This creates several features, such as.. no more see-through-wall cameras, easier to control camera movement, easier tracking, + This creates several features, such as: no more see-through-wall cameras, easier to control camera movement, easier tracking, the AI only being able to track mobs which are visible to a camera, only trackable mobs appearing on the mob list and many more. diff --git a/code/modules/modular_computers/computers/subtypes/dev_holo.dm b/code/modules/modular_computers/computers/subtypes/dev_holo.dm index d74e6d13fee..f2460d4efdf 100644 --- a/code/modules/modular_computers/computers/subtypes/dev_holo.dm +++ b/code/modules/modular_computers/computers/subtypes/dev_holo.dm @@ -75,7 +75,7 @@ update_lighting() -// Subtypes. It's not exactly.. well, presets, so i'll put it here for now. +// Subtypes. It's not exactly... well, presets, so i'll put it here for now. /obj/item/modular_computer/holotablet/round name = "round holotablet" diff --git a/code/modules/modular_computers/file_system/programs/generic/game.dm b/code/modules/modular_computers/file_system/programs/generic/game.dm index 77c40f0223e..c5c9b2fdd3d 100644 --- a/code/modules/modular_computers/file_system/programs/generic/game.dm +++ b/code/modules/modular_computers/file_system/programs/generic/game.dm @@ -7,7 +7,7 @@ filedesc = "Unknown Game" // User-Friendly name. In this case, we will generate a random name in constructor. program_icon_state = "game" // Icon state of this program's screen. program_menu_icon = "script" - extended_desc = "Fun for the whole family! Probably not an AAA title, but at least you can download it on the corporate network.." // A nice description. + extended_desc = "Fun for the whole family! Probably not an AAA title, but at least you can download it on the corporate network." // A nice description. size = 5 // Size in GQ. Integers only. Smaller sizes should be used for utility/low use programs (like this one), while large sizes are for important programs. available_on_network = 1 // ... but we want it to be available for download. nanomodule_path = /datum/nano_module/arcade_classic/ // Path of relevant nano module. The nano module is defined further in the file. diff --git a/code/modules/modular_computers/file_system/programs/generic/ntdownloader.dm b/code/modules/modular_computers/file_system/programs/generic/ntdownloader.dm index 525f363d285..563791757be 100644 --- a/code/modules/modular_computers/file_system/programs/generic/ntdownloader.dm +++ b/code/modules/modular_computers/file_system/programs/generic/ntdownloader.dm @@ -135,7 +135,7 @@ // This IF cuts on data transferred to client, so i guess it's worth it. if(prog.downloaderror) // Download errored. Wait until user resets the program. data["error"] = prog.downloaderror - if(prog.current_transfer) // Download running. Wait please.. + if(prog.current_transfer) // Download running. Wait please... data |= prog.current_transfer.get_ui_data() data["downloadspeed"] = prog.current_transfer.get_transfer_speed() var/datum/computer_file/program/P = prog.current_transfer.transferring diff --git a/code/modules/modular_computers/os/ui.dm b/code/modules/modular_computers/os/ui.dm index 0b6529519df..59ec11f651e 100644 --- a/code/modules/modular_computers/os/ui.dm +++ b/code/modules/modular_computers/os/ui.dm @@ -177,7 +177,7 @@ var/obj/item/cell/battery = battery_module?.get_cell() if(battery) switch(battery.percent()) - if(80 to 200) // 100 should be maximal but just in case.. + if(80 to 200) // 100 should be maximal but just in case... data["PC_batteryicon"] = "batt_100.gif" if(60 to 80) data["PC_batteryicon"] = "batt_80.gif" diff --git a/code/modules/multiz/level_data.dm b/code/modules/multiz/level_data.dm index 65fc6c50b0e..9b32cf78efb 100644 --- a/code/modules/multiz/level_data.dm +++ b/code/modules/multiz/level_data.dm @@ -181,7 +181,7 @@ ///Handle copying data from a previous level_data we're replacing. /datum/level_data/proc/copy_from(var/datum/level_data/old_level) - //#TODO: It's not really clear what should get moved over by default. But putting some time to reflect on this would be good.. + //#TODO: It's not really clear what should get moved over by default. But putting some time to reflect on this would be good... return ///Initialize the turfs on the z-level. diff --git a/code/modules/organs/internal/brain.dm b/code/modules/organs/internal/brain.dm index e8b69f1678e..b83f3eab3e9 100644 --- a/code/modules/organs/internal/brain.dm +++ b/code/modules/organs/internal/brain.dm @@ -68,7 +68,7 @@ if(istype(_brainmob) && _brainmob?.client) //if thar be a brain inside... the brain. to_chat(user, "You can feel the small spark of life still left in this one.") else - to_chat(user, "This one seems particularly lifeless. Perhaps it will regain some of its luster later..") + to_chat(user, "This one seems particularly lifeless. Perhaps it will regain some of its luster later.") /obj/item/organ/internal/brain/do_install(mob/living/carbon/target, affected, in_place, update_icon, detached) if(!(. = ..())) diff --git a/code/modules/overmap/ships/computers/engine_control.dm b/code/modules/overmap/ships/computers/engine_control.dm index 6aa0a035a86..a62b7258705 100644 --- a/code/modules/overmap/ships/computers/engine_control.dm +++ b/code/modules/overmap/ships/computers/engine_control.dm @@ -61,7 +61,7 @@ return TOPIC_REFRESH if(href_list["set_global_limit"]) - var/newlim = input("Input new thrust limit (0..100%)", "Thrust limit", linked.get_thrust_limit() * 100) as num + var/newlim = input("Input new thrust limit (0-100%)", "Thrust limit", linked.get_thrust_limit() * 100) as num if(!CanInteract(user, state)) return TOPIC_NOACTION var/thrust_limit = clamp(newlim / 100, 0, 1) @@ -76,7 +76,7 @@ if(href_list["engine"]) if(href_list["set_limit"]) var/datum/extension/ship_engine/E = locate(href_list["engine"]) - var/newlim = input("Input new thrust limit (0..100)", "Thrust limit", E.thrust_limit) as num + var/newlim = input("Input new thrust limit (0-100)", "Thrust limit", E.thrust_limit) as num if(!CanInteract(user, state)) return var/limit = clamp(newlim/100, 0, 1) diff --git a/code/modules/paperwork/adminpaper.dm b/code/modules/paperwork/adminpaper.dm index a6a1cf86f12..a4f749926d6 100644 --- a/code/modules/paperwork/adminpaper.dm +++ b/code/modules/paperwork/adminpaper.dm @@ -112,7 +112,7 @@ if(href_list["confirm"]) var/obj/machinery/faxmachine/F = destination_ref.resolve() if(!istype(F)) - to_chat(usr, "The destination machines doesn't exist anymore..") + to_chat(usr, "The destination machine doesn't exist anymore.") return switch(alert("Are you sure you want to send the fax as is?",, "Yes", "No")) if("Yes") diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index 12a71b32301..26ddd5d1461 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -45,7 +45,7 @@ if(length(label)) to_chat(user, "Its label text reads '[SPAN_ITALIC(label)]'.") else - to_chat(user, SPAN_NOTICE("You're too far away to tell much more..")) + to_chat(user, SPAN_NOTICE("You're too far away to tell much more.")) /obj/item/hand_labeler/attack(mob/living/M, mob/living/user, target_zone, animate) return //No attacking @@ -91,7 +91,7 @@ update_icon() /obj/item/hand_labeler/proc/show_action_radial_menu(var/mob/user) - //#TODO: Cache some of that stuff.. + //#TODO: Cache some of that stuff. var/image/btn_power = image('icons/screen/radial.dmi', icon_state = safety? "radial_power" : "radial_power_off") btn_power.plane = FLOAT_PLANE btn_power.layer = FLOAT_LAYER diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index d97fee5f4c8..892352f9218 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -424,7 +424,7 @@ /obj/item/paper_bundle/DefaultTopicState() return global.paper_topic_state -//We don't contain any matter, since we're not really a material thing.. +//We don't contain any matter, since we're not really a material thing. /obj/item/paper_bundle/create_matter() UNSETEMPTY(matter) diff --git a/code/modules/power/breaker_box.dm b/code/modules/power/breaker_box.dm index c1e1c7610d1..bf0c3c7fc75 100644 --- a/code/modules/power/breaker_box.dm +++ b/code/modules/power/breaker_box.dm @@ -46,18 +46,18 @@ /obj/machinery/power/breakerbox/attack_ai(mob/living/silicon/ai/user) if(update_locked) - to_chat(user, "System locked. Please try again later.") + to_chat(user, SPAN_WARNING("System locked. Please try again later.")) return if(busy) - to_chat(user, "System is busy. Please wait until current operation is finished before changing power settings.") + to_chat(user, SPAN_WARNING("System is busy. Please wait until current operation is finished before changing power settings.")) return busy = 1 - to_chat(user, "Updating power settings..") + to_chat(user, SPAN_GOOD("Updating power settings...")) if(do_after(user, 50, src)) set_state(!on) - to_chat(user, "Update Completed. New setting:[on ? "on": "off"]") + to_chat(user, SPAN_GOOD("Update completed. New setting:[on ? "on": "off"]")) update_locked = 1 spawn(600) update_locked = 0 diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 9a6452e04af..4fbd6dea467 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -1,4 +1,4 @@ -// It.. uses a lot of power. Everything under power is engineering stuff, at least. +// It... uses a lot of power. Everything under power is engineering stuff, at least. /obj/machinery/computer/gravity_control_computer name = "Gravity Generator Control" diff --git a/code/modules/power/smes_construction.dm b/code/modules/power/smes_construction.dm index d2348eb216a..14a0cdafcad 100644 --- a/code/modules/power/smes_construction.dm +++ b/code/modules/power/smes_construction.dm @@ -220,7 +220,7 @@ // Sparks, Near - instantkill shock, Strong EMP, 25% light overload, 5% APC failure. 50% of SMES explosion. This is bad. spark_at(src, amount = 10, cardinal_only = TRUE) to_chat(h_user, SPAN_WARNING("Massive electrical arc sparks between you and [src].
    Last thing you can think about is \"Oh shit...\"")) - // Remember, we have few gigajoules of electricity here.. Turn them into crispy toast. + // Remember, we have few gigajoules of electricity here. Turn them into crispy toast. h_user.electrocute_act(rand(170,210), src, def_zone = ran_zone(null)) SET_STATUS_MAX(h_user, STAT_PARA, 8) spawn(0) @@ -243,7 +243,7 @@ return src.ping("DANGER! Magnetic containment field failure in 3 ... 2 ... 1 ...") explosion(src.loc,1,2,4,8) - // Not sure if this is necessary, but just in case the SMES *somehow* survived.. + // Not sure if this is necessary, but just in case the SMES *somehow* survived. qdel(src) /obj/machinery/power/smes/buildable/proc/check_total_system_failure(var/mob/user) diff --git a/code/modules/reagents/reagent_containers/food/burgers.dm b/code/modules/reagents/reagent_containers/food/burgers.dm index 031ee9f7daf..fef86dec591 100644 --- a/code/modules/reagents/reagent_containers/food/burgers.dm +++ b/code/modules/reagents/reagent_containers/food/burgers.dm @@ -98,7 +98,7 @@ /obj/item/chems/food/tofuburger name = "tofu burger" - desc = "What.. is that meat?" + desc = "What... is that meat?" icon_state = "tofuburger" filling_color = "#fffee0" center_of_mass = @'{"x":16,"y":10}' @@ -191,7 +191,7 @@ /obj/item/chems/food/jellyburger name = "jelly burger" - desc = "Culinary delight..?" + desc = "Culinary delight...?" icon_state = "jellyburger" filling_color = "#b572ab" center_of_mass = @'{"x":16,"y":11}' diff --git a/code/modules/reagents/reagent_containers/food/rotten.dm b/code/modules/reagents/reagent_containers/food/rotten.dm index 6cc5e6f98eb..7bd6d271426 100644 --- a/code/modules/reagents/reagent_containers/food/rotten.dm +++ b/code/modules/reagents/reagent_containers/food/rotten.dm @@ -42,7 +42,7 @@ /obj/item/chems/food/old/hotdog name = "hotdog" - desc = "This one is probably only marginally less safe to eat than when it was first created.." + desc = "This is probably only marginally less safe to eat than when it was first created." icon_state = "ancient_hotdog" /obj/item/chems/food/old/taco diff --git a/code/modules/reagents/reagent_containers/food/soup.dm b/code/modules/reagents/reagent_containers/food/soup.dm index 642e9fc3a1d..324ad366b0b 100644 --- a/code/modules/reagents/reagent_containers/food/soup.dm +++ b/code/modules/reagents/reagent_containers/food/soup.dm @@ -264,7 +264,7 @@ /obj/item/chems/food/beetsoup name = "beet soup" - desc = "Wait, how do you spell it again..?" + desc = "Wait, how do you spell it again...?" icon_state = "beetsoup" trash = /obj/item/trash/snack_bowl filling_color = "#fac9ff" diff --git a/code/modules/shieldgen/emergency_shield.dm b/code/modules/shieldgen/emergency_shield.dm index 2a4b910ce93..12522834663 100644 --- a/code/modules/shieldgen/emergency_shield.dm +++ b/code/modules/shieldgen/emergency_shield.dm @@ -95,7 +95,7 @@ //This seemed to be the best sound for hitting a force field. playsound(src.loc, 'sound/effects/EMPulse.ogg', 100, 1) check_failure() - //The shield becomes dense to absorb the blow.. purely asthetic. + //The shield becomes dense to absorb the blow. Purely asthetic. set_opacity(1) spawn(20) if(!QDELETED(src)) diff --git a/code/modules/spells/aoe_turf/conjure/force_portal.dm b/code/modules/spells/aoe_turf/conjure/force_portal.dm index 7a4483435cf..baee15fed72 100644 --- a/code/modules/spells/aoe_turf/conjure/force_portal.dm +++ b/code/modules/spells/aoe_turf/conjure/force_portal.dm @@ -1,6 +1,6 @@ /spell/aoe_turf/conjure/force_portal name = "Force Portal" - desc = "Create a portal that sucks in anything that touches it and then shoots it all out at the end.." + desc = "Create a portal that sucks in anything that touches it and then shoots it all out at the end." school = "conjuration" feedback = "FP" summon_type = list(/obj/effect/force_portal) diff --git a/code/modules/synthesized_instruments/song.dm b/code/modules/synthesized_instruments/song.dm index 090324ac2af..b9afb626984 100644 --- a/code/modules/synthesized_instruments/song.dm +++ b/code/modules/synthesized_instruments/song.dm @@ -48,7 +48,7 @@ var/note_num = delta1+delta2+global.musical_config.nn2no[note] if (note_num < 0 || note_num > 127) - CRASH("play_synthesized note failed because of 0..127 condition, [note], [acc], [oct]") + CRASH("play_synthesized note failed because of 0-127 condition, [note], [acc], [oct]") var/datum/sample_pair/pair = src.instrument_data.sample_map[global.musical_config.n2t(note_num)] #define Q 0.083 // 1/12 diff --git a/maps/away/unishi/unishi.dm b/maps/away/unishi/unishi.dm index 6dd30665b71..1f7f05fce38 100644 --- a/maps/away/unishi/unishi.dm +++ b/maps/away/unishi/unishi.dm @@ -28,7 +28,7 @@ /datum/map_template/ruin/away_site/unishi name = "University Ship" - description = "CTI research ship.." + description = "CTI research ship." suffixes = list("unishi/unishi-1.dmm", "unishi/unishi-2.dmm", "unishi/unishi-3.dmm") cost = 2 area_usage_test_exempted_root_areas = list(/area/unishi) diff --git a/mods/content/psionics/system/psionics/faculties/coercion.dm b/mods/content/psionics/system/psionics/faculties/coercion.dm index 4dfc9d42a22..b21fba16e60 100644 --- a/mods/content/psionics/system/psionics/faculties/coercion.dm +++ b/mods/content/psionics/system/psionics/faculties/coercion.dm @@ -233,7 +233,7 @@ if(.) var/datum/ability_handler/psionics/psi = user?.get_ability_handler(/datum/ability_handler/psionics) user.visible_message(SPAN_WARNING("\The [user] holds the head of \the [target] in both hands...")) - to_chat(user, SPAN_NOTICE("You probe \the [target]'s mind for various ailments..")) + to_chat(user, SPAN_NOTICE("You probe \the [target]'s mind for various ailments...")) to_chat(target, SPAN_WARNING("Your mind is being cleansed of ailments by \the [user].")) if(!do_after(user, (target.stat == CONSCIOUS ? 50 : 25), target, 0, 1)) psi?.backblast(rand(5,10)) diff --git a/mods/content/xenobiology/circuit.dm b/mods/content/xenobiology/circuit.dm index 2ec922fceb3..3c98e9a48d1 100644 --- a/mods/content/xenobiology/circuit.dm +++ b/mods/content/xenobiology/circuit.dm @@ -23,7 +23,7 @@ var/mob/living/slime/T = get_pin_data_as_type(IC_INPUT, 1, /mob/living/slime) if(!isslime(T)) //Invalid input return - if(T in view(get_turf(src))) // Like medbot's analyzer it can be used in range.. + if(T in view(get_turf(src))) // Like the medbot's analyzer it can be used at range. var/decl/slime_colour/slime_data = GET_DECL(T.slime_type) set_pin_data(IC_OUTPUT, 1, slime_data.name) diff --git a/nano/templates/computer_fabricator.tmpl b/nano/templates/computer_fabricator.tmpl index ca5e4c0769f..d8bfb558b7c 100644 --- a/nano/templates/computer_fabricator.tmpl +++ b/nano/templates/computer_fabricator.tmpl @@ -66,7 +66,7 @@ {{else data.state == 2}}

    Step 3: Payment

    - Your device is now ready for fabrication..
    + Your device is now ready for fabrication.
    Please swipe your identification card to finish purchase.
    Total price: {{:data.totalprice}} {{else data.state == 3}} From e0d045c8ea9077243d7976b8a328fb69ccdc1dd6 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 23 Jun 2024 17:43:05 -0400 Subject: [PATCH 03/38] Modernize window attackby interactions --- code/game/objects/structures/window.dm | 192 +++++++++++++++---------- 1 file changed, 116 insertions(+), 76 deletions(-) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 3d5f43c2807..8fd670a6ea2 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -19,7 +19,10 @@ max_health = 100 var/damage_per_fire_tick = 2 // Amount of damage per fire tick. Regular windows are not fireproof so they might as well break quickly. - var/construction_state = 2 + var/const/CONSTRUCTION_STATE_NO_FRAME = 0 + var/const/CONSTRUCTION_STATE_IN_FRAME = 1 + var/const/CONSTRUCTION_STATE_FASTENED = 2 + var/construction_state = CONSTRUCTION_STATE_FASTENED var/id var/polarized = 0 var/basestate = "window" @@ -173,60 +176,90 @@ playsound(loc, 'sound/effects/Glasshit.ogg', 50, 1) return TRUE -/obj/structure/window/attackby(obj/item/W, mob/user) - if(!istype(W)) return//I really wish I did not need this - - if(W.item_flags & ITEM_FLAG_NO_BLUDGEON) return - - if(IS_SCREWDRIVER(W)) - if(reinf_material && construction_state >= 1) - construction_state = 3 - construction_state +/obj/structure/window/handle_default_screwdriver_attackby(mob/user, obj/item/screwdriver) + var/tool_sound = screwdriver.get_tool_sound(TOOL_SCREWDRIVER) || 'sound/items/Screwdriver.ogg' + if(reinf_material) // reinforced windows have construction states + if(construction_state >= CONSTRUCTION_STATE_IN_FRAME) // if the window is in the frame + playsound(loc, tool_sound, 75, 1) + switch(construction_state) + if(CONSTRUCTION_STATE_IN_FRAME) + construction_state = CONSTRUCTION_STATE_FASTENED + to_chat(user, SPAN_NOTICE("You have fastened the window to the frame.")) + if(CONSTRUCTION_STATE_FASTENED) + construction_state = CONSTRUCTION_STATE_IN_FRAME + to_chat(user, SPAN_NOTICE("You have unfastened the window from the frame.")) update_nearby_icons() - playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1) - to_chat(user, (construction_state == 1 ? SPAN_NOTICE("You have unfastened the window from the frame.") : SPAN_NOTICE("You have fastened the window to the frame."))) - else if(reinf_material && construction_state == 0) - set_anchored(!anchored) - playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1) + return TRUE + else // if unanchored + set_anchored(!anchored) // sets construction_state for us + playsound(loc, tool_sound, 75, 1) to_chat(user, (anchored ? SPAN_NOTICE("You have fastened the frame to the floor.") : SPAN_NOTICE("You have unfastened the frame from the floor."))) - else if(!reinf_material) - set_anchored(!anchored) - playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1) - to_chat(user, (anchored ? SPAN_NOTICE("You have fastened the window to the floor.") : SPAN_NOTICE("You have unfastened the window."))) - else if(IS_CROWBAR(W) && reinf_material && construction_state <= 1) - construction_state = 1 - construction_state - playsound(loc, 'sound/items/Crowbar.ogg', 75, 1) - to_chat(user, (construction_state ? SPAN_NOTICE("You have pried the window into the frame.") : SPAN_NOTICE("You have pried the window out of the frame."))) - else if(IS_WRENCH(W) && !anchored && (!construction_state || !reinf_material)) - if(!material) - to_chat(user, SPAN_NOTICE("You're not sure how to dismantle \the [src] properly.")) - else - playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) - visible_message(SPAN_NOTICE("[user] dismantles \the [src].")) - dismantle_structure(user) - else if(IS_COIL(W) && is_fulltile()) - if (polarized) - to_chat(user, SPAN_WARNING("\The [src] is already polarized.")) - return - var/obj/item/stack/cable_coil/C = W - if (C.use(1)) - playsound(src.loc, 'sound/effects/sparks1.ogg', 75, 1) - polarized = TRUE - to_chat(user, SPAN_NOTICE("You wire and polarize \the [src].")) - else if (IS_WIRECUTTER(W)) - if (!polarized) - to_chat(user, SPAN_WARNING("\The [src] is not polarized.")) - return - new /obj/item/stack/cable_coil(get_turf(user), 1) - if (opacity) - toggle() - polarized = FALSE - id = null - playsound(loc, 'sound/items/Wirecutter.ogg', 75, 1) - to_chat(user, SPAN_NOTICE("You cut the wiring and remove the polarization from \the [src].")) - else if(IS_MULTITOOL(W)) + return TRUE + else // basic windows can only be anchored or unanchored + set_anchored(!anchored) + playsound(loc, tool_sound, 75, 1) + to_chat(user, (anchored ? SPAN_NOTICE("You have fastened the window to the floor.") : SPAN_NOTICE("You have unfastened the window."))) + return TRUE + +/obj/structure/window/handle_default_crowbar_attackby(mob/user, obj/item/crowbar) + if(!reinf_material || !anchored || construction_state > CONSTRUCTION_STATE_IN_FRAME) + return FALSE // ineligible, allow other interactions to proceed + switch(construction_state) + if(CONSTRUCTION_STATE_NO_FRAME) // pry the window into the frame + construction_state = CONSTRUCTION_STATE_IN_FRAME + to_chat(user, SPAN_NOTICE("You have pried the window into the frame.")) + if(CONSTRUCTION_STATE_IN_FRAME) + construction_state = CONSTRUCTION_STATE_NO_FRAME + to_chat(user, SPAN_NOTICE("You have pried the window out of the frame.")) + playsound(loc, crowbar.get_tool_sound(TOOL_CROWBAR) || 'sound/items/Crowbar.ogg', 75, 1) + return TRUE + +/obj/structure/window/handle_default_wrench_attackby(mob/user, obj/item/wrench) + if(anchored || (reinf_material && construction_state > CONSTRUCTION_STATE_NO_FRAME)) + return FALSE // ineligible, allow other interactions to proceed + if(!material) // is this even necessary now? indestructible admin level window types maybe? + to_chat(user, SPAN_NOTICE("You're not sure how to dismantle \the [src] properly.")) + return TRUE // prevent other interactions + playsound(loc, wrench.get_tool_sound(TOOL_WRENCH) || 'sound/items/Ratchet.ogg', 75, 1) + visible_message(SPAN_NOTICE("[user] dismantles \the [src].")) + dismantle_structure(user) + return TRUE + +/obj/structure/window/handle_default_cable_attackby(mob/user, obj/item/stack/cable_coil/coil) + if(!is_fulltile()) + return FALSE // ineligible, allow other interactions to proceed + if(polarized) + to_chat(user, SPAN_WARNING("\The [src] is already polarized.")) + return TRUE // prevent further interactions + if(coil.use(1)) + playsound(loc, 'sound/effects/sparks1.ogg', 75, 1) + polarized = TRUE + to_chat(user, SPAN_NOTICE("You wire and polarize \the [src].")) + else + to_chat(user, SPAN_WARNING("You need at least one length of [coil.plural_name] to polarize \the [src]!")) + return TRUE + +/obj/structure/window/handle_default_wirecutter_attackby(mob/user, obj/item/wirecutters/wirecutters) + if (!polarized) + to_chat(user, SPAN_WARNING("\The [src] is not polarized.")) + return TRUE // prevent other interactions + var/obj/item/stack/cable_coil/product = new /obj/item/stack/cable_coil(get_turf(user), 1) + if(product.add_to_stacks(user, TRUE)) + user.put_in_hands(product) + if (opacity) + toggle() // must toggle off BEFORE unsetting the polarization var + polarized = FALSE + id = null + playsound(loc, wirecutters.get_tool_sound(TOOL_WIRECUTTERS) || 'sound/items/Wirecutter.ogg', 75, 1) + to_chat(user, SPAN_NOTICE("You cut the wiring and remove the polarization from \the [src].")) + return TRUE + +/obj/structure/window/attackby(obj/item/W, mob/user) + // bespoke interactions not handled by the prior procs + if(IS_MULTITOOL(W)) if (!polarized) to_chat(user, SPAN_WARNING("\The [src] is not polarized.")) - return + return TRUE if (anchored) playsound(loc, 'sound/effects/pop.ogg', 75, 1) to_chat(user, SPAN_NOTICE("You toggle \the [src]'s tinting.")) @@ -234,33 +267,40 @@ else var/response = input(user, "New Window ID:", name, id) as null | text if (isnull(response) || user.incapacitated() || !user.Adjacent(src) || user.get_active_held_item() != W) - return + return TRUE id = sanitize_safe(response, MAX_NAME_LEN) to_chat(user, SPAN_NOTICE("The new ID of \the [src] is [id].")) - return + return TRUE else if(istype(W, /obj/item/gun/energy/plasmacutter) && anchored) var/obj/item/gun/energy/plasmacutter/cutter = W if(!cutter.slice(user)) - return + return TRUE // failed to finish or otherwise failed, prevent further interactions playsound(src, 'sound/items/Welder.ogg', 80, 1) visible_message(SPAN_NOTICE("[user] has started slicing through the window's frame!")) - if(do_after(user,20,src)) + if(do_after(user, 2 SECONDS, src)) visible_message(SPAN_WARNING("[user] has sliced through the window's frame!")) playsound(src, 'sound/items/Welder.ogg', 80, 1) - construction_state = 0 - set_anchored(0) - else if (!istype(W, /obj/item/paint_sprayer)) - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - if(W.atom_damage_type == BRUTE || W.atom_damage_type == BURN) - user.do_attack_animation(src) - hit(W.force) - if(current_health <= 7) - set_anchored(FALSE) - step(src, get_dir(user, src)) - else - playsound(loc, 'sound/effects/Glasshit.ogg', 75, 1) - ..() - return + set_anchored(FALSE) + if (istype(W, /obj/item/paint_sprayer)) + return FALSE // allow afterattack to run + return ..() // handle generic interactions, bashing, etc + +/obj/structure/window/bash(obj/item/weapon, mob/user) + if(isliving(user) && user.a_intent == I_HELP) + return FALSE + if(weapon.item_flags & ITEM_FLAG_NO_BLUDGEON) + return FALSE + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + // physical damage types that can impart force; swinging a bat or energy sword + if(weapon.atom_damage_type == BRUTE || weapon.atom_damage_type == BURN) + user.do_attack_animation(src) + hit(weapon.force) + if(current_health <= 7) + set_anchored(FALSE) + step(src, get_dir(user, src)) + else + playsound(loc, 'sound/effects/Glasshit.ogg', 75, 1) + return TRUE // bash successful // TODO: generalize to matter list and parts_type. /obj/structure/window/create_dismantled_products(turf/T) @@ -302,6 +342,7 @@ return TRUE /obj/structure/window/proc/hit(var/damage, var/sound_effect = 1) + // TODO: use reinf_material properties, paper reinforcement should be worse than plasteel reinforcement if(reinf_material) damage *= 0.5 take_damage(damage) @@ -352,11 +393,11 @@ to_chat(user, SPAN_NOTICE("It is reinforced with the [reinf_material.solid_name] lattice.")) if (reinf_material) switch (construction_state) - if (0) + if (CONSTRUCTION_STATE_NO_FRAME) to_chat(user, SPAN_WARNING("The window is not in the frame.")) - if (1) + if (CONSTRUCTION_STATE_IN_FRAME) to_chat(user, SPAN_WARNING("The window is pried into the frame but not yet fastened.")) - if (2) + if (CONSTRUCTION_STATE_FASTENED) to_chat(user, SPAN_NOTICE("The window is fastened to the frame.")) if (anchored) to_chat(user, SPAN_NOTICE("It is fastened to \the [get_turf(src)].")) @@ -441,7 +482,7 @@ icon_state = "window_full" /obj/structure/window/basic/full/polarized - polarized = 1 + polarized = TRUE /obj/structure/window/borosilicate name = "borosilicate window" @@ -494,7 +535,7 @@ name = "electrochromic window" desc = "Adjusts its tint with voltage. Might take a few good hits to shatter it." basestate = "rwindow" - polarized = 1 + polarized = TRUE /obj/structure/window/reinforced/polarized/full dir = NORTHEAST @@ -600,8 +641,7 @@ if (ST.use(required_amount)) var/obj/structure/window/WD = new(loc, ST.material.type, ST.reinf_material?.type, dir_to_set, FALSE) to_chat(user, SPAN_NOTICE("You place [WD].")) - WD.construction_state = 0 - WD.set_anchored(FALSE) + WD.set_anchored(FALSE) // handles setting construction state for us else to_chat(user, SPAN_NOTICE("You do not have enough sheets.")) return From 3bb37de10f6d3f32bedf5fb2865fe129fcbc61fb Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 23 Jun 2024 17:52:43 -0400 Subject: [PATCH 04/38] Clean up holowindow attackby override --- code/modules/holodeck/HolodeckObjects.dm | 38 +++++++++--------------- 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm index d92bed53478..14dcdbae837 100644 --- a/code/modules/holodeck/HolodeckObjects.dm +++ b/code/modules/holodeck/HolodeckObjects.dm @@ -144,27 +144,15 @@ name = "boxing gloves" desc = "Because you really needed another excuse to punch your crewmates." -/obj/structure/window/holowindow/full +/obj/structure/window/reinforced/holowindow/full dir = NORTHEAST - icon_state = "window_full" + icon_state = "rwindow_full" -/obj/structure/window/reinforced/holowindow/attackby(obj/item/W, mob/user) - - if(!istype(W) || W.item_flags & ITEM_FLAG_NO_BLUDGEON) return - - if(IS_SCREWDRIVER(W) || IS_CROWBAR(W) || IS_WRENCH(W)) - to_chat(user, ("It's a holowindow, you can't dismantle it!")) - else - if(W.atom_damage_type == BRUTE || W.atom_damage_type == BURN) - hit(W.force) - if(current_health <= 7) - anchored = FALSE - update_nearby_icons() - step(src, get_dir(user, src)) - else - playsound(loc, 'sound/effects/Glasshit.ogg', 75, 1) - ..() - return +/obj/structure/window/reinforced/holowindow/attackby(obj/item/weapon, mob/user) + if(IS_SCREWDRIVER(weapon) || IS_CROWBAR(weapon) || IS_WRENCH(weapon)) + to_chat(user, SPAN_NOTICE("It's a holowindow, you can't dismantle it!")) + return TRUE + return bash(weapon, user) /obj/structure/window/reinforced/holowindow/shatter(var/display_message = 1) playsound(src, "shatter", 70, 1) @@ -173,6 +161,7 @@ qdel(src) return +// This subtype is deleted when a ready button in the same area is pressed. /obj/structure/window/reinforced/holowindow/disappearing /obj/machinery/door/window/holowindoor/attackby(obj/item/I, mob/user) @@ -199,14 +188,15 @@ close() else if (src.density) - flick(text("[]deny", src.base_state), src) + flick("[base_state]deny", src) -/obj/machinery/door/window/holowindoor/shatter(var/display_message = 1) - src.set_density(0) - playsound(src, "shatter", 70, 1) +/obj/machinery/door/window/holowindoor/shatter(var/display_message = TRUE) + set_density(FALSE) + playsound(loc, "shatter", 70, TRUE) if(display_message) visible_message("[src] fades away as it shatters!") - qdel(src) + animate(src, 0.5 SECONDS, alpha = 0) + QDEL_IN_CLIENT_TIME(src, 0.5 SECONDS) /obj/structure/bed/holobed tool_interaction_flags = 0 From aaccece7a9b556dc174c382504853b08c941ab53 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 23 Jun 2024 18:49:37 -0400 Subject: [PATCH 05/38] Remove overly-restrictive Click-level needs_attack_dexterity check --- code/_onclick/click.dm | 10 ++++------ code/_onclick/cyborg.dm | 5 ----- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index d8cd03cffa3..83b61932630 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -114,15 +114,13 @@ //Atoms on your person // A is your location but is not a turf; or is on you (backpack); or is on something on you (box in backpack); sdepth is needed here because contents depth does not equate inventory storage depth. var/sdepth = A.storage_depth(src) - var/check_dexterity_val = A.storage ? DEXTERITY_NONE : (istype(holding) ? holding.needs_attack_dexterity : DEXTERITY_WIELD_ITEM) - var/can_wield_item = holding && (!check_dexterity_val || check_dexterity(check_dexterity_val)) if((!isturf(A) && A == loc) || (sdepth != -1 && sdepth <= 1)) - if(can_wield_item) + if(holding) var/resolved = holding.resolve_attackby(A, src, params) if(!resolved && A && holding) holding.afterattack(A, src, 1, params) // 1 indicates adjacency setClickCooldown(DEFAULT_QUICK_COOLDOWN) - else if(!holding) + else if(ismob(A)) // No instant mob attacking setClickCooldown(DEFAULT_QUICK_COOLDOWN) UnarmedAttack(A, TRUE) @@ -138,13 +136,13 @@ sdepth = A.storage_depth_turf() if(isturf(A) || isturf(A.loc) || (sdepth != -1 && sdepth <= 1)) if(A.Adjacent(src)) // see adjacent.dm - if(can_wield_item) + if(holding) // Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example) var/resolved = holding.resolve_attackby(A,src, params) if(!resolved && A && holding) holding.afterattack(A, src, 1, params) // 1: clicking something Adjacent setClickCooldown(DEFAULT_QUICK_COOLDOWN) - else if(!holding) + else if(ismob(A)) // No instant mob attacking setClickCooldown(DEFAULT_QUICK_COOLDOWN) UnarmedAttack(A, TRUE) diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index 066fe948bfd..535604b5e5d 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -71,11 +71,6 @@ holding.attack_self(src) return - var/check_dexterity_val = A.storage ? DEXTERITY_NONE : (istype(holding) ? holding.needs_attack_dexterity : DEXTERITY_WIELD_ITEM) - var/can_wield_item = (!check_dexterity_val || check_dexterity(check_dexterity_val)) - if(!can_wield_item) - return - if(A == loc || (A in loc) || (A in contents)) // No adjacency checks var/resolved = holding.resolve_attackby(A, src, params) From 54b31d5a20138931a1505e0d6d10a4ae34916ecb Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 23 Jun 2024 18:47:30 -0400 Subject: [PATCH 06/38] Make lockable extension respect dexterity --- code/datums/extensions/lockable.dm | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/code/datums/extensions/lockable.dm b/code/datums/extensions/lockable.dm index 797a47c8b14..d3c9aee3cb2 100644 --- a/code/datums/extensions/lockable.dm +++ b/code/datums/extensions/lockable.dm @@ -92,6 +92,8 @@ Process keypresses coming from the nanoUI. */ /datum/extension/lockable/proc/pressed_key(key_char, mob/user) + if(!user.check_dexterity(DEXTERITY_KEYBOARDS)) + return // Always clear error when pressing a button. clear_error() @@ -318,22 +320,25 @@ /** Item attack handler for interactions with the host. */ -/datum/extension/lockable/proc/attackby(obj/item/W, mob/user) +/datum/extension/lockable/proc/attackby(obj/item/used_item, mob/user) if(!locked) - return + return FALSE + + if(!used_item.user_can_wield(user)) + return TRUE //TODO: This probably should be handled in a better way. - if(!is_digital_lock && istype(W, /obj/item/energy_blade)) - var/obj/item/energy_blade/blade = W + if(!is_digital_lock && istype(used_item, /obj/item/energy_blade)) + var/obj/item/energy_blade/blade = used_item if(blade.is_special_cutting_tool() && emag_act(INFINITY, user, "You slice through the lock of \the [holder].")) var/obj/item/A = holder spark_at(A.loc, amount=5) playsound(A.loc, 'sound/weapons/blade1.ogg', 50, 1) return TRUE - if(IS_SCREWDRIVER(W)) + if(IS_SCREWDRIVER(used_item)) if(!opening_panel) - var/obj/item/screwdriver/S = W + var/obj/item/screwdriver/S = used_item opening_panel = TRUE //Make sure we only have one user/attempt to opens the panel at a time. if( S.do_tool_interaction( @@ -350,8 +355,8 @@ toggle_panel(user) return TRUE - if(IS_MULTITOOL(W)) - try_hack(W, user) + if(IS_MULTITOOL(used_item)) + try_hack(used_item, user) return TRUE /** From 0068247d082805ed09c81e99896aa7f29bb01e6f Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 23 Jun 2024 18:57:11 -0400 Subject: [PATCH 07/38] Add dexterity checks to bash() --- code/_onclick/item_attack.dm | 8 +++-- .../_machines_base/machinery_damage.dm | 2 +- code/game/machinery/doors/_door.dm | 30 +++++++++++-------- code/game/machinery/doors/airlock.dm | 12 ++++---- code/game/machinery/doors/windowdoor.dm | 8 ++--- code/game/objects/structures/window.dm | 2 ++ code/modules/power/apc.dm | 22 ++++++++------ 7 files changed, 49 insertions(+), 35 deletions(-) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index c99039b23e7..f4cbf1cd350 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -44,12 +44,14 @@ avoid code duplication. This includes items that may sometimes act as a standard if(!.) return bash(W,user) -/atom/movable/proc/bash(obj/item/W, mob/user) +/atom/movable/proc/bash(obj/item/weapon, mob/user) if(isliving(user) && user.a_intent == I_HELP) return FALSE - if(W.item_flags & ITEM_FLAG_NO_BLUDGEON) + if(!weapon.user_can_wield(user)) return FALSE - visible_message("[src] has been hit by [user] with [W].") + if(weapon.item_flags & ITEM_FLAG_NO_BLUDGEON) + return FALSE + visible_message(SPAN_DANGER("[src] has been hit by [user] with [weapon].")) return TRUE /mob/living/attackby(obj/item/I, mob/user) diff --git a/code/game/machinery/_machines_base/machinery_damage.dm b/code/game/machinery/_machines_base/machinery_damage.dm index 96b81329d5a..2ecf6cd43e8 100644 --- a/code/game/machinery/_machines_base/machinery_damage.dm +++ b/code/game/machinery/_machines_base/machinery_damage.dm @@ -83,7 +83,7 @@ take_damage(P.damage, P.atom_damage_type) /obj/machinery/bash(obj/item/W, mob/user) - if(!istype(W) || W.force <= 5 || (W.item_flags & ITEM_FLAG_NO_BLUDGEON)) + if(!istype(W) || W.force <= 5) return FALSE . = ..() if(.) diff --git a/code/game/machinery/doors/_door.dm b/code/game/machinery/doors/_door.dm index 3af28af67b7..7d26dbd2645 100644 --- a/code/game/machinery/doors/_door.dm +++ b/code/game/machinery/doors/_door.dm @@ -330,18 +330,24 @@ emagged = TRUE return 1 -/obj/machinery/door/bash(obj/item/I, mob/user) - if(density && user.a_intent == I_HURT && !(I.item_flags & ITEM_FLAG_NO_BLUDGEON)) - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - user.do_attack_animation(src) - if(I.force < min_force) - user.visible_message("\The [user] hits \the [src] with \the [I] with no visible effect.") - else - user.visible_message("\The [user] forcefully strikes \the [src] with \the [I]!") - playsound(src.loc, hitsound, 100, 1) - take_damage(I.force, I.atom_damage_type) - return TRUE - return FALSE +/obj/machinery/door/bash(obj/item/weapon, mob/user) + if(isliving(user) && user.a_intent != I_HURT) + return FALSE + if(!weapon.user_can_wield(user)) + return FALSE + if(weapon.item_flags & ITEM_FLAG_NO_BLUDGEON) + return FALSE + if(!density) + return FALSE + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + user.do_attack_animation(src) + if(weapon.force < min_force) + user.visible_message("\The [user] hits \the [src] with \the [weapon] with no visible effect.") + else + user.visible_message("\The [user] forcefully strikes \the [src] with \the [weapon]!") + playsound(src.loc, hitsound, 100, 1) + take_damage(weapon.force, weapon.atom_damage_type) + return TRUE /obj/machinery/door/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) if(!current_health) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 7bb1bb09480..891c8b3c96b 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -813,20 +813,20 @@ About the new airlock wires panel: else return ..() -/obj/machinery/door/airlock/bash(obj/item/I, mob/user) - //if door is unbroken, hit with fire axe using harm intent - if (istype(I, /obj/item/twohanded/fireaxe) && !(stat & BROKEN) && user.a_intent == I_HURT) +/obj/machinery/door/airlock/bash(obj/item/weapon, mob/user) + //if door is unbroken, hit with fire axe using harm intent + if (istype(weapon, /obj/item/twohanded/fireaxe) && !(stat & BROKEN) && user.a_intent == I_HURT && weapon.user_can_wield(user)) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - var/obj/item/twohanded/fireaxe/F = I + var/obj/item/twohanded/fireaxe/F = weapon if (F.wielded) playsound(src, 'sound/weapons/smash.ogg', 100, 1) current_health -= F.force_wielded * 2 if(current_health <= 0) - user.visible_message(SPAN_DANGER("[user] smashes \the [I] into the airlock's control panel! It explodes in a shower of sparks!"), SPAN_DANGER("You smash \the [I] into the airlock's control panel! It explodes in a shower of sparks!")) + user.visible_message(SPAN_DANGER("[user] smashes \the [weapon] into the airlock's control panel! It explodes in a shower of sparks!"), SPAN_DANGER("You smash \the [weapon] into the airlock's control panel! It explodes in a shower of sparks!")) current_health = 0 set_broken(TRUE) else - user.visible_message(SPAN_DANGER("[user] smashes \the [I] into the airlock's control panel!")) + user.visible_message(SPAN_DANGER("[user] smashes \the [weapon] into the airlock's control panel!")) return TRUE return ..() diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 66171dc8f41..722d253c526 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -197,15 +197,15 @@ else if (density) flick("[base_state]deny", src) -/obj/machinery/door/window/bash(obj/item/I, mob/user) +/obj/machinery/door/window/bash(obj/item/weapon, mob/user) //Emags and energy swords? You may pass. - if (istype(I, /obj/item/energy_blade)) - var/obj/item/energy_blade/blade = I + if (weapon.user_can_wield(user) && istype(weapon, /obj/item/energy_blade)) + var/obj/item/energy_blade/blade = weapon if(blade.is_special_cutting_tool() && emag_act(10, user)) spark_at(loc, amount=5) playsound(loc, 'sound/weapons/blade1.ogg', 50, 1) visible_message(SPAN_WARNING("The glass door was sliced open by [user]!")) - return 1 + return TRUE return ..() /obj/machinery/door/window/brigdoor diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 8fd670a6ea2..21e087a71d7 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -288,6 +288,8 @@ /obj/structure/window/bash(obj/item/weapon, mob/user) if(isliving(user) && user.a_intent == I_HELP) return FALSE + if(!weapon.user_can_wield(user)) + return FALSE if(weapon.item_flags & ITEM_FLAG_NO_BLUDGEON) return FALSE user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index a7756f7e6d0..6ed25f22696 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -443,20 +443,24 @@ var/global/list/all_apcs = list() return wires.Interact(user) return ..() -/obj/machinery/power/apc/bash(obj/item/W, mob/user) - if (!(user.a_intent == I_HURT) || (W.item_flags & ITEM_FLAG_NO_BLUDGEON)) +/obj/machinery/power/apc/bash(obj/item/used_item, mob/user) + if (!(user.a_intent == I_HURT) || (used_item.item_flags & ITEM_FLAG_NO_BLUDGEON)) return - if(!panel_open && W.force >= 5 && W.w_class >= ITEM_SIZE_NORMAL) + if(!used_item.user_can_wield(user)) + return FALSE + + . = ..() + if(. && !panel_open && used_item.w_class >= ITEM_SIZE_NORMAL) if (((stat & BROKEN) || (hacker && !hacker.hacked_apcs_hidden)) && prob(20)) - playsound(get_turf(src), 'sound/weapons/smash.ogg', 75, 1) + playsound(get_turf(src), 'sound/weapons/smash.ogg', 75, TRUE) if(force_open_panel(user) == MCS_CHANGE) cover_removed = TRUE - user.visible_message("The APC cover was knocked down with the [W.name] by [user.name]!", \ - "You knock down the APC cover with your [W.name]!", \ - "You hear a bang.") - return TRUE - return ..() + user.visible_message( + SPAN_DANGER("\The [user] knocks open the APC cover with \the [used_item]!"), + SPAN_DANGER("You knock down the APC cover with your [used_item.name]!"), + "You hear a bang." + ) // attack with hand - remove cell (if cover open) or interact with the APC From 8f5051c3e6d49903a8969f183d13f9fe8f4aa8bc Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 23 Jun 2024 19:50:57 -0400 Subject: [PATCH 08/38] Add dexterity checks to attackby overrides --- code/_onclick/item_attack.dm | 13 ++- .../inventory_gripper_subtypes.dm | 2 +- code/game/machinery/alarm.dm | 10 ++- code/game/objects/items/__item.dm | 29 +++--- code/game/objects/objs.dm | 12 +-- .../structures/_structure_construction.dm | 50 +++++------ .../crates_lockers/closets/__closet.dm | 89 ++++++++++--------- code/game/objects/structures/doors/_door.dm | 15 ++-- .../game/objects/structures/structure_lock.dm | 20 +++-- code/modules/butchery/_butchery.dm | 3 + code/modules/paperwork/papershredder.dm | 15 ++-- .../projectiles/guns/energy/special.dm | 6 +- code/modules/reagents/reagent_containers.dm | 29 +++--- code/modules/surgery/_surgery.dm | 4 + 14 files changed, 166 insertions(+), 131 deletions(-) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index f4cbf1cd350..b326cbc2b0f 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -54,14 +54,14 @@ avoid code duplication. This includes items that may sometimes act as a standard visible_message(SPAN_DANGER("[src] has been hit by [user] with [weapon].")) return TRUE -/mob/living/attackby(obj/item/I, mob/user) +/mob/living/attackby(obj/item/used_item, mob/user) if(!ismob(user)) return TRUE - if(can_operate(src,user) != OPERATE_DENY && I.do_surgery(src,user)) //Surgery + if(can_operate(src, user) != OPERATE_DENY && used_item.do_surgery(src,user)) //Surgery return TRUE - if(try_butcher_in_place(user, I)) + if(try_butcher_in_place(user, used_item)) return TRUE - return I.use_on_mob(src, user) + return used_item.use_on_mob(src, user) /mob/living/human/attackby(obj/item/I, mob/user) @@ -98,6 +98,11 @@ avoid code duplication. This includes items that may sometimes act as a standard //I would prefer to rename this attack_as_weapon(), but that would involve touching hundreds of files. /obj/item/proc/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) + // TODO: revisit if this should be a silent failure/parent call instead, for mob-level storage interactions? + // like a horse with a saddlebag or something + if(!user_can_wield(user)) + return TRUE // skip other interactions + if(squash_item()) return TRUE diff --git a/code/datums/inventory_slots/inventory_gripper_subtypes.dm b/code/datums/inventory_slots/inventory_gripper_subtypes.dm index 74d766ab4eb..3e72420e047 100644 --- a/code/datums/inventory_slots/inventory_gripper_subtypes.dm +++ b/code/datums/inventory_slots/inventory_gripper_subtypes.dm @@ -6,7 +6,7 @@ overlay_slot = BP_MOUTH ui_label = "M" hand_sort_priority = 3 - dexterity = DEXTERITY_SIMPLE_MACHINES | DEXTERITY_HOLD_ITEM | DEXTERITY_EQUIP_ITEM | DEXTERITY_KEYBOARDS | DEXTERITY_TOUCHSCREENS + dexterity = DEXTERITY_SIMPLE_MACHINES | DEXTERITY_GRAPPLE | DEXTERITY_HOLD_ITEM | DEXTERITY_EQUIP_ITEM | DEXTERITY_KEYBOARDS | DEXTERITY_TOUCHSCREENS /datum/inventory_slot/gripper/mouth/simple requires_organ_tag = null diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 890d9653e03..411990a7465 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -779,14 +779,16 @@ apply_danger_level(danger_level) update_icon() -/obj/machinery/alarm/attackby(obj/item/W, mob/user) +/obj/machinery/alarm/attackby(obj/item/used_item, mob/user) if(!(stat & (BROKEN|NOPOWER))) - if (istype(W, /obj/item/card/id) || istype(W, /obj/item/modular_computer))// trying to unlock the interface with an ID card + if (istype(used_item, /obj/item/card/id) || istype(used_item, /obj/item/modular_computer))// trying to unlock the interface with an ID card + if(!used_item.user_can_wield(user)) + return TRUE if(allowed(user) && !wires.IsIndexCut(AALARM_WIRE_IDSCAN)) locked = !locked - to_chat(user, "You [ locked ? "lock" : "unlock"] the Air Alarm interface.") + to_chat(user, SPAN_NOTICE("You [ locked ? "lock" : "unlock"] the Air Alarm interface.")) else - to_chat(user, "Access denied.") + to_chat(user, SPAN_WARNING("Access denied.")) return TRUE return ..() diff --git a/code/game/objects/items/__item.dm b/code/game/objects/items/__item.dm index 7618ae80ae3..d529f6d9b30 100644 --- a/code/game/objects/items/__item.dm +++ b/code/game/objects/items/__item.dm @@ -521,26 +521,31 @@ return TRUE return FALSE -/obj/item/attackby(obj/item/W, mob/user) +/obj/item/proc/user_can_wield(mob/user, silent = FALSE) + return !needs_attack_dexterity || user.check_dexterity(needs_attack_dexterity, silent = silent) - if(try_slapcrafting(W, user)) +/obj/item/attackby(obj/item/used_item, mob/user) + // if can_wield is false we still need to call parent for storage objects to work properly + var/can_wield = user_can_wield(user, silent = TRUE) + + if(can_wield && try_slapcrafting(used_item, user)) return TRUE - if(W.storage?.use_to_pickup) + if(used_item.storage?.use_to_pickup) //Mode is set to collect all items - if(W.storage.collection_mode && isturf(src.loc)) - W.storage.gather_all(src.loc, user) + if(used_item.storage.collection_mode && isturf(src.loc)) + used_item.storage.gather_all(src.loc, user) return TRUE - if(W.storage.can_be_inserted(src, user)) - W.storage.handle_item_insertion(user, src) + if(used_item.storage.can_be_inserted(src, user)) + used_item.storage.handle_item_insertion(user, src) return TRUE - if(has_extension(src, /datum/extension/loaded_cell)) + if(can_wield && has_extension(src, /datum/extension/loaded_cell)) var/datum/extension/loaded_cell/cell_loaded = get_extension(src, /datum/extension/loaded_cell) - if(cell_loaded.has_tool_unload_interaction(W)) - return cell_loaded.try_unload(user, W) - else if(istype(W, /obj/item/cell)) - return cell_loaded.try_load(user, W) + if(cell_loaded.has_tool_unload_interaction(used_item)) + return cell_loaded.try_unload(user, used_item) + else if(istype(used_item, /obj/item/cell)) + return cell_loaded.try_load(user, used_item) return ..() diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 767b6907fb7..8ae8315d01e 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -128,11 +128,13 @@ if(atom_damage_type == BURN) . |= DAM_LASER -/obj/attackby(obj/item/O, mob/user) - if((obj_flags & OBJ_FLAG_ANCHORABLE) && (IS_WRENCH(O) || IS_HAMMER(O))) - wrench_floor_bolts(user, null, O) - update_icon() - return TRUE +/obj/attackby(obj/item/used_item, mob/user) + // We need to call parent even if we lack dexterity, so that storage can work. + if(used_item.user_can_wield(user)) + if((obj_flags & OBJ_FLAG_ANCHORABLE) && (IS_WRENCH(used_item) || IS_HAMMER(used_item))) + wrench_floor_bolts(user, null, used_item) + update_icon() + return TRUE return ..() /obj/proc/wrench_floor_bolts(mob/user, delay = 2 SECONDS, obj/item/tool) diff --git a/code/game/objects/structures/_structure_construction.dm b/code/game/objects/structures/_structure_construction.dm index 41024b79221..857d097af5e 100644 --- a/code/game/objects/structures/_structure_construction.dm +++ b/code/game/objects/structures/_structure_construction.dm @@ -113,32 +113,32 @@ last_damage_message = null current_health = clamp(current_health + used*DOOR_REPAIR_AMOUNT, current_health, current_max_health) -/obj/structure/attackby(obj/item/O, mob/user) +/obj/structure/attackby(obj/item/used_item, mob/user) + if(used_item.user_can_wield(user)) + if(used_item.force && user.a_intent == I_HURT) + attack_animation(user) + visible_message(SPAN_DANGER("\The [src] has been [pick(used_item.attack_verb)] with \the [used_item] by \the [user]!")) + take_damage(used_item.force, used_item.atom_damage_type) + . = TRUE - if(O.force && user.a_intent == I_HURT) - attack_animation(user) - visible_message(SPAN_DANGER("\The [src] has been [pick(O.attack_verb)] with \the [O] by \the [user]!")) - take_damage(O.force, O.atom_damage_type) - . = TRUE - - else if(IS_WRENCH(O)) - . = handle_default_wrench_attackby(user, O) - else if(IS_SCREWDRIVER(O)) - . = handle_default_screwdriver_attackby(user, O) - else if(IS_WELDER(O)) - . = handle_default_welder_attackby(user, O) - else if(IS_CROWBAR(O)) - . = handle_default_crowbar_attackby(user, O) - else if(IS_COIL(O)) - . = handle_default_cable_attackby(user, O) - else if(IS_WIRECUTTER(O)) - . = handle_default_wirecutter_attackby(user, O) - else if(can_repair_with(O) && can_repair(user)) - . = handle_repair(user, O) - if(.) - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - add_fingerprint(user) - return + else if(IS_WRENCH(used_item)) + . = handle_default_wrench_attackby(user, used_item) + else if(IS_SCREWDRIVER(used_item)) + . = handle_default_screwdriver_attackby(user, used_item) + else if(IS_WELDER(used_item)) + . = handle_default_welder_attackby(user, used_item) + else if(IS_CROWBAR(used_item)) + . = handle_default_crowbar_attackby(user, used_item) + else if(IS_COIL(used_item)) + . = handle_default_cable_attackby(user, used_item) + else if(IS_WIRECUTTER(used_item)) + . = handle_default_wirecutter_attackby(user, used_item) + else if(can_repair_with(used_item) && can_repair(user)) + . = handle_repair(user, used_item) + if(.) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + add_fingerprint(user) + return . return ..() /obj/structure/attack_generic(var/mob/user, var/damage, var/attack_verb, var/environment_smash) diff --git a/code/game/objects/structures/crates_lockers/closets/__closet.dm b/code/game/objects/structures/crates_lockers/closets/__closet.dm index 6e4f6f50bb5..d1b0f8f37ba 100644 --- a/code/game/objects/structures/crates_lockers/closets/__closet.dm +++ b/code/game/objects/structures/crates_lockers/closets/__closet.dm @@ -244,69 +244,74 @@ var/global/list/closets = list() ..() take_damage(proj_damage, Proj.atom_damage_type) -/obj/structure/closet/attackby(obj/item/W, mob/user) +/obj/structure/closet/attackby(obj/item/used_item, mob/user) - if(user.a_intent == I_HURT && W.force) + if(user.a_intent == I_HURT && used_item.force) return ..() - if(!opened && (istype(W, /obj/item/stack/material) || IS_WRENCH(W)) ) + if(!opened && (istype(used_item, /obj/item/stack/material) || IS_WRENCH(used_item)) ) return ..() + var/can_wield = used_item.user_can_wield(user, silent = TRUE) + if(opened) - if(istype(W, /obj/item/grab)) - var/obj/item/grab/G = W - receive_mouse_drop(G.affecting, user) //act like they were dragged onto the closet - return TRUE - if(IS_WELDER(W)) - var/obj/item/weldingtool/WT = W - if(WT.weld(0,user)) - slice_into_parts(WT, user) + if(can_wield) + if(istype(used_item, /obj/item/grab)) + var/obj/item/grab/G = used_item + receive_mouse_drop(G.affecting, user) //act like they were dragged onto the closet + return TRUE + if(IS_WELDER(used_item)) + var/obj/item/weldingtool/WT = used_item + if(WT.weld(0,user)) + slice_into_parts(WT, user) + return TRUE + if(istype(used_item, /obj/item/gun/energy/plasmacutter)) + var/obj/item/gun/energy/plasmacutter/cutter = used_item + if(cutter.slice(user)) + slice_into_parts(used_item, user) + return TRUE + if(istype(used_item, /obj/item/laundry_basket) && used_item.contents.len && used_item.storage) + var/turf/T = get_turf(src) + for(var/obj/item/I in used_item.storage.get_contents()) + used_item.storage.remove_from_storage(user, I, T, TRUE) + used_item.storage.finish_bulk_removal() + user.visible_message( + SPAN_NOTICE("\The [user] empties \the [used_item] into \the [src]."), + SPAN_NOTICE("You empty \the [used_item] into \the [src]."), + SPAN_NOTICE("You hear rustling of clothes.") + ) return TRUE - if(istype(W, /obj/item/gun/energy/plasmacutter)) - var/obj/item/gun/energy/plasmacutter/cutter = W - if(cutter.slice(user)) - slice_into_parts(W, user) - return TRUE - - if(istype(W, /obj/item/laundry_basket) && W.contents.len && W.storage) - var/turf/T = get_turf(src) - for(var/obj/item/I in W.storage.get_contents()) - W.storage.remove_from_storage(user, I, T, TRUE) - W.storage.finish_bulk_removal() - user.visible_message( - SPAN_NOTICE("\The [user] empties \the [W] into \the [src]."), - SPAN_NOTICE("You empty \the [W] into \the [src]."), - SPAN_NOTICE("You hear rustling of clothes.") - ) - return TRUE - if(user.try_unequip(W, loc)) - W.pixel_x = 0 - W.pixel_y = 0 - W.pixel_z = 0 - W.pixel_w = 0 + if(user.try_unequip(used_item, loc)) + used_item.pixel_x = 0 + used_item.pixel_y = 0 + used_item.pixel_z = 0 + used_item.pixel_w = 0 return TRUE return FALSE - if(try_key_unlock(W, user)) + if(!can_wield) + return attack_hand_with_interaction_checks(user) + + if(try_key_unlock(used_item, user)) return TRUE - if(try_install_lock(W, user)) + if(try_install_lock(used_item, user)) return TRUE - if(istype(W, /obj/item/energy_blade)) - var/obj/item/energy_blade/blade = W - if(blade.is_special_cutting_tool() && emag_act(INFINITY, user, "The locker has been sliced open by [user] with \an [W]!", "You hear metal being sliced and sparks flying.")) + if(istype(used_item, /obj/item/energy_blade)) + var/obj/item/energy_blade/blade = used_item + if(blade.is_special_cutting_tool() && emag_act(INFINITY, user, "The locker has been sliced open by [user] with \an [used_item]!", "You hear metal being sliced and sparks flying.")) spark_at(loc, amount=5) playsound(loc, 'sound/weapons/blade1.ogg', 50, 1) open(user) return TRUE - if(istype(W, /obj/item/stack/package_wrap)) + if(istype(used_item, /obj/item/stack/package_wrap)) return FALSE //Return false to get afterattack to be called - if(IS_WELDER(W) && (setup & CLOSET_CAN_BE_WELDED)) - var/obj/item/weldingtool/WT = W + if(IS_WELDER(used_item) && (setup & CLOSET_CAN_BE_WELDED)) + var/obj/item/weldingtool/WT = used_item if(!WT.weld(0,user)) if(WT.isOn()) to_chat(user, SPAN_NOTICE("You need more welding fuel to complete this task.")) @@ -316,7 +321,7 @@ var/global/list/closets = list() user.visible_message(SPAN_WARNING("\The [src] has been [welded?"welded shut":"unwelded"] by \the [user]."), blind_message = "You hear welding.", range = 3) return TRUE else if(setup & CLOSET_HAS_LOCK) - togglelock(user, W) + togglelock(user, used_item) return TRUE return attack_hand_with_interaction_checks(user) diff --git a/code/game/objects/structures/doors/_door.dm b/code/game/objects/structures/doors/_door.dm index 6655f3ba9d3..a3e0f0dbfc8 100644 --- a/code/game/objects/structures/doors/_door.dm +++ b/code/game/objects/structures/doors/_door.dm @@ -136,17 +136,18 @@ /obj/structure/door/can_install_lock() return TRUE -/obj/structure/door/attackby(obj/item/I, mob/user) - add_fingerprint(user, 0, I) +/obj/structure/door/attackby(obj/item/used_item, mob/user) + add_fingerprint(user, 0, used_item) - if((user.a_intent == I_HURT && I.force) || istype(I, /obj/item/stack/material)) + if((user.a_intent == I_HURT && used_item.force) || istype(used_item, /obj/item/stack/material)) return ..() - if(try_key_unlock(I, user)) - return TRUE + if(used_item.user_can_wield(user, silent = TRUE)) + if(try_key_unlock(used_item, user)) + return TRUE - if(try_install_lock(I, user)) - return TRUE + if(try_install_lock(used_item, user)) + return TRUE if(density) open(user) diff --git a/code/game/objects/structures/structure_lock.dm b/code/game/objects/structures/structure_lock.dm index 7975ad07266..61d28e0766b 100644 --- a/code/game/objects/structures/structure_lock.dm +++ b/code/game/objects/structures/structure_lock.dm @@ -1,23 +1,25 @@ /obj/structure var/datum/lock/lock -/obj/structure/proc/try_key_unlock(obj/item/I, mob/user) +/obj/structure/proc/try_key_unlock(obj/item/used_item, mob/user) if(!lock) return FALSE - if(istype(I, /obj/item/key)) - if(lock.toggle(I)) - to_chat(user, SPAN_NOTICE("You [lock.status ? "lock" : "unlock"] \the [src] with \the [I].")) + if(!used_item.user_can_wield(user)) + return FALSE + if(istype(used_item, /obj/item/key)) + if(lock.toggle(used_item)) + to_chat(user, SPAN_NOTICE("You [lock.status ? "lock" : "unlock"] \the [src] with \the [used_item].")) else - to_chat(user, SPAN_WARNING("\The [I] does not fit in the lock!")) + to_chat(user, SPAN_WARNING("\The [used_item] does not fit in the lock!")) return TRUE - if(istype(I, /obj/item/keyring)) - for(var/obj/item/key/key in I) + if(istype(used_item, /obj/item/keyring)) + for(var/obj/item/key/key in used_item) if(lock.toggle(key)) to_chat(user, SPAN_NOTICE("You [lock.status ? "lock" : "unlock"] \the [src] with \the [key].")) return TRUE - to_chat(user, SPAN_WARNING("\The [I] has no keys that fit in the lock!")) + to_chat(user, SPAN_WARNING("\The [used_item] has no keys that fit in the lock!")) return TRUE - if(lock.pick_lock(I,user)) + if(lock.pick_lock(used_item,user)) return TRUE if(lock.isLocked()) to_chat(user, SPAN_WARNING("\The [src] is locked!")) diff --git a/code/modules/butchery/_butchery.dm b/code/modules/butchery/_butchery.dm index aa166cb46af..972aa673cde 100644 --- a/code/modules/butchery/_butchery.dm +++ b/code/modules/butchery/_butchery.dm @@ -9,6 +9,9 @@ if(!IS_KNIFE(tool) || !butchery_data || stat != DEAD) return FALSE + if(!tool.user_can_wield(user)) + return TRUE // skip other interactions + var/decl/butchery_data/butchery_decl = GET_DECL(butchery_data) if(!istype(butchery_decl)) return FALSE diff --git a/code/modules/paperwork/papershredder.dm b/code/modules/paperwork/papershredder.dm index da22ac08272..87e33c56b27 100644 --- a/code/modules/paperwork/papershredder.dm +++ b/code/modules/paperwork/papershredder.dm @@ -112,15 +112,16 @@ return return TRUE -/obj/machinery/papershredder/attackby(var/obj/item/W, var/mob/user) - if(!has_extension(W, /datum/extension/tool)) //Silently skip tools - var/trying_to_smack = !(W.item_flags & ITEM_FLAG_NO_BLUDGEON) && user && user.a_intent == I_HURT - if(W.storage) - empty_bin(user, W) +/obj/machinery/papershredder/attackby(var/obj/item/used_item, var/mob/user) + //Silently skip tools, and things we don't have the dexterity to use + if(!has_extension(used_item, /datum/extension/tool) && used_item.user_can_wield(user, silent = TRUE)) + var/trying_to_smack = !(used_item.item_flags & ITEM_FLAG_NO_BLUDGEON) && user && user.a_intent == I_HURT + if(used_item.storage) + empty_bin(user, used_item) return TRUE - else if(!trying_to_smack && can_shred(W)) - shred(W, user) + else if(!trying_to_smack && can_shred(used_item)) + shred(used_item, user) return TRUE return ..() diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index e39dd188ecf..a331caa65fe 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -150,11 +150,11 @@ if(M) M.welding_eyecheck()//Welding tool eye check if(check_accidents(M, "[M] loses grip on [src] from its sudden recoil!",SKILL_CONSTRUCTION, 60, SKILL_ADEPT)) - return 0 + return FALSE spark_at(src, amount = 5, holder = src) - return 1 + return TRUE handle_click_empty(M) - return 0 + return FALSE /obj/item/gun/energy/plasmacutter/is_special_cutting_tool(var/high_power) return TRUE diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index c1237db561e..779b990371c 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -97,20 +97,25 @@ /obj/item/chems/afterattack(atom/target, mob/user, proximity_flag, click_parameters) return -/obj/item/chems/attackby(obj/item/W, mob/user) - if(IS_PEN(W)) - var/tmp_label = sanitize_safe(input(user, "Enter a label for [name]", "Label", label_text), MAX_NAME_LEN) - if(length(tmp_label) > 10) - to_chat(user, SPAN_NOTICE("The label can be at most 10 characters long.")) - else - to_chat(user, SPAN_NOTICE("You set the label to \"[tmp_label]\".")) - label_text = tmp_label - update_container_name() - else - return ..() +/obj/item/chems/attackby(obj/item/used_item, mob/user) + if(used_item.user_can_wield(user, silent = TRUE)) + if(IS_PEN(used_item)) + var/tmp_label = sanitize_safe(input(user, "Enter a label for [name]", "Label", label_text), MAX_NAME_LEN) + if(length(tmp_label) > 10) + to_chat(user, SPAN_NOTICE("The label can be at most 10 characters long.")) + else + to_chat(user, SPAN_NOTICE("You set the label to \"[tmp_label]\".")) + label_text = tmp_label + update_container_name() + return TRUE + return ..() /obj/item/chems/standard_pour_into(mob/user, atom/target, amount = 5) - return ..(user, target, amount_per_transfer_from_this) + amount = amount_per_transfer_from_this + // We'll be lenient: if you lack the dexterity for proper pouring you get a random amount. + if(!user_can_wield(user, silent = TRUE)) + amount = rand(1, floor(amount_per_transfer_from_this * 1.5)) + return ..(user, target, amount) /obj/item/chems/do_surgery(mob/living/M, mob/living/user) if(user.get_target_zone() != BP_MOUTH) //in case it is ever used as a surgery tool diff --git a/code/modules/surgery/_surgery.dm b/code/modules/surgery/_surgery.dm index 7ca2c764c28..11970dd7288 100644 --- a/code/modules/surgery/_surgery.dm +++ b/code/modules/surgery/_surgery.dm @@ -238,6 +238,10 @@ var/global/list/surgery_tool_exception_cache = list() if(!zone) return FALSE // Erroneous mob interaction + // there IS a rule that says dogs can't do surgery, actually. section 13a, the "No Dr. Air Bud" Rule + if(!user.check_dexterity(DEXTERITY_COMPLEX_TOOLS)) + return TRUE // prevent other interactions because we've shown a message + var/decl/bodytype/root_bodytype = M.get_bodytype() if(root_bodytype && length(LAZYACCESS(root_bodytype.limb_mapping, zone)) > 1) zone = input("Which bodypart do you wish to operate on?", "Non-standard surgery") as null|anything in root_bodytype.limb_mapping[zone] From 8a254bed74b63f93e56f71653b065bf21dfe1a16 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 23 Jun 2024 19:52:31 -0400 Subject: [PATCH 09/38] Make grab interactions require DEXTERITY_GRAPPLE --- code/modules/mob/grab/grab_object.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/mob/grab/grab_object.dm b/code/modules/mob/grab/grab_object.dm index 1a598a635c0..4f008fbfe3b 100644 --- a/code/modules/mob/grab/grab_object.dm +++ b/code/modules/mob/grab/grab_object.dm @@ -7,6 +7,7 @@ drop_sound = null equip_sound = null is_spawnable_type = FALSE + needs_attack_dexterity = DEXTERITY_GRAPPLE var/atom/movable/affecting // Atom being targeted by this grab. var/mob/assailant // Mob that instantiated this grab. From ac2f25c5143809bbea4fb9a12f8304893a5c5a55 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 23 Jun 2024 20:21:15 -0400 Subject: [PATCH 10/38] Add user_can_wield check to do_tool_interaction() --- code/modules/tools/archetypes/tool_item.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/tools/archetypes/tool_item.dm b/code/modules/tools/archetypes/tool_item.dm index 0f3310a89a2..ae462efdd6e 100644 --- a/code/modules/tools/archetypes/tool_item.dm +++ b/code/modules/tools/archetypes/tool_item.dm @@ -46,6 +46,9 @@ if(get_tool_quality(archetype) <= 0) return FALSE + if(!user_can_wield(user)) + return FALSE + . = handle_tool_interaction(archetype, user, src, target, delay, start_message, success_message, failure_message, fuel_expenditure, check_skill, prefix_message, suffix_message, check_skill_threshold, check_skill_prob, set_cooldown) if(QDELETED(user) || QDELETED(target)) From fdf02747ab64576fc0c3363aef38d72210abc261 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 23 Jun 2024 15:28:47 -0400 Subject: [PATCH 11/38] Fix north-facing pew icons being flipped --- icons/obj/structures/pews.dmi | Bin 3508 -> 3472 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/structures/pews.dmi b/icons/obj/structures/pews.dmi index ad03cc5347b8766d3c803b7ad1bbe69ec0509920..415392dd48615f76553f34b0de2f23071ea38c21 100644 GIT binary patch delta 3237 zcmZvedpy(MAIG;DMy^T8U4;}Pw;~%$E=enwln5>18wzs^`;0~s61hZ-l1uJ|GWTNg zCHFLuxn(Y2%Z#zj^xOCQ=lAku9_PHz<9*Ki{eGVFICXNVa;a3{nT>_HWB7~J zA1whBpJhq(rzvmYd7_H~QG64sd5Ib#MaGxjIj5Rf2NIvr8mwEA%N>d(8}?4e@|!gE zhDcluDNpt!9C~RdrtwHgkI{PMH^KuvA@`I${Ygb5Z9vmzuT*+{X#SC&;L+!X8>z)7 zLV({jE?;gU4k(eB_iu(<10z}Plr|%Zl9DYz@p|6qs{N(<7bPr*w$*y0jynt9#@fE!%s4zTMzx_Zp*`SL<$8 zfcouL*lgkkXV5CCwk5yTw@&E3pZg(bk950sZy$lu8j;&pr&bN9FL+<~Ugo^Y01-JN zOQ93K-S23DJiTvRD|-4~NPkOym7w&rl`1YI_o$oEb>f*S?K-z_!~V`7qm|7*Q{jf* zx8J^83$yS)CT>1r=j+Zme(^A1M@x9+k&YQYd`}ezx58 zW|W&1tkO*Jy8%RfxeI&68nv3X2i+Z8xfTfi+{Rg)4QkXh#b$XeFju~X@%HKI{;H+# z_Fx_j*2HejDGvIS_pBtCB7BDj=%4;jHU3>n;Zw6&$1MMTcms?%okQfEDX!?($KhLX z(~(#=3Zhdt3kzv~CfTmH{uJXQ!;Lqeb*$^4OMg@Ya@$$A!zmGxt)9v_txlIxPQQ1; zVWy*GdnOxeP~ZwDfqR3{i5X zXvuch)b+=b>sf~=QP!Ox1mBYM{3XhD_kJ25GvYxJVp2QtxCnYD-z=aqPt_)99ad5w z$^i zF;d1gwOkIYS=xjPStMa%=rWRKRzDyvXDZ8kVZ)(?JdSMMPfV%540~=g`vzL`p=X^- zul=T~OPi~|yE|W!_|y5;z6Vsa`>C-_0M`|v3pBg z5`8pqhmrIMF!e}}NbygP^yv?X-KD;#7^8LoU}uO`E4$rnc!H4Mc?RYGCzBNwoy``W z_5;196ci@soc%;SUe3(i*VU#Fph~}sPO?e6<-P-qeRoeg!lJG*Oc)FSlLG)LyW|7` z@jDOEdWzeCS|g(qIld*kb`vb=Mo!Gxk@?0uaJ{k~Z~56;T_?+S;so+TNAJ%WlbxNp zwYhX%(&Sykmb-$N9iuLin)5mW8(lMLISU-otqAjgz7=rtLDDtt5?XlJUwQ#Am(Z`B z&5pIjpK53i6GBdOe=s*94FIu|%!qBVfuBL+i%0$Z{9=y<`+@0=tmWZJ^1j5(Zx#M= z5)-p5R)j8LfRLmC9EFcvpy@BeH@H|JBruTf{OfuBr5Ds0=+bcTaLpAlu6){&h=8D= z?d)rJs*`k0dbT{Sd=t;6C=eg-ygd*mwM@=?9_%vqdHCkmNSp;?28hTpG*@p@Q`Af5 z;&Uvq2H*>6^IhJi2X*i%=MBJptP1sXlJL3Rpi;x$^iJw)ZCnU4lpHsubZ|uYb*0LN z6!9i-V;QnoPLMFRW=e?_zOr`%MKh%g_hCdUqQRwl#n_LnTj$ zf=KZzBE%cD8VjRkBM~!YDd!2?XLf;i?wd(~EhJ>E5Xp}Iu}DQOK2XxkaS$aV4z|!@ z3(a{bNk|k0L2pS3zHbBTy_i>LTX<7`jn=gq_sgU zkJ!+&i~wI058^~3443M{gv)zy)?PoK-PF*g8 z132BW)YMlI{62k9TH@_WZdW$J$vc`Yv@x`bAp^It@|$p}iga`xzmBDKM7JH|%<$M|*`!UA&y@>u&slH`#$*@bL z)3V^`FjZ{`1+y+q!pU+bakaCV`)~z+!jAr+3S6+!z}c}ULE8=o!9wy907?VLdtfyY zkZTp$>t7F)&@YJi4vW^xOJ{yvj5KqP4wS97O1I?vs>>6d&SuZ*r(sd>iYqS}1mZjJ z#*YJn)1nkUNNm5rAoZsX=ucTCJY5ng)(-NjtcsUmWQ^nRV_AoX^tJM$zF&bQ*!qLcJ`s6%V}1PDfN92}rNy-}B?&Xv<*Im4 zF&+eojivD^a*Sj6#M@CF;vYY_tKTClgnv>ys_Y}lRy#*iJ+~Ap7ZloFpowITyq?g? z;sdK|A^|~sG<^C)0SDJ570V!;h6p#$D2pg3@chA)|0UL|()8^7hx*YPQ$1&l7Jj7& zDLV#o z^I#38%l2Q1qv75d2n?t%9+b8L6<$fGvi9FEOW3C){dlk?xb+Q5$CQShmZ@(&{=ISP zw6MxddZdesl5AG*(cA*Rg_mW-YWb)noJ&^6SZ;y8uj`6gR#Q_`R|$%cUqpC_=T`_! z#Vq=0#-Ubxq#;}!PMMb_sHB-$>Ki@JMXAowQsDyK4WXMZ=g3fgXqg;%g$+F$DucaR zNp6ml;T6YZ#q`!g6=fSY&3 zD^x<_Z-4)heH)LrXQja`w_YA~0eGl96d`qcla5{ryEp)usu2=~3Bw^b+}*RV-caZi zRD7EEcgw(1pdl7p)c ztkI_FW{c|h+pj^iw-v)wBMi^{?t9SwtVrj@hIL;<)9kYdmExDo27K2PAH^+(inKI_M7v_~= zJY(8<&`N92TCMVXQTj8Ekgh^7I;pX#Dc9AxxjvKYo^V~>n4O;pjMh+$GO)-C6TiWS W1eVog?e~&Fyk>LmqD2+bBldqvFD-Wf delta 3273 zcmb7G`8(A67ypcPY*EURz0}Z@CA%+8I-BpM~M7O*XrCWcPYg=-V-!QWla z(x%T>t4;QEA=xR9ma_Xf`PeH&?$7gvb1ODkF9kmy{@gNlHC-ha5WPGyiU>X@@W`=w zOzf+O&)AP?>_*`xS{^H?0xwK8`8d;Sd|fZjB}}p)t3=^eSJ;sxvRF!A{$s^51LomX zYt$|xI=_Q4ipE-Gf39WF3mBQ1iS4kL6|EzIeXPG=%p^;b+rHc2tsL=ZPp%Q)p=cmh z=!RPJu9{XNFv*C_oo*Qojtx;=c>&GvX`)b{41uHHjGo3Ayj+@sFb+NBG=ZQ26bf~7 z@8R-!+W6$aIC6}$`dZ#k!*KRciyNB@%_04H%GKE3L!SLnXSai2{))IARpWZPpzhDA z7>|1TF6PDHE6J8iK@7h|OU@QY-rHZ4dIl%*03x_r(>NpY4K#sX*m8oHEV%*OD-vcTH{=EWTj`aqq`nOzTpmL zL}AG}m2Rtz65AYPrVNWeE8YN@w5vZBiB{MWUj$t0G`;vp=Jib_|saq&HQ;(ux zJ3Q$WQd{O=Z_Y*LSynlpD8UwYabc1$4JMW@fs^yQAsBE#%1%SLkphK0ltUI7g5FhS zUO?SljyhA#Y&(Hcy1IqOV@;hJBkagMQSI*nGUUr0S^^w($qvx%kvW^NPR~nhBcDfV zxf-u<*K2ceaNNwm4SCVntsTKr#@U56Fiad%XOv;it#BMCXc?YO*((3Y($_PliAoFk z`A4zclQ~RrixAoJ12U>?TP(Cs+2Y{6)VcO|Dzr7uAC9N1XS9R$-iw=J|5@Js?(Wyy zNY6y4wQK6sKEba(wpXGPpTB9ApqrLQ_iGQUv{ za}byEK6Q6<4}5qN`Wm~B+rQ__C=S-_9#ORS3Gjl%K{*B|IVH%}&f9S}X2OGCs7^1i zN4m|AN4A!~LWyp9wKFyMJ|1s&$^0Qx`KY(`;pnF2<%R&4$i9V@jv+0e8uaIHPTQd2 z!m|cmZn@1byN@S&tL1+Oq^X8U%4{AhKQ8f_(f&>ECD8wB52?dO1gAYb*x291Hgqiz z+8KORu{OW8tC#3o2+tR2No@^;CwU&4LyDsrNK0G~;HV;9Nswx@5uxB=$8r0!IjXdA zMr3IS_ftI9mez)N7slFw_5Aq*(e-en;O>1K&1Uuz{?)a~FK8M9iLTn>vY7iOgn}Mr z$!?+3q>w(?@v3gLSMthF*1$dQ??|F4y}pWqru0s@6wK2udNsEB1xX|f_P-zy2EMLr z=cs-V{O}>~BPN3=$c)zWWT}reV!ZW#;P=BHA*VG0MlKy<1XzO@)v6uWU!p)#r%B3V zxhshn>gxKS@!ij!tBBX6YifRtfltd4*UL9kv6zm?{76Gl@`V>_>CA+DGmHi(ZFcWR z{R{qQM&@PtfUn2bob3->RQ;tThp}%E6sT&Z;eEe>^wT5iye}^^f%12?{W9AkkszdN zu_J6(TzVY=Aa;Z!y_;uSRw1h`aVT7DGQD`kf1o0Lr5FJ+_7IzKkF6l$m3v zngnn}VDjHJ>s=UtA%=4V=IRM`d`lSJ?}Z0EWTevpCOt?3xcP5bOPFS1cS?bJnV60`u&mW0gg+T5ImJxy4&?`fuj{bY^ReUA zYwd|_i=~86tNE|?Bc>?>SeFR%G9uvo*Jh84DT$z>PAAmv2(&B%8EX)er%gY_XODH= z*C2^b+@Yx~lN4VLho?F_!X@G$Co^N1T!*759M4QZ9PRyjzp}YoT>L)|8CEwz$O-$A z#HRh|hpZTi_kYLz9pyyiy?utxMCF^o3rt|%{uG!Oc19Ag2}jo`va0 zVuSFeiR%#lD~J3^JMqI+?B+fsloM%PYL$FaM6k%r7TU%@h+JVNSf8BP9ctuf^A8w{ z**|OOpOiftTU)fYZ_4iPB{|+q__@FT@U3U<^Qx9p`iZR=T@*9n#y?Fb8c|MWj!5yY zH?FXI#WD`o1Xkj5vc>9b_g5p>=O4RcuLJQ`=Zla8i8}d2AaW^!eabF?Lp~I)&AKvy z&6TVCcPV#zZh95cpsFt|wK~I{U7gDrAjI~EfWpj+>9LcS-5&r8!=mL+w-_dyaordE z1&UTE+Ca#jw2;v7SvdZ)H*gwdz%zR;p%4dp9P=sZ*=AoL+=#Jcu|)%|hhk5037G&O z!-f-6a<*Q_y%(3Qybd^jRFEMyr%fyAAtBH82@}m-ZxqxWwOBFNvB$9_iN@jMuXzYu zeJ7S*!Ot>ep`GCG85nl%#G^lam)V}Rt2I8cYg-jbtcjHXM29&;d7ekZ%@6<@ITI!T zZM-f@Et?iYjrvMav5ILJ+paR77;ZF5q~i)}y)G?DTE*_A1yG=4&nDm1WX{$2*AH{5 z%)-H^0`Idg7UbC(1W9ltlxgB9=1F+ZjW5}?`niiVW5;3{A-LNJ%o4n~fE zFi7I-9i8$FjP7N(X)%>+-ygCtO=+HUiW}k$80L8Kox$Gs>-2djo&Dp__MC^l{S9GY zS*JILk~vJz#oUB+Zu&sLg_qkuI1BIZ(iw!4ai=;pt z94Fy$q5n&y4y5?ebn|TVaA?2RyKCpF$XW_TkD`IY$urf}PqMNdY*M2EPK6a#?_XU@yAxP_3AJVwMx7>|xe3YYM)`G<`{EVSgt z>iBrUcQ_iIws}shsk|%@3IZ3E5tV{0lI1267UNlmJL7W_SE`ReBdghvYsP;ugd6Q& zB2BgANU}Laykgi|ug(QOj=ND;$t-S|yz+n|$Zms!db2pl<)gkiH>yOWA;@sjoLX5~ z*)foYqe?J9N1NZ9I|e+8_}eP@Z%1z2T}83@Iu7W;K08T|_i^3(p@EAKV=ia7lebO} z*`{cg{fiG!7ij1%d3Ty<6=uO+W$)bl;Lc&7`; z;ytt4n7mt<=Ols7EP<}mnwnWRCE#@Tb?pp7slu%fVV7eHk$Td~0|Nuc`G;4Fg_$_4 zYoo$r6Z}9R`2Xze|3=}AZzoLtqaqfv(&rRX4Ts4!LMO62);Fzp4sR>dxDR-W#mPmu zq9L&VuAzLfXDVb%*r>q>5Dd7ryjh@oz=JJzyQlNy69tO&8jXn5|BH2X@=7+E680zA zzabt4$-N{9$yw6#>VEZ)oI*U>624=3mVL1lTG!iNOc1hu_e}^_L<7cLI&B0>Wf~s@ znTLyaC_xMtA)VQOvbk>O{_*5YYe))y+&*Q_Rl=ulVq#*3G*hZDvnM*!@2Pw6VnY^N hG2IfP$V_l;I%Y>)UEj;GS)c-}XK89@Qe$*G{y!&-Fckm* From 5828abc90bdae7b8f0a5afd972903d060e421888 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 23 Jun 2024 15:29:21 -0400 Subject: [PATCH 12/38] Fix drakes being unable to eat plants --- code/modules/hydroponics/grown.dm | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 36e96954952..9d0754c45dd 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -306,24 +306,22 @@ var/global/list/_wood_materials = list( /obj/item/chems/food/grown/attack_self(mob/user) - if(!seed) - return - - if(isspaceturf(user.loc)) - return + if(seed) + if(user.a_intent == I_HURT) + user.visible_message(SPAN_DANGER("\The [user] squashes \the [src]!")) + seed.thrown_at(src,user) + sleep(-1) + if(src) qdel(src) + return TRUE - if(user.a_intent == I_HURT) - user.visible_message("\The [user] squashes \the [src]!") - seed.thrown_at(src,user) - sleep(-1) - if(src) qdel(src) - return + var/turf/user_loc = user.loc + if(isturf(user_loc) && !user_loc.is_open() && seed.get_trait(TRAIT_SPREAD) > 0) + to_chat(user, SPAN_NOTICE("You plant \the [src].")) + new /obj/machinery/portable_atmospherics/hydroponics/soil/invisible(get_turf(user),src.seed) + qdel(src) + return TRUE - if(seed.get_trait(TRAIT_SPREAD) > 0) - to_chat(user, "You plant the [src.name].") - new /obj/machinery/portable_atmospherics/hydroponics/soil/invisible(get_turf(user),src.seed) - qdel(src) - return + return ..() /obj/item/chems/food/grown/on_picked_up(mob/user) ..() From 5968f9c5edd2bf43bb73c5768aa1fcf2a3bafeea Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 23 Jun 2024 15:30:36 -0400 Subject: [PATCH 13/38] Improve throwing and throw-placement UX --- code/modules/mob/living/living_throw.dm | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/living/living_throw.dm b/code/modules/mob/living/living_throw.dm index 42ac87ba10b..550c76feab3 100644 --- a/code/modules/mob/living/living_throw.dm +++ b/code/modules/mob/living/living_throw.dm @@ -7,6 +7,8 @@ if(incapacitated() || !target || istype(target, /obj/screen) || !istype(item) || !(item in get_held_items())) return FALSE + var/place_item = a_intent != I_HURT && Adjacent(target) + if(istype(item, /obj/item/grab)) var/obj/item/grab/G = item item = G.throw_held() @@ -21,14 +23,12 @@ var/end_T_descriptor = "[start_T] \[[end_T.x],[end_T.y],[end_T.z]\] ([end_T.loc])" admin_attack_log(usr, mob, "Threw the victim from [start_T_descriptor] to [end_T_descriptor].", "Was from [start_T_descriptor] to [end_T_descriptor].", "threw, from [start_T_descriptor] to [end_T_descriptor], ") drop_from_inventory(G) - else if(!try_unequip(item, play_dropsound = FALSE)) + else if(!try_unequip(item, play_dropsound = place_item && !isliving(target))) return FALSE // Hand items to a nearby target, or place them on the turf. - if(a_intent != I_HURT && Adjacent(target) && isitem(item) && !QDELETED(item) && !QDELETED(target)) - if(!try_unequip(item)) - return FALSE - item.dropInto(get_turf(target)) + if(place_item && !QDELETED(item) && !QDELETED(target)) + // We've already been unequipped above. if(isliving(target)) var/mob/living/mob = target if(length(mob.get_held_item_slots())) @@ -42,6 +42,8 @@ to_chat(src, SPAN_NOTICE("You offer \the [item] to \the [mob].")) do_give(mob) return TRUE + to_chat(src, SPAN_WARNING("\The [mob] has no way to hold \the [item]!")) + return TRUE if(!QDELETED(item)) item.forceMove(get_turf(target)) return TRUE From a44b82a73bbbfc3ff5d98db393fd120be081df7a Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 23 Jun 2024 15:50:43 -0400 Subject: [PATCH 14/38] Improve structure-door direction autoset --- code/game/objects/structures/doors/_door.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/game/objects/structures/doors/_door.dm b/code/game/objects/structures/doors/_door.dm index 6655f3ba9d3..3a0ea06d3af 100644 --- a/code/game/objects/structures/doors/_door.dm +++ b/code/game/objects/structures/doors/_door.dm @@ -57,6 +57,9 @@ W.queue_icon_update() for(var/turf/wall/W in RANGE_TURFS(loc, 1)) + var/turf_dir = get_dir(loc, W) + if(turf_dir & (turf_dir - 1)) // if diagonal + continue // skip diagonals set_dir(turn(get_dir(loc, W), 90)) break From 82cdcf16a7d689cdea8923b22b95ebb1de8092df Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 23 Jun 2024 15:51:03 -0400 Subject: [PATCH 15/38] Fix maptext briefly appearing when stacks are dropped or placed on a turf --- code/game/objects/items/stacks/stack.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 42c0a126138..4a4466d06ce 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -86,6 +86,8 @@ I.maptext_y = 2 I.maptext = STYLE_SMALLFONTS_OUTLINE(get_amount(), 6, (color || COLOR_WHITE), COLOR_BLACK) add_overlay(I) + else + compile_overlays() // prevent maptext from showing when we're dropped /obj/item/stack/Move() var/on_turf = isturf(loc) From b4488a4f6e65cc069e65d660017cc61b60de750a Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 23 Jun 2024 19:52:50 -0400 Subject: [PATCH 16/38] Make add_to_stacks report number of stacks transferred --- code/game/objects/items/stacks/stack.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 4a4466d06ce..a063a82828f 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -404,7 +404,7 @@ continue var/transfer = transfer_to(item) if(user && transfer) - to_chat(user, SPAN_NOTICE("You add a new [item.singular_name] to the stack. It now contains [item.amount] [item.singular_name]\s.")) + to_chat(user, SPAN_NOTICE("You add [item.get_string_for_amount(transfer)] to the stack. It now contains [item.amount] [item.singular_name]\s.")) if(!amount) break return !QDELETED(src) From 7abe87753bdd37c5b308345513d7034f71dd4b4a Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 23 Jun 2024 20:45:39 -0400 Subject: [PATCH 17/38] Adjust Shaded Hills loadout tool materials --- code/modules/tools/subtypes/axes.dm | 3 +++ code/modules/tools/subtypes/shovel.dm | 3 +++ mods/content/fantasy/items/clothing/_loadout.dm | 4 ++-- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/code/modules/tools/subtypes/axes.dm b/code/modules/tools/subtypes/axes.dm index 74911ae6ed3..1732441b3d0 100644 --- a/code/modules/tools/subtypes/axes.dm +++ b/code/modules/tools/subtypes/axes.dm @@ -21,6 +21,9 @@ ) return tool_qualities +/obj/item/tool/axe/ebony + handle_material = /decl/material/solid/organic/wood/ebony + // Legacy SS13 hatchet. /obj/item/tool/axe/hatchet name = "hatchet" diff --git a/code/modules/tools/subtypes/shovel.dm b/code/modules/tools/subtypes/shovel.dm index a30282ea41f..177b5110221 100644 --- a/code/modules/tools/subtypes/shovel.dm +++ b/code/modules/tools/subtypes/shovel.dm @@ -22,6 +22,9 @@ /obj/item/tool/shovel/wood material = /decl/material/solid/organic/wood +/obj/item/tool/shovel/one_material/Initialize(ml, material_key, _handle_material, _binding_material, override_tool_qualities, override_tool_properties) + return ..(ml, material_key, material_key, _binding_material, override_tool_qualities, override_tool_properties) + /obj/item/tool/spade name = "spade" desc = "A small tool for digging and moving dirt." diff --git a/mods/content/fantasy/items/clothing/_loadout.dm b/mods/content/fantasy/items/clothing/_loadout.dm index 420b62571b4..2ea664f4536 100644 --- a/mods/content/fantasy/items/clothing/_loadout.dm +++ b/mods/content/fantasy/items/clothing/_loadout.dm @@ -178,11 +178,11 @@ /decl/loadout_option/fantasy/utility/hand_axe name = "hand axe" - path = /obj/item/tool/axe + path = /obj/item/tool/axe/ebony /decl/loadout_option/fantasy/utility/shovel name = "shovel" - path = /obj/item/tool/shovel/wood + path = /obj/item/tool/shovel/one_material available_materials = list( /decl/material/solid/organic/wood, /decl/material/solid/organic/wood/mahogany, From 219738ea5b486e9d7ca7dc4be84e58644367e3cc Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 23 Jun 2024 21:13:10 +1000 Subject: [PATCH 18/38] Adding walls with shutters. --- code/_helpers/emissive.dm | 15 +--- code/game/objects/structures/__structure.dm | 2 +- code/game/turfs/walls/_wall.dm | 12 +++ code/game/turfs/walls/wall_attacks.dm | 67 ++++++++--------- code/game/turfs/walls/wall_brick.dm | 8 ++ code/game/turfs/walls/wall_icon.dm | 30 +++++++- code/game/turfs/walls/wall_log.dm | 8 ++ code/game/turfs/walls/wall_natural_ramps.dm | 2 +- .../crafting/stack_recipes/recipes_bricks.dm | 4 + .../crafting/stack_recipes/recipes_logs.dm | 6 ++ code/modules/lighting/lighting_turf.dm | 8 +- icons/turf/walls/_previews.dmi | Bin 3872 -> 4162 bytes icons/turf/walls/shutter.dmi | Bin 0 -> 1546 bytes maps/shaded_hills/shaded_hills-inn.dmm | 69 ++++++++---------- maps/shaded_hills/shaded_hills-swamp.dmm | 12 ++- maps/shaded_hills/shaded_hills-woods.dmm | 9 ++- test/check-paths.sh | 2 +- 17 files changed, 154 insertions(+), 100 deletions(-) create mode 100644 icons/turf/walls/shutter.dmi diff --git a/code/_helpers/emissive.dm b/code/_helpers/emissive.dm index 18ef96c37f8..4ea0ca7e7cf 100644 --- a/code/_helpers/emissive.dm +++ b/code/_helpers/emissive.dm @@ -1,14 +1,5 @@ /proc/emissive_overlay(var/icon, var/icon_state, var/loc, var/dir, var/color) - var/image/emissive/I = new(icon, icon_state) - if(!isnull(loc)) - I.loc = loc - if(!isnull(dir)) - I.dir = dir - if(!isnull(color)) - I.color = color + var/image/I = image(icon, loc, icon_state, EMISSIVE_LAYER, dir) + I.plane = EMISSIVE_PLANE + I.color = color return I - -/image/emissive/New() - ..() - layer = EMISSIVE_LAYER - plane = EMISSIVE_PLANE diff --git a/code/game/objects/structures/__structure.dm b/code/game/objects/structures/__structure.dm index 5d5d9fb88ce..4b3c462541d 100644 --- a/code/game/objects/structures/__structure.dm +++ b/code/game/objects/structures/__structure.dm @@ -10,7 +10,7 @@ var/structure_flags var/last_damage_message - var/hitsound = 'sound/weapons/smash.ogg' + var/hitsound = 'sound/weapons/Genhit.ogg' var/parts_type var/parts_amount var/footstep_type diff --git a/code/game/turfs/walls/_wall.dm b/code/game/turfs/walls/_wall.dm index 768b15f8288..a57293246e3 100644 --- a/code/game/turfs/walls/_wall.dm +++ b/code/game/turfs/walls/_wall.dm @@ -53,6 +53,15 @@ var/global/list/wall_fullblend_objects = list( var/min_dismantle_amount = 2 var/max_dismantle_amount = 2 + /// Icon to use if shutter state is non-null. + var/shutter_icon = 'icons/turf/walls/shutter.dmi' + /// TRUE = open, FALSE = closed, null = no shutter. + var/shutter_state + /// Overrides base material for shutter icon if set. + var/decl/material/shutter_material + /// Shutter open/close sound. + var/shutter_sound = 'sound/weapons/Genhit.ogg' + /turf/wall/Initialize(var/ml, var/materialtype, var/rmaterialtype) ..(ml) @@ -62,6 +71,9 @@ var/global/list/wall_fullblend_objects = list( icon_state = "blank" color = null + if(ispath(shutter_material)) + shutter_material = GET_DECL(shutter_material) + set_turf_materials((materialtype || material || get_default_material()), (rmaterialtype || reinf_material), TRUE, girder_material, skip_update = TRUE) . = INITIALIZE_HINT_LATELOAD diff --git a/code/game/turfs/walls/wall_attacks.dm b/code/game/turfs/walls/wall_attacks.dm index 06c7269a780..068f1b5dac2 100644 --- a/code/game/turfs/walls/wall_attacks.dm +++ b/code/game/turfs/walls/wall_attacks.dm @@ -5,36 +5,22 @@ return SSradiation.resistance_cache.Remove(src) - + can_open = WALL_OPENING + sleep(15) if(density) - can_open = WALL_OPENING - sleep(15) - set_density(0) - set_opacity(0) + set_density(FALSE) blocks_air = ZONE_BLOCKED - update_icon() - update_air() - set_light(0) - src.blocks_air = 0 - set_opacity(0) - for(var/turf/turf in loc) - if(turf.simulated) - SSair.mark_for_update(turf) else - can_open = WALL_OPENING - set_density(1) - set_opacity(1) + set_density(TRUE) blocks_air = AIR_BLOCKED - update_icon() - update_air() - sleep(15) - set_light(1) - src.blocks_air = 1 - set_opacity(1) - for(var/turf/turf in loc) - if(turf.simulated) - SSair.mark_for_update(turf) + for(var/turf/turf in loc) + if(turf.simulated) + SSair.mark_for_update(turf) + set_light(density) + update_icon() + update_air() + refresh_opacity() can_open = WALL_CAN_OPEN update_icon() @@ -62,22 +48,37 @@ else to_chat(user, "\The [material.solid_name] [material.rotting_touch_message]!") dismantle_turf() - return + return TRUE - if(!can_open) + if(can_open) + toggle_open(user) + return TRUE + + if(!isnull(shutter_state)) + shutter_state = !shutter_state + refresh_opacity() + blocks_air = shutter_state ? ZONE_BLOCKED : AIR_BLOCKED + if(simulated) + SSair.mark_for_update(src) + visible_message(SPAN_NOTICE("\The [user] [shutter_state ? "opens" : "closes"] the shutter.")) + update_icon() + if(shutter_sound) + playsound(src, shutter_sound, 25, 1) + return TRUE + + if (isnull(construction_stage) || !reinf_material) to_chat(user, "You push \the [src], but nothing happens.") playsound(src, hitsound, 25, 1) - else if (isnull(construction_stage) || !reinf_material) - toggle_open(user) + return TRUE /turf/wall/attack_hand(var/mob/user) radiate() add_fingerprint(user) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - if(ishuman(user)) - var/mob/living/human/H = user - var/obj/item/hand = GET_EXTERNAL_ORGAN(H, H.get_active_held_item_slot()) - if(hand && try_graffiti(H, hand)) + if(isliving(user)) + var/mob/living/user_living = user + var/obj/item/hand = GET_EXTERNAL_ORGAN(user_living, user_living.get_active_held_item_slot()) + if(hand && try_graffiti(user_living, hand)) return TRUE . = ..() if(!.) diff --git a/code/game/turfs/walls/wall_brick.dm b/code/game/turfs/walls/wall_brick.dm index dd4f244bce2..a8535f6472b 100644 --- a/code/game/turfs/walls/wall_brick.dm +++ b/code/game/turfs/walls/wall_brick.dm @@ -6,6 +6,10 @@ min_dismantle_amount = 3 max_dismantle_amount = 5 +/turf/wall/brick/shutter + shutter_state = FALSE + icon_state = "brick_shutter" + /turf/wall/brick/get_dismantle_stack_type() return /obj/item/stack/material/brick @@ -28,6 +32,10 @@ /turf/wall/brick/##material_name { \ color = /decl/material/solid/stone/##material_name::color; \ material = /decl/material/solid/stone/##material_name; \ +}; \ +/turf/wall/brick/##material_name/shutter { \ + shutter_state = FALSE; \ + icon_state = "brick_shutter"; \ } MATERIAL_BRICK_WALL(sandstone) diff --git a/code/game/turfs/walls/wall_icon.dm b/code/game/turfs/walls/wall_icon.dm index a877a6926b9..faa5f0f9f8a 100644 --- a/code/game/turfs/walls/wall_icon.dm +++ b/code/game/turfs/walls/wall_icon.dm @@ -1,3 +1,6 @@ +/turf/wall/proc/refresh_opacity() + return set_opacity(!(!density || shutter_state == TRUE || (istype(material) && material.opacity < 0.5))) + /turf/wall/proc/update_material(var/update_neighbors) if(construction_stage != -1) if(reinf_material) @@ -12,7 +15,7 @@ if(reinf_material && reinf_material.explosion_resistance > explosion_resistance) explosion_resistance = reinf_material.explosion_resistance update_strings() - set_opacity(material.opacity >= 0.5) + refresh_opacity() SSradiation.resistance_cache.Remove(src) if(update_neighbors) var/iterate_turfs = list() @@ -149,6 +152,31 @@ if(texture) add_overlay(texture) + if(!isnull(shutter_state) && shutter_icon) + var/decl/material/shutter_mat = shutter_material || material + var/list/shutters + for(var/stepdir in global.cardinal) + var/turf/neighbor = get_step_resolving_mimic(src, stepdir) + if(!istype(neighbor) || neighbor.density) + continue + LAZYADD(shutters, image(shutter_icon, num2text(shutter_state), dir = stepdir)) + if(shutter_state) + var/turf/other_neighbor = get_step_resolving_mimic(src, global.reverse_dir[stepdir]) + if(istype(other_neighbor)) + var/light_amt = 255 * other_neighbor.get_lumcount() + if(light_amt > 0) + var/image/light_overlay = emissive_overlay(shutter_icon, "glow", dir = stepdir, color = other_neighbor.get_avg_color()) + light_overlay.alpha = light_amt + light_overlay.appearance_flags |= RESET_COLOR|RESET_ALPHA + LAZYADD(shutters, light_overlay) + + if(length(shutters)) + var/image/shutter_image = new /image + shutter_image.overlays = shutters + shutter_image.color = shutter_mat.color + shutter_image.appearance_flags |= RESET_COLOR|RESET_ALPHA + add_overlay(shutter_image) + if(damage != 0 && SSmaterials.wall_damage_overlays) var/integrity = material.integrity if(reinf_material) diff --git a/code/game/turfs/walls/wall_log.dm b/code/game/turfs/walls/wall_log.dm index acca616ab88..90ca4b057e3 100644 --- a/code/game/turfs/walls/wall_log.dm +++ b/code/game/turfs/walls/wall_log.dm @@ -7,6 +7,10 @@ min_dismantle_amount = 3 max_dismantle_amount = 5 +/turf/wall/log/shutter + shutter_state = FALSE + icon_state = "log_shutter" + /turf/wall/log/get_dismantle_stack_type() return /obj/item/stack/material/log @@ -29,6 +33,10 @@ /turf/wall/log/##material_name { \ material = /decl/material/solid/organic/wood/##material_name; \ color = /decl/material/solid/organic/wood/##material_name::color; \ +}; \ +/turf/wall/log/##material_name/shutter { \ + shutter_state = FALSE; \ + icon_state = "log_shutter"; \ } LOG_WALL_SUBTYPE(fungal) diff --git a/code/game/turfs/walls/wall_natural_ramps.dm b/code/game/turfs/walls/wall_natural_ramps.dm index 9a7eebf11a6..14c7a779e59 100644 --- a/code/game/turfs/walls/wall_natural_ramps.dm +++ b/code/game/turfs/walls/wall_natural_ramps.dm @@ -27,7 +27,7 @@ blocks_air = initial(blocks_air) density = initial(density) color = initial(color) - set_opacity(!material || material.opacity >= 0.5) + refresh_opacity() icon = 'icons/turf/walls/natural.dmi' icon_state = "blank" diff --git a/code/modules/crafting/stack_recipes/recipes_bricks.dm b/code/modules/crafting/stack_recipes/recipes_bricks.dm index 58b49840c8b..0d42d0024fc 100644 --- a/code/modules/crafting/stack_recipes/recipes_bricks.dm +++ b/code/modules/crafting/stack_recipes/recipes_bricks.dm @@ -52,6 +52,10 @@ craft_stack_types = /obj/item/stack/material/brick difficulty = MAT_VALUE_HARD_DIY +/decl/stack_recipe/turfs/wall/brick/shutter + name = "shuttered brick wall" + result_type = /turf/wall/brick/shutter + /decl/stack_recipe/turfs/floor/brick name = "cobblestone path" result_type = /turf/floor/natural/path diff --git a/code/modules/crafting/stack_recipes/recipes_logs.dm b/code/modules/crafting/stack_recipes/recipes_logs.dm index 8b6a961f96a..6b2e9dff879 100644 --- a/code/modules/crafting/stack_recipes/recipes_logs.dm +++ b/code/modules/crafting/stack_recipes/recipes_logs.dm @@ -2,12 +2,18 @@ abstract_type = /decl/stack_recipe/logs craft_stack_types = /obj/item/stack/material/log forbidden_craft_stack_types = /obj/item/stack/material/ore + /decl/stack_recipe/turfs/wall/logs name = "log wall" result_type = /turf/wall/log craft_stack_types = /obj/item/stack/material/log forbidden_craft_stack_types = /obj/item/stack/material/ore difficulty = MAT_VALUE_HARD_DIY + +/decl/stack_recipe/turfs/wall/logs/shutter + name = "shuttered log wall" + result_type = /turf/wall/log/shutter + /decl/stack_recipe/logs/wall_frame result_type = /obj/structure/wall_frame/log difficulty = MAT_VALUE_HARD_DIY \ No newline at end of file diff --git a/code/modules/lighting/lighting_turf.dm b/code/modules/lighting/lighting_turf.dm index 761ea49d37f..1004ad8c7f9 100644 --- a/code/modules/lighting/lighting_turf.dm +++ b/code/modules/lighting/lighting_turf.dm @@ -151,11 +151,11 @@ lum_g += L.apparent_g lum_b += L.apparent_b - lum_r = CLAMP01(lum_r / 4) * 255 - lum_g = CLAMP01(lum_g / 4) * 255 - lum_b = CLAMP01(lum_b / 4) * 255 + lum_r = CLAMP01(lum_r / length(corners)) * 255 + lum_g = CLAMP01(lum_g / length(corners)) * 255 + lum_b = CLAMP01(lum_b / length(corners)) * 255 - return rgb(lum_r, lum_b, lum_g) + return rgb(lum_r, lum_g, lum_b) #define SCALE(targ,min,max) (targ - min) / (max - min) diff --git a/icons/turf/walls/_previews.dmi b/icons/turf/walls/_previews.dmi index 4313a24e990cfd0a32bc9128ed875e3ec959d3f9..02e2637c0c77f5c1655d2d83394cb327e5628dd6 100644 GIT binary patch delta 3949 zcmV-z50dbp9>O4yBmuXPCAb)Oc6LPhivR!s00DGTPE!Ct=GbNc006|1@+N=9LwyBF zlhuUAM3S|>enp|Z6cTSc@XhS7Y|d`gy>3|fsOcMg(9W_eD-K6WW-U=I;&P@$f$kM< zA|OXt#!O5GGfJfPVUZ_FI?o5#<}WlF9#D%YXE{!un<(c&+s=6bvQ63_oY8VmYMNmH z+*dZu5YSoJ)i%j6JC|?+K8$}qsQ3>(y%w)%lyQBOS(DnJCPeTli7_^3Ra35y`~g{4 z(ll5;txm{d>S+s z7eBpGTE0m%e?n+g4F?ds0nW<8N1_Ta&-GuveOuNegggMan4n7lcqO#Fx*9YQAmFMI z9h~Z#a9V2AfD{2v_YdgG>wspu(N<>dt&K->X0@mqfZxFot-I+7*>w2I3ktoYql3~;LdOn^dsasHzMyh>6Zpu)11 z*QJU2za@(Lp9NT;vM;k07L2lT#4TzL~4Zq-wj9snwo=x!hmb+ zQ()ryU0;J9pg^%ftdN~Cp4A7TN5&^8*RKDZG{YSP$P{Q6K&z0VP&Vw49-t!Av-Y2n zsHuaMN9R?E9lXJy1uSq1073-gx69=lBfxxYaLQI6l>XO(?pBrfM+NxyZF4h1$P<7o z&77<7E!JR6p^1Mvge^HAC2I9XXJXMCpaX=rYtf-ZakFt$ZntId33wsERbb+LfROAM z8hKsClbq3J0FZF8iEm?oTTf*fd}zX%#Cf6jz>7S9h|gG290R1tu@2zHZ4e)>d3!Mg zhp0phZ>Bi(L6|rYDMOC2LtqZ zaNGwi!lPKB#9|4kQGnF{?FaNeG_M?J?%Rdr!90K~dXafo8pC-2Sy_f%P*x6 zZh3$~sHA^_WCS3mnO>G&^{2WCALLN3Yegt7iSgsp%=%W}2<3WlnGY~bF#*WDG{g5I zZYe__c`kPA!9}1q2h!)kcAI_$0G;|)tCvr8d?(^kv$QB)6rfCX6v1mZ89NP*APfPz z#X^*-vsW{+c(JNW{KAF+-C{vqaS;G)M<@muAzXjG5TK7=YvgP>g}eSEglpG-`SD}3 z8=>aoM_I7;;&<_)1*^G+{7N~0oU}KV*Zv^T8iGNPdGf)6JxrDSk1xKUbE`S^VSim+>t8%kenJM-4V#M+kZ4l!9*1 z#MAua5fbqT9e&35X+CW|eE$3o_X?ZH3%2W0RL=2_5Q?KS#TCMs=1&5|6>S;rhxLg8 zPVyPRmjs0X$N3om$HxZ*v;0>9`1F6|P({rj2H^4d?eU-V`W7|+5Ac5k;13YRlK??Q zHy=}@!?&Aqmj7A+pT7PJUkH#IU!MXEetb#+fNw>EQ~cim;J5|zeK3I_o=Hae3h?U_ zy}m`wR|A-w%Z?u41i!%jInp4#zC}&kpF1DmuZNM#eT$lS z<9t3q94Sp6$vB_(=boOPWJm5PYU2J}4nSD44_UBeXMq11TTKZI-XI_b1oFr#=Jw~x z&Db71z7SxGH$6ih-t-W_N8~>a2>FkQWSU>h?azURCJ>Sa@wRcu!`sG|P5dZI>7Df> z$|v~zbuqU;hYQlNU3girBEEkF!3Y}$_;5@C@L!MdACD3wQ~Psso7{7J7;b_H&LqE> z+n+1Po)Iw3@{eil=*Qz6znI&fJ70rm0^~cNeVICt$4}EMu0Ek>!Cc#>JJZDs*|~q1 zk_9R@Z{Kc~OZZD1$OC-zL|7`btdwf;vqC!$kRLF9A3hwY*wppr<_3Sa2ZjgoQ9?t;XK7Q=h{KbiasbNH>RJLs0Mdho(>y>yh?02-=>dx>BLiS@ zk}xJU%C&K!hcQ_Ixnh5htTqp^(#N`tZ$3x>AW9hZB`G~Y6T^`MP-{n7k<K(bfP;f^k`IEGZf@W&aj*spPSv)qR1FF+17D#6wR;#}r44^g^?m)C=SuS+#>wzt zA1rvXvus@|K9MS|p}F|^Tnw;MC5i)Mt1pOgD~0S{3G|i;&{#&r2Q{l6lIRg)s2Hcf zN@gH@j}cmS04Z+a|06qP0X(7GX#JuqiXj`H^!j`F2qN1tOz)Zis{Seia|F*;m1;pH z@&RJqQ_XezQv83U0HIa5hsIn|h6pPw05#2r1vR#^AwHw&&#O=pd=@~XKXz~ctD3qz zsh<^EZERq4>{XO1&r(eLM7^O(&e%vj9 z4`RA!p~<=j&-#!I3=mV+$w=)dsgX;&-D;II zY6T$AG&Qfe4Mnjto#AZiZ0rCUXJW21l?ZVF@9%%_?o-47aiTa;XtgEKXuYyxD|mDu=ipBbIGLK?&bh2bWN!Bsz%coTAxg$rTn5pSu8VLcM4Tuxn@$uSGyi9H9QAjyo7$pIx5^s0) zhwOiY3A$Gw^p~mAEcJ*MwxYkv%38a2tB{)Klp;}I$Z84_wbAN6QMH(yuYpaRpgV73 zisREsu$@lf?Gm|4ZLD9x@rf#I0iXtdR9_eaP(9Dr`+0oZ`>J`X$RZ?VhT z%FkYc8)wULECA#BLQdtug3CxHtm)Su;@*Euh7YE1BCNl9V`|>wa7#`4K?ItZxK*mY zFa#);RlXDx^IW{!ZN@hDke7lM5?e%W>(v!9^ zHci{KUDLwyMN=TGW!k2LubXDS?~o6l%AFq;M(7%3bo+DV^8j}6*1`b%lS&w%g}yr- zfL=I&13&|`9^e`B835r@@t@nq4}hQW+YSb3`BG^B<%oC4|S;l+OB_9fM>|(n7Cmpg-*`)X}Z|S`#!`PJWoDHgWMVZ zu2N~cl|f@CkE2ilo+qCHP|XqLDKVQkISml4$s<3O&oQw?T(_0$+wMAv%r;CDo!0;l&@n(S|NOkYzJ~WPdC!0M@)-an zk8QhlyQ5dTLk$e_7+nCcw+b-MgWC>{@yH(4q=yfXK-^|9qm0 zf<)vy7{0x}mPSH8;J+wHIAMW>I`Tg}w)&kLpy_(VK_D8W|Gh>8@c-0E$VYr9pXr0} zr`i)8Q3sM}I~)MNWfPN;JwShv#|wPM1=KTM>rg($&-B5D$B0TII+?*J3P}U70ATcV z3N^^`q!%V^4&(>?d<|k!rSZkYbnY5b|-PM%L8~0qDGY?ECUVel|dw zh$8=ESL-xQPzbT>F*b5U2ax4SLqY_gCqLl7NQ3Hky@NE+bV(0nXKnT>-#1}jKEWsX zEDd&j|KoE<8o&Xzoc@2D|LxQZiBIwaAM44d_$Z&HL7X}w|6_mboCd`A#K^m?^Fr1j z%I`xrg^zvtA-~N9*mVQ{lXIsU@b0&by^#1MzkiNs-0m;06a&29$>dg`X8M) zoadbPamTF;)pDLYPktWYM1h@b{!A6;P4aW(=K=oCG>7lMmE_$#y(z((00000NkvXX Hu0mjfZdP`> delta 3657 zcmV-P4z}^aAfO(QBmuOMCAby0`wj2_0004WQchC0F0d3>F0)30xADltGB{j~_18plC zX9(mhY-$^2n4F8af$WEWFO>a;?jF@+HOjd5ACror&fo9$0;3YP&sM~;>Hq)@R7pfZ zRCt{2n+td1x)FfQuH=H9q*-9M28U#umR_<=S2s=C+w%W^ST!#_Y}r;esn4F%4ly<; z79aDHEDyy3r6?8y2Ope#Odcv0t+h(YRR86K6pP=1ENIs|SS~()d=y!IOdNgyw5qn7 z75ij4D{Wt*RF-+F|MKFZtOo?zEZ}lPE-l~{%j)W?cL;!%s|Gr|t83)ccu-qX037e% z(v`mt{!A>b#H)h8!%2!I+C7kzPIMXOKsp9Oe%xv-lR>VOX6 zT?SmCT&7 zhIkeqv^^3ZQ*K@VIcbJE2*?C93s4JE6v~Pm(gO;a?4|#VM2#J6Je^l1bnp>^*0R`L z0B9o^-d(LeDhBhhK`C2&ko(^<-CC6R2LZgeXs!nY+8A&nnR639#TtwyG%jPrI_hqqMW&y%@p>U1> zxzKA+%TTvmt{s{``n;C0IMiSyjpRX0R2wv}+X&Eq=fPng)PRSvf{8^Vs1iWzfBgl# z56sIOn0vkCJeUW#!3UamBQcx@NXk;=f;@A;w2d=F0o=laB4kT8&IBYAU;em>6=i8q z8QYhJ5WsUL{_^7{rXcZvK2$P;M3G$;vndJ{1^?rwTOKe7l~j-n08*OiWa&+Js2lM? z3gxXn^UJ2;qS1aCYO5v{mh;ZxrFK=#tn!|uJH#ay+sTe%v#C8=58uB1 z-95rXXbYC>Qc_N}pKK@&jucmbG2T832s7F;To3CC0gkp4!1siNfWz$>fWx0}2`1a$ z1@QUVQALM84dChY^7s#YyhMk8{|EdZ0sIM~cofj8==vu0>Gs`SIobYRfX`3=ga-iP z!P9e~!JFq4fPI%WIMzM`;IIYreK0`~k0gWb0{HZdkC*81-2jtg*~tTrv=^{GhZ@Ak zOLPe9b8iRy?Km(SI39n4-FQ2$&pkc8{EOrzI)n@7w*$f_rNxsBx8wSM-1GA@ugE<| zhp;}E18Ar0{U$qQC%}IX&8E1?KG}fii9H{himCOvayPUF4-Wur;i9MC1{XaD_z3Nf zJ%RQ|AQ^8jrq<`IhDHccgK*i{Z-dLmmQ4J}O6lz7C7hpVr?-o#^*NZ34z0rTgcbM_ zVn1O=fDfk>fPZ_a{qe+qK{B>JH?_z;)owp-L=b1Ry_i~`D~Ik8kW99p(%O-ir>XX0 zYJKkQ8hj%lUHROXsSVobZhA%4CwMQIYTIOGx|k3>^$%m`S}ArH7rWKU{v|eOvwV0* zm@Bh1muk_yLOl&gHyD464?d{a)%EWB8kPt88?^DgYP#cJ(_L17u8jfq$xosG*VQZG z=mw<#4vrH9h&O}zRzDUlR&sY;O#@a`w)aZFij7q1Nx(vJJpx*mpDV2X)EO2oxN5I{ zg`pKYJQ^wokndL493TvcHyX~-RC zm3Fm}bxrkYb-{~J1KVzgKB44A*` zScwwZf#IloBE&5hvU?@qQzoF&L`54ORvnV)7GkIvr@)FwAb5@mH8}tmx6uEgow5MW z;5Jgf=!#;{#%KBd9X>=PJBI095W#q^SDW3BHl`CI_ z&IK^w;~E9d;0g;0HCkCR3;jNVzakfi__MXIJapQBt7tZonPxCsI{=M^ZQy54e_=Zg zgTQZX&uZflS-vA93ZPOUU?q75C!COs2LU-zb0Sm>fIf{?F$Ab&#z+d%G*I*BbD58n z!)d8)^?)kClPWqG2(bRpM)B>frGe_@{swK%2q9pFRXY+RSf|XthH!aAv6FFZS2P#* zrCou40$u41BE3^eOIT103l_a71w^E8mY9~%~nyPngMB~scFuwFp8b&6lGIqV+W|5 ziK)(%Bg6sT-QC`$gaBcnIAdtIhl-|JTzcex9Gqet2WwKVBtIoTb&_AW6@e3w_d) zKsi9gApoNRwnSHaG&gbxQ30!SiqK4 zg@Dq|8ng{_0J66BA>f|1${HL5oJE5z`Ct>8xFH{G*#}Juur+g;xFIWtK|=OzOdKR# zADl~r1OvaT6xr_?Iu4RJif03V6mv#-j?K&-&RP3`cewrWxZkNPuQ0K+c1E)9w%WXb+&lULM3RV4L>>IAWH6bcBLvHXpQqqCM6T0&t>#HUJ3kl8MpC zGXm0>X5x|v!y_O@F>26GAc!7!vuY5MGJZar821K}cgukIFYTWG2cHpezC_)UTZwz& z*1Gv1I6y*BhjWc2=wTA3v^ORMWcMR09}Z&V`DQcVct-pWcQTs^L&(RG7wGX^?%7jeOWUFPuk%rssdWH=;rBe*4%9=h2`E{4UOiq`?uHNrMUhqdjR*Jdb_w zAp669F2KO=B0uCHi3}@;2ssO&*(LoC_dA1t&ie?gWmE{0Sr(5ZMr!YH@o20#ZwA1h beEID^l$7UqF5G|Y00000NkvXXu0mjf90S4P diff --git a/icons/turf/walls/shutter.dmi b/icons/turf/walls/shutter.dmi new file mode 100644 index 0000000000000000000000000000000000000000..671d71682fd08c946cc98d874bd075de31bca30c GIT binary patch literal 1546 zcmZXUdo=0d~3`WSXlc*uKN#vFYBbOcXGt7*1)Szv% z4N0ijWGO{cjYbzW-P7!lNYcp=a%)F3_ILKL&UViGyx;eE&v~BbJJ~ z2mrwP`_Y3Dg%M*f(nt30>}-ETGP6Ti>GYViJ*n|2>G8??ksFEN{&ho`Y@+`}HE%*{ z_2sD}Z!HpKi)aC-NzC)gwV#6P-$2oOWW3X$Pf$tL{k5#>R`sPMa=$QT0JTc-_i`r*)d;0AK?B>7F5( zk}-(|^KH0^koVfX%Xw90(V`GcudmIvQOk4DdskXTH8=%e+gp=un>XYaQ<`bfbMG#k zt1t93c(9lC>vq{gTZ{OzCk4WJ-fG5{)cXamJl?;``FK6{twuvsKkAMfLdot{n17Mp zyo(5s4G-Ibfyqf@@Fme>d>jQ%9X-1C^I=!R z)WHNEVuDg{lphX5UXM5-_IM`8(a}-rk`WslTWiyl`W{8k2$KD|(|O04lDXZ9E7LzJ z<&bV+5&{$PJkkN>gUq_}jd0xOpDJ*(v$FuSsEqoB-uNm)b>SVQ3%0DQ(}TApYm!(j zTxe76i=wU=NO1X7lv`PjPH`n>RlngxisJv!U7q^o@p3(%3HqhUq+Wd>sjR#~ptYzv z-@U6{xKs$Z`@P(0r5 zIDDk+b4A-*87K1Z*5a;cy};)ayA#zuS0ioCyUWtuW z*`QQUqZ5Nh2-K4g0eCyPVy#jcXKwDf)nq~QkMbgN6zq$!(ai2VE*KjdWANn7tH5m$ zzt(~#)z-x$FF|Vcg=1TjM7f=9RSw=AnzH*);o5LBJRZMijPblP(;cTOo!NUH7|8)J zRyrLtd)3!>yQc_uq{-C?n#tx0uI$8aB9W3KiZ{PzQ{lRJFmMz+dlu*NdP% zb(7c|q}>fWp&;1X{*3l%TI4jkO7*)dfL zVPJqgN?~r$FO*l03#6#?XaZ;JkXBY~Q7U)M`x=<2uytz4#McH*W^>_g`R=NrCj5UW zeajV#L<{b0F?A~?13MQ2c9r7OAS5ZhEtS zT+WH)HAI>TcOySKJ+FN>0@W<0MQ}lH>(l*Lkj0HLNTTo)#61vN4Jpj+YNF*->Or%Q zM!B}1XAinnJgGZ+iFI5Mbava-<*Xiq!W-K5#ywZIAMPVtjzCRY{5bbQNo3ad)`dyE z(|Sv-c5vaEBZ{+Ht=K^g8Bxt}PUVc0oSc&%l3j?{o9>K~dGzWz)H9g|bXzEgnOlwQ z4d)=8MZ2rCckEVcl0+i0&h?E@XIxY7B*DG%=S%vCj?LT$BM|F&XwS0Ah%!(A9E=YM z{^D5(WVhb1CwjskW5lD#ZwJ4>vrw5b23y|SY$M8>1`TIQ^~eqR6|}C?z*?jyHZ!E9Qoz>^TpD*dJb%FH z;=}r^P+MkAbU8ng!PX7Z%+5SsRUBwMGz;=fb(P0X+I3AW^Wm*^XhRcLTlpGyHpLA) z+Xy_A5qg;!fd(BUVP3)~BA!sBod(_3Ex_`x{w1e6s1tnntRmn|hiU)z}@3_p4DB&8XxgWyv!zST%f`+p+|;b_WKFIIf1 To;Za=hCA^038FW8vHAZ3PMX5n literal 0 HcmV?d00001 diff --git a/maps/shaded_hills/shaded_hills-inn.dmm b/maps/shaded_hills/shaded_hills-inn.dmm index 60e1bf32be4..6bcba706e56 100644 --- a/maps/shaded_hills/shaded_hills-inn.dmm +++ b/maps/shaded_hills/shaded_hills-inn.dmm @@ -51,9 +51,7 @@ /turf/floor/natural/path/herringbone/basalt, /area/shaded_hills/inn) "dH" = ( -/obj/structure/window/basic/full, -/obj/structure/wall_frame/log/ebony, -/turf/wall/log/ebony, +/turf/wall/log/ebony/shutter, /area/shaded_hills/general_store) "dK" = ( /obj/structure/table/woodentable/ebony, @@ -101,6 +99,9 @@ "ft" = ( /turf/floor/natural/mud, /area/shaded_hills/outside/shrine) +"fw" = ( +/turf/wall/brick/basalt/shutter, +/area/shaded_hills/slaughterhouse) "fK" = ( /obj/structure/reagent_dispensers/barrel/ebony/water, /turf/floor/natural/path/herringbone/basalt, @@ -218,9 +219,7 @@ /turf/wall/brick/basalt, /area/shaded_hills/outside/shrine) "iX" = ( -/obj/structure/window/basic/full, -/obj/structure/wall_frame/log/ebony, -/turf/floor/natural/path/basalt, +/turf/wall/log/ebony/shutter, /area/shaded_hills/inn) "iZ" = ( /obj/structure/fire_source/fireplace/basalt, @@ -774,9 +773,7 @@ /turf/floor/natural/path/herringbone/basalt, /area/shaded_hills/inn) "HE" = ( -/obj/structure/window/basic/full, -/obj/structure/wall_frame/log/ebony, -/turf/floor/natural/path/basalt, +/turf/wall/log/ebony/shutter, /area/shaded_hills/stable) "HF" = ( /obj/structure/textiles/spinning_wheel/ebony, @@ -803,9 +800,7 @@ /turf/floor/wood/ebony, /area/shaded_hills/tannery) "IQ" = ( -/obj/structure/window/basic/full, -/obj/structure/wall_frame/log/ebony, -/turf/floor/natural/path/basalt, +/turf/wall/log/ebony/shutter, /area/shaded_hills/farmhouse) "IS" = ( /turf/floor/natural/mud/water/deep, @@ -8580,7 +8575,7 @@ TR Wg Wg dH -dH +Wg dH Wg Wg @@ -8729,13 +8724,13 @@ EV Ic EV Gs -Wg +dH uJ uJ WI uJ uJ -Wg +dH HI QQ fR @@ -8887,7 +8882,7 @@ uJ uJ uJ uJ -dH +Wg HI QQ fR @@ -9033,7 +9028,7 @@ EV Ic EV QS -Wg +dH uJ uJ sM @@ -9185,7 +9180,7 @@ TR Ic TR Mp -dH +Wg GQ uJ sM @@ -9466,7 +9461,7 @@ cx cx TR TR -Ee +iX yn Im ZY @@ -9922,7 +9917,7 @@ TR cx TR TR -Ee +iX VW lF lF @@ -10226,7 +10221,7 @@ TR TR TR TR -Ee +iX ON lF Ap @@ -10530,7 +10525,7 @@ TR TR HI TR -Ee +iX ZE lF lF @@ -10858,11 +10853,11 @@ EV TR EV TR -xH +fw IS Br Bx -xH +fw HI HI gp @@ -11144,7 +11139,7 @@ qG Ee Ee Ee -Ee +iX Ee Ee Ee @@ -11747,7 +11742,7 @@ TR HI TR nn -nn +HE nn nn nn @@ -12066,7 +12061,7 @@ Ak Ak Ak Ak -HE +nn TR TR EV @@ -12225,7 +12220,7 @@ EV Ic EV TR -LN +IQ bv qP qP @@ -12674,7 +12669,7 @@ Ak Ak Ak Ak -nn +HE KG EV EV @@ -12985,7 +12980,7 @@ Ic Ic EV TR -IQ +LN cl qP qP @@ -13130,7 +13125,7 @@ or Ak Ak Ak -nn +HE UU EV EV @@ -13446,7 +13441,7 @@ qP qP qP qP -LN +IQ FD Rl Rl @@ -13876,19 +13871,19 @@ TR TR nn nn +HE nn nn nn +HE nn nn nn +HE nn nn nn -nn -nn -nn -nn +HE nn nn TR @@ -13897,7 +13892,7 @@ EV Ic qP hc -LN +IQ HF ra gg diff --git a/maps/shaded_hills/shaded_hills-swamp.dmm b/maps/shaded_hills/shaded_hills-swamp.dmm index 2526bb0beb3..4711bd01fab 100644 --- a/maps/shaded_hills/shaded_hills-swamp.dmm +++ b/maps/shaded_hills/shaded_hills-swamp.dmm @@ -1,8 +1,6 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "aM" = ( -/obj/structure/window/basic/full, -/obj/structure/wall_frame/log/ebony, -/turf/floor/natural/path/basalt, +/turf/wall/log/ebony/shutter, /area/shaded_hills/witch_hut) "bg" = ( /turf/floor/wood/ebony, @@ -8926,7 +8924,7 @@ Xt Xt Xt Xt -Ev +aM vz YX Ev @@ -9084,7 +9082,7 @@ bg SE bg bg -aM +Ev Xt Xt Xt @@ -9388,7 +9386,7 @@ bg bg bg KA -aM +Ev Xt BY lE @@ -9688,7 +9686,7 @@ Xt Xt Ev Ev -Ev +aM Ev Ev Ev diff --git a/maps/shaded_hills/shaded_hills-woods.dmm b/maps/shaded_hills/shaded_hills-woods.dmm index 9d2af2d4755..b376ba3d5af 100644 --- a/maps/shaded_hills/shaded_hills-woods.dmm +++ b/maps/shaded_hills/shaded_hills-woods.dmm @@ -164,6 +164,9 @@ /obj/structure/wall_sconce/lantern, /turf/floor/wood/ebony, /area/shaded_hills/forester_hut) +"MU" = ( +/turf/wall/log/ebony/shutter, +/area/shaded_hills/forester_hut) "Oi" = ( /obj/structure/closet/crate/chest/ebony, /turf/floor/wood/ebony, @@ -19597,7 +19600,7 @@ YO YO YO ES -SI +MU TP lb lb @@ -19907,7 +19910,7 @@ lb lb lb JJ -SI +MU kx kx ES @@ -20207,7 +20210,7 @@ ES ES SI SI -SI +MU SI SI SI diff --git a/test/check-paths.sh b/test/check-paths.sh index 4c146c172a1..10e06b2c36e 100755 --- a/test/check-paths.sh +++ b/test/check-paths.sh @@ -47,7 +47,7 @@ exactly 3 "unmarked globally scoped variables" -P '^(/|)var/(?!global)' exactly 0 "global-marked member variables" -P '\t(/|)var.*/global/.+' exactly 0 "static-marked globally scoped variables" -P '^(/|)var.*/static/.+' exactly 1 "direct usage of decls_repository.get_decl()" 'decls_repository\.get_decl\(' -exactly 21 "direct loc set" -P '(\t|;|\.)loc\s*=(?!=)' +exactly 20 "direct loc set" -P '(\t|;|\.)loc\s*=(?!=)' exactly 0 "magic number mouse opacity set" -P 'mouse_opacity\s*=\s*[0-2]' exactly 1 "magic number density set" -P '\bdensity\s*=\s*[01]' exactly 0 "magic number anchored set" -P '\banchored\s*=\s*[01]' From a56761cba8ade9c09d266d4af7db2cddd924ad13 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 24 Jun 2024 10:40:00 +1000 Subject: [PATCH 19/38] Quick fix for lock ordering runtimes. --- code/game/objects/structures/__structure.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/__structure.dm b/code/game/objects/structures/__structure.dm index 4b3c462541d..423b8d07818 100644 --- a/code/game/objects/structures/__structure.dm +++ b/code/game/objects/structures/__structure.dm @@ -61,7 +61,7 @@ reinf_material = GET_DECL(reinf_material) . = ..() update_materials() - if(lock) + if(lock && !istype(loc)) lock = new /datum/lock(src, lock) if(!CanFluidPass()) fluid_update(TRUE) From af1831af4b2ad2fee0dd9478b8b650c4ec3d50d8 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 23 Jun 2024 15:27:09 -0400 Subject: [PATCH 20/38] Improve wall shutter overlay placement and updating Fix shutters not updating with ambience properly --- code/__defines/directions.dm | 18 +++++++++++++++++- code/game/turfs/walls/_wall.dm | 2 ++ code/game/turfs/walls/wall_icon.dm | 9 +++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/code/__defines/directions.dm b/code/__defines/directions.dm index b4524560447..4f6bff8a3a0 100644 --- a/code/__defines/directions.dm +++ b/code/__defines/directions.dm @@ -6,7 +6,7 @@ #define N_NORTHEAST 32 #define N_NORTHWEST 512 #define N_SOUTHEAST 64 -#define N_SOUTHWEST 1024 +#define N_SOUTHWEST 1024 #define CORNER_NONE 0 #define CORNER_COUNTERCLOCKWISE 1 @@ -43,6 +43,22 @@ return ret +/proc/corner_states_to_dirs(list/corners) + if(!istype(corners)) return + + var/list/ret = list(NORTHWEST, SOUTHEAST, NORTHEAST, SOUTHWEST) + . = list() + + for(var/i = 1 to ret.len) + var/dir = ret[i] + var/corner = text2num(corners[i]) + if(corner & CORNER_DIAGONAL) + . |= dir + if(corner & CORNER_COUNTERCLOCKWISE) + . |= turn(dir, 45) + if(corner & CORNER_CLOCKWISE) + . |= turn(dir, -45) + // Similar to dirs_to_corner_states(), but returns an *ordered* list, requiring (in order), dir=NORTH, SOUTH, EAST, WEST // Note that this means this proc can be used as: diff --git a/code/game/turfs/walls/_wall.dm b/code/game/turfs/walls/_wall.dm index a57293246e3..d5e152c4372 100644 --- a/code/game/turfs/walls/_wall.dm +++ b/code/game/turfs/walls/_wall.dm @@ -44,7 +44,9 @@ var/global/list/wall_fullblend_objects = list( var/decl/material/girder_material = /decl/material/solid/metal/steel var/construction_stage var/hitsound = 'sound/weapons/Genhit.ogg' + /// A list of connections to walls for each corner, used for icon generation. Can be converted to a list of dirs with corner_states_to_dirs(). var/list/wall_connections + /// A list of connections to non-walls for each corner, used for icon generation. Can be converted to a list of dirs with corner_states_to_dirs(). var/list/other_connections var/floor_type = /turf/floor/plating //turf it leaves after destruction var/paint_color diff --git a/code/game/turfs/walls/wall_icon.dm b/code/game/turfs/walls/wall_icon.dm index faa5f0f9f8a..d73c14e859c 100644 --- a/code/game/turfs/walls/wall_icon.dm +++ b/code/game/turfs/walls/wall_icon.dm @@ -138,6 +138,12 @@ I = image(_get_wall_subicon(reinf_material.icon_reinf, wall_connections, reinf_color)) add_overlay(I) +// Update icon on ambient light change, for shutter overlays. +/turf/wall/update_ambient_light_from_z_or_area() + . = ..() + if(shutter_state) + queue_icon_update() + /turf/wall/on_update_icon() . = ..() cut_overlays() @@ -155,7 +161,10 @@ if(!isnull(shutter_state) && shutter_icon) var/decl/material/shutter_mat = shutter_material || material var/list/shutters + var/list/connected = corner_states_to_dirs(wall_connections) | corner_states_to_dirs(other_connections) // merge the lists for(var/stepdir in global.cardinal) + if(stepdir in connected) + continue var/turf/neighbor = get_step_resolving_mimic(src, stepdir) if(!istype(neighbor) || neighbor.density) continue From 6839ab982be576e5af49ca12e5d992fa1fcda988 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 23 Jun 2024 15:29:41 -0400 Subject: [PATCH 21/38] Replace shrine windows with shutters --- maps/shaded_hills/shaded_hills-inn.dmm | 69 +++++++++++++++++++------- 1 file changed, 52 insertions(+), 17 deletions(-) diff --git a/maps/shaded_hills/shaded_hills-inn.dmm b/maps/shaded_hills/shaded_hills-inn.dmm index 6bcba706e56..7aaad11a98a 100644 --- a/maps/shaded_hills/shaded_hills-inn.dmm +++ b/maps/shaded_hills/shaded_hills-inn.dmm @@ -47,8 +47,10 @@ /turf/floor/natural/grass, /area/shaded_hills/outside/shrine) "dC" = ( -/obj/structure/door/wood/ebony, -/turf/floor/natural/path/herringbone/basalt, +/obj/structure/door/wood/ebony{ + dir = 4 + }, +/turf/floor/wood/ebony, /area/shaded_hills/inn) "dH" = ( /turf/wall/log/ebony/shutter, @@ -210,6 +212,12 @@ }, /turf/floor/wood/ebony, /area/shaded_hills/general_store) +"iC" = ( +/obj/structure/door/wood/ebony{ + dir = 4 + }, +/turf/floor/wood/ebony, +/area/shaded_hills/general_store) "iH" = ( /obj/structure/door/wood/ebony, /obj/abstract/landmark/lock_preset/shaded_hills/inn_interior, @@ -785,6 +793,12 @@ "Ic" = ( /turf/floor/natural/path/running_bond/basalt, /area/shaded_hills/outside/downlands) +"Il" = ( +/obj/structure/door/wood/ebony{ + dir = 4 + }, +/turf/floor/wood/ebony, +/area/shaded_hills/shrine) "Im" = ( /obj/structure/wall_sconce/lantern{ dir = 4 @@ -796,7 +810,9 @@ /turf/wall/brick/basalt, /area/shaded_hills/outside/downlands) "IL" = ( -/obj/structure/door/wood/ebony, +/obj/structure/door/wood/ebony{ + dir = 4 + }, /turf/floor/wood/ebony, /area/shaded_hills/tannery) "IQ" = ( @@ -818,6 +834,13 @@ /obj/structure/wall_sconce/lantern, /turf/floor/wood/ebony, /area/shaded_hills/inn) +"Jp" = ( +/obj/abstract/landmark/lock_preset/shaded_hills/inn_interior, +/obj/structure/door/wood/ebony{ + dir = 4 + }, +/turf/floor/natural/path/herringbone/basalt, +/area/shaded_hills/inn) "Jt" = ( /obj/structure/closet/cabinet/wooden/ebony, /turf/floor/wood/ebony, @@ -854,8 +877,7 @@ /turf/floor/natural/path/herringbone/basalt, /area/shaded_hills/shrine) "Kh" = ( -/obj/structure/window/basic/full, -/turf/wall/log/ebony, +/turf/wall/log/ebony/shutter, /area/shaded_hills/shrine) "KG" = ( /obj/structure/railing/mapped/ebony{ @@ -965,6 +987,9 @@ /obj/structure/railing/mapped/ebony, /turf/floor/natural/grass, /area/shaded_hills/outside/downlands) +"RG" = ( +/turf/wall/brick/basalt/shutter, +/area/shaded_hills/shrine) "RO" = ( /obj/structure/wall_sconce/lantern{ dir = 8 @@ -1015,6 +1040,12 @@ }, /turf/floor/wood/ebony, /area/shaded_hills/inn) +"Ti" = ( +/obj/structure/door/wood/ebony{ + dir = 4 + }, +/turf/floor/wood/ebony, +/area/shaded_hills/farmhouse) "Tr" = ( /obj/structure/table/woodentable_reinforced/ebony, /turf/floor/wood/ebony, @@ -1039,6 +1070,10 @@ "TR" = ( /turf/floor/natural/dirt, /area/shaded_hills/outside/downlands) +"TZ" = ( +/obj/structure/door/wood/ebony, +/turf/floor/natural/path/herringbone/basalt, +/area/shaded_hills/shrine) "UD" = ( /obj/structure/table/woodentable/ebony, /obj/item/flame/candle, @@ -9336,7 +9371,7 @@ Wg Dn yu Wg -eG +iC Wg Wg HI @@ -9616,7 +9651,7 @@ TR Ee Ee Ee -iH +Jp Ee Ee Ee @@ -12527,7 +12562,7 @@ TR LN LN LN -WO +Ti LN LN TR @@ -13286,7 +13321,7 @@ VU VU LN LN -WO +Ti LN LN LN @@ -18399,7 +18434,7 @@ By iK QB QB -AE +Il QB CR CR @@ -18553,10 +18588,10 @@ iK kv kv QB -PG +Il QB QB -PG +Il QB QB CR @@ -18719,7 +18754,7 @@ XM XM XM CR -AE +PG kv kv kv @@ -19160,7 +19195,7 @@ kv kv kv kv -Yc +RG XH Vj CR @@ -19312,7 +19347,7 @@ kv iK kv kv -AE +TZ Vj Vj TM @@ -19470,7 +19505,7 @@ CR Ot bW CR -AE +PG ft ft ft @@ -20078,7 +20113,7 @@ uK Gb Vj Vj -AE +TZ ft Zx XY From 56c698435af40857c49fd9d490b40305290c8e79 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 23 Jun 2024 20:01:16 -0400 Subject: [PATCH 22/38] Fix stray lanterns on fantasy inn map --- maps/shaded_hills/shaded_hills-inn.dmm | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/maps/shaded_hills/shaded_hills-inn.dmm b/maps/shaded_hills/shaded_hills-inn.dmm index 7aaad11a98a..016591882c5 100644 --- a/maps/shaded_hills/shaded_hills-inn.dmm +++ b/maps/shaded_hills/shaded_hills-inn.dmm @@ -268,6 +268,13 @@ /obj/item/bedsheet/furs, /turf/floor/wood/ebony, /area/shaded_hills/stable) +"jI" = ( +/obj/structure/wall_sconce/lantern{ + dir = 1; + pixel_y = 10 + }, +/turf/floor/natural/dirt, +/area/shaded_hills/outside/shrine) "ke" = ( /obj/structure/wall_sconce/lantern{ dir = 1; @@ -659,13 +666,6 @@ /obj/item/bedsheet/yellowed, /turf/floor/wood/ebony, /area/shaded_hills/general_store) -"Ch" = ( -/obj/structure/wall_sconce/lantern{ - dir = 1; - pixel_y = 10 - }, -/turf/floor/natural/grass, -/area/shaded_hills/outside/downlands) "CR" = ( /turf/floor/wood/ebony, /area/shaded_hills/shrine) @@ -6017,7 +6017,7 @@ HI HI HI HI -aU +TR TR TR Ic @@ -6321,7 +6321,7 @@ HI HI HI HI -Ch +HI TR EV Ic @@ -18603,7 +18603,7 @@ CR pd CR QB -kv +jI By kv kv @@ -18907,7 +18907,7 @@ CR pd CR QB -kv +jI kv kv kv From 2e52a9c88b1cbd47a8e12788701d6086c51f5bc4 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 23 Jun 2024 22:04:58 +1000 Subject: [PATCH 23/38] Fixes runtime in simple_animal exoplanet adjustment. --- code/modules/mob/living/simple_animal/simple_animal.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index a45ac88e7d5..b55a7cfb912 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -635,7 +635,7 @@ var/global/list/simplemob_icon_bitflag_cache = list() return for(var/gas in level_data.exterior_atmosphere.gas) - var/gas_amt = level_data.exterior_atmosphere[gas] + var/gas_amt = level_data.exterior_atmosphere.gas[gas] if(min_gas) min_gas[gas] = round(gas_amt * 0.5) if(max_gas) From 0090a12fc7330ab37609015a351e87f724a69903 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Mon, 24 Jun 2024 21:58:46 -0400 Subject: [PATCH 24/38] Prevent drakes from activating grenades --- code/game/objects/items/weapons/grenades/grenade.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index 763eb23c7d8..d16532308ee 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -60,6 +60,8 @@ /obj/item/grenade/attack_self(mob/user) if(active) return + if(!user.check_dexterity(DEXTERITY_WEAPONS)) + return TRUE // prevent further interactions if(clown_check(user)) to_chat(user, "You prime \the [name]! [det_time/10] seconds!") activate(user) From 05fc33f5b10b6f2525b8e15a31893141676d63ec Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Mon, 24 Jun 2024 21:27:56 -0400 Subject: [PATCH 25/38] Improve fake fire effect visuals --- code/game/objects/effects/fake_fire.dm | 41 ++++++++++++++++++++------ 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/code/game/objects/effects/fake_fire.dm b/code/game/objects/effects/fake_fire.dm index d3527872dd9..783ecd3ac62 100644 --- a/code/game/objects/effects/fake_fire.dm +++ b/code/game/objects/effects/fake_fire.dm @@ -5,15 +5,30 @@ layer = FIRE_LAYER var/lifetime = 10 SECONDS //0 for infinite //See Fire.dm (the real one), but in a nutshell: - var/firelevel = 0 //Larger the number, worse burns. - var/last_temperature = 0 //People with heat protection above this temp will be immune. - var/pressure = 0 //Larger the number, worse burns. + var/firelevel = 1 //Larger the number, worse burns. + var/last_temperature = T100C //People with heat protection above this temp will be immune. + var/pressure = ONE_ATMOSPHERE //Larger the number, worse burns. /obj/effect/fake_fire/Initialize() . = ..() if(!loc) return INITIALIZE_HINT_QDEL - set_light(3, 0.5, color) + var/new_light_range + var/new_light_power + if(firelevel > 6) + icon_state = "3" + new_light_range = 7 + new_light_power = 3 + else if(firelevel > 2.5) + icon_state = "2" + new_light_range = 5 + new_light_power = 2 + else + icon_state = "1" + new_light_range = 3 + new_light_power = 1 + color = fire_color() + set_light(new_light_range, new_light_power, color) START_PROCESSING(SSobj,src) if(lifetime) QDEL_IN(src,lifetime) @@ -22,11 +37,19 @@ if(!loc) qdel(src) return PROCESS_KILL - for(var/mob/living/L in loc) - L.FireBurn(firelevel,last_temperature,pressure) - loc.fire_act(firelevel,last_temperature,pressure) - for(var/atom/A in loc) - A.fire_act(firelevel,last_temperature,pressure) + for(var/mob/living/victim in loc) + if(!victim.simulated) + continue + victim.FireBurn(firelevel, last_temperature, pressure) + loc.fire_act(firelevel, last_temperature, pressure) + for(var/atom/burned in loc) + if(!burned.simulated || burned == src) + continue + burned.fire_act(firelevel, last_temperature, pressure) + +/obj/effect/fake_fire/proc/fire_color() + var/temperature = max(4000*sqrt(firelevel/vsc.fire_firelevel_multiplier), last_temperature) + return heat2color(temperature) /obj/effect/fake_fire/Destroy() STOP_PROCESSING(SSobj,src) From 11802bab6a868af0d27553f909ef73c85daa2904 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Mon, 24 Jun 2024 21:46:32 -0400 Subject: [PATCH 26/38] Make scorched grass a separate type --- .../turfs/floors/natural/natural_grass.dm | 32 ++++++++----------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/code/game/turfs/floors/natural/natural_grass.dm b/code/game/turfs/floors/natural/natural_grass.dm index 420700a8d87..78ae1bb8c8b 100644 --- a/code/game/turfs/floors/natural/natural_grass.dm +++ b/code/game/turfs/floors/natural/natural_grass.dm @@ -56,28 +56,22 @@ if(grass_color) color = grass_color - //#TODO: Check if this is still relevant/wanted since we got map gen to handle this? - var/datum/extension/buried_resources/resources = get_or_create_extension(src, /datum/extension/buried_resources) - if(prob(70)) - LAZYSET(resources.resources, /decl/material/solid/graphite, rand(3,5)) - if(prob(5)) - LAZYSET(resources.resources, /decl/material/solid/metal/uranium, rand(1,3)) - if(prob(2)) - LAZYSET(resources.resources, /decl/material/solid/gemstone/diamond, 1) - if(!LAZYLEN(resources.resources)) - remove_extension(src, /datum/extension/buried_resources) - /turf/floor/natural/grass/wild/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if((temperature > T0C + 200 && prob(5)) || temperature > T0C + 1000) + // smoothly scale between 1/5 chance to scorch at ignition_point and 100% chance to scorch at ignition_point * 4 + if(temperature >= material.ignition_point && prob(20 + temperature * 80 / (material.ignition_point * 4))) handle_melting() return ..() /turf/floor/natural/grass/wild/handle_melting(list/meltable_materials) . = ..() - if(icon_state != "scorched") - SetName("scorched ground") - desc = "What was once lush grass has been reduced to burnt ashes." - icon_state = "scorched" - icon_edge_layer = -1 - footstep_type = /decl/footsteps/asteroid - color = null + ChangeTurf(/turf/floor/natural/scorched) + +/turf/floor/natural/scorched + name = "scorched ground" + desc = "What was once lush grass has been reduced to burnt ashes." + icon = 'icons/turf/flooring/wildgrass.dmi' + icon_state = "scorched" + possible_states = null + footstep_type = /decl/footsteps/asteroid // closest we have to "stepping on carbonized grass" + material = /decl/material/solid/carbon + turf_flags = TURF_FLAG_BACKGROUND From 94087e8aab2ed9221abdee099306f9c2d1087a27 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Mon, 24 Jun 2024 21:54:05 -0400 Subject: [PATCH 27/38] Generalize fire/burning logic to mob/living --- code/modules/mob/living/human/life.dm | 33 +-------------- code/modules/mob/living/human/update_icons.dm | 7 ---- code/modules/mob/living/living_bodytemp.dm | 5 +++ code/modules/mob/living/living_defense.dm | 42 ++++++++++++++++--- .../mob/living/simple_animal/friendly/crab.dm | 3 ++ .../mob/living/simple_animal/simple_animal.dm | 16 ++++--- .../species/species_bodytype_helpers.dm | 5 ++- .../species/species_bodytype_quadruped.dm | 5 ++- 8 files changed, 61 insertions(+), 55 deletions(-) diff --git a/code/modules/mob/living/human/life.dm b/code/modules/mob/living/human/life.dm index 8bc960c9226..b084a03d85b 100644 --- a/code/modules/mob/living/human/life.dm +++ b/code/modules/mob/living/human/life.dm @@ -268,8 +268,7 @@ bodytemperature += round(robolimb_count/2) return ..() -//This proc returns a number made up of the flags for body parts which you are protected on. (such as HEAD, SLOT_UPPER_BODY, SLOT_LOWER_BODY, etc. See setup.dm for the full list) -/mob/living/human/proc/get_heat_protection_flags(temperature) //Temperature is the temperature you're being exposed to. +/mob/living/human/get_heat_protection_flags(temperature) . = 0 //Handle normal clothing for(var/slot in global.standard_clothing_slots) @@ -811,36 +810,6 @@ hud_list[SPECIALROLE_HUD] = holder hud_updateflag = 0 -/mob/living/human/handle_fire() - if(..()) - return - - var/burn_temperature = fire_burn_temperature() - var/thermal_protection = get_heat_protection(burn_temperature) - - if (thermal_protection < 1 && bodytemperature < burn_temperature) - bodytemperature += round(BODYTEMP_HEATING_MAX*(1-thermal_protection), 1) - - var/species_heat_mod = 1 - - var/protected_limbs = get_heat_protection_flags(burn_temperature) - - - if(species) - if(burn_temperature < get_mob_temperature_threshold(HEAT_LEVEL_2)) - species_heat_mod = 0.5 - else if(burn_temperature < get_mob_temperature_threshold(HEAT_LEVEL_3)) - species_heat_mod = 0.75 - - burn_temperature -= get_mob_temperature_threshold(HEAT_LEVEL_1) - - if(burn_temperature < 1) - return - - for(var/obj/item/organ/external/E in get_external_organs()) - if(!(E.body_part & protected_limbs) && prob(20)) - E.take_external_damage(burn = round(species_heat_mod * log(10, (burn_temperature + 10)), 0.1), used_weapon = "fire") - /mob/living/human/rejuvenate() reset_blood() full_prosthetic = null diff --git a/code/modules/mob/living/human/update_icons.dm b/code/modules/mob/living/human/update_icons.dm index 0109853188c..f512877f72b 100644 --- a/code/modules/mob/living/human/update_icons.dm +++ b/code/modules/mob/living/human/update_icons.dm @@ -531,13 +531,6 @@ Please contact me on #coderbus IRC. ~Carn x return set_tail_state("[tail_organ.get_tail()]_static") -/mob/living/human/update_fire(var/update_icons=1) - if(on_fire) - var/image/standing = overlay_image(get_bodytype()?.get_ignited_icon(src) || 'icons/mob/OnFire.dmi', "Standing", RESET_COLOR) - set_current_mob_overlay(HO_FIRE_LAYER, standing, update_icons) - else - set_current_mob_overlay(HO_FIRE_LAYER, null, update_icons) - /mob/living/human/hud_reset(full_reset = FALSE) if((. = ..()) && internals && internal) internals.icon_state = "internal1" diff --git a/code/modules/mob/living/living_bodytemp.dm b/code/modules/mob/living/living_bodytemp.dm index eee7572b398..0d9d6c6c41b 100644 --- a/code/modules/mob/living/living_bodytemp.dm +++ b/code/modules/mob/living/living_bodytemp.dm @@ -41,3 +41,8 @@ if(get_hydration() >= hyd_remove) adjust_hydration(-hyd_remove) bodytemperature += min((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), -BODYTEMP_AUTORECOVERY_MINIMUM) + +/// This proc returns a number made up of the flags for body parts which you are protected on. (such as HEAD, SLOT_UPPER_BODY, SLOT_LOWER_BODY, etc. +/// Temperature parameter is the temperature you're being exposed to. +/mob/living/proc/get_heat_protection_flags(temperature) + return 0 diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index b74e516c2d4..b497c1269cc 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -301,8 +301,13 @@ set_light(0) update_fire() -/mob/living/proc/update_fire() - return +/mob/living/proc/update_fire(var/update_icons=1) + if(on_fire) + var/decl/bodytype/mob_bodytype = get_bodytype() + var/image/standing = overlay_image(mob_bodytype?.get_ignited_icon(src) || 'icons/mob/OnFire.dmi', mob_bodytype?.get_ignited_icon_state(src) || "Generic_mob_burning", RESET_COLOR) + set_current_mob_overlay(HO_FIRE_LAYER, standing, update_icons) + else + set_current_mob_overlay(HO_FIRE_LAYER, null, update_icons) /mob/living/proc/adjust_fire_stacks(add_fire_stacks) //Adjusting the amount of fire_stacks we have on person fire_stacks = clamp(fire_stacks + add_fire_stacks, FIRE_MIN_STACKS, FIRE_MAX_STACKS) @@ -312,21 +317,48 @@ fire_stacks = min(0, ++fire_stacks) //If we've doused ourselves in water to avoid fire, dry off slowly if(!on_fire) - return 1 + return TRUE else if(fire_stacks <= 0) ExtinguishMob() //Fire's been put out. - return 1 + return TRUE fire_stacks = max(0, fire_stacks - 0.2) //I guess the fire runs out of fuel eventually var/datum/gas_mixture/G = loc.return_air() // Check if we're standing in an oxygenless environment if(G.get_by_flag(XGM_GAS_OXIDIZER) < 1) ExtinguishMob() //If there's no oxygen in the tile we're on, put out the fire - return 1 + return TRUE var/turf/location = get_turf(src) location.hotspot_expose(fire_burn_temperature(), 50, 1) + var/burn_temperature = fire_burn_temperature() + var/thermal_protection = get_heat_protection(burn_temperature) + + if (thermal_protection < 1 && bodytemperature < burn_temperature) + bodytemperature += round(BODYTEMP_HEATING_MAX*(1-thermal_protection), 1) + + var/species_heat_mod = 1 + + var/protected_limbs = get_heat_protection_flags(burn_temperature) + + if(burn_temperature < get_mob_temperature_threshold(HEAT_LEVEL_2)) + species_heat_mod = 0.5 + else if(burn_temperature < get_mob_temperature_threshold(HEAT_LEVEL_3)) + species_heat_mod = 0.75 + + burn_temperature -= get_mob_temperature_threshold(HEAT_LEVEL_1) + + if(burn_temperature < 1) + return + + if(has_external_organs()) + for(var/obj/item/organ/external/E in get_external_organs()) + if(!(E.body_part & protected_limbs) && prob(20)) + E.take_external_damage(burn = round(species_heat_mod * log(10, (burn_temperature + 10)), 0.1), used_weapon = "fire") + else // fallback for simplemobs + take_damage(round(species_heat_mod * log(10, (burn_temperature + 10))), 0.1, BURN, DAM_DISPERSED) + /mob/living/proc/increase_fire_stacks(exposed_temperature) if(fire_stacks <= 4 || fire_burn_temperature() < exposed_temperature) adjust_fire_stacks(2) diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index fc2d285dc30..62cda14fe9d 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -27,6 +27,9 @@ bodytype_flag = 0 bodytype_category = "hexapodal animal body" +/decl/bodytype/hexapod/get_ignited_icon_state(mob/living/victim) + return "Generic_mob_burning" + /mob/living/simple_animal/crab/get_bodytype() return GET_DECL(/decl/bodytype/hexapod/animal/crab) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index b2354fbd88b..658e6e3cde5 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -293,6 +293,13 @@ var/global/list/simplemob_icon_bitflag_cache = list() if(!atmos_suitable) take_damage(unsuitable_atmos_damage) +/mob/living/simple_animal/get_mob_temperature_threshold(threshold, bodypart) + if(threshold >= HEAT_LEVEL_1) + return maxbodytemp + if(threshold <= COLD_LEVEL_1) + return minbodytemp + return ..() + /mob/living/simple_animal/proc/escape(mob/living/M, obj/O) O.unbuckle_mob(M) visible_message(SPAN_DANGER("\The [M] escapes from \the [O]!")) @@ -449,15 +456,6 @@ var/global/list/simplemob_icon_bitflag_cache = list() W.forceMove(get_turf(src)) return 1 -/mob/living/simple_animal/handle_fire() - return -/mob/living/simple_animal/update_fire() - return -/mob/living/simple_animal/IgniteMob() - return -/mob/living/simple_animal/ExtinguishMob() - return - /mob/living/simple_animal/is_burnable() return heat_damage_per_tick diff --git a/code/modules/species/species_bodytype_helpers.dm b/code/modules/species/species_bodytype_helpers.dm index 8736740277b..312b55d31f9 100644 --- a/code/modules/species/species_bodytype_helpers.dm +++ b/code/modules/species/species_bodytype_helpers.dm @@ -1,6 +1,9 @@ -/decl/bodytype/proc/get_ignited_icon(var/mob/living/human/H) +/decl/bodytype/proc/get_ignited_icon(var/mob/living/human/victim) return ignited_icon +/decl/bodytype/proc/get_ignited_icon_state(mob/living/victim) + return "Standing" + /decl/bodytype/proc/get_icon_cache_uid(var/mob/H) if(!icon_cache_uid) icon_cache_uid = "[sequential_id(/decl/bodytype)]" diff --git a/code/modules/species/species_bodytype_quadruped.dm b/code/modules/species/species_bodytype_quadruped.dm index 5673e68d89d..93f1693fc34 100644 --- a/code/modules/species/species_bodytype_quadruped.dm +++ b/code/modules/species/species_bodytype_quadruped.dm @@ -22,4 +22,7 @@ /decl/bodytype/quadruped/apply_appearance(var/mob/living/human/H) . = ..() H.can_buckle = ridable - H.buckle_pixel_shift = riding_offset \ No newline at end of file + H.buckle_pixel_shift = riding_offset + +/decl/bodytype/quadruped/get_ignited_icon_state(mob/living/victim) + return "Generic_mob_burning" \ No newline at end of file From ffe32a7da9e3bebd66856c5a608cb407d53fa1c4 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Mon, 24 Jun 2024 21:55:16 -0400 Subject: [PATCH 28/38] Allow projectiles to hit structures --- code/modules/projectiles/projectile.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 415933456b6..cbdb1292bf7 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -495,7 +495,7 @@ //Returns true if the target atom is on our current turf and above the right layer /obj/item/projectile/proc/can_hit_target(atom/target, var/list/passthrough) - return (target && ((target.layer >= TURF_LAYER + 0.3) || ismob(target)) && (loc == get_turf(target)) && (!(target in passthrough))) + return (target && ((target.layer >= STRUCTURE_LAYER) || ismob(target)) && (loc == get_turf(target)) && (!(target in passthrough))) /proc/calculate_projectile_Angle_and_pixel_offsets(mob/user, params) var/list/mouse_control = params2list(params) From d394d3bd9d94dd31e88957c544ffbe2f8f6d3ed8 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Mon, 24 Jun 2024 21:57:49 -0400 Subject: [PATCH 29/38] Improve projectile mimic-turf handling --- code/modules/projectiles/projectile.dm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index cbdb1292bf7..b0f57d7741c 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -156,7 +156,9 @@ def_zone = check_zone(target_zone) firer = shooter var/direct_target - if(get_turf(target) == get_turf(src)) + var/turf/actual_target_turf = get_turf(target) + actual_target_turf = actual_target_turf?.resolve_to_actual_turf() + if(actual_target_turf == get_turf(src)) direct_target = target preparePixelProjectile(target, shooter ? shooter : get_turf(src), params, forced_spread) return fire(Angle_override, direct_target) @@ -383,7 +385,7 @@ qdel(src) return var/turf/target = locate(clamp(starting + xo, 1, world.maxx), clamp(starting + yo, 1, world.maxy), starting.z) - setAngle(get_projectile_angle(src, target)) + setAngle(get_projectile_angle(src, target.resolve_to_actual_turf())) if(dispersion) var/DeviationAngle = (dispersion * 15) setAngle(Angle + rand(-DeviationAngle, DeviationAngle)) @@ -417,6 +419,7 @@ /obj/item/projectile/proc/preparePixelProjectile(atom/target, atom/source, params, Angle_offset = 0) var/turf/curloc = get_turf(source) var/turf/targloc = get_turf(target) + targloc = targloc?.resolve_to_actual_turf() forceMove(get_turf(source)) starting = get_turf(source) original = target From 0c473175b9b51babbe45d9ef4f5d903915f1b7e2 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Mon, 24 Jun 2024 21:58:14 -0400 Subject: [PATCH 30/38] Improve fireball item effect --- .../item_effects/item_effect_charges.dm | 48 ++++++++++++++++++- .../modules/item_effects/item_effect_debug.dm | 13 +++++ 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/code/modules/item_effects/item_effect_charges.dm b/code/modules/item_effects/item_effect_charges.dm index 939c1d7c63b..4a27d3d0a27 100644 --- a/code/modules/item_effects/item_effect_charges.dm +++ b/code/modules/item_effects/item_effect_charges.dm @@ -12,6 +12,52 @@ /decl/item_effect/charges/examined(obj/item/item, mob/user) to_chat(user, SPAN_NOTICE("\The [item] has [item.get_item_effect_parameter(src, ITEM_EFFECT_RANGED, "charges") || 0] charge\s of [effect_descriptor] left.")) +/obj/item/projectile/fireball + name = "fireball" + icon_state = "fireball" + fire_sound = 'sound/effects/bamf.ogg' + damage = 20 + atom_damage_type = BURN + damage_flags = DAM_DISPERSED // burn all over + var/fire_lifetime = 2 SECONDS + var/fire_temperature = (288 CELSIUS) / 0.9 + 1 // hot enough to ignite wood! divided by 0.9 and plus one to ensure we can light firepits + +/obj/effect/fake_fire/variable + name = "fire" + anchored = TRUE + mouse_opacity = MOUSE_OPACITY_UNCLICKABLE + firelevel = 1 + pressure = ONE_ATMOSPHERE + +/obj/effect/fake_fire/variable/Initialize(ml, new_temperature, new_lifetime) + lifetime = new_lifetime + last_temperature = new_temperature + return ..() + +// we deal our damage via fire_act, not via direct burn damage. our burn damage is specifically for mobs +/obj/item/projectile/fireball/get_structure_damage() + return 0 + +/obj/item/projectile/fireball/on_impact(var/atom/A) + . = ..() + var/obj/effect/fake_fire/fire = new /obj/effect/fake_fire/variable(get_turf(A), fire_temperature, fire_lifetime) + fire.Process() // process at least once! + qdel_self() + +/obj/item/projectile/fireball/after_move() + . = ..() + if(!loc) + return + for(var/mob/living/victim in loc) + if(!victim.simulated) + continue + victim.FireBurn(1, fire_temperature, ONE_ATMOSPHERE) + loc.fire_act(1, fire_temperature, ONE_ATMOSPHERE) + for(var/atom/burned in loc) + if(!burned.simulated || burned == src) + continue + burned.fire_act(1, fire_temperature, ONE_ATMOSPHERE) + // Example effect; casts a fireball n times. /decl/item_effect/charges/fireball effect_descriptor = "fireball" @@ -20,5 +66,5 @@ /decl/item_effect/charges/fireball/do_ranged_effect(mob/user, obj/item/item, atom/target, list/parameters) . = ..() if(.) - var/obj/item/projectile/spell_projectile/fireball/projectile = new(get_turf(user)) + var/obj/item/projectile/fireball/projectile = new(get_turf(user)) projectile.launch_from_gun(target, user.get_target_zone(), user) diff --git a/code/modules/item_effects/item_effect_debug.dm b/code/modules/item_effects/item_effect_debug.dm index a14237d437e..501110b7aee 100644 --- a/code/modules/item_effects/item_effect_debug.dm +++ b/code/modules/item_effects/item_effect_debug.dm @@ -62,3 +62,16 @@ ITEM_EFFECT_VISIBLE, ITEM_EFFECT_WIELDED )) + +/obj/item/staff/fireball + name = "staff of fireball" + icon_state = "starstaff" + material = /decl/material/solid/organic/wood/ebony + matter = list(/decl/material/solid/metal/gold = MATTER_AMOUNT_TRACE) + +/obj/item/staff/fireball/Initialize(ml, material_key) + . = ..() + add_item_effect(/decl/item_effect/charges/fireball, list( + ITEM_EFFECT_VISIBLE, + ITEM_EFFECT_RANGED = list("charges" = 5) + )) \ No newline at end of file From 5a032a64a434c63cc61651a10f913a7373ff4b30 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 25 Jun 2024 20:54:38 +1000 Subject: [PATCH 31/38] Adding underground levels to the grassland and inn. --- .../game/turfs/walls/wall_natural_subtypes.dm | 4 + maps/shaded_hills/areas/downlands.dm | 6 + maps/shaded_hills/areas/grassland.dm | 7 + maps/shaded_hills/levels/_levels.dm | 41 +- maps/shaded_hills/shaded_hills-caverns.dmm | 22835 +++++++++++++++ maps/shaded_hills/shaded_hills-dungeon.dmm | 22865 ++++++++++++++++ maps/shaded_hills/shaded_hills-grassland.dmm | 190 +- maps/shaded_hills/shaded_hills-inn.dmm | 25 +- maps/shaded_hills/shaded_hills.dm | 5 + maps/shaded_hills/submaps/_submaps.dm | 2 + .../submaps/downlands/_downlands.dm | 7 +- .../submaps/grassland/_grassland.dm | 7 +- 12 files changed, 45894 insertions(+), 100 deletions(-) create mode 100644 maps/shaded_hills/shaded_hills-caverns.dmm create mode 100644 maps/shaded_hills/shaded_hills-dungeon.dmm diff --git a/code/game/turfs/walls/wall_natural_subtypes.dm b/code/game/turfs/walls/wall_natural_subtypes.dm index 279d40d10fb..ee192c9fc23 100644 --- a/code/game/turfs/walls/wall_natural_subtypes.dm +++ b/code/game/turfs/walls/wall_natural_subtypes.dm @@ -48,15 +48,19 @@ /turf/wall/natural/dirt material = /decl/material/solid/soil color = "#41311b" + floor_type = /turf/floor/natural/dirt /turf/wall/natural/basalt material = /decl/material/solid/stone/basalt color = COLOR_DARK_GRAY + floor_type = /turf/floor/natural/rock/basalt /turf/wall/natural/random/basalt material = /decl/material/solid/stone/basalt color = COLOR_DARK_GRAY + floor_type = /turf/floor/natural/rock/basalt /turf/wall/natural/random/high_chance/basalt material = /decl/material/solid/stone/basalt color = COLOR_DARK_GRAY + floor_type = /turf/floor/natural/rock/basalt diff --git a/maps/shaded_hills/areas/downlands.dm b/maps/shaded_hills/areas/downlands.dm index dc9cdd4177c..d27761391a5 100644 --- a/maps/shaded_hills/areas/downlands.dm +++ b/maps/shaded_hills/areas/downlands.dm @@ -48,3 +48,9 @@ /area/shaded_hills/outside/shrine name = "\improper Shrine Grounds" + +/area/shaded_hills/caves/dungeon + name = "\improper Deep Dungeon" + +/area/shaded_hills/caves/dungeon/poi + name = "\improper Deepest Dungeon" diff --git a/maps/shaded_hills/areas/grassland.dm b/maps/shaded_hills/areas/grassland.dm index 79417dbead4..fa9ff02aac4 100644 --- a/maps/shaded_hills/areas/grassland.dm +++ b/maps/shaded_hills/areas/grassland.dm @@ -48,3 +48,10 @@ description = "The deep dark brings distant, whispering echoes to your ears." ambience = list('sound/ambience/ambimine.ogg', 'sound/ambience/song_game.ogg') area_blurb_category = /area/shaded_hills/caves + + +/area/shaded_hills/caves/deep + name = "\improper Deep Caverns" + +/area/shaded_hills/caves/deep/poi + name = "\improper Deepest Caverns" diff --git a/maps/shaded_hills/levels/_levels.dm b/maps/shaded_hills/levels/_levels.dm index e95115cfc22..4aa1e582e76 100644 --- a/maps/shaded_hills/levels/_levels.dm +++ b/maps/shaded_hills/levels/_levels.dm @@ -1,3 +1,6 @@ +/obj/abstract/map_data/shaded_hills + height = 2 + /datum/level_data/player_level/shaded_hills use_global_exterior_ambience = FALSE base_area = null @@ -18,9 +21,10 @@ var/submap_area var/list/mobs_to_spawn = list() - -// Placeholder for more customised values. -/datum/daycycle/shaded_hills +// Randomized time of day to start at. +/datum/daycycle/shaded_hills/New() + time_of_day = rand(day_duration) + ..() /datum/level_data/player_level/shaded_hills/get_subtemplate_areas(template_category, blacklist, whitelist) return submap_area ? (islist(submap_area) ? submap_area : list(submap_area)) : null @@ -83,6 +87,7 @@ . = ..() // Neither of these procs handle laterally linked levels yet. SSweather.setup_weather_system(src) + /datum/level_data/player_level/shaded_hills/swamp name = "Shaded Hills - Swamp" level_id = "shaded_hills_swamp" @@ -178,6 +183,30 @@ // Neither of these procs handle laterally linked levels yet. SSweather.setup_weather_system(src) +/datum/level_data/player_level/shaded_hills/caverns + name = "Shaded Hills - Caverns" + level_id = "shaded_hills_caverns" + connected_levels = list( + "shaded_hills_dungeon" = EAST + ) + submap_budget = 5 + submap_category = MAP_TEMPLATE_CATEGORY_SH_CAVERNS + submap_area = /area/shaded_hills/caves/deep/poi + level_generators = list( + /datum/random_map/automata/cave_system/shaded_hills, + /datum/random_map/noise/ore/rich + ) + +/datum/level_data/player_level/shaded_hills/dungeon + name = "Shaded Hills - Dungeon" + level_id = "shaded_hills_dungeon" + connected_levels = list( + "shaded_hills_caverns" = WEST + ) + submap_budget = 5 + submap_category = MAP_TEMPLATE_CATEGORY_SH_DUNGEON + submap_area = /area/shaded_hills/caves/dungeon/poi + /obj/abstract/level_data_spawner/shaded_hills_grassland level_data_type = /datum/level_data/player_level/shaded_hills/grassland @@ -189,3 +218,9 @@ /obj/abstract/level_data_spawner/shaded_hills_downlands level_data_type = /datum/level_data/player_level/shaded_hills/downlands + +/obj/abstract/level_data_spawner/shaded_hills_caverns + level_data_type = /datum/level_data/player_level/shaded_hills/caverns + +/obj/abstract/level_data_spawner/shaded_hills_dungeon + level_data_type = /datum/level_data/player_level/shaded_hills/dungeon diff --git a/maps/shaded_hills/shaded_hills-caverns.dmm b/maps/shaded_hills/shaded_hills-caverns.dmm new file mode 100644 index 00000000000..6a09caaab19 --- /dev/null +++ b/maps/shaded_hills/shaded_hills-caverns.dmm @@ -0,0 +1,22835 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"bV" = ( +/turf/floor/natural/rock/basalt, +/area/shaded_hills/caves/deep) +"kZ" = ( +/obj/abstract/level_data_spawner/shaded_hills_caverns, +/turf/wall/natural/basalt/shaded_hills, +/area/shaded_hills/caves/deep) +"mZ" = ( +/turf/unsimulated/dark_filler, +/area/shaded_hills/caves/deep) +"qR" = ( +/obj/abstract/ramp_sculptor/south, +/turf/wall/natural/basalt/shaded_hills, +/area/shaded_hills/caves/deep) +"um" = ( +/turf/unsimulated/mask, +/area/shaded_hills/caves/deep/poi) +"vo" = ( +/obj/abstract/ramp_sculptor/east, +/turf/wall/natural/basalt/shaded_hills, +/area/shaded_hills/caves/deep) +"vR" = ( +/turf/floor/natural/lava, +/area/shaded_hills/caves/deep/poi) +"wz" = ( +/turf/unsimulated/mask, +/area/shaded_hills/caves/deep) +"MT" = ( +/turf/floor/natural/rock/basalt, +/area/shaded_hills/caves/deep/poi) +"Ng" = ( +/turf/wall/natural/basalt/shaded_hills, +/area/shaded_hills/caves/deep) + +(1,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(2,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(3,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(4,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(5,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(6,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(7,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(8,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(9,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +kZ +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(10,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(11,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(12,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(13,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(14,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(15,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(16,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(17,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(18,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(19,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(20,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(21,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(22,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(23,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(24,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(25,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(26,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(27,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(28,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(29,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(30,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(31,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(32,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(33,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +bV +bV +Ng +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(34,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +MT +MT +MT +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +qR +bV +vo +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(35,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +qR +bV +bV +vo +vo +Ng +Ng +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(36,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +qR +bV +bV +bV +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +vR +vR +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(37,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +MT +MT +MT +MT +MT +um +um +um +um +MT +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +bV +bV +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +vR +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(38,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +MT +MT +MT +MT +um +MT +MT +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +bV +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +vR +vR +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(39,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +MT +MT +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +bV +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +vR +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(40,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(41,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +vR +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(42,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +vR +vR +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(43,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +vR +vR +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(44,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +vR +vR +vR +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(45,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +MT +MT +vR +vR +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(46,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +MT +MT +MT +vR +vR +vR +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(47,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +MT +MT +MT +MT +vR +vR +vR +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(48,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +MT +MT +MT +MT +vR +vR +vR +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(49,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +vR +vR +vR +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(50,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +MT +MT +MT +MT +MT +um +um +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +vR +vR +vR +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(51,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +vR +vR +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(52,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +MT +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +MT +MT +MT +um +um +um +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +vR +vR +vR +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(53,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +MT +MT +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +um +um +um +um +um +um +um +um +MT +MT +MT +um +um +um +MT +MT +MT +MT +um +um +um +um +um +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +vR +vR +vR +vR +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(54,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +um +um +MT +MT +MT +MT +MT +MT +MT +MT +MT +um +um +um +um +um +um +MT +MT +vR +MT +MT +MT +MT +MT +MT +MT +MT +vR +vR +vR +vR +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(55,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +um +um +um +um +um +um +um +um +MT +MT +MT +MT +MT +MT +um +um +um +um +um +um +um +um +MT +MT +vR +vR +MT +MT +MT +MT +MT +MT +MT +vR +vR +vR +vR +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(56,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +um +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +vR +MT +MT +MT +MT +MT +MT +MT +vR +vR +vR +vR +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(57,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +MT +MT +um +um +MT +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +vR +vR +vR +vR +vR +MT +MT +MT +MT +vR +vR +vR +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(58,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +MT +MT +MT +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +MT +MT +MT +MT +MT +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +MT +MT +vR +vR +MT +MT +vR +vR +vR +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(59,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +bV +bV +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +bV +um +MT +MT +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +MT +vR +MT +MT +vR +vR +vR +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(60,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +bV +bV +bV +bV +um +bV +bV +bV +um +um +um +um +um +um +um +um +um +bV +bV +bV +bV +bV +um +um +um +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +vR +MT +vR +vR +vR +vR +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(61,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +bV +um +um +um +bV +bV +bV +um +um +um +um +um +um +um +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +vR +vR +um +vR +vR +vR +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(62,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +bV +um +um +um +um +um +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +um +um +vR +vR +vR +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(63,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +um +um +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(64,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(65,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(66,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +vR +vR +vR +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(67,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +um +vR +vR +vR +vR +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(68,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +vR +vR +vR +um +vR +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(69,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +um +um +um +um +um +vR +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(70,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +um +um +um +um +um +um +vR +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(71,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(72,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(73,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(74,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +um +um +um +um +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +vR +vR +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(75,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +bV +bV +bV +bV +um +um +um +um +um +um +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +vR +vR +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(76,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +bV +bV +um +um +um +bV +bV +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +vR +vR +vR +vR +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(77,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +bV +bV +um +bV +bV +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +vR +vR +vR +vR +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(78,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +um +um +um +um +um +um +bV +bV +bV +bV +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +um +um +um +um +um +um +um +um +vR +vR +vR +vR +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(79,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +um +um +um +um +um +um +um +bV +bV +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +um +um +um +um +um +um +um +vR +vR +vR +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(80,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +um +um +um +um +um +um +um +MT +bV +bV +bV +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +vR +vR +vR +um +um +vR +vR +vR +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(81,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +um +um +um +um +um +um +um +um +MT +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +vR +vR +vR +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(82,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +um +um +um +um +um +um +um +um +MT +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +vR +vR +vR +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(83,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +vR +vR +vR +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(84,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(85,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(86,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +vR +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(87,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +vR +vR +vR +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(88,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +vR +vR +vR +vR +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(89,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +vR +vR +vR +vR +vR +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(90,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +vR +vR +vR +um +um +vR +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(91,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +vR +vR +vR +vR +um +um +um +vR +vR +vR +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(92,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +um +MT +MT +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +vR +vR +vR +vR +vR +vR +um +um +um +vR +vR +vR +vR +vR +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(93,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +vR +vR +vR +um +um +um +um +um +um +um +vR +vR +um +um +vR +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(94,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +um +um +um +um +um +um +um +um +um +vR +vR +vR +um +um +vR +vR +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(95,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +um +um +um +um +um +um +um +um +um +um +vR +vR +um +um +um +um +vR +vR +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(96,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +vR +vR +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(97,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(98,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +um +um +um +um +um +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(99,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(100,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +um +um +um +um +um +um +um +um +MT +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(101,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(102,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(103,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(104,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(105,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +MT +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(106,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +um +um +um +um +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(107,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +um +um +um +um +bV +bV +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(108,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +MT +MT +bV +bV +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(109,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +MT +bV +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(110,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(111,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(112,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(113,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +MT +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(114,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +MT +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(115,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(116,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(117,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(118,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(119,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(120,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(121,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(122,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(123,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(124,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(125,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(126,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(127,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(128,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(129,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +bV +bV +bV +bV +wz +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(130,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +bV +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(131,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(132,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +bV +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(133,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +bV +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(134,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +bV +bV +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(135,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +bV +bV +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(136,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +bV +bV +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(137,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +bV +bV +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(138,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +um +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(139,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +bV +bV +bV +bV +bV +bV +bV +bV +bV +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(140,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +bV +bV +bV +bV +bV +bV +bV +bV +bV +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(141,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +bV +bV +bV +bV +bV +bV +bV +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(142,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +bV +bV +bV +bV +bV +bV +bV +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(143,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +bV +bV +bV +bV +bV +bV +bV +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +Ng +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(144,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(145,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(146,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(147,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(148,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(149,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} +(150,1,1) = {" +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +mZ +"} diff --git a/maps/shaded_hills/shaded_hills-dungeon.dmm b/maps/shaded_hills/shaded_hills-dungeon.dmm new file mode 100644 index 00000000000..e99b4bced33 --- /dev/null +++ b/maps/shaded_hills/shaded_hills-dungeon.dmm @@ -0,0 +1,22865 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aK" = ( +/turf/floor/natural/mud/water/deep, +/area/shaded_hills/caves/dungeon/poi) +"bD" = ( +/turf/floor/natural/path/running_bond/basalt, +/area/shaded_hills/caves/dungeon/poi) +"hU" = ( +/turf/wall/natural/basalt/shaded_hills, +/area/shaded_hills/caves/dungeon/poi) +"it" = ( +/turf/wall/brick/basalt, +/area/shaded_hills/caves/dungeon/poi) +"lC" = ( +/turf/unsimulated/dark_filler, +/area/shaded_hills/caves/dungeon) +"lE" = ( +/obj/abstract/level_data_spawner/shaded_hills_dungeon, +/turf/wall/natural/basalt/shaded_hills, +/area/shaded_hills/caves/dungeon) +"mM" = ( +/turf/floor/natural/dirt, +/area/shaded_hills/caves/dungeon) +"oF" = ( +/turf/wall/natural/dirt, +/area/shaded_hills/caves/dungeon/poi) +"sU" = ( +/turf/floor/natural/dirt, +/area/shaded_hills/caves/dungeon/poi) +"uU" = ( +/obj/item/remains/human, +/turf/floor/natural/mud, +/area/shaded_hills/caves/dungeon/poi) +"xL" = ( +/obj/abstract/ramp_sculptor/east, +/turf/wall/natural/dirt, +/area/shaded_hills/caves/dungeon) +"HI" = ( +/turf/floor/natural/rock/basalt, +/area/shaded_hills/caves/dungeon) +"Ip" = ( +/turf/floor/natural/mud, +/area/shaded_hills/caves/dungeon/poi) +"Og" = ( +/turf/floor/natural/mud/water, +/area/shaded_hills/caves/dungeon/poi) +"Pb" = ( +/turf/wall/natural/dirt, +/area/shaded_hills/caves/dungeon) +"RA" = ( +/turf/floor/natural/mud, +/area/shaded_hills/caves/dungeon) +"TR" = ( +/turf/wall/natural/basalt/shaded_hills, +/area/shaded_hills/caves/dungeon) +"Ua" = ( +/turf/floor/natural/rock/basalt, +/area/shaded_hills/caves/dungeon/poi) +"Xx" = ( +/turf/wall/log/ebony, +/area/shaded_hills/caves/dungeon) +"YN" = ( +/turf/floor/natural/path/running_bond/basalt, +/area/shaded_hills/caves/dungeon) + +(1,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +"} +(2,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +"} +(3,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +"} +(4,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +"} +(5,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +"} +(6,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +"} +(7,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +"} +(8,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +HI +HI +HI +HI +HI +HI +HI +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(9,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +HI +HI +HI +HI +HI +HI +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +lE +TR +lC +lC +lC +lC +lC +lC +lC +"} +(10,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +HI +HI +HI +HI +HI +HI +HI +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(11,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +HI +HI +HI +HI +HI +HI +HI +HI +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(12,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +HI +HI +HI +HI +HI +HI +HI +HI +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(13,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +HI +HI +HI +HI +HI +HI +HI +HI +HI +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(14,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(15,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(16,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(17,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(18,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(19,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(20,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(21,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(22,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(23,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(24,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(25,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +HI +mM +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(26,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +HI +HI +HI +HI +HI +HI +HI +HI +mM +mM +mM +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(27,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +HI +mM +HI +HI +HI +mM +mM +mM +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(28,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +sU +sU +Ua +sU +Ua +sU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(29,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +Ua +sU +Ua +sU +sU +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(30,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +Ua +sU +sU +sU +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(31,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +sU +sU +sU +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(32,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +sU +sU +sU +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(33,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +sU +sU +sU +sU +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(34,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +sU +sU +sU +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(35,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +sU +sU +sU +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(36,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +sU +sU +sU +sU +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(37,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +sU +sU +sU +sU +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(38,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +sU +Ip +Ip +Ip +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(39,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +sU +Ip +Ip +uU +Ip +Ip +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(40,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +sU +sU +Ip +Og +Og +Ip +Ip +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(41,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +sU +Ip +Og +Og +Og +Og +Ip +sU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(42,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +sU +Ip +Og +aK +Og +Og +Ip +sU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(43,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +sU +Ip +Og +Og +Og +Og +Og +Ip +sU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(44,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +Ip +Ip +Og +Og +Og +Og +Ip +sU +sU +oF +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(45,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +sU +sU +Ip +Og +Ip +Ip +sU +sU +bD +it +bD +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(46,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +sU +Ip +Ip +sU +sU +sU +sU +bD +bD +oF +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(47,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +sU +sU +sU +sU +sU +sU +sU +bD +oF +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(48,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +sU +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(49,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +oF +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(50,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(51,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(52,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(53,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(54,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(55,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(56,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(57,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +it +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +it +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(58,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +it +bD +it +bD +bD +bD +bD +bD +it +bD +bD +it +bD +bD +bD +bD +bD +it +bD +it +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(59,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +it +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +it +it +it +it +it +it +it +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(60,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +it +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(61,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +it +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(62,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +it +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +it +it +it +it +it +it +it +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(63,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +it +bD +it +bD +bD +bD +bD +bD +it +bD +bD +it +bD +bD +bD +bD +bD +it +bD +it +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(64,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +it +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(65,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +it +it +it +it +it +bD +bD +it +it +it +it +it +it +it +it +it +it +it +it +it +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(66,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(67,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(68,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(69,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(70,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(71,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(72,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(73,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(74,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(75,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(76,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(77,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(78,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(79,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(80,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(81,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(82,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(83,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +it +it +it +it +it +it +it +it +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(84,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +it +it +it +it +it +it +it +it +it +it +it +it +bD +bD +bD +bD +bD +bD +bD +it +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(85,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +it +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +it +bD +bD +it +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(86,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +it +it +it +bD +bD +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +bD +bD +bD +bD +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +bD +bD +it +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(87,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +it +it +it +it +it +it +it +it +it +it +it +it +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +it +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(88,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +it +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(89,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +bD +bD +bD +bD +bD +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +bD +bD +bD +bD +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(90,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +bD +bD +bD +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +it +bD +bD +it +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(91,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +bD +bD +bD +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(92,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +it +bD +bD +it +it +it +it +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(93,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(94,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(95,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(96,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(97,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(98,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(99,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(100,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(101,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(102,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(103,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(104,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(105,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(106,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(107,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(108,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(109,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(110,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(111,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(112,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +oF +oF +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(113,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +oF +oF +oF +it +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +it +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(114,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +oF +oF +oF +it +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +it +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(115,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +oF +oF +oF +it +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +Ua +bD +bD +bD +bD +bD +it +it +it +it +it +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(116,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +oF +oF +oF +it +bD +bD +bD +bD +bD +bD +bD +bD +bD +Ua +bD +bD +bD +bD +Ua +Ua +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(117,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +oF +oF +oF +oF +it +bD +bD +bD +bD +bD +bD +bD +bD +bD +Ua +Ua +bD +bD +Ua +hU +Ua +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(118,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +oF +oF +oF +oF +it +bD +bD +bD +bD +bD +bD +bD +bD +Ua +bD +bD +hU +Ua +bD +hU +Ua +Ua +bD +bD +bD +it +it +it +it +it +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(119,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +TR +hU +oF +oF +oF +oF +it +bD +bD +bD +bD +bD +bD +bD +bD +bD +hU +HI +HI +YN +hU +hU +hU +Ua +Ua +bD +bD +it +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(120,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +TR +hU +oF +oF +oF +oF +it +bD +bD +bD +bD +bD +bD +bD +Ua +oF +HI +HI +HI +HI +hU +hU +hU +hU +Ua +Ua +Ua +it +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(121,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +TR +TR +oF +oF +oF +oF +it +it +it +it +it +it +it +it +hU +hU +HI +HI +HI +hU +hU +hU +hU +hU +hU +it +it +it +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(122,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +TR +TR +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +oF +hU +hU +HI +HI +HI +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(123,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +TR +TR +Pb +oF +oF +oF +oF +oF +oF +oF +oF +oF +hU +hU +HI +HI +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(124,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +TR +TR +Pb +Pb +oF +oF +oF +oF +oF +oF +oF +oF +oF +HI +HI +HI +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(125,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +TR +TR +TR +Pb +Pb +oF +oF +oF +oF +oF +oF +oF +oF +HI +HI +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(126,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +TR +TR +TR +Pb +Pb +Xx +xL +Xx +oF +oF +oF +oF +HI +HI +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(127,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +TR +TR +Pb +Pb +Pb +Pb +RA +Pb +Pb +Pb +HI +mM +HI +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(128,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +TR +TR +Pb +Pb +Pb +Pb +RA +RA +Xx +mM +HI +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(129,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +TR +TR +Pb +Pb +Pb +Pb +Pb +RA +RA +mM +mM +mM +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(130,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +TR +TR +Pb +Pb +Pb +Pb +Pb +Pb +Xx +Pb +Pb +mM +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(131,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +TR +TR +Pb +Pb +Pb +Pb +Pb +Pb +Pb +Pb +Pb +mM +HI +HI +HI +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(132,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +TR +TR +TR +Pb +Pb +Pb +Pb +Pb +Pb +Pb +Pb +hU +hU +mM +HI +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(133,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +TR +TR +TR +Pb +Pb +Pb +Pb +Pb +Pb +Pb +oF +hU +hU +hU +HI +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(134,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +TR +TR +TR +TR +Pb +Pb +Pb +Pb +Pb +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(135,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +TR +TR +TR +TR +TR +oF +oF +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(136,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(137,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +it +bD +bD +it +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(138,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +hU +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(139,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(140,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(141,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(142,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(143,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +TR +lC +lC +lC +lC +lC +lC +lC +"} +(144,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +"} +(145,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +"} +(146,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +"} +(147,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +"} +(148,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +"} +(149,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +"} +(150,1,1) = {" +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +lC +"} diff --git a/maps/shaded_hills/shaded_hills-grassland.dmm b/maps/shaded_hills/shaded_hills-grassland.dmm index db47baa5a25..ce7adf9a2eb 100644 --- a/maps/shaded_hills/shaded_hills-grassland.dmm +++ b/maps/shaded_hills/shaded_hills-grassland.dmm @@ -308,6 +308,9 @@ /obj/abstract/exterior_marker/inside, /turf/wall/brick/basalt, /area/shaded_hills/outside) +"Qx" = ( +/turf/open, +/area/shaded_hills/caves/unexplored/south) "Sm" = ( /turf/floor/natural/path/basalt, /area/shaded_hills/outside) @@ -351,6 +354,10 @@ "Yf" = ( /turf/unsimulated/dark_filler, /area/shaded_hills/caves/unexplored) +"Yv" = ( +/obj/abstract/map_data/shaded_hills, +/turf/wall/natural/basalt/shaded_hills, +/area/shaded_hills/caves/river) "YB" = ( /obj/structure/bed/chair/bench/ebony{ dir = 8 @@ -358,6 +365,9 @@ /obj/abstract/landmark/start/shaded_hills/miner, /turf/floor/natural/dirt, /area/shaded_hills/outside) +"Zf" = ( +/turf/floor/natural/rock/basalt, +/area/shaded_hills/caves/unexplored/south) "ZV" = ( /turf/wall/log/ebony, /area/shaded_hills/outside) @@ -1871,7 +1881,7 @@ qy qy qy qy -qy +Yv qy qy mZ @@ -4855,10 +4865,10 @@ te te te te -te -te -te -te +Zf +Zf +Zf +Zf te te te @@ -5006,12 +5016,12 @@ te te te te -te -te -te -te -te -te +Zf +Zf +Zf +Zf +Zf +Zf te te te @@ -5157,14 +5167,14 @@ te te te te -te -te -te -te -te -te -te -te +Zf +Zf +Zf +Zf +Zf +Zf +Zf +Zf te te te @@ -5309,17 +5319,17 @@ te te te te -te -te -te -te -te -te -te -te -te -te -te +Zf +Zf +Qx +Qx +Zf +Zf +Zf +Zf +Zf +Zf +Zf te te te @@ -5461,19 +5471,19 @@ te te te te -te -te -te -te -te -te -te -te -te -te -te -te -te +Zf +Zf +Zf +Qx +Qx +Qx +Zf +Zf +Zf +Zf +Zf +Zf +Zf te te te @@ -5614,19 +5624,19 @@ te te te te -te -te -te -te -te -te -te -te -te -te -te -te -te +Zf +Zf +Qx +Qx +Qx +Qx +Qx +Zf +Zf +Zf +Zf +Zf +Zf lU lU lU @@ -5766,20 +5776,20 @@ te te te te -te -te -te -te -te -te -te -te -te -te -te -te -te -te +Zf +Zf +Zf +Qx +Qx +Qx +Qx +Qx +Zf +Zf +Zf +Zf +Zf +Zf lU lU lU @@ -5919,20 +5929,20 @@ te te te te -te -te -te -te -te +Zf +Zf +Zf +Qx +Qx lU lU lU lU -te -te -te -te -te +Zf +Zf +Zf +Zf +Zf lU lU lU @@ -6072,18 +6082,18 @@ te te te te -te -te -te +Zf +Zf +Zf lU lU lU lU lU lU -te -te -te +Zf +Zf +Zf eR jj jj @@ -6226,7 +6236,7 @@ te te te te -te +Zf lU lU lU @@ -6234,9 +6244,9 @@ lU lU lU lU -te -te -te +Zf +Zf +Zf lU lU lU diff --git a/maps/shaded_hills/shaded_hills-inn.dmm b/maps/shaded_hills/shaded_hills-inn.dmm index 016591882c5..97145e52ed9 100644 --- a/maps/shaded_hills/shaded_hills-inn.dmm +++ b/maps/shaded_hills/shaded_hills-inn.dmm @@ -1,4 +1,8 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aP" = ( +/obj/structure/flora/tree/dead/ebony, +/turf/floor/natural/dirt, +/area/shaded_hills/outside/shrine) "aU" = ( /obj/structure/wall_sconce/lantern{ dir = 1; @@ -531,6 +535,10 @@ /obj/abstract/exterior_marker/inside, /turf/floor/natural/dirt, /area/shaded_hills/outside/downlands) +"xk" = ( +/obj/structure/flora/tree/dead/mahogany, +/turf/floor/natural/dirt, +/area/shaded_hills/outside/shrine) "xH" = ( /turf/wall/brick/basalt, /area/shaded_hills/slaughterhouse) @@ -661,6 +669,10 @@ /obj/structure/bed/chair/bench/ebony, /turf/floor/wood/ebony, /area/shaded_hills/inn) +"BI" = ( +/obj/abstract/map_data/shaded_hills, +/turf/unsimulated/mask, +/area/shaded_hills/outside/downlands) "BL" = ( /obj/structure/bed/simple/ebony/cloth, /obj/item/bedsheet/yellowed, @@ -906,6 +918,9 @@ /obj/abstract/landmark/start/shaded_hills/traveller/learned, /turf/floor/natural/path/running_bond/basalt, /area/shaded_hills/outside/downlands) +"Mo" = ( +/turf/open, +/area/shaded_hills/outside/shrine) "Mp" = ( /obj/structure/wall_sconce/lantern, /turf/floor/natural/path/basalt, @@ -2744,7 +2759,7 @@ Wm Wm Wm Wm -Wm +BI Wm Wm lC @@ -20253,9 +20268,9 @@ By By By By -kv -kv -kv +aP +Mo +xk kv kv By @@ -20406,7 +20421,7 @@ xU xU xU kv -kv +aP kv kv By diff --git a/maps/shaded_hills/shaded_hills.dm b/maps/shaded_hills/shaded_hills.dm index e077b504feb..01a026f727b 100644 --- a/maps/shaded_hills/shaded_hills.dm +++ b/maps/shaded_hills/shaded_hills.dm @@ -52,8 +52,13 @@ #include "shaded_hills_testing.dm" #include "shaded_hills_turfs.dm" + // Caverns are below grassland and must be compiled in that order for multiz. + #include "shaded_hills-caverns.dmm" #include "shaded_hills-grassland.dmm" + // Dungeon is under inn and must be compiled in that order for multiz. + #include "shaded_hills-dungeon.dmm" #include "shaded_hills-inn.dmm" + // Other levels are lateral and compile order doesn't matter. #include "shaded_hills-swamp.dmm" #include "shaded_hills-woods.dmm" diff --git a/maps/shaded_hills/submaps/_submaps.dm b/maps/shaded_hills/submaps/_submaps.dm index 3bef23dd029..14b3948c927 100644 --- a/maps/shaded_hills/submaps/_submaps.dm +++ b/maps/shaded_hills/submaps/_submaps.dm @@ -2,6 +2,8 @@ #define MAP_TEMPLATE_CATEGORY_SH_SWAMP "template_sh_swamp" #define MAP_TEMPLATE_CATEGORY_SH_WOODS "template_sh_woods" #define MAP_TEMPLATE_CATEGORY_SH_DOWNLANDS "template_sh_downlands" +#define MAP_TEMPLATE_CATEGORY_SH_DUNGEON "template_sh_dungeon" +#define MAP_TEMPLATE_CATEGORY_SH_CAVERNS "template_sh_caverns" /datum/map_template/shaded_hills abstract_type = /datum/map_template/shaded_hills diff --git a/maps/shaded_hills/submaps/downlands/_downlands.dm b/maps/shaded_hills/submaps/downlands/_downlands.dm index a13750ffb56..22721f265b8 100644 --- a/maps/shaded_hills/submaps/downlands/_downlands.dm +++ b/maps/shaded_hills/submaps/downlands/_downlands.dm @@ -1,4 +1,9 @@ /datum/map_template/shaded_hills/downlands abstract_type = /datum/map_template/shaded_hills/downlands template_categories = list(MAP_TEMPLATE_CATEGORY_SH_DOWNLANDS) - template_parent_type = /datum/map_template/shaded_hills/downlands \ No newline at end of file + template_parent_type = /datum/map_template/shaded_hills/downlands + +/datum/map_template/shaded_hills/dungeon + abstract_type = /datum/map_template/shaded_hills/dungeon + template_categories = list(MAP_TEMPLATE_CATEGORY_SH_DUNGEON) + template_parent_type = /datum/map_template/shaded_hills/dungeon diff --git a/maps/shaded_hills/submaps/grassland/_grassland.dm b/maps/shaded_hills/submaps/grassland/_grassland.dm index b69046654d4..39f0722666b 100644 --- a/maps/shaded_hills/submaps/grassland/_grassland.dm +++ b/maps/shaded_hills/submaps/grassland/_grassland.dm @@ -1,4 +1,9 @@ /datum/map_template/shaded_hills/grassland abstract_type = /datum/map_template/shaded_hills/grassland template_categories = list(MAP_TEMPLATE_CATEGORY_SH_GRASSLAND) - template_parent_type = /datum/map_template/shaded_hills/grassland \ No newline at end of file + template_parent_type = /datum/map_template/shaded_hills/grassland + +/datum/map_template/shaded_hills/cavern + abstract_type = /datum/map_template/shaded_hills/cavern + template_categories = list(MAP_TEMPLATE_CATEGORY_SH_CAVERNS) + template_parent_type = /datum/map_template/shaded_hills/cavern \ No newline at end of file From 7ba585da33c011e4ee87edf2caec43d7a31eb6e7 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 23 Jun 2024 01:35:35 +1000 Subject: [PATCH 32/38] Converting existing automated movement to use a subsystem. --- code/__defines/subsystem-priority.dm | 3 +- code/_onclick/hud/animal.dm | 11 +- code/_onclick/other_mobs.dm | 2 +- .../subsystems/mob_ai/auto_movement.dm | 55 ++++++++++ code/controllers/subsystems/mob_ai/mob_ai.dm | 3 + code/controllers/subsystems/processing/ai.dm | 3 - code/datums/ai/ai.dm | 22 ++-- code/datums/ai/human.dm | 4 +- code/datums/ai/monkey.dm | 4 +- code/datums/move_intent/move_intent.dm | 5 +- code/datums/move_intent/move_intent_animal.dm | 23 ++++ code/datums/movement/automove.dm | 40 +++++++ code/datums/movement/automove_controller.dm | 63 +++++++++++ code/datums/movement/automove_metadata.dm | 10 ++ code/game/atoms_movable.dm | 5 + code/game/machinery/jukebox.dm | 1 - .../items/weapons/grenades/flashbang.dm | 15 +-- code/modules/events/meteors.dm | 5 +- code/modules/mob/death.dm | 2 +- code/modules/mob/living/bot/remotebot.dm | 2 +- code/modules/mob/living/bot/secbot.dm | 2 +- .../modules/mob/living/human/human_defines.dm | 2 +- code/modules/mob/living/living_defense.dm | 2 +- .../living/simple_animal/aquatic/_aquatic.dm | 3 +- .../simple_animal/aquatic/_aquatic_hostile.dm | 3 +- .../aquatic/_aquatic_retaliate.dm | 3 +- .../simple_animal/aquatic/aquatic_sharks.dm | 8 +- .../mob/living/simple_animal/crow/crow.dm | 2 +- .../mob/living/simple_animal/friendly/cat.dm | 54 ++++++---- .../living/simple_animal/friendly/corgi.dm | 8 +- .../mob/living/simple_animal/friendly/crab.dm | 16 +-- .../simple_animal/friendly/farm_animals.dm | 14 +-- .../living/simple_animal/friendly/koala.dm | 5 +- .../living/simple_animal/friendly/mushroom.dm | 2 +- .../living/simple_animal/friendly/possum.dm | 8 +- .../living/simple_animal/friendly/tomato.dm | 2 +- .../living/simple_animal/hostile/antlion.dm | 2 +- .../living/simple_animal/hostile/bad_drone.dm | 1 - .../mob/living/simple_animal/hostile/bat.dm | 3 +- .../mob/living/simple_animal/hostile/bear.dm | 10 +- .../mob/living/simple_animal/hostile/carp.dm | 5 +- .../hostile/commanded/commanded.dm | 21 ++-- .../hostile/commanded/nanomachines.dm | 9 +- .../living/simple_animal/hostile/creature.dm | 1 - .../simple_animal/hostile/faithful_hound.dm | 2 +- .../living/simple_animal/hostile/faithless.dm | 6 +- .../simple_animal/hostile/giant_spider.dm | 101 ++++++++++-------- .../living/simple_animal/hostile/hivebot.dm | 5 +- .../living/simple_animal/hostile/hostile.dm | 36 ++++--- .../mob/living/simple_animal/hostile/mimic.dm | 34 ++++-- .../mob/living/simple_animal/hostile/pike.dm | 9 +- .../simple_animal/hostile/retaliate/clown.dm | 6 +- .../simple_animal/hostile/retaliate/drone.dm | 17 +-- .../hostile/retaliate/exoplanet.dm | 37 ++++--- .../hostile/retaliate/giant_crab.dm | 8 +- .../simple_animal/hostile/retaliate/jelly.dm | 7 +- .../hostile/retaliate/king_of_goats.dm | 17 +-- .../simple_animal/hostile/retaliate/parrot.dm | 32 +++--- .../mob/living/simple_animal/hostile/slug.dm | 7 +- .../mob/living/simple_animal/hostile/tree.dm | 4 +- .../living/simple_animal/hostile/vagrant.dm | 19 ++-- .../living/simple_animal/passive/_passive.dm | 39 ++++--- .../mob/living/simple_animal/passive/deer.dm | 2 +- .../mob/living/simple_animal/passive/fox.dm | 22 ++-- .../mob/living/simple_animal/passive/mouse.dm | 8 +- .../mob/living/simple_animal/simple_animal.dm | 51 ++++----- code/modules/mob/mob.dm | 19 +++- code/modules/mob/mob_automove.dm | 24 +++++ code/modules/mob/mob_defines.dm | 2 +- code/modules/mob/mob_movement.dm | 10 +- code/modules/species/species.dm | 2 +- code/modules/species/station/monkey.dm | 2 +- maps/away/errant_pisces/errant_pisces.dm | 3 +- maps/away/slavers/slavers_base.dm | 5 +- maps/ministation/ministation-1.dmm | 1 - .../exoplanet_ruins/hydrobase/hydrobase.dm | 2 +- .../away_sites/lar_maria/lar_maria.dm | 6 +- .../content/xenobiology/colours/colour_red.dm | 2 +- mods/content/xenobiology/emotes.dm | 2 +- mods/content/xenobiology/slime/_slime.dm | 14 +-- mods/content/xenobiology/slime/death.dm | 4 +- mods/content/xenobiology/slime/feeding.dm | 2 +- mods/content/xenobiology/slime/powers.dm | 4 +- mods/content/xenobiology/slime/say.dm | 4 +- mods/content/xenobiology/slime/slime_AI.dm | 22 ++-- .../xenobiology/slime/slime_commands.dm | 12 +-- .../xenobiology/slime/slime_comments.dm | 12 +-- .../xenobiology/slime/slime_reagents.dm | 6 +- .../xenobiology/slime/slime_update_icon.dm | 2 +- .../cult/mobs/constructs/constructs.dm | 19 +--- mods/gamemodes/cult/mobs/shade.dm | 6 +- mods/mobs/borers/mob/borer/borer.dm | 4 +- mods/mobs/dionaea/datums/ai.dm | 4 +- mods/mobs/dionaea/mob/_nymph.dm | 2 +- nebula.dme | 8 +- 95 files changed, 733 insertions(+), 405 deletions(-) create mode 100644 code/controllers/subsystems/mob_ai/auto_movement.dm create mode 100644 code/controllers/subsystems/mob_ai/mob_ai.dm delete mode 100644 code/controllers/subsystems/processing/ai.dm create mode 100644 code/datums/move_intent/move_intent_animal.dm create mode 100644 code/datums/movement/automove.dm create mode 100644 code/datums/movement/automove_controller.dm create mode 100644 code/datums/movement/automove_metadata.dm create mode 100644 code/modules/mob/mob_automove.dm diff --git a/code/__defines/subsystem-priority.dm b/code/__defines/subsystem-priority.dm index 85ce85d0d06..a927f04a581 100644 --- a/code/__defines/subsystem-priority.dm +++ b/code/__defines/subsystem-priority.dm @@ -46,7 +46,8 @@ #define SS_PRIORITY_PLANTS 90 // Plant processing, slow ticks. #define SS_PRIORITY_VINES 50 // Spreading vine effects. #define SS_PRIORITY_PSYCHICS 45 // Psychic complexus processing. -#define SS_PRIORITY_AI 45 // Artificial Intelligence on mobs processing. +#define SS_PRIORITY_MOB_AI 45 // Mob AI logic; finding targets, attacking, etc. +#define SS_PRIORITY_AUTO_MOVE 42 // Automated atom movement, fires much more frequently than MOB_AI. #define SS_PRIORITY_NANO 40 // Updates to nanoui uis. #define SS_PRIORITY_TURF 30 // Radioactive walls/blob. #define SS_PRIORITY_EVAC 30 // Processes the evac controller. diff --git a/code/_onclick/hud/animal.dm b/code/_onclick/hud/animal.dm index e0eed1acee3..5c1d9173a3a 100644 --- a/code/_onclick/hud/animal.dm +++ b/code/_onclick/hud/animal.dm @@ -3,7 +3,14 @@ hud_used = /datum/hud/animal /datum/hud/animal/FinalizeInstantiation() - action_intent = new(null, mymob, get_ui_style_data(), get_ui_color(), get_ui_alpha(), UI_ICON_INTENT) + + var/ui_style = get_ui_style_data() + var/ui_color = get_ui_color() + var/ui_alpha = get_ui_alpha() + + move_intent = new(null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_MOVEMENT) + move_intent.icon_state = mymob.move_intent.hud_icon_state + adding += move_intent + action_intent = new(null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_INTENT) adding += action_intent ..() - diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 7965251ab03..a43100cd6dd 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -82,7 +82,7 @@ var/decl/pronouns/G = get_pronouns() face_atom(A) if(attack_delay) - walk_to(src, 0) // Cancel any baked-in movement. + stop_automove() // Cancel any baked-in movement. do_windup_animation(A, attack_delay, no_reset = TRUE) if(!do_after(src, attack_delay, A) || !Adjacent(A)) visible_message(SPAN_NOTICE("\The [src] misses [G.his] attack on \the [A]!")) diff --git a/code/controllers/subsystems/mob_ai/auto_movement.dm b/code/controllers/subsystems/mob_ai/auto_movement.dm new file mode 100644 index 00000000000..7e2990c1cb8 --- /dev/null +++ b/code/controllers/subsystems/mob_ai/auto_movement.dm @@ -0,0 +1,55 @@ +SUBSYSTEM_DEF(automove) + name = "Automated Movement" + wait = 1 + flags = SS_NO_INIT + priority = SS_PRIORITY_AUTO_MOVE + + var/list/moving_atoms = list() + var/list/moving_metadata = list() + var/list/processing_atoms + +/datum/controller/subsystem/automove/proc/unregister_mover(atom/movable/mover) + if(!istype(mover)) + CRASH("Invalid parameters to unregister_mover: [mover || "NULL"]") + if(length(moving_atoms)) + moving_atoms -= mover + if(length(moving_metadata)) + moving_metadata -= mover + if(length(processing_atoms)) + processing_atoms -= mover + +/datum/controller/subsystem/automove/proc/register_mover(atom/movable/mover, controller_type, datum/automove_metadata/metadata) + if(!istype(mover) || (!ispath(controller_type, /decl/automove_controller) && !istype(controller_type, /decl/automove_controller))) + CRASH("Invalid parameters to register_mover: [controller_type || "NULL"], [mover || "NULL"]") + + var/decl/automove_controller/controller = ispath(controller_type) ? GET_DECL(controller_type) : controller_type + moving_atoms[mover] = controller + if(istype(metadata)) + moving_metadata[mover] = metadata + else + moving_metadata -= mover + + if(suspended) + wake() + +/datum/controller/subsystem/automove/fire(resumed = FALSE) + + if(!resumed) + processing_atoms = moving_atoms.Copy() + + if(!length(processing_atoms)) + suspend() + return + + var/i = 0 + var/atom/movable/mover + var/decl/automove_controller/controller + while(i < processing_atoms.len) + i++ + mover = processing_atoms[i] + controller = processing_atoms[mover] + if(controller.handle_mover(mover, moving_metadata[mover]) == PROCESS_KILL && !QDELETED(mover)) + mover.stop_automove() + if(MC_TICK_CHECK) + processing_atoms.Cut(1, i+1) + return diff --git a/code/controllers/subsystems/mob_ai/mob_ai.dm b/code/controllers/subsystems/mob_ai/mob_ai.dm new file mode 100644 index 00000000000..9990c62185e --- /dev/null +++ b/code/controllers/subsystems/mob_ai/mob_ai.dm @@ -0,0 +1,3 @@ +PROCESSING_SUBSYSTEM_DEF(mob_ai) + name = "Mob AI" + priority = SS_PRIORITY_MOB_AI diff --git a/code/controllers/subsystems/processing/ai.dm b/code/controllers/subsystems/processing/ai.dm deleted file mode 100644 index ff1ad3de238..00000000000 --- a/code/controllers/subsystems/processing/ai.dm +++ /dev/null @@ -1,3 +0,0 @@ -PROCESSING_SUBSYSTEM_DEF(ai) - name = "AIs" - priority = SS_PRIORITY_AI diff --git a/code/datums/ai/ai.dm b/code/datums/ai/ai.dm index f466d5b6daf..8373aa01c26 100644 --- a/code/datums/ai/ai.dm +++ b/code/datums/ai/ai.dm @@ -1,25 +1,25 @@ -/datum/ai +/datum/mob_controller var/name var/mob/living/body // The parent mob we control. var/expected_type = /mob/living // Type of mob this AI applies to. var/wait_for = 0 // The next time we can process. var/run_interval = 1 // How long to wait between processes. -/datum/ai/New(var/mob/living/target_body) +/datum/mob_controller/New(var/mob/living/target_body) body = target_body if(expected_type && !istype(body, expected_type)) PRINT_STACK_TRACE("AI datum [type] received a body ([body ? body.type : "NULL"]) of unexpected type ([expected_type]).") - START_PROCESSING(SSai, src) + START_PROCESSING(SSmob_ai, src) -/datum/ai/Destroy() - STOP_PROCESSING(SSai, src) +/datum/mob_controller/Destroy() + STOP_PROCESSING(SSmob_ai, src) if(body) if(body.ai == src) body.ai = null body = null . = ..() -/datum/ai/proc/can_process() +/datum/mob_controller/proc/can_process() if(!body || !body.loc || ((body.client || body.mind) && !(body.status_flags & ENABLE_AI))) return FALSE if(wait_for > world.time) @@ -28,7 +28,7 @@ return FALSE return TRUE -/datum/ai/Process() +/datum/mob_controller/Process() if(!can_process()) return @@ -37,5 +37,11 @@ do_process(time_elapsed) // This is the place to actually do work in the AI. -/datum/ai/proc/do_process(var/time_elapsed) +/datum/mob_controller/proc/do_process(var/time_elapsed) return + +/datum/mob_controller/proc/get_automove_target(datum/automove_metadata/metadata) + return null + +/datum/mob_controller/proc/can_do_automated_move(variant_move_delay) + return body && !body.client diff --git a/code/datums/ai/human.dm b/code/datums/ai/human.dm index 60be355be6a..7c2eda8f136 100644 --- a/code/datums/ai/human.dm +++ b/code/datums/ai/human.dm @@ -1,8 +1,8 @@ -/datum/ai/human +/datum/mob_controller/human name = "human" expected_type = /mob/living/human -/datum/ai/human/do_process(var/time_elapsed) +/datum/mob_controller/human/do_process(var/time_elapsed) var/mob/living/human/H = body if(H.stat != CONSCIOUS) return diff --git a/code/datums/ai/monkey.dm b/code/datums/ai/monkey.dm index 1226e253809..6f902d87597 100644 --- a/code/datums/ai/monkey.dm +++ b/code/datums/ai/monkey.dm @@ -1,4 +1,4 @@ -/datum/ai/monkey +/datum/mob_controller/monkey name = "monkey" expected_type = /mob/living/human var/list/no_touchie = list( @@ -6,7 +6,7 @@ /obj/structure/mirror ) -/datum/ai/monkey/do_process(var/time_elapsed) +/datum/mob_controller/monkey/do_process(var/time_elapsed) if(body.incapacitated()) return diff --git a/code/datums/move_intent/move_intent.dm b/code/datums/move_intent/move_intent.dm index 87e521f5e33..b520d57b73d 100644 --- a/code/datums/move_intent/move_intent.dm +++ b/code/datums/move_intent/move_intent.dm @@ -1,11 +1,13 @@ // Quick and deliberate movements are not necessarily mutually exclusive +#define MOVE_INTENT_NONE 0 #define MOVE_INTENT_DELIBERATE BITFLAG(0) #define MOVE_INTENT_EXERTIVE BITFLAG(1) #define MOVE_INTENT_QUICK BITFLAG(2) +#define MOVE_INTENT_NEUTRAL BITFLAG(3) /decl/move_intent var/name - var/flags = 0 + var/flags = MOVE_INTENT_NONE var/move_delay = 1 var/hud_icon_state @@ -26,6 +28,7 @@ /decl/move_intent/walk name = "Walk" hud_icon_state = "walking" + flags = MOVE_INTENT_NEUTRAL /decl/move_intent/walk/Initialize() . = ..() diff --git a/code/datums/move_intent/move_intent_animal.dm b/code/datums/move_intent/move_intent_animal.dm new file mode 100644 index 00000000000..e7fc6b376b8 --- /dev/null +++ b/code/datums/move_intent/move_intent_animal.dm @@ -0,0 +1,23 @@ +/decl/move_intent/walk/animal + move_delay = 3 + +/decl/move_intent/run/animal + move_delay = 2 + +/decl/move_intent/walk/animal_slow + move_delay = 4 + +/decl/move_intent/run/animal_slow + move_delay = 3 + +/decl/move_intent/walk/animal_very_slow + move_delay = 8 + +/decl/move_intent/run/animal_very_slow + move_delay = 6 + +/decl/move_intent/walk/animal_fast + move_delay = 2 + +/decl/move_intent/run/animal_fast + move_delay = 1 diff --git a/code/datums/movement/automove.dm b/code/datums/movement/automove.dm new file mode 100644 index 00000000000..a07d65d0324 --- /dev/null +++ b/code/datums/movement/automove.dm @@ -0,0 +1,40 @@ +// These procs are a way to implement something like walk_to()/walk_away() +// while also preserving the full move chain for mobs. /obj and such can +// get away with walk(), but mobs need to set move delays, update glide size, etc. + +/atom/movable/proc/get_default_automove_controller_type() + return /decl/automove_controller + +/// Cancels automoving and unregisters the atom from the subsystem, including the current processing run. +/atom/movable/proc/stop_automove() + SHOULD_CALL_PARENT(TRUE) + walk_to(src, 0) // Legacy call to stop BYOND's inbuilt movement. + SSautomove.unregister_mover(src) + +/// Registers an atom with SSautomove, including a move handler and metadata. Moving will begin next tick. +/atom/movable/proc/start_automove(target, movement_type, datum/automove_metadata/metadata) + SHOULD_CALL_PARENT(TRUE) + SSautomove.register_mover(src, (movement_type || get_default_automove_controller_type()), metadata) + +/// Called when an atom is within the acceptable parameters for not moving further (ideal range). Does not necessarily imply the atom has unregistered (see stop_automove()). +/atom/movable/proc/finished_automove() + SHOULD_CALL_PARENT(TRUE) + return FALSE + +/// Called by SSautomove when an atom fails to move in circumstances where it would like to. As with finished_automove, does not imply unregistering from SSautomove. +/atom/movable/proc/failed_automove() + SHOULD_CALL_PARENT(TRUE) + return FALSE + +// Jesus Christ why do I write such long proc names +/// Used by some mobs to vary the acceptable distance from target when automoving. +/atom/movable/proc/get_acceptable_automove_distance_from_target() + return 0 + +/// Should return a reference to the current atom target. +/atom/movable/proc/get_automove_target(datum/automove_metadata/metadata) + return null + +/// Generalized entrypoint for checking CanMove and such on /mob. +/atom/movable/proc/can_do_automated_move(variant_move_delay) + return FALSE diff --git a/code/datums/movement/automove_controller.dm b/code/datums/movement/automove_controller.dm new file mode 100644 index 00000000000..08dae443f35 --- /dev/null +++ b/code/datums/movement/automove_controller.dm @@ -0,0 +1,63 @@ +/// Implements automove logic; can be overridden on mob procs if you want to vary the logic from the below. +/decl/automove_controller + var/completion_signal = FALSE // Set to TRUE if you want movement to stop processing when the atom reaches its target. + var/failure_signal = FALSE // Set to TRUE if you want movement to stop processing when the atom fails to move. + +/decl/automove_controller/proc/handle_mover(atom/movable/mover, datum/automove_metadata/metadata) + + // Cease automovement if we got an invalid mover.. + if(!istype(mover)) + return PROCESS_KILL + + // Null target means abandon pathing, regardless of return signals. + var/atom/target = mover.get_automove_target(metadata) + if(!istype(target)) + return PROCESS_KILL + + // Return early if we are in the process of moving, as we will definitely fail MayMove at the end() + if(ismob(mover)) + var/mob/mover_mob = mover + if(mover_mob.moving) + return TRUE + + // Cease automovement if we're already at the target. + var/avoid_target = metadata?.avoid_target + if(!avoid_target && (get_turf(mover) == get_turf(target) || (ismovable(target) && mover.Adjacent(target)))) + mover.finished_automove() + return completion_signal + + // Cease movement if we're close enough to the target. + var/acceptable_move_dist = isnull(metadata?.acceptable_distance) ? mover.get_acceptable_automove_distance_from_target() : metadata.acceptable_distance + if(avoid_target ? (get_dist(mover, target) >= acceptable_move_dist) : (get_dist(mover, target) <= acceptable_move_dist)) + mover.finished_automove() + return completion_signal + + // Cease automovement if we failed to move a turf. + if(mover.can_do_automated_move(metadata?.move_delay)) + if(avoid_target) + target = get_edge_target_turf(target, get_dir(target, mover)) + + // Note for future coders: SelfMove() only confirms if a handler handled the move, not if the atom moved. + var/old_loc = mover.loc + + // Try to move directly. + var/target_dir = get_dir(mover, target) + if(!target_dir) + if(avoid_target) + target_dir = pick(global.cardinal) + else + return TRUE // no idea how we would get into this position + + if(mover.SelfMove(target_dir) && (old_loc != mover.loc)) + return TRUE + + // Try to move around any obstacle. + var/static/list/_alt_dir_rot = list(45, -45) + for(var/alt_dir in shuffle(_alt_dir_rot)) + mover.reset_movement_delay() + if(mover.SelfMove(turn(target_dir, alt_dir)) && (old_loc != mover.loc)) + return TRUE + + mover.failed_automove() + + return failure_signal diff --git a/code/datums/movement/automove_metadata.dm b/code/datums/movement/automove_metadata.dm new file mode 100644 index 00000000000..f1f4796cafb --- /dev/null +++ b/code/datums/movement/automove_metadata.dm @@ -0,0 +1,10 @@ +// Overrides some aspects of mob movement for the purposes of automove. +/datum/automove_metadata + var/move_delay + var/acceptable_distance + var/avoid_target + +/datum/automove_metadata/New(_move_delay, _acceptable_distance, _avoid_target) + move_delay = _move_delay + acceptable_distance = _acceptable_distance + avoid_target = _avoid_target diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 13c6665f9b4..50ffbccd510 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -562,3 +562,8 @@ /atom/movable/proc/end_throw() throwing = null + +/atom/movable/proc/reset_movement_delay() + var/datum/movement_handler/delay/delay = locate() in movement_handlers + if(istype(delay)) + delay.next_move = world.time diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm index 99da01b0b81..d6ef1ab8daa 100644 --- a/code/game/machinery/jukebox.dm +++ b/code/game/machinery/jukebox.dm @@ -143,7 +143,6 @@ return TRUE /obj/machinery/media/jukebox/proc/explode() - walk_to(src,0) src.visible_message("\the [src] blows apart!", 1) explosion(src.loc, 0, 0, 1, rand(1,2), 1) diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index 1aef86677a8..26ad711148e 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -80,10 +80,6 @@ if(!ear_safety) sound_to(M, 'sound/weapons/flash_ring.ogg') -/obj/item/grenade/flashbang/Destroy() - walk(src, 0) // Because we might have called walk_away, we must stop the walk loop or BYOND keeps an internal reference to us forever. - return ..() - /obj/item/grenade/flashbang/instant invisibility = INVISIBILITY_MAXIMUM is_spawnable_type = FALSE // Do not manually spawn this, it will runtime/break. @@ -123,10 +119,10 @@ . = ..() //Segments should never exist except part of the clusterbang, since these immediately 'do their thing' and asplode banglet = 1 activate() - var/stepdist = rand(1,4)//How far to step - var/temploc = src.loc//Saves the current location to know where to step away from - walk_away(src,temploc,stepdist)//I must go, my people need me + //I must go, my people need me addtimer(CALLBACK(src, PROC_REF(detonate)), rand(15,60)) + if(isturf(loc)) // Don't hurl yourself around if you're not on a turf. + throw_at(get_edge_target_turf(loc, pick(global.cardinal)), rand(1, 4), 5, null, TRUE) /obj/item/grenade/flashbang/clusterbang/segment/detonate() var/numspawned = rand(4,8) @@ -142,7 +138,6 @@ . = ..() //Same concept as the segments, so that all of the parts don't become reliant on the clusterbang banglet = 1 activate() - var/stepdist = rand(1,3) - var/temploc = src.loc - walk_away(src,temploc,stepdist) addtimer(CALLBACK(src, PROC_REF(detonate)), rand(15,60)) + if(isturf(loc)) // See Initialize() for above. + throw_at(get_edge_target_turf(loc, pick(global.cardinal)), rand(1, 3), 5, null, TRUE) diff --git a/code/modules/events/meteors.dm b/code/modules/events/meteors.dm index 2ee22955208..824d31b395a 100644 --- a/code/modules/events/meteors.dm +++ b/code/modules/events/meteors.dm @@ -242,9 +242,6 @@ var/global/list/meteors_major = list( /obj/effect/meteor/Initialize() . = ..() z_original = z - -/obj/effect/meteor/Initialize() - . = ..() global.meteor_list += src /obj/effect/meteor/Move() @@ -258,7 +255,7 @@ var/global/list/meteors_major = list( qdel(src) /obj/effect/meteor/Destroy() - walk(src,0) //this cancels the walk_towards() proc + walk(src, 0) global.meteor_list -= src . = ..() diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm index b57a252b2ed..1b7d470abc8 100644 --- a/code/modules/mob/death.dm +++ b/code/modules/mob/death.dm @@ -76,7 +76,7 @@ if(stat == DEAD) return FALSE - walk(src, 0) + stop_automove() facing_dir = null if(!gibbed) diff --git a/code/modules/mob/living/bot/remotebot.dm b/code/modules/mob/living/bot/remotebot.dm index ec98235438f..1d50e2f72c6 100644 --- a/code/modules/mob/living/bot/remotebot.dm +++ b/code/modules/mob/living/bot/remotebot.dm @@ -81,7 +81,7 @@ if(working || stat || !on || a == src) //can't touch itself return if(isturf(a) || get_dist(src,a) > 1) - walk_to(src,a,0,get_movement_delay(get_dir(src, a))) + start_automove(a) else if(istype(a, /obj/item)) pickup(a) else diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm index 947f989f447..412d45498ac 100644 --- a/code/modules/mob/living/bot/secbot.dm +++ b/code/modules/mob/living/bot/secbot.dm @@ -150,7 +150,7 @@ ..() events_repository.unregister(/decl/observ/moved, target, src) awaiting_surrender = -1 - walk_to(src, 0) + stop_automove() /mob/living/bot/secbot/startPatrol() if(!locked) // Stop running away when we set you up diff --git a/code/modules/mob/living/human/human_defines.dm b/code/modules/mob/living/human/human_defines.dm index 71c332ff74b..8b9c4db0325 100644 --- a/code/modules/mob/living/human/human_defines.dm +++ b/code/modules/mob/living/human/human_defines.dm @@ -1,6 +1,6 @@ /mob/living/human - ai = /datum/ai/human + ai = /datum/mob_controller/human mob_bump_flag = HUMAN mob_push_flags = ~HEAVY mob_swap_flags = ~HEAVY diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index b497c1269cc..7a400561ca7 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -246,7 +246,7 @@ if(!istype(wall) || !wall.density) return FALSE LAZYDISTINCTADD(pinned, O) - walk_to(src, 0) // cancel any automated movement + stop_automove() visible_message("\The [src] is pinned to \the [wall] by \the [O]!") // TODO: cancel all throwing and momentum after this point return TRUE diff --git a/code/modules/mob/living/simple_animal/aquatic/_aquatic.dm b/code/modules/mob/living/simple_animal/aquatic/_aquatic.dm index aadbc20da26..b4792456a2c 100644 --- a/code/modules/mob/living/simple_animal/aquatic/_aquatic.dm +++ b/code/modules/mob/living/simple_animal/aquatic/_aquatic.dm @@ -1,7 +1,6 @@ /mob/living/simple_animal/aquatic icon = 'icons/mob/simple_animal/fish_content.dmi' - turns_per_move = 5 - speed = 4 + turns_per_wander = 5 mob_size = MOB_SIZE_SMALL emote_see = list("glubs", "blubs", "bloops") base_animal_type = /mob/living/simple_animal/aquatic diff --git a/code/modules/mob/living/simple_animal/aquatic/_aquatic_hostile.dm b/code/modules/mob/living/simple_animal/aquatic/_aquatic_hostile.dm index b537fe3850d..dae75864a02 100644 --- a/code/modules/mob/living/simple_animal/aquatic/_aquatic_hostile.dm +++ b/code/modules/mob/living/simple_animal/aquatic/_aquatic_hostile.dm @@ -1,12 +1,11 @@ /mob/living/simple_animal/hostile/aquatic abstract_type = /mob/living/simple_animal/hostile/aquatic icon = 'icons/mob/simple_animal/fish_content.dmi' - turns_per_move = 5 natural_weapon = /obj/item/natural_weapon/bite - speed = 4 mob_size = MOB_SIZE_MEDIUM emote_see = list("gnashes") base_animal_type = /mob/living/simple_animal/aquatic // used for language, ignore actual type is_aquatic = TRUE butchery_data = /decl/butchery_data/animal/fish holder_type = /obj/item/holder + turns_per_wander = 5 diff --git a/code/modules/mob/living/simple_animal/aquatic/_aquatic_retaliate.dm b/code/modules/mob/living/simple_animal/aquatic/_aquatic_retaliate.dm index 64143d3de6e..21458aa61cf 100644 --- a/code/modules/mob/living/simple_animal/aquatic/_aquatic_retaliate.dm +++ b/code/modules/mob/living/simple_animal/aquatic/_aquatic_retaliate.dm @@ -1,12 +1,11 @@ /mob/living/simple_animal/hostile/retaliate/aquatic abstract_type = /mob/living/simple_animal/hostile/retaliate/aquatic icon = 'icons/mob/simple_animal/fish_content.dmi' - turns_per_move = 5 natural_weapon = /obj/item/natural_weapon/bite - speed = 4 mob_size = MOB_SIZE_MEDIUM emote_see = list("gnashes") base_animal_type = /mob/living/simple_animal/aquatic // used for language, ignore actual type is_aquatic = TRUE butchery_data = /decl/butchery_data/animal/fish holder_type = /obj/item/holder + turns_per_wander = 5 diff --git a/code/modules/mob/living/simple_animal/aquatic/aquatic_sharks.dm b/code/modules/mob/living/simple_animal/aquatic/aquatic_sharks.dm index 747b5605685..5645b465835 100644 --- a/code/modules/mob/living/simple_animal/aquatic/aquatic_sharks.dm +++ b/code/modules/mob/living/simple_animal/aquatic/aquatic_sharks.dm @@ -15,10 +15,12 @@ name = "gigacretoxyrhina" desc = "That is a lot of shark." icon = 'icons/mob/simple_animal/spaceshark.dmi' - turns_per_move = 2 - move_to_delay = 2 + move_intents = list( + /decl/move_intent/walk/animal, + /decl/move_intent/run/animal + ) + turns_per_wander = 2 attack_same = 1 - speed = 0 mob_size = MOB_SIZE_LARGE pixel_x = -16 max_health = 400 diff --git a/code/modules/mob/living/simple_animal/crow/crow.dm b/code/modules/mob/living/simple_animal/crow/crow.dm index 7120590ae10..cebe755f81c 100644 --- a/code/modules/mob/living/simple_animal/crow/crow.dm +++ b/code/modules/mob/living/simple_animal/crow/crow.dm @@ -21,7 +21,7 @@ natural_weapon = /obj/item/natural_weapon/crow_claws - stop_automated_movement = TRUE + stop_wandering = TRUE universal_speak = TRUE diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index eab529e073c..f0623130d0e 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -8,7 +8,7 @@ emote_hear = list("meows","mews") emote_see = list("shakes their head", "shivers") speak_chance = 0.5 - turns_per_move = 5 + turns_per_wander = 5 see_in_dark = 6 minbodytemp = 223 //Below -50 Degrees Celsius maxbodytemp = 323 //Above 50 Degrees Celsius @@ -46,7 +46,7 @@ M.splat() visible_emote(pick("bites \the [M]!","toys with \the [M].","chomps on \the [M]!")) movement_target = null - stop_automated_movement = 0 + stop_wandering = FALSE break for(var/mob/living/simple_animal/passive/mouse/snack in oview(src,5)) @@ -56,7 +56,7 @@ turns_since_scan++ if (turns_since_scan > 5) - walk_to(src,0) + stop_automove() turns_since_scan = 0 if (flee_target) //fleeing takes precendence @@ -80,30 +80,33 @@ //if our target is neither inside a turf or inside a human(???), stop if((movement_target) && !(isturf(movement_target.loc) || ishuman(movement_target.loc) )) movement_target = null - stop_automated_movement = 0 + stop_wandering = FALSE //if we have no target or our current one is out of sight/too far away if( !movement_target || !(movement_target.loc in oview(src, 4)) ) movement_target = null - stop_automated_movement = 0 + stop_wandering = FALSE for(var/mob/living/simple_animal/passive/mouse/snack in oview(src)) //search for a new target if(isturf(snack.loc) && !snack.stat) movement_target = snack break if(movement_target) - stop_automated_movement = 1 - walk_to(src,movement_target,0,3) + set_moving_quickly() + stop_wandering = TRUE + start_automove(movement_target) /mob/living/simple_animal/cat/proc/handle_flee_target() //see if we should stop fleeing if (flee_target && !(flee_target.loc in view(src))) flee_target = null - stop_automated_movement = 0 + stop_wandering = FALSE if (flee_target) if(prob(25)) say("HSSSSS") - stop_automated_movement = 1 - walk_away(src, flee_target, 7, 2) + set_moving_quickly() + stop_wandering = TRUE + start_automove(flee_target, metadata = global._flee_automove_metadata) + /mob/living/simple_animal/cat/proc/set_flee_target(atom/A) if(A) @@ -137,32 +140,41 @@ var/mob/living/human/friend var/befriend_job = null +/mob/living/simple_animal/cat/fluff + var/follow_dist = 4 + +/mob/living/simple_animal/cat/fluff/get_acceptable_automove_distance_from_target() + . = follow_dist + if(friend) + if(friend.stat >= DEAD || friend.is_asystole()) //danger + . = 1 + else if (friend.stat || friend.current_health <= 50) //danger or just sleeping + . = 2 + else + . = follow_dist + return max(. - 2, 1) + /mob/living/simple_animal/cat/fluff/handle_movement_target() if (!QDELETED(friend)) - var/follow_dist = 4 - if (friend.stat >= DEAD || friend.is_asystole()) //danger - follow_dist = 1 - else if (friend.stat || friend.current_health <= 50) //danger or just sleeping - follow_dist = 2 - var/near_dist = max(follow_dist - 2, 1) + var/near_dist = get_acceptable_automove_distance_from_target() var/current_dist = get_dist(src, friend) if (movement_target != friend) if (current_dist > follow_dist && !ismouse(movement_target) && (friend in oview(src))) //stop existing movement - walk_to(src,0) + stop_automove() turns_since_scan = 0 //walk to friend - stop_automated_movement = 1 + stop_wandering = TRUE movement_target = friend - walk_to(src, movement_target, near_dist, 4) + start_automove(movement_target) //already following and close enough, stop else if (current_dist <= near_dist) - walk_to(src,0) + stop_automove() movement_target = null - stop_automated_movement = 0 + stop_wandering = FALSE if (prob(10)) say("Meow!") diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index 6d021ba10ae..f216fb447de 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -9,7 +9,7 @@ emote_hear = list("barks", "woofs", "yaps","pants") emote_see = list("shakes its head", "shivers") speak_chance = 0.5 - turns_per_move = 10 + turns_per_wander = 10 response_disarm = "bops" see_in_dark = 5 mob_size = MOB_SIZE_SMALL @@ -52,16 +52,16 @@ turns_since_scan = 0 if((movement_target) && !(isturf(movement_target.loc) || ishuman(movement_target.loc) )) movement_target = null - stop_automated_movement = 0 + stop_wandering = FALSE if( !movement_target || !(movement_target.loc in oview(src, 3)) ) movement_target = null - stop_automated_movement = 0 + stop_wandering = FALSE for(var/obj/item/chems/food/S in oview(src,3)) if(isturf(S.loc) || ishuman(S.loc)) movement_target = S break if(movement_target) - stop_automated_movement = 1 + stop_wandering = TRUE step_to(src,movement_target,1) sleep(3) step_to(src,movement_target,1) diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index 62cda14fe9d..5b7c22f062c 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -8,16 +8,16 @@ emote_hear = list("clicks") emote_see = list("clacks") speak_chance = 0.5 - turns_per_move = 5 + turns_per_wander = 5 response_harm = "stamps on" - stop_automated_movement = 1 + stop_wandering = TRUE possession_candidate = 1 can_escape = TRUE //snip snip pass_flags = PASS_FLAG_TABLE natural_armor = list( ARMOR_MELEE = ARMOR_MELEE_KNIVES ) - ai = /datum/ai/crab + ai = /datum/mob_controller/crab butchery_data = /decl/butchery_data/animal/arthropod/crab // TODO @@ -44,18 +44,18 @@ ) . = ..() -/datum/ai/crab +/datum/mob_controller/crab expected_type = /mob/living/simple_animal/crab -/datum/ai/crab/do_process(time_elapsed) +/datum/mob_controller/crab/do_process(time_elapsed) . = ..() var/mob/living/simple_animal/crab/crab = body if(!isturf(crab.loc) || crab.current_posture.prone || crab.buckled) return - crab.turns_since_move++ - if(crab.turns_since_move >= crab.turns_per_move) + crab.turns_since_wander++ + if(crab.turns_since_wander >= crab.turns_per_wander) crab.Move(get_step(crab,pick(4,8))) - crab.turns_since_move = 0 + crab.turns_since_wander = 0 //COFFEE! SQUEEEEEEEEE! /mob/living/simple_animal/crab/Coffee diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index 4f126c14998..3b535efe090 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -8,19 +8,19 @@ emote_hear = list("brays") emote_see = list("shakes its head", "stamps a foot", "glares around") speak_chance = 0.5 - turns_per_move = 5 + turns_per_wander = 5 see_in_dark = 6 faction = "goat" max_health = 40 natural_weapon = /obj/item/natural_weapon/hooves butchery_data = /decl/butchery_data/animal/ruminant/goat - ai = /datum/ai/goat + ai = /datum/mob_controller/goat var/datum/reagents/udder = null -/datum/ai/goat +/datum/mob_controller/goat expected_type = /mob/living/simple_animal/hostile/retaliate/goat -/datum/ai/goat/do_process(time_elapsed) +/datum/mob_controller/goat/do_process(time_elapsed) //chance to go crazy and start wacking stuff var/mob/living/simple_animal/hostile/retaliate/goat/goat = body if(!length(goat.enemies) && prob(1)) @@ -91,7 +91,7 @@ emote_hear = list("brays") emote_see = list("shakes its head") speak_chance = 0.5 - turns_per_move = 5 + turns_per_wander = 5 see_in_dark = 6 max_health = 50 butchery_data = /decl/butchery_data/animal/ruminant/cow @@ -156,7 +156,7 @@ emote_hear = list("cheeps") emote_see = list("pecks at the ground","flaps its tiny wings") speak_chance = 1 - turns_per_move = 2 + turns_per_wander = 2 max_health = 1 pass_flags = PASS_FLAG_TABLE | PASS_FLAG_GRILLE mob_size = MOB_SIZE_MINISCULE @@ -183,7 +183,7 @@ mob_size = MOB_SIZE_SMALL butchery_data = /decl/butchery_data/animal/small/fowl speak_chance = 2 - turns_per_move = 3 + turns_per_wander = 3 abstract_type = /mob/living/simple_animal/fowl var/body_color diff --git a/code/modules/mob/living/simple_animal/friendly/koala.dm b/code/modules/mob/living/simple_animal/friendly/koala.dm index 773b78c75db..78b96516f2d 100644 --- a/code/modules/mob/living/simple_animal/friendly/koala.dm +++ b/code/modules/mob/living/simple_animal/friendly/koala.dm @@ -4,12 +4,11 @@ desc = "A little grey bear. How long is he gonna sleep today?" icon = 'icons/mob/simple_animal/koala.dmi' max_health = 45 - speed = 4 speak_emote = list("roar") emote_speech = list("Rrr", "Wraarh...", "Pfrrr...") emote_hear = list("grunting.","rustling.", "slowly yawns.") emote_see = list("slowly turns around his head.", "rises to his feet, and lays to the ground on all fours.") speak_chance = 0.5 - turns_per_move = 10 //lazy + turns_per_wander = 10 //lazy see_in_dark = 6 - stop_automated_movement_when_pulled = 1 + stop_wandering_when_pulled = TRUE diff --git a/code/modules/mob/living/simple_animal/friendly/mushroom.dm b/code/modules/mob/living/simple_animal/friendly/mushroom.dm index d7950196414..e8a6cafc2f4 100644 --- a/code/modules/mob/living/simple_animal/friendly/mushroom.dm +++ b/code/modules/mob/living/simple_animal/friendly/mushroom.dm @@ -4,7 +4,7 @@ icon = 'icons/mob/simple_animal/mushroom.dmi' mob_size = MOB_SIZE_SMALL speak_chance = 0 - turns_per_move = 1 + turns_per_wander = 1 max_health = 5 harm_intent_damage = 5 pass_flags = PASS_FLAG_TABLE diff --git a/code/modules/mob/living/simple_animal/friendly/possum.dm b/code/modules/mob/living/simple_animal/friendly/possum.dm index 5fdc3e52708..9ffb5aba8f5 100644 --- a/code/modules/mob/living/simple_animal/friendly/possum.dm +++ b/code/modules/mob/living/simple_animal/friendly/possum.dm @@ -9,7 +9,7 @@ emote_see = list("forages for trash", "lounges") pass_flags = PASS_FLAG_TABLE speak_chance = 0.5 - turns_per_move = 3 + turns_per_wander = 3 see_in_dark = 6 max_health = 50 response_harm = "stamps on" @@ -24,13 +24,13 @@ can_pull_size = ITEM_SIZE_SMALL can_pull_mobs = MOB_PULL_SMALLER holder_type = /obj/item/holder - ai = /datum/ai/opossum + ai = /datum/mob_controller/opossum var/is_angry = FALSE -/datum/ai/opossum +/datum/mob_controller/opossum expected_type = /mob/living/simple_animal/opossum -/datum/ai/opossum/do_process(time_elapsed) +/datum/mob_controller/opossum/do_process(time_elapsed) . = ..() if(!prob(1)) return diff --git a/code/modules/mob/living/simple_animal/friendly/tomato.dm b/code/modules/mob/living/simple_animal/friendly/tomato.dm index 8d6a2d42c95..46d75b329e8 100644 --- a/code/modules/mob/living/simple_animal/friendly/tomato.dm +++ b/code/modules/mob/living/simple_animal/friendly/tomato.dm @@ -3,7 +3,7 @@ desc = "It's a horrifyingly enormous beef tomato, and it's packing extra beef!" icon = 'icons/mob/simple_animal/tomato.dmi' speak_chance = 0 - turns_per_move = 5 + turns_per_wander = 5 max_health = 15 response_help_3p = "$USER$ pokes $TARGET$." response_help_1p = "You poke $TARGET$." diff --git a/code/modules/mob/living/simple_animal/hostile/antlion.dm b/code/modules/mob/living/simple_animal/hostile/antlion.dm index 5328aa7f82c..c68a07d86e5 100644 --- a/code/modules/mob/living/simple_animal/hostile/antlion.dm +++ b/code/modules/mob/living/simple_animal/hostile/antlion.dm @@ -73,7 +73,7 @@ heal_overall_damage(rand(heal_amount), rand(heal_amount)) /mob/living/simple_animal/hostile/antlion/proc/prep_burrow(var/new_bool) - stop_automated_movement = new_bool + stop_wandering = new_bool stop_automation = new_bool healing = new_bool diff --git a/code/modules/mob/living/simple_animal/hostile/bad_drone.dm b/code/modules/mob/living/simple_animal/hostile/bad_drone.dm index f4e8703919a..cd0db4b4492 100644 --- a/code/modules/mob/living/simple_animal/hostile/bad_drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/bad_drone.dm @@ -11,7 +11,6 @@ min_gas = null max_gas = null minbodytemp = 0 - speed = 4 mob_size = MOB_SIZE_TINY gene_damage = -1 attack_delay = DEFAULT_QUICK_COOLDOWN diff --git a/code/modules/mob/living/simple_animal/hostile/bat.dm b/code/modules/mob/living/simple_animal/hostile/bat.dm index c378abffc2e..a347b1f0c61 100644 --- a/code/modules/mob/living/simple_animal/hostile/bat.dm +++ b/code/modules/mob/living/simple_animal/hostile/bat.dm @@ -3,8 +3,7 @@ desc = "A swarm of cute little blood sucking bats - they look pretty upset." icon = 'icons/mob/simple_animal/bats.dmi' speak_chance = 0 - turns_per_move = 3 - speed = 4 + turns_per_wander = 3 max_health = 20 harm_intent_damage = 8 natural_weapon = /obj/item/natural_weapon/bite diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm index 82ab25346f1..d2003549d3d 100644 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ b/code/modules/mob/living/simple_animal/hostile/bear.dm @@ -8,10 +8,10 @@ emote_hear = list("rawrs","grumbles","grawls") emote_see = list("stares ferociously", "stomps") speak_chance = 0.5 - turns_per_move = 5 + turns_per_wander = 5 see_in_dark = 6 response_harm = "pokes" - stop_automated_movement_when_pulled = 0 + stop_wandering_when_pulled = FALSE max_health = 60 natural_weapon = /obj/item/natural_weapon/claws/strong can_escape = TRUE @@ -41,7 +41,7 @@ switch(stance) if(HOSTILE_STANCE_TIRED) - stop_automated_movement = 1 + stop_wandering = TRUE stance_step++ if(stance_step >= 10) //rests for 10 ticks if(target_mob && (target_mob in ListTargets(10))) @@ -50,7 +50,7 @@ stance = HOSTILE_STANCE_IDLE if(HOSTILE_STANCE_ALERT) - stop_automated_movement = 1 + stop_wandering = TRUE var/found_mob = 0 if(target_mob && (target_mob in ListTargets(10))) if(!(SA_attackable(target_mob))) @@ -76,7 +76,7 @@ custom_emote(1, "is worn out and needs to rest." ) stance = HOSTILE_STANCE_TIRED stance_step = 0 - walk(src, 0) //This stops the bear's walking + stop_automove() return diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index b01a3517ef2..b2a0e9e1825 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -3,13 +3,13 @@ desc = "A ferocious, fang-bearing creature that resembles a fish." icon = 'icons/mob/simple_animal/space_carp.dmi' speak_chance = 0 - turns_per_move = 3 - speed = 2 max_health = 50 + turns_per_wander = 3 harm_intent_damage = 8 natural_weapon = /obj/item/natural_weapon/bite pry_time = 10 SECONDS pry_desc = "biting" + base_movement_delay = 2 //Space carp aren't affected by atmos. min_gas = null @@ -22,6 +22,7 @@ butchery_data = /decl/butchery_data/animal/fish/space_carp var/carp_color = COLOR_PURPLE + /mob/living/simple_animal/hostile/carp/Initialize() . = ..() carp_randomify() diff --git a/code/modules/mob/living/simple_animal/hostile/commanded/commanded.dm b/code/modules/mob/living/simple_animal/hostile/commanded/commanded.dm index 87687c40fcf..86d6aad165e 100644 --- a/code/modules/mob/living/simple_animal/hostile/commanded/commanded.dm +++ b/code/modules/mob/living/simple_animal/hostile/commanded/commanded.dm @@ -3,7 +3,7 @@ stance = COMMANDED_STOP natural_weapon = /obj/item/natural_weapon density = FALSE - ai = /datum/ai/commanded + ai = /datum/mob_controller/commanded var/list/command_buffer = list() var/list/known_commands = list("stay", "stop", "attack", "follow") var/mob/master = null //undisputed master. Their commands hold ultimate sway and ultimate power. @@ -22,10 +22,10 @@ command_buffer.Add(lowertext(html_decode(message))) return 0 -/datum/ai/commanded +/datum/mob_controller/commanded expected_type = /mob/living/simple_animal/hostile/commanded -/datum/ai/commanded/do_process(time_elapsed) +/datum/mob_controller/commanded/do_process(time_elapsed) ..() var/mob/living/simple_animal/hostile/commanded/com = body while(com.command_buffer.len > 1) @@ -69,11 +69,12 @@ /mob/living/simple_animal/hostile/commanded/proc/follow_target() - stop_automated_movement = 1 + stop_wandering = TRUE if(!target_mob) return if(target_mob in ListTargets(10)) - walk_to(src,target_mob,1,move_to_delay) + set_moving_slowly() + start_automove(target_mob) /mob/living/simple_animal/hostile/commanded/proc/commanded_stop() //basically a proc that runs whenever we are asked to stay put. Probably going to remain unused. return @@ -123,7 +124,7 @@ /mob/living/simple_animal/hostile/commanded/proc/attack_command(var/mob/speaker,var/text) target_mob = null //want me to attack something? Well I better forget my old target. - walk_to(src,0) + stop_automove() stance = HOSTILE_STANCE_IDLE if(text == "attack" || findtext(text,"everyone") || findtext(text,"anybody") || findtext(text, "somebody") || findtext(text, "someone")) //if its just 'attack' then just attack anybody, same for if they say 'everyone', somebody, anybody. Assuming non-pickiness. allowed_targets = list("everyone")//everyone? EVERYONE @@ -136,16 +137,16 @@ /mob/living/simple_animal/hostile/commanded/proc/stay_command(var/mob/speaker,var/text) target_mob = null stance = COMMANDED_STOP - stop_automated_movement = 1 - walk_to(src,0) + stop_wandering = TRUE + stop_automove() return 1 /mob/living/simple_animal/hostile/commanded/proc/stop_command(var/mob/speaker,var/text) allowed_targets = list() - walk_to(src,0) + stop_automove() target_mob = null //gotta stop SOMETHIN stance = HOSTILE_STANCE_IDLE - stop_automated_movement = 0 + stop_wandering = FALSE return 1 /mob/living/simple_animal/hostile/commanded/proc/follow_command(var/mob/speaker,var/text) diff --git a/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm b/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm index edeaaf07e0a..c5fd7cf7bf7 100644 --- a/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm +++ b/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm @@ -14,7 +14,7 @@ response_help_3p = "$USER$ waves $USER_THEIR$ hand through $TARGET$." response_harm = "agitates" response_disarm = "fans at" - ai = /datum/ai/nanomachines + ai = /datum/mob_controller/nanomachines var/regen_time = 0 var/emergency_protocols = 0 @@ -25,10 +25,10 @@ force = 2 sharp = TRUE -/datum/ai/nanomachines +/datum/mob_controller/nanomachines expected_type = /mob/living/simple_animal/hostile/commanded/nanomachine -/datum/ai/nanomachines/do_process(time_elapsed) +/datum/mob_controller/nanomachines/do_process(time_elapsed) . = ..() var/mob/living/simple_animal/hostile/commanded/nanomachine/swarm = body switch(swarm.stance) @@ -63,7 +63,8 @@ /mob/living/simple_animal/hostile/commanded/nanomachine/proc/move_to_heal() if(!target_mob) return 0 - walk_to(src,target_mob,1,move_to_delay) + set_moving_quickly() + start_automove(target_mob) if(Adjacent(target_mob)) stance = COMMANDED_HEALING diff --git a/code/modules/mob/living/simple_animal/hostile/creature.dm b/code/modules/mob/living/simple_animal/hostile/creature.dm index c818a6512ab..83edfc003cf 100644 --- a/code/modules/mob/living/simple_animal/hostile/creature.dm +++ b/code/modules/mob/living/simple_animal/hostile/creature.dm @@ -6,5 +6,4 @@ max_health = 100 natural_weapon = /obj/item/natural_weapon/bite/strong faction = "creature" - speed = 4 supernatural = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/faithful_hound.dm b/code/modules/mob/living/simple_animal/hostile/faithful_hound.dm index 102b030899d..bbce86503bd 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithful_hound.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithful_hound.dm @@ -6,7 +6,7 @@ max_health = 100 natural_weapon = /obj/item/natural_weapon/bite/strong density = FALSE - stop_automated_movement = 1 + stop_wandering = TRUE wander = FALSE anchored = TRUE faction = "cute ghost dogs" diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm index b5f09072942..2dff73948a7 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithless.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm @@ -3,20 +3,16 @@ desc = "The Wish Granter's faith in humanity, incarnate" icon = 'icons/mob/simple_animal/faithless.dmi' speak_chance = 0 - turns_per_move = 5 + turns_per_wander = 5 response_help_1p = "You wave your hand through $TARGET$." response_help_3p = "$USER$ waves $USER_THEIR$ hand through $TARGET$." max_health = 80 gene_damage = -1 - harm_intent_damage = 10 natural_weapon = /obj/item/natural_weapon/faithless - min_gas = null max_gas = null minbodytemp = 0 - speed = 4 - faction = "faithless" supernatural = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 8547d0d94ad..43dde9826e5 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -12,7 +12,7 @@ emote_hear = list("chitters") emote_see = list("rubs its forelegs together", "wipes its fangs", "stops suddenly") speak_chance = 2.5 - turns_per_move = 5 + turns_per_wander = 5 see_in_dark = 10 response_harm = "pokes" max_health = 125 @@ -21,8 +21,10 @@ cold_damage_per_tick = 20 faction = "spiders" pass_flags = PASS_FLAG_TABLE - move_to_delay = 3 - speed = 1 + move_intents = list( + /decl/move_intent/walk/animal, + /decl/move_intent/run/animal + ) max_gas = list( /decl/material/gas/chlorine = 1, /decl/material/gas/carbon_dioxide = 5, @@ -35,7 +37,8 @@ base_animal_type = /mob/living/simple_animal/hostile/giant_spider butchery_data = /decl/butchery_data/animal/arthropod/giant_spider glowing_eyes = TRUE - ai = /datum/ai/giant_spider + ai = /datum/mob_controller/giant_spider + base_movement_delay = 1 var/poison_per_bite = 6 var/poison_type = /decl/material/liquid/venom @@ -60,10 +63,13 @@ max_health = 200 natural_weapon = /obj/item/natural_weapon/bite/strong poison_per_bite = 5 - speed = 2 - move_to_delay = 4 + move_intents = list( + /decl/move_intent/walk/animal_slow, + /decl/move_intent/run/animal_slow + ) break_stuff_probability = 15 pry_time = 6 SECONDS + base_movement_delay = 2 var/vengance var/berserking @@ -76,10 +82,10 @@ max_health = 80 harm_intent_damage = 6 //soft poison_per_bite = 5 - speed = 0 poison_type = /decl/material/liquid/sedatives break_stuff_probability = 10 pry_time = 9 SECONDS + base_movement_delay = 0 var/atom/cocoon_target var/fed = 0 @@ -100,8 +106,10 @@ max_health = 150 natural_weapon = /obj/item/natural_weapon/bite/strong poison_per_bite = 10 - speed = -1 - move_to_delay = 2 + move_intents = list( + /decl/move_intent/walk/animal_fast, + /decl/move_intent/run/animal_fast + ) break_stuff_probability = 30 hunt_chance = 25 can_escape = TRUE @@ -110,7 +118,7 @@ does_spin = FALSE available_maneuvers = list(/decl/maneuver/leap/spider) ability_cooldown = 3 MINUTES - + base_movement_delay = 0 var/leap_range = 5 //spitters - fast, comparatively weak, very venomous; projectile attacks but will resort to melee once out of ammo @@ -120,7 +128,10 @@ max_health = 90 poison_per_bite = 15 ranged = TRUE - move_to_delay = 2 + move_intents = list( + /decl/move_intent/walk/animal_fast, + /decl/move_intent/run/animal_fast + ) projectiletype = /obj/item/projectile/venom projectilesound = 'sound/effects/hypospray.ogg' fire_desc = "spits venom" @@ -164,21 +175,22 @@ if(prob(poison_per_bite)) to_chat(L, "You feel a tiny prick.") -/datum/ai/giant_spider +/datum/mob_controller/giant_spider expected_type = /mob/living/simple_animal/hostile/giant_spider -/datum/ai/giant_spider/do_process() +/datum/mob_controller/giant_spider/do_process() var/mob/living/simple_animal/hostile/giant_spider/spooder = body if(spooder.stance == HOSTILE_STANCE_IDLE) //chance to skitter madly away if(!spooder.busy && prob(spooder.hunt_chance)) - spooder.stop_automated_movement = 1 - walk_to(spooder, pick(orange(20, spooder)), 1, spooder.move_to_delay) - addtimer(CALLBACK(spooder, TYPE_PROC_REF(/mob/living/simple_animal/hostile/giant_spider, disable_stop_automated_movement)), 5 SECONDS) - -/mob/living/simple_animal/hostile/giant_spider/proc/disable_stop_automated_movement() - stop_automated_movement = 0 - walk(src,0) + spooder.stop_wandering = TRUE + spooder.set_moving_quickly() + spooder.start_automove(pick(orange(20, spooder))) + addtimer(CALLBACK(spooder, TYPE_PROC_REF(/mob/living/simple_animal/hostile/giant_spider, disable_stop_automove)), 5 SECONDS) + +/mob/living/simple_animal/hostile/giant_spider/proc/disable_stop_automove() + stop_wandering = FALSE + stop_automove() kick_stance() /mob/living/simple_animal/hostile/giant_spider/proc/divorce() @@ -188,12 +200,12 @@ Guard caste procs ****************/ /mob/living/simple_animal/hostile/giant_spider/guard - ai = /datum/ai/giant_spider/guard + ai = /datum/mob_controller/giant_spider/guard -/datum/ai/giant_spider/guard +/datum/mob_controller/giant_spider/guard expected_type = /mob/living/simple_animal/hostile/giant_spider/guard -/datum/ai/giant_spider/guard/do_process(time_elapsed) +/datum/mob_controller/giant_spider/guard/do_process(time_elapsed) . = ..() var/mob/living/simple_animal/hostile/giant_spider/guard/spooder = body if(spooder.berserking) @@ -227,16 +239,17 @@ Guard caste procs return 1 /mob/living/simple_animal/hostile/giant_spider/guard/proc/protect(mob/nurse) - stop_automated_movement = 1 - walk_to(src, nurse, 2, move_to_delay) - addtimer(CALLBACK(src, TYPE_PROC_REF(/mob/living/simple_animal/hostile/giant_spider, disable_stop_automated_movement)), 5 SECONDS) + stop_wandering = TRUE + var/static/datum/automove_metadata/_spider_guard_metadata = new(_acceptable_distance = 2) + start_automove(nurse, metadata = _spider_guard_metadata) + addtimer(CALLBACK(src, TYPE_PROC_REF(/mob/living/simple_animal/hostile/giant_spider, disable_stop_automove)), 5 SECONDS) /mob/living/simple_animal/hostile/giant_spider/guard/proc/go_berserk() audible_message("\The [src] chitters wildly!") var/obj/item/attacking_with = get_natural_weapon() if(attacking_with) attacking_with.force = initial(attacking_with.force) + 5 - move_to_delay-- + set_moving_quickly() break_stuff_probability = 45 addtimer(CALLBACK(src, PROC_REF(calm_down)), 3 MINUTES) @@ -246,7 +259,7 @@ Guard caste procs var/obj/item/attacking_with = get_natural_weapon() if(attacking_with) attacking_with.force = initial(attacking_with.force) - move_to_delay++ + set_moving_slowly() break_stuff_probability = 10 /**************** @@ -290,20 +303,20 @@ Nurse caste procs if(cocoon_target == C && get_dist(src,cocoon_target) > 1) cocoon_target = null busy = 0 - stop_automated_movement = 0 + stop_wandering = FALSE /mob/living/simple_animal/hostile/giant_spider/nurse - ai = /datum/ai/giant_spider/nurse + ai = /datum/mob_controller/giant_spider/nurse -/datum/ai/giant_spider/nurse +/datum/mob_controller/giant_spider/nurse expected_type = /mob/living/simple_animal/hostile/giant_spider/nurse -/datum/ai/giant_spider/nurse/do_process(time_elapsed) +/datum/mob_controller/giant_spider/nurse/do_process(time_elapsed) . = ..() var/mob/living/simple_animal/hostile/giant_spider/nurse/spooder = body if(spooder.stance != HOSTILE_STANCE_IDLE) spooder.busy = 0 - spooder.stop_automated_movement = 0 + spooder.stop_wandering = FALSE return var/list/can_see = view(spooder, 10) @@ -316,7 +329,7 @@ Nurse caste procs if(web_target.stat) spooder.cocoon_target = web_target spooder.busy = MOVING_TO_TARGET - walk_to(spooder, web_target, 1, spooder.move_to_delay) + spooder.start_automove(web_target) //give up if we can't reach them after 10 seconds spooder.GiveUp(web_target) return @@ -326,19 +339,19 @@ Nurse caste procs if(!W) spooder.busy = SPINNING_WEB spooder.visible_message(SPAN_NOTICE("\The [spooder] begins to secrete a sticky substance.")) - spooder.stop_automated_movement = 1 + spooder.stop_wandering = TRUE spawn(4 SECONDS) if(spooder.busy == SPINNING_WEB) new /obj/effect/spider/stickyweb(spooder.loc) spooder.busy = 0 - spooder.stop_automated_movement = 0 + spooder.stop_wandering = FALSE else //third, lay an egg cluster there var/obj/effect/spider/eggcluster/E = locate() in get_turf(spooder) if(!E && spooder.fed > 0 && spooder.max_eggs) spooder.busy = LAYING_EGGS spooder.visible_message(SPAN_NOTICE("\The [spooder] begins to lay a cluster of eggs.")) - spooder.stop_automated_movement = 1 + spooder.stop_wandering = TRUE spawn(5 SECONDS) if(spooder.busy == LAYING_EGGS) E = locate() in get_turf(spooder) @@ -347,7 +360,7 @@ Nurse caste procs spooder.max_eggs-- spooder.fed-- spooder.busy = 0 - spooder.stop_automated_movement = 0 + spooder.stop_wandering = FALSE else //fourthly, cocoon any nearby items so those pesky pinkskins can't use them for(var/obj/O in can_see) @@ -361,8 +374,8 @@ Nurse caste procs if(istype(O, /obj/item) || istype(O, /obj/structure) || istype(O, /obj/machinery)) spooder.cocoon_target = O spooder.busy = MOVING_TO_TARGET - spooder.stop_automated_movement = 1 - walk_to(spooder, O, 1, spooder.move_to_delay) + spooder.stop_wandering = TRUE + spooder.start_automove(O) //give up if we can't reach them after 10 seconds spooder.GiveUp(O) @@ -370,8 +383,8 @@ Nurse caste procs if(spooder.Adjacent(spooder.cocoon_target)) spooder.busy = SPINNING_COCOON spooder.visible_message(SPAN_NOTICE("\The [spooder] begins to secrete a sticky substance around \the [spooder.cocoon_target].")) - spooder.stop_automated_movement = 1 - walk(spooder,0) + spooder.stop_wandering = TRUE + spooder.stop_automove() spawn(5 SECONDS) if(spooder.busy == SPINNING_COCOON) if(spooder.cocoon_target && isturf(spooder.cocoon_target.loc) && get_dist(spooder, spooder.cocoon_target) <= 1) @@ -399,7 +412,7 @@ Nurse caste procs if(large_cocoon) C.icon_state = pick("cocoon_large1","cocoon_large2","cocoon_large3") spooder.busy = 0 - spooder.stop_automated_movement = 0 + spooder.stop_wandering = FALSE /***************** Hunter caste procs @@ -415,7 +428,7 @@ Hunter caste procs /mob/living/simple_animal/hostile/giant_spider/hunter/perform_maneuver(var/maneuver, var/atom/target) if(!isliving(target) || get_dist(src, target) <= 3) return FALSE - walk(src,0) + stop_automove() var/first_stop_automation if(stop_automation) first_stop_automation = stop_automation diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index 9572adf81c7..f10abe8a1c4 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -10,7 +10,6 @@ min_gas = null max_gas = null minbodytemp = 0 - speed = 4 natural_armor = list( ARMOR_MELEE = ARMOR_MELEE_KNIVES ) @@ -25,7 +24,7 @@ /mob/living/simple_animal/hostile/hivebot/range desc = "A junky looking robot with four spiky legs. It's equipped with some kind of small-bore gun." ranged = 1 - speed = 7 + base_movement_delay = 7 /mob/living/simple_animal/hostile/hivebot/rapid ranged = 1 @@ -83,7 +82,6 @@ The megabot icon = 'icons/mob/simple_animal/megabot.dmi' max_health = 440 natural_weapon = /obj/item/natural_weapon/circular_saw - speed = 0 natural_armor = list( ARMOR_MELEE = ARMOR_MELEE_RESISTANT, ARMOR_BULLET = ARMOR_BALLISTIC_PISTOL @@ -94,6 +92,7 @@ The megabot pixel_x = -32 default_pixel_x = -32 + base_movement_delay = 0 var/attack_mode = ATTACK_MODE_MELEE var/num_shots diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index c224ef528fd..5b834046448 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -1,11 +1,15 @@ /mob/living/simple_animal/hostile faction = "hostile" - stop_automated_movement_when_pulled = 0 + stop_wandering_when_pulled = FALSE a_intent = I_HURT response_help_3p = "$USER$ pokes $TARGET$." response_help_1p = "You poke $TARGET$." response_disarm = "shoves" response_harm = "strikes" + move_intents = list( + /decl/move_intent/walk/animal_slow, + /decl/move_intent/run/animal_slow + ) var/stance = HOSTILE_STANCE_IDLE //Used to determine behavior var/mob/living/target_mob @@ -17,7 +21,6 @@ var/casingtype var/fire_desc = "fires" //"X fire_desc at Y!" var/ranged_range = 6 //tiles of range for ranged attackers to attack - var/move_to_delay = 4 //delay for the automated movement. var/list/friends = list() var/break_stuff_probability = 10 @@ -58,7 +61,7 @@ return null if(!faction) //No faction, no reason to attack anybody. return null - stop_automated_movement = 0 + stop_wandering = FALSE for(var/atom/A in ListTargets(10)) var/atom/F = Found(A) if(F) @@ -100,9 +103,10 @@ if(!can_act()) return if(HAS_STATUS(src, STAT_CONFUSE)) - walk_to(src, pick(orange(2, src)), 1, move_to_delay) + set_moving_slowly() + start_automove(pick(orange(2, src))) return - stop_automated_movement = 1 + stop_wandering = TRUE if(QDELETED(target_mob) || SA_attackable(target_mob)) stance = HOSTILE_STANCE_IDLE if(target_mob in ListTargets(10)) @@ -111,13 +115,15 @@ if(!move_only) OpenFire(target_mob) else - walk_to(src, target_mob, 1, move_to_delay) + set_moving_quickly() + start_automove(target_mob) else stance = HOSTILE_STANCE_ATTACKING - walk_to(src, target_mob, 1, move_to_delay) + set_moving_quickly() + start_automove(target_mob) /mob/living/simple_animal/hostile/proc/handle_attacking_target() - stop_automated_movement = 1 + stop_wandering = TRUE if(!target_mob || SA_attackable(target_mob)) LoseTarget() return 0 @@ -138,11 +144,11 @@ /mob/living/simple_animal/hostile/proc/LoseTarget() stance = HOSTILE_STANCE_IDLE target_mob = null - walk(src, 0) + stop_automove() /mob/living/simple_animal/hostile/proc/LostTarget() stance = HOSTILE_STANCE_IDLE - walk(src, 0) + stop_automove() /mob/living/simple_animal/hostile/proc/ListTargets(var/dist = 7) return hearers(src, dist)-src @@ -150,12 +156,12 @@ /mob/living/simple_animal/hostile/handle_regular_status_updates() . = ..() if(!.) - walk(src, 0) + stop_automove() /mob/living/simple_animal/hostile/do_delayed_life_action() ..() if(!can_act()) - walk(src, 0) + stop_automove() kick_stance() return 0 @@ -180,7 +186,7 @@ else if(stance != HOSTILE_STANCE_INSIDE) stance = HOSTILE_STANCE_INSIDE - walk(src,0) + stop_automove() target_mob = null /mob/living/simple_animal/hostile/attackby(var/obj/item/O, var/mob/user) @@ -238,11 +244,11 @@ return TRUE /mob/living/simple_animal/hostile/proc/DestroySurroundings() //courtesy of Lohikar - if(!can_act()) + if(!can_act() || !target_mob) return if(prob(break_stuff_probability) && !Adjacent(target_mob)) face_atom(target_mob) - var/turf/targ = get_step_towards(src, target_mob) + var/turf/targ = get_step_resolving_mimic(get_turf(src), get_dir(src, target_mob)) if(!targ) return diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index efa10e0d964..54f2486779d 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -25,17 +25,17 @@ var/global/list/protected_objects = list( color = COLOR_STEEL icon_state = "crate" butchery_data = null - speed = 4 max_health = 100 harm_intent_damage = 5 natural_weapon = /obj/item/natural_weapon/bite min_gas = null max_gas = null minbodytemp = 0 - faction = "mimic" - move_to_delay = 8 - + move_intents = list( + /decl/move_intent/walk/animal_very_slow, + /decl/move_intent/run/animal_very_slow + ) var/weakref/copy_of var/weakref/creator // the creator var/destroy_objects = 0 @@ -85,7 +85,29 @@ var/global/list/protected_objects = list( var/obj/item/I = O current_health = 15 * I.w_class attacking_with.force = 2 + initial(I.force) - move_to_delay = 2 * I.w_class + + if(I.w_class <= ITEM_SIZE_SMALL) + move_intents = list( + /decl/move_intent/walk/animal_fast, + /decl/move_intent/run/animal_fast + ) + else if(I.w_class <= ITEM_SIZE_NO_CONTAINER) + move_intents = list( + /decl/move_intent/walk/animal, + /decl/move_intent/run/animal + ) + else if(I.w_class <= ITEM_SIZE_STRUCTURE) + move_intents = list( + /decl/move_intent/walk/animal_slow, + /decl/move_intent/run/animal_slow + ) + else + move_intents = list( + /decl/move_intent/walk/animal_very_slow, + /decl/move_intent/run/animal_very_slow + ) + move_intent = GET_DECL(move_intents[1]) + set_max_health(current_health) if(creator) @@ -136,7 +158,7 @@ var/global/list/protected_objects = list( /mob/living/simple_animal/hostile/mimic/sleeping wander = FALSE - stop_automated_movement = 1 + stop_wandering = TRUE var/awake = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/pike.dm b/code/modules/mob/living/simple_animal/hostile/pike.dm index c943da673d0..b53847b7527 100644 --- a/code/modules/mob/living/simple_animal/hostile/pike.dm +++ b/code/modules/mob/living/simple_animal/hostile/pike.dm @@ -2,10 +2,13 @@ name = "space pike" desc = "A bigger, angrier cousin of the space carp." icon = 'icons/mob/simple_animal/spaceshark.dmi' - turns_per_move = 2 - move_to_delay = 2 + turns_per_wander = 2 + move_intents = list( + /decl/move_intent/walk/animal_fast, + /decl/move_intent/run/animal_fast + ) + base_movement_delay = 1 attack_same = 1 - speed = 1 mob_size = MOB_SIZE_LARGE offset_overhead_text_x = 16 pixel_x = -16 diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm index 37311dbe032..1d9fe7cac67 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm @@ -2,14 +2,13 @@ name = "clown" desc = "A denizen of clown planet" icon = 'icons/mob/simple_animal/clown.dmi' - turns_per_move = 5 + turns_per_wander = 5 emote_speech = list("HONK", "Honk!", "Welcome to clown planet!") emote_see = list("honks") speak_chance = 0.5 a_intent = I_HURT - stop_automated_movement_when_pulled = 0 + stop_wandering_when_pulled = FALSE max_health = 75 - speed = -1 harm_intent_damage = 8 can_escape = TRUE minbodytemp = 270 @@ -19,6 +18,7 @@ unsuitable_atmos_damage = 10 natural_weapon = /obj/item/natural_weapon/clown faction = "circus" + base_movement_delay = -1 /obj/item/natural_weapon/clown name = "bike horn" diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm index 480645b38c1..7f1994a5e10 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm @@ -7,20 +7,23 @@ ranged = 1 rapid = 0 speak_chance = 2.5 - turns_per_move = 3 + turns_per_wander = 3 emote_speech = list("ALERT.","Hostile-ile-ile entities dee-twhoooo-wected.","Threat parameterszzzz- szzet.","Bring sub-sub-sub-systems uuuup to combat alert alpha-a-a.") emote_see = list("beeps menacingly","whirrs threateningly","scans its immediate vicinity") a_intent = I_HURT - stop_automated_movement_when_pulled = 0 + stop_wandering_when_pulled = FALSE max_health = 300 - speed = 8 - move_to_delay = 6 + move_intents = list( + /decl/move_intent/walk/animal_slow, + /decl/move_intent/run/animal_slow + ) projectiletype = /obj/item/projectile/beam/drone projectilesound = 'sound/weapons/laser3.ogg' destroy_surroundings = 0 gene_damage = -1 butchery_data = /decl/butchery_data/synthetic bleed_colour = SYNTH_BLOOD_COLOR + base_movement_delay = 8 var/datum/effect/effect/system/trail/ion_trail @@ -131,7 +134,7 @@ else src.visible_message("[html_icon(src)] [src] suddenly lies still and quiet.") disabled = rand(150, 600) - walk(src,0) + stop_automove() if(exploding && prob(20)) if(prob(50)) @@ -144,7 +147,7 @@ exploding = 1 set_stat(UNCONSCIOUS) wander = TRUE - walk(src,0) + stop_automove() spawn(rand(50,150)) if(!disabled && exploding) explosion(get_turf(src), 0, 1, 4, 7) @@ -168,7 +171,7 @@ take_damage(rand(3,15) * (severity + 1), BURN) disabled = rand(150, 600) hostile_drone = 0 - walk(src,0) + stop_automove() /mob/living/simple_animal/hostile/retaliate/malf_drone/get_death_message(gibbed) return "suddenly breaks apart." diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/exoplanet.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/exoplanet.dm index 0e19309d1f3..92b92b0f5e2 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/exoplanet.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/exoplanet.dm @@ -1,6 +1,6 @@ /mob/living/simple_animal/hostile/retaliate/beast - ai = /datum/ai/beast + ai = /datum/mob_controller/beast nutrition = 300 var/list/prey @@ -24,10 +24,10 @@ if(!attack_same && L.faction != faction) LAZYDISTINCTADD(prey, weakref(L)) -/datum/ai/beast +/datum/mob_controller/beast expected_type = /mob/living/simple_animal/hostile/retaliate/beast -/datum/ai/beast/do_process(time_elapsed) +/datum/mob_controller/beast/do_process(time_elapsed) var/mob/living/simple_animal/hostile/retaliate/beast/beast = body var/nut = beast.get_nutrition() var/max_nut = beast.get_max_nutrition() @@ -78,9 +78,11 @@ desc = "A fast, armoured predator accustomed to hiding and ambushing in cold terrain." faction = "samak" icon = 'icons/mob/simple_animal/samak.dmi' - move_to_delay = 2 + move_intents = list( + /decl/move_intent/walk/animal_fast, + /decl/move_intent/run/animal_fast + ) max_health = 125 - speed = 2 natural_weapon = /obj/item/natural_weapon/claws cold_damage_per_tick = 0 speak_chance = 2.5 @@ -90,6 +92,7 @@ natural_armor = list( ARMOR_MELEE = ARMOR_MELEE_KNIVES ) + base_movement_delay = 2 /mob/living/simple_animal/hostile/retaliate/beast/samak/alt desc = "A fast, armoured predator accustomed to hiding and ambushing." @@ -100,9 +103,11 @@ desc = "A small pack animal. Although omnivorous, it will hunt meat on occasion." faction = "diyaab" icon = 'icons/mob/simple_animal/diyaab.dmi' - move_to_delay = 3 + move_intents = list( + /decl/move_intent/walk/animal, + /decl/move_intent/run/animal + ) max_health = 25 - speed = 1 natural_weapon = /obj/item/natural_weapon/claws/weak cold_damage_per_tick = 0 speak_chance = 2.5 @@ -110,15 +115,18 @@ emote_see = list("sniffs the air cautiously","looks around") emote_hear = list("snuffles") mob_size = MOB_SIZE_SMALL + base_movement_delay = 1 /mob/living/simple_animal/hostile/retaliate/beast/shantak name = "shantak" desc = "A piglike creature with a bright iridiscent mane that sparkles as though lit by an inner light. Don't be fooled by its beauty though." faction = "shantak" icon = 'icons/mob/simple_animal/shantak.dmi' - move_to_delay = 3 + move_intents = list( + /decl/move_intent/walk/animal, + /decl/move_intent/run/animal + ) max_health = 75 - speed = 1 natural_weapon = /obj/item/natural_weapon/claws cold_damage_per_tick = 0 speak_chance = 1 @@ -155,15 +163,18 @@ desc = "It looks like a crustacean with an exceedingly hard carapace. Watch the pinchers!" faction = "crab" icon = 'icons/mob/simple_animal/royalcrab.dmi' - move_to_delay = 3 + move_intents = list( + /decl/move_intent/walk/animal, + /decl/move_intent/run/animal + ) max_health = 150 - speed = 1 natural_weapon = /obj/item/natural_weapon/pincers speak_chance = 0.5 emote_see = list("skitters","oozes liquid from its mouth", "scratches at the ground", "clicks its claws") natural_armor = list( ARMOR_MELEE = ARMOR_MELEE_RESISTANT ) + base_movement_delay = 1 /mob/living/simple_animal/hostile/retaliate/beast/charbaby name = "charbaby" @@ -172,14 +183,14 @@ mob_size = MOB_SIZE_LARGE max_health = 45 natural_weapon = /obj/item/natural_weapon/charbaby - speed = 2 return_damage_min = 2 return_damage_max = 3 harm_intent_damage = 1 blood_color = COLOR_NT_RED natural_armor = list( ARMOR_LASER = ARMOR_LASER_HANDGUNS - ) + ) + base_movement_delay = 2 /obj/item/natural_weapon/charbaby name = "scalding hide" diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/giant_crab.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_crab.dm index 8f610870094..613be5056b9 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/giant_crab.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_crab.dm @@ -7,7 +7,7 @@ emote_hear = list("clicks") emote_see = list("clacks") speak_chance = 0.5 - turns_per_move = 5 + turns_per_wander = 5 butchery_data = /decl/butchery_data/animal/arthropod/crab/giant can_escape = TRUE //snip snip break_stuff_probability = 15 @@ -23,7 +23,7 @@ ARMOR_BULLET = ARMOR_BALLISTIC_PISTOL ) ability_cooldown = 2 MINUTES - ai = /datum/ai/giant_crab + ai = /datum/mob_controller/giant_crab var/mob/living/human/victim //the human we're grabbing var/grab_duration = 3 //duration of disable in life ticks to simulate a grab @@ -31,10 +31,10 @@ var/list/grab_desc = list("thrashes", "squeezes", "crushes") var/continue_grab_prob = 35 //probability that a successful grab will be extended by one life tick -/datum/ai/giant_crab +/datum/mob_controller/giant_crab expected_type = /mob/living/simple_animal/hostile/retaliate/giant_crab -/datum/ai/giant_crab/do_process(time_elapsed) +/datum/mob_controller/giant_crab/do_process(time_elapsed) . = ..() var/mob/living/simple_animal/hostile/retaliate/giant_crab/crab = body if((crab.current_health > crab.get_max_health() / 1.5) && length(crab.enemies) && prob(10)) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/jelly.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/jelly.dm index 75c78bb3d30..70342ca411d 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/jelly.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/jelly.dm @@ -3,12 +3,15 @@ desc = "It looks like a floating jellyfish. How does it do that?" faction = "zeq" icon = 'icons/mob/simple_animal/jelly.dmi' - move_to_delay = 2 + move_intents = list( + /decl/move_intent/walk/animal_fast, + /decl/move_intent/run/animal_fast + ) max_health = 75 - speed = 1 natural_weapon = /obj/item/natural_weapon/tentacles speak_chance = 0.5 emote_see = list("wobbles slightly","oozes something out of tentacles' ends") + base_movement_delay = 1 var/gets_random_color = TRUE /obj/item/natural_weapon/tentacles diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm index e18e9eb4479..d18d66c3342 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm @@ -16,7 +16,10 @@ mob_size = MOB_SIZE_LARGE mob_bump_flag = HEAVY can_escape = TRUE - move_to_delay = 3 + move_intents = list( + /decl/move_intent/walk/animal, + /decl/move_intent/run/animal + ) min_gas = null max_gas = null minbodytemp = 0 @@ -105,7 +108,10 @@ icon = 'icons/mob/simple_animal/goat_master.dmi' max_health = 200 natural_weapon = /obj/item/natural_weapon/goathorns - move_to_delay = 3 + move_intents = list( + /decl/move_intent/walk/animal, + /decl/move_intent/run/animal + ) /mob/living/simple_animal/hostile/retaliate/goat/king/Retaliate() ..() @@ -116,12 +122,7 @@ set waitfor = FALSE ..() if(spellscast < 5) - if(prob(5) && move_to_delay != 1) //speed buff - spellscast++ - visible_message(SPAN_MFAUNA("\The [src] shimmers and seems to phase in and out of reality itself!")) - move_to_delay = 1 - - else if(prob(5)) //stun move + if(prob(5)) //stun move spellscast++ visible_message(SPAN_MFAUNA("\The [src]' fleece flashes with blinding light!")) new /obj/item/grenade/flashbang/instant(src.loc) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm index 9244b554388..4a9ed00e327 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm @@ -37,16 +37,15 @@ emote_see = list("flutters its wings") natural_weapon = /obj/item/natural_weapon/beak speak_chance = 1 // 1% (1 in 100) chance every tick; So about once per 150 seconds, assuming an average tick is 1.5s - turns_per_move = 5 + turns_per_wander = 5 response_harm = "swats" - stop_automated_movement = 1 + stop_wandering = TRUE universal_speak = TRUE butchery_data = /decl/butchery_data/animal/bird/parrot var/parrot_state = PARROT_WANDER // Hunt for a perch when created var/parrot_sleep_max = 25 // The time the parrot sits while perched before looking around. Mosly a way to avoid the parrot's AI in life() being run every single tick. var/parrot_sleep_dur = 25 // Same as above, this is the var that physically counts down - var/parrot_speed = 5 // Movement delay in ticks. Higher number = slower. var/parrot_been_shot = 0 // Parrots get a speed bonus after being shot. This will deincrement every Life() and at 0 the parrot will return to regular speed. //The thing the parrot is currently interested in. This gets used for items the parrot wants to pick up, mobs it wants to steal from, //mobs it wants to attack or mobs that have attacked it @@ -198,7 +197,7 @@ //-----WANDERING - This is basically a 'I dont know what to do yet' state else if(parrot_state == PARROT_WANDER) //Stop movement, we'll set it later - walk(src, 0) + stop_automove() parrot_interest = null //Wander around aimlessly. This will help keep the loops from searches down @@ -236,7 +235,7 @@ return //-----STEALING else if(parrot_state == (PARROT_SWOOP | PARROT_STEAL)) - walk(src,0) + stop_automove() if(!parrot_interest || held_item) parrot_state = PARROT_SWOOP | PARROT_RETURN return @@ -260,12 +259,13 @@ parrot_state = PARROT_SWOOP | PARROT_RETURN return - walk_to(src, parrot_interest, 1, parrot_speed) + set_moving_slowly() + start_automove(parrot_interest) return //-----RETURNING TO PERCH else if(parrot_state == (PARROT_SWOOP | PARROT_RETURN)) - walk(src, 0) + stop_automove() if(!parrot_perch || !isturf(parrot_perch.loc)) //Make sure the perch exists and somehow isnt inside of something else. parrot_perch = null parrot_state = PARROT_WANDER @@ -278,17 +278,24 @@ update_icon() return - walk_to(src, parrot_perch, 1, parrot_speed) + set_moving_slowly() + start_automove(parrot_perch) return //-----FLEEING else if(parrot_state == (PARROT_SWOOP | PARROT_FLEE)) - walk(src,0) + stop_automove() give_up() if(!parrot_interest || !isliving(parrot_interest)) //Sanity parrot_state = PARROT_WANDER - walk_away(src, parrot_interest, 1, parrot_speed-parrot_been_shot) + var/static/datum/automove_metadata/_parrot_flee_automove_metadata = new( + _move_delay = 2, + _acceptable_distance = 7, + _avoid_target = TRUE + ) + set_moving_quickly() + start_automove(parrot_interest, metadata = _parrot_flee_automove_metadata) parrot_been_shot-- return @@ -325,12 +332,13 @@ //Otherwise, fly towards the mob! else - walk_to(src, parrot_interest, 1, parrot_speed) + set_moving_quickly() + start_automove(parrot_interest) return //-----STATE MISHAP else //This should not happen. If it does lets reset everything and try again - walk(src,0) + stop_automove() parrot_interest = null parrot_perch = null drop_held_item() diff --git a/code/modules/mob/living/simple_animal/hostile/slug.dm b/code/modules/mob/living/simple_animal/hostile/slug.dm index e4f6eafafb5..ac4e93dd497 100644 --- a/code/modules/mob/living/simple_animal/hostile/slug.dm +++ b/code/modules/mob/living/simple_animal/hostile/slug.dm @@ -6,8 +6,10 @@ response_harm = "stomps on" destroy_surroundings = 0 max_health = 15 - speed = 0 - move_to_delay = 0 + move_intents = list( + /decl/move_intent/walk/animal_fast, + /decl/move_intent/run/animal_fast + ) density = TRUE min_gas = null mob_size = MOB_SIZE_MINISCULE @@ -16,6 +18,7 @@ natural_weapon = /obj/item/natural_weapon/bite holder_type = /obj/item/holder/slug faction = "Hostile Fauna" + base_movement_delay = 0 /mob/living/simple_animal/hostile/slug/proc/check_friendly_species(var/mob/living/M) return istype(M) && M.faction == faction diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index 57c18b2f3b6..ecddb081881 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -3,13 +3,13 @@ desc = "A pissed off tree-like alien. It seems annoyed with the festivities..." icon = 'icons/mob/simple_animal/pinetree.dmi' speak_chance = 0 - turns_per_move = 5 + turns_per_wander = 5 butchery_data = null - speed = -1 max_health = 250 pixel_x = -16 harm_intent_damage = 5 natural_weapon = /obj/item/natural_weapon/bite + base_movement_delay = -1 //Space carp aren't affected by atmos. min_gas = null diff --git a/code/modules/mob/living/simple_animal/hostile/vagrant.dm b/code/modules/mob/living/simple_animal/hostile/vagrant.dm index 50fb0091f5d..bbff171e105 100644 --- a/code/modules/mob/living/simple_animal/hostile/vagrant.dm +++ b/code/modules/mob/living/simple_animal/hostile/vagrant.dm @@ -4,10 +4,12 @@ desc = "You get the feeling you should run." icon = 'icons/mob/simple_animal/vagrant.dmi' max_health = 60 - speed = 5 speak_chance = 0 - turns_per_move = 4 - move_to_delay = 4 + turns_per_wander = 4 + move_intents = list( + /decl/move_intent/walk/animal_fast, + /decl/move_intent/run/animal_fast + ) break_stuff_probability = 0 faction = "vagrant" harm_intent_damage = 3 @@ -20,6 +22,7 @@ pass_flags = PASS_FLAG_TABLE bleed_colour = "#aad9de" nutrition = 100 + base_movement_delay = 5 var/cloaked = 0 var/mob/living/human/gripping = null @@ -34,7 +37,7 @@ . = ..() if(isliving(Proj.firer) && (target_mob != Proj.firer) && current_health < oldhealth && !incapacitated(INCAPACITATION_KNOCKOUT)) //Respond to being shot at target_mob = Proj.firer - turns_per_move = 3 + turns_per_wander = 3 MoveToTarget() /mob/living/simple_animal/hostile/vagrant/death(gibbed) @@ -60,8 +63,8 @@ else gripping = null - if(turns_per_move != initial(turns_per_move)) - turns_per_move = initial(turns_per_move) + if(turns_per_wander != initial(turns_per_wander)) + turns_per_wander = initial(turns_per_wander) if(stance == HOSTILE_STANCE_IDLE && !cloaked) cloaked = 1 @@ -79,12 +82,12 @@ alpha = 75 set_light(0) icon_state = initial(icon_state) - move_to_delay = initial(move_to_delay) + set_moving_slowly() else //It's fight time alpha = 255 icon_state += "-glowing" set_light(3, 0.2) - move_to_delay = 2 + set_moving_quickly() /mob/living/simple_animal/hostile/vagrant/attack_target(mob/target) . = ..() diff --git a/code/modules/mob/living/simple_animal/passive/_passive.dm b/code/modules/mob/living/simple_animal/passive/_passive.dm index 6cc2e8245ad..c9d3cb99c48 100644 --- a/code/modules/mob/living/simple_animal/passive/_passive.dm +++ b/code/modules/mob/living/simple_animal/passive/_passive.dm @@ -1,28 +1,35 @@ -/datum/ai/passive +var/global/datum/automove_metadata/_flee_automove_metadata = new( + _move_delay = 2, + _acceptable_distance = 7, + _avoid_target = TRUE +) + +/datum/mob_controller/passive expected_type = /mob/living/simple_animal var/weakref/flee_target var/turns_since_scan -/datum/ai/passive/proc/update_targets() +/datum/mob_controller/passive/proc/update_targets() //see if we should stop fleeing var/mob/living/simple_animal/critter = body var/atom/flee_target_atom = flee_target?.resolve() if(istype(flee_target_atom) && (flee_target_atom.loc in view(body))) - if(body.MayMove()) - walk_away(body, flee_target_atom, 7, 2) - critter.stop_automated_movement = TRUE + critter.set_moving_quickly() + critter.start_automove(flee_target_atom, metadata = global._flee_automove_metadata) + critter.stop_wandering = TRUE else flee_target = null - critter.stop_automated_movement = FALSE + critter.set_moving_slowly() + critter.stop_wandering = FALSE return !isnull(flee_target) -/datum/ai/passive/do_process(time_elapsed) +/datum/mob_controller/passive/do_process(time_elapsed) ..() // Handle fleeing from aggressors. turns_since_scan++ if (turns_since_scan > 5) - walk_to(body, 0) + body.stop_automove() turns_since_scan = 0 if(update_targets()) return @@ -37,7 +44,7 @@ body.set_stat(CONSCIOUS) critter.wander = TRUE -/datum/ai/passive/proc/set_flee_target(atom/A) +/datum/mob_controller/passive/proc/set_flee_target(atom/A) if(A) flee_target = weakref(A) turns_since_scan = 5 @@ -45,9 +52,9 @@ /mob/living/simple_animal/passive possession_candidate = TRUE abstract_type = /mob/living/simple_animal/passive - ai = /datum/ai/passive + ai = /datum/mob_controller/passive speak_chance = 0.5 - turns_per_move = 5 + turns_per_wander = 5 see_in_dark = 6 minbodytemp = 223 maxbodytemp = 323 @@ -55,31 +62,31 @@ /mob/living/simple_animal/passive/attackby(var/obj/item/O, var/mob/user) . = ..() if(O.force) - var/datum/ai/passive/preyi = ai + var/datum/mob_controller/passive/preyi = ai if(istype(preyi)) preyi.set_flee_target(user? user : loc) /mob/living/simple_animal/passive/default_hurt_interaction(mob/user) . = ..() if(.) - var/datum/ai/passive/preyi = ai + var/datum/mob_controller/passive/preyi = ai if(istype(preyi)) preyi.set_flee_target(user) /mob/living/simple_animal/passive/explosion_act() . = ..() - var/datum/ai/passive/preyi = ai + var/datum/mob_controller/passive/preyi = ai if(istype(preyi)) preyi.set_flee_target(loc) /mob/living/simple_animal/passive/bullet_act(var/obj/item/projectile/proj) . = ..() - var/datum/ai/passive/preyi = ai + var/datum/mob_controller/passive/preyi = ai if(istype(preyi)) preyi.set_flee_target(isliving(proj.firer) ? proj.firer : loc) /mob/living/simple_animal/passive/hitby(atom/movable/AM, var/datum/thrownthing/TT) . = ..() - var/datum/ai/passive/preyi = ai + var/datum/mob_controller/passive/preyi = ai if(istype(preyi)) preyi.set_flee_target(TT.thrower || loc) diff --git a/code/modules/mob/living/simple_animal/passive/deer.dm b/code/modules/mob/living/simple_animal/passive/deer.dm index 044390456dd..b8903039385 100644 --- a/code/modules/mob/living/simple_animal/passive/deer.dm +++ b/code/modules/mob/living/simple_animal/passive/deer.dm @@ -8,7 +8,7 @@ emote_see = list("shakes its head", "stamps a hoof", "looks around quickly") emote_speech = list("Ough!", "Ourgh!", "Mroough!", "Broough?") speak_chance = 0.5 - turns_per_move = 5 + turns_per_wander = 5 see_in_dark = 6 faction = "deer" max_health = 60 diff --git a/code/modules/mob/living/simple_animal/passive/fox.dm b/code/modules/mob/living/simple_animal/passive/fox.dm index ae9ee47f9fc..b1ad39d92ca 100644 --- a/code/modules/mob/living/simple_animal/passive/fox.dm +++ b/code/modules/mob/living/simple_animal/passive/fox.dm @@ -1,8 +1,8 @@ -/datum/ai/passive/fox +/datum/mob_controller/passive/fox var/weakref/hunt_target var/next_hunt = 0 -/datum/ai/passive/fox/update_targets() +/datum/mob_controller/passive/fox/update_targets() // Fleeing takes precedence. . = ..() if(!. && !hunt_target && world.time >= next_hunt) // TODO: generalized nutrition process. && body.get_nutrition() < body.get_max_nutrition() * 0.5) @@ -13,10 +13,10 @@ return . || !!hunt_target -/datum/ai/passive/fox/proc/can_hunt(mob/living/victim) +/datum/mob_controller/passive/fox/proc/can_hunt(mob/living/victim) return !victim.isSynthetic() && (victim.stat == DEAD || victim.get_object_size() < body.get_object_size()) -/datum/ai/passive/fox/do_process(time_elapsed) +/datum/mob_controller/passive/fox/do_process(time_elapsed) ..() @@ -27,13 +27,14 @@ var/atom/hunt_target_atom = hunt_target?.resolve() if(!isliving(hunt_target_atom) || QDELETED(hunt_target_atom) || !(hunt_target_atom in view(body))) hunt_target = null - critter.stop_automated_movement = FALSE + critter.stop_wandering = FALSE return // Find or pursue the target. if(!body.Adjacent(hunt_target_atom)) - critter.stop_automated_movement = 1 - walk_to(body, hunt_target_atom, 0, 3) + critter.set_moving_quickly() + critter.stop_wandering = TRUE + body.start_automove(hunt_target_atom) return // Hunt/consume the target. @@ -43,7 +44,8 @@ if(QDELETED(hunt_mob)) hunt_target = null - critter.stop_automated_movement = FALSE + critter.set_moving_slowly() + critter.stop_wandering = FALSE return if(hunt_mob.stat != DEAD) @@ -51,7 +53,7 @@ // Eat the mob. hunt_target = null - critter.stop_automated_movement = FALSE + critter.stop_wandering = FALSE body.visible_message(SPAN_DANGER("\The [body] consumes the body of \the [hunt_mob]!")) var/remains_type = hunt_mob.get_remains_type() if(remains_type) @@ -69,7 +71,7 @@ desc = "A cunning and graceful predatory mammal, known for its red fur and eerie screams." icon = 'icons/mob/simple_animal/fox.dmi' natural_weapon = /obj/item/natural_weapon/bite/weak - ai = /datum/ai/passive/fox + ai = /datum/mob_controller/passive/fox mob_size = MOB_SIZE_SMALL emote_speech = list("Yip!","AIEE!","YIPE!") speak_emote = list("yelps", "yips", "hisses", "screams") diff --git a/code/modules/mob/living/simple_animal/passive/mouse.dm b/code/modules/mob/living/simple_animal/passive/mouse.dm index 0c7ce6f9f01..4fb3c20b809 100644 --- a/code/modules/mob/living/simple_animal/passive/mouse.dm +++ b/code/modules/mob/living/simple_animal/passive/mouse.dm @@ -9,7 +9,7 @@ emote_see = list("runs in a circle", "shakes", "scritches at something") pass_flags = PASS_FLAG_TABLE speak_chance = 0.5 - turns_per_move = 5 + turns_per_wander = 5 see_in_dark = 6 max_health = 5 response_harm = "stamps on" @@ -26,7 +26,7 @@ base_animal_type = /mob/living/simple_animal/passive/mouse butchery_data = /decl/butchery_data/animal/small/furred - ai = /datum/ai/passive/mouse + ai = /datum/mob_controller/passive/mouse var/body_color //brown, gray and white, leave blank for random var/splatted = FALSE @@ -37,10 +37,10 @@ /mob/living/simple_animal/passive/mouse/get_dexterity(var/silent) return DEXTERITY_NONE // Mice are troll bait, give them no power. -/datum/ai/passive/mouse +/datum/mob_controller/passive/mouse expected_type = /mob/living/simple_animal/passive/mouse -/datum/ai/passive/mouse/do_process() +/datum/mob_controller/passive/mouse/do_process() ..() var/mob/living/simple_animal/passive/mouse/mouse = body if(prob(mouse.speak_chance)) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 55a2de74cc2..1770d2166ef 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -1,3 +1,4 @@ + /mob/living/simple_animal name = "animal" max_health = 20 @@ -11,6 +12,13 @@ icon_state = ICON_STATE_WORLD buckle_pixel_shift = @"{'x':0,'y':0,'z':8}" + move_intents = list( + /decl/move_intent/walk/animal, + /decl/move_intent/run/animal + ) + + var/base_movement_delay = 4 + var/can_have_rider = TRUE var/max_rider_size = MOB_SIZE_SMALL @@ -25,11 +33,12 @@ /// Unlike speak_emote, the list of things in this variable only show by themselves with no spoken text. IE: Ian barks, Ian yaps var/list/emote_see - var/turns_per_move = 1 - var/turns_since_move = 0 - var/stop_automated_movement = 0 //Use this to temporarely stop random movement or to if you write special movement code for animals. + /// Wandering tracking vars. + var/turns_per_wander = 1 + var/turns_since_wander = 0 var/wander = TRUE // Does the mob wander around when idle? - var/stop_automated_movement_when_pulled = 1 //When set to 1 this stops the animal from moving when someone is grabbing it. + var/stop_wandering = FALSE //Use this to temporarely stop random movement or to if you write special movement code for animals. + var/stop_wandering_when_pulled = TRUE //When set to 1 this stops the animal from moving when someone is grabbing it. //Interaction var/response_help_1p = "You pet $TARGET$." @@ -53,7 +62,6 @@ ) var/unsuitable_atmos_damage = 2 //This damage is taken when atmos doesn't fit all the requirements above - var/speed = 0 //LETS SEE IF I CAN SET SPEEDS FOR SIMPLE MOBS WITHOUT DESTROYING EVERYTHING. Higher speed is slower, negative speed is faster //LETTING SIMPLE ANIMALS ATTACK? WHAT COULD GO WRONG. Defaults to zero so Ian can still be cuddly var/obj/item/natural_weapon/natural_weapon @@ -184,7 +192,7 @@ var/global/list/simplemob_icon_bitflag_cache = list() if(can_bleed && bleed_ticks > 0) handle_bleeding() if(is_aquatic && !submerged()) - walk(src, 0) + stop_automove() if(HAS_STATUS(src, STAT_PARA) <= 2) // gated to avoid redundant update_icon() calls. SET_STATUS_MAX(src, STAT_PARA, 3) update_icon() @@ -231,15 +239,15 @@ var/global/list/simplemob_icon_bitflag_cache = list() if(current_posture.prone) if(!incapacitated()) set_posture(/decl/posture/standing) - else if(!stop_automated_movement && !buckled_mob && wander && !anchored) - if(isturf(src.loc) && !current_posture.prone) //This is so it only moves if it's not inside a closet, gentics machine, etc. - turns_since_move++ - if(turns_since_move >= turns_per_move && (!(stop_automated_movement_when_pulled) || !LAZYLEN(grabbed_by))) //Some animals don't move when pulled - var/direction = pick(global.cardinal) - var/turf/move_to = get_step(loc, direction) - if(turf_is_safe(move_to)) - SelfMove(direction) - turns_since_move = 0 + else if(!stop_wandering && !buckled_mob && wander && !anchored && isturf(src.loc) && !current_posture.prone) //This is so it only moves if it's not inside a closet, gentics machine, etc. + turns_since_wander++ + if(turns_since_wander >= turns_per_wander && (!(stop_wandering_when_pulled) || !LAZYLEN(grabbed_by))) //Some animals don't move when pulled + set_moving_slowly() + var/direction = pick(global.cardinal) + var/turf/move_to = get_step(loc, direction) + if(turf_is_safe(move_to)) + SelfMove(direction) + turns_since_wander = 0 //Speaking if(prob(speak_chance)) @@ -398,15 +406,10 @@ var/global/list/simplemob_icon_bitflag_cache = list() adjustBleedTicks(damage) /mob/living/simple_animal/get_movement_delay(var/travel_dir) - var/tally = ..() //Incase I need to add stuff other than "speed" later - - tally += speed - if(purge)//Purged creatures will move more slowly. The more time before their purge stops, the slower they'll move. - if(tally <= 0) - tally = 1 - tally *= purge - - return tally+get_config_value(/decl/config/num/movement_animal) + . = max(1, ..() + base_movement_delay + get_config_value(/decl/config/num/movement_animal)) + //Purged creatures will move more slowly. The more time before their purge stops, the slower they'll move. + if(purge) + . *= purge /mob/living/simple_animal/Stat() . = ..() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index e236a36b671..15c71e2c496 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1,4 +1,7 @@ /mob/Destroy() //This makes sure that mobs with clients/keys are not just deleted from the game. + + stop_automove() + STOP_PROCESSING(SSmobs, src) global.dead_mob_list_ -= src global.living_mob_list_ -= src @@ -60,9 +63,9 @@ /mob/Initialize() if(ispath(skillset)) skillset = new skillset(src) - if(!move_intent) + if(!ispath(move_intent) || !(move_intent in move_intents)) move_intent = move_intents[1] - if(ispath(move_intent)) + if(!istype(move_intent)) move_intent = GET_DECL(move_intent) . = ..() ability_master = new(null, src) @@ -216,7 +219,13 @@ . += 6 if(current_posture.prone) //Crawling, it's slower . += (8 + ((GET_STATUS(src, STAT_WEAK) * 3) + (GET_STATUS(src, STAT_CONFUSE) * 2))) - . += move_intent.move_delay + (ENCUMBERANCE_MOVEMENT_MOD * encumbrance()) + var/_automove_delay = get_automove_delay() + if(isnull(_automove_delay)) + . += move_intent.move_delay + else + . += _automove_delay + . = max(. + (ENCUMBERANCE_MOVEMENT_MOD * encumbrance()), 1) + #undef ENCUMBERANCE_MOVEMENT_MOD /mob/proc/encumbrance() @@ -1358,3 +1367,7 @@ var/decl/butchery_data/butchery_decl = GET_DECL(butchery_data) . = butchery_decl?.meat_name || name +/mob/reset_movement_delay() + var/datum/movement_handler/mob/delay/delay = locate() in movement_handlers + if(istype(delay)) + delay.next_move = world.time diff --git a/code/modules/mob/mob_automove.dm b/code/modules/mob/mob_automove.dm new file mode 100644 index 00000000000..ff8d1a6d7ba --- /dev/null +++ b/code/modules/mob/mob_automove.dm @@ -0,0 +1,24 @@ +/mob + /// Simple general-use reference for mob automoves. May be unused or replaced on subtypes. + var/atom/_automove_target + +/mob/stop_automove() + _automove_target = null + return ..() + +/// Called by get_movement_delay() to override the current move intent, in cases where an automove has a delay override. +/mob/proc/get_automove_delay() + var/datum/automove_metadata/metadata = SSautomove.moving_metadata[src] + return metadata?.move_delay + +/mob/start_automove(target, movement_type, datum/automove_metadata/metadata) + _automove_target = target + return ..() + +// The AI datum may decide to track a target instead of using the mob reference. +/mob/get_automove_target(datum/automove_metadata/metadata) + . = (istype(ai) && ai.get_automove_target()) || _automove_target || ..() + +// We do some early checking here to avoid doing the same checks repeatedly by calling SelfMove(). +/mob/can_do_automated_move(variant_move_delay) + . = MayMove() && !incapacitated() && (!istype(ai) || ai.can_do_automated_move()) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 9d750d10e17..57bd60dde48 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -148,7 +148,7 @@ var/list/progressbars = null //for stacking do_after bars - var/datum/ai/ai // Type abused. Define with path and will automagically create. Determines behaviour for clientless mobs. + var/datum/mob_controller/ai // Type abused. Define with path and will automagically create. Determines behaviour for clientless mobs. var/holder_type /// If this mob is or was piloted by a player with typing indicators enabled, an instance of one. diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 174f36eaf06..78df63f89f2 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -1,9 +1,9 @@ /mob var/moving = FALSE -/mob/proc/SelfMove(var/direction) +/atom/movable/proc/SelfMove(var/direction) if(DoMove(direction, src) & MOVEMENT_HANDLED) - return TRUE // Doesn't necessarily mean the mob physically moved + return TRUE // Doesn't necessarily mean the atom physically moved /mob/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) . = current_posture.prone || ..() || !mover.density @@ -313,7 +313,7 @@ var/choice = input(usr, "Select a default walk.", "Set Default Walk") as null|anything in get_movement_datums_by_missing_flag(MOVE_INTENT_QUICK) if(choice && (choice in get_movement_datums_by_missing_flag(MOVE_INTENT_QUICK))) default_walk_intent = choice - to_chat(src, "You will now default to [default_walk_intent] when moving deliberately.") + to_chat(src, SPAN_NOTICE("You will now default to [default_walk_intent] when moving deliberately.")) /mob/verb/SetDefaultRun() set name = "Set Default Run" @@ -322,7 +322,7 @@ var/choice = input(usr, "Select a default run.", "Set Default Run") as null|anything in get_movement_datums_by_flag(MOVE_INTENT_QUICK) if(choice && (choice in get_movement_datums_by_flag(MOVE_INTENT_QUICK))) default_run_intent = choice - to_chat(src, "You will now default to [default_run_intent] when moving quickly.") + to_chat(src, SPAN_NOTICE("You will now default to [default_run_intent] when moving quickly.")) /client/verb/setmovingslowly() set hidden = 1 @@ -347,7 +347,7 @@ set_move_intent(default_run_intent) /mob/proc/can_sprint() - return FALSE + return TRUE /mob/proc/adjust_stamina(var/amt) return diff --git a/code/modules/species/species.dm b/code/modules/species/species.dm index fec5d27cde6..90220230fb6 100644 --- a/code/modules/species/species.dm +++ b/code/modules/species/species.dm @@ -198,7 +198,7 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 var/manual_dexterity = DEXTERITY_FULL - var/datum/ai/ai // Type abused. Define with path and will automagically create. Determines behaviour for clientless mobs. This will override mob AIs. + var/datum/mob_controller/ai // Type abused. Define with path and will automagically create. Determines behaviour for clientless mobs. This will override mob AIs. var/exertion_emote_chance = 5 var/exertion_effect_chance = 0 diff --git a/code/modules/species/station/monkey.dm b/code/modules/species/station/monkey.dm index 33decbf2245..4a68a4edaf3 100644 --- a/code/modules/species/station/monkey.dm +++ b/code/modules/species/station/monkey.dm @@ -38,4 +38,4 @@ TAG_FACTION = /decl/cultural_info/faction/other ) - ai = /datum/ai/monkey + ai = /datum/mob_controller/monkey diff --git a/maps/away/errant_pisces/errant_pisces.dm b/maps/away/errant_pisces/errant_pisces.dm index 05319f87c3f..fe26cfe4b7c 100644 --- a/maps/away/errant_pisces/errant_pisces.dm +++ b/maps/away/errant_pisces/errant_pisces.dm @@ -21,9 +21,8 @@ name = "cosmoshark" desc = "Enormous creature that resembles a shark with magenta glowing lines along its body and set of long deep-purple teeth." icon = 'maps/away/errant_pisces/icons/cosmoshark.dmi' - turns_per_move = 5 + turns_per_wander = 5 butchery_data = /decl/butchery_data/animal/fish/space_carp/shark - speed = 2 max_health = 100 natural_weapon = /obj/item/natural_weapon/bite/strong break_stuff_probability = 35 diff --git a/maps/away/slavers/slavers_base.dm b/maps/away/slavers/slavers_base.dm index 394e86a002d..e5be14c23cd 100644 --- a/maps/away/slavers/slavers_base.dm +++ b/maps/away/slavers/slavers_base.dm @@ -134,9 +134,8 @@ desc = "Vigiliant fighter against slavery." icon = 'maps/away/slavers/icons/abolitionist.dmi' speak_chance = 0 - turns_per_move = 5 - speed = 4 - stop_automated_movement_when_pulled = 0 + turns_per_wander = 5 + stop_wandering_when_pulled = FALSE max_health = 100 natural_weapon = /obj/item/natural_weapon/punch can_escape = TRUE diff --git a/maps/ministation/ministation-1.dmm b/maps/ministation/ministation-1.dmm index 3665d8ef5aa..1676b69536a 100644 --- a/maps/ministation/ministation-1.dmm +++ b/maps/ministation/ministation-1.dmm @@ -4975,7 +4975,6 @@ /mob/living/simple_animal/crow{ desc = "She's not a real doctor but she is a real bird."; name = "Dr. Bird"; - stop_automated_movement = 0 }, /turf/floor/tiled/white, /area/ministation/medical) diff --git a/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dm b/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dm index eedc44e72d7..6eb53c85843 100644 --- a/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dm +++ b/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dm @@ -113,4 +113,4 @@ hostile_drone = 1 destroy_surroundings = 1 projectiletype = initial(projectiletype) - walk(src,0) + stop_automove() diff --git a/mods/content/corporate/away_sites/lar_maria/lar_maria.dm b/mods/content/corporate/away_sites/lar_maria/lar_maria.dm index ca0d1c558fd..efc97e0ce66 100644 --- a/mods/content/corporate/away_sites/lar_maria/lar_maria.dm +++ b/mods/content/corporate/away_sites/lar_maria/lar_maria.dm @@ -33,10 +33,10 @@ emote_speech = list("Die!", "Fresh meat!", "Hurr!", "You said help will come!", "I did nothing!", "Eat my fist!", "One for the road!") emote_hear = list("roars", "giggles", "breathes loudly", "mumbles", "yells something unintelligible") emote_see = list("cries", "grins insanely", "itches fiercly", "scratches his face", "shakes his fists above his head") - turns_per_move = 5 - speed = 8 + turns_per_wander = 5 + base_movement_delay = 8 can_escape = TRUE - stop_automated_movement_when_pulled = 0 + stop_wandering_when_pulled = FALSE natural_weapon = /obj/item/natural_weapon/punch var/obj/abstract/landmark/corpse/lar_maria/corpse = null diff --git a/mods/content/xenobiology/colours/colour_red.dm b/mods/content/xenobiology/colours/colour_red.dm index d15fdf80f02..fdb702c97c3 100644 --- a/mods/content/xenobiology/colours/colour_red.dm +++ b/mods/content/xenobiology/colours/colour_red.dm @@ -15,7 +15,7 @@ var/turf/location = get_turf(holder.get_reaction_loc()) if(location) for(var/mob/living/slime/slime in viewers(location, 7)) - var/datum/ai/slime/slime_ai = slime.ai + var/datum/mob_controller/slime/slime_ai = slime.ai if(istype(slime_ai)) slime_ai.rabid = TRUE slime.visible_message(SPAN_DANGER("\The [slime] is driven into a frenzy!")) diff --git a/mods/content/xenobiology/emotes.dm b/mods/content/xenobiology/emotes.dm index ff8cbbd3af4..34f3c719cc4 100644 --- a/mods/content/xenobiology/emotes.dm +++ b/mods/content/xenobiology/emotes.dm @@ -24,7 +24,7 @@ /decl/emote/slime/do_extra(atom/user) if(ismob(user)) var/mob/user_mob = user - var/datum/ai/slime/slime_ai = user_mob.ai + var/datum/mob_controller/slime/slime_ai = user_mob.ai if(istype(slime_ai)) slime_ai.mood = mood user.update_icon() diff --git a/mods/content/xenobiology/slime/_slime.dm b/mods/content/xenobiology/slime/_slime.dm index 11db21dc83c..eb13f315983 100644 --- a/mods/content/xenobiology/slime/_slime.dm +++ b/mods/content/xenobiology/slime/_slime.dm @@ -17,7 +17,7 @@ see_in_dark = 8 status_flags = CANPARALYSE|CANPUSH butchery_data = null - ai = /datum/ai/slime + ai = /datum/mob_controller/slime hud_used = /datum/hud/slime nutrition = 800 @@ -167,7 +167,7 @@ ..(-abs(amount), do_update_health) // Heals them /mob/living/slime/bullet_act(var/obj/item/projectile/Proj) - var/datum/ai/slime/slime_ai = ai + var/datum/mob_controller/slime/slime_ai = ai if(istype(slime_ai)) slime_ai.attacked += 10 slime_ai.adjust_friendship(Proj.firer, -5) @@ -190,13 +190,13 @@ . = ..() if(new_amount != last_amount && isslime(victim)) var/mob/living/slime/slime = victim - if(istype(slime.ai, /datum/ai/slime)) - var/datum/ai/slime/slime_ai = slime.ai + if(istype(slime.ai, /datum/mob_controller/slime)) + var/datum/mob_controller/slime/slime_ai = slime.ai slime_ai.update_mood() /mob/living/slime/proc/adjust_friendship(var/mob/user, var/amount) if(user && amount != 0) - var/datum/ai/slime/slime_ai = ai + var/datum/mob_controller/slime/slime_ai = ai if(istype(slime_ai)) return slime_ai.adjust_friendship(user, amount) @@ -255,7 +255,7 @@ return TRUE if(I_HURT) var/damage = rand(1, 9) - var/datum/ai/slime/slime_ai = ai + var/datum/mob_controller/slime/slime_ai = ai if(istype(slime_ai)) slime_ai.attacked += 10 slime_ai.adjust_friendship(user, -5) @@ -272,7 +272,7 @@ /mob/living/slime/attackby(var/obj/item/W, var/mob/user) if(W.force > 0) - var/datum/ai/slime/slime_ai = ai + var/datum/mob_controller/slime/slime_ai = ai if(istype(slime_ai)) slime_ai.attacked += 10 slime_ai.adjust_friendship(user, -5) diff --git a/mods/content/xenobiology/slime/death.dm b/mods/content/xenobiology/slime/death.dm index c0f4604416a..f19899eb2f1 100644 --- a/mods/content/xenobiology/slime/death.dm +++ b/mods/content/xenobiology/slime/death.dm @@ -1,11 +1,11 @@ /mob/living/slime/physically_destroyed() if(is_adult) - var/datum/ai/slime/my_ai = ai + var/datum/mob_controller/slime/my_ai = ai var/decl/slime_colour/slime_data = GET_DECL(slime_type) var/list/babies = list() for(var/i in 1 to 2) var/mob/living/slime/baby = new slime_data.child_type(loc, slime_type) - var/datum/ai/slime/baby_ai = baby.ai + var/datum/mob_controller/slime/baby_ai = baby.ai if(istype(my_ai) && istype(baby_ai)) baby_ai.rabid = TRUE baby_ai.observed_friends = my_ai.observed_friends?.Copy() diff --git a/mods/content/xenobiology/slime/feeding.dm b/mods/content/xenobiology/slime/feeding.dm index 0a208e3c5a6..48b7fdd01bc 100644 --- a/mods/content/xenobiology/slime/feeding.dm +++ b/mods/content/xenobiology/slime/feeding.dm @@ -55,7 +55,7 @@ events_repository.register(/decl/observ/moved, src, src, TYPE_PROC_REF(/mob/living/slime, check_feed_target_position)) events_repository.register(/decl/observ/moved, victim, src, TYPE_PROC_REF(/mob/living/slime, check_feed_target_position)) events_repository.register(/decl/observ/destroyed, victim, src, TYPE_PROC_REF(/mob/living/slime, check_feed_target_position)) - var/datum/ai/slime/slime_ai = ai + var/datum/mob_controller/slime/slime_ai = ai if(istype(slime_ai)) slime_ai.update_mood() update_icon() diff --git a/mods/content/xenobiology/slime/powers.dm b/mods/content/xenobiology/slime/powers.dm index 6fe8c85aa75..b1338d02c4f 100644 --- a/mods/content/xenobiology/slime/powers.dm +++ b/mods/content/xenobiology/slime/powers.dm @@ -50,10 +50,10 @@ else player_baby.key = key - var/datum/ai/slime/my_ai = ai + var/datum/mob_controller/slime/my_ai = ai for(var/mob/living/slime/baby in babies) step_away(baby, src) - var/datum/ai/slime/baby_ai = baby.ai + var/datum/mob_controller/slime/baby_ai = baby.ai if(istype(baby_ai) && istype(my_ai)) baby_ai.observed_friends = my_ai.observed_friends?.Copy() qdel(src) diff --git a/mods/content/xenobiology/slime/say.dm b/mods/content/xenobiology/slime/say.dm index c248fa29b21..2a2d2f54c18 100644 --- a/mods/content/xenobiology/slime/say.dm +++ b/mods/content/xenobiology/slime/say.dm @@ -10,13 +10,13 @@ . = isslime(speaker) || ..() /mob/living/slime/hear_say(var/message, var/verb = "says", var/decl/language/language = null, var/alt_name = "", var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol) - var/datum/ai/slime/slime_ai = ai + var/datum/mob_controller/slime/slime_ai = ai if(istype(slime_ai) && (weakref(speaker) in slime_ai.observed_friends)) LAZYSET(slime_ai.speech_buffer, speaker, lowertext(html_decode(message))) return ..() /mob/living/slime/hear_radio(var/message, var/verb="says", var/decl/language/language=null, var/part_a, var/part_b, var/part_c, var/mob/speaker = null, var/hard_to_hear = 0, var/vname ="", var/vsource) - var/datum/ai/slime/slime_ai = ai + var/datum/mob_controller/slime/slime_ai = ai if(istype(slime_ai) && (weakref(speaker) in slime_ai.observed_friends)) LAZYSET(slime_ai.speech_buffer, speaker, lowertext(html_decode(message))) return ..() diff --git a/mods/content/xenobiology/slime/slime_AI.dm b/mods/content/xenobiology/slime/slime_AI.dm index 52cf931872f..e4acd432a64 100644 --- a/mods/content/xenobiology/slime/slime_AI.dm +++ b/mods/content/xenobiology/slime/slime_AI.dm @@ -1,4 +1,4 @@ -/datum/ai/slime +/datum/mob_controller/slime expected_type = /mob/living/slime run_interval = 1 SECOND var/mood @@ -14,11 +14,11 @@ var/next_core_logic_run = 0 var/holding_still = 0 // AI variable, cooloff-ish for how long it's going to stay in one place -/datum/ai/slime/New() +/datum/mob_controller/slime/New() ..() slime = body -/datum/ai/slime/Destroy() +/datum/mob_controller/slime/Destroy() observed_friends = null friendship_cooldown = null current_target = null @@ -26,7 +26,7 @@ slime = null . = ..() -/datum/ai/slime/proc/assess_target(var/mob/living/target) +/datum/mob_controller/slime/proc/assess_target(var/mob/living/target) if(!istype(target) || isslime(target) || (weakref(target) in observed_friends)) return FALSE if(target.stat != DEAD && (rabid || attacked)) @@ -35,7 +35,7 @@ return TRUE return FALSE -/datum/ai/slime/proc/update_mood() +/datum/mob_controller/slime/proc/update_mood() if(!slime || !body) return body.a_intent_change(I_HELP) @@ -58,7 +58,7 @@ mood = new_mood body.update_icon() -/datum/ai/slime/do_process(time_elapsed) +/datum/mob_controller/slime/do_process(time_elapsed) . = ..() if(attacked > 0) attacked = clamp(attacked--, 0, 50) @@ -75,7 +75,7 @@ handle_core_logic() handle_speech_and_mood() -/datum/ai/slime/proc/get_best_target(var/list/targets) +/datum/mob_controller/slime/proc/get_best_target(var/list/targets) if(!length(targets)) return if(rabid || attacked) @@ -86,7 +86,7 @@ return M . = targets[1] -/datum/ai/slime/proc/handle_targets() +/datum/mob_controller/slime/proc/handle_targets() if(!slime || !body) return @@ -123,7 +123,7 @@ else if(prob(hunger ? 50 : 33)) body.SelfMove(pick(global.cardinal)) -/datum/ai/slime/proc/handle_core_logic() +/datum/mob_controller/slime/proc/handle_core_logic() if(!slime || !body) return @@ -168,7 +168,7 @@ next_core_logic_run = world.time + max(body?.get_movement_delay(), 5) + added_delay -/datum/ai/slime/proc/handle_speech_and_mood() +/datum/mob_controller/slime/proc/handle_speech_and_mood() if(!slime || !body) return @@ -204,7 +204,7 @@ if(length(possible_comments)) body.say(pick(possible_comments)) -/datum/ai/slime/proc/adjust_friendship(var/atom/user, var/amount) +/datum/mob_controller/slime/proc/adjust_friendship(var/atom/user, var/amount) if(ismob(user)) if(QDELETED(user)) return FALSE diff --git a/mods/content/xenobiology/slime/slime_commands.dm b/mods/content/xenobiology/slime/slime_commands.dm index 22e1ac9cce0..4290f05accf 100644 --- a/mods/content/xenobiology/slime/slime_commands.dm +++ b/mods/content/xenobiology/slime/slime_commands.dm @@ -1,25 +1,25 @@ /decl/slime_command var/list/triggers -/decl/slime_command/proc/resolve(var/speaker, var/spoken, var/datum/ai/slime/holder) +/decl/slime_command/proc/resolve(var/speaker, var/spoken, var/datum/mob_controller/slime/holder) for(var/trigger in triggers) if(findtext(spoken, trigger)) return get_response(speaker, spoken, holder) -/decl/slime_command/proc/get_response(var/speaker, var/spoken, var/datum/ai/slime/holder) +/decl/slime_command/proc/get_response(var/speaker, var/spoken, var/datum/mob_controller/slime/holder) return /decl/slime_command/hello triggers = list("hello", "hi") -/decl/slime_command/hello/get_response(var/speaker, var/spoken, var/datum/ai/slime/holder) +/decl/slime_command/hello/get_response(var/speaker, var/spoken, var/datum/mob_controller/slime/holder) holder.adjust_friendship(speaker, rand(1,2)) return pick("Hello...", "Hi...") /decl/slime_command/follow triggers = list("follow") -/decl/slime_command/follow/get_response(var/speaker, var/spoken, var/datum/ai/slime/holder) +/decl/slime_command/follow/get_response(var/speaker, var/spoken, var/datum/mob_controller/slime/holder) if(holder.leader) if(holder.leader == speaker) return pick("Yes...", "Lead...", "Following...") @@ -35,7 +35,7 @@ /decl/slime_command/stop triggers = list("stop") -/decl/slime_command/stop/get_response(var/speaker, var/spoken, var/datum/ai/slime/holder) +/decl/slime_command/stop/get_response(var/speaker, var/spoken, var/datum/mob_controller/slime/holder) var/friendship = LAZYACCESS(holder.observed_friends, weakref(speaker)) if(holder.slime.feeding_on) if(friendship > 4) @@ -64,7 +64,7 @@ /decl/slime_command/stay triggers = list("stay") -/decl/slime_command/stay/get_response(var/speaker, var/spoken, var/datum/ai/slime/holder) +/decl/slime_command/stay/get_response(var/speaker, var/spoken, var/datum/mob_controller/slime/holder) var/friendship = LAZYACCESS(holder.observed_friends, weakref(speaker)) if(holder.leader) if(holder.leader == speaker) diff --git a/mods/content/xenobiology/slime/slime_comments.dm b/mods/content/xenobiology/slime/slime_comments.dm index 8ebfe5af387..bd8ad9f1146 100644 --- a/mods/content/xenobiology/slime/slime_comments.dm +++ b/mods/content/xenobiology/slime/slime_comments.dm @@ -1,7 +1,7 @@ -/decl/slime_comment/proc/get_comment(var/datum/ai/slime/holder) +/decl/slime_comment/proc/get_comment(var/datum/mob_controller/slime/holder) return -/decl/slime_comment/general/get_comment(var/datum/ai/slime/holder) +/decl/slime_comment/general/get_comment(var/datum/mob_controller/slime/holder) . = list("Rawr...", "Blop...", "Blorble...") if(holder.mood == ":3") . += "Purr..." @@ -19,7 +19,7 @@ . += list("Nom...", "Tasty...") return pick(.) -/decl/slime_comment/hungry/get_comment(var/datum/ai/slime/holder) +/decl/slime_comment/hungry/get_comment(var/datum/mob_controller/slime/holder) if(prob(2)) . = list() var/tension = 10 @@ -34,7 +34,7 @@ if(length(.) && prob(tension)) return pick(.) -/decl/slime_comment/zap/get_comment(var/datum/ai/slime/holder) +/decl/slime_comment/zap/get_comment(var/datum/mob_controller/slime/holder) if(holder.slime.powerlevel > 3) . = list("Bzzz...") if(holder.slime.powerlevel > 5) @@ -43,11 +43,11 @@ . += "Zap... Bzz..." return pick(.) -/decl/slime_comment/rabid/get_comment(var/datum/ai/slime/holder) +/decl/slime_comment/rabid/get_comment(var/datum/mob_controller/slime/holder) if (holder.rabid || holder.attacked) return pick("Hrr...", "Nhuu...", "Unn...") -/decl/slime_comment/friends/get_comment(var/datum/ai/slime/holder) +/decl/slime_comment/friends/get_comment(var/datum/mob_controller/slime/holder) var/slimes_near = 0 var/dead_slimes = 0 var/friends_near = list() diff --git a/mods/content/xenobiology/slime/slime_reagents.dm b/mods/content/xenobiology/slime/slime_reagents.dm index 8e812ddc8b3..bff84fd00ee 100644 --- a/mods/content/xenobiology/slime/slime_reagents.dm +++ b/mods/content/xenobiology/slime/slime_reagents.dm @@ -19,8 +19,8 @@ if(isslime(M)) M.take_damage(10 * removed, TOX) var/mob/living/slime/S = M - if(istype(S) && istype(S.ai, /datum/ai/slime)) - var/datum/ai/slime/slime_ai = S.ai + if(istype(S) && istype(S.ai, /datum/mob_controller/slime)) + var/datum/mob_controller/slime/slime_ai = S.ai if(slime_ai.current_target) slime_ai.current_target = null S.set_feeding_on() @@ -29,7 +29,7 @@ SPAN_DANGER("\The [S]'s flesh sizzles where \the [name] touches it!"), \ SPAN_DANGER("Your flesh is burned by \the [name]!")) SET_STATUS_MAX(M, STAT_CONFUSE, 2) - var/datum/ai/slime/slime_ai = M.ai + var/datum/mob_controller/slime/slime_ai = M.ai if(istype(slime_ai)) slime_ai.attacked = max(slime_ai.attacked, rand(7,10)) // angery diff --git a/mods/content/xenobiology/slime/slime_update_icon.dm b/mods/content/xenobiology/slime/slime_update_icon.dm index b7e54e6d295..b251188a33d 100644 --- a/mods/content/xenobiology/slime/slime_update_icon.dm +++ b/mods/content/xenobiology/slime/slime_update_icon.dm @@ -11,7 +11,7 @@ ..() - var/datum/ai/slime/slime_ai = ai + var/datum/mob_controller/slime/slime_ai = ai if(stat != DEAD && istype(slime_ai) && slime_ai.mood) add_overlay(image(slime_data.mood_icon, "aslime-[slime_ai.mood]")) diff --git a/mods/gamemodes/cult/mobs/constructs/constructs.dm b/mods/gamemodes/cult/mobs/constructs/constructs.dm index 29711d9ec27..744b96152b1 100644 --- a/mods/gamemodes/cult/mobs/constructs/constructs.dm +++ b/mods/gamemodes/cult/mobs/constructs/constructs.dm @@ -6,15 +6,15 @@ speak_emote = list("hisses") emote_hear = list("wails","screeches") base_animal_type = /mob/living/simple_animal/construct + base_movement_delay = -1 response_help_1p = "You think better of touching $TARGET$." response_help_3p = "$USER$ thinks better of touching $TARGET$." response_disarm = "flails at" response_harm = "punches" icon = 'icons/mob/simple_animal/shade.dmi' - speed = -1 a_intent = I_HURT - stop_automated_movement = 1 + stop_wandering = TRUE status_flags = CANPUSH universal_speak = FALSE universal_understand = TRUE @@ -104,13 +104,13 @@ harm_intent_damage = 0 natural_weapon = /obj/item/natural_weapon/juggernaut mob_size = MOB_SIZE_LARGE - speed = 3 environment_smash = 2 status_flags = 0 resistance = 10 construct_spells = list(/spell/aoe_turf/conjure/forcewall/lesser) can_escape = TRUE hud_used = /datum/hud/construct/juggernaut + base_movement_delay = 3 /obj/item/natural_weapon/juggernaut name = "armored gauntlet" @@ -150,11 +150,7 @@ mind.assigned_role = "Juggernaut" mind.assigned_special_role = "Cultist" - ////////////////////////Wraith///////////////////////////////////////////// - - - /mob/living/simple_animal/construct/wraith name = "Wraith" real_name = "Wraith" @@ -162,7 +158,6 @@ icon = 'icons/mob/simple_animal/construct_floating.dmi' max_health = 75 natural_weapon = /obj/item/natural_weapon/wraith - speed = -1 environment_smash = 1 see_in_dark = 7 construct_spells = list(/spell/targeted/ethereal_jaunt/shift) @@ -194,7 +189,6 @@ response_harm = "viciously beaten" harm_intent_damage = 5 natural_weapon = /obj/item/natural_weapon/cult_builder - speed = 0 environment_smash = 1 construct_spells = list( /spell/aoe_turf/conjure/construct/lesser, @@ -204,6 +198,7 @@ /spell/aoe_turf/conjure/pylon ) hud_used = /datum/hud/construct/artificer + base_movement_delay = 0 /obj/item/natural_weapon/cult_builder name = "heavy arms" @@ -229,20 +224,18 @@ response_harm = "harmlessly punches" harm_intent_damage = 0 natural_weapon = /obj/item/natural_weapon/juggernaut/behemoth - speed = 5 environment_smash = 2 resistance = 10 construct_spells = list(/spell/aoe_turf/conjure/forcewall/lesser) can_escape = TRUE hud_used = /datum/hud/construct/juggernaut + base_movement_delay = 5 /obj/item/natural_weapon/juggernaut/behemoth force = 50 ////////////////////////Harvester//////////////////////////////// - - /mob/living/simple_animal/construct/harvester name = "Harvester" real_name = "Harvester" @@ -250,11 +243,9 @@ icon = 'icons/mob/simple_animal/construct_harvester.dmi' max_health = 150 natural_weapon = /obj/item/natural_weapon/harvester - speed = -1 environment_smash = 1 see_in_dark = 7 hud_used = /datum/hud/construct/harvester - construct_spells = list( /spell/targeted/harvest ) diff --git a/mods/gamemodes/cult/mobs/shade.dm b/mods/gamemodes/cult/mobs/shade.dm index 1bf802e25c8..41d73a0ccca 100644 --- a/mods/gamemodes/cult/mobs/shade.dm +++ b/mods/gamemodes/cult/mobs/shade.dm @@ -1,5 +1,5 @@ /mob/living/simple_animal/shade - name = "Shade" + name = "shade" real_name = "Shade" desc = "A bound spirit" icon = 'icons/mob/simple_animal/shade.dmi' @@ -16,14 +16,14 @@ maxbodytemp = 4000 min_gas = null max_gas = null - speed = -1 - stop_automated_movement = 1 + stop_wandering = TRUE faction = "cult" supernatural = 1 status_flags = CANPUSH gene_damage = -1 bleed_colour = "#181933" butchery_data = null + base_movement_delay = -1 /mob/living/simple_animal/shade/check_has_mouth() return FALSE diff --git a/mods/mobs/borers/mob/borer/borer.dm b/mods/mobs/borers/mob/borer/borer.dm index 529830e87a1..41ace823dc9 100644 --- a/mods/mobs/borers/mob/borer/borer.dm +++ b/mods/mobs/borers/mob/borer/borer.dm @@ -9,10 +9,10 @@ response_help_1p = "You poke $TARGET$." response_disarm = "prods" response_harm = "stamps on" + base_movement_delay = 5 - speed = 5 a_intent = I_HURT - stop_automated_movement = 1 + stop_wandering = TRUE status_flags = CANPUSH natural_weapon = /obj/item/natural_weapon/bite/weak wander = 0 diff --git a/mods/mobs/dionaea/datums/ai.dm b/mods/mobs/dionaea/datums/ai.dm index 3926bc8f51d..5d29fc0d314 100644 --- a/mods/mobs/dionaea/datums/ai.dm +++ b/mods/mobs/dionaea/datums/ai.dm @@ -1,10 +1,10 @@ -/datum/ai/nymph +/datum/mob_controller/nymph name = "nymph" expected_type = /mob/living/simple_animal/alien/diona var/emote_prob = 3 var/wander_prob = 44 -/datum/ai/nymph/do_process(var/time_elapsed) +/datum/mob_controller/nymph/do_process(var/time_elapsed) if(body.stat != CONSCIOUS) return if(prob(wander_prob) && !LAZYLEN(body.grabbed_by) && isturf(body.loc)) //won't move if being pulled diff --git a/mods/mobs/dionaea/mob/_nymph.dm b/mods/mobs/dionaea/mob/_nymph.dm index 51e88f4fb01..72b4596cf7e 100644 --- a/mods/mobs/dionaea/mob/_nymph.dm +++ b/mods/mobs/dionaea/mob/_nymph.dm @@ -28,7 +28,7 @@ atom_flags = ATOM_FLAG_NO_CHEM_CHANGE hud_used = /datum/hud/diona_nymph - ai = /datum/ai/nymph + ai = /datum/mob_controller/nymph z_flags = ZMM_MANGLE_PLANES diff --git a/nebula.dme b/nebula.dme index 1367e75e60e..4227eb44340 100644 --- a/nebula.dme +++ b/nebula.dme @@ -310,7 +310,8 @@ #include "code\controllers\subsystems\initialization\robots.dm" #include "code\controllers\subsystems\initialization\secrets.dm" #include "code\controllers\subsystems\initialization\webhooks.dm" -#include "code\controllers\subsystems\processing\ai.dm" +#include "code\controllers\subsystems\mob_ai\auto_movement.dm" +#include "code\controllers\subsystems\mob_ai\mob_ai.dm" #include "code\controllers\subsystems\processing\airflow.dm" #include "code\controllers\subsystems\processing\blob.dm" #include "code\controllers\subsystems\processing\chatter.dm" @@ -499,8 +500,12 @@ #include "code\datums\mind\memory.dm" #include "code\datums\mind\mind.dm" #include "code\datums\move_intent\move_intent.dm" +#include "code\datums\move_intent\move_intent_animal.dm" #include "code\datums\movement\_defines.dm" #include "code\datums\movement\atom_movable.dm" +#include "code\datums\movement\automove.dm" +#include "code\datums\movement\automove_controller.dm" +#include "code\datums\movement\automove_metadata.dm" #include "code\datums\movement\mob.dm" #include "code\datums\movement\movement.dm" #include "code\datums\movement\multiz.dm" @@ -2695,6 +2700,7 @@ #include "code\modules\mob\login.dm" #include "code\modules\mob\logout.dm" #include "code\modules\mob\mob.dm" +#include "code\modules\mob\mob_automove.dm" #include "code\modules\mob\mob_blood.dm" #include "code\modules\mob\mob_damage.dm" #include "code\modules\mob\mob_defines.dm" From 5a7fd306fdb4db2bd7f86db25db77042f655ffc1 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Fri, 28 Jun 2024 00:41:12 +0000 Subject: [PATCH 33/38] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ------ 1 file changed, 6 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 8373e672193..f16350b9bbd 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -150,12 +150,6 @@

    MistakeNot4892 updated:

  • You can now extract seeds from growns using Botany skill and a sharp knife.
  • Potatoes can be planted directly without extracting seeds.
  • - -

    26 April 2024

    -

    MistakeNot4892 updated:

    -
      -
    • Non-high vis accessories on clothes will show as part of the examine string.
    • -
    From bf41611a039f005daa44ffb22f13b19791ae89e6 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sat, 29 Jun 2024 12:17:01 -0400 Subject: [PATCH 34/38] Prevent Drakes from doing gun interactions --- code/modules/projectiles/gun.dm | 9 +++++++++ code/modules/projectiles/guns/projectile/shotgun.dm | 2 ++ 2 files changed, 11 insertions(+) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 6f18ee8cdcc..cfbf0a78c32 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -649,6 +649,8 @@ . = 1 /obj/item/gun/attack_self(mob/user) + if(!user.check_dexterity(DEXTERITY_WEAPONS)) + return TRUE // prevent further interactions var/datum/firemode/new_mode = switch_firemodes() if(prob(20) && !user.skill_check(SKILL_WEAPONS, SKILL_BASIC)) new_mode = switch_firemodes() @@ -656,6 +658,8 @@ to_chat(user, "\The [src] is now set to [new_mode.name].") /obj/item/gun/proc/toggle_safety(var/mob/user) + if(user && !user.check_dexterity(DEXTERITY_WEAPONS)) + return TRUE if(!has_safety) to_chat(user,SPAN_NOTICE("You can't find a safety on \the [src]!")) return @@ -741,6 +745,11 @@ name = "Toggle Gun Safety" expected_target_type = /obj/item/gun +/decl/interaction_handler/toggle_safety/is_possible(atom/target, mob/user, obj/item/prop) + . = ..() + if(!user.check_dexterity(DEXTERITY_WEAPONS)) + return FALSE + /decl/interaction_handler/toggle_safety/invoked(atom/target, mob/user, obj/item/prop) var/obj/item/gun/gun = target gun.toggle_safety(user) diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index f91b9fc9d49..ebfa76b2031 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -30,6 +30,8 @@ return null /obj/item/gun/projectile/shotgun/pump/attack_self(mob/user) + if(!user_can_wield(user)) + return TRUE if(world.time >= recentpump + 10) pump(user) recentpump = world.time From e84da4fe78871a4907d0393f9f1e8ce0e8cd28f2 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sat, 29 Jun 2024 13:18:14 -0400 Subject: [PATCH 35/38] Add wielding dexterity check to wall attackby --- code/game/turfs/walls/wall_attacks.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/turfs/walls/wall_attacks.dm b/code/game/turfs/walls/wall_attacks.dm index 06c7269a780..349a3b305a9 100644 --- a/code/game/turfs/walls/wall_attacks.dm +++ b/code/game/turfs/walls/wall_attacks.dm @@ -307,7 +307,7 @@ /turf/wall/attackby(var/obj/item/W, var/mob/user, click_params) - if(istype(W, /obj/item/stack/tile/roof) || !user.check_dexterity(DEXTERITY_SIMPLE_MACHINES)) + if(istype(W, /obj/item/stack/tile/roof) || !user.check_dexterity(DEXTERITY_SIMPLE_MACHINES) || !W.user_can_wield(user)) return ..() if(handle_wall_tool_interactions(W, user)) From 397a7424efb78e9a9a742a23312a4775cb703819 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sat, 29 Jun 2024 13:18:49 -0400 Subject: [PATCH 36/38] Add user_can_wield to circuit assembly interactivity check --- code/modules/integrated_electronics/core/assemblies.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index 7d6b5e8f50c..e55388d3e86 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -72,7 +72,7 @@ visible_message(SPAN_DANGER("\The [src] starts to break apart!")) /obj/item/electronic_assembly/proc/check_interactivity(mob/user) - return (!user.incapacitated() && CanUseTopic(user)) + return (!user.incapacitated() && CanUseTopic(user) && user_can_wield(user)) /obj/item/electronic_assembly/GetAccess() . = list() From 3c43604bd1c95a0a19c91135d4ab3b7aedf6c34d Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sat, 29 Jun 2024 13:28:10 -0400 Subject: [PATCH 37/38] Add dexterity checks to bomb assembly interactions --- code/modules/assembly/assembly.dm | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index 09edd87fc8c..2af147ea958 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -114,17 +114,19 @@ return 0 -/obj/item/assembly/attackby(obj/item/W, mob/user) - if(isassembly(W)) - var/obj/item/assembly/A = W - if((!A.secured) && (!secured)) - attach_assembly(A,user) +/obj/item/assembly/attackby(obj/item/component, mob/user) + if(!user_can_wield(user) || !component.user_can_wield(user)) + return TRUE + if(isassembly(component)) + var/obj/item/assembly/assembly = component + if(!assembly.secured && !secured) + attach_assembly(assembly, user) return - if(IS_SCREWDRIVER(W)) + if(IS_SCREWDRIVER(component)) if(toggle_secure()) - to_chat(user, "\The [src] is ready!") + to_chat(user, SPAN_NOTICE("\The [src] is ready!")) else - to_chat(user, "\The [src] can now be attached!") + to_chat(user, SPAN_NOTICE("\The [src] can now be attached!")) return ..() return @@ -144,10 +146,13 @@ /obj/item/assembly/attack_self(mob/user) - if(!user) return 0 + if(!user) // is this check even necessary outside of admin proccalls? + return FALSE + if(!user_can_wield(user)) + return TRUE user.set_machine(src) interact(user) - return 1 + return TRUE /obj/item/assembly/interact(mob/user) return //HTML MENU FOR WIRES GOES HERE From c227742d01fad272484ecda62276a67d3b44031f Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Tue, 2 Jul 2024 00:41:10 +0000 Subject: [PATCH 38/38] Automatic changelog generation [ci skip] --- html/changelog.html | 8 -------- 1 file changed, 8 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index f16350b9bbd..61796b46617 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -142,14 +142,6 @@

    MistakeNot4892 updated:

  • Gibbing mobs or bodyparts will now drop usable meat and bone.
  • You can now craft hand axes.
  • - -

    30 April 2024

    -

    MistakeNot4892 updated:

    -
      -
    • Growns can be processed into different forms based on the grown. Apples will be sliced, potatoes will be turned into sticks, and carrots will be chopped. You can also turn sticks into chopped veggies by using a knife again.
    • -
    • You can now extract seeds from growns using Botany skill and a sharp knife.
    • -
    • Potatoes can be planted directly without extracting seeds.
    • -