From 1935a82afe54be447564fa48396a09f3454c4036 Mon Sep 17 00:00:00 2001 From: ZomgPonies Date: Mon, 25 May 2015 19:48:13 -0400 Subject: [PATCH] 2/3 of port done --- code/ATMOSPHERICS/components/tvalve.dm | 11 +- code/ATMOSPHERICS/components/valve.dm | 3 - code/_onclick/other_mobs.dm | 2 +- code/controllers/hooks-defs.dm | 2 +- code/datums/mind.dm | 9 +- code/datums/spell.dm | 2 +- code/datums/spells/horsemask.dm | 2 +- code/datums/spells/inflict_handler.dm | 2 +- code/datums/supplypacks.dm | 2 + code/game/atoms_movable.dm | 4 - code/game/dna/dna_modifier.dm | 2 - code/game/dna/genes/goon_disabilities.dm | 2 +- code/game/dna/genes/goon_powers.dm | 4 +- code/game/dna/genes/monkey.dm | 242 +++---- .../gamemodes/changeling/changeling_power.dm | 4 +- .../gamemodes/changeling/evolution_menu.dm | 8 +- .../gamemodes/changeling/powers/tiny_prick.dm | 4 +- code/game/gamemodes/mutiny/mutiny_hooks.dm | 2 +- code/game/gamemodes/nations/flagprocs.dm | 2 - code/game/machinery/Freezer.dm | 3 - .../atmoalter/area_atmos_computer.dm | 2 - code/game/machinery/camera/camera.dm | 11 - .../machinery/computer/HolodeckControl.dm | 2 - code/game/machinery/computer/aifixer.dm | 3 - code/game/machinery/computer/camera.dm | 2 - code/game/machinery/computer/prisoner.dm | 2 - code/game/machinery/doors/airlock.dm | 2 - code/game/machinery/doors/door.dm | 7 +- code/game/machinery/doors/windowdoor.dm | 2 - code/game/machinery/guestpass.dm | 2 - code/game/machinery/kitchen/monkeyrecycler.dm | 4 +- code/game/machinery/kitchen/processor.dm | 4 +- code/game/machinery/navbeacon.dm | 2 - code/game/machinery/teleporter.dm | 9 +- code/game/objects/items.dm | 2 +- code/game/objects/items/devices/powersink.dm | 2 - code/game/objects/items/stacks/medical.dm | 2 +- code/game/objects/items/weapons/grenades.dm | 2 +- .../objects/items/weapons/storage/bags.dm | 2 +- .../objects/items/weapons/storage/boxes.dm | 3 +- .../objects/items/weapons/storage/firstaid.dm | 2 +- .../crates_lockers/closets/statue.dm | 4 +- code/game/supplyshuttle.dm | 4 - .../awaymissions/mission_code/wildwest.dm | 2 +- code/modules/hydroponics/seed.dm | 2 +- code/modules/hydroponics/seed_datums.dm | 2 +- code/modules/hydroponics/trays/tray.dm | 4 +- code/modules/jungle/jungle_animals.dm | 2 +- code/modules/media/jukebox.dm | 2 - .../mob/living/carbon/alien/diona/diona.dm | 34 + .../carbon/alien/diona/diona_attacks.dm | 7 + .../living/carbon/alien/diona/diona_powers.dm | 69 ++ .../diona.dm => alien/diona/dionaold.dm} | 0 .../mob/living/carbon/alien/diona/life.dm | 22 + .../living/carbon/alien/diona/progression.dm | 19 + .../carbon/alien/diona/say_understands.dm | 6 + .../living/carbon/alien/diona/update_icons.dm | 8 + .../living/carbon/alien/humanoid/humanoid.dm | 28 - .../mob/living/carbon/alien/larva/larva.dm | 28 - .../living/carbon/alien/special/facehugger.dm | 2 +- .../mob/living/carbon/human/examine.dm | 2 +- code/modules/mob/living/carbon/human/npcs.dm | 2 +- code/modules/mob/living/carbon/human/say.dm | 2 +- .../mob/living/carbon/human/species/apollo.dm | 2 +- .../mob/living/carbon/human/species/monkey.dm | 18 +- .../living/carbon/human/species/station.dm | 6 +- .../mob/living/carbon/human/update_icons.dm | 40 +- .../modules/mob/living/carbon/metroid/life.dm | 2 +- .../mob/living/carbon/metroid/metroid.dm | 31 - .../modules/mob/living/carbon/monkey/death.dm | 56 -- .../modules/mob/living/carbon/monkey/emote.dm | 157 ---- .../mob/living/carbon/monkey/examine.dm | 63 -- code/modules/mob/living/carbon/monkey/hud.dm | 249 ------- .../mob/living/carbon/monkey/inventory.dm | 243 ------- code/modules/mob/living/carbon/monkey/life.dm | 675 ------------------ .../modules/mob/living/carbon/monkey/login.dm | 4 - .../mob/living/carbon/monkey/monkey.dm | 553 -------------- code/modules/mob/living/carbon/monkey/npc.dm | 89 --- code/modules/mob/living/carbon/monkey/say.dm | 28 - .../mob/living/carbon/monkey/update_icons.dm | 134 ---- code/modules/mob/living/living.dm | 7 - .../modules/mob/living/silicon/robot/robot.dm | 5 - .../living/simple_animal/friendly/corgi.dm | 4 +- .../mob/living/simple_animal/friendly/crab.dm | 4 +- .../mob/living/simple_animal/parrot.dm | 2 +- .../mob/living/simple_animal/simple_animal.dm | 23 - code/modules/mob/mob_cleanup.dm | 8 - code/modules/mob/mob_grab.dm | 2 +- code/modules/mob/mob_helpers.dm | 12 +- code/modules/mob/transform_procs.dm | 2 +- code/modules/organs/blood.dm | 6 - code/modules/power/apc.dm | 3 +- code/modules/power/port_gen.dm | 9 +- code/modules/projectiles/gun.dm | 2 +- code/modules/projectiles/projectile/change.dm | 5 +- code/modules/projectiles/projectile/magic.dm | 5 +- code/modules/reagents/Chemistry-Reagents.dm | 7 - code/modules/reagents/newchem/toxins.dm | 4 +- .../reagent_containers/food/snacks.dm | 23 +- .../reagents/reagent_containers/syringes.dm | 4 - code/modules/recycling/disposal.dm | 9 - .../artifact/artifact_autocloner.dm | 3 +- code/modules/virus2/effect.dm | 2 +- code/modules/virus2/helpers.dm | 5 - icons/mob/human_races/masks/blood_human.dmi | Bin 0 -> 8321 bytes icons/mob/human_races/masks/blood_monkey.dmi | Bin 0 -> 1773 bytes icons/mob/human_races/masks/dam_human.dmi | Bin 0 -> 6471 bytes .../mob/human_races/masks/dam_mask_human.dmi | Bin 0 -> 431 bytes .../mob/human_races/masks/dam_mask_monkey.dmi | Bin 0 -> 688 bytes icons/mob/human_races/masks/dam_monkey.dmi | Bin 0 -> 4439 bytes icons/mob/human_races/monkeys/r_farwa.dmi | Bin 0 -> 1231 bytes icons/mob/human_races/monkeys/r_monkey.dmi | Bin 0 -> 952 bytes icons/mob/human_races/monkeys/r_neara.dmi | Bin 0 -> 1035 bytes icons/mob/human_races/monkeys/r_stok.dmi | Bin 0 -> 1125 bytes paradise.dme | 20 +- 115 files changed, 377 insertions(+), 2781 deletions(-) create mode 100644 code/modules/mob/living/carbon/alien/diona/diona.dm create mode 100644 code/modules/mob/living/carbon/alien/diona/diona_attacks.dm create mode 100644 code/modules/mob/living/carbon/alien/diona/diona_powers.dm rename code/modules/mob/living/carbon/{monkey/diona.dm => alien/diona/dionaold.dm} (100%) create mode 100644 code/modules/mob/living/carbon/alien/diona/life.dm create mode 100644 code/modules/mob/living/carbon/alien/diona/progression.dm create mode 100644 code/modules/mob/living/carbon/alien/diona/say_understands.dm create mode 100644 code/modules/mob/living/carbon/alien/diona/update_icons.dm delete mode 100644 code/modules/mob/living/carbon/monkey/death.dm delete mode 100644 code/modules/mob/living/carbon/monkey/emote.dm delete mode 100644 code/modules/mob/living/carbon/monkey/examine.dm delete mode 100644 code/modules/mob/living/carbon/monkey/hud.dm delete mode 100644 code/modules/mob/living/carbon/monkey/inventory.dm delete mode 100644 code/modules/mob/living/carbon/monkey/life.dm delete mode 100644 code/modules/mob/living/carbon/monkey/login.dm delete mode 100644 code/modules/mob/living/carbon/monkey/monkey.dm delete mode 100644 code/modules/mob/living/carbon/monkey/npc.dm delete mode 100644 code/modules/mob/living/carbon/monkey/say.dm delete mode 100644 code/modules/mob/living/carbon/monkey/update_icons.dm create mode 100644 icons/mob/human_races/masks/blood_human.dmi create mode 100644 icons/mob/human_races/masks/blood_monkey.dmi create mode 100644 icons/mob/human_races/masks/dam_human.dmi create mode 100644 icons/mob/human_races/masks/dam_mask_human.dmi create mode 100644 icons/mob/human_races/masks/dam_mask_monkey.dmi create mode 100644 icons/mob/human_races/masks/dam_monkey.dmi create mode 100644 icons/mob/human_races/monkeys/r_farwa.dmi create mode 100644 icons/mob/human_races/monkeys/r_monkey.dmi create mode 100644 icons/mob/human_races/monkeys/r_neara.dmi create mode 100644 icons/mob/human_races/monkeys/r_stok.dmi diff --git a/code/ATMOSPHERICS/components/tvalve.dm b/code/ATMOSPHERICS/components/tvalve.dm index da4a9cbb7bd..c97367f0529 100644 --- a/code/ATMOSPHERICS/components/tvalve.dm +++ b/code/ATMOSPHERICS/components/tvalve.dm @@ -37,12 +37,12 @@ if(!istype(T)) return add_underlay(T, node1, turn(dir, -180)) - + if(istype(src, /obj/machinery/atmospherics/tvalve/mirrored)) add_underlay(T, node2, turn(dir, 90)) else add_underlay(T, node2, turn(dir, -90)) - + add_underlay(T, node3, dir) /obj/machinery/atmospherics/tvalve/hide(var/i) @@ -172,9 +172,6 @@ /obj/machinery/atmospherics/tvalve/attack_ai(mob/user as mob) return -/obj/machinery/atmospherics/tvalve/attack_paw(mob/user as mob) - return attack_hand(user) - /obj/machinery/atmospherics/tvalve/attack_hand(mob/user as mob) src.add_fingerprint(usr) update_icon(1) @@ -224,7 +221,7 @@ src.connected_to = c node3 = target break - + update_icon() update_underlays() @@ -419,7 +416,7 @@ if(target.initialize_directions & get_dir(target,src)) node3 = target break - + update_icon() update_underlays() diff --git a/code/ATMOSPHERICS/components/valve.dm b/code/ATMOSPHERICS/components/valve.dm index 1ec8bc13dce..481b3ecd062 100644 --- a/code/ATMOSPHERICS/components/valve.dm +++ b/code/ATMOSPHERICS/components/valve.dm @@ -132,9 +132,6 @@ /obj/machinery/atmospherics/valve/attack_ai(mob/user as mob) return -/obj/machinery/atmospherics/valve/attack_paw(mob/user as mob) - return attack_hand(user) - /obj/machinery/atmospherics/valve/attack_hand(mob/user as mob) src.add_fingerprint(usr) update_icon(1) diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 17121f92f32..921fb8e818e 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -57,7 +57,7 @@ /mob/living/carbon/alien/UnarmedAttack(var/atom/A) A.attack_alien(src) /atom/proc/attack_alien(mob/user as mob) - attack_paw(user) + attack_hand(user) return /mob/living/carbon/alien/RestrainedClickOn(var/atom/A) return diff --git a/code/controllers/hooks-defs.dm b/code/controllers/hooks-defs.dm index 973da27ee48..fafb898de6a 100644 --- a/code/controllers/hooks-defs.dm +++ b/code/controllers/hooks-defs.dm @@ -54,7 +54,7 @@ /** * Podman hook. * Called in podmen.dm when someone is brought back as a Diona. - * Parameters: var/mob/living/carbon/monkey/diona + * Parameters: var/mob/living/carbon/alien/diona */ /hook/harvest_podman diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 47fade12372..5d5b7588355 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -137,7 +137,7 @@ datum/mind ) var/text = "" var/mob/living/carbon/human/H = current - if (istype(current, /mob/living/carbon/human) || istype(current, /mob/living/carbon/monkey)) + if (istype(current, /mob/living/carbon/human)) /** Impanted**/ if(H.is_loyalty_implanted(H)) text = "Loyalty Implant:Remove|Implanted
" @@ -343,13 +343,6 @@ datum/mind text = "[text]: " if (istype(current, /mob/living/carbon/human)) text += "healthy|infected|HUMAN|other" - else if (istype(current, /mob/living/carbon/monkey)) - var/found = 0 - - if(found) - text += "healthy|INFECTED|human|other" - else - text += "HEALTHY|infected|human|other" else text += "healthy|infected|human|OTHER" diff --git a/code/datums/spell.dm b/code/datums/spell.dm index 2c27947ddbf..c9a91dc563d 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -84,7 +84,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin user << "Not when you're incapacitated." return 0 - if(ishuman(user) || ismonkey(user)) + if(ishuman(user) || issmall(user)) if(user.is_muzzled()) user << "Mmmf mrrfff!" return 0 diff --git a/code/datums/spells/horsemask.dm b/code/datums/spells/horsemask.dm index d8f7fec621e..035a3ab7416 100644 --- a/code/datums/spells/horsemask.dm +++ b/code/datums/spells/horsemask.dm @@ -12,7 +12,7 @@ range = 7 cooldown_min = 30 //30 deciseconds reduction per rank selection_type = "range" - var/list/compatible_mobs = list(/mob/living/carbon/human, /mob/living/carbon/monkey) + var/list/compatible_mobs = list(/mob/living/carbon/human) action_icon_state = "spell_horse" diff --git a/code/datums/spells/inflict_handler.dm b/code/datums/spells/inflict_handler.dm index 2035ed315e1..742326464db 100644 --- a/code/datums/spells/inflict_handler.dm +++ b/code/datums/spells/inflict_handler.dm @@ -26,7 +26,7 @@ if("gib") target.gib() if("gib_brain") - if(ishuman(target) || ismonkey(target)) + if(ishuman(target) || issmall(target)) var/mob/living/carbon/C = target if(C.brain_op_stage != 4) // Their brain is already taken out var/obj/item/organ/brain/B = new(C.loc) diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index d00c7deeac6..d7dfd29644d 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -799,11 +799,13 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine cost = 30 containername = "farwa crate" +/* /datum/supply_packs/organic/wolpin name = "Wolpin crate" contains = list (/obj/item/weapon/storage/box/wolpincubes) cost = 30 containername = "wolpin crate" +*/ /datum/supply_packs/organic/skrell name = "Neaera crate" diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 0cc4606419b..ab594b30ba1 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -251,10 +251,6 @@ return src.master.attackby(a, b, c) return -/atom/movable/overlay/attack_paw(a, b, c) - if (src.master) - return src.master.attack_paw(a, b, c) - return /atom/movable/overlay/attack_hand(a, b, c) if (src.master) diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 2ba16ac0663..38804b13067 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -417,8 +417,6 @@ return return */ -/obj/machinery/computer/scan_consolenew/attack_paw(user as mob) - attack_hand(user) /obj/machinery/computer/scan_consolenew/attack_ai(user as mob) src.add_hiddenprint(user) diff --git a/code/game/dna/genes/goon_disabilities.dm b/code/game/dna/genes/goon_disabilities.dm index 9d22fff859b..449d15fc1bc 100644 --- a/code/game/dna/genes/goon_disabilities.dm +++ b/code/game/dna/genes/goon_disabilities.dm @@ -315,7 +315,7 @@ invocation_type = "none" range = 7 selection_type = "range" - var/list/compatible_mobs = list(/mob/living/carbon/human, /mob/living/carbon/monkey) + var/list/compatible_mobs = list(/mob/living/carbon/human) include_user = 0 action_icon_state = "genetic_incendiary" diff --git a/code/game/dna/genes/goon_powers.dm b/code/game/dna/genes/goon_powers.dm index 6007d233512..4abbb4eee54 100644 --- a/code/game/dna/genes/goon_powers.dm +++ b/code/game/dna/genes/goon_powers.dm @@ -142,7 +142,7 @@ selection_type = "range" include_user = 1 // centcomm_cancast = 0 - var/list/compatible_mobs = list(/mob/living/carbon/human, /mob/living/carbon/monkey) + var/list/compatible_mobs = list(/mob/living/carbon/human) action_icon_state = "genetic_cryo" @@ -240,7 +240,7 @@ action_icon_state = "genetic_eat" - var/list/types_allowed=list(/obj/item,/mob/living/simple_animal, /mob/living/carbon/monkey, /mob/living/carbon/human) + var/list/types_allowed=list(/obj/item,/mob/living/simple_animal, /mob/living/carbon/human) /obj/effect/proc_holder/spell/wizard/targeted/eat/choose_targets(mob/user = usr) var/list/targets = new /list() diff --git a/code/game/dna/genes/monkey.dm b/code/game/dna/genes/monkey.dm index c10178b285a..4c711464777 100644 --- a/code/game/dna/genes/monkey.dm +++ b/code/game/dna/genes/monkey.dm @@ -5,166 +5,92 @@ block=MONKEYBLOCK /datum/dna/gene/monkey/can_activate(var/mob/M,var/flags) - return istype(M, /mob/living/carbon/human) || istype(M,/mob/living/carbon/monkey) + return istype(M, /mob/living/carbon/human) -/datum/dna/gene/monkey/activate(var/mob/living/M, var/connected, var/flags) - if(!istype(M,/mob/living/carbon/human)) +/datum/dna/gene/monkey/activate(var/mob/living/carbon/human/H, var/connected, var/flags) + if(!istype(H,/mob/living/carbon/human)) // testing("Cannot monkey-ify [M], type is [M.type].") return - var/mob/living/carbon/human/H = M - H.notransform = 1 - var/list/implants = list() //Try to preserve implants. - for(var/obj/item/weapon/implant/W in H) - implants += W - W.loc = null - - if(!connected) - for(var/obj/item/W in (H.contents-implants)) - if (W==H.w_uniform) // will be teared - continue - H.unEquip(W) - M.notransform = 1 - M.canmove = 0 - M.icon = null - M.invisibility = 101 - var/atom/movable/overlay/animation = new( M.loc ) - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = src - flick("h2monkey", animation) - sleep(48) - qdel(animation) - - - var/mob/living/carbon/monkey/O = null - if(H.species.primitive) - O = new H.species.primitive(src) - else - H.gib() //Trying to change the species of a creature with no primitive var set is messy. + if(H.monkeyizing) return - - if(M) - if (M.dna) - O.dna = M.dna.Clone() - M.dna = null - - if (M.suiciding) - O.suiciding = M.suiciding - M.suiciding = null - - - - - for(var/obj/T in (M.contents-implants)) - qdel(T) - - O.loc = M.loc - - if(M.mind) - M.mind.transfer_to(O) //transfer our mind to the cute little monkey - - if (connected) //inside dna thing - var/obj/machinery/dna_scannernew/C = connected - O.loc = C - C.occupant = O - connected = null - O.real_name = text("monkey ([])",copytext(md5(M.real_name), 2, 6)) - O.take_overall_damage(M.getBruteLoss() + 40, M.getFireLoss()) - O.adjustToxLoss(M.getToxLoss() + 20) - O.adjustOxyLoss(M.getOxyLoss()) - O.stat = M.stat - O.a_intent = "hurt" - for (var/obj/item/weapon/implant/I in implants) - I.loc = O - I.implanted = O -// O.update_icon = 1 //queue a full icon update at next life() call - qdel(M) - return - -/datum/dna/gene/monkey/deactivate(var/mob/living/M, var/connected, var/flags) - if(!istype(M,/mob/living/carbon/monkey)) - testing("Cannot humanize [M], type is [M.type].") - return - var/mob/living/carbon/monkey/Mo = M - Mo.notransform = 1 - var/list/implants = list() //Still preserving implants - for(var/obj/item/weapon/implant/W in Mo) - implants += W - W.loc = null - if(!connected) - for(var/obj/item/W in (Mo.contents-implants)) - Mo.unEquip(W) - M.notransform = 1 - M.canmove = 0 - M.icon = null - M.invisibility = 101 - var/atom/movable/overlay/animation = new( M.loc ) - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = src - flick("monkey2h", animation) - sleep(48) - del(animation) - - var/mob/living/carbon/human/O - if(Mo.greaterform) - var/greatform = lowertext(Mo.greaterform) - var/typepath = "/mob/living/carbon/human/" - typepath += greatform - O = new typepath(src, greatform) - else - O = new(src) - - if (M.dna.GetUIState(DNA_UI_GENDER)) - O.gender = FEMALE - else - O.gender = MALE - - if (M) - if (M.dna) - O.dna = M.dna.Clone() - M.dna = null - - if (M.suiciding) - O.suiciding = M.suiciding - M.suiciding = null - - - //for(var/obj/T in M) - // del(T) - - O.loc = M.loc - - if(M.mind) - M.mind.transfer_to(O) //transfer our mind to the human - - if (connected) //inside dna thing - var/obj/machinery/dna_scannernew/C = connected - O.loc = C - C.occupant = O - connected = null - - var/i - while (!i) - var/randomname - if (O.gender == MALE) - randomname = capitalize(pick(first_names_male) + " " + capitalize(pick(last_names))) - else - randomname = capitalize(pick(first_names_female) + " " + capitalize(pick(last_names))) - if (findname(randomname)) + for(var/obj/item/W in H) + if (W==H.w_uniform) // will be torn continue - else - O.real_name = randomname - O.dna.real_name = randomname - i++ - O.UpdateAppearance() - O.take_overall_damage(M.getBruteLoss(), M.getFireLoss()) - O.adjustToxLoss(M.getToxLoss()) - O.adjustOxyLoss(M.getOxyLoss()) - O.stat = M.stat - for (var/obj/item/weapon/implant/I in implants) - I.loc = O - I.implanted = O -// O.update_icon = 1 //queue a full icon update at next life() call - del(M) - return \ No newline at end of file + H.drop_from_inventory(W) + H.regenerate_icons() + H.monkeyizing = 1 + H.canmove = 0 + H.stunned = 1 + H.icon = null + H.invisibility = 101 + for(var/t in H.organs) + del(t) + var/atom/movable/overlay/animation = new /atom/movable/overlay( H.loc ) + animation.icon_state = "blank" + animation.icon = 'icons/mob/mob.dmi' + animation.master = H + flick("h2monkey", animation) + sleep(48) + //animation = null + + H.monkeyizing = 0 + H.stunned = 0 + H.update_canmove() + H.invisibility = initial(H.invisibility) + + if(!H.species.primitive_form) //If the creature in question has no primitive set, this is going to be messy. + H.gib() + return + + for(var/obj/item/W in H) + H.drop_from_inventory(W) + H.set_species(H.species.primitive_form) + + H << "You are now [H.species.name]. " + qdel(animation) + + return H + +/datum/dna/gene/monkey/deactivate(var/mob/living/carbon/human/H, var/connected, var/flags) + if(!istype(H,/mob/living/carbon/human)) +// testing("Cannot monkey-ify [M], type is [M.type].") + return + if(H.monkeyizing) + return + for(var/obj/item/W in H) + if (W==H.w_uniform) // will be torn + continue + H.drop_from_inventory(W) + H.regenerate_icons() + H.monkeyizing = 1 + H.canmove = 0 + H.stunned = 1 + H.icon = null + H.invisibility = 101 + for(var/t in H.organs) + del(t) + var/atom/movable/overlay/animation = new /atom/movable/overlay( H.loc ) + animation.icon_state = "blank" + animation.icon = 'icons/mob/mob.dmi' + animation.master = H + flick("monkey2h", animation) + sleep(48) + //animation = null + + H.monkeyizing = 0 + H.stunned = 0 + H.update_canmove() + H.invisibility = initial(H.invisibility) + + if(!H.species.greater_form) //If the creature in question has no primitive set, this is going to be messy. + H.gib() + return + + for(var/obj/item/W in H) + H.drop_from_inventory(W) + H.set_species(H.species.greater_form) + + H << "You are now [H.species.name]. " + qdel(animation) + + return H \ No newline at end of file diff --git a/code/game/gamemodes/changeling/changeling_power.dm b/code/game/gamemodes/changeling/changeling_power.dm index 36df179ae32..25875f77f04 100644 --- a/code/game/gamemodes/changeling/changeling_power.dm +++ b/code/game/gamemodes/changeling/changeling_power.dm @@ -47,7 +47,7 @@ //Fairly important to remember to return 1 on success >.< /obj/effect/proc_holder/changeling/proc/can_sting(var/mob/user, var/mob/target) - if(!ishuman(user) && !ismonkey(user)) //typecast everything from mob to carbon from this point onwards + if(!ishuman(user) && !issmall(user)) //typecast everything from mob to carbon from this point onwards return 0 if(req_human && !ishuman(user)) user << "We cannot do that in this form!" @@ -72,7 +72,7 @@ //used in /mob/Stat() /obj/effect/proc_holder/changeling/proc/can_be_used_by(var/mob/user) - if(!ishuman(user) && !ismonkey(user)) + if(!ishuman(user) && !issmall(user)) return 0 if(req_human && !ishuman(user)) return 0 diff --git a/code/game/gamemodes/changeling/evolution_menu.dm b/code/game/gamemodes/changeling/evolution_menu.dm index 32ab8473d66..fefc9965a24 100644 --- a/code/game/gamemodes/changeling/evolution_menu.dm +++ b/code/game/gamemodes/changeling/evolution_menu.dm @@ -352,7 +352,7 @@ var/list/sting_paths /mob/proc/make_changeling() if(!mind) return - if(!ishuman(src) && !ismonkey(src)) + if(!ishuman(src) && !issmall(src)) return if(!mind.changeling) mind.changeling = new /datum/changeling(gender) @@ -360,7 +360,7 @@ var/list/sting_paths sting_paths = init_subtypes(/obj/effect/proc_holder/changeling) if(mind.changeling.purchasedpowers) remove_changeling_powers(1) - + add_language("Changeling") for(var/language in languages) @@ -377,7 +377,7 @@ var/list/sting_paths var/mob/living/carbon/C = src //only carbons have dna now, so we have to typecaste mind.changeling.absorbed_dna |= C.dna return 1 - + //Used to dump the languages from the changeling datum into the actual mob. /mob/proc/changeling_update_languages(var/updated_languages) @@ -400,7 +400,7 @@ var/list/sting_paths mimicing = "" /mob/proc/remove_changeling_powers(var/keep_free_powers=0) - if(ishuman(src) || ismonkey(src)) + if(ishuman(src) || issmall(src)) if(mind && mind.changeling) digitalcamo = 0 mind.changeling.changeling_speak = 0 diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm index 6158b8672bd..04446895a4d 100644 --- a/code/game/gamemodes/changeling/powers/tiny_prick.dm +++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm @@ -82,7 +82,7 @@ /obj/effect/proc_holder/changeling/sting/transformation/can_sting(var/mob/user, var/mob/target) if(!..()) return - if((HUSK in target.mutations) || (!ishuman(target) && !ismonkey(target))) + if((HUSK in target.mutations) || (!ishuman(target) && !issmall(target))) user << "Our sting appears ineffective against its DNA." return 0 if(ishuman(target)) @@ -95,7 +95,7 @@ /obj/effect/proc_holder/changeling/sting/transformation/sting_action(var/mob/user, var/mob/target) add_logs(target, user, "stung", object="transformation sting", addition=" new identity is [selected_dna.real_name]") var/datum/dna/NewDNA = selected_dna - if(ismonkey(target)) + if(issmall(target)) user << "We stealthily sting [target.name]." target.dna = NewDNA.Clone() target.real_name = NewDNA.real_name diff --git a/code/game/gamemodes/mutiny/mutiny_hooks.dm b/code/game/gamemodes/mutiny/mutiny_hooks.dm index 1ff1234cf2d..5fdc1ec01b5 100644 --- a/code/game/gamemodes/mutiny/mutiny_hooks.dm +++ b/code/game/gamemodes/mutiny/mutiny_hooks.dm @@ -12,7 +12,7 @@ mode.update_icon(H.mind) return 1 -/hook/harvest_podman/proc/update_icon(mob/living/carbon/monkey/diona/D) +/hook/harvest_podman/proc/update_icon(mob/living/carbon/alien/diona/D) var/datum/game_mode/mutiny/mode = get_mutiny_mode() if (!mode) return 1 diff --git a/code/game/gamemodes/nations/flagprocs.dm b/code/game/gamemodes/nations/flagprocs.dm index b7dc23a2913..aa516de1f3d 100644 --- a/code/game/gamemodes/nations/flagprocs.dm +++ b/code/game/gamemodes/nations/flagprocs.dm @@ -23,8 +23,6 @@ /obj/item/flag/nation/attackby(var/obj/item/weapon/W, var/mob/user, params) return -/obj/item/flag/nation/attack_paw() - return /obj/item/flag/nation/ex_act() return diff --git a/code/game/machinery/Freezer.dm b/code/game/machinery/Freezer.dm index 9c1bd3fdafc..fa44371b82e 100644 --- a/code/game/machinery/Freezer.dm +++ b/code/game/machinery/Freezer.dm @@ -82,9 +82,6 @@ /obj/machinery/atmospherics/unary/cold_sink/freezer/attack_ai(mob/user as mob) src.attack_hand(user) -/obj/machinery/atmospherics/unary/cold_sink/freezer/attack_paw(mob/user as mob) - src.attack_hand(user) - /obj/machinery/atmospherics/unary/cold_sink/freezer/attack_hand(mob/user as mob) if(panel_open) user << "Close the maintenance panel first." diff --git a/code/game/machinery/atmoalter/area_atmos_computer.dm b/code/game/machinery/atmoalter/area_atmos_computer.dm index ddd5973c0d7..fbebcbeca44 100644 --- a/code/game/machinery/atmoalter/area_atmos_computer.dm +++ b/code/game/machinery/atmoalter/area_atmos_computer.dm @@ -24,8 +24,6 @@ src.add_hiddenprint(user) return src.attack_hand(user) - attack_paw(var/mob/user as mob) - return attack_hand(var/mob/user as mob) if(..(user)) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 7c24df85ba8..7051d805c82 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -113,17 +113,6 @@ return user.electrocute_act(10, src) -/obj/machinery/camera/attack_paw(mob/living/carbon/alien/humanoid/user as mob) - if(!istype(user)) - return - user.do_attack_animation(src) - status = 0 - visible_message("\The [user] slashes at [src]!") - playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1) - icon_state = "[initial(icon_state)]1" - add_hiddenprint(user) - deactivate(user,0) - /obj/machinery/camera/attackby(W as obj, mob/living/user as mob, params) var/msg = "You attach [W] into the assembly inner circuits." var/msg2 = "The camera already has that upgrade!" diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm index 0143d6e4eeb..d7293163318 100644 --- a/code/game/machinery/computer/HolodeckControl.dm +++ b/code/game/machinery/computer/HolodeckControl.dm @@ -15,8 +15,6 @@ attack_ai(var/mob/user as mob) return src.attack_hand(user) - attack_paw(var/mob/user as mob) - return attack_hand(var/mob/user as mob) diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index 417e781e640..f171a8262b1 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -26,9 +26,6 @@ /obj/machinery/computer/aifixer/attack_ai(var/mob/user as mob) return attack_hand(user) -/obj/machinery/computer/aifixer/attack_paw(var/mob/user as mob) - return attack_hand(user) - /obj/machinery/computer/aifixer/attack_hand(var/mob/user as mob) if(..()) return diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 33ac065926d..35745965926 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -46,8 +46,6 @@ var/camera_cache_id = 1 attack_ai(var/mob/user as mob) return attack_hand(user) - attack_paw(var/mob/user as mob) - return attack_hand(user) check_eye(var/mob/user as mob) if ((get_dist(user, src) > 1 || !( user.canmove ) || user.blinded || !( current ) || !( current.status )) && (!istype(user, /mob/living/silicon))) diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm index 1e667aae3b3..5bef2a94555 100644 --- a/code/game/machinery/computer/prisoner.dm +++ b/code/game/machinery/computer/prisoner.dm @@ -21,8 +21,6 @@ return src.attack_hand(user) - attack_paw(var/mob/user as mob) - return attack_hand(var/mob/user as mob) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 617214ea5c5..a0021730a11 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -606,8 +606,6 @@ About the new airlock wires panel: s.set_up(5, 1, src) s.start() return ..() -/obj/machinery/door/airlock/attack_paw(mob/user as mob) - return src.attack_hand(user) /obj/machinery/door/airlock/attack_hand(mob/user as mob) if(!istype(user, /mob/living/silicon)) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 7fbc689bbbb..640775a48d0 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -132,11 +132,6 @@ /obj/machinery/door/attack_ai(mob/user as mob) return src.attack_hand(user) - -/obj/machinery/door/attack_paw(mob/user as mob) - return src.attack_hand(user) - - /obj/machinery/door/attack_hand(mob/user as mob) return src.attackby(user, user) @@ -289,7 +284,7 @@ L.adjustBruteLoss(DOOR_CRUSH_DAMAGE) L.emote("scream") L.Weaken(5) - else if(ismonkey(L)) //For monkeys + else if(issmall(L)) //For monkeys L.adjustBruteLoss(DOOR_CRUSH_DAMAGE) L.Weaken(5) else //for simple_animals & borgs diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 7a3a945721d..1430e8f00dc 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -227,8 +227,6 @@ return attack_generic(user, 25) -/obj/machinery/door/window/attack_paw(mob/user as mob) - return src.attack_hand(user) /obj/machinery/door/window/attack_hand(mob/user as mob) return src.attackby(user, user) diff --git a/code/game/machinery/guestpass.dm b/code/game/machinery/guestpass.dm index 83cf1682bd8..65510c1d5aa 100644 --- a/code/game/machinery/guestpass.dm +++ b/code/game/machinery/guestpass.dm @@ -67,8 +67,6 @@ /obj/machinery/computer/guestpass/attack_ai(var/mob/user as mob) return attack_hand(user) -/obj/machinery/computer/guestpass/attack_paw(var/mob/user as mob) - return attack_hand(user) /obj/machinery/computer/guestpass/attack_hand(var/mob/user as mob) if(..()) diff --git a/code/game/machinery/kitchen/monkeyrecycler.dm b/code/game/machinery/kitchen/monkeyrecycler.dm index 9342e6530b3..699f52ca5c0 100644 --- a/code/game/machinery/kitchen/monkeyrecycler.dm +++ b/code/game/machinery/kitchen/monkeyrecycler.dm @@ -18,8 +18,8 @@ if (istype(O, /obj/item/weapon/grab)) var/obj/item/weapon/grab/G = O var/grabbed = G.affecting - if(istype(grabbed, /mob/living/carbon/monkey)) - var/mob/living/carbon/monkey/target = grabbed + if(istype(grabbed, /mob/living/carbon/human/monkey)) + var/mob/living/carbon/human/monkey/target = grabbed if(target.stat == 0) user << "\red The monkey is struggling far too much to put it in the recycler." else diff --git a/code/game/machinery/kitchen/processor.dm b/code/game/machinery/kitchen/processor.dm index 9cc323b8b25..dd38d825810 100644 --- a/code/game/machinery/kitchen/processor.dm +++ b/code/game/machinery/kitchen/processor.dm @@ -79,11 +79,11 @@ ..() /datum/food_processor_process/mob/monkey - input = /mob/living/carbon/monkey + input = /mob/living/carbon/human/monkey output = null /datum/food_processor_process/mob/monkey/process(loc, what) - var/mob/living/carbon/monkey/O = what + var/mob/living/carbon/human/monkey/O = what if (O.client) //grief-proof O.loc = loc O.visible_message("Suddenly [O] jumps out from the processor!", \ diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index a8f39a4597e..82328073b4b 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -128,8 +128,6 @@ /obj/machinery/navbeacon/attack_ai(var/mob/user) interact(user, 1) -/obj/machinery/navbeacon/attack_paw() - return /obj/machinery/navbeacon/attack_hand(var/mob/user) interact(user, 0) diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 9d30d7207af..6937938b135 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -46,7 +46,7 @@ else ..() return - + /obj/machinery/computer/teleporter/emag_act(user as mob) if(!emagged) emagged = 1 @@ -54,10 +54,6 @@ else ui_interact(user) -/obj/machinery/computer/teleporter/attack_paw(mob/user) - usr << "You are too primitive to use this computer." - return - /obj/machinery/computer/teleporter/attack_ai(mob/user) src.attack_hand(user) @@ -443,9 +439,6 @@ user << "You reconnect the station to nearby machinery." return -/obj/machinery/teleport/station/attack_paw() - src.attack_hand() - /obj/machinery/teleport/station/attack_ai() src.attack_hand() diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 8b1f979d4a7..91eb8b450bf 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -202,7 +202,7 @@ A.unEquip(src) user << "Your claws aren't capable of such fine manipulation." return - attack_paw(A) + attack_hand(A) /obj/item/attack_ai(mob/user as mob) if (istype(src.loc, /obj/item/weapon/robot_module)) diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index 7c11ef5b5d6..dd163e05bed 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -67,8 +67,6 @@ attached = null ..() - attack_paw() - return attack_ai() return diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index e81b0e6e9b3..3ac400eefeb 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -15,7 +15,7 @@ user << "\The [src] cannot be applied to [M]!" return 1 - if (!(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon)) + if (!(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon))) user << "You don't have the dexterity to do this!" return 1 diff --git a/code/game/objects/items/weapons/grenades.dm b/code/game/objects/items/weapons/grenades.dm index 3d6c101a109..5a1c01584a5 100644 --- a/code/game/objects/items/weapons/grenades.dm +++ b/code/game/objects/items/weapons/grenades.dm @@ -385,7 +385,7 @@ /obj/item/weapon/grenade/clusterbuster/monkey name = "Barrel of Monkeys" desc = "Not really that much fun." - payload = /mob/living/carbon/monkey + payload = /mob/living/carbon/human/monkey /obj/item/weapon/grenade/clusterbuster/fluffy name = "Fluffy Love Bomb" desc = "Exactly as snuggly as it sounds." diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 349aaa62553..5a87bc98ca0 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -378,7 +378,7 @@ else playsound(M, 'sound/items/trayhit2.ogg', 50, 1) - if(ishuman(M) || ismonkey(M)) + if(ishuman(M) || issmall(M)) if(prob(10)) M.Weaken(2) diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index f4bbc9844bf..313550779ce 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -411,7 +411,7 @@ for(var/i = 1; i <= 5; i++) new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/neaeracube(src) - +/* /obj/item/weapon/storage/box/wolpincubes name = "wolpin cube box" desc = "Drymate brand wolpin cubes. Just add water!" @@ -423,6 +423,7 @@ ..() for(var/i = 1; i <= 5; i++) new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/wolpincube(src) +*/ /obj/item/weapon/storage/box/permits name = "box of construction permits" diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index 30966b998d1..8a68307065f 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -168,7 +168,7 @@ /obj/item/weapon/storage/pill_bottle/MouseDrop(obj/over_object as obj) //Quick pillbottle fix. -Agouri - if (ishuman(usr) || ismonkey(usr)) //Can monkeys even place items in the pocket slots? Leaving this in just in case~ + if (ishuman(usr) || issmall(usr)) //Can monkeys even place items in the pocket slots? Leaving this in just in case~ var/mob/M = usr if (!( istype(over_object, /obj/screen) )) return ..() diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm index 82b305ec200..03911c66984 100644 --- a/code/game/objects/structures/crates_lockers/closets/statue.dm +++ b/code/game/objects/structures/crates_lockers/closets/statue.dm @@ -14,7 +14,7 @@ /obj/structure/closet/statue/New(loc, var/mob/living/L) - if(ishuman(L) || ismonkey(L) || iscorgi(L)) + if(ishuman(L) || issmall(L) || iscorgi(L)) if(L.buckled) L.buckled = 0 L.anchored = 0 @@ -32,7 +32,7 @@ name = "statue of [L.name]" if(L.gender == "female") icon_state = "human_female" - else if(ismonkey(L)) + else if(issmall(L)) name = "statue of a monkey" icon_state = "monkey" else if(iscorgi(L)) diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index e610994fc5c..dd371817dca 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -328,14 +328,10 @@ var/list/mechtoys = list( /obj/machinery/computer/ordercomp/attack_ai(var/mob/user as mob) return attack_hand(user) -/obj/machinery/computer/ordercomp/attack_paw(var/mob/user as mob) - return attack_hand(user) /obj/machinery/computer/supplycomp/attack_ai(var/mob/user as mob) return attack_hand(user) -/obj/machinery/computer/supplycomp/attack_paw(var/mob/user as mob) - return attack_hand(user) /obj/machinery/computer/ordercomp/attack_hand(var/mob/user as mob) if(..()) diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm index 2f1edeacaa5..3e2910fa556 100644 --- a/code/modules/awaymissions/mission_code/wildwest.dm +++ b/code/modules/awaymissions/mission_code/wildwest.dm @@ -170,7 +170,7 @@ if(triggered) return - if(istype(M, /mob/living/carbon/human) || istype(M, /mob/living/carbon/monkey)) + if(istype(M, /mob/living/carbon/human)) for(var/mob/O in viewers(world.view, src.loc)) O << "[M] triggered the \icon[src] [src]" triggered = 1 diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 9d023c52c48..1919da66b69 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -728,7 +728,7 @@ else product = new /obj/item/weapon/reagent_containers/food/snacks/grown(get_turf(user),name) if(get_trait(TRAIT_PRODUCT_COLOUR)) - if(!has_mob_product || (has_mob_product && has_mob_product != /mob/living/carbon/monkey/diona)) + if(!has_mob_product || (has_mob_product && has_mob_product != /mob/living/carbon/alien/diona)) product.color = get_trait(TRAIT_PRODUCT_COLOUR) if(istype(product,/obj/item/weapon/reagent_containers/food)) var/obj/item/weapon/reagent_containers/food/food = product diff --git a/code/modules/hydroponics/seed_datums.dm b/code/modules/hydroponics/seed_datums.dm index e1eb5c8681b..e70b16a4a69 100644 --- a/code/modules/hydroponics/seed_datums.dm +++ b/code/modules/hydroponics/seed_datums.dm @@ -1055,7 +1055,7 @@ seed_noun = "nodes" display_name = "replicant pods" can_self_harvest = 1 - has_mob_product = /mob/living/carbon/monkey/diona + has_mob_product = /mob/living/carbon/alien/diona /datum/seed/diona/New() ..() diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 9e727f62bcb..374cd73ac8c 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -138,8 +138,8 @@ return ..() /obj/machinery/portable_atmospherics/hydroponics/proc/attack_generic(var/mob/user) - if(istype(user,/mob/living/carbon/monkey/diona)) - var/mob/living/carbon/monkey/diona/nymph = user + if(istype(user,/mob/living/carbon/alien/diona)) + var/mob/living/carbon/alien/diona/nymph = user if(nymph.stat == DEAD || nymph.paralysis || nymph.weakened || nymph.stunned || nymph.restrained()) return diff --git a/code/modules/jungle/jungle_animals.dm b/code/modules/jungle/jungle_animals.dm index 32db403da09..cb138b8baac 100644 --- a/code/modules/jungle/jungle_animals.dm +++ b/code/modules/jungle/jungle_animals.dm @@ -36,7 +36,7 @@ /obj/effect/landmark/animal_spawner/monkey name = "monkey spawner" - spawn_type = /mob/living/carbon/monkey + spawn_type = /mob/living/carbon/human/monkey /obj/effect/landmark/animal_spawner/snake name = "snake spawner" diff --git a/code/modules/media/jukebox.dm b/code/modules/media/jukebox.dm index e0fbf78ca6d..6e5554a52dd 100644 --- a/code/modules/media/jukebox.dm +++ b/code/modules/media/jukebox.dm @@ -87,8 +87,6 @@ var/global/loopModeNames=list( /obj/machinery/media/jukebox/attack_ai(var/mob/user) attack_hand(user) -/obj/machinery/media/jukebox/attack_paw() - return /obj/machinery/media/jukebox/power_change() ..() diff --git a/code/modules/mob/living/carbon/alien/diona/diona.dm b/code/modules/mob/living/carbon/alien/diona/diona.dm new file mode 100644 index 00000000000..981e2507494 --- /dev/null +++ b/code/modules/mob/living/carbon/alien/diona/diona.dm @@ -0,0 +1,34 @@ +/mob/living/carbon/alien/diona + name = "diona nymph" + voice_name = "diona nymph" + adult_form = /mob/living/carbon/human + speak_emote = list("chirrups") + icon_state = "nymph" + language = "Rootspeak" + + universal_understand = 1 + universal_speak = 0 // Dionaea do not need to speak to people other than other dionaea. + holder_type = /obj/item/weapon/holder/diona + +/mob/living/carbon/alien/diona/New() + + ..() + species = all_species["Diona"] + verbs += /mob/living/carbon/alien/diona/proc/merge + +/mob/living/carbon/alien/diona/start_pulling(var/atom/movable/AM) + //TODO: Collapse these checks into one proc (see pai and drone) + if(istype(AM,/obj/item)) + var/obj/item/O = AM + if(O.w_class > 2) + src << "You are too small to pull that." + return + else + ..() + else + src << "You are too small to pull that." + return + +/mob/living/carbon/alien/diona/put_in_hands(var/obj/item/W) // No hands. + W.loc = get_turf(src) + return 1 diff --git a/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm b/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm new file mode 100644 index 00000000000..5490d33fcbc --- /dev/null +++ b/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm @@ -0,0 +1,7 @@ +/mob/living/carbon/alien/diona/attack_hand(mob/living/carbon/human/M as mob) + if(istype(M) && M.a_intent == "help") + if(M.species && M.species.name == "Diona" && do_merge(M)) + return + get_scooped(M) + return + ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/diona/diona_powers.dm b/code/modules/mob/living/carbon/alien/diona/diona_powers.dm new file mode 100644 index 00000000000..54678e1ea01 --- /dev/null +++ b/code/modules/mob/living/carbon/alien/diona/diona_powers.dm @@ -0,0 +1,69 @@ +//Verbs after this point. +/mob/living/carbon/alien/diona/proc/merge() + + set category = "Abilities" + set name = "Merge with gestalt" + set desc = "Merge with another diona." + + if(stat == DEAD || paralysis || weakened || stunned || restrained()) + return + + if(istype(src.loc,/mob/living/carbon)) + src.verbs -= /mob/living/carbon/alien/diona/proc/merge + return + + var/list/choices = list() + for(var/mob/living/carbon/C in view(1,src)) + + if(!(src.Adjacent(C)) || !(C.client)) continue + + if(istype(C,/mob/living/carbon/human)) + var/mob/living/carbon/human/D = C + if(D.species && D.species.name == "Diona") + choices += C + + var/mob/living/M = input(src,"Who do you wish to merge with?") in null|choices + + if(!M) + src << "There is nothing nearby to merge with." + else if(!do_merge(M)) + src << "You fail to merge with \the [M]..." + +/mob/living/carbon/alien/diona/proc/do_merge(var/mob/living/carbon/human/H) + if(!istype(H) || !src || !(src.Adjacent(H))) + return 0 + H << "You feel your being twine with that of \the [src] as it merges with your biomass." + H.status_flags |= PASSEMOTES + src << "You feel your being twine with that of \the [H] as you merge with its biomass." + loc = H + verbs += /mob/living/carbon/alien/diona/proc/split + verbs -= /mob/living/carbon/alien/diona/proc/merge + return 1 + +/mob/living/carbon/alien/diona/proc/split() + + set category = "Abilities" + set name = "Split from gestalt" + set desc = "Split away from your gestalt as a lone nymph." + + if(stat == DEAD || paralysis || weakened || stunned || restrained()) + return + + if(!(istype(src.loc,/mob/living/carbon))) + src.verbs -= /mob/living/carbon/alien/diona/proc/split + return + + src.loc << "You feel a pang of loss as [src] splits away from your biomass." + src << "You wiggle out of the depths of [src.loc]'s biomass and plop to the ground." + + var/mob/living/M = src.loc + + src.loc = get_turf(src) + src.verbs -= /mob/living/carbon/alien/diona/proc/split + src.verbs += /mob/living/carbon/alien/diona/proc/merge + + if(istype(M)) + for(var/atom/A in M.contents) + if(istype(A,/mob/living/simple_animal/borer) || istype(A,/obj/item/weapon/holder)) + return + M.status_flags &= ~PASSEMOTES \ No newline at end of file diff --git a/code/modules/mob/living/carbon/monkey/diona.dm b/code/modules/mob/living/carbon/alien/diona/dionaold.dm similarity index 100% rename from code/modules/mob/living/carbon/monkey/diona.dm rename to code/modules/mob/living/carbon/alien/diona/dionaold.dm diff --git a/code/modules/mob/living/carbon/alien/diona/life.dm b/code/modules/mob/living/carbon/alien/diona/life.dm new file mode 100644 index 00000000000..ec0dd5d7e17 --- /dev/null +++ b/code/modules/mob/living/carbon/alien/diona/life.dm @@ -0,0 +1,22 @@ +//Dionaea regenerate health and nutrition in light. +/mob/living/carbon/alien/diona/handle_environment(datum/gas_mixture/environment) + + var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing + if(isturf(loc)) //else, there's considered to be no light + var/turf/T = loc + var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T + if(L) + light_amount = min(10,L.lum_r + L.lum_g + L.lum_b) - 5 //hardcapped so it's not abused by having a ton of flashlights + else + light_amount = 5 + + + nutrition += light_amount + + if(nutrition > 500) + nutrition = 500 + if(light_amount > 2) //if there's enough light, heal + adjustBruteLoss(-1) + adjustFireLoss(-1) + adjustToxLoss(-1) + adjustOxyLoss(-1) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/diona/progression.dm b/code/modules/mob/living/carbon/alien/diona/progression.dm new file mode 100644 index 00000000000..588acea5ad8 --- /dev/null +++ b/code/modules/mob/living/carbon/alien/diona/progression.dm @@ -0,0 +1,19 @@ +/mob/living/carbon/alien/diona/confirm_evolution() + + if(!is_alien_whitelisted(src, "Diona") && config.usealienwhitelist) + src << alert("You are currently not whitelisted to play as a full diona.") + return null + + if(amount_grown < max_grown) + src << "You are not yet ready for your growth..." + return null + + src.split() + + if(istype(loc,/obj/item/weapon/holder/diona)) + var/obj/item/weapon/holder/diona/L = loc + src.loc = L.loc + qdel(L) + + src.visible_message("\red [src] begins to shift and quiver, and erupts in a shower of shed bark as it splits into a tangle of nearly a dozen new dionaea.","\red You begin to shift and quiver, feeling your awareness splinter. All at once, we consume our stored nutrients to surge with growth, splitting into a tangle of at least a dozen new dionaea. We have attained our gestalt form.") + return "Diona" \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/diona/say_understands.dm b/code/modules/mob/living/carbon/alien/diona/say_understands.dm new file mode 100644 index 00000000000..3f68a44cffb --- /dev/null +++ b/code/modules/mob/living/carbon/alien/diona/say_understands.dm @@ -0,0 +1,6 @@ +/mob/living/carbon/alien/diona/say_understands(var/mob/other,var/datum/language/speaking = null) + + if (istype(other, /mob/living/carbon/human) && !speaking) + if(languages.len >= 2) // They have sucked down some blood. + return 1 + return ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/diona/update_icons.dm b/code/modules/mob/living/carbon/alien/diona/update_icons.dm new file mode 100644 index 00000000000..b39972cdad3 --- /dev/null +++ b/code/modules/mob/living/carbon/alien/diona/update_icons.dm @@ -0,0 +1,8 @@ +/mob/living/carbon/alien/diona/update_icons() + + if(stat == DEAD) + icon_state = "[initial(icon_state)]_dead" + else if(lying || resting || stunned) + icon_state = "[initial(icon_state)]_sleep" + else + icon_state = "[initial(icon_state)]" diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index c054f766dac..6c01076a72f 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -136,34 +136,6 @@ updatehealth() return -/mob/living/carbon/alien/humanoid/attack_paw(mob/living/carbon/monkey/M as mob) - if(!ismonkey(M)) return//Fix for aliens receiving double messages when attacking other aliens. - - if (!ticker) - M << "You cannot attack people before the game has started." - return - - if (istype(loc, /turf) && istype(loc.loc, /area/start)) - M << "No attacking people at spawn, you jackass." - return - ..() - - switch(M.a_intent) - - if ("help") - help_shake_act(M) - else - M.do_attack_animation(src) - if (istype(src.wear_mask, /obj/item/clothing/mask/muzzle)) - return - playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) - visible_message("[M.name] bites [src]!", \ - "[M.name] bites [src]!") - if (health > -100) - adjustBruteLoss(rand(1, 3)) - updatehealth() - return - /mob/living/carbon/alien/humanoid/attack_slime(mob/living/carbon/slime/M as mob) if (!ticker) diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index 30ca1668054..a7207f22f9d 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -155,34 +155,6 @@ updatehealth() -/mob/living/carbon/alien/larva/attack_paw(mob/living/carbon/monkey/M as mob) - if(!(istype(M, /mob/living/carbon/monkey))) return//Fix for aliens receiving double messages when attacking other aliens. - - if (!ticker) - M << "You cannot attack people before the game has started." - return - - if (istype(loc, /turf) && istype(loc.loc, /area/start)) - M << "No attacking people at spawn, you jackass." - return - ..() - - switch(M.a_intent) - - if ("help") - help_shake_act(M) - else - M.do_attack_animation(src) - if (istype(src.wear_mask, /obj/item/clothing/mask/muzzle)) - return - playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) - visible_message("[M.name] bites [src]!", \ - "[M.name] bites [src]!") - if (health > -100) - adjustBruteLoss(rand(1, 3)) - updatehealth() - return - /mob/living/carbon/alien/larva/attack_slime(mob/living/carbon/slime/M as mob) if (!ticker) diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 37381273369..9fd07805651 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -240,7 +240,7 @@ var/const/MAX_ACTIVE_TIME = 400 if(M.stat == DEAD) return 0 - if(iscorgi(M) || ismonkey(M)) + if(iscorgi(M) || issmall(M)) return 1 var/mob/living/carbon/C = M diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 8e7f0f71622..06186ea604a 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -256,7 +256,7 @@ if(getBrainLoss() >= 60) msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n" - if(species.show_ssd && (!species.has_organ["brain"] || has_brain()) && stat != DEAD) + if(species.show_ssd && (!species.has_organ["brain"] || brain_op_stage != 4) && stat != DEAD) if(!key) msg += "[t_He] [t_is] fast asleep. It doesn't look like they are waking up anytime soon.\n" else if(!client) diff --git a/code/modules/mob/living/carbon/human/npcs.dm b/code/modules/mob/living/carbon/human/npcs.dm index 290c81723ee..a51a9cbd990 100644 --- a/code/modules/mob/living/carbon/human/npcs.dm +++ b/code/modules/mob/living/carbon/human/npcs.dm @@ -2,7 +2,7 @@ name = "fancy uniform" desc = "It looks like it was tailored for a monkey." icon_state = "punpun" - item_color = "punpun" + _color = "punpun" species_restricted = list("Monkey") /mob/living/carbon/human/monkey/punpun/New() diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 53d6689d36e..65d35e5c080 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -190,7 +190,7 @@ //These only pertain to common. Languages are handled by mob/say_understands() if (!speaking) - if (istype(other, /mob/living/carbon/monkey/diona)) + if (istype(other, /mob/living/carbon/alien/diona)) if(other.languages.len >= 2) //They've sucked down some blood and can speak common now. return 1 if (istype(other, /mob/living/silicon)) diff --git a/code/modules/mob/living/carbon/human/species/apollo.dm b/code/modules/mob/living/carbon/human/species/apollo.dm index bddfa770a14..409944cd048 100644 --- a/code/modules/mob/living/carbon/human/species/apollo.dm +++ b/code/modules/mob/living/carbon/human/species/apollo.dm @@ -5,7 +5,7 @@ language = "Wryn Hivemind" tail = "wryntail" unarmed_type = /datum/unarmed_attack/punch/weak - primitive = /mob/living/carbon/monkey/wryn + //primitive = /mob/living/carbon/monkey/wryn darksight = 3 slowdown = 1 warning_low_pressure = -300 diff --git a/code/modules/mob/living/carbon/human/species/monkey.dm b/code/modules/mob/living/carbon/human/species/monkey.dm index 4f00eaea20a..97c57a1af47 100644 --- a/code/modules/mob/living/carbon/human/species/monkey.dm +++ b/code/modules/mob/living/carbon/human/species/monkey.dm @@ -1,6 +1,5 @@ /datum/species/monkey name = "Monkey" - name_plural = "Monkeys" blurb = "Ook." icobase = 'icons/mob/human_races/monkeys/r_monkey.dmi' @@ -12,22 +11,18 @@ default_language = "Chimpanzee" greater_form = "Human" is_small = 1 - has_fine_manipulation = 0 + //has_fine_manipulation = 0 show_ssd = 0 eyes = "blank_eyes" - gibbed_anim = "gibbed-m" - dusted_anim = "dust-m" - death_message = "lets out a faint chimper as it collapses and stops moving..." tail = "chimptail" - unarmed_types = list(/datum/unarmed_attack/bite, /datum/unarmed_attack/claws) - inherent_verbs = list(/mob/living/proc/ventcrawl) - hud_type = /datum/hud_data/monkey + //unarmed_types = list(/datum/unarmed_attack/bite, /datum/unarmed_attack/claws) + //inherent_verbs = list(/mob/living/proc/ventcrawl) + //hud_type = /datum/hud_data/monkey meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/monkey - rarity_value = 0.1 - total_health = 75 + //total_health = 75 brute_mod = 1.5 burn_mod = 1.5 @@ -48,7 +43,6 @@ /datum/species/monkey/tajaran name = "Farwa" - name_plural = "Farwa" icobase = 'icons/mob/human_races/monkeys/r_farwa.dmi' deform = 'icons/mob/human_races/monkeys/r_farwa.dmi' @@ -61,7 +55,6 @@ /datum/species/monkey/skrell name = "Neara" - name_plural = "Neara" icobase = 'icons/mob/human_races/monkeys/r_neara.dmi' deform = 'icons/mob/human_races/monkeys/r_neara.dmi' @@ -75,7 +68,6 @@ /datum/species/monkey/unathi name = "Stok" - name_plural = "Stok" icobase = 'icons/mob/human_races/monkeys/r_stok.dmi' deform = 'icons/mob/human_races/monkeys/r_stok.dmi' diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index c7cdb5b6cd9..2f50a1b21da 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -388,7 +388,7 @@ ) /datum/species/diona/can_understand(var/mob/other) - var/mob/living/carbon/monkey/diona/D = other + var/mob/living/carbon/alien/diona/D = other if(istype(D)) return 1 return 0 @@ -401,14 +401,14 @@ /* //overpowered and dumb as hell; they get cloning back, though. /datum/species/diona/handle_death(var/mob/living/carbon/human/H) - var/mob/living/carbon/monkey/diona/S = new(get_turf(H)) + var/mob/living/carbon/alien/diona/S = new(get_turf(H)) if(H.mind) H.mind.transfer_to(S) else S.key = H.key - for(var/mob/living/carbon/monkey/diona/D in H.contents) + for(var/mob/living/carbon/alien/diona/D in H.contents) if(D.client) D.loc = H.loc else diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index cdc370a4d53..7361b4b5a75 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -185,14 +185,6 @@ Please contact me on #coderbus IRC. ~Carn x var/global/list/damage_icon_parts = list() -proc/get_damage_icon_part(damage_state, body_part) - if(damage_icon_parts["[damage_state]/[body_part]"] == null) - var/icon/DI = new /icon('icons/mob/dam_human.dmi', damage_state) // the damage icon for whole human - DI.Blend(new /icon('icons/mob/dam_mask.dmi', body_part), ICON_MULTIPLY) // mask with this organ's pixels - damage_icon_parts["[damage_state]/[body_part]"] = DI - return DI - else - return damage_icon_parts["[damage_state]/[body_part]"] //DAMAGE OVERLAYS //constructs damage icon for each organ from mask * damage field and saves it in our overlays_ lists @@ -213,7 +205,7 @@ proc/get_damage_icon_part(damage_state, body_part) previous_damage_appearance = damage_appearance - var/icon/standing = new /icon('icons/mob/dam_human.dmi', "00") + var/icon/standing = new /icon(species.damage_overlays, "00") var/image/standing_image = new /image("icon" = standing) @@ -224,9 +216,15 @@ proc/get_damage_icon_part(damage_state, body_part) if(!(O.status & ORGAN_DESTROYED)) O.update_icon() if(O.damage_state == "00") continue - - var/icon/DI = get_damage_icon_part(O.damage_state, O.icon_name) - + var/icon/DI + var/cache_index = "[O.damage_state]/[O.icon_name]/[species.blood_color]/[species.name]" + if(damage_icon_parts[cache_index] == null) + DI = new /icon(species.damage_overlays, O.damage_state) // the damage icon for whole human + DI.Blend(new /icon(species.damage_mask, O.icon_name), ICON_MULTIPLY) // mask with this organ's pixels + DI.Blend(species.blood_color, ICON_MULTIPLY) + damage_icon_parts[cache_index] = DI + else + DI = damage_icon_parts[cache_index] standing_image.overlays += DI overlays_standing[DAMAGE_LAYER] = standing_image @@ -525,7 +523,7 @@ proc/get_damage_icon_part(damage_state, body_part) standing.icon = w_uniform.sprite_sheets[species.name] if(w_uniform.blood_DNA) - var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "uniformblood") + var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "uniformblood") bloodsies.color = w_uniform.blood_color standing.overlays += bloodsies @@ -580,14 +578,14 @@ proc/get_damage_icon_part(damage_state, body_part) standing = image("icon" = 'icons/mob/hands.dmi', "icon_state" = "[t_state]") if(gloves.blood_DNA) - var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "bloodyhands") + var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "bloodyhands") bloodsies.color = gloves.blood_color standing.overlays += bloodsies gloves.screen_loc = ui_gloves overlays_standing[GLOVES_LAYER] = standing else if(blood_DNA) - var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "bloodyhands") + var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "bloodyhands") bloodsies.color = hand_blood_color overlays_standing[GLOVES_LAYER] = bloodsies else @@ -652,13 +650,13 @@ proc/get_damage_icon_part(damage_state, body_part) if(shoes.blood_DNA) - var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "shoeblood") + var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "shoeblood") bloodsies.color = shoes.blood_color standing.overlays += bloodsies overlays_standing[SHOES_LAYER] = standing else if(feet_blood_DNA) - var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "shoeblood") + var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "shoeblood") bloodsies.color = feet_blood_color overlays_standing[SHOES_LAYER] = bloodsies else @@ -695,7 +693,7 @@ proc/get_damage_icon_part(damage_state, body_part) standing = image("icon" = 'icons/mob/head.dmi', "icon_state" = "[head.icon_state]") if(head.blood_DNA) - var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "helmetblood") + var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "helmetblood") bloodsies.color = head.blood_color standing.overlays += bloodsies overlays_standing[HEAD_LAYER] = standing @@ -751,7 +749,7 @@ proc/get_damage_icon_part(damage_state, body_part) if(wear_suit.blood_DNA) var/obj/item/clothing/suit/S = wear_suit - var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "[S.blood_overlay_type]blood") + var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "[S.blood_overlay_type]blood") bloodsies.color = wear_suit.blood_color standing.overlays += bloodsies @@ -791,7 +789,9 @@ proc/get_damage_icon_part(damage_state, body_part) standing = image("icon" = 'icons/mob/mask.dmi', "icon_state" = "[wear_mask.icon_state]") if( !istype(wear_mask, /obj/item/clothing/mask/cigarette) && wear_mask.blood_DNA ) - standing.overlays += image("icon" = 'icons/effects/blood.dmi', "icon_state" = "maskblood") + var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "maskblood") + bloodsies.color = wear_mask.blood_color + standing.overlays += bloodsies overlays_standing[FACEMASK_LAYER] = standing else overlays_standing[FACEMASK_LAYER] = null diff --git a/code/modules/mob/living/carbon/metroid/life.dm b/code/modules/mob/living/carbon/metroid/life.dm index a839b8a85b2..d2cfeeb9037 100644 --- a/code/modules/mob/living/carbon/metroid/life.dm +++ b/code/modules/mob/living/carbon/metroid/life.dm @@ -379,7 +379,7 @@ Target = C break - if(islarva(C) || ismonkey(C)) + if(islarva(C) || issmall(C)) Target = C break diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm index c2c7f678a72..cc412c799f3 100644 --- a/code/modules/mob/living/carbon/metroid/metroid.dm +++ b/code/modules/mob/living/carbon/metroid/metroid.dm @@ -291,37 +291,6 @@ adjustBruteLoss(damage) updatehealth() -/mob/living/carbon/slime/attack_paw(mob/living/carbon/monkey/M as mob) - if(!(istype(M, /mob/living/carbon/monkey))) - return // Fix for aliens receiving double messages when attacking other aliens. - - if (!ticker) - M << "You cannot attack people before the game has started." - return - - if (istype(loc, /turf) && istype(loc.loc, /area/start)) - M << "No attacking people at spawn, you jackass." - return - - ..() - - switch(M.a_intent) - - if ("help") - help_shake_act(M) - else - if (istype(wear_mask, /obj/item/clothing/mask/muzzle)) - return - if (health > 0) - M.do_attack_animation(src) - attacked += 10 - //playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) - visible_message("[M.name] has attacked [src]!", \ - "[M.name] has attacked [src]!") - adjustBruteLoss(rand(1, 3)) - updatehealth() - return - /mob/living/carbon/slime/attack_larva(mob/living/carbon/alien/larva/L as mob) switch(L.a_intent) diff --git a/code/modules/mob/living/carbon/monkey/death.dm b/code/modules/mob/living/carbon/monkey/death.dm deleted file mode 100644 index 0c3ef632cca..00000000000 --- a/code/modules/mob/living/carbon/monkey/death.dm +++ /dev/null @@ -1,56 +0,0 @@ -/mob/living/carbon/monkey/gib() - death(1) - var/atom/movable/overlay/animation = null - notransform = 1 - canmove = 0 - icon = null - invisibility = 101 - - animation = new(loc) - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = src - - flick("gibbed-m", animation) - gibs(loc, viruses, dna) - - spawn(15) - if(animation) del(animation) - if(src) del(src) - -/mob/living/carbon/monkey/dust() - death(1) - var/atom/movable/overlay/animation = null - notransform = 1 - canmove = 0 - icon = null - invisibility = 101 - - animation = new(loc) - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = src - - flick("dust-m", animation) - new /obj/effect/decal/cleanable/ash(loc) - - spawn(15) - if(animation) del(animation) - if(src) del(src) - - -/mob/living/carbon/monkey/death(gibbed) - if(stat == DEAD) return - if(healths) healths.icon_state = "health5" - stat = DEAD - - if(!gibbed) - for(var/mob/O in viewers(src, null)) - O.show_message("The [name] lets out a faint chimper as it collapses and stops moving...", 1) //ded -- Urist - - update_canmove() - if(blind) blind.layer = 0 - - ticker.mode.check_win() - - return ..(gibbed) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/monkey/emote.dm b/code/modules/mob/living/carbon/monkey/emote.dm deleted file mode 100644 index c7973bc4eb8..00000000000 --- a/code/modules/mob/living/carbon/monkey/emote.dm +++ /dev/null @@ -1,157 +0,0 @@ -/mob/living/carbon/monkey/emote(var/act,var/m_type=1,var/message = null) - - var/param = null - if (findtext(act, "-", 1, null)) - var/t1 = findtext(act, "-", 1, null) - param = copytext(act, t1 + 1, length(act) + 1) - act = copytext(act, 1, t1) - - if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_' - act = copytext(act,1,length(act)) - - var/muzzled = is_muzzled() - - //Emote Cooldown System (it's so simple!) - // proc/handle_emote_CD() located in [code\modules\mob\emote.dm] - var/on_CD = 0 - switch(act) - //Cooldown-inducing emotes - if("chirp") - if(istype(src,/mob/living/carbon/monkey/diona)) //Only Diona Nymphs can chirp - on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm - else //Everyone else fails, skip the emote attempt - return - //Everything else, including typos of the above emotes - else - on_CD = 0 //If it doesn't induce the cooldown, we won't check for the cooldown - - if(on_CD == 1) // Check if we need to suppress the emote attempt. - return // Suppress emote, you're still cooling off. - //--FalseIncarnate - - switch(act) - if ("me") - if(silent) - return - if (src.client) - if (client.prefs.muted & MUTE_IC) - src << "\red You cannot send IC messages (muted)." - return - if (src.client.handle_spam_prevention(message,MUTE_IC)) - return - if (stat) - return - if(!(message)) - return - return custom_emote(m_type, message) - - - if ("custom") - return custom_emote(m_type, message) - - if ("chirp") - message = "The [src.name] chirps!" - playsound(src.loc, 'sound/misc/nymphchirp.ogg', 50, 0) - m_type = 2 - if("sign") - if (!src.restrained()) - message = text("The monkey signs[].", (text2num(param) ? text(" the number []", text2num(param)) : null)) - m_type = 1 - if("scratch") - if (!src.restrained()) - message = "The [src.name] scratches." - m_type = 1 - if("whimper") - if (!muzzled) - message = "The [src.name] whimpers." - m_type = 2 - if("roar") - if (!muzzled) - message = "The [src.name] roars." - m_type = 2 - if("tail") - message = "The [src.name] waves his tail." - m_type = 1 - if("gasp") - message = "The [src.name] gasps." - m_type = 2 - if("shiver") - message = "The [src.name] shivers." - m_type = 2 - if("drool") - message = "The [src.name] drools." - m_type = 1 - if("paw") - if (!src.restrained()) - message = "The [src.name] flails his paw." - m_type = 1 - if("scretch") - if (!muzzled) - message = "The [src.name] scretches." - m_type = 2 - if("choke") - message = "The [src.name] chokes." - m_type = 2 - if("moan") - message = "The [src.name] moans!" - m_type = 2 - if("nod") - message = "The [src.name] nods his head." - m_type = 1 - if("sit") - message = "The [src.name] sits down." - m_type = 1 - if("sway") - message = "The [src.name] sways around dizzily." - m_type = 1 - if("sulk") - message = "The [src.name] sulks down sadly." - m_type = 1 - if("twitch") - message = "The [src.name] twitches violently." - m_type = 1 - if("dance") - if (!src.restrained()) - message = "The [src.name] dances around happily." - m_type = 1 - if("roll") - if (!src.restrained()) - message = "The [src.name] rolls." - m_type = 1 - if("shake") - message = "The [src.name] shakes his head." - m_type = 1 - if("gnarl") - if (!muzzled) - message = "The [src.name] gnarls and shows his teeth.." - m_type = 2 - if("jump") - message = "The [src.name] jumps!" - m_type = 1 - if("collapse") - Paralyse(2) - message = text("[] collapses!", src) - m_type = 2 - if("deathgasp") - message = "The [src.name] lets out a faint chimper as it collapses and stops moving..." - m_type = 1 - if("help") - var/text = "choke, " - if(istype(src,/mob/living/carbon/monkey/diona)) - text += "chirp, " - text += "collapse, dance, deathgasp, drool, gasp, shiver, gnarl, jump, paw, moan, nod, roar, roll, scratch,\nscretch, shake, sign-#, sit, sulk, sway, tail, twitch, whimper" - src << text - else - src << text("Invalid Emote: []", act) - if ((message && src.stat == 0)) - if(src.client) - log_emote("[name]/[key] : [message]") - if (m_type & 1) - for(var/mob/O in viewers(src, null)) - O.show_message(message, m_type) - //Foreach goto(703) - else - for(var/mob/O in hearers(src, null)) - O.show_message(message, m_type) - //Foreach goto(746) - return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/monkey/examine.dm b/code/modules/mob/living/carbon/monkey/examine.dm deleted file mode 100644 index 9c9d0ef5082..00000000000 --- a/code/modules/mob/living/carbon/monkey/examine.dm +++ /dev/null @@ -1,63 +0,0 @@ -/mob/living/carbon/monkey/examine() - set src in oview() - - if(!usr || !src) return - if( (usr.sdisabilities & BLIND || usr.blinded || usr.stat) && !istype(usr,/mob/dead/observer) ) - usr << "Something is there but you can't see it." - return - - var/msg = "*---------*\nThis is \icon[src] \a [src]!\n" - - if (src.handcuffed) - msg += "It is \icon[src.handcuffed] handcuffed!\n" - if (src.wear_mask) - msg += "It has \icon[src.wear_mask] \a [src.wear_mask] on its head.\n" - if (src.l_hand) - msg += "It has \icon[src.l_hand] \a [src.l_hand] in its left hand.\n" - if (src.r_hand) - msg += "It has \icon[src.r_hand] \a [src.r_hand] in its right hand.\n" - if (src.back) - msg += "It has \icon[src.back] \a [src.back] on its back.\n" - if (src.stat == DEAD) - msg += "It is limp and unresponsive, with no signs of life.\n" - else - msg += "" - if (src.getBruteLoss()) - if (src.getBruteLoss() < 30) - msg += "It has minor bruising.\n" - else - msg += "It has severe bruising!\n" - if (src.getFireLoss()) - if (src.getFireLoss() < 30) - msg += "It has minor burns.\n" - else - msg += "It has severe burns!\n" - if (src.fire_stacks > 0) - msg += "It's covered in something flammable.\n" - if (src.fire_stacks < 0) - msg += "It's soaked in water.\n" - if (src.stat == UNCONSCIOUS) - msg += "It isn't responding to anything around it; it seems to be asleep.\n" - msg += "" - - msg += "" - switch(wetlevel) - if(1) - msg += "It looks a bit damp.\n" - if(2) - msg += "It looks a little bit wet.\n" - if(3) - msg += "It looks wet.\n" - if(4) - msg += "It looks very wet.\n" - if(5) - msg += "It looks absolutely soaked.\n" - msg += "" - - if (src.digitalcamo) - msg += "It is repulsively uncanny!\n" - - msg += "*---------*" - - usr << msg - return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/monkey/hud.dm b/code/modules/mob/living/carbon/monkey/hud.dm deleted file mode 100644 index 35f86d2e6b7..00000000000 --- a/code/modules/mob/living/carbon/monkey/hud.dm +++ /dev/null @@ -1,249 +0,0 @@ -/datum/hud/proc/monkey_hud(var/ui_style='icons/mob/screen1_old.dmi') - - src.adding = list() - src.other = list() - - var/obj/screen/using - var/obj/screen/inventory/inv_box - - using = new /obj/screen() - using.name = "act_intent" - using.dir = SOUTHWEST - using.icon = ui_style - using.icon_state = (mymob.a_intent == "hurt" ? "harm" : mymob.a_intent) - using.screen_loc = ui_acti - using.layer = 20 - src.adding += using - action_intent = using - -//intent small hud objects - var/icon/ico - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),1,ico.Height()/2,ico.Width()/2,ico.Height()) - using = new /obj/screen( src ) - using.name = "help" - using.icon = ico - using.screen_loc = ui_acti - using.layer = 21 - src.adding += using - help_intent = using - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),ico.Width()/2,ico.Height()/2,ico.Width(),ico.Height()) - using = new /obj/screen( src ) - using.name = "disarm" - using.icon = ico - using.screen_loc = ui_acti - using.layer = 21 - src.adding += using - disarm_intent = using - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),ico.Width()/2,1,ico.Width(),ico.Height()/2) - using = new /obj/screen( src ) - using.name = "grab" - using.icon = ico - using.screen_loc = ui_acti - using.layer = 21 - src.adding += using - grab_intent = using - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),1,1,ico.Width()/2,ico.Height()/2) - using = new /obj/screen( src ) - using.name = "harm" - using.icon = ico - using.screen_loc = ui_acti - using.layer = 21 - src.adding += using - hurt_intent = using - -//end intent small hud objects - - using = new /obj/screen() - using.name = "mov_intent" - using.dir = SOUTHWEST - using.icon = ui_style - using.icon_state = (mymob.m_intent == "run" ? "running" : "walking") - using.screen_loc = ui_movi - using.layer = 20 - src.adding += using - move_intent = using - - using = new /obj/screen() - using.name = "drop" - using.icon = ui_style - using.icon_state = "act_drop" - using.screen_loc = ui_drop_throw - using.layer = 19 - src.adding += using - - inv_box = new /obj/screen/inventory() - inv_box.name = "r_hand" - inv_box.dir = WEST - inv_box.icon = ui_style - inv_box.icon_state = "hand_inactive" - if(mymob && !mymob.hand) //This being 0 or null means the right hand is in use - inv_box.icon_state = "hand_active" - inv_box.screen_loc = ui_rhand - inv_box.slot_id = slot_r_hand - inv_box.layer = 19 - src.r_hand_hud_object = inv_box - src.adding += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "l_hand" - inv_box.dir = EAST - inv_box.icon = ui_style - inv_box.icon_state = "hand_inactive" - if(mymob && mymob.hand) //This being 1 means the left hand is in use - inv_box.icon_state = "hand_active" - inv_box.screen_loc = ui_lhand - inv_box.slot_id = slot_l_hand - inv_box.layer = 19 - src.l_hand_hud_object = inv_box - src.adding += inv_box - - using = new /obj/screen() - using.name = "hand" - using.dir = SOUTH - using.icon = ui_style - using.icon_state = "hand1" - using.screen_loc = ui_swaphand1 - using.layer = 19 - src.adding += using - - using = new /obj/screen() - using.name = "hand" - using.dir = SOUTH - using.icon = ui_style - using.icon_state = "hand2" - using.screen_loc = ui_swaphand2 - using.layer = 19 - src.adding += using - - inv_box = new /obj/screen/inventory() - inv_box.name = "mask" - inv_box.dir = NORTH - inv_box.icon = ui_style - inv_box.icon_state = "equip" - inv_box.screen_loc = ui_monkey_mask - inv_box.slot_id = slot_wear_mask - inv_box.layer = 19 - src.adding += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "back" - inv_box.dir = NORTHEAST - inv_box.icon = ui_style - inv_box.icon_state = "equip" - inv_box.screen_loc = ui_back - inv_box.slot_id = slot_back - inv_box.layer = 19 - src.adding += inv_box - - mymob.throw_icon = new /obj/screen() - mymob.throw_icon.icon = ui_style - mymob.throw_icon.icon_state = "act_throw_off" - mymob.throw_icon.name = "throw" - mymob.throw_icon.screen_loc = ui_drop_throw - - mymob.oxygen = new /obj/screen() - mymob.oxygen.icon = ui_style - mymob.oxygen.icon_state = "oxy0" - mymob.oxygen.name = "oxygen" - mymob.oxygen.screen_loc = ui_oxygen - - mymob.pressure = new /obj/screen() - mymob.pressure.icon = ui_style - mymob.pressure.icon_state = "pressure0" - mymob.pressure.name = "pressure" - mymob.pressure.screen_loc = ui_pressure - - mymob.toxin = new /obj/screen() - mymob.toxin.icon = ui_style - mymob.toxin.icon_state = "tox0" - mymob.toxin.name = "toxin" - mymob.toxin.screen_loc = ui_toxin - - mymob.internals = new /obj/screen() - mymob.internals.icon = ui_style - mymob.internals.icon_state = "internal0" - mymob.internals.name = "internal" - mymob.internals.screen_loc = ui_internal - - mymob.fire = new /obj/screen() - mymob.fire.icon = ui_style - mymob.fire.icon_state = "fire0" - mymob.fire.name = "fire" - mymob.fire.screen_loc = ui_fire - - mymob.bodytemp = new /obj/screen() - mymob.bodytemp.icon = ui_style - mymob.bodytemp.icon_state = "temp1" - mymob.bodytemp.name = "body temperature" - mymob.bodytemp.screen_loc = ui_temp - - mymob.healths = new /obj/screen() - mymob.healths.icon = ui_style - mymob.healths.icon_state = "health0" - mymob.healths.name = "health" - mymob.healths.screen_loc = ui_health - - mymob.pullin = new /obj/screen() - mymob.pullin.icon = ui_style - mymob.pullin.icon_state = "pull0" - mymob.pullin.name = "pull" - mymob.pullin.screen_loc = ui_pull_resist - - mymob.blind = new /obj/screen() - mymob.blind.icon = 'icons/mob/screen1_full.dmi' - mymob.blind.icon_state = "blackimageoverlay" - mymob.blind.name = " " - mymob.blind.screen_loc = "1,1" - mymob.blind.layer = 0 - - mymob.flash = new /obj/screen() - mymob.flash.icon = ui_style - mymob.flash.icon_state = "blank" - mymob.flash.name = "flash" - mymob.flash.screen_loc = "1,1 to 15,15" - mymob.flash.layer = 17 - - mymob.zone_sel = new /obj/screen/zone_sel() - mymob.zone_sel.icon = ui_style - mymob.zone_sel.overlays.Cut() - mymob.zone_sel.overlays += image('icons/mob/zone_sel.dmi', "[mymob.zone_sel.selecting]") - - //Handle the gun settings buttons - mymob.gun_setting_icon = new /obj/screen/gun/mode(null) - if (mymob.client) - if (mymob.client.gun_mode) // If in aim mode, correct the sprite - mymob.gun_setting_icon.dir = 2 - for(var/obj/item/weapon/gun/G in mymob) // If targeting someone, display other buttons - if (G.target) - mymob.item_use_icon = new /obj/screen/gun/item(null) - if (mymob.client.target_can_click) - mymob.item_use_icon.dir = 1 - src.adding += mymob.item_use_icon - mymob.gun_move_icon = new /obj/screen/gun/move(null) - if (mymob.client.target_can_move) - mymob.gun_move_icon.dir = 1 - mymob.gun_run_icon = new /obj/screen/gun/run(null) - if (mymob.client.target_can_run) - mymob.gun_run_icon.dir = 1 - src.adding += mymob.gun_run_icon - src.adding += mymob.gun_move_icon - - mymob.client.screen = null - - mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.pressure, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.healths, mymob.pullin, mymob.blind, mymob.flash, mymob.gun_setting_icon) //, mymob.hands, mymob.rest, mymob.sleep, mymob.mach ) - mymob.client.screen += src.adding + src.other - - return - diff --git a/code/modules/mob/living/carbon/monkey/inventory.dm b/code/modules/mob/living/carbon/monkey/inventory.dm deleted file mode 100644 index 8ccadd0349c..00000000000 --- a/code/modules/mob/living/carbon/monkey/inventory.dm +++ /dev/null @@ -1,243 +0,0 @@ -/obj/effect/equip_e/monkey/process() - if (item) - item.add_fingerprint(source) - if (!( item )) - switch(place) - if("head") - if (!( target.wear_mask )) - del(src) - return - if("l_hand") - if (!( target.l_hand )) - del(src) - return - if("r_hand") - if (!( target.r_hand )) - del(src) - return - if("back") - if (!( target.back )) - del(src) - return - if("handcuff") - if (!( target.handcuffed )) - del(src) - return - if("internal") - if ((!( (istype(target.wear_mask, /obj/item/clothing/mask) && istype(target.back, /obj/item/weapon/tank) && !( target.internal )) ) && !( target.internal ))) - del(src) - return - - if (item) - if(isrobot(source) && place != "handcuff") - var/list/L = list( "syringe", "pill", "drink", "dnainjector", "fuel") - if(!(L.Find(place))) - del(src) - return - for(var/mob/O in viewers(target, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red [] is trying to put a [] on []", source, item, target), 1) - else - var/message = null - switch(place) - if("mask") - if(istype(target.wear_mask, /obj/item/clothing)&&(target.wear_mask:flags & NODROP)) - message = text("\red [] fails to take off \a [] from []'s body!", source, target.wear_mask, target) - else - message = text("\red [] is trying to take off \a [] from []'s head!", source, target.wear_mask, target) - if("l_hand") - message = text("\red [] is trying to take off a [] from []'s left hand!", source, target.l_hand, target) - if("r_hand") - message = text("\red [] is trying to take off a [] from []'s right hand!", source, target.r_hand, target) - if("back") - message = text("\red [] is trying to take off a [] from []'s back!", source, target.back, target) - if("handcuff") - message = text("\red [] is trying to unhandcuff []!", source, target) - if("internal") - if (target.internal) - message = text("\red [] is trying to remove []'s internals", source, target) - else - message = text("\red [] is trying to set on []'s internals.", source, target) - else - for(var/mob/M in viewers(target, null)) - M.show_message(message, 1) - spawn( 30 ) - done() - return - return - -/obj/effect/equip_e/monkey/done() - if(!source || !target) return - if(source.loc != s_loc) return - if(target.loc != t_loc) return - if(LinkBlocked(s_loc,t_loc)) return - if(item && source.get_active_hand() != item) return - if ((source.restrained() || source.stat)) return - switch(place) - if("mask") - if (target.wear_mask) - if(istype(target.wear_mask, /obj/item/clothing)&& (target.wear_mask:flags & NODROP)) - return - var/obj/item/W = target.wear_mask - target.unEquip(W) - if (target.client) - target.client.screen -= W - if (W) - W.loc = target.loc - W.dropped(target) - W.layer = initial(W.layer) - W.add_fingerprint(source) - else - if (istype(item, /obj/item/clothing/mask)) - source.drop_item() - loc = target - item.layer = 20 - target.wear_mask = item - item.loc = target - if("l_hand") - if (target.l_hand) - var/obj/item/W = target.l_hand - target.unEquip(W) - if (target.client) - target.client.screen -= W - if (W) - W.loc = target.loc - W.layer = initial(W.layer) - W.dropped(target) - W.add_fingerprint(source) - else - if (istype(item, /obj/item)) - source.drop_item() - loc = target - item.layer = 20 - target.l_hand = item - item.loc = target - item.dropped(source) - item.equipped(target,target.l_hand) - if("r_hand") - if (target.r_hand) - var/obj/item/W = target.r_hand - target.unEquip(W) - if (target.client) - target.client.screen -= W - if (W) - W.loc = target.loc - W.layer = initial(W.layer) - W.dropped(target) - W.add_fingerprint(source) - else - if (istype(item, /obj/item)) - source.drop_item() - loc = target - item.layer = 20 - target.r_hand = item - item.loc = target - item.dropped(source) - item.equipped(target,target.r_hand) - if("back") - if (target.back) - var/obj/item/W = target.back - target.unEquip(W) - if (target.client) - target.client.screen -= W - if (W) - W.loc = target.loc - W.dropped(target) - W.layer = initial(W.layer) - W.add_fingerprint(source) - else - if ((istype(item, /obj/item) && item.slot_flags & SLOT_BACK )) - source.drop_item() - loc = target - item.layer = 20 - target.back = item - item.loc = target - if("handcuff") - if (target.handcuffed) - var/obj/item/W = target.handcuffed - target.unEquip(W) - if (target.client) - target.client.screen -= W - if (W) - W.loc = target.loc - W.dropped(target) - W.layer = initial(W.layer) - W.add_fingerprint(source) - else - if (istype(item, /obj/item/weapon/restraints/handcuffs)) - source.drop_item() - target.handcuffed = item - item.loc = target - if("internal") - if (target.internal) - target.internal.add_fingerprint(source) - target.internal = null - else - if (target.internal) - target.internal = null - if (!( istype(target.wear_mask, /obj/item/clothing/mask) )) - return - else - if (istype(target.back, /obj/item/weapon/tank)) - target.internal = target.back - target.internal.add_fingerprint(source) - for(var/mob/M in viewers(target, 1)) - if ((M.client && !( M.blinded ))) - M.show_message(text("[] is now running on internals.", target), 1) - else - source.regenerate_icons() - target.regenerate_icons() - del(src) - return - - - -//This is an UNSAFE proc. Use mob_can_equip() before calling this one! Or rather use equip_to_slot_if_possible() or advanced_equip_to_slot_if_possible() -//set redraw_mob to 0 if you don't wish the hud to be updated - if you're doing it manually in your own proc. -/mob/living/carbon/monkey/equip_to_slot(obj/item/W as obj, slot, redraw_mob = 1) - if(!slot) return - if(!istype(W)) return - - if(W == get_active_hand()) - unEquip(W) - - switch(slot) - if(slot_back) - src.back = W - W.equipped(src, slot) - update_inv_back(redraw_mob) - if(slot_wear_mask) - src.wear_mask = W - W.equipped(src, slot) - update_inv_wear_mask(redraw_mob) - if(slot_handcuffed) - src.handcuffed = W - update_inv_handcuffed(redraw_mob) - if(slot_legcuffed) - src.legcuffed = W - W.equipped(src, slot) - update_inv_legcuffed(redraw_mob) - if(slot_l_hand) - src.l_hand = W - W.equipped(src, slot) - update_inv_l_hand(redraw_mob) - if(slot_r_hand) - src.r_hand = W - W.equipped(src, slot) - update_inv_r_hand(redraw_mob) - if(slot_in_backpack) - W.loc = src.back - else - usr << "\red You are trying to eqip this item to an unsupported inventory slot. How the heck did you manage that? Stop it..." - return - - W.layer = 20 - - return - -/mob/living/carbon/monkey/put_in_hands(obj/item/W) - if(!W) return 0 - if(put_in_active_hand(W)) return 1 - else if(put_in_inactive_hand(W)) return 1 - else - ..() diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm deleted file mode 100644 index ec2c33983af..00000000000 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ /dev/null @@ -1,675 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 - -/mob/living/carbon/monkey - var/oxygen_alert = 0 - var/toxins_alert = 0 - var/fire_alert = 0 - var/pressure_alert = 0 - - var/temperature_alert = 0 - - -/mob/living/carbon/monkey/Life() - set invisibility = 0 - //set background = 1 - if (notransform) return - if (update_muts) - update_muts=0 - domutcheck(src,null,MUTCHK_FORCED) - ..() - - var/datum/gas_mixture/environment // Added to prevent null location errors-- TLE - if(loc) - environment = loc.return_air() - - if (stat != DEAD) - if(!istype(src,/mob/living/carbon/monkey/diona)) //still breathing - //First, resolve location and get a breath - if(mob_master.current_cycle%4==2) - //Only try to take a breath every 4 seconds, unless suffocating - breathe() - else //Still give containing object the chance to interact - if(istype(loc, /obj/)) - var/obj/location_as_object = loc - location_as_object.handle_internal_lifeform(src, 0) - - - //Updates the number of stored chemicals for powers - handle_changeling() - - //Mutations and radiation - handle_mutations_and_radiation() - - //Chemicals in the body - handle_chemicals_in_body() - - //Disabilities - handle_disabilities() - - //Virus updates, duh - handle_virus_updates() - - //Apparently, the person who wrote this code designed it so that - //blinded get reset each cycle and then get activated later in the - //code. Very ugly. I dont care. Moving this stuff here so its easy - //to find it. - blinded = null - - //Handle temperature/pressure differences between body and environment - if(environment) // More error checking -- TLE - handle_environment(environment) - - //Check if we're on fire - handle_fire() - - //Decrease wetness over time - handle_wetness() - - //Status updates, death etc. - handle_regular_status_updates() - - handle_actions() - - update_canmove() - - if(client) - handle_regular_hud_updates() - - // Grabbing - for(var/obj/item/weapon/grab/G in src) - G.process() - - if(!client && stat == CONSCIOUS) - if(prob(33) && canmove && isturf(loc) && !pulledby) //won't move if being pulled - step(src, pick(cardinal)) - if(prob(1)) - emote(pick("scratch","jump","roll","tail")) - updatehealth() - - -/mob/living/carbon/monkey/calculate_affecting_pressure(var/pressure) - ..() - return pressure - -/mob/living/carbon/monkey - - proc/handle_disabilities() - - if (disabilities & EPILEPSY) - if ((prob(1) && paralysis < 10)) - src << "\red You have a seizure!" - Paralyse(10) - if (disabilities & COUGHING) - if ((prob(5) && paralysis <= 1)) - drop_item() - spawn( 0 ) - emote("cough") - return - if (disabilities & TOURETTES) - if ((prob(10) && paralysis <= 1)) - Stun(10) - spawn( 0 ) - emote("twitch") - return - if (disabilities & NERVOUS) - if (prob(10)) - stuttering = max(10, stuttering) - - proc/handle_mutations_and_radiation() - - if(getFireLoss()) - if((RESIST_HEAT in mutations) || prob(50)) - switch(getFireLoss()) - if(1 to 50) - adjustFireLoss(-1) - if(51 to 100) - adjustFireLoss(-5) - - if ((HULK in mutations) && health <= 25) - mutations.Remove(HULK) - dna.SetSEState(HULKBLOCK,0) - update_mutations() //update our mutation overlays - status_flags |= CANSTUN | CANWEAKEN | CANPARALYSE | CANPUSH //temporary fix until the problem can be solved. - src << "You suddenly feel very weak." - Weaken(3) - emote("collapse") - - if (radiation) - - if(istype(src,/mob/living/carbon/monkey/diona)) //Filthy check. Dionaea don't take rad damage. - var/rads = radiation/25 - radiation -= rads - nutrition += rads - heal_overall_damage(rads,rads) - adjustOxyLoss(-(rads)) - adjustToxLoss(-(rads)) - return - - if (radiation > 100) - radiation = 100 - Weaken(10) - if(!lying) - src << "\red You feel weak." - emote("collapse") - - switch(radiation) - if(1 to 49) - radiation-- - if(prob(25)) - adjustToxLoss(1) - - if(50 to 74) - radiation -= 2 - adjustToxLoss(1) - if(prob(5)) - radiation -= 5 - Weaken(3) - if(!lying) - src << "\red You feel weak." - emote("collapse") - - if(75 to 100) - radiation -= 3 - adjustToxLoss(3) - if(prob(1)) - src << "\red You mutate!" - randmutb(src) - domutcheck(src,null) - emote("gasp") - - // Separate proc so we can jump out of it when we've succeeded in spreading disease. - proc/findAirborneVirii() - for(var/obj/effect/decal/cleanable/blood/B in get_turf(src)) - if(B.virus2.len) - for (var/ID in B.virus2) - var/datum/disease2/disease/V = B.virus2[ID] - if (infect_virus2(src,V)) - return 1 - - for(var/obj/effect/decal/cleanable/mucus/M in get_turf(src)) - if(M.virus2.len) - for (var/ID in M.virus2) - var/datum/disease2/disease/V = M.virus2[ID] - if (infect_virus2(src,V)) - return 1 - - for(var/obj/effect/decal/cleanable/poop/P in get_turf(src)) - if(P.virus2.len) - for (var/ID in P.virus2) - var/datum/disease2/disease/V = P.virus2[ID] - if (infect_virus2(src,V)) - return 1 - - return 0 - - proc/handle_virus_updates() - if(status_flags & GODMODE) return 0 //godmode - if(bodytemperature > 406) - for (var/ID in virus2) - var/datum/disease2/disease/V = virus2[ID] - V.cure(src) - - src.findAirborneVirii() - - for (var/ID in virus2) - var/datum/disease2/disease/V = virus2[ID] - if(isnull(V)) // Trying to figure out a runtime error that keeps repeating - CRASH("virus2 nulled before calling activate()") - else - V.activate(src) - // activate may have deleted the virus - if(!V) continue - - // check if we're immune - if(V.antigen & src.antibodies) - V.dead = 1 - return - - proc/breathe() - if(reagents) - - if(reagents.has_reagent("lexorin")) return - - if(!loc) return //probably ought to make a proper fix for this, but :effort: --NeoFite - - var/datum/gas_mixture/environment = loc.return_air() - var/datum/gas_mixture/breath - if(health < 0) - losebreath++ - if(losebreath>0) //Suffocating so do not take a breath - losebreath-- - if (prob(75)) //High chance of gasping for air - spawn emote("gasp") - if(istype(loc, /obj/)) - var/obj/location_as_object = loc - location_as_object.handle_internal_lifeform(src, 0) - else - //First, check for air from internal atmosphere (using an air tank and mask generally) - breath = get_breath_from_internal(BREATH_VOLUME) - - //No breath from internal atmosphere so get breath from location - if(!breath) - if(istype(loc, /obj/)) - var/obj/location_as_object = loc - breath = location_as_object.handle_internal_lifeform(src, BREATH_VOLUME) - else if(istype(loc, /turf/)) - var/breath_moles = environment.total_moles()*BREATH_PERCENTAGE - breath = loc.remove_air(breath_moles) - - - - else //Still give containing object the chance to interact - if(istype(loc, /obj/)) - var/obj/location_as_object = loc - location_as_object.handle_internal_lifeform(src, 0) - - handle_breath(breath) - - if(breath) - loc.assume_air(breath) - - proc/handle_breath(datum/gas_mixture/breath) - if(status_flags & GODMODE) - return - - if(!breath || (breath.total_moles() == 0)) - adjustOxyLoss(7) - - oxygen_alert = max(oxygen_alert, 1) - - return 0 - - var/safe_oxygen_min = 16 // Minimum safe partial pressure of O2, in kPa - //var/safe_oxygen_max = 140 // Maximum safe partial pressure of O2, in kPa (Not used for now) - var/safe_co2_max = 10 // Yes it's an arbitrary value who cares? - var/safe_toxins_max = 0.5 - var/safe_toxins_mask = 5 - var/SA_para_min = 0.5 - var/SA_sleep_min = 5 - var/oxygen_used = 0 - var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME - - //Partial pressure of the O2 in our breath - var/O2_pp = (breath.oxygen/breath.total_moles())*breath_pressure - // Same, but for the toxins - var/Toxins_pp = (breath.toxins/breath.total_moles())*breath_pressure - // And CO2, lets say a PP of more than 10 will be bad (It's a little less really, but eh, being passed out all round aint no fun) - var/CO2_pp = (breath.carbon_dioxide/breath.total_moles())*breath_pressure - - if(O2_pp < safe_oxygen_min) // Too little oxygen - if(prob(20)) - spawn(0) emote("gasp") - if (O2_pp == 0) - O2_pp = 0.01 - var/ratio = safe_oxygen_min/O2_pp - adjustOxyLoss(min(5*ratio, 7)) // Don't fuck them up too fast (space only does 7 after all!) - oxygen_used = breath.oxygen*ratio/6 - oxygen_alert = max(oxygen_alert, 1) - /*else if (O2_pp > safe_oxygen_max) // Too much oxygen (commented this out for now, I'll deal with pressure damage elsewhere I suppose) - spawn(0) emote("cough") - var/ratio = O2_pp/safe_oxygen_max - oxyloss += 5*ratio - oxygen_used = breath.oxygen*ratio/6 - oxygen_alert = max(oxygen_alert, 1)*/ - else // We're in safe limits - adjustOxyLoss(-5) - oxygen_used = breath.oxygen/6 - oxygen_alert = 0 - - breath.oxygen -= oxygen_used - breath.carbon_dioxide += oxygen_used - - if(CO2_pp > safe_co2_max) - if(!co2overloadtime) // If it's the first breath with too much CO2 in it, lets start a counter, then have them pass out after 12s or so. - co2overloadtime = world.time - else if(world.time - co2overloadtime > 120) - Paralyse(3) - adjustOxyLoss(3) // Lets hurt em a little, let them know we mean business - if(world.time - co2overloadtime > 300) // They've been in here 30s now, lets start to kill them for their own good! - adjustOxyLoss(8) - if(prob(20)) // Lets give them some chance to know somethings not right though I guess. - spawn(0) emote("cough") - - else - co2overloadtime = 0 - - if(Toxins_pp > safe_toxins_max) // Too much toxins - var/ratio = (breath.toxins/safe_toxins_max) * 10 - //adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) //Limit amount of damage toxin exposure can do per second - if(wear_mask) - if(wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT) - if(breath.toxins > safe_toxins_mask) - ratio = (breath.toxins/safe_toxins_mask) * 10 - else - ratio = 0 - if(ratio) - if(reagents) - reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) - toxins_alert = max(toxins_alert, 1) - else - toxins_alert = 0 - - if(breath.trace_gases.len) // If there's some other shit in the air lets deal with it here. - for(var/datum/gas/sleeping_agent/SA in breath.trace_gases) - var/SA_pp = (SA.moles/breath.total_moles())*breath_pressure - if(SA_pp > SA_para_min) // Enough to make us paralysed for a bit - Paralyse(3) // 3 gives them one second to wake up and run away a bit! - if(SA_pp > SA_sleep_min) // Enough to make us sleep as well - sleeping = max(sleeping+2, 10) - else if(SA_pp > 0.01) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning - if(prob(20)) - spawn(0) emote(pick("giggle", "laugh")) - - - if(breath.temperature > (T0C+66)) // Hot air hurts :( - if(prob(20)) - src << "\red You feel a searing heat in your lungs!" - fire_alert = max(fire_alert, 2) - else - fire_alert = 0 - - - //Temporary fixes to the alerts. - - return 1 - - proc/handle_environment(datum/gas_mixture/environment) - if(!environment) - return - - //Moved these vars here for use in the fuck-it-skip-processing check. - var/pressure = environment.return_pressure() - var/adjusted_pressure = calculate_affecting_pressure(pressure) //Returns how much pressure actually affects the mob. - - if(adjusted_pressure < WARNING_HIGH_PRESSURE && adjusted_pressure > WARNING_LOW_PRESSURE && abs(environment.temperature - 293.15) < 20 && abs(bodytemperature - 310.14) < 0.5 && environment.toxins < MOLES_PLASMA_VISIBLE) - - //Hopefully should fix the walk-inside-still-pressure-warning issue. - if(pressure_alert) - pressure_alert = 0 - - return // Temperatures are within normal ranges, fuck all this processing. ~Ccomp - - var/environment_heat_capacity = environment.heat_capacity() - if(istype(get_turf(src), /turf/space)) - var/turf/heat_turf = get_turf(src) - environment_heat_capacity = heat_turf.heat_capacity - - if(!on_fire) - if((environment.temperature > (T0C + 50)) || (environment.temperature < (T0C + 10))) - var/transfer_coefficient = 1 - - handle_temperature_damage(HEAD, environment.temperature, environment_heat_capacity*transfer_coefficient) - - if(stat==2) - bodytemperature += 0.1*(environment.temperature - bodytemperature)*environment_heat_capacity/(environment_heat_capacity + 270000) - - //Account for massive pressure differences - switch(adjusted_pressure) - if(HAZARD_HIGH_PRESSURE to INFINITY) - adjustBruteLoss( min( ( (adjusted_pressure / HAZARD_HIGH_PRESSURE) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE) ) - pressure_alert = 2 - if(WARNING_HIGH_PRESSURE to HAZARD_HIGH_PRESSURE) - pressure_alert = 1 - if(WARNING_LOW_PRESSURE to WARNING_HIGH_PRESSURE) - pressure_alert = 0 - if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE) - pressure_alert = -1 - else - if( !(RESIST_COLD in mutations) ) - adjustBruteLoss( LOW_PRESSURE_DAMAGE ) - pressure_alert = -2 - else - pressure_alert = -1 - - return - - proc/handle_temperature_damage(body_part, exposed_temperature, exposed_intensity) - if(status_flags & GODMODE) return - var/discomfort = min( abs(exposed_temperature - bodytemperature)*(exposed_intensity)/2000000, 1.0) - //adjustFireLoss(2.5*discomfort) - - if(exposed_temperature > bodytemperature) - adjustFireLoss(20.0*discomfort) - - else - adjustFireLoss(5.0*discomfort) - - proc/handle_chemicals_in_body() - - if(istype(src,/mob/living/carbon/monkey/diona)) //Filthy check. Dionaea nymphs need light or they get sad. - var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing - if(isturf(loc)) //else, there's considered to be no light - var/turf/T = loc - var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T - if(L) - light_amount = (L.get_clamped_lum()*10) - 5 //hardcapped so it's not abused by having a ton of flashlights - else - light_amount = 5 - - nutrition += light_amount - traumatic_shock -= light_amount - - if(nutrition > 500) - nutrition = 500 - if(light_amount > 2) //if there's enough light, heal - adjustBruteLoss(-1) - adjustToxLoss(-1) - adjustOxyLoss(-1) - - if(reagents && reagents.reagent_list.len) - reagents.metabolize(src,alien) - - if (drowsyness) - drowsyness-- - eye_blurry = max(2, eye_blurry) - if (prob(5)) - sleeping += 1 - Paralyse(5) - - if(confused) - confused = max(0, confused - 1) - - if(resting) - dizziness = max(0, dizziness - 5) - else - dizziness = max(0, dizziness - 1) - - return //TODO: DEFERRED - - proc/handle_regular_status_updates() - - if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP - blinded = 1 - silent = 0 - else //ALIVE. LIGHTS ARE ON - updatehealth() - if(health < config.health_threshold_dead || brain_op_stage == 4.0) - death() - blinded = 1 - stat = DEAD - silent = 0 - return 1 - - //UNCONSCIOUS. NO-ONE IS HOME - if( (getOxyLoss() > 25) || (config.health_threshold_crit >= health) ) - if( health <= 20 && prob(1) ) - spawn(0) - emote("gasp") - if(!reagents.has_reagent("epinephrine")) - adjustOxyLoss(1) - Paralyse(3) - if(halloss > 100) - src << "You're in too much pain to keep going..." - for(var/mob/O in oviewers(src, null)) - O.show_message("[src] slumps to the ground, too weak to continue fighting.", 1) - Paralyse(10) - setHalLoss(99) - - if(paralysis) - AdjustParalysis(-1) - blinded = 1 - stat = UNCONSCIOUS - if(halloss > 0) - adjustHalLoss(-3) - else if(sleeping) - handle_dreams() - adjustHalLoss(-3) - sleeping = max(sleeping-1, 0) - blinded = 1 - stat = UNCONSCIOUS - if( prob(10) && health && !hal_crit ) - spawn(0) - emote("snore") - else if(resting) - if(halloss > 0) - adjustHalLoss(-3) - //CONSCIOUS - else - stat = CONSCIOUS - if(halloss > 0) - adjustHalLoss(-1) - - //Eyes - if(sdisabilities & BLIND) //disabled-blind, doesn't get better on its own - blinded = 1 - else if(eye_blind) //blindness, heals slowly over time - eye_blind = max(eye_blind-1,0) - blinded = 1 - else if(eye_blurry) //blurry eyes heal slowly - eye_blurry = max(eye_blurry-1, 0) - - //Ears - if(sdisabilities & DEAF) //disabled-deaf, doesn't get better on its own - ear_deaf = max(ear_deaf, 1) - else if(ear_deaf) //deafness, heals slowly over time - ear_deaf = max(ear_deaf-1, 0) - else if(ear_damage < 25) //ear damage heals slowly under this threshold. otherwise you'll need earmuffs - ear_damage = max(ear_damage-0.05, 0) - - //Other - handle_statuses() - - CheckStamina() - - return 1 - - - proc/handle_regular_hud_updates() - - if (stat == 2 || (XRAY in mutations)) - sight |= SEE_TURFS - sight |= SEE_MOBS - sight |= SEE_OBJS - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_LEVEL_TWO - else if (stat != 2) - sight &= ~SEE_TURFS - sight &= ~SEE_MOBS - sight &= ~SEE_OBJS - see_in_dark = 2 - see_invisible = SEE_INVISIBLE_LIVING - - if (healths) - if (stat != 2) - switch(health) - if(100 to INFINITY) - healths.icon_state = "health0" - if(80 to 100) - healths.icon_state = "health1" - if(60 to 80) - healths.icon_state = "health2" - if(40 to 60) - healths.icon_state = "health3" - if(20 to 40) - healths.icon_state = "health4" - if(0 to 20) - healths.icon_state = "health5" - else - healths.icon_state = "health6" - else - healths.icon_state = "health7" - - - if(pressure) - pressure.icon_state = "pressure[pressure_alert]" - - if(pullin) pullin.icon_state = "pull[pulling ? 1 : 0]" - - - if (toxin) toxin.icon_state = "tox[toxins_alert ? 1 : 0]" - if (oxygen) oxygen.icon_state = "oxy[oxygen_alert ? 1 : 0]" - if (fire) fire.icon_state = "fire[fire_alert ? 2 : 0]" - //NOTE: the alerts dont reset when youre out of danger. dont blame me, - //blame the person who coded them. Temporary fix added. - - if(bodytemp) - switch(bodytemperature) //310.055 optimal body temp - if(345 to INFINITY) - bodytemp.icon_state = "temp4" - if(335 to 345) - bodytemp.icon_state = "temp3" - if(327 to 335) - bodytemp.icon_state = "temp2" - if(316 to 327) - bodytemp.icon_state = "temp1" - if(300 to 316) - bodytemp.icon_state = "temp0" - if(295 to 300) - bodytemp.icon_state = "temp-1" - if(280 to 295) - bodytemp.icon_state = "temp-2" - if(260 to 280) - bodytemp.icon_state = "temp-3" - else - bodytemp.icon_state = "temp-4" - - client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired) - - if(blind && stat != DEAD) - if(blinded) - blind.layer = 18 - else - blind.layer = 0 - - if(disabilities & NEARSIGHTED) - client.screen += global_hud.vimpaired - - if(eye_blurry) - client.screen += global_hud.blurry - - if(druggy) - client.screen += global_hud.druggy - - if (stat != 2) - if (machine) - if (!( machine.check_eye(src) )) - reset_view(null) - else - if(client && !client.adminobs) - reset_view(null) - - return 1 - - proc/handle_random_events() - if (prob(1) && prob(2)) - spawn(0) - emote("scratch") - return - - - proc/handle_changeling() - if(mind && mind.changeling) - mind.changeling.regenerate() - - ///FIRE CODE - handle_fire() - if(..()) - return - adjustFireLoss(6) - return - //END FIRE CODE - - proc/handle_wetness() - if(mob_master.current_cycle%20==2) //dry off a bit once every 20 ticks or so - wetlevel = max(wetlevel - 1,0) - return diff --git a/code/modules/mob/living/carbon/monkey/login.dm b/code/modules/mob/living/carbon/monkey/login.dm deleted file mode 100644 index 3b7e5dcb971..00000000000 --- a/code/modules/mob/living/carbon/monkey/login.dm +++ /dev/null @@ -1,4 +0,0 @@ -/mob/living/carbon/monkey/Login() - ..() - update_hud() - return diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm deleted file mode 100644 index 34a1bc589e1..00000000000 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ /dev/null @@ -1,553 +0,0 @@ -/mob/living/carbon/monkey - name = "monkey" - voice_name = "monkey" - speak_emote = list("chimpers") - icon_state = "monkey1" - icon = 'icons/mob/monkey.dmi' - gender = NEUTER - pass_flags = PASSTABLE - update_icon = 0 ///no need to call regenerate_icon - - var/obj/item/weapon/card/id/wear_id = null // Fix for station bounced radios -- Skie - var/greaterform = "Human" // Used when humanizing a monkey. - icon_state = "monkey1" - //var/uni_append = "12C4E2" // Small appearance modifier for different species. - var/list/uni_append = list(0x12C,0x4E2) // Same as above for DNA2. - var/update_muts = 1 // Monkey gene must be set at start. - var/alien = 0 //Used for reagent metabolism. - ventcrawler = 2 - -/mob/living/carbon/monkey/tajara - name = "farwa" - voice_name = "farwa" - speak_emote = list("mews") - icon_state = "tajkey1" - uni_append = list(0x0A0,0xE00) // 0A0E00 - -/mob/living/carbon/monkey/vulpkanin - name = "wolpin" - voice_name = "wolpin" - speak_emote = list("yaps") - icon_state = "wolfling" - uni_append = list(0x066,0x4FE) - -/mob/living/carbon/monkey/skrell - name = "neaera" - voice_name = "neaera" - speak_emote = list("squicks") - icon_state = "skrellkey1" - uni_append = list(0x01C,0xC92) // 01CC92 - -/mob/living/carbon/monkey/unathi - name = "stok" - voice_name = "stok" - speak_emote = list("hisses") - icon_state = "stokkey1" - uni_append = list(0x044,0xC5D) // 044C5D - -/mob/living/carbon/monkey/wryn - name = "lajavi" - voice_name = "lajavi" - speak_emote = list("hisses") - icon_state = "wrynkey1" - uni_append = list(0x022,0xF5D) // 022F5D - -/mob/living/carbon/monkey/New() - var/datum/reagents/R = new/datum/reagents(330) - reagents = R - R.my_atom = src - - if(name == initial(name)) //To stop Pun-Pun becoming generic. - name = "[name] ([rand(1, 1000)])" - real_name = name - - if (!(dna)) - if(gender == NEUTER) - gender = pick(MALE, FEMALE) - dna = new /datum/dna( null ) - dna.real_name = real_name - dna.ResetSE() - dna.ResetUI() - //dna.uni_identity = "00600200A00E0110148FC01300B009" - //dna.SetUI(list(0x006,0x002,0x00A,0x00E,0x011,0x014,0x8FC,0x013,0x00B,0x009)) - //dna.struc_enzymes = "43359156756131E13763334D1C369012032164D4FE4CD61544B6C03F251B6C60A42821D26BA3B0FD6" - //dna.SetSE(list(0x433,0x591,0x567,0x561,0x31E,0x137,0x633,0x34D,0x1C3,0x690,0x120,0x321,0x64D,0x4FE,0x4CD,0x615,0x44B,0x6C0,0x3F2,0x51B,0x6C6,0x0A4,0x282,0x1D2,0x6BA,0x3B0,0xFD6)) - dna.unique_enzymes = md5(name) - - // We're a monkey - dna.SetSEState(MONKEYBLOCK, 1) - dna.SetSEValueRange(MONKEYBLOCK,0xDAC, 0xFFF) - // Fix gender - dna.SetUIState(DNA_UI_GENDER, gender != MALE, 1) - - // Set the blocks to uni_append, if needed. - if(uni_append.len>0) - for(var/b=1;b<=uni_append.len;b++) - dna.SetUIValue(DNA_UI_LENGTH-(uni_append.len-b),uni_append[b], 1) - dna.UpdateUI() - - update_muts=1 - - ..() - update_icons() - return - -/mob/living/carbon/monkey/unathi/New() - - ..() - greaterform = "Unathi" - dna.species = "Unathi" - add_language("Sinta'unathi") - -/mob/living/carbon/monkey/skrell/New() - - ..() - greaterform = "Skrell" - dna.species = "Skrell" - add_language("Skrellian") - -/mob/living/carbon/monkey/tajara/New() - - ..() - greaterform = "Tajaran" - dna.species = "Tajaran" - add_language("Siik'tajr") - -/mob/living/carbon/monkey/vulpkanin/New() - - ..() - greaterform = "Vulpkanin" - dna.species = "Vulpkanin" - add_language("Canilunzt") - -/mob/living/carbon/monkey/diona/New() - - ..() - alien = 1 - gender = NEUTER - greaterform = "Diona" - dna.species = "Diona" - add_language("Rootspeak") - -/mob/living/carbon/monkey/movement_delay() - var/tally = 0 - if(status_flags & GOTTAGOFAST) - tally -= 1 - - var/health_deficiency = (100 - health) - if(health_deficiency >= 45) tally += (health_deficiency / 25) - - if (bodytemperature < 283.222) - tally += (283.222 - bodytemperature) / 10 * 1.75 - return tally+config.monkey_delay - -/mob/living/carbon/monkey/Bump(atom/movable/AM as mob|obj, yes) - - spawn( 0 ) - if ((!( yes ) || now_pushing)) - return - now_pushing = 1 - if(ismob(AM)) - var/mob/tmob = AM - if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations)) - if(prob(70)) - usr << "\red You fail to push [tmob]'s fat ass out of the way." - now_pushing = 0 - return - if(!(tmob.status_flags & CANPUSH)) - now_pushing = 0 - return - - tmob.LAssailant = src - now_pushing = 0 - ..() - if (!( istype(AM, /atom/movable) )) - return - if (!( now_pushing )) - now_pushing = 1 - if (!( AM.anchored )) - var/t = get_dir(src, AM) - if (istype(AM, /obj/structure/window/full)) - for(var/obj/structure/window/win in get_step(AM,t)) - now_pushing = 0 - return - step(AM, t) - now_pushing = null - return - return - -/mob/living/carbon/monkey/Topic(href, href_list) - ..() - if (href_list["mach_close"]) - var/t1 = text("window=[]", href_list["mach_close"]) - unset_machine() - src << browse(null, t1) - if ((href_list["item"] && !( usr.stat ) && !( usr.restrained() ) && in_range(src, usr) )) - var/obj/effect/equip_e/monkey/O = new /obj/effect/equip_e/monkey( ) - O.source = usr - O.target = src - O.item = usr.get_active_hand() - O.s_loc = usr.loc - O.t_loc = loc - O.place = href_list["item"] - requests += O - spawn( 0 ) - O.process() - return - ..() - return - -/mob/living/carbon/monkey/meteorhit(obj/O as obj) - for(var/mob/M in viewers(src, null)) - M.show_message(text("\red [] has been hit by []", src, O), 1) - if (health > 0) - var/shielded = 0 - adjustBruteLoss(30) - if ((O.icon_state == "flaming" && !( shielded ))) - adjustFireLoss(40) - health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() - return - -/mob/living/carbon/monkey/attack_paw(mob/living/M as mob) - ..() - - if (M.a_intent == "help") - help_shake_act(M) - else - if (M.a_intent == "harm" && !(istype(src.wear_mask, /obj/item/clothing/mask/muzzle))) - M.do_attack_animation(src) - if (prob(75)) - playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) - visible_message("[M.name] bites [name]!", \ - "[M.name] bites [name]!") - var/damage = rand(1, 5) - if (health > -100) - adjustBruteLoss(damage) - health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() - else - visible_message("[M.name] has attempted to bite [name]!", \ - "[M.name] has attempted to bite [name]!") - return - -/mob/living/carbon/monkey/attack_larva(mob/living/carbon/alien/larva/L as mob) - - switch(L.a_intent) - if("help") - visible_message("[L] rubs its head against [src].") - - - else - L.do_attack_animation(src) - var/damage = rand(1, 3) - visible_message("[L] bites [src]!", \ - "[L] bites [src]!") - playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) - - if(stat != DEAD) - L.amount_grown = min(L.amount_grown + damage, L.max_grown) - adjustBruteLoss(damage) - -/mob/living/carbon/monkey/attack_hand(mob/living/carbon/human/M as mob) - if (!ticker) - M << "You cannot attack people before the game has started." - return - - if (istype(loc, /turf) && istype(loc.loc, /area/start)) - M << "No attacking people at spawn, you jackass." - return - - if(..()) //To allow surgery to return properly. - return - - if (M.a_intent == "help") - help_shake_act(M) - - else - if (M.a_intent == "harm") - M.do_attack_animation(src) - if (prob(75)) - visible_message("[M] has punched [name]!", \ - "[M] has punched [name]!") - - playsound(loc, "punch", 25, 1, -1) - var/damage = rand(5, 10) - if (prob(40)) - damage = rand(10, 15) - if ( (paralysis < 5) && (health > 0) ) - Paralyse(rand(10, 15)) - spawn( 0 ) - visible_message("[M] has knocked out [name]!", \ - "[M] has knocked out [name]!") - return - adjustBruteLoss(damage) - updatehealth() - else - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - visible_message("[M] has attempted to punch [name]!", \ - "[M] has attempted to punch [name]!") - else - if (M.a_intent == "grab") - if (M == src || anchored) - return - - var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src ) - - M.put_in_active_hand(G) - - G.synch() - - LAssailant = M - - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - visible_message("[M] has grabbed [name] passively!") - else - if (!( paralysis )) - if (prob(25)) - Paralyse(2) - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - visible_message("[M] has pushed down [src]!", \ - "[M] has pushed down [src]!") - else - if(drop_item()) - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - visible_message("[M] has disarmed [src]!", \ - "[M] has disarmed [src]!") - return - -/mob/living/carbon/monkey/attack_alien(mob/living/carbon/alien/humanoid/M as mob) - if (!ticker) - M << "You cannot attack people before the game has started." - return - - if (istype(loc, /turf) && istype(loc.loc, /area/start)) - M << "No attacking people at spawn, you jackass." - return - - switch(M.a_intent) - if ("help") - visible_message(" [M] caresses [src] with its scythe like arm.") - - if ("harm") - M.do_attack_animation(src) - if ((prob(95) && health > 0)) - playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1) - var/damage = rand(15, 30) - if (damage >= 25) - damage = rand(20, 40) - if (paralysis < 15) - Paralyse(rand(10, 15)) - visible_message("[M] has wounded [name]!", \ - "[M] has wounded [name]!") - else - visible_message("[M] has slashed [name]!", \ - "[M] has slashed [name]!") - if (stat != DEAD) - adjustBruteLoss(damage) - updatehealth() - else - playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1) - visible_message("[M] has attempted to lunge at [name]!", \ - "[M] has attempted to lunge at [name]!") - - if ("grab") - if (M == src || anchored) - return - var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src ) - - M.put_in_active_hand(G) - - G.synch() - - LAssailant = M - - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - visible_message("[M] has grabbed [name] passively!") - - if ("disarm") - M.do_attack_animation(src) - playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1) - var/damage = 5 - if(prob(95)) - Weaken(10) - visible_message("[M] has tackled down [name]!", \ - "[M] has tackled down [name]!") - else - if(drop_item()) - visible_message("[M] has disarmed [name]!", \ - "[M] has disarmed [name]!") - adjustBruteLoss(damage) - updatehealth() - return - -/mob/living/carbon/monkey/attack_animal(mob/living/simple_animal/M as mob) - if(M.melee_damage_upper == 0) - M.emote("[M.friendly] [src]") - else - M.do_attack_animation(src) - if(M.attack_sound) - playsound(loc, M.attack_sound, 50, 1, 1) - visible_message("[M] [M.attacktext] [src]!", \ - "[M] [M.attacktext] [src]!") - add_logs(M, src, "attacked", admin=0) - var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) - adjustBruteLoss(damage) - updatehealth() - - -/mob/living/carbon/monkey/attack_slime(mob/living/carbon/slime/M as mob) - if (!ticker) - M << "You cannot attack people before the game has started." - return - - if(M.Victim) return // can't attack while eating! - - if (health > -100) - - M.do_attack_animation(src) - visible_message("The [M.name] glomps [src]!", \ - "The [M.name] glomps [src]!") - - var/damage = rand(1, 3) - - if(M.is_adult) - damage = rand(20, 40) - else - damage = rand(5, 35) - - adjustBruteLoss(damage) - - if(M.powerlevel > 0) - var/stunprob = 10 - var/power = M.powerlevel + rand(0,3) - - switch(M.powerlevel) - if(1 to 2) stunprob = 20 - if(3 to 4) stunprob = 30 - if(5 to 6) stunprob = 40 - if(7 to 8) stunprob = 60 - if(9) stunprob = 70 - if(10) stunprob = 95 - - if(prob(stunprob)) - M.powerlevel -= 3 - if(M.powerlevel < 0) - M.powerlevel = 0 - - visible_message("[M] shocked [src]!", \ - "[M] shocked [src]!") - - Weaken(power) - if (stuttering < power) - stuttering = power - Stun(power) - - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() - - if (prob(stunprob) && M.powerlevel >= 8) - adjustFireLoss(M.powerlevel * rand(6,10)) - - - updatehealth() - - return - -/mob/living/carbon/monkey/Stat() - ..() - statpanel("Status") - stat(null, text("Intent: []", a_intent)) - stat(null, text("Move Mode: []", m_intent)) - if(client && mind) - if (client.statpanel == "Status") - if(mind.changeling) - stat("Chemical Storage", mind.changeling.chem_charges) - stat("Genetic Damage Time", mind.changeling.geneticdamage) - return - - -/mob/living/carbon/monkey/verb/removeinternal() - set name = "Remove Internals" - set category = "IC" - internal = null - return - -/mob/living/carbon/monkey/var/co2overloadtime = null -/mob/living/carbon/monkey/var/temperature_resistance = T0C+75 - -/mob/living/carbon/monkey/emp_act(severity) - if(wear_id) wear_id.emp_act(severity) - ..() - -/mob/living/carbon/monkey/ex_act(severity) - ..() - switch(severity) - if(1.0) - gib() - return - if(2.0) - adjustBruteLoss(60) - adjustFireLoss(60) - if(3.0) - adjustBruteLoss(30) - if (prob(50)) - Paralyse(10) - return - -/mob/living/carbon/monkey/blob_act() - if (stat != 2) - adjustFireLoss(60) - health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() - if (prob(50)) - Paralyse(10) - if (stat == DEAD && client) - gib() - return - if (stat == DEAD && !client) - gibs(loc, viruses) - del(src) - return - - -/mob/living/carbon/monkey/IsAdvancedToolUser()//Unless its monkey mode monkeys cant use advanced tools - if(!ticker) return 0 - if(!ticker.mode.name == "monkey") return 0 - return 1 - -/mob/living/carbon/monkey/canBeHandcuffed() - return 1 - - -/mob/living/carbon/monkey/assess_threat(var/obj/machinery/bot/secbot/judgebot, var/lasercolor) - if(judgebot.emagged == 2) - return 10 //Everyone is a criminal! - var/threatcount = 0 - - //Securitrons can't identify monkeys - if(!lasercolor && judgebot.idcheck ) - threatcount += 4 - - //Lasertag bullshit - if(lasercolor) - if(lasercolor == "b")//Lasertag turrets target the opposing team, how great is that? -Sieve - if((istype(r_hand,/obj/item/weapon/gun/energy/laser/redtag)) || (istype(l_hand,/obj/item/weapon/gun/energy/laser/redtag))) - threatcount += 4 - - if(lasercolor == "r") - if((istype(r_hand,/obj/item/weapon/gun/energy/laser/bluetag)) || (istype(l_hand,/obj/item/weapon/gun/energy/laser/bluetag))) - threatcount += 4 - - return threatcount - - //Check for weapons - if(judgebot.weaponscheck) - if(judgebot.check_for_weapons(l_hand)) - threatcount += 4 - if(judgebot.check_for_weapons(r_hand)) - threatcount += 4 - - //Loyalty implants imply trustworthyness - if(isloyal(src)) - threatcount -= 1 - - return threatcount diff --git a/code/modules/mob/living/carbon/monkey/npc.dm b/code/modules/mob/living/carbon/monkey/npc.dm deleted file mode 100644 index f863558605a..00000000000 --- a/code/modules/mob/living/carbon/monkey/npc.dm +++ /dev/null @@ -1,89 +0,0 @@ -mob/living/carbon/monkey/var - mob/npc_target = null // the NPC this monkey is attacking - mob/npc_fleeing = null // the monkey is scared of this mob - mob/hiding_behind = null - hid_behind = 0 - - var/list/hostiles = list() - - fleeing_duration = 0 - -mob/living/carbon/monkey/proc/npc_act() - if(!client && !stat) - if(npc_fleeing && canmove) - var/prevloc = loc - if(!hiding_behind) - for(var/mob/living/carbon/human/H in view(7, src)) - if(!hostiles.Find(H)) - hiding_behind = H - - if(hiding_behind) - if(get_dist(src, hiding_behind) == 1) - if(!hid_behind) - emote("me", 1, "hides behind [hiding_behind]!") - hid_behind = 1 - step_to(src, get_step(hiding_behind, get_dir(npc_fleeing, hiding_behind))) - else - if(!step_to(src, hiding_behind, 1)) - hiding_behind = null - else - step_away(src, npc_fleeing, 7) - - if(prob(7)) - if(prob(50) && (npc_fleeing in view(8,src))) - switch(rand(1,3)) - if(1) - emote("me", 1, "shows [npc_fleeing] its fangs!") - if(2) - emote("me", 2, "gnarls at [npc_fleeing].") - if(3) - emote("me", 2, "eyes [npc_fleeing] fearfully.") - else - switch(rand(1,3)) - if(1) - emote("whimper") - if(2) - emote("me", 1, "trembles heavily.") - if(3) - emote("me", 2, "chimpers nervously.") - - fleeing_duration-- - if(fleeing_duration <= 0) - npc_fleeing = null - hiding_behind = null - hid_behind = 0 - - if(loc == prevloc) dir = get_dir(src, npc_fleeing) - else - if(prob(33) && canmove && isturf(loc)) - step(src, pick(cardinal)) - if(prob(1)) - if(health < 70) - switch(rand(1,3)) - if(1) - emote("me", 1, "cowers on the floor, writhing in pain.") - if(2) - emote("me", 1, "trembles visibly, it seems to be in pain.") - if(3) - emote("me", 1, "wraps its arms around its knees, breathing heavily.") - else - emote(pick("scratch","jump","roll","tail")) - -mob/living/carbon/monkey/react_to_attack(mob/M) - if(npc_fleeing == M) - fleeing_duration += 30 - return - - if(!hostiles.Find(M)) hostiles += M - - spawn(5) - switch(rand(1,3)) - if(1) - emote("me", 1, "flails about wildly!") - if(2) - emote("me", 2, "screams loudly at [M]!") - if(3) - emote("me", 2, "whimpers fearfully!") - - npc_fleeing = M - fleeing_duration = 30 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/monkey/say.dm b/code/modules/mob/living/carbon/monkey/say.dm deleted file mode 100644 index 9a629c358fc..00000000000 --- a/code/modules/mob/living/carbon/monkey/say.dm +++ /dev/null @@ -1,28 +0,0 @@ -/mob/living/carbon/monkey/say(var/message) - var/verb = "says" - var/message_range = world.view - - if(client) - if(client.prefs.muted & MUTE_IC) - src << "\red You cannot speak in IC (Muted)." - return - - message = trim_strip_html_properly(message) - - if(stat == 2) - return say_dead(message) - - if(copytext(message,1,2) == "*") - return emote(copytext(message,2)) - - var/datum/language/speaking = parse_language(message) - - if(speaking) - message = copytext(message, 2+length(speaking.key)) - - message = trim(message) - - if(!message || stat) - return - - ..(message, speaking, verb, null, null, message_range, null) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/monkey/update_icons.dm b/code/modules/mob/living/carbon/monkey/update_icons.dm deleted file mode 100644 index 7c268632876..00000000000 --- a/code/modules/mob/living/carbon/monkey/update_icons.dm +++ /dev/null @@ -1,134 +0,0 @@ -//Monkey Overlays Indexes//////// -#define M_MASK_LAYER 1 -#define M_BACK_LAYER 2 -#define M_HANDCUFF_LAYER 3 -#define M_L_HAND_LAYER 4 -#define M_R_HAND_LAYER 5 -#define TARGETED_LAYER 6 -#define M_FIRE_LAYER 7 -#define M_TOTAL_LAYERS 7 -///////////////////////////////// - -/mob/living/carbon/monkey - var/list/overlays_lying[M_TOTAL_LAYERS] - var/list/overlays_standing[M_TOTAL_LAYERS] - -/mob/living/carbon/monkey/regenerate_icons() - ..() - update_inv_wear_mask(0) - update_inv_back(0) - update_inv_r_hand(0) - update_inv_l_hand(0) - update_inv_handcuffed(0) - update_fire() - update_icons() - //Hud Stuff - update_hud() - return - -/mob/living/carbon/monkey/update_icons() - update_hud() - lying_prev = lying //so we don't update overlays for lying/standing unless our stance changes again - overlays.Cut() - for(var/image/I in overlays_standing) - overlays += I - - - if(lying) - var/matrix/M = matrix() - M.Turn(90) - M.Translate(1,-6) - src.transform = M - else - var/matrix/M = matrix() - src.transform = M - - - -//////// -/mob/living/carbon/monkey/update_inv_wear_mask(var/update_icons=1) - if( wear_mask && istype(wear_mask, /obj/item/clothing/mask) ) - overlays_standing[M_MASK_LAYER] = image("icon" = 'icons/mob/monkey.dmi', "icon_state" = "[wear_mask.icon_state]") - wear_mask.screen_loc = ui_monkey_mask - else - overlays_standing[M_MASK_LAYER] = null - if(update_icons) update_icons() - - -/mob/living/carbon/monkey/update_inv_r_hand(var/update_icons=1) - if(r_hand) - var/t_state = r_hand.item_state - if(!t_state) t_state = r_hand.icon_state - overlays_standing[M_R_HAND_LAYER] = image("icon" = 'icons/mob/items_righthand.dmi', "icon_state" = t_state) - r_hand.screen_loc = ui_rhand - if (handcuffed) drop_r_hand() - else - overlays_standing[M_R_HAND_LAYER] = null - if(update_icons) update_icons() - - -/mob/living/carbon/monkey/update_inv_l_hand(var/update_icons=1) - if(l_hand) - var/t_state = l_hand.item_state - if(!t_state) t_state = l_hand.icon_state - overlays_standing[M_L_HAND_LAYER] = image("icon" = 'icons/mob/items_lefthand.dmi', "icon_state" = t_state) - l_hand.screen_loc = ui_lhand - if (handcuffed) drop_l_hand() - else - overlays_standing[M_L_HAND_LAYER] = null - if(update_icons) update_icons() - - -/mob/living/carbon/monkey/update_inv_back(var/update_icons=1) - if(back) - overlays_standing[M_BACK_LAYER] = image("icon" = 'icons/mob/back.dmi', "icon_state" = "[back.icon_state]") - back.screen_loc = ui_monkey_back - else - overlays_standing[M_BACK_LAYER] = null - if(update_icons) update_icons() - - -/mob/living/carbon/monkey/update_inv_handcuffed(var/update_icons=1) - if(handcuffed) - drop_r_hand() - drop_l_hand() - stop_pulling() - overlays_standing[M_HANDCUFF_LAYER] = image("icon" = 'icons/mob/monkey.dmi', "icon_state" = "handcuff1") - else - overlays_standing[M_HANDCUFF_LAYER] = null - if(update_icons) update_icons() - - -/mob/living/carbon/monkey/update_hud() - if (client) - client.screen |= contents - -//Call when target overlay should be added/removed -/mob/living/carbon/monkey/update_targeted(var/update_icons=1) - if (targeted_by && target_locked) - overlays_standing[TARGETED_LAYER] = target_locked - else if (!targeted_by && target_locked) - del(target_locked) - if (!targeted_by) - overlays_standing[TARGETED_LAYER] = null - if(update_icons) update_icons() - -/mob/living/carbon/monkey/update_fire() - overlays -= overlays_standing[M_FIRE_LAYER] - if(on_fire) - overlays_standing[M_FIRE_LAYER] = image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing", "layer"= -M_FIRE_LAYER) - overlays += overlays_standing[M_FIRE_LAYER] - return - else - overlays_standing[M_FIRE_LAYER] = null - -//Monkey Overlays Indexes//////// -#undef M_MASK_LAYER -#undef M_BACK_LAYER -#undef M_HANDCUFF_LAYER -#undef M_L_HAND_LAYER -#undef M_R_HAND_LAYER -#undef TARGETED_LAYER -#undef M_FIRE_LAYER -#undef M_TOTAL_LAYERS - diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 4361b9e74a2..3c5c9b62a15 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -67,13 +67,6 @@ H.UpdateDamageIcon() H.updatehealth() return 1 - else if(istype(src, /mob/living/carbon/monkey)) - if (RESIST_HEAT in src.mutations) //fireproof - return 0 - var/mob/living/carbon/monkey/M = src - M.adjustFireLoss(burn_amount) - M.updatehealth() - return 1 else if(istype(src, /mob/living/silicon/ai)) return 0 diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index bcef5aee0b7..9fcea92d006 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -1025,11 +1025,6 @@ var/list/robot_verbs_default = list( //if they are holding or wearing a card that has access, that works if(check_access(H.get_active_hand()) || check_access(H.wear_id)) return 1 - else if(istype(M, /mob/living/carbon/monkey)) - var/mob/living/carbon/monkey/george = M - //they can only hold things :( - if(george.get_active_hand() && istype(george.get_active_hand(), /obj/item/weapon/card/id) && check_access(george.get_active_hand())) - return 1 return 0 /mob/living/silicon/robot/proc/check_access(obj/item/weapon/card/id/I) diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index 38a3243c1bb..ec32d9f4f2e 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -107,7 +107,7 @@ //Removing from inventory if(href_list["remove_inv"]) - if(!Adjacent(usr) || !(ishuman(usr) || ismonkey(usr) || isrobot(usr) || isalienadult(usr))) + if(!Adjacent(usr) || !(ishuman(usr) || issmall(usr) || isrobot(usr) || isalienadult(usr))) return var/remove_from = href_list["remove_inv"] switch(remove_from) @@ -140,7 +140,7 @@ //Adding things to inventory else if(href_list["add_inv"]) - if(!Adjacent(usr) || !(ishuman(usr) || ismonkey(usr) || isrobot(usr) || isalienadult(usr))) + if(!Adjacent(usr) || !(ishuman(usr) || issmall(usr) || isrobot(usr) || isalienadult(usr))) return var/add_to = href_list["add_inv"] if(!usr.get_active_hand()) diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index fde8333ebdb..09a3ceed3d7 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -83,7 +83,7 @@ //Removing from inventory if(href_list["remove_inv"]) - if(get_dist(src,usr) > 1 || !(ishuman(usr) || ismonkey(usr) || isrobot(usr) || isalienadult(usr))) + if(get_dist(src,usr) > 1 || !(ishuman(usr) || issmall(usr) || isrobot(usr) || isalienadult(usr))) return var/remove_from = href_list["remove_inv"] switch(remove_from) @@ -113,7 +113,7 @@ //Adding things to inventory else if(href_list["add_inv"]) - if(get_dist(src,usr) > 1 || !(ishuman(usr) || ismonkey(usr) || isrobot(usr) || isalienadult(usr))) + if(get_dist(src,usr) > 1 || !(ishuman(usr) || issmall(usr) || isrobot(usr) || isalienadult(usr))) return var/add_to = href_list["add_inv"] if(!usr.get_active_hand()) diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 04f5c411957..34d7c63dbd3 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -137,7 +137,7 @@ return //Is the usr's mob type able to do this? - if(ishuman(usr) || ismonkey(usr) || isrobot(usr)) + if(ishuman(usr) || issmall(usr) || isrobot(usr)) //Removing from inventory if(href_list["remove_inv"]) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 3e1fd60f404..56d4ffb9f61 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -308,29 +308,6 @@ return -/mob/living/simple_animal/attack_paw(mob/living/carbon/monkey/M as mob) - if(!(istype(M, /mob/living/carbon/monkey))) - return // Fix for aliens receiving double messages when attacking simple animals. - - ..() - - switch(M.a_intent) - - if ("help") - if (health > 0) - visible_message(" [M] [response_help] [src].") - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - else - M.do_attack_animation(src) - if (istype(src.wear_mask, /obj/item/clothing/mask/muzzle)) - return - playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) - visible_message("[M.name] bites [src]!", \ - "[M.name] bites [src]!") - if (health > -100) - adjustBruteLoss(rand(1, 3)) - return - /mob/living/simple_animal/attack_alien(mob/living/carbon/alien/humanoid/M as mob) switch(M.a_intent) diff --git a/code/modules/mob/mob_cleanup.dm b/code/modules/mob/mob_cleanup.dm index 1cac93904f8..cdc734c49a7 100644 --- a/code/modules/mob/mob_cleanup.dm +++ b/code/modules/mob/mob_cleanup.dm @@ -152,14 +152,6 @@ Put (mob/proc)s here that are in dire need of a code cleanup. // world << "Shoes pass [passed]" */ // - else if(istype(src, /mob/living/carbon/monkey)) - var/mob/living/carbon/monkey/M = src - switch(target_zone) - if(1) - if(M.wear_mask && isobj(M.wear_mask)) - Cl = M.wear_mask - passed = prob((Cl.permeability_coefficient*100) - 1) - //world << "Mask pass [passed]" if(!passed && spread_type == AIRBORNE && !internals) passed = (prob((50*virus.permeability_mod) - 1)) diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index ccbcee33e1e..2430e027f87 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -382,7 +382,7 @@ if(isalien(attacker) && iscarbon(prey)) //Xenomorphs eating carbon mobs return 1 - if(ishuman(attacker) && attacker.get_species() == "Kidan" && istype(prey,/mob/living/carbon/monkey/diona)) //Kidan eating nymphs + if(ishuman(attacker) && attacker.get_species() == "Kidan" && istype(prey,/mob/living/carbon/alien/diona)) //Kidan eating nymphs return 1 if(ishuman(attacker) && attacker.get_species() == "Tajaran" && istype(prey,/mob/living/simple_animal/mouse)) //Tajaran eating mice. Meow! diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 3383ad1eab9..49420198f26 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -5,10 +5,12 @@ return 1 return 0 -/proc/ismonkey(A) - if(A && istype(A, /mob/living/carbon/monkey)) - return 1 - return 0 +/proc/issmall(A) + if(A && istype(A, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = A + if(H.species && H.species.is_small) + return 1 + return 0 /proc/isbrain(A) if(A && istype(A, /mob/living/carbon/brain)) @@ -395,7 +397,7 @@ var/list/intents = list("help","disarm","grab","harm") if(hud_used && hud_used.action_intent) hud_used.action_intent.icon_state = "intent_[a_intent]" - else if(isrobot(src) || ismonkey(src) || islarva(src)) + else if(isrobot(src) || islarva(src)) switch(input) if("help") a_intent = "help" diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 4a17773d012..032011a8fe5 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -481,7 +481,7 @@ return 1 //Friendly Creatures! - if(ispath(MP, /mob/living/carbon/monkey/diona) && !jobban_isbanned(src, "Dionaea")) + if(ispath(MP, /mob/living/carbon/alien/diona) && !jobban_isbanned(src, "Dionaea")) return 1 //Not in here? Must be untested! diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index 141e3d9ee5d..9cc65e3920d 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -326,12 +326,6 @@ proc/blood_splatter(var/target,var/datum/reagent/blood/source,var/large) if(istype(source,/mob/living/carbon/human)) var/mob/living/carbon/human/M = source source = M.get_blood(M.vessel) - else if(istype(source,/mob/living/carbon/monkey)) - var/mob/living/carbon/monkey/donor = source - if(donor.dna) - source = new() - source.data["blood_DNA"] = donor.dna.unique_enzymes - source.data["blood_type"] = donor.dna.b_type // Are we dripping or splattering? var/list/drips = list() diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 757bfc6b40f..889d2f47f62 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -812,8 +812,7 @@ if(!user.client) return 0 if ( ! (istype(user, /mob/living/carbon/human) || \ - istype(user, /mob/living/silicon) || \ - istype(user, /mob/living/carbon/monkey) /*&& ticker && ticker.mode.name == "monkey"*/) ) + istype(user, /mob/living/silicon))) user << "\red You don't have the dexterity to use this [src]!" return 0 if(user.restrained()) diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index a434098da03..ccb5e52ff6c 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -229,7 +229,7 @@ display round(lastgen) and plasmatank amount if(panel_open) user << "You open the access panel." else - user << "You close the access panel." + user << "You close the access panel." else if(istype(O, /obj/item/weapon/storage/part_replacer) && panel_open) exchange_parts(user, O) return @@ -238,8 +238,8 @@ display round(lastgen) and plasmatank amount /obj/machinery/power/port_gen/pacman/emag_act(user as mob) emagged = 1 - emp_act(1) - + emp_act(1) + /obj/machinery/power/port_gen/pacman/attack_hand(mob/user as mob) ..() if (!anchored) @@ -250,9 +250,6 @@ display round(lastgen) and plasmatank amount /obj/machinery/power/port_gen/pacman/attack_ai(mob/user as mob) interact(user) -/obj/machinery/power/port_gen/pacman/attack_paw(mob/user as mob) - interact(user) - /obj/machinery/power/port_gen/pacman/interact(mob/user) if (get_dist(src, user) > 1 ) if (!istype(user, /mob/living/silicon/ai)) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 96feb8cd89d..95eaa69a81f 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -96,7 +96,7 @@ qdel(src) return - if (!user.IsAdvancedToolUser() || istype(user, /mob/living/carbon/monkey/diona)) + if (!user.IsAdvancedToolUser() || istype(user, /mob/living/carbon/alien/diona)) user << "\red You don't have the dexterity to do this!" return if(istype(user, /mob/living)) diff --git a/code/modules/projectiles/projectile/change.dm b/code/modules/projectiles/projectile/change.dm index 0a828d3be11..e002314411a 100644 --- a/code/modules/projectiles/projectile/change.dm +++ b/code/modules/projectiles/projectile/change.dm @@ -33,11 +33,8 @@ var/mob/living/new_mob - var/randomize = pick("monkey","robot","slime","xeno","human") + var/randomize = pick("robot","slime","xeno","human") switch(randomize) - if("monkey") - new_mob = new /mob/living/carbon/monkey(M.loc) - new_mob.universal_speak = 1 if("robot") new_mob = new /mob/living/silicon/robot(M.loc) new_mob.gender = M.gender diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index cc2a94ad1f0..e06ee2faa12 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -148,11 +148,8 @@ proc/wabbajack(mob/living/M) var/mob/living/new_mob - var/randomize = pick("monkey","robot","slime","xeno","human","animal") + var/randomize = pick("robot","slime","xeno","human","animal") switch(randomize) - if("monkey") - new_mob = new /mob/living/carbon/monkey(M.loc) - new_mob.universal_speak = 1 if("robot") if(prob(30)) new_mob = new /mob/living/silicon/robot/syndicate(M.loc) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index b02dbddc52d..61f1db03b17 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -154,13 +154,6 @@ datum if(self.data["virus2"]) blood_prop.virus2 = virus_copylist(self.data["virus2"]) - - else if(istype(self.data["donor"], /mob/living/carbon/monkey)) - var/obj/effect/decal/cleanable/blood/blood_prop = locate() in T - if(!blood_prop) - blood_prop = new(T) - blood_prop.blood_DNA["Non-Human DNA"] = "A+" - else if(istype(self.data["donor"], /mob/living/carbon/alien)) var/obj/effect/decal/cleanable/blood/xeno/blood_prop = locate() in T if(!blood_prop) diff --git a/code/modules/reagents/newchem/toxins.dm b/code/modules/reagents/newchem/toxins.dm index 9cfa220198b..c3020926188 100644 --- a/code/modules/reagents/newchem/toxins.dm +++ b/code/modules/reagents/newchem/toxins.dm @@ -602,10 +602,10 @@ datum/reagent/atrazine/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volu H.adjustToxLoss(50) ..() return - if(ismonkey(M)) + if(issmall(M)) var/mob/living/carbon/monkey/MO = M if(MO.dna) - if(istype(MO,/mob/living/carbon/monkey/diona)) //plantmen monkeys (diona) take EVEN MORE damage + if(istype(MO,/mob/living/carbon/alien/diona)) //plantmen monkeys (diona) take EVEN MORE damage MO.adjustToxLoss(100) ..() return diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index 7f4d494af0f..c199844a083 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -1669,7 +1669,7 @@ bitesize = 12 filling_color = "#ADAC7F" - var/monkey_type = /mob/living/carbon/monkey + var/monkey_type = "Monkey" New() ..() @@ -1687,6 +1687,7 @@ if(wrapped) Unwrap(user) +/* On_Consume(var/mob/M) M << "Something inside of you suddently expands!" @@ -1714,7 +1715,7 @@ else //someone is having a bad day E.createwound(CUT, 30) E.embed(surprise) - else if (ismonkey(M)) + else if (issmall(M)) M.visible_message("[M] suddenly tears in half!") var/mob/living/carbon/monkey/ook = new monkey_type(M.loc) ook.name = "malformed [ook.name]" @@ -1722,6 +1723,7 @@ ook.add_blood(M) M.gib() ..() +*/ water_act(volume, temperature) if(volume >= 5) return Expand() @@ -1729,7 +1731,8 @@ proc/Expand() for(var/mob/M in viewers(src,7)) M << "\red \The [src] expands!" - new monkey_type(src) + var/mob/living/carbon/human/H = new (src) + H.set_species(monkey_type) del(src) proc/Unwrap(mob/user as mob) @@ -1746,32 +1749,34 @@ /obj/item/weapon/reagent_containers/food/snacks/monkeycube/farwacube name = "farwa cube" - monkey_type = /mob/living/carbon/monkey/tajara + monkey_type = "Farwa" /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/farwacube name = "farwa cube" - monkey_type =/mob/living/carbon/monkey/tajara + monkey_type = "Farwa" +/* /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wolpincube name = "wolpin cube" monkey_type = /mob/living/carbon/monkey/vulpkanin /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/wolpincube name = "wolpin cube" monkey_type = /mob/living/carbon/monkey/vulpkanin +*/ /obj/item/weapon/reagent_containers/food/snacks/monkeycube/stokcube name = "stok cube" - monkey_type = /mob/living/carbon/monkey/unathi + monkey_type = "Stok" /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/stokcube name = "stok cube" - monkey_type =/mob/living/carbon/monkey/unathi + monkey_type = "Stok" /obj/item/weapon/reagent_containers/food/snacks/monkeycube/neaeracube name = "neaera cube" - monkey_type =/mob/living/carbon/monkey/skrell + monkey_type = "Neara" /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/neaeracube name = "neaera cube" - monkey_type =/mob/living/carbon/monkey/skrell + monkey_type = "Neara" /obj/item/weapon/reagent_containers/food/snacks/spellburger diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 564207dacca..c44da6e511d 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -44,8 +44,6 @@ ..() update_icon() - attack_paw() - return attack_hand() attackby(obj/item/I as obj, mob/user as mob, params) @@ -361,8 +359,6 @@ ..() update_icon() - attack_paw() - return attack_hand() attackby(obj/item/I as obj, mob/user as mob) diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index ebb92a8474f..0eb8dbafd3f 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -206,15 +206,6 @@ return - // monkeys can only pull the flush lever - attack_paw(mob/user as mob) - if(stat & BROKEN) - return - - flush = !flush - update() - return - // ai as human but can't flush attack_ai(mob/user as mob) interact(user, 1) diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm b/code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm index e4a0992fbcd..3242d7a73ef 100644 --- a/code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm +++ b/code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm @@ -41,8 +41,7 @@ /mob/living/simple_animal/slime,\ /mob/living/simple_animal/crab,\ /mob/living/simple_animal/mouse,\ - /mob/living/simple_animal/hostile/retaliate/goat,\ - /mob/living/carbon/monkey\ + /mob/living/simple_animal/hostile/retaliate/goat\ ) //todo: how the hell is the asteroid permanently powered? diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm index 014fc44cfbf..33b8fd46f6c 100644 --- a/code/modules/virus2/effect.dm +++ b/code/modules/virus2/effect.dm @@ -626,7 +626,7 @@ ..() -var/list/compatible_mobs = list(/mob/living/carbon/human, /mob/living/carbon/monkey) +var/list/compatible_mobs = list(/mob/living/carbon/human) /datum/disease2/effect/horsethroat name = "Horse Throat" stage = 3 diff --git a/code/modules/virus2/helpers.dm b/code/modules/virus2/helpers.dm index 982bf477cc3..cfc6bd1bdb6 100644 --- a/code/modules/virus2/helpers.dm +++ b/code/modules/virus2/helpers.dm @@ -69,11 +69,6 @@ proc/airborne_can_reach(turf/source, turf/target, var/radius=5) if(M.reagents.has_reagent("spaceacillin")) return - if(istype(M,/mob/living/carbon/monkey)) - var/mob/living/carbon/monkey/chimp = M - if (!(chimp.greaterform in disease.affected_species)) - return - if(istype(M,/mob/living/carbon/human)) var/mob/living/carbon/human/chump = M if (!(chump.species.name in disease.affected_species)) diff --git a/icons/mob/human_races/masks/blood_human.dmi b/icons/mob/human_races/masks/blood_human.dmi new file mode 100644 index 0000000000000000000000000000000000000000..dc54991c84d2ba811af34ecf5330e96d7e73dccc GIT binary patch literal 8321 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 literal 0 HcmV?d00001 diff --git a/icons/mob/human_races/masks/dam_human.dmi b/icons/mob/human_races/masks/dam_human.dmi new file mode 100644 index 0000000000000000000000000000000000000000..cb6bf82d98e93ab28869a172c32663c5b6d34834 GIT binary patch literal 6471 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 Z#R8}x8syfRg*yNM002ovPDHLkV1kSBy;=YO literal 0 HcmV?d00001 diff --git a/icons/mob/human_races/masks/dam_mask_monkey.dmi b/icons/mob/human_races/masks/dam_mask_monkey.dmi new file mode 100644 index 0000000000000000000000000000000000000000..4761f21fbd5b8a01f424d1071aa18b3547ff3ea6 GIT binary patch literal 688 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 literal 0 HcmV?d00001 diff --git a/icons/mob/human_races/monkeys/r_farwa.dmi b/icons/mob/human_races/monkeys/r_farwa.dmi new file mode 100644 index 0000000000000000000000000000000000000000..585fa3bcf3538c0e7b6549f920b80316fadd361b GIT binary patch literal 1231 zcmV;=1Tg!FP)+Ax9@&MGt zkc;s;4Yu#hI-1ooDmgOzE9=!b58s#i0Nlc=#FRQxX8-^LnMp)JRCt{2-P>}bFbsfU zY>*3S4)6cAYp31W8+2$xVt4z0?aa=sjpP8yMJ1DI0s!2ll$(?u8n<&;0lMd(^CCr- zJnv6P^PHAtY5!>BvMge*Ah#JxfZq9Qgd%V2n-u*FFO7Z$qy^Ycdj8Ya;>)1<>*?9n z_jOaxVLN?`agN*gd40DQ@V=h)0KM~1xvZD%vKDpxz5>zTW?9bblU5z~uRyzsN{HV1>wBzS0sTE#?pHwR(n;4g z7P$f?U-vupdgreR+7-~-km?6e7OhPwU9Ty21=`FZ^GDu;MSl;bd5&EHwNEX8ideMs;800000000000002MljbDicW8(twLzhGe)mB}B`6(4KR!PI0000000000fZxL0zyBMU_4(hRwIHa2tv>G@ z?@p*0vfiK2pHrXDN7U!-6QDidWNObzabp`t$Adhbbposgq7-;}UjI>gQisxE(p6nx zn*9?n>4$#|hk|sK)Gt(=^pVivpTm(T00000000000C=wU{Q|w$&{cbWK<_nl)gF)F zOtGFHaLa!6Ud$<>(z#V!ja28&DQ@qC)xhIDd*E{g)>xo)ZoPtfyjPunW^w-E#*57c=_KMC~u{M?KNEeTV!Z zfu5xb9^xebSO&ncypuRcs{(S%d00000 z003SjR{vLLjb8WnM61?n|G;7O^G>4c*ZK!WFZ+Ay`ps{x{x?y1rNfu~9Z8~3jb3*9 z2d3*|kDdNX!E(QNdTfrD3s-;D{(->8-LEa_wUS%c|4Z4snr62#VC;RX;i|oIulNB{ t^c43Izd!e9-U5vQ;S>M>0091Te*lLd81x(XM(qFq002ovPDHLkV1i?3PF4T_ literal 0 HcmV?d00001 diff --git a/icons/mob/human_races/monkeys/r_monkey.dmi b/icons/mob/human_races/monkeys/r_monkey.dmi new file mode 100644 index 0000000000000000000000000000000000000000..c405a94978d8bfa84bcb2166cfeae7695fae3daa GIT binary patch literal 952 zcmV;p14sOcP)%0000aP)t-sz`($f zNC5wtGcy1HnKJ;B007JY0AXQa;NakZfPnwZW&i-06<9ti00001bW%=J06^y0W&i*H zsCrabbVOxyV{&P5bZKvH004NLjgq?x!!Qg*XZtHmvX{QrE+wI4Xnw&MEI%NzKo;%q zH%W(1CED(VqazJ!&AopNqv@W5egV~t#oWyGaMbFZJ*TBy&RQkNG4Z!lb_`2w$R<~O zqm|E8*D0+6xf#}c`eBm{BO4G|U=v|v9nAungd#gZ6u2Z5BUQ9P$nD=233Cy1`+E~O zFVJn+Ut4SXvD;qi11C%2nK)6X7~4>!!Ye8& zTWgwBS$RSogpwL0=qdSwxTJMQpfi8quftTC_hvln)fgFxbEO}L&eG3d{Ayxi!sbvfMh&4)=INdgJxdtEW)+ z000000002sSPUo8z{b^KYgkJ`RqL6P(8qZl0WL8xa-vX*%86y2QN^F9I{*Lx0O0?| zcJ-$HGE#Zj{8{1#Vb6}b14Df(FQ-5H2CPeMV3fYz8ThD4=H>G3IANHF8(4G)2Kr>4 zZiV?al^-_e`#gk;)aC9CBt<0*KBq4C(jSPMQkRi5?XtADBAoWAqz zU8c6qtM}ZQ4`2OD{oC4QYx~~m0QY9PTi@GnW@8yJcj5%zejMw7_J!C$p?|xfHv0)$ zr@rl}JCyp(iT5T`Tkmy%7mrn`fBP6;i}k^ktUsN6kO8MxZx87=My*G6^hHK}(<$`> z00000006+(6WK3l4F-6-{U1#Ihkz2p15zMtQmuU4WyQ}y}ko5?jw{Qv*}0LRBR zO-HRyK4qiS|8%x~xD>T>vR?m`0hjC1_rv*(z1VEzPcof2>a-WXbin2z{Lkq^zp=yh z4`FDXIBEQ|F8}1O*ORGSFYy~QuV3YkUbpMD45;gcTrczM)AXory!uV3YLxl`00000 aj>vC&)tkk)Y|Z5W0000%0000aP)t-sz`(!& zGXVc)0RNc)GXOLH%m6c)0RNdYVPRpBNB}bc0N~)@MpRCo00001bW%=J06^y0W&i*H zsd`jcbVOxyV{&P5bZKvH004NLjgq?x!!Qg*XZtHmvX{QrE+wI4Xnw&M`~)WgS+u|3 zq~1Ez+U|v;BLwQzeSA!_8lIDUIV=fQbyL^FQHpo66t{9YOA%cPk!mSq$ZfHU&RD&4 zQrLuLpOV6(S=^paKbUV~1XzHft6bX`5Yo!Ca9gWLcB0^mtRK~#90?VLew+b|GCIWkfpU6~YMpk3J( zyss(i1U*4xIP1C#_Xb(pD3EisH)w8H2SpLi3_;c)l^W=OtIUv}q7)_2e33E+fa|~- znxlTUFxJAbWKH2|Ly`jypS%-1o_hD?>kDF9nsyEc#Z`m1iyDdKh z|CL=s`_S?JW%_f6{TFtLT<`hs^kK#?;hqmzsyAdsyj&#Pjpd0_{W&pB$CQan^#A|> z000000079LtLe+?>#V-9E*ZPEtnXXqK$Pmu&2q)!iSJq53QNa0&rGILy_xK`JRZaV z1MhFzElZT@&E!rDAO>vjG!aG6=41j|lSvB7T7~2rk=YlgEY*z-+JD z--!DBpu3dLU>g7V&k@B0~TYL}NYd^wDoLYBmOjw(Y zJpo+^oe96u;6|=ONPZ#W85BHBkLa0(|N&sZf2i4GV370EW000000000171L3p%+rOwAsz2I?_2-XyzJIP> zyqK^=kNE|oPayCBNN&`QQN3gj{D7!mAgOLzJiWXOCi^qrU)nY~y}W6w+dhvkh6Ejs zx?NV}k+-X51b#rwFHoLDZIgoiBZ=KYDu>nG0001f^9!BsVS?JHSHJ)O002ovPDHLk FV1kGd+91<#II4Ob97LNs%@ME$_(q00001 zbW%=J06^y0W&i*HsCrabbVOxyV{&P5bZKvH004NLjnX>`!!Qg6;MqQfN%qp$+NC6v z49yjc!B21^kVSj_CiT#*)+WKHA0gDM`}mkZY!TqZIFCDQ?Z>EJbuF zM5;|8LvAZO)EBPf6j?EN-t)KbE;Hn$q1n>V?OAlM!G6MqG96ynv8a zMqYL8ysWbejMMRy!S-hPpX${(58s#i0I*o9#5St{t^fc7FG)l}RCt{2-P?BCAP|LN zoeTmS>HXifprlRG&cI~JF3$4*T}Hs(mh9vL>J9?{00000007`MjiYJUG|4|6XXVOY zv*)osOs&yc{%nJ3Sq#&2j5s}~&xQqZ$XvezY7Hg$ZVk%(#(^?i!S`+e0000000000UdbqLe9Xq#&0U9aUc~inJ9C-5Ke99zn2ei$^6rXtGo_s} zFVcuvH0HYp!Kr?|kQ6b*j7Q z*DuZ4eOV z000000001hCa3T0e^J}v{?Yk2+s=E8w}&*iN50$QRx7u=;C3}X`0D9~cboS?YtTJE zL?3IXkjfbqA z75YK7{Wzo~z6W!Gn5P>W#GDYt0=@H36-aLd+706RRzP@;z4HfmEaCNodX)m@9q28O zpgaIy-hw%8y27+g@kYHHU{C%n(I9XrqlI@^4$#_9Zz0ov8Z^LN4a z>2yxXH-5Oa8mIFC000000001ZCF=M38^%rZ{Zh0MhJMzUFwDY8^W;&QJR0wSB}E=H zjdxl;n}ye4TK_OgcVJvhb4>-M^>aT{LE9ZzgthE9KrU!{3y3pqqm2Db!)9sFB>vRS r*w3<(^Z~W9O+EKg0RR9106*O?uU{v2114Aw00000NkvXXu0mjf@bDQ+ literal 0 HcmV?d00001 diff --git a/paradise.dme b/paradise.dme index 95230e48fcf..4ec576d4155 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1264,6 +1264,13 @@ #include "code\modules\mob\living\carbon\alien\login.dm" #include "code\modules\mob\living\carbon\alien\logout.dm" #include "code\modules\mob\living\carbon\alien\say.dm" +#include "code\modules\mob\living\carbon\alien\diona\diona.dm" +#include "code\modules\mob\living\carbon\alien\diona\diona_attacks.dm" +#include "code\modules\mob\living\carbon\alien\diona\diona_powers.dm" +#include "code\modules\mob\living\carbon\alien\diona\life.dm" +#include "code\modules\mob\living\carbon\alien\diona\progression.dm" +#include "code\modules\mob\living\carbon\alien\diona\say_understands.dm" +#include "code\modules\mob\living\carbon\alien\diona\update_icons.dm" #include "code\modules\mob\living\carbon\alien\humanoid\alien_powers.dm" #include "code\modules\mob\living\carbon\alien\humanoid\emote.dm" #include "code\modules\mob\living\carbon\alien\humanoid\empress.dm" @@ -1309,13 +1316,16 @@ #include "code\modules\mob\living\carbon\human\inventory.dm" #include "code\modules\mob\living\carbon\human\life.dm" #include "code\modules\mob\living\carbon\human\login.dm" +#include "code\modules\mob\living\carbon\human\npcs.dm" #include "code\modules\mob\living\carbon\human\say.dm" #include "code\modules\mob\living\carbon\human\update_icons.dm" #include "code\modules\mob\living\carbon\human\whisper.dm" #include "code\modules\mob\living\carbon\human\species\apollo.dm" #include "code\modules\mob\living\carbon\human\species\golem.dm" +#include "code\modules\mob\living\carbon\human\species\monkey.dm" #include "code\modules\mob\living\carbon\human\species\plasmaman.dm" #include "code\modules\mob\living\carbon\human\species\shadow.dm" +#include "code\modules\mob\living\carbon\human\species\station.dm" #include "code\modules\mob\living\carbon\metroid\death.dm" #include "code\modules\mob\living\carbon\metroid\emote.dm" #include "code\modules\mob\living\carbon\metroid\examine.dm" @@ -1327,16 +1337,6 @@ #include "code\modules\mob\living\carbon\metroid\say.dm" #include "code\modules\mob\living\carbon\metroid\subtypes.dm" #include "code\modules\mob\living\carbon\metroid\update_icons.dm" -#include "code\modules\mob\living\carbon\monkey\death.dm" -#include "code\modules\mob\living\carbon\monkey\diona.dm" -#include "code\modules\mob\living\carbon\monkey\emote.dm" -#include "code\modules\mob\living\carbon\monkey\examine.dm" -#include "code\modules\mob\living\carbon\monkey\inventory.dm" -#include "code\modules\mob\living\carbon\monkey\life.dm" -#include "code\modules\mob\living\carbon\monkey\login.dm" -#include "code\modules\mob\living\carbon\monkey\monkey.dm" -#include "code\modules\mob\living\carbon\monkey\say.dm" -#include "code\modules\mob\living\carbon\monkey\update_icons.dm" #include "code\modules\mob\living\silicon\death.dm" #include "code\modules\mob\living\silicon\login.dm" #include "code\modules\mob\living\silicon\say.dm"