diff --git a/baystation12.dme b/baystation12.dme index badce9b0cf8..2a1b2cf7956 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -58,6 +58,7 @@ #include "code\__defines\lighting.dm" #include "code\__defines\lists.dm" #include "code\__defines\machinery.dm" +#include "code\__defines\magic.dm" #include "code\__defines\mapping.dm" #include "code\__defines\materials.dm" #include "code\__defines\math_physics.dm" @@ -908,6 +909,7 @@ #include "code\game\objects\effects\gibs.dm" #include "code\game\objects\effects\item_pickup_ghost.dm" #include "code\game\objects\effects\landmarks.dm" +#include "code\game\objects\effects\magic_orb.dm" #include "code\game\objects\effects\manifest.dm" #include "code\game\objects\effects\mines.dm" #include "code\game\objects\effects\misc.dm" @@ -1204,7 +1206,7 @@ #include "code\game\objects\structures\bedsheet_bin.dm" #include "code\game\objects\structures\catwalk.dm" #include "code\game\objects\structures\charge_pylon.dm" -#include "code\game\objects\structures\coathanger.dm" +#include "code\game\objects\structures\coatrack.dm" #include "code\game\objects\structures\curtains.dm" #include "code\game\objects\structures\displaycase.dm" #include "code\game\objects\structures\dogbed.dm" @@ -2043,6 +2045,8 @@ #include "code\modules\locks\key.dm" #include "code\modules\locks\lock.dm" #include "code\modules\locks\lock_construct.dm" +#include "code\modules\mana\mana.dm" +#include "code\modules\mana\mind.dm" #include "code\modules\maps\dmm_suite.dm" #include "code\modules\maps\helper_landmarks.dm" #include "code\modules\maps\map_template.dm" @@ -2754,6 +2758,7 @@ #include "code\modules\paperwork\pen\chameleon_pen.dm" #include "code\modules\paperwork\pen\crayon.dm" #include "code\modules\paperwork\pen\fancy.dm" +#include "code\modules\paperwork\pen\magic_quill.dm" #include "code\modules\paperwork\pen\multi_pen.dm" #include "code\modules\paperwork\pen\pen.dm" #include "code\modules\paperwork\pen\reagent_pen.dm" @@ -3133,6 +3138,7 @@ #include "code\modules\species\station\skrell.dm" #include "code\modules\species\station\unathi.dm" #include "code\modules\species\station\unathi_subspecies.dm" +#include "code\modules\spellbook\_spellbook.dm" #include "code\modules\spells\_spell.dm" #include "code\modules\spells\_spell_procs.dm" #include "code\modules\spells\artifacts.dm" @@ -3141,17 +3147,31 @@ #include "code\modules\spells\no_clothes.dm" #include "code\modules\spells\racial_wizard.dm" #include "code\modules\spells\spell_projectile.dm" -#include "code\modules\spells\spellbook.dm" #include "code\modules\spells\aimed\_aimed.dm" +#include "code\modules\spells\aimed\blink.dm" +#include "code\modules\spells\aimed\corpse_explosion.dm" +#include "code\modules\spells\aimed\counter_crystal.dm" +#include "code\modules\spells\aimed\dispell.dm" #include "code\modules\spells\aimed\fireball.dm" +#include "code\modules\spells\aimed\flamethrower.dm" +#include "code\modules\spells\aimed\healing.dm" +#include "code\modules\spells\aimed\mana_burn.dm" +#include "code\modules\spells\aimed\mana_drain.dm" +#include "code\modules\spells\aimed\onrush.dm" #include "code\modules\spells\aimed\passage.dm" +#include "code\modules\spells\aimed\restore_limbs.dm" +#include "code\modules\spells\aimed\spark_bolt.dm" +#include "code\modules\spells\aimed\spell_steal.dm" +#include "code\modules\spells\aimed\swap.dm" +#include "code\modules\spells\aimed\water_slash.dm" #include "code\modules\spells\aoe_turf\aoe_turf.dm" -#include "code\modules\spells\aoe_turf\blink.dm" #include "code\modules\spells\aoe_turf\charge.dm" #include "code\modules\spells\aoe_turf\disable_tech.dm" #include "code\modules\spells\aoe_turf\drain_blood.dm" #include "code\modules\spells\aoe_turf\exchange_wounds.dm" +#include "code\modules\spells\aoe_turf\fire_ring.dm" #include "code\modules\spells\aoe_turf\knock.dm" +#include "code\modules\spells\aoe_turf\random_blink.dm" #include "code\modules\spells\aoe_turf\smoke.dm" #include "code\modules\spells\aoe_turf\summons.dm" #include "code\modules\spells\aoe_turf\conjure\conjure.dm" @@ -3167,6 +3187,7 @@ #include "code\modules\spells\general\area_teleport.dm" #include "code\modules\spells\general\contract_spells.dm" #include "code\modules\spells\general\create_air.dm" +#include "code\modules\spells\general\end_of_everything.dm" #include "code\modules\spells\general\invisibility.dm" #include "code\modules\spells\general\mark_recall.dm" #include "code\modules\spells\general\portal_teleport.dm" @@ -3175,33 +3196,29 @@ #include "code\modules\spells\general\tear_veil.dm" #include "code\modules\spells\general\toggle_armor.dm" #include "code\modules\spells\general\veil_of_shadows.dm" +#include "code\modules\spells\hand\_hand.dm" +#include "code\modules\spells\hand\_hand_item.dm" +#include "code\modules\spells\hand\analyze_health.dm" #include "code\modules\spells\hand\blood_shards.dm" #include "code\modules\spells\hand\burning_grip.dm" +#include "code\modules\spells\hand\consume_magic.dm" #include "code\modules\spells\hand\entangle.dm" -#include "code\modules\spells\hand\hand.dm" -#include "code\modules\spells\hand\hand_item.dm" +#include "code\modules\spells\hand\mend_structures.dm" #include "code\modules\spells\hand\slippery_surface.dm" #include "code\modules\spells\hand\sunwrath.dm" -#include "code\modules\spells\spellbook\battlemage.dm" -#include "code\modules\spells\spellbook\cleric.dm" -#include "code\modules\spells\spellbook\druid.dm" -#include "code\modules\spells\spellbook\spatial.dm" -#include "code\modules\spells\spellbook\standard.dm" -#include "code\modules\spells\spellbook\student.dm" #include "code\modules\spells\targeted\_targeted.dm" -#include "code\modules\spells\targeted\analyze.dm" #include "code\modules\spells\targeted\blood_boil.dm" -#include "code\modules\spells\targeted\cleric_spells.dm" #include "code\modules\spells\targeted\ethereal_jaunt.dm" #include "code\modules\spells\targeted\exhude_pleasantness.dm" #include "code\modules\spells\targeted\genetic.dm" #include "code\modules\spells\targeted\glimpse_of_eternity.dm" #include "code\modules\spells\targeted\harvest.dm" +#include "code\modules\spells\targeted\healing.dm" +#include "code\modules\spells\targeted\pestilence.dm" #include "code\modules\spells\targeted\shapeshift.dm" #include "code\modules\spells\targeted\shatter_mind.dm" #include "code\modules\spells\targeted\shift.dm" #include "code\modules\spells\targeted\subjugate.dm" -#include "code\modules\spells\targeted\swap.dm" #include "code\modules\spells\targeted\torment.dm" #include "code\modules\spells\targeted\equip\_equip.dm" #include "code\modules\spells\targeted\equip\burning_touch.dm" @@ -3214,7 +3231,6 @@ #include "code\modules\spells\targeted\projectile\dumbfire.dm" #include "code\modules\spells\targeted\projectile\magic_missile.dm" #include "code\modules\spells\targeted\projectile\projectile.dm" -#include "code\modules\spells\targeted\projectile\stuncuff.dm" #include "code\modules\sprite_accessories\_accessory.dm" #include "code\modules\sprite_accessories\_accessory_facial.dm" #include "code\modules\sprite_accessories\_accessory_hair.dm" @@ -3425,6 +3441,7 @@ #include "maps\antag_spawn\ninja\ninja.dm" #include "maps\antag_spawn\wizard\wizard.dm" #include "maps\away\away_sites.dm" +#include "maps\away\wizard_den\wizard_den.dm" #include "maps\away_sites_testing\away_sites_testing_define.dm" #include "maps\example\example_define.dm" #include "maps\random_rooms\_random_room.dm" diff --git a/code/__defines/colors.dm b/code/__defines/colors.dm index 115c65a5de2..87e14f4e9f1 100644 --- a/code/__defines/colors.dm +++ b/code/__defines/colors.dm @@ -201,3 +201,6 @@ // Colors for input/hotkey panel. #define COLOR_INPUT_DISABLED "#f0f0f0" #define COLOR_INPUT_ENABLED "#d3b5b5" + +// Misc +#define COLOR_MANA "#47f0ff" diff --git a/code/__defines/dcs/signals.dm b/code/__defines/dcs/signals.dm index 28f1073ad14..deb5f616708 100644 --- a/code/__defines/dcs/signals.dm +++ b/code/__defines/dcs/signals.dm @@ -11,6 +11,12 @@ #define COMSIG_GLOB_MOB_CREATED "!mob_created" /// Mob died somewhere : (mob/living, gibbed) #define COMSIG_GLOB_MOB_DEATH "!mob_death" +/// A magic orb was picked up by a mob: (orb, mob/living) +#define COMSIG_GLOB_ORB_PICKUP "!orb_picked" +/// When spell is cast; (user, spell, targets) +#define COMSIG_GLOB_SPELL_CAST "!spell_cast" +/// When hand type spell cast_hand is called; (user, spell, target) +#define COMSIG_GLOB_SPELL_CAST_HAND "!spell_cast_hand" ////////////////////////////////////////////////////////////////// @@ -32,6 +38,15 @@ // /atom signals // /atom/movable signals +/// When an atom's Dispell() proc is called; Passes dispell strength as argument. +#define COMSIG_ATOM_MOVABLE_DISPELL "atom_dispell" +// Return value of a signal handler if dispell should be blocked +#define COMPONENT_DISPELL_BLOCKED (1 << 0) + +/// When spell is cast; (user, spell, targets) +#define COMSIG_SPELL_CAST "spell_cast" +/// When hand type spell cast_hand is called; (user, spell, target) +#define COMSIG_SPELL_CAST_HAND "spell_cast_hand" // /area signals diff --git a/code/__defines/gamemode.dm b/code/__defines/gamemode.dm index ed102688765..3f932df2bd4 100644 --- a/code/__defines/gamemode.dm +++ b/code/__defines/gamemode.dm @@ -60,46 +60,6 @@ #define DEFAULT_TELECRYSTAL_AMOUNT 130 #define IMPLANT_TELECRYSTAL_AMOUNT(x) (round(x * 0.49)) // If this cost is ever greater than half of DEFAULT_TELECRYSTAL_AMOUNT then it is possible to buy more TC than you spend -///////////////// -////WIZARD ////// -///////////////// - -/* WIZARD SPELL FLAGS */ -#define GHOSTCAST 0x1 //can a ghost cast it? -#define NEEDSCLOTHES 0x2 //does it need the wizard garb to cast? Nonwizard spells should not have this -#define NEEDSHUMAN 0x4 //does it require the caster to be human? -#define Z2NOCAST 0x8 //if this is added, the spell can't be cast at centcomm -#define NO_SOMATIC 0x10 //spell will go off if the person is incapacitated or stunned -#define IGNOREPREV 0x20 //if set, each new target does not overlap with the previous one -//The following flags only affect different types of spell, and therefore overlap -//Targeted spells -#define INCLUDEUSER 0x40 //does the spell include the caster in its target selection? -#define SELECTABLE 0x80 //can you select each target for the spell? -#define NOFACTION 0x1000 //Don't do the same as our faction -#define NONONFACTION 0x2000 //Don't do people other than our faction -//AOE spells -#define IGNOREDENSE 0x40 //are dense turfs ignored in selection? -#define IGNORESPACE 0x80 //are space turfs ignored in selection? -//End split flags -#define CONSTRUCT_CHECK 0x100 //used by construct spells - checks for nullrods -#define NO_BUTTON 0x200 //spell won't show up in the HUD with this - -//invocation -#define INVOKE_SHOUT "shout" -#define INVOKE_WHISPER "whisper" -#define INVOKE_EMOTE "emote" -#define INVOKE_NONE "none" - -//upgrading -#define UPGRADE_SPEED "speed" -#define UPGRADE_POWER "power" -#define UPGRADE_TOTAL "total" - -//casting costs -#define SPELL_RECHARGE "recharge" -#define SPELL_CHARGES "charges" -#define SPELL_HOLDVAR "holdervar" - //Voting-related #define VOTE_PROCESS_ABORT 1 #define VOTE_PROCESS_COMPLETE 2 diff --git a/code/__defines/magic.dm b/code/__defines/magic.dm new file mode 100644 index 00000000000..6d9214a77a1 --- /dev/null +++ b/code/__defines/magic.dm @@ -0,0 +1,50 @@ +// Defines for dispell strengths +#define DISPELL_WEAK 1 +#define DISPELL_MEDIUM 2 +#define DISPELL_STRONG 3 +#define DISPELL_UNSTOPPABLE 4 + +// All possible spell categories. Please follow them. +#define SPELL_CATEGORY_FIRE "Fire" +#define SPELL_CATEGORY_EXPLOSIVE "Explosive" +#define SPELL_CATEGORY_HEALING "Healing" +#define SPELL_CATEGORY_MOBILITY "Mobility" +#define SPELL_CATEGORY_PASSIVE "Passive" +#define SPELL_CATEGORY_ANTIMAGIC "Anti-magic" +#define SPELL_CATEGORY_FORBIDDEN "Forbidden arts" + +// Spell flags +#define GHOSTCAST 0x1 //can a ghost cast it? +#define NEEDSCLOTHES 0x2 //does it need the wizard garb to cast? Nonwizard spells should not have this +#define NEEDSHUMAN 0x4 //does it require the caster to be human? +#define Z2NOCAST 0x8 //if this is added, the spell can't be cast at centcomm +#define NO_SOMATIC 0x10 //spell will go off if the person is incapacitated or stunned +#define IGNOREPREV 0x20 //if set, each new target does not overlap with the previous one +//The following flags only affect different types of spell, and therefore overlap +//Targeted spells +#define INCLUDEUSER 0x40 //does the spell include the caster in its target selection? +#define SELECTABLE 0x80 //can you select each target for the spell? +#define NOFACTION 0x1000 //Don't do the same as our faction +#define NONONFACTION 0x2000 //Don't do people other than our faction +//AOE spells +#define IGNOREDENSE 0x40 //are dense turfs ignored in selection? +#define IGNORESPACE 0x80 //are space turfs ignored in selection? +//End split flags +#define CONSTRUCT_CHECK 0x100 //used by construct spells - checks for nullrods +#define NO_BUTTON 0x200 //spell won't show up in the HUD with this + +// Invocation +#define INVOKE_SHOUT "shout" +#define INVOKE_WHISPER "whisper" +#define INVOKE_EMOTE "emote" +#define INVOKE_NONE "none" + +// Upgrading +#define UPGRADE_SPEED "speed" +#define UPGRADE_POWER "power" +#define UPGRADE_TOTAL "total" + +// Casting costs +#define SPELL_RECHARGE "recharge" +#define SPELL_CHARGES "charges" +#define SPELL_HOLDVAR "holdervar" diff --git a/code/_global_vars/lists/misc.dm b/code/_global_vars/lists/misc.dm index 863d3037f2d..c0d7e31fe39 100644 --- a/code/_global_vars/lists/misc.dm +++ b/code/_global_vars/lists/misc.dm @@ -1 +1,12 @@ GLOBAL_LIST_EMPTY(trusted_players) //CKeys of trusted players. + +// A global list of all available spell categories +GLOBAL_LIST_INIT(spell_categories, list( + SPELL_CATEGORY_FIRE, + SPELL_CATEGORY_EXPLOSIVE, + SPELL_CATEGORY_HEALING, + SPELL_CATEGORY_MOBILITY, + SPELL_CATEGORY_PASSIVE, + SPELL_CATEGORY_ANTIMAGIC, + SPELL_CATEGORY_FORBIDDEN, + )) diff --git a/code/_helpers/global_access.dm b/code/_helpers/global_access.dm index eac672195bf..9828bc27be1 100644 --- a/code/_helpers/global_access.dm +++ b/code/_helpers/global_access.dm @@ -297,8 +297,6 @@ return global.appearance_manager; if("area_repository") return global.area_repository; - if("artefact_feedback") - return global.artefact_feedback; if("ascii_esc") return global.ascii_esc; if("ascii_green") @@ -759,8 +757,6 @@ return global.spacevines_spawned; if("sparring_attack_cache") return global.sparring_attack_cache; - if("spells") - return global.spells; if("splatter_cache") return global.splatter_cache; if("sqladdress") @@ -1190,8 +1186,6 @@ global.appearance_manager=newval; if("area_repository") global.area_repository=newval; - if("artefact_feedback") - global.artefact_feedback=newval; if("ascii_esc") global.ascii_esc=newval; if("ascii_green") @@ -1652,8 +1646,6 @@ global.spacevines_spawned=newval; if("sparring_attack_cache") global.sparring_attack_cache=newval; - if("spells") - global.spells=newval; if("splatter_cache") global.splatter_cache=newval; if("sqladdress") @@ -1934,7 +1926,6 @@ "antag_add_finished", "appearance_manager", "area_repository", - "artefact_feedback", "ascii_esc", "ascii_green", "ascii_red", @@ -2165,7 +2156,6 @@ "sounds_cache", "spacevines_spawned", "sparring_attack_cache", - "spells", "splatter_cache", "sqladdress", "sqldb", diff --git a/code/_helpers/maths.dm b/code/_helpers/maths.dm index 64f7156a222..e8cddfefdaa 100644 --- a/code/_helpers/maths.dm +++ b/code/_helpers/maths.dm @@ -13,6 +13,8 @@ /// Value or the nearest multiple of divisor in either direction #define Roundm(value, divisor) round((value), (divisor)) +#define ATAN2(x, y) ( !(x) && !(y) ? 0 : (y) >= 0 ? arccos((x) / sqrt((x)*(x) + (y)*(y))) : -arccos((x) / sqrt((x)*(x) + (y)*(y))) ) + // min is inclusive, max is exclusive /proc/Wrap(val, min, max) var/d = max - min diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index fc2a2bd0476..7afe6b3fe29 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -511,21 +511,44 @@ Turf and target are seperate in case you want to teleport some distance from a t // result is bounded to map size // note range is non-pythagorean // used for disposal system -/proc/get_ranged_target_turf(var/atom/A, var/direction, var/range) +/proc/get_ranged_target_turf(atom/A, direction, range) var/x = A.x var/y = A.y if(direction & NORTH) y = min(world.maxy, y + range) - if(direction & SOUTH) + else if(direction & SOUTH) y = max(1, y - range) if(direction & EAST) x = min(world.maxx, x + range) - if(direction & WEST) + else if(direction & WEST) //if you have both EAST and WEST in the provided direction, then you're gonna have issues x = max(1, x - range) return locate(x,y,A.z) +/** + * Get ranged target turf, but with direct targets as opposed to directions + * + * Starts at atom A and gets the exact angle between A and target + * Moves from A with that angle, Range amount of times, until it stops, bound to map size + * Arguments: + * * A - Initial Firer / Position + * * target - Target to aim towards + * * range - Distance of returned target turf from A + * * offset - Angle offset, 180 input would make the returned target turf be in the opposite direction + */ +/proc/get_ranged_target_turf_direct(atom/A, atom/target, range, offset) + var/angle = ATAN2(target.x - A.x, target.y - A.y) + if(offset) + angle += offset + var/turf/T = get_turf(A) + for(var/i in 1 to range) + var/turf/check = locate(A.x + cos(angle) * i, A.y + sin(angle) * i, A.z) + if(!check) + break + T = check + + return T // returns turf relative to A offset in dx and dy tiles // bound to map limits diff --git a/code/datums/outfits/wizardry.dm b/code/datums/outfits/wizardry.dm index 218fa20b5f2..2d872630744 100644 --- a/code/datums/outfits/wizardry.dm +++ b/code/datums/outfits/wizardry.dm @@ -4,7 +4,7 @@ l_ear = /obj/item/device/radio/headset r_pocket = /obj/item/teleportation_scroll l_hand = /obj/item/staff - r_hand = /obj/item/spellbook + r_hand = /obj/item/spellbook/all_book_spells back = /obj/item/storage/backpack backpack_contents = list(/obj/item/storage/box = 1) hierarchy_type = /decl/hierarchy/outfit/wizard diff --git a/code/game/antagonist/outsider/wizard.dm b/code/game/antagonist/outsider/wizard.dm index 9ca6bdf2821..95e26c3675d 100644 --- a/code/game/antagonist/outsider/wizard.dm +++ b/code/game/antagonist/outsider/wizard.dm @@ -19,28 +19,28 @@ GLOBAL_DATUM_INIT(wizards, /datum/antagonist/wizard, new) faction = "wizard" base_to_load = /datum/map_template/ruin/antag_spawn/wizard -/datum/antagonist/wizard/create_objectives(var/datum/mind/wizard) +/datum/antagonist/wizard/create_objectives(datum/mind/wizard) if(!..()) return - var/kill - var/escape - var/steal - var/hijack + var/kill = FALSE + var/escape = FALSE + var/steal = FALSE + var/hijack = FALSE switch(rand(1,100)) if(1 to 30) - escape = 1 - kill = 1 + escape = TRUE + kill = TRUE if(31 to 60) - escape = 1 - steal = 1 + escape = TRUE + steal = TRUE if(61 to 99) - kill = 1 - steal = 1 + kill = TRUE + steal = TRUE else - hijack = 1 + hijack = TRUE if(kill) var/datum/objective/assassinate/kill_objective = new @@ -62,22 +62,28 @@ GLOBAL_DATUM_INIT(wizards, /datum/antagonist/wizard, new) wizard.objectives |= hijack_objective return -/datum/antagonist/wizard/update_antag_mob(var/datum/mind/wizard) +/datum/antagonist/wizard/update_antag_mob(datum/mind/wizard) ..() wizard.StoreMemory("Remember: do not forget to prepare your spells.", /decl/memory_options/system) wizard.current.real_name = "[pick(GLOB.wizard_first)] [pick(GLOB.wizard_second)]" wizard.current.SetName(wizard.current.real_name) -/datum/antagonist/wizard/equip(var/mob/living/carbon/human/wizard_mob) +/datum/antagonist/wizard/equip(mob/living/carbon/human/wizard_mob) if(!..()) - return 0 + return FALSE var/outfit_type = pick(subtypesof(/decl/hierarchy/outfit/wizard)) var/decl/hierarchy/outfit/wizard_outfit = outfit_by_type(outfit_type) wizard_outfit.equip(wizard_mob) - return 1 + // Gives high mana & spell points + wizard_mob.mind.mana.mana_level_max = 100 + wizard_mob.mind.mana.mana_level = 100 + wizard_mob.mind.mana.mana_recharge_speed = 2 + wizard_mob.mind.mana.spell_points = 15 // Should allow wizard to buy 2-3 dangerous spells, or a bunch of small stuff + + return TRUE /datum/antagonist/wizard/print_player_summary() ..() @@ -102,28 +108,24 @@ GLOBAL_DATUM_INIT(wizards, /datum/antagonist/wizard, new) for(var/datum/spell/spell_to_remove in mind.learned_spells) remove_spell(spell_to_remove) -obj/item/clothing +/obj/item/clothing var/wizard_garb = FALSE -// Does this clothing slot count as wizard garb? (Combines a few checks) -/proc/is_wiz_garb(var/obj/item/clothing/C) +// Does this clothing slot count as wizard garb? +/proc/is_wiz_garb(obj/item/clothing/C) return istype(C) && C.wizard_garb -/*Checks if the wizard is wearing the proper attire. -Made a proc so this is not repeated 14 (or more) times.*/ +// Checks if the wizard is wearing the proper attire. +// Made a proc so this is not repeated 14 (or more) times. /mob/proc/wearing_wiz_garb() to_chat(src, "Silly creature, you're not a human. Only humans can cast this spell.") - return 0 + return FALSE -// Humans can wear clothes. /mob/living/carbon/human/wearing_wiz_garb() - if(!is_wiz_garb(src.wear_suit) && (!src.species.hud || (slot_wear_suit in src.species.hud.equip_slots))) - to_chat(src, "I don't feel strong enough without my robe.") - return 0 - if(!is_wiz_garb(src.shoes) && (!species.hud || (slot_shoes in src.species.hud.equip_slots))) - to_chat(src, "I don't feel strong enough without my sandals.") - return 0 - if(!is_wiz_garb(src.head) && (!species.hud || (slot_head in src.species.hud.equip_slots))) - to_chat(src, "I don't feel strong enough without my hat.") - return 0 - return 1 + if(!is_wiz_garb(wear_suit) && (!species.hud || (slot_wear_suit in species.hud.equip_slots))) + to_chat(src, SPAN_WARNING("I don't feel strong enough without my robe.")) + return FALSE + if(!is_wiz_garb(head) && (!species.hud || (slot_head in species.hud.equip_slots))) + to_chat(src, SPAN_WARNING("I don't feel strong enough without my hat.")) + return FALSE + return TRUE diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 9b87b564d0f..b3af9fb07e2 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -348,3 +348,9 @@ /// Handles special effects of item being removed from "implants" of a mob /atom/movable/proc/ImplantRemoval(mob/user) return + +/// The effect of being affected by dispells, either a projectile or AOE effects +/atom/movable/proc/Dispell(dispell_strength = DISPELL_WEAK) + if(SEND_SIGNAL(src, COMSIG_ATOM_MOVABLE_DISPELL, dispell_strength) & COMPONENT_DISPELL_BLOCKED) + return FALSE + return TRUE diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index e252b426b0c..27bc1eb1b67 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -38,7 +38,18 @@ ) restore_health(5) return - ..() + return ..() + +/obj/structure/cult/pylon/handle_death_change(new_death_state) + . = ..() + if(new_death_state) + Shatter() + +/obj/structure/cult/pylon/proc/Shatter(display_message = TRUE) + playsound(src, "shatter", 70, 1) + if(display_message) + visible_message("\The [src] shatters!") + qdel(src) /obj/structure/cult/tome name = "Desk" diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index eed79b1a7b5..f3ee5d76c5b 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -53,6 +53,11 @@ var/psi_latency_chance = 2 // Chance of an additional psi latency, if any. var/give_psionic_implant_on_join = FALSE // If psionic, will be implanted for control. + /// Chance to start with increased mana pool + var/higher_mana_chance = 2 + /// Chance to start with increased spell points + var/higher_spell_points_chance = 2 + var/use_species_whitelist // If set, restricts the job to players with the given species whitelist. This does NOT restrict characters joining as the job to the species itself. var/require_whitelist // If set to a string, requires a separate whitelist entry to use the job equal to the given string. Note: If not-null the check happens, so please don't set unless you want the whitelist. @@ -101,6 +106,13 @@ imp.part = affected to_chat(H, SPAN_DANGER("As a registered psionic, you are fitted with a psi-dampening control implant. Using psi-power while the implant is active will result in neural shocks and your violation being reported.")) + if(prob(higher_mana_chance)) + H.mind.mana.mana_level_max *= 2 + H.mind.mana.mana_level = H.mind.mana.mana_level_max + H.mind.mana.mana_recharge_speed *= 2 + if(prob(higher_spell_points_chance)) + H.mind.mana.spell_points += pickweight(1 = 30, 2 = 12, 3 = 4, 4 = 1) + var/decl/hierarchy/outfit/outfit = get_outfit(H, alt_title, branch, grade) if(outfit) . = outfit.equip(H, title, alt_title) diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index 78e1dca7dcb..b6d8ab2e4c6 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -322,6 +322,30 @@ steam.start() -- spawns the effect R.updatehealth() return +///////////////////////////////////////////// +// Corpse Explosion Bloody Smoke +///////////////////////////////////////////// + +/obj/effect/effect/smoke/bloody + name = "bloody mist" + color = "#c80000" + +/obj/effect/effect/smoke/bloody/Move() + ..() + for(var/mob/living/carbon/human/R in get_turf(src)) + affect(R) + +/obj/effect/effect/smoke/bloody/affect(mob/living/carbon/human/R) + if(!..()) + return FALSE + if(R.wear_mask != null) + return FALSE + + R.confused = max(R.confused, 3) + if(prob(25)) + R.vomit(rand(2, 15), 5) + return + ///////////////////////////////////////////// // Smoke spread ///////////////////////////////////////////// @@ -381,6 +405,9 @@ steam.start() -- spawns the effect smoke_type = /obj/effect/effect/smoke/mustard +/datum/effect/effect/system/smoke_spread/bloody + smoke_type = /obj/effect/effect/smoke/bloody + ///////////////////////////////////////////// //////// Attach an Ion trail to any object, that spawns when it moves (like for the jetpack) /// just pass in the object to attach it to in set_up diff --git a/code/game/objects/effects/magic_orb.dm b/code/game/objects/effects/magic_orb.dm new file mode 100644 index 00000000000..e8595bfdcfc --- /dev/null +++ b/code/game/objects/effects/magic_orb.dm @@ -0,0 +1,86 @@ +/obj/effect/magic_orb + name = "orb of wonders" + desc = "A radiating magic orb. What potential does it hold?" + icon = 'icons/effects/magic_orb.dmi' + icon_state = "orb" + anchored = TRUE + particles = new /particles/magic_orb + var/datum/sound_token/sound_token + var/sound_id + var/ambient_sound = 'sound/magic/orb_ambience.ogg' + +/obj/effect/magic_orb/Initialize() + . = ..() + if(!ambient_sound) + return + sound_id = "[type]_[sequential_id(/obj/effect/magic_orb)]" + sound_token = GLOB.sound_player.PlayLoopingSound(src, sound_id, ambient_sound, 50, 14, 4) + +/obj/effect/magic_orb/Destroy() + QDEL_NULL(sound_token) + sound_token = null + return ..() + +/obj/effect/magic_orb/attack_hand(mob/living/user) + if(QDELETED(src)) // Should not be possible, but imagine + return + if(!CanUseOrb(user)) + return + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_ORB_PICKUP, src, user) + playsound(src, 'sound/magic/orb_pickup.ogg', 100, FALSE, 10, 3) + var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(loc, dir, src, 10) + animate(D, alpha = 0, color = "#aaaaff", transform = matrix()*1.5, time = 10) + OrbEffect(user) + qdel(src) + return + +/obj/effect/magic_orb/proc/CanUseOrb(mob/living/user) + return TRUE + +/obj/effect/magic_orb/proc/OrbEffect(mob/living/user) + return + +/obj/effect/magic_orb/attackby(obj/item/thing, mob/user) + return + +// Grants the user some spell points +/obj/effect/magic_orb/spell_points + name = "orb of knowledge" + /// Amount of spell points granted to the user + var/spell_points = 10 + +/obj/effect/magic_orb/spell_points/CanUseOrb(mob/living/user) + if(!user.mind) + return FALSE + if(!user.mind.mana) + return FALSE + return ..() + +/obj/effect/magic_orb/spell_points/OrbEffect(mob/living/user) + user.mind.mana.spell_points += spell_points + show_blurb(user.client, (5 SECONDS), "The knowledge sinks into your mind...", 10, typeout = FALSE) + flash_color(user, COLOR_DIAMOND, 10) + return + +// Grants the user additional mana level and regeneration +/obj/effect/magic_orb/mana + name = "orb of power" + /// Amount of max mana level that is added + var/mana_level = 20 + /// How much mana regeneration is added + var/mana_regeneration = 0.5 + +/obj/effect/magic_orb/mana/CanUseOrb(mob/living/user) + if(!user.mind) + return FALSE + if(!user.mind.mana) + return FALSE + return ..() + +/obj/effect/magic_orb/mana/OrbEffect(mob/living/user) + user.mind.mana.mana_level_max += mana_level + user.mind.mana.mana_level = user.mind.mana.mana_level_max + user.mind.mana.mana_recharge_speed += mana_regeneration + show_blurb(user.client, (5 SECONDS), "The power invigorates your mind...", 10, typeout = FALSE) + flash_color(user, COLOR_DIAMOND, 10) + return diff --git a/code/game/objects/effects/particles/particles.dm b/code/game/objects/effects/particles/particles.dm index 134bcc683ad..b5cf592fd36 100644 --- a/code/game/objects/effects/particles/particles.dm +++ b/code/game/objects/effects/particles/particles.dm @@ -139,6 +139,21 @@ drift = generator("circle", 0.4, NORMAL_RAND) velocity = generator("circle", 0, 3, NORMAL_RAND) +/particles/magic_orb + width = 500 + height = 500 + count = 2000 + spawning = 20 + lifespan = 1 SECONDS + fade = 1 SECONDS + position = generator("circle", 16, 20, NORMAL_RAND) + velocity = generator("circle", 0, 3, NORMAL_RAND) + friction = 0.3 + gradient = list(0, COLOR_DIAMOND, 0.75, COLOR_BLUE_LIGHT) + color_change = 0.1 + color = 0 + drift = generator("circle", 0.1, NORMAL_RAND) + //Spawner object //Maybe we could pool them in and out /obj/particle_emitter diff --git a/code/game/objects/effects/temporary.dm b/code/game/objects/effects/temporary.dm index 020c568d7a8..59dbd3cea6b 100644 --- a/code/game/objects/effects/temporary.dm +++ b/code/game/objects/effects/temporary.dm @@ -82,14 +82,14 @@ desc = "It's a decoy!" duration = 15 -/obj/effect/temp_visual/decoy/Initialize(mapload, setdir, atom/mimiced_atom, modified_duration = 15) +/obj/effect/temp_visual/decoy/Initialize(mapload, set_dir, atom/mimiced_atom, modified_duration = 15) duration = modified_duration . = ..() alpha = initial(alpha) if(mimiced_atom) name = mimiced_atom.name appearance = mimiced_atom.appearance - set_dir(setdir) + set_dir(set_dir) mouse_opacity = 0 // Used in place of old /obj/effect/temporary where applicable. @@ -155,3 +155,44 @@ /obj/effect/temp_visual/bite/proc/FadeOut() animate(src, alpha = 0, (duration * 0.2)) + +// Used by pestilence spell +/obj/effect/temp_visual/pestilence_glow + name = "pestilence" + icon_state = "greenglow" + icon = 'icons/effects/effects.dmi' + alpha = 125 + opacity = FALSE + anchored = TRUE + mouse_opacity = FALSE + layer = ABOVE_HUMAN_LAYER + + duration = 1 SECONDS + + var/max_spread_pixels = 16 + +/obj/effect/temp_visual/pestilence_glow/Initialize() + . = ..() + pixel_x = rand(-4, 4) + pixel_y = rand(-4, 4) + animate(src, alpha = 0, pixel_x = pixel_x + rand(-max_spread_pixels, max_spread_pixels), pixel_y = pixel_y + rand(-max_spread_pixels, max_spread_pixels), duration, easing = EASE_IN) + +// The one spreading from the user +/obj/effect/temp_visual/pestilence_glow/self + duration = 5 SECONDS + max_spread_pixels = 64 + +/obj/effect/temp_visual/slash + name = "slash" + icon_state = "slash" + icon = 'icons/effects/effects.dmi' + alpha = 25 + opacity = FALSE + anchored = TRUE + mouse_opacity = FALSE + layer = ABOVE_HUMAN_LAYER + + duration = 1 SECONDS + +/obj/effect/temp_visual/slash/proc/FadeOut() + animate(src, alpha = 0, time = 5) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 7eef2c2d658..fa1a0f0e44c 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -89,6 +89,9 @@ var/attack_ignore_harm_check = FALSE + // Certain items may have mana stored in them, i.e. wands and mana crystals + var/datum/mana/mana = null + /obj/item/New() ..() if(randpixel && (!pixel_x && !pixel_y) && isturf(loc)) //hopefully this will prevent us from messing with mapper-set pixel_x/y diff --git a/code/game/objects/structures/coathanger.dm b/code/game/objects/structures/coatrack.dm similarity index 100% rename from code/game/objects/structures/coathanger.dm rename to code/game/objects/structures/coatrack.dm diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 69e425e8ddc..e172c011581 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -103,8 +103,8 @@ /turf/simulated/floor/is_floor() return TRUE -/turf/simulated/IgniteTurf(power, fire_colour) +/turf/simulated/IgniteTurf(power, fire_colour, fire_type = /obj/effect/turf_fire) if(turf_fire) turf_fire.AddPower(power) return - new /obj/effect/turf_fire(src, power, fire_colour) + return new fire_type(src, power, fire_colour) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index cd57c316431..12619a0a6cf 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -388,5 +388,5 @@ var/const/enterloopsanity = 100 LAZYREMOVE(dangerous_objects, O) UNSETEMPTY(dangerous_objects) // This nulls the list var if it's empty. -/turf/proc/IgniteTurf(power, fire_colour) +/turf/proc/IgniteTurf(power, fire_colour, fire_type = /obj/effect/turf_fire) return diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index b4223875fe4..279d55e082c 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -941,7 +941,7 @@ var/list/admin_verbs_mentors = list( if(!check_rights(R_FUN)) return - var/datum/spell/S = input("Choose the spell to give to that guy", "ABRAKADABRA") as null|anything in spells + var/datum/spell/S = input("Choose the spell to give to that guy", "ABRAKADABRA") as null|anything in GLOB.spells_by_categories if(!S) return T.add_spell(new S) diff --git a/code/modules/codex/entries/spells.dm b/code/modules/codex/entries/spells.dm index 55ad5025394..2fd8b09d787 100644 --- a/code/modules/codex/entries/spells.dm +++ b/code/modules/codex/entries/spells.dm @@ -49,67 +49,3 @@ /datum/codex_entry/heal_target associated_paths = list(/datum/spell/targeted/heal_target) antag_text = "Grants you the ability to heal yourself or a nearby target slightly." - -/datum/codex_entry/create_air/tower - associated_paths = list(/datum/spell/create_air/tower) - antag_text = "Allows you to generate a livable atmosphere in the area you are in." - -/datum/codex_entry/acid_spray/tower - associated_paths = list(/datum/spell/acid_spray/tower) - antag_text = "The simplest form of aggressive conjuration: acid spray is quite effective in melting both man and object." - -/datum/codex_entry/forcewall/tower - associated_paths = list(/datum/spell/aoe_turf/conjure/forcewall/tower) - antag_text = "A temporary invincible wall for you to summon." - -/datum/codex_entry/faithful_hound/tower - associated_paths = list(/datum/spell/aoe_turf/conjure/faithful_hound/tower) - antag_text = "This spell allows you to summon a singular spectral dog that guards the nearby area. Anyone without the password is barked at or bitten." - -/datum/codex_entry/dyrnwyn/tower - associated_paths = list(/datum/spell/targeted/equip_item/dyrnwyn/tower) - antag_text = "This spell allows you to summon a golden firey sword for a short duration." - -/datum/codex_entry/shield/tower - associated_paths = list(/datum/spell/targeted/equip_item/shield/tower) - antag_text = "This spell allows you to summon a magical shield for a short duration." - -/datum/codex_entry/fireball/tower - associated_paths = list(/datum/spell/aimed/fireball/tower) - antag_text = "Imbue yourself with the power of exploding fire." - -/datum/codex_entry/force_portal/tower - associated_paths = list(/datum/spell/aoe_turf/conjure/force_portal/tower) - antag_text = "This spell allows you to summon a force portal. Anything that hits the portal gets sucked inside and is then thrown out when the portal explodes." - -/datum/codex_entry/slippery_surface/tower - associated_paths = list(/datum/spell/hand/slippery_surface/tower) - antag_text = "Allows you to slicken a small patch of floor. Anyone without sure-footing will find it hard to stay upright." - -/datum/codex_entry/smoke/tower - associated_paths = list(/datum/spell/aoe_turf/smoke/tower) - antag_text = "Allows you to distill the nearby air into smoke." - -/datum/codex_entry/knock/tower - associated_paths = list(/datum/spell/aoe_turf/knock/tower) - antag_text = "Allows you to open nearby doors without the keys." - -/datum/codex_entry/burning_grip/tower - associated_paths = list(/datum/spell/hand/burning_grip/tower) - antag_text = "Allows you cause an object to heat up intensly in someone's hand, making them drop it and whatever skin is attached." - -/datum/codex_entry/ethereal_jaunt/tower - associated_paths = list(/datum/spell/targeted/ethereal_jaunt/tower) - antag_text = "Allows you to liquify for a short duration, letting them pass through all dense objects." - -/datum/codex_entry/heal_target/tower - associated_paths = list(/datum/spell/targeted/heal_target/tower) - antag_text = "Allows you to heal yourself, or others, for a slight amount." - -/datum/codex_entry/heal_target/major/tower - associated_paths = list(/datum/spell/targeted/heal_target/major/tower) - antag_text = "Allows you to heal others for a great amount." - -/datum/codex_entry/heal_target/area/tower - associated_paths = list(/datum/spell/targeted/heal_target/area/tower) - antag_text = "Allows you to heal everyone in an area for minor damage." \ No newline at end of file diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css index b0c460d900e..ab77b8aa5b2 100644 --- a/code/modules/goonchat/browserassets/css/browserOutput.css +++ b/code/modules/goonchat/browserassets/css/browserOutput.css @@ -331,8 +331,10 @@ h1.alert, h2.alert {color: #a4bad6;} .passive {color: #660000;} .danger {color: #c51e1e; font-weight: bold;} -.warning {color: #c51e1e; font-style: italic;} -.subtle {color: #4343ca; font-size: 75%; font-style: italic;} +.userdanger {color: #c51e1e; font-weight: bold; font-size: 115%;} +.warning {color: #c5371e; font-style: italic;} +.bigwarning {color: #c5371e; font-style: italic; font-size: 115%;} +.subtle {color: #4343ca; font-size: 75%; font-style: italic;} .boldannounce {color: #c51e1e; font-weight: bold;} .rose {color: #ff5050;} .info {color: #6685f5;} @@ -340,7 +342,9 @@ h1.alert, h2.alert {color: #a4bad6;} .notice {color: #6685f5;} .mentor {color: #e236d8;} .alium {color: #00ff00;} -.cult {color: #aa1c1c;} +.cult {color: #aa1c1c; font-weight: bold; font-style: italic;} +.cultannounce {color: #aa1c1c; font-style: italic; font-size: 175%;} +.mfauna {color: #c15d2c; font-weight: bold; font-size: 125%;} /* Languages */ .alien {color: #855d85;} @@ -363,6 +367,7 @@ h1.alert, h2.alert {color: #a4bad6;} .chinese {color: #d4a52a;} .indian {color: #634c81;} .iberian {color: #be4ac9;} +.latin {color: #c25396;} .interface {color: #750e75;} diff --git a/code/modules/goonchat/browserassets/css/browserOutput_white.css b/code/modules/goonchat/browserassets/css/browserOutput_white.css index 8a33c7871e8..ef0dcb15c3e 100644 --- a/code/modules/goonchat/browserassets/css/browserOutput_white.css +++ b/code/modules/goonchat/browserassets/css/browserOutput_white.css @@ -328,8 +328,10 @@ h1.alert, h2.alert {color: #000080;} .passive {color: #660000;} .danger {color: #ff0000; font-weight: bold;} -.warning {color: #ff0000; font-style: italic;} -.subtle {color: #000099; font-size: 75%; font-style: italic;} +.userdanger {color: #ff0000; font-weight: bold; font-size: 115%;} +.warning {color: #ff3300; font-style: italic;} +.bigwarning {color: #ff3300; font-style: italic; font-size: 115%;} +.subtle {color: #000099; font-size: 75%; font-style: italic;} .boldannounce {color: #ff0000; font-weight: bold;} .rose {color: #ff5050;} .info {color: #0000CC;} @@ -337,7 +339,9 @@ h1.alert, h2.alert {color: #000080;} .notice {color: #000099;} .mentor {color: #e236d8;} .alium {color: #00ff00;} -.cult {color: #800080; font-weight: bold; font-style: italic;} +.cult {color: #800080; font-weight: bold; font-style: italic;} +.cultannounce {color: #800080; font-style: italic; font-size: 175%;} +.mfauna {color: #884422; font-weight: bold; font-size: 125%;} /* Languages */ .alien {color: #855d85;} @@ -360,6 +364,7 @@ h1.alert, h2.alert {color: #000080;} .chinese {color: #d4a52a;} .indian {color: #634c81;} .iberian {color: #be4ac9;} +.latin {color: #c25396;} .interface {color: #750e75;} diff --git a/code/modules/mana/mana.dm b/code/modules/mana/mana.dm new file mode 100644 index 00000000000..9ac5e136cdc --- /dev/null +++ b/code/modules/mana/mana.dm @@ -0,0 +1,56 @@ +// Stores mana-related things and spell points +/datum/mana + var/mana_level = 10 + var/mana_level_max = 10 + /// Amount of mana restored per second + var/mana_recharge_speed = 0.25 + var/recharging = FALSE + /// Personal spell points used for purchasing spells + var/spell_points = 2 + +/datum/mana/proc/UseMana(mob/user, amount = 0, silent = TRUE) + if(mana_level < amount) + if(!silent && user) + to_chat(user, SPAN_WARNING("You do not have enough mana!")) + return FALSE + mana_level = clamp(mana_level - amount, 0, mana_level_max) + // We attempt to start recharge any time mana is used + StartRecharge() + return TRUE + +/datum/mana/proc/AddMana(amount = 0) + mana_level = clamp(mana_level + amount, 0, mana_level_max) + return TRUE + +// Starts a "process" of recharging if we should and can +/datum/mana/proc/StartRecharge() + if(recharging) + return FALSE + if(mana_level >= mana_level_max) + return FALSE + recharging = TRUE + RechargeMana() + return TRUE + +/datum/mana/proc/RechargeMana() + if(!recharging) + return FALSE + if(mana_level >= mana_level_max) + recharging = FALSE + return FALSE + AddMana(mana_recharge_speed * 0.5) + addtimer(CALLBACK(src, .proc/RechargeMana), (0.5 SECONDS)) + return TRUE + +/* Helpers procs */ +/proc/GetManaDatum(atom/target) + if(istype(target, /mob)) + var/mob/M = target + if(istype(M.mind)) + return M.mind.mana + // Certain items may store mana + if(istype(target, /obj/item)) + var/obj/item/I = target + if(istype(I.mana)) + return I.mana + return null diff --git a/code/modules/mana/mind.dm b/code/modules/mana/mind.dm new file mode 100644 index 00000000000..a96c82f4b6d --- /dev/null +++ b/code/modules/mana/mind.dm @@ -0,0 +1,11 @@ +/datum/mind + var/datum/mana/mana = /datum/mana + +/datum/mind/New() + . = ..() + if(ispath(mana)) + mana = new mana() + +/datum/mind/Destroy() + QDEL_NULL(mana) + . = ..() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 74006e3b125..6f5848d94fe 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -934,3 +934,28 @@ default behaviour is: /mob/living/proc/jump_layer_shift_end() jumping = FALSE reset_layer() + +// If mob has an aimed spell prepared to cast - deactivates it. +// Additionally, puts random spells on cooldown. +/mob/living/Dispell(dispell_strength = DISPELL_WEAK) + . = ..() + if(!.) + return + if(!mind || !LAZYLEN(mind.learned_spells)) + return + var/play_sound = FALSE + // It could also be non-aimed, but we should add the deactivation part to other spells then + if(istype(ranged_ability, /datum/spell/aimed)) + var/datum/spell/aimed/AS = ranged_ability + AS.remove_ranged_ability(SPAN_DANGER("[ranged_ability] has been dispelled!")) + AS.on_deactivation(src) + play_sound = TRUE + for(var/datum/spell/S in mind.learned_spells) + if(!prob(dispell_strength * 25)) + continue + S.charge_counter = min(S.charge_counter, S.charge_max * (rand(2, 5) * 0.1)) + S.process() + to_chat(src, SPAN_WARNING("[S] has been dispelled and put on cooldown!")) + play_sound = TRUE + if(play_sound) + playsound(get_turf(src), 'sound/magic/blind.ogg', 50, TRUE) diff --git a/code/modules/paperwork/pen/fancy.dm b/code/modules/paperwork/pen/fancy.dm index 60d6c6d9069..f462b4c2090 100644 --- a/code/modules/paperwork/pen/fancy.dm +++ b/code/modules/paperwork/pen/fancy.dm @@ -10,4 +10,5 @@ /obj/item/pen/fancy/quill name = "dire goose quill" desc = "A quill fashioned from a feather of the dire goose makes an excellent writing instrument, as well as a valuable trophy." + icon_state = "quill" matter = null \ No newline at end of file diff --git a/code/modules/paperwork/pen/magic_quill.dm b/code/modules/paperwork/pen/magic_quill.dm new file mode 100644 index 00000000000..9363ed62afc --- /dev/null +++ b/code/modules/paperwork/pen/magic_quill.dm @@ -0,0 +1,6 @@ +/obj/item/pen/fancy/quill/magic + name = "magic quill" + desc = "A quill fashioned from a feather of unknown creature and fit with mana crystal. Makes an excellent writing instrument, but its main use is much more arcane." + icon_state = "magic_quill" + colour = COLOR_SABER_PURPLE + color_description = "glowing purple matter" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm index 7df464f8405..d707fd88b63 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm @@ -805,3 +805,18 @@ /datum/reagent/vaccine/mix_data(list/newdata, newamount) if(istype(newdata)) src.data |= newdata.Copy() + +/datum/reagent/concentrated_mana + name = "Concentrated Mana" + description = "A mysterious liquid used by magic-fluent people to restore their internal mana reserves. \ + Can also be used in certain tools that utilize magic phenomenon." + taste_description = "cool air" + reagent_state = LIQUID + color = COLOR_MANA + +/datum/reagent/concentrated_mana/affect_blood(mob/living/carbon/human/H, alien, removed) + if(!ishuman(H)) + return + if(!H.mind || !H.mind?.mana) + return + H.mind.mana.AddMana(2) diff --git a/code/modules/research/part_replacer.dm b/code/modules/research/part_replacer.dm index 6fc0242e44b..9bb723862ad 100644 --- a/code/modules/research/part_replacer.dm +++ b/code/modules/research/part_replacer.dm @@ -29,7 +29,7 @@ if(istype(target, /obj/machinery)) var/obj/machinery/machine = target if(machine.component_attackby(src, user)) - user.Beam(machine, icon_state = "rped_upgrade", icon = 'icons/effects/effects.dmi', time = 5) + user.Beam(machine, icon_state = "rped_upgrade", time = 5) /obj/item/storage/part_replacer/bluespace name = "bluespace rapid part exchange device" diff --git a/code/modules/spellbook/_spellbook.dm b/code/modules/spellbook/_spellbook.dm new file mode 100644 index 00000000000..ef960d7f3c9 --- /dev/null +++ b/code/modules/spellbook/_spellbook.dm @@ -0,0 +1,408 @@ +// Assoc list of spell types and their categories +GLOBAL_LIST_EMPTY(spells_by_categories) + +// Does exactly what it says: Unless dispelled, only wizards can use it. +#define WIZARD_ONLY 1 +// Only apprentices can use it +#define APPRENTICE_ONLY 2 +// Anyone can use it, owner won't be selected +#define NO_OWNER 4 + +/obj/item/spellbook + name = "spell book" + desc = "A rare magical artifact that engraves spells in the mind of its user." + icon = 'icons/obj/library.dmi' + icon_state = "book" + throw_speed = 1 + throw_range = 3 + w_class = ITEM_SIZE_NORMAL + var/temp = null + var/book_flags = 0 + /// Current owner of the book, none other than them can use it; Can be dispelled to remove that and other locks. + var/mob/owner = null + /// List of shown spells. + var/list/allowed_spells = list() + /// Currently applied spell categories that will be shown; If none - all spells are shown. + var/list/spell_categories = list() + /// Defines how strong the dispell must be to successfuly remove the restrictions. + var/dispell_resistance = 0 + /// List of people that contributed to the list of spells in it. + var/list/authors = list() + +/obj/item/spellbook/Initialize() + . = ..() + // Create the global list if empty + if(!LAZYLEN(GLOB.spells_by_categories)) + for(var/spell_type in subtypesof(/datum/spell)) + var/datum/spell/S = new spell_type() + GLOB.spells_by_categories[S.type] = S.categories + qdel(S) + +/obj/item/spellbook/Destroy() + RemoveOwner() + return ..() + +/obj/item/spellbook/attack_self(mob/living/user) + if(!user.mind) + return + if(!user.mind.mana) + to_chat(user, SPAN_WARNING("You cannot see anything in the book...")) + return + if(user.mind.special_role != ANTAG_WIZARD && (book_flags & WIZARD_ONLY)) + to_chat(user, SPAN_WARNING("The book refuses to open for you!")) + return + if(user.mind.special_role != ANTAG_APPRENTICE && (book_flags & APPRENTICE_ONLY)) + to_chat(user, SPAN_WARNING("The book refuses to open for you!")) + return + if(!(book_flags & NO_OWNER) && owner && user != owner) + to_chat(user, SPAN_WARNING("The book refuses to open for you!")) + return + if(!owner && !(book_flags & NO_OWNER)) + to_chat(user, SPAN_NOTICE("The book starts to glow...")) + if(!do_after(user, 5 SECONDS, src)) + to_chat(user, SPAN_NOTICE("The book falls silent.")) + return + to_chat(user, SPAN_NOTICE("The spell book is now bound to your soul!")) + SetOwner(user) + return + + interact(user) + +/obj/item/spellbook/examine(mob/user) + . = ..() + if(LAZYLEN(authors)) + to_chat(user, SPAN_NOTICE("The book was written by [english_list(authors)].")) + +/obj/item/spellbook/interact(mob/living/user) + var/dat = null + dat += "Your spell power: [user.mind.mana.spell_points].
" + dat += "Your mana level: [user.mind.mana.mana_level] / [user.mind.mana.mana_level_max].
" + dat += "Applied categories: [english_list(spell_categories, "None")].
" + dat += "
" + for(var/spell_type in allowed_spells) + var/datum/spell/S = spell_type + var/list/combined_list = GLOB.spells_by_categories[spell_type] & spell_categories + if(LAZYLEN(spell_categories) && !LAZYLEN(combined_list)) + continue + + dat += "[initial(S.name)]
" + + var/datum/browser/popup = new(user, "spellbook", "Spell Book") + popup.set_content(dat) + popup.open() + +/obj/item/spellbook/attackby(obj/item/P, mob/user) + . = ..() + if(istype(P, /obj/item/pen/fancy/quill/magic)) + if(!LAZYLEN(user.mind.learned_spells)) + to_chat(user, SPAN_WARNING("You know no spells, and therefore, cannot write in \the [src]...")) + return + var/datum/mana/ML = GetManaDatum(user) + if(!istype(ML)) + // It could happen so that the quill itself has mana, let's try it + ML = GetManaDatum(P) + if(!istype(ML)) + return + + var/list/valid_spells = list("-- None --") + for(var/datum/spell/SM in user.mind.learned_spells) + if(SM.type in allowed_spells) + continue + valid_spells |= SM + var/datum/spell/S = input(user, "Which spell do you want to engrave?", "Options") as anything in valid_spells + if(!istype(S)) + return + if(!(S in user.mind.learned_spells)) + return + if(S.type in allowed_spells) + to_chat(user, SPAN_WARNING("[S.name] spell is already written in [src]!")) + return + // You need to have enough mana for the spell + if(!ML.UseMana(user, S.mana_cost)) + to_chat(user, SPAN_WARNING("You do not have enough mana to engrave [S.name] into \the [src]!")) + return + + // There we add the spell, at last + allowed_spells |= S.type + authors |= user.real_name + user.visible_message( + SPAN_NOTICE("[user] writes something in \the [src]!"), + SPAN_NOTICE("You've engraved [S.name] spell in \the [src]!"), + SPAN_NOTICE("You hear someone writing in a book."), + ) + playsound(get_turf(user),'sound/effects/pen1.ogg', 50, 1) + return + +/obj/item/spellbook/CanUseTopic(mob/M) + if(!istype(M)) + return STATUS_CLOSE + + if(!istype(M.mind)) + return STATUS_CLOSE + + if((book_flags & WIZARD_ONLY) && M.mind.special_role != ANTAG_WIZARD) + return STATUS_CLOSE + + if((book_flags & APPRENTICE_ONLY) && M.mind.special_role != ANTAG_APPRENTICE) + return STATUS_CLOSE + + if(!(book_flags & NO_OWNER) && owner && M != owner) + return STATUS_CLOSE + + return ..() + +/obj/item/spellbook/OnTopic(mob/user, href_list) + /* Normal interact topics */ + if(href_list["spell"]) + var/datum/spell/S = text2path(href_list["spell"]) + if(!ispath(S)) + return TOPIC_REFRESH + ShowSpellMenu(user, S) + return TOPIC_NOACTION + + else if(href_list["purchase"]) + var/path = text2path(href_list["purchase"]) + if(!path) + return TOPIC_NOACTION + // No duplicate spells + if(locate(path) in user.mind.learned_spells) + return TOPIC_NOACTION + SendFeedback(path) //feedback stuff + if(ispath(path, /datum/spell)) + to_chat(user, AddSpell(user, path)) + ShowSpellMenu(user, path) + else + var/obj/O = new path(get_turf(user)) + to_chat(user, SPAN_NOTICE("You have purchased \a [O].")) + //finally give it a bit of an oomf + playsound(get_turf(user),'sound/effects/phasein.ogg',50,1) + + else if(href_list["upgrade"]) + var/spell_path = text2path(href_list["upgrade"]) + var/upgrade_return = UpgradeSpell(user, spell_path, href_list["upgrade_type"]) + if(istext(upgrade_return)) + to_chat(user, upgrade_return) + ShowSpellMenu(user, spell_path) + + else if(href_list["categories"]) + var/option = "Add" + if(LAZYLEN(spell_categories)) + option = input(user, "What do you want to do?", "Options") as anything in list("Add", "Remove", "Clear") + switch(option) + if("Add") + var/list/add_list = list("-- None --") + GLOB.spell_categories - spell_categories + var/cat = input(user, "What category do you want to add?", "Add Category") as anything in add_list + if(cat && !(cat in spell_categories) && (cat in GLOB.spell_categories)) + spell_categories |= cat + if("Remove") + var/list/rem_list = list("-- None --") + spell_categories + var/cat = input(user, "What category do you want to remove?", "Remove Category") as anything in rem_list + if(cat && (cat in spell_categories)) + spell_categories -= cat + if("Clear") + spell_categories = list() + . = TOPIC_REFRESH + + interact(user) + +// Being hit with any source of dispell releases any locks +/obj/item/spellbook/Dispell(dispell_strength = DISPELL_WEAK) + . = ..() + if(!istype(owner) && !(book_flags & WIZARD_ONLY) && !(book_flags & APPRENTICE_ONLY)) + return + if(dispell_resistance > dispell_strength) + visible_message(SPAN_WARNING("\The [src] repels the surrounding dispelling magic!")) + return + visible_message(SPAN_NOTICE("\The [src] fizzles and sparks!")) + RemoveOwner() + owner = null + book_flags &= ~WIZARD_ONLY + book_flags &= ~APPRENTICE_ONLY + +// Shows a second menu for the specific spell +/obj/item/spellbook/proc/ShowSpellMenu(mob/living/user, datum/spell/S) + var/dat = null + var/datum/spell/OS = locate(S) in user.mind.learned_spells + if(!istype(OS)) + dat += "Purchase ([initial(S.spell_cost)] points)
" + else if(OS.level_max[UPGRADE_TOTAL] > 0) + var/up_count = 0 + for(var/up_type in OS.spell_levels) + up_count += OS.spell_levels[up_type] + dat += "Maximum amount of upgrades: [up_count]/[OS.level_max[UPGRADE_TOTAL]].
" + for(var/upgrade_type in OS.spell_levels) + if(OS.level_max[upgrade_type] <= 0) + continue + dat += "Current [upgrade_type] level: [OS.spell_levels[upgrade_type]]/[OS.level_max[upgrade_type]].
" + if(!OS.CanImprove(upgrade_type)) + continue + dat += "Improve [upgrade_type] ([OS.upgrade_cost[upgrade_type]] points)
" + dat += "
" + dat += "[initial(S.name)]
" + dat += "[initial(S.desc)]
" + dat += "
" + dat += "Mana cost: [initial(S.mana_cost)].
" + dat += "Categories: [english_list(GLOB.spells_by_categories[S], "None")].
" + if(initial(S.spell_flags) & NEEDSCLOTHES) + dat += "Requires wizard robes to cast." + if(initial(S.spell_flags) & NO_SOMATIC) + dat += "Can be cast while incapacitated." + + var/datum/browser/popup = new(user, "spellbook_[S]", "Spell Book - [initial(S.name)]") + popup.set_content(dat) + popup.open() + +/obj/item/spellbook/proc/SetOwner(mob/new_owner) + if(!istype(new_owner)) + return + RegisterSignal(new_owner, COMSIG_PARENT_QDELETING, .proc/RemoveOwner) + owner = new_owner + +/obj/item/spellbook/proc/RemoveOwner() + if(!istype(owner)) + return + UnregisterSignal(owner, COMSIG_PARENT_QDELETING) + // We set it to random text to prevent people from using the book after gibbing the owner + owner = "Dead owner" + +/obj/item/spellbook/proc/SendFeedback(path) + if(ispath(path, /datum/spell)) + var/datum/spell/S = path + SSstatistics.add_field_details("wizard_spell_learned","[initial(S.name)]") + else if(ispath(path, /obj)) + var/obj/O = path + SSstatistics.add_field_details("wizard_spell_learned","[initial(O.name)]") + +/obj/item/spellbook/proc/UpgradeSpell(mob/living/user, spell_path, upgrade_type = UPGRADE_POWER) + // TODO: Remove hardcoded upgrade types, and instead make it spell dependent + for(var/datum/spell/S in user.mind.learned_spells) + if(!istype(S, spell_path)) + continue + if(user.mind.mana.spell_points < S.upgrade_cost[upgrade_type]) + return SPAN_WARNING("Not enough spell points!") + if(!S.CanImprove(upgrade_type)) + return SPAN_WARNING("Cannot upgrade the spell!") + user.mind.mana.spell_points -= S.upgrade_cost[upgrade_type] + S.total_points_used += S.upgrade_cost[upgrade_type] + return S.ImproveSpell(upgrade_type) + return SPAN_DANGER("Could not locate the spell!") + +/obj/item/spellbook/proc/AddSpell(mob/living/user, spell_path) + var/datum/spell/SP = spell_path + if(user.mind.mana.spell_points < initial(SP.spell_cost)) + return SPAN_WARNING("Not enough points!") + + var/datum/spell/S = new spell_path() + user.add_spell(S) + user.mind.mana.spell_points -= S.spell_cost + return SPAN_NOTICE("You learn the spell [S]") + +/* Subtypes */ +// A spell book with EVERY spell available +/obj/item/spellbook/all_spells/Initialize() + . = ..() + for(var/spell_type in subtypesof(/datum/spell)) + var/datum/spell/S = spell_type + if(isnull(initial(S.name))) + continue + allowed_spells |= S + +// All spells available via spell book +/obj/item/spellbook/all_book_spells/Initialize() + . = ..() + for(var/spell_type in GLOB.spells_by_categories) + var/datum/spell/S = spell_type + if(isnull(initial(S.name))) + continue + if(initial(S.spell_book_visible)) + allowed_spells |= spell_type + +// A book spawned to wizard apprentices +/obj/item/spellbook/apprentice + allowed_spells = list( + /datum/spell/aoe_turf/knock, + /datum/spell/targeted/ethereal_jaunt, + /datum/spell/targeted/projectile/magic_missile, + ) + +// Free for all spell book that contains low-end spells that do not require wizard robes. +/obj/item/spellbook/minor_free + book_flags = NO_OWNER + allowed_spells = list( + /datum/spell/aoe_turf/knock, + /datum/spell/aoe_turf/random_blink, + /datum/spell/aimed/blink, + /datum/spell/aimed/heal_target, + /datum/spell/aoe_turf/exchange_wounds, + /datum/spell/aoe_turf/smoke, + ) + +// Most healing-related spells, any user +/obj/item/spellbook/healing + book_flags = NO_OWNER + allowed_spells = list( + /datum/spell/hand/analyze_health, + /datum/spell/aimed/heal_target, + /datum/spell/aimed/heal_target, + /datum/spell/aimed/heal_target/major, + /datum/spell/aimed/heal_target/trance, + /datum/spell/aimed/heal_target/sacrifice, + ) + +// List of spells per categories, to prevent generating it all the time +GLOBAL_LIST_EMPTY(random_categories_spells) + +// Randomly chosen spells by category, if any +/obj/item/spellbook/random + name = "minor spell tome" + desc = "A small magic tome with a tiny assortment of spells." + book_flags = NO_OWNER + var/list/random_categories = list() + /// How many spells are randomly chosen on creation + var/random_count = 3 + +/obj/item/spellbook/random/Initialize() + . = ..() + var/list/valid_spells = list() + if(LAZYLEN(random_categories) && (english_list(random_categories) in GLOB.random_categories_spells)) + var/list/glob_list = GLOB.random_categories_spells[english_list(random_categories)] + valid_spells = glob_list.Copy() + else + for(var/spell_type in GLOB.spells_by_categories) + if(LAZYLEN(random_categories)) + var/list/combined_list = GLOB.spells_by_categories[spell_type] & random_categories + if(!LAZYLEN(combined_list)) + continue + valid_spells += spell_type + GLOB.random_categories_spells[english_list(random_categories)] = valid_spells.Copy() + for(var/i = 1 to random_count) + if(!LAZYLEN(valid_spells)) + return + var/chosen_spell = pick(valid_spells) + allowed_spells += chosen_spell + valid_spells -= chosen_spell + +/obj/item/spellbook/random/healing + name = "minor healing tome" + desc = "A small magic tome with a tiny assortment of healing spells." + random_categories = list(SPELL_CATEGORY_HEALING) + +/obj/item/spellbook/random/healing/medium + name = "healing tome" + desc = "A small magic tome with an assortment of healing spells." + random_count = 6 + +/obj/item/spellbook/random/fire + name = "minor fire tome" + desc = "A small magic tome with a tiny assortment of fire spells." + random_categories = list(SPELL_CATEGORY_FIRE) + +/obj/item/spellbook/random/fire/medium + name = "fire tome" + desc = "A small magic tome with an assortment of fire spells." + random_count = 6 + +/obj/item/spellbook/random/antimagic + name = "antimagic tome" + desc = "A small tome containing techniques and spells used to supress magic and arcane powers." + random_categories = list(SPELL_CATEGORY_ANTIMAGIC) diff --git a/code/modules/spells/_spell.dm b/code/modules/spells/_spell.dm index 2fc35a8cd8d..c60c47df9e3 100644 --- a/code/modules/spells/_spell.dm +++ b/code/modules/spells/_spell.dm @@ -1,45 +1,69 @@ -var/list/spells = typesof(/datum/spell) //needed for the badmin verb for now - /datum/spell - var/name = "Spell" - var/desc = "A spell." - var/feedback = "" //what gets sent if this spell gets chosen by the spellbook. parent_type = /datum - var/panel = "Spells"//What panel the proc holder needs to go on. - - var/school = "evocation" //not relevant at now, but may be important later if there are changes to how spells work. the ones I used for now will probably be changed... maybe spell presets? lacking flexibility but with some other benefit? - /*Spell schools as follows: - Racial - Only tagged to spells gained for being a certain race - Conjuration - Creating an object or transporting it. - Transmutation - Modifying an object or transforming it. - Illusion - Altering perception or thought. - */ - var/charge_type = SPELL_RECHARGE //can be recharge or charges, see charge_max and charge_counter descriptions; can also be based on the holder's vars now, use "holder_var" for that - - var/charge_max = 100 //recharge time in deciseconds if charge_type = SPELL_RECHARGE or starting charges if charge_type = SPELL_CHARGES - var/charge_counter = 0 //can only cast spells if it equals recharge, ++ each decisecond if charge_type = SPELL_RECHARGE or -- each cast if charge_type = SPELL_CHARGES + var/name = null + var/desc = "A spell." + /// What panel the proc holder needs to go on. + var/panel = "Spells" + + // Spell book variables + /// List of categories for the spellbook + var/list/categories = list() + /// If TRUE - will be available via auto-generated spell book + var/spell_book_visible = TRUE + /// Amount of points required to purchase the spell + var/spell_cost = 1 + /// How many points were used for this particular spell, upgrades included + var/total_points_used = 0 + + /// Can be recharge or charges, see charge_max and charge_counter descriptions; can also be based on the holder's vars now, use "holder_var" for that + var/charge_type = SPELL_RECHARGE + /// Recharge time in deciseconds if charge_type = SPELL_RECHARGE or starting charges if charge_type = SPELL_CHARGES + var/charge_max = 100 + /// Can only cast spells if it equals recharge, ++ each decisecond if charge_type = SPELL_RECHARGE or -- each cast if charge_type = SPELL_CHARGES + var/charge_counter = 0 var/still_recharging_msg = "The spell is still recharging." + /// Amount of mana used per cast + var/mana_cost = 0 - var/silenced = 0 //not a binary - the length of time we can't cast this for - var/processing = 0 //are we processing already? Mainly used so that silencing a spell doesn't call process() again. (and inadvertedly making it run twice as fast) + /// Not a binary - the length of time we can't cast this for + var/silenced = 0 + /// Are we processing already? Mainly used so that silencing a spell doesn't call process() again. (and inadvertedly making it run twice as fast) + var/processing = 0 - var/holder_var_type = "bruteloss" //only used if charge_type equals to "holder_var" - var/holder_var_amount = 20 //same. The amount adjusted with the mob's var when the spell is used + // Only used if charge_type equals to "holder_var" + var/holder_var_type = "bruteloss" + // Same. The amount adjusted with the mob's var when the spell is used + var/holder_var_amount = 20 var/spell_flags = NEEDSCLOTHES - var/invocation = "HURP DURP" //what is uttered when the wizard casts the spell - var/invocation_type = INVOKE_NONE //can be none, whisper, shout, and emote - var/range = 7 //the range of the spell; outer radius for aoe spells - var/message = "" //whatever it says to the guy affected by it - var/selection_type = "view" //can be "range" or "view" - var/atom/movable/holder //where the spell is. Normally the user, can be an item - var/duration = 0 //how long the spell lasts - - var/list/spell_levels = list(UPGRADE_SPEED = 0, UPGRADE_POWER = 0) //the current spell levels - total spell levels can be obtained by just adding the two values - var/list/level_max = list(UPGRADE_TOTAL = 4, UPGRADE_SPEED = 4, UPGRADE_POWER = 0) //maximum possible levels in each category. Total does cover both. - var/cooldown_reduc = 0 //If set, defines how much charge_max drops by every speed upgrade + /// What is uttered when the wizard casts the spell + var/invocation = "HURP DURP" + /// Can be none, whisper, shout, and emote + var/invocation_type = INVOKE_NONE + /// The range of the spell; Outer radius for aoe spells + var/range = 7 + /// Whatever it says to the guy affected by it + var/message = "" + /// Can be "range" or "view" + var/selection_type = "view" + /// Where the spell is. Normally the user, can be an item + var/atom/movable/holder + /// How long the spell lasts + var/duration = 0 + + /// Upgrade costs for each upgrade type as seen in spell levels; If null - set to the spell's cost + /// Missing upgrade types (as seen in level_max list) are automatically filled with spell_cost as cost + var/list/upgrade_cost = list() + /// The current spell levels - total spell levels can be obtained by just adding the two values; + /// The list is auto-generated on New(), based on level_max list + var/list/spell_levels = list() + /// Maximum possible levels in each category. Total covers maximum amount of upgrades. + var/list/level_max = list(UPGRADE_TOTAL = 4, UPGRADE_SPEED = 4, UPGRADE_POWER = 0) + /// If set, defines how much charge_max drops by every speed upgrade + var/cooldown_reduc = 0 var/delay_reduc = 0 - var/cooldown_min = 0 //minimum possible cooldown for a charging spell + /// Minimum possible cooldown for a charging spell + var/cooldown_min = 0 var/overlay = 0 var/overlay_icon = 'icons/obj/wizard.dmi' @@ -47,28 +71,35 @@ var/list/spells = typesof(/datum/spell) //needed for the badmin verb for now var/overlay_lifespan = 0 var/sparks_spread = 0 - var/sparks_amt = 0 //cropped at 10 - var/smoke_spread = 0 //1 - harmless, 2 - harmful - var/smoke_amt = 0 //cropped at 10 + // Cropped at 10 + var/sparks_amt = 0 + // 1 - harmless, 2 - harmful + var/smoke_spread = 0 + // Cropped at 10 + var/smoke_amt = 0 var/critfailchance = 0 - var/time_between_channels = 0 //Delay between casts - var/number_of_channels = 1 //How many times can we channel? + // Delay between casts + var/time_between_channels = 0 + // How many times can we channel? + var/number_of_channels = 1 var/cast_delay = 1 var/cast_sound = "" - var/hud_state = "" //name of the icon used in generating the spell hud object + /// Name of the icon used in generating the spell hud object + var/hud_state = "" var/override_base = "" - var/mob/living/deity/connected_god //Do we have this spell based off a boon from a god? + // Do we have this spell based off a boon from a god? + var/mob/living/deity/connected_god var/obj/screen/connected_button var/hidden_from_codex = FALSE var/mob/living/ranged_ability_user - var/ranged_clickcd_override = -1 + var/ranged_clickcd = 10 var/active = FALSE @@ -79,8 +110,30 @@ var/list/spells = typesof(/datum/spell) //needed for the badmin verb for now /datum/spell/New() ..() + for(var/U in level_max) + if(U == UPGRADE_TOTAL) + continue + if(!(U in upgrade_cost)) + upgrade_cost[U] = spell_cost + if(!(U in spell_levels)) + spell_levels[U] = 0 + //still_recharging_msg = "[name] is still recharging." charge_counter = charge_max + total_points_used = spell_cost + +/datum/spell/Destroy() + if(isliving(holder)) + var/mob/living/L = holder + var/datum/mind/M = L.mind + if(istype(M)) + M.learned_spells -= src + if(M.last_used_spell == src) + M.last_used_spell = null + if(L.ability_master) + L.ability_master.remove_ability(L.ability_master.get_ability_by_spell(src)) + holder = null + return ..() /datum/spell/proc/process() if(processing) @@ -106,12 +159,13 @@ var/list/spells = typesof(/datum/spell) //needed for the badmin verb for now /datum/spell/proc/Click(mob/user = usr, skipcharge = 0) // When action button is pressed if(cast_check(skipcharge, user)) choose_targets(user) - return 1 + return TRUE /datum/spell/proc/choose_targets(mob/user = usr) //depends on subtype - see targeted.dm, aoe_turf.dm, dumbfire.dm, or code in general folder return -/datum/spell/proc/perform(mob/user = usr, list/targets, skipcharge = 0) //if recharge is started it is important for the trigger spells +// If recharge is started it is important for the trigger spells +/datum/spell/proc/perform(mob/user = usr, list/targets, skipcharge = FALSE) if(!holder) holder = user //just in case if(cast_delay > 1) @@ -125,11 +179,17 @@ var/list/spells = typesof(/datum/spell) //needed for the badmin verb for now if(cast_check(1,user, targets)) //we check again, otherwise you can choose a target and then wait for when you are no longer able to cast (I.E. Incapacitated) to use it. invocation(user, targets) take_charge(user, skipcharge) + TakeMana(user) before_cast(targets) //applies any overlays and effects if(prob(critfailchance)) critfail(targets, user) else cast(targets, user, time) + var/datum/mind/M = user.mind + if(istype(M)) + M.last_used_spell = src + SEND_SIGNAL(user, COMSIG_SPELL_CAST, src, targets) + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_SPELL_CAST, user, src, targets) after_cast(targets) //generates the sparks, smoke, target messages etc. else break @@ -218,58 +278,64 @@ var/list/spells = typesof(/datum/spell) //needed for the badmin verb for now /datum/spell/proc/cast_check(skipcharge = 0, mob/user = usr, list/targets) //checks if the spell can be cast based on its settings; skipcharge is used when an additional cast_check is called inside the spell if(silenced > 0) - return 0 + return FALSE if(!(src in user.mind.learned_spells) && holder == user && !(isanimal(user))) error("[user] utilized the spell '[src]' without having it.") to_chat(user, "You shouldn't have this spell! Something's wrong.") - return 0 + return FALSE var/spell_leech = user.disrupts_psionics() if(spell_leech) to_chat(user, SPAN_WARNING("You try to marshal your energy, but find it leeched away by \the [spell_leech]!")) - return 0 + return FALSE var/turf/user_turf = get_turf(user) if(!user_turf) to_chat(user, "You cannot cast spells in null space!") if((spell_flags & Z2NOCAST) && (user_turf.z in GLOB.using_map.admin_levels)) //Certain spells are not allowed on the centcomm zlevel - return 0 + return FALSE if(spell_flags & CONSTRUCT_CHECK) for(var/turf/T in range(holder, 1)) if(findNullRod(T)) - return 0 + return FALSE if(!src.check_charge(skipcharge, user)) //sees if we can cast based on charges alone - return 0 + return FALSE if(holder == user) if(istype(user, /mob/living/simple_animal)) var/mob/living/simple_animal/SA = user if(SA.purge) to_chat(SA, "The null sceptre's power interferes with your own!") - return 0 + return FALSE if(!(spell_flags & GHOSTCAST)) if(!(spell_flags & NO_SOMATIC)) var/mob/living/L = user if(L.incapacitated(INCAPACITATION_STUNNED|INCAPACITATION_RESTRAINED|INCAPACITATION_BUCKLED_FULLY|INCAPACITATION_FORCELYING|INCAPACITATION_KNOCKOUT)) to_chat(user, "You can't cast spells while incapacitated!") - return 0 + return FALSE if(ishuman(user) && !(invocation_type in list(INVOKE_EMOTE, INVOKE_NONE))) if(istype(user.wear_mask, /obj/item/clothing/mask/muzzle)) to_chat(user, "Mmmf mrrfff!") - return 0 + return FALSE var/datum/spell/noclothes/spell = locate() in user.mind.learned_spells if((spell_flags & NEEDSCLOTHES) && !(spell && istype(spell)))//clothes check if(!user.wearing_wiz_garb()) - return 0 + return FALSE - return 1 + if(isliving(user)) + var/mob/living/L = user + if(!istype(L.mind.mana) || L.mind.mana.mana_level < mana_cost) + to_chat(L, SPAN_WARNING("You do not have enough mana!")) + return FALSE + + return TRUE /datum/spell/proc/check_charge(var/skipcharge, mob/user) if(!skipcharge) @@ -277,12 +343,12 @@ var/list/spells = typesof(/datum/spell) //needed for the badmin verb for now if(SPELL_RECHARGE) if(charge_counter < charge_max) to_chat(user, still_recharging_msg) - return 0 + return FALSE if(SPELL_CHARGES) if(!charge_counter) to_chat(user, "[name] has no charges left.") - return 0 - return 1 + return FALSE + return TRUE /datum/spell/proc/take_charge(mob/user = user, var/skipcharge) if(!skipcharge) @@ -290,15 +356,21 @@ var/list/spells = typesof(/datum/spell) //needed for the badmin verb for now if(SPELL_RECHARGE) charge_counter = 0 //doesn't start recharging until the targets selecting ends src.process() - return 1 + return TRUE if(SPELL_CHARGES) charge_counter-- //returns the charge if the targets selecting fails - return 1 + return TRUE if(SPELL_HOLDVAR) adjust_var(user, holder_var_type, holder_var_amount) - return 1 - return 0 - return 1 + return TRUE + return FALSE + return TRUE + +/datum/spell/proc/TakeMana(mob/user = user, amount = mana_cost) + if(!user.mind) + return FALSE + var/mob/living/L = user + return L.mind.mana.UseMana(L, amount, FALSE) /datum/spell/proc/invocation(mob/user = usr, var/list/targets) //spelling the spell out and setting it on recharge/reducing charges amount @@ -320,30 +392,39 @@ var/list/spells = typesof(/datum/spell) //needed for the badmin verb for now ///UPGRADING PROCS/// ///////////////////// -/datum/spell/proc/can_improve(var/upgrade_type) - if(level_max[UPGRADE_TOTAL] <= ( spell_levels[UPGRADE_SPEED] + spell_levels[UPGRADE_POWER] )) //too many levels, can't do it - return 0 +/datum/spell/proc/CanImprove(upgrade_type) + if(!(upgrade_type in level_max) || !(upgrade_type in spell_levels)) + return FALSE + + var/up_count = 0 + for(var/up_type in spell_levels) + up_count += spell_levels[up_type] + if(level_max[UPGRADE_TOTAL] <= up_count) // Too many levels, can't do it + return FALSE - //if(upgrade_type && spell_levels[upgrade_type] && level_max[upgrade_type]) if(upgrade_type && spell_levels[upgrade_type] >= level_max[upgrade_type]) - return 0 + return FALSE - return 1 + return TRUE -/datum/spell/proc/empower_spell() - if(!can_improve(UPGRADE_POWER)) - return 0 +/datum/spell/proc/ImproveSpell(upgrade_type, ignore_limit = FALSE) + if(!CanImprove(upgrade_type) && !ignore_limit) + return FALSE - spell_levels[UPGRADE_POWER]++ + spell_levels[upgrade_type]++ - return 1 + switch(upgrade_type) + if(UPGRADE_POWER) + return ImproveSpellPower() + if(UPGRADE_SPEED) + return ImproveSpellSpeed() -/datum/spell/proc/quicken_spell() - if(!can_improve(UPGRADE_SPEED)) - return 0 + return TRUE - spell_levels[UPGRADE_SPEED]++ +/datum/spell/proc/ImproveSpellPower() + return TRUE +/datum/spell/proc/ImproveSpellSpeed() if(delay_reduc && cast_delay) cast_delay = max(0, cast_delay - delay_reduc) else if(cast_delay) @@ -377,7 +458,7 @@ var/list/spells = typesof(/datum/spell) //needed for the badmin verb for now /datum/spell/proc/spell_do_after(var/mob/user as mob, delay as num, var/numticks = 5) if(!user || isnull(user)) - return 0 + return FALSE var/incap_flags = INCAPACITATION_STUNNED|INCAPACITATION_RESTRAINED|INCAPACITATION_BUCKLED_FULLY|INCAPACITATION_FORCELYING if(!(spell_flags & (GHOSTCAST))) @@ -393,10 +474,7 @@ var/list/spells = typesof(/datum/spell) //needed for the badmin verb for now to_chat(caller, "[caller.ranged_ability.name] has been disabled.") caller.ranged_ability.remove_ranged_ability() return TRUE //TRUE for failed, FALSE for passed. - if(ranged_clickcd_override >= 0) - ranged_ability_user.next_click = world.time + ranged_clickcd_override - else - ranged_ability_user.next_click = world.time + 15 // FIX ME + ranged_ability_user.next_click = world.time + ranged_clickcd ranged_ability_user.face_atom(A) return FALSE @@ -425,3 +503,4 @@ var/list/spells = typesof(/datum/spell) //needed for the badmin verb for now if(msg) to_chat(ranged_ability_user, msg) ranged_ability_user = null + active = FALSE diff --git a/code/modules/spells/_spell_procs.dm b/code/modules/spells/_spell_procs.dm index 8a15f67ee6f..56b3c20455e 100644 --- a/code/modules/spells/_spell_procs.dm +++ b/code/modules/spells/_spell_procs.dm @@ -1,13 +1,17 @@ /datum/mind - var/list/learned_spells + var/list/learned_spells = list() + var/datum/spell/last_used_spell = null /mob/Stat() . = ..() if(. && ability_master && ability_master.spell_objects) for(var/obj/screen/ability/spell/screen in ability_master.spell_objects) var/datum/spell/S = screen.spell + if(!istype(S)) + ability_master.remove_ability(screen) + continue if((!S.connected_button) || !statpanel(S.panel)) - continue //Not showing the noclothes spell + continue // Not showing the noclothes spell switch(S.charge_type) if(SPELL_RECHARGE) statpanel(S.panel,"[S.charge_counter/10.0]/[S.charge_max/10]",S.connected_button) @@ -27,20 +31,20 @@ var/datum/spell/S = screen.spell mind.learned_spells |= S -/proc/restore_spells(var/mob/H) +/proc/restore_spells(mob/H) if(H.mind && H.mind.learned_spells) var/list/spells = list() for(var/datum/spell/spell_to_remove in H.mind.learned_spells) //remove all the spells from other people. if(istype(spell_to_remove.holder,/mob)) var/mob/M = spell_to_remove.holder spells += spell_to_remove - M.remove_spell(spell_to_remove) + M.remove_spell(spell_to_remove, FALSE) for(var/datum/spell/spell_to_add in spells) H.add_spell(spell_to_add) H.ability_master.update_abilities(0,H) -/mob/proc/add_spell(var/datum/spell/spell_to_add, var/spell_base = "wiz_spell_ready") +/mob/proc/add_spell(datum/spell/spell_to_add, spell_base = "wiz_spell_ready") if(!ability_master) ability_master = new() spell_to_add.holder = src @@ -51,18 +55,20 @@ ability_master.add_spell(spell_to_add, spell_base) return 1 -/mob/proc/remove_spell(var/datum/spell/spell_to_remove) +/mob/proc/remove_spell(datum/spell/spell_to_remove, should_delete = TRUE) if(!spell_to_remove || !istype(spell_to_remove)) return if(mind) mind.learned_spells -= spell_to_remove - if (ability_master) + if(ability_master) ability_master.remove_ability(ability_master.get_ability_by_spell(spell_to_remove)) + if(should_delete) + QDEL_NULL(spell_to_remove) return 1 -/mob/proc/silence_spells(var/amount = 0) - if(amount < 0) +/mob/proc/silence_spells(amount = 0) + if(!amount) return if(!ability_master) diff --git a/code/modules/spells/aimed/_aimed.dm b/code/modules/spells/aimed/_aimed.dm index b488ad86506..40dade10d16 100644 --- a/code/modules/spells/aimed/_aimed.dm +++ b/code/modules/spells/aimed/_aimed.dm @@ -1,8 +1,7 @@ /datum/spell/aimed - name = "aimed projectile spell" hud_state = "projectile" - var/projectile_type = /obj/item/projectile + var/projectile_type = null var/deactive_msg = "You discharge your projectile..." var/active_msg = "You charge your projectile!" var/active_icon_state = "projectile" @@ -25,6 +24,7 @@ if(charge_type == "recharge") var/refund_percent = current_amount/projectile_amount charge_counter = charge_max * refund_percent + process() remove_ranged_ability(msg) on_deactivation(user) else @@ -35,19 +35,36 @@ /datum/spell/aimed/proc/on_activation(mob/user) active = TRUE + if(connected_button) + var/obj/screen/ability/spell/S = connected_button + if(!istype(S)) + return + S.update_charge(1) return /datum/spell/aimed/proc/on_deactivation(mob/user) active = FALSE + if(connected_button) + var/obj/screen/ability/spell/S = connected_button + if(!istype(S)) + return + S.update_charge(1) return +// Additional checks when there's a target +/datum/spell/aimed/proc/TargetCastCheck(mob/living/user, atom/target) + return TRUE + /datum/spell/aimed/InterceptClickOn(mob/living/caller, params, atom/target) if(..()) return FALSE var/ran_out = (current_amount <= 0) - if(!cast_check(!ran_out, ranged_ability_user)) + if(!cast_check(!ran_out, ranged_ability_user, list(target))) remove_ranged_ability() return FALSE + // The targeted check does not remove the ranged ability, allowing you to pick another target + if(!TargetCastCheck(ranged_ability_user, target)) + return FALSE var/list/targets = list(target) perform(ranged_ability_user, targets) return TRUE @@ -66,16 +83,17 @@ /datum/spell/aimed/proc/fire_projectile(mob/living/user, atom/target) current_amount-- - for(var/i in 1 to projectiles_per_fire) - var/obj/item/projectile/P = new projectile_type(user.loc) - if(istype(P, /obj/item/projectile/spell_projectile)) - var/obj/item/projectile/spell_projectile/SP = P - SP.carried = src //casting is magical - P.original = target - P.current = target - P.starting = get_turf(user) - P.shot_from = user - P.launch(target, user.zone_sel.selecting, user) + if(projectile_type) + for(var/i in 1 to projectiles_per_fire) + var/obj/item/projectile/P = new projectile_type(user.loc) + if(istype(P, /obj/item/projectile/spell_projectile)) + var/obj/item/projectile/spell_projectile/SP = P + SP.carried = src //casting is magical + P.original = target + P.current = target + P.starting = get_turf(user) + P.shot_from = user + P.launch(target, user.zone_sel.selecting, user) return TRUE // For spell_projectile types diff --git a/code/modules/spells/aimed/blink.dm b/code/modules/spells/aimed/blink.dm new file mode 100644 index 00000000000..936416a54c6 --- /dev/null +++ b/code/modules/spells/aimed/blink.dm @@ -0,0 +1,53 @@ +/datum/spell/aimed/blink + name = "Blink" + desc = "This spell teleports the user a short distance towards their destination." + deactive_msg = "You discharge the blink spell..." + active_msg = "You charge the blink spell!" + + charge_max = 10 SECONDS + cooldown_reduc = 4 SECONDS + + spell_flags = 0 + invocation = "none" + invocation_type = INVOKE_NONE + + level_max = list(UPGRADE_TOTAL = 2, UPGRADE_SPEED = 2, UPGRADE_POWER = 2) + + range = 4 + hud_state = "wiz_blink" + cast_sound = 'sound/magic/blink.ogg' + + categories = list(SPELL_CATEGORY_MOBILITY) + spell_cost = 2 + mana_cost = 3 + +/datum/spell/aimed/blink/TargetCastCheck(mob/living/user, atom/target) + if(!istype(target)) + return FALSE + if(get_dist(user, target) > range) + to_chat(user, SPAN_WARNING("The target turf is too far away!")) + return FALSE + return ..() + +/datum/spell/aimed/blink/fire_projectile(mob/living/user, mob/living/target) + . = ..() + var/turf/target_turf = get_turf(target) + if(target_turf.density) + target_turf = pick_turf_in_range(target_turf, 2, list(/proc/not_turf_contains_dense_objects)) + if(!istype(target_turf)) + to_chat(user, SPAN_WARNING("Failed to find any open floors to blink to!")) + return + var/list/line_list = getline(user, target_turf) + for(var/i = 1 to length(line_list)) + var/turf/T = line_list[i] + var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(T, user.dir, user) + D.alpha = min(150 + i*15, 255) + animate(D, alpha = 0, time = 2 + i*2) + user.forceMove(target_turf) + +/datum/spell/aimed/blink/ImproveSpellPower() + if(!..()) + return FALSE + + range += 2 + return "You've increased the maximum range of [src] to [range] tiles." diff --git a/code/modules/spells/aimed/corpse_explosion.dm b/code/modules/spells/aimed/corpse_explosion.dm new file mode 100644 index 00000000000..060d9e30067 --- /dev/null +++ b/code/modules/spells/aimed/corpse_explosion.dm @@ -0,0 +1,70 @@ +/datum/spell/aimed/corpse_explosion + name = "Corpse Explosion" + desc = "This spell causes a corpse of a living creature to violently explode in a bloody mist \ + dealing little damage, but confuses and causes vomiting for most people." + deactive_msg = "You discharge the corpse explosion spell..." + active_msg = "You charge the corpse explosion spell!" + + invocation = "none" + invocation_type = INVOKE_NONE + + level_max = list(UPGRADE_TOTAL = 2, UPGRADE_SPEED = 0, UPGRADE_POWER = 2) + + charge_max = 30 SECONDS + spell_flags = 0 + range = 5 + + hud_state = "wiz_corpse_explosion" + + spell_cost = 3 + mana_cost = 10 + + var/amt_confusion = 5 + var/amt_blurry = 10 + +/datum/spell/aimed/corpse_explosion/TargetCastCheck(mob/living/user, mob/living/target) + if(!isliving(target) || target.stat != DEAD) + to_chat(user, SPAN_WARNING("The target must be a corpse of a living creature!")) + return FALSE + if(get_dist(user, target) > range) + to_chat(user, SPAN_WARNING("The target is too far away!")) + return FALSE + return ..() + +/datum/spell/aimed/corpse_explosion/fire_projectile(mob/living/user, mob/living/target) + . = ..() + var/matrix/M = matrix(target.transform) + M *= 1.5 + animate(target, transform = M, color = "#ffcccc", time = 5) + target.visible_message(SPAN_DANGER("[target]'s lifeless body visibly bloats!")) + addtimer(CALLBACK(src, .proc/ExplodeCorpse, user, target), 6) + +/datum/spell/aimed/corpse_explosion/proc/ExplodeCorpse(mob/living/user, mob/living/target) + if(QDELETED(target) || target.stat != DEAD) + return + + var/turf/T = get_turf(target) + target.gib() + for(var/mob/living/carbon/human/H in view(5, T)) + if(H.stat) + continue + if(H == user) + continue + to_chat(H, SPAN_USERDANGER("Disgusting mess of organs and blood splatters all over you!")) + H.confused += amt_confusion + H.eye_blurry += amt_blurry + addtimer(CALLBACK(H, /mob/living/proc/empty_stomach, TRUE), rand(2, 10)) + for(var/i = 1 to rand(1, 4)) + addtimer(CALLBACK(H, /mob/living/proc/empty_stomach, TRUE), rand(10, 40) * (i + 1)) + + var/datum/effect/effect/system/smoke_spread/bloody/smoke = new() + smoke.set_up(6, 0, T) + smoke.start() + +/datum/spell/aimed/corpse_explosion/ImproveSpellPower() + if(!..()) + return FALSE + + amt_confusion += 2 + amt_blurry += 5 + return "The [src] spell effects are now more powerful." diff --git a/code/modules/spells/aimed/counter_crystal.dm b/code/modules/spells/aimed/counter_crystal.dm new file mode 100644 index 00000000000..64af3df4e5b --- /dev/null +++ b/code/modules/spells/aimed/counter_crystal.dm @@ -0,0 +1,155 @@ +/datum/spell/aimed/counter_crystal + name = "Counter Crystal" + desc = "This spell places a crystal at designated location that lasts for a certain amount of time before collapsing. \ + All spells cast in its vicinity will deal burn damage to their users proportional to the amount of mana used." + deactive_msg = "You discharge the counter crystal spell..." + active_msg = "You charge the counter crystal spell!" + + charge_max = 50 SECONDS + cooldown_reduc = 15 SECONDS + // Defines for how long the crystal exists + duration = 30 SECONDS + + invocation = "Contra Navitas!" + invocation_type = INVOKE_SHOUT + + level_max = list(UPGRADE_TOTAL = 2, UPGRADE_SPEED = 2, UPGRADE_POWER = 2) + + spell_flags = 0 + range = 3 + + hud_state = "wiz_counter_crystal" + + cast_sound = 'sound/magic/blink.ogg' + + spell_cost = 6 + mana_cost = 20 + + /// Damage multiplier to the amount of mana used to cast the spell + var/crystal_damage_multiplier = 2 + +/datum/spell/aimed/counter_crystal/TargetCastCheck(mob/living/user, atom/target) + if(get_dist(user, target) > range) + to_chat(user, SPAN_WARNING("The target is too far away!")) + return FALSE + var/turf/T = get_turf(target) + if(turf_contains_dense_objects(T)) + to_chat(user, SPAN_WARNING("The target floor must be clear of dense objects!")) + return FALSE + return ..() + +/datum/spell/aimed/counter_crystal/fire_projectile(mob/living/user, atom/target) + . = ..() + var/turf/T = get_turf(target) + var/datum/beam/B = user.Beam(T, icon_state = "lightning[rand(1, 12)]", time = 5) + B.visuals.color = COLOR_MANA + animate(B.visuals, alpha = 0, time = 5) + user.visible_message( + SPAN_WARNING("[user] manifests a crystal!"), + SPAN_NOTICE("You place a counter-crystal!"), + ) + var/obj/structure/cult/pylon/counter_crystal/CC = new (T) + CC.creator = user + CC.damage_multiplier = crystal_damage_multiplier + addtimer(CALLBACK(CC, /obj/structure/cult/pylon/counter_crystal/proc/TimedCollapse), duration) + +/datum/spell/aimed/counter_crystal/ImproveSpellPower() + if(!..()) + return FALSE + + crystal_damage_multiplier += 1 + + return "The [src] damage multiplier is now [crystal_damage_multiplier * 100]%." + +//////////////////////// +/* The crystal itself */ +//////////////////////// +/obj/structure/cult/pylon/counter_crystal + name = "counter crystal" + desc = "A floating crystal emitting pulses that are harmful to arcane energy." + icon_state = "pylon_blue" + light_max_bright = 1 + light_inner_range = 2 + light_outer_range = 7 + light_color = COLOR_MANA + + /// Creator of the crystal is unaffected by its primary effect + var/mob/creator = null + /// How far away can the caster be for crystal to trigger + var/max_distance = 7 + /// Damage multiplier to the amount of mana used to cast the spell + var/damage_multiplier = 2 + +/obj/structure/cult/pylon/counter_crystal/Initialize() + . = ..() + RegisterSignal(SSdcs, COMSIG_GLOB_SPELL_CAST, .proc/OnSpellCast) + RegisterSignal(SSdcs, COMSIG_GLOB_SPELL_CAST_HAND, .proc/OnSpellCastHand) + +/obj/structure/cult/pylon/counter_crystal/Destroy() + UnregisterSignal(SSdcs, COMSIG_GLOB_SPELL_CAST) + UnregisterSignal(SSdcs, COMSIG_GLOB_SPELL_CAST_HAND) + return ..() + +/obj/structure/cult/pylon/counter_crystal/examine(mob/user) + . = ..() + if(LAZYLEN(user.mind?.learned_spells)) + if(user == creator) + to_chat(user, SPAN_NOTICE("It seems like using spells near this thing is a very bad idea, however this one is your creation and will not target you.")) + return + to_chat(user, SPAN_WARNING("It seems like using spells near this thing is a very bad idea.")) + +/obj/structure/cult/pylon/counter_crystal/proc/OnSpellCast(datum/source, mob/living/caster, datum/spell/S, list/targets) + SIGNAL_HANDLER + + Retalite(caster, S.mana_cost) + +/obj/structure/cult/pylon/counter_crystal/proc/OnSpellCastHand(datum/source, mob/living/caster, datum/spell/hand/S, atom/target) + SIGNAL_HANDLER + + Retalite(caster, S.mana_cost_per_cast) + +/obj/structure/cult/pylon/counter_crystal/proc/Retalite(mob/living/caster, mana_used = 0) + if(!mana_used) + return + + if(caster == creator) + return FALSE + + if(caster.z != z) + return FALSE + + if(get_dist(src, caster) > max_distance) + return FALSE + + var/datum/beam/B = Beam(caster, icon_state = "lightning[rand(1, 12)]", time = 10) + B.visuals.color = COLOR_MANA + animate(B.visuals, alpha = 0, color = COLOR_RED, time = 10) + + var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(get_turf(src), dir, src) + D.alpha = 175 + var/matrix/M = matrix() + M *= 2 + animate(D, alpha = 0, transform = M, time = 5) + + playsound(get_turf(caster), 'sound/magic/lightningshock.ogg', 50, TRUE) + playsound(get_turf(src), 'sound/magic/lightningshock.ogg', 50, TRUE) + + visible_message(SPAN_DANGER("Rays of powerful electricity dart from \the [src] towards \the [caster]!")) + to_chat(caster, SPAN_USERDANGER("The [src] strikes you with powerful blast of electricity!")) + + var/damage = clamp(mana_used * damage_multiplier, 20, 500) + caster.adjustFireLoss(damage) + caster.flash_eyes(FLASH_PROTECTION_MAJOR) + caster.confused = max(caster.confused, 3) + +/obj/structure/cult/pylon/counter_crystal/proc/TimedCollapse() + if(QDELETED(src)) + return + + visible_message(SPAN_DANGER("The [src] begins to collapse in on itself!")) + var/matrix/M = matrix() + M *= 1.5 + animate(src, transform = M, time = 5, easing = BACK_EASING) + M *= 0.01 + animate(transform = M, time = 3, easing = CIRCULAR_EASING) + QDEL_IN(src, 8) diff --git a/code/modules/spells/aimed/dispell.dm b/code/modules/spells/aimed/dispell.dm new file mode 100644 index 00000000000..5e61e5e26bb --- /dev/null +++ b/code/modules/spells/aimed/dispell.dm @@ -0,0 +1,62 @@ +/datum/spell/aimed/dispell_projectile + name = "Dispelling projectile" + desc = "Launches a magic bolt capable of dispelling magic." + + spell_flags = 0 + invocation = "Ma'Gi-Di!" + invocation_type = INVOKE_SHOUT + range = 15 + level_max = list(UPGRADE_TOTAL = 3, UPGRADE_SPEED = 2, UPGRADE_POWER = 2) + duration = 15 + projectile_type = /obj/item/projectile/spell_projectile/dispell + + charge_max = 15 SECONDS + cooldown_reduc = 5 SECONDS + + active_msg = "You prepare to cast the bolt of dispell!" + deactive_msg = "You decide against using the bolt of dispell." + + hud_state = "wiz_dispell_proj" + cast_sound = 'sound/magic/staff_healing.ogg' + + categories = list(SPELL_CATEGORY_ANTIMAGIC) + spell_cost = 2 + mana_cost = 15 + + var/amt_range = 0 + var/strength = DISPELL_WEAK + +/datum/spell/aimed/dispell_projectile/prox_cast(list/targets, atom/spell_holder) + var/atom/movable/A = targets[1] + if(amt_range > 0) + for(var/atom/movable/AA in range(amt_range, A)) + if(AA == holder) + continue + AA.Dispell() + else if(istype(A)) + A.Dispell() + + playsound(A, 'sound/magic/smoke.ogg', min(100, 25 * amt_range)) + +/datum/spell/aimed/dispell_projectile/ImproveSpellPower() + if(!..()) + return FALSE + + amt_range += 1 + + return "[src] now affects multiple targets within a [amt_range <= 1 ? "small" : "big"] area." + +/obj/item/projectile/spell_projectile/dispell + name = "bolt of dispell" + icon_state = "spark_green" + speed = 0.8 + +/obj/item/projectile/spell_projectile/dispell/Bump(atom/A, forced = FALSE) + if(A && carried) + prox_cast(list(A), src) + return TRUE + +/obj/item/projectile/spell_projectile/dispell/on_impact(atom/A) + if(A && carried) + prox_cast(list(A), src) + return TRUE diff --git a/code/modules/spells/aimed/fireball.dm b/code/modules/spells/aimed/fireball.dm index f4295bc708e..69ac2b854fd 100644 --- a/code/modules/spells/aimed/fireball.dm +++ b/code/modules/spells/aimed/fireball.dm @@ -1,10 +1,8 @@ /datum/spell/aimed/fireball name = "Fireball" desc = "This spell fires an explosive fireball at a target." - school = "conjuration" - charge_max = 10 SECONDS + charge_max = 15 SECONDS spell_flags = 0 - feedback = "FB" invocation = "ONI SOMA" invocation_type = INVOKE_SHOUT range = 20 @@ -16,16 +14,20 @@ level_max = list(UPGRADE_TOTAL = 5, UPGRADE_SPEED = 0, UPGRADE_POWER = 5) + categories = list(SPELL_CATEGORY_FIRE, SPELL_CATEGORY_EXPLOSIVE) + spell_cost = 5 + mana_cost = 20 + var/ex_severe = -1 var/ex_heavy = 1 var/ex_light = 2 var/ex_flash = 2 -/datum/spell/aimed/fireball/empower_spell() +/datum/spell/aimed/fireball/ImproveSpellPower() if(!..()) return 0 - if(spell_levels[UPGRADE_POWER]%2 == 1) + if(spell_levels[UPGRADE_POWER]%2 == 0) ex_severe++ ex_heavy++ ex_light++ @@ -33,11 +35,11 @@ return "The spell [src] now has a larger explosion." -/datum/spell/aimed/fireball/tower - charge_max = 2 - /datum/spell/aimed/fireball/prox_cast(list/targets, spell_holder) - explosion(get_turf(spell_holder), ex_severe, ex_heavy, ex_light, ex_flash) + var/turf/T = get_turf(spell_holder) + if(LAZYLEN(targets)) + T = get_turf(pick(targets)) + explosion(T, ex_severe, ex_heavy, ex_light, ex_flash) // Projectile /obj/item/projectile/spell_projectile/fireball diff --git a/code/modules/spells/aimed/flamethrower.dm b/code/modules/spells/aimed/flamethrower.dm new file mode 100644 index 00000000000..a143ea0ac58 --- /dev/null +++ b/code/modules/spells/aimed/flamethrower.dm @@ -0,0 +1,65 @@ +/datum/spell/aimed/flamethrower + name = "Flamethrower" + desc = "This spell sets a small targeted area on fire." + deactive_msg = "You discharge the flamethrower spell..." + active_msg = "You charge the flamethrower spell!" + + charge_max = 10 SECONDS + cooldown_reduc = 4 SECONDS + + invocation = "Flamma!" + invocation_type = INVOKE_SHOUT + level_max = list(UPGRADE_TOTAL = 3, UPGRADE_SPEED = 2, UPGRADE_POWER = 2) + + range = 8 + hud_state = "wiz_flame" + cast_sound = 'sound/magic/fire.ogg' + spell_cost = 2 + mana_cost = 6 + categories = list(SPELL_CATEGORY_FIRE) + + var/flame_power = 20 + var/flame_distance = 4 + var/flame_color = COLOR_ORANGE + +/datum/spell/aimed/flamethrower/TargetCastCheck(mob/living/user, mob/living/target) + if(get_dist(user, target) > range) + to_chat(user, SPAN_WARNING("The target is too far away!")) + return FALSE + return ..() + +/datum/spell/aimed/flamethrower/fire_projectile(mob/living/user, mob/living/target) + . = ..() + var/turf/start_turf = get_step(get_turf(user), get_dir(user, target)) + var/turf/target_turf = get_ranged_target_turf_direct(start_turf, target, flame_distance) + var/list/flame_line = getline(start_turf, target_turf) + for(var/i = 1 to length(flame_line)) + var/turf/T = flame_line[i] + if(T.density) + break + var/dense_obj = FALSE + for(var/obj/O in T) + if(O.density) + dense_obj = TRUE + break + if(dense_obj) + break + addtimer(CALLBACK(src, .proc/PlaceFlame, T), i-1) + +/datum/spell/aimed/flamethrower/proc/PlaceFlame(turf/T) + var/obj/effect/turf_fire/TF = T.IgniteTurf(flame_power, flame_color) + if(istype(TF)) + TF.interact_with_atmos = FALSE + T.hotspot_expose((flame_power * 3) + 300, 50) + +/datum/spell/aimed/flamethrower/ImproveSpellPower() + if(!..()) + return FALSE + + flame_power += 20 + flame_color = flame_power >= 60 ? COLOR_PURPLE : COLOR_RED + // This is generally only available with spell steal + if(flame_power >= 80) + flame_distance += 1 + + return "The [src] spell is now [flame_power >= 60 ? "much " : ""]more powerful." diff --git a/code/modules/spells/aimed/healing.dm b/code/modules/spells/aimed/healing.dm new file mode 100644 index 00000000000..1451101c77b --- /dev/null +++ b/code/modules/spells/aimed/healing.dm @@ -0,0 +1,283 @@ +/datum/spell/aimed/heal_target + name = "Cure Light Wounds" + desc = "A rudimentary spell used mainly to heal light bruises and burns." + deactive_msg = "You discharge the healing spell..." + active_msg = "You charge the healing spell!" + spell_flags = 0 + charge_max = 10 SECONDS + cooldown_reduc = 5 SECONDS + + invocation = "Di'Nath!" + invocation_type = INVOKE_SHOUT + level_max = list(UPGRADE_TOTAL = 2, UPGRADE_SPEED = 1, UPGRADE_POWER = 2) + + hud_state = "heal_minor" + cast_sound = 'sound/magic/staff_healing.ogg' + + /// Maximum distance between user and target + range = 3 + var/brute_damage = -20 + var/burn_damage = -20 + var/tox_damage = 0 + var/oxy_damage = 0 + var/rad_damage = 0 + var/robo_damage = -10 + var/organ_heal = 0 + var/blood_heal = 0 + var/brain_damage = 0 + var/effect_state = "green_sparkles" + var/effect_duration = 5 + var/effect_color = "#ffffff" + + // Vars expect a constant at compile time, so we can't use macros for spans here + message = "You feel a pleasant rush of heat move through your body." + + categories = list(SPELL_CATEGORY_HEALING) + spell_cost = 1 + mana_cost = 6 + +/datum/spell/aimed/heal_target/TargetCastCheck(mob/living/user, mob/living/target) + if(!isliving(target)) + to_chat(user, SPAN_WARNING("The target must be a living creature!")) + return FALSE + if(get_dist(user, target) > range) + to_chat(user, SPAN_WARNING("The target is too far away!")) + return FALSE + return ..() + +/datum/spell/aimed/heal_target/fire_projectile(mob/living/user, mob/living/target) + . = ..() + target.adjustBruteLoss(brute_damage) + target.adjustFireLoss(burn_damage) + target.adjustToxLoss(tox_damage) + target.adjustOxyLoss(oxy_damage) + if(ishuman(target)) + var/mob/living/carbon/human/H = target + for(var/obj/item/organ/internal/affecting in H.internal_organs) + if(affecting && istype(affecting)) + affecting.heal_damage(organ_heal, organ_heal) + for(var/obj/item/organ/external/affecting in H.organs) + if(affecting && istype(affecting)) + var/dam = BP_IS_ROBOTIC(affecting) ? -robo_damage : organ_heal + affecting.heal_damage(dam, dam, robo_repair = BP_IS_ROBOTIC(affecting)) + H.vessel.add_reagent(/datum/reagent/blood, blood_heal) + H.adjustBrainLoss(brain_damage) + H.radiation += min(H.radiation, rad_damage) + H.fixblood() + target.regenerate_icons() + + if(effect_state) + var/obj/o = new /obj/effect/temp_visual/temporary(get_turf(target), effect_duration, 'icons/effects/effects.dmi', effect_state) + o.color = effect_color + + return TRUE + +/datum/spell/aimed/heal_target/ImproveSpellPower() + if(!..()) + return FALSE + brute_damage -= 20 + burn_damage -= 20 + robo_damage -= 10 + blood_heal = 10 + return "The [src] spell now heals more and slightly restores lost blood." + +/datum/spell/aimed/heal_target/major + name = "Cure Major Wounds" + desc = "A spell used to fix others that cannot be fixed with regular medicine." + + spell_flags = NEEDSCLOTHES + invocation = "Borv Di'Nath!" + range = 1 + level_max = list(UPGRADE_TOTAL = 2, UPGRADE_SPEED = 1, UPGRADE_POWER = 1) + + charge_max = 40 SECONDS + cooldown_reduc = 10 SECONDS + + hud_state = "heal_major" + + brute_damage = -60 + burn_damage = -60 + robo_damage = -30 + blood_heal = 30 + + message = "Your body feels like a warm, cozy fire." + + spell_cost = 4 + mana_cost = 20 + +/datum/spell/aimed/heal_target/major/ImproveSpellPower() + if(!..()) + return FALSE + + brute_damage = -120 + burn_damage = -120 + robo_damage = -60 + blood_heal = 60 + organ_heal = 10 + brain_damage = -15 + rad_damage = -50 + tox_damage = -20 + oxy_damage = -20 + + return "The [src] spell now heals more, and heals organ damage and radiation." + +/datum/spell/aimed/heal_target/sacrifice + name = "Sacrifice" + desc = "This spell heals immensily while damaging the user." + invocation = "Ei'Nath Borv Di'Nath!" + charge_type = SPELL_HOLDVAR + holder_var_type = "fireloss" + holder_var_amount = 100 + level_max = list(UPGRADE_TOTAL = 1, UPGRADE_SPEED = 0, UPGRADE_POWER = 1) + + range = 1 + brute_damage = -1000 + burn_damage = -1000 + robo_damage = -1000 + oxy_damage = -100 + tox_damage = -100 + blood_heal = 280 + effect_color = "#ff0000" + + hud_state = "gen_dissolve" + cast_sound = 'sound/magic/disintegrate.ogg' + + spell_cost = 4 + mana_cost = 20 + +/datum/spell/aimed/heal_target/sacrifice/ImproveSpellPower() + if(!..()) + return 0 + + organ_heal = 50 + brain_damage = -100 + rad_damage = -1000 + + return "You will now heal organ and brain damage, as well as virtually purge all radiation." + +/datum/spell/aimed/heal_target/trance + name = "Trance" + desc = "A mighty spell of restoration that briefly forces its target into a deep, dreamless sleep, rapidly repairing their body and soul as their senses are dulled. The users of this mighty art are known for being short lived, slowly devolving into raving madness as the power they once relied on fails them with excessive use." + invocation = "Di' Dae Nath!" + + charge_max = 2 MINUTES + + range = 1 + brute_damage = -2000 + burn_damage = -2000 + oxy_damage = -1000 + tox_damage = -1000 + robo_damage = -1000 + organ_heal = 100 + brain_damage = -200 + rad_damage = -5000 + hud_state = "trance" + + level_max = list(UPGRADE_TOTAL = 2, UPGRADE_SPEED = 0, UPGRADE_POWER = 0) + + spell_cost = 5 + mana_cost = 30 + + var/obj/effect/effect + +/datum/spell/aimed/heal_target/trance/fire_projectile(mob/living/user, mob/living/target) + var/time = max(30 SECONDS, (target.getBruteLoss() + target.getFireLoss()) * 20) + . = ..() + var/turf/T = get_turf(target) + effect = new /obj/effect/rift(T) + effect.color = "f0e68c" + target.forceMove(effect) + target.status_flags &= GODMODE + to_chat(target, SPAN_NOTICE("You will be in stasis for [time/10] second\s.")) + addtimer(CALLBACK(src, .proc/CancelRift), time) + +/datum/spell/aimed/heal_target/trance/Destroy() + CancelRift() + return ..() + +/datum/spell/aimed/heal_target/trance/proc/CancelRift() + if(effect) + var/mob/living/L = locate() in effect + L.status_flags &= ~GODMODE + L.forceMove(get_turf(L)) + charge_max += 300 + QDEL_NULL(effect) + +/obj/effect/rift + name = "rift" + desc = "a tear in space and time." + icon = 'icons/obj/wizard.dmi' + icon_state = "rift" + unacidable = TRUE + anchored = TRUE + density = FALSE + +/obj/effect/rift/Destroy() + for(var/atom/movable/M in contents) + M.dropInto(loc) + . = ..() + +/datum/spell/aimed/revoke_death + name = "Revoke Death" + desc = "Revoke that of death itself." + deactive_msg = "You discharge the revoke death spell..." + active_msg = "You charge the revoke death spell!" + + charge_max = 120 SECONDS + cooldown_reduc = 50 SECONDS + + invocation = "Di Le Nal Yen Nath!" + invocation_type = INVOKE_SHOUT + level_max = list(UPGRADE_TOTAL = 2, UPGRADE_SPEED = 2, UPGRADE_POWER = 0) + + cast_sound = 'sound/magic/churchbell.ogg' + hud_state = "heal_revoke" + + categories = list(SPELL_CATEGORY_HEALING, SPELL_CATEGORY_FORBIDDEN) + spell_cost = 12 + mana_cost = 50 + + range = 1 + +/datum/spell/aimed/revoke_death/TargetCastCheck(mob/living/user, mob/living/target) + if(!isliving(target)) + to_chat(user, SPAN_WARNING("The target must be a living creature!")) + return FALSE + if(get_dist(user, target) > range) + to_chat(user, SPAN_WARNING("The target is too far away!")) + return FALSE + if(target.stat != DEAD) + to_chat(user, SPAN_NOTICE("\The [target] is not dead...")) + return FALSE + return ..() + +/datum/spell/aimed/revoke_death/fire_projectile(mob/living/user, mob/living/target) + . = ..() + for(var/atom/movable/A in view(7, user)) + var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(get_turf(A), A.dir, A) + D.alpha = 145 + animate(D, pixel_x = A.pixel_x + rand(-12, 12), pixel_y = A.pixel_y + rand(-12, 12), alpha = 0, time = rand(7, 20)) + for(var/i = 1 to 25) + addtimer(CALLBACK(src, .proc/PerformTargetEffect, target), i * 2) + addtimer(CALLBACK(src, .proc/DoRevive, target), 6 SECONDS) + +/datum/spell/aimed/revoke_death/proc/PerformTargetEffect(mob/living/target) + var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(get_turf(target), target.dir, target) + D.alpha = 5 + D.pixel_x = target.pixel_x + rand(-20, 20) + D.pixel_y = target.pixel_y + rand(-20, 20) + animate(D, pixel_x = target.pixel_x, pixel_y = target.pixel_y, alpha = 175, time = rand(4, 8)) + animate(alpha = 0, time = 3) + +/datum/spell/aimed/revoke_death/proc/DoRevive(mob/living/target) + for(var/i = 1 to 12) + var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(get_turf(target), target.dir, target) + D.alpha = 5 + D.pixel_x = target.pixel_x + pick(rand(-26, -14), rand(14, 26)) + D.pixel_y = target.pixel_y + pick(rand(-26, -14), rand(14, 26)) + animate(D, pixel_x = target.pixel_x, pixel_y = target.pixel_y, alpha = 175, time = rand(2, 4)) + animate(alpha = 0, time = 2) + playsound(target, 'sound/magic/staff_healing.ogg', 50, FALSE, 14) + target.revive() + target.confused = 30 + target.visible_message(SPAN_WARNING("\The [target] rises once more!")) diff --git a/code/modules/spells/aimed/mana_burn.dm b/code/modules/spells/aimed/mana_burn.dm new file mode 100644 index 00000000000..f0f22753e09 --- /dev/null +++ b/code/modules/spells/aimed/mana_burn.dm @@ -0,0 +1,54 @@ +/datum/spell/aimed/mana_burn + name = "Mana Burn" + desc = "This spell burns the mana out of the target, dealing damage proprotional to the amount of mana burnt." + deactive_msg = "You discharge the mana burst spell..." + active_msg = "You charge the mana burst spell!" + + charge_max = 25 SECONDS + cooldown_reduc = 5 SECONDS + + invocation = "Ruptis!" + invocation_type = INVOKE_SHOUT + + level_max = list(UPGRADE_TOTAL = 2, UPGRADE_SPEED = 2, UPGRADE_POWER = 0) + + range = 4 + + hud_state = "wiz_mana_burn" + + cast_sound = 'sound/magic/blind.ogg' + + spell_cost = 3 + mana_cost = 15 + categories = list(SPELL_CATEGORY_ANTIMAGIC) + + /// If the target has less or equal amount of mana, nothing will be done + var/min_mana_burnt = 5 + var/max_mana_burnt = 100 + +/datum/spell/aimed/mana_burn/TargetCastCheck(mob/living/user, mob/living/target) + if(!GetManaDatum(target)) + to_chat(user, SPAN_WARNING("The target must be capable of holding mana!")) + return FALSE + if(get_dist(user, target) > range) + to_chat(user, SPAN_WARNING("The target is too far away!")) + return FALSE + return ..() + +/datum/spell/aimed/mana_burn/fire_projectile(mob/living/user, mob/living/target) + . = ..() + var/datum/mana/M = GetManaDatum(target) + if(!istype(M) || M.mana_level <= min_mana_burnt) + to_chat(user, SPAN_WARNING("\The [target] did not possess enough mana to experience the burn.")) + return + + to_chat(target, SPAN_USERDANGER("You feel burning sensation as the energy leaves your body!")) + playsound(target, 'sound/magic/blind.ogg', 50, TRUE) + target.adjustFireLoss(min(M.mana_level, max_mana_burnt)) + M.UseMana(target, min(M.mana_level, max_mana_burnt)) + for(var/i = 1 to 12) + var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(get_turf(target), target.dir, target) + D.alpha = 125 + D.color = COLOR_MANA + animate(D, pixel_x = target.pixel_x + pick(rand(-32, -14), rand(14, 32)), pixel_y = target.pixel_y + pick(rand(-32, -14), rand(14, 32)), alpha = 55, color = COLOR_RED, time = rand(2, 6)) + animate(alpha = 0, time = 2) diff --git a/code/modules/spells/aimed/mana_drain.dm b/code/modules/spells/aimed/mana_drain.dm new file mode 100644 index 00000000000..4b0d968a826 --- /dev/null +++ b/code/modules/spells/aimed/mana_drain.dm @@ -0,0 +1,91 @@ +/datum/spell/aimed/mana_drain + name = "Mana Drain" + desc = "This spell drains the mana out of the target, giving it to you instead." + deactive_msg = "You discharge the mana drain spell..." + active_msg = "You charge the mana drain spell!" + + charge_max = 25 SECONDS + cooldown_reduc = 5 SECONDS + + invocation = "Exhaurire!" + invocation_type = INVOKE_SHOUT + + level_max = list(UPGRADE_TOTAL = 2, UPGRADE_SPEED = 1, UPGRADE_POWER = 2) + + range = 5 + + hud_state = "wiz_mana_drain" + + cast_sound = 'sound/magic/drain.ogg' + + spell_cost = 3 + mana_cost = 5 + categories = list(SPELL_CATEGORY_ANTIMAGIC) + + /// Amount of mana drained every second; If target's mana is below this - the spell will end. + var/mana_drain_rate = 2 + /// How far can the target be away once the drain has started + var/mana_drain_range = 7 + /// Cannot drain mana for more than this amount of times + var/max_iterations = 100 + var/datum/beam/current_beam = null + +/datum/spell/aimed/mana_drain/Destroy() + QDEL_NULL(current_beam) + return ..() + +/datum/spell/aimed/mana_drain/TargetCastCheck(mob/living/user, mob/living/target) + if(!GetManaDatum(target)) + to_chat(user, SPAN_WARNING("The target must be capable of holding mana!")) + return FALSE + if(get_dist(user, target) > range) + to_chat(user, SPAN_WARNING("The target is too far away!")) + return FALSE + return ..() + +/datum/spell/aimed/mana_drain/fire_projectile(mob/living/user, mob/living/target) + . = ..() + to_chat(user, SPAN_NOTICE("You begin draining mana from \the [target]")) + to_chat(target, SPAN_DANGER("Your mana is being drained by \the [user]!")) + playsound(target, 'sound/magic/drain.ogg', 50, TRUE) + + QDEL_NULL(current_beam) + current_beam = user.Beam(target, icon_state = "drainbeam") + current_beam.visuals.color = COLOR_MANA + DoTheDrain(user, target) + +/datum/spell/aimed/mana_drain/ImproveSpellPower() + mana_drain_rate += initial(mana_drain_rate) + + return "The [src] spell now drains [mana_drain_rate * 2] mana per second." + +/datum/spell/aimed/mana_drain/proc/DoTheDrain(mob/living/user, atom/movable/target, iteration = 1) + if(QDELETED(target) || QDELETED(user) || !istype(target) || !istype(user)) + QDEL_NULL(current_beam) + return + + if(get_dist(user, target) > mana_drain_range) + QDEL_NULL(current_beam) + to_chat(user, SPAN_WARNING("\The [target] is too far away to continue the mana drain!")) + return + + var/datum/mana/user_mana = GetManaDatum(user) + var/datum/mana/target_mana = GetManaDatum(target) + if(!istype(user_mana) || !istype(target_mana)) + QDEL_NULL(current_beam) + return + + if(iteration >= max_iterations || target_mana.mana_level < mana_drain_rate) + QDEL_NULL(current_beam) + to_chat(user, SPAN_NOTICE("You finish draining mana out of \the [target].")) + return + + user_mana.AddMana(mana_drain_rate) + target_mana.UseMana(target, mana_drain_rate) + + var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(get_turf(target), target.dir, target) + D.alpha = 125 + D.color = COLOR_MANA + animate(D, alpha = 0, pixel_x = rand(-16, 16), pixel_y = rand(-16, 16), time = rand(8, 18)) + + addtimer(CALLBACK(src, .proc/DoTheDrain, user, target, iteration + 1), (0.5 SECONDS)) diff --git a/code/modules/spells/aimed/onrush.dm b/code/modules/spells/aimed/onrush.dm new file mode 100644 index 00000000000..c7f1f3e75f6 --- /dev/null +++ b/code/modules/spells/aimed/onrush.dm @@ -0,0 +1,101 @@ +/datum/spell/aimed/onrush + name = "Onrush" + desc = "This spell allows its user to quickly teleport towards their target, perfoming an attack with \ + currently held item. If the target dies or gets destroyed after the attack - spell is cast again \ + freely, until there's no living creatures left." + deactive_msg = "You discharge the onrush spell..." + active_msg = "You charge the onrush spell!" + + charge_max = 20 SECONDS + cooldown_reduc = 5 SECONDS + + invocation = "Irruere!" + invocation_type = INVOKE_SHOUT + level_max = list(UPGRADE_TOTAL = 4, UPGRADE_SPEED = 2, UPGRADE_POWER = 4) + + range = 8 + hud_state = "wiz_onrush" + cast_sound = 'sound/magic/magic_spell.ogg' + + categories = list(SPELL_CATEGORY_MOBILITY) + spell_cost = 2 + mana_cost = 10 + + /// List of mobs that were already attacked in this cast + var/list/already_attacked = list() + /// How many times can this be cast for free, regardless of previous target death + var/free_rushes = 0 + // Current counter of "free rushes" + var/free_rushes_counter = 0 + +/datum/spell/aimed/onrush/TargetCastCheck(mob/living/user, mob/living/target) + if(!istype(target)) + to_chat(user, SPAN_WARNING("The target must be a living creature!")) + return FALSE + if(get_dist(user, target) > range) + to_chat(user, SPAN_WARNING("The target is too far away!")) + return FALSE + if(target.stat) + to_chat(user, SPAN_WARNING("[target] is already dead or unconscious!")) + return FALSE + return ..() + +/datum/spell/aimed/onrush/fire_projectile(mob/living/user, mob/living/target) + . = ..() + already_attacked = list() + free_rushes_counter = free_rushes + remove_ranged_ability() + on_deactivation(user) + RushTarget(user, target) + +/datum/spell/aimed/onrush/proc/RushTarget(mob/living/user, mob/living/target) + var/turf/target_turf = get_step(get_turf(target), pick(GLOB.alldirs)) + var/list/line_list = getline(user, target_turf) + for(var/i = 1 to length(line_list)) + var/turf/T = line_list[i] + var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(T, user.dir, user) + D.alpha = min(150 + i*15, 255) + animate(D, alpha = 0, time = 2 + i*2) + user.forceMove(target_turf) + playsound(get_turf(user), 'sound/simple_mob/abnormality/white_night/spear_dash.ogg', 50, TRUE) + OnrushAttack(user, target) + if(!QDELETED(target)) + already_attacked |= target + addtimer(CALLBACK(src, .proc/CheckAndRepeat, user, target), rand(3, 6)) + +/datum/spell/aimed/onrush/proc/OnrushAttack(mob/living/user, mob/living/target) + user.next_move = 0 + user.next_click = 0 + user.a_intent_change(I_HURT) + user.ClickOn(target) + +// Looks for valid mobs in view and attacks one +/datum/spell/aimed/onrush/proc/CheckAndRepeat(mob/living/user, mob/living/target) + if(!QDELETED(target) && target.stat != DEAD) + if(!free_rushes_counter) + already_attacked = list() + return FALSE + free_rushes_counter -= 1 + + var/list/valid_mobs = list() + for(var/mob/living/L in view(6, user)) + if(L == user) + continue + if(L in already_attacked) + continue + if(L.stat == DEAD) + continue + valid_mobs += L + if(!LAZYLEN(valid_mobs)) + already_attacked = list() + return + var/mob/living/new_target = pick(valid_mobs) + RushTarget(user, new_target) + +/datum/spell/aimed/onrush/ImproveSpellPower() + if(!..()) + return FALSE + + free_rushes += 2 + + return "The [src] spell will now additionaly charge [free_rushes] times for free." diff --git a/code/modules/spells/aimed/passage.dm b/code/modules/spells/aimed/passage.dm index af67cb71e34..2a01d760892 100644 --- a/code/modules/spells/aimed/passage.dm +++ b/code/modules/spells/aimed/passage.dm @@ -1,8 +1,6 @@ /datum/spell/aimed/passage name = "Passage" - desc = "throw a spell towards an area and teleport to it." - feedback = "PA" - school = "conjuration" + desc = "Throw a spell towards an area and teleport to it." charge_max = 250 spell_flags = 0 invocation = "A'YASAMA" @@ -12,7 +10,6 @@ spell_flags = NEEDSCLOTHES duration = 15 projectile_type = /obj/item/projectile/spell_projectile/passage - var/amt_paralysis = 0 active_msg = "You prepare to cast the bolt of passage!" deactive_msg = "You decide against using the bolt of passage." @@ -20,6 +17,12 @@ hud_state = "gen_project" cast_sound = 'sound/magic/lightning_bolt.ogg' + categories = list(SPELL_CATEGORY_MOBILITY) + spell_cost = 1 + mana_cost = 5 + + var/amt_paralysis = 1 + /datum/spell/aimed/passage/prox_cast(list/targets, atom/spell_holder) for(var/mob/living/L in targets) L.Paralyse(amt_paralysis) @@ -32,14 +35,15 @@ S.start() playsound(src, 'sound/magic/lightningshock.ogg', 50) -/datum/spell/aimed/passage/empower_spell() +/datum/spell/aimed/passage/ImproveSpellPower() if(!..()) return 0 amt_paralysis += 2 - return "[src] now stuns those who get hit by it." + return "[src] now stuns those who get hit by it for longer duration." /obj/item/projectile/spell_projectile/passage name = "bolt of passage" icon_state = "energy2" + speed = 0.8 diff --git a/code/modules/spells/aimed/restore_limbs.dm b/code/modules/spells/aimed/restore_limbs.dm new file mode 100644 index 00000000000..9d0a9a10270 --- /dev/null +++ b/code/modules/spells/aimed/restore_limbs.dm @@ -0,0 +1,84 @@ +/datum/spell/aimed/restore_limbs + name = "Restore Limbs" + desc = "Restores internal damage within the limbs, including broken bones, internal bleeding and missing limbs." + deactive_msg = "You discharge the limb restoration spell..." + active_msg = "You charge the limb restoration spell!" + + charge_max = 60 SECONDS + cooldown_reduc = 20 SECONDS + + invocation = "Membrum Di'Nath!" + invocation_type = INVOKE_SHOUT + level_max = list(UPGRADE_TOTAL = 2, UPGRADE_SPEED = 1, UPGRADE_POWER = 2) + + hud_state = "wiz_restore_limbs" + cast_sound = 'sound/magic/staff_healing.ogg' + + range = 1 + + categories = list(SPELL_CATEGORY_HEALING) + spell_cost = 5 + mana_cost = 25 + + var/restore_missing_limbs = FALSE + /// How many missing limbs can be restored per single cast + var/restore_missing_limbs_count = 1 + +/datum/spell/aimed/restore_limbs/TargetCastCheck(mob/living/user, mob/living/target) + if(!ishuman(target)) + to_chat(user, SPAN_WARNING("The target must be a humanoid creature!")) + return FALSE + if(get_dist(user, target) > range) + to_chat(user, SPAN_WARNING("The target is too far away!")) + return FALSE + return ..() + +/datum/spell/aimed/restore_limbs/fire_projectile(mob/living/user, mob/living/carbon/human/H) + . = ..() + for(var/obj/item/organ/external/E in H.bad_external_organs) + if(E.status & ORGAN_ARTERY_CUT) + E.status &= ~ORGAN_ARTERY_CUT + if(E.status & ORGAN_TENDON_CUT) + E.status &= ~ORGAN_TENDON_CUT + if(E.status & ORGAN_BLEEDING) + E.status &= ~ORGAN_BLEEDING + if(E.status & ORGAN_BROKEN) + E.status &= ~ORGAN_BROKEN + + if(restore_missing_limbs) + // Remove all stumps first + for(var/O in H.organs_by_name) + var/obj/item/organ/external/E = H.organs_by_name[O] + if(E.is_stump()) + H.visible_message(SPAN_WARNING("\The [E.name] falls apart!")) + qdel(E) + var/list/missing_limbs = H.species.has_limbs - H.organs_by_name + for(var/i = 1 to restore_missing_limbs_count) + if(!LAZYLEN(missing_limbs)) + break + var/o_type = pick(missing_limbs) + missing_limbs -= o_type + var/limb_type = H.species.has_limbs[o_type]["path"] + var/obj/new_limb = new limb_type(H) + H.visible_message(SPAN_NOTICE(SPAN_BOLD("A new [new_limb.name] grows on \the [H]!"))) + + H.regenerate_icons() + + var/obj/o = new /obj/effect/temp_visual/temporary(get_turf(H), 15, 'icons/effects/effects.dmi', "green_sparkles") + o.color = COLOR_GREEN + + to_chat(H, SPAN_NOTICE(SPAN_BOLD("Your bones and wounds seem to mend themselves!"))) + + return TRUE + +/datum/spell/aimed/restore_limbs/ImproveSpellPower() + if(!..()) + return FALSE + + if(spell_levels[UPGRADE_POWER] == 1) + restore_missing_limbs = TRUE + return "The [src] spell is now capable of restoring missing limbs." + + restore_missing_limbs_count += 1 + + return "The [src] spell is now capable of restoring [restore_missing_limbs_count] missing limbs." diff --git a/code/modules/spells/aimed/spark_bolt.dm b/code/modules/spells/aimed/spark_bolt.dm new file mode 100644 index 00000000000..5ecad6375ff --- /dev/null +++ b/code/modules/spells/aimed/spark_bolt.dm @@ -0,0 +1,45 @@ +/datum/spell/aimed/spark_bolt + name = "Spark Bolt" + desc = "This spell fires a few weak spark bolts." + charge_max = 16 SECONDS + cooldown_reduc = 2 SECONDS + spell_flags = 0 + invocation_type = INVOKE_NONE + range = 20 + projectile_type = /obj/item/projectile/spark_bolt + projectile_amount = 5 + ranged_clickcd = 4 // Pew-pew + hud_state = "wiz_sparkbolt" + cast_sound = 'sound/magic/shot.ogg' + active_msg = "You prepare to cast spark bolt!" + deactive_msg = "You dissipate the spark bolt." + + level_max = list(UPGRADE_TOTAL = 4, UPGRADE_SPEED = 2, UPGRADE_POWER = 2) + + categories = list() + spell_cost = 2 + mana_cost = 0.5 // Per projectile, mind you + +/datum/spell/aimed/spark_bolt/ImproveSpellPower() + if(!..()) + return FALSE + + projectile_amount += 3 + + return "The spell [src] now has more projectiles stored per cast." + +/datum/spell/aimed/spark_bolt/ImproveSpellSpeed() + if(!..()) + return FALSE + + ranged_clickcd = max(0.5, ranged_clickcd - 1.5) + + return "The spell [src] now has lower cooldown and attack delay." + +// Projectile +/obj/item/projectile/spark_bolt + name = "spark bolt" + icon_state = "sparkbolt" + fire_sound = 'sound/magic/shot.ogg' + damage = 15 + damage_type = BURN diff --git a/code/modules/spells/aimed/spell_steal.dm b/code/modules/spells/aimed/spell_steal.dm new file mode 100644 index 00000000000..ea7d8fb914f --- /dev/null +++ b/code/modules/spells/aimed/spell_steal.dm @@ -0,0 +1,105 @@ +#define UPGRADE_STEAL_DURATION "steal duration" + +/datum/spell/aimed/spell_steal + name = "Spell Steal" + desc = "Temporarily grants you a perfect copy of the spell that was last cast by the target creature." + deactive_msg = "You discharge the spell steal..." + active_msg = "You charge the spell steal!" + + charge_max = 35 SECONDS + cooldown_reduc = 10 SECONDS + + invocation = "Furtum!" + invocation_type = INVOKE_SHOUT + + level_max = list(UPGRADE_TOTAL = 4, UPGRADE_SPEED = 2, UPGRADE_POWER = 2, UPGRADE_STEAL_DURATION = 2) + upgrade_cost = list(UPGRADE_SPEED = 5, UPGRADE_POWER = 10, UPGRADE_STEAL_DURATION = 5) + + range = 5 + + hud_state = "wiz_spell_steal" + + cast_sound = 'sound/magic/spell_steal.ogg' + + spell_cost = 8 + mana_cost = 20 + + var/stolen_spell_duration = 30 SECONDS + var/list/blacklisted_spell_types = list( + /datum/spell/aimed/spell_steal, + + ) + var/list/stolen_spells = list() + +/datum/spell/aimed/spell_steal/Destroy() + for(var/datum/spell/S in stolen_spells) + QDEL_NULL(S) + stolen_spells = null + return ..() + +/datum/spell/aimed/spell_steal/TargetCastCheck(mob/living/user, mob/living/target) + if(!isliving(target) || !target.mind) + to_chat(user, SPAN_WARNING("The target must be a living creature!")) + return FALSE + if(target == user) + to_chat(user, SPAN_WARNING("You cannot steal spells from yourself!")) + return FALSE + if(!istype(target.mind.last_used_spell)) + to_chat(user, SPAN_WARNING("The target hasn't cast any spells recently!")) + return FALSE + if(target.mind.last_used_spell.type in blacklisted_spell_types) + to_chat(user, SPAN_WARNING("The target's last spell is impossible to steal!")) + return FALSE + if(get_dist(user, target) > range) + to_chat(user, SPAN_WARNING("The target is too far away!")) + return FALSE + return ..() + +/datum/spell/aimed/spell_steal/fire_projectile(mob/living/user, mob/living/target) + . = ..() + var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(get_turf(target), target.dir, target) + D.alpha = 125 + D.color = COLOR_GREEN + animate(D, pixel_x = (user.x - target.x) * world.icon_size, pixel_y = (user.y - target.y) * world.icon_size, alpha = 55, time = 4) + animate(alpha = 0, time = 2) + var/datum/spell/S = new target.mind.last_used_spell.type + for(var/datum/spell/SS in stolen_spells) + if(SS.type == S.type) + ForgetSpell(SS) + // Do the upgrades! + for(var/up_type in S.spell_levels) + if(target.mind.last_used_spell.spell_levels[up_type]) + // Stolen spells will be upgraded to the same level as that of the original + our own power upgrade level + for(var/i = 1 to target.mind.last_used_spell.spell_levels[up_type] + spell_levels[UPGRADE_POWER]) + S.ImproveSpell(up_type, TRUE) + // To prevent shenanigans with "Consume Magic" + S.total_points_used = 0 + user.add_spell(S) + stolen_spells += S + addtimer(CALLBACK(src, .proc/ForgetSpell, S), stolen_spell_duration) + +/datum/spell/aimed/spell_steal/ImproveSpell(upgrade_type) + . = ..() + if(!.) + return + + if(upgrade_type == UPGRADE_STEAL_DURATION) + return ImproveSpellStealDuration() + +/datum/spell/aimed/spell_steal/ImproveSpellPower() + return "The stolen spells are now stronger." + +/datum/spell/aimed/spell_steal/proc/ImproveSpellStealDuration() + stolen_spell_duration += 30 SECONDS + return "The stolen spells now remain under your control for [stolen_spell_duration / 10] seconds!" + +/datum/spell/aimed/spell_steal/proc/ForgetSpell(datum/spell/S) + if(QDELETED(src) || QDELETED(S)) + return + + var/mob/living/user = holder + to_chat(user, SPAN_WARNING(SPAN_BOLD("You forget how to use [S.name] spell!"))) + stolen_spells -= S + user.remove_spell(S) + +#undef UPGRADE_STEAL_DURATION diff --git a/code/modules/spells/aimed/swap.dm b/code/modules/spells/aimed/swap.dm new file mode 100644 index 00000000000..457aa995c51 --- /dev/null +++ b/code/modules/spells/aimed/swap.dm @@ -0,0 +1,48 @@ +/datum/spell/aimed/swap + name = "Swap" + desc = "This spell swaps the positions of the wizard and a target." + deactive_msg = "You discharge the swap spell..." + active_msg = "You charge the swap spell!" + + invocation = "Joyo!" + invocation_type = INVOKE_WHISPER + + level_max = list(UPGRADE_TOTAL = 2, UPGRADE_SPEED = 0, UPGRADE_POWER = 2) + + spell_flags = 0 + range = 6 + + hud_state = "wiz_swap" + + cast_sound = 'sound/magic/blink.ogg' + + spell_cost = 1 + mana_cost = 5 + + var/eye_blind = 0 + +/datum/spell/aimed/swap/TargetCastCheck(mob/living/user, mob/living/target) + if(!isliving(target)) + to_chat(user, SPAN_WARNING("The target must be a living creature!")) + return FALSE + if(get_dist(user, target) > range) + to_chat(user, SPAN_WARNING("The target is too far away!")) + return FALSE + return ..() + +/datum/spell/aimed/swap/fire_projectile(mob/living/user, mob/living/target) + . = ..() + var/turf/target_turf = get_turf(target) + var/turf/user_turf = get_turf(user) + + target.forceMove(user_turf) + user.forceMove(target_turf) + + target.eye_blind += eye_blind + +/datum/spell/aimed/swap/ImproveSpellPower() + if(!..()) + return FALSE + + eye_blind += 2 + return "The [src] spell will now blind the target[eye_blind > 2 ? " even more" : ""]." diff --git a/code/modules/spells/aimed/water_slash.dm b/code/modules/spells/aimed/water_slash.dm new file mode 100644 index 00000000000..db843221f8d --- /dev/null +++ b/code/modules/spells/aimed/water_slash.dm @@ -0,0 +1,89 @@ +/datum/spell/aimed/water_slash + name = "Water Slash" + desc = "This spell manifests a sharp stream of water that slices everyone in its way." + deactive_msg = "You discharge the slash spell..." + active_msg = "You charge the slash spell!" + + charge_max = 20 SECONDS + cooldown_reduc = 5 SECONDS + + invocation = "Wa Sli!" + invocation_type = INVOKE_SHOUT + level_max = list(UPGRADE_TOTAL = 3, UPGRADE_SPEED = 2, UPGRADE_POWER = 2) + + range = 8 + hud_state = "wiz_slash" + cast_sound = 'sound/magic/water.ogg' + spell_cost = 2 + mana_cost = 10 + + var/slash_damage = 50 + var/slash_distance = 4 + var/slash_color = COLOR_DEEP_SKY_BLUE + +/datum/spell/aimed/water_slash/TargetCastCheck(mob/living/user, mob/living/target) + if(get_dist(user, target) > range) + to_chat(user, SPAN_WARNING("The target is too far away!")) + return FALSE + return ..() + +/datum/spell/aimed/water_slash/fire_projectile(mob/living/user, mob/living/target) + . = ..() + var/turf/start_turf = get_turf(user) + var/turf/target_turf = get_ranged_target_turf_direct(start_turf, target, slash_distance) + /// The turf where the slash effect will visibly travel + var/turf/move_turf = start_turf + var/list/attack_line = list() + for(var/turf/T in getline(start_turf, target_turf)) + if(T == start_turf) + continue + if(T.density) + break + var/dense_obj = FALSE + for(var/obj/O in T) + if(O.density && !istype(O, /obj/structure/table) && !istype(O, /obj/structure/railing)) + dense_obj = TRUE + break + if(dense_obj) + break + attack_line += T + move_turf = T + + var/obj/effect/temp_visual/slash/S = new(start_turf) + S.color = slash_color + var/matrix/M = new + M.Turn(Get_Angle(start_turf, target_turf)) + S.transform = M + animate(S, alpha = 225, pixel_x = (move_turf.x - start_turf.x) * world.icon_size, pixel_y = (move_turf.y - start_turf.y) * world.icon_size, transform = matrix(S.transform) * 3, time = 1.5) + addtimer(CALLBACK(S, /obj/effect/temp_visual/slash/proc/FadeOut), 1.5) + var/list/already_hit = list() + for(var/turf/T in attack_line) + for(var/turf/TT in range(1, T)) + for(var/mob/living/L in TT) + if(L == user) + continue + if(L in already_hit) + continue + already_hit |= L + L.apply_damage(slash_damage, BRUTE, null, DAM_EDGE|DAM_SHARP) + var/turf/simulated/LT = get_turf(L) + var/blood_col = COLOR_RED + if(isanimal(L)) + var/mob/living/simple_animal/SA = L + blood_col = SA.bleed_colour + else if(ishuman(L)) + var/mob/living/carbon/human/H = L + blood_col = H.species.blood_color + // BLOOD BLOOD BLOOD + for(var/i = 1 to min(round(slash_damage * 0.05), 15)) + new /obj/effect/temp_visual/bloodsplatter(LT, prob(25) ? pick(GLOB.alldirs) : get_dir(LT, start_turf), blood_col) + if(!istype(LT)) + continue + LT.add_blood(L) + +/datum/spell/aimed/water_slash/ImproveSpellPower() + if(!..()) + return FALSE + + slash_damage += 25 + return "The [src] spell now deals [slash_damage] damage." diff --git a/code/modules/spells/aoe_turf/blink.dm b/code/modules/spells/aoe_turf/blink.dm deleted file mode 100644 index fb83fbe8668..00000000000 --- a/code/modules/spells/aoe_turf/blink.dm +++ /dev/null @@ -1,44 +0,0 @@ -/datum/spell/aoe_turf/blink - name = "Blink" - desc = "This spell randomly teleports you a short distance." - feedback = "BL" - school = "conjuration" - charge_max = 20 - spell_flags = Z2NOCAST | IGNOREDENSE | IGNORESPACE - invocation = "none" - invocation_type = INVOKE_NONE - range = 7 - inner_radius = 1 - - level_max = list(UPGRADE_TOTAL = 4, UPGRADE_SPEED = 4, UPGRADE_POWER = 4) - cooldown_min = 5 //4 deciseconds reduction per rank - hud_state = "wiz_blink" - cast_sound = 'sound/magic/blink.ogg' - -/datum/spell/aoe_turf/blink/cast(var/list/targets, mob/user) - if(!targets.len) - return - - var/turf/T = pick(targets) - var/turf/starting = get_turf(user) - if(T) - if(user.buckled) - user.buckled = null - user.forceMove(T) - - var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread() - smoke.set_up(3, 0, starting) - smoke.start() - - smoke = new() - smoke.set_up(3, 0, T) - smoke.start() - - return - -/datum/spell/aoe_turf/blink/empower_spell() - if(!..()) - return 0 - inner_radius += 1 - - return "You've increased the inner range of [src]." \ No newline at end of file diff --git a/code/modules/spells/aoe_turf/charge.dm b/code/modules/spells/aoe_turf/charge.dm index 348f1bad920..01bfc5931e6 100644 --- a/code/modules/spells/aoe_turf/charge.dm +++ b/code/modules/spells/aoe_turf/charge.dm @@ -2,7 +2,6 @@ name = "Charge" desc = "This spell can be used to charge up spent magical artifacts, among other things." - school = "transmutation" charge_max = 600 spell_flags = 0 invocation = "DIRI CEL" @@ -13,6 +12,9 @@ hud_state = "wiz_charge" cast_sound = 'sound/magic/charge.ogg' + spell_cost = 2 + mana_cost = 25 + /datum/spell/aoe_turf/charge/cast(var/list/targets, mob/user) for(var/turf/T in targets) depth_cast(T) @@ -69,4 +71,4 @@ charge_type = SPELL_HOLDVAR holder_var_type = "bruteloss" - holder_var_amount = 30 \ No newline at end of file + holder_var_amount = 30 diff --git a/code/modules/spells/aoe_turf/conjure/conjure.dm b/code/modules/spells/aoe_turf/conjure/conjure.dm index 0143ad0f2a8..26187ab506e 100644 --- a/code/modules/spells/aoe_turf/conjure/conjure.dm +++ b/code/modules/spells/aoe_turf/conjure/conjure.dm @@ -4,11 +4,8 @@ How they spawn stuff is decided by behaviour vars, which are explained below */ /datum/spell/aoe_turf/conjure - name = "Conjure" desc = "This spell conjures objs of the specified types in range." - school = "conjuration" //funny, that - var/list/summon_type = list() //determines what exactly will be summoned //should NOT be text, like list(/obj/machinery/bot/ed209) diff --git a/code/modules/spells/aoe_turf/conjure/construct.dm b/code/modules/spells/aoe_turf/conjure/construct.dm index 05c2b1cb54f..92234dbcf4b 100644 --- a/code/modules/spells/aoe_turf/conjure/construct.dm +++ b/code/modules/spells/aoe_turf/conjure/construct.dm @@ -4,7 +4,6 @@ name = "Artificer" desc = "This spell conjures a construct which may be controlled by Shades." - school = "conjuration" charge_max = 600 spell_flags = 0 invocation = "none" @@ -13,6 +12,8 @@ summon_type = list(/obj/structure/constructshell) + spell_book_visible = FALSE + hud_state = "artificer" cast_sound = 'sound/items/Deconstruct.ogg' @@ -33,6 +34,8 @@ range = 0 summon_type = list(/turf/simulated/floor/cult) + spell_book_visible = FALSE + hud_state = "const_floor" cast_sound = 'sound/items/Welder.ogg' @@ -47,21 +50,9 @@ range = 0 summon_type = list(/turf/simulated/wall/cult) - hud_state = "const_wall" - cast_sound = 'sound/items/Welder.ogg' - -/datum/spell/aoe_turf/conjure/wall/reinforced - name = "Greater Construction" - desc = "This spell constructs a reinforced metal wall." - - charge_max = 300 - spell_flags = Z2NOCAST - invocation = "none" - invocation_type = INVOKE_NONE - range = 0 - cast_delay = 50 + spell_book_visible = FALSE - summon_type = list(/turf/simulated/wall/r_wall) + hud_state = "const_wall" cast_sound = 'sound/items/Welder.ogg' /datum/spell/aoe_turf/conjure/soulstone @@ -76,6 +67,8 @@ summon_type = list(/obj/item/device/soulstone) + spell_book_visible = FALSE + hud_state = "const_stone" override_base = "const" cast_sound = 'sound/items/Welder.ogg' @@ -92,6 +85,8 @@ summon_type = list(/obj/structure/cult/pylon) + spell_book_visible = FALSE + hud_state = "const_pylon" cast_sound = 'sound/items/Welder.ogg' @@ -107,6 +102,8 @@ summon_type = list(/obj/effect/forcefield/cult) duration = 200 + spell_book_visible = FALSE + hud_state = "const_juggwall" cast_sound = 'sound/magic/forcewall.ogg' diff --git a/code/modules/spells/aoe_turf/conjure/druidic_spells.dm b/code/modules/spells/aoe_turf/conjure/druidic_spells.dm index 5a929570482..b907defc14b 100644 --- a/code/modules/spells/aoe_turf/conjure/druidic_spells.dm +++ b/code/modules/spells/aoe_turf/conjure/druidic_spells.dm @@ -19,7 +19,6 @@ /datum/spell/aoe_turf/conjure/summon/bats name = "Summon Space Bats" desc = "This spell summons a flock of spooky space bats." - feedback = "SB" charge_max = 1200 //2 minutes spell_flags = NEEDSCLOTHES @@ -35,7 +34,10 @@ hud_state = "wiz_bats" -/datum/spell/aoe_turf/conjure/summon/bats/empower_spell() + spell_cost = 2 + mana_cost = 10 + +/datum/spell/aoe_turf/conjure/summon/bats/ImproveSpellPower() if(!..()) return 0 @@ -72,7 +74,7 @@ ..() newVars["master"] = holder //why not do this in the beginning? MIND SWITCHING. -/datum/spell/aoe_turf/conjure/summon/bear/empower_spell() +/datum/spell/aoe_turf/conjure/summon/bear/ImproveSpellPower() if(!..()) return 0 switch(spell_levels[UPGRADE_POWER]) diff --git a/code/modules/spells/aoe_turf/conjure/faithful_hound.dm b/code/modules/spells/aoe_turf/conjure/faithful_hound.dm index 57c1a91780b..8f3cd8fd96c 100644 --- a/code/modules/spells/aoe_turf/conjure/faithful_hound.dm +++ b/code/modules/spells/aoe_turf/conjure/faithful_hound.dm @@ -1,7 +1,6 @@ /datum/spell/aoe_turf/conjure/faithful_hound name = "Faithful Hound" desc = "Summon a spectral watchdog with a special password. Anyone without the password is in for a barking and a biting." - feedback = "FH" charge_max = 600 spell_flags = NEEDSCLOTHES @@ -13,11 +12,10 @@ summon_type = list(/mob/living/simple_animal/faithful_hound) hud_state = "wiz_hound" + spell_cost = 3 + mana_cost = 10 + /datum/spell/aoe_turf/conjure/faithful_hound/before_cast() ..() var/password = sanitize(input("What password will this beast listen to?") as text, MAX_NAME_LEN) newVars = list("password" = password, "allowed_mobs" = list(usr)) - -/datum/spell/aoe_turf/conjure/faithful_hound/tower - charge_max = 1 - spell_flags = 0 diff --git a/code/modules/spells/aoe_turf/conjure/force_portal.dm b/code/modules/spells/aoe_turf/conjure/force_portal.dm index 98322e3cffd..462d4898932 100644 --- a/code/modules/spells/aoe_turf/conjure/force_portal.dm +++ b/code/modules/spells/aoe_turf/conjure/force_portal.dm @@ -1,8 +1,6 @@ /datum/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.." - school = "conjuration" - feedback = "FP" summon_type = list(/obj/effect/force_portal) charge_max = 200 spell_flags = NEEDSCLOTHES @@ -11,6 +9,5 @@ hud_state = "wiz_force" -/datum/spell/aoe_turf/conjure/force_portal/tower - charge_max = 2 - spell_flags = 0 \ No newline at end of file + spell_cost = 2 + mana_cost = 20 diff --git a/code/modules/spells/aoe_turf/conjure/forcewall.dm b/code/modules/spells/aoe_turf/conjure/forcewall.dm index a81cfe008aa..f3b46a1ef89 100644 --- a/code/modules/spells/aoe_turf/conjure/forcewall.dm +++ b/code/modules/spells/aoe_turf/conjure/forcewall.dm @@ -1,8 +1,6 @@ /datum/spell/aoe_turf/conjure/forcewall name = "Forcewall" desc = "Create a wall of pure energy at your location." - school = "conjuration" - feedback = "FW" summon_type = list(/obj/effect/forcefield) duration = 300 charge_max = 100 @@ -12,10 +10,12 @@ hud_state = "wiz_shield" + spell_cost = 2 + mana_cost = 10 + /datum/spell/aoe_turf/conjure/forcewall/mime name = "Invisible wall" desc = "Create an invisible wall on your location." - school = "mime" panel = "Mime" summon_type = list(/obj/effect/forcefield/mime) invocation_type = INVOKE_EMOTE @@ -26,6 +26,8 @@ override_base = "grey" hud_state = "mime_wall" + mana_cost = 0 + /obj/effect/forcefield desc = "A space wizard's magic wall." name = "FORCEWALL" @@ -47,6 +49,3 @@ icon_state = "empty" name = "invisible wall" desc = "You have a bad feeling about this." - -/datum/spell/aoe_turf/conjure/forcewall/tower - charge_max = 3 diff --git a/code/modules/spells/aoe_turf/conjure/grove.dm b/code/modules/spells/aoe_turf/conjure/grove.dm index 2fd7683982d..9fd8698ae75 100644 --- a/code/modules/spells/aoe_turf/conjure/grove.dm +++ b/code/modules/spells/aoe_turf/conjure/grove.dm @@ -4,7 +4,6 @@ spell_flags = IGNOREDENSE | IGNORESPACE | NEEDSCLOTHES | Z2NOCAST | IGNOREPREV charge_max = 1200 - school = "transmutation" range = 1 cooldown_min = 600 @@ -18,6 +17,9 @@ var/seed_type = /datum/seed/merlin_tear cast_sound = 'sound/magic/repulse.ogg' + spell_cost = 2 + mana_cost = 15 + /datum/spell/aoe_turf/conjure/grove/New() ..() if(seed_type) @@ -34,7 +36,6 @@ /datum/spell/aoe_turf/conjure/grove/sanctuary name = "Sanctuary" desc = "Creates a sanctuary of nature around the wizard as well as creating a healing plant." - feedback = "SY" invocation = "Bo K'Iitan!" invocation_type = INVOKE_SHOUT spell_flags = IGNOREDENSE | IGNORESPACE | NEEDSCLOTHES | Z2NOCAST | IGNOREPREV @@ -47,7 +48,10 @@ hud_state = "wiz_grove" -/datum/spell/aoe_turf/conjure/grove/sanctuary/empower_spell() + spell_cost = 4 + mana_cost = 30 + +/datum/spell/aoe_turf/conjure/grove/sanctuary/ImproveSpellPower() if(!..()) return 0 diff --git a/code/modules/spells/aoe_turf/disable_tech.dm b/code/modules/spells/aoe_turf/disable_tech.dm index aca49dd67a2..b5bcb0367df 100644 --- a/code/modules/spells/aoe_turf/disable_tech.dm +++ b/code/modules/spells/aoe_turf/disable_tech.dm @@ -1,7 +1,6 @@ /datum/spell/aoe_turf/disable_tech name = "Disable Tech" desc = "This spell disables all weapons, cameras and most other technology in range." - feedback = "DT" charge_max = 400 spell_flags = NEEDSCLOTHES invocation = "NEC CANTIO" @@ -18,13 +17,16 @@ hud_state = "wiz_tech" cast_sound = 'sound/magic/disable_tech.ogg' + spell_cost = 3 + mana_cost = 15 + /datum/spell/aoe_turf/disable_tech/cast(list/targets) for(var/turf/target in targets) empulse(get_turf(target), emp_heavy, emp_light) return -/datum/spell/aoe_turf/disable_tech/empower_spell() +/datum/spell/aoe_turf/disable_tech/ImproveSpellPower() if(!..()) return 0 emp_heavy += 2 diff --git a/code/modules/spells/aoe_turf/drain_blood.dm b/code/modules/spells/aoe_turf/drain_blood.dm index 2584c8accf7..1c0725a1394 100644 --- a/code/modules/spells/aoe_turf/drain_blood.dm +++ b/code/modules/spells/aoe_turf/drain_blood.dm @@ -1,8 +1,6 @@ /datum/spell/aoe_turf/drain_blood name = "Drain Blood" desc = "this spell allows the caster to borrow blood from those around them. Sharing is caring!" - feedback = "DB" - school = "transmutation" charge_max = 600 invocation = "whispers something darkly" invocation_type = INVOKE_EMOTE @@ -14,6 +12,9 @@ cast_sound = 'sound/effects/squelch2.ogg' hud_state = "const_rune" + spell_cost = 3 + mana_cost = 20 + /datum/spell/aoe_turf/drain_blood/cast(var/list/targets, var/mob/user) for(var/t in targets) for(var/mob/living/L in t) @@ -63,4 +64,4 @@ /obj/effect/projectile/blood - icon_state = "blood" \ No newline at end of file + icon_state = "blood" diff --git a/code/modules/spells/aoe_turf/exchange_wounds.dm b/code/modules/spells/aoe_turf/exchange_wounds.dm index 1ab6f76d9ea..f71dcd2e0e6 100644 --- a/code/modules/spells/aoe_turf/exchange_wounds.dm +++ b/code/modules/spells/aoe_turf/exchange_wounds.dm @@ -1,8 +1,6 @@ /datum/spell/aoe_turf/exchange_wounds name = "Exchange Wounds" desc = "Syphon the wounds from your allies." - feedback = "EW" - school = "transmutation" invocation = "Esh Yek Vai!" invocation_type = INVOKE_SHOUT charge_max = 400 @@ -17,6 +15,9 @@ hud_state = "wiz_exchange" + spell_cost = 2 + mana_cost = 10 + /datum/spell/aoe_turf/exchange_wounds/perform() amt_healed = 0 ..() diff --git a/code/modules/spells/aoe_turf/fire_ring.dm b/code/modules/spells/aoe_turf/fire_ring.dm new file mode 100644 index 00000000000..b1bffea575e --- /dev/null +++ b/code/modules/spells/aoe_turf/fire_ring.dm @@ -0,0 +1,46 @@ +/datum/spell/aoe_turf/fire_ring + name = "Ring of Fire" + desc = "The spell envelopes the area around user in fire." + spell_flags = NEEDSCLOTHES | IGNOREDENSE + invocation = "Ignis anulus!" + invocation_type = INVOKE_SHOUT + + range = 1 + inner_radius = 0 + + level_max = list(UPGRADE_TOTAL = 3, UPGRADE_SPEED = 2, UPGRADE_POWER = 2) + + charge_max = 30 SECONDS + cooldown_min = 5 SECONDS + cooldown_reduc = 10 SECONDS + + hud_state = "wiz_fire_ring" + cast_sound = 'sound/magic/fire.ogg' + + spell_cost = 3 + mana_cost = 15 + categories = list(SPELL_CATEGORY_FIRE) + + var/flame_power = 20 + var/flame_color = COLOR_ORANGE + +/datum/spell/aoe_turf/fire_ring/cast(list/targets, mob/user) + if(!LAZYLEN(targets)) + return + + var/turf/user_turf = get_turf(user) + for(var/turf/T in targets) + var/obj/effect/turf_fire/TF = T.IgniteTurf(flame_power, flame_color) + if(istype(TF)) + TF.interact_with_atmos = FALSE + TF.pixel_x = (user_turf.x - T.x) * world.icon_size + TF.pixel_y = (user_turf.y - T.y) * world.icon_size + animate(TF, pixel_x = 0, pixel_y = 0, time = 3, easing = EASE_OUT) + +/datum/spell/aoe_turf/fire_ring/ImproveSpellPower() + if(!..()) + return FALSE + + range += 1 + + return "You've increased the radius of [src]." diff --git a/code/modules/spells/aoe_turf/knock.dm b/code/modules/spells/aoe_turf/knock.dm index 5a20e9ca450..e31c0f23f5e 100644 --- a/code/modules/spells/aoe_turf/knock.dm +++ b/code/modules/spells/aoe_turf/knock.dm @@ -1,8 +1,6 @@ /datum/spell/aoe_turf/knock name = "Knock" desc = "This spell opens nearby doors and does not require wizard garb." - feedback = "KN" - school = "transmutation" charge_max = 100 spell_flags = 0 invocation = "Aulie Oxin Fiera." @@ -14,6 +12,9 @@ hud_state = "wiz_knock" cast_sound = 'sound/magic/knock.ogg' + spell_cost = 1 + mana_cost = 5 + /datum/spell/aoe_turf/knock/cast(list/targets) for(var/turf/T in targets) for(var/obj/machinery/door/door in T.contents) @@ -25,7 +26,7 @@ return -/datum/spell/aoe_turf/knock/empower_spell() +/datum/spell/aoe_turf/knock/ImproveSpellPower() if(!..()) return 0 range *= 2 @@ -35,6 +36,3 @@ /datum/spell/aoe_turf/knock/slow name = "Slow Knock" charge_max = 200 - -/datum/spell/aoe_turf/knock/tower - charge_max = 2 \ No newline at end of file diff --git a/code/modules/spells/aoe_turf/random_blink.dm b/code/modules/spells/aoe_turf/random_blink.dm new file mode 100644 index 00000000000..85e2f511f1e --- /dev/null +++ b/code/modules/spells/aoe_turf/random_blink.dm @@ -0,0 +1,51 @@ +/datum/spell/aoe_turf/random_blink + name = "Random blink" + desc = "This spell randomly teleports you a short distance." + + spell_flags = Z2NOCAST | IGNOREDENSE | IGNORESPACE | NO_SOMATIC + invocation = "none" + invocation_type = INVOKE_NONE + range = 4 + inner_radius = 1 + + charge_max = 5 SECONDS + cooldown_reduc = 1.5 SECONDS + cooldown_min = 0.5 SECONDS + + level_max = list(UPGRADE_TOTAL = 4, UPGRADE_SPEED = 3, UPGRADE_POWER = 3) + hud_state = "wiz_blink_random" + cast_sound = 'sound/magic/blink.ogg' + + categories = list(SPELL_CATEGORY_MOBILITY) + spell_cost = 1 + mana_cost = 1 + +/datum/spell/aoe_turf/random_blink/cast(list/targets, mob/living/user) + if(!targets.len) + return + + var/turf/T = pick(targets) + if(!istype(T)) + return + + if(user.buckled) + user.buckled = null + + var/turf/starting = get_turf(user) + user.forceMove(T) + var/list/line_list = getline(starting, T) + for(var/i = 1 to length(line_list)) + var/turf/TT = line_list[i] + var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(TT, user.dir, user) + D.alpha = min(150 + i*15, 255) + animate(D, alpha = 0, time = 2 + i*2) + + if(user.incapacitated(INCAPACITATION_STUNNED|INCAPACITATION_RESTRAINED|INCAPACITATION_BUCKLED_FULLY|INCAPACITATION_FORCELYING|INCAPACITATION_KNOCKOUT)) + charge_counter = -3 SECONDS + to_chat(user, SPAN_WARNING("Castin [src] while incapacitated has put it on a higher cooldown!")) + + return + +/datum/spell/aoe_turf/random_blink/ImproveSpellPower() + range += 1 + return "You've increased the range of [src]." diff --git a/code/modules/spells/aoe_turf/smoke.dm b/code/modules/spells/aoe_turf/smoke.dm index 4334ecef29d..ff9aba70fa9 100644 --- a/code/modules/spells/aoe_turf/smoke.dm +++ b/code/modules/spells/aoe_turf/smoke.dm @@ -1,10 +1,8 @@ /datum/spell/aoe_turf/smoke name = "Smoke" - desc = "This spell spawns a cloud of choking smoke at your location and does not require wizard garb." - feedback = "SM" - school = "transmutation" + desc = "This spell spawns a cloud of choking smoke at your location." charge_max = 120 - spell_flags = 0 + spell_flags = NO_SOMATIC invocation = "none" invocation_type = INVOKE_NONE range = 1 @@ -18,12 +16,12 @@ hud_state = "wiz_smoke" cast_sound = 'sound/magic/smoke.ogg' -/datum/spell/aoe_turf/smoke/empower_spell() + spell_cost = 1 + mana_cost = 5 + +/datum/spell/aoe_turf/smoke/ImproveSpellPower() if(!..()) return 0 smoke_amt += 2 return "[src] will now create more smoke." - -/datum/spell/aoe_turf/smoke/tower - charge_max = 2 \ No newline at end of file diff --git a/code/modules/spells/aoe_turf/summons.dm b/code/modules/spells/aoe_turf/summons.dm index 1554688842c..defe0589138 100644 --- a/code/modules/spells/aoe_turf/summons.dm +++ b/code/modules/spells/aoe_turf/summons.dm @@ -3,17 +3,19 @@ desc = "This spell dispenses wizard justice." summon_type = list(/mob/living/bot/secbot/ed209) - summon_amt = 10 + summon_amt = 8 range = 3 newVars = list("emagged" = 1,"name" = "Wizard's Justicebot") hud_state = "wiz_ed" + spell_cost = 10 + mana_cost = 100 + /datum/spell/aoe_turf/conjure/carp name = "Summon Carp" desc = "This spell conjures a simple carp." - school = "conjuration" charge_max = 1200 spell_flags = NEEDSCLOTHES invocation = "Nouk Fhumm Sacp Risska!" @@ -25,11 +27,13 @@ hud_state = "wiz_carp" + spell_cost = 2 + mana_cost = 10 + /datum/spell/aoe_turf/conjure/creature name = "Summon Creature Swarm" desc = "This spell tears the fabric of reality, allowing horrific daemons to spill forth" - school = "conjuration" charge_max = 1200 spell_flags = 0 invocation = "Ia-Ia! Naomesnalia!" @@ -41,11 +45,12 @@ hud_state = "wiz_creature" + spell_cost = 5 + mana_cost = 50 + /datum/spell/aoe_turf/conjure/mirage name = "Summon Mirage" desc = "This spell summons a harmless carp mirage for a few seconds." - feedback = "MR" - school = "illusion" charge_max = 1200 spell_flags = NEEDSCLOTHES invocation = "Nouk Fhunhm Sacp Risska!" @@ -63,10 +68,13 @@ newVars = list("melee_damage_lower" = 0, "melee_damage_upper" = 0, "break_stuff_probability" = 0) -/datum/spell/aoe_turf/conjure/mirage/empower_spell() + spell_cost = 1 + mana_cost = 5 + +/datum/spell/aoe_turf/conjure/mirage/ImproveSpellPower() if(!..()) return 0 summon_amt++ - return "You now summon [summon_amt] mirages per spellcast." \ No newline at end of file + return "You now summon [summon_amt] mirages per spellcast." diff --git a/code/modules/spells/artifacts/spellbound_servants.dm b/code/modules/spells/artifacts/spellbound_servants.dm index 2292870101c..d928bd455b1 100644 --- a/code/modules/spells/artifacts/spellbound_servants.dm +++ b/code/modules/spells/artifacts/spellbound_servants.dm @@ -72,11 +72,11 @@ equipment = list(/obj/item/clothing/under/caretaker = slot_w_uniform, /obj/item/clothing/shoes/dress/caretakershoes = slot_shoes) spells = list(/datum/spell/toggle_armor/caretaker, - /datum/spell/targeted/heal_target/touch, + /datum/spell/aimed/heal_target, /datum/spell/aoe_turf/knock/slow, - /datum/spell/targeted/heal_target/area/slow, - /datum/spell/targeted/analyze, - /datum/spell/targeted/heal_target/trance + /datum/spell/targeted/heal_target/area, + /datum/spell/hand/analyze_health, + /datum/spell/aimed/heal_target/trance ) /datum/spellbound_type/servant/champion @@ -186,7 +186,7 @@ spells = list(/datum/spell/toggle_armor/overseer, /datum/spell/targeted/ethereal_jaunt, /datum/spell/invisibility, - /datum/spell/targeted/revoke) + /datum/spell/aimed/revoke_death) /datum/spellbound_type/servant/overseer/equip_servant(var/mob/living/carbon/human/H) ..() diff --git a/code/modules/spells/general/acid_spray.dm b/code/modules/spells/general/acid_spray.dm index d90fed587c2..1402ce5e94a 100644 --- a/code/modules/spells/general/acid_spray.dm +++ b/code/modules/spells/general/acid_spray.dm @@ -1,17 +1,22 @@ /datum/spell/acid_spray name = "Acid Spray" desc = "A common spell used to destroy basically anything in front of the wizard." - school = "conjuration" - feedback = "as" spell_flags = 0 - charge_max = 600 + charge_max = 30 SECONDS + + level_max = list(UPGRADE_TOTAL = 0) invocation = "Tagopar lethodar!" invocation_type = INVOKE_SHOUT - var/reagent_type = /datum/reagent/acid/hydrochloric + hud_state = "wiz_acid" cast_sound = 'sound/magic/disintegrate.ogg' + spell_cost = 3 + mana_cost = 10 + + var/reagent_type = /datum/reagent/acid/hydrochloric + /datum/spell/acid_spray/choose_targets(mob/user = usr) perform(user, list(holder)) @@ -25,6 +30,3 @@ chem.set_color() spawn(0) chem.set_up(get_ranged_target_turf(target, angle2dir(angle+mod), 3)) - -/datum/spell/acid_spray/tower - charge_max = 2 diff --git a/code/modules/spells/general/area_teleport.dm b/code/modules/spells/general/area_teleport.dm index d61c878a911..b995c7833e8 100644 --- a/code/modules/spells/general/area_teleport.dm +++ b/code/modules/spells/general/area_teleport.dm @@ -1,8 +1,6 @@ /datum/spell/area_teleport name = "Teleport" desc = "This spell teleports you to a type of area of your selection." - feedback = "TP" - school = "conjuration" charge_max = 60 SECONDS spell_flags = NEEDSCLOTHES invocation = "Scyar Nila!" @@ -19,6 +17,9 @@ hud_state = "wiz_tele" + spell_cost = 3 + mana_cost = 5 + /datum/spell/area_teleport/before_cast() return diff --git a/code/modules/spells/general/contract_spells.dm b/code/modules/spells/general/contract_spells.dm index 1f8228f675f..baf4cf3e460 100644 --- a/code/modules/spells/general/contract_spells.dm +++ b/code/modules/spells/general/contract_spells.dm @@ -5,7 +5,6 @@ name = "Contract Spell" desc = "A spell perfecting the techniques of keeping a servant happy and obedient." - school = "transmutation" spell_flags = 0 invocation = "none" invocation_type = INVOKE_NONE diff --git a/code/modules/spells/general/create_air.dm b/code/modules/spells/general/create_air.dm index 48ff61779ff..d0004cc84d8 100644 --- a/code/modules/spells/general/create_air.dm +++ b/code/modules/spells/general/create_air.dm @@ -10,9 +10,14 @@ number_of_channels = 0 time_between_channels = 200 hud_state = "wiz_air" - var/list/air_change = list(GAS_OXYGEN = ONE_ATMOSPHERE) + number_of_channels = 0 + spell_cost = 1 + mana_cost = 5 + + var/list/air_change = list(GAS_OXYGEN = ONE_ATMOSPHERE) + /datum/spell/create_air/choose_targets(mob/user = usr) var/air = holder.return_air() if(air) @@ -23,6 +28,3 @@ var/datum/gas_mixture/environment = targets[1] for(var/gas in air_change) environment.adjust_gas(gas, air_change[gas]) - -/datum/spell/create_air/tower - charge_max = 5 diff --git a/code/modules/spells/general/end_of_everything.dm b/code/modules/spells/general/end_of_everything.dm new file mode 100644 index 00000000000..11d06a7de55 --- /dev/null +++ b/code/modules/spells/general/end_of_everything.dm @@ -0,0 +1,141 @@ +/datum/spell/end_of_everything + name = "End of Everything" + desc = "Forbidden art of summoning darkest energies from within the veil of magic itself. You are a part of \"everything\", so it might be a bad idea to do it..." + invocation_type = INVOKE_SHOUT + invocation = "Arcesso!" + spell_flags = NEEDSCLOTHES + charge_max = 2 MINUTES + + level_max = list(UPGRADE_TOTAL = 0, UPGRADE_SPEED = 0, UPGRADE_POWER = 0) + cast_sound = 'sound/magic/churchbell.ogg' + hud_state = "wiz_endall" + + categories = list(SPELL_CATEGORY_FORBIDDEN) + spell_book_visible = FALSE + + spell_cost = 100 + mana_cost = 200 + + var/list/active_effects = list() + +/datum/spell/end_of_everything/Destroy() + ClearEffects() + return ..() + +/datum/spell/end_of_everything/choose_targets(mob/user = usr) + perform(user, list(holder)) + +/datum/spell/end_of_everything/cast(list/targets, mob/user) + ClearEffects() + if(!do_after(user, 10 SECONDS)) + to_chat(user, SPAN_NOTICE("You cancel the ritual!")) + ClearEffects() + return + if(!CastCheck(user)) + to_chat(user, SPAN_NOTICE("You cancel the ritual!")) + ClearEffects() + return + + var/turf/T = get_turf(user) + + user.say("Interitus!") + active_effects += new /obj/effect/effect/warp(T) + + if(!do_after(user, 10 SECONDS)) + to_chat(user, SPAN_NOTICE("You cancel the ritual!")) + ClearEffects() + return + if(!CastCheck(user)) + to_chat(user, SPAN_NOTICE("You cancel the ritual!")) + ClearEffects() + return + + user.say("Annihilatio!") + + if(!do_after(user, 10 SECONDS)) + to_chat(user, SPAN_NOTICE("You cancel the ritual!")) + ClearEffects() + return + if(!CastCheck(user)) + to_chat(user, SPAN_NOTICE("You cancel the ritual!")) + ClearEffects() + return + + user.say("Mors et aegritudo!") + + if(!do_after(user, 10 SECONDS)) + to_chat(user, SPAN_NOTICE("You cancel the ritual!")) + ClearEffects() + return + if(!CastCheck(user)) + to_chat(user, SPAN_NOTICE("You cancel the ritual!")) + ClearEffects() + return + + user.say("Cruel gods, end it all!!") + to_chat(user, SPAN_WARNING("You feel like you should run...")) + log_and_message_admins("finished casting [src] spell!", user) + ClearEffects() + + new /obj/effect/end_of_everything(get_turf(user)) + +/datum/spell/end_of_everything/proc/CastCheck(mob/user) + if(!user || QDELETED(user)) + return FALSE + if(user.stat) + return FALSE + return TRUE + +/datum/spell/end_of_everything/proc/ClearEffects() + for(var/datum/D in active_effects) + qdel(D) + active_effects = list() + +// Essentially a delayed all-consuming terror +/obj/effect/end_of_everything + icon = 'icons/effects/160x160.dmi' + icon_state = "end_of_everything" + pixel_x = -64 + pixel_y = -64 + +/obj/effect/end_of_everything/Initialize() + . = ..() + filters += filter(type = "outline", size = 3, color = "#ff000024", flags = OUTLINE_SHARP) + var/matrix/M = transform + transform *= 0.1 // Starts small + animate(src, transform = M, alpha = 175, time = 24 SECONDS) + addtimer(CALLBACK(src, .proc/Annihilation), 25 SECONDS) + +/obj/effect/end_of_everything/proc/Annihilation() + for(var/mob/M in GLOB.player_list) + if(isnewplayer(M)) + continue + if(!(M.z in GetConnectedZlevels(z))) + continue + M.playsound_local(get_turf(M), 'sound/magic/end_of_everything.ogg', 150, FALSE) + to_chat(M, SPAN_USERDANGER("Something terrible has happened...")) + M.flash_eyes(FLASH_PROTECTION_MAJOR * 2) + + // HAHAHAHAHA + for(var/atom/A in range(32, src)) + if(A == src) + continue + if(isobserver(A)) + continue + if(prob(15)) + continue + if(prob(33)) + if(istype(A, /mob/living)) + var/mob/living/L = A + if(prob(50)) + L.dust() + else + L.gib() + continue + qdel(A) + continue + A.ex_act(rand(1, 2)) + + var/matrix/M = transform * 3 + animate(src, transform = M, alpha = 0, time = 4 SECONDS) + QDEL_IN(src, (5 SECONDS)) diff --git a/code/modules/spells/general/invisibility.dm b/code/modules/spells/general/invisibility.dm index af739f63e51..963d11fd698 100644 --- a/code/modules/spells/general/invisibility.dm +++ b/code/modules/spells/general/invisibility.dm @@ -1,13 +1,22 @@ /datum/spell/invisibility name = "invisibility" desc = "A simple spell of invisibility, for when you really just can't afford a paper bag." - feedback = "IV" + + charge_max = 30 SECONDS + cooldown_reduc = 8 SECONDS + spell_flags = 0 - charge_max = 100 invocation = "Ror Rim Or!" invocation_type = INVOKE_SHOUT - var/on = 0 + level_max = list(UPGRADE_TOTAL = 4, UPGRADE_SPEED = 2, UPGRADE_POWER = 4) + hud_state = "invisibility" + duration = 20 SECONDS + + spell_cost = 1 + mana_cost = 5 + + var/on = FALSE /datum/spell/invisibility/choose_targets(mob/user = usr) if(istype(holder, /mob/living/carbon/human)) @@ -19,6 +28,30 @@ if(H.add_cloaking_source(src)) playsound(get_turf(H), 'sound/effects/teleport.ogg', 90, 1) H.mutations |= MUTATION_CLUMSY - else if(H.remove_cloaking_source(src)) + charge_counter = charge_max + addtimer(CALLBACK(src, .proc/ToggleOffTimed, H), duration * 0.9) + return + ToggleOff(H) + +/datum/spell/invisibility/proc/ToggleOffTimed(mob/living/carbon/human/H) + if(!on) + return + to_chat(H, SPAN_DANGER("You are about to turn visible again!")) + addtimer(CALLBACK(src, .proc/ToggleOff, H), duration * 0.1) + +/datum/spell/invisibility/proc/ToggleOff(mob/living/carbon/human/H) + if(H.remove_cloaking_source(src)) playsound(get_turf(H), 'sound/effects/stealthoff.ogg', 90, 1) H.mutations -= MUTATION_CLUMSY + on = FALSE + charge_counter = 0 + process() + +/datum/spell/invisibility/ImproveSpellPower() + if(!..()) + return FALSE + + duration += 10 SECONDS + + return "The [src] spell now lasts for a maximum of [round(duration / 10)] seconds." + diff --git a/code/modules/spells/general/mark_recall.dm b/code/modules/spells/general/mark_recall.dm index 633579bf7f4..e8c4af10d28 100644 --- a/code/modules/spells/general/mark_recall.dm +++ b/code/modules/spells/general/mark_recall.dm @@ -1,8 +1,6 @@ /datum/spell/mark_recall name = "Mark and Recall" desc = "This spell was created so wizards could get home from the bar without driving. Does not require wizard garb." - feedback = "MK" - school = "conjuration" charge_max = 600 //1 minutes for how OP this shit is (apparently not as op as I thought) spell_flags = Z2NOCAST invocation = "Re-Alki R'natha." @@ -18,6 +16,9 @@ hud_state = "wiz_mark" var/mark = null + spell_cost = 1 + mana_cost = 5 + /datum/spell/mark_recall/choose_targets(mob/user = usr) if(!mark) perform(user, list("magical fairy dust")) //because why not @@ -39,7 +40,7 @@ user.forceMove(T) ..() -/datum/spell/mark_recall/empower_spell() +/datum/spell/mark_recall/ImproveSpellPower() if(!..()) return 0 @@ -80,4 +81,4 @@ src.visible_message("\The [src] fades away!") qdel(src) return - ..() \ No newline at end of file + ..() diff --git a/code/modules/spells/general/portal_teleport.dm b/code/modules/spells/general/portal_teleport.dm index ce9dc0f530d..b614a2537a0 100644 --- a/code/modules/spells/general/portal_teleport.dm +++ b/code/modules/spells/general/portal_teleport.dm @@ -1,8 +1,6 @@ /datum/spell/portal_teleport name = "Create Portal" desc = "This spell creates a long lasting portal to an area of your selection." - feedback = "TP" - school = "conjuration" charge_max = 600 spell_flags = NEEDSCLOTHES invocation = "Scyar Peranda!" @@ -19,6 +17,9 @@ hud_state = "wiz_tele" + spell_cost = 4 + mana_cost = 25 + /datum/spell/portal_teleport/before_cast() return diff --git a/code/modules/spells/general/radiant_aura.dm b/code/modules/spells/general/radiant_aura.dm index cb81492c679..2482d6cc35a 100644 --- a/code/modules/spells/general/radiant_aura.dm +++ b/code/modules/spells/general/radiant_aura.dm @@ -1,11 +1,8 @@ /datum/spell/radiant_aura name = "Radiant aura" desc = "Form a protective layer of light around you, making you immune to laser fire." - school = "transmutation" - feedback = "ra" invocation_type = INVOKE_EMOTE invocation = "conjures a sphere of fire around themselves." - school = "conjuration" spell_flags = NEEDSCLOTHES charge_max = 300 cooldown_min = 100 @@ -14,6 +11,9 @@ duration = 40 hud_state = "gen_immolate" + spell_cost = 3 + mana_cost = 10 + /datum/spell/radiant_aura/choose_targets(mob/user = usr) perform(user, list(holder)) @@ -24,3 +24,5 @@ /datum/spell/radiant_aura/starlight spell_flags = 0 charge_max = 400 + + mana_cost = 0 diff --git a/code/modules/spells/general/return_master.dm b/code/modules/spells/general/return_master.dm index a52952ebc08..e5f81828cb8 100644 --- a/code/modules/spells/general/return_master.dm +++ b/code/modules/spells/general/return_master.dm @@ -2,7 +2,6 @@ name = "Return to Master" desc = "Teleport back to your master." - school = "conjuration" charge_max = 600 spell_flags = 0 invocation = "none" @@ -14,6 +13,8 @@ hud_state = "wiz_tele" + mana_cost = 2 + spell_book_visible = FALSE /datum/spell/contract/return_master/cast(mob/target,mob/user) target = ..(target,user) diff --git a/code/modules/spells/general/tear_veil.dm b/code/modules/spells/general/tear_veil.dm index 24d5c153a82..f1dae87a1eb 100644 --- a/code/modules/spells/general/tear_veil.dm +++ b/code/modules/spells/general/tear_veil.dm @@ -17,6 +17,9 @@ /mob/living/simple_animal/hostile/faithless/cult ) + spell_cost = 5 + mana_cost = 35 + /datum/spell/tear_veil/choose_targets(mob/user = usr) var/turf/T = get_turf(holder) holder.visible_message("A strange portal rips open underneath \the [holder]!") @@ -34,4 +37,4 @@ /datum/spell/tear_veil/after_spell(var/list/targets) qdel(targets[1]) - return \ No newline at end of file + return diff --git a/code/modules/spells/general/toggle_armor.dm b/code/modules/spells/general/toggle_armor.dm index 593c83d31f9..dbe09a64c44 100644 --- a/code/modules/spells/general/toggle_armor.dm +++ b/code/modules/spells/general/toggle_armor.dm @@ -1,11 +1,10 @@ /datum/spell/toggle_armor - name = "Toggle Armor" spell_flags = 0 charge_max = 10 - school = "Conjuration" var/list/armor_pieces var/equip = 0 hud_state = "const_shell" + spell_book_visible = FALSE /datum/spell/toggle_armor/New() if(armor_pieces) diff --git a/code/modules/spells/general/veil_of_shadows.dm b/code/modules/spells/general/veil_of_shadows.dm index b00bdbf9b12..db645c8b0c5 100644 --- a/code/modules/spells/general/veil_of_shadows.dm +++ b/code/modules/spells/general/veil_of_shadows.dm @@ -2,9 +2,9 @@ name = "Veil of Shadows" desc = "Become intangable, invisible. Like a ghost." charge_max = 400 + spell_flags = NEEDSCLOTHES | Z2NOCAST invocation_type = INVOKE_EMOTE invocation = "flickers out of existance" - school = "Divine" //Means that it doesn't proc the deity's spell cost. spell_flags = 0 duration = 100 var/timer_id @@ -12,9 +12,17 @@ hud_state = "wiz_statue" + spell_cost = 3 + mana_cost = 20 + +/datum/spell/veil_of_shadows/cast_check(skipcharge = FALSE, mob/user = usr, list/targets) + if(!ishuman(user)) + return FALSE + if(user.GetMovementHandler(/datum/movement_handler/mob/incorporeal)) + return FALSE + return ..() + /datum/spell/veil_of_shadows/choose_targets(mob/user = usr) - if(!timer_id && istype(holder, /mob/living/carbon/human)) - perform(user, list(holder)) perform(user, null) /datum/spell/veil_of_shadows/cast(list/targets, mob/user) @@ -22,8 +30,8 @@ H.AddMovementHandler(/datum/movement_handler/mob/incorporeal) if(H.add_cloaking_source(src)) H.visible_message("\The [H] shrinks from view!") - GLOB.moved_event.register(H,src,.proc/check_light) - timer_id = addtimer(CALLBACK(src,.proc/cancel_veil),duration, TIMER_STOPPABLE) + GLOB.moved_event.register(H, src,.proc/check_light) + timer_id = addtimer(CALLBACK(src, .proc/cancel_veil), duration, TIMER_STOPPABLE) /datum/spell/veil_of_shadows/proc/cancel_veil() var/mob/living/carbon/human/H = holder @@ -34,8 +42,8 @@ if(T.get_lumcount() > 0.1) //If we're somewhere somewhat shadowy we can stay invis as long as we stand still drop_cloak() else - GLOB.moved_event.unregister(H,src) - GLOB.moved_event.register(H,src,.proc/drop_cloak) + GLOB.moved_event.unregister(H, src) + GLOB.moved_event.register(H, src, .proc/drop_cloak) /datum/spell/veil_of_shadows/proc/drop_cloak() var/mob/living/carbon/human/H = holder @@ -54,4 +62,4 @@ /datum/spell/veil_of_shadows/Destroy() deltimer(timer_id) cancel_veil() - .= ..() + return ..() diff --git a/code/modules/spells/hand/hand.dm b/code/modules/spells/hand/_hand.dm similarity index 53% rename from code/modules/spells/hand/hand.dm rename to code/modules/spells/hand/_hand.dm index 9568ced504c..c635d5a4fca 100644 --- a/code/modules/spells/hand/hand.dm +++ b/code/modules/spells/hand/_hand.dm @@ -7,11 +7,15 @@ var/hand_state = "spell" var/obj/item/magic_hand/current_hand var/show_message + /// If TRUE - will prevent itself from being cast when on help intent + var/harmful = TRUE + /// Mana cost for each use of hand + var/mana_cost_per_cast = 0 /datum/spell/hand/choose_targets(mob/user = usr) perform(user, list(user)) -/datum/spell/hand/cast_check(skipcharge = 0,mob/user = usr, var/list/targets) +/datum/spell/hand/cast_check(skipcharge = 0,mob/user = usr, list/targets) if(!..()) return FALSE if(user.get_active_hand()) @@ -21,7 +25,7 @@ /datum/spell/hand/cast(list/targets, mob/user) if(current_hand) - cancel_hand() + CancelHand() if(user.get_active_hand()) to_chat(user, "You need an empty hand to cast this spell.") return FALSE @@ -29,17 +33,29 @@ if(!user.put_in_active_hand(current_hand)) QDEL_NULL(current_hand) return FALSE + RegisterSignal(user, COMSIG_ATOM_MOVABLE_DISPELL, .proc/OnUserDispell) + RegisterSignal(current_hand, COMSIG_PARENT_QDELETING, .proc/OnHandDestroy) return TRUE -/datum/spell/hand/proc/cancel_hand() - if(!QDELETED(current_hand)) - QDEL_NULL(current_hand) +/datum/spell/hand/proc/OnUserDispell(datum/source, dispell_strength = DISPELL_WEAK) + SIGNAL_HANDLER + if(istype(current_hand)) + holder.visible_message(SPAN_DANGER("[current_hand] vanishes in an instant!")) + CancelHand() + +/datum/spell/hand/proc/OnHandDestroy(datum/source) + SIGNAL_HANDLER + UnregisterSignal(holder, COMSIG_ATOM_MOVABLE_DISPELL) + UnregisterSignal(current_hand, COMSIG_PARENT_QDELETING) + +/datum/spell/hand/proc/CancelHand() + QDEL_NULL(current_hand) /datum/spell/hand/Destroy() - qdel(current_hand) - . = ..() + CancelHand() + return ..() -/datum/spell/hand/proc/valid_target(var/atom/a,var/mob/user) //we use separate procs for our target checking for the hand spells. +/datum/spell/hand/proc/valid_target(atom/a, mob/user) //we use separate procs for our target checking for the hand spells. var/distance = get_dist(a,user) if((min_range && distance < min_range) || (range && distance > range)) return FALSE @@ -47,7 +63,9 @@ return FALSE return TRUE -/datum/spell/hand/proc/cast_hand(var/atom/a,var/mob/user) //same for casting. +/datum/spell/hand/proc/cast_hand(atom/a, mob/user) //same for casting. + if(!TakeMana(user, mana_cost_per_cast)) + return FALSE return TRUE /datum/spell/hand/charges @@ -64,7 +82,7 @@ if(..()) casts-- to_chat(holder, "The [name] spell has [casts] out of [max_casts] charges left") - cancel_hand() + CancelHand() return TRUE return FALSE @@ -72,12 +90,12 @@ var/hand_timer = null var/hand_duration = 0 -/datum/spell/hand/duration/cast(var/list/targets, var/mob/user) +/datum/spell/hand/duration/cast(list/targets, mob/user) . = ..() if(.) - hand_timer = addtimer(CALLBACK(src, .proc/cancel_hand), hand_duration, TIMER_STOPPABLE|TIMER_UNIQUE|TIMER_NO_HASH_WAIT|TIMER_OVERRIDE) + hand_timer = addtimer(CALLBACK(src, .proc/CancelHand), hand_duration, TIMER_STOPPABLE|TIMER_UNIQUE|TIMER_NO_HASH_WAIT|TIMER_OVERRIDE) -/datum/spell/hand/duration/cancel_hand() +/datum/spell/hand/duration/CancelHand() deltimer(hand_timer) hand_timer = null ..() diff --git a/code/modules/spells/hand/hand_item.dm b/code/modules/spells/hand/_hand_item.dm similarity index 63% rename from code/modules/spells/hand/hand_item.dm rename to code/modules/spells/hand/_hand_item.dm index 3cd64634e7a..dcf6bbdf23d 100644 --- a/code/modules/spells/hand/hand_item.dm +++ b/code/modules/spells/hand/_hand_item.dm @@ -13,7 +13,7 @@ Basically: I can use it to target things where I click. I can then pass these ta var/next_spell_time = 0 var/datum/spell/hand/hand_spell -/obj/item/magic_hand/New(var/datum/spell/hand/S) +/obj/item/magic_hand/New(datum/spell/hand/S) hand_spell = S name = "[name] ([S.name])" icon_state = S.hand_state @@ -21,37 +21,38 @@ Basically: I can use it to target things where I click. I can then pass these ta /obj/item/magic_hand/get_storage_cost() return ITEM_SIZE_NO_CONTAINER -/obj/item/magic_hand/attack(var/mob/living/M, var/mob/living/user) - if(hand_spell && hand_spell.valid_target(M, user)) - fire_spell(M, user) - return 0 - return 1 +/obj/item/magic_hand/afterattack(atom/A, mob/living/user, proximity) + if(hand_spell && hand_spell.valid_target(A, user)) + fire_spell(A, user) + return TRUE + return FALSE -/obj/item/magic_hand/proc/fire_spell(var/atom/A, mob/living/user) +/obj/item/magic_hand/attack(atom/A, mob/living/user, target_zone, animate = TRUE) + return afterattack(A, user, TRUE) + +/obj/item/magic_hand/proc/fire_spell(atom/A, mob/living/user) if(!hand_spell) //no spell? Die. user.drop_from_inventory(src) if(!hand_spell.valid_target(A,user)) return if(world.time < next_spell_time) - to_chat(user, "The spell isn't ready yet!") + to_chat(user, SPAN_WARNING("The spell isn't ready yet!")) return - if(user.a_intent == I_HELP) - to_chat(user, "You decide against casting this spell as your intent is set to help.") + if(user.a_intent == I_HELP && hand_spell.harmful) + to_chat(user, SPAN_NOTICE("You decide against casting this spell as your intent is set to help.")) return if(hand_spell.show_message) user.visible_message("\The [user][hand_spell.show_message]") if(hand_spell.cast_hand(A,user)) next_spell_time = world.time + hand_spell.spell_delay + SEND_SIGNAL(user, COMSIG_SPELL_CAST_HAND, hand_spell, A) + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_SPELL_CAST_HAND, user, hand_spell, A) if(hand_spell.move_delay) user.ExtraMoveCooldown(hand_spell.move_delay) if(hand_spell.click_delay) - user.setClickCooldown(hand_spell.move_delay) - -/obj/item/magic_hand/afterattack(var/atom/A, var/mob/user, var/proximity) - if(hand_spell) - fire_spell(A,user) + user.setClickCooldown(hand_spell.click_delay) /obj/item/magic_hand/throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, datum/callback/callback) //no throwing pls usr.drop_from_inventory(src) @@ -63,4 +64,4 @@ Basically: I can use it to target things where I click. I can then pass these ta /obj/item/magic_hand/Destroy() //better save than sorry. hand_spell.current_hand = null hand_spell = null - . = ..() \ No newline at end of file + return ..() diff --git a/code/modules/spells/hand/analyze_health.dm b/code/modules/spells/hand/analyze_health.dm new file mode 100644 index 00000000000..0343c67e6f9 --- /dev/null +++ b/code/modules/spells/hand/analyze_health.dm @@ -0,0 +1,40 @@ +/datum/spell/hand/analyze_health + name = "Analyze Health" + desc = "Using your powers, you can detect the inner destructions of a persons body." + + range = 2 + harmful = FALSE + level_max = list(UPGRADE_TOTAL = 2, UPGRADE_SPEED = 0, UPGRADE_POWER = 2) + charge_max = 5 + invocation_type = INVOKE_WHISPER + invocation = "Fu Yi Fim" + compatible_targets = list(/mob/living/carbon/human) + hud_state = "analyze" + + spell_cost = 1 + mana_cost = 2 + mana_cost_per_cast = 1 + +/datum/spell/hand/analyze_health/cast_hand(mob/living/carbon/human/H, mob/user) + . = ..() + if(!.) + return + + var/obj/effect/temp_visual/temporary/TV = new(get_turf(H), 5, 'icons/effects/effects.dmi', "repel_missiles") + TV.dir = H.dir + var/skill_level = SKILL_UNTRAINED + switch(spell_levels[UPGRADE_POWER]) + if(1) + skill_level = SKILL_TRAINED + if(2) + skill_level = SKILL_MAX + var/datum/browser/popup = new(user, "analyze_health", "Health Scan") + popup.set_content(display_medical_data(H.get_raw_medical_data(), skill_level)) + popup.open() + return TRUE + +/datum/spell/hand/analyze_health/ImproveSpellPower() + if(!..()) + return FALSE + + return "[src] is now more precise." diff --git a/code/modules/spells/hand/blood_shards.dm b/code/modules/spells/hand/blood_shards.dm index b6c259ec4a0..e5a96d0fa86 100644 --- a/code/modules/spells/hand/blood_shards.dm +++ b/code/modules/spells/hand/blood_shards.dm @@ -13,12 +13,18 @@ hud_state = "wiz_bshard" cast_sound = 'sound/magic/demon_attack1.ogg' -/datum/spell/hand/charges/blood_shard/cast_hand(var/atom/A,var/mob/user) + spell_cost = 2 + mana_cost = 10 + +/datum/spell/hand/charges/blood_shard/cast_hand(atom/A, mob/user) + . = ..() + if(!.) + return + var/obj/item/projectile/blood_shard/B = new(get_turf(user)) B.firer = user B.launch(A, BP_CHEST) user.visible_message("\The [user] shoots out a deep red shard from their hand!") - return ..() /obj/item/projectile/blood_shard name = "bloodshard" diff --git a/code/modules/spells/hand/burning_grip.dm b/code/modules/spells/hand/burning_grip.dm index f55ea460bd7..c686b40c975 100644 --- a/code/modules/spells/hand/burning_grip.dm +++ b/code/modules/spells/hand/burning_grip.dm @@ -1,8 +1,6 @@ /datum/spell/hand/burning_grip name = "Burning Grip" desc = "Cause someone to drop a held object by causing it to heat up intensly." - school = "transmutation" - feedback = "bg" range = 5 spell_flags = 0 invocation_type = INVOKE_NONE @@ -12,14 +10,21 @@ cast_sound = 'sound/magic/fireball.ogg' compatible_targets = list(/mob/living/carbon/human) -/datum/spell/hand/burning_grip/valid_target(var/mob/living/L, var/mob/user) + spell_cost = 1 + mana_cost = 5 + +/datum/spell/hand/burning_grip/valid_target(mob/living/L, mob/user) if(!..()) return 0 if(!L.l_hand && !L.r_hand) return 0 return 1 -/datum/spell/hand/burning_grip/cast_hand(var/mob/living/carbon/human/H, var/mob/user) +/datum/spell/hand/burning_grip/cast_hand(mob/living/carbon/human/H, mob/user) + . = ..() + if(!.) + return + var/list/targets = list() if(H.l_hand) targets += BP_L_HAND @@ -37,6 +42,3 @@ else E.take_external_damage(burn=6, used_weapon = "hot iron") to_chat(H, "You look down to notice that your [E] is burned.") - -/datum/spell/hand/burning_grip/tower - charge_max = 3 \ No newline at end of file diff --git a/code/modules/spells/hand/consume_magic.dm b/code/modules/spells/hand/consume_magic.dm new file mode 100644 index 00000000000..340ada69f4f --- /dev/null +++ b/code/modules/spells/hand/consume_magic.dm @@ -0,0 +1,124 @@ +/datum/spell/hand/consume_energy + name = "Consume Magic Energy" + desc = "Absorbs spell points and mana from the living target. Considered to be outlawed by all governing bodies of \ + the wizard society." + + spell_flags = NEEDSCLOTHES | SELECTABLE | IGNOREPREV + invocation = "Vis Absumo!" + invocation_type = INVOKE_SHOUT + + categories = list(SPELL_CATEGORY_FORBIDDEN) + level_max = list(UPGRADE_TOTAL = 2, UPGRADE_SPEED = 2, UPGRADE_POWER = 0) + + charge_max = 60 SECONDS + cooldown_reduc = 15 SECONDS + spell_delay = 15 SECONDS + click_delay = 5 SECONDS + + hud_state = "wiz_consume_energy" + cast_sound = 'sound/magic/words.ogg' + + range = 1 + compatible_targets = list(/mob/living/carbon/human) + + spell_cost = 10 + mana_cost = 30 + mana_cost_per_cast = 10 + + var/do_effects = FALSE + +/datum/spell/hand/consume_energy/valid_target(mob/living/L, mob/user) + if(!..()) + return FALSE + if(L.stat == DEAD) + to_chat(user, SPAN_WARNING("You are unable to consume magic power from a dead creature!")) + return FALSE + var/datum/mana/M = GetManaDatum(L) + if(!M || (M.mana_level_max <= 5 && M.spell_points <= 1 && !LAZYLEN(L.mind.learned_spells))) + to_chat(user, SPAN_WARNING("There's nothing to consume here...")) + return FALSE + return TRUE + +/datum/spell/hand/consume_energy/cast_hand(mob/living/carbon/human/H, mob/living/user) + . = ..() + if(!.) + return + + user.visible_message( + SPAN_DANGER("[user] places their hand on [H], as magic particles begin to float all around them."), + SPAN_NOTICE("You begin draining magic power out of [H]..."), + ) + do_effects = TRUE + DoEffects(user, H) + current_hand.next_spell_time = world.time + spell_delay + var/datum/mana/M = GetManaDatum(H) + var/datum/mana/MU = GetManaDatum(user) + for(var/i = 1 to 3) + if(!do_after(user, 10 SECONDS, H)) + user.visible_message( + SPAN_WARNING("[user] retracts their hand from \the [H]."), + SPAN_WARNING("You stop draining the power out of [H]..."), + ) + do_effects = FALSE + return + if(QDELETED(H) || QDELETED(M)) + user.visible_message( + SPAN_WARNING("[user] retracts their hand."), + SPAN_WARNING("You stop draining the power..."), + ) + do_effects = FALSE + return + playsound(H, 'sound/magic/drain.ogg', 50, TRUE) + current_hand.next_spell_time = world.time + spell_delay + // First, we steal all free spell points + if(M.spell_points > 1) + to_chat(user, SPAN_NOTICE("You've consumed [M.spell_points - 1] spell power.")) + to_chat(H, SPAN_USERDANGER("You lost your spell power!")) + MU.spell_points += M.spell_points - 1 + M.spell_points = min(M.spell_points, 1) + continue + // Proceed to eat all(most of) the mana + if(M.mana_level_max > 5) + to_chat(user, SPAN_NOTICE("You've consumed [M.mana_level_max - 5] units of mana.")) + to_chat(H, SPAN_USERDANGER("You lost your mana!")) + MU.mana_level_max += M.mana_level_max - 5 + MU.StartRecharge() + M.mana_level_max = min(M.mana_level_max, 5) + M.mana_level = M.mana_level_max + continue + // Then we convert learnt spells to spell points + if(LAZYLEN(H.mind.learned_spells)) + for(var/ii = 1 to length(H.mind.learned_spells)) + if(!LAZYLEN(H.mind.learned_spells)) + break + var/datum/spell/S = H.mind.learned_spells[length(H.mind.learned_spells)] + if(!istype(S)) + continue + to_chat(user, SPAN_NOTICE("You've consumed [user]'s [S.name] spell and gained [S.total_points_used] spell power.")) + to_chat(H, SPAN_USERDANGER("You lost knowledge on how to use [S.name] spell!")) + MU.spell_points += S.total_points_used + H.remove_spell(S) + // And now, nothing left to do! + break + + user.visible_message( + SPAN_NOTICE("[user] retracts their hand from [H]."), + SPAN_NOTICE("You finish draining magic power out of [H]!"), + ) + to_chat(H, SPAN_USERDANGER("You lost your spell power!")) + do_effects = FALSE + qdel(current_hand) + +/datum/spell/hand/consume_energy/proc/DoEffects(mob/living/user, mob/living/target) + if(!do_effects) + return + + var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(get_turf(target), target.dir, target) + D.pixel_x = target.pixel_x + rand(-4, 4) + D.pixel_y = target.pixel_y + rand(-4, 4) + D.color = COLOR_MANA + D.alpha = 0 + animate(D, pixel_x = (user.x - target.x) * world.icon_size, pixel_y = (user.y - target.y) * world.icon_size, alpha = rand(100, 175), time = rand(3, 6)) + animate(alpha = 0, time = 2) + + addtimer(CALLBACK(src, .proc/DoEffects, user, target), rand(1, 3)) diff --git a/code/modules/spells/hand/entangle.dm b/code/modules/spells/hand/entangle.dm index 95f97763d47..4fed3a7bf87 100644 --- a/code/modules/spells/hand/entangle.dm +++ b/code/modules/spells/hand/entangle.dm @@ -1,8 +1,6 @@ /datum/spell/hand/charges/entangle name = "Entangle" desc = "This spell creates vines that immediately entangle a nearby victim." - feedback = "ET" - school = "transmutation" charge_max = 600 spell_flags = NEEDSCLOTHES | SELECTABLE | IGNOREPREV invocation = "Bu-Ekel'Inas!" @@ -20,6 +18,9 @@ show_message = " points towards the ground, causing plants to erupt" var/datum/seed/seed + spell_cost = 2 + mana_cost = 10 + /datum/spell/hand/charges/entangle/New() ..() seed = new() @@ -32,7 +33,11 @@ seed.display_name = "vines" seed.chems = list(/datum/reagent/nutriment = list(1,20)) -/datum/spell/hand/charges/entangle/cast_hand(var/mob/M,var/mob/user) +/datum/spell/hand/charges/entangle/cast_hand(mob/M, mob/user) + . = ..() + if(!.) + return + var/turf/T = get_turf(M) var/obj/effect/vine/single/P = new(T,seed, start_matured =1) P.can_buckle = 1 @@ -40,9 +45,8 @@ P.buckle_mob(M) M.set_dir(pick(GLOB.cardinal)) M.visible_message("[P] appear from the floor, spinning around \the [M] tightly!") - return ..() -/datum/spell/hand/charges/entangle/empower_spell() +/datum/spell/hand/charges/entangle/ImproveSpellPower() if(!..()) return 0 diff --git a/code/modules/spells/hand/mend_structures.dm b/code/modules/spells/hand/mend_structures.dm new file mode 100644 index 00000000000..0eeb55bc0dc --- /dev/null +++ b/code/modules/spells/hand/mend_structures.dm @@ -0,0 +1,46 @@ +/datum/spell/hand/mend_structures + name = "Mend Structures" + desc = "Allows the user to repair most structures of any superficial damage." + + range = 1 + harmful = FALSE + level_max = list(UPGRADE_TOTAL = 2, UPGRADE_SPEED = 0, UPGRADE_POWER = 2) + charge_max = 5 + invocation_type = INVOKE_WHISPER + invocation = "Melius Murum" + compatible_targets = list( + /turf, + /obj, + ) + hud_state = "wiz_mend_structures" + + spell_cost = 1 + mana_cost = 2 + mana_cost_per_cast = 5 + + /// Percentage of maximum integrity that gets repaired + var/mend_percent = 0.2 + +/datum/spell/hand/mend_structures/cast_hand(atom/A, mob/user) + . = ..() + if(!.) + return + + var/restore_amount = A.health_max * mend_percent + if(!A.can_restore_health(restore_amount)) + to_chat(user, SPAN_WARNING("You are unable to repair [A].")) + return FALSE + + A.restore_health(restore_amount) + playsound(get_turf(A), 'sound/items/Welder.ogg', 35, TRUE) + to_chat(user, SPAN_NOTICE("You manage to repair some damage on [A].")) + + return TRUE + +/datum/spell/hand/mend_structures/ImproveSpellPower() + if(!..()) + return FALSE + + mend_percent += 0.2 + + return "[src] now repairs [mend_percent * 100]% of structure damage." diff --git a/code/modules/spells/hand/slippery_surface.dm b/code/modules/spells/hand/slippery_surface.dm index d3b13d58798..7d472f5adb3 100644 --- a/code/modules/spells/hand/slippery_surface.dm +++ b/code/modules/spells/hand/slippery_surface.dm @@ -1,8 +1,6 @@ /datum/spell/hand/slippery_surface name = "Slippery Surface" desc = "More of a practical joke than an actual spell." - school = "transmutation" - feedback = "su" range = 5 spell_flags = 0 invocation_type = INVOKE_NONE @@ -11,11 +9,15 @@ hud_state = "gen_ice" cast_sound = 'sound/magic/summonitems_generic.ogg' -/datum/spell/hand/slippery_surface/cast_hand(var/atom/a, var/mob/user) + spell_cost = 1 + mana_cost = 2 + mana_cost_per_cast = 5 + +/datum/spell/hand/slippery_surface/cast_hand(atom/a, mob/user) + . = ..() + if(!.) + return + for(var/turf/simulated/T in view(1,a)) T.wet_floor(50) new /obj/effect/temp_visual/temporary(T,3, 'icons/effects/effects.dmi', "sonar_ping") - return ..() - -/datum/spell/hand/slippery_surface/tower - charge_max = 2 \ No newline at end of file diff --git a/code/modules/spells/hand/sunwrath.dm b/code/modules/spells/hand/sunwrath.dm index e56e7a12260..153d4238f16 100644 --- a/code/modules/spells/hand/sunwrath.dm +++ b/code/modules/spells/hand/sunwrath.dm @@ -6,14 +6,22 @@ invocation_type = INVOKE_SHOUT invocation = "Herald! Bless me with your anger!" show_message = " erupts fire from their hands" - school = "Divine" hand_duration = 100 spell_delay = 30 range = 4 + categories = list(SPELL_CATEGORY_FIRE) + hud_state = "wiz_immolate" -/datum/spell/hand/duration/sunwrath/cast_hand(var/atom/A, var/mob/user) + spell_cost = 5 + mana_cost = 30 + +/datum/spell/hand/duration/sunwrath/cast_hand(atom/A, mob/user) + . = ..() + if(!.) + return + var/turf/T = get_turf(user) var/list/turfs = getline(T,A) - T for(var/t in turfs) @@ -24,10 +32,10 @@ return 1 /obj/effect/fake_fire/sunwrath - firelevel = 2 + firelevel = 5 last_temperature = 0 - pressure = 3000 + pressure = 5000 /obj/effect/fake_fire/sunwrath/Process() //Override, so we burn mobs only for(var/mob/living/L in loc) - L.FireBurn(firelevel,last_temperature,pressure) \ No newline at end of file + L.FireBurn(firelevel, last_temperature, pressure) diff --git a/code/modules/spells/no_clothes.dm b/code/modules/spells/no_clothes.dm index 500785cb70b..c070a674d0d 100644 --- a/code/modules/spells/no_clothes.dm +++ b/code/modules/spells/no_clothes.dm @@ -1,5 +1,7 @@ /datum/spell/noclothes name = "No Clothes" desc = "Learn the ancient art of not wearing fancy robes while casting spells." - feedback = "NC" spell_flags = NO_BUTTON + spell_cost = 5 + categories = list(SPELL_CATEGORY_PASSIVE) + level_max = list(UPGRADE_TOTAL = 0, UPGRADE_SPEED = 0, UPGRADE_POWER = 0) diff --git a/code/modules/spells/racial_wizard.dm b/code/modules/spells/racial_wizard.dm index 33039814eb1..2ac9e84d0f6 100644 --- a/code/modules/spells/racial_wizard.dm +++ b/code/modules/spells/racial_wizard.dm @@ -70,7 +70,6 @@ name = "True Form" desc = "Pay respect to your heritage. Become what you once were." - school = "racial" spell_flags = INCLUDEUSER invocation_type = INVOKE_EMOTE range = -1 @@ -96,7 +95,6 @@ name = "Moghes Blessing" desc = "Imbue your weapon with memories of Moghes." - school = "racial" spell_flags = 0 invocation_type = INVOKE_EMOTE invocation = "whispers something." @@ -139,7 +137,6 @@ name = "Convert Gestalt" desc = "Converts the surrounding area into a diona gestalt." - school = "racial" spell_flags = 0 invocation_type = INVOKE_EMOTE invocation = "rumbles as strange alien growth quickly overtakes their surroundings." @@ -184,7 +181,6 @@ /obj/item/contract/apprentice/skrell/contract_effect(mob/user as mob) . = ..() if(.) - linked.uses += 0.5 var/obj/item/I = new /obj/item/contract/apprentice/skrell(get_turf(src),linked,contract_master) user.put_in_hands(I) new /obj/item/contract/apprentice/skrell(get_turf(src),linked,contract_master) @@ -194,8 +190,6 @@ name = "Camera Connection" desc = "This spell allows the wizard to connect to the local camera network and see what it sees." - school = "racial" - invocation_type = INVOKE_EMOTE invocation = "emits a beeping sound before standing very, very still." diff --git a/code/modules/spells/spellbook.dm b/code/modules/spells/spellbook.dm deleted file mode 100644 index 68ef2c5041c..00000000000 --- a/code/modules/spells/spellbook.dm +++ /dev/null @@ -1,314 +0,0 @@ -#define NOREVERT 1 -#define LOCKED 2 -#define CAN_MAKE_CONTRACTS 4 -#define INVESTABLE 8 -#define NO_LOCKING 16 - -//spells/spellbooks have a variable for this but as artefacts are literal items they do not. -//so we do this instead. -var/list/artefact_feedback = list(/obj/structure/closet/wizard/armor = "HS", - /obj/item/gun/energy/staff/focus = "MF", - /obj/item/summoning_stone = "ST", - /obj/item/magic_rock = "RA", - /obj/item/contract/apprentice = "CP", - /obj/structure/closet/wizard/souls = "SS", - /obj/structure/closet/wizard/scrying = "SO", - /obj/item/teleportation_scroll = "TS", - /obj/item/gun/energy/staff = "ST", - /obj/item/gun/energy/staff/animate = "SA", - /obj/item/dice/d20/cursed = "DW") - -/obj/item/spellbook - name = "master spell book" - desc = "The legendary book of spells of the wizard." - icon = 'icons/obj/library.dmi' - icon_state = "spellbook" - throw_speed = 1 - throw_range = 5 - w_class = ITEM_SIZE_NORMAL - var/uses = 1 - var/temp = null - var/datum/spellbook/spellbook - var/spellbook_type = /datum/spellbook/ //for spawning specific spellbooks. - var/investing_time = 0 //what time we target forr a return on our spell investment. - var/has_sacrificed = 0 //whether we have already got our sacrifice bonus for the current investment. - -/obj/item/spellbook/New() - ..() - set_spellbook(spellbook_type) - -/obj/item/spellbook/proc/set_spellbook(var/type) - if(spellbook) - qdel(spellbook) - spellbook = new type() - uses = spellbook.max_uses - name = spellbook.name - desc = spellbook.desc - -/obj/item/spellbook/attack_self(mob/user as mob) - if(!user.mind) - return - if (user.mind.special_role != ANTAG_WIZARD) - if (user.mind.special_role != ANTAG_APPRENTICE) - to_chat(user, "You can't make heads or tails of this book.") - return - if (spellbook.book_flags & LOCKED) - to_chat(user, "Drat! This spellbook's apprentice-proof lock is on!") - return - else if (spellbook.book_flags & LOCKED) - to_chat(user, "You notice the apprentice-proof lock is on. Luckily you are beyond such things.") - interact(user) - -/obj/item/spellbook/proc/make_sacrifice(obj/item/I as obj, mob/user as mob, var/reagent) - if(has_sacrificed) - to_chat(user, SPAN_WARNING("\The [src] is already sated! Wait for a return on your investment before you sacrifice more to it.")) - return - if(reagent) - var/datum/reagents/R = I.reagents - R.remove_reagent(reagent,5) - else - if(istype(I,/obj/item/stack)) - var/obj/item/stack/S = I - if(S.amount < S.max_amount) - to_chat(usr, "You must sacrifice [S.max_amount] stacks of [S]!") - return - qdel(I) - to_chat(user, "Your sacrifice was accepted!") - has_sacrificed = 1 - investing_time = max(investing_time - 6000,1) //subtract 10 minutes. Make sure it doesn't act funky at the beginning of the game. - - -/obj/item/spellbook/attackby(obj/item/I as obj, mob/user as mob) - if(investing_time) - var/list/objects = spellbook.sacrifice_objects - if(objects && objects.len) - for(var/type in objects) - if(istype(I,type)) - make_sacrifice(I,user) - return - if(I.reagents) - var/datum/reagents/R = I.reagents - var/list/reagent_list = spellbook.sacrifice_reagents - if(reagent_list && reagent_list.len) - for(var/id in reagent_list) - if(R.has_reagent(id,5)) - make_sacrifice(I,user, id) - return 1 - ..() - -/obj/item/spellbook/interact(mob/user as mob) - var/dat = null - if(temp) - dat = "[temp]
Return" - else - dat = "

[spellbook.title]

[spellbook.title_desc]
You have [uses] spell slot[uses > 1 ? "s" : ""] left.

" - dat += "
Requires Wizard Garb
Selectable Target
Spell Charge Type: Recharge, Sacrifice, Charges

" - dat += "
To use a contract, first bind it to your soul, then give it to someone to sign. This will bind their soul to you.

" - for(var/i in 1 to spellbook.spells.len) - var/name = "" //name of target - var/desc = "" //description of target - var/info = "" //additional information - if(ispath(spellbook.spells[i],/datum/spellbook)) - var/datum/spellbook/S = spellbook.spells[i] - name = initial(S.name) - desc = initial(S.book_desc) - info = "[initial(S.max_uses)] Spell Slots" - else if(ispath(spellbook.spells[i],/obj)) - var/obj/O = spellbook.spells[i] - name = "Artefact: [capitalize(initial(O.name))]" //because 99.99% of objects don't have capitals in them and it makes it look weird. - desc = initial(O.desc) - else if(ispath(spellbook.spells[i], /datum/spell)) - var/datum/spell/S = spellbook.spells[i] - name = initial(S.name) - desc = initial(S.desc) - var/testing = initial(S.spell_flags) - if(testing & NEEDSCLOTHES) - info = "W" - var/type = "" - switch(initial(S.charge_type)) - if(SPELL_RECHARGE) - type = "R" - if(SPELL_HOLDVAR) - type = "S" - if(SPELL_CHARGES) - type = "C" - info += "[type]" - dat += "[name]" - if(length(info)) - dat += " ([info])" - dat += " ([spellbook.spells[spellbook.spells[i]]] spell slot[spellbook.spells[spellbook.spells[i]] > 1 ? "s" : "" ])" - if(spellbook.book_flags & CAN_MAKE_CONTRACTS) - dat += " Make Contract" - dat += "
[desc]

" - dat += "
" - dat += "
Re-memorize your spellbook.
" - if(spellbook.book_flags & INVESTABLE) - if(investing_time) - dat += "
Currently investing in a slot...
" - else - dat += "
Invest a Spell Slot
Investing a spellpoint will return two spellpoints back in 15 minutes.
Some say a sacrifice could even shorten the time...
" - if(!(spellbook.book_flags & NOREVERT)) - dat += "
Choose different spellbook.
" - if(!(spellbook.book_flags & NO_LOCKING)) - dat += "
[spellbook.book_flags & LOCKED ? "Unlock" : "Lock"] the spellbook.
" - var/datum/browser/popup = new(user, "spellbook", "Spell Book") - popup.set_content(dat) - popup.open() - -/obj/item/spellbook/CanUseTopic(var/mob/living/carbon/human/H) - if(!istype(H)) - return STATUS_CLOSE - - if(H.mind && (spellbook.book_flags & LOCKED) && H.mind.special_role == ANTAG_APPRENTICE) //make sure no scrubs get behind the lock - return STATUS_CLOSE - - return ..() - -/obj/item/spellbook/OnTopic(var/mob/living/carbon/human/user, href_list) - if(href_list["lock"] && !(spellbook.book_flags & NO_LOCKING)) - if(spellbook.book_flags & LOCKED) - spellbook.book_flags &= ~LOCKED - else - spellbook.book_flags |= LOCKED - . = TOPIC_REFRESH - - else if(href_list["temp"]) - temp = null - . = TOPIC_REFRESH - - else if(href_list["book"]) - if(initial(spellbook.max_uses) != spellbook.max_uses || uses != spellbook.max_uses) - temp = "You've already purchased things using this spellbook!" - else - src.set_spellbook(/datum/spellbook) - temp = "You have reverted back to the Book of Tomes." - . = TOPIC_REFRESH - - else if(href_list["invest"]) - temp = invest() - . = TOPIC_REFRESH - - else if(href_list["path"]) - var/path = locate(href_list["path"]) in spellbook.spells - if(!path) - return TOPIC_HANDLED - if(uses < spellbook.spells[path]) - to_chat(user, "You do not have enough spell slots to purchase this.") - return TOPIC_HANDLED - send_feedback(path) //feedback stuff - if(ispath(path,/datum/spellbook)) - src.set_spellbook(path) - temp = "You have chosen a new spellbook." - else - if(href_list["contract"]) - if(!(spellbook.book_flags & CAN_MAKE_CONTRACTS)) - return //no - uses -= spellbook.spells[path] - spellbook.max_uses -= spellbook.spells[path] //no basksies - var/obj/O = new /obj/item/contract/boon(get_turf(user),path) - temp = "You have purchased \the [O]." - else - if(ispath(path, /datum/spell)) - temp = src.add_spell(user,path) - if(temp) - uses -= spellbook.spells[path] - else - var/obj/O = new path(get_turf(user)) - temp = "You have purchased \a [O]." - uses -= spellbook.spells[path] - spellbook.max_uses -= spellbook.spells[path] - //finally give it a bit of an oomf - playsound(get_turf(user),'sound/effects/phasein.ogg',50,1) - . = TOPIC_REFRESH - - else if(href_list["reset"] && !(spellbook.book_flags & NOREVERT)) - var/area/map_template/wizard_station/A = get_area(user) - if(istype(A)) - uses = spellbook.max_uses - investing_time = 0 - has_sacrificed = 0 - user.spellremove() - temp = "All spells and investments have been removed. You may now memorize a new set of spells." - SSstatistics.add_field_details("wizard_spell_learned","UM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - else - to_chat(user, "You must be in the wizard academy to re-memorize your spells.") - . = TOPIC_REFRESH - - src.interact(user) - -/obj/item/spellbook/proc/invest() - if(uses < 1) - return "You don't have enough slots to invest!" - if(investing_time) - return "You can only invest one spell slot at a time." - uses-- - START_PROCESSING(SSobj, src) - investing_time = world.time + (15 MINUTES) - return "You invest a spellslot and will receive two in return in 15 minutes." - -/obj/item/spellbook/Process() - if(investing_time && investing_time <= world.time) - src.visible_message("\The [src] emits a soft chime.") - uses += 2 - if(uses > spellbook.max_uses) - spellbook.max_uses = uses - investing_time = 0 - has_sacrificed = 0 - STOP_PROCESSING(SSobj, src) - return 1 - -/obj/item/spellbook/Destroy() - STOP_PROCESSING(SSobj, src) - . = ..() - -/obj/item/spellbook/proc/send_feedback(var/path) - if(ispath(path,/datum/spellbook)) - var/datum/spellbook/S = path - SSstatistics.add_field_details("wizard_spell_learned","[initial(S.feedback)]") - else if(ispath(path, /datum/spell)) - var/datum/spell/S = path - SSstatistics.add_field_details("wizard_spell_learned","[initial(S.feedback)]") - else if(ispath(path,/obj)) - SSstatistics.add_field_details("wizard_spell_learned","[artefact_feedback[path]]") - - -/obj/item/spellbook/proc/add_spell(var/mob/user, var/spell_path) - for(var/datum/spell/S in user.mind.learned_spells) - if(istype(S,spell_path)) - if(!S.can_improve()) - return - if(S.can_improve(UPGRADE_SPEED) && S.can_improve(UPGRADE_POWER)) - switch(alert(user, "Do you want to upgrade this spell's speed or power?", "Spell upgrade", "Speed", "Power", "Cancel")) - if("Speed") - return S.quicken_spell() - if("Power") - return S.empower_spell() - else - return - else if(S.can_improve(UPGRADE_POWER)) - return S.empower_spell() - else if(S.can_improve(UPGRADE_SPEED)) - return S.quicken_spell() - - var/datum/spell/S = new spell_path() - user.add_spell(S) - return "You learn the spell [S]" - -/datum/spellbook - var/name = "\improper Book of Tomes" - var/desc = "The legendary book of spells of the wizard." - var/book_desc = "Holds information on the various tomes available to a wizard" - var/feedback = "" //doesn't need one. - var/book_flags = NOREVERT - var/max_uses = 1 - var/title = "Book of Tomes" - var/title_desc = "This tome marks down all the available tomes for use. Choose wisely, there are no refunds." - var/list/spells = list(/datum/spellbook/standard = 1, - /datum/spellbook/cleric = 1, - /datum/spellbook/battlemage = 1, - /datum/spellbook/spatial = 1, - /datum/spellbook/druid = 1 - ) //spell's path = cost of spell - - var/list/sacrifice_reagents - var/list/sacrifice_objects diff --git a/code/modules/spells/spellbook/battlemage.dm b/code/modules/spells/spellbook/battlemage.dm deleted file mode 100644 index 8156f8ac455..00000000000 --- a/code/modules/spells/spellbook/battlemage.dm +++ /dev/null @@ -1,42 +0,0 @@ -//Battlemage is all about mixing physical with the mystical in head to head combat. -//Things like utility and mobility come second. -/datum/spellbook/battlemage - name = "\improper Battlemage's Bible" - feedback = "BM" - desc = "Smells like blood." - book_desc = "Mix physical with the mystical in head to head combat." - title = "The Art of Magical Combat" - title_desc = "Buy spells using your available spell slots. Artefacts may also be bought however their cost is permanent." - book_flags = CAN_MAKE_CONTRACTS|INVESTABLE - max_uses = 6 - - spells = list( - /datum/spell/aimed/passage = 1, - /datum/spell/targeted/equip_item/dyrnwyn = 1, - /datum/spell/targeted/equip_item/shield = 1, - /datum/spell/aimed/fireball = 1, - /datum/spell/targeted/torment = 1, - /datum/spell/targeted/heal_target = 2, - /datum/spell/targeted/genetic/mutate = 1, - /datum/spell/aoe_turf/conjure/mirage = 1, - /datum/spell/targeted/shapeshift/corrupt_form = 1, - /datum/spell/radiant_aura = 1, - /datum/spell/noclothes = 1, - /obj/structure/closet/wizard/armor = 1, - /obj/item/gun/energy/staff/focus = 1, - /obj/item/dice/d20/cursed = 1, - /obj/item/summoning_stone = 2, - /obj/item/magic_rock = 1, - /obj/item/contract/wizard/xray = 1, - /obj/item/contract/wizard/telepathy = 1, - /obj/item/contract/apprentice = 1 - ) - - sacrifice_objects = list(/obj/item/material/sword, - /obj/item/material/twohanded/fireaxe, - /obj/item/melee, - /obj/item/material/knife/ritual, - /obj/item/material/knife/kitchen/cleaver, - /obj/item/material/knife/folding/combat/balisong, - /obj/item/material/knife/folding/tacticool, - /obj/item/material/star) diff --git a/code/modules/spells/spellbook/cleric.dm b/code/modules/spells/spellbook/cleric.dm deleted file mode 100644 index a033cdefa99..00000000000 --- a/code/modules/spells/spellbook/cleric.dm +++ /dev/null @@ -1,46 +0,0 @@ -//Cleric is all about healing. Mobility and offense comes at a higher price but not impossible. -/obj/item/spellbook/cleric - spellbook_type = /datum/spellbook/cleric - -/datum/spellbook/cleric - name = "\improper Cleric's Tome" - feedback = "CR" - desc = "For those who do not harm, or at least feel sorry about it." - book_desc = "All about healing. Mobility and offense comes at a higher price but not impossible." - title = "Cleric's Tome of Healing" - title_desc = "Buy spells using your available spell slots. Artefacts may also be bought however their cost is permanent." - book_flags = CAN_MAKE_CONTRACTS|INVESTABLE - max_uses = 7 - - spells = list(/datum/spell/targeted/heal_target/major = 1, - /datum/spell/targeted/heal_target/area = 1, - /datum/spell/targeted/heal_target/sacrifice = 1, - /datum/spell/targeted/genetic/blind = 1, - /datum/spell/targeted/shapeshift/baleful_polymorph = 1, - /datum/spell/targeted/projectile/dumbfire/stuncuff = 1, - /datum/spell/targeted/ethereal_jaunt = 2, - /datum/spell/aoe_turf/knock = 1, - /datum/spell/radiant_aura = 1, - /datum/spell/targeted/equip_item/holy_relic = 1, - /datum/spell/aoe_turf/conjure/grove/sanctuary = 1, - /datum/spell/aimed/fireball = 2, - /datum/spell/area_teleport = 2, - /datum/spell/portal_teleport = 2, - /datum/spell/aoe_turf/conjure/forcewall = 1, - /datum/spell/noclothes = 1, - /obj/item/magic_rock = 1, - /obj/structure/closet/wizard/scrying = 2, - /obj/item/summoning_stone = 2, - /obj/item/contract/wizard/telepathy = 1, - /obj/item/contract/apprentice = 1 - ) - - sacrifice_reagents = list(/datum/reagent/medicine/peridaxon, - /datum/reagent/adminordrazine) - sacrifice_objects = list(/obj/item/stack/nanopaste, - /obj/item/device/scanner/health, - /obj/item/stack/medical/advanced/bruise_pack, - /obj/item/stack/medical/advanced/ointment, - /obj/item/bodybag/rescue, - /obj/item/defibrillator - ) diff --git a/code/modules/spells/spellbook/druid.dm b/code/modules/spells/spellbook/druid.dm deleted file mode 100644 index 0b55d0d6601..00000000000 --- a/code/modules/spells/spellbook/druid.dm +++ /dev/null @@ -1,41 +0,0 @@ -//all about the summons, nature, and a bit o' healin. - -/obj/item/spellbook/druid - spellbook_type = /datum/spellbook/druid - -/datum/spellbook/druid - name = "\improper Druid's Leaflet" - feedback = "DL" - desc = "It smells like an air freshener." - book_desc = "Summons, nature, and a bit o' healin." - title = "Druidic Guide on how to be smug about nature" - title_desc = "Buy spells using your available spell slots. Artefacts may also be bought however their cost is permanent." - book_flags = CAN_MAKE_CONTRACTS|INVESTABLE - max_uses = 6 - - spells = list(/datum/spell/targeted/heal_target = 1, - /datum/spell/targeted/heal_target/sacrifice = 1, - /datum/spell/aoe_turf/conjure/mirage = 1, - /datum/spell/aoe_turf/conjure/summon/bats = 1, - // /datum/spell/aoe_turf/conjure/summon/bear = 1, - /datum/spell/targeted/equip_item/party_hardy = 1, - /datum/spell/targeted/equip_item/seed = 1, - /datum/spell/targeted/shapeshift/avian = 1, - /datum/spell/aoe_turf/disable_tech = 1, - /datum/spell/hand/charges/entangle = 1, - /datum/spell/aoe_turf/conjure/grove/sanctuary = 1, - /datum/spell/aoe_turf/knock = 1, - /datum/spell/area_teleport = 2, - /datum/spell/portal_teleport = 2, - /datum/spell/noclothes = 1, - /obj/structure/closet/wizard/souls = 1, - /obj/item/magic_rock = 1, - /obj/item/summoning_stone = 2, - /obj/item/contract/wizard/telepathy = 1, - /obj/item/contract/apprentice = 1 - ) - sacrifice_objects = list(/obj/item/seeds, - /obj/item/wirecutters/clippers, - /obj/item/device/scanner/plant, - /obj/item/material/hatchet, - /obj/item/material/minihoe) diff --git a/code/modules/spells/spellbook/spatial.dm b/code/modules/spells/spellbook/spatial.dm deleted file mode 100644 index 8e1cd311932..00000000000 --- a/code/modules/spells/spellbook/spatial.dm +++ /dev/null @@ -1,41 +0,0 @@ -//all about moving around and mobility and being an annoying shit. - -/obj/item/spellbook/spatial - spellbook_type = /datum/spellbook/spatial - -/datum/spellbook/spatial - name = "\improper Spatial Manual" - feedback = "SP" - desc = "You feel like this might disappear from out of under you." - book_desc = "Movement and teleportation. Run from your problems!" - title = "Manual of Spatial Transportation" - title_desc = "Buy spells using your available spell slots. Artefacts may also be bought however their cost is permanent." - book_flags = CAN_MAKE_CONTRACTS|INVESTABLE - max_uses = 11 - - spells = list(/datum/spell/targeted/ethereal_jaunt = 1, - /datum/spell/aoe_turf/blink = 1, - /datum/spell/area_teleport = 1, - /datum/spell/portal_teleport = 1, - /datum/spell/aimed/passage = 1, - /datum/spell/mark_recall = 1, - /datum/spell/targeted/swap = 1, - /datum/spell/targeted/shapeshift/avian = 1, - /datum/spell/targeted/projectile/magic_missile = 1, - /datum/spell/targeted/heal_target = 1, - /datum/spell/aoe_turf/conjure/forcewall = 1, - /datum/spell/aoe_turf/smoke = 1, - /datum/spell/aoe_turf/conjure/summon/bats = 3, - /datum/spell/noclothes = 1, - /obj/item/dice/d20/cursed = 1, - /obj/structure/closet/wizard/scrying = 2, - /obj/item/teleportation_scroll = 1, - /obj/item/magic_rock = 1, - /obj/item/summoning_stone = 3, - /obj/item/contract/wizard/telepathy = 1, - /obj/item/contract/apprentice = 1 - ) - - sacrifice_reagents = list(/datum/reagent/medicine/stimulant/hyperzine) - sacrifice_objects = list(/obj/item/stack/telecrystal, - /obj/item/stack/material/diamond) diff --git a/code/modules/spells/spellbook/standard.dm b/code/modules/spells/spellbook/standard.dm deleted file mode 100644 index 0bafe0dfe85..00000000000 --- a/code/modules/spells/spellbook/standard.dm +++ /dev/null @@ -1,52 +0,0 @@ -//the spellbook we know and love. Well, the one we know, at least. - -/obj/item/spellbook/standard - spellbook_type = /datum/spellbook/standard - -/datum/spellbook/standard - name = "\improper Standard Spellbook" - feedback = "SB" - title = "Book of Spells and Artefacts" - title_desc = "Buy spells using your available spell slots. Artefacts may also be bought however their cost is permanent." - book_desc = "A general wizard's spellbook. All its spells are easy to use but hard to master." - book_flags = CAN_MAKE_CONTRACTS|INVESTABLE - max_uses = 6 - - spells = list(/datum/spell/targeted/projectile/magic_missile = 1, - /datum/spell/aimed/fireball = 1, - /datum/spell/aoe_turf/disable_tech = 1, - /datum/spell/aoe_turf/smoke = 1, - /datum/spell/targeted/genetic/blind = 1, - /datum/spell/targeted/subjugation = 1, - /datum/spell/aoe_turf/conjure/forcewall = 1, - /datum/spell/aoe_turf/blink = 1, - /datum/spell/area_teleport = 1, - /datum/spell/targeted/genetic/mutate = 1, - /datum/spell/targeted/ethereal_jaunt = 1, - /datum/spell/targeted/heal_target = 1, - /datum/spell/aoe_turf/knock = 1, - /datum/spell/noclothes = 2, - /obj/item/gun/energy/staff/focus = 1, - /obj/structure/closet/wizard/souls = 1, - /obj/item/gun/energy/staff/animate = 1, - /obj/structure/closet/wizard/scrying = 1, - /obj/item/summoning_stone = 2, - /obj/item/magic_rock = 1, - /obj/item/contract/wizard/telepathy = 1, - /obj/item/contract/apprentice = 1 - ) - - sacrifice_objects = list(/obj/item/storage/toolbox, - /obj/item/cane, - /obj/item/flamethrower, - /obj/item/plastique, - /obj/item/dice, - /obj/item/soap, - /obj/item/flame/candle, - /obj/item/flame/candle/scented/incense, - /obj/item/caution, - /obj/item/towel, - /obj/item/tank/jetpack, - /obj/item/clothing/mask/plunger, - /obj/item/device/megaphone, - /obj/item/deck/cards) \ No newline at end of file diff --git a/code/modules/spells/spellbook/student.dm b/code/modules/spells/spellbook/student.dm deleted file mode 100644 index 85e1edf7ab0..00000000000 --- a/code/modules/spells/spellbook/student.dm +++ /dev/null @@ -1,27 +0,0 @@ -//wizard's training wheels. Basically. Same shit as in the general one. - -/obj/item/spellbook/student - spellbook_type = /datum/spellbook/student - -/datum/spellbook/student - name = "\improper Student's Spellbook" - feedback = "ST" - desc = "This spell book has a sticker on it that says, 'certified for children 5 and older'." - book_desc = "This spellbook is dedicated to teaching neophytes in the ways of magic." - title = "Book of Spells and Education" - title_desc = "Hello. Congratulations on becoming a wizard. You may be asking yourself: What? A wizard? Already? Of course! Anybody can become a wizard! Learning to be a good one is the hard part.
Without further adue, let us begin by learning the three concepts of wizardry, 'Spell slots', 'Spells', and 'Artifacts'.
Firstly lets try to understand the 'spell slot'. A spell slot is the measurable amount of spells and artifacts one tome can give. Most spells will only take up a singular spell slot, however more powerful spells/artifacts can take up more.
Spells are spells. They can have requirements, such as wizard garb, and most can be upgraded by purchasing additional spell slots for them. Most upgrades fall into two categories, 'Speed' and 'Power'. Speed upgrades decrease the time you have to spend recharging your spell. Power increases the potency of your spells. Spells are also special in that they can be refunded while inside the Wizard Acadamy, so if you want to test a spell out before moving out into the field, feel free to do that in the comfort of our home.
Artifacts, or 'Artefacts' as we call them, are powerful wizard tools or items made specially for wizards everywhere. Extremely potent, they cannot be refunded like spells, and some of them can be used by non-wizards, so be careful!
Knowing these three concepts puts you in a league above most wizards, however knowledge of spells is just as important so we've included a list of spells below made specifically for the beginning wizard. Take all of them, or mix and match, remember being creative is half of being a wizard!" - book_flags = CAN_MAKE_CONTRACTS|INVESTABLE - max_uses = 5 - - spells = list(/datum/spell/aoe_turf/knock = 1, - /datum/spell/targeted/ethereal_jaunt = 1, - /datum/spell/targeted/projectile/magic_missile = 1, - /obj/item/gun/energy/staff/focus = 1, - /obj/item/contract/wizard/xray = 1 - ) - -/datum/spellbook/student/apprentice - book_flags = CAN_MAKE_CONTRACTS|INVESTABLE|NOREVERT|NO_LOCKING - -/obj/item/spellbook/apprentice - spellbook_type = /datum/spellbook/student/apprentice \ No newline at end of file diff --git a/code/modules/spells/targeted/analyze.dm b/code/modules/spells/targeted/analyze.dm deleted file mode 100644 index 233392d3ccc..00000000000 --- a/code/modules/spells/targeted/analyze.dm +++ /dev/null @@ -1,19 +0,0 @@ -/datum/spell/targeted/analyze - name = "Analyze" - desc = "Using your wizardly powers, you can detect the inner destructions of a persons body." - - feedback = "AZ" - school = "illusion" - charge_max = 100 - spell_flags = INCLUDEUSER|SELECTABLE - range = 2 - invocation_type = INVOKE_WHISPER - invocation = "Fu Yi Fim" - compatible_mobs = list(/mob/living/carbon/human) - hud_state = "analyze" - -/datum/spell/targeted/analyze/cast(var/list/targets, var/mob/user) - for(var/a in targets) - var/mob/living/carbon/human/H = a - new /obj/effect/temp_visual/temporary(get_turf(a),5, 'icons/effects/effects.dmi', "repel_missiles") - to_chat(user,medical_scan_results(H,1)) \ No newline at end of file diff --git a/code/modules/spells/targeted/blood_boil.dm b/code/modules/spells/targeted/blood_boil.dm index e584354034c..0a3c1178790 100644 --- a/code/modules/spells/targeted/blood_boil.dm +++ b/code/modules/spells/targeted/blood_boil.dm @@ -1,8 +1,6 @@ /datum/spell/targeted/blood_boil name = "Blood Boil" desc = "This spell allows the caster to heat up an adversary's body so much their blood boils." - feedback = "BO" - school = "transmutation" charge_max = 300 spell_flags = 0 invocation_type = INVOKE_NONE @@ -15,6 +13,9 @@ hud_state = "wiz_boilblood" + spell_cost = 2 + mana_cost = 8 + /datum/spell/targeted/blood_boil/cast(list/targets, mob/user) for(var/mob/living/carbon/human/H in targets) H.bodytemperature += 80 diff --git a/code/modules/spells/targeted/cleric_spells.dm b/code/modules/spells/targeted/cleric_spells.dm deleted file mode 100644 index 47a7596e601..00000000000 --- a/code/modules/spells/targeted/cleric_spells.dm +++ /dev/null @@ -1,259 +0,0 @@ -/datum/spell/targeted/heal_target - name = "Cure Light Wounds" - desc = "a rudimentary spell used mainly by wizards to heal papercuts. Does not require wizard garb." - feedback = "CL" - school = "transmutation" - charge_max = 20 SECONDS - spell_flags = INCLUDEUSER | SELECTABLE - invocation = "Di'Nath!" - invocation_type = INVOKE_SHOUT - range = 2 - max_targets = 1 - level_max = list(UPGRADE_TOTAL = 2, UPGRADE_SPEED = 1, UPGRADE_POWER = 2) - - cooldown_reduc = 50 - hud_state = "heal_minor" - cast_sound = 'sound/magic/staff_healing.ogg' - - amt_dam_brute = -15 - amt_dam_fire = -5 - amt_dam_robo = -4 - effect_state = "green_sparkles" - effect_duration = 5 - - // Vars expect a constant at compile time, so we can't use macros for spans here - message = "You feel a pleasant rush of heat move through your body." - -/datum/spell/targeted/heal_target/empower_spell() - if(!..()) - return 0 - amt_dam_brute -= 15 - amt_dam_fire -= 15 - amt_dam_robo -= 7 - return "[src] will now heal more." - -/datum/spell/targeted/heal_target/tower - charge_max = 2 - -/datum/spell/targeted/heal_target/touch - name = "Healing Touch" - desc = "Heals an adjacent target for a reasonable amount of health." - range = 1 - amt_dam_fire = -7 - amt_dam_brute = -7 - amt_dam_robo = -5 - charge_max = 10 SECONDS - spell_flags = SELECTABLE - invocation = "Di'Na!" - - hud_state = "heal_touch" - -/datum/spell/targeted/heal_target/major - name = "Cure Major Wounds" - desc = "A spell used to fix others that cannot be fixed with regular medicine." - feedback = "CM" - charge_max = 30 SECONDS - spell_flags = INCLUDEUSER | SELECTABLE | NEEDSCLOTHES - invocation = "Borv Di'Nath!" - range = 1 - level_max = list(UPGRADE_TOTAL = 2, UPGRADE_SPEED = 1, UPGRADE_POWER = 1) - cooldown_reduc = 100 - hud_state = "heal_major" - - amt_dam_brute = -75 - amt_dam_fire = -50 - amt_dam_robo = -10 - amt_blood = 28 - - message = "Your body feels like a warm, cozy fire." - -/datum/spell/targeted/heal_target/major/empower_spell() - if(!..()) - return 0 - amt_blood = 28 - amt_organ = 5 - amt_brain = -5 - amt_radiation = -25 - amt_dam_tox = -20 - amt_dam_oxy = -14 - amt_dam_brute = -35 - amt_dam_fire = -35 - amt_dam_robo = -15 - - return "[src] heals more, and heals organ damage and radiation." - -/datum/spell/targeted/heal_target/major/tower - charge_max = 1 - spell_flags = INCLUDEUSER | SELECTABLE - -/datum/spell/targeted/heal_target/area - name = "Cure Area" - desc = "This spell heals everyone in an area." - feedback = "HA" - charge_max = 1 MINUTE - spell_flags = INCLUDEUSER - invocation = "Nal Di'Nath!" - range = 2 - max_targets = 0 - level_max = list(UPGRADE_TOTAL = 1, UPGRADE_SPEED = 1, UPGRADE_POWER = 1) - cooldown_reduc = 300 - hud_state = "heal_area" - amt_dam_robo = -6 - amt_dam_brute = -25 - amt_dam_fire = -25 - -/datum/spell/targeted/heal_target/area/empower_spell() - if(!..()) - return 0 - amt_dam_brute -= 15 - amt_dam_fire -= 15 - amt_dam_robo -= 4 - range += 2 - - return "[src] now heals more in a wider area." - -/datum/spell/targeted/heal_target/area/tower - charge_max = 1 - -/datum/spell/targeted/heal_target/area/slow - charge_max = 2 MINUTES - -/datum/spell/targeted/heal_target/sacrifice - name = "Sacrifice" - desc = "This spell heals immensily. For a price. Does not require wizard garb." - feedback = "SF" - spell_flags = SELECTABLE - invocation = "Ei'Nath Borv Di'Nath!" - charge_type = SPELL_HOLDVAR - holder_var_type = "fireloss" - holder_var_amount = 100 - level_max = list(UPGRADE_TOTAL = 1, UPGRADE_SPEED = 0, UPGRADE_POWER = 1) - - amt_dam_brute = -1000 - amt_dam_fire = -1000 - amt_dam_oxy = -100 - amt_dam_tox = -100 - amt_dam_robo = -1000 - amt_blood = 280 - effect_color = "#ff0000" - - hud_state = "gen_dissolve" - cast_sound = 'sound/magic/disintegrate.ogg' - -/datum/spell/targeted/heal_target/sacrifice/empower_spell() - if(!..()) - return 0 - - amt_organ = 25 - amt_brain = -25 - amt_radiation = -100 - - - return "You will now heal organ and brain damage, as well as virtually purge all radiation." - - -/datum/spell/targeted/heal_target/trance - name = "Trance" - desc = "A mighty spell of restoration that briefly forces its target into a deep, dreamless sleep, rapidly repairing their body and soul as their senses are dulled. The users of this mighty art are known for being short lived, slowly devolving into raving madness as the power they once relied on fails them with excessive use." - feedback = "TC" - spell_flags = SELECTABLE - invocation = "Di' Dae Nath!" - charge_max = 2 MINUTES - - amt_dam_brute = -1000 - amt_dam_fire = -1000 - amt_dam_oxy = -100 - amt_dam_tox = -100 - amt_dam_robo = -1000 - hud_state = "trance" - var/obj/effect/effect - -/datum/spell/targeted/heal_target/trance/cast(var/list/targets, var/mob/user) - for(var/t in targets) - var/mob/living/L = t - var/turf/T = get_turf(L) - effect = new /obj/effect/rift(T) - effect.color = "f0e68c" - L.forceMove(effect) - var/time = (L.getBruteLoss() + L.getFireLoss()) * 20 - L.status_flags &= GODMODE - to_chat(L,"You will be in stasis for [time/10] second\s.") - addtimer(CALLBACK(src,.proc/cancel_rift),time) - -/datum/spell/targeted/heal_target/trance/Destroy() - cancel_rift() - return ..() - -/datum/spell/targeted/heal_target/trance/proc/cancel_rift() - if(effect) - var/mob/living/L = locate() in effect - L.status_flags &= ~GODMODE - L.forceMove(get_turf(L)) - apply_spell_damage(L) - charge_max += 300 - QDEL_NULL(effect) - -/obj/effect/rift - name = "rift" - desc = "a tear in space and time." - icon = 'icons/obj/wizard.dmi' - icon_state = "rift" - unacidable = TRUE - anchored = TRUE - density = FALSE - -/obj/effect/rift/Destroy() - for(var/o in contents) - var/atom/movable/M = o - M.dropInto(loc) - . = ..() - -/datum/spell/targeted/revoke - name = "Revoke Death" - desc = "Revoke that of death itself. Comes at a cost that may be hard to manage for some." - feedback = "RK" - - spell_flags = SELECTABLE - - charge_type = SPELL_CHARGES - charge_max = 1 - invocation = "Di Le Nal Yen Nath!" - invocation_type = INVOKE_SHOUT - range = 1 - hud_state = "heal_revoke" - -/datum/spell/targeted/revoke/cast(var/list/targets, var/mob/living/user) - if(alert(user, "Are you sure?", "Alert", "Yes", "No") == "Yes" && alert(user, "Are you ABSOLUTELY SURE?", "Alert", "Absolutely!", "No") == "Absolutely!") - var/should_wait = 1 - for(var/t in targets) - var/mob/living/M = t - M.rejuvenate() - if(M.client) //We've got a dude - should_wait = 0 - break //Don't need to check anymore. - if(should_wait) - addtimer(CALLBACK(src,.proc/check_for_revoke,targets), 30 SECONDS) - else - revoke_spells() - - -/datum/spell/targeted/revoke/proc/check_for_revoke(var/list/targets) - for(var/t in targets) - var/mob/M = t - if(M.client) - revoke_spells() - return - charge_counter = charge_max - to_chat(holder,"\The [src] refreshes as it seems it could not bring back the souls of those you healed.") - -/datum/spell/targeted/revoke/proc/revoke_spells() - if(!istype(holder, /mob/living)) - return - var/mob/living/M = holder - if(M.mind) - for(var/s in M.mind.learned_spells) - if(istype(s, /datum/spell/toggle_armor)) //Can keep the armor n junk. - continue - M.remove_spell(s) - for(var/a in M.auras) - M.remove_aura(a) \ No newline at end of file diff --git a/code/modules/spells/targeted/equip/_equip.dm b/code/modules/spells/targeted/equip/_equip.dm index 1f6108e46be..020a5a38ebc 100644 --- a/code/modules/spells/targeted/equip/_equip.dm +++ b/code/modules/spells/targeted/equip/_equip.dm @@ -9,7 +9,7 @@ var/delete_old = 1 //if the item previously in the slot is deleted - otherwise, it's dropped /datum/spell/targeted/equip_item/cast(list/targets, mob/user = usr) - ..() + . = ..() var/list/summoned_items = list() for(var/mob/living/L in targets) for(var/slot_id in equipped_summons) @@ -36,5 +36,5 @@ for(var/obj/item/to_remove in summoned_items) QDEL_IN(to_remove, duration) -/datum/spell/targeted/equip_item/proc/summon_item(var/newtype) +/datum/spell/targeted/equip_item/proc/summon_item(newtype) return new newtype diff --git a/code/modules/spells/targeted/equip/burning_touch.dm b/code/modules/spells/targeted/equip/burning_touch.dm index 8b07913ef03..fca487139dc 100644 --- a/code/modules/spells/targeted/equip/burning_touch.dm +++ b/code/modules/spells/targeted/equip/burning_touch.dm @@ -1,8 +1,6 @@ /datum/spell/targeted/equip_item/burning_hand name = "Burning Hand" desc = "Bathes your hand in fire, giving you all the perks and disadvantages that brings." - feedback = "BH" - school = "conjuration" invocation = "Horila Kiha!" invocation_type = INVOKE_SHOUT spell_flags = INCLUDEUSER diff --git a/code/modules/spells/targeted/equip/dyrnwyn.dm b/code/modules/spells/targeted/equip/dyrnwyn.dm index 9b17d35d16b..49f15ee2c55 100644 --- a/code/modules/spells/targeted/equip/dyrnwyn.dm +++ b/code/modules/spells/targeted/equip/dyrnwyn.dm @@ -1,11 +1,9 @@ /datum/spell/targeted/equip_item/dyrnwyn name = "Summon Dyrnwyn" desc = "Summons the legendary sword of Rhydderch Hael, said to draw in flame when held by a worthy man." - feedback = "SD" charge_type = SPELL_HOLDVAR holder_var_type = "fireloss" holder_var_amount = 10 - school = "conjuration" invocation = "Anrhydeddu Fi!" invocation_type = INVOKE_SHOUT spell_flags = INCLUDEUSER @@ -20,7 +18,7 @@ hud_state = "gen_immolate" -/datum/spell/targeted/equip_item/dyrnwyn/summon_item(var/new_type) +/datum/spell/targeted/equip_item/dyrnwyn/summon_item(new_type) var/obj/item/W = new new_type (null, material) W.SetName("\improper Dyrnwyn") W.damtype = BURN @@ -29,12 +27,9 @@ W.slowdown_per_slot[slot_r_hand] = 1 return W -/datum/spell/targeted/equip_item/dyrnwyn/empower_spell() +/datum/spell/targeted/equip_item/dyrnwyn/ImproveSpellPower() if(!..()) return 0 material = MATERIAL_SILVER return "Dyrnwyn has been made pure: it is now made of silver." - -/datum/spell/targeted/equip_item/dyrnwyn/tower - charge_max = 1 diff --git a/code/modules/spells/targeted/equip/holy_relic.dm b/code/modules/spells/targeted/equip/holy_relic.dm index c27e107b640..e7c3636f801 100644 --- a/code/modules/spells/targeted/equip/holy_relic.dm +++ b/code/modules/spells/targeted/equip/holy_relic.dm @@ -1,8 +1,6 @@ /datum/spell/targeted/equip_item/holy_relic name = "Summon Holy Relic" desc = "This spell summons a relic of purity into your hand for a short while. The relic will disrupt occult and magical energies - be wary, as this includes your own." - feedback = "SR" - school = "conjuration" charge_type = SPELL_RECHARGE spell_flags = NEEDSCLOTHES | INCLUDEUSER invocation = "Yee'Ro Su!" @@ -25,10 +23,10 @@ for(var/mob/M in targets) M.visible_message(SPAN_DANGER("A rod of metal appears in \the [M]'s hand!")) -/datum/spell/targeted/equip_item/holy_relic/empower_spell() +/datum/spell/targeted/equip_item/holy_relic/ImproveSpellPower() if(!..()) return 0 duration += 50 - return "The holy relic now lasts for [duration/10] seconds." \ No newline at end of file + return "The holy relic now lasts for [duration/10] seconds." diff --git a/code/modules/spells/targeted/equip/horsemask.dm b/code/modules/spells/targeted/equip/horsemask.dm index ceda530c599..6527d0c17f2 100644 --- a/code/modules/spells/targeted/equip/horsemask.dm +++ b/code/modules/spells/targeted/equip/horsemask.dm @@ -1,7 +1,6 @@ /datum/spell/targeted/equip_item/horsemask name = "Curse of the Horseman" desc = "This spell triggers a curse on a target, causing them to wield an unremovable horse head mask. They will speak like a horse! Any masks they are wearing will be disintegrated. This spell does not require robes." - school = "transmutation" charge_type = SPELL_RECHARGE charge_max = 150 charge_counter = 0 @@ -39,7 +38,7 @@ magichead.voicechange = 1 //NEEEEIIGHH return new_item -/datum/spell/targeted/equip_item/horsemask/empower_spell() +/datum/spell/targeted/equip_item/horsemask/ImproveSpellPower() if(!..()) return 0 diff --git a/code/modules/spells/targeted/equip/party_hardy.dm b/code/modules/spells/targeted/equip/party_hardy.dm index f57440d08ce..30dcf5c7f11 100644 --- a/code/modules/spells/targeted/equip/party_hardy.dm +++ b/code/modules/spells/targeted/equip/party_hardy.dm @@ -1,8 +1,6 @@ /datum/spell/targeted/equip_item/party_hardy name = "Summon Party" desc = "This spell was invented for the sole purpose of getting crunked at 11am on a Tuesday. Does not require wizard garb." - feedback = "PY" - school = "conjuration" charge_type = SPELL_RECHARGE charge_max = 900 cooldown_min = 600 @@ -19,7 +17,7 @@ compatible_mobs = list(/mob/living/carbon/human) equipped_summons = list("active hand" = /obj/item/reagent_containers/food/drinks/bottle/small/beer) -/datum/spell/targeted/equip_item/party_hardy/empower_spell() +/datum/spell/targeted/equip_item/party_hardy/ImproveSpellPower() if(!..()) return 0 switch(spell_levels[UPGRADE_POWER]) diff --git a/code/modules/spells/targeted/equip/seed.dm b/code/modules/spells/targeted/equip/seed.dm index 758414b99bd..148055a1d4d 100644 --- a/code/modules/spells/targeted/equip/seed.dm +++ b/code/modules/spells/targeted/equip/seed.dm @@ -1,7 +1,6 @@ /datum/spell/targeted/equip_item/seed name = "Summon Seed" desc = "This spell summons a random seed into the hand of the wizard." - feedback = "SE" delete_old = 0 spell_flags = INCLUDEUSER | NEEDSCLOTHES diff --git a/code/modules/spells/targeted/equip/shield.dm b/code/modules/spells/targeted/equip/shield.dm index bf9e99c61cb..dfa15981907 100644 --- a/code/modules/spells/targeted/equip/shield.dm +++ b/code/modules/spells/targeted/equip/shield.dm @@ -1,8 +1,6 @@ /datum/spell/targeted/equip_item/shield name = "Summon Shield" desc = "Summons the most holy of shields, the riot shield. Commonly used during wizard riots." - feedback = "SH" - school = "conjuration" invocation = "Sia helda!" invocation_type = INVOKE_SHOUT spell_flags = INCLUDEUSER | NEEDSCLOTHES @@ -31,7 +29,7 @@ I.base_block_chance = block_chance return I -/datum/spell/targeted/equip_item/shield/empower_spell() +/datum/spell/targeted/equip_item/shield/ImproveSpellPower() if(!..()) return 0 @@ -39,6 +37,3 @@ block_chance = 60 return "Your summoned shields will now block more often." - -/datum/spell/targeted/equip_item/shield/tower - charge_max = 1 \ No newline at end of file diff --git a/code/modules/spells/targeted/ethereal_jaunt.dm b/code/modules/spells/targeted/ethereal_jaunt.dm index 98ef7d42459..2b4e2357092 100644 --- a/code/modules/spells/targeted/ethereal_jaunt.dm +++ b/code/modules/spells/targeted/ethereal_jaunt.dm @@ -1,20 +1,24 @@ /datum/spell/targeted/ethereal_jaunt name = "Ethereal Jaunt" desc = "This spell creates your ethereal form, temporarily making you invisible and able to pass through walls." - feedback = "EJ" - school = "transmutation" - charge_max = 30 SECONDS + spell_flags = Z2NOCAST | NEEDSCLOTHES | INCLUDEUSER invocation = "none" invocation_type = INVOKE_NONE range = 0 max_targets = 1 - level_max = list(UPGRADE_TOTAL = 4, UPGRADE_SPEED = 4, UPGRADE_POWER = 3) - cooldown_min = 10 SECONDS //50 deciseconds reduction per rank + level_max = list(UPGRADE_TOTAL = 4, UPGRADE_SPEED = 2, UPGRADE_POWER = 3) + + charge_max = 30 SECONDS + cooldown_min = 10 SECONDS + cooldown_reduc = 5 SECONDS duration = 5 SECONDS hud_state = "wiz_jaunt" + spell_cost = 2 + mana_cost = 7 + var/reappear_duration = 5 var/obj/effect/dummy/spell_jaunt/jaunt_holder var/atom/movable/overlay/animation @@ -70,7 +74,7 @@ QDEL_NULL(animation) QDEL_NULL(jaunt_holder) -/datum/spell/targeted/ethereal_jaunt/empower_spell() +/datum/spell/targeted/ethereal_jaunt/ImproveSpellPower() if(!..()) return 0 duration += 2 SECONDS @@ -131,7 +135,3 @@ return /obj/effect/dummy/spell_jaunt/bullet_act(blah) return - -/datum/spell/targeted/ethereal_jaunt/tower - charge_max = 2 - spell_flags = Z2NOCAST | INCLUDEUSER diff --git a/code/modules/spells/targeted/exhude_pleasantness.dm b/code/modules/spells/targeted/exhude_pleasantness.dm index 91ea11cf349..8e8272cc965 100644 --- a/code/modules/spells/targeted/exhude_pleasantness.dm +++ b/code/modules/spells/targeted/exhude_pleasantness.dm @@ -1,8 +1,6 @@ /datum/spell/targeted/exhude_pleasantness name = "Exhude Pleasantness" desc = "A simple spell used to make friends with people. Be warned, this spell only has a subtle effect." - feedback = "AP" - school = "Illusion" spell_flags = INCLUDEUSER range = 5 max_targets = 0 @@ -10,6 +8,9 @@ var/list/possible_messages = list("seems pretty trustworthy!", "makes you feel appreciated.", "looks pretty cool.", "feels like the only decent person here!", "makes you feel safe.") hud_state = "friendly" + spell_cost = 1 + mana_cost = 1 + /datum/spell/targeted/exhude_pleasantness/cast(var/list/targets, var/mob/user) for(var/m in targets) var/mob/living/L = m diff --git a/code/modules/spells/targeted/genetic.dm b/code/modules/spells/targeted/genetic.dm index 66fb06beb2a..bb77f5d51ed 100644 --- a/code/modules/spells/targeted/genetic.dm +++ b/code/modules/spells/targeted/genetic.dm @@ -12,6 +12,7 @@ code\game\dna\genes\goon_powers.dm var/list/mutations = list() //mutation strings duration = 100 //deciseconds + spell_book_visible = FALSE /datum/spell/targeted/genetic/cast(list/targets) ..() @@ -30,9 +31,7 @@ code\game\dna\genes\goon_powers.dm /datum/spell/targeted/genetic/blind name = "Blind" desc = "This spell inflicts a target with temporary blindness. Does not require wizard garb." - feedback = "BD" disabilities = 1 - school = "illusion" duration = 300 charge_max = 300 @@ -53,7 +52,7 @@ code\game\dna\genes\goon_powers.dm hud_state = "wiz_blind" cast_sound = 'sound/magic/blind.ogg' -/datum/spell/targeted/genetic/blind/empower_spell() +/datum/spell/targeted/genetic/blind/ImproveSpellPower() if(!..()) return 0 duration += 100 @@ -63,8 +62,6 @@ code\game\dna\genes\goon_powers.dm /datum/spell/targeted/genetic/mutate name = "Mutate" desc = "This spell causes you to turn into a hulk and gain laser vision for a short while." - feedback = "MU" - school = "transmutation" charge_max = 400 spell_flags = Z2NOCAST | NEEDSCLOTHES | INCLUDEUSER invocation = "BIRUZ BENNAR" @@ -88,8 +85,6 @@ code\game\dna\genes\goon_powers.dm /datum/spell/targeted/genetic/blind/hysteria name = "Hysteria" desc = "A spell used to make someone look like a blind fool, and also makes them a blind fool." - feedback = "HY" - school = "illusion" spell_flags = SELECTABLE charge_max = 600 invocation_type = INVOKE_SHOUT @@ -100,8 +95,6 @@ code\game\dna\genes\goon_powers.dm /datum/spell/targeted/genetic/blind/starburst name = "Starburst" desc = "Send a jolt of electricity through everyone's nerve center, blinding and stunning them." - feedback = "SB" - school = "transmutation" invocation = "Tid Caeh Yor!" spell_flags = NOFACTION invocation_type = INVOKE_SHOUT @@ -115,4 +108,4 @@ code\game\dna\genes\goon_powers.dm effect_state = "electricity_constant" effect_duration = 5 - hud_state = "wiz_starburst" \ No newline at end of file + hud_state = "wiz_starburst" diff --git a/code/modules/spells/targeted/glimpse_of_eternity.dm b/code/modules/spells/targeted/glimpse_of_eternity.dm index 682f6e159a7..478465ad979 100644 --- a/code/modules/spells/targeted/glimpse_of_eternity.dm +++ b/code/modules/spells/targeted/glimpse_of_eternity.dm @@ -1,8 +1,6 @@ /datum/spell/targeted/glimpse_of_eternity name = "Glimpse of Eternity" desc = "Show the non-believers what enlightenment truely means." - feedback = "GE" - school = "illusion" invocation = "Ghe Tar Yet!" invocation_type = INVOKE_SHOUT spell_flags = INCLUDEUSER @@ -12,6 +10,9 @@ hud_state = "wiz_glimpse" + spell_cost = 2 + mana_cost = 10 + /datum/spell/targeted/glimpse_of_eternity/cast(var/list/targets, var/mob/user) for(var/t in targets) var/mob/living/L = t @@ -23,4 +24,4 @@ L.eye_blind += 2 L.adjustBruteLoss(-10) L.adjustFireLoss(-10) - new /obj/effect/temp_visual/temporary(get_turf(L), 5, 'icons/effects/effects.dmi', "green_sparkles") \ No newline at end of file + new /obj/effect/temp_visual/temporary(get_turf(L), 5, 'icons/effects/effects.dmi', "green_sparkles") diff --git a/code/modules/spells/targeted/harvest.dm b/code/modules/spells/targeted/harvest.dm index 4f5128b8f81..f20db899a04 100644 --- a/code/modules/spells/targeted/harvest.dm +++ b/code/modules/spells/targeted/harvest.dm @@ -2,7 +2,6 @@ name = "Harvest" desc = "Back to where I come from, and you're coming with me." - school = "transmutation" charge_max = 200 spell_flags = Z2NOCAST | CONSTRUCT_CHECK | INCLUDEUSER invocation = "" @@ -34,4 +33,3 @@ to_chat(user, "You warp back to Nar-Sie[prey ? " along with your prey":""].") else to_chat(user, "...something's wrong!")//There shouldn't be an instance of Harvesters when Nar-Sie isn't in the world. - diff --git a/code/modules/spells/targeted/healing.dm b/code/modules/spells/targeted/healing.dm new file mode 100644 index 00000000000..687f27bfd17 --- /dev/null +++ b/code/modules/spells/targeted/healing.dm @@ -0,0 +1,28 @@ +/datum/spell/targeted/heal_target/area + name = "Cure Area" + desc = "This spell heals everyone in an area." + charge_max = 1 MINUTE + spell_flags = INCLUDEUSER + invocation = "Nal Di'Nath!" + invocation_type = INVOKE_SHOUT + range = 2 + max_targets = 0 + level_max = list(UPGRADE_TOTAL = 3, UPGRADE_SPEED = 2, UPGRADE_POWER = 2) + cooldown_reduc = 300 + hud_state = "heal_area" + amt_dam_robo = -6 + amt_dam_brute = -25 + amt_dam_fire = -25 + + spell_cost = 3 + mana_cost = 25 + +/datum/spell/targeted/heal_target/area/ImproveSpellPower() + if(!..()) + return 0 + amt_dam_brute -= 15 + amt_dam_fire -= 15 + amt_dam_robo -= 4 + range += 2 + + return "[src] now heals more in a wider area." diff --git a/code/modules/spells/targeted/pestilence.dm b/code/modules/spells/targeted/pestilence.dm new file mode 100644 index 00000000000..f25e5ecc969 --- /dev/null +++ b/code/modules/spells/targeted/pestilence.dm @@ -0,0 +1,44 @@ +/datum/spell/targeted/pestilence + name = "Pestilence" + desc = "Infects everyone nearby with a disease. You are made immune to it." + invocation = "Decay!" + invocation_type = INVOKE_SHOUT + max_targets = 0 + charge_max = 400 + range = 3 + + hud_state = "wiz_pestilence" + cast_sound = 'sound/magic/pestilence.ogg' + + spell_cost = 2 + mana_cost = 10 + compatible_mobs = list(/mob/living/carbon/human) + + level_max = list(UPGRADE_TOTAL = 5, UPGRADE_SPEED = 0, UPGRADE_POWER = 5) + + var/disease_symptoms = 2 + var/disease_severity = 3 + +/datum/spell/targeted/pestilence/cast(list/targets, mob/living/carbon/human/user) + var/datum/disease/D = new /datum/disease/advance/random(disease_symptoms, disease_severity) + user.disease_resistances |= D.GetDiseaseID() + for(var/i = 1 to 8) + new /obj/effect/temp_visual/pestilence_glow/self(get_turf(user)) + for(var/mob/living/carbon/human/H in targets) + if(LAZYLEN(H.diseases)) + continue + if(!H.CanContractDisease(D)) + continue + + H.ForceContractDisease(D, FALSE, TRUE) + for(var/i = 1 to 4) + new /obj/effect/temp_visual/pestilence_glow(get_turf(H)) + +/datum/spell/targeted/pestilence/ImproveSpellPower() + if(!..()) + return FALSE + + disease_symptoms += 1 + disease_severity += 1 + + return "The symptoms of the disease created with spell [src] are now more powerful and their amount is [disease_symptoms]." diff --git a/code/modules/spells/targeted/projectile/magic_missile.dm b/code/modules/spells/targeted/projectile/magic_missile.dm index 3e92834c4ca..87a825ac376 100644 --- a/code/modules/spells/targeted/projectile/magic_missile.dm +++ b/code/modules/spells/targeted/projectile/magic_missile.dm @@ -1,8 +1,6 @@ /datum/spell/targeted/projectile/magic_missile name = "Magic Missile" desc = "This spell fires several, slow moving, magic projectiles at nearby targets." - feedback = "MM" - school = "conjuration" charge_max = 150 spell_flags = NEEDSCLOTHES invocation = "Forti Gy-Ama!" @@ -19,11 +17,13 @@ hud_state = "wiz_mm" cast_sound = 'sound/magic/magic_missile.ogg' - amt_paralysis = 3 - amt_stunned = 3 + amt_weakened = 2 amt_dam_fire = 10 + spell_cost = 2 + mana_cost = 10 + /datum/spell/targeted/projectile/magic_missile/prox_cast(var/list/targets, atom/spell_holder) spell_holder.visible_message("\The [spell_holder] pops with a flash!") playsound(src, 'sound/magic/mm_hit.ogg', 40) @@ -31,13 +31,12 @@ apply_spell_damage(M) return -/datum/spell/targeted/projectile/magic_missile/empower_spell() +/datum/spell/targeted/projectile/magic_missile/ImproveSpellPower() if(!..()) return 0 if(spell_levels[UPGRADE_POWER] == level_max[UPGRADE_POWER]) - amt_paralysis += 1 - amt_stunned += 1 + amt_weakened += 2 return "[src] will now stun people for a longer duration." amt_dam_fire += 5 return "[src] does more damage now." @@ -49,6 +48,9 @@ name = "magic missile" icon_state = "magicm" + // Very slow + speed = 2.5 + proj_trail = 1 proj_trail_lifespan = 5 proj_trail_icon_state = "magicmd" diff --git a/code/modules/spells/targeted/projectile/projectile.dm b/code/modules/spells/targeted/projectile/projectile.dm index 88c14664d96..5ffb6a4d8b0 100644 --- a/code/modules/spells/targeted/projectile/projectile.dm +++ b/code/modules/spells/targeted/projectile/projectile.dm @@ -6,8 +6,6 @@ If the spell_projectile is seeking, it will update its target every process and */ /datum/spell/targeted/projectile - name = "projectile spell" - range = 7 var/proj_type = /obj/item/projectile/spell_projectile //use these. They are very nice @@ -46,4 +44,4 @@ If the spell_projectile is seeking, it will update its target every process and return targets /datum/spell/targeted/projectile/proc/prox_cast(var/list/targets, var/atom/movable/spell_holder) - return targets \ No newline at end of file + return targets diff --git a/code/modules/spells/targeted/projectile/stuncuff.dm b/code/modules/spells/targeted/projectile/stuncuff.dm deleted file mode 100644 index 1f684df9e4e..00000000000 --- a/code/modules/spells/targeted/projectile/stuncuff.dm +++ /dev/null @@ -1,49 +0,0 @@ -/datum/spell/targeted/projectile/dumbfire/stuncuff - name = "Stun Cuff" - desc = "This spell fires out a small curse that stuns and cuffs the target." - feedback = "SC" - proj_type = /obj/item/projectile/spell_projectile/stuncuff - - charge_type = SPELL_CHARGES - charge_max = 6 - charge_counter = 6 - spell_flags = 0 - invocation = "Fu'Reai Diakan!" - invocation_type = INVOKE_SHOUT - range = 20 - - level_max = list(UPGRADE_TOTAL = 0, UPGRADE_SPEED = 0, UPGRADE_POWER = 0) - - duration = 20 - proj_step_delay = 1 - - amt_stunned = 6 - - hud_state = "wiz_cuff" - cast_sound = 'sound/magic/wandodeath.ogg' - -/datum/spell/targeted/projectile/dumbfire/stuncuff/prox_cast(var/list/targets, spell_holder) - for(var/mob/living/M in targets) - if(istype(M,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - var/obj/item/handcuffs/wizard/cuffs = new() - cuffs.forceMove(H) - H.handcuffed = cuffs - H.update_inv_handcuffed() - H.visible_message("Beams of light form around \the [H]'s hands!") - apply_spell_damage(M) - - -/obj/item/handcuffs/wizard - name = "beams of light" - desc = "Undescribable and unpenetrable. Or so they say." - - breakouttime = 300 //30 seconds - -/obj/item/handcuffs/wizard/dropped(var/mob/user) - ..() - qdel(src) - -/obj/item/projectile/spell_projectile/stuncuff - name = "stuncuff" - icon_state = "spell" \ No newline at end of file diff --git a/code/modules/spells/targeted/shapeshift.dm b/code/modules/spells/targeted/shapeshift.dm index 7e47dff437d..0e4a0bc05ee 100644 --- a/code/modules/spells/targeted/shapeshift.dm +++ b/code/modules/spells/targeted/shapeshift.dm @@ -1,10 +1,8 @@ //basic transformation spell. Should work for most simple_animals /datum/spell/targeted/shapeshift - name = "Shapeshift" desc = "This spell transforms the target into something else for a short while." - school = "transmutation" charge_type = SPELL_RECHARGE charge_max = 600 @@ -17,7 +15,7 @@ cast_sound = 'sound/magic/charge.ogg' var/revert_sound = 'sound/magic/charge.ogg' //the sound that plays when something gets turned back. var/share_damage = 1 //do we want the damage we take from our new form to move onto our real one? (Only counts for finite duration) - var/drop_items = 1 //do we want to drop all our items when we transform? + var/drop_items = FALSE //do we want to drop all our items when we transform? var/toggle = 0 //Can we toggle this? var/list/transformed_dudes = list() //Who we transformed. Transformed = Transformation. Both mobs. @@ -98,7 +96,6 @@ /datum/spell/targeted/shapeshift/baleful_polymorph name = "Baleful Polymorth" desc = "This spell transforms its target into a small, furry animal." - feedback = "BP" possible_transformations = list(/mob/living/simple_animal/friendly/lizard,/mob/living/simple_animal/friendly/mouse,/mob/living/simple_animal/friendly/corgi) share_damage = 0 @@ -115,8 +112,10 @@ hud_state = "wiz_poly" + spell_cost = 1 + mana_cost = 3 -/datum/spell/targeted/shapeshift/baleful_polymorph/empower_spell() +/datum/spell/targeted/shapeshift/baleful_polymorph/ImproveSpellPower() if(!..()) return 0 @@ -127,10 +126,8 @@ /datum/spell/targeted/shapeshift/avian name = "Polymorph" desc = "This spell transforms the wizard into the common parrot." - feedback = "AV" possible_transformations = list(/mob/living/simple_animal/hostile/retaliate/parrot) - drop_items = 0 share_damage = 0 invocation = "Poli'crakata!" invocation_type = INVOKE_SHOUT @@ -142,10 +139,12 @@ level_max = list(UPGRADE_TOTAL = 1, UPGRADE_SPEED = 1, UPGRADE_POWER = 0) hud_state = "wiz_parrot" + spell_cost = 1 + mana_cost = 3 + /datum/spell/targeted/shapeshift/corrupt_form name = "Corrupt Form" desc = "This spell shapes the wizard into a terrible, terrible beast." - feedback = "CF" possible_transformations = list(/mob/living/simple_animal/hostile/faithless) invocation = "mutters something dark and twisted as their form begins to twist..." @@ -156,7 +155,6 @@ charge_max = 1200 cooldown_min = 600 - drop_items = 0 share_damage = 0 level_max = list(UPGRADE_TOTAL = 3, UPGRADE_SPEED = 2, UPGRADE_POWER = 2) @@ -165,7 +163,10 @@ hud_state = "wiz_corrupt" cast_sound = 'sound/magic/disintegrate.ogg' -/datum/spell/targeted/shapeshift/corrupt_form/empower_spell() + spell_cost = 2 + mana_cost = 10 + +/datum/spell/targeted/shapeshift/corrupt_form/ImproveSpellPower() if(!..()) return 0 @@ -185,9 +186,8 @@ /datum/spell/targeted/shapeshift/familiar name = "Transform" desc = "Transform into a familiar form. Literally." - feedback = "FA" possible_transformations = list() - drop_items = 0 + invocation_type = INVOKE_EMOTE invocation = "'s body dissipates into a pale mass of light, then reshapes!" range = -1 @@ -196,4 +196,7 @@ charge_max = 2 MINUTES toggle = 1 - hud_state = "wiz_carp" \ No newline at end of file + hud_state = "wiz_carp" + + spell_cost = 2 + mana_cost = 5 diff --git a/code/modules/spells/targeted/shatter_mind.dm b/code/modules/spells/targeted/shatter_mind.dm index 705d26f9282..ae486445573 100644 --- a/code/modules/spells/targeted/shatter_mind.dm +++ b/code/modules/spells/targeted/shatter_mind.dm @@ -1,8 +1,6 @@ /datum/spell/targeted/shatter name = "Shatter Mind" - desc = "this spell allows the caster to literally break an enemy's mind. Permanently." - feedback = "SM" - school = "illusion" + desc = "this spell allows the caster to literally break an enemy's mind." charge_max = 300 spell_flags = 0 invocation_type = INVOKE_NONE @@ -15,6 +13,9 @@ hud_state = "wiz_statue" + spell_cost = 1 + mana_cost = 5 + /datum/spell/targeted/shatter/cast(var/list/targets, var/mob/user) var/mob/living/carbon/human/H = targets[1] if(prob(50)) diff --git a/code/modules/spells/targeted/shift.dm b/code/modules/spells/targeted/shift.dm index 7c24a4f34c1..b971aa3f7d4 100644 --- a/code/modules/spells/targeted/shift.dm +++ b/code/modules/spells/targeted/shift.dm @@ -10,6 +10,9 @@ hud_state = "const_shift" + spell_cost = 2 + mana_cost = 10 + /datum/spell/targeted/ethereal_jaunt/shift/jaunt_disappear(var/atom/movable/overlay/animation, var/mob/living/target) to_chat(target, SPAN_DANGER("You silently phase out.")) // no visible message - phase shift is silent animation.icon_state = "phase_shift" diff --git a/code/modules/spells/targeted/subjugate.dm b/code/modules/spells/targeted/subjugate.dm index 934155d9207..7995c5249ba 100644 --- a/code/modules/spells/targeted/subjugate.dm +++ b/code/modules/spells/targeted/subjugate.dm @@ -1,8 +1,6 @@ /datum/spell/targeted/subjugation name = "Subjugation" desc = "This spell temporarily subjugates a target's mind and does not require wizard garb." - feedback = "SJ" - school = "illusion" charge_max = 500 spell_flags = NOFACTION invocation = "Dii Oda Baji." @@ -22,7 +20,10 @@ hud_state = "wiz_subj" -/datum/spell/targeted/subjugation/empower_spell() + spell_cost = 3 + mana_cost = 25 + +/datum/spell/targeted/subjugation/ImproveSpellPower() if(!..()) return 0 @@ -32,4 +33,4 @@ return "[src] will now effect everyone in the area." else max_targets++ - return "[src] will now effect [max_targets] people." \ No newline at end of file + return "[src] will now effect [max_targets] people." diff --git a/code/modules/spells/targeted/swap.dm b/code/modules/spells/targeted/swap.dm deleted file mode 100644 index 4b82a9c8d53..00000000000 --- a/code/modules/spells/targeted/swap.dm +++ /dev/null @@ -1,41 +0,0 @@ -/datum/spell/targeted/swap - name = "swap" - desc = "This spell swaps the positions of the wizard and a target. Causes brain damage." - feedback = "SW" - school = "conjuration" - - charge_type = SPELL_HOLDVAR - holder_var_type = "brainloss" - holder_var_amount = 10 - - invocation = "Joyo!" - invocation_type = INVOKE_WHISPER - - level_max = list(UPGRADE_TOTAL = 2, UPGRADE_SPEED = 0, UPGRADE_POWER = 2) - - spell_flags = Z2NOCAST - range = 6 - max_targets = 1 - compatible_mobs = list(/mob/living) - - hud_state = "wiz_swap" - - cast_sound = 'sound/magic/mandswap.ogg' - -/datum/spell/targeted/swap/cast(var/list/targets, mob/user) - for(var/mob/T in targets) - var/turf/aT = get_turf(T) - var/turf/bT = get_turf(user) - - T.forceMove(bT) - user.forceMove(aT) - - apply_spell_damage(T) - -/datum/spell/targeted/swap/empower_spell() - if(!..()) - return 0 - - amt_eye_blind += 2 - - return "This spell will now blind the target." diff --git a/code/modules/spells/targeted/torment.dm b/code/modules/spells/targeted/torment.dm index a60604ad409..22a48802a27 100644 --- a/code/modules/spells/targeted/torment.dm +++ b/code/modules/spells/targeted/torment.dm @@ -1,8 +1,6 @@ /datum/spell/targeted/torment name = "Torment" desc = "this spell causes pain to all those in its radius." - feedback = "TM" - school = "illusion" charge_max = 150 spell_flags = NOFACTION invocation = "Rai Di-Kaal!" @@ -20,12 +18,15 @@ hud_state = "wiz_horse" cast_sound = 'sound/magic/cowhead_curse.ogg' + spell_cost = 2 + mana_cost = 10 + /datum/spell/targeted/torment/cast(var/list/targets, var/mob/user) gibs(user.loc) for(var/mob/living/carbon/human/H in targets) H.adjustHalLoss(loss) -/datum/spell/targeted/torment/empower_spell() +/datum/spell/targeted/torment/ImproveSpellPower() if(!..()) return 0 diff --git a/code/modules/submaps/submap_job.dm b/code/modules/submaps/submap_job.dm index 6121e1d0de1..40d91eb4036 100644 --- a/code/modules/submaps/submap_job.dm +++ b/code/modules/submaps/submap_job.dm @@ -14,6 +14,8 @@ skill_points = 25 psi_latency_chance = 6 give_psionic_implant_on_join = FALSE + higher_mana_chance = 5 + higher_spell_points_chance = 5 max_skill = list( SKILL_BUREAUCRACY = SKILL_MAX, SKILL_FINANCE = SKILL_MAX, SKILL_EVA = SKILL_MAX, diff --git a/code/stylesheet.dm b/code/stylesheet.dm index 18044bdee3f..d96d29230bd 100644 --- a/code/stylesheet.dm +++ b/code/stylesheet.dm @@ -83,12 +83,12 @@ h1.alert, h2.alert {color: #000080;} .disarm {color: #990000;} .passive {color: #660000;} -.italic {font-style: italic;} +.italic {font-style: italic;} .bold {font-weight: bold;} .danger {color: #ff0000; font-weight: bold;} -.bigdanger {color: #ff0000; font-weight: bold; font-size: 115%;} -.warning {color: #ff0000; font-style: italic;} -.bigwarning {color: #ff0000; font-style: italic; font-size: 115%;} +.userdanger {color: #ff0000; font-weight: bold; font-size: 115%;} +.warning {color: #ff3300; font-style: italic;} +.bigwarning {color: #ff3300; font-style: italic; font-size: 115%;} .boldannounce {color: #ff0000; font-weight: bold;} .rose {color: #ff5050;} .info {color: #0000cc;} diff --git a/icons/effects/160x160.dmi b/icons/effects/160x160.dmi index 4230005ae10..84c7a18c4c7 100644 Binary files a/icons/effects/160x160.dmi and b/icons/effects/160x160.dmi differ diff --git a/icons/effects/beam.dmi b/icons/effects/beam.dmi index 264205694a8..0e588d2a457 100644 Binary files a/icons/effects/beam.dmi and b/icons/effects/beam.dmi differ diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 7fadf8836b7..74e8848f0e2 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/effects/magic_orb.dmi b/icons/effects/magic_orb.dmi new file mode 100644 index 00000000000..f20acae4a77 Binary files /dev/null and b/icons/effects/magic_orb.dmi differ diff --git a/icons/mob/screen_spells.dmi b/icons/mob/screen_spells.dmi index a11da4dff83..a60dcdbea5d 100644 Binary files a/icons/mob/screen_spells.dmi and b/icons/mob/screen_spells.dmi differ diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi index f9b18d19525..022557a0db7 100644 Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi index 26c80f3dfe6..90e258e9aa7 100644 Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ diff --git a/icons/obj/pylon.dmi b/icons/obj/pylon.dmi index fd96ac68dfa..0e2f0d8ddc3 100644 Binary files a/icons/obj/pylon.dmi and b/icons/obj/pylon.dmi differ diff --git a/maps/away/blueriver/blueriver.dm b/maps/away/blueriver/blueriver.dm index 7fd181bbf60..51868edd2d0 100644 --- a/maps/away/blueriver/blueriver.dm +++ b/maps/away/blueriver/blueriver.dm @@ -15,8 +15,8 @@ /obj/effect/overmap/visitable/sector/arcticplanet/Initialize() . = ..() - name = "[generate_planet_name()], \an [name]" GLOB.number_of_planetoids++ + name = "[generate_planet_name()], \an [name]" var/matrix/M = new M.Turn(90) transform = M diff --git a/maps/away/bunker/bunker.dm b/maps/away/bunker/bunker.dm index 00be8a52fe2..0a56dc04782 100644 --- a/maps/away/bunker/bunker.dm +++ b/maps/away/bunker/bunker.dm @@ -18,8 +18,8 @@ /obj/effect/overmap/visitable/sector/arcticplanet_bunker/Initialize() . = ..() - name = "[generate_planet_name()], \an [name]" GLOB.number_of_planetoids++ + name = "[generate_planet_name()], \an [name]" var/matrix/M = new M.Turn(90) transform = M diff --git a/maps/away/wizard_den/wizard_den-1.dmm b/maps/away/wizard_den/wizard_den-1.dmm new file mode 100644 index 00000000000..4a04ad1ab07 --- /dev/null +++ b/maps/away/wizard_den/wizard_den-1.dmm @@ -0,0 +1,40860 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"af" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/carpet/magenta, +/area/wizard_den_away/level_1) +"bk" = ( +/turf/simulated/floor/carpet/magenta, +/area/wizard_den_away/level_1) +"bq" = ( +/turf/simulated/floor/wood/ebony, +/area/wizard_den_away/outdoors) +"bw" = ( +/obj/machinery/door/airlock/multi_tile{ + dir = 8; + door_color = "#a2819e"; + stripe_color = "#ffcc33" + }, +/turf/simulated/floor/carpet/magenta, +/area/wizard_den_away/level_1) +"bQ" = ( +/obj/structure/railing/mapped{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/floor/carpet/magenta, +/area/wizard_den_away/level_1) +"cP" = ( +/obj/structure/flora/ausbushes/brflowers, +/obj/machinery/light/navigation, +/turf/simulated/floor/exoplanet/grass, +/area/wizard_den_away/level_1) +"ed" = ( +/obj/structure/railing/mapped{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/carpet/magenta, +/area/wizard_den_away/level_1) +"fy" = ( +/obj/structure/railing/mapped{ + dir = 4 + }, +/turf/simulated/floor/carpet/magenta, +/area/wizard_den_away/level_1) +"gI" = ( +/turf/simulated/floor/wood/ebony, +/area/wizard_den_away/level_1) +"hm" = ( +/obj/structure/railing/mapped{ + dir = 8 + }, +/turf/simulated/floor/carpet/magenta, +/area/wizard_den_away/level_1) +"hs" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/wood/ebony, +/area/wizard_den_away/level_1) +"hW" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/floor/wood/ebony, +/area/wizard_den_away/level_1) +"ij" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/wood/ebony, +/area/wizard_den_away/level_1) +"iq" = ( +/turf/simulated/floor/plating, +/area/wizard_den_away/outdoors) +"iu" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/flora/ausbushes/grassybush, +/turf/simulated/floor/exoplanet/water/shallow, +/area/wizard_den_away/level_1) +"kw" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/flora/ausbushes/leafybush, +/turf/simulated/floor/exoplanet/water/shallow, +/area/wizard_den_away/level_1) +"mJ" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/flora/ausbushes/stalkybush, +/turf/simulated/floor/exoplanet/water/shallow, +/area/wizard_den_away/level_1) +"ne" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/flora/ausbushes/fullgrass, +/turf/simulated/floor/exoplanet/water/shallow, +/area/wizard_den_away/level_1) +"nE" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/flora/ausbushes/lavendergrass, +/turf/simulated/floor/exoplanet/water/shallow, +/area/wizard_den_away/level_1) +"oe" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/flora/ausbushes/sparsegrass, +/turf/simulated/floor/exoplanet/water/shallow, +/area/wizard_den_away/level_1) +"oF" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/flora/ausbushes/lavendergrass, +/turf/simulated/floor/exoplanet/water/shallow, +/area/wizard_den_away/level_1) +"oG" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/flora/ausbushes/sparsegrass, +/turf/simulated/floor/exoplanet/water/shallow, +/area/wizard_den_away/level_1) +"oJ" = ( +/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/ausbushes/ywflowers, +/obj/machinery/light/navigation, +/turf/simulated/floor/exoplanet/grass, +/area/wizard_den_away/level_1) +"oM" = ( +/obj/structure/flora/ausbushes/ppflowers, +/obj/structure/flora/ausbushes/leafybush, +/turf/simulated/floor/exoplanet/grass, +/area/wizard_den_away/level_1) +"pz" = ( +/obj/structure/flora/ausbushes/ywflowers, +/turf/simulated/floor/exoplanet/grass, +/area/wizard_den_away/level_1) +"rn" = ( +/obj/structure/flora/ausbushes/ywflowers, +/obj/structure/flora/ausbushes/genericbush, +/turf/simulated/floor/exoplanet/grass, +/area/wizard_den_away/level_1) +"rC" = ( +/obj/structure/flora/ausbushes/ppflowers, +/turf/simulated/floor/exoplanet/grass, +/area/wizard_den_away/level_1) +"sO" = ( +/obj/structure/flora/ausbushes/brflowers, +/turf/simulated/floor/exoplanet/grass, +/area/wizard_den_away/level_1) +"va" = ( +/turf/simulated/floor/wood/ebony{ + icon_state = "wood_broken4" + }, +/area/wizard_den_away/outdoors) +"vf" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/flora/ausbushes/leafybush, +/turf/simulated/floor/exoplanet/water/shallow, +/area/wizard_den_away/level_1) +"vm" = ( +/turf/unsimulated/mask, +/area/wizard_den_away/outdoors) +"vu" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/flora/ausbushes/leafybush, +/turf/simulated/floor/exoplanet/water/shallow, +/area/wizard_den_away/level_1) +"vE" = ( +/obj/structure/flora/ausbushes/fernybush, +/obj/structure/flora/ausbushes/brflowers, +/turf/simulated/floor/exoplanet/grass, +/area/wizard_den_away/level_1) +"wd" = ( +/obj/structure/flora/ausbushes/palebush, +/turf/simulated/floor/exoplanet/grass, +/area/wizard_den_away/level_1) +"wg" = ( +/obj/structure/flora/ausbushes/pointybush, +/turf/simulated/floor/exoplanet/grass, +/area/wizard_den_away/level_1) +"wQ" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/flora/ausbushes/stalkybush, +/turf/simulated/floor/exoplanet/water/shallow, +/area/wizard_den_away/level_1) +"wT" = ( +/obj/machinery/door/airlock/civilian, +/turf/simulated/floor/wood/ebony, +/area/wizard_den_away/level_1) +"xu" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/flora/ausbushes/lavendergrass, +/turf/simulated/floor/exoplanet/water/shallow, +/area/wizard_den_away/level_1) +"xF" = ( +/obj/structure/flora/ausbushes/brflowers, +/obj/structure/flora/ausbushes/leafybush, +/turf/simulated/floor/exoplanet/grass, +/area/wizard_den_away/level_1) +"xW" = ( +/obj/structure/flora/ausbushes/genericbush, +/obj/structure/flora/ausbushes/ppflowers, +/turf/simulated/floor/exoplanet/grass, +/area/wizard_den_away/level_1) +"yu" = ( +/turf/simulated/floor/wood/ebony{ + icon_state = "wood_broken2" + }, +/area/wizard_den_away/outdoors) +"yw" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/flora/ausbushes/grassybush, +/turf/simulated/floor/exoplanet/water/shallow, +/area/wizard_den_away/level_1) +"zn" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/flora/ausbushes/fullgrass, +/turf/simulated/floor/exoplanet/water/shallow, +/area/wizard_den_away/level_1) +"zp" = ( +/obj/structure/flora/ausbushes/ppflowers, +/obj/structure/flora/ausbushes/genericbush, +/turf/simulated/floor/exoplanet/grass, +/area/wizard_den_away/level_1) +"zr" = ( +/obj/structure/flora/ausbushes/reedbush, +/obj/structure/flora/ausbushes/fernybush, +/turf/simulated/floor/exoplanet/grass, +/area/wizard_den_away/level_1) +"Ar" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/flora/ausbushes/lavendergrass, +/turf/simulated/floor/exoplanet/water/shallow, +/area/wizard_den_away/level_1) +"AH" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/flora/ausbushes/lavendergrass, +/turf/simulated/floor/exoplanet/water/shallow, +/area/wizard_den_away/level_1) +"BD" = ( +/turf/simulated/floor/wood/ebony{ + icon_state = "wood_broken6" + }, +/area/wizard_den_away/outdoors) +"CM" = ( +/obj/structure/window/reinforced, +/obj/structure/flora/ausbushes/sparsegrass, +/turf/simulated/floor/exoplanet/water/shallow, +/area/wizard_den_away/level_1) +"DF" = ( +/obj/structure/window/reinforced, +/obj/structure/flora/ausbushes/grassybush, +/turf/simulated/floor/exoplanet/water/shallow, +/area/wizard_den_away/level_1) +"Ei" = ( +/obj/structure/window/reinforced, +/obj/structure/flora/ausbushes/stalkybush, +/turf/simulated/floor/exoplanet/water/shallow, +/area/wizard_den_away/level_1) +"Ex" = ( +/obj/structure/window/reinforced, +/obj/structure/flora/ausbushes/lavendergrass, +/turf/simulated/floor/exoplanet/water/shallow, +/area/wizard_den_away/level_1) +"EN" = ( +/turf/simulated/floor/exoplanet/shrouded{ + icon_state = "shrouded1" + }, +/area/wizard_den_away/outdoors) +"Fo" = ( +/obj/structure/window/reinforced, +/obj/structure/flora/ausbushes/fullgrass, +/turf/simulated/floor/exoplanet/water/shallow, +/area/wizard_den_away/level_1) +"Hj" = ( +/turf/simulated/floor/wood/ebony{ + icon_state = "wood_broken5" + }, +/area/wizard_den_away/outdoors) +"Hv" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/flora/ausbushes/sparsegrass, +/turf/simulated/floor/exoplanet/water/shallow, +/area/wizard_den_away/level_1) +"Hz" = ( +/obj/machinery/light, +/turf/simulated/floor/wood/ebony, +/area/wizard_den_away/level_1) +"HA" = ( +/obj/machinery/door/airlock/multi_tile{ + door_color = "#a2819e"; + stripe_color = "#ffcc33" + }, +/turf/simulated/floor/carpet/magenta, +/area/wizard_den_away/level_1) +"HX" = ( +/turf/simulated/floor/wood/ebony{ + icon_state = "wood_broken0" + }, +/area/wizard_den_away/outdoors) +"JI" = ( +/turf/simulated/wall/ocp_wall, +/area/wizard_den_away/level_1) +"JJ" = ( +/turf/unsimulated/mineral, +/area/wizard_den_away/outdoors) +"Km" = ( +/turf/simulated/wall/ebony, +/area/wizard_den_away/outdoors) +"Lc" = ( +/obj/machinery/door/airlock/security, +/turf/simulated/floor/wood/ebony, +/area/wizard_den_away/level_1) +"Lt" = ( +/obj/machinery/door/airlock/glass/security, +/turf/simulated/floor/wood/ebony, +/area/wizard_den_away/level_1) +"LM" = ( +/obj/effect/wallframe_spawn, +/turf/simulated/floor/plating, +/area/wizard_den_away/level_1) +"Mi" = ( +/obj/machinery/door/airlock/glass/civilian, +/turf/simulated/floor/wood/ebony, +/area/wizard_den_away/level_1) +"Nb" = ( +/obj/structure/flora/ausbushes/ywflowers, +/obj/machinery/light/navigation, +/turf/simulated/floor/exoplanet/grass, +/area/wizard_den_away/level_1) +"Nj" = ( +/obj/structure/coatrack, +/turf/simulated/floor/wood/ebony, +/area/wizard_den_away/level_1) +"Op" = ( +/obj/structure/table/woodentable_reinforced, +/obj/machinery/door/window/westright, +/obj/machinery/door/window/eastleft, +/turf/simulated/floor/wood/ebony, +/area/wizard_den_away/level_1) +"PV" = ( +/obj/structure/table/woodentable_reinforced, +/obj/machinery/door/window/westleft, +/obj/machinery/door/window/eastright, +/turf/simulated/floor/wood/ebony, +/area/wizard_den_away/level_1) +"Qa" = ( +/obj/structure/coatrack, +/obj/machinery/light, +/turf/simulated/floor/wood/ebony, +/area/wizard_den_away/level_1) +"RB" = ( +/obj/machinery/door/airlock/multi_tile{ + door_color = "#a2819e"; + stripe_color = "#ffcc33" + }, +/turf/simulated/floor/wood/walnut, +/area/wizard_den_away/level_1) +"Sh" = ( +/turf/simulated/floor/wood/walnut, +/area/wizard_den_away/level_1) +"Ss" = ( +/obj/structure/table/rack, +/turf/simulated/floor/wood/walnut, +/area/wizard_den_away/level_1) +"SN" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/floor/wood/walnut, +/area/wizard_den_away/level_1) +"TN" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/wood/walnut, +/area/wizard_den_away/level_1) +"Ub" = ( +/turf/simulated/floor/exoplanet/concrete, +/area/wizard_den_away/level_1) +"Uh" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/exoplanet/concrete, +/area/wizard_den_away/level_1) +"Va" = ( +/turf/simulated/floor/exoplanet/concrete, +/area/wizard_den_away/outdoors) +"Wf" = ( +/obj/effect/shuttle_landmark/nav_wizard_den/nav2, +/turf/simulated/floor/exoplanet/shrouded{ + icon_state = "shrouded1" + }, +/area/wizard_den_away/outdoors) +"Wp" = ( +/obj/effect/shuttle_landmark/nav_wizard_den/nav1, +/turf/simulated/floor/exoplanet/shrouded{ + icon_state = "shrouded1" + }, +/area/wizard_den_away/outdoors) +"Yy" = ( +/obj/structure/flora/ausbushes/ppflowers, +/obj/machinery/light/navigation, +/turf/simulated/floor/exoplanet/grass, +/area/wizard_den_away/level_1) +"YM" = ( +/obj/effect/shuttle_landmark/nav_wizard_den/nav3, +/turf/simulated/floor/exoplanet/shrouded{ + icon_state = "shrouded1" + }, +/area/wizard_den_away/outdoors) +"YQ" = ( +/obj/effect/shuttle_landmark/nav_wizard_den/nav4, +/turf/simulated/floor/exoplanet/shrouded{ + icon_state = "shrouded1" + }, +/area/wizard_den_away/outdoors) + +(1,1,1) = {" +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +"} +(2,1,1) = {" +JJ +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +JJ +"} +(3,1,1) = {" +JJ +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +JJ +"} +(4,1,1) = {" +JJ +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +JJ +"} +(5,1,1) = {" +JJ +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +JJ +"} +(6,1,1) = {" +JJ +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +JJ +"} +(7,1,1) = {" +JJ +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +JJ +"} +(8,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(9,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(10,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(11,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(12,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(13,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(14,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(15,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(16,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(17,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(18,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(19,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(20,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(21,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(22,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(23,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(24,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(25,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(26,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(27,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(28,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(29,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(30,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(31,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(32,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(33,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(34,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(35,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(36,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(37,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(38,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(39,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(40,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(41,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(42,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(43,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(44,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(45,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +Wp +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(46,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(47,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(48,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(49,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(50,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(51,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(52,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(53,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(54,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(55,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +YM +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(56,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(57,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(58,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +Km +Km +Km +Km +Km +Km +Km +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(59,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +Km +HX +va +iq +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(60,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +Km +yu +bq +iq +iq +iq +bq +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(61,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +Km +bq +bq +BD +bq +va +bq +yu +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(62,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +iq +bq +iq +bq +bq +Km +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(63,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +iq +Hj +bq +iq +iq +bq +Km +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(64,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +bq +bq +iq +EN +EN +iq +iq +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(65,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +Km +Km +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(66,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(67,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(68,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(69,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +hW +gI +gI +gI +gI +gI +hW +gI +gI +gI +gI +gI +hW +gI +JI +gI +gI +gI +hW +gI +gI +gI +gI +gI +hW +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(70,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(71,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(72,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +hs +gI +gI +JI +JI +JI +JI +JI +wT +JI +JI +JI +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(73,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(74,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +Hz +JI +gI +gI +gI +ij +gI +gI +gI +gI +gI +ij +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(75,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +JI +JI +JI +JI +JI +JI +JI +JI +wT +JI +JI +JI +JI +JI +JI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(76,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +gI +JI +gI +gI +gI +gI +JI +gI +gI +gI +JI +gI +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(77,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +gI +JI +gI +gI +gI +gI +JI +gI +gI +gI +JI +gI +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(78,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +hs +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +gI +JI +hs +gI +gI +gI +wT +gI +gI +gI +wT +gI +gI +gI +Hz +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(79,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +gI +JI +gI +gI +gI +gI +JI +hs +gI +Hz +JI +gI +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(80,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +Hz +JI +gI +gI +gI +gI +JI +gI +gI +gI +JI +gI +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(81,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +gI +JI +JI +JI +JI +JI +JI +gI +gI +gI +JI +JI +JI +JI +JI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(82,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +JI +JI +JI +JI +JI +wT +JI +JI +JI +JI +gI +gI +gI +gI +JI +gI +gI +gI +gI +JI +gI +gI +gI +JI +gI +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(83,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +gI +JI +gI +gI +gI +gI +JI +gI +gI +gI +JI +gI +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(84,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +hs +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +gI +JI +hs +gI +gI +gI +wT +gI +gI +gI +wT +gI +gI +gI +Hz +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(85,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +gI +JI +gI +gI +gI +gI +JI +hs +gI +Hz +JI +gI +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(86,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +Hz +JI +gI +gI +gI +gI +JI +gI +gI +gI +JI +gI +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(87,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +JI +JI +JI +JI +JI +JI +JI +gI +gI +gI +JI +JI +JI +JI +JI +JI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(88,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +JI +gI +gI +hW +gI +gI +JI +gI +gI +gI +LM +Nj +gI +Nj +gI +Nj +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(89,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +JI +gI +gI +gI +LM +Nj +gI +Nj +gI +Qa +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(90,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +hs +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +JI +gI +gI +gI +JI +Nj +gI +Nj +gI +Nj +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(91,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +wT +gI +gI +gI +Mi +gI +gI +gI +gI +Nj +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(92,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +JI +JI +JI +JI +JI +wT +JI +JI +JI +JI +gI +gI +Hz +JI +gI +gI +gI +gI +gI +JI +hs +gI +Hz +JI +Nj +gI +Nj +gI +Nj +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(93,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +gI +gI +hW +gI +gI +gI +gI +hW +gI +gI +gI +gI +gI +JI +gI +gI +gI +gI +gI +JI +gI +gI +gI +LM +Nj +gI +Nj +gI +Qa +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(94,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +ij +gI +gI +JI +gI +gI +gI +LM +Nj +gI +Nj +gI +Nj +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(95,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +bk +bk +bk +bk +bk +bk +bk +bk +bk +bk +bk +bk +gI +gI +JI +JI +JI +JI +JI +JI +JI +gI +gI +gI +JI +LM +LM +LM +LM +LM +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(96,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +JI +JI +JI +JI +JI +hs +gI +bk +bk +bk +bk +bk +bk +bk +bk +bk +bk +bk +bk +gI +gI +JI +gI +gI +gI +gI +gI +hW +gI +gI +gI +hW +gI +gI +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(97,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +af +bk +bk +bk +bk +bk +bk +bk +bk +gI +gI +gI +gI +gI +gI +gI +gI +bk +bk +gI +gI +JI +hs +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +Hz +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(98,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +bk +bk +bk +bk +bk +bk +bk +bk +bk +gI +iu +oG +vu +xu +zn +AH +gI +bk +bk +gI +Hz +JI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +JI +JI +JI +JI +JI +Ub +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(99,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +bk +bw +JI +JI +JI +gI +gI +bk +bk +gI +kw +oJ +vE +pz +Yy +CM +gI +bk +bk +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +JI +Ss +SN +Ss +JI +Uh +Va +Va +Va +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(100,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +bk +bk +bQ +fy +JI +gI +gI +bk +bk +gI +mJ +oM +wd +pz +zp +DF +gI +bk +bk +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +JI +Ss +Sh +Ss +JI +Ub +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +EN +EN +Va +Va +EN +EN +Va +EN +EN +EN +EN +EN +Va +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +Va +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(101,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +bk +bk +gI +gI +JI +gI +gI +bk +bk +gI +ne +pz +rC +sO +pz +Ei +gI +bk +bk +bk +bk +HA +bk +bk +bk +bk +bk +bk +bk +bk +bk +bk +bk +bk +bk +bk +bk +RB +Sh +Sh +Sh +RB +Ub +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +EN +EN +EN +EN +EN +EN +Va +EN +Va +Va +Va +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(102,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +bk +bk +gI +gI +JI +gI +gI +bk +bk +gI +kw +rn +pz +sO +zr +Ex +gI +bk +bk +bk +bk +bk +bk +bk +bk +bk +bk +bk +bk +bk +bk +bk +bk +bk +bk +bk +bk +Sh +Sh +Sh +Sh +Sh +Ub +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +EN +EN +Va +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +Va +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(103,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +bk +bk +ed +hm +JI +gI +gI +bk +bk +gI +nE +rC +wg +xF +sO +Ei +gI +bk +bk +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +JI +Ss +Sh +Ss +JI +Ub +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +Va +EN +Va +Va +EN +EN +Va +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +Va +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(104,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +bk +bw +JI +JI +JI +gI +gI +bk +bk +gI +oe +cP +pz +xW +Nb +Fo +gI +bk +bk +gI +gI +JI +hs +gI +gI +gI +gI +gI +gI +ij +gI +gI +gI +gI +gI +gI +Hz +JI +Ss +TN +Ss +JI +Uh +Va +Va +Va +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(105,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +bk +bk +bk +bk +bk +bk +bk +bk +bk +gI +oF +vf +wQ +yw +Ar +Hv +gI +bk +bk +gI +Hz +JI +JI +JI +JI +JI +Lc +JI +JI +JI +JI +LM +LM +Op +PV +LM +LM +JI +JI +JI +JI +JI +Ub +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(106,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +af +bk +bk +bk +bk +bk +bk +bk +bk +gI +gI +gI +gI +gI +gI +gI +gI +bk +bk +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(107,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +JI +JI +JI +JI +JI +hs +gI +bk +bk +bk +bk +bk +bk +bk +bk +bk +bk +bk +bk +gI +gI +JI +hs +gI +gI +gI +gI +gI +gI +Hz +JI +gI +gI +gI +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(108,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +bk +bk +bk +bk +bk +bk +bk +bk +bk +bk +bk +bk +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +Lt +gI +gI +gI +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(109,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +hs +gI +gI +gI +gI +Hz +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(110,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +gI +gI +ij +gI +gI +gI +gI +ij +gI +gI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(111,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +JI +JI +JI +JI +JI +wT +JI +JI +JI +JI +gI +gI +Hz +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(112,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +JI +Lc +JI +JI +JI +JI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(113,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +hs +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(114,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +JI +hs +gI +gI +gI +gI +gI +gI +Hz +JI +gI +gI +gI +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(115,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +hs +gI +gI +gI +gI +Hz +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(116,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +gI +gI +gI +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(117,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +Hz +JI +gI +gI +gI +gI +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(118,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +JI +gI +gI +gI +gI +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(119,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +hs +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(120,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +Hz +JI +gI +gI +Hz +JI +gI +gI +gI +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(121,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +JI +JI +JI +JI +JI +wT +JI +JI +JI +JI +gI +gI +gI +JI +gI +gI +gI +gI +JI +gI +gI +gI +JI +hs +gI +gI +gI +gI +Hz +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(122,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +JI +gI +gI +gI +gI +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(123,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +Hz +JI +gI +gI +gI +gI +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(124,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(125,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +hs +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +hW +gI +gI +gI +gI +hW +gI +gI +gI +gI +hW +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(126,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(127,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(128,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +JI +JI +JI +gI +JI +JI +JI +JI +gI +JI +JI +JI +JI +gI +JI +JI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(129,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +Hz +JI +gI +gI +gI +gI +JI +gI +gI +gI +gI +JI +gI +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(130,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +JI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +JI +gI +gI +gI +gI +JI +gI +gI +gI +gI +JI +gI +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(131,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +hs +gI +gI +JI +JI +JI +JI +JI +wT +JI +JI +JI +JI +gI +gI +gI +JI +hs +gI +gI +gI +JI +hs +gI +gI +gI +JI +hs +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(132,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +gI +JI +gI +gI +gI +gI +JI +gI +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(133,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +gI +JI +gI +gI +gI +gI +JI +gI +gI +gI +gI +JI +gI +gI +gI +gI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(134,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +gI +gI +ij +gI +gI +gI +gI +gI +ij +gI +gI +gI +gI +gI +ij +gI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(135,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +JI +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +YQ +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(136,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(137,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(138,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(139,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(140,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(141,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(142,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(143,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(144,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(145,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(146,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(147,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +Wf +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(148,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(149,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(150,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(151,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(152,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(153,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +iq +iq +Km +EN +Km +Km +Km +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(154,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +Km +HX +va +iq +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(155,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +Km +yu +bq +iq +iq +iq +bq +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(156,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +Km +bq +bq +BD +bq +va +bq +yu +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(157,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +iq +bq +iq +bq +bq +Km +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(158,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +iq +Hj +bq +iq +iq +bq +Km +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(159,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +iq +bq +bq +bq +bq +iq +iq +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(160,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +Km +iq +bq +bq +HX +bq +bq +Km +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(161,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +iq +HX +iq +bq +iq +EN +EN +EN +EN +Km +Km +Km +Km +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(162,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +Km +iq +bq +bq +bq +bq +bq +iq +iq +iq +bq +bq +bq +iq +EN +Km +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(163,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +Km +HX +bq +va +bq +bq +bq +va +Hj +bq +bq +bq +Hj +bq +EN +Km +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(164,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +Km +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +iq +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(165,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +Km +iq +bq +bq +bq +bq +bq +bq +Hj +bq +bq +Hj +bq +iq +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(166,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +Km +EN +iq +Hj +bq +bq +bq +iq +va +bq +bq +bq +bq +bq +iq +Km +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(167,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +iq +bq +bq +bq +iq +EN +iq +iq +iq +iq +bq +va +bq +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(168,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +Km +Km +Km +Km +iq +EN +EN +EN +Km +Km +Km +Km +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(169,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(170,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(171,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(172,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(173,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(174,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(175,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(176,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(177,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(178,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(179,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(180,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(181,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(182,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(183,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(184,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(185,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(186,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(187,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(188,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(189,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(190,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(191,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(192,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(193,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(194,1,1) = {" +JJ +vm +vm +vm +vm +vm +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +EN +vm +vm +vm +vm +vm +JJ +"} +(195,1,1) = {" +JJ +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +JJ +"} +(196,1,1) = {" +JJ +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +JJ +"} +(197,1,1) = {" +JJ +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +JJ +"} +(198,1,1) = {" +JJ +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +JJ +"} +(199,1,1) = {" +JJ +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +vm +JJ +"} +(200,1,1) = {" +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +JJ +"} diff --git a/maps/away/wizard_den/wizard_den.dm b/maps/away/wizard_den/wizard_den.dm new file mode 100644 index 00000000000..8096acfd14b --- /dev/null +++ b/maps/away/wizard_den/wizard_den.dm @@ -0,0 +1,55 @@ +#include "wizard_den_areas.dm" + +/obj/effect/overmap/visitable/sector/shrouded_moon + name = "shrouded moon" + desc = "A shrouded tiny moon with an artificial structure taking most of its surface.

There are unknown power readings coming from the sensor." + in_space = FALSE + known = TRUE + icon_state = "globe" + color = "#783ca4" + initial_generic_waypoints = list( + "nav_wiz_den_1", + "nav_wiz_den_2", + "nav_wiz_den_3", + "nav_wiz_den_antag" + ) + +/obj/effect/overmap/visitable/sector/shrouded_moon/Initialize() + . = ..() + GLOB.number_of_planetoids++ + name = "[generate_planet_name()], \a [name]" + var/matrix/M = new + M.Turn(90) + transform = M + +/datum/map_template/ruin/away_site/wizard_den + name = "Wizard Den" + description = "Three z-level map on a shrouded planet with big wizard den." + id = "wizard_den" + spawn_cost = 4 + suffixes = list("wizard_den/wizard_den-1.dmm") + generate_mining_by_z = 1 + area_usage_test_exempted_root_areas = list(/area/wizard_den_away) + apc_test_exempt_areas = list( + /area/wizard_den_away = NO_SCRUBBER|NO_VENT|NO_APC + ) + +/obj/effect/shuttle_landmark/nav_wizard_den/nav1 + name = "Shrouded Moon Landing Point #1" + landmark_tag = "nav_wiz_den_1" + base_area = /area/wizard_den_away/outdoors + +/obj/effect/shuttle_landmark/nav_wizard_den/nav2 + name = "Shrouded Moon Landing Point #2" + landmark_tag = "nav_wiz_den_2" + base_area = /area/wizard_den_away/outdoors + +/obj/effect/shuttle_landmark/nav_wizard_den/nav3 + name = "Shrouded Moon Landing Point #3" + landmark_tag = "nav_wiz_den_3" + base_area = /area/wizard_den_away/outdoors + +/obj/effect/shuttle_landmark/nav_wizard_den/nav4 + name = "Shrouded Moon Navpoint #4" + landmark_tag = "nav_wiz_den_antag" + base_area = /area/wizard_den_away/outdoors diff --git a/maps/away/wizard_den/wizard_den_areas.dm b/maps/away/wizard_den/wizard_den_areas.dm new file mode 100644 index 00000000000..d06af3bee4f --- /dev/null +++ b/maps/away/wizard_den/wizard_den_areas.dm @@ -0,0 +1,41 @@ +/area/wizard_den_away + icon = 'maps/away/wizard_den/wizard_den_areas.dmi' + +/area/wizard_den_away/outdoors + name = "\improper Wilderness" + icon_state = "out" + +/area/wizard_den_away/level_1 + name = "\improper Wizard Den Main Hall" + icon_state = "one" + requires_power = FALSE + /// List with ckeys and cooldown for the area blurb + var/list/area_blurb = list() + +/area/wizard_den_away/level_1/Entered(atom/A) + if(!istype(A, /mob/living)) + return + + var/mob/living/L = A + if(!L.ckey) + return + + if(area_blurb[L.ckey] > world.time) + return + + if(isnull(L.lastarea) || istype(L.lastarea, type)) + return + + show_blurb(L, 3 SECONDS, name) + area_blurb[L.ckey] = world.time + 600 SECONDS + return ..() + +/area/wizard_den_away/level_2 + name = "\improper Wizard Den Basement" + icon_state = "two" + requires_power = FALSE + +/area/wizard_den_away/level_3 + name = "\improper Wizard Den Catacombs" + icon_state = "three" + requires_power = FALSE diff --git a/maps/away/wizard_den/wizard_den_areas.dmi b/maps/away/wizard_den/wizard_den_areas.dmi new file mode 100644 index 00000000000..5c48e2c4306 Binary files /dev/null and b/maps/away/wizard_den/wizard_den_areas.dmi differ diff --git a/maps/torch/torch.dm b/maps/torch/torch.dm index 7dea9c3306a..f1413626a02 100644 --- a/maps/torch/torch.dm +++ b/maps/torch/torch.dm @@ -170,6 +170,7 @@ #include "../away/ascent_caulship/_ascent_caulship.dm" #include "../away/translocated_gateway/translocated_gateway.dm" #include "../away/bunker/bunker.dm" + //#include "../away/wizard_den/wizard_den.dm" #define using_map_DATUM /datum/map/torch diff --git a/sound/magic/churchbell.ogg b/sound/magic/churchbell.ogg new file mode 100644 index 00000000000..ad9c4ee3c1b Binary files /dev/null and b/sound/magic/churchbell.ogg differ diff --git a/sound/magic/drain.ogg b/sound/magic/drain.ogg new file mode 100644 index 00000000000..e27a68443a7 Binary files /dev/null and b/sound/magic/drain.ogg differ diff --git a/sound/magic/end_of_everything.ogg b/sound/magic/end_of_everything.ogg new file mode 100644 index 00000000000..06b6f2fb4ca Binary files /dev/null and b/sound/magic/end_of_everything.ogg differ diff --git a/sound/magic/fire.ogg b/sound/magic/fire.ogg new file mode 100644 index 00000000000..bafc5003a0b Binary files /dev/null and b/sound/magic/fire.ogg differ diff --git a/sound/magic/ice.ogg b/sound/magic/ice.ogg new file mode 100644 index 00000000000..a2b1ba8eff4 Binary files /dev/null and b/sound/magic/ice.ogg differ diff --git a/sound/magic/magic_spell.ogg b/sound/magic/magic_spell.ogg new file mode 100644 index 00000000000..491dfb7b11a Binary files /dev/null and b/sound/magic/magic_spell.ogg differ diff --git a/sound/magic/orb_ambience.ogg b/sound/magic/orb_ambience.ogg new file mode 100644 index 00000000000..569066751db Binary files /dev/null and b/sound/magic/orb_ambience.ogg differ diff --git a/sound/magic/orb_pickup.ogg b/sound/magic/orb_pickup.ogg new file mode 100644 index 00000000000..be476fbdac3 Binary files /dev/null and b/sound/magic/orb_pickup.ogg differ diff --git a/sound/magic/pestilence.ogg b/sound/magic/pestilence.ogg new file mode 100644 index 00000000000..a779823e465 Binary files /dev/null and b/sound/magic/pestilence.ogg differ diff --git a/sound/magic/shot.ogg b/sound/magic/shot.ogg new file mode 100644 index 00000000000..67ea43349bb Binary files /dev/null and b/sound/magic/shot.ogg differ diff --git a/sound/magic/spell_steal.ogg b/sound/magic/spell_steal.ogg new file mode 100644 index 00000000000..c7e4bd31ad4 Binary files /dev/null and b/sound/magic/spell_steal.ogg differ diff --git a/sound/magic/water.ogg b/sound/magic/water.ogg new file mode 100644 index 00000000000..377ed942154 Binary files /dev/null and b/sound/magic/water.ogg differ diff --git a/sound/magic/words.ogg b/sound/magic/words.ogg new file mode 100644 index 00000000000..497fc97a89d Binary files /dev/null and b/sound/magic/words.ogg differ diff --git a/test/check-paths.sh b/test/check-paths.sh index abe85c34b7f..4aa4438c302 100755 --- a/test/check-paths.sh +++ b/test/check-paths.sh @@ -34,7 +34,7 @@ exactly 117 "to_world uses" '\sto_world\(' exactly 60 "to_world_log uses" '\sto_world_log\(' exactly 0 "world<< uses" 'world<<|world[[:space:]]<<' exactly 0 "world.log<< uses" 'world.log<<|world.log[[:space:]]<<' -exactly 143 "<< uses" '(?&1 | tee log.txt"