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 <sage>
This commit is contained in:
SECBATON GRIFFON
2022-11-09 21:26:33 +00:00
committed by GitHub
parent a6c103ac98
commit b133803c47
53 changed files with 4680 additions and 74 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -148,6 +148,7 @@
body += {"<option value='?_src_=vars;give_spell=\ref[D]'>Give Spell</option>
<option value='?_src_=vars;give_disease2=\ref[D]'>Give New Disease</option>
<option value='?_src_=vars;godmode=\ref[D]'>Toggle Godmode</option>
<option value='?_src_=vars;buddhamode=\ref[D]'>Toggle Buddha Mode</option>
<option value='?_src_=vars;build_mode=\ref[D]'>Toggle Build Mode</option>
<option value='?_src_=vars;drop_everything=\ref[D]'>Drop Everything</option>
<option value='?_src_=vars;regenerateicons=\ref[D]'>Regenerate Icons</option>
@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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, "<span class=sinister><B>You have been damned directly to hell! </span></B>")
h.death()
send_to_hedoublehockeysticks(h)
if(2 to 5)
to_chat(user, "<span class=sinister><B>It could be worse, but not much worse! Enjoy your curse! </span></B>")
h.flash_eyes(visual = 1)

View File

@@ -70,8 +70,9 @@
M.Paralyse(time)
else
M.Stun(time)
M.stat = UNCONSCIOUS
M.visible_message("<span class='danger'>\The [M] has been knocked unconscious by \the [user]!</span>", "<span class='danger'>You have been knocked unconscious!</span>", "<span class='warning'>You hear someone fall.</span>")
if(!(M.status_flags & BUDDHAMODE))
M.stat = UNCONSCIOUS
M.visible_message("<span class='danger'>\The [M] has been knocked unconscious by \the [user]!</span>", "<span class='danger'>You have been knocked unconscious!</span>", "<span class='warning'>You hear someone fall.</span>")
else
M.visible_message("<span class='warning'>\The [user] tried to knock \the [M] unconcious!</span>", "<span class='warning'>\The [user] tried to knock you unconcious!</span>")
M.eye_blurry += 3

View File

@@ -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
#undef DORF_RESPAWN_COOLDOWN

View File

@@ -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()
..()

View File

@@ -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"

View File

@@ -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, "<span class='notice'>Toggled [(M.status_flags & BUDDHAMODE) ? "ON" : "OFF"]</span>")
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)

View File

@@ -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()

View File

@@ -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,"<span class='notice'>You feel stuck on this plane.</span>")
return
var/timetocheck = timeofdeath
if (isbrain(src))
var/mob/living/carbon/brain/brainmob = src

View File

@@ -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

View File

@@ -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)

View File

@@ -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"

View File

@@ -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")

View File

@@ -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"

View File

@@ -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_")

View File

@@ -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)

View File

@@ -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()

View File

@@ -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)

View File

@@ -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"

View File

@@ -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)

View File

@@ -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

View File

@@ -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"

View File

@@ -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)

View File

@@ -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"

View File

@@ -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)

View File

@@ -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

View File

@@ -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)

View File

@@ -86,6 +86,10 @@
mutations.Remove(M_HARDCORE)
to_chat(src, "<span class='notice'>You feel like a pleb.</span>")
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

View File

@@ -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)

View File

@@ -1,4 +1,7 @@
/mob/living/silicon/gib(animation = FALSE, meat = TRUE)
if(status_flags & BUDDHAMODE)
adjustBruteLoss(200)
return
if(!isUnconscious())
forcesay("-")
death(1)

View File

@@ -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)
return ..(gibbed)

View File

@@ -1,5 +1,5 @@
/mob/living/silicon/pai/death(gibbed)
if(stat == DEAD)
if((status_flags & BUDDHAMODE) || stat == DEAD)
return
stat = DEAD
canmove = 0

View File

@@ -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)

View File

@@ -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()
gib()

View File

@@ -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

View File

@@ -1119,7 +1119,7 @@ var/global/borer_unlock_types_leg = typesof(/datum/unlockable/borer/leg) - /datu
to_chat(O,"<span class='notice'>While the borer may be mindless, you have recently ghosted and thus are not allowed to take over for now.</span>")
/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, "<span class='warning'>You lose consciousness due to overexertion.</span>")

View File

@@ -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)

View File

@@ -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..."

View File

@@ -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("<span class='warning'> [bicon(src)] [src] sparks and shakes like it's about to explode!</span>")
spark(src)
if(!exploding && !disabled && prob(explode_chance))
if(!exploding && !disabled && prob(explode_chance) && !(status_flags & BUDDHAMODE))
exploding = 1
stat = UNCONSCIOUS
wander = 1

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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()
.=..()

View File

@@ -102,6 +102,216 @@
message_admins("<span class='info'>Loaded space hobo shack [result ? "" : "un"]successfully.</span>")
/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()

View File

@@ -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

View File

@@ -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

4232
maps/misc/HELL.dmm Normal file

File diff suppressed because it is too large Load Diff