From d26800d29c162590fb6c6dd8bb519874b9a6e291 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 25 Mar 2015 02:15:45 +1030 Subject: [PATCH] Preliminary work on converting all monkeys to a human subspecies. --- baystation12.dme | 10 +- .../components/unary/vent_pump.dm | 15 - code/__HELPERS/unsorted.dm | 2 - code/_onclick/other_mobs.dm | 39 -- code/datums/mind.dm | 7 +- .../gamemodes/changeling/changeling_powers.dm | 26 +- code/game/gamemodes/cult/runes.dm | 21 - code/game/gamemodes/events.dm | 7 - code/game/gamemodes/objective.dm | 3 - code/game/jobs/access.dm | 5 - code/game/machinery/biogenerator.dm | 2 +- code/game/machinery/cryopod.dm | 2 +- code/game/machinery/kitchen/gibber.dm | 3 +- code/game/machinery/machinery.dm | 3 +- code/game/objects/effects/mines.dm | 2 +- code/game/objects/items.dm | 37 -- code/game/objects/items/devices/PDA/PDA.dm | 3 - code/game/objects/items/devices/flashlight.dm | 2 +- code/game/objects/items/stacks/medical.dm | 3 +- .../objects/items/weapons/dna_injector.dm | 2 +- code/game/objects/items/weapons/handcuffs.dm | 14 - code/game/objects/items/weapons/twohanded.dm | 3 - code/game/objects/structures/kitchen_spike.dm | 27 +- code/game/supplyshuttle.dm | 2 +- code/game/turfs/simulated.dm | 4 +- code/game/verbs/suicide.dm | 27 - code/modules/admin/admin.dm | 19 - code/modules/admin/admin_verbs.dm | 7 +- code/modules/admin/topic.dm | 40 +- code/modules/admin/verbs/randomverbs.dm | 13 - code/modules/events/radiation_storm.dm | 2 - .../mob/living/carbon/human/human_species.dm | 18 +- .../mob/living/carbon/human/inventory.dm | 4 - .../living/carbon/human/species/species.dm | 4 +- .../carbon/human/species/station/monkey.dm | 25 + .../carbon/human/species/station/slime.dm | 1 + .../carbon/human/species/station/station.dm | 10 +- .../modules/mob/living/carbon/monkey/death.dm | 8 - .../modules/mob/living/carbon/monkey/emote.dm | 132 ----- .../mob/living/carbon/monkey/examine.dm | 39 -- .../mob/living/carbon/monkey/inventory.dm | 238 -------- code/modules/mob/living/carbon/monkey/life.dm | 511 ------------------ .../modules/mob/living/carbon/monkey/login.dm | 4 - .../mob/living/carbon/monkey/monkey.dm | 291 ---------- code/modules/mob/living/carbon/monkey/npc.dm | 89 --- .../mob/living/carbon/monkey/update_icons.dm | 129 ----- code/modules/mob/living/living.dm | 7 - .../modules/mob/living/silicon/robot/robot.dm | 5 - code/modules/mob/mob_cleanup.dm | 8 - code/modules/mob/mob_helpers.dm | 10 +- code/modules/mob/transform_procs.dm | 31 +- code/modules/organs/blood.dm | 6 - .../particle_accelerator/particle.dm | 6 - code/modules/projectiles/projectile/change.dm | 5 +- code/modules/reagents/Chemistry-Reagents.dm | 14 - .../reagent_containers/food/snacks.dm | 25 +- .../artifact/artifact_autocloner.dm | 3 +- code/modules/spells/horsemask.dm | 4 +- code/modules/spells/mind_transfer.dm | 2 +- maps/exodus-1.dmm | 2 +- maps/exodus-2.dmm | 2 +- maps/exodus-5.dmm | 12 +- 62 files changed, 124 insertions(+), 1873 deletions(-) create mode 100644 code/modules/mob/living/carbon/human/species/station/monkey.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/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/update_icons.dm diff --git a/baystation12.dme b/baystation12.dme index fbe5aba289..737748d081 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -245,7 +245,6 @@ #include "code\game\dna\dna_modifier.dm" #include "code\game\dna\genes\disabilities.dm" #include "code\game\dna\genes\gene.dm" -#include "code\game\dna\genes\monkey.dm" #include "code\game\dna\genes\powers.dm" #include "code\game\gamemodes\events.dm" #include "code\game\gamemodes\game_mode.dm" @@ -1129,6 +1128,7 @@ #include "code\modules\mob\living\carbon\human\species\outsider\shadow.dm" #include "code\modules\mob\living\carbon\human\species\outsider\vox.dm" #include "code\modules\mob\living\carbon\human\species\station\golem.dm" +#include "code\modules\mob\living\carbon\human\species\station\monkey.dm" #include "code\modules\mob\living\carbon\human\species\station\slime.dm" #include "code\modules\mob\living\carbon\human\species\station\station.dm" #include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_embryo.dm" @@ -1148,14 +1148,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\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\update_icons.dm" #include "code\modules\mob\living\silicon\death.dm" #include "code\modules\mob\living\silicon\laws.dm" #include "code\modules\mob\living\silicon\login.dm" diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index 2066a6f9bf..cbaeb3bf9c 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -423,18 +423,3 @@ initial_loc.air_vent_names -= id_tag ..() return - -/* - Alt-click to vent crawl - Monkeys, aliens, slimes and mice. - This is a little buggy but somehow that just seems to plague ventcrawl. - I am sorry, I don't know why. -*/ -// Commenting this out for now, it's not critical, stated to be buggy, and seems like -// a really clumsy way of doing this. ~Z -/*/obj/machinery/atmospherics/unary/vent_pump/AltClick(var/mob/living/ML) - if(istype(ML)) - var/list/ventcrawl_verbs = list(/mob/living/carbon/monkey/verb/ventcrawl, /mob/living/carbon/alien/verb/ventcrawl, /mob/living/carbon/slime/verb/ventcrawl,/mob/living/simple_animal/mouse/verb/ventcrawl) - if(length(ML.verbs & ventcrawl_verbs)) // alien queens have this removed, an istype would be complicated - ML.handle_ventcrawl(src) - return - ..()*/ diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index c00bb17b1d..16f61d9fec 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -460,8 +460,6 @@ Turf and target are seperate in case you want to teleport some distance from a t moblist.Add(M) for(var/mob/new_player/M in sortmob) moblist.Add(M) - for(var/mob/living/carbon/monkey/M in sortmob) - moblist.Add(M) for(var/mob/living/carbon/slime/M in sortmob) moblist.Add(M) for(var/mob/living/simple_animal/M in sortmob) diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 496553558d..e8c868bb72 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -52,45 +52,6 @@ /mob/living/RestrainedClickOn(var/atom/A) return -/* - Monkeys -*/ - - -/mob/living/carbon/monkey/UnarmedAttack(var/atom/A, var/proximity) - - if(!..()) - return - - A.attack_hand(src) - -/* - Monkey RestrainedClickOn() was apparently the - one and only use of all of the restrained click code - (except to stop you from doing things while handcuffed); - moving it here instead of various hand_p's has simplified - things considerably -*/ -/mob/living/carbon/monkey/RestrainedClickOn(var/atom/A) - if(a_intent != "harm" || !ismob(A)) return - if(istype(wear_mask, /obj/item/clothing/mask/muzzle)) - return - var/mob/living/carbon/ML = A - var/dam_zone = ran_zone(pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")) - var/armor = ML.run_armor_check(dam_zone, "melee") - if(prob(75)) - ML.apply_damage(rand(1,3), BRUTE, dam_zone, armor) - for(var/mob/O in viewers(ML, null)) - O.show_message("\red [name] has bit [ML]!", 1) - if(armor >= 2) return - if(ismonkey(ML)) - for(var/datum/disease/D in viruses) - if(istype(D, /datum/disease/jungle_fever)) - ML.contract_disease(D,1,0) - else - for(var/mob/O in viewers(ML, null)) - O.show_message("\red [src] has attempted to bite [ML]!", 1) - /* Aliens */ diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 21881e281c..e7acc0b4df 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -320,6 +320,7 @@ datum/mind H.implant_loyalty(H, override = TRUE) log_admin("[key_name_admin(usr)] has loyalty implanted [current].") else + /* else if (href_list["monkey"]) var/mob/living/L = current if (L.monkeyizing) @@ -369,7 +370,7 @@ datum/mind src = mobfinder.loc:mind del(mobfinder) current.radiation -= 50 - + */ else if (href_list["silicon"]) BITSET(current.hud_updateflag, SPECIALROLE_HUD) switch(href_list["silicon"]) @@ -540,10 +541,6 @@ datum/mind ..() if(!mind.assigned_role) mind.assigned_role = "Assistant" //defualt -//MONKEY -/mob/living/carbon/monkey/mind_initialize() - ..() - //slime /mob/living/carbon/slime/mind_initialize() ..() diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm index 066604834e..ab1b0cbfd5 100644 --- a/code/game/gamemodes/changeling/changeling_powers.dm +++ b/code/game/gamemodes/changeling/changeling_powers.dm @@ -352,35 +352,15 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E sleep(48) del(animation) - var/mob/living/carbon/monkey/O = new /mob/living/carbon/monkey(src) - O.dna = C.dna.Clone() - C.dna = null - for(var/obj/item/W in C) C.drop_from_inventory(W) for(var/obj/T in C) del(T) - O.loc = C.loc - O.name = "monkey ([copytext(md5(C.real_name), 2, 6)])" - O.setToxLoss(C.getToxLoss()) - O.adjustBruteLoss(C.getBruteLoss()) - O.setOxyLoss(C.getOxyLoss()) - O.adjustFireLoss(C.getFireLoss()) - O.stat = C.stat - O.a_intent = "hurt" - for(var/obj/item/weapon/implant/I in implants) - I.loc = O - I.implanted = O - - C.mind.transfer_to(O) - - O.make_changeling(1) - O.verbs += /mob/proc/changeling_lesser_transform - O.changeling_update_languages(changeling.absorbed_languages) - + var/mob/living/carbon/human/H = src + if(istype(H)) + H.set_species(H.species.primitive_form ? H.species.primitive_form : "Monkey") feedback_add_details("changeling_powers","LF") - del(C) return 1 diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index b4b5ae4d51..8008549d36 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -705,27 +705,6 @@ var/list/sacrificed = list() H.dust()//To prevent the MMI from remaining else H.gib() - for(var/mob/living/carbon/monkey/M in src.loc) - if (cult) - if(M.mind == cult.sacrifice_target) - if(cultsinrange.len >= 3) - sacrificed += M.mind - usr << "\red The Geometer of Blood accepts this sacrifice, your objective is now complete." - else - usr << "\red Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual." - continue - else - if(prob(20)) - usr << "\red The Geometer of Blood accepts your meager sacrifice." - cult.grant_runeword(usr) - else - usr << "\red The Geometer of blood accepts this sacrifice." - usr << "\red However, a mere monkey is not enough to satisfy Him." - else - usr << "\red The Geometer of Blood accepts your meager sacrifice." - if(prob(20)) - cult.grant_runeword(usr) - M.gib() /////////////////////////////////////////SIXTEENTH RUNE diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm index 26e38476b7..feed6092e2 100644 --- a/code/game/gamemodes/events.dm +++ b/code/game/gamemodes/events.dm @@ -233,13 +233,6 @@ else randmutg(H) domutcheck(H,null,MUTCHK_FORCED) - for(var/mob/living/carbon/monkey/M in living_mob_list) - var/turf/T = get_turf(M) - if(!T) - continue - if(isNotStationLevel(T.z)) - continue - M.apply_effect((rand(15,75)),IRRADIATE,0) sleep(100) command_announcement.Announce("High levels of radiation detected near the station. Please report to the Med-bay if you feel strange.", "Anomaly Alert", new_sound = 'sound/AI/radiation.ogg') diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index b6b638c578..995648e4fe 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -649,9 +649,6 @@ datum/objective/capture continue captured_amount += worth - for(var/mob/living/carbon/monkey/M in A)//Monkeys are almost worthless, you failure. - captured_amount+=0.1 - for(var/mob/living/carbon/alien/larva/M in A)//Larva are important for research. if(M.stat==2) captured_amount+=0.5 diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index 95bdf512e1..6d2b5e33d6 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -101,11 +101,6 @@ //if they are holding or wearing a card that has access, that works if(src.check_access(H.get_active_hand()) || src.check_access(H.wear_id)) return 1 - else if(istype(M, /mob/living/carbon/monkey)) - var/mob/living/carbon/george = M - //they can only hold things :( - if(src.check_access(george.get_active_hand())) - return 1 return 0 /obj/item/proc/GetAccess() diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm index 8fd27904ce..a8df2abaad 100644 --- a/code/game/machinery/biogenerator.dm +++ b/code/game/machinery/biogenerator.dm @@ -214,7 +214,7 @@ if("cashbag") new/obj/item/weapon/storage/bag/cash(loc) if("monkey") - new/mob/living/carbon/monkey(loc) + new/mob/living/carbon/human/monkey(loc) processing = 0 menustat = "complete" update_icon() diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index c6c5b922b9..fcece506c3 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -175,7 +175,7 @@ var/on_store_message = "has entered long-term storage." var/on_store_name = "Cryogenic Oversight" var/on_enter_occupant_message = "You feel cool air surround you. You go numb as your senses turn inward." - var/allow_occupant_types = list(/mob/living/carbon/human, /mob/living/carbon/monkey) + var/allow_occupant_types = list(/mob/living/carbon/human) var/disallow_occupant_types = list() var/mob/occupant = null // Person waiting to be despawned. diff --git a/code/game/machinery/kitchen/gibber.dm b/code/game/machinery/kitchen/gibber.dm index 52c1bdc380..b7dc76287e 100644 --- a/code/game/machinery/kitchen/gibber.dm +++ b/code/game/machinery/kitchen/gibber.dm @@ -195,9 +195,8 @@ slab_type = critter.meat_type else if(istype(src.occupant,/mob/living/carbon/human)) slab_name = src.occupant.real_name + // /obj/item/weapon/reagent_containers/food/snacks/meat/monkey Move to species datum. slab_type = /obj/item/weapon/reagent_containers/food/snacks/meat/human - else if(istype(src.occupant, /mob/living/carbon/monkey)) - slab_type = /obj/item/weapon/reagent_containers/food/snacks/meat/monkey // Small mobs don't give as much nutrition. if(src.occupant.small) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 101e699507..8836cb90f7 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -215,8 +215,7 @@ Class Procs: if(user.lying || user.stat) return 1 if ( ! (istype(usr, /mob/living/carbon/human) || \ - istype(usr, /mob/living/silicon) || \ - istype(usr, /mob/living/carbon/monkey)) ) + istype(usr, /mob/living/silicon))) usr << "\red You don't have the dexterity to do this!" return 1 /* diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index de35684991..e8bf9348f6 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -19,7 +19,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/game/objects/items.dm b/code/game/objects/items.dm index 8879eeb2b7..b52c5930f9 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -417,35 +417,6 @@ return 0 //Unsupported slot //END HUMAN - else if(ismonkey(M)) - //START MONKEY - var/mob/living/carbon/monkey/MO = M - switch(slot) - if(slot_l_hand) - if(MO.l_hand) - return 0 - return 1 - if(slot_r_hand) - if(MO.r_hand) - return 0 - return 1 - if(slot_wear_mask) - if(MO.wear_mask) - return 0 - if( !(slot_flags & SLOT_MASK) ) - return 0 - return 1 - if(slot_back) - if(MO.back) - return 0 - if( !(slot_flags & SLOT_BACK) ) - return 0 - return 1 - return 0 //Unsupported slot - - //END MONKEY - - /obj/item/verb/verb_pickup() set src in oview(1) set category = "Object" @@ -507,14 +478,6 @@ user << "\red You're going to need to remove the eye covering first." return - var/mob/living/carbon/monkey/Mo = M - if(istype(Mo) && ( \ - (Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \ - )) - // you can't stab someone in the eyes wearing a mask! - user << "\red You're going to need to remove the eye covering first." - return - if(!M.has_eyes()) user << "\red You cannot locate any eyes on [M]!" return diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 2825045fb2..cef5307ace 100755 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -1218,9 +1218,6 @@ var/global/list/obj/item/device/pda/PDAs = list() if(2) if (!istype(C:dna, /datum/dna)) user << "\blue No fingerprints found on [C]" - else if(!istype(C, /mob/living/carbon/monkey)) - if(!isnull(C:gloves)) - user << "\blue No fingerprints found on [C]" else user << text("\blue [C]'s Fingerprints: [md5(C:dna.uni_identity)]") if ( !(C:blood_DNA) ) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 0f6d0abb10..fb3edec873 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -75,7 +75,7 @@ user.visible_message("[user] directs [src] to [M]'s eyes.", \ "You direct [src] to [M]'s eyes.") - if(istype(M, /mob/living/carbon/human) || istype(M, /mob/living/carbon/monkey)) //robots and aliens are unaffected + if(istype(M, /mob/living/carbon/human)) //robots and aliens are unaffected if(M.stat == DEAD || M.sdisabilities & BLIND) //mob is dead or fully blind user << "[M] pupils does not react to the light!" else if(XRAY in M.mutations) //mob has X-RAY vision diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 5a071ae818..27e3eea6f7 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -16,8 +16,7 @@ return 1 if ( ! (istype(user, /mob/living/carbon/human) || \ - istype(user, /mob/living/silicon) || \ - istype(user, /mob/living/carbon/monkey)) ) + istype(user, /mob/living/silicon)) ) user << "\red You don't have the dexterity to do this!" return 1 diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index 651cc2e27f..dfd221650b 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -151,7 +151,7 @@ for(var/mob/O in viewers(M, null)) O.show_message(text("\red [] has been injected with [] by [].", M, src, user), 1) //Foreach goto(192) - if (!(istype(M, /mob/living/carbon/human) || istype(M, /mob/living/carbon/monkey))) + if (!(istype(M, /mob/living/carbon/human))) user << "\red Apparently it didn't work." return diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index 5ed83d086b..42249d1435 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -67,20 +67,6 @@ O.process() return - if (ismonkey(target)) - var/mob/living/carbon/monkey/M = target - var/obj/effect/equip_e/monkey/O = new /obj/effect/equip_e/monkey( ) - O.source = user - O.target = M - O.item = user.get_active_hand() - O.s_loc = user.loc - O.t_loc = M.loc - O.place = "handcuff" - M.requests += O - spawn( 0 ) - O.process() - return - var/last_chew = 0 /mob/living/carbon/human/RestrainedClickOn(var/atom/A) if (A != src) return ..() diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index 2ccd78d361..b02260e251 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -63,9 +63,6 @@ unwield() /obj/item/weapon/twohanded/attack_self(mob/user as mob) - if( istype(user,/mob/living/carbon/monkey) ) - user << "It's too heavy for you to wield fully." - return ..() diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index f480cdd977..c62758bf18 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -16,19 +16,20 @@ attackby(obj/item/weapon/grab/G as obj, mob/user as mob) if(!istype(G, /obj/item/weapon/grab)) return - if(istype(G.affecting, /mob/living/carbon/monkey)) - if(src.occupied == 0) - src.icon_state = "spikebloody" - src.occupied = 1 - src.meat = 5 - src.meattype = 1 - for(var/mob/O in viewers(src, null)) - O.show_message(text("\red [user] has forced [G.affecting] onto the spike, killing them instantly!")) - del(G.affecting) - del(G) - - else - user << "\red The spike already has something on it, finish collecting its meat first!" + if(istype(G.affecting, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = G.affecting + if(H.species.is_small) + if(src.occupied == 0) + src.icon_state = "spikebloody" + src.occupied = 1 + src.meat = 5 + src.meattype = 1 + for(var/mob/O in viewers(src, null)) + O.show_message(text("\red [user] has forced [G.affecting] onto the spike, killing them instantly!")) + del(G.affecting) + del(G) + else + user << "\red The spike already has something on it, finish collecting its meat first!" else if(istype(G.affecting, /mob/living/carbon/alien)) if(src.occupied == 0) src.icon_state = "spikebloodygreen" diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index 72107e6649..485c1d4544 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -63,7 +63,7 @@ var/list/mechtoys = list( if(istype(A, /mob/living)) // You Shall Not Pass! var/mob/living/M = A - if(!M.lying && !istype(M, /mob/living/carbon/monkey) && !istype(M, /mob/living/carbon/slime) && !istype(M, /mob/living/simple_animal/mouse) && !istype(M, /mob/living/silicon/robot/drone)) //If your not laying down, or a small creature, no pass. + if(!M.lying && !istype(M, /mob/living/carbon/slime) && !istype(M, /mob/living/simple_animal/mouse) && !istype(M, /mob/living/silicon/robot/drone)) //If your not laying down, or a small creature, no pass. return 0 return ..() diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 0aabdae3d0..9546bf9ba1 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -118,9 +118,7 @@ // Only adds blood on the floor -- Skie /turf/simulated/proc/add_blood_floor(mob/living/carbon/M as mob) - if(istype(M, /mob/living/carbon/monkey)) - blood_splatter(src,M,1) - else if( istype(M, /mob/living/carbon/alien )) + if( istype(M, /mob/living/carbon/alien )) var/obj/effect/decal/cleanable/blood/xeno/this = new /obj/effect/decal/cleanable/blood/xeno(src) this.blood_DNA["UNKNOWN BLOOD"] = "X*" else if( istype(M, /mob/living/silicon/robot )) diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm index ab3c8dcc80..afc576ed4f 100644 --- a/code/game/verbs/suicide.dm +++ b/code/game/verbs/suicide.dm @@ -110,33 +110,6 @@ death(0) suiciding = 0 -/mob/living/carbon/monkey/verb/suicide() - set hidden = 1 - - if (stat == 2) - src << "You're already dead!" - return - - if (!ticker) - src << "You can't commit suicide before the game starts!" - return - - if (suiciding) - src << "You're already committing suicide! Be patient!" - return - - var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") - - if(confirm == "Yes") - if(!canmove || restrained()) - src << "You can't commit suicide whilst restrained! ((You can type Ghost instead however.))" - return - suiciding = 1 - //instead of killing them instantly, just put them at -175 health and let 'em gasp for a while - viewers(src) << "\red [src] is attempting to bite \his tongue. It looks like \he's trying to commit suicide." - adjustOxyLoss(max(175- getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) - updatehealth() - /mob/living/silicon/ai/verb/suicide() set hidden = 1 diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index bbee0157d6..593ab5ec5f 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -953,25 +953,6 @@ var/global/floorIsLava = 0 return 0 -/* -/datum/admins/proc/get_sab_desc(var/target) - switch(target) - if(1) - return "Destroy at least 70% of the phoron canisters on the station" - if(2) - return "Destroy the AI" - if(3) - var/count = 0 - for(var/mob/living/carbon/monkey/Monkey in world) - if(Monkey.z in station_levels) - count++ - return "Kill all [count] of the monkeys on the station" - if(4) - return "Cut power to at least 80% of the station" - else - return "Error: Invalid sabotage target: [target]" -*/ - /datum/admins/proc/spawn_fruit() set category = "Debug" set desc = "Spawn the product of a seed." diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 5fb0d5f231..8176ca8418 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -602,9 +602,10 @@ var/list/admin_verbs_mentor = list( var/mob/living/carbon/human/H = T if (H.species) D.affected_species = list(H.species.name) - if(istype(T,/mob/living/carbon/monkey)) - var/mob/living/carbon/monkey/M = T - D.affected_species = list(M.greaterform) + if(H.species.primitive_form) + D.affected_species |= H.species.primitive_form + if(H.species.greater_form) + D.affected_species |= H.species.greater_form infect_virus2(T,D,1) feedback_add_details("admin_verb","GD2") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index b40d441ef2..1ecec9ff9c 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -266,7 +266,7 @@ if("nymph") M.change_mob_type( /mob/living/carbon/alien/diona , null, null, delmob ) if("human") M.change_mob_type( /mob/living/carbon/human , null, null, delmob, href_list["species"]) if("slime") M.change_mob_type( /mob/living/carbon/slime , null, null, delmob ) - if("monkey") M.change_mob_type( /mob/living/carbon/monkey , null, null, delmob ) + if("monkey") M.change_mob_type( /mob/living/carbon/human/monkey , null, null, delmob ) if("robot") M.change_mob_type( /mob/living/silicon/robot , null, null, delmob ) if("cat") M.change_mob_type( /mob/living/simple_animal/cat , null, null, delmob ) if("runtime") M.change_mob_type( /mob/living/simple_animal/cat/fluff/Runtime , null, null, delmob ) @@ -1183,44 +1183,6 @@ show_player_panel(H) //H.regenerate_icons() -/***************** BEFORE************** - - if (href_list["l_players"]) - var/dat = "Name/Real Name/Key/IP:
" - for(var/mob/M in world) - var/foo = "" - if (ismob(M) && M.client) - if(!M.client.authenticated && !M.client.authenticating) - foo += text("\[ Authorize | ", src, M) - else - foo += text("\[ Authorized | ") - if(M.start) - if(!istype(M, /mob/living/carbon/monkey)) - foo += text("Monkeyize | ", src, M) - else - foo += text("Monkeyized | ") - if(istype(M, /mob/living/silicon/ai)) - foo += text("Is an AI | ") - else - foo += text("Make AI | ", src, M) - if(isNotAdminLevel(M.z)) - foo += text("Prison | ", src, M) - foo += text("Maze | ", src, M) - else - foo += text("On Z = [M.z] | ") - else - foo += text("Hasn't Entered Game | ") - foo += text("Heal/Revive | ", src, M) - - foo += text("Say \]", src, M) - dat += text("N: [] R: [] (K: []) (IP: []) []
", M.name, M.real_name, (M.client ? M.client : "No client"), M.lastKnownIP, foo) - - usr << browse(dat, "window=players;size=900x480") - -*****************AFTER******************/ - -// Now isn't that much better? IT IS NOW A PROC, i.e. kinda like a big panel like unstable - else if(href_list["adminplayeropts"]) var/mob/M = locate(href_list["adminplayeropts"]) show_player_panel(M) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 07d8009219..4ea4ad998b 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -368,19 +368,6 @@ Traitors and the like can also be revived with the previous role mostly intact. usr << "There is no active key like that in the game or the person is not currently a ghost." return - if(G_found.mind && !G_found.mind.active) //mind isn't currently in use by someone/something - - //check if they were a monkey - if(findtext(G_found.real_name,"monkey")) - if(alert("This character appears to have been a monkey. Would you like to respawn them as such?",,"Yes","No")=="Yes") - var/mob/living/carbon/monkey/new_monkey = new(pick(latejoin)) - G_found.mind.transfer_to(new_monkey) //be careful when doing stuff like this! I've already checked the mind isn't in use - new_monkey.key = G_found.key - new_monkey << "You have been fully respawned. Enjoy the game." - message_admins("\blue [key_name_admin(usr)] has respawned [new_monkey.key] as a filthy xeno.", 1) - return //all done. The ghost is auto-deleted - - //Ok, it's not a monkey. So, spawn a human. var/mob/living/carbon/human/new_character = new(pick(latejoin))//The mob being spawned. var/datum/data/record/record_found //Referenced to later to either randomize or not randomize the character. diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index 87720ca63d..12ec133478 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -49,8 +49,6 @@ else randmutg(H) // Applies good mutation domutcheck(H,null,MUTCHK_FORCED) - else if(istype(C,/mob/living/carbon/monkey)) - C.apply_effect((rand(5,25)),IRRADIATE,0) /datum/event/radiation_storm/end() revoke_maint_all_access() diff --git a/code/modules/mob/living/carbon/human/human_species.dm b/code/modules/mob/living/carbon/human/human_species.dm index 051ef214f4..49f1bd4eee 100644 --- a/code/modules/mob/living/carbon/human/human_species.dm +++ b/code/modules/mob/living/carbon/human/human_species.dm @@ -1,7 +1,3 @@ -// These may have some say.dm bugs regarding understanding common, -// might be worth adapting the bugs into a feature and using these -// subtypes as a basis for non-common-speaking alien foreigners. ~ Z - /mob/living/carbon/human/dummy real_name = "Test Dummy" status_flags = GODMODE|CANPUSH @@ -31,4 +27,16 @@ /mob/living/carbon/human/machine/New(var/new_loc) h_style = "blue IPC screen" - ..(new_loc, "Machine") \ No newline at end of file + ..(new_loc, "Machine") + +/mob/living/carbon/human/monkey/New(var/new_loc) + ..(new_loc, "Monkey") + +/mob/living/carbon/human/farwa/New(var/new_loc) + ..(new_loc, "Farwa") + +/mob/living/carbon/human/neara/New(var/new_loc) + ..(new_loc, "Neara") + +/mob/living/carbon/human/stok/New(var/new_loc) + ..(new_loc, "Stok") diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 44b212694e..d1f8b21f05 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -351,10 +351,6 @@ This saves us from having to call add_fingerprint() any time something is put in name = "human" var/mob/living/carbon/human/target = null -/obj/effect/equip_e/monkey - name = "monkey" - var/mob/living/carbon/monkey/target = null - /obj/effect/equip_e/process() return diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 1162c84236..4a17997457 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -20,6 +20,7 @@ var/tail // Name of tail image in species effects icon file. var/race_key = 0 // Used for mob icon cache string. var/icon/icon_template // Used for mob icon generation for non-32x32 species. + var/is_small // Language/culture vars. var/default_language = "Galactic Common" // Default language is used when 'say' is used without modifiers. @@ -91,7 +92,8 @@ var/darksight = 2 // Native darksight distance. var/flags = 0 // Various specific features. var/slowdown = 0 // Passive movement speed malus (or boost, if negative) - var/primitive // Lesser form, if any (ie. monkey for humans) + var/primitive_form // Lesser form, if any (ie. monkey for humans) + var/greater_form // Greater form, if any, ie. human for monkeys. var/gluttonous // Can eat some mobs. 1 for monkeys, 2 for people. var/rarity_value = 1 // Relative rarity/collector value for this species. // Determines the organs that the species spawns with and diff --git a/code/modules/mob/living/carbon/human/species/station/monkey.dm b/code/modules/mob/living/carbon/human/species/station/monkey.dm new file mode 100644 index 0000000000..c042a0e1e4 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/station/monkey.dm @@ -0,0 +1,25 @@ +/datum/species/monkey + name = "Monkey" + name_plural = "Monkeys" + language = "Chimpanzee" + unarmed_types = list(/datum/unarmed_attack/bite) + blurb = "Ook." + greater_form = "Human" + is_small = 1 + + flags = HAS_UNDERWEAR + +/datum/species/monkey/farwa + name = "Farwa" + name_plural = "Farwa" + greater_form = "Tajaran" + +/datum/species/monkey/neara + name = "Neara" + name_plural = "Neara" + greater_form = "Skrell" + +/datum/species/monkey/stok + name = "Stok" + name_plural = "Stok" + greater_form = "Unathi" diff --git a/code/modules/mob/living/carbon/human/species/station/slime.dm b/code/modules/mob/living/carbon/human/species/station/slime.dm index d573558143..83af39876a 100644 --- a/code/modules/mob/living/carbon/human/species/station/slime.dm +++ b/code/modules/mob/living/carbon/human/species/station/slime.dm @@ -1,6 +1,7 @@ /datum/species/slime name = "Slime" name_plural = "slimes" + is_small = 1 icobase = 'icons/mob/human_races/r_slime.dmi' deform = 'icons/mob/human_races/r_slime.dmi' diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index bc46cf9c45..8cf07fc8d5 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -2,7 +2,7 @@ name = "Human" name_plural = "Humans" language = "Sol Common" - primitive = /mob/living/carbon/monkey + primitive_form = "Monkey" unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/punch, /datum/unarmed_attack/bite) blurb = "Humanity originated in the Sol system, and over the last five centuries has spread \ colonies across a wide swathe of space. They hold a wide range of forms and creeds.

\ @@ -20,7 +20,7 @@ language = "Sinta'unathi" tail = "sogtail" unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) - primitive = /mob/living/carbon/monkey/unathi + primitive_form = "Stok" darksight = 3 gluttonous = 1 @@ -85,7 +85,7 @@ heat_level_2 = 380 //Default 400 heat_level_3 = 800 //Default 1000 - primitive = /mob/living/carbon/monkey/tajara + primitive_form = "Farwa" flags = CAN_JOIN | IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR @@ -107,7 +107,7 @@ deform = 'icons/mob/human_races/r_def_skrell.dmi' eyes = "skrell_eyes_s" language = "Skrellian" - primitive = /mob/living/carbon/monkey/skrell + primitive_form = "Neara" unarmed_types = list(/datum/unarmed_attack/punch) blurb = "An amphibious species, Skrell come from the star system known as Qerr'Vallis, which translates to 'Star of \ the royals' or 'Light of the Crown'.

Skrell are a highly advanced and logical race who live under the rule \ @@ -130,7 +130,7 @@ deform = 'icons/mob/human_races/r_def_plant.dmi' language = "Rootspeak" unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/diona) - primitive = /mob/living/carbon/alien/diona + //primitive_form = "Nymph" slowdown = 7 rarity_value = 3 hud_type = /datum/hud_data/diona 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 6d0c48c804..0000000000 --- a/code/modules/mob/living/carbon/monkey/death.dm +++ /dev/null @@ -1,8 +0,0 @@ -/mob/living/carbon/monkey/gib() - ..(null,1) - -/mob/living/carbon/monkey/dust() - ..("dust-m") - -/mob/living/carbon/monkey/death(gibbed) - ..(gibbed,"lets out a faint chimper as it collapses and stops moving...") \ 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 92493b6d38..0000000000 --- a/code/modules/mob/living/carbon/monkey/emote.dm +++ /dev/null @@ -1,132 +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 = istype(src.wear_mask, /obj/item/clothing/mask/muzzle) - - 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("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") - text += "choke, 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 9385787841..0000000000 --- a/code/modules/mob/living/carbon/monkey/examine.dm +++ /dev/null @@ -1,39 +0,0 @@ -/mob/living/carbon/monkey/examine(mob/user) - ..(user) - - var/msg = "" - 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.stat == UNCONSCIOUS) - msg += "It isn't responding to anything around it; it seems to be asleep.\n" - msg += "" - - if (src.digitalcamo) - msg += "It is repulsively uncanny!\n" - - msg += "*---------*" - - user << msg - return \ No newline at end of file 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 adeb4f903a..0000000000 --- a/code/modules/mob/living/carbon/monkey/inventory.dm +++ /dev/null @@ -1,238 +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:canremove) - 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) - if("pockets") - message = text("\red [] is trying to empty []'s pockets",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:canremove) - return - var/obj/item/W = target.wear_mask - target.u_equip(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.u_equip(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.u_equip(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.u_equip(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.u_equip(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/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()) - u_equip(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 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 22a5c7f2fb..0000000000 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ /dev/null @@ -1,511 +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/phoron_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 (monkeyizing) 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) - //First, resolve location and get a breath - if(air_master.current_cycle%4==2) - //Only try to take a breath every 4 seconds, unless suffocating - breathe() - - //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() - - //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() - - //Status updates, death etc. - handle_regular_status_updates() - 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 - - 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((COLD_RESISTANCE 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) - src << "\red You suddenly feel very weak." - Weaken(3) - emote("collapse") - - if (radiation) - - 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") - - 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_phoron_max = 0.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.gas["oxygen"] / breath.total_moles) * breath_pressure - // Same, but for the phoron - var/Toxins_pp = (breath.gas["phoron"] / 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.gas["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.gas["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.gas["oxygen"] / 6 - oxygen_alert = 0 - - breath.adjust_gas("oxygen", -oxygen_used) - breath.adjust_gas("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_phoron_max) // Too much phoron - var/ratio = (breath.gas["phoron"] / safe_phoron_max) * 10 - //adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) //Limit amount of damage toxin exposure can do per second - if(reagents) - reagents.add_reagent("toxin", Clamp(ratio, MIN_TOXIN_DAMAGE, MAX_TOXIN_DAMAGE)) - phoron_alert = max(phoron_alert, 1) - else - phoron_alert = 0 - - if(breath.gas["sleeping_agent"]) - var/SA_pp = (breath.gas["sleeping_agent"] / 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() - if(pressure < WARNING_HIGH_PRESSURE && pressure > WARNING_LOW_PRESSURE && abs(environment.temperature - 293.15) < 20 && abs(bodytemperature - 310.14) < 0.5 && environment.gas["phoron"] < MOLES_PHORON_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((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(pressure) - if(HAZARD_HIGH_PRESSURE to INFINITY) - adjustBruteLoss( min( ( (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( !(COLD_RESISTANCE 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(reagents && reagents.reagent_list.len) - reagents.metabolize(src) - - 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 || !has_brain()) - 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("inaprovaline")) - 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() - 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 (toxin) toxin.icon_state = "tox[phoron_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() - -/mob/living/carbon/monkey/handle_fire() - if(..()) - return - adjustFireLoss(6) - return \ No newline at end of file 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 3b7e5dcb97..0000000000 --- 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 07a64c5513..0000000000 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ /dev/null @@ -1,291 +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. - holder_type = /obj/item/weapon/holder/monkey - -/mob/living/carbon/monkey/tajara - name = "farwa" - voice_name = "farwa" - speak_emote = list("mews") - icon_state = "tajkey1" - greaterform = "Tajara" - uni_append = list(0x0A0,0xE00) // 0A0E00 - holder_type = /obj/item/weapon/holder/monkey/farwa - -/mob/living/carbon/monkey/skrell - name = "neaera" - voice_name = "neaera" - speak_emote = list("squicks") - icon_state = "skrellkey1" - greaterform = "Skrell" - uni_append = list(0x01C,0xC92) // 01CC92 - holder_type = /obj/item/weapon/holder/monkey/neaera - -/mob/living/carbon/monkey/unathi - name = "stok" - voice_name = "stok" - speak_emote = list("hisses") - icon_state = "stokkey1" - greaterform = "Unathi" - uni_append = list(0x044,0xC5D) // 044C5D - holder_type = /obj/item/weapon/holder/monkey/stok - -/mob/living/carbon/monkey/New() - - verbs += /mob/living/proc/ventcrawl - - var/datum/reagents/R = new/datum/reagents(1000) - reagents = R - R.my_atom = src - - species = all_species[greaterform] - add_language(species.language) - - 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/movement_delay() - var/tally = 0 - if(reagents) - if(reagents.has_reagent("hyperzine")) return -1 - - if(reagents.has_reagent("nuka_cola")) return -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/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_hand(mob/living/carbon/human/M as mob) - - if (M.a_intent == "help" && a_intent == "help") - help_shake_act(M) - get_scooped(M) - else - if (M.a_intent == "hurt") - var/datum/unarmed_attack/attack = null - for(var/datum/unarmed_attack/u_attack in M.species.unarmed_attacks) - if(!u_attack.is_usable(M, src)) - continue - else - attack = u_attack - break - if(!attack) - return 0 - if ((prob(75) && health > 0)) - visible_message("\red [M] [pick(attack.attack_verb)] [src]!") - - playsound(loc, "punch", 25, 1, -1) - var/damage = rand(5, 10) - if (prob(40)) - damage = rand(10, 15) - if (paralysis < 5) - Paralyse(rand(10, 15)) - visible_message("\red [M] has knocked out [src]!") - - adjustBruteLoss(damage) - - M.attack_log += text("\[[time_stamp()]\] [pick(attack.attack_verb)]ed [src.name] ([src.ckey])") - src.attack_log += text("\[[time_stamp()]\] Has been [pick(attack.attack_verb)]ed by [M.name] ([M.ckey])") - msg_admin_attack("[key_name(M)] [pick(attack.attack_verb)]ed [key_name(src)]") - - updatehealth() - else - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - visible_message("\red [M] tried to [pick(attack.attack_verb)] [src]!") - 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) - for(var/mob/O in viewers(src, null)) - O.show_message(text("\red [] has grabbed [name] passively!", M), 1) - else - if (!( paralysis )) - if (prob(25)) - Paralyse(2) - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red [] has pushed down [name]!", M), 1) - else - drop_item() - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red [] has disarmed [name]!", M), 1) - 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) - if(!blinded) - flick("flash", flash) - - switch(severity) - if(1.0) - if (stat != 2) - adjustBruteLoss(200) - health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() - if(2.0) - if (stat != 2) - adjustBruteLoss(60) - adjustFireLoss(60) - health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() - if(3.0) - if (stat != 2) - adjustBruteLoss(30) - health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() - if (prob(50)) - Paralyse(10) - else - 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 - -//Unless its monkey mode monkeys cant use advanced tools -/mob/living/carbon/monkey/IsAdvancedToolUser(var/silent) - if(!silent) - src << "You don't have the dexterity to use that!" - return 0 - -/mob/living/carbon/monkey/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/italics=0, var/message_range = world.view, var/list/used_radios = list()) - if(stat) - return - - if(copytext(message,1,2) == "*") - return emote(copytext(message,2)) - - if(stat) - return - - if(speak_emote.len) - verb = pick(speak_emote) - - message = capitalize(trim_left(message)) - - ..(message, speaking, verb, alt_name, italics, message_range, used_radios) 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 a7d4bfc7ae..0000000000 --- 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) set_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/update_icons.dm b/code/modules/mob/living/carbon/monkey/update_icons.dm deleted file mode 100644 index ec69d454f6..0000000000 --- a/code/modules/mob/living/carbon/monkey/update_icons.dm +++ /dev/null @@ -1,129 +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 6 -#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(0) - 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(var/update_icons=1) - if(on_fire) - overlays_standing[M_FIRE_LAYER] = image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing", "layer"= -M_FIRE_LAYER) - else - overlays_standing[M_FIRE_LAYER] = null - if(update_icons) update_icons() -//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 b98c3a7448..3f54916bb8 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -59,13 +59,6 @@ H.UpdateDamageIcon() H.updatehealth() return 1 - else if(istype(src, /mob/living/carbon/monkey)) - if (COLD_RESISTANCE 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 52cb315ce8..7c0d3dd85d 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -899,11 +899,6 @@ //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/mob_cleanup.dm b/code/modules/mob/mob_cleanup.dm index 1cac93904f..cdc734c49a 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_helpers.dm b/code/modules/mob/mob_helpers.dm index 0cbab16581..7d42c24398 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -16,8 +16,10 @@ return 0 /proc/ismonkey(A) - if(A && istype(A, /mob/living/carbon/monkey)) - return 1 + if(A && istype(A, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = A + if(H.species && H.species.is_small) //todo + return 1 return 0 /proc/isbrain(A) @@ -257,7 +259,7 @@ var/list/global/organ_rel_size = list( for(var/obj/item/weapon/grab/G in target.grabbed_by) if(G.state >= GRAB_AGGRESSIVE) return zone - + var/miss_chance = 10 if (zone in base_miss_chance) miss_chance = base_miss_chance[zone] @@ -462,7 +464,7 @@ var/list/intents = list("help","disarm","grab","hurt") if(hud_used && hud_used.action_intent) hud_used.action_intent.icon_state = "intent_[a_intent]" - else if(isrobot(src) || ismonkey(src)) + else if(isrobot(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 227329e915..bbde6e73ec 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -21,36 +21,17 @@ sleep(48) //animation = null - if(!species.primitive) //If the creature in question has no primitive set, this is going to be messy. + if(!species.primitive_form) //If the creature in question has no primitive set, this is going to be messy. gib() return + set_species(species.primitive_form) + dna.SetSEState(MONKEYBLOCK,1) + dna.SetSEValueRange(MONKEYBLOCK,0xDAC, 0xFFF) - var/mob/living/carbon/monkey/O = null - - O = new species.primitive(loc) - - O.dna = dna.Clone() - O.dna.SetSEState(MONKEYBLOCK,1) - O.dna.SetSEValueRange(MONKEYBLOCK,0xDAC, 0xFFF) - O.loc = loc - O.viruses = viruses - O.a_intent = "hurt" - - for(var/datum/disease/D in O.viruses) - D.affected_mob = O - - if (client) - client.mob = O - if(mind) - mind.transfer_to(O) - - O << "You are now [O]. " - - spawn(0)//To prevent the proc from returning null. - del(src) + src << "You are now [species.name]. " del(animation) - return O + return src /mob/new_player/AIize() spawning = 1 diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index b04d631046..5f045736dc 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -282,12 +282,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/singularity/particle_accelerator/particle.dm b/code/modules/power/singularity/particle_accelerator/particle.dm index cbec31306b..2113ba87f7 100644 --- a/code/modules/power/singularity/particle_accelerator/particle.dm +++ b/code/modules/power/singularity/particle_accelerator/particle.dm @@ -74,12 +74,6 @@ /obj/effect/accelerated_particle/proc/toxmob(var/mob/living/M) var/radiation = (energy*2) -/* if(istype(M,/mob/living/carbon/human)) - if(M:wear_suit) //TODO: check for radiation protection - radiation = round(radiation/2,1) - if(istype(M,/mob/living/carbon/monkey)) - if(M:wear_suit) //TODO: check for radiation protection - radiation = round(radiation/2,1)*/ M.apply_effect((radiation*3),IRRADIATE,0) M.updatehealth() //M << "\red You feel odd." diff --git a/code/modules/projectiles/projectile/change.dm b/code/modules/projectiles/projectile/change.dm index f48a2d4a61..5bde8a5cfc 100644 --- a/code/modules/projectiles/projectile/change.dm +++ b/code/modules/projectiles/projectile/change.dm @@ -35,11 +35,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/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index d5a3095e49..89e993e4b3 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -153,9 +153,6 @@ datum if(!self.data["donor"] || istype(self.data["donor"], /mob/living/carbon/human)) blood_splatter(T,self,1) - else if(istype(self.data["donor"], /mob/living/carbon/monkey)) - var/obj/effect/decal/cleanable/blood/B = blood_splatter(T,self,1) - if(B) B.blood_DNA["Non-Human DNA"] = "A+" else if(istype(self.data["donor"], /mob/living/carbon/alien)) var/obj/effect/decal/cleanable/blood/B = blood_splatter(T,self,1) if(B) B.blood_DNA["UNKNOWN DNA STRUCTURE"] = "X*" @@ -2057,17 +2054,6 @@ datum del (H.glasses) H.update_inv_glasses(0) - else if(ismonkey(M)) - var/mob/living/carbon/monkey/MK = M - if(MK.wear_mask) - if(!MK.wear_mask.unacidable) - MK << "Your mask melts away but protects you from the acid!" - del (MK.wear_mask) - MK.update_inv_wear_mask(0) - else - MK << "Your mask protects you from the acid." - return - if(!M.unacidable) if(istype(M, /mob/living/carbon/human) && volume >= 10) var/mob/living/carbon/human/H = M diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index 502a741c6b..388c1ff08e 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -1543,7 +1543,7 @@ filling_color = "#ADAC7F" var/wrapped = 0 - var/monkey_type = /mob/living/carbon/monkey + var/monkey_type = "Monkey" New() ..() @@ -1561,6 +1561,7 @@ if(wrapped) Unwrap(user) + /* On_Consume(var/mob/M) M << "Something inside of you suddently expands!" @@ -1594,11 +1595,13 @@ ook.add_blood(M) M.gib() ..() + */ 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) @@ -1612,24 +1615,30 @@ desc = "Still wrapped in some paper." icon_state = "monkeycubewrap" wrapped = 1 + /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/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/research/xenoarchaeology/artifact/artifact_autocloner.dm b/code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm index 9c3cc70eeb..4daf56e056 100644 --- a/code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm +++ b/code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm @@ -39,8 +39,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/spells/horsemask.dm b/code/modules/spells/horsemask.dm index 1319f62008..32e362f346 100644 --- a/code/modules/spells/horsemask.dm +++ b/code/modules/spells/horsemask.dm @@ -11,7 +11,7 @@ invocation_type = "shout" 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) /obj/effect/proc_holder/spell/targeted/horsemask/cast(list/targets, mob/user = usr) if(!targets.len) @@ -43,7 +43,7 @@ dropped(mob/user as mob) canremove = 1 ..() - + equipped(var/mob/user, var/slot) if (slot == slot_wear_mask) canremove = 0 //curses! diff --git a/code/modules/spells/mind_transfer.dm b/code/modules/spells/mind_transfer.dm index 80a249615a..161ed3516d 100644 --- a/code/modules/spells/mind_transfer.dm +++ b/code/modules/spells/mind_transfer.dm @@ -9,7 +9,7 @@ invocation_type = "whisper" range = 1 var/list/protected_roles = list("Wizard","Changeling","Cultist") //which roles are immune to the spell - var/list/compatible_mobs = list(/mob/living/carbon/human,/mob/living/carbon/monkey) //which types of mobs are affected by the spell. NOTE: change at your own risk + var/list/compatible_mobs = list(/mob/living/carbon/human) //which types of mobs are affected by the spell. NOTE: change at your own risk var/base_spell_loss_chance = 20 //base probability of the wizard losing a spell in the process var/spell_loss_chance_modifier = 7 //amount of probability of losing a spell added per spell (mind_transfer included) var/spell_loss_amount = 1 //the maximum amount of spells possible to lose during a single transfer diff --git a/maps/exodus-1.dmm b/maps/exodus-1.dmm index 5a598b2962..7304c6e993 100644 --- a/maps/exodus-1.dmm +++ b/maps/exodus-1.dmm @@ -2096,7 +2096,7 @@ "aOp" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_chapel_outer"; locked = 1; name = "Engineering External Access"; req_access = list(10,13)},/obj/effect/decal/cleanable/dirt,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) "aOq" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "solar_tool_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access = list(13)},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/solar/auxport) "aOr" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) -"aOs" = (/mob/living/carbon/monkey{name = "Pun Pun"; icon_state = "punpun1"},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) +"aOs" = (/mob/living/carbon/human/monkey{name = "Pun Pun"; icon_state = "punpun1"},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "aOt" = (/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "aOu" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/table/reinforced,/obj/item/weapon/flame/lighter/zippo,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "aOv" = (/obj/structure/bed/chair/comfy/brown{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet,/area/crew_quarters/bar) diff --git a/maps/exodus-2.dmm b/maps/exodus-2.dmm index d88a1b830e..f1e51f645d 100644 --- a/maps/exodus-2.dmm +++ b/maps/exodus-2.dmm @@ -1888,7 +1888,7 @@ "Kp" = (/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/wizard_station) "Kq" = (/obj/structure/flora/ausbushes/fullgrass,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/wizard_station) "Kr" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) -"Ks" = (/mob/living/carbon/monkey{name = "Murphey"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) +"Ks" = (/mob/living/carbon/human/monkey{name = "Murphey"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) "Kt" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) "Ku" = (/obj/item/organ/xenos/plasmavessel,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) "Kv" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror/raider{pixel_x = -28; pixel_y = 0},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership{name = "\improper Raider Base"}) diff --git a/maps/exodus-5.dmm b/maps/exodus-5.dmm index caf25f095e..98aae30971 100644 --- a/maps/exodus-5.dmm +++ b/maps/exodus-5.dmm @@ -242,8 +242,8 @@ "eH" = (/obj/structure/cable/blue{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/turf/simulated/floor/plating,/area/outpost/research/disposal) "eI" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) "eJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) -"eK" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/mob/living/carbon/monkey,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) -"eL" = (/obj/machinery/alarm{dir = 4; pixel_x = -25; pixel_y = 0},/mob/living/carbon/monkey,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) +"eK" = (/obj/machinery/door/window/westleft{dir = 4; name = "Monkey Pen"; req_access = list(47)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/mob/living/carbon/human/monkey,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) +"eL" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/mob/living/carbon/human/monkey,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) "eM" = (/obj/structure/table/rack,/obj/item/clothing/suit/bio_suit/anomaly,/obj/item/clothing/head/bio_hood/anomaly,/obj/item/clothing/mask/breath,/obj/item/clothing/glasses/science,/obj/item/clothing/gloves/latex,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/outpost/research/hallway) "eN" = (/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/outpost/research/hallway) "eO" = (/turf/simulated/floor,/area/outpost/research/hallway) @@ -273,8 +273,8 @@ "fm" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) "fn" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/outpost/research/disposal) "fo" = (/obj/structure/table/rack,/obj/item/clothing/suit/bio_suit/anomaly,/obj/item/clothing/head/bio_hood/anomaly,/obj/item/clothing/mask/breath,/obj/item/clothing/glasses/science,/obj/item/clothing/gloves/latex,/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/outpost/research/hallway) -"fp" = (/obj/machinery/door/window/westleft{dir = 4; name = "Monkey Pen"; req_access = list(47)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/mob/living/carbon/monkey,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) -"fq" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/mob/living/carbon/monkey,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) +"fp" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/mob/living/carbon/human/monkey,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) +"fq" = (/obj/machinery/alarm{dir = 4; pixel_x = -25; pixel_y = 0},/mob/living/carbon/human/monkey,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) "fr" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/outpost/research/hallway) "fs" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor,/area/outpost/research/hallway) "ft" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/outpost/research/hallway) @@ -1659,8 +1659,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaecocqcpcrabababababababababababababababababababababababababababababababababababababababababababababababababababababalaaaaaaexexexexexexexcscwcxcyctctcucvctcycFcEcDcCcBcAczcMcMcLcKcJcIcHcGcOkrcNazalalalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaefxemelekcrababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaexexexexexexexejcwdAdBdCeheidFdGdYaGeadZaGebedecdOdNdPaGdVdUaidWdWdWdWeeefegalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaedLdKdMcrdJdIcrcrcrcrabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaexexexexexexexdHcwdAdBdCdDdEdFdGdyaGdxdwaGdzbbbbbbbbdsaGlyduaidtdodpdmdndqdrdqdqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaaacacacacacaaacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaegzfefEfHfGfFafbCeYcrfbfacrabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaexexexexexexexaifkflfjdCfhfidFfgfvaGfzfwfsfrfuftfoaGfqfpfmeRaifnfAfBfCfDdqalalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaaacacacacacaaacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefcfdfeffeUeTeWeVeYeXfaeZfbcrabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaeAereseyezeresevewepeqeneneneoeoeoeoeoeSeReQePeOeNeMaGeLeKeJeIaieHeFeGeDeEeCaGaGeBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaaaaaaaaaaaaaaacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaegzfefEfHfGfFafbCeYcrfbfacrabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaexexexexexexexaifkflfjdCfhfidFfgfvaGfzfwfsfrfuftfoaGeLeKfmeRaifnfAfBfCfDdqalalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaaacacacacacaaacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefcfdfeffeUeTeWeVeYeXfaeZfbcrabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaeAereseyezeresevewepeqeneneneoeoeoeoeoeSeReQePeOeNeMaGfqfpeJeIaieHeFeGeDeEeCaGaGeBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaaaaaaaaaaaaaaacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahSfchbfcfEfEdJheeUcrekhdcrfahccrabababababababababababababababababababababababababababababababababababababababababababababababdXaaaaaaaaaagMgPgQgNgOgTgQgRgSgWgXgUgVhaeogYgZgweogxeRgBgAgDgCgEaGgGgFgIgHaiaigJaiaiaieReRgKeBeBeBeBgLeBeBeBeBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaegugvfEgsgtfEcpgqeTgrgpgocrcrcrcrcrcrababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaagngbgcgcgcgcgdgegfggghgigjgkeoglgmfVfUfTeIfXfWeReRfYfweReReJeIgafZfKfLfIlzeReRfMeBfOfPeBfNfRfSfQeBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeiCiBhRfEgtiDffiGeUiFcriIiHcrhOhKbCiEcrabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaagngQgQgQhWgQhVhUgQibgXhZiahYeogmhXihigijiiidicifieilieimieikieieieirisitiuinioipiqixiyiziAivhAiweBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa