Hostile mob friends!

Added 1 new hostile mob, the homunculus. This mob will transform into the first person that it sees, and will gain potential attack and armour depending on what that mob is wielding without copying it exactly.

Added 3 new variants of the corrupt hound, fire breather, fast and laser. They have slightly modified sprites to make them easy to identify. I have been using these mobs a lot in events lately and it'd be nice to give them some variety.
This commit is contained in:
SatinIsle
2024-09-16 17:11:19 +01:00
parent 55ac1c54f0
commit e0ed60c890
4 changed files with 136 additions and 0 deletions
@@ -33,3 +33,92 @@
/mob/living/simple_mob/homunculus/update_icons()
return
/mob/living/simple_mob/homunculus/evil
var/seen_melee
var/seen_gun
var/transformed
var/seen_armour
maxHealth = 100
health = 100
faction = "glamour"
melee_damage_lower = 5
melee_damage_upper = 7
ai_holder_type = /datum/ai_holder/simple_mob/hostile
/mob/living/simple_mob/homunculus/evil/Life()
handle_homunculus()
return ..()
/mob/living/simple_mob/homunculus/evil/proc/handle_homunculus()
if(!transformed)
for(var/mob/living/carbon/human/H in range(8, src))
if(H.stat == DEAD)
continue
name = H.name
desc = H.desc
icon = H.icon
icon_state = H.icon_state
copy_overlays(H, TRUE)
resize(H.size_multiplier, ignore_prefs = TRUE)
var/obj/item/A = H.get_active_hand()
var/obj/item/I = H.get_inactive_hand()
if(istype(A,/obj/item/weapon/material) || istype(A,/obj/item/weapon/melee) || istype(I,/obj/item/weapon/material) || istype(I,/obj/item/weapon/melee))
seen_melee = 1
melee_damage_lower = 20
melee_damage_upper = 30
if(istype(A,/obj/item/weapon/gun/projectile) || istype(I,/obj/item/weapon/gun/projectile))
seen_gun = 1
projectiletype = /obj/item/projectile/bullet/pistol/medium
projectilesound = 'sound/weapons/Gunshot_light.ogg'
if(istype(A,/obj/item/weapon/gun/projectile/shotgun) || istype(I,/obj/item/weapon/gun/projectile/shotgun))
projectiletype = /obj/item/projectile/bullet/pellet/shotgun
projectilesound = 'sound/weapons/Gunshot_shotgun.ogg'
reload_time = 1.5 SECONDS
ranged_attack_delay = 1.5 SECONDS
projectile_dispersion = 8
projectile_accuracy = -40
if(istype(A,/obj/item/weapon/gun/projectile/automatic) || istype(I,/obj/item/weapon/gun/projectile/automatic))
base_attack_cooldown = 5
projectile_dispersion = 7
projectile_accuracy = -20
if(istype(A,/obj/item/weapon/gun/projectile/heavysniper) || istype(I,/obj/item/weapon/gun/projectile/heavysniper))
projectiletype = /obj/item/projectile/bullet/rifle/a145/highvel // Do not get seen with a big ass sniper!
projectilesound = 'sound/weapons/Gunshot_cannon.ogg'
ranged_attack_delay = 2.5 SECONDS
reload_time = 5 SECONDS
projectile_accuracy = 75
if(istype(A,/obj/item/weapon/gun/energy) || istype(I,/obj/item/weapon/gun/energy))
seen_gun = 1
projectiletype = /obj/item/projectile/beam/midlaser
projectilesound = 'sound/weapons/Laser.ogg'
projectile_dispersion = 5
projectile_accuracy = -20
if(istype(A,/obj/item/weapon/gun/energy/ionrifle) || istype(I,/obj/item/weapon/gun/energy/ionrifle))
projectiletype = /obj/item/projectile/ion
if(istype(A,/obj/item/weapon/gun/energy/lasercannon) || istype(I,/obj/item/weapon/gun/energy/lasercannon))
projectiletype = /obj/item/projectile/beam/heavylaser
ranged_attack_delay = 2.5 SECONDS
reload_time = 5 SECONDS
projectilesound = 'sound/weapons/lasercannonfire.ogg'
if(istype(A,/obj/item/weapon/gun/energy/sniperrifle) || istype(I,/obj/item/weapon/gun/energy/sniperrifle))
projectiletype = /obj/item/projectile/beam/sniper // Do not get seen with a big ass sniper!
projectilesound = 'sound/weapons/gauss_shoot.ogg'
ranged_attack_delay = 2.5 SECONDS
reload_time = 5 SECONDS
projectile_accuracy = 75
if(istype(A,/obj/item/weapon/gun/magnetic) || istype(I,/obj/item/weapon/gun/magnetic))
seen_gun = 1
projectiletype = /obj/item/projectile/bullet/magnetic/bore
projectilesound = 'sound/weapons/railgun.ogg'
ranged_attack_delay = 1.5 SECONDS
projectile_dispersion = 5
projectile_accuracy = 20
var/obj/item/clothing/suit/S = H.get_equipped_item(slot_wear_suit)
if(istype(S,/obj/item/clothing/suit/armor) || istype(S,/obj/item/clothing/suit/space/rig/))
armor = list(melee = 40, bullet = 30, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 100)
transformed = 1
return TRUE
@@ -184,3 +184,48 @@
/datum/ai_holder/simple_mob/melee/evasive/corrupthound
violent_breakthrough = TRUE
can_breakthrough = TRUE
/mob/living/simple_mob/vore/aggressive/corrupthound/fire
icon_state = "badboi_fire"
icon_living = "badboi_fire"
icon_dead = "badboi_fire-dead"
icon_rest = "badboi_fire_rest"
maxHealth = 150
health = 150
ai_holder_type = /datum/ai_holder/simple_mob/ranged/aggressive
projectiletype = /obj/item/projectile/scatter/flamethrower
ranged_attack_delay = 2 SECONDS
/mob/living/simple_mob/vore/aggressive/corrupthound/laser
icon_state = "badboi_laser"
icon_living = "badboi_laser"
icon_dead = "badboi_laser-dead"
icon_rest = "badboi_laser_rest"
maxHealth = 150
health = 150
ai_holder_type = /datum/ai_holder/simple_mob/ranged
ranged_attack_delay = 2 SECONDS
projectiletype = /obj/item/projectile/beam/midlaser
projectilesound = 'sound/weapons/Laser.ogg'
projectile_dispersion = 5
projectile_accuracy = -20
/mob/living/simple_mob/vore/aggressive/corrupthound/fast
icon_state = "badboi_fast"
icon_living = "badboi_fast"
icon_dead = "badboi_fast-dead"
icon_rest = "badboi_fast_rest"
maxHealth = 100
health = 100
movement_cooldown = -1
melee_damage_lower = 7
melee_damage_upper = 15
@@ -137,6 +137,8 @@
/datum/ai_holder/simple_mob/vore/meowl
var/last_friend_time = 0
violent_breakthrough = FALSE
destructive = FALSE
/datum/ai_holder/simple_mob/vore/meowl/engage_target()
ai_log("engage_target() : Entering.", AI_LOG_DEBUG)