diff --git a/code/modules/food_and_drinks/food/snacks/meat.dm b/code/modules/food_and_drinks/food/snacks/meat.dm index 4252201cbd..c48be678e2 100644 --- a/code/modules/food_and_drinks/food/snacks/meat.dm +++ b/code/modules/food_and_drinks/food/snacks/meat.dm @@ -225,6 +225,11 @@ tastes = list("meat" = 1, "wheat" = 1) foodtype = GRAIN +/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/rawbacon name = "raw piece of bacon" desc = "A raw piece of bacon." diff --git a/code/modules/food_and_drinks/food/snacks/meat.dm.rej b/code/modules/food_and_drinks/food/snacks/meat.dm.rej new file mode 100644 index 0000000000..8884c9dab7 --- /dev/null +++ b/code/modules/food_and_drinks/food/snacks/meat.dm.rej @@ -0,0 +1,13 @@ +diff a/code/modules/food_and_drinks/food/snacks/meat.dm b/code/modules/food_and_drinks/food/snacks/meat.dm (rejected hunks) +@@ -225,6 +225,11 @@ + tastes = list("meat" = 1, "wheat" = 1) + foodtype = GRAIN + ++/obj/item/weapon/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/weapon/reagent_containers/food/snacks/meat/rawbacon + name = "raw piece of bacon" + desc = "A raw piece of bacon." diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index ae984fa5c7..430633ebcf 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -23,23 +23,22 @@ walk_to(src,0) /mob/living/carbon/monkey/handle_mutations_and_radiation() - - if (radiation) - if (radiation > 100) - if(!IsKnockdown()) - emote("collapse") - Knockdown(200) - to_chat(src, "You feel weak.") - + if(radiation) + if(radiation > 100) + if(!IsKnockdown()) + emote("collapse") + Knockdown(200) + to_chat(src, "You feel weak.") + if(radiation > 30 && prob((radiation - 30) * (radiation - 30) * 0.002)) + gorillize() + return switch(radiation) - if(50 to 75) if(prob(5)) if(!IsKnockdown()) emote("collapse") Knockdown(60) to_chat(src, "You feel weak.") - if(75 to 100) if(prob(1)) to_chat(src, "You mutate!") diff --git a/code/modules/mob/living/living.dm.rej b/code/modules/mob/living/living.dm.rej new file mode 100644 index 0000000000..770cac6905 --- /dev/null +++ b/code/modules/mob/living/living.dm.rej @@ -0,0 +1,10 @@ +diff a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm (rejected hunks) +@@ -793,7 +793,7 @@ + else + to_chat(src, "You don't have the dexterity to do this!") + return +-/mob/living/proc/can_use_guns(var/obj/item/weapon/gun/G) ++/mob/living/proc/can_use_guns(var/obj/item/weapon/G) + if (G.trigger_guard != TRIGGER_GUARD_ALLOW_ALL && !IsAdvancedToolUser()) + to_chat(src, "You don't have the dexterity to do this!") + return 0 diff --git a/code/modules/mob/living/simple_animal/hostile/gorilla/emotes.dm b/code/modules/mob/living/simple_animal/hostile/gorilla/emotes.dm new file mode 100644 index 0000000000..3af442930e --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/gorilla/emotes.dm @@ -0,0 +1,11 @@ +/datum/emote/sound/gorilla + mob_type_allowed_typecache = /mob/living/simple_animal/hostile/gorilla + mob_type_blacklist_typecache = list() + +/datum/emote/sound/gorilla/ooga + key = "ooga" + key_third_person = "oogas" + message = "oogas." + message_param = "oogas at %t." + sound = "sound/creatures/gorilla.ogg" + 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 0000000000..b697473787 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm @@ -0,0 +1,77 @@ +#define GORILLA_HANDS_LAYER 1 +#define GORILLA_TOTAL_LAYERS 1 + +/mob/living/simple_animal/hostile/gorilla + name = "Gorilla" + desc = "A ground-dwelling, predominantly herbivorous ape that inhabits the forests of central Africa." + icon = 'icons/mob/gorilla.dmi' + icon_state = "crawling" + icon_state = "crawling" + icon_living = "crawling" + icon_dead = "dead" + speak_chance = 80 + maxHealth = 220 + health = 220 + loot = list(/obj/effect/gibspawner/generic) + butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/gorilla = 4) + response_help = "prods" + response_disarm = "challenges" + response_harm = "thumps" + speed = 1 + 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 = 2 + attacktext = "pummels" + attack_sound = 'sound/weapons/punch1.ogg' + dextrous = TRUE + possible_a_intents = list(INTENT_HELP, INTENT_GRAB, INTENT_DISARM, INTENT_HARM) + faction = list("jungle") + robust_searching = TRUE + stat_attack = UNCONSCIOUS + minbodytemp = 270 + maxbodytemp = 350 + var/list/gorilla_overlays[GORILLA_TOTAL_LAYERS] + +// Gorillas like to dismember limbs from unconcious mobs. +// Returns null when the target is not an unconcious carbon mob; a list of limbs (possibly empty) otherwise. +/mob/living/simple_animal/hostile/gorilla/proc/target_bodyparts(atom/the_target) + var/list/parts = list() + if(iscarbon(the_target)) + var/mob/living/carbon/C = the_target + if(C.stat >= UNCONSCIOUS) + for(var/X in C.bodyparts) + var/obj/item/bodypart/BP = X + if(BP.body_part != HEAD && BP.body_part != CHEST) + if(BP.dismemberable) + parts += BP + return parts + +/mob/living/simple_animal/hostile/gorilla/AttackingTarget() + var/list/parts = target_bodyparts(target) + if(parts) + if(!parts.len) + return FALSE + var/obj/item/bodypart/BP = pick(parts) + BP.dismember() + return ..() + . = ..() + if(. && isliving(target)) + var/mob/living/L = target + if(prob(80)) + var/atom/throw_target = get_edge_target_turf(L, dir) + L.throw_at(throw_target, rand(1,2), 7, src) + else + L.Knockdown(20) + visible_message("[src] knocks [L] down!") + +/mob/living/simple_animal/hostile/gorilla/CanAttack(atom/the_target) + var/list/parts = target_bodyparts(target) + return ..() && !istype(the_target, /mob/living/carbon/monkey) && (!parts || parts.len > 3) + +/mob/living/simple_animal/hostile/gorilla/handle_automated_speech(override) + if(speak_chance && (override || prob(speak_chance))) + playsound(src, "sound/creatures/gorilla.ogg", 200) + ..() + diff --git a/code/modules/mob/living/simple_animal/hostile/gorilla/visuals_icons.dm b/code/modules/mob/living/simple_animal/hostile/gorilla/visuals_icons.dm new file mode 100644 index 0000000000..b3e0f3b658 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/gorilla/visuals_icons.dm @@ -0,0 +1,55 @@ +/mob/living/simple_animal/hostile/gorilla/proc/apply_overlay(cache_index) + . = gorilla_overlays[cache_index] + if(.) + add_overlay(.) + +/mob/living/simple_animal/hostile/gorilla/proc/remove_overlay(cache_index) + var/I = gorilla_overlays[cache_index] + if(I) + cut_overlay(I) + gorilla_overlays[cache_index] = null + +/mob/living/simple_animal/hostile/gorilla/update_inv_hands() + cut_overlays("standing_overlay") + remove_overlay(GORILLA_HANDS_LAYER) + + var/standing = FALSE + for(var/I in held_items) + if(I) + standing = TRUE + break + if(!standing) + if(stat != DEAD) + icon_state = "crawling" + speed = 1 + return ..() + if(stat != DEAD) + icon_state = "standing" + speed = 3 // Gorillas are slow when standing up. + + var/list/hands_overlays = list() + + var/obj/item/l_hand = get_item_for_held_index(1) + var/obj/item/r_hand = get_item_for_held_index(2) + + if(r_hand) + var/r_state = r_hand.item_state ? r_hand.item_state : r_hand.icon_state + var/mutable_appearance/r_hand_overlay = r_hand.build_worn_icon(state = r_state, default_layer = GORILLA_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE) + r_hand_overlay.pixel_y -= 1 + hands_overlays += r_hand_overlay + + if(l_hand) + var/l_state = l_hand.item_state ? l_hand.item_state : l_hand.icon_state + var/mutable_appearance/l_hand_overlay = l_hand.build_worn_icon(state = l_state, default_layer = GORILLA_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE) + l_hand_overlay.pixel_y -= 1 + hands_overlays += l_hand_overlay + + if(hands_overlays.len) + gorilla_overlays[GORILLA_HANDS_LAYER] = hands_overlays + apply_overlay(GORILLA_HANDS_LAYER) + add_overlay("standing_overlay") + return ..() + +/mob/living/simple_animal/hostile/gorilla/regenerate_icons() + update_inv_hands() + diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 54b6e1ab13..aa95d182cb 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -386,14 +386,14 @@ else ..() -/mob/living/simple_animal/update_canmove() +/mob/living/simple_animal/update_canmove(value_otherwise = TRUE) if(IsUnconscious() || IsStun() || IsKnockdown() || stat || resting) drop_all_held_items() - canmove = 0 + canmove = FALSE else if(buckled) - canmove = 0 + canmove = FALSE else - canmove = 1 + canmove = value_otherwise update_transform() update_action_buttons_icon() return canmove diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 021b32e00c..f9763cde7d 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -495,6 +495,30 @@ . = new_corgi qdel(src) +/mob/living/carbon/proc/gorillize() + if(notransform) + return + + var/Itemlist = get_equipped_items() + Itemlist += held_items + for(var/obj/item/W in Itemlist) + dropItemToGround(W, TRUE) + + regenerate_icons() + notransform = TRUE + canmove = FALSE + icon = null + invisibility = INVISIBILITY_MAXIMUM + var/mob/living/simple_animal/hostile/gorilla/new_gorilla = new (get_turf(src)) + new_gorilla.a_intent = INTENT_HARM + if(mind) + mind.transfer_to(new_gorilla) + else + new_gorilla.key = key + to_chat(new_gorilla, "You are now a gorilla. Ooga ooga!") + . = new_gorilla + qdel(src) + /mob/living/carbon/human/Animalize() var/list/mobtypes = typesof(/mob/living/simple_animal) diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 12ced0ed74..27284a1712 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -165,7 +165,7 @@ if("animal") var/path if(prob(50)) - var/beast = pick("carp","bear","mushroom","statue", "bat", "goat","killertomato", "spiderbase", "spiderhunter", "blobbernaut", "magicarp", "chaosmagicarp", "watcher", "goliath", "headcrab", "morph", "stickman", "stickdog", "lesserdragon") + var/beast = pick("carp","bear","mushroom","statue", "bat", "goat","killertomato", "spiderbase", "spiderhunter", "blobbernaut", "magicarp", "chaosmagicarp", "watcher", "goliath", "headcrab", "morph", "stickman", "stickdog", "lesserdragon", "gorilla") switch(beast) if("carp") path = /mob/living/simple_animal/hostile/carp @@ -205,6 +205,8 @@ path = /mob/living/simple_animal/hostile/stickman/dog if("lesserdragon") path = /mob/living/simple_animal/hostile/megafauna/dragon/lesser + if("gorilla") + path = /mob/living/simple_animal/hostile/gorilla else var/animal = pick("parrot","corgi","crab","pug","cat","mouse","chicken","cow","lizard","chick","fox","butterfly","cak") switch(animal) diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index 42226c7d2b..3ed8c153d8 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/mob/gorilla.dmi b/icons/mob/gorilla.dmi new file mode 100644 index 0000000000..77d03fa606 Binary files /dev/null and b/icons/mob/gorilla.dmi differ diff --git a/sound/creatures/gorilla.ogg b/sound/creatures/gorilla.ogg new file mode 100644 index 0000000000..cde0bc1edc Binary files /dev/null and b/sound/creatures/gorilla.ogg differ diff --git a/tgstation.dme b/tgstation.dme index 3b58a075e4..bca2fda847 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1802,6 +1802,9 @@ #include "code\modules\mob\living\simple_animal\hostile\wumborian_fugu.dm" #include "code\modules\mob\living\simple_animal\hostile\bosses\boss.dm" #include "code\modules\mob\living\simple_animal\hostile\bosses\paperwizard.dm" +#include "code\modules\mob\living\simple_animal\hostile\gorilla\emotes.dm" +#include "code\modules\mob\living\simple_animal\hostile\gorilla\gorilla.dm" +#include "code\modules\mob\living\simple_animal\hostile\gorilla\visuals_icons.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" #include "code\modules\mob\living\simple_animal\hostile\megafauna\colossus.dm" diff --git a/tgstation.dme.rej b/tgstation.dme.rej new file mode 100644 index 0000000000..a2c791bc5b --- /dev/null +++ b/tgstation.dme.rej @@ -0,0 +1,102 @@ +diff a/tgstation.dme b/tgstation.dme (rejected hunks) +@@ -765,73 +812,6 @@ + #include "code\game\objects\items\devices\radio\headset.dm" + #include "code\game\objects\items\devices\radio\intercom.dm" + #include "code\game\objects\items\devices\radio\radio.dm" +-#include "code\game\objects\items\robot\ai_upgrades.dm" +-#include "code\game\objects\items\robot\robot_items.dm" +-#include "code\game\objects\items\robot\robot_parts.dm" +-#include "code\game\objects\items\robot\robot_upgrades.dm" +-#include "code\game\objects\items\stacks\bscrystal.dm" +-#include "code\game\objects\items\stacks\cash.dm" +-#include "code\game\objects\items\stacks\medical.dm" +-#include "code\game\objects\items\stacks\rods.dm" +-#include "code\game\objects\items\stacks\stack.dm" +-#include "code\game\objects\items\stacks\telecrystal.dm" +-#include "code\game\objects\items\stacks\wrap.dm" +-#include "code\game\objects\items\stacks\sheets\glass.dm" +-#include "code\game\objects\items\stacks\sheets\leather.dm" +-#include "code\game\objects\items\stacks\sheets\light.dm" +-#include "code\game\objects\items\stacks\sheets\mineral.dm" +-#include "code\game\objects\items\stacks\sheets\sheet_types.dm" +-#include "code\game\objects\items\stacks\sheets\sheets.dm" +-#include "code\game\objects\items\stacks\tiles\light.dm" +-#include "code\game\objects\items\stacks\tiles\tile_mineral.dm" +-#include "code\game\objects\items\stacks\tiles\tile_types.dm" +-#include "code\game\objects\items\AI_modules.dm" +-#include "code\game\objects\items\airlock_painter.dm" +-#include "code\game\objects\items\cards_ids.dm" +-#include "code\game\objects\items\charter.dm" +-#include "code\game\objects\items\chrono_eraser.dm" +-#include "code\game\objects\items\cigs_lighters.dm" +-#include "code\game\objects\items\clown_items.dm" +-#include "code\game\objects\items\cosmetics.dm" +-#include "code\game\objects\items\courtroom.dm" +-#include "code\game\objects\items\defib.dm" +-#include "code\game\objects\items\dice.dm" +-#include "code\game\objects\items\dna_injector.dm" +-#include "code\game\objects\items\extinguisher.dm" +-#include "code\game\objects\items\flamethrower.dm" +-#include "code\game\objects\items\gift.dm" +-#include "code\game\objects\items\handcuffs.dm" +-#include "code\game\objects\items\his_grace.dm" +-#include "code\game\objects\items\holosign_creator.dm" +-#include "code\game\objects\items\holy_weapons.dm" +-#include "code\game\objects\items\inducer.dm" +-#include "code\game\objects\items\kitchen.dm" +-#include "code\game\objects\items\manuals.dm" +-#include "code\game\objects\items\miscellaneous.dm" +-#include "code\game\objects\items\mop.dm" +-#include "code\game\objects\items\paint.dm" +-#include "code\game\objects\items\paiwire.dm" +-#include "code\game\objects\items\pneumaticCannon.dm" +-#include "code\game\objects\items\powerfist.dm" +-#include "code\game\objects\items\RCD.dm" +-#include "code\game\objects\items\RCL.dm" +-#include "code\game\objects\items\RPD.dm" +-#include "code\game\objects\items\RSF.dm" +-#include "code\game\objects\items\scrolls.dm" +-#include "code\game\objects\items\sharpener.dm" +-#include "code\game\objects\items\shields.dm" +-#include "code\game\objects\items\signs.dm" +-#include "code\game\objects\items\singularityhammer.dm" +-#include "code\game\objects\items\stunbaton.dm" +-#include "code\game\objects\items\teleportation.dm" +-#include "code\game\objects\items\teleprod.dm" +-#include "code\game\objects\items\tools.dm" +-#include "code\game\objects\items\twohanded.dm" +-#include "code\game\objects\items\vending_items.dm" +-#include "code\game\objects\items\weaponry.dm" +-#include "code\game\objects\items\circuitboards\circuitboard.dm" +-#include "code\game\objects\items\circuitboards\computer_circuitboards.dm" +-#include "code\game\objects\items\circuitboards\machine_circuitboards.dm" + #include "code\game\objects\items\grenades\chem_grenade.dm" + #include "code\game\objects\items\grenades\clusterbuster.dm" + #include "code\game\objects\items\grenades\emgrenade.dm" +@@ -863,6 +843,26 @@ + #include "code\game\objects\items\melee\energy.dm" + #include "code\game\objects\items\melee\misc.dm" + #include "code\game\objects\items\melee\transforming.dm" ++#include "code\game\objects\items\robot\ai_upgrades.dm" ++#include "code\game\objects\items\robot\robot_items.dm" ++#include "code\game\objects\items\robot\robot_parts.dm" ++#include "code\game\objects\items\robot\robot_upgrades.dm" ++#include "code\game\objects\items\stacks\bscrystal.dm" ++#include "code\game\objects\items\stacks\cash.dm" ++#include "code\game\objects\items\stacks\medical.dm" ++#include "code\game\objects\items\stacks\rods.dm" ++#include "code\game\objects\items\stacks\stack.dm" ++#include "code\game\objects\items\stacks\telecrystal.dm" ++#include "code\game\objects\items\stacks\wrap.dm" ++#include "code\game\objects\items\stacks\sheets\glass.dm" ++#include "code\game\objects\items\stacks\sheets\leather.dm" ++#include "code\game\objects\items\stacks\sheets\light.dm" ++#include "code\game\objects\items\stacks\sheets\mineral.dm" ++#include "code\game\objects\items\stacks\sheets\sheet_types.dm" ++#include "code\game\objects\items\stacks\sheets\sheets.dm" ++#include "code\game\objects\items\stacks\tiles\light.dm" ++#include "code\game\objects\items\stacks\tiles\tile_mineral.dm" ++#include "code\game\objects\items\stacks\tiles\tile_types.dm" + #include "code\game\objects\items\storage\backpack.dm" + #include "code\game\objects\items\storage\bags.dm" + #include "code\game\objects\items\storage\belt.dm"