From bdb8039c8fda42407af70443d5d50de2e9ec72c6 Mon Sep 17 00:00:00 2001 From: S34N <12197162+S34NW@users.noreply.github.com> Date: Fri, 2 Jun 2023 00:36:07 +0100 Subject: [PATCH] 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> --- code/__DEFINES/mob_defines.dm | 1 + code/__DEFINES/radiation_defines.dm | 3 + code/datums/keybindings/emote.dm | 7 + code/datums/keybindings/mob.dm | 8 +- code/datums/uplink_items/uplink_traitor.dm | 11 + code/game/dna/dna2_domutcheck.dm | 1 - code/game/dna/dna2_helpers.dm | 4 + .../implants/implant_gorilla_rampage.dm | 25 ++ .../items/weapons/implants/implantfluff.dm | 6 + .../structures/crates_lockers/crates.dm | 58 ---- .../structures/crates_lockers/crittercrate.dm | 8 + .../contractor/datums/syndicate_contract.dm | 1 + .../food_and_drinks/food/foods/meat.dm | 5 + code/modules/mob/inventory_procs.dm | 4 + .../mob/living/carbon/human/species/monkey.dm | 6 + .../living/simple_animal/friendly/bunny.dm | 1 + .../simple_animal/friendly/butterfly.dm | 1 + .../mob/living/simple_animal/friendly/deer.dm | 1 + .../simple_animal/friendly/farm_animals.dm | 2 +- .../living/simple_animal/friendly/lizard.dm | 3 +- .../living/simple_animal/friendly/sloth.dm | 1 + .../living/simple_animal/friendly/snake.dm | 2 +- .../simple_animal/hostile/gorilla/gorilla.dm | 258 ++++++++++++++++++ .../hostile/gorilla/gorilla_emote.dm | 10 + .../simple_animal/hostile/jungle_animals.dm | 1 + .../simple_animal/hostile/killertomato.dm | 2 +- .../living/simple_animal/hostile/mushroom.dm | 2 +- .../simple_animal/hostile/venus_human_trap.dm | 2 +- .../mob/living/simple_animal/parrot.dm | 1 + .../mob/living/simple_animal/simple_animal.dm | 108 +++++--- code/modules/mob/transform_procs.dm | 31 +++ code/modules/projectiles/projectile/magic.dm | 4 +- .../chemistry/reagents/misc_reagents.dm | 34 --- .../supply/supply_packs/pack_organic.dm | 14 + icons/mob/actions/actions_animal.dmi | Bin 5618 -> 6523 bytes icons/mob/cargorillia.dmi | Bin 0 -> 8821 bytes icons/mob/gorilla.dmi | Bin 0 -> 7466 bytes icons/obj/crates.dmi | Bin 13418 -> 11340 bytes icons/obj/hypo.dmi | Bin 6292 -> 5923 bytes icons/obj/implants.dmi | Bin 3197 -> 3390 bytes paradise.dme | 3 + sound/creatures/gorilla.ogg | Bin 0 -> 7430 bytes 42 files changed, 487 insertions(+), 142 deletions(-) create mode 100644 code/game/objects/items/weapons/implants/implant_gorilla_rampage.dm create mode 100644 code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm create mode 100644 code/modules/mob/living/simple_animal/hostile/gorilla/gorilla_emote.dm create mode 100644 icons/mob/cargorillia.dmi create mode 100644 icons/mob/gorilla.dmi create mode 100644 sound/creatures/gorilla.ogg diff --git a/code/__DEFINES/mob_defines.dm b/code/__DEFINES/mob_defines.dm index b2241722f12..faa6f0df926 100644 --- a/code/__DEFINES/mob_defines.dm +++ b/code/__DEFINES/mob_defines.dm @@ -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)) diff --git a/code/__DEFINES/radiation_defines.dm b/code/__DEFINES/radiation_defines.dm index 5109a993d6e..b25f075ed6d 100644 --- a/code/__DEFINES/radiation_defines.dm +++ b/code/__DEFINES/radiation_defines.dm @@ -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 diff --git a/code/datums/keybindings/emote.dm b/code/datums/keybindings/emote.dm index 4b74e345c81..685c1914edb 100644 --- a/code/datums/keybindings/emote.dm +++ b/code/datums/keybindings/emote.dm @@ -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)" diff --git a/code/datums/keybindings/mob.dm b/code/datums/keybindings/mob.dm index 51930cfbb8e..c870739da56 100644 --- a/code/datums/keybindings/mob.dm +++ b/code/datums/keybindings/mob.dm @@ -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, "You have nothing to drop in your hand!") + return + + to_chat(C, "You have nothing to drop in your hand!") /datum/keybinding/mob/swap_hands name = "Swap Hands" diff --git a/code/datums/uplink_items/uplink_traitor.dm b/code/datums/uplink_items/uplink_traitor.dm index 53048ff1115..86bea2010ea 100644 --- a/code/datums/uplink_items/uplink_traitor.dm +++ b/code/datums/uplink_items/uplink_traitor.dm @@ -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 diff --git a/code/game/dna/dna2_domutcheck.dm b/code/game/dna/dna2_domutcheck.dm index 8da02df0806..f0363324c20 100644 --- a/code/game/dna/dna2_domutcheck.dm +++ b/code/game/dna/dna2_domutcheck.dm @@ -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 diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm index 4ec6644753d..c5949da940a 100644 --- a/code/game/dna/dna2_helpers.dm +++ b/code/game/dna/dna2_helpers.dm @@ -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) diff --git a/code/game/objects/items/weapons/implants/implant_gorilla_rampage.dm b/code/game/objects/items/weapons/implants/implant_gorilla_rampage.dm new file mode 100644 index 00000000000..0ff79e5053a --- /dev/null +++ b/code/game/objects/items/weapons/implants/implant_gorilla_rampage.dm @@ -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("[target] swells and their hair grows rapidly. Uh oh!.","You feel your muscles swell and your hair grow as you return to monke.", "You hear angry gorilla noises.") + 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 diff --git a/code/game/objects/items/weapons/implants/implantfluff.dm b/code/game/objects/items/weapons/implants/implantfluff.dm index 1486c941797..b2f67f9018a 100644 --- a/code/game/objects/items/weapons/implants/implantfluff.dm +++ b/code/game/objects/items/weapons/implants/implantfluff.dm @@ -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." diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 75faa947a63..3611718393b 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -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." diff --git a/code/game/objects/structures/crates_lockers/crittercrate.dm b/code/game/objects/structures/crates_lockers/crittercrate.dm index 930de9f5e31..f43181be3aa 100644 --- a/code/game/objects/structures/crates_lockers/crittercrate.dm +++ b/code/game/objects/structures/crates_lockers/crittercrate.dm @@ -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 diff --git a/code/modules/antagonists/traitor/contractor/datums/syndicate_contract.dm b/code/modules/antagonists/traitor/contractor/datums/syndicate_contract.dm index b4c5c38213e..13cd96314b3 100644 --- a/code/modules/antagonists/traitor/contractor/datums/syndicate_contract.dm +++ b/code/modules/antagonists/traitor/contractor/datums/syndicate_contract.dm @@ -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 diff --git a/code/modules/food_and_drinks/food/foods/meat.dm b/code/modules/food_and_drinks/food/foods/meat.dm index 5f5b558fd66..59cdb8ec863 100644 --- a/code/modules/food_and_drinks/food/foods/meat.dm +++ b/code/modules/food_and_drinks/food/foods/meat.dm @@ -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 diff --git a/code/modules/mob/inventory_procs.dm b/code/modules/mob/inventory_procs.dm index d06e2343b87..d0cb1b47637 100644 --- a/code/modules/mob/inventory_procs.dm +++ b/code/modules/mob/inventory_procs.dm @@ -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 diff --git a/code/modules/mob/living/carbon/human/species/monkey.dm b/code/modules/mob/living/carbon/human/species/monkey.dm index 94fe1fb0ec5..42859e2f719 100644 --- a/code/modules/mob/living/carbon/human/species/monkey.dm +++ b/code/modules/mob/living/carbon/human/species/monkey.dm @@ -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 diff --git a/code/modules/mob/living/simple_animal/friendly/bunny.dm b/code/modules/mob/living/simple_animal/friendly/bunny.dm index 5eff34f3344..fdefe785ffd 100644 --- a/code/modules/mob/living/simple_animal/friendly/bunny.dm +++ b/code/modules/mob/living/simple_animal/friendly/bunny.dm @@ -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 diff --git a/code/modules/mob/living/simple_animal/friendly/butterfly.dm b/code/modules/mob/living/simple_animal/friendly/butterfly.dm index 8c8cce29948..4ab5c015612 100644 --- a/code/modules/mob/living/simple_animal/friendly/butterfly.dm +++ b/code/modules/mob/living/simple_animal/friendly/butterfly.dm @@ -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" diff --git a/code/modules/mob/living/simple_animal/friendly/deer.dm b/code/modules/mob/living/simple_animal/friendly/deer.dm index 77ffb8d8386..e7e0586ca3d 100644 --- a/code/modules/mob/living/simple_animal/friendly/deer.dm +++ b/code/modules/mob/living/simple_animal/friendly/deer.dm @@ -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 diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index b3e629ac341..f0410b6ad89 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -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" diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm index f0327dd9628..03a1ca23689 100644 --- a/code/modules/mob/living/simple_animal/friendly/lizard.dm +++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm @@ -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) diff --git a/code/modules/mob/living/simple_animal/friendly/sloth.dm b/code/modules/mob/living/simple_animal/friendly/sloth.dm index 5a77ecbdc52..706b0564972 100644 --- a/code/modules/mob/living/simple_animal/friendly/sloth.dm +++ b/code/modules/mob/living/simple_animal/friendly/sloth.dm @@ -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) diff --git a/code/modules/mob/living/simple_animal/friendly/snake.dm b/code/modules/mob/living/simple_animal/friendly/snake.dm index bd9241721ba..cd7233addf3 100644 --- a/code/modules/mob/living/simple_animal/friendly/snake.dm +++ b/code/modules/mob/living/simple_animal/friendly/snake.dm @@ -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 diff --git a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm new file mode 100644 index 00000000000..6a49994f3ce --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm @@ -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, "You can't get on all fours while carrying something!") + return + + gorilla.is_bipedal = !gorilla.is_bipedal // Toggle + gorilla.visible_message("[gorilla] [gorilla.is_bipedal ? "stands up menacingly." : "drops back to all fours."]", + "You [gorilla.is_bipedal ? "stand up" : "get down on all fours."]", + "You hear the sound of a gorilla rustling.") + + 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, "You are carrying too many crates!") + 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, "This crate is too heavy!") + 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("[src] knocks [living_target] down!") + +/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) + . += "[p_theyre(TRUE)] carrying the following:" + for(var/atom/movable/crate in crates_in_hand) + . += "[crate]." + . += "" + +/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, "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.") + to_chat(src, "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.") + +/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 + diff --git a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla_emote.dm b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla_emote.dm new file mode 100644 index 00000000000..5d18372d12e --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla_emote.dm @@ -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' diff --git a/code/modules/mob/living/simple_animal/hostile/jungle_animals.dm b/code/modules/mob/living/simple_animal/hostile/jungle_animals.dm index 24d2856bf1b..5328b974d15 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle_animals.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle_animals.dm @@ -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" diff --git a/code/modules/mob/living/simple_animal/hostile/killertomato.dm b/code/modules/mob/living/simple_animal/hostile/killertomato.dm index fc4876034ab..03957b3919d 100644 --- a/code/modules/mob/living/simple_animal/hostile/killertomato.dm +++ b/code/modules/mob/living/simple_animal/hostile/killertomato.dm @@ -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 diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm index 8460642a377..88e955363dc 100644 --- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm +++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm @@ -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 diff --git a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm index 02c562776a8..a2982fb88e4 100644 --- a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm +++ b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm @@ -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 diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 9442347fc1b..edf9504e456 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -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", diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 0b859c30460..19ab6066428 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -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() ..() diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index d3257eff6b5..fe0550ab224 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -261,3 +261,34 @@ to_chat(pai, "You have become a pAI! Your name is [pai.name].") 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("[src] transforms into a gorilla!", "You transform into a gorilla! Ooga ooga!", "You hear a loud roar!") + 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) diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 8e0e155d63d..127f8a10fd4 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -224,7 +224,7 @@ to_chat(M, "Your consciousness is subsumed by a distant hivemind... you feel murderous hostility towards non-xenomorph life!") 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) diff --git a/code/modules/reagents/chemistry/reagents/misc_reagents.dm b/code/modules/reagents/chemistry/reagents/misc_reagents.dm index 822c6890cce..2ddff607295 100644 --- a/code/modules/reagents/chemistry/reagents/misc_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/misc_reagents.dm @@ -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" diff --git a/code/modules/supply/supply_packs/pack_organic.dm b/code/modules/supply/supply_packs/pack_organic.dm index 7962b37425b..32db6665a0f 100644 --- a/code/modules/supply/supply_packs/pack_organic.dm +++ b/code/modules/supply/supply_packs/pack_organic.dm @@ -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 diff --git a/icons/mob/actions/actions_animal.dmi b/icons/mob/actions/actions_animal.dmi index e8f2d4ada8346079e62a06c1b84d9c3bc5b852fa..35488d7e4b0b8a5c743d1823b39fd9e6c490ad35 100644 GIT binary patch literal 6523 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 diff --git a/icons/mob/cargorillia.dmi b/icons/mob/cargorillia.dmi new file mode 100644 index 0000000000000000000000000000000000000000..1e493c3cd2ba3ae08e44c90634bb8a31f0d67944 GIT binary patch literal 8821 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� z4Zor`Q}Wd$G1?nz#|lWy?W%~_?iAR!Tl<3Z!!LU(Pj^N3{3^f*44eP^-giY7IfSwE zhQz4nfU)R$RAT~5_;376?8NV;>T=8egEcPW>w)hT`@oml6*qt||6Gg{RVcR|VptY$ z$RZJ5#0z=NU|L$e=}jjXZwWIAj=}Jp%?0u-SiCqePY05Cz=ZFP85 zyJXzeUMu+p-e^GUk=~f|>0<`n(fV<<(#icxme=Kgji?1R&p2zM^oXhgY@a4slSYT} z(x#oiaQddS4XvXi)-`~&VQzmbBTgl^SYAH`JOp=}dOa%&lXf09aZ34ylFJ+y_kYB_ z-T<*B?DK>NZ%`D1i2+rdKPVd@^2T_OV6{CwIEToY1%BOPn8qGp<|P6SN6RXU;zHj= z4)dh`5=ZL2&$r|>%+Ys_0o+M|DAu`smD{3G?!cy%oOTze(G%~wbNv`(-|k$wOMSf< z3{rs~^%;7Uxs;xbC5LFqLqq|aj&&f#n-pD_VnZ?XA70$LzGq#Q0+uwx5+_8S^(U}H zLdhJ|0bi^Al7>_JQLh6KS2ubkPiDUC-=+@A47)KyoZX?(7QI8UE4LDv0wf_y6sYu^ z@@O*s0b9<3>}_KI`#wOa4Mq^Y(Xr1p@J?5LjvMb6er+~t$LZF;8|Dw0-L#$t7Fj|v zqI{Q>Efz31`&#B24)a#0Sn51zK_zt+oHPp_r9QAZPzhfH0EhpLg{^>}dt%^Eoy0jT zR_!GmUpq1QrLp@D%7;@XWE7`%BBV-FuHXr0^F)_4)a4eJB?UIx7lPV6(wvZkXldW254Dx1gM%-HZ%7_;s1G#abY?=p`9ZOeOo` zH(lrwo=K`)=Y;0H2r5?npTom~(l?hpsnXLe6BAtJqTYsBQU%Lzi_k@dBSh9WtX)A$ zz+$brWZXfc6+`+Ru$u7((2?v>-MOX;#ZPXk8ud`4r|MR&wmHt^ zgWteEzh}RjLZYIbbG`tRv8G|>b*h>_sBCL#?gUOewfj+_S*xnD(!x`rw(uv8jhh*} zhrj-dk8)xg=e*@kmq)3E1-H@k8`!-&Wpw{$vA*_d3&+i2

