From b133803c4769c735206b818c9c7bf9150afe7254 Mon Sep 17 00:00:00 2001 From: SECBATON GRIFFON <87321915+SECBATON-GRIFFON@users.noreply.github.com> Date: Wed, 9 Nov 2022 21:26:33 +0000 Subject: [PATCH] Buddha mode + Hell (#33328) * Buddha mode * devilish * HELLISH * tidy * fixes * find a way to do this that doesnt make server be kill * turn it off for now so we can test better * lag-free method * oh this too * basis of this part * fixes * fixes * fixes * fixes * cap on this to stop possible lag * fix * Allows admins to ghost if buddha'd * New way of getting things * More basic stuff * More stuff * actual way to do it * in practice * hell freezes over * cursed dice edition * tweaking this so it can be turned off if it breaks * disabilities, removing rendundant thing with floor * Limbs and final proc sorting * better like this * better like this * better like this * in setup cause it lags during game * better logging * restructured code, buddhas cannot be gibbed * this too * this too * this too * this too * finally right bantype * removed limit * hell is now a dungeon for performance * hell is now a dungeon for performance * hell is now a dungeon for performance * removes unused zlevel now * area * new sneding * new sending * fixes proc name * uses this db call instead for ease of testing, confirms pref copying works anyways, revert to old one if necessary * testing one for now * better scope Co-authored-by: SECBATON GRIFFON --- __DEFINES/setup.dm | 1 + code/controllers/configuration.dm | 4 + code/controllers/subsystem/init/map.dm | 4 +- code/datums/datumvars.dm | 13 + code/datums/map_elements.dm | 7 +- code/game/area/Space Station 13 areas.dm | 5 + code/game/objects/items/weapons/defib.dm | 2 +- code/game/objects/items/weapons/dice.dm | 4 + .../items/weapons/storage/briefcase.dm | 5 +- code/game/objects/structures/dorfpod.dm | 4 +- code/game/turfs/unsimulated/floor.dm | 20 + code/modules/admin/admin_verbs.dm | 52 + code/modules/admin/verbs/randomverbs.dm | 14 + code/modules/medical/cloning.dm | 2 +- code/modules/mob/dead/observer/observer.dm | 4 + code/modules/mob/death.dm | 2 + code/modules/mob/living/carbon/alien/death.dm | 3 + .../mob/living/carbon/alien/humanoid/death.dm | 2 +- .../mob/living/carbon/alien/humanoid/life.dm | 8 +- .../mob/living/carbon/alien/larva/death.dm | 2 +- .../mob/living/carbon/alien/larva/life.dm | 6 +- code/modules/mob/living/carbon/brain/death.dm | 23 +- code/modules/mob/living/carbon/carbon.dm | 3 + .../modules/mob/living/carbon/complex/life.dm | 8 +- code/modules/mob/living/carbon/human/death.dm | 5 +- .../mob/living/carbon/human/human_damage.dm | 2 +- .../life/handle_regular_status_updates.dm | 10 +- .../modules/mob/living/carbon/monkey/death.dm | 5 +- code/modules/mob/living/carbon/monkey/life.dm | 10 +- code/modules/mob/living/carbon/slime/death.dm | 2 +- code/modules/mob/living/carbon/slime/life.dm | 2 +- code/modules/mob/living/carbon/species.dm | 3 + code/modules/mob/living/death.dm | 3 + code/modules/mob/living/living.dm | 4 + code/modules/mob/living/silicon/ai/death.dm | 2 +- code/modules/mob/living/silicon/death.dm | 3 + .../modules/mob/living/silicon/decoy/death.dm | 4 +- code/modules/mob/living/silicon/pai/death.dm | 2 +- .../modules/mob/living/silicon/robot/death.dm | 5 +- code/modules/mob/living/silicon/robot/life.dm | 6 +- .../mob/living/simple_animal/bees/bees_mob.dm | 3 + .../modules/mob/living/simple_animal/borer.dm | 2 +- .../mob/living/simple_animal/constructs.dm | 3 + .../living/simple_animal/friendly/mouse.dm | 4 +- .../simple_animal/hostile/retaliate/drone.dm | 4 +- .../mob/living/simple_animal/hostile/shade.dm | 3 + .../modules/mob/living/simple_animal/shade.dm | 3 + .../mob/living/simple_animal/simple_animal.dm | 5 +- code/modules/organs/organ_external.dm | 2 + code/modules/randomMaps/vaults.dm | 210 + config-example/config.txt | 3 + maps/_map.dm | 14 +- maps/misc/HELL.dmm | 4232 +++++++++++++++++ 53 files changed, 4680 insertions(+), 74 deletions(-) create mode 100644 maps/misc/HELL.dmm diff --git a/__DEFINES/setup.dm b/__DEFINES/setup.dm index ba9d0ddf4bc..8bec59fd322 100644 --- a/__DEFINES/setup.dm +++ b/__DEFINES/setup.dm @@ -615,6 +615,7 @@ var/list/global_mutations = list() // list of hidden mutation things #define UNPACIFIABLE 16 //Immune to pacify effects. #define GODMODE 4096 #define FAKEDEATH 8192 //Replaces stuff like changeling.changeling_fakedeath +#define BUDDHAMODE 16384 #define XENO_HOST 32768 //Tracks whether we're gonna be a baby alien's mummy. #define ALWAYS_CRIT 65536 diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 6c0d4b20eab..3b909e21ad8 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -148,6 +148,7 @@ var/ban_legacy_system = 0 //Defines whether the server uses the legacy banning system with the files in /data or the SQL system. Config option in config.txt var/use_age_restriction_for_jobs = 0 //Do jobs use account age restrictions? --requires database + var/bans_shown_in_hell_limit = 1 //Amount of permabanned players that show up in hell --requires database var/simultaneous_pm_warning_timeout = 100 var/use_recursive_explosions //Defines whether the server uses recursive or circular explosions. @@ -266,6 +267,9 @@ if ("use_age_restriction_for_jobs") config.use_age_restriction_for_jobs = 1 + if ("bans_shown_in_hell_limit") + config.bans_shown_in_hell_limit = text2num(value) + if ("jobs_have_minimal_access") config.jobs_have_minimal_access = 1 diff --git a/code/controllers/subsystem/init/map.dm b/code/controllers/subsystem/init/map.dm index 8a0d580c712..c39b953d7a1 100644 --- a/code/controllers/subsystem/init/map.dm +++ b/code/controllers/subsystem/init/map.dm @@ -29,12 +29,12 @@ var/datum/subsystem/map/SSmap for(var/i = 0, i < max_secret_rooms, i++) make_mining_asteroid_secret() - + //hobo shack generation, one shack will spawn, 1/3 chance of two shacks generate_hoboshack() if (rand(1,3) == 3) generate_hoboshack() - + log_startup_progress("Calling post on zLevels, letting them know they can do zlevel specific stuff...") var/watch_prim = start_watch() for(var/datum/zLevel/z in map.zLevels) diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 6da69c0e308..be08e72b919 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -148,6 +148,7 @@ body += {" + @@ -612,6 +613,18 @@ function loadPage(list) { src.cmd_admin_godmode(M) href_list["datumrefresh"] = href_list["godmode"] + else if(href_list["buddhamode"]) + if(!check_rights(R_REJUVENATE)) + return + + var/mob/M = locate(href_list["buddhamode"]) + if(!istype(M)) + to_chat(usr, "This can only be used on instances of type /mob") + return + + src.cmd_admin_buddhamode(M) + href_list["datumrefresh"] = href_list["buddhamode"] + else if(href_list["gib"]) if(!check_rights(0)) return diff --git a/code/datums/map_elements.dm b/code/datums/map_elements.dm index 5a68adb0e54..9f88cf54087 100644 --- a/code/datums/map_elements.dm +++ b/code/datums/map_elements.dm @@ -11,6 +11,7 @@ var/list/datum/map_element/map_elements = list() var/load_at_once = TRUE //If true, lag reduction methods will not be applied when this is loaded, freezing atmos and mob simulations until the map element is loaded. var/turf/location //Lower left turf of the map element + var/list/spawned_atoms = list() var/width //Width of the map element, in turfs var/height //Height of the map element, in turfs @@ -54,9 +55,9 @@ var/list/datum/map_element/map_elements = list() if(file_path) var/file = file(file_path) if(isfile(file)) - var/list/L = maploader.load_map(file, z, x, y, src, rotation, overwrite, clipmin_x, clipmax_x, clipmin_y, clipmax_y, clipmin_z, clipmax_z) - initialize(L) - return L + spawned_atoms = maploader.load_map(file, z, x, y, src, rotation, overwrite, clipmin_x, clipmax_x, clipmin_y, clipmax_y, clipmin_z, clipmax_z) + initialize(spawned_atoms) + return spawned_atoms else //No file specified - empty map element //These variables are usually set by the map loader. Here we have to set them manually initialize(list()) //Initialize with an empty list diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index f078e90a8a2..d109b66e665 100755 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -2993,3 +2993,8 @@ var/list/the_station_areas = list ( icon_state = "mommishuttle" //END Island + +/area/hell + name = "\improper HELL" + requires_power = 0 + dynamic_lighting = 0 diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index d037397af70..86f1e34ac24 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -185,7 +185,7 @@ target.resurrect() target.tod = null - target.stat = UNCONSCIOUS + target.stat = target.status_flags & BUDDHAMODE ? CONSCIOUS : UNCONSCIOUS target.regenerate_icons() target.update_canmove() target.flash_eyes(visual = 1) diff --git a/code/game/objects/items/weapons/dice.dm b/code/game/objects/items/weapons/dice.dm index 8b675744fc3..9cc4474c1ab 100644 --- a/code/game/objects/items/weapons/dice.dm +++ b/code/game/objects/items/weapons/dice.dm @@ -127,6 +127,10 @@ else for(var/datum/organ/external/E in h.organs) //Being a catbeast doesn't exempt you from getting a curse just because you cannot turn into a catbeast again. E.droplimb(1) + if(prob(1)) + to_chat(user, "You have been damned directly to hell! ") + h.death() + send_to_hedoublehockeysticks(h) if(2 to 5) to_chat(user, "It could be worse, but not much worse! Enjoy your curse! ") h.flash_eyes(visual = 1) diff --git a/code/game/objects/items/weapons/storage/briefcase.dm b/code/game/objects/items/weapons/storage/briefcase.dm index 7af46c55e8b..97e250008bd 100644 --- a/code/game/objects/items/weapons/storage/briefcase.dm +++ b/code/game/objects/items/weapons/storage/briefcase.dm @@ -70,8 +70,9 @@ M.Paralyse(time) else M.Stun(time) - M.stat = UNCONSCIOUS - M.visible_message("\The [M] has been knocked unconscious by \the [user]!", "You have been knocked unconscious!", "You hear someone fall.") + if(!(M.status_flags & BUDDHAMODE)) + M.stat = UNCONSCIOUS + M.visible_message("\The [M] has been knocked unconscious by \the [user]!", "You have been knocked unconscious!", "You hear someone fall.") else M.visible_message("\The [user] tried to knock \the [M] unconcious!", "\The [user] tried to knock you unconcious!") M.eye_blurry += 3 diff --git a/code/game/objects/structures/dorfpod.dm b/code/game/objects/structures/dorfpod.dm index 789ae3df7ee..5aa1496e73a 100644 --- a/code/game/objects/structures/dorfpod.dm +++ b/code/game/objects/structures/dorfpod.dm @@ -155,7 +155,7 @@ var/obj/structure/dorfpod/center/dorfpod H.adjustBrainLoss(rand(20,30)) H.check_mutations = TRUE H.Paralyse(4) - H.stat = UNCONSCIOUS + H.stat = H.status_flags & BUDDHAMODE ? CONSCIOUS : UNCONSCIOUS H.updatehealth() has_been_shade.Remove(clonemind) @@ -209,4 +209,4 @@ var/obj/structure/dorfpod/center/dorfpod domutcheck(H) -#undef DORF_RESPAWN_COOLDOWN \ No newline at end of file +#undef DORF_RESPAWN_COOLDOWN diff --git a/code/game/turfs/unsimulated/floor.dm b/code/game/turfs/unsimulated/floor.dm index 2ed7e46fc1f..3703f55a392 100644 --- a/code/game/turfs/unsimulated/floor.dm +++ b/code/game/turfs/unsimulated/floor.dm @@ -85,3 +85,23 @@ ..() color = "#FFFFFF" + +/turf/unsimulated/floor/brimstone + icon_state = "ironsand1" + +/turf/unsimulated/floor/brimstone/New() + ..() + if(Holiday == APRIL_FOOLS_DAY) + ChangeTurf(/turf/unsimulated/floor/snow) // hell froze over + return + icon_state = "ironsand[rand(1,15)]" + overlays.Cut() + var/image/fire = image('icons/effects/fire.dmi', "[rand(1,3)]") + fire.blend_mode = BLEND_ADD + fire.layer = TURF_FIRE_LAYER + fire.plane = ABOVE_TURF_PLANE + overlays += fire + +/turf/unsimulated/floor/brimstone/Destroy() + overlays.Cut() + ..() diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 9f9a6393a65..9cb45f26804 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -189,6 +189,7 @@ var/list/admin_verbs_debug = list( /client/proc/debug_reagents, /client/proc/create_awaymission, /client/proc/make_invulnerable, + /client/proc/send_to_heck, /client/proc/cmd_admin_dump_delprofile, /client/proc/mob_list, /client/proc/cure_disease, @@ -1252,6 +1253,57 @@ var/list/admin_verbs_mod = list( createRandomZlevel(override, AM, usr) to_chat(src, "The away mission has been generated on z-level [world.maxz] [AM.location ? "([formatJumpTo(AM.location)])" : ""]") +/client/proc/send_to_heck(var/mob/dead/observer/O in dead_mob_list) + set name = "Send to hell" + set desc = "Eternally damn this ghost for their sins." + set category = "Fun" + + if(alert(usr, "Are you sure you want to do this?", "Confirm judgement", "Yes", "No") != "Yes") + return + + var/mob/newmob = send_to_hedoublehockeysticks(O) + if(newmob) + log_admin("[ckey(key)]/([mob]) has damned [newmob] to HELL") + message_admins("[ckey(key)]/([mob]) has damned [newmob] [formatJumpTo(newmob,"(JMP)")] to HELL") + +/proc/send_to_hedoublehockeysticks(mob/O) + if(!O || !O.key) + return + if(!(/datum/map_element/dungeon/hell in existing_dungeons)) + load_dungeon(/datum/map_element/dungeon/hell) + var/datum/map_element/dungeon/hell/H = locate(/datum/map_element/dungeon/hell) in existing_dungeons + var/list/turf/turfs = list() + for(var/turf/T in H.spawned_atoms) + if(!T.density) + turfs += T + if(!turfs.len) + warning("No hell turfs to send a mob to!") + return + for(var/datum/body_archive/archive in body_archives) + if(archive.key == O.key) + var/mob/living/tempM = new archive.mob_type + if(!istype(tempM)) + warning("Body archive to send to hell was not a living mob!") + break + var/mob/living/M = tempM.actually_reset_body(archive = archive, our_mind = get_mind_by_key(O.key)) + if(!istype(M)) + warning("Body archive to send to hell was not a living mob!") + break + M.status_flags ^= BUDDHAMODE + M.forceMove(pick(turfs)) + qdel(tempM) + qdel(O) + return M + + var/datum/mind/mind = get_mind_by_key(O.key) + if (mind) + var/mob/living/carbon/human/prefM = new(pick(turfs)) + prefM.status_flags ^= BUDDHAMODE + prefM.quick_copy_prefs() + mind.transfer_to(prefM) + qdel(O) + return prefM + /client/proc/cmd_dectalk() set name = "Dectalk" set category = "Special Verbs" diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 4786dfb6477..e0e52e3b244 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -162,6 +162,20 @@ message_admins("[key_name_admin(usr)] has toggled [key_name_admin(M)]'s nodamage to [(M.status_flags & GODMODE) ? "On" : "Off"]", 1) feedback_add_details("admin_verb","GOD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/client/proc/cmd_admin_buddhamode(mob/M as mob in mob_list) + set category = "Special Verbs" + set name = "Buddha mode" + + if(!holder) + to_chat(src, "Only administrators may use this command.") + return + M.status_flags ^= BUDDHAMODE + to_chat(usr, "Toggled [(M.status_flags & BUDDHAMODE) ? "ON" : "OFF"]") + + log_admin("[key_name(usr)] has toggled [key_name(M)]'s nodeath to [(M.status_flags & BUDDHAMODE) ? "On" : "Off"]") + message_admins("[key_name_admin(usr)] has toggled [key_name_admin(M)]'s nodeath to [(M.status_flags & BUDDHAMODE) ? "On" : "Off"]", 1) + feedback_add_details("admin_verb","BUDDHA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + /proc/cmd_admin_mute(mob/M as mob, mute_type, automute = 0) if(automute) diff --git a/code/modules/medical/cloning.dm b/code/modules/medical/cloning.dm index b8e64713a05..91ddfb78bb9 100644 --- a/code/modules/medical/cloning.dm +++ b/code/modules/medical/cloning.dm @@ -237,7 +237,7 @@ H.adjustCloneLoss(150) //new damage var so you can't eject a clone early then stab them to abuse the current damage system --NeoFite H.adjustBrainLoss(upgraded ? 0 : (heal_level + 50 + rand(10, 30))) // The rand(10, 30) will come out as extra brain damage H.Paralyse(4) - H.stat = UNCONSCIOUS //There was a bug which allowed you to talk for a few seconds after being cloned, because your stat wasn't updated until next Life() tick. This is a fix for this! + H.stat = H.status_flags & BUDDHAMODE ? CONSCIOUS : UNCONSCIOUS //There was a bug which allowed you to talk for a few seconds after being cloned, because your stat wasn't updated until next Life() tick. This is a fix for this! //Here let's calculate their health so the pod doesn't immediately eject them!!! H.updatehealth() diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 8e27510f0e0..4e286f632a7 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -406,6 +406,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set name = "Ghost" set desc = "Relinquish your life and enter the land of the dead." + if((client && !client.holder) && (status_flags & BUDDHAMODE)) + to_chat(src,"You feel stuck on this plane.") + return + var/timetocheck = timeofdeath if (isbrain(src)) var/mob/living/carbon/brain/brainmob = src diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm index 6540eb34627..2afde9fc4b2 100644 --- a/code/modules/mob/death.dm +++ b/code/modules/mob/death.dm @@ -1,6 +1,8 @@ //This is the proc for gibbing a mob. Cannot gib ghosts. //added different sort of gibs and animations. N /mob/proc/gib(animation = FALSE, meat = TRUE) + if(status_flags & BUDDHAMODE) + return death(1) monkeyizing = 1 canmove = 0 diff --git a/code/modules/mob/living/carbon/alien/death.dm b/code/modules/mob/living/carbon/alien/death.dm index 7fc1bf70eb1..83ee56ffbd6 100644 --- a/code/modules/mob/living/carbon/alien/death.dm +++ b/code/modules/mob/living/carbon/alien/death.dm @@ -1,4 +1,7 @@ /mob/living/carbon/alien/gib(animation = FALSE, meat = TRUE) + if(status_flags & BUDDHAMODE) + adjustBruteLoss(200) + return if(!isUnconscious()) forcesay("-") death(1) diff --git a/code/modules/mob/living/carbon/alien/humanoid/death.dm b/code/modules/mob/living/carbon/alien/humanoid/death.dm index 5b10367cec3..ba3638f2348 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/death.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/death.dm @@ -1,5 +1,5 @@ /mob/living/carbon/alien/humanoid/death(gibbed) - if(stat == DEAD) + if((status_flags & BUDDHAMODE) || stat == DEAD) return if(healths) healths.icon_state = "health6" diff --git a/code/modules/mob/living/carbon/alien/humanoid/life.dm b/code/modules/mob/living/carbon/alien/humanoid/life.dm index ce2599f9aec..1ac4f1de1c4 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/life.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/life.dm @@ -304,7 +304,7 @@ blinded = 1 silent = 0 else //ALIVE. LIGHTS ARE ON - if(health < config.health_threshold_dead || !has_brain()) + if((health < config.health_threshold_dead || !has_brain()) && !(status_flags & BUDDHAMODE)) death() blinded = 1 stat = DEAD @@ -312,7 +312,7 @@ return 1 //UNCONSCIOUS. NO-ONE IS HOME - if( (getOxyLoss() > 50) || (config.health_threshold_crit > health) ) + if((getOxyLoss() > 50 || config.health_threshold_crit > health) && !(status_flags & BUDDHAMODE)) if( health <= 20 && prob(1) ) spawn(0) emote("gasp") @@ -323,11 +323,11 @@ if(paralysis) AdjustParalysis(-1) blinded = 1 - stat = UNCONSCIOUS + stat = status_flags & BUDDHAMODE ? CONSCIOUS : UNCONSCIOUS else if(sleeping) sleeping = max(sleeping-1, 0) blinded = 1 - stat = UNCONSCIOUS + stat = status_flags & BUDDHAMODE ? CONSCIOUS : UNCONSCIOUS if( prob(10) && health ) spawn(0) emote("hiss") diff --git a/code/modules/mob/living/carbon/alien/larva/death.dm b/code/modules/mob/living/carbon/alien/larva/death.dm index d7192342155..f88e921709d 100644 --- a/code/modules/mob/living/carbon/alien/larva/death.dm +++ b/code/modules/mob/living/carbon/alien/larva/death.dm @@ -1,5 +1,5 @@ /mob/living/carbon/alien/larva/death(gibbed) - if(stat == DEAD) + if((status_flags & BUDDHAMODE) || stat == DEAD) return if(healths) healths.icon_state = "health6" diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm index 4ca7ee807c1..ac61a170176 100644 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ b/code/modules/mob/living/carbon/alien/larva/life.dm @@ -233,7 +233,7 @@ blinded = 1 silent = 0 else //ALIVE. LIGHTS ARE ON - if(health < -25 || !has_brain()) + if((health < -25 || !has_brain()) && !(status_flags & BUDDHAMODE)) death() blinded = 1 silent = 0 @@ -251,11 +251,11 @@ if(paralysis) AdjustParalysis(-2) blinded = 1 - stat = UNCONSCIOUS + stat = status_flags & BUDDHAMODE ? CONSCIOUS : UNCONSCIOUS else if(sleeping) sleeping = max(sleeping-1, 0) blinded = 1 - stat = UNCONSCIOUS + stat = status_flags & BUDDHAMODE ? CONSCIOUS : UNCONSCIOUS if( prob(10) && health ) spawn(0) emote("hiss_") diff --git a/code/modules/mob/living/carbon/brain/death.dm b/code/modules/mob/living/carbon/brain/death.dm index 46fb98c2a9f..7928e900c4b 100644 --- a/code/modules/mob/living/carbon/brain/death.dm +++ b/code/modules/mob/living/carbon/brain/death.dm @@ -1,23 +1,5 @@ /mob/living/carbon/brain/death(gibbed) - if(stat == DEAD) - return - if(!gibbed && container && istype(container, /obj/item/device/mmi))//If not gibbed but in a container. - container.OnMobDeath(src) - - stat = DEAD - - change_sight(adding = SEE_TURFS|SEE_MOBS|SEE_OBJS) - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_LEVEL_TWO - - tod = worldtime2text() //weasellos time of death patch - if(mind) - mind.store_memory("Time of death: [tod]", 0) //mind. ? - - return ..(gibbed) - -/mob/living/carbon/brain/death(gibbed) - if(stat == DEAD) + if((status_flags & BUDDHAMODE) || stat == DEAD) return if(!gibbed && container && istype(container, /obj/item/device/mmi))//If not gibbed but in a container. container.OnMobDeath(src) @@ -80,6 +62,9 @@ ..() /mob/living/carbon/brain/gib(animation = FALSE, meat = TRUE) + if(status_flags & BUDDHAMODE) + adjustBruteLoss(200) + return if(!isUnconscious()) forcesay("-") death(1) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 16747fda38e..29843c8f81f 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -72,6 +72,9 @@ user.delayNextMove(10) //no just holding the key for an instant gib /mob/living/carbon/gib(animation = FALSE, meat = TRUE) + if(status_flags & BUDDHAMODE) + adjustBruteLoss(200) + return dropBorers(1) if(stomach_contents && stomach_contents.len) drop_stomach_contents() diff --git a/code/modules/mob/living/carbon/complex/life.dm b/code/modules/mob/living/carbon/complex/life.dm index 48d5a4cee45..4244553f173 100644 --- a/code/modules/mob/living/carbon/complex/life.dm +++ b/code/modules/mob/living/carbon/complex/life.dm @@ -274,7 +274,7 @@ silent = 0 else //ALIVE. LIGHTS ARE ON updatehealth() - if(health < config.health_threshold_dead || !has_brain()) + if((health < config.health_threshold_dead || !has_brain()) && !(status_flags & BUDDHAMODE)) death() blinded = 1 stat = DEAD @@ -297,7 +297,7 @@ if(paralysis) AdjustParalysis(-1) blinded = 1 - stat = UNCONSCIOUS + stat = status_flags & BUDDHAMODE ? CONSCIOUS : UNCONSCIOUS if(halloss > 0) adjustHalLoss(-3) else if(sleeping) @@ -305,7 +305,7 @@ adjustHalLoss(-3) sleeping = max(sleeping-1, 0) blinded = 1 - stat = UNCONSCIOUS + stat = status_flags & BUDDHAMODE ? CONSCIOUS : UNCONSCIOUS if( prob(10) && health && !hal_crit ) spawn(0) emote("snore") @@ -314,7 +314,7 @@ adjustHalLoss(-3) //CONSCIOUS else if(undergoing_hypothermia() >= SEVERE_HYPOTHERMIA) - stat = UNCONSCIOUS + stat = status_flags & BUDDHAMODE ? CONSCIOUS : UNCONSCIOUS else stat = CONSCIOUS if(halloss > 0) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index d2235eca38a..db17df89588 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -1,4 +1,7 @@ /mob/living/carbon/human/gib(animation = FALSE, meat = TRUE) + if(status_flags & BUDDHAMODE) + adjustBruteLoss(200) + return if(!isUnconscious()) forcesay("-") if(species) @@ -91,7 +94,7 @@ obj_overlays = null /mob/living/carbon/human/death(gibbed) - if(stat == DEAD) + if((status_flags & BUDDHAMODE) || stat == DEAD) return if(healths) healths.icon_state = "health7" diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 6ae1e2f8c80..449c8943ac5 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -483,7 +483,7 @@ This function restores all organs. reagents.clear_reagents() restore_blood() bodytemperature = 310 - stat = UNCONSCIOUS + stat = status_flags & BUDDHAMODE ? CONSCIOUS : UNCONSCIOUS regenerate_icons() flash_eyes(visual = 1) apply_effect(10, EYE_BLUR) diff --git a/code/modules/mob/living/carbon/human/life/handle_regular_status_updates.dm b/code/modules/mob/living/carbon/human/life/handle_regular_status_updates.dm index 52826602ac6..2a29681233a 100644 --- a/code/modules/mob/living/carbon/human/life/handle_regular_status_updates.dm +++ b/code/modules/mob/living/carbon/human/life/handle_regular_status_updates.dm @@ -15,7 +15,7 @@ handle_organs() //Optimized. handle_blood() - if(health <= config.health_threshold_dead || !has_brain()) + if((health <= config.health_threshold_dead || !has_brain()) && !(status_flags & BUDDHAMODE)) emote("deathgasp", message = TRUE) death() blinded = 1 @@ -26,7 +26,7 @@ pain_numb = max(0, pain_numb - 1) //UNCONSCIOUS. NO-ONE IS HOME - if((getOxyLoss() > 50) || (config.health_threshold_crit > health)) + if((getOxyLoss() > 50 || config.health_threshold_crit > health) && !(status_flags & BUDDHAMODE)) Paralyse(3) species.OnCrit(src) @@ -63,7 +63,7 @@ if(paralysis) AdjustParalysis(-1) blinded = 1 - stat = UNCONSCIOUS + stat = status_flags & BUDDHAMODE ? CONSCIOUS : UNCONSCIOUS if(halloss > 0) adjustHalLoss(-3) else if(sleeping) @@ -71,13 +71,13 @@ adjustHalLoss(-3) sleeping = max(sleeping-1, 0) blinded = 1 - stat = UNCONSCIOUS + stat = status_flags & BUDDHAMODE ? CONSCIOUS : UNCONSCIOUS if(prob(2) && health && !hal_crit) spawn(0) emote("snore") else if(undergoing_hypothermia() >= SEVERE_HYPOTHERMIA) blinded = 1 - stat = UNCONSCIOUS + stat = status_flags & BUDDHAMODE ? CONSCIOUS : UNCONSCIOUS //CONSCIOUS else stat = CONSCIOUS diff --git a/code/modules/mob/living/carbon/monkey/death.dm b/code/modules/mob/living/carbon/monkey/death.dm index b5c7d88047f..fa6bcc7d9a8 100644 --- a/code/modules/mob/living/carbon/monkey/death.dm +++ b/code/modules/mob/living/carbon/monkey/death.dm @@ -1,4 +1,7 @@ /mob/living/carbon/monkey/gib(animation = FALSE, meat = TRUE) + if(status_flags & BUDDHAMODE) + adjustBruteLoss(200) + return if(!isUnconscious()) forcesay("-") death(1) @@ -28,7 +31,7 @@ /mob/living/carbon/monkey/death(gibbed) - if(stat == DEAD) + if((status_flags & BUDDHAMODE) || stat == DEAD) return if(healths) healths.icon_state = "health5" diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index 9428d4727e0..a61c3d814c2 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -521,7 +521,7 @@ silent = 0 else //ALIVE. LIGHTS ARE ON updatehealth() - if(health < config.health_threshold_dead || !has_brain()) + if((health < config.health_threshold_dead || !has_brain()) && !(status_flags & BUDDHAMODE)) death() blinded = 1 stat = DEAD @@ -529,7 +529,7 @@ return 1 //UNCONSCIOUS. NO-ONE IS HOME - if( (getOxyLoss() > 25) || (config.health_threshold_crit > health) ) + if((getOxyLoss() > 25 || config.health_threshold_crit > health) && !(status_flags & BUDDHAMODE)) if( health <= 20 && prob(1) ) spawn(0) emote("gasp") @@ -546,7 +546,7 @@ if(paralysis) AdjustParalysis(-1) blinded = 1 - stat = UNCONSCIOUS + stat = status_flags & BUDDHAMODE ? CONSCIOUS : UNCONSCIOUS if(halloss > 0) adjustHalLoss(-3) else if(sleeping) @@ -554,7 +554,7 @@ adjustHalLoss(-3) sleeping = max(sleeping-1, 0) blinded = 1 - stat = UNCONSCIOUS + stat = status_flags & BUDDHAMODE ? CONSCIOUS : UNCONSCIOUS if( prob(10) && health && !hal_crit ) spawn(0) emote("snore") @@ -563,7 +563,7 @@ adjustHalLoss(-3) //CONSCIOUS else if(undergoing_hypothermia() >= SEVERE_HYPOTHERMIA) - stat = UNCONSCIOUS + stat = status_flags & BUDDHAMODE ? CONSCIOUS : UNCONSCIOUS else stat = CONSCIOUS if(halloss > 0) diff --git a/code/modules/mob/living/carbon/slime/death.dm b/code/modules/mob/living/carbon/slime/death.dm index e335ce54073..33527d6b00f 100644 --- a/code/modules/mob/living/carbon/slime/death.dm +++ b/code/modules/mob/living/carbon/slime/death.dm @@ -1,5 +1,5 @@ /mob/living/carbon/slime/death(gibbed) - if(stat == DEAD) + if((status_flags & BUDDHAMODE) || stat == DEAD) return stat = DEAD icon_state = "[colour] baby slime dead" diff --git a/code/modules/mob/living/carbon/slime/life.dm b/code/modules/mob/living/carbon/slime/life.dm index 5965c8a97a3..290a1b62bfb 100644 --- a/code/modules/mob/living/carbon/slime/life.dm +++ b/code/modules/mob/living/carbon/slime/life.dm @@ -276,7 +276,7 @@ src.adjustOxyLoss(10) if(src.stat != DEAD) - src.stat = UNCONSCIOUS + stat = status_flags & BUDDHAMODE ? CONSCIOUS : UNCONSCIOUS if(prob(30)) //I think this is meant to allow slimes to starve to death -Deity Link adjustOxyLoss(-1) diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm index b34937f1f6a..0c5205453e6 100644 --- a/code/modules/mob/living/carbon/species.dm +++ b/code/modules/mob/living/carbon/species.dm @@ -170,6 +170,9 @@ var/global/list/playable_species = list("Human") ..() /datum/species/proc/gib(var/mob/living/carbon/human/H) + if(H.status_flags & BUDDHAMODE) + H.adjustBruteLoss(200) + return H.death(1) H.monkeyizing = 1 H.canmove = 0 diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index 93d5d2b28f0..9e977a1d1e3 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -12,6 +12,9 @@ standard_damage_overlay_updates() /mob/living/gib(animation = FALSE, meat = TRUE) + if(status_flags & BUDDHAMODE) + adjustBruteLoss(200) + return if(!isUnconscious()) forcesay("-") death(1) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index b85b749e105..90ad24f73aa 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -86,6 +86,10 @@ mutations.Remove(M_HARDCORE) to_chat(src, "You feel like a pleb.") handle_beams() + if(istype(get_turf(src),/turf/unsimulated/floor/brimstone)) + FireBurn(11, 9001, ONE_ATMOSPHERE) // lag free weird way of doing it + fire_stacks = 11 + IgniteMob() // ffffFIRE!!!! FIRE!!! FIRE!! return 1 // Apply connect damage diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm index a6d0554040c..d4158f0f03b 100644 --- a/code/modules/mob/living/silicon/ai/death.dm +++ b/code/modules/mob/living/silicon/ai/death.dm @@ -1,5 +1,5 @@ /mob/living/silicon/ai/death(gibbed) - if(stat == DEAD) + if((status_flags & BUDDHAMODE) || stat == DEAD) return if(!gibbed) emote("deathgasp", message = TRUE) diff --git a/code/modules/mob/living/silicon/death.dm b/code/modules/mob/living/silicon/death.dm index 9840f0e0b29..27395fc57a4 100644 --- a/code/modules/mob/living/silicon/death.dm +++ b/code/modules/mob/living/silicon/death.dm @@ -1,4 +1,7 @@ /mob/living/silicon/gib(animation = FALSE, meat = TRUE) + if(status_flags & BUDDHAMODE) + adjustBruteLoss(200) + return if(!isUnconscious()) forcesay("-") death(1) diff --git a/code/modules/mob/living/silicon/decoy/death.dm b/code/modules/mob/living/silicon/decoy/death.dm index f5f6a1f3de0..a61e0e98bd1 100644 --- a/code/modules/mob/living/silicon/decoy/death.dm +++ b/code/modules/mob/living/silicon/decoy/death.dm @@ -1,5 +1,5 @@ /mob/living/silicon/decoy/death(gibbed) - if(stat == DEAD) + if((status_flags & BUDDHAMODE) || stat == DEAD) return stat = DEAD icon_state = "ai-crash" @@ -7,4 +7,4 @@ explosion(loc, 3, 6, 12, 15, whodunnit = src) gib() - return ..(gibbed) \ No newline at end of file + return ..(gibbed) diff --git a/code/modules/mob/living/silicon/pai/death.dm b/code/modules/mob/living/silicon/pai/death.dm index fd989070f5b..eecd07a4560 100644 --- a/code/modules/mob/living/silicon/pai/death.dm +++ b/code/modules/mob/living/silicon/pai/death.dm @@ -1,5 +1,5 @@ /mob/living/silicon/pai/death(gibbed) - if(stat == DEAD) + if((status_flags & BUDDHAMODE) || stat == DEAD) return stat = DEAD canmove = 0 diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm index 2bea9ca34c0..269dadc9866 100644 --- a/code/modules/mob/living/silicon/robot/death.dm +++ b/code/modules/mob/living/silicon/robot/death.dm @@ -1,4 +1,7 @@ /mob/living/silicon/robot/gib(animation = FALSE, meat = TRUE) + if(status_flags & BUDDHAMODE) + adjustBruteLoss(200) + return //robots don't die when gibbed. instead they drop their MMI'd brain if(!isUnconscious()) forcesay("-") @@ -38,7 +41,7 @@ /mob/living/silicon/robot/death(gibbed) - if(stat == DEAD) + if((status_flags & BUDDHAMODE) || stat == DEAD) return if(connected_ai) if(connected_ai.explosive_cyborgs) diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 41f5c8c66b6..afe054965ab 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -32,7 +32,7 @@ if(spell_masters && spell_masters.len) for(var/obj/abstract/screen/movable/spell_master/spell_master in spell_masters) spell_master.update_spells(0, src) - + if(locked_to_z) check_locked_zlevel() @@ -91,7 +91,7 @@ if(!isDead()) //Alive. blinded = !(paralysis || is_component_functioning("camera")) stat = !(paralysis || stunned || knockdown) ? CONSCIOUS : UNCONSCIOUS - else //Dead. + else if(!(status_flags & BUDDHAMODE)) //Dead. blinded = TRUE stat = DEAD @@ -229,4 +229,4 @@ if(mmi) //no sneaking brains away qdel(mmi) mmi = null - gib() \ No newline at end of file + gib() diff --git a/code/modules/mob/living/simple_animal/bees/bees_mob.dm b/code/modules/mob/living/simple_animal/bees/bees_mob.dm index fe15683d230..981670aa381 100644 --- a/code/modules/mob/living/simple_animal/bees/bees_mob.dm +++ b/code/modules/mob/living/simple_animal/bees/bees_mob.dm @@ -96,6 +96,9 @@ var/bee_mobs_count = 0 qdel(src) /mob/living/simple_animal/bee/gib(var/animation = 0, var/meat = 1) + if(status_flags & BUDDHAMODE) + adjustBruteLoss(200) + return death(1) monkeyizing = 1 canmove = 0 diff --git a/code/modules/mob/living/simple_animal/borer.dm b/code/modules/mob/living/simple_animal/borer.dm index 7a8a825c30d..6525dc03d19 100644 --- a/code/modules/mob/living/simple_animal/borer.dm +++ b/code/modules/mob/living/simple_animal/borer.dm @@ -1119,7 +1119,7 @@ var/global/borer_unlock_types_leg = typesof(/datum/unlockable/borer/leg) - /datu to_chat(O,"While the borer may be mindless, you have recently ghosted and thus are not allowed to take over for now.") /mob/living/simple_animal/borer/proc/passout(var/wait_time = 0, var/show_message = 0) - if(!wait_time) + if((status_flags & BUDDHAMODE) || !wait_time) return if(show_message) to_chat(src, "You lose consciousness due to overexertion.") diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index a965a137b97..84fb98e804b 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -124,6 +124,9 @@ return 0 /mob/living/simple_animal/construct/gib(var/animation = 0, var/meat = 1) + if(status_flags & BUDDHAMODE) + adjustBruteLoss(200) + return if(!isUnconscious()) forcesay("-") death(1) diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 96519faaccc..24ec63f26b0 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -74,7 +74,7 @@ for(var/mob/M in view()) M << 'sound/effects/mousesqueek.ogg' - if(!ckey && stat == CONSCIOUS && prob(0.5)) + if(!ckey && stat == CONSCIOUS && prob(0.5) && !(status_flags & BUDDHAMODE)) stat = UNCONSCIOUS icon_state = icon_sleep wander = 0 @@ -443,7 +443,7 @@ name = "Discount Mouse" //full name is discount mouse, so it's correctly capitalized meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/animal/dan namenumbers = FALSE - + /mob/living/simple_animal/mouse/common/dan/New() ..() desc = "It's a small [_color] rodent, often seen hiding in maintenance areas and making a nuisance of itself. It looks well fed..." diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm index 30752957eb8..134af6f40ad 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm @@ -84,7 +84,7 @@ var/in_capsule = istype(loc, /obj/item/device/mobcapsule) //emps and lots of damage can temporarily shut us down - if(disabled > 0) + if(disabled > 0 && !(status_flags & BUDDHAMODE)) stat = UNCONSCIOUS icon_state = "drone_dead" disabled-- @@ -153,7 +153,7 @@ src.visible_message(" [bicon(src)] [src] sparks and shakes like it's about to explode!") spark(src) - if(!exploding && !disabled && prob(explode_chance)) + if(!exploding && !disabled && prob(explode_chance) && !(status_flags & BUDDHAMODE)) exploding = 1 stat = UNCONSCIOUS wander = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/shade.dm b/code/modules/mob/living/simple_animal/hostile/shade.dm index 783ad468049..acdee33aec8 100644 --- a/code/modules/mob/living/simple_animal/hostile/shade.dm +++ b/code/modules/mob/living/simple_animal/hostile/shade.dm @@ -61,6 +61,9 @@ alpha = 255 /mob/living/simple_animal/hostile/shade/gib(var/animation = 0, var/meat = 1) + if(status_flags & BUDDHAMODE) + adjustBruteLoss(200) + return if(!isUnconscious()) forcesay("-") death(TRUE) diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm index db5feeb40e1..814d2907c3b 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/simple_animal/shade.dm @@ -57,6 +57,9 @@ . = ..(message, "C") /mob/living/simple_animal/shade/gib(var/animation = 0, var/meat = 1) + if(status_flags & BUDDHAMODE) + adjustBruteLoss(200) + return if(!isUnconscious()) forcesay("-") death(TRUE) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index d5561d3689f..4643a338c7a 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -353,6 +353,9 @@ var/global/list/animal_count = list() //Stores types, and amount of animals of t temperature_alert = 0 /mob/living/simple_animal/gib(var/animation = 0, var/meat = 1) + if(status_flags & BUDDHAMODE) + adjustBruteLoss(200) + return if(icon_gib) anim(target = src, a_icon = icon, flick_anim = icon_gib, sleeptime = 15) @@ -559,7 +562,7 @@ var/global/list/animal_count = list() //Stores types, and amount of animals of t stat(null, "Health: [round((health / maxHealth) * 100)]%") /mob/living/simple_animal/death(gibbed) - if(stat == DEAD) + if((status_flags & BUDDHAMODE) || stat == DEAD) return if(!gibbed) diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 4878048c453..9ccb77e0bc4 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -1518,6 +1518,8 @@ Note that amputating the affected organ does in fact remove the infection from t return E /datum/organ/external/head/explode() + if(owner.status_flags & BUDDHAMODE) // can't lose your head like this + return owner.remove_internal_organ(owner, owner.internal_organs_by_name["brain"], src) eject_eyes() .=..() diff --git a/code/modules/randomMaps/vaults.dm b/code/modules/randomMaps/vaults.dm index aa5b24bb5a8..ec4e403570f 100644 --- a/code/modules/randomMaps/vaults.dm +++ b/code/modules/randomMaps/vaults.dm @@ -102,6 +102,216 @@ message_admins("Loaded space hobo shack [result ? "" : "un"]successfully.") +/datum/map_element/dungeon/hell + name = "HELL" + file_path = "maps/misc/HELL.dmm" + unique = TRUE + +/datum/map_element/dungeon/hell/load(x, y, z, rotate=0, overwrite = FALSE, override_can_rotate = FALSE) + . = ..() + if(islist(.) && config.bans_shown_in_hell_limit) + var/list/L = . + var/list/turf/turfs = list() + if(L.len) + for(var/turf/spawned_turf in L) + if(!spawned_turf.density) + turfs += spawned_turf + if(turfs.len) + var/time2make = world.time + var/database/db = ("players2.sqlite") + var/database/query/select_query = new + select_query.Add("SELECT ckey, reason FROM erro_ban WHERE bantype = PERMABAN AND isnull(unbanned)") + if(!select_query.Execute(db)) + qdel(select_query) + message_admins("Banned player search error on populating hell: [select_query.ErrorMsg()]") + log_sql("Error: [select_query.ErrorMsg()]") + return + + var/bancount = 0 + while(select_query.NextRow() && bancount <= config.bans_shown_in_hell_limit) + var/list/row = select_query.GetRowData() + var/ckey = row[1] + var/reason = row[2] + var/mob/living/carbon/human/H = new(pick(turfs)) + H.quick_copy_prefs() + H.flavor_text = "The soul of [ckey], damned to this realm for the following reason: [reason]" + bancount++ + time2make = world.time - time2make + log_admin("Hell was populated successfully with [bancount] banned players out of a max of [config.bans_shown_in_hell_limit] in [time2make/10] seconds.") + message_admins("Hell was populated successfully with [bancount] banned players out of a max of [config.bans_shown_in_hell_limit] in [time2make/10] seconds.") + +/mob/living/carbon/human/proc/quick_copy_prefs() + var/list/preference_list = new + var/database/query/check = new + var/database/db = ("players2.sqlite") + check.Add("SELECT player_ckey FROM players WHERE player_ckey = ? AND player_slot = ?", ckey, 1) + if(check.Execute(db)) + if(!check.NextRow()) + message_admins("[ckey] had no character file to load") + return + else + message_admins("Player appearance file check error: [check.ErrorMsg()]") + log_sql("Error: [check.ErrorMsg()]") + return + var/database/query/q = new + q.Add({" + SELECT + limbs.player_ckey, + limbs.player_slot, + limbs.l_arm, + limbs.r_arm, + limbs.l_leg, + limbs.r_leg, + limbs.l_foot, + limbs.r_foot, + limbs.l_hand, + limbs.r_hand, + limbs.heart, + limbs.eyes, + limbs.lungs, + limbs.liver, + limbs.kidneys, + players.player_ckey, + players.player_slot, + players.real_name, + players.random_name, + players.random_body, + players.gender, + players.species, + players.disabilities, + body.player_ckey, + body.player_slot, + body.hair_red, + body.hair_green, + body.hair_blue, + body.facial_red, + body.facial_green, + body.facial_blue, + body.skin_tone, + body.hair_style_name, + body.facial_style_name, + body.eyes_red, + body.eyes_green, + body.eyes_blue + FROM + players + INNER JOIN + limbs + ON + ( + players.player_ckey = limbs.player_ckey) + AND ( + players.player_slot = limbs.player_slot) + INNER JOIN + jobs + ON + ( + limbs.player_ckey = jobs.player_ckey) + AND ( + limbs.player_slot = jobs.player_slot) + INNER JOIN + body + ON + ( + jobs.player_ckey = body.player_ckey) + AND ( + jobs.player_slot = body.player_slot) + WHERE + players.player_ckey = ? + AND players.player_slot = ?"}, ckey, 1) + if(q.Execute(db)) + while(q.NextRow()) + var/list/row = q.GetRowData() + for(var/a in row) + preference_list[a] = row[a] + else + message_admins("Player appearance loading error: [q.ErrorMsg()]") + log_sql("Error: [q.ErrorMsg()]") + return + name = preference_list && preference_list.len && preference_list["real_name"] ? preference_list["real_name"] : ckey + real_name = name + if(dna) + dna.real_name = real_name + if(preference_list && preference_list.len) + var/disabilities = text2num(preference_list["disabilities"]) + if(!isnull(preference_list["species"])) + set_species(preference_list["species"]) + var/datum/species/chosen_species = all_species[preference_list["species"]] + if( (disabilities & DISABILITY_FLAG_FAT) && (chosen_species.anatomy_flags & CAN_BE_FAT) ) + mutations += M_FAT + setGender(sanitize_gender(preference_list["gender"])) + + my_appearance.r_eyes = sanitize_integer(preference_list["eyes_red"], 0, 255) + my_appearance.g_eyes = sanitize_integer(preference_list["eyes_green"], 0, 255) + my_appearance.b_eyes = sanitize_integer(preference_list["eyes_blue"], 0, 255) + + my_appearance.r_hair = sanitize_integer(preference_list["hair_red"], 0, 255) + my_appearance.g_hair = sanitize_integer(preference_list["hair_green"], 0, 255) + my_appearance.b_hair = sanitize_integer(preference_list["hair_blue"], 0, 255) + + my_appearance.r_facial = sanitize_integer(preference_list["facial_red"], 0, 255) + my_appearance.g_facial = sanitize_integer(preference_list["facial_green"], 0, 255) + my_appearance.b_facial = sanitize_integer(preference_list["facial_blue"], 0, 255) + + my_appearance.s_tone = sanitize_integer(preference_list["skin_tone"], -185, 34) + + my_appearance.h_style = sanitize_inlist(preference_list["hair_style_name"], hair_styles_list) + my_appearance.f_style = sanitize_inlist(preference_list["facial_style_name"], facial_hair_styles_list) + + dna.ResetUIFrom(src) + + if(disabilities & DISABILITY_FLAG_NEARSIGHTED) + disabilities|=NEARSIGHTED + if(disabilities & DISABILITY_FLAG_EPILEPTIC) + disabilities|=EPILEPSY + if(disabilities & DISABILITY_FLAG_EHS) + disabilities|=ELECTROSENSE + if(disabilities & DISABILITY_FLAG_DEAF) + sdisabilities|=DEAF + if(disabilities & DISABILITY_FLAG_BLIND) + sdisabilities|=BLIND + + var/list/organ_data = list() + organ_data[LIMB_LEFT_ARM] = preference_list[LIMB_LEFT_ARM] + organ_data[LIMB_RIGHT_ARM] = preference_list[LIMB_RIGHT_ARM] + organ_data[LIMB_LEFT_LEG] = preference_list[LIMB_LEFT_LEG] + organ_data[LIMB_RIGHT_LEG] = preference_list[LIMB_RIGHT_LEG] + organ_data[LIMB_LEFT_FOOT]= preference_list[LIMB_LEFT_FOOT] + organ_data[LIMB_RIGHT_FOOT]= preference_list[LIMB_RIGHT_FOOT] + organ_data[LIMB_LEFT_HAND]= preference_list[LIMB_LEFT_HAND] + organ_data[LIMB_RIGHT_HAND]= preference_list[LIMB_RIGHT_HAND] + organ_data["heart"] = preference_list["heart"] + organ_data["eyes"] = preference_list["eyes"] + organ_data["lungs"] = preference_list["lungs"] + organ_data["kidneys"]=preference_list["kidneys"] + organ_data["liver"] = preference_list["liver"] + + for(var/name in organ_data) + var/datum/organ/external/O = organs_by_name[name] + var/datum/organ/internal/I = internal_organs_by_name[name] + var/status = organ_data[name] + + if(status == "amputated") + O.status &= ~ORGAN_ROBOT + O.status &= ~ORGAN_PEG + O.amputated = 1 + O.status |= ORGAN_DESTROYED + O.destspawn = 1 + else if(status == "cyborg") + O.status &= ~ORGAN_PEG + O.status |= ORGAN_ROBOT + else if(status == "peg") + O.status &= ~ORGAN_ROBOT + O.status |= ORGAN_PEG + else if(status == "assisted") + I?.mechassist() + else if(status == "mechanical") + I?.mechanize() + else + continue + + regenerate_icons() + /proc/asteroid_can_be_placed(var/datum/map_element/E, var/turf/start_turf) if(!E.width || !E.height) //If the map element doesn't have its width/height calculated yet, do it now E.assign_dimensions() diff --git a/config-example/config.txt b/config-example/config.txt index b0b8af129d3..cf54e3e50c1 100644 --- a/config-example/config.txt +++ b/config-example/config.txt @@ -25,6 +25,9 @@ JOBS_HAVE_MINIMAL_ACCESS ## you have noone older than 0 days, since noone has been logged yet. Only turn this on once you have had the database up for 30 days. #USE_AGE_RESTRICTION_FOR_JOBS +## Remove # here if you wish to specify a custom cap on the amount of permabanned players showing up in hell, 0 disables +#BANS_SHOWN_IN_HELL_LIMIT 32 + ## Unhash this to use recursive explosions, keep it hashed to use circle explosions. Recursive explosions react to walls, airlocks and blast doors, making them look a lot cooler than the boring old circular explosions. They require more CPU and are (as of january 2013) experimental #USE_RECURSIVE_EXPLOSIONS diff --git a/maps/_map.dm b/maps/_map.dm index 780b519a653..711a0ae4d13 100644 --- a/maps/_map.dm +++ b/maps/_map.dm @@ -133,7 +133,7 @@ var/path = levelPaths[i] addZLevel(new path, i) -/datum/map/proc/addZLevel(datum/zLevel/level, z_to_use = 0) +/datum/map/proc/addZLevel(datum/zLevel/level, z_to_use = 0, make_base_turf = FALSE, fast_base_turf = FALSE) if(!istype(level)) @@ -146,8 +146,9 @@ zLevels[z_to_use] = level if(!level.movementJammed) accessable_z_levels += list("[z_to_use]" = level.movementChance) - level.z = z_to_use + if(!istype(level.base_turf,/turf/space) && make_base_turf) + level.reset_base_turf(/turf/space,fast_base_turf) var/global/list/accessable_z_levels = list() @@ -196,6 +197,15 @@ var/global/list/accessable_z_levels = list() /datum/zLevel/proc/post_mapload() return +/datum/zLevel/proc/reset_base_turf(old_type, fast_base_turf = FALSE) + for(var/turf/T in block(locate(1,1,z),locate(world.maxx,world.maxy,z))) + if(istype(T,old_type)) + if(fast_base_turf) + new base_turf(T) + else + T.set_area(base_area) + T.ChangeTurf(base_turf) + //////////////////////////////// /datum/zLevel/station diff --git a/maps/misc/HELL.dmm b/maps/misc/HELL.dmm new file mode 100644 index 00000000000..9a41b7c0fda --- /dev/null +++ b/maps/misc/HELL.dmm @@ -0,0 +1,4232 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/unsimulated/floor/brimstone, +/area/hell) +"o" = ( +/turf/unsimulated/wall/rock, +/area/hell) + +(1,1,1) = {" +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +"} +(2,1,1) = {" +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +a +a +a +a +a +a +a +o +o +o +o +a +a +a +a +a +a +a +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +"} +(3,1,1) = {" +o +o +o +o +o +o +o +a +a +a +a +a +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +a +a +a +a +o +o +o +o +o +o +o +o +o +o +o +o +"} +(4,1,1) = {" +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +"} +(5,1,1) = {" +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +"} +(6,1,1) = {" +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +"} +(7,1,1) = {" +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +"} +(8,1,1) = {" +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +"} +(9,1,1) = {" +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +"} +(10,1,1) = {" +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +"} +(11,1,1) = {" +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +"} +(12,1,1) = {" +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +"} +(13,1,1) = {" +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +"} +(14,1,1) = {" +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +"} +(15,1,1) = {" +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +o +o +o +"} +(16,1,1) = {" +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +o +o +o +"} +(17,1,1) = {" +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +o +o +o +"} +(18,1,1) = {" +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +"} +(19,1,1) = {" +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +"} +(20,1,1) = {" +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +"} +(21,1,1) = {" +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +"} +(22,1,1) = {" +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +"} +(23,1,1) = {" +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +"} +(24,1,1) = {" +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +"} +(25,1,1) = {" +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +"} +(26,1,1) = {" +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +"} +(27,1,1) = {" +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +"} +(28,1,1) = {" +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +"} +(29,1,1) = {" +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +"} +(30,1,1) = {" +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +o +o +o +o +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +a +a +a +a +a +a +o +"} +(31,1,1) = {" +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +o +o +o +o +o +o +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +a +a +a +a +a +o +"} +(32,1,1) = {" +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +o +o +o +o +o +o +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +a +a +a +a +o +o +"} +(33,1,1) = {" +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +o +o +o +o +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +a +a +a +a +o +o +"} +(34,1,1) = {" +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +o +o +o +o +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +a +a +a +a +a +o +o +"} +(35,1,1) = {" +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +o +o +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +"} +(36,1,1) = {" +o +o +a +a +a +a +a +a +a +a +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +"} +(37,1,1) = {" +o +o +a +a +a +a +a +a +a +o +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +"} +(38,1,1) = {" +o +o +a +a +a +a +a +a +o +o +o +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +"} +(39,1,1) = {" +o +o +a +a +a +a +a +a +o +o +o +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +"} +(40,1,1) = {" +o +o +a +a +a +a +a +a +o +o +o +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +"} +(41,1,1) = {" +o +a +a +a +a +a +a +a +a +o +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +"} +(42,1,1) = {" +o +a +a +a +a +a +a +a +a +o +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +"} +(43,1,1) = {" +o +a +a +a +a +a +a +a +a +a +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +"} +(44,1,1) = {" +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +"} +(45,1,1) = {" +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +"} +(46,1,1) = {" +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +"} +(47,1,1) = {" +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +"} +(48,1,1) = {" +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +"} +(49,1,1) = {" +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +"} +(50,1,1) = {" +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +"} +(51,1,1) = {" +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +"} +(52,1,1) = {" +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +"} +(53,1,1) = {" +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +"} +(54,1,1) = {" +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +"} +(55,1,1) = {" +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +"} +(56,1,1) = {" +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +"} +(57,1,1) = {" +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +"} +(58,1,1) = {" +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +"} +(59,1,1) = {" +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +"} +(60,1,1) = {" +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +"} +(61,1,1) = {" +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +"} +(62,1,1) = {" +o +o +o +o +o +o +o +o +o +a +a +a +a +a +a +o +o +o +o +o +o +o +o +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +o +o +a +a +a +a +a +o +o +o +o +o +o +o +"} +(63,1,1) = {" +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +a +a +a +a +a +a +o +o +a +a +a +a +a +a +a +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +"} +(64,1,1) = {" +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +"}