diff --git a/code/__DEFINES/mobfactions.dm b/code/__DEFINES/mobfactions.dm index 3fd324ab030..fc4a9c96764 100644 --- a/code/__DEFINES/mobfactions.dm +++ b/code/__DEFINES/mobfactions.dm @@ -3,3 +3,5 @@ #define FACTION_CLOWN "Clowns" #define FACTION_RAT "Rats" +// Maint creatures have mutual respect for eachother. +#define FACTION_MAINT_CREATURES "Maint_Creatures" diff --git a/code/modules/mob/living/basic/vermin/cockroach.dm b/code/modules/mob/living/basic/vermin/cockroach.dm index 905f9a3be18..79d0d2e1c39 100644 --- a/code/modules/mob/living/basic/vermin/cockroach.dm +++ b/code/modules/mob/living/basic/vermin/cockroach.dm @@ -23,7 +23,7 @@ speak_emote = list("chitters") basic_mob_flags = DEL_ON_DEATH - faction = list("hostile") + faction = list("hostile", FACTION_MAINT_CREATURES) ai_controller = /datum/ai_controller/basic_controller/cockroach @@ -78,7 +78,7 @@ melee_damage_upper = 10 obj_damage = 10 gold_core_spawnable = HOSTILE_SPAWN - faction = list("hostile") + faction = list("hostile", FACTION_MAINT_CREATURES) ai_controller = /datum/ai_controller/basic_controller/cockroach/glockroach cockroach_cell_line = CELL_LINE_TABLE_GLOCKROACH @@ -112,7 +112,7 @@ gold_core_spawnable = HOSTILE_SPAWN attack_sound = 'sound/weapons/bladeslice.ogg' attack_vis_effect = ATTACK_EFFECT_SLASH - faction = list("hostile") + faction = list("hostile", FACTION_MAINT_CREATURES) sharpness = SHARP_POINTY ai_controller = /datum/ai_controller/basic_controller/cockroach/hauberoach cockroach_cell_line = CELL_LINE_TABLE_HAUBEROACH @@ -144,3 +144,17 @@ /datum/ai_behavior/basic_melee_attack/hauberoach //Slightly slower, as this is being made in feature freeze ;) action_cooldown = 1 SECONDS + +/datum/ai_controller/basic_controller/cockroach/sewer + planning_subtrees = list( + /datum/ai_planning_subtree/random_speech/cockroach, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/basic_melee_attack_subtree/sewer, + /datum/ai_planning_subtree/find_and_hunt_target/roach, + ) + +/datum/ai_planning_subtree/basic_melee_attack_subtree/sewer + melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/sewer + +/datum/ai_behavior/basic_melee_attack/sewer + action_cooldown = 0.8 SECONDS diff --git a/code/modules/mob/living/basic/vermin/mouse.dm b/code/modules/mob/living/basic/vermin/mouse.dm index 6a7c6531a7f..0ed42ffb28a 100644 --- a/code/modules/mob/living/basic/vermin/mouse.dm +++ b/code/modules/mob/living/basic/vermin/mouse.dm @@ -16,7 +16,7 @@ held_w_class = WEIGHT_CLASS_TINY mob_biotypes = MOB_ORGANIC|MOB_BEAST gold_core_spawnable = FRIENDLY_SPAWN - faction = list(FACTION_RAT) + faction = list(FACTION_RAT, FACTION_MAINT_CREATURES) butcher_results = list(/obj/item/food/meat/slab/mouse = 1) speak_emote = list("squeaks") @@ -345,7 +345,7 @@ /// AI controller for rats, slightly more complex than mice becuase they attack people /datum/ai_controller/basic_controller/mouse/rat blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/rat(), + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), BB_BASIC_MOB_CURRENT_TARGET = null, // heathen BB_CURRENT_HUNTING_TARGET = null, // cheese BB_LOW_PRIORITY_HUNTING_TARGET = null, // cable @@ -367,6 +367,3 @@ /datum/ai_behavior/basic_melee_attack/rat action_cooldown = 2 SECONDS - -/datum/targetting_datum/basic/rat - check_factions_exactly = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/goose.dm b/code/modules/mob/living/simple_animal/hostile/goose.dm index afa2bfbb864..b19cc323f42 100644 --- a/code/modules/mob/living/simple_animal/hostile/goose.dm +++ b/code/modules/mob/living/simple_animal/hostile/goose.dm @@ -88,6 +88,7 @@ response_disarm_simple = "gently push aside" response_harm_continuous = "kicks" response_harm_simple = "kick" + faction = list("neutral", FACTION_MAINT_CREATURES) gold_core_spawnable = NO_SPAWN random_retaliate = FALSE var/vomiting = FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/regalrat.dm b/code/modules/mob/living/simple_animal/hostile/regalrat.dm index 45e680a2dd0..6c80e782eb4 100644 --- a/code/modules/mob/living/simple_animal/hostile/regalrat.dm +++ b/code/modules/mob/living/simple_animal/hostile/regalrat.dm @@ -26,7 +26,7 @@ attack_sound = 'sound/weapons/bladeslice.ogg' attack_vis_effect = ATTACK_EFFECT_CLAW unique_name = TRUE - faction = list(FACTION_RAT) + faction = list(FACTION_RAT, FACTION_MAINT_CREATURES) ///Whether or not the regal rat is already opening an airlock var/opening_airlock = FALSE ///The spell that the rat uses to generate miasma @@ -257,35 +257,100 @@ /datum/action/cooldown/riot/proc/riot() var/cap = CONFIG_GET(number/ratcap) var/uplifted_mice = FALSE - for(var/mob/living/basic/mouse/nearby_mouse in oview(owner, 5)) - // This mouse is already rat controlled, let's not bother with it. - if(istype(nearby_mouse.ai_controller, /datum/ai_controller/basic_controller/mouse/rat)) + var/uplifted_frog = FALSE + var/uplifted_roach = FALSE + var/list/converted_check_list = list(FACTION_RAT) + for(var/mob/living/simple_animal/hostile/retaliate/frog/nearby_frog in oview(owner, 5)) + // No need to convert when not on the same team. + if(faction_check(nearby_frog.faction, converted_check_list)) continue - var/mob/living/basic/mouse/rat/rat_path = /mob/living/basic/mouse/rat - - // Buffs our combat stats to that of a rat - nearby_mouse.melee_damage_lower = initial(rat_path.melee_damage_lower) - nearby_mouse.melee_damage_upper = initial(rat_path.melee_damage_upper) - nearby_mouse.obj_damage = initial(rat_path.obj_damage) - nearby_mouse.maxHealth = initial(rat_path.maxHealth) - nearby_mouse.health = initial(rat_path.health) - // Replace our AI with a rat one - nearby_mouse.ai_controller = new /datum/ai_controller/basic_controller/mouse/rat(nearby_mouse) - // Give a hint in description too - nearby_mouse.desc += " ...Except this one looks corrupted and aggressive." - // Now we share factions! - nearby_mouse.faction = owner.faction.Copy() - uplifted_mice = TRUE - - if(uplifted_mice) - owner.visible_message(span_warning("[owner] commands their army to action, mutating them into rats!")) - - else if(LAZYLEN(SSmobs.cheeserats) < cap) - new /mob/living/basic/mouse(owner.loc) - owner.visible_message(span_warning("[owner] commands a rat to their side!")) + if(nearby_frog.name == "frog") + nearby_frog.name = "trash frog" + nearby_frog.icon_state += "_trash" + nearby_frog.icon_living += "_trash" + nearby_frog.icon_dead = nearby_frog.icon_state + "_dead" + else if(nearby_frog.name == "rare frog") + nearby_frog.name = "rare trash frog" + nearby_frog.icon_state += "_trash" + nearby_frog.icon_living += "_trash" + nearby_frog.icon_dead = nearby_frog.icon_state + "_dead" + nearby_frog.desc += " ...Except this one lives in a trash bag." + nearby_frog.maxHealth += 10 + nearby_frog.health += 10 + nearby_frog.melee_damage_lower += 1 + nearby_frog.melee_damage_upper += 5 + nearby_frog.faction = owner.faction.Copy() + uplifted_frog = TRUE + break + if(uplifted_frog) + owner.visible_message(span_warning("[owner] commands their army to action, mutating them trash frogs!")) else - to_chat(owner,span_warning("There's too many mice on this station to beckon a new one! Find them first!")) + for(var/mob/living/basic/cockroach/nearby_roach in oview(owner, 5)) + // No need to convert when not on the same team. + if(faction_check(nearby_roach.faction, converted_check_list)) + continue + if(istype(nearby_roach, /mob/living/basic/cockroach/glockroach)) + if(nearby_roach.name == "glockroach") + nearby_roach.name = "sewer glockroach" + nearby_roach.melee_damage_lower += 0.5 + nearby_roach.melee_damage_upper += 2 + else if(istype(nearby_roach, /mob/living/basic/cockroach/hauberoach)) + if(nearby_roach.name == "hauberoach") + nearby_roach.name = "sewer hauberoach" + nearby_roach.melee_damage_lower += 0.5 + nearby_roach.melee_damage_upper += 2 + else + if(nearby_roach.name == "cockroach") + nearby_roach.name = "sewer cockroach" + nearby_roach.melee_damage_lower += 2 + nearby_roach.melee_damage_upper += 4 + nearby_roach.obj_damage += 5 + nearby_roach.ai_controller = new /datum/ai_controller/basic_controller/cockroach/sewer(nearby_roach) + nearby_roach.desc += " ...Except this one looks very robust." + nearby_roach.icon_state += "_sewer" + nearby_roach.maxHealth += 1 + nearby_roach.health += 1 + nearby_roach.faction = owner.faction.Copy() + uplifted_roach = TRUE + break + + if(uplifted_roach) + owner.visible_message(span_warning("[owner] commands their army to action, mutating them into sewer roaches!")) + else if(!uplifted_frog) + for(var/mob/living/basic/mouse/nearby_mouse in oview(owner, 5)) + // This mouse is already rat controlled, let's not bother with it. + if(istype(nearby_mouse.ai_controller, /datum/ai_controller/basic_controller/mouse/rat)) + continue + var/mob/living/basic/mouse/rat/rat_path = /mob/living/basic/mouse/rat + + // Change name + if(nearby_mouse.name == "mouse") + nearby_mouse.name = initial(rat_path.name) + // Buffs our combat stats to that of a rat + nearby_mouse.melee_damage_lower = initial(rat_path.melee_damage_lower) + nearby_mouse.melee_damage_upper = initial(rat_path.melee_damage_upper) + nearby_mouse.obj_damage = initial(rat_path.obj_damage) + nearby_mouse.maxHealth = initial(rat_path.maxHealth) + nearby_mouse.health = initial(rat_path.health) + // Replace our AI with a rat one + nearby_mouse.ai_controller = new /datum/ai_controller/basic_controller/mouse/rat(nearby_mouse) + // Give a hint in description too + nearby_mouse.desc += " ...Except this one looks corrupted and aggressive." + // Now we share factions! + nearby_mouse.faction = owner.faction.Copy() + uplifted_mice = TRUE + break + + if(uplifted_mice) + owner.visible_message(span_warning("[owner] commands their army to action, mutating them into rats!")) + + else if(LAZYLEN(SSmobs.cheeserats) < cap) + new /mob/living/basic/mouse(owner.loc) + owner.visible_message(span_warning("[owner] commands a rat to their side!")) + + else + to_chat(owner,span_warning("There's too many mice on this station to beckon a new one! Find them first!")) StartCooldown() diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm index 63f55f5847d..3cdd8663ebd 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm @@ -22,7 +22,7 @@ response_harm_continuous = "splats" response_harm_simple = "splat" density = FALSE - faction = list("hostile") + faction = list("hostile", FACTION_MAINT_CREATURES) attack_sound = 'sound/effects/reee.ogg' butcher_results = list(/obj/item/food/nugget = 1) pass_flags = PASSTABLE | PASSGRILLE | PASSMOB diff --git a/icons/mob/clothing/head/pets_head.dmi b/icons/mob/clothing/head/pets_head.dmi index 94d1b237564..387f51d9b55 100644 Binary files a/icons/mob/clothing/head/pets_head.dmi and b/icons/mob/clothing/head/pets_head.dmi differ diff --git a/icons/mob/simple/animal.dmi b/icons/mob/simple/animal.dmi index 2ef3173b6cb..dca25f73f99 100644 Binary files a/icons/mob/simple/animal.dmi and b/icons/mob/simple/animal.dmi differ