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 a9eddc6dd0..7aaa179f69 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.dm b/code/modules/mob/living/simple_animal/hostile/gorilla.dm new file mode 100644 index 0000000000..8a7d23f62d --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/gorilla.dm @@ -0,0 +1,75 @@ +/mob/living/simple_animal/hostile/gorilla + name = "Gorilla" + desc = "A ground-dwelling, predominantly herbivorous ape that inhabits the forests of central Africa." + icon_state = "gorilla" + icon_living = "gorilla" + icon_dead = "gorilla_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' + faction = list("jungle") + robust_searching = TRUE + stat_attack = UNCONSCIOUS + minbodytemp = 270 + maxbodytemp = 350 + +// 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 != null) + if(LAZYLEN(parts) == 0) + 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) + . = ..() + if(. && istype(the_target, /mob/living/carbon/monkey)) + return FALSE + var/list/parts = target_bodyparts(the_target) + if(parts != null && LAZYLEN(parts) <= 3) // Don't remove all of their limbs. + return FALSE + +/mob/living/simple_animal/hostile/gorilla/handle_automated_speech(var/override) + set waitfor = FALSE + if(speak_chance) + if(override || (target && prob(speak_chance))) + playsound(loc, "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/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/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 424495a8d0..8cee0cc6c7 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 e421b84853..9c03a414b3 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 7a1c12639f..c0fed04a6b 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 1475d2335c..e661e31241 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -748,24 +748,71 @@ #include "code\game\objects\effects\temporary_visuals\cult.dm" #include "code\game\objects\effects\temporary_visuals\miscellaneous.dm" #include "code\game\objects\effects\temporary_visuals\temporary_visual.dm" +#include "code\game\objects\items\AI_modules.dm" +#include "code\game\objects\items\airlock_painter.dm" #include "code\game\objects\items\apc_frame.dm" #include "code\game\objects\items\blueprints.dm" #include "code\game\objects\items\body_egg.dm" #include "code\game\objects\items\bodybag.dm" #include "code\game\objects\items\candle.dm" #include "code\game\objects\items\cardboard_cutouts.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\control_wand.dm" +#include "code\game\objects\items\cosmetics.dm" +#include "code\game\objects\items\courtroom.dm" #include "code\game\objects\items\crayons.dm" +#include "code\game\objects\items\defib.dm" #include "code\game\objects\items\dehy_carp.dm" +#include "code\game\objects\items\dice.dm" +#include "code\game\objects\items\dna_injector.dm" #include "code\game\objects\items\documents.dm" #include "code\game\objects\items\eightball.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\latexballoon.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\religion.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\shooting_range.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\taster.dm" +#include "code\game\objects\items\teleportation.dm" +#include "code\game\objects\items\teleprod.dm" #include "code\game\objects\items\theft_tools.dm" +#include "code\game\objects\items\tools.dm" #include "code\game\objects\items\toys.dm" #include "code\game\objects\items\trash.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\devices\aicard.dm" #include "code\game\objects\items\devices\camera_bug.dm" #include "code\game\objects\items\devices\chameleonproj.dm" @@ -1792,6 +1839,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"