mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-12 07:33:34 +01:00
TG Statue Fixes/Refactor
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
gender = NEUTER
|
||||
robot_talk_understand = 1
|
||||
voice_name = "synthesized voice"
|
||||
has_unlimited_silicon_privilege = 1
|
||||
var/syndicate = 0
|
||||
var/const/MAIN_CHANNEL = "Main Frequency"
|
||||
var/lawchannel = MAIN_CHANNEL // Default channel on which to state laws
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
minbodytemp = 0
|
||||
has_unlimited_silicon_privilege = 1
|
||||
sentience_type = SENTIENCE_ARTIFICIAL
|
||||
status_flags = 0 //no default canpush
|
||||
can_strip = 0
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
name = "statue" // matches the name of the statue with the flesh-to-stone spell
|
||||
desc = "An incredibly lifelike marble carving. Its eyes seems to follow you.." // same as an ordinary statue with the added "eye following you" description
|
||||
icon = 'icons/obj/statue.dmi'
|
||||
icon_state = "angelseen"
|
||||
icon_living = "angelseen"
|
||||
icon_dead = "angelseen"
|
||||
icon_state = "angel"
|
||||
icon_living = "angel"
|
||||
icon_dead = "angel"
|
||||
gender = NEUTER
|
||||
a_intent = I_HARM
|
||||
|
||||
@@ -14,8 +14,9 @@
|
||||
response_disarm = "pushes"
|
||||
|
||||
speed = -1
|
||||
maxHealth = 1250
|
||||
health = 1250
|
||||
maxHealth = 50000
|
||||
health = 50000
|
||||
healable = 0
|
||||
|
||||
harm_intent_damage = 35
|
||||
melee_damage_lower = 34
|
||||
@@ -40,7 +41,9 @@
|
||||
|
||||
sight = SEE_SELF|SEE_MOBS|SEE_OBJS|SEE_TURFS
|
||||
anchored = 1
|
||||
// status_flags = GODMODE // Cannot push also
|
||||
status_flags = GODMODE // Cannot push also
|
||||
|
||||
var/cannot_be_seen = 1
|
||||
var/mob/living/creator = null
|
||||
|
||||
|
||||
@@ -60,137 +63,95 @@
|
||||
if(creator)
|
||||
src.creator = creator
|
||||
|
||||
/mob/living/simple_animal/hostile/statue/Move(var/turf/NewLoc)
|
||||
/mob/living/simple_animal/hostile/statue/Move(turf/NewLoc)
|
||||
if(can_be_seen(NewLoc))
|
||||
icon_state = "angelseen"
|
||||
if(client)
|
||||
to_chat(src, "<span class='warning'>You cannot move, there are eyes on you!</span>")
|
||||
return 0
|
||||
icon_state = "angel"
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/statue/process_ai()
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
spawn() //for saftey
|
||||
checkTargets()
|
||||
|
||||
/mob/living/simple_animal/hostile/statue/proc/checkTargets()
|
||||
if(target)
|
||||
/mob/living/simple_animal/hostile/statue/process_ai()
|
||||
..()
|
||||
if(target) // If we have a target and we're AI controlled
|
||||
var/mob/watching = can_be_seen()
|
||||
// If they're not our target
|
||||
if(watching && watching != target)
|
||||
// This one is closer.
|
||||
if(get_dist(watching, src) > get_dist(target, src))
|
||||
LoseTarget()
|
||||
GiveTarget(watching)
|
||||
|
||||
/mob/living/simple_animal/hostile/statue/AttackingTarget()
|
||||
if(!can_be_seen())
|
||||
icon_state = "angelattack"
|
||||
if(can_be_seen(get_turf(loc)))
|
||||
if(client)
|
||||
to_chat(src, "<span class='warning'>You cannot attack, there are eyes on you!</span>")
|
||||
return
|
||||
else
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/statue/DestroySurroundings()
|
||||
if(!can_be_seen())
|
||||
if(!can_be_seen(get_turf(loc)))
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/statue/face_atom()
|
||||
if(!can_be_seen())
|
||||
if(!can_be_seen(get_turf(loc)))
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/statue/UnarmedAttack()
|
||||
if(can_be_seen())
|
||||
icon_state = "angelseen"
|
||||
if(client)
|
||||
to_chat(src, "<span class='warning'>You cannot attack, there are eyes on you!</span>")
|
||||
return
|
||||
icon_state = "angelattack"
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/statue/proc/can_be_seen(var/turf/destination)
|
||||
/mob/living/simple_animal/hostile/statue/proc/can_be_seen(turf/destination)
|
||||
if(!cannot_be_seen)
|
||||
return null
|
||||
// Check for darkness
|
||||
var/turf/T = get_turf(loc)
|
||||
|
||||
var/light_amount
|
||||
var/DLlight_amount
|
||||
|
||||
if(T.dynamic_lighting)
|
||||
light_amount = T.get_lumcount()
|
||||
else
|
||||
light_amount = 5
|
||||
|
||||
if(destination && destination.dynamic_lighting)
|
||||
DLlight_amount = destination.get_lumcount()
|
||||
else
|
||||
DLlight_amount = 5
|
||||
|
||||
if(T && destination)
|
||||
//Don't check it twice if our destination is the tile we are on or we can't even get to our destination
|
||||
if(T && destination && T.lighting_overlay)
|
||||
if(T.get_lumcount() * 10 < 1 && destination.get_lumcount() * 10 < 1) // No one can see us in the darkness, right?
|
||||
return null
|
||||
if(T == destination)
|
||||
destination = null
|
||||
else if(light_amount < 0.1 && DLlight_amount < 0.1) // No one can see us in the darkness, right?
|
||||
return null
|
||||
|
||||
//We aren't in darkness, loop for viewers.
|
||||
// We aren't in darkness, loop for viewers.
|
||||
var/list/check_list = list(src)
|
||||
if(destination)
|
||||
check_list += destination
|
||||
|
||||
//This loop will, at most, loop twice.
|
||||
// This loop will, at most, loop twice.
|
||||
for(var/atom/check in check_list)
|
||||
for(var/mob/living/M in viewers(world.view + 1, check) - src)
|
||||
if(M.client && CanAttack(M))
|
||||
if(M.blinded || (M.sdisabilities & BLIND))
|
||||
return null
|
||||
|
||||
//calculates if any mobs are actually facing the statue
|
||||
var/xdif = M.x - src.x
|
||||
var/ydif = M.y - src.y
|
||||
|
||||
if(abs(xdif) < abs(ydif)) //mob is either above or below src
|
||||
if(ydif < 0 && M.dir == NORTH) //mob is below src and looking up
|
||||
return M
|
||||
if(ydif > 0 && M.dir == SOUTH) //mob is above src and looking down
|
||||
return M
|
||||
|
||||
else if(abs(xdif) > abs(ydif)) //mob is either left or right of src
|
||||
if(xdif < 0 && M.dir == EAST) //mob is to the left of src and looking right
|
||||
return M
|
||||
if(xdif > 0 && M.dir == WEST) //mob is to the right of src and looking left
|
||||
return M
|
||||
|
||||
else if(xdif == 0 && ydif == 0) //mob is on the same tile as src
|
||||
if(M.client && CanAttack(M) && !M.has_unlimited_silicon_privilege)
|
||||
if(!M.eye_blind)
|
||||
return M
|
||||
for(var/obj/mecha/M in view(world.view + 1, check)) //assuming if you can see them they can see you
|
||||
if(M.occupant && M.occupant.client)
|
||||
if(!M.occupant.eye_blind)
|
||||
return M.occupant
|
||||
return null
|
||||
|
||||
// Cannot talk
|
||||
|
||||
|
||||
//Cannot talk
|
||||
/mob/living/simple_animal/hostile/statue/say()
|
||||
return 0
|
||||
|
||||
/mob/living/simple_animal/hostile/statue/death(gibbed)
|
||||
if(!gibbed) //The looping ends here.
|
||||
dust()
|
||||
return
|
||||
return ..()
|
||||
// Turn to dust when gibbed
|
||||
|
||||
//Stop attacking clientless mobs
|
||||
/mob/living/simple_animal/hostile/statue/gib()
|
||||
dust()
|
||||
|
||||
/mob/living/simple_animal/hostile/statue/CanAttack(var/atom/the_target)
|
||||
if(mind && mind.key && !ckey)
|
||||
return 0
|
||||
|
||||
// Stop attacking clientless mobs
|
||||
|
||||
/mob/living/simple_animal/hostile/statue/CanAttack(atom/the_target)
|
||||
if(isliving(the_target))
|
||||
var/mob/living/L = the_target
|
||||
if(!L.client && !L.ckey)
|
||||
return 0
|
||||
return ..()
|
||||
|
||||
// Don't attack your creator if there is one
|
||||
|
||||
/mob/living/simple_animal/hostile/statue/ListTargets()
|
||||
. = ..()
|
||||
return . - creator
|
||||
|
||||
/mob/living/simple_animal/hostile/statue/sentience_act()
|
||||
faction -= "neutral"
|
||||
|
||||
// Statue powers
|
||||
|
||||
// Flicker lights
|
||||
@@ -216,15 +177,15 @@
|
||||
message = "<span class='notice'>You glare your eyes.</span>"
|
||||
charge_max = 600
|
||||
clothes_req = 0
|
||||
range = 8
|
||||
range = 10
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/blindness/cast(list/targets)
|
||||
for(var/mob/living/L in living_mob_list)
|
||||
if(L == usr)
|
||||
continue
|
||||
var/turf/T = get_turf(L.loc)
|
||||
if(T && T in targets)
|
||||
L.eye_blind = max(L.eye_blind, 4)
|
||||
if(issilicon(L))
|
||||
L.Weaken(4)
|
||||
return
|
||||
|
||||
//Toggle Night Vision
|
||||
@@ -248,4 +209,13 @@
|
||||
else
|
||||
target.see_invisible = SEE_INVISIBLE_LIVING
|
||||
name = "Toggle Nightvision \[OFF\]"
|
||||
return
|
||||
return
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/statue/sentience_act()
|
||||
faction -= "neutral"
|
||||
|
||||
/mob/living/simple_animal/hostile/statue/restrained()
|
||||
. = ..()
|
||||
if(can_be_seen(loc))
|
||||
return 1
|
||||
@@ -203,6 +203,8 @@
|
||||
var/digitalcamo = 0 // Can they be tracked by the AI?
|
||||
var/weakeyes = 0 //Are they vulnerable to flashes?
|
||||
|
||||
var/has_unlimited_silicon_privilege = 0 // Can they interact with station electronics
|
||||
|
||||
var/list/radar_blips = list() // list of screen objects, radar blips
|
||||
var/radar_open = 0 // nonzero is radar is open
|
||||
|
||||
|
||||
Reference in New Issue
Block a user