Schlorrgo Powercreep (#19420)

Schlorrgo mob given various tweaks to increase resposiveness and QOL

Eggs now process growth as intended (let me know if the way i did it
wasn't the right way, far as I can tell eggs didnt process yet. Testing
shows eggs in cartoons not growing even went removed.)

- Look into Egg Wierdness (No longer doing since better to have that
handled in own PR)
- Make Schlorrgos roll down stairs (Stair PR reverted lol, maybe another
time)
- [x] Make Schlorrgos lay eggs (use ice tunnelers as baseline)
- [x] Kill Commander Nated
- [x] More Schlorrgo interactions?

---------

Signed-off-by: Ben <91219575+Ben10083@users.noreply.github.com>
Co-authored-by: Ben10083 <Ben10083@users.noreply.github.com>
This commit is contained in:
Ben
2024-09-29 15:29:53 +00:00
committed by GitHub
co-authored by Ben10083
parent 839bee6f4f
commit 6f1e1534b4
11 changed files with 275 additions and 82 deletions
@@ -47,7 +47,10 @@
if(!stat && prob(3) && eggsleft > 0 && (gender = FEMALE))
visible_message("[src] lays an egg.")
eggsleft--
new /obj/item/reagent_containers/food/snacks/egg/ice_tunnelers(get_turf(src))
var/obj/item/reagent_containers/food/snacks/egg/ice_tunnelers/egg = new /obj/item/reagent_containers/food/snacks/egg/ice_tunnelers(get_turf(src))
egg.fertilize()
egg.pixel_x = rand(-6,6)
egg.pixel_y = rand(-6,6)
/mob/living/simple_animal/ice_tunneler/male
icon_state = "tunneler_m"
@@ -279,6 +279,7 @@
visible_message("[src] [pick("lays an egg.","squats down and croons.","begins making a huge racket.","begins clucking raucously.")]")
eggsleft--
var/obj/item/reagent_containers/food/snacks/egg/E = new(get_turf(src))
E.fertilize()
E.pixel_x = rand(-6,6)
E.pixel_y = rand(-6,6)
@@ -14,12 +14,12 @@
icon_dead = "schlorrgo_dead"
speak = list("Ough!")
speak_emote = list("moans", "moans raucously")
speak_chance = 1
emote_hear = list("moans", "moans raucously")
emote_see = list("rolls around")
emote_sounds = list('sound/effects/creatures/ough.ogg')
meat_amount = 1
hunger_enabled = TRUE
canbrush = TRUE
@@ -30,7 +30,9 @@
milk_type = /singleton/reagent/drink/milk/schlorrgo
friendly = "bumped"
response_help = "pets"
meat_amount = 1
meat_type = /obj/item/reagent_containers/food/snacks/meat/adhomai
organ_names = list("head", "chest", "fatty core", "blubberous torso", "thick centre", "left leg", "right leg")
butchering_products = list(/obj/item/reagent_containers/food/snacks/spreads/lard = 2)
@@ -38,37 +40,73 @@
holder_type = /obj/item/holder/schlorrgo
max_nutrition = 100
stomach_size_mult = 10
digest_factor = 0.6 // fast eater
metabolic_factor = 0.3
forbidden_foods = list(/obj/item/reagent_containers/food/snacks/egg/schlorrgo)
faction = "Hro'zamal"
var/starting_nutrition = 100
/// When this threshold is reached, grow the Schlorrgo
var/nutrition_threshold = 80
/// Current size of the Schlorrgo.
var/current_size = BABY_SCHLORRGO
/// How many eggs the Schlorrgo is able to lay
var/eggs_left = 0
/// Bigger Schlorrgos can lay more eggs. Starts to increase after schlorrgo becomes fat. When set to 0, Schlorrgo will never lay eggs
var/max_eggs = 0
/mob/living/simple_animal/schlorrgo/Initialize()
. = ..()
nutrition = starting_nutrition
check_wideness_change()
/mob/living/simple_animal/schlorrgo/Life(seconds_per_tick, times_fired)
. =..()
if(!.)
return
if(!stat && prob(3) && eggs_left > 0) // Only fat schlorrgos lay eggs
lay_egg()
/mob/living/simple_animal/schlorrgo/proc/lay_egg()
if(!eggs_left)
return FALSE
// If colossal, high chance for egg to be crushed under weight.....
if(current_size >= COLOSSAL_SCHLORRGO && prob(75))
visible_message("[src] attempts to lift up high enough to lay an egg, but fails, crushing the egg!")
audible_emote("cries out in agony!",0)
make_noise()
eggs_left--
new /obj/effect/decal/cleanable/egg_smudge(get_turf(src))
return
visible_message("[src] lays an egg.")
eggs_left--
var/obj/item/reagent_containers/food/snacks/egg/schlorrgo/egg = new /obj/item/reagent_containers/food/snacks/egg/schlorrgo(get_turf(src))
egg.fertilize()
egg.pixel_x = rand(-6,6)
egg.pixel_y = rand(-6,6)
/mob/living/simple_animal/schlorrgo/unarmed_harm_attack(mob/living/carbon/human/user)
var/obj/item/organ/external/left_leg = user.get_organ(BP_L_LEG)
var/obj/item/organ/external/right_leg = user.get_organ(BP_R_LEG)
if(left_leg?.is_usable() && right_leg?.is_usable())
user.do_attack_animation(src)
make_noise()
audible_emote("[pick(emote_hear)].")
if(current_size >= WIDE_SCHLORRGO)
user.visible_message(SPAN_WARNING("[user] harmlessly kicks \the [src]!"))
user.visible_message(SPAN_WARNING("[user] kicks \the [src], but it doesn't move an inch!"), SPAN_DANGER("Your kick is suddenly stopped by \the [src]'s sheer fat!"))
var/obj/item/organ/external/leg = pick(right_leg, left_leg)
if(leg)
if(current_size >= COLOSSAL_SCHLORRGO) //break leg
leg.fracture()
leg.take_damage(10)
leg.take_damage(5)
else
user.visible_message(SPAN_WARNING("[user] punts \the [src]!"))
user.do_attack_animation(src)
make_noise()
throw_at(get_edge_target_turf(user, get_dir(user, src)), 4, 1)
poke(TRUE)
else
@@ -77,15 +115,19 @@
/mob/living/simple_animal/schlorrgo/turf_collision(var/turf/T, var/speed = THROWFORCE_SPEED_DIVISOR)
visible_message(SPAN_WARNING("[src] harmlessly bounces off \the [T]!"))
playsound(T, 'sound/effects/bangtaper.ogg', 50, 1, 1)
make_noise()
/mob/living/simple_animal/schlorrgo/fall_impact()
visible_message(SPAN_NOTICE("\The [src] bounces after landing!"))
playsound(src, 'sound/effects/bangtaper.ogg', 50, 1, 1)
audible_emote("[pick(emote_hear)].",0)
make_noise()
step(src, pick(GLOB.alldirs), 1)
return FALSE
/mob/living/simple_animal/schlorrgo/process_food()
..()
if(prob(6) && eggs_left < max_eggs) // Change to add egg when fat
eggs_left += 1 // only +1 since this can proc often
check_wideness_change()
/mob/living/simple_animal/schlorrgo/proc/check_wideness_change()
@@ -96,7 +138,8 @@
switch(current_size)
if(EGG_SCHLORRGO)
name = "schlorrgo hatchling"
if(!named)
name = "schlorrgo hatchling"
desc = "A fat creature native to the world of Hro'zamal. This one just hatched from an egg."
current_size = BABY_SCHLORRGO
max_nutrition = 100
@@ -112,7 +155,8 @@
holder_type = /obj/item/holder/schlorrgo/baby
if(BABY_SCHLORRGO)
name = "schlorrgo"
if(!named)
name = "schlorrgo"
desc = "A fat creature native to the world of Hro'zamal."
current_size = NORMAL_SCHLORRGO
max_nutrition = 200
@@ -128,7 +172,8 @@
holder_type = /obj/item/holder/schlorrgo
if(NORMAL_SCHLORRGO)
name = "fat schlorrgo"
if(!named)
name = "fat schlorrgo"
desc = "A fat creature native to the world of Hro'zamal. This one is fatter than most schlorrgo."
current_size = FAT_SCHLORRGO
max_nutrition = 400
@@ -142,9 +187,11 @@
icon_living = "schlorrgo_fat"
icon_dead = "schlorrgo_fat_dead"
holder_type = /obj/item/holder/schlorrgo/fat
max_eggs = 3
if(FAT_SCHLORRGO)
name = "massive schlorrgo"
if(!named)
name = "massive schlorrgo"
desc = "A fat creature native to the world of Hro'zamal. This one is so big it can barely walk."
current_size = WIDE_SCHLORRGO
max_nutrition = 1000
@@ -157,19 +204,22 @@
icon_state = "schlorrgo_wide"
icon_living = "schlorrgo_wide"
icon_dead = "schlorrgo_wide_dead"
response_help = "rubs [name]'s belly"
melee_damage_lower = 15
melee_damage_upper = 15
attacktext = "crushed"
environment_smash = 1
resistance = 2
mob_swap_flags = HUMAN|SIMPLE_ANIMAL|SLIME|MONKEY
mob_push_flags = ALLMOBS
mob_swap_flags = HUMAN|ROBOT
mob_push_flags = HUMAN|ROBOT
a_intent = I_HURT
emote_sounds = list('sound/effects/creatures/schlorrgo_scream.ogg')
holder_type = null
max_eggs = 6
if(WIDE_SCHLORRGO)
name = "colossal schlorrgo"
if(!named)
name = "colossal schlorrgo"
desc = "A fat creature native to the world of Hro'zamal. This one has been immobilized by its massive weight."
current_size = COLOSSAL_SCHLORRGO
max_nutrition = 1500
@@ -182,6 +232,8 @@
icon_state = "schlorrgo_colossal"
icon_living = "schlorrgo_colossal"
icon_dead = "schlorrgo_colossal_dead"
response_help = "rubs a part of the [name]'s fat mass"
emote_see = list("attempts to roll")
pixel_x = -8
anchored = TRUE
opacity = TRUE
@@ -189,11 +241,14 @@
melee_damage_upper = 25
environment_smash = 2
resistance = 3
mob_swap_flags = HUMAN|SIMPLE_ANIMAL|SLIME|MONKEY
mob_push_flags = ALLMOBS
mob_bump_flag = HEAVY // Oh lord he comin
mob_swap_flags = HEAVY
mob_push_flags = HEAVY
can_be_buckled = FALSE
a_intent = I_HURT
emote_sounds = list('sound/effects/creatures/schlorrgo_scream.ogg')
holder_type = null
max_eggs = 9
update_icon()
@@ -278,7 +333,7 @@
emote_hear = list("beeps", "beeps maliciously")
emote_sounds = list('sound/effects/creatures/evil_cybeough.ogg')
faction = "Hro'zamal"
faction = "PRA" // Evil PRA Machine
maxHealth = 80
health = 80
@@ -14,50 +14,69 @@
mob_swap_flags = MONKEY|SLIME|SIMPLE_ANIMAL
mob_push_flags = MONKEY|SLIME|SIMPLE_ANIMAL
/// The type of damage this mob deals.
/// The type of damage this mob deals
var/damage_type = DAMAGE_BRUTE
var/show_stat_health = 1 //does the percentage health show in the stat panel for the mob
/// Does the percentage health show in the stat panel for the mob
var/show_stat_health = 1
var/in_stasis = FALSE
var/icon_living = ""
var/icon_dead = ""
var/icon_gib = null //We only try to show a gibbing animation if this exists.
/// We only try to show a gibbing animation if this exists
var/icon_gib = null
appearance_flags = KEEP_TOGETHER
var/blood_type = COLOR_HUMAN_BLOOD //Blood colour for impact visuals.
/// Blood colour for impact visuals
var/blood_type = COLOR_HUMAN_BLOOD
var/blood_overlay_icon = 'icons/mob/npc/blood_overlay.dmi'
var/blood_state = BLOOD_NONE
var/image/blood_overlay
/// If the animal is bleeding.
var/bleeding = FALSE
var/blood_amount = 20 // set a limit to the amount of blood it can bleed, otherwise it will keep bleeding forever and crunk the server
var/previous_bleed_timer = 0 // they only bleed for as many seconds as force damage was applied to them
var/blood_timer_mod = 0.25 // tweak to change the amount of seconds a mob will bleed
/// Set a limit to the amount of blood it can bleed, otherwise it will keep bleeding forever and crunk the server
var/blood_amount = 20
/// They only bleed for as many seconds as force damage was applied to them
var/previous_bleed_timer = 0
/// Tweak to change the amount of seconds a mob will bleed
var/blood_timer_mod = 0.25
/// What language a animal would speak by default. Try not to think about it too hard
var/simple_default_language = LANGUAGE_TCB
universal_speak = TRUE // since most mobs verbalize sounds, this is the better option, just set this to false on mobs that don't make noise
var/list/speak = list()
var/speak_chance = 0
var/list/emote_hear = list() //Hearable emotes
var/list/emote_see = list() //Unlike speak_emote, the list of things in this variable only show by themselves with no spoken text. IE: Ian barks, Ian yaps
/// Hearable emotes
var/list/emote_hear = list()
/// Unlike speak_emote, the list of things in this variable only show by themselves with no spoken text. IE: Ian barks, Ian yaps
var/list/emote_see = list()
///A list of sounds that this animal will randomly play, lazy list
/// A list of sounds that this animal will randomly play, lazy list
var/list/emote_sounds
var/sound_time = TRUE
var/turns_per_move = 1
var/turns_since_move = 0
universal_speak = 0 //No, just no.
/// How much meat is provided when butchering
var/meat_amount = 0
/// What kind of meat is provided. Do not set this to non meats, use butchering_products instead
var/meat_type
var/stop_thinking = FALSE // prevents them from doing any AI stuff whatsoever
var/stop_automated_movement = 0 //Use this to temporarely stop random movement or to if you write special movement code for animals.
var/wander = 1 // Does the mob wander around when idle?
var/wanders_diagonally = FALSE // does the mob move diagonally when wandering?
var/stop_automated_movement_when_pulled = 1 //When set to 1 this stops the animal from moving when someone is pulling it.
var/atom/movement_target = null//Thing we're moving towards
/// Prevents them from doing any AI stuff whatsoever
var/stop_thinking = FALSE
/// Use this to temporarely stop random movement or to if you write special movement code for animals
var/stop_automated_movement = FALSE
/// Does the mob wander around when idle?
var/wander = TRUE
/// does the mob move diagonally when wandering?
var/wanders_diagonally = FALSE
/// When set to TRUE this stops the animal from moving when someone is pulling it
var/stop_automated_movement_when_pulled = TRUE
/// Thing we're moving towards
var/atom/movement_target = null
var/turns_since_scan = 0
//Interaction
@@ -65,18 +84,22 @@
var/response_help = "tries to help"
var/response_disarm = "tries to disarm"
var/response_harm = "hurts"
var/harm_intent_damage = 3 //The maximum amount of damage this mob can take from simple unarmed attacks that don't have damage values, like punches
/// The maximum amount of damage this mob can take from simple unarmed attacks that don't have damage values, like punches
var/harm_intent_damage = 3
//Temperature effect
var/minbodytemp = 250
var/maxbodytemp = 350
var/heat_damage_per_tick = 3 //amount of damage applied if animal's body temperature is higher than maxbodytemp
var/cold_damage_per_tick = 2 //same as heat_damage_per_tick, only if the bodytemperature it's lower than minbodytemp
/// Amount of damage applied if animal's body temperature is higher than maxbodytemp
var/heat_damage_per_tick = 3
/// Same as heat_damage_per_tick, only if the bodytemperature it's lower than minbodytemp
var/cold_damage_per_tick = 2
var/fire_alert = 0
//Atmos effect - Yes, you can make creatures that require phoron or co2 to survive. N2O is a trace gas and handled separately, hence why it isn't here. It'd be hard to add it. Hard and me don't mix (Yes, yes make all the dick jokes you want with that.) - Errorage
//Leaving something at 0 means it's off - has no maximum
var/min_oxy = 5
var/max_oxy = 0 //Leaving something at 0 means it's off - has no maximum
var/max_oxy = 0
var/min_tox = 0
var/max_tox = 1
var/min_co2 = 0
@@ -85,8 +108,10 @@
var/max_n2 = 0
var/min_h2 = 0
var/max_h2 = 5
var/unsuitable_atoms_damage = 2 //This damage is taken when atmos doesn't fit all the requirements above
var/speed = 0 //LETS SEE IF I CAN SET SPEEDS FOR SIMPLE MOBS WITHOUT DESTROYING EVERYTHING. Higher speed is slower, negative speed is faster
/// This damage is taken when atmos doesn't fit all the requirements above
var/unsuitable_atoms_damage = 2
/// Higher speed is slower, negative speed is faster
var/speed = 0 // LETS SEE IF I CAN SET SPEEDS FOR SIMPLE MOBS WITHOUT DESTROYING EVERYTHING!!!
//LETTING SIMPLE ANIMALS ATTACK? WHAT COULD GO WRONG. Defaults to zero so Ian can still be cuddly
var/melee_damage_lower = 0
@@ -97,8 +122,10 @@
var/attack_sound = /singleton/sound_category/swing_hit_sound
var/friendly = "nuzzles"
var/environment_smash = 0
var/resistance = 0 // Damage reduction
var/resist_mod = 1 // a multiplier for the chance the animal has to break out
/// Damage reduction
var/resistance = 0
/// A multiplier for the chance the animal has to break out
var/resist_mod = 1
//Null rod stuff
var/supernatural = 0
@@ -106,38 +133,51 @@
//Hunger/feeding vars
var/hunger_enabled = 1//If set to 0, a creature ignores hunger
/// If set to FALSE, creature ignores hunger
var/hunger_enabled = TRUE
max_nutrition = 50
var/metabolic_factor = 1//A multiplier on how fast nutrition is lost. used to tweak the rates on a per-animal basis
var/nutrition_step = 0.2 //nutrition lost per tick and per step, calculated from mob_size, 0.2 is a fallback
/// A multiplier on how fast nutrition is lost. used to tweak the rates on a per-animal basis
var/metabolic_factor = 1
/// Nutrition lost per tick and per step, calculated from mob_size, 0.2 is a fallback
var/nutrition_step = 0.2
var/bite_factor = 0.4
var/digest_factor = 0.2 //A multiplier on how quickly reagents are digested
/// A multiplier on how quickly reagents are digested
var/digest_factor = 0.2
var/stomach_size_mult = 5
var/list/forbidden_foods = list() //Foods this animal should never eat
/// Foods this animal should never eat
var/list/forbidden_foods = list()
//Seeking/Moving behaviour vars
var/min_scan_interval = 1//Minimum and maximum number of procs between a scan
var/min_scan_interval = 1
var/max_scan_interval = 15
var/scan_interval = 5//current scan interval, clamped between min and max
//It gradually increases up to max when its left alone, to save performance
/// current scan interval, clamped between min and max.
/// It gradually increases up to max when its left alone, to save performance
var/scan_interval = 5
var/seek_speed = 2//How many tiles per second the animal will move towards something
/// How many tiles per second the animal will move towards something
var/seek_speed = 2
var/seek_move_delay
var/scan_range = 6//How far around the animal will look for something
/// How far around the animal will look for something
var/scan_range = 6
var/kitchen_tag = "animal" //Used for cooking with animals
/// Used for cooking with animals
var/kitchen_tag = "animal"
//brushing
var/canbrush = FALSE //can we brush this beautiful creature?
var/brush = /obj/item/haircomb //What can we brush it with? Use a rag for things with scales/carapaces/etc
/// Can we brush this beautiful creature?
var/canbrush = FALSE
/// What can we brush it with? Use a rag for things with scales/carapaces/etc
var/brush = /obj/item/haircomb
//Napping
var/can_nap = 0
var/icon_rest = null
var/tameable = TRUE //if you can tame it, used by the dociler for now
/// If you can tame it, used by the dociler for now
var/tameable = TRUE
var/flying = FALSE //if they can fly, which stops them from falling down and allows z-space travel
/// If they can fly, which stops them from falling down and allows z-space travel
var/flying = FALSE
/// Whether this animal can be milked or not.
var/can_be_milked = FALSE
@@ -151,18 +191,21 @@
/// What the animal's milking product is.
var/milk_type = /singleton/reagent/drink/milk
var/list/butchering_products //if anything else is created when butchering this creature, like bones and leather
/// If anything else is created when butchering this creature, like bones and leather
var/list/butchering_products
var/psi_pingable = TRUE
var/armor_type = /datum/component/armor
var/list/natural_armor //what armor animal has
/// What armor animal has
var/list/natural_armor
//for simple animals that reflect damage when attacked in melee
var/return_damage_min
var/return_damage_max
var/dead_on_map = FALSE //if true, kills the mob when it spawns (it is for mapping)
/// If true, kills the mob when it spawns (it is for mapping)
var/dead_on_map = FALSE
var/vehicle_version = null
/**
@@ -440,9 +483,9 @@
if(food_choices.len) //Only when sufficiently hungry
UnarmedAttack(pick(food_choices))
//Simple reagent processing for simple animals
//This allows animals to digest food, and only food
//Most drugs, poisons etc, are designed to work on carbons and affect many values a simple animal doesnt have
/// Simple reagent processing for simple animals
/// This allows animals to digest food, and only food
/// Most drugs, poisons etc, are designed to work on carbons and affect many values a simple animal doesnt have
/mob/living/simple_animal/proc/process_food()
if (hunger_enabled)
if (nutrition)
@@ -489,7 +532,7 @@
if(act)
..(act, type, desc)
//This is called when an animal 'speaks'. It does nothing here, but descendants should override it to add audio
/// This is called when an animal 'speaks'. It does nothing here, but descendants should override it to add audio
/mob/living/simple_animal/proc/speak_audio()
if(LAZYLEN(emote_sounds))
make_noise(TRUE)
@@ -813,7 +856,7 @@
named = TRUE
do_nickname(M) //This is for commanded mobs who can have a short name, like guard dogs
//This is for commanded mobs who can have a short name, like guard dogs. Does nothing for other mobs for now
/// This is for commanded mobs who can have a short name, like guard dogs. Does nothing for other mobs for now
/mob/living/simple_animal/proc/do_nickname(var/mob/living/M)
@@ -843,7 +886,7 @@
item_to_equip.forceMove(get_turf(src))
return FALSE
// Harvest an animal's delicious byproducts
/// Harvest an animal's delicious byproducts
/mob/living/simple_animal/proc/harvest(var/mob/user)
var/actual_meat_amount = max(1,(meat_amount*0.75))
if(meat_type && actual_meat_amount>0 && (stat == DEAD))
@@ -866,7 +909,7 @@
user.visible_message("<b>\The [user]</b> butchers \the [src] messily!")
gib()
//For picking up small animals
/// For picking up small animals
/mob/living/simple_animal/MouseDrop(atom/over_object)
if (holder_type)//we need a defined holder type in order for picking up to work
var/mob/living/carbon/H = over_object
@@ -879,14 +922,14 @@
//I wanted to call this proc alert but it already exists.
//Basically makes the mob pay attention to the world, resets sleep timers, awakens it from a sleeping state sometimes
/// Basically makes the mob pay attention to the world, resets sleep timers, awakens it from a sleeping state sometimes
/mob/living/simple_animal/proc/poke(var/force_wake = 0)
if (stat != DEAD)
scan_interval = min_scan_interval
if (force_wake || (!client && prob(30)))
wake_up()
//Puts the mob to sleep
/// Puts the mob to sleep
/mob/living/simple_animal/proc/fall_asleep()
if (stat != DEAD)
resting = 1
@@ -897,7 +940,7 @@
movement_target = null
update_icon()
//Wakes the mob up from sleeping
/// Wakes the mob up from sleeping
/mob/living/simple_animal/proc/wake_up()
if (stat != DEAD)
set_stat(CONSCIOUS)