From 1131c76d45bcf35072f04c859b6ca4e26e357732 Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Fri, 27 Mar 2015 14:16:48 +0100 Subject: [PATCH] Cult visual network. Implementation of a cult visual network, similar to the original camera network. Includes the "eye" itself and the initial construction of a mob that can control one. --- baystation12.dme | 20 +++- code/__HELPERS/global_lists.dm | 5 + code/_onclick/eye.dm | 7 ++ code/_onclick/hud/hud.dm | 8 +- code/game/gamemodes/cult/cult.dm | 2 +- code/game/machinery/doors/door.dm | 3 - .../ai/freelook => freelook/ai}/cameranet.dm | 2 - .../ai/freelook => freelook/ai}/chunk.dm | 0 .../ai/freelook => freelook/ai}/eye.dm | 0 .../ai}/update_triggers.dm | 0 code/modules/mob/freelook/chunk.dm | 4 +- code/modules/mob/freelook/eye.dm | 50 ++++---- code/modules/mob/freelook/life.dm | 7 ++ code/modules/mob/freelook/mask/chunk.dm | 39 +++++++ code/modules/mob/freelook/mask/cultnet.dm | 15 +++ code/modules/mob/freelook/mask/eye.dm | 36 ++++++ .../mob/freelook/mask/update_triggers.dm | 50 ++++++++ .../silicon/ai => }/freelook/read_me.dm | 0 code/modules/mob/freelook/visualnet.dm | 2 - .../living/simple_animal/hostile/faithless.dm | 2 +- .../mob/living/simple_animal/narsie/login.dm | 3 + .../mob/living/simple_animal/narsie/logout.dm | 3 + .../mob/living/simple_animal/narsie/narsie.dm | 108 ++++++++++++++++++ .../modules/mob/living/simple_animal/shade.dm | 20 ++-- .../mob/living/simple_animal/simple_animal.dm | 2 +- code/setup.dm | 6 + icons/effects/cameravis.dmi | Bin 12360 -> 31637 bytes 27 files changed, 343 insertions(+), 51 deletions(-) create mode 100644 code/_onclick/eye.dm rename code/modules/mob/{living/silicon/ai/freelook => freelook/ai}/cameranet.dm (93%) rename code/modules/mob/{living/silicon/ai/freelook => freelook/ai}/chunk.dm (100%) rename code/modules/mob/{living/silicon/ai/freelook => freelook/ai}/eye.dm (100%) rename code/modules/mob/{living/silicon/ai/freelook => freelook/ai}/update_triggers.dm (100%) create mode 100644 code/modules/mob/freelook/life.dm create mode 100644 code/modules/mob/freelook/mask/chunk.dm create mode 100644 code/modules/mob/freelook/mask/cultnet.dm create mode 100644 code/modules/mob/freelook/mask/eye.dm create mode 100644 code/modules/mob/freelook/mask/update_triggers.dm rename code/modules/mob/{living/silicon/ai => }/freelook/read_me.dm (100%) create mode 100644 code/modules/mob/living/simple_animal/narsie/login.dm create mode 100644 code/modules/mob/living/simple_animal/narsie/logout.dm create mode 100644 code/modules/mob/living/simple_animal/narsie/narsie.dm diff --git a/baystation12.dme b/baystation12.dme index fbf18f8a94b..a9282a6a5dd 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -37,6 +37,7 @@ #include "code\_onclick\click.dm" #include "code\_onclick\cyborg.dm" #include "code\_onclick\drag_drop.dm" +#include "code\_onclick\eye.dm" #include "code\_onclick\item_attack.dm" #include "code\_onclick\observer.dm" #include "code\_onclick\other_mobs.dm" @@ -1049,13 +1050,24 @@ #include "code\modules\mob\typing_indicator.dm" #include "code\modules\mob\update_icons.dm" #include "code\modules\mob\dead\death.dm" +#include "code\modules\mob\dead\observer\login.dm" #include "code\modules\mob\dead\observer\logout.dm" #include "code\modules\mob\dead\observer\observer.dm" #include "code\modules\mob\dead\observer\say.dm" #include "code\modules\mob\freelook\chunk.dm" #include "code\modules\mob\freelook\eye.dm" +#include "code\modules\mob\freelook\life.dm" +#include "code\modules\mob\freelook\read_me.dm" #include "code\modules\mob\freelook\update_triggers.dm" #include "code\modules\mob\freelook\visualnet.dm" +#include "code\modules\mob\freelook\ai\cameranet.dm" +#include "code\modules\mob\freelook\ai\chunk.dm" +#include "code\modules\mob\freelook\ai\eye.dm" +#include "code\modules\mob\freelook\ai\update_triggers.dm" +#include "code\modules\mob\freelook\mask\chunk.dm" +#include "code\modules\mob\freelook\mask\cultnet.dm" +#include "code\modules\mob\freelook\mask\eye.dm" +#include "code\modules\mob\freelook\mask\update_triggers.dm" #include "code\modules\mob\language\generic.dm" #include "code\modules\mob\language\language.dm" #include "code\modules\mob\language\outsider.dm" @@ -1176,11 +1188,6 @@ #include "code\modules\mob\living\silicon\ai\logout.dm" #include "code\modules\mob\living\silicon\ai\say.dm" #include "code\modules\mob\living\silicon\ai\subsystems.dm" -#include "code\modules\mob\living\silicon\ai\freelook\cameranet.dm" -#include "code\modules\mob\living\silicon\ai\freelook\chunk.dm" -#include "code\modules\mob\living\silicon\ai\freelook\eye.dm" -#include "code\modules\mob\living\silicon\ai\freelook\read_me.dm" -#include "code\modules\mob\living\silicon\ai\freelook\update_triggers.dm" #include "code\modules\mob\living\silicon\decoy\death.dm" #include "code\modules\mob\living\silicon\decoy\decoy.dm" #include "code\modules\mob\living\silicon\decoy\life.dm" @@ -1252,6 +1259,9 @@ #include "code\modules\mob\living\simple_animal\hostile\retaliate\clown.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\drone.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm" +#include "code\modules\mob\living\simple_animal\narsie\login.dm" +#include "code\modules\mob\living\simple_animal\narsie\logout.dm" +#include "code\modules\mob\living\simple_animal\narsie\narsie.dm" #include "code\modules\mob\new_player\login.dm" #include "code\modules\mob\new_player\logout.dm" #include "code\modules\mob\new_player\new_player.dm" diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 01b9509ae86..50c08172e1d 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -49,6 +49,11 @@ var/global/list/undershirt_t = list("White Tank top" = "u1", "Black Tank top" = //Backpacks var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt") var/global/list/exclude_jobs = list(/datum/job/ai,/datum/job/cyborg) + +// Visual nets +var/list/datum/visualnet/visual_nets = list() +var/datum/visualnet/camera/cameranet = new() +var/datum/visualnet/cult/cultnet = new() ////////////////////////// /////Initial Building///// ////////////////////////// diff --git a/code/_onclick/eye.dm b/code/_onclick/eye.dm new file mode 100644 index 00000000000..1c3282f23bb --- /dev/null +++ b/code/_onclick/eye.dm @@ -0,0 +1,7 @@ +/mob/living/simple_animal/shade/narsie/DblClickOn(var/atom/A, params) + if(client.buildmode) // comes after object.Click to allow buildmode gui objects to be clicked + build_click(src, client.buildmode, params, A) + return + + sanity_check_eye() + eyeobj.setLoc(A) diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index e9c5429dd2a..9c656b05110 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -33,7 +33,7 @@ var/list/global_huds = list( screen.screen_loc = "1,1" screen.icon = 'icons/obj/hud_full.dmi' screen.icon_state = icon_state - screen.layer = 17 + screen.layer = SCREEN_LAYER screen.mouse_opacity = 0 return screen @@ -259,11 +259,11 @@ datum/hud/New(mob/owner) if(!hud_used) usr << "\red This mob type does not use a HUD." return - + if(!ishuman(src)) usr << "\red Inventory hiding is currently only supported for human mobs, sorry." return - + if(!client) return if(client.view != world.view) return @@ -325,7 +325,7 @@ datum/hud/New(mob/owner) return if(client.view != world.view) return - + if(hud_used.hud_shown) hud_used.hud_shown = 0 if(src.hud_used.adding) diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 6a17d03a072..a1c0acf0081 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -8,4 +8,4 @@ required_enemies = 3 uplink_welcome = "Nar-Sie Uplink Console:" end_on_antag_death = 1 - antag_tag = MODE_CULTIST \ No newline at end of file + antag_tag = MODE_CULTIST diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index f677140cc3e..b57172dbff9 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -1,7 +1,4 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 -#define DOOR_OPEN_LAYER 2.7 //Under all objects if opened. 2.7 due to tables being at 2.6 -#define DOOR_CLOSED_LAYER 3.1 //Above most items if closed - #define DOOR_REPAIR_AMOUNT 50 //amount of health regained per stack amount used /obj/machinery/door diff --git a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm b/code/modules/mob/freelook/ai/cameranet.dm similarity index 93% rename from code/modules/mob/living/silicon/ai/freelook/cameranet.dm rename to code/modules/mob/freelook/ai/cameranet.dm index d2d042c778a..2fb3c4b5ced 100644 --- a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm +++ b/code/modules/mob/freelook/ai/cameranet.dm @@ -2,8 +2,6 @@ // // The datum containing all the chunks. -var/datum/visualnet/camera/cameranet = new() - /datum/visualnet/camera // The cameras on the map, no matter if they work or not. Updated in obj/machinery/camera.dm by New() and Del(). var/list/cameras = list() diff --git a/code/modules/mob/living/silicon/ai/freelook/chunk.dm b/code/modules/mob/freelook/ai/chunk.dm similarity index 100% rename from code/modules/mob/living/silicon/ai/freelook/chunk.dm rename to code/modules/mob/freelook/ai/chunk.dm diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/freelook/ai/eye.dm similarity index 100% rename from code/modules/mob/living/silicon/ai/freelook/eye.dm rename to code/modules/mob/freelook/ai/eye.dm diff --git a/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm b/code/modules/mob/freelook/ai/update_triggers.dm similarity index 100% rename from code/modules/mob/living/silicon/ai/freelook/update_triggers.dm rename to code/modules/mob/freelook/ai/update_triggers.dm diff --git a/code/modules/mob/freelook/chunk.dm b/code/modules/mob/freelook/chunk.dm index 8c6c7d043aa..9b6b562df33 100644 --- a/code/modules/mob/freelook/chunk.dm +++ b/code/modules/mob/freelook/chunk.dm @@ -101,7 +101,7 @@ var/turf/t = turf if(obscuredTurfs[t]) if(!t.obfuscations[obfuscation.type]) - t.obfuscations[obfuscation.type] = image(obfuscation.icon, t, obfuscation.icon_state, 15) + t.obfuscations[obfuscation.type] = image(obfuscation.icon, t, obfuscation.icon_state, OBFUSCATION_LAYER) obscured += t.obfuscations[obfuscation.type] for(var/eye in seenby) @@ -140,7 +140,7 @@ for(var/turf in obscuredTurfs) var/turf/t = turf if(!t.obfuscations[obfuscation.type]) - t.obfuscations[obfuscation.type] = image(obfuscation.icon, t, obfuscation.icon_state, 15) + t.obfuscations[obfuscation.type] = image(obfuscation.icon, t, obfuscation.icon_state, OBFUSCATION_LAYER) obscured += t.obfuscations[obfuscation.type] #undef UPDATE_BUFFER diff --git a/code/modules/mob/freelook/eye.dm b/code/modules/mob/freelook/eye.dm index 70ae8cb7002..318ed4da6e8 100644 --- a/code/modules/mob/freelook/eye.dm +++ b/code/modules/mob/freelook/eye.dm @@ -12,6 +12,7 @@ var/sprint = 10 var/cooldown = 0 var/acceleration = 1 + var/owner_follows_eye = 0 see_in_dark = 7 status_flags = GODMODE @@ -40,7 +41,9 @@ mob/eye/Del() ..() // Movement code. Returns 0 to stop air movement from moving it. -/mob/eye/Move() +/mob/eye/Move(n, direct) + if(owner == src) + EyeMove(n, direct) return 0 /mob/eye/examinate() @@ -60,15 +63,35 @@ mob/eye/Del() /mob/eye/proc/setLoc(var/T) if(owner) T = get_turf(T) - loc = T + if(T != loc) + loc = T - if(owner.client) - owner.client.eye = src + if(owner.client) + owner.client.eye = src - visualnet.visibility(src) - return 1 + if(owner_follows_eye) + visualnet.updateVisibility(owner, 0) + owner.loc = loc + visualnet.updateVisibility(owner, 0) + + visualnet.visibility(src) + return 1 return 0 +/mob/eye/proc/getLoc() + if(owner) + if(!isturf(owner.loc) || !owner.client) + return + return loc +/mob + var/mob/eye/eyeobj + +/mob/proc/EyeMove(n, direct) + if(!eyeobj) + return + + return eyeobj.EyeMove(n, direct) + /mob/eye/EyeMove(n, direct) var/initial = initial(sprint) var/max_sprint = 50 @@ -86,18 +109,3 @@ mob/eye/Del() sprint = min(sprint + 0.5, max_sprint) else sprint = initial - -/mob/eye/proc/getLoc() - if(owner) - if(!isturf(owner.loc) || !owner.client) - return - return loc - -/mob - var/mob/eye/eyeobj - -/mob/proc/EyeMove(n, direct) - if(!eyeobj) - return - - return eyeobj.EyeMove(n, direct) diff --git a/code/modules/mob/freelook/life.dm b/code/modules/mob/freelook/life.dm new file mode 100644 index 00000000000..1d1248e872e --- /dev/null +++ b/code/modules/mob/freelook/life.dm @@ -0,0 +1,7 @@ +/mob/eye/Life() + ..() + // If we lost our client, reset the list of visible chunks so they update properly on return + if(owner == src && !client) + visibleChunks.Cut() + /*else if(owner && !owner.client) + visibleChunks.Cut()*/ diff --git a/code/modules/mob/freelook/mask/chunk.dm b/code/modules/mob/freelook/mask/chunk.dm new file mode 100644 index 00000000000..b0973951cc2 --- /dev/null +++ b/code/modules/mob/freelook/mask/chunk.dm @@ -0,0 +1,39 @@ +// CULT CHUNK +// +// A 16x16 grid of the map with a list of turfs that can be seen, are visible and are dimmed. +// Allows the Eye to stream these chunks and know what it can and cannot see. + +/datum/obfuscation/cult + icon_state = "white" + +/datum/chunk/cult + obfuscation = new /datum/obfuscation/cult() + +/datum/chunk/cult/acquireVisibleTurfs(var/list/visible) + for(var/mob/living/L in living_mob_list) + for(var/turf/t in L.seen_turfs()) + visible[t] = t + +/mob/living/proc/seen_turfs() + return seen_turfs_in_range(src, 3) + +/mob/living/carbon/human/seen_turfs() + /*if(src.isSynthetic()) + return list()*/ + + if(mind in cult.current_antagonists) + return seen_turfs_in_range(src, client ? client.view : 7) + return ..() + +/mob/living/silicon/seen_turfs() + return list() + +/mob/living/simple_animal/seen_turfs() + return seen_turfs_in_range(src, 1) + +/mob/living/simple_animal/shade/narsie/seen_turfs() + return view(2, src) + +/proc/seen_turfs_in_range(var/source, var/range) + var/turf/pos = get_turf(source) + return hear(range, pos) diff --git a/code/modules/mob/freelook/mask/cultnet.dm b/code/modules/mob/freelook/mask/cultnet.dm new file mode 100644 index 00000000000..4e4e01b8472 --- /dev/null +++ b/code/modules/mob/freelook/mask/cultnet.dm @@ -0,0 +1,15 @@ +// CULT NET +// +// The datum containing all the chunks. + +/datum/visualnet/cult + chunk_type = /datum/chunk/cult + +/datum/visualnet/cult/proc/provides_vision(var/mob/living/L) + return L.provides_cult_vision() + +/mob/living/proc/provides_cult_vision() + return 1 + +/mob/living/silicon/provides_cult_vision() + return 0 diff --git a/code/modules/mob/freelook/mask/eye.dm b/code/modules/mob/freelook/mask/eye.dm new file mode 100644 index 00000000000..9b211e3bce5 --- /dev/null +++ b/code/modules/mob/freelook/mask/eye.dm @@ -0,0 +1,36 @@ +// MASK EYE +// +// A mob that a cultists controls to look around the station with. +// It streams chunks as it moves around, which will show it what the cultist can and cannot see. + +/mob/eye/maskEye + name = "Eye of Nar-Sie" + acceleration = 0 + owner_follows_eye = 1 + +/mob/eye/maskEye/New() + ..() + visualnet = cultnet + +/mob/living/simple_animal/shade/narsie/New() + ..() + sanity_check_eye() + +/mob/living/simple_animal/shade/narsie/Del() + del(eyeobj) + ..() + +/mob/living/simple_animal/shade/narsie/verb/center_on_self() + set category = "Mask of Nar-Sie" + set name = "Center on Self" + + sanity_check_eye() + for(var/datum/chunk/c in eyeobj.visibleChunks) + c.remove(eyeobj) + eyeobj.setLoc(src) + +/mob/living/simple_animal/shade/narsie/proc/sanity_check_eye() + if(!eyeobj) + eyeobj = new /mob/eye/maskEye() + eyeobj.owner = src + eyeobj.setLoc(src) diff --git a/code/modules/mob/freelook/mask/update_triggers.dm b/code/modules/mob/freelook/mask/update_triggers.dm new file mode 100644 index 00000000000..a02aa864a67 --- /dev/null +++ b/code/modules/mob/freelook/mask/update_triggers.dm @@ -0,0 +1,50 @@ +//UPDATE TRIGGERS, when the chunk (and the surrounding chunks) should update. + +#define CULT_UPDATE_BUFFER 30 + +/mob/living/var/updating_cult_vision = 0 + +/mob/living/Move() + var/oldLoc = src.loc + . = ..() + if(.) + if(cultnet.provides_vision(src)) + if(!updating_cult_vision) + updating_cult_vision = 1 + spawn(CULT_UPDATE_BUFFER) + if(oldLoc != src.loc) + cultnet.updateVisibility(oldLoc, 0) + cultnet.updateVisibility(loc, 0) + updating_cult_vision = 0 + +#undef CULT_UPDATE_BUFFER + +/mob/living/New() + ..() + cultnet.updateVisibility(src, 0) + +/mob/living/Del() + cultnet.updateVisibility(src, 0) + ..() + +/mob/living/rejuvenate() + var/was_dead = stat == DEAD + ..() + if(was_dead && stat != DEAD) + // Arise! + cultnet.updateVisibility(src, 0) + +/mob/living/death() + if(..()) + // If true, the mob went from living to dead (assuming everyone has been overriding as they should...) + cultnet.updateVisibility(src) + +/datum/antagonist/add_antagonist(var/datum/mind/player) + ..() + if(src == cult) + cultnet.updateVisibility(player.current, 0) + +/datum/antagonist/remove_antagonist(var/datum/mind/player, var/show_message, var/implanted) + ..() + if(src == cult) + cultnet.updateVisibility(player.current, 0) diff --git a/code/modules/mob/living/silicon/ai/freelook/read_me.dm b/code/modules/mob/freelook/read_me.dm similarity index 100% rename from code/modules/mob/living/silicon/ai/freelook/read_me.dm rename to code/modules/mob/freelook/read_me.dm diff --git a/code/modules/mob/freelook/visualnet.dm b/code/modules/mob/freelook/visualnet.dm index dedc23ab2dd..161aeb92b82 100644 --- a/code/modules/mob/freelook/visualnet.dm +++ b/code/modules/mob/freelook/visualnet.dm @@ -2,8 +2,6 @@ // // The datum containing all the chunks. -var/global/list/visual_nets = new() - /datum/visualnet // The chunks of the map, mapping the areas that an object can see. var/list/chunks = list() diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm index 14b069a6a19..b1cc2067f4c 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithless.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm @@ -46,4 +46,4 @@ if(istype(L)) if(prob(12)) L.Weaken(3) - L.visible_message("\the [src] knocks down \the [L]!") \ No newline at end of file + L.visible_message("\the [src] knocks down \the [L]!") diff --git a/code/modules/mob/living/simple_animal/narsie/login.dm b/code/modules/mob/living/simple_animal/narsie/login.dm new file mode 100644 index 00000000000..ac6e9b014fb --- /dev/null +++ b/code/modules/mob/living/simple_animal/narsie/login.dm @@ -0,0 +1,3 @@ +/mob/living/simple_animal/shade/narsie/Login() + ..() + src.center_on_self() diff --git a/code/modules/mob/living/simple_animal/narsie/logout.dm b/code/modules/mob/living/simple_animal/narsie/logout.dm new file mode 100644 index 00000000000..07dcf7812d0 --- /dev/null +++ b/code/modules/mob/living/simple_animal/narsie/logout.dm @@ -0,0 +1,3 @@ +/mob/living/simple_animal/shade/narsie/Logout() + ..() + src.center_on_self() diff --git a/code/modules/mob/living/simple_animal/narsie/narsie.dm b/code/modules/mob/living/simple_animal/narsie/narsie.dm new file mode 100644 index 00000000000..2337bc35f3c --- /dev/null +++ b/code/modules/mob/living/simple_animal/narsie/narsie.dm @@ -0,0 +1,108 @@ +/mob/living/simple_animal/shade/narsie + maxHealth = 9001 + health = 9001 + status_flags = GODMODE + layer = OBFUSCATION_LAYER + 0.1 + invisibility = INVISIBILITY_OBSERVER + see_invisible = SEE_INVISIBLE_CULT + + var/influence_max = 0 + var/influence_target = 0 + var/influence_current = 0 + var/last_influence_change = 0 + +/mob/living/simple_animal/shade/narsie/New() + ..() + src.sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS + last_influence_change = world.time + + make_floating(1) + +/mob/living/simple_animal/shade/narsie/stop_floating() + +/mob/living/simple_animal/shade/narsie/say(var/message) + if(HasSufficientInfluenceFeedback()) + ..() + +/mob/living/simple_animal/shade/narsie/emote(var/act, var/type, var/desc) + if(HasSufficientInfluenceFeedback()) + ..() + +/mob/living/simple_animal/shade/narsie/visible_emote(var/act_desc) + if(HasSufficientInfluenceFeedback()) + ..() + +/mob/living/simple_animal/shade/narsie/audible_emote(var/act_desc) + if(HasSufficientInfluenceFeedback()) + ..() + +/mob/living/simple_animal/shade/narsie/attack_hand() + if(HasSufficientInfluenceFeedback()) + ..() + +/mob/living/simple_animal/shade/narsie/UnarmedAttack() + if(HasSufficientInfluenceFeedback()) + ..() + +/mob/living/simple_animal/shade/narsie/hear_say() + if(HasSufficientInfluence()) + ..() + +/mob/living/simple_animal/shade/narsie/hear_radio() + if(HasSufficientInfluence()) + ..() + +/mob/living/simple_animal/shade/narsie/proc/HasSufficientInfluenceFeedback() + . = HasSufficientInfluence() + if(!.) + src << "You do not yet have the influence to interact directly with the mortal realm." + +/mob/living/simple_animal/shade/narsie/proc/HasSufficientInfluence() + return invisibility <= SEE_INVISIBLE_LIVING + +/mob/living/simple_animal/shade/narsie/verb/TargetInfluence() + set category = "Mask of Nar-Sie" + set name = "Set Target Influence" + + var/influence = input("Set the target influence level", "Set influence", influence_target) as num|null + if(isnum(influence)) + influence_target = influence + +/mob/living/simple_animal/shade/narsie/verb/MaxInfluence() + set category = "Mask of Nar-Sie" + set name = "Set Max Influence" + + var/influence = input("Set the max influence level", "Set influence", influence_max) as num|null + if(isnum(influence)) + influence_max = influence + +/mob/living/simple_animal/shade/narsie/Life() + ..() + ProcessHUD() + ProcessInfluence() + +/mob/living/simple_animal/shade/narsie/OnDeathInLife() + +/mob/living/simple_animal/shade/narsie/proc/ProcessHUD() + if(client) + client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask, global_hud.nvg, global_hud.thermal, global_hud.meson, global_hud.science) + + client.screen |= global_hud.science + +/mob/living/simple_animal/shade/narsie/proc/ProcessInfluence() + var/ticks_since_last = world.time - last_influence_change + last_influence_change = world.time + + if(influence_target > influence_max) + influence_target = influence_max + + if(influence_current < influence_target) + influence_current += round(ticks_since_last/10,1) + + if(influence_current > influence_target) + influence_current = influence_target + +/mob/living/simple_animal/shade/narsie/Stat() + if(statpanel("Mask of Nar-Sie")) + stat(null, "Influence: [influence_current]/[influence_max]") + ..() diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm index c200ef6f703..ea3496ecf7c 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/simple_animal/shade.dm @@ -31,15 +31,7 @@ Life() ..() - if(stat == 2) - new /obj/item/weapon/ectoplasm (src.loc) - for(var/mob/M in viewers(src, null)) - if((M.client && !( M.blinded ))) - M.show_message("\red [src] lets out a contented sigh as their form unwinds. ") - ghostize() - del src - return - + OnDeathInLife() attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri if(istype(O, /obj/item/device/soulstone)) @@ -59,3 +51,13 @@ if ((M.client && !( M.blinded ))) M.show_message("\red [user] gently taps [src] with the [O]. ") return + +/mob/living/simple_animal/shade/proc/OnDeathInLife() + if(stat == 2) + new /obj/item/weapon/ectoplasm (src.loc) + for(var/mob/M in viewers(src, null)) + if((M.client && !( M.blinded ))) + M.show_message("\red [src] lets out a contented sigh as their form unwinds. ") + ghostize() + del src + 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 425295cd2d9..aded7eb0c09 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -343,7 +343,7 @@ var/obj/machinery/bot/B = target_mob if(B.health > 0) return (0) - return (1) + return 1 //Call when target overlay should be added/removed /mob/living/simple_animal/update_targeted() diff --git a/code/setup.dm b/code/setup.dm index efad87a5dd8..815430b2b57 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -836,3 +836,9 @@ var/list/be_special_flags = list( //Area flags, possibly more to come #define RAD_SHIELDED 1 //shielded from radiation, clearly + +// Custom layer definitions, supplementing the default TURF_LAYER, MOB_LAYER, etc. +#define DOOR_OPEN_LAYER 2.7 //Under all objects if opened. 2.7 due to tables being at 2.6 +#define DOOR_CLOSED_LAYER 3.1 //Above most items if closed +#define OBFUSCATION_LAYER 14 //Where images covering the view for eyes are put +#define SCREEN_LAYER 17 //Mob HUD/effects layer diff --git a/icons/effects/cameravis.dmi b/icons/effects/cameravis.dmi index 3ecc9eb80ac4536683710641e6c6f2520218f495..2b819836fc3a69daa4e9af2d28b67a6ca5f3fa2d 100644 GIT binary patch literal 31637 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 L9!wy}SOotMF9#dP literal 12360 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 P0SI+v9i=)2>xlmWz%#@c