mirror of
https://github.com/KabKebab/GS13.git
synced 2026-07-17 10:58:19 +01:00
Merge remote-tracking branch 'upstream/master' into nanites
This commit is contained in:
@@ -487,7 +487,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
|
||||
if(alert("This mob is being controlled by [M.key]. Are you sure you wish to assume control of it? [M.key] will be made a ghost.",,"Yes","No") != "Yes")
|
||||
return
|
||||
else
|
||||
var/mob/dead/observer/ghost = new/mob/dead/observer(M,1)
|
||||
var/mob/dead/observer/ghost = new/mob/dead/observer(get_turf(M), M)
|
||||
ghost.ckey = M.ckey
|
||||
message_admins("<span class='adminnotice'>[key_name_admin(usr)] assumed direct control of [M].</span>")
|
||||
log_admin("[key_name(usr)] assumed direct control of [M].")
|
||||
|
||||
@@ -28,15 +28,15 @@
|
||||
to_chat(target, "You feel as if you are being watched.")
|
||||
return
|
||||
draining = TRUE
|
||||
essence_drained += rand(15, 20)
|
||||
essence_drained += rand(30, 40)
|
||||
to_chat(src, "<span class='revennotice'>You search for the soul of [target].</span>")
|
||||
if(do_after(src, rand(10, 20), 0, target)) //did they get deleted in that second?
|
||||
if(target.ckey)
|
||||
to_chat(src, "<span class='revennotice'>[target.p_their(TRUE)] soul burns with intelligence.</span>")
|
||||
essence_drained += rand(20, 30)
|
||||
essence_drained += rand(40, 60)
|
||||
if(target.stat != DEAD)
|
||||
to_chat(src, "<span class='revennotice'>[target.p_their(TRUE)] soul blazes with life!</span>")
|
||||
essence_drained += rand(40, 50)
|
||||
essence_drained += rand(80, 100)
|
||||
else
|
||||
to_chat(src, "<span class='revennotice'>[target.p_their(TRUE)] soul is weak and faltering.</span>")
|
||||
if(do_after(src, rand(15, 20), 0, target)) //did they get deleted NOW?
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#define REVENANT_SPAWN_THRESHOLD 15
|
||||
#define REVENANT_SPAWN_THRESHOLD 12
|
||||
|
||||
/datum/round_event_control/revenant
|
||||
name = "Spawn Revenant" // Did you mean 'griefghost'?
|
||||
@@ -20,7 +20,8 @@
|
||||
if(!ignore_mobcheck)
|
||||
var/deadMobs = 0
|
||||
for(var/mob/living/carbon/M in GLOB.dead_mob_list)
|
||||
deadMobs++
|
||||
if(is_station_level(M.z))
|
||||
deadMobs++
|
||||
if(deadMobs < REVENANT_SPAWN_THRESHOLD)
|
||||
message_admins("Event attempted to spawn a revenant, but there were only [deadMobs]/[REVENANT_SPAWN_THRESHOLD] dead mobs.")
|
||||
return WAITING_FOR_SOMETHING
|
||||
|
||||
@@ -20,6 +20,8 @@
|
||||
var/max_n_of_items = 10
|
||||
var/efficiency = 0
|
||||
var/datum/looping_sound/microwave/soundloop
|
||||
var/datum/looping_sound/microwave_easteregg/eastereggloop
|
||||
var/easteregg = FALSE
|
||||
var/list/ingredients = list() // may only contain /atom/movables
|
||||
|
||||
var/static/radial_examine = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_examine")
|
||||
@@ -35,6 +37,7 @@
|
||||
wires = new /datum/wires/microwave(src)
|
||||
create_reagents(100)
|
||||
soundloop = new(list(src), FALSE)
|
||||
eastereggloop = new(list(src), FALSE)
|
||||
|
||||
/obj/machinery/microwave/Destroy()
|
||||
eject()
|
||||
@@ -257,7 +260,12 @@
|
||||
operating = TRUE
|
||||
|
||||
set_light(1.5)
|
||||
soundloop.start()
|
||||
switch(rand(1,500))
|
||||
if(1)
|
||||
eastereggloop.start()
|
||||
easteregg = TRUE
|
||||
if(2 to 500)
|
||||
soundloop.start()
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/microwave/proc/spark()
|
||||
@@ -348,9 +356,13 @@
|
||||
|
||||
/obj/machinery/microwave/proc/after_finish_loop()
|
||||
set_light(0)
|
||||
soundloop.stop()
|
||||
if(easteregg)
|
||||
eastereggloop.stop()
|
||||
easteregg = FALSE
|
||||
else
|
||||
soundloop.stop()
|
||||
update_icon()
|
||||
|
||||
#undef MICROWAVE_NORMAL
|
||||
#undef MICROWAVE_MUCK
|
||||
#undef MICROWAVE_PRE
|
||||
#undef MICROWAVE_PRE
|
||||
|
||||
@@ -78,7 +78,7 @@ Medical Doctor
|
||||
|
||||
outfit = /datum/outfit/job/doctor
|
||||
|
||||
access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM)
|
||||
access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_VIROLOGY, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM)
|
||||
|
||||
/datum/outfit/job/doctor
|
||||
@@ -122,8 +122,8 @@ Chemist
|
||||
|
||||
outfit = /datum/outfit/job/chemist
|
||||
|
||||
access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_MEDICAL, ACCESS_CHEMISTRY, ACCESS_MINERAL_STOREROOM)
|
||||
access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_MEDICAL, ACCESS_CHEMISTRY, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM)
|
||||
|
||||
/datum/outfit/job/chemist
|
||||
name = "Chemist"
|
||||
@@ -203,7 +203,7 @@ Virologist
|
||||
outfit = /datum/outfit/job/virologist
|
||||
|
||||
access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_MEDICAL, ACCESS_VIROLOGY, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_VIROLOGY, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM)
|
||||
|
||||
/datum/outfit/job/virologist
|
||||
name = "Virologist"
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
icon = LIGHTING_ICON
|
||||
icon_state = "transparent"
|
||||
color = LIGHTING_BASE_MATRIX
|
||||
color = null //we manually set color in init instead
|
||||
plane = LIGHTING_PLANE
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
layer = LIGHTING_LAYER
|
||||
@@ -17,6 +17,9 @@
|
||||
/atom/movable/lighting_object/Initialize(mapload)
|
||||
. = ..()
|
||||
verbs.Cut()
|
||||
//We avoid setting this in the base as if we do then the parent atom handling will add_atom_color it and that
|
||||
//is totally unsuitable for this object, as we are always changing its colour manually
|
||||
color = LIGHTING_BASE_MATRIX
|
||||
|
||||
myturf = loc
|
||||
if (myturf.lighting_object)
|
||||
|
||||
@@ -56,7 +56,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
|
||||
var/deadchat_name
|
||||
var/datum/spawners_menu/spawners_menu
|
||||
|
||||
/mob/dead/observer/Initialize()
|
||||
/mob/dead/observer/Initialize(mapload, mob/body)
|
||||
set_invisibility(GLOB.observer_default_invisibility)
|
||||
|
||||
add_verb(src, list(
|
||||
@@ -77,11 +77,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
|
||||
|
||||
updateallghostimages()
|
||||
|
||||
var/turf/T
|
||||
var/mob/body = loc
|
||||
if(ismob(body))
|
||||
T = get_turf(body) //Where is the body located?
|
||||
|
||||
if(body)
|
||||
gender = body.gender
|
||||
if(body.mind && body.mind.name)
|
||||
name = body.mind.name
|
||||
@@ -106,14 +102,15 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
|
||||
|
||||
update_icon()
|
||||
|
||||
if(!T)
|
||||
if(!isturf(loc))
|
||||
var/turf/T
|
||||
var/list/turfs = get_area_turfs(/area/shuttle/arrival)
|
||||
if(turfs.len)
|
||||
T = pick(turfs)
|
||||
else
|
||||
T = SSmapping.get_station_center()
|
||||
|
||||
forceMove(T)
|
||||
forceMove(T)
|
||||
|
||||
if(!name) //To prevent nameless ghosts
|
||||
name = random_unique_name(gender)
|
||||
@@ -268,7 +265,7 @@ Works together with spawning an observer, noted above.
|
||||
if(!key || key[1] == "@" || (SEND_SIGNAL(src, COMSIG_MOB_GHOSTIZE, can_reenter_corpse, special, penalize) & COMPONENT_BLOCK_GHOSTING))
|
||||
return //mob has no key, is an aghost or some component hijacked.
|
||||
stop_sound_channel(CHANNEL_HEARTBEAT) //Stop heartbeat sounds because You Are A Ghost Now
|
||||
var/mob/dead/observer/ghost = new(src) // Transfer safety to observer spawning proc.
|
||||
var/mob/dead/observer/ghost = new(get_turf(src), src) // Transfer safety to observer spawning proc.
|
||||
SStgui.on_transfer(src, ghost) // Transfer NanoUIs.
|
||||
ghost.can_reenter_corpse = can_reenter_corpse
|
||||
if (client && client.prefs && client.prefs.auto_ooc)
|
||||
|
||||
@@ -19,12 +19,6 @@
|
||||
if(SSticker.mode)
|
||||
SSticker.mode.check_win() //Calls the rounds wincheck, mainly for wizard, malf, and changeling now
|
||||
|
||||
//watching someone die is traumatic
|
||||
for(var/mob/living/carbon/human/H in oview(5, src))
|
||||
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "death", /datum/mood_event/deathsaw)
|
||||
if(prob(10)) //10% chance to pump adrenaline into their body
|
||||
H.jitteriness += 5
|
||||
|
||||
/mob/living/carbon/gib(no_brain, no_organs, no_bodyparts)
|
||||
var/atom/Tsec = drop_location()
|
||||
for(var/mob/M in src)
|
||||
|
||||
@@ -52,6 +52,14 @@
|
||||
if(is_devil(src))
|
||||
INVOKE_ASYNC(is_devil(src), /datum/antagonist/devil.proc/beginResurrectionCheck, src)
|
||||
|
||||
//watching someone die is traumatic
|
||||
for(var/mob/living/carbon/human/C in oview(5, src))
|
||||
if(C.mind) //We don't need to give this to anything that doesn't have a mind. That's wasted processing.
|
||||
if(!HAS_TRAIT(C, TRAIT_APATHETIC) || !C.mind.assigned_role == "Medical Doctor") //Shamelessly stolen from the Doctor's Delight
|
||||
SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "death", /datum/mood_event/deathsaw)
|
||||
if(prob(10)) //10% chance to pump adrenaline into their body
|
||||
C.jitteriness += 5
|
||||
|
||||
/mob/living/carbon/human/proc/makeSkeleton()
|
||||
ADD_TRAIT(src, TRAIT_DISFIGURED, TRAIT_GENERIC)
|
||||
set_species(/datum/species/skeleton)
|
||||
|
||||
@@ -12,6 +12,10 @@
|
||||
battery = new battery_type(src)
|
||||
..()
|
||||
|
||||
/obj/item/computer_hardware/battery/Destroy()
|
||||
. = ..()
|
||||
QDEL_NULL(battery)
|
||||
|
||||
/obj/item/computer_hardware/battery/try_insert(obj/item/I, mob/living/user = null)
|
||||
if(!holder)
|
||||
return FALSE
|
||||
@@ -50,7 +54,6 @@
|
||||
holder.shutdown_computer()
|
||||
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
|
||||
|
||||
@@ -91,4 +94,4 @@
|
||||
name = "nano battery"
|
||||
desc = "A tiny power cell, commonly seen in low-end portable microcomputers."
|
||||
icon_state = "cell_micro"
|
||||
maxcharge = 300
|
||||
maxcharge = 300
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
stat |= BROKEN
|
||||
unset_control()
|
||||
|
||||
/obj/machinery/power/solar/deconstruct(disassembled = TRUE)
|
||||
/obj/machinery/power/tracker/deconstruct(disassembled = TRUE)
|
||||
if(!(flags_1 & NODECONSTRUCT_1))
|
||||
if(disassembled)
|
||||
if(assembly)
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
var/now_fixed
|
||||
var/high_threshold_cleared
|
||||
var/low_threshold_cleared
|
||||
rad_flags = RAD_NO_CONTAMINATE
|
||||
|
||||
/obj/item/organ/proc/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE)
|
||||
if(!iscarbon(M) || owner == M)
|
||||
@@ -134,7 +135,8 @@
|
||||
///Damage decrements by a percent of its maxhealth
|
||||
var/healing_amount = -(maxHealth * healing_factor)
|
||||
///Damage decrements again by a percent of its maxhealth, up to a total of 4 extra times depending on the owner's health
|
||||
healing_amount -= owner.satiety > 0 ? 4 * healing_factor * owner.satiety / MAX_SATIETY : 0
|
||||
if(owner)
|
||||
healing_amount -= owner.satiety > 0 ? 4 * healing_factor * owner.satiety / MAX_SATIETY : 0
|
||||
applyOrganDamage(healing_amount) //to FERMI_TWEAK
|
||||
//Make it so each threshold is stuck.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user