TG: Some work on critters. Added a new critter type: the VISCERATORS.

(http://dl.dropbox.com/u/10657252/SS13/Manhacks.PNG) Includes a small new audio
file. They'll probably be created with a traitor item or a box-o-hacks in the
armory.
Revision: r2932
Author: 	 vageyenaman
This commit is contained in:
Ren Erthilo
2012-04-15 16:25:45 +01:00
parent 3ed248197a
commit d03a411571
5 changed files with 80 additions and 24 deletions

View File

@@ -23,6 +23,8 @@
wanderer = 1
//Will open doors it bumps ignoring access
opensdoors = 0
//Will randomly travel through vents
ventcrawl = 0
//Internal tracking ignore
frustration = 0
@@ -34,6 +36,10 @@
target = null
oldtarget_name = null
target_lastloc = null
thinkspeed = 15
chasespeed = 4
wanderspeed = 10
//The last guy who attacked it
attacker = null
//Will not attack this thing
@@ -49,6 +55,11 @@
atksame = 0
atkmech = 0
//Attacks syndies/traitors (distinguishes via mind)
atksynd = 1
//Attacks things NOT in its obj/req_access list
atkreq = 0
//Damage multipliers
brutevuln = 1
firevuln = 1
@@ -61,7 +72,10 @@
//Basic attack message when they move to attack and attack
angertext = "charges at"
attacktext = "attacks"
deathtext = "dies!"
chasestate = null // the icon state to use when attacking or chasing a target
attackflick = null // the icon state to flick when it attacks
attack_sound = null // the sound it makes when it attacks!
attack_speed = 25 // delay of attack

View File

@@ -13,7 +13,7 @@
if("thinking")
src.attack = 0
src.target = null
sleep(15)
sleep(thinkspeed)
walk_to(src,0)
if (src.aggressive) seek_target()
if (src.wanderer && !src.target) src.task = "wandering"
@@ -29,11 +29,13 @@
var/mob/living/carbon/M = src.target
ChaseAttack()
src.task = "attacking"
if(chasestate)
icon_state = chasestate
src.anchored = 1
src.target_lastloc = M.loc
else
var/turf/olddist = get_dist(src, src.target)
walk_to(src, src.target,1,speed)
walk_to(src, src.target,1,chasespeed)
if ((get_dist(src, src.target)) >= (olddist))
src.frustration++
else
@@ -45,6 +47,8 @@
if ((get_dist(src, src.target) > 1) || ((src.target:loc != src.target_lastloc)))
src.anchored = 0
src.task = "chasing"
if(chasestate)
icon_state = chasestate
else
if (get_dist(src, src.target) <= 1)
var/mob/living/carbon/M = src.target
@@ -58,6 +62,7 @@
src.attacking = 0
else
if(M!=null)
if(ismob(src.target))
if(M.health < 0)
src.task = "thinking"
src.target = null
@@ -69,9 +74,13 @@
src.anchored = 0
src.attacking = 0
src.task = "chasing"
if(chasestate)
icon_state = chasestate
if("wandering")
if(chasestate)
icon_state = initial(icon_state)
patrol_step()
sleep(10)
sleep(wanderspeed)
spawn(8)
process()
return
@@ -114,25 +123,53 @@
if (src.target)
src.task = "chasing"
break
// Ignore syndicates and traitors if specified
if(!atksynd && C.mind)
var/datum/mind/synd_mind = C.mind
if( synd_mind.special_role == "Syndicate" || synd_mind.special_role == "traitor" )
continue
if((C.name == src.oldtarget_name) && (world.time < src.last_found + 100)) continue
if(istype(C, /mob/living/carbon/) && !src.atkcarbon) continue
if(istype(C, /mob/living/silicon/) && !src.atksilicon) continue
if(atkreq)
if(src.allowed(C)) continue
if(C.health < 0) continue
if(istype(C, /mob/living/carbon/) && src.atkcarbon) src.attack = 1
if(istype(C, /mob/living/silicon/) && src.atksilicon) src.attack = 1
if(atkreq)
if(!src.allowed(C)) src.attack = 1
if(src.attack)
T = C
break
if(!src.attack)
for(var/obj/effect/critter/C in view(src.seekrange,src))
if(istype(C, /obj/effect/critter) && !src.atkcritter) continue
if(istype(C, /obj/mecha) && !src.atkmech) continue
if(!src.atkcritter) continue
if(C.health <= 0) continue
if(istype(C, /obj/effect/critter) && src.atkcritter)
if(src.atkcritter)
if((istype(C, src.type) && !src.atksame) || (C == src)) continue
src.attack = 1
if(istype(C, /obj/mecha) && src.atkmech) src.attack = 1
if(src.attack)
T = C
break
if(!src.attack)
for(var/obj/mecha/C in view(src.seekrange,src))
if(!C.occupant) continue
if(atkreq && C.occupant)
if(src.allowed(C.occupant)) continue
if(!atksynd && C.occupant)
if(C.occupant.mind)
var/datum/mind/synd_mind = C.occupant.mind
if( synd_mind.special_role == "Syndicate" || synd_mind.special_role == "traitor" )
continue
if(!src.atkmech) continue
if(C.health <= 0) continue
if(src.atkmech) src.attack = 1
if(src.attack)
T = C
break
@@ -152,9 +189,10 @@
RunAttack()
src.attacking = 1
if(ismob(src.target))
for(var/mob/O in viewers(src, null))
O.show_message("\red <B>[src]</B> [src.attacktext] [src.target]!", 1)
if(ismob(src.target))
var/damage = rand(melee_damage_lower, melee_damage_upper)
@@ -174,7 +212,8 @@
if(isobj(src.target))
if(istype(target, /obj/mecha))
src.target:take_damage(rand(melee_damage_lower,melee_damage_upper))
//src.target:take_damage(rand(melee_damage_lower,melee_damage_upper))
src.target:attack_critter(src)
else
src.target:TakeDamage(rand(melee_damage_lower,melee_damage_upper))
spawn(attack_speed)

View File

@@ -13,7 +13,7 @@ Contains the procs that control attacking critters
if("fire") damage = W.force * firevuln
if("brute") damage = W.force * brutevuln
TakeDamage(damage)
if(src.defensive) Target_Attacker(user)
if(src.defensive && alive) Target_Attacker(user)
return
@@ -51,7 +51,8 @@ Contains the procs that control attacking critters
if(!target) return
src.target = target
src.oldtarget_name = target:name
if(task != "chasing" || task != "attacking")
if(task != "chasing" && task != "attacking")
if(angertext && angertext != "")
for(var/mob/O in viewers(src, null))
O.show_message("\red <b>[src]</b> [src.angertext] at [target:name]!", 1)
src.task = "chasing"
@@ -75,7 +76,7 @@ Contains the procs that control attacking critters
src.anchored = 0
src.density = 0
walk_to(src,0)
src.visible_message("<b>[src]</b> dies!")
src.visible_message("<b>[src]</b> [deathtext]")
Harvest(var/obj/item/weapon/W, var/mob/living/user)

View File

@@ -252,6 +252,7 @@ proc/slur(phrase)
p++//for each letter p is increased to find where the next letter will be.
return copytext(sanitize(t),1,MAX_MESSAGE_LEN)
proc/Gibberish(t, p)
/* Turn text into complete gibberish! */
var/returntext = ""
@@ -269,6 +270,7 @@ proc/Gibberish(t, p)
return returntext
/proc/ninjaspeak(n)
/*
The difference with stutter is that this proc can stutter more than 1 letter

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 70 KiB