mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-12 03:02:54 +00:00
Simple Animal Tweaks
Makes hivebots a bit smarter, shifts stats around, adds a few new sprites thanks to Mechoid, and adds a few new types. Adds verbs that can be used as a player hivebot, to get them to follow you. Spider eyes can now be seen clearly in the darkness, which looks spooky.
This commit is contained in:
@@ -1,6 +1,11 @@
|
|||||||
|
// Hivebots are tuned towards how many default lasers are needed to kill them.
|
||||||
|
// As such, if laser damage is ever changed, you should change this define.
|
||||||
|
#define LASERS_TO_KILL *40
|
||||||
|
|
||||||
|
// Default hivebot is melee, and a bit more meaty, so it can meatshield for their ranged friends.
|
||||||
/mob/living/simple_animal/hostile/hivebot
|
/mob/living/simple_animal/hostile/hivebot
|
||||||
name = "Hivebot"
|
name = "hivebot"
|
||||||
desc = "A small robot"
|
desc = "A robot. It appears to be somewhat reslient, but lacking a true weapon."
|
||||||
icon = 'icons/mob/hivebot.dmi'
|
icon = 'icons/mob/hivebot.dmi'
|
||||||
icon_state = "basic"
|
icon_state = "basic"
|
||||||
icon_living = "basic"
|
icon_living = "basic"
|
||||||
@@ -8,16 +13,16 @@
|
|||||||
|
|
||||||
faction = "hivebot"
|
faction = "hivebot"
|
||||||
intelligence_level = SA_ROBOTIC
|
intelligence_level = SA_ROBOTIC
|
||||||
maxHealth = 15
|
maxHealth = 3 LASERS_TO_KILL
|
||||||
health = 15
|
health = 3 LASERS_TO_KILL
|
||||||
speed = 4
|
speed = 4
|
||||||
|
|
||||||
melee_damage_lower = 2
|
melee_damage_lower = 15
|
||||||
melee_damage_upper = 3
|
melee_damage_upper = 15
|
||||||
|
|
||||||
attacktext = "clawed"
|
attacktext = "clawed"
|
||||||
projectilesound = 'sound/weapons/Gunshot.ogg'
|
projectilesound = 'sound/weapons/Gunshot.ogg'
|
||||||
projectiletype = /obj/item/projectile/hivebotbullet
|
projectiletype = /obj/item/projectile/bullet/hivebot
|
||||||
|
|
||||||
min_oxy = 0
|
min_oxy = 0
|
||||||
max_oxy = 0
|
max_oxy = 0
|
||||||
@@ -29,19 +34,102 @@
|
|||||||
max_n2 = 0
|
max_n2 = 0
|
||||||
minbodytemp = 0
|
minbodytemp = 0
|
||||||
|
|
||||||
|
cooperative = TRUE
|
||||||
|
firing_lines = TRUE
|
||||||
|
investigates = TRUE
|
||||||
|
|
||||||
|
speak_chance = 1
|
||||||
|
speak = list(
|
||||||
|
"Resuming task: Protect area.",
|
||||||
|
"No threats found.",
|
||||||
|
"Error: No targets found."
|
||||||
|
)
|
||||||
|
emote_hear = list("humms ominously", "whirrs softly", "grinds a gear")
|
||||||
|
emote_see = list("looks around the area", "turns from side to side")
|
||||||
|
say_understood = list("Affirmative.", "Positive")
|
||||||
|
say_cannot = list("Denied.", "Negative")
|
||||||
|
say_maybe_target = list("Possible threat detected. Investigating.", "Motion detected.", "Investigating.")
|
||||||
|
say_got_target = list("Threat detected.", "New task: Remove threat.", "Threat removal engaged.", "Engaging target.")
|
||||||
|
|
||||||
|
// Subtypes.
|
||||||
|
|
||||||
|
// Melee like the base type, but more fragile.
|
||||||
|
/mob/living/simple_animal/hostile/hivebot/swarm
|
||||||
|
name = "swarm hivebot"
|
||||||
|
desc = "A robot. It looks fragile and weak"
|
||||||
|
maxHealth = 1 LASERS_TO_KILL
|
||||||
|
health = 1 LASERS_TO_KILL
|
||||||
|
melee_damage_lower = 3
|
||||||
|
melee_damage_upper = 3
|
||||||
|
|
||||||
|
// This one has a semi-weak ranged attack.
|
||||||
/mob/living/simple_animal/hostile/hivebot/range
|
/mob/living/simple_animal/hostile/hivebot/range
|
||||||
name = "Hivebot"
|
name = "ranged hivebot"
|
||||||
desc = "A smallish robot, this one is armed!"
|
desc = "A robot. It has a simple ballistic weapon."
|
||||||
ranged = 1
|
ranged = 1
|
||||||
|
maxHealth = 2 LASERS_TO_KILL
|
||||||
|
health = 2 LASERS_TO_KILL
|
||||||
|
|
||||||
|
// This one shoots a burst of three, and is considerably more dangerous.
|
||||||
/mob/living/simple_animal/hostile/hivebot/range/rapid
|
/mob/living/simple_animal/hostile/hivebot/range/rapid
|
||||||
|
name = "rapid hivebot"
|
||||||
|
desc = "A robot. It has a fast firing ballistic rifle."
|
||||||
|
icon_living = "strong"
|
||||||
rapid = 1
|
rapid = 1
|
||||||
|
maxHealth = 2 LASERS_TO_KILL
|
||||||
|
health = 2 LASERS_TO_KILL
|
||||||
|
|
||||||
/mob/living/simple_animal/hostile/hivebot/strong
|
// Shoots EMPs, to screw over other robots.
|
||||||
name = "Strong Hivebot"
|
/mob/living/simple_animal/hostile/hivebot/range/ion
|
||||||
desc = "A robot, this one is armed and looks tough!"
|
name = "engineering hivebot"
|
||||||
health = 80
|
desc = "A robot. It has a tool which emits focused electromagnetic pulses, which are deadly to other synthetic adverseries."
|
||||||
ranged = 1
|
projectiletype = /obj/item/projectile/ion
|
||||||
|
projectilesound = 'sound/weapons/Laser.ogg'
|
||||||
|
icon_living = "engi"
|
||||||
|
ranged = TRUE
|
||||||
|
maxHealth = 2 LASERS_TO_KILL
|
||||||
|
health = 2 LASERS_TO_KILL
|
||||||
|
|
||||||
|
// Shoots deadly lasers.
|
||||||
|
/mob/living/simple_animal/hostile/hivebot/range/laser
|
||||||
|
name = "laser hivebot"
|
||||||
|
desc = "A robot. It has an energy weapon."
|
||||||
|
projectiletype = /obj/item/projectile/beam/blue
|
||||||
|
projectilesound = 'sound/weapons/Laser.ogg'
|
||||||
|
maxHealth = 2 LASERS_TO_KILL
|
||||||
|
health = 2 LASERS_TO_KILL
|
||||||
|
|
||||||
|
// Beefy and ranged.
|
||||||
|
/mob/living/simple_animal/hostile/hivebot/range/strong
|
||||||
|
name = "strong hivebot"
|
||||||
|
desc = "A robot. This one has reinforced plating, and looks tougher."
|
||||||
|
icon_living = "strong"
|
||||||
|
maxHealth = 4 LASERS_TO_KILL
|
||||||
|
health = 4 LASERS_TO_KILL
|
||||||
|
melee_damage_lower = 15
|
||||||
|
melee_damage_upper = 15
|
||||||
|
|
||||||
|
// Also beefy, but tries to stay at their 'home', ideal for base defense.
|
||||||
|
/mob/living/simple_animal/hostile/hivebot/range/guard
|
||||||
|
name = "guard hivebot"
|
||||||
|
desc = "A robot. It seems to be guarding something."
|
||||||
|
returns_home = TRUE
|
||||||
|
maxHealth = 4 LASERS_TO_KILL
|
||||||
|
health = 4 LASERS_TO_KILL
|
||||||
|
|
||||||
|
// This one is intended for players to use. Well rounded and can make other hivebots follow them with verbs.
|
||||||
|
/mob/living/simple_animal/hostile/hivebot/range/player
|
||||||
|
name = "commander hivebot"
|
||||||
|
desc = "A robot. This one seems to direct the others, and it has a laser weapon."
|
||||||
|
icon_living = "commander"
|
||||||
|
maxHealth = 5 LASERS_TO_KILL
|
||||||
|
health = 5 LASERS_TO_KILL
|
||||||
|
projectiletype = /obj/item/projectile/beam/blue
|
||||||
|
projectilesound = 'sound/weapons/Laser.ogg'
|
||||||
|
melee_damage_lower = 15 // Needed to force open airlocks.
|
||||||
|
melee_damage_upper = 15
|
||||||
|
|
||||||
|
// Procs.
|
||||||
|
|
||||||
/mob/living/simple_animal/hostile/hivebot/death()
|
/mob/living/simple_animal/hostile/hivebot/death()
|
||||||
..()
|
..()
|
||||||
@@ -52,6 +140,42 @@
|
|||||||
s.start()
|
s.start()
|
||||||
qdel(src)
|
qdel(src)
|
||||||
|
|
||||||
|
/mob/living/simple_animal/hostile/hivebot/speech_bubble_appearance()
|
||||||
|
return "synthetic_evil"
|
||||||
|
|
||||||
|
/mob/living/simple_animal/hostile/hivebot/verb/command_follow()
|
||||||
|
set name = "Command - Follow"
|
||||||
|
set category = "Hivebot"
|
||||||
|
set desc = "This will ask other hivebots to follow you."
|
||||||
|
|
||||||
|
say("Delegating new task: Follow.")
|
||||||
|
|
||||||
|
for(var/mob/living/simple_animal/hostile/hivebot/buddy in hearers(src))
|
||||||
|
if(buddy.faction != faction)
|
||||||
|
continue
|
||||||
|
if(buddy == src)
|
||||||
|
continue
|
||||||
|
buddy.set_follow(src)
|
||||||
|
buddy.FollowTarget()
|
||||||
|
spawn(rand(5, 10))
|
||||||
|
buddy.say( pick(buddy.say_understood) )
|
||||||
|
|
||||||
|
/mob/living/simple_animal/hostile/hivebot/verb/command_stop()
|
||||||
|
set name = "Command - Stop Following"
|
||||||
|
set category = "Hivebot"
|
||||||
|
set desc = "This will ask other hivebots to cease following you."
|
||||||
|
|
||||||
|
say("Delegating new task: Stop following.")
|
||||||
|
|
||||||
|
for(var/mob/living/simple_animal/hostile/hivebot/buddy in hearers(src))
|
||||||
|
if(buddy.faction != faction)
|
||||||
|
continue
|
||||||
|
if(buddy == src)
|
||||||
|
continue
|
||||||
|
buddy.LoseFollow()
|
||||||
|
spawn(rand(5, 10))
|
||||||
|
buddy.say( pick(buddy.say_understood) )
|
||||||
|
|
||||||
/mob/living/simple_animal/hostile/hivebot/tele//this still needs work
|
/mob/living/simple_animal/hostile/hivebot/tele//this still needs work
|
||||||
name = "Beacon"
|
name = "Beacon"
|
||||||
desc = "Some odd beacon thing"
|
desc = "Some odd beacon thing"
|
||||||
@@ -107,6 +231,6 @@
|
|||||||
if(prob(2))//Might be a bit low, will mess with it likely
|
if(prob(2))//Might be a bit low, will mess with it likely
|
||||||
warpbots()
|
warpbots()
|
||||||
|
|
||||||
/obj/item/projectile/hivebotbullet
|
/obj/item/projectile/bullet/hivebot
|
||||||
damage = 10
|
damage = 10
|
||||||
damage_type = BRUTE
|
damage_type = BRUTE
|
||||||
|
|||||||
@@ -43,6 +43,17 @@
|
|||||||
var/poison_per_bite = 5
|
var/poison_per_bite = 5
|
||||||
var/poison_chance = 10
|
var/poison_chance = 10
|
||||||
var/poison_type = "spidertoxin"
|
var/poison_type = "spidertoxin"
|
||||||
|
var/image/eye_layer = null
|
||||||
|
|
||||||
|
/mob/living/simple_animal/hostile/giant_spider/proc/add_eyes()
|
||||||
|
if(!eye_layer)
|
||||||
|
var/overlay_layer = LIGHTING_LAYER+0.1
|
||||||
|
eye_layer = image(icon, "[icon_state]-eyes", overlay_layer)
|
||||||
|
|
||||||
|
overlays += eye_layer
|
||||||
|
|
||||||
|
/mob/living/simple_animal/hostile/giant_spider/proc/remove_eyes()
|
||||||
|
overlays -= eye_layer
|
||||||
|
|
||||||
//nursemaids - these create webs and eggs
|
//nursemaids - these create webs and eggs
|
||||||
/mob/living/simple_animal/hostile/giant_spider/nurse
|
/mob/living/simple_animal/hostile/giant_spider/nurse
|
||||||
@@ -96,6 +107,11 @@
|
|||||||
|
|
||||||
/mob/living/simple_animal/hostile/giant_spider/New(var/location, var/atom/parent)
|
/mob/living/simple_animal/hostile/giant_spider/New(var/location, var/atom/parent)
|
||||||
get_light_and_color(parent)
|
get_light_and_color(parent)
|
||||||
|
add_eyes()
|
||||||
|
..()
|
||||||
|
|
||||||
|
/mob/living/simple_animal/hostile/giant_spider/death()
|
||||||
|
remove_eyes()
|
||||||
..()
|
..()
|
||||||
|
|
||||||
/mob/living/simple_animal/hostile/giant_spider/PunchTarget()
|
/mob/living/simple_animal/hostile/giant_spider/PunchTarget()
|
||||||
|
|||||||
@@ -202,8 +202,9 @@
|
|||||||
|
|
||||||
admin_attack_log(firer, target_mob, attacker_message, victim_message, admin_message)
|
admin_attack_log(firer, target_mob, attacker_message, victim_message, admin_message)
|
||||||
else
|
else
|
||||||
target_mob.attack_log += "\[[time_stamp()]\] <b>UNKNOWN SUBJECT (No longer exists)</b> shot <b>[target_mob]/[target_mob.ckey]</b> with <b>\a [src]</b>"
|
if(target_mob) // Sometimes the target_mob gets gibbed or something.
|
||||||
msg_admin_attack("UNKNOWN shot [target_mob] ([target_mob.ckey]) with \a [src] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[target_mob.x];Y=[target_mob.y];Z=[target_mob.z]'>JMP</a>)")
|
target_mob.attack_log += "\[[time_stamp()]\] <b>UNKNOWN SUBJECT (No longer exists)</b> shot <b>[target_mob]/[target_mob.ckey]</b> with <b>\a [src]</b>"
|
||||||
|
msg_admin_attack("UNKNOWN shot [target_mob] ([target_mob.ckey]) with \a [src] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[target_mob.x];Y=[target_mob.y];Z=[target_mob.z]'>JMP</a>)")
|
||||||
|
|
||||||
//sometimes bullet_act() will want the projectile to continue flying
|
//sometimes bullet_act() will want the projectile to continue flying
|
||||||
if (result == PROJECTILE_CONTINUE)
|
if (result == PROJECTILE_CONTINUE)
|
||||||
|
|||||||
@@ -259,8 +259,7 @@
|
|||||||
..()
|
..()
|
||||||
|
|
||||||
/obj/machinery/artifact/bullet_act(var/obj/item/projectile/P)
|
/obj/machinery/artifact/bullet_act(var/obj/item/projectile/P)
|
||||||
if(istype(P,/obj/item/projectile/bullet) ||\
|
if(istype(P,/obj/item/projectile/bullet))
|
||||||
istype(P,/obj/item/projectile/hivebotbullet))
|
|
||||||
if(my_effect.trigger == TRIGGER_FORCE)
|
if(my_effect.trigger == TRIGGER_FORCE)
|
||||||
my_effect.ToggleActivate()
|
my_effect.ToggleActivate()
|
||||||
if(secondary_effect && secondary_effect.trigger == TRIGGER_FORCE && prob(25))
|
if(secondary_effect && secondary_effect.trigger == TRIGGER_FORCE && prob(25))
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 250 KiB After Width: | Height: | Size: 246 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 15 KiB |
Reference in New Issue
Block a user