f?&F;~_e7yT3%Qo>( zXJ^M4)xS?AZ8&Mt(`ASV@chI?_UdxTeL^yHgy!>hPRBO&A%|KESgoO#ZFe+++hD6d zEt*I9%O8M4FDg3D!u$8V4`PdAUZ_;^M_1@St2o4@6YW5RH#K2=~U$x z5f1s;zliWfMV>Y8*1S}WRNGQhAMs>XtbPiB-;K$Qz9FUG-tz_^Xe$vZ=qSLF)RUJ{ zaCf9Ki&y8N*gJr}6ElnufUF#5E#O3m#Y}ZkuT#k$A_V2Qi#7jpGta723$cwz_ZvXI++XA6&P?D5+n9|Qro?g6!x}t9~?=qI?;|;NGW6t z{$*WXcK^6LDxjRIq7b4#hpnMfx1k7@<-a5V?f0JXg>AYad0@&?codRGL6(8EI4(kQ zI6gN|80ryfJb=OH)7P>;mrqi=H^VQ>o3u4@KgV$e{|G1%WE;zA8`)M~AbXW4lgWKd^oYopY_Lg4d9>Ae0+kO}lVP%ZAoZ&+mMQr_>#?UI+d(;W# z{!AI^S_HFCg^sti6S=%CNeOy+*gAGR-z%^fPTbhME0qRoi~m1BDN+t!P8bXWw!2RB zprp}n#I*~nPq@r^*Kx}10L=Nvi+`EnGDL8xp?Wr8>-cz!QsnI~7tZ+O8OcJPN8MEv zd`%Vww6s+#+k%}+piINl@JbkPZ3q2AKA*d*8uymO$cbajrK@lkSZ~1Oic_S!#JvYX zvFlXi$HL-wbi)1IGbntlwm!Eq=KU-$9EgUlop2;xo2U zV%0Y--<<--TsS|9GSg@)l3Z-6!UyO5c<(=f62IQ1k3NmsterJ~--+Uz^3oZ2c;)h+cB$3tMMX7OhLfnkC9e=eDS35Gf9FNBk>&MW{mOQbuN}# gX^*^cGkeTUDKkBWpS1TQaQF#QQB+qbl7Hv>U(*7WVgLXD literal 0 HcmV?d00001 diff --git a/icons/obj/crates.dmi b/icons/obj/crates.dmi index 2392bcba58f573fbf1d0a464ce5b0b3f68a859af..1b72e14432b8f56ad2c8f50aa05d13b773a0d686 100644 GIT binary patch literal 11340 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 AZvX%Q diff --git a/icons/obj/hypo.dmi b/icons/obj/hypo.dmi index 4b0e564365bb356414d7d156c59e637866be3c52..f688c9c64bcb756a1dc8da0a299e0a869dcffadf 100644 GIT binary patch literal 5923 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 literal 6292 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 YI&@@&3BUcY^T`4y&27ynCSLLX0i1YGn*aa+ diff --git a/paradise.dme b/paradise.dme index 58a1487a304..67cbb5be29d 100644 --- a/paradise.dme +++ b/paradise.dme @@ -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" diff --git a/sound/creatures/gorilla.ogg b/sound/creatures/gorilla.ogg new file mode 100644 index 0000000000000000000000000000000000000000..2d62702e5502be42feafcdf0e9c0fdbd6ce41a2f GIT binary patch literal 7430 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