diff --git a/code/_onclick/_defines.dm b/code/_onclick/_defines.dm new file mode 100644 index 0000000000..3c76c35e80 --- /dev/null +++ b/code/_onclick/_defines.dm @@ -0,0 +1 @@ +#define CLICKCATCHER_PLANE -99 \ No newline at end of file diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index d131ddd6d3..52c56ccb17 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -321,11 +321,19 @@ facedir(direction) /obj/screen/click_catcher - icon = 'icons/mob/screen1_full.dmi' - icon_state = "passage0" - layer = 0 + icon = 'icons/mob/screen_gen.dmi' + icon_state = "click_catcher" + plane = CLICKCATCHER_PLANE mouse_opacity = 2 - screen_loc = "1,1" + screen_loc = "CENTER-7,CENTER-7" + +/obj/screen/click_catcher/proc/MakeGreed() + . = list() + for(var/i = 0, i<15, i++) + for(var/j = 0, j<15, j++) + var/obj/screen/click_catcher/CC = new() + CC.screen_loc = "NORTH-[i],EAST-[j]" + . += CC /obj/screen/click_catcher/Click(location, control, params) var/list/modifiers = params2list(params) @@ -333,6 +341,6 @@ var/mob/living/carbon/C = usr C.swap_hand() else - var/turf/T = screen_loc2turf(modifiers["screen-loc"], get_turf(usr)) + var/turf/T = screen_loc2turf("screen-loc", get_turf(usr)) T.Click(location, control, params) - return 1 + . = 1 diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm index 37d9616ea5..ecba579159 100644 --- a/code/_onclick/hud/ai.dm +++ b/code/_onclick/hud/ai.dm @@ -132,6 +132,6 @@ mymob.client.screen = list() mymob.client.screen += adding + other - mymob.client.screen += mymob.client.void +// mymob.client.screen += mymob.client.void return \ No newline at end of file diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/alien_larva.dm index 4fa0e4110a..ad525dc81c 100644 --- a/code/_onclick/hud/alien_larva.dm +++ b/code/_onclick/hud/alien_larva.dm @@ -21,20 +21,6 @@ mymob.healths.name = "health" mymob.healths.screen_loc = ui_alien_health - mymob.blind = new /obj/screen() - mymob.blind.icon = 'icons/mob/screen1_full.dmi' - mymob.blind.icon_state = "blackimageoverlay" - mymob.blind.name = " " - mymob.blind.screen_loc = "1,1" - mymob.blind.layer = 0 - - mymob.flash = new /obj/screen() - mymob.flash.icon = 'icons/mob/screen1_alien.dmi' - mymob.flash.icon_state = "blank" - mymob.flash.name = "flash" - mymob.flash.screen_loc = ui_entire_screen - mymob.flash.layer = 17 - mymob.fire = new /obj/screen() mymob.fire.icon = 'icons/mob/screen1_alien.dmi' mymob.fire.icon_state = "fire0" @@ -42,6 +28,6 @@ mymob.fire.screen_loc = ui_fire mymob.client.screen = list() - mymob.client.screen += list( mymob.healths, mymob.blind, mymob.flash, mymob.fire) //, mymob.rest, mymob.sleep, mymob.mach ) + mymob.client.screen += list( mymob.healths, mymob.fire) //, mymob.rest, mymob.sleep, mymob.mach ) mymob.client.screen += src.adding + src.other - mymob.client.screen += mymob.client.void \ No newline at end of file +// mymob.client.screen += mymob.client.void \ No newline at end of file diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm new file mode 100644 index 0000000000..fd226eb70c --- /dev/null +++ b/code/_onclick/hud/fullscreen.dm @@ -0,0 +1,118 @@ +#define FULLSCREEN_LAYER 18 +#define DAMAGE_LAYER FULLSCREEN_LAYER + 0.1 +#define BLIND_LAYER DAMAGE_LAYER + 0.1 +#define CRIT_LAYER BLIND_LAYER + 0.1 + +/mob + var/list/screens = list() + +/mob/proc/set_fullscreen(condition, screen_name, screen_type, arg) + condition ? overlay_fullscreen(screen_name, screen_type, arg) : clear_fullscreen(screen_name) + +/mob/proc/overlay_fullscreen(category, type, severity) + var/obj/screen/fullscreen/screen = screens[category] + + if(screen) + if(screen.type != type) + clear_fullscreen(category, FALSE) + screen = null + else if(!severity || severity == screen.severity) + return null + + if(!screen) + screen = PoolOrNew(type) + + screen.icon_state = "[initial(screen.icon_state)][severity]" + screen.severity = severity + + screens[category] = screen + if(client && stat != DEAD) + client.screen += screen + return screen + +/mob/proc/clear_fullscreen(category, animated = 10) + var/obj/screen/fullscreen/screen = screens[category] + if(!screen) + return + + screens -= category + + if(animated) + spawn(0) + animate(screen, alpha = 0, time = animated) + sleep(animated) + if(client) + client.screen -= screen + qdel(screen) + else + if(client) + client.screen -= screen + qdel(screen) + +/mob/proc/clear_fullscreens() + for(var/category in screens) + clear_fullscreen(category) + +/mob/proc/hide_fullscreens() + if(client) + for(var/category in screens) + client.screen -= screens[category] + +/mob/proc/reload_fullscreen() + if(client && stat != DEAD) //dead mob do not see any of the fullscreen overlays that he has. + for(var/category in screens) + client.screen |= screens[category] + +/obj/screen/fullscreen + icon = 'icons/mob/screen_full.dmi' + icon_state = "default" + screen_loc = "CENTER-7,CENTER-7" + layer = FULLSCREEN_LAYER + mouse_opacity = 0 + var/severity = 0 + +/obj/screen/fullscreen/Destroy() + severity = 0 + return ..() + +/obj/screen/fullscreen/brute + icon_state = "brutedamageoverlay" + layer = DAMAGE_LAYER + +/obj/screen/fullscreen/oxy + icon_state = "oxydamageoverlay" + layer = DAMAGE_LAYER + +/obj/screen/fullscreen/crit + icon_state = "passage" + layer = CRIT_LAYER + +/obj/screen/fullscreen/blind + icon_state = "blackimageoverlay" + layer = BLIND_LAYER + +/obj/screen/fullscreen/impaired + icon_state = "impairedoverlay" + +/obj/screen/fullscreen/blurry + icon = 'icons/mob/screen1.dmi' + screen_loc = "WEST,SOUTH to EAST,NORTH" + icon_state = "blurry" + +/obj/screen/fullscreen/flash + icon = 'icons/mob/screen1.dmi' + screen_loc = "WEST,SOUTH to EAST,NORTH" + icon_state = "flash" + +/obj/screen/fullscreen/flash/noise + icon_state = "noise" + +/obj/screen/fullscreen/high + icon = 'icons/mob/screen1.dmi' + screen_loc = "WEST,SOUTH to EAST,NORTH" + icon_state = "druggy" + +#undef FULLSCREEN_LAYER +#undef BLIND_LAYER +#undef DAMAGE_LAYER +#undef CRIT_LAYER \ No newline at end of file diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 7b9cf82cc5..a75c4b0196 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -269,7 +269,7 @@ datum/hud/New(mob/owner) else if(isrobot(mymob)) robot_hud(ui_style, ui_color, ui_alpha, mymob) else if(isbrain(mymob)) - brain_hud(ui_style) + mymob.instantiate_hud(src) else if(isalien(mymob)) larva_hud() else if(isslime(mymob)) @@ -382,3 +382,9 @@ datum/hud/New(mob/owner) hud_used.hidden_inventory_update() hud_used.persistant_inventory_update() update_action_buttons() + +///mob/proc/add_click_catcher() +// client.screen += client.void + +///mob/new_player/add_click_catcher() +// return \ No newline at end of file diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 3f872f53e6..dd947c9d3b 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -303,32 +303,6 @@ mymob.ling_chem_display.icon_state = "ling_chems" hud_elements |= mymob.ling_chem_display - mymob.blind = new /obj/screen() - mymob.blind.icon = 'icons/mob/screen1_full.dmi' - mymob.blind.icon_state = "blackimageoverlay" - mymob.blind.name = " " - mymob.blind.screen_loc = "1,1" - mymob.blind.mouse_opacity = 0 - mymob.blind.layer = 0 - hud_elements |= mymob.blind - - mymob.damageoverlay = new /obj/screen() - mymob.damageoverlay.icon = 'icons/mob/screen1_full.dmi' - mymob.damageoverlay.icon_state = "oxydamageoverlay0" - mymob.damageoverlay.name = "dmg" - mymob.damageoverlay.screen_loc = "1,1" - mymob.damageoverlay.mouse_opacity = 0 - mymob.damageoverlay.layer = 18.1 //The black screen overlay sets layer to 18 to display it, this one has to be just on top. - hud_elements |= mymob.damageoverlay - - mymob.flash = new /obj/screen() - mymob.flash.icon = ui_style - mymob.flash.icon_state = "blank" - mymob.flash.name = "flash" - mymob.flash.screen_loc = ui_entire_screen - mymob.flash.layer = 17 - hud_elements |= mymob.flash - mymob.pain = new /obj/screen( null ) mymob.zone_sel = new /obj/screen/zone_sel( null ) @@ -365,8 +339,7 @@ mymob.client.screen += hud_elements mymob.client.screen += src.adding + src.hotkeybuttons - mymob.client.screen += mymob.client.void - inventory_shown = 0; + inventory_shown = 0 return diff --git a/code/_onclick/hud/other_mobs.dm b/code/_onclick/hud/other_mobs.dm index 76922e398c..30d4940c1f 100644 --- a/code/_onclick/hud/other_mobs.dm +++ b/code/_onclick/hud/other_mobs.dm @@ -5,14 +5,6 @@ /datum/hud/proc/ghost_hud() return -/datum/hud/proc/brain_hud(ui_style = 'icons/mob/screen1_Midnight.dmi') - mymob.blind = new /obj/screen() - mymob.blind.icon = 'icons/mob/screen1_full.dmi' - mymob.blind.icon_state = "blackimageoverlay" - mymob.blind.name = " " - mymob.blind.screen_loc = "1,1" - mymob.blind.layer = 0 - /datum/hud/proc/blob_hud(ui_style = 'icons/mob/screen1_Midnight.dmi') blobpwrdisplay = new /obj/screen() @@ -116,13 +108,6 @@ else if(istype(mymob,/mob/living/simple_animal/construct/harvester)) constructtype = "harvester" - mymob.flash = new /obj/screen() - mymob.flash.icon = 'icons/mob/screen1.dmi' - mymob.flash.icon_state = "blank" - mymob.flash.name = "flash" - mymob.flash.screen_loc = ui_entire_screen - mymob.flash.layer = 17 - if(constructtype) mymob.fire = new /obj/screen() mymob.fire.icon = 'icons/mob/screen1_construct.dmi' @@ -155,5 +140,5 @@ mymob.client.screen = list() - mymob.client.screen += list(mymob.fire, mymob.healths, mymob.pullin, mymob.zone_sel, mymob.purged, mymob.flash) - mymob.client.screen += mymob.client.void + mymob.client.screen += list(mymob.fire, mymob.healths, mymob.pullin, mymob.zone_sel, mymob.purged) +// mymob.client.screen += mymob.client.void diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index c6783e7bf7..c33eb9edf2 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -173,21 +173,6 @@ var/obj/screen/robot_inventory mymob.pullin.screen_loc = ui_borg_pull src.other += mymob.pullin - mymob.blind = new /obj/screen() - mymob.blind.icon = 'icons/mob/screen1_full.dmi' - mymob.blind.icon_state = "blackimageoverlay" - mymob.blind.name = " " - mymob.blind.screen_loc = "1,1" - mymob.blind.layer = 0 - - mymob.flash = new /obj/screen() - mymob.flash.icon = ui_style - mymob.flash.icon_state = "blank" - mymob.flash.name = "flash" - mymob.flash.screen_loc = ui_entire_screen - mymob.flash.layer = 17 - src.other += mymob.flash - mymob.zone_sel = new /obj/screen/zone_sel() mymob.zone_sel.icon = ui_style mymob.zone_sel.alpha = ui_alpha @@ -210,9 +195,9 @@ var/obj/screen/robot_inventory mymob.client.screen = list() - mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.fire, mymob.hands, mymob.healths, mymob:cells, mymob.pullin, mymob.blind, mymob.flash, robot_inventory, mymob.gun_setting_icon) + mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.fire, mymob.hands, mymob.healths, mymob:cells, mymob.pullin, robot_inventory, mymob.gun_setting_icon) mymob.client.screen += src.adding + src.other - mymob.client.screen += mymob.client.void +// mymob.client.screen += mymob.client.void return diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 3cb41cc872..91d802c8bf 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -465,7 +465,6 @@ var/list/sacrificed = list() break D.universal_speak = 1 D.status_flags &= ~GODMODE - D.s_tone = 35 D.b_eyes = 200 D.r_eyes = 200 D.g_eyes = 200 @@ -1052,7 +1051,7 @@ var/list/sacrificed = list() for(var/mob/living/L in viewers(src)) if(iscarbon(L)) var/mob/living/carbon/C = L - flick("e_flash", C.flash) + C.flash_eyes() if(C.stuttering < 1 && (!(HULK in C.mutations))) C.stuttering = 1 C.Weaken(1) @@ -1081,7 +1080,7 @@ var/list/sacrificed = list() admin_attack_log(usr, T, "Used a stun rune.", "Was victim of a stun rune.", "used a stun rune on") else if(iscarbon(T)) var/mob/living/carbon/C = T - flick("e_flash", C.flash) + C.flash_eyes() if (!(HULK in C.mutations)) C.silent += 15 C.Weaken(25) diff --git a/code/game/gamemodes/endgame/supermatter_cascade/universe.dm b/code/game/gamemodes/endgame/supermatter_cascade/universe.dm index 3374f8f9be..d42d684d56 100644 --- a/code/game/gamemodes/endgame/supermatter_cascade/universe.dm +++ b/code/game/gamemodes/endgame/supermatter_cascade/universe.dm @@ -43,7 +43,7 @@ var/global/universe_has_ended = 0 world << sound('sound/effects/cascade.ogg') for(var/mob/M in player_list) - flick("e_flash", M.flash) + M.flash_eyes() if(emergency_shuttle.can_recall()) priority_announcement.Announce("The emergency shuttle has returned due to bluespace distortion.") @@ -122,6 +122,6 @@ The access requirements on the Asteroid Shuttles' consoles have now been revoked continue if(M.current.stat!=2) M.current.Weaken(10) - flick("e_flash", M.current.flash) + M.current.flash_eyes() clear_antag_roles(M) diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index c7c1d59a08..7532cb1407 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -77,11 +77,12 @@ if(!E) return if(E.is_bruised() && prob(E.damage + 50)) - flick("e_flash", O:flash) + H.flash_eyes() E.damage += rand(1, 5) else - if(!O.blinded) - flick("flash", O:flash) + if(!O.blinded && isliving(O)) + var/mob/living/L = O + L.flash_eyes() O.Weaken(flash_time) /obj/machinery/flasher/emp_act(severity) diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index ae18aed86c..d143220935 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -80,7 +80,7 @@ flash_strength *= H.species.flash_mod if(flash_strength > 0) M.Weaken(flash_strength) - flick("e_flash", M.flash) + M.flash_eyes() else flashfail = 1 @@ -158,7 +158,7 @@ var/safety = M:eyecheck() if(!safety) if(!M.blinded) - flick("flash", M.flash) + M.flash_eyes() return @@ -177,7 +177,7 @@ var/safety = M.eyecheck() if(safety <= 0) M.Weaken(10) - flick("e_flash", M.flash) + M.flash_eyes() for(var/mob/O in viewers(M, null)) O.show_message("[M] is blinded by the flash!") ..() diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index c3fcf893ac..6a68d555b0 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -79,9 +79,9 @@ user << "\The [M]'s pupils narrow slightly, but are still very dilated." else user << "\The [M]'s pupils narrow." - + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) //can be used offensively - flick("flash", M.flash) + M.flash_eyes() else return ..() diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index 17616942c1..a38c66333c 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -40,7 +40,7 @@ //Flashing everyone if(eye_safety < 1) - flick("e_flash", M.flash) + M.flash_eyes() M.Stun(2) M.Weaken(10) diff --git a/code/game/objects/items/weapons/grenades/spawnergrenade.dm b/code/game/objects/items/weapons/grenades/spawnergrenade.dm index 5ca0bd3845..8e112d9655 100644 --- a/code/game/objects/items/weapons/grenades/spawnergrenade.dm +++ b/code/game/objects/items/weapons/grenades/spawnergrenade.dm @@ -18,7 +18,7 @@ playsound(T, 'sound/effects/phasein.ogg', 100, 1) for(var/mob/living/carbon/human/M in viewers(T, null)) if(M:eyecheck() <= 0) - flick("e_flash", M.flash) + M.flash_eyes() // Spawn some hostile syndicate critters for(var/i=1, i<=deliveryamt, i++) diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 336231e530..a32b65e519 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -157,7 +157,7 @@ nanomanager.send_resources(src) if(!void) - void = new() + void = void.MakeGreed() screen += void if(prefs.lastchangelog != changelog_hash) //bolds the changelog button on the interface so we know there are updates. diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 8e9155d044..1c93444aad 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -450,7 +450,7 @@ var/list/mining_overlay_cache = list() if(prob(50)) M.adjustBruteLoss(5) else - flick("flash",M.flash) + M.flash_eyes() if(prob(50)) M.Stun(5) M.apply_effect(25, IRRADIATE) diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm index 4b6598cf1b..c867e642b4 100644 --- a/code/modules/mob/death.dm +++ b/code/modules/mob/death.dm @@ -66,9 +66,6 @@ layer = MOB_LAYER - if(blind && client) - blind.layer = 0 - sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS see_in_dark = 8 see_invisible = SEE_INVISIBLE_LEVEL_TWO diff --git a/code/modules/mob/living/carbon/alien/alien_damage.dm b/code/modules/mob/living/carbon/alien/alien_damage.dm index 99c5e52f75..f2d147641f 100644 --- a/code/modules/mob/living/carbon/alien/alien_damage.dm +++ b/code/modules/mob/living/carbon/alien/alien_damage.dm @@ -1,7 +1,7 @@ /mob/living/carbon/alien/ex_act(severity) if(!blinded) - flick("flash", flash) + flash_eyes() var/b_loss = null var/f_loss = null diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index 9352ada1c5..a7764d3d1d 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -124,21 +124,16 @@ if (client) client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired) - if ((blind && stat != 2)) + if ( stat != 2) if ((blinded)) - blind.layer = 18 + overlay_fullscreen("blind", /obj/screen/fullscreen/blind) else - blind.layer = 0 - if (disabilities & NEARSIGHTED) - client.screen += global_hud.vimpaired - if (eye_blurry) - client.screen += global_hud.blurry - if (druggy) - client.screen += global_hud.druggy - - if (stat != 2) - if (machine) - if ( machine.check_eye(src) < 0) + clear_fullscreen("blind") + set_fullscreen(disabilities & NEARSIGHTED, "impaired", /obj/screen/fullscreen/impaired, 1) + set_fullscreen(eye_blurry, "blurry", /obj/screen/fullscreen/blurry) + set_fullscreen(druggy, "high", /obj/screen/fullscreen/high) + if(machine) + if(machine.check_eye(src) < 0) reset_view(null) else if(client && !client.adminobs) diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm index 29ef1a2484..cb889b570f 100644 --- a/code/modules/mob/living/carbon/brain/life.dm +++ b/code/modules/mob/living/carbon/brain/life.dm @@ -208,22 +208,15 @@ if (client) client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired) - if ((blind && stat != 2)) - if ((blinded)) - blind.layer = 18 - else - blind.layer = 0 - - if (disabilities & NEARSIGHTED) - client.screen += global_hud.vimpaired - - if (eye_blurry) - client.screen += global_hud.blurry - - if (druggy) - client.screen += global_hud.druggy - if (stat != 2) + if ((blinded)) + overlay_fullscreen("blind", /obj/screen/fullscreen/blind) + else + clear_fullscreen("blind") + set_fullscreen(disabilities & NEARSIGHTED, "impaired", /obj/screen/fullscreen/impaired, 1) + set_fullscreen(eye_blurry, "blurry", /obj/screen/fullscreen/blurry) + set_fullscreen(druggy, "high", /obj/screen/fullscreen/high) + if (machine) if (!( machine.check_eye(src) )) reset_view(null) @@ -239,17 +232,4 @@ reset_view(null) else if(client && !client.adminobs) - reset_view(null) - -/*/mob/living/carbon/brain/emp_act(severity) - if(!(container && istype(container, /obj/item/device/mmi))) - return - else - switch(severity) - if(1) - emp_damage += rand(20,30) - if(2) - emp_damage += rand(10,20) - if(3) - emp_damage += rand(0,10) - ..()*/ + reset_view(null) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 99a4c40ebd..d6a88f35ff 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -84,7 +84,7 @@ /mob/living/carbon/human/ex_act(severity) if(!blinded) - flick("flash", flash) + flash_eyes() var/shielded = 0 var/b_loss = null @@ -774,13 +774,6 @@ b_eyes = hex2num(copytext(new_eyes, 6, 8)) update_eyes() - var/new_tone = input("Please select skin tone level: 1-220 (1=albino, 35=caucasian, 150=black, 220='very' black)", "Character Generation", "[35-s_tone]") as text - - if (!new_tone) - new_tone = 35 - s_tone = max(min(round(text2num(new_tone)), 220), 1) - s_tone = -s_tone + 35 - // hair var/list/all_hairs = typesof(/datum/sprite_accessory/hair) - /datum/sprite_accessory/hair var/list/hairs = list() diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 2030f3407d..80798fa57b 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -32,7 +32,6 @@ var/temperature_alert = 0 var/in_stasis = 0 var/heartbeat = 0 - var/global/list/overlays_cache = null /mob/living/carbon/human/Life() set invisibility = 0 @@ -1012,33 +1011,6 @@ return 1 /mob/living/carbon/human/handle_regular_hud_updates() - if(!overlays_cache) - overlays_cache = list() - overlays_cache.len = 23 - overlays_cache[1] = image('icons/mob/screen1_full.dmi', "icon_state" = "passage1") - overlays_cache[2] = image('icons/mob/screen1_full.dmi', "icon_state" = "passage2") - overlays_cache[3] = image('icons/mob/screen1_full.dmi', "icon_state" = "passage3") - overlays_cache[4] = image('icons/mob/screen1_full.dmi', "icon_state" = "passage4") - overlays_cache[5] = image('icons/mob/screen1_full.dmi', "icon_state" = "passage5") - overlays_cache[6] = image('icons/mob/screen1_full.dmi', "icon_state" = "passage6") - overlays_cache[7] = image('icons/mob/screen1_full.dmi', "icon_state" = "passage7") - overlays_cache[8] = image('icons/mob/screen1_full.dmi', "icon_state" = "passage8") - overlays_cache[9] = image('icons/mob/screen1_full.dmi', "icon_state" = "passage9") - overlays_cache[10] = image('icons/mob/screen1_full.dmi', "icon_state" = "passage10") - overlays_cache[11] = image('icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay1") - overlays_cache[12] = image('icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay2") - overlays_cache[13] = image('icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay3") - overlays_cache[14] = image('icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay4") - overlays_cache[15] = image('icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay5") - overlays_cache[16] = image('icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay6") - overlays_cache[17] = image('icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay7") - overlays_cache[18] = image('icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay1") - overlays_cache[19] = image('icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay2") - overlays_cache[20] = image('icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay3") - overlays_cache[21] = image('icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay4") - overlays_cache[22] = image('icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay5") - overlays_cache[23] = image('icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay6") - if(hud_updateflag) // update our mob's hud overlays, AKA what others see flaoting above our head handle_hud_list() @@ -1057,75 +1029,53 @@ var/obj/machinery/camera/cam = client.eye client.screen |= cam.client_huds - if(damageoverlay.overlays) - damageoverlay.overlays = list() - - if(stat == UNCONSCIOUS) + if(stat == UNCONSCIOUS && health <= 0) //Critical damage passage overlay - if(health <= 0) - var/image/I - switch(health) - if(-20 to -10) - I = overlays_cache[1] - if(-30 to -20) - I = overlays_cache[2] - if(-40 to -30) - I = overlays_cache[3] - if(-50 to -40) - I = overlays_cache[4] - if(-60 to -50) - I = overlays_cache[5] - if(-70 to -60) - I = overlays_cache[6] - if(-80 to -70) - I = overlays_cache[7] - if(-90 to -80) - I = overlays_cache[8] - if(-95 to -90) - I = overlays_cache[9] - if(-INFINITY to -95) - I = overlays_cache[10] - damageoverlay.overlays += I + var/severity = 0 + switch(health) + if(-20 to -10) severity = 1 + if(-30 to -20) severity = 2 + if(-40 to -30) severity = 3 + if(-50 to -40) severity = 4 + if(-60 to -50) severity = 5 + if(-70 to -60) severity = 6 + if(-80 to -70) severity = 7 + if(-90 to -80) severity = 8 + if(-95 to -90) severity = 9 + if(-INFINITY to -95) severity = 10 + overlay_fullscreen("crit", /obj/screen/fullscreen/crit, severity) else + clear_fullscreen("crit") //Oxygen damage overlay if(oxyloss) - var/image/I + var/severity = 0 switch(oxyloss) - if(10 to 20) - I = overlays_cache[11] - if(20 to 25) - I = overlays_cache[12] - if(25 to 30) - I = overlays_cache[13] - if(30 to 35) - I = overlays_cache[14] - if(35 to 40) - I = overlays_cache[15] - if(40 to 45) - I = overlays_cache[16] - if(45 to INFINITY) - I = overlays_cache[17] - damageoverlay.overlays += I + if(10 to 20) severity = 1 + if(20 to 25) severity = 2 + if(25 to 30) severity = 3 + if(30 to 35) severity = 4 + if(35 to 40) severity = 5 + if(40 to 45) severity = 6 + if(45 to INFINITY) severity = 7 + overlay_fullscreen("oxy", /obj/screen/fullscreen/oxy, severity) + else + clear_fullscreen("oxy") //Fire and Brute damage overlay (BSSR) var/hurtdamage = src.getBruteLoss() + src.getFireLoss() + damageoverlaytemp damageoverlaytemp = 0 // We do this so we can detect if someone hits us or not. if(hurtdamage) - var/image/I + var/severity = 0 switch(hurtdamage) - if(10 to 25) - I = overlays_cache[18] - if(25 to 40) - I = overlays_cache[19] - if(40 to 55) - I = overlays_cache[20] - if(55 to 70) - I = overlays_cache[21] - if(70 to 85) - I = overlays_cache[22] - if(85 to INFINITY) - I = overlays_cache[23] - damageoverlay.overlays += I + if(10 to 25) severity = 1 + if(25 to 40) severity = 2 + if(40 to 55) severity = 3 + if(55 to 70) severity = 4 + if(70 to 85) severity = 5 + if(85 to INFINITY) severity = 6 + overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) + else + clear_fullscreen("brute") if( stat == DEAD ) sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS|SEE_SELF @@ -1269,20 +1219,20 @@ bodytemp.icon_state = "temp-1" else bodytemp.icon_state = "temp0" - if(blind) - if(blinded) blind.layer = 18 - else blind.layer = 0 + + if(blinded) overlay_fullscreen("blind", /obj/screen/fullscreen/blind) + else clear_fullscreens() if(disabilities & NEARSIGHTED) //this looks meh but saves a lot of memory by not requiring to add var/prescription if(glasses) //to every /obj/item var/obj/item/clothing/glasses/G = glasses if(!G.prescription) - client.screen += global_hud.vimpaired + set_fullscreen(disabilities & NEARSIGHTED, "impaired", /obj/screen/fullscreen/impaired, 1) else - client.screen += global_hud.vimpaired + set_fullscreen(disabilities & NEARSIGHTED, "impaired", /obj/screen/fullscreen/impaired, 1) - if(eye_blurry) client.screen += global_hud.blurry - if(druggy) client.screen += global_hud.druggy + set_fullscreen(eye_blurry, "blurry", /obj/screen/fullscreen/blurry) + set_fullscreen(druggy, "high", /obj/screen/fullscreen/high) if(config.welder_vision) var/found_welder @@ -1684,4 +1634,4 @@ ..() #undef HUMAN_MAX_OXYLOSS -#undef HUMAN_CRIT_MAX_OXYLOSS +#undef HUMAN_CRIT_MAX_OXYLOSS \ No newline at end of file diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm new file mode 100644 index 0000000000..d6c2bc0405 --- /dev/null +++ b/code/modules/mob/living/death.dm @@ -0,0 +1,3 @@ +/mob/living/death() + clear_fullscreens() + . = ..() \ No newline at end of file diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 3d86a1c3f1..4d2e254d30 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -454,6 +454,7 @@ default behaviour is: BITSET(hud_updateflag, LIFE_HUD) failed_last_breath = 0 //So mobs that died of oxyloss don't revive and have perpetual out of breath. + reload_fullscreen() return @@ -630,9 +631,7 @@ default behaviour is: resisting++ switch(G.state) if(GRAB_PASSIVE) - if(!incapacitated(INCAPACITATION_KNOCKDOWN)) - visible_message("[src] has broken free of [G.assailant]'s grip!") - qdel(G) + qdel(G) if(GRAB_AGGRESSIVE) //Not standing up makes it much harder to break, so it is easier to cuff someone who is down without forcing them into unconsciousness. //Otherwise, it's the same chance of breaking the grab as disarm. @@ -662,6 +661,15 @@ default behaviour is: return 0 return ..() +//called when the mob receives a bright flash +/mob/living/flash_eyes(intensity = FLASH_PROTECTION_MODERATE, override_blindness_check = FALSE, affect_silicon = FALSE, visual = FALSE, type = /obj/screen/fullscreen/flash) + if(override_blindness_check || !(disabilities & BLIND)) + overlay_fullscreen("flash", type) + spawn(25) + if(src) + clear_fullscreen("flash", 25) + return 1 + /mob/living/proc/handle_ventcrawl(var/obj/machinery/atmospherics/unary/vent_pump/vent_found = null, var/ignore_items = 0) // -- TLE -- Merged by Carn if(stat) src << "You must be conscious to do this!" @@ -669,7 +677,6 @@ default behaviour is: if(lying) src << "You can't vent crawl while you're stunned!" return - var/special_fail_msg = cannot_use_vents() if(special_fail_msg) src << "[special_fail_msg]" diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index b5ddfcedd9..5c6b617a7b 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -56,18 +56,18 @@ if (aiRestorePowerRoutine==2) src << "Alert cancelled. Power has been restored without our assistance." aiRestorePowerRoutine = 0 - src.blind.layer = 0 + clear_fullscreen("blind") updateicon() return else if (aiRestorePowerRoutine==3) src << "Alert cancelled. Power has been restored." aiRestorePowerRoutine = 0 - src.blind.layer = 0 + clear_fullscreen("blind") updateicon() return else if (APU_power) aiRestorePowerRoutine = 0 - src.blind.layer = 0 + clear_fullscreen("blind") updateicon() return else @@ -79,9 +79,7 @@ //Blind the AI updateicon() - src.blind.screen_loc = ui_entire_screen - if (src.blind.layer!=18) - src.blind.layer = 18 + overlay_fullscreen("blind", /obj/screen/fullscreen/blind) src.sight = src.sight&~SEE_TURFS src.sight = src.sight&~SEE_MOBS src.sight = src.sight&~SEE_OBJS @@ -99,7 +97,7 @@ if (!istype(T, /turf/space)) src << "Alert cancelled. Power has been restored without our assistance." aiRestorePowerRoutine = 0 - src.blind.layer = 0 + clear_fullscreen("blind") return src << "Fault confirmed: missing external power. Shutting down main control system to save power." sleep(20) @@ -129,7 +127,7 @@ if (!istype(T, /turf/space)) src << "Alert cancelled. Power has been restored without our assistance." aiRestorePowerRoutine = 0 - src.blind.layer = 0 //This, too, is a fix to issue 603 + clear_fullscreen("blind") //This, too, is a fix to issue 603 return switch(PRP) if (1) src << "APC located. Optimizing route to APC to avoid needless power waste." diff --git a/code/modules/mob/living/silicon/ai/login.dm b/code/modules/mob/living/silicon/ai/login.dm index 76625cdc3d..fa06162c31 100644 --- a/code/modules/mob/living/silicon/ai/login.dm +++ b/code/modules/mob/living/silicon/ai/login.dm @@ -2,19 +2,6 @@ ..() for(var/obj/effect/rune/rune in rune_list) client.images += rune.blood_image - regenerate_icons() - flash = new /obj/screen() - flash.icon_state = "blank" - flash.name = "flash" - flash.screen_loc = ui_entire_screen - flash.layer = 17 - blind = new /obj/screen() - blind.icon_state = "black" - blind.name = " " - blind.screen_loc = ui_entire_screen - blind.layer = 0 - client.screen.Add( blind, flash ) - if(stat != DEAD) for(var/obj/machinery/ai_status_display/O in machines) //change status O.mode = 1 diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index a44be64253..26fe14d7d1 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -275,29 +275,21 @@ // if (src.oxygen) src.oxygen.icon_state = "oxy[src.oxygen_alert ? 1 : 0]" // if (src.fire) src.fire.icon_state = "fire[src.fire_alert ? 1 : 0]" - client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired) - - if ((src.blind && src.stat != 2)) - if(src.blinded) - src.blind.layer = 18 + if(stat != 2) + if(blinded) + overlay_fullscreen("blind", /obj/screen/fullscreen/blind) else - src.blind.layer = 0 - if (src.disabilities & NEARSIGHTED) - src.client.screen += global_hud.vimpaired + clear_fullscreen("blind") + set_fullscreen(disabilities & NEARSIGHTED, "impaired", /obj/screen/fullscreen/impaired, 1) + set_fullscreen(eye_blurry, "blurry", /obj/screen/fullscreen/blurry) + set_fullscreen(druggy, "high", /obj/screen/fullscreen/high) - if (src.eye_blurry) - src.client.screen += global_hud.blurry - - if (src.druggy) - src.client.screen += global_hud.druggy - - if (src.stat != 2) - if (src.machine) - if (src.machine.check_eye(src) < 0) - src.reset_view(null) - else - if(client && !client.adminobs) - reset_view(null) + if (src.machine) + if (src.machine.check_eye(src) < 0) + src.reset_view(null) + else + if(client && !client.adminobs) + reset_view(null) return 1 diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 5a13c7bb79..8a8bd0a274 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -67,7 +67,7 @@ if(2) src.take_organ_damage(0,10,emp=1) confused = (min(confused + 2, 30)) - flick("noise", src.flash) + flash_eyes(affect_silicon = 1) src << "*BZZZT*" src << "Warning: Electromagnetic pulse detected." ..() @@ -264,7 +264,7 @@ /mob/living/silicon/ex_act(severity) if(!blinded) - flick("flash", flash) + flash_eyes() switch(severity) if(1.0) @@ -361,3 +361,7 @@ ..() if(cameraFollow) cameraFollow = null + +/mob/living/silicon/flash_eyes(intensity = FLASH_PROTECTION_MODERATE, override_blindness_check = FALSE, affect_silicon = FALSE, visual = FALSE, type = /obj/screen/fullscreen/flash) + if(affect_silicon) + return ..() \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 8439643fe5..e7228e578c 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -380,7 +380,7 @@ /mob/living/simple_animal/ex_act(severity) if(!blinded) - flick("flash", flash) + flash_eyes() switch (severity) if (1.0) adjustBruteLoss(500) diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index 7f6fdd8aab..90b2cb2866 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -44,6 +44,7 @@ else client.eye = src client.perspective = MOB_PERSPECTIVE - + reload_fullscreen() // Reload any fullscreen overlays this mob has. +// add_click_catcher() //set macro to normal incase it was overriden (like cyborg currently does) winset(src, null, "mainwindow.macro=macro hotkey_toggle.is-checked=false input.focus=true input.background-color=#D3B5B5") diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index e59914791a..081eb39a5c 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -4,6 +4,7 @@ living_mob_list -= src unset_machine() qdel(hud_used) + clear_fullscreen() if(client) for(var/obj/screen/movable/spell_master/spell_master in spell_masters) qdel(spell_master) @@ -17,8 +18,6 @@ ..() /mob/proc/remove_screen_obj_references() - flash = null - blind = null hands = null pullin = null purged = null @@ -33,7 +32,6 @@ throw_icon = null nutrition_icon = null pressure = null - damageoverlay = null pain = null item_use_icon = null gun_move_icon = null @@ -360,8 +358,8 @@ var/deathtimeseconds = round((deathtime - deathtimeminutes * 600) / 10,1) usr << "You have been dead for[pluralcheck] [deathtimeseconds] seconds." - if (deathtime < (15 * 600)) - usr << "You must wait 15 minutes to respawn!" + if (deathtime < (5 * 600)) + usr << "You must wait 5 minutes to respawn!" return else usr << "You can respawn now, enjoy your new life!" diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index f814ac2b23..b67e58af3e 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -10,8 +10,6 @@ //Not in use yet var/obj/effect/organstructure/organStructure = null - var/obj/screen/flash = null - var/obj/screen/blind = null var/obj/screen/hands = null var/obj/screen/pullin = null var/obj/screen/purged = null @@ -26,7 +24,6 @@ var/obj/screen/throw_icon = null var/obj/screen/nutrition_icon = null var/obj/screen/pressure = null - var/obj/screen/damageoverlay = null var/obj/screen/pain = null var/obj/screen/gun/item/item_use_icon = null var/obj/screen/gun/radio/radio_use_icon = null diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 5271034d2b..22da202ede 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -570,4 +570,7 @@ var/list/global/organ_rel_size = list( "r_hand" = 10, "l_foot" = 10, "r_foot" = 10, -) \ No newline at end of file +) + +/mob/proc/flash_eyes(intensity = FLASH_PROTECTION_MODERATE, override_blindness_check = FALSE, affect_silicon = FALSE, visual = FALSE, type = /obj/screen/fullscreen/flash) + return \ No newline at end of file diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index 66155da7ea..a670ff47e8 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -23,7 +23,7 @@ //blind adjacent people for (var/mob/living/carbon/M in viewers(T, flash_range)) if(M.eyecheck() < 1) - flick("e_flash", M.flash) + M.flash_eyes() //snap pop playsound(src, 'sound/effects/snap.ogg', 50, 1) diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index e9c3df5098..a2938bb56d 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -622,7 +622,7 @@ if(istype(M:glasses, /obj/item/clothing/glasses/sunglasses)) continue - flick("e_flash", M.flash) + M.flash_eyes() M.Weaken(15) if(4 to 5) @@ -630,7 +630,7 @@ if(istype(M:glasses, /obj/item/clothing/glasses/sunglasses)) continue - flick("e_flash", M.flash) + M.flash_eyes() M.Stun(5) /datum/chemical_reaction/emp_pulse @@ -1003,7 +1003,7 @@ if(holder.my_atom && istype(holder.my_atom, required)) return ..() return 0 - + /datum/chemical_reaction/slime/golem name = "Prometheans" id = "m_promethean" @@ -1016,7 +1016,7 @@ var/location = get_turf(holder.my_atom) new /obj/item/slime_cube(location) qdel(holder.my_atom) - + /* Food */ /datum/chemical_reaction/tofu @@ -1499,7 +1499,7 @@ name = "Allies Cocktail" id = "alliescocktail" result = "alliescocktail" - required_reagents = list("classicmartini" = 1, "vodka" = 1) + required_reagents = list("martini" = 1, "vodka" = 1) result_amount = 2 /datum/chemical_reaction/demonsblood diff --git a/code/modules/spells/targeted/equip/horsemask.dm b/code/modules/spells/targeted/equip/horsemask.dm index 92b85fdb36..c52f75acee 100644 --- a/code/modules/spells/targeted/equip/horsemask.dm +++ b/code/modules/spells/targeted/equip/horsemask.dm @@ -26,7 +26,7 @@ for(var/mob/living/target in targets) target.visible_message( "[target]'s face lights up in fire, and after the event a horse's head takes its place!", \ "Your face burns up, and shortly after the fire you realise you have the face of a horse!") - flick("e_flash", target.flash) + target.flash_eyes() /spell/targeted/equip_item/horsemask/summon_item(var/new_type) var/obj/item/new_item = new new_type diff --git a/icons/mob/screen_full.dmi b/icons/mob/screen_full.dmi new file mode 100644 index 0000000000..e84b054695 Binary files /dev/null and b/icons/mob/screen_full.dmi differ diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi new file mode 100644 index 0000000000..cf74d73796 Binary files /dev/null and b/icons/mob/screen_gen.dmi differ diff --git a/polaris.dme b/polaris.dme index 2e3d026be1..7e4d5ec9f7 100644 --- a/polaris.dme +++ b/polaris.dme @@ -63,6 +63,7 @@ #include "code\_helpers\type2type.dm" #include "code\_helpers\unsorted.dm" #include "code\_helpers\vector.dm" +#include "code\_onclick\_defines.dm" #include "code\_onclick\adjacent.dm" #include "code\_onclick\ai.dm" #include "code\_onclick\click.dm" @@ -77,6 +78,7 @@ #include "code\_onclick\hud\action.dm" #include "code\_onclick\hud\ai.dm" #include "code\_onclick\hud\alien_larva.dm" +#include "code\_onclick\hud\fullscreen.dm" #include "code\_onclick\hud\gun_mode.dm" #include "code\_onclick\hud\hud.dm" #include "code\_onclick\hud\human.dm" @@ -1342,6 +1344,7 @@ #include "code\modules\mob\language\synthetic.dm" #include "code\modules\mob\living\autohiss.dm" #include "code\modules\mob\living\damage_procs.dm" +#include "code\modules\mob\living\death.dm" #include "code\modules\mob\living\default_language.dm" #include "code\modules\mob\living\inventory.dm" #include "code\modules\mob\living\life.dm"