diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_bughabitat.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_bughabitat.dmm index 790595420a3..ade8cf26c11 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_bughabitat.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_bughabitat.dmm @@ -29,7 +29,9 @@ /turf/open/floor/plastic, /area/ruin/bughabitat) "cK" = ( -/mob/living/simple_animal/ant, +/mob/living/simple_animal/hostile/ant{ + environment_smash = 0 + }, /turf/open/floor/grass, /area/ruin/bughabitat) "eM" = ( diff --git a/code/datums/components/food/decomposition.dm b/code/datums/components/food/decomposition.dm index ff3da2bdc96..ff371e9b773 100644 --- a/code/datums/components/food/decomposition.dm +++ b/code/datums/components/food/decomposition.dm @@ -76,7 +76,7 @@ var/turf/open/open_turf = food.loc - if(!istype(open_turf)) //Are we actually in an open turf? + if(!istype(open_turf) || istype(open_turf, /turf/open/lava)) //Are we actually in a valid open turf? remove_timer() return diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index f9ecf4e83c4..2896f049e4a 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -1025,6 +1025,15 @@ processing_speed = STATUS_EFFECT_NORMAL_PROCESS /// Will act as the main timer as well as changing how much damage the ants do. var/ants_remaining = 0 + /// Common phrases people covered in ants scream + var/static/list/ant_debuff_speech = list( + "GET THEM OFF ME!!", + "OH GOD THE ANTS!!", + "MAKE IT END!!", + "THEY'RE EVERYWHERE!!", + "GET THEM OFF!!", + "SOMEBODY HELP ME!!" + ) /datum/status_effect/ants/on_creation(mob/living/new_owner, amount_left) if(isnum(amount_left) && new_owner.stat < HARD_CRIT) @@ -1063,7 +1072,7 @@ if(prob(15)) switch(rand(1,2)) if(1) - victim.say(pick("GET THEM OFF ME!!", "OH GOD THE ANTS!!", "MAKE IT END!!", "THEY'RE EVERYWHERE!!", "GET THEM OFF!!", "SOMEBODY HELP ME!!"), forced = /datum/status_effect/ants) + victim.say(pick(ant_debuff_speech), forced = /datum/status_effect/ants) if(2) victim.emote("scream") if(prob(50)) // Most of the damage is done through random chance. When tested yielded an average 100 brute with 200u ants. diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index 95ba009efc8..18522e575da 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -268,8 +268,12 @@ beauty = -150 plane = GAME_PLANE layer = LOW_OBJ_LAYER + /// The damage the ants will do when you step on them var/ant_bite_damage = 0.1 + /// The amount of ant reagent inside the ant cluster var/ant_volume + /// Sound the ants make when biting + var/bite_sound = 'sound/weapons/bite.ogg' /obj/effect/decal/cleanable/ants/Initialize(mapload) . = ..() @@ -280,7 +284,11 @@ /obj/effect/decal/cleanable/ants/proc/update_ant_damage(spilled_ants) ant_volume += spilled_ants ant_bite_damage = min(10, round((ant_volume * 0.1),0.1)) // 100u ants = 10 max_damage - AddComponent(/datum/component/caltrop, min_damage = 0.1, max_damage = ant_bite_damage, flags = (CALTROP_NOCRAWL | CALTROP_NOSTUN | CALTROP_BYPASS_SHOES), soundfile = 'sound/weapons/bite.ogg') + + var/ant_flags = (CALTROP_NOCRAWL | CALTROP_NOSTUN) /// Small amounts of ants won't be able to bite through shoes. + if(ant_bite_damage > 1) + ant_flags = (CALTROP_NOCRAWL | CALTROP_NOSTUN | CALTROP_BYPASS_SHOES) + switch(ant_bite_damage) if(0 to 1) icon_state = initial(icon_state) @@ -290,3 +298,10 @@ icon_state = "[initial(icon_state)]_3" if(7.1 to 10) icon_state = "[initial(icon_state)]_4" + + AddComponent(/datum/component/caltrop, min_damage = 0.1, max_damage = ant_bite_damage, flags = ant_flags, soundfile = bite_sound) + update_icon(UPDATE_OVERLAYS) + +/obj/effect/decal/cleanable/ants/update_overlays() + . = ..() + . += emissive_appearance(icon, "[icon_state]_light", alpha = src.alpha) diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 2708aafce66..44d5e944669 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -744,7 +744,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /mob/living/basic/cockroach, /obj/item/queen_bee, /obj/structure/spider/spiderling, - /mob/living/simple_animal/ant, + /mob/living/simple_animal/hostile/ant, /obj/effect/decal/cleanable/ants, )) diff --git a/code/modules/mob/living/simple_animal/friendly/ant.dm b/code/modules/mob/living/simple_animal/friendly/ant.dm deleted file mode 100644 index 89f108a783e..00000000000 --- a/code/modules/mob/living/simple_animal/friendly/ant.dm +++ /dev/null @@ -1,50 +0,0 @@ -/mob/living/simple_animal/ant - name = "giant ant" - desc = "A writhing mass of ants, glued together to make an adorable pet!" - icon = 'icons/mob/pets.dmi' - icon_state = "ant" - icon_living = "ant" - icon_dead = "ant_dead" - speak = list("BZZZZT!", "CHTCHTCHT!", "Bzzz", "ChtChtCht") - speak_emote = list("buzzes", "chitters") - emote_hear = list("buzzes.", "clacks.") - emote_see = list("shakes its head.", "twitches its antennae.") - speak_chance = 1 - turns_per_move = 5 - see_in_dark = 6 - pass_flags = PASSTABLE - mob_size = MOB_SIZE_SMALL - mob_biotypes = MOB_ORGANIC|MOB_BUG - minbodytemp = 200 - maxbodytemp = 400 - unsuitable_atmos_damage = 1 - butcher_results = list(/obj/item/food/meat/slab = 2, /obj/effect/decal/cleanable/ants = 1) //It's just a bunch of ants glued together into a larger ant - response_help_continuous = "pets" - response_help_simple = "pet" - response_disarm_continuous = "gently pushes aside" - response_disarm_simple = "gently push aside" - response_harm_continuous = "kicks" - response_harm_simple = "kick" - gold_core_spawnable = FRIENDLY_SPAWN - can_be_held = FALSE - footstep_type = FOOTSTEP_MOB_CLAW - health = 75 - maxHealth = 75 - // randomizes hunting intervals, minimum 5 turns - var/time_to_hunt = 5 - -/mob/living/simple_animal/ant/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - time_to_hunt = rand(5,10) - -/mob/living/simple_animal/ant/Life(delta_time = SSMOBS_DT, times_fired) // In this larger state, the ants have become the predators. - . = ..() - turns_since_scan++ - if(turns_since_scan > time_to_hunt) - turns_since_scan = 0 - var/list/target_types = list(/mob/living/basic/cockroach) - for(var/mob/living/simple_animal/hostile/potential_target in view(2, get_turf(src))) - if(potential_target.type in target_types) - hunt(potential_target) - return diff --git a/code/modules/mob/living/simple_animal/hostile/ant.dm b/code/modules/mob/living/simple_animal/hostile/ant.dm new file mode 100644 index 00000000000..72a9286069d --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/ant.dm @@ -0,0 +1,48 @@ +/mob/living/simple_animal/hostile/ant + name = "giant ant" + desc = "A writhing mass of ants, glued together to make an adorable pet!" + icon = 'icons/mob/pets.dmi' + icon_state = "ant" + icon_living = "ant" + icon_dead = "ant_dead" + speak = list("BZZZZT!", "CHTCHTCHT!", "Bzzz", "ChtChtCht") + speak_emote = list("buzzes", "chitters") + emote_hear = list("buzzes.", "clacks.") + emote_see = list("shakes their head.", "twitches their antennae.") + speak_chance = 1 + turns_per_move = 5 + see_in_dark = 6 + gender = PLURAL // We are Ven-ant + pass_flags = PASSTABLE + mob_size = MOB_SIZE_SMALL + mob_biotypes = MOB_ORGANIC|MOB_BUG + minbodytemp = 200 + maxbodytemp = 400 + harm_intent_damage = 4 + obj_damage = 5 + melee_damage_lower = 5 + melee_damage_upper = 10 // Higher health than a base carp, so much lower damage. + attack_verb_continuous = "bites" + attack_verb_simple = "bite" + attack_sound = 'sound/weapons/bite.ogg' + attack_vis_effect = ATTACK_EFFECT_BITE + butcher_results = list(/obj/effect/decal/cleanable/ants = 3) //It's just a bunch of ants glued together into a larger ant + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "kicks" + response_harm_simple = "kick" + gold_core_spawnable = FRIENDLY_SPAWN + faction = list("neutral") + can_be_held = FALSE + footstep_type = FOOTSTEP_MOB_CLAW + health = 100 + maxHealth = 100 + light_range = 1.5 // Bioluminescence! + light_color = "#d43229" // The ants that comprise the giant ant still glow red despite the sludge. + +/mob/living/simple_animal/hostile/ant/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + AddElement(/datum/element/pet_bonus, "clacks happily!") diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 936c30140ce..75eb49fdcba 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -2756,19 +2756,29 @@ var/ant_damage = 0 /// Tells the debuff how many ants we are being covered with. var/amount_left = 0 + /// List of possible common statements to scream when eating ants + var/static/list/ant_screams = list( + "THEY'RE UNDER MY SKIN!!", + "GET THEM OUT OF ME!!", + "HOLY HELL THEY BURN!!", + "MY GOD THEY'RE INSIDE ME!!", + "GET THEM OUT!!" + ) /datum/reagent/ants/on_mob_life(mob/living/carbon/victim, delta_time) victim.adjustBruteLoss(max(0.1, round((ant_damage * 0.025),0.1))) //Scales with time. Roughly 32 brute with 100u. + ant_damage++ + if(ant_damage < 5) // Makes ant food a little more appetizing, since you won't be screaming as much. + return ..() if(DT_PROB(5, delta_time)) if(DT_PROB(5, delta_time)) //Super rare statement victim.say("AUGH NO NOT THE ANTS! NOT THE ANTS! AAAAUUGH THEY'RE IN MY EYES! MY EYES! AUUGH!!", forced = /datum/reagent/ants) else - victim.say(pick("THEY'RE UNDER MY SKIN!!", "GET THEM OUT OF ME!!", "HOLY HELL THEY BURN!!", "MY GOD THEY'RE INSIDE ME!!", "GET THEM OUT!!"), forced = /datum/reagent/ants) + victim.say(pick(ant_screams), forced = /datum/reagent/ants) if(DT_PROB(15, delta_time)) victim.emote("scream") if(DT_PROB(2, delta_time)) // Stuns, but purges ants. victim.vomit(rand(5,10), FALSE, TRUE, 1, TRUE, FALSE, purge_ratio = 1) - ant_damage++ return ..() /datum/reagent/ants/on_mob_end_metabolize(mob/living/living_anthill) diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index 19638789468..0e2ca6b06f3 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -922,7 +922,7 @@ reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE /datum/chemical_reaction/ant_slurry // We're basically gluing ants together with synthflesh & maint sludge to make a bigger ant. - required_reagents = list(/datum/reagent/ants = 40, /datum/reagent/medicine/c2/synthflesh = 20, /datum/reagent/drug/maint/sludge = 5) + required_reagents = list(/datum/reagent/ants = 50, /datum/reagent/medicine/c2/synthflesh = 20, /datum/reagent/drug/maint/sludge = 5) required_temp = 480 reaction_flags = REACTION_INSTANT reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE @@ -930,5 +930,5 @@ /datum/chemical_reaction/ant_slurry/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) var/location = get_turf(holder.my_atom) for(var/i in rand(1, created_volume) to created_volume) - new /mob/living/simple_animal/ant(location) + new /mob/living/simple_animal/hostile/ant(location) ..() diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi index 4cea28a1349..ee9dd867751 100644 Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 85665ba2ed7..7ad8d4ca645 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -3266,7 +3266,6 @@ #include "code\modules\mob\living\simple_animal\bot\secbot.dm" #include "code\modules\mob\living\simple_animal\bot\SuperBeepsky.dm" #include "code\modules\mob\living\simple_animal\bot\vibebot.dm" -#include "code\modules\mob\living\simple_animal\friendly\ant.dm" #include "code\modules\mob\living\simple_animal\friendly\butterfly.dm" #include "code\modules\mob\living\simple_animal\friendly\cat.dm" #include "code\modules\mob\living\simple_animal\friendly\crab.dm" @@ -3305,6 +3304,7 @@ #include "code\modules\mob\living\simple_animal\guardian\types\standard.dm" #include "code\modules\mob\living\simple_animal\guardian\types\support.dm" #include "code\modules\mob\living\simple_animal\hostile\alien.dm" +#include "code\modules\mob\living\simple_animal\hostile\ant.dm" #include "code\modules\mob\living\simple_animal\hostile\bear.dm" #include "code\modules\mob\living\simple_animal\hostile\bees.dm" #include "code\modules\mob\living\simple_animal\hostile\carp.dm"