diff --git a/code/game/objects/random/mob.dm b/code/game/objects/random/mob.dm index ac89272f52..bd720faed4 100644 --- a/code/game/objects/random/mob.dm +++ b/code/game/objects/random/mob.dm @@ -33,7 +33,9 @@ prob(10);/mob/living/simple_mob/animal/passive/mouse, prob(10);/mob/living/simple_mob/animal/passive/yithian, prob(10);/mob/living/simple_mob/animal/passive/tindalos, + prob(10);/mob/living/simple_mob/animal/passive/pillbug, prob(10);/mob/living/simple_mob/animal/passive/dog/tamaskan, + prob(10);/mob/living/simple_mob/animal/passive/dog/brittany, prob(3);/mob/living/simple_mob/animal/passive/bird/parrot, prob(1);/mob/living/simple_mob/animal/passive/crab) @@ -69,10 +71,12 @@ /obj/random/mob/sif/item_to_spawn() return pick(prob(30);/mob/living/simple_mob/animal/sif/diyaab, + prob(20);/mob/living/simple_mob/animal/passive/hare, prob(15);/mob/living/simple_mob/animal/passive/crab, prob(15);/mob/living/simple_mob/animal/passive/penguin, prob(15);/mob/living/simple_mob/animal/passive/mouse, prob(15);/mob/living/simple_mob/animal/passive/dog/tamaskan, + prob(10);/mob/living/simple_mob/animal/sif/siffet, prob(2);/mob/living/simple_mob/animal/giant_spider/frost, prob(1);/mob/living/simple_mob/animal/space/goose, prob(20);/mob/living/simple_mob/animal/passive/crab) @@ -88,6 +92,7 @@ /obj/random/mob/sif/peaceful/item_to_spawn() return pick(prob(30);/mob/living/simple_mob/animal/sif/diyaab, + prob(20);/mob/living/simple_mob/animal/passive/hare, prob(15);/mob/living/simple_mob/animal/passive/crab, prob(15);/mob/living/simple_mob/animal/passive/penguin, prob(15);/mob/living/simple_mob/animal/passive/mouse, @@ -102,6 +107,8 @@ /obj/random/mob/sif/hostile/item_to_spawn() return pick(prob(22);/mob/living/simple_mob/animal/sif/savik, prob(33);/mob/living/simple_mob/animal/giant_spider/frost, + prob(20);/mob/living/simple_mob/animal/sif/frostfly, + prob(10);/mob/living/simple_mob/animal/sif/tymisian, prob(45);/mob/living/simple_mob/animal/sif/shantak) /obj/random/mob/sif/kururak @@ -329,6 +336,12 @@ /mob/living/simple_mob/animal/sif/duck, /mob/living/simple_mob/animal/sif/duck ), + prob(15);list( + /mob/living/simple_mob/animal/passive/hare, + /mob/living/simple_mob/animal/passive/hare, + /mob/living/simple_mob/animal/passive/hare, + /mob/living/simple_mob/animal/passive/hare + ), prob(10);list( /mob/living/simple_mob/animal/sif/shantak/retaliate, /mob/living/simple_mob/animal/sif/shantak/retaliate, diff --git a/code/modules/food/food/snacks/meat.dm b/code/modules/food/food/snacks/meat.dm index c2c5753eda..5c65c36649 100644 --- a/code/modules/food/food/snacks/meat.dm +++ b/code/modules/food/food/snacks/meat.dm @@ -34,4 +34,10 @@ /obj/item/weapon/reagent_containers/food/snacks/meat/corgi name = "Corgi meat" - desc = "Tastes like... well, you know." \ No newline at end of file + desc = "Tastes like... well, you know." + +//Meat from Crabs +/obj/item/weapon/reagent_containers/food/snacks/meat/crab + name = "meat" + desc = "A chunk of meat." + icon_state = "crustacean-meat" \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/crab.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/crab.dm index 87c05b317d..f44df6bef4 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/crab.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/crab.dm @@ -48,10 +48,3 @@ /mob/living/simple_mob/animal/passive/crab/sif/Initialize() ..() adjust_scale(rand(5,12) / 10) - -// Meat! - -/obj/item/weapon/reagent_containers/food/snacks/meat/crab - name = "meat" - desc = "A chunk of meat." - icon_state = "crustacean-meat" diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/dog.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/dog.dm index 071ea2b167..a314885038 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/dog.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/dog.dm @@ -231,4 +231,14 @@ name = "Spice" real_name = "Spice" //Intended to hold the name without altering it. gender = FEMALE - desc = "It's a tamaskan, the name Spice can be found on its collar." \ No newline at end of file + desc = "It's a tamaskan, the name Spice can be found on its collar." + +// Brittany Spaniel + +/mob/living/simple_mob/animal/passive/dog/brittany + name = "brittany" + real_name = "brittany" + desc = "It's a brittany spaniel." + icon_state = "brittany" + icon_living = "brittany" + icon_dead = "brittany_dead" \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/frostfly.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/frostfly.dm index 5711868d15..07f3309c8b 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/frostfly.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/frostfly.dm @@ -167,3 +167,4 @@ holder.face_atom(A) F.energy = max(0, F.energy - 1) // The AI will eventually flee. + diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/hare.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/hare.dm new file mode 100644 index 0000000000..6aad0e909a --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/hare.dm @@ -0,0 +1,69 @@ +// Complete chumps but a little bit hardier than mice. + +/datum/category_item/catalogue/fauna/hare + name = "Sivian Fauna - Ice Hare" + desc = "Classification: S Lepus petropellis\ +

\ + Hard-skinned, horned herbivores common on the glacial regions of Sif. \ + The Ice Hare lives in colonies of up to thirty individuals dug beneath thick ice sheets for protection from many burrowing predators. \ + Their diet consists of mostly moss and lichens, though this is supplemented with the consumption of hard mineral pebbles, which it swallows whole, \ + which form the small, hard, 'ice-like' scales of the animal. \ + The Ice Hare is almost completely harmless to sapients, with relatively blunt claws and a weak jaw. Its main forms of self-defense are its speed, \ + and two sharp head spikes whose 'ear-like' appearance gave the species its common name." + value = CATALOGUER_REWARD_EASY + +/mob/living/simple_mob/animal/passive/hare + name = "ice hare" + real_name = "ice hare" + desc = "A small horned herbivore with a tough 'ice-like' hide." + tt_desc = "S Lepus petropellis" //Sivian hare rockskin + catalogue_data = list(/datum/category_item/catalogue/fauna/hare) + + icon_state = "hare" + icon_living = "hare" + icon_dead = "hare_dead" + icon_rest = "hare_rest" + + maxHealth = 20 + health = 20 + + armor = list( + "melee" = 30, + "bullet" = 5, + "laser" = 5, + "energy" = 0, + "bomb" = 10, + "bio" = 0, + "rad" = 0 + ) + + armor_soak = list( + "melee" = 5, + "bullet" = 0, + "laser" = 0, + "energy" = 0, + "bomb" = 0, + "bio" = 0, + "rad" = 0 + ) + + movement_cooldown = 2 + + mob_size = MOB_SMALL + pass_flags = PASSTABLE + layer = MOB_LAYER + density = 0 + + response_help = "pets" + response_disarm = "nudges" + response_harm = "kicks" + + holder_type = /obj/item/weapon/holder/mouse + meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat + + say_list_type = /datum/say_list/hare + +/datum/say_list/hare + speak = list("Snrf...","Crk!") + emote_hear = list("crackles","sniffles") + emote_see = list("stomps the ground", "sniffs the air", "chews on something") \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/moth.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/moth.dm new file mode 100644 index 0000000000..b9aedd5d15 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/moth.dm @@ -0,0 +1,137 @@ +//Very similar to frostflies, but with a non-lethal gas and less damaging, but less easy to protect from, projectiles. + +/datum/category_item/catalogue/fauna/tymisian + name = "Binman Fauna - Tymisian Moth" + desc = "Classification: B Carabidae glacios \ +

\ + A meter-long fuzzy insect from the planet Binma. \ + Frostflies utilize their vestigial wings as a method of dispersing a chemical that produces a rapid \ + endothermic reaction on contact with the air, resulting in the flash-freezing of nearby materials. \ +
\ + Carnivorous in nature, they use their cryogenic compounds to trap smaller prey, or frighten predators. \ + Individuals are known to slalom when facing other creatures, dispersing clouds of gas, and spitting \ + condensed globs of the compound. These masses of mucous and ice seem to be intended to impede movement. \ +
\ + Travelers are advised to avoid frostfly swarms whenever possible, as they will become aggressive \ + to anything other than Diyaabs, which they seem to have formed a tangential symbiosis with." + value = CATALOGUER_REWARD_MEDIUM + +/mob/living/simple_mob/animal/sif/tymisian + name = "Tymisian Moth" + desc = "A huge, fuzzy insect with a disorienting dust." + tt_desc = "B Lepidoptera cinereus" + catalogue_data = list(/datum/category_item/catalogue/fauna/tymisian) + + faction = "spiders" //Hostile to most mobs, not all. + + icon_state = "moth" + icon_living = "moth" + icon_dead = "moth_dead" + icon_rest = "moth_dead" + icon = 'icons/mob/animal.dmi' + + maxHealth = 80 + health = 80 + + hovering = TRUE + + movement_cooldown = 0.5 + + melee_damage_lower = 5 + melee_damage_upper = 10 + base_attack_cooldown = 1.5 SECONDS + attacktext = list("nipped", "bit", "pinched") + + projectiletype = /obj/item/projectile/energy/blob + + special_attack_cooldown = 10 SECONDS + special_attack_min_range = 0 + special_attack_max_range = 6 + + var/energy = 100 + var/max_energy = 100 + + var/datum/effect/effect/system/smoke_spread/mothspore/smoke_spore + + say_list_type = /datum/say_list/tymisian + ai_holder_type = /datum/ai_holder/simple_mob/ranged/kiting/threatening/frostfly //Uses frostfly AI, since so similar mechanically + +/datum/say_list/tymisian + speak = list("Zzzz.", "Rrr...", "Zzt?") + emote_see = list("grooms itself","sprinkles dust from its wings", "rubs its mandibles") + emote_hear = list("chitters", "clicks", "rattles") + + say_understood = list("Ssst.") + say_cannot = list("Zzrt.") + say_maybe_target = list("Rr?") + say_got_target = list("Rrrrt!") + say_threaten = list("Kszsz.","Kszzt...","Kzzi!") + say_stand_down = list("Sss.","Zt.","! clicks.") + say_escalate = list("Rszt!") + + threaten_sound = 'sound/effects/spray3.ogg' + stand_down_sound = 'sound/effects/squelch1.ogg' + + +/obj/effect/effect/smoke/elemental/mothspore + name = "spore cloud" + desc = "A dust cloud filled with disorienting bacterial spores." + color = "#80AB82" + +/obj/effect/effect/smoke/elemental/mothspore/affect(mob/living/L) //Similar to a very weak flash, but depends on breathing instead of eye protection. + if(iscarbon(L)) + var/mob/living/carbon/C = L + if(C.stat != DEAD) + if(C.needs_to_breathe()) + var/spore_strength = 5 + if(ishuman(C)) + var/mob/living/carbon/human/H = C + H.Confuse(spore_strength) + H.eye_blurry = max(H.eye_blurry, spore_strength) + H.adjustHalLoss(10 * (spore_strength / 5)) + +/datum/effect/effect/system/smoke_spread/mothspore + smoke_type = /obj/effect/effect/smoke/elemental/mothspore + +/mob/living/simple_mob/animal/sif/tymisian/do_special_attack(atom/A) + . = TRUE + switch(a_intent) + if(I_DISARM) + if(energy < 20) + return FALSE + + energy -= 20 + + if(smoke_spore) + smoke_spore.set_up(7,0,src) + smoke_spore.start() + return TRUE + + return FALSE + +/mob/living/simple_mob/animal/sif/tymisian/Initialize() + ..() + smoke_spore = new + verbs += /mob/living/proc/ventcrawl + verbs += /mob/living/proc/hide + +/mob/living/simple_mob/animal/sif/tymisian/handle_special() + ..() + + if(energy < max_energy) + energy++ + +/mob/living/simple_mob/animal/sif/tymisian/Stat() + ..() + if(client.statpanel == "Status") + statpanel("Status") + if(emergency_shuttle) + var/eta_status = emergency_shuttle.get_status_panel_eta() + if(eta_status) + stat(null, eta_status) + stat("Energy", energy) + +/mob/living/simple_mob/animal/sif/tymisian/should_special_attack(atom/A) + if(energy >= 20) + return TRUE + return FALSE diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/pillbug.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/pillbug.dm new file mode 100644 index 0000000000..f70ea218c3 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/pillbug.dm @@ -0,0 +1,51 @@ +/datum/category_item/catalogue/fauna/pillbug + name = "Sivian Fauna - Fire Bug" + desc = "Classification: S Armadillidiidae calidi \ +

\ + A 10 inch long, hard-shelled insect with a natural adaption to living around terrestrial lava vents. \ + The fire bug's hard shell offers extremely effective protection against most threats, \ + though the species is almost completely docile, and will prefer to continue grazing on its diet of volcanic micro-flora \ + rather than defend itself in most situations.\ +
\ + The fire bug is a curiosity to most on the frontier, offering little in the way of meaningful food or resources, \ + though at least one Sivian fashion designer has used their iridescent red shells to create striking, hand-made garments." + value = CATALOGUER_REWARD_EASY + +/mob/living/simple_mob/animal/passive/pillbug + name = "fire bug" + desc = "A tiny plated bug found in Sif's volcanic regions." + tt_desc = "S Armadillidiidae calidi" + catalogue_data = list(/datum/category_item/catalogue/fauna/pillbug) + + icon_state = "pillbug" + icon_living = "pillbug" + icon_dead = "pillbug_dead" + + health = 15 + maxHealth = 15 + mob_size = MOB_MINISCULE + + response_help = "gently touches" + response_disarm = "rolls over" + response_harm = "stomps on" + + armor = list( + "melee" = 30, + "bullet" = 10, + "laser" = 50, + "energy" = 50, + "bomb" = 30, + "bio" = 100, + "rad" = 100 + ) + + // The frostfly's body is incredibly cold at all times, natural resistance to things trying to burn it. + armor_soak = list( + "melee" = 10, + "bullet" = 0, + "laser" = 10, + "energy" = 10, + "bomb" = 0, + "bio" = 0, + "rad" = 0 + ) \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/siffet.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/siffet.dm new file mode 100644 index 0000000000..40ae65d3bc --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/siffet.dm @@ -0,0 +1,61 @@ +// Somewhere between a fox and a weasel. Doesn't mess with stuff significantly bigger than it, but you don't want to get on its bad side. + +/datum/category_item/catalogue/fauna/siffet + name = "Sivian Fauna - Siffet" + desc = "Classification: S Pruinaeictis velocis\ +

\ + The Siffet, or Sivian Frost Weasel is a small, solitary predator known for its striking ability to take down prey up to twice their size. \ + The majority of the Siffet's adult life is spent in isolation, prowling large territories in Sif's tundra regions, \ + only seeking out other individuals during the summer mating season, when deadly battles for dominance are common. \ + Though mostly docile towards adult humans and other large sapients, the Siffet has been known to target children and smaller species as prey, \ + and a provoked Siffet can be a danger to even the most experienced handler due to its quick movement and surprisingly powerful jaws. \ + The Siffet is sometimes hunted for its remarkably soft pelt, though most is obtained through fur farming." + value = CATALOGUER_REWARD_MEDIUM + +/mob/living/simple_mob/animal/sif/siffet + name = "siffet" + desc = "A small, solitary predator with silky fur. Despite its size, the Siffet is ferocious when provoked." + tt_desc = "S Pruinaeictis velocis" //Sivian frost weasel, fast + catalogue_data = list(/datum/category_item/catalogue/fauna/siffet) + + faction = "siffet" + + mob_size = MOB_SMALL + + icon_state = "siffet" + icon_living = "siffet" + icon_dead = "siffet_dead" + icon = 'icons/mob/animal.dmi' + + maxHealth = 60 + health = 60 + + movement_cooldown = 0 + + melee_damage_lower = 10 + melee_damage_upper = 15 + base_attack_cooldown = 1 SECOND + attack_sharp = 1 + attacktext = list("sliced", "snapped", "gnawed") + + say_list_type = /datum/say_list/siffet + ai_holder_type = /datum/ai_holder/simple_mob/siffet + +/datum/say_list/siffet + speak = list("Yap!", "Heh!", "Huff.") + emote_see = list("sniffs its surroundings","flicks its ears", "scratches the ground") + emote_hear = list("chatters", "huffs") + +/datum/ai_holder/simple_mob/siffet + hostile = TRUE + retaliate = TRUE + +/datum/ai_holder/simple_mob/siffet/post_melee_attack(atom/A) //Evasive + if(holder.Adjacent(A)) + holder.IMove(get_step(holder, pick(alldirs))) + holder.face_atom(A) + +/mob/living/simple_mob/animal/sif/siffet/IIsAlly(mob/living/L) + . = ..() + if(!. && L.mob_size > 10) //Attacks things it considers small enough to take on, otherwise only attacks if attacked. + return TRUE \ No newline at end of file diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index e42df29d4b..f265594a8d 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/polaris.dme b/polaris.dme index ccb4d57248..6809d53914 100644 --- a/polaris.dme +++ b/polaris.dme @@ -2264,13 +2264,17 @@ #include "code\modules\mob\living\simple_mob\subtypes\animal\sif\duck.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\sif\frostfly.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\sif\glitterfly.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\hare.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\sif\hooligan_crab.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\sif\kururak.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\sif\leech.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\moth.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\pillbug.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\sif\racoon.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\sif\savik.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\sif\shantak.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\sif\sif.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\siffet.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\space\alien.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\space\bats.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\space\bear.dm"