TG Statue Fixes/Refactor

This commit is contained in:
Fox-McCloud
2016-04-06 02:20:24 -04:00
parent a669d0fac4
commit 64cd6a0cdc
4 changed files with 64 additions and 90 deletions
@@ -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
+2
View File
@@ -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