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
+"}