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>
@@ -250,6 +250,7 @@
|
||||
#define isslaughterdemon(A) (istype((A), /mob/living/simple_animal/demon/slaughter))
|
||||
#define isdemon(A) (istype((A), /mob/living/simple_animal/demon))
|
||||
#define iscat(A) (istype((A), /mob/living/simple_animal/pet/cat))
|
||||
#define isgorilla(A) (istype((A), /mob/living/simple_animal/hostile/gorilla))
|
||||
|
||||
#define issilicon(A) (istype((A), /mob/living/silicon))
|
||||
#define isAI(A) (istype((A), /mob/living/silicon/ai))
|
||||
|
||||
@@ -35,6 +35,9 @@ Ask ninjanomnom if they're around
|
||||
#define RAD_MOB_KNOCKDOWN_PROB 1 // Chance of knockdown per tick when over threshold
|
||||
#define RAD_MOB_KNOCKDOWN_AMOUNT 6 SECONDS // Amount of knockdown when it occurs
|
||||
|
||||
#define RAD_MOB_GORILLIZE 1500 // How much stored radiation to check for gorillization
|
||||
#define RAD_MOB_GORILLIZE_PROB 0.1 // Chance of gorillization per tick when over threshold
|
||||
|
||||
#define RAD_NO_INSULATION 1.0 // For things that shouldn't become irradiated for whatever reason
|
||||
#define RAD_VERY_LIGHT_INSULATION 0.9 // What girders have
|
||||
#define RAD_LIGHT_INSULATION 0.8
|
||||
|
||||
@@ -591,6 +591,13 @@
|
||||
/datum/keybinding/emote/simple_animal/diona_chirp/can_use(client/C, mob/M)
|
||||
return isnymph(M) && ..()
|
||||
|
||||
/datum/keybinding/emote/simple_animal/gorilla_ooga
|
||||
linked_emote = /datum/emote/living/simple_animal/gorilla/ooga
|
||||
name = "Ooga (Gorilla)"
|
||||
|
||||
/datum/keybinding/emote/simple_animal/gorilla_ooga/can_use(client/C, mob/M)
|
||||
return isgorilla(M) && ..()
|
||||
|
||||
/datum/keybinding/emote/simple_animal/pet/dog/bark
|
||||
linked_emote = /datum/emote/living/simple_animal/pet/dog/bark
|
||||
name = "Bark (Dog)"
|
||||
|
||||
@@ -25,10 +25,14 @@
|
||||
/datum/keybinding/mob/drop_held_object/down(client/C)
|
||||
. = ..()
|
||||
var/obj/item/I = C.mob.get_active_hand()
|
||||
if(!I)
|
||||
I = C.mob.special_get_hands_check()
|
||||
|
||||
if(I)
|
||||
C.mob.drop_item_v()
|
||||
else
|
||||
to_chat(C, "<span class='warning'>You have nothing to drop in your hand!</span>")
|
||||
return
|
||||
|
||||
to_chat(C, "<span class='warning'>You have nothing to drop in your hand!</span>")
|
||||
|
||||
/datum/keybinding/mob/swap_hands
|
||||
name = "Swap Hands"
|
||||
|
||||
@@ -259,6 +259,17 @@
|
||||
cost = 8
|
||||
job = list("Scientist", "Research Director", "Geneticist", "Chief Medical Officer", "Medical Doctor", "Psychiatrist", "Chemist", "Paramedic", "Coroner", "Virologist")
|
||||
|
||||
// Genetics
|
||||
|
||||
/datum/uplink_item/jobspecific/magillitis_serum
|
||||
name = "Magillitis Serum Bio-chip"
|
||||
desc = "A single-use bio-chip which contains an experimental serum that causes rapid muscular growth in Hominidae. \
|
||||
Side-affects may include hypertrichosis, violent outbursts, and an unending affinity for bananas."
|
||||
reference = "MAG"
|
||||
item = /obj/item/implanter/gorilla_rampage
|
||||
cost = 5
|
||||
job = list("Research Director", "Geneticist")
|
||||
|
||||
// Paper contact poison pen
|
||||
|
||||
/datum/uplink_item/jobspecific/poison_pen
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
var/datum/mutation/mutation = GLOB.assigned_mutation_blocks[block]
|
||||
domutation(mutation, M, flags)
|
||||
|
||||
|
||||
/proc/domutation(datum/mutation/mutation, mob/living/M, flags = 0)
|
||||
if(!mutation || !istype(mutation))
|
||||
return FALSE
|
||||
|
||||
@@ -28,6 +28,10 @@
|
||||
var/block = pick(GLOB.bad_blocks)
|
||||
M.dna.SetSEState(block, 1)
|
||||
|
||||
var/mob/living/carbon/C = M
|
||||
if(prob(RAD_MOB_GORILLIZE_PROB) && istype(C))
|
||||
C.gorillize() // OH SHIT A GORILLA
|
||||
|
||||
// Give Random Good Mutation to M
|
||||
/proc/randmutg(mob/living/M)
|
||||
if(!M || !M.dna)
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
/obj/item/implant/gorilla_rampage //Dumb path but easier to search for admins
|
||||
name = "magillitis serum bio-chip"
|
||||
desc = "An experimental biochip which causes irreversable rapid muscular growth in Hominidae. Side-affects may include hypertrichosis, violent outbursts, and an unending affinity for bananas."
|
||||
icon_state = "gorilla_rampage"
|
||||
origin_tech = "combat=5;biotech=5;syndicate=2"
|
||||
uses = 1
|
||||
implant_data = /datum/implant_fluff/gorilla_rampage
|
||||
implant_state = "implant-syndicate"
|
||||
|
||||
/obj/item/implant/gorilla_rampage/activate()
|
||||
if(!iscarbon(imp_in))
|
||||
return
|
||||
|
||||
var/mob/living/carbon/target = imp_in
|
||||
target.visible_message("<span class='userdanger'>[target] swells and their hair grows rapidly. Uh oh!.</span>","<span class='userdanger'>You feel your muscles swell and your hair grow as you return to monke.</span>", "<span class='userdanger'>You hear angry gorilla noises.</span>")
|
||||
target.gorillize(TRUE)
|
||||
|
||||
/obj/item/implanter/gorilla_rampage
|
||||
name = "bio-chip implanter (magillitis serum)"
|
||||
implant_type = /obj/item/implant/gorilla_rampage
|
||||
|
||||
/obj/item/implantcase/gorilla_rampage
|
||||
name = "bio-chip case - 'magillitis serum'"
|
||||
desc = "A glass case containing a magillitis bio-chip."
|
||||
implant_type = /obj/item/implant/gorilla_rampage
|
||||
@@ -110,3 +110,9 @@
|
||||
/datum/implant_fluff/sad_trombone
|
||||
name = "BioTech Solutions Comedy Bio-chip"
|
||||
function = "Plays a sad trombone noise upon death of the implantee, allows clowns to entertain the crew even post-mortem."
|
||||
|
||||
/datum/implant_fluff/gorilla_rampage
|
||||
name = "Magillitis Serum Bio-chip"
|
||||
life = "Unknown, no collected sample has been active long enough to determine lifespan."
|
||||
notes = "An experimental serum which causes rapid muscular growth in Hominidae. Side-affects may include hypertrichosis, violent outbursts, and an unending affinity for bananas."
|
||||
function = "Allows the user to transform into an angry fast and robust gorilla. Very deadly in close quarters."
|
||||
|
||||
@@ -440,64 +440,6 @@
|
||||
open_sound = 'sound/effects/bin_open.ogg'
|
||||
close_sound = 'sound/effects/bin_close.ogg'
|
||||
|
||||
/obj/structure/closet/crate/large
|
||||
name = "large crate"
|
||||
desc = "A hefty metal crate."
|
||||
icon_state = "largemetal"
|
||||
icon_opened = "largemetal_open"
|
||||
icon_closed = "largemetal"
|
||||
integrity_failure = 0 //Makes the crate break when integrity reaches 0, instead of opening and becoming an invisible sprite.
|
||||
|
||||
/obj/structure/closet/crate/large/close()
|
||||
. = ..()
|
||||
if(.)//we can hold up to one large item
|
||||
var/found = 0
|
||||
for(var/obj/structure/S in loc)
|
||||
if(S == src)
|
||||
continue
|
||||
if(!S.anchored)
|
||||
found = 1
|
||||
S.forceMove(src)
|
||||
break
|
||||
if(!found)
|
||||
for(var/obj/machinery/M in loc)
|
||||
if(!M.anchored)
|
||||
M.forceMove(src)
|
||||
break
|
||||
|
||||
/obj/structure/closet/crate/secure/large
|
||||
name = "large crate"
|
||||
desc = "A hefty metal crate with an electronic locking system."
|
||||
icon_state = "largemetal"
|
||||
icon_opened = "largemetal_open"
|
||||
icon_closed = "largemetal"
|
||||
redlight = "largemetalr"
|
||||
greenlight = "largemetalg"
|
||||
|
||||
/obj/structure/closet/crate/secure/large/close()
|
||||
. = ..()
|
||||
if(.)//we can hold up to one large item
|
||||
var/found = 0
|
||||
for(var/obj/structure/S in loc)
|
||||
if(S == src)
|
||||
continue
|
||||
if(!S.anchored)
|
||||
found = 1
|
||||
S.forceMove(src)
|
||||
break
|
||||
if(!found)
|
||||
for(var/obj/machinery/M in loc)
|
||||
if(!M.anchored)
|
||||
M.forceMove(src)
|
||||
break
|
||||
|
||||
//fluff variant
|
||||
/obj/structure/closet/crate/secure/large/reinforced
|
||||
desc = "A hefty, reinforced metal crate with an electronic locking system."
|
||||
icon_state = "largermetal"
|
||||
icon_opened = "largermetal_open"
|
||||
icon_closed = "largermetal"
|
||||
|
||||
/obj/structure/closet/crate/hydroponics
|
||||
name = "hydroponics crate"
|
||||
desc = "All you need to destroy those pesky weeds and pests."
|
||||
|
||||
@@ -116,3 +116,11 @@
|
||||
/obj/structure/closet/critter/bunny
|
||||
name = "bunny crate"
|
||||
content_mob = /mob/living/simple_animal/bunny
|
||||
|
||||
/obj/structure/closet/critter/gorilla
|
||||
name = "gorilla crate"
|
||||
content_mob = /mob/living/simple_animal/hostile/gorilla
|
||||
|
||||
/obj/structure/closet/critter/gorilla/cargo
|
||||
name = "cargorilla crate"
|
||||
content_mob = /mob/living/simple_animal/hostile/gorilla/cargo_domestic
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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()
|
||||
..()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 6.4 KiB |
|
After Width: | Height: | Size: 8.6 KiB |
|
After Width: | Height: | Size: 7.3 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 5.8 KiB |
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.3 KiB |
@@ -1070,6 +1070,7 @@
|
||||
#include "code\game\objects\items\weapons\implants\implant_exile.dm"
|
||||
#include "code\game\objects\items\weapons\implants\implant_explosive.dm"
|
||||
#include "code\game\objects\items\weapons\implants\implant_freedom.dm"
|
||||
#include "code\game\objects\items\weapons\implants\implant_gorilla_rampage.dm"
|
||||
#include "code\game\objects\items\weapons\implants\implant_health.dm"
|
||||
#include "code\game\objects\items\weapons\implants\implant_krav_maga.dm"
|
||||
#include "code\game\objects\items\weapons\implants\implant_mindshield.dm"
|
||||
@@ -2156,6 +2157,8 @@
|
||||
#include "code\modules\mob\living\simple_animal\hostile\tree.dm"
|
||||
#include "code\modules\mob\living\simple_animal\hostile\venus_human_trap.dm"
|
||||
#include "code\modules\mob\living\simple_animal\hostile\winter_mobs.dm"
|
||||
#include "code\modules\mob\living\simple_animal\hostile\gorilla\gorilla.dm"
|
||||
#include "code\modules\mob\living\simple_animal\hostile\gorilla\gorilla_emote.dm"
|
||||
#include "code\modules\mob\living\simple_animal\hostile\megafauna\ancient_robot.dm"
|
||||
#include "code\modules\mob\living\simple_animal\hostile\megafauna\blood_drunk_miner.dm"
|
||||
#include "code\modules\mob\living\simple_animal\hostile\megafauna\bubblegum.dm"
|
||||
|
||||