Adds gorillas and cargorillas (#20830)

* goril

* goril2

* arms

* goril3

* goril4

* rampaging

* emote

* trait

* more gorilla

* ooga

* Magillitis Serum Autoinjector, crates

* return to monke

* remove unused trait

* oops

* sirryan

* earth

* Update code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm

Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com>

* Update code/modules/reagents/chemistry/reagents/misc_reagents.dm

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>

* fixes and stuff

* gorilla text clarification

* tweak probs, stop if dead

* volume

* gorilla sleeping attack

* Apply suggestions from code review

Co-authored-by: Nathan Winters <100448493+CinnamonSnowball@users.noreply.github.com>

---------

Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com>
Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Co-authored-by: Nathan Winters <100448493+CinnamonSnowball@users.noreply.github.com>
This commit is contained in:
S34N
2023-06-02 00:36:07 +01:00
committed by GitHub
parent 41a250c4a3
commit bdb8039c8f
42 changed files with 487 additions and 142 deletions
@@ -100,6 +100,7 @@
/obj/item/implant/explosive,
/obj/item/implant/freedom,
/obj/item/implant/traitor,
/obj/item/implant/gorilla_rampage,
))
// Initialize
owning_hub = hub
@@ -41,6 +41,11 @@
name = "meat product"
desc = "A slab of reclaimed and chemically processed meat product."
/obj/item/reagent_containers/food/snacks/meat/slab/gorilla
name = "gorilla meat"
desc = "Much meatier than monkey meat."
list_reagents = list("nutriment" = 5, "vitamin" = 1)
/obj/item/reagent_containers/food/snacks/meat/monkey
//same as plain meat
+4
View File
@@ -6,6 +6,10 @@
if(hand) return l_hand
else return r_hand
/// Specal proc for special mobs that use "hands" in weird ways
/mob/proc/special_get_hands_check()
return
/mob/verb/quick_equip()
set name = "quick-equip"
set hidden = 1
@@ -14,6 +14,7 @@
skinned_type = /obj/item/stack/sheet/animalhide/monkey
greater_form = /datum/species/human
no_equip = list(slot_belt, slot_wear_id, slot_l_ear, slot_r_ear, slot_glasses, slot_gloves, slot_shoes, slot_wear_suit, slot_w_uniform, slot_l_store, slot_r_store, slot_s_store, slot_wear_pda)
inherent_factions = list("jungle", "monkey")
can_craft = FALSE
is_small = 1
has_fine_manipulation = 0
@@ -38,6 +39,11 @@
brute_mod = 1.5
burn_mod = 1.5
/datum/species/monkey/handle_mutations_and_radiation(mob/living/carbon/human/H)
. = ..()
if(H.radiation > RAD_MOB_GORILLIZE && prob(RAD_MOB_GORILLIZE_PROB))
H.gorillize()
/datum/species/monkey/handle_npc(mob/living/carbon/human/H)
if(H.stat != CONSCIOUS)
return
@@ -7,6 +7,7 @@
icon_dead = "bunny_dead"
icon_resting = "bunny_stretch"
emote_see = list("thumps", "sniffs at something", "hops around", "flips their ears up")
faction = list("neutral", "jungle")
turns_per_move = 5
see_in_dark = 6
maxHealth = 10
@@ -6,6 +6,7 @@
icon_dead = "butterfly_dead"
turns_per_move = 1
emote_see = list("flutters")
faction = list("neutral", "jungle")
response_help = "shoos"
response_disarm = "brushes aside"
response_harm = "squashes"
@@ -7,6 +7,7 @@
speak = list("snorts")
speak_emote = list("snorts")
emote_see = list("shakes its head")
faction = list("neutral", "jungle")
speak_chance = 1
turns_per_move = 5
see_in_dark = 0 //I'm so funny
@@ -16,7 +16,7 @@
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "kicks"
faction = list("neutral")
faction = list("neutral", "jungle")
mob_biotypes = MOB_ORGANIC | MOB_BEAST
attack_same = TRUE
attacktext = "kicks"
@@ -15,6 +15,7 @@
response_help = "pets"
response_disarm = "shoos"
response_harm = "stomps on"
faction = list("neutral", "jungle")
ventcrawler = VENTCRAWLER_ALWAYS
density = FALSE
pass_flags = PASSTABLE | PASSMOB
@@ -27,7 +28,7 @@
gold_core_spawnable = FRIENDLY_SPAWN
var/eating_sound = 'sound/weapons/bite.ogg'
/// Lizards start with a tail
var/has_tail = TRUE
var/has_tail = TRUE
/mob/living/simple_animal/lizard/handle_automated_action()
if(!stat && !buckled)
@@ -10,6 +10,7 @@
speak_emote = list("yawns")
emote_hear = list("snores.","yawns.")
emote_see = list("dozes off.", "looks around sleepily.")
faction = list("neutral", "jungle")
speak_chance = 1
turns_per_move = 5
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat = 3)
@@ -25,7 +25,7 @@
response_help = "pets"
response_disarm = "shoos"
response_harm = "steps on"
faction = list("hostile")
faction = list("hostile", "jungle")
ventcrawler = VENTCRAWLER_ALWAYS
density = FALSE
pass_flags = PASSTABLE | PASSMOB
@@ -0,0 +1,258 @@
/mob/living/simple_animal/hostile/gorilla
name = "gorilla"
desc = "A ground-dwelling, predominantly herbivorous ape that inhabits the forests of central Africa on Earth."
icon = 'icons/mob/gorilla.dmi'
icon_state = "crawling"
icon_living = "crawling"
icon_dead = "dead"
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
speak_chance = 80
maxHealth = 220
health = 220
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/gorilla = 4)
response_help = "prods"
response_disarm = "challenges"
response_harm = "thumps"
attacktext = "pummels"
speed = 0.5
melee_damage_lower = 15
melee_damage_upper = 18
damage_coeff = list(BRUTE = 1, BURN = 1.5, TOX = 1.5, CLONE = 0, STAMINA = 0, OXY = 1.5)
obj_damage = 20
environment_smash = ENVIRONMENT_SMASH_WALLS | ENVIRONMENT_SMASH_STRUCTURES
attack_sound = 'sound/weapons/punch1.ogg'
faction = list("hostile", "monkey", "jungle")
robust_searching = TRUE
minbodytemp = 270
maxbodytemp = 350
footstep_type = FOOTSTEP_MOB_BAREFOOT
stat_attack = UNCONSCIOUS // Sleeping won't save you
a_intent = INTENT_HARM // Angrilla
/// Is the gorilla stood up or not?
var/is_bipedal = FALSE
/// The max number of crates we can carry
var/crate_limit = 1
/// Typecache of all the types we can pick up and carry
var/list/carriable_cache
/// A lazylist of all crates we are carrying
var/list/atom/movable/crates_in_hand
/mob/living/simple_animal/hostile/gorilla/Initialize()
. = ..()
var/datum/action/innate/gorilla/gorilla_toggle/toggle = new
toggle.Grant(src)
var/static/default_cache = typecacheof(list(/obj/structure/closet/crate)) // Normal crates only please, no weird sized ones
carriable_cache = default_cache
/mob/living/simple_animal/hostile/gorilla/Destroy()
LAZYCLEARLIST(crates_in_hand)
return ..()
/datum/action/innate/gorilla/gorilla_toggle
name = "Toggle Stand"
desc = "Toggles between crawling and standing up."
icon_icon = 'icons/mob/actions/actions_animal.dmi'
button_icon_state = "gorilla_toggle"
/datum/action/innate/gorilla/gorilla_toggle/Activate()
. = ..()
var/mob/living/simple_animal/hostile/gorilla/gorilla = owner
if(!istype(gorilla))
return
var/mob/living/simple_animal/hostile/gorilla/cargo_domestic/domesticated = gorilla
if(istype(domesticated) && LAZYLEN(domesticated.crates_in_hand))
to_chat(domesticated, "<span class='warning'>You can't get on all fours while carrying something!</span>")
return
gorilla.is_bipedal = !gorilla.is_bipedal // Toggle
gorilla.visible_message("<span class='notice'>[gorilla] [gorilla.is_bipedal ? "stands up menacingly." : "drops back to all fours."]</span>",
"<span class='notice'>You [gorilla.is_bipedal ? "stand up" : "get down on all fours."]</span>",
"<span class='notice'>You hear the sound of a gorilla rustling.</span>")
gorilla.update_icon(UPDATE_ICON_STATE)
// Gorillas like to dismember limbs from unconscious mobs.
/// Returns null when the target is not an unconscious carbon mob; a list of limbs (possibly empty) otherwise.
/mob/living/simple_animal/hostile/gorilla/proc/get_target_bodyparts(atom/hit_target)
if(!ishuman(hit_target))
return
var/mob/living/carbon/human/target = hit_target
if(target.stat < UNCONSCIOUS)
return
var/list/parts = list()
for(var/obj/item/organ/external/part as anything in target.bodyparts)
if(istype(part, /obj/item/organ/external/chest) || istype(part, /obj/item/organ/external/head))
continue // No chest or head removal please
if(part.limb_flags & CANNOT_DISMEMBER)
continue // No dismembering of limbs that cannot be dismembered
parts += part
return parts
/mob/living/simple_animal/hostile/gorilla/AttackingTarget(atom/attacked_target)
if(client)
if(is_type_in_typecache(target, carriable_cache))
var/atom/movable/movable_target = target
if(LAZYLEN(crates_in_hand) >= crate_limit)
to_chat(src, "<span class='warning'>You are carrying too many crates!</span>")
return COMPONENT_CANCEL_ATTACK_CHAIN
for(var/mob/living/inside_mob in movable_target.contents)
if(inside_mob.mob_size < MOB_SIZE_HUMAN)
continue
to_chat(src, "<span class='warning'>This crate is too heavy!</span>")
return COMPONENT_CANCEL_ATTACK_CHAIN
LAZYADD(crates_in_hand, target)
is_bipedal = TRUE
update_icon(UPDATE_OVERLAYS | UPDATE_ICON_STATE)
movable_target.forceMove(src)
return COMPONENT_CANCEL_ATTACK_CHAIN
if(isturf(target) && !is_blocked_turf(target) && LAZYLEN(crates_in_hand))
drop_random_crate(target)
return COMPONENT_CANCEL_ATTACK_CHAIN
. = ..()
if(!.)
return
if(client)
oogaooga()
var/list/parts = get_target_bodyparts(target)
if(length(parts))
var/obj/item/organ/external/to_dismember = pick(parts)
to_dismember.droplimb()
return
if(isliving(target))
var/mob/living/living_target = target
if(prob(80))
living_target.throw_at(get_edge_target_turf(living_target, dir), rand(1, 2), 7, src)
return
living_target.adjustStaminaLoss(40)
visible_message("<span class='warning'>[src] knocks [living_target] down!</span>")
/mob/living/simple_animal/hostile/gorilla/update_icon_state()
. = ..()
if(is_bipedal || LAZYLEN(crates_in_hand))
icon_state = "standing"
return
icon_state = initial(icon_state)
/mob/living/simple_animal/hostile/gorilla/update_overlays()
. = ..()
if(!LAZYLEN(crates_in_hand))
return
var/atom/movable/random_crate = pick(crates_in_hand)
. += mutable_appearance(random_crate.icon, random_crate.icon_state)
. += mutable_appearance(icon, "standing_overlay")
/mob/living/simple_animal/hostile/gorilla/CanAttack(atom/the_target)
var/list/parts = get_target_bodyparts(target)
return ..() && !ismonkeybasic(the_target) && (!parts || length(parts) > 3)
/mob/living/simple_animal/hostile/gorilla/CanSmashTurfs(turf/T)
return iswallturf(T)
/mob/living/simple_animal/hostile/gorilla/handle_automated_speech(override)
if(speak_chance && (override || prob(speak_chance)))
playsound(src, 'sound/creatures/gorilla.ogg', 50)
return ..()
/mob/living/simple_animal/hostile/gorilla/proc/oogaooga()
if(prob(rand(15, 50)))
playsound(src, 'sound/creatures/gorilla.ogg', 50)
/mob/living/simple_animal/hostile/gorilla/special_get_hands_check()
if(LAZYLEN(crates_in_hand))
return pick(crates_in_hand)
/mob/living/simple_animal/hostile/gorilla/death(gibbed)
drop_all_crates(drop_location())
return ..()
/mob/living/simple_animal/hostile/gorilla/examine(mob/user)
. = ..()
var/num_crates = LAZYLEN(crates_in_hand)
if(num_crates)
. += "<span class='notice'>[p_theyre(TRUE)] carrying the following:"
for(var/atom/movable/crate in crates_in_hand)
. += "[crate]."
. += "</span>"
/mob/living/simple_animal/hostile/gorilla/drop_item_v()
drop_random_crate(drop_location())
/// Drops one random crates from our crate list.
/mob/living/simple_animal/hostile/gorilla/proc/drop_random_crate(atom/drop_to)
var/obj/structure/closet/crate/held_crate = pick(crates_in_hand)
held_crate.forceMove(drop_to)
LAZYREMOVE(crates_in_hand, held_crate)
update_icon(UPDATE_OVERLAYS | UPDATE_ICON_STATE)
/// Drops all the crates in our crate list.
/mob/living/simple_animal/hostile/gorilla/proc/drop_all_crates(atom/drop_to)
for(var/obj/structure/closet/crate/held_crate as anything in crates_in_hand)
held_crate.forceMove(drop_to)
LAZYREMOVE(crates_in_hand, held_crate)
update_icon(UPDATE_OVERLAYS | UPDATE_ICON_STATE)
/mob/living/simple_animal/hostile/gorilla/cargo_domestic
name = "cargorilla" // Overriden, normally
icon = 'icons/mob/cargorillia.dmi'
desc = "Cargo's pet gorilla. He seems to have an 'I love Mom' tattoo."
faction = list("neutral", "monkey", "jungle")
gold_core_spawnable = NO_SPAWN
gender = MALE
a_intent = INTENT_HELP
unique_pet = TRUE
crate_limit = 2
/// The ID card that the gorilla is currently wearing.
var/obj/item/card/id/access_card
/mob/living/simple_animal/hostile/gorilla/cargo_domestic/Login()
. = ..()
// Github copilot wrote the below fluff IDK
to_chat(src, "<span class='boldnotice'>You are [name]. You are a domesticated gorilla, and you are Cargo's pet. You are a loyal and hardworking gorilla, and you love your job. You are a good gorilla, and Cargo loves you.</span>")
to_chat(src, "<span class='boldnotice'>You can pick up crates by clicking them, and drop them by clicking on an open floor. You can carry [crate_limit] crates at a time.</span>")
/mob/living/simple_animal/hostile/gorilla/cargo_domestic/Initialize(mapload)
. = ..()
access_card = new /obj/item/card/id/supply/cargo_gorilla(src)
ADD_TRAIT(src, TRAIT_PACIFISM, INNATE_TRAIT)
/mob/living/simple_animal/hostile/gorilla/cargo_domestic/Destroy()
QDEL_NULL(access_card)
return ..()
/mob/living/simple_animal/hostile/gorilla/cargo_domestic/get_access()
. = ..()
. |= access_card.GetAccess()
/obj/item/card/id/supply/cargo_gorilla
name = "cargorilla ID"
registered_name = "Cargorilla"
desc = "A card used to provide ID and determine access across the station. A gorilla-sized ID for a gorilla-sized cargo technician."
/mob/living/simple_animal/hostile/gorilla/rampaging
name = "Rampaging Gorilla"
desc = "A gorilla that has gone wild. Run!"
speed = 0
color = "#ff0000"
health = 350
maxHealth = 350
melee_damage_lower = 25
melee_damage_upper = 35
obj_damage = 40
damage_coeff = list(BRUTE = 1.25, BURN = 1, TOX = 1.5, CLONE = 0, STAMINA = 0, OXY = 1)
/mob/living/simple_animal/hostile/gorilla/rampaging/Initialize(mapload)
. = ..()
add_overlay(mutable_appearance('icons/effects/effects.dmi', "electricity")) // I wanna be Winston
@@ -0,0 +1,10 @@
/datum/emote/living/simple_animal/gorilla
mob_type_allowed_typecache = list(/mob/living/simple_animal/hostile/gorilla)
/datum/emote/living/simple_animal/gorilla/ooga
key = "ooga"
key_third_person = "oogas"
message = "oogas."
message_param = "oogas at %t."
emote_type = EMOTE_SOUND
sound = 'sound/creatures/gorilla.ogg'
@@ -15,6 +15,7 @@
speak_chance = 0
turns_per_move = 3
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat = 3)
faction = list("hostile", "jungle")
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
@@ -19,7 +19,7 @@
attacktext = "slams"
attack_sound = 'sound/weapons/punch1.ogg'
ventcrawler = 2
faction = list("plants")
faction = list("plants", "jungle")
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 150
@@ -20,7 +20,7 @@
attack_same = 2 // this is usually a bool, but mushrooms are a special case
attacktext = "chomps"
attack_sound = 'sound/weapons/bite.ogg'
faction = list("mushroom")
faction = list("mushroom", "jungle")
environment_smash = 0
stat_attack = DEAD
mouse_opacity = MOUSE_OPACITY_ICON
@@ -63,7 +63,7 @@
attack_sound = 'sound/weapons/bladeslice.ogg'
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
unsuitable_atmos_damage = 0
faction = list("hostile","vines","plants")
faction = list("hostile", "vines", "plants", "jungle")
var/list/grasping = list()
var/max_grasps = 4
var/grasp_chance = 20
@@ -35,6 +35,7 @@
pass_flags = PASSTABLE
can_collar = TRUE
blocks_emissive = EMISSIVE_BLOCK_UNIQUE
faction = list("neutral", "jungle")
var/list/clean_speak = list(
"Hi",
@@ -12,26 +12,34 @@
var/icon_living = ""
var/icon_dead = ""
var/icon_resting = ""
var/icon_gib = null //We only try to show a gibbing animation if this exists.
var/flip_on_death = FALSE //Flip the sprite upside down on death. Mostly here for things lacking custom dead sprites.
/// We only try to show a gibbing animation if this exists.
var/icon_gib = null
/// Flip the sprite upside down on death. Mostly here for things lacking custom dead sprites.
var/flip_on_death = FALSE
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()
var/turns_per_move = 1
var/turns_since_move = 0
var/stop_automated_movement = FALSE //Use this to temporarely stop random movement or to if you write special movement code for animals.
var/wander = TRUE // Does the mob wander around when idle?
var/stop_automated_movement_when_pulled = TRUE //When set to TRUE this stops the animal from moving when someone is pulling it.
/// 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
/// When set to TRUE this stops the animal from moving when someone is pulling it.
var/stop_automated_movement_when_pulled = TRUE
//Interaction
var/response_help = "pokes"
var/response_disarm = "shoves"
var/response_harm = "hits"
var/harm_intent_damage = 3
var/force_threshold = 0 //Minimum force required to deal any damage
/// Minimum force required to deal any damage
var/force_threshold = 0
//Temperature effect
var/minbodytemp = 250
@@ -45,72 +53,91 @@
/// Damage the mob will take if it is on fire
var/fire_damage = 2
//Healable by medical stacks? Defaults to yes.
/// Healable by medical stacks? Defaults to yes.
var/healable = TRUE
//Atmos effect - Yes, you can make creatures that require plasma 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
/// Atmos effect - Yes, you can make creatures that require plasma 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
var/list/atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) //Leaving something at 0 means it's off - has no maximum
var/unsuitable_atmos_damage = 2 //This damage is taken when atmos doesn't fit all the requirements above
/// This damage is taken when atmos doesn't fit all the requirements above
var/unsuitable_atmos_damage = 2
//LETTING SIMPLE ANIMALS ATTACK? WHAT COULD GO WRONG. Defaults to zero so Ian can still be cuddly
/// LETTING SIMPLE ANIMALS ATTACK? WHAT COULD GO WRONG. Defaults to zero so Ian can still be cuddly
var/melee_damage_lower = 0
var/melee_damage_upper = 0
var/obj_damage = 0 //how much damage this simple animal does to objects, if any
/// How much damage this simple animal does to objects, if any
var/obj_damage = 0
/// Flat armour reduction, occurs after percentage armour penetration.
var/armour_penetration_flat = 0
/// Percentage armour reduction, happens before flat armour reduction.
var/armour_penetration_percentage = 0
var/melee_damage_type = BRUTE //Damage type of a simple mob's melee attack, should it do damage.
var/list/damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) // 1 for full damage , 0 for none , -1 for 1:1 heal from that source
/// Damage type of a simple mob's melee attack, should it do damage.
var/melee_damage_type = BRUTE
/// 1 for full damage , 0 for none , -1 for 1:1 heal from that source
var/list/damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
var/attacktext = "attacks"
var/attack_sound = null
var/friendly = "nuzzles" //If the mob does no damage with it's attack
var/environment_smash = ENVIRONMENT_SMASH_NONE //Set to 1 to allow breaking of crates,lockers,racks,tables; 2 for walls; 3 for Rwalls
/// If the mob does no damage with it's attack
var/friendly = "nuzzles"
/// Set to 1 to allow breaking of crates,lockers,racks,tables; 2 for walls; 3 for Rwalls
var/environment_smash = ENVIRONMENT_SMASH_NONE
var/speed = 1 //LETS SEE IF I CAN SET SPEEDS FOR SIMPLE MOBS WITHOUT DESTROYING EVERYTHING. Higher speed is slower, negative speed is faster
/// Higher speed is slower, negative speed is faster
var/speed = 1
var/can_hide = FALSE
/// Allows a mob to pass unbolted doors while hidden
var/pass_door_while_hidden = FALSE
var/obj/item/petcollar/pcollar = null
var/collar_type //if the mob has collar sprites, define them.
var/unique_pet = FALSE // if the mob can be renamed
var/can_collar = FALSE // can add collar to mob or not
/// If the mob has collar sprites, define them.
var/collar_type
/// If the mob can be renamed
var/unique_pet = FALSE
/// Can add collar to mob or not
var/can_collar = FALSE
//Hot simple_animal baby making vars
/// Hot simple_animal baby making vars
var/list/childtype = null
var/next_scan_time = 0
var/animal_species //Sorry, no spider+corgi buttbabies.
/// Sorry, no spider+corgi buttbabies.
var/animal_species
var/current_offspring = 0
var/max_offspring = DEFAULT_MAX_OFFSPRING
///Was this mob spawned by xenobiology magic? Used for mobcapping.
/// Was this mob spawned by xenobiology magic? Used for mobcapping.
var/xenobiology_spawned = FALSE
var/gold_core_spawnable = NO_SPAWN //If the mob can be spawned with a gold slime core. HOSTILE_SPAWN are spawned with plasma, FRIENDLY_SPAWN are spawned with blood
var/mob/living/carbon/human/master_commander = null //holding var for determining who own/controls a sentient simple animal (for sentience potions).
/// If the mob can be spawned with a gold slime core. HOSTILE_SPAWN are spawned with plasma, FRIENDLY_SPAWN are spawned with blood
var/gold_core_spawnable = NO_SPAWN
/// Holding var for determining who own/controls a sentient simple animal (for sentience potions).
var/mob/living/carbon/human/master_commander = null
var/datum/component/spawner/nest
var/sentience_type = SENTIENCE_ORGANIC // Sentience type, for slime potions
var/list/loot = list() //list of things spawned at mob's loc when it dies
var/del_on_death = FALSE //causes mob to be deleted on death, useful for mobs that spawn lootable corpses
/// Sentience type, for slime potions
var/sentience_type = SENTIENCE_ORGANIC
/// List of things spawned at mob's loc when it dies
var/list/loot = list()
/// Causes mob to be deleted on death, useful for mobs that spawn lootable corpses
var/del_on_death = FALSE
var/deathmessage = ""
var/death_sound = null //The sound played on death
/// The sound played on death
var/death_sound = null
var/allow_movement_on_non_turfs = FALSE
var/attacked_sound = "punch"
/// The Status of our AI, can be set to AI_ON (On, usual processing), AI_IDLE (Will not process, but will return to AI_ON if an enemy comes near), AI_OFF (Off, Not processing ever)
var/AIStatus = AI_ON
/// Once we have become sentient, we can never go back
var/can_have_ai = TRUE
var/AIStatus = AI_ON //The Status of our AI, can be set to AI_ON (On, usual processing), AI_IDLE (Will not process, but will return to AI_ON if an enemy comes near), AI_OFF (Off, Not processing ever)
var/can_have_ai = TRUE //once we have become sentient, we can never go back
/// Convenience var for forcibly waking up an idling AI on next check.
var/shouldwakeup = FALSE
var/shouldwakeup = FALSE //convenience var for forcibly waking up an idling AI on next check.
var/my_z // I don't want to confuse this with client registered_z
///What kind of footstep this mob should have. Null if it shouldn't have any.
/// I don't want to confuse this with client registered_z
var/my_z
/// What kind of footstep this mob should have. Null if it shouldn't have any.
var/footstep_type
/// Can this simple mob crawl or not? If FALSE, it won't get immobilized by crawling
var/can_crawl = FALSE
/mob/living/simple_animal/Initialize(mapload)
. = ..()
@@ -174,7 +201,8 @@
if(collar_type)
collar_type = "[initial(collar_type)]_rest"
regenerate_icons()
ADD_TRAIT(src, TRAIT_IMMOBILIZED, LYING_DOWN_TRAIT) //simple mobs cannot crawl
if(!can_crawl)
ADD_TRAIT(src, TRAIT_IMMOBILIZED, LYING_DOWN_TRAIT) //simple mobs cannot crawl (unless they can)
/mob/living/simple_animal/on_standing_up()
..()
+31
View File
@@ -261,3 +261,34 @@
to_chat(pai, "<B>You have become a pAI! Your name is [pai.name].</B>")
pai.update_pipe_vision()
qdel(src)
/mob/living/carbon/proc/gorillize(rage = FALSE)
if(notransform)
return
if(stat == DEAD)
return
for(var/obj/item/W in src)
unEquip(W)
regenerate_icons()
notransform = TRUE
icon = null
invisibility = INVISIBILITY_MAXIMUM
visible_message("<span class='warning'>[src] transforms into a gorilla!</span>", "<span class='warning'>You transform into a gorilla! Ooga ooga!</span>", "<span class='warning'>You hear a loud roar!</span>")
var/mob/living/simple_animal/hostile/gorilla/new_gorilla
if(rage)
var/mob/living/simple_animal/hostile/gorilla/rampaging/rampaging_gorilla = new (get_turf(src))
new_gorilla = rampaging_gorilla
else
new_gorilla = new (get_turf(src))
playsound(new_gorilla, 'sound/creatures/gorilla.ogg', 50)
if(mind)
mind.transfer_to(new_gorilla)
else
new_gorilla.key = key
qdel(src)
+3 -1
View File
@@ -224,7 +224,7 @@
to_chat(M, "<span class='userdanger'>Your consciousness is subsumed by a distant hivemind... you feel murderous hostility towards non-xenomorph life!</span>")
if("animal")
if(prob(50))
var/beast = pick("carp","bear","mushroom","statue", "bat", "goat", "tomato")
var/beast = pick("carp","bear","mushroom","statue", "bat", "goat", "tomato", "gorilla")
switch(beast)
if("carp")
new_mob = new /mob/living/simple_animal/hostile/carp(M.loc)
@@ -240,6 +240,8 @@
new_mob = new /mob/living/simple_animal/hostile/retaliate/goat(M.loc)
if("tomato")
new_mob = new /mob/living/simple_animal/hostile/killertomato(M.loc)
if("gorilla")
new_mob = new /mob/living/simple_animal/hostile/gorilla(M.loc)
else
var/animal = pick("parrot", "corgi", "crab", "pug", "cat", "mouse", "chicken", "cow", "lizard", "chick", "fox")
switch(animal)
@@ -1,37 +1,3 @@
/*/datum/reagent/silicate
name = "Silicate"
id = "silicate"
description = "A compound that can be used to reinforce glass."
reagent_state = LIQUID
color = "#C7FFFF" // rgb: 199, 255, 255
/datum/reagent/silicate/reaction_obj(obj/O, volume)
if(istype(O, /obj/structure/window))
if(O:silicate <= 200)
O:silicate += volume
O:health += volume * 3
if(!O:silicateIcon)
var/icon/I = icon(O.icon,O.icon_state,O.dir)
var/r = (volume / 100) + 1
var/g = (volume / 70) + 1
var/b = (volume / 50) + 1
I.SetIntensity(r,g,b)
O.icon = I
O:silicateIcon = I
else
var/icon/I = O:silicateIcon
var/r = (volume / 100) + 1
var/g = (volume / 70) + 1
var/b = (volume / 50) + 1
I.SetIntensity(r,g,b)
O.icon = I
O:silicateIcon = I */
/datum/reagent/oxygen
name = "Oxygen"
id = "oxygen"
@@ -180,6 +180,20 @@
contains = list(/obj/item/petcollar)
containername = "bunny crate"
/datum/supply_packs/organic/gorilla
name = "Gorilla Crate"
cost = 1000
containertype = /obj/structure/closet/critter/gorilla
containername = "gorilla crate"
department_restrictions = list(DEPARTMENT_SCIENCE)
/datum/supply_packs/organic/gorilla/cargo
name = "Cargorilla Crate"
cost = 250
containertype = /obj/structure/closet/critter/gorilla/cargo
containername = "cargorilla crate"
department_restrictions = list(DEPARTMENT_SUPPLY)
////// hippy gear
/datum/supply_packs/organic/hydroponics // -- Skie