From 328021a8dcf070f73fea7d002f5e02b704200627 Mon Sep 17 00:00:00 2001 From: Matt Atlas Date: Mon, 6 Jan 2020 20:23:05 +0100 Subject: [PATCH] Ports Baystation's handling of monkey/human NPCs. (#7892) Human NPCs and monkeys now have some more interactions. Monkeys can now take items and throw them. Or shoot guns. Or activate things. --- code/_helpers/turfs.dm | 16 ++++++ code/modules/mob/inventory.dm | 2 +- .../human/species/station/human/human.dm | 49 +++++++++++++++++- .../carbon/human/species/station/monkey.dm | 37 ++++++++++++- html/changelogs/mattatlas-monkey.yml | 42 +++++++++++++++ icons/mob/human_races/masks/blood_resomi.dmi | Bin 4210 -> 0 bytes .../mob/human_races/masks/dam_mask_resomi.dmi | Bin 449 -> 0 bytes icons/mob/human_races/masks/dam_resomi.dmi | Bin 2362 -> 0 bytes icons/mob/human_races/monkeys/monkey_body.dmi | Bin 0 -> 1050 bytes 9 files changed, 143 insertions(+), 3 deletions(-) create mode 100644 html/changelogs/mattatlas-monkey.yml delete mode 100644 icons/mob/human_races/masks/blood_resomi.dmi delete mode 100644 icons/mob/human_races/masks/dam_mask_resomi.dmi delete mode 100644 icons/mob/human_races/masks/dam_resomi.dmi create mode 100644 icons/mob/human_races/monkeys/monkey_body.dmi diff --git a/code/_helpers/turfs.dm b/code/_helpers/turfs.dm index e59bf929996..a28061d55e3 100644 --- a/code/_helpers/turfs.dm +++ b/code/_helpers/turfs.dm @@ -25,6 +25,22 @@ return 0 return 1 +/proc/get_random_turf_in_range(var/atom/origin, var/outer_range, var/inner_range) + origin = get_turf(origin) + if(!origin) + return + var/list/turfs = list() + for(var/turf/T in orange(origin, outer_range)) + if(!(T.z in current_map.sealed_levels)) // Picking a turf outside the map edge isn't recommended + if(T.x >= world.maxx-TRANSITIONEDGE || T.x <= TRANSITIONEDGE) + continue + if(T.y >= world.maxy-TRANSITIONEDGE || T.y <= TRANSITIONEDGE) + continue + if(!inner_range || get_dist(origin, T) >= inner_range) + turfs += T + if(turfs.len) + return pick(turfs) + // This proc will check if a neighboring tile in the stated direction "dir" is dense or not // Will return 1 if it is dense and zero if not /proc/check_neighbor_density(turf/T, var/dir) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index df334f450c5..051049f118d 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -317,7 +317,7 @@ var/list/slot_equipment_priority = list( \ /mob/living/carbon/throw_item(atom/target) src.throw_mode_off() - if(usr.stat || !target) + if(stat || !target) return if(target.type == /obj/screen) return diff --git a/code/modules/mob/living/carbon/human/species/station/human/human.dm b/code/modules/mob/living/carbon/human/species/station/human/human.dm index 1737629de29..f209c99cbf4 100644 --- a/code/modules/mob/living/carbon/human/species/station/human/human.dm +++ b/code/modules/mob/living/carbon/human/species/station/human/human.dm @@ -41,4 +41,51 @@ zombie_type = "Zombie" base_color = "#25032" - character_color_presets = list("Dark" = "#000000", "Warm" = "#250302", "Cold" = "#1e1e29") \ No newline at end of file + character_color_presets = list("Dark" = "#000000", "Warm" = "#250302", "Cold" = "#1e1e29") + +/datum/species/human/handle_npc(var/mob/living/carbon/human/H) + if(H.stat != CONSCIOUS) + return + + if(H.get_shock() && H.shock_stage < 40 && prob(3)) + H.emote(pick("moan","groan")) + + if(H.shock_stage > 10 && prob(3)) + H.emote(pick("cry","whimper")) + + if(H.shock_stage >= 40 && prob(3)) + H.emote("scream") + + if(!H.restrained() && H.lying && H.shock_stage >= 60 && prob(3)) + H.custom_emote("thrashes in agony") + + if(!H.restrained() && H.shock_stage < 40 && prob(3)) + var/maxdam = 0 + var/obj/item/organ/external/damaged_organ = null + for(var/obj/item/organ/external/E in H.organs) + if(!E.can_feel_pain()) + continue + var/dam = E.get_damage() + // make the choice of the organ depend on damage, + // but also sometimes use one of the less damaged ones + if(dam > maxdam && (maxdam == 0 || prob(50)) ) + damaged_organ = E + maxdam = dam + var/datum/gender/T = gender_datums[H.get_gender()] + if(damaged_organ) + if(damaged_organ.status & ORGAN_BLEEDING) + H.custom_emote("clutches [T.his] [damaged_organ.name], trying to stop the blood.") + else if(damaged_organ.status & ORGAN_BROKEN) + H.custom_emote("holds [T.his] [damaged_organ.name] carefully.") + else if(damaged_organ.burn_dam > damaged_organ.brute_dam && damaged_organ.organ_tag != BP_HEAD) + H.custom_emote("blows on [T.his] [damaged_organ.name] carefully.") + else + H.custom_emote("rubs [T.his] [damaged_organ.name] carefully.") + + for(var/obj/item/organ/I in H.internal_organs) + if((I.status & ORGAN_DEAD) || BP_IS_ROBOTIC(I)) + continue + if(I.damage > 2) + if(prob(2)) + var/obj/item/organ/external/parent = H.get_organ(I.parent_organ) + H.custom_emote("clutches [T.his] [parent.name]!") diff --git a/code/modules/mob/living/carbon/human/species/station/monkey.dm b/code/modules/mob/living/carbon/human/species/station/monkey.dm index 658ea038803..daefe1f9449 100644 --- a/code/modules/mob/living/carbon/human/species/station/monkey.dm +++ b/code/modules/mob/living/carbon/human/species/station/monkey.dm @@ -48,14 +48,49 @@ pass_flags = PASSTABLE holder_type = /obj/item/holder/monkey + var/static/list/no_touchie = list(/obj/item/mirror) + /datum/species/monkey/handle_npc(var/mob/living/carbon/human/H) if(H.stat != CONSCIOUS) return - if(prob(33) && H.canmove && isturf(H.loc) && !H.pulledby) //won't move if being pulled + if(prob(33) && isturf(H.loc) && !H.pulledby) //won't move if being pulled step(H, pick(cardinal)) + + var/obj/held = H.get_active_hand() + if(held && prob(1)) + var/turf/T = get_random_turf_in_range(H, 7, 2) + if(T) + if(istype(held, /obj/item/gun) && prob(80)) + var/obj/item/gun/G = held + G.Fire(T, H) + else + H.throw_item(T) + else + H.drop_item() + if(!held && !H.restrained() && prob(5)) + var/list/touchables = list() + for(var/obj/O in range(1,get_turf(H))) + if(O.simulated && O.Adjacent(H) && !is_type_in_list(O, no_touchie)) + touchables += O + if(touchables.len) + var/obj/touchy = pick(touchables) + touchy.attack_hand(H) + if(prob(1)) H.emote(pick("scratch","jump","roll","tail")) + if(H.get_shock() && H.shock_stage < 40 && prob(3)) + H.custom_emote("chimpers pitifully") + + if(H.shock_stage > 10 && prob(3)) + H.emote(pick("cry","whimper")) + + if(H.shock_stage >= 40 && prob(3)) + H.emote("scream") + + if(!H.restrained() && H.lying && H.shock_stage >= 60 && prob(3)) + H.custom_emote("thrashes in agony") + /datum/species/monkey/get_random_name() return "[lowertext(name)] ([rand(100,999)])" diff --git a/html/changelogs/mattatlas-monkey.yml b/html/changelogs/mattatlas-monkey.yml new file mode 100644 index 00000000000..1e344d35885 --- /dev/null +++ b/html/changelogs/mattatlas-monkey.yml @@ -0,0 +1,42 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +# balance +# admin +# backend +# security +# refactor +################################# + +# Your name. +author: MattAtlas + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Human NPCs and monkeys now have some more interactions." + - rscadd: "Monkeys can now take items and throw them. Or shoot guns. Or activate things." diff --git a/icons/mob/human_races/masks/blood_resomi.dmi b/icons/mob/human_races/masks/blood_resomi.dmi deleted file mode 100644 index 104eb8f94dd4e0757dc55f1ea1577e5a80dc3f9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4210 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 diff --git a/icons/mob/human_races/masks/dam_resomi.dmi b/icons/mob/human_races/masks/dam_resomi.dmi deleted file mode 100644 index 2241c3943c9f296e66775b00be37a38397943bc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2362 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 UgIPY#CIA2c07*qoM6N<$f;d~=?f?J) literal 0 HcmV?d00